{"id":"b91642eb22da26979bf8cfd234d466dd","_format":"hh-sol-build-info-1","solcVersion":"0.8.30","solcLongVersion":"0.8.30+commit.73712a01","input":{"language":"Solidity","sources":{"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface LinkTokenInterface {\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\n\n  function approve(address spender, uint256 value) external returns (bool success);\n\n  function balanceOf(\n    address owner\n  ) external view returns (uint256 balance);\n\n  function decimals() external view returns (uint8 decimalPlaces);\n\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n\n  function increaseApproval(address spender, uint256 subtractedValue) external;\n\n  function name() external view returns (string memory tokenName);\n\n  function symbol() external view returns (string memory tokenSymbol);\n\n  function totalSupply() external view returns (uint256 totalTokensIssued);\n\n  function transfer(address to, uint256 value) external returns (bool success);\n\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n"},"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// solhint-disable-next-line interface-starts-with-i\ninterface VRFV2WrapperInterface {\n  /**\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\n   * be relied option within the same transaction that the request was made.\n   */\n  function lastRequestId() external view returns (uint256);\n\n  /**\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\n   * @notice block.\n   *\n   * @dev This function relies on the transaction gas price which is not automatically set during\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   */\n  function calculateRequestPrice(\n    uint32 _callbackGasLimit\n  ) external view returns (uint256);\n\n  /**\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\n   *\n   * @dev This is a convenience function that can be called in simulation to better understand\n   * @dev pricing.\n   *\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\n   */\n  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);\n}\n"},"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/**\n *\n * @notice Interface for contracts using VRF randomness\n * *****************************************************************************\n * @dev PURPOSE\n *\n * @dev Reggie the Random Oracle (not his real job) wants to provide randomness\n * @dev to Vera the verifier in such a way that Vera can be sure he's not\n * @dev making his output up to suit himself. Reggie provides Vera a public key\n * @dev to which he knows the secret key. Each time Vera provides a seed to\n * @dev Reggie, he gives back a value which is computed completely\n * @dev deterministically from the seed and the secret key.\n *\n * @dev Reggie provides a proof by which Vera can verify that the output was\n * @dev correctly computed once Reggie tells it to her, but without that proof,\n * @dev the output is indistinguishable to her from a uniform random sample\n * @dev from the output space.\n *\n * @dev The purpose of this contract is to make it easy for unrelated contracts\n * @dev to talk to Vera the verifier about the work Reggie is doing, to provide\n * @dev simple access to a verifiable source of randomness. It ensures 2 things:\n * @dev 1. The fulfillment came from the VRFCoordinator\n * @dev 2. The consumer contract implements fulfillRandomWords.\n * *****************************************************************************\n * @dev USAGE\n *\n * @dev Calling contracts must inherit from VRFConsumerBase, and can\n * @dev initialize VRFConsumerBase's attributes in their constructor as\n * @dev shown:\n *\n * @dev   contract VRFConsumer {\n * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)\n * @dev       VRFConsumerBase(_vrfCoordinator) public {\n * @dev         <initialization with other arguments goes here>\n * @dev       }\n * @dev   }\n *\n * @dev The oracle will have given you an ID for the VRF keypair they have\n * @dev committed to (let's call it keyHash). Create subscription, fund it\n * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface\n * @dev subscription management functions).\n * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,\n * @dev callbackGasLimit, numWords),\n * @dev see (VRFCoordinatorInterface for a description of the arguments).\n *\n * @dev Once the VRFCoordinator has received and validated the oracle's response\n * @dev to your request, it will call your contract's fulfillRandomWords method.\n *\n * @dev The randomness argument to fulfillRandomWords is a set of random words\n * @dev generated from your requestId and the blockHash of the request.\n *\n * @dev If your contract could have concurrent requests open, you can use the\n * @dev requestId returned from requestRandomWords to track which response is associated\n * @dev with which randomness request.\n * @dev See \"SECURITY CONSIDERATIONS\" for principles to keep in mind,\n * @dev if your contract could have multiple requests in flight simultaneously.\n *\n * @dev Colliding `requestId`s are cryptographically impossible as long as seeds\n * @dev differ.\n *\n * *****************************************************************************\n * @dev SECURITY CONSIDERATIONS\n *\n * @dev A method with the ability to call your fulfillRandomness method directly\n * @dev could spoof a VRF response with any random value, so it's critical that\n * @dev it cannot be directly called by anything other than this base contract\n * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).\n *\n * @dev For your users to trust that your contract's random behavior is free\n * @dev from malicious interference, it's best if you can write it so that all\n * @dev behaviors implied by a VRF response are executed *during* your\n * @dev fulfillRandomness method. If your contract must store the response (or\n * @dev anything derived from it) and use it later, you must ensure that any\n * @dev user-significant behavior which depends on that stored value cannot be\n * @dev manipulated by a subsequent VRF request.\n *\n * @dev Similarly, both miners and the VRF oracle itself have some influence\n * @dev over the order in which VRF responses appear on the blockchain, so if\n * @dev your contract could have multiple VRF requests in flight simultaneously,\n * @dev you must ensure that the order in which the VRF responses arrive cannot\n * @dev be used to manipulate your contract's user-significant behavior.\n *\n * @dev Since the block hash of the block which contains the requestRandomness\n * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful\n * @dev miner could, in principle, fork the blockchain to evict the block\n * @dev containing the request, forcing the request to be included in a\n * @dev different block with a different hash, and therefore a different input\n * @dev to the VRF. However, such an attack would incur a substantial economic\n * @dev cost. This cost scales with the number of blocks the VRF oracle waits\n * @dev until it calls responds to a request. It is for this reason that\n * @dev that you can signal to an oracle you'd like them to wait longer before\n * @dev responding to the request (however this is not enforced in the contract\n * @dev and so remains effective only in the case of unmodified oracle software).\n */\nabstract contract VRFConsumerBaseV2 {\n  error OnlyCoordinatorCanFulfill(address have, address want);\n\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\n  address private immutable vrfCoordinator;\n\n  /**\n   * @param _vrfCoordinator address of VRFCoordinator contract\n   */\n  constructor(\n    address _vrfCoordinator\n  ) {\n    vrfCoordinator = _vrfCoordinator;\n  }\n\n  /**\n   * @notice fulfillRandomness handles the VRF response. Your contract must\n   * @notice implement it. See \"SECURITY CONSIDERATIONS\" above for important\n   * @notice principles to keep in mind when implementing your fulfillRandomness\n   * @notice method.\n   *\n   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this\n   * @dev signature, and will call it once it has verified the proof\n   * @dev associated with the randomness. (It is triggered via a call to\n   * @dev rawFulfillRandomness, below.)\n   *\n   * @param requestId The Id initially returned by requestRandomness\n   * @param randomWords the VRF output expanded to the requested number of words\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;\n\n  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF\n  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating\n  // the origin of the call\n  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {\n    if (msg.sender != vrfCoordinator) {\n      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);\n    }\n    fulfillRandomWords(requestId, randomWords);\n  }\n}\n"},"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {LinkTokenInterface} from \"../shared/interfaces/LinkTokenInterface.sol\";\nimport {VRFV2WrapperInterface} from \"./interfaces/VRFV2WrapperInterface.sol\";\n\n/**\n *\n * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\n * ********************************************************************************\n * @dev PURPOSE\n *\n * @dev Create VRF V2 requests without the need for subscription management. Rather than creating\n * @dev and funding a VRF V2 subscription, a user can use this wrapper to create one off requests,\n * @dev paying up front rather than at fulfillment.\n *\n * @dev Since the price is determined using the gas price of the request transaction rather than\n * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\n * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\n * *****************************************************************************\n * @dev USAGE\n *\n * @dev Calling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be funded\n * @dev with enough LINK to make the request, otherwise requests will revert. To request randomness,\n * @dev call the 'requestRandomness' function with the desired VRF parameters. This function handles\n * @dev paying for the request based on the current pricing.\n *\n * @dev Consumers must implement the fullfillRandomWords function, which will be called during\n * @dev fulfillment with the randomness result.\n */\nabstract contract VRFV2WrapperConsumerBase {\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\n  LinkTokenInterface internal immutable LINK;\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\n  VRFV2WrapperInterface internal immutable VRF_V2_WRAPPER;\n\n  /**\n   * @param _link is the address of LinkToken\n   * @param _vrfV2Wrapper is the address of the VRFV2Wrapper contract\n   */\n  constructor(address _link, address _vrfV2Wrapper) {\n    LINK = LinkTokenInterface(_link);\n    VRF_V2_WRAPPER = VRFV2WrapperInterface(_vrfV2Wrapper);\n  }\n\n  /**\n   * @dev Requests randomness from the VRF V2 wrapper.\n   *\n   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\n   *        fulfillRandomWords function.\n   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the\n   *        request. A higher number of confirmations increases security by reducing the likelihood\n   *        that a chain re-org changes a published randomness outcome.\n   * @param _numWords is the number of random words to request.\n   *\n   * @return requestId is the VRF V2 request ID of the newly created randomness request.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function requestRandomness(\n    uint32 _callbackGasLimit,\n    uint16 _requestConfirmations,\n    uint32 _numWords\n  ) internal returns (uint256 requestId) {\n    LINK.transferAndCall(\n      address(VRF_V2_WRAPPER),\n      VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit),\n      abi.encode(_callbackGasLimit, _requestConfirmations, _numWords)\n    );\n    return VRF_V2_WRAPPER.lastRequestId();\n  }\n\n  /**\n   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\n   * @notice implement it.\n   *\n   * @param _requestId is the VRF V2 request ID.\n   * @param _randomWords is the randomness result.\n   */\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\n  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;\n\n  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {\n    // solhint-disable-next-line gas-custom-errors\n    require(msg.sender == address(VRF_V2_WRAPPER), \"only VRF V2 wrapper can fulfill\");\n    fulfillRandomWords(_requestId, _randomWords);\n  }\n}\n"},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"@openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\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 or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) 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            assembly (\"memory-safe\") {\n                revert(add(returndata, 0x20), mload(returndata))\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS\n    }\n\n    /**\n     * @dev The signature derives the `address(0)`.\n     */\n    error ECDSAInvalidSignature();\n\n    /**\n     * @dev The signature has an invalid length.\n     */\n    error ECDSAInvalidSignatureLength(uint256 length);\n\n    /**\n     * @dev The signature has an S value that is in the upper half order.\n     */\n    error ECDSAInvalidSignatureS(bytes32 s);\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n     * and a bytes32 providing additional information about the error.\n     *\n     * If no error is returned, then the address can be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes memory signature\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly (\"memory-safe\") {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        unchecked {\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\n            return tryRecover(hash, v, r, s);\n        }\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n     */\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS, s);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\n        }\n\n        return (signer, RecoverError.NoError, bytes32(0));\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n        _throwError(error, errorArg);\n        return recovered;\n    }\n\n    /**\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n     */\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert ECDSAInvalidSignature();\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert ECDSAInvalidSignatureS(errorArg);\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/cryptography/Hashes.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library of standard hash functions.\n *\n * _Available since v5.1._\n */\nlibrary Hashes {\n    /**\n     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\n     *\n     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n     */\n    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {\n        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);\n    }\n\n    /**\n     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\n     */\n    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {\n        assembly (\"memory-safe\") {\n            mstore(0x00, a)\n            mstore(0x20, b)\n            value := keccak256(0x00, 0x40)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)\n// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.\n\npragma solidity ^0.8.20;\n\nimport {Hashes} from \"./Hashes.sol\";\n\n/**\n * @dev These functions deal with verification of Merkle Tree proofs.\n *\n * The tree and the proofs can be generated using our\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n * You will find a quickstart guide in the readme.\n *\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\n * hashing, or use a hash function other than keccak256 for hashing leaves.\n * This is because the concatenation of a sorted pair of internal nodes in\n * the Merkle tree could be reinterpreted as a leaf value.\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\n * against this attack out of the box.\n *\n * IMPORTANT: Consider memory side-effects when using custom hashing functions\n * that access memory in an unsafe way.\n *\n * NOTE: This library supports proof verification for merkle trees built using\n * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving\n * leaf inclusion in trees built using non-commutative hashing functions requires\n * additional logic that is not supported by this library.\n */\nlibrary MerkleProof {\n    /**\n     *@dev The multiproof provided is not valid.\n     */\n    error MerkleProofInvalidMultiproof();\n\n    /**\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n     * defined by `root`. For this, a `proof` must be provided, containing\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in memory with the default hashing function.\n     */\n    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\n        return processProof(proof, leaf) == root;\n    }\n\n    /**\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n     * hash matches the root of the tree. When processing the proof, the pairs\n     * of leaves & pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in memory with the default hashing function.\n     */\n    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\n        bytes32 computedHash = leaf;\n        for (uint256 i = 0; i < proof.length; i++) {\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\n        }\n        return computedHash;\n    }\n\n    /**\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n     * defined by `root`. For this, a `proof` must be provided, containing\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in memory with a custom hashing function.\n     */\n    function verify(\n        bytes32[] memory proof,\n        bytes32 root,\n        bytes32 leaf,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bool) {\n        return processProof(proof, leaf, hasher) == root;\n    }\n\n    /**\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n     * hash matches the root of the tree. When processing the proof, the pairs\n     * of leaves & pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in memory with a custom hashing function.\n     */\n    function processProof(\n        bytes32[] memory proof,\n        bytes32 leaf,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bytes32) {\n        bytes32 computedHash = leaf;\n        for (uint256 i = 0; i < proof.length; i++) {\n            computedHash = hasher(computedHash, proof[i]);\n        }\n        return computedHash;\n    }\n\n    /**\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n     * defined by `root`. For this, a `proof` must be provided, containing\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in calldata with the default hashing function.\n     */\n    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\n        return processProofCalldata(proof, leaf) == root;\n    }\n\n    /**\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n     * hash matches the root of the tree. When processing the proof, the pairs\n     * of leaves & pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in calldata with the default hashing function.\n     */\n    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\n        bytes32 computedHash = leaf;\n        for (uint256 i = 0; i < proof.length; i++) {\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\n        }\n        return computedHash;\n    }\n\n    /**\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n     * defined by `root`. For this, a `proof` must be provided, containing\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in calldata with a custom hashing function.\n     */\n    function verifyCalldata(\n        bytes32[] calldata proof,\n        bytes32 root,\n        bytes32 leaf,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bool) {\n        return processProofCalldata(proof, leaf, hasher) == root;\n    }\n\n    /**\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n     * hash matches the root of the tree. When processing the proof, the pairs\n     * of leaves & pre-images are assumed to be sorted.\n     *\n     * This version handles proofs in calldata with a custom hashing function.\n     */\n    function processProofCalldata(\n        bytes32[] calldata proof,\n        bytes32 leaf,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bytes32) {\n        bytes32 computedHash = leaf;\n        for (uint256 i = 0; i < proof.length; i++) {\n            computedHash = hasher(computedHash, proof[i]);\n        }\n        return computedHash;\n    }\n\n    /**\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n     *\n     * This version handles multiproofs in memory with the default hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n     *\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n     * The `leaves` must be validated independently. See {processMultiProof}.\n     */\n    function multiProofVerify(\n        bytes32[] memory proof,\n        bool[] memory proofFlags,\n        bytes32 root,\n        bytes32[] memory leaves\n    ) internal pure returns (bool) {\n        return processMultiProof(proof, proofFlags, leaves) == root;\n    }\n\n    /**\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n     * respectively.\n     *\n     * This version handles multiproofs in memory with the default hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n     *\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n     * validating the leaves elsewhere.\n     */\n    function processMultiProof(\n        bytes32[] memory proof,\n        bool[] memory proofFlags,\n        bytes32[] memory leaves\n    ) internal pure returns (bytes32 merkleRoot) {\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n        // the Merkle tree.\n        uint256 leavesLen = leaves.length;\n        uint256 proofFlagsLen = proofFlags.length;\n\n        // Check proof validity.\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\n            revert MerkleProofInvalidMultiproof();\n        }\n\n        // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\n        uint256 leafPos = 0;\n        uint256 hashPos = 0;\n        uint256 proofPos = 0;\n        // At each step, we compute the next hash using two values:\n        // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n        //   get the next hash.\n        // - depending on the flag, either another value from the \"main queue\" (merging branches) or an element from the\n        //   `proof` array.\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n            bytes32 b = proofFlags[i]\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\n                : proof[proofPos++];\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\n        }\n\n        if (proofFlagsLen > 0) {\n            if (proofPos != proof.length) {\n                revert MerkleProofInvalidMultiproof();\n            }\n            unchecked {\n                return hashes[proofFlagsLen - 1];\n            }\n        } else if (leavesLen > 0) {\n            return leaves[0];\n        } else {\n            return proof[0];\n        }\n    }\n\n    /**\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n     *\n     * This version handles multiproofs in memory with a custom hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n     *\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n     * The `leaves` must be validated independently. See {processMultiProof}.\n     */\n    function multiProofVerify(\n        bytes32[] memory proof,\n        bool[] memory proofFlags,\n        bytes32 root,\n        bytes32[] memory leaves,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bool) {\n        return processMultiProof(proof, proofFlags, leaves, hasher) == root;\n    }\n\n    /**\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n     * respectively.\n     *\n     * This version handles multiproofs in memory with a custom hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n     *\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n     * validating the leaves elsewhere.\n     */\n    function processMultiProof(\n        bytes32[] memory proof,\n        bool[] memory proofFlags,\n        bytes32[] memory leaves,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bytes32 merkleRoot) {\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n        // the Merkle tree.\n        uint256 leavesLen = leaves.length;\n        uint256 proofFlagsLen = proofFlags.length;\n\n        // Check proof validity.\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\n            revert MerkleProofInvalidMultiproof();\n        }\n\n        // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\n        uint256 leafPos = 0;\n        uint256 hashPos = 0;\n        uint256 proofPos = 0;\n        // At each step, we compute the next hash using two values:\n        // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n        //   get the next hash.\n        // - depending on the flag, either another value from the \"main queue\" (merging branches) or an element from the\n        //   `proof` array.\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n            bytes32 b = proofFlags[i]\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\n                : proof[proofPos++];\n            hashes[i] = hasher(a, b);\n        }\n\n        if (proofFlagsLen > 0) {\n            if (proofPos != proof.length) {\n                revert MerkleProofInvalidMultiproof();\n            }\n            unchecked {\n                return hashes[proofFlagsLen - 1];\n            }\n        } else if (leavesLen > 0) {\n            return leaves[0];\n        } else {\n            return proof[0];\n        }\n    }\n\n    /**\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n     *\n     * This version handles multiproofs in calldata with the default hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n     *\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\n     */\n    function multiProofVerifyCalldata(\n        bytes32[] calldata proof,\n        bool[] calldata proofFlags,\n        bytes32 root,\n        bytes32[] memory leaves\n    ) internal pure returns (bool) {\n        return processMultiProofCalldata(proof, proofFlags, leaves) == root;\n    }\n\n    /**\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n     * respectively.\n     *\n     * This version handles multiproofs in calldata with the default hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n     *\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n     * validating the leaves elsewhere.\n     */\n    function processMultiProofCalldata(\n        bytes32[] calldata proof,\n        bool[] calldata proofFlags,\n        bytes32[] memory leaves\n    ) internal pure returns (bytes32 merkleRoot) {\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n        // the Merkle tree.\n        uint256 leavesLen = leaves.length;\n        uint256 proofFlagsLen = proofFlags.length;\n\n        // Check proof validity.\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\n            revert MerkleProofInvalidMultiproof();\n        }\n\n        // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\n        uint256 leafPos = 0;\n        uint256 hashPos = 0;\n        uint256 proofPos = 0;\n        // At each step, we compute the next hash using two values:\n        // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n        //   get the next hash.\n        // - depending on the flag, either another value from the \"main queue\" (merging branches) or an element from the\n        //   `proof` array.\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n            bytes32 b = proofFlags[i]\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\n                : proof[proofPos++];\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\n        }\n\n        if (proofFlagsLen > 0) {\n            if (proofPos != proof.length) {\n                revert MerkleProofInvalidMultiproof();\n            }\n            unchecked {\n                return hashes[proofFlagsLen - 1];\n            }\n        } else if (leavesLen > 0) {\n            return leaves[0];\n        } else {\n            return proof[0];\n        }\n    }\n\n    /**\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n     *\n     * This version handles multiproofs in calldata with a custom hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n     *\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\n     */\n    function multiProofVerifyCalldata(\n        bytes32[] calldata proof,\n        bool[] calldata proofFlags,\n        bytes32 root,\n        bytes32[] memory leaves,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bool) {\n        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;\n    }\n\n    /**\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n     * respectively.\n     *\n     * This version handles multiproofs in calldata with a custom hashing function.\n     *\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n     *\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n     * validating the leaves elsewhere.\n     */\n    function processMultiProofCalldata(\n        bytes32[] calldata proof,\n        bool[] calldata proofFlags,\n        bytes32[] memory leaves,\n        function(bytes32, bytes32) view returns (bytes32) hasher\n    ) internal view returns (bytes32 merkleRoot) {\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\n        // the Merkle tree.\n        uint256 leavesLen = leaves.length;\n        uint256 proofFlagsLen = proofFlags.length;\n\n        // Check proof validity.\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\n            revert MerkleProofInvalidMultiproof();\n        }\n\n        // The xxxPos values are \"pointers\" to the next value to consume in each array. All accesses are done using\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \"pop\".\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\n        uint256 leafPos = 0;\n        uint256 hashPos = 0;\n        uint256 proofPos = 0;\n        // At each step, we compute the next hash using two values:\n        // - a value from the \"main queue\". If not all leaves have been consumed, we get the next leaf, otherwise we\n        //   get the next hash.\n        // - depending on the flag, either another value from the \"main queue\" (merging branches) or an element from the\n        //   `proof` array.\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\n            bytes32 b = proofFlags[i]\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\n                : proof[proofPos++];\n            hashes[i] = hasher(a, b);\n        }\n\n        if (proofFlagsLen > 0) {\n            if (proofPos != proof.length) {\n                revert MerkleProofInvalidMultiproof();\n            }\n            unchecked {\n                return hashes[proofFlagsLen - 1];\n            }\n        } else if (leavesLen > 0) {\n            return leaves[0];\n        } else {\n            return proof[0];\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Errors.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\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[ERC 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"},"@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\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 ternary(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 ternary(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 towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 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 low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / 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 high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\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\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\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²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n        for (uint256 i = 0; i < byteArray.length; ++i) {\n            if (byteArray[i] != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\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 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev An uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(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 ternary(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            // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n            // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n            int256 mask = n >> 255;\n\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n            return uint256((n + mask) ^ mask);\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\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 ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\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(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\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 Int256Slot {\n        int256 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        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\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        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\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        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    using SafeCast for *;\n\n    bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n    uint8 private constant ADDRESS_LENGTH = 20;\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\n        (1 << 0x08) | // backspace\n            (1 << 0x09) | // tab\n            (1 << 0x0a) | // newline\n            (1 << 0x0c) | // form feed\n            (1 << 0x0d) | // carriage return\n            (1 << 0x22) | // double quote\n            (1 << 0x5c); // backslash\n\n    /**\n     * @dev The `value` string doesn't fit in the specified `length`.\n     */\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n    /**\n     * @dev The string being parsed contains characters that are not in scope of the given base.\n     */\n    error StringsInvalidChar();\n\n    /**\n     * @dev The string being parsed is not a properly formatted address.\n     */\n    error StringsInvalidAddressFormat();\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            assembly (\"memory-safe\") {\n                ptr := add(add(buffer, 0x20), length)\n            }\n            while (true) {\n                ptr--;\n                assembly (\"memory-safe\") {\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\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 toStringSigned(int256 value) internal pure returns (string memory) {\n        return string.concat(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        uint256 localValue = value;\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] = HEX_DIGITS[localValue & 0xf];\n            localValue >>= 4;\n        }\n        if (localValue != 0) {\n            revert StringsInsufficientHexLength(value, length);\n        }\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\n     * 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 Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n     * representation, according to EIP-55.\n     */\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\n        bytes memory buffer = bytes(toHexString(addr));\n\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\n        uint256 hashValue;\n        assembly (\"memory-safe\") {\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n        }\n\n        for (uint256 i = 41; i > 1; --i) {\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n                // case shift by xoring with 0x20\n                buffer[i] ^= 0x20;\n            }\n            hashValue >>= 4;\n        }\n        return string(buffer);\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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input) internal pure returns (uint256) {\n        return parseUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[0-9]*`\n     * - The result must fit into an `uint256` type\n     */\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        uint256 result = 0;\n        for (uint256 i = begin; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 9) return (false, 0);\n            result *= 10;\n            result += chr;\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a decimal string and returns the value as a `int256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input) internal pure returns (int256) {\n        return parseInt(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `[-+]?[0-9]*`\n     * - The result must fit in an `int256` type.\n     */\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n        (bool success, int256 value) = tryParseInt(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n     * the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n    /**\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n     * character or if the result does not fit in a `int256`.\n     *\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n     */\n    function tryParseInt(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, int256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseIntUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseIntUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, int256 value) {\n        bytes memory buffer = bytes(input);\n\n        // Check presence of a negative sign.\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        bool positiveSign = sign == bytes1(\"+\");\n        bool negativeSign = sign == bytes1(\"-\");\n        uint256 offset = (positiveSign || negativeSign).toUint();\n\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n        if (absSuccess && absValue < ABS_MIN_INT256) {\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n            return (true, type(int256).min);\n        } else return (false, 0);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input) internal pure returns (uint256) {\n        return parseHexUint(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n     * - The result must fit in an `uint256` type.\n     */\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n        if (!success) revert StringsInvalidChar();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n     * invalid character.\n     *\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\n     */\n    function tryParseHexUint(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, uint256 value) {\n        if (end > bytes(input).length || begin > end) return (false, 0);\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\n    }\n\n    /**\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n     */\n    function _tryParseHexUintUncheckedBounds(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) private pure returns (bool success, uint256 value) {\n        bytes memory buffer = bytes(input);\n\n        // skip 0x prefix if present\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 offset = hasPrefix.toUint() * 2;\n\n        uint256 result = 0;\n        for (uint256 i = begin + offset; i < end; ++i) {\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n            if (chr > 15) return (false, 0);\n            result *= 16;\n            unchecked {\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n                result += chr;\n            }\n        }\n        return (true, result);\n    }\n\n    /**\n     * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n     *\n     * Requirements:\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input) internal pure returns (address) {\n        return parseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n     * `end` (excluded).\n     *\n     * Requirements:\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n     */\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n        (bool success, address value) = tryParseAddress(input, begin, end);\n        if (!success) revert StringsInvalidAddressFormat();\n        return value;\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n     * formatted address. See {parseAddress-string} requirements.\n     */\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n        return tryParseAddress(input, 0, bytes(input).length);\n    }\n\n    /**\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n     */\n    function tryParseAddress(\n        string memory input,\n        uint256 begin,\n        uint256 end\n    ) internal pure returns (bool success, address value) {\n        if (end > bytes(input).length || begin > end) return (false, address(0));\n\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n        // check that input is the correct length\n        if (end - begin == expectedLength) {\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n            return (s, address(uint160(v)));\n        } else {\n            return (false, address(0));\n        }\n    }\n\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n        uint8 value = uint8(chr);\n\n        // Try to parse `chr`:\n        // - Case 1: [0-9]\n        // - Case 2: [a-f]\n        // - Case 3: [A-F]\n        // - otherwise not supported\n        unchecked {\n            if (value > 47 && value < 58) value -= 48;\n            else if (value > 96 && value < 103) value -= 87;\n            else if (value > 64 && value < 71) value -= 55;\n            else return type(uint8).max;\n        }\n\n        return value;\n    }\n\n    /**\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n     *\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n     *\n     * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n     * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n     * characters that are not in this range, but other tooling may provide different results.\n     */\n    function escapeJSON(string memory input) internal pure returns (string memory) {\n        bytes memory buffer = bytes(input);\n        bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n        uint256 outputLength = 0;\n\n        for (uint256 i; i < buffer.length; ++i) {\n            bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n            if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n                output[outputLength++] = \"\\\\\";\n                if (char == 0x08) output[outputLength++] = \"b\";\n                else if (char == 0x09) output[outputLength++] = \"t\";\n                else if (char == 0x0a) output[outputLength++] = \"n\";\n                else if (char == 0x0c) output[outputLength++] = \"f\";\n                else if (char == 0x0d) output[outputLength++] = \"r\";\n                else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n                else if (char == 0x22) {\n                    // solhint-disable-next-line quotes\n                    output[outputLength++] = '\"';\n                }\n            } else {\n                output[outputLength++] = char;\n            }\n        }\n        // write the actual length and deallocate unused memory\n        assembly (\"memory-safe\") {\n            mstore(output, outputLength)\n            mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n        }\n\n        return string(output);\n    }\n\n    /**\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\n     *\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n     * assembly block as such would prevent some optimizations.\n     */\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\n        assembly (\"memory-safe\") {\n            value := mload(add(add(buffer, 0x20), offset))\n        }\n    }\n}\n"},"contracts/access/AccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {AccessControlBase} from \"./base/AccessControlBase.sol\";\nimport {ContractOwnership} from \"./ContractOwnership.sol\";\n\n/// @title Access control via roles management (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\n"},"contracts/access/base/AccessControlBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IAccessControl} from \"./../../access/interfaces/IAccessControl.sol\";\nimport {AccessControlStorage} from \"./../libraries/AccessControlStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Access control via roles management (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract AccessControlBase is IAccessControl, Context {\n    using AccessControlStorage for AccessControlStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Grants a role to an account.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\n    /// @param role The role to grant.\n    /// @param account The account to grant the role to.\n    function grantRole(bytes32 role, address account) external virtual {\n        address operator = _msgSender();\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\n        AccessControlStorage.layout().grantRole(role, account, operator);\n    }\n\n    /// @notice Revokes a role from an account.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\n    /// @param role The role to revoke.\n    /// @param account The account to revoke the role from.\n    function revokeRole(bytes32 role, address account) external virtual {\n        address operator = _msgSender();\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\n        AccessControlStorage.layout().revokeRole(role, account, operator);\n    }\n\n    /// @inheritdoc IAccessControl\n    function renounceRole(bytes32 role) external virtual {\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\n    }\n\n    /// @inheritdoc IAccessControl\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\n        return AccessControlStorage.layout().hasRole(role, account);\n    }\n}\n"},"contracts/access/base/ContractOwnershipBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC173} from \"./../interfaces/IERC173.sol\";\nimport {ContractOwnershipStorage} from \"./../libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC173 Contract Ownership Standard (proxiable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract ContractOwnershipBase is IERC173, Context {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @inheritdoc IERC173\n    function owner() public view virtual returns (address) {\n        return ContractOwnershipStorage.layout().owner();\n    }\n\n    /// @inheritdoc IERC173\n    function transferOwnership(address newOwner) public virtual {\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\n    }\n}\n"},"contracts/access/base/SafeContractOwnershipBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC173Safe} from \"./../interfaces/IERC173Safe.sol\";\nimport {SafeContractOwnershipStorage} from \"./../libraries/SafeContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n\n    /// @inheritdoc IERC173Safe\n    function transferOwnership(address newOwner) public virtual {\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\n    }\n\n    /// @inheritdoc IERC173Safe\n    function acceptOwnership() public virtual {\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\n    }\n\n    /// @inheritdoc IERC173Safe\n    function owner() public view virtual returns (address) {\n        return SafeContractOwnershipStorage.layout().owner();\n    }\n\n    /// @inheritdoc IERC173Safe\n    function pendingOwner() public view virtual returns (address) {\n        return SafeContractOwnershipStorage.layout().pendingOwner();\n    }\n}\n"},"contracts/access/ContractOwnership.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ContractOwnershipStorage} from \"./libraries/ContractOwnershipStorage.sol\";\nimport {ContractOwnershipBase} from \"./base/ContractOwnershipBase.sol\";\nimport {InterfaceDetection} from \"./../introspection/InterfaceDetection.sol\";\n\n/// @title ERC173 Contract Ownership Standard (immutable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Initializes the storage with an initial contract owner.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner the initial contract owner.\n    constructor(address initialOwner) {\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\n    }\n}\n"},"contracts/access/errors/AccessControlErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when an account does not have the required role.\n/// @param role The role the caller is missing.\n/// @param account The account that was checked.\nerror NotRoleHolder(bytes32 role, address account);\n\n/// @notice Thrown when an account does not have the required role on a target contract.\n/// @param targetContract The contract that was checked.\n/// @param role The role that was checked.\n/// @param account The account that was checked.\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\n"},"contracts/access/errors/Common.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the target contract is actually not a contract.\n/// @param targetContract The contract that was checked\nerror TargetIsNotAContract(address targetContract);\n"},"contracts/access/errors/ContractOwnershipErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when an account is not the contract owner but is required to.\n/// @param account The account that was checked.\nerror NotContractOwner(address account);\n\n/// @notice Thrown when an account is not the pending contract owner but is required to.\n/// @param account The account that was checked.\nerror NotPendingContractOwner(address account);\n\n/// @notice Thrown when an account is not the target contract owner but is required to.\n/// @param targetContract The contract that was checked.\n/// @param account The account that was checked.\nerror NotTargetContractOwner(address targetContract, address account);\n"},"contracts/access/events/AccessControlEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when `role` is granted to `account`.\n/// @param role The role that has been granted.\n/// @param account The account that has been granted the role.\n/// @param operator The account that granted the role.\nevent RoleGranted(bytes32 role, address account, address operator);\n\n/// @notice Emitted when `role` is revoked from `account`.\n/// @param role The role that has been revoked.\n/// @param account The account that has been revoked the role.\n/// @param operator The account that revoked the role.\nevent RoleRevoked(bytes32 role, address account, address operator);\n"},"contracts/access/events/ERC173Events.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when the contract ownership changes.\n/// @param previousOwner the previous contract owner.\n/// @param newOwner the new contract owner.\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n/// @notice Emitted when a new contract owner is pending.\n/// @param pendingOwner the address of the new contract owner.\nevent OwnershipTransferPending(address indexed pendingOwner);\n"},"contracts/access/facets/AccessControlFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {AccessControlBase} from \"./../base/AccessControlBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Access control via roles management (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\ncontract AccessControlFacet is AccessControlBase, ForwarderRegistryContextBase {\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/access/facets/ContractOwnershipFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ContractOwnershipStorage} from \"./../libraries/ContractOwnershipStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ContractOwnershipBase} from \"./../base/ContractOwnershipBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC173 Contract Ownership Standard (facet version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ContractOwnershipFacet is ContractOwnershipBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function initContractOwnershipStorage(address initialOwner) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ContractOwnershipStorage.layout().proxyInit(initialOwner);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/access/facets/SafeContractOwnershipFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {SafeContractOwnershipStorage} from \"./../libraries/SafeContractOwnershipStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {SafeContractOwnershipBase} from \"./../base/SafeContractOwnershipBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC173 Contract Ownership Standard (facet version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract SafeContractOwnershipFacet is SafeContractOwnershipBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function initContractOwnershipStorage(address initialOwner) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        SafeContractOwnershipStorage.layout().proxyInit(initialOwner);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/access/interfaces/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Access control via roles management (functions)\ninterface IAccessControl {\n    /// @notice Renounces a role by the sender.\n    /// @dev Reverts if `sender` does not have `role`.\n    /// @dev Emits a {RoleRevoked} event.\n    /// @param role The role to renounce.\n    function renounceRole(bytes32 role) external;\n\n    /// @notice Retrieves whether an account has a role.\n    /// @param role The role.\n    /// @param account The account.\n    /// @return hasRole_ Whether `account` has `role`.\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\n}\n"},"contracts/access/interfaces/IERC173.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC-173 Contract Ownership Standard (functions)\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\ninterface IERC173 {\n    /// @notice Sets the address of the new contract owner.\n    /// @dev Reverts if the sender is not the contract owner.\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\n    function transferOwnership(address newOwner) external;\n\n    /// @notice Gets the address of the contract owner.\n    /// @return contractOwner The address of the contract owner.\n    function owner() external view returns (address contractOwner);\n}\n"},"contracts/access/interfaces/IERC173Safe.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\ninterface IERC173Safe {\n    /// @notice Sets an address as the pending new contract owner.\n    /// @dev Reverts if the sender is not the contract owner.\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\n    function transferOwnership(address newOwner) external;\n\n    /// @notice Sets the pending contract owner as the new contract owner.\n    /// @dev Reverts if the sender is not the pending contract owner.\n    /// @dev Emits an {OwnershipTransferred} event.\n    function acceptOwnership() external;\n\n    /// @notice Gets the address of the contract owner.\n    /// @return contractOwner The address of the contract owner.\n    function owner() external view returns (address contractOwner);\n\n    /// @notice Gets the address of the pending contract owner.\n    /// @return pendingContractOwner The address of the pending contract owner.\n    function pendingOwner() external view returns (address pendingContractOwner);\n}\n"},"contracts/access/libraries/AccessControlStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \"./../errors/AccessControlErrors.sol\";\nimport {TargetIsNotAContract} from \"./../errors/Common.sol\";\nimport {RoleGranted, RoleRevoked} from \"./../events/AccessControlEvents.sol\";\nimport {IAccessControl} from \"./../interfaces/IAccessControl.sol\";\nimport {Address} from \"./../../utils/libraries/Address.sol\";\n\nlibrary AccessControlStorage {\n    using Address for address;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    struct Layout {\n        mapping(bytes32 => mapping(address => bool)) roles;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.access.AccessControl.storage\")) - 1);\n\n    /// @notice Grants a role to an account.\n    /// @dev Note: Call to this function should be properly access controlled.\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\n    /// @param role The role to grant.\n    /// @param account The account to grant the role to.\n    /// @param operator The account requesting the role change.\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\n        if (!s.hasRole(role, account)) {\n            s.roles[role][account] = true;\n            emit RoleGranted(role, account, operator);\n        }\n    }\n\n    /// @notice Revokes a role from an account.\n    /// @dev Note: Call to this function should be properly access controlled.\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\n    /// @param role The role to revoke.\n    /// @param account The account to revoke the role from.\n    /// @param operator The account requesting the role change.\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\n        if (s.hasRole(role, account)) {\n            s.roles[role][account] = false;\n            emit RoleRevoked(role, account, operator);\n        }\n    }\n\n    /// @notice Renounces a role by the sender.\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\n    /// @dev Emits a {RoleRevoked} event.\n    /// @param sender The message sender.\n    /// @param role The role to renounce.\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\n        s.enforceHasRole(role, sender);\n        s.roles[role][sender] = false;\n        emit RoleRevoked(role, sender, sender);\n    }\n\n    /// @notice Retrieves whether an account has a role.\n    /// @param role The role.\n    /// @param account The account.\n    /// @return hasRole_ Whether `account` has `role`.\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\n        return s.roles[role][account];\n    }\n\n    /// @notice Checks whether an account has a role in a target contract.\n    /// @param targetContract The contract to check.\n    /// @param role The role to check.\n    /// @param account The account to check.\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\n        return IAccessControl(targetContract).hasRole(role, account);\n    }\n\n    /// @notice Ensures that an account has a role.\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\n    /// @param role The role.\n    /// @param account The account.\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\n    }\n\n    /// @notice Enforces that an account has a role in a target contract.\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\n    /// @param targetContract The contract to check.\n    /// @param role The role to check.\n    /// @param account The account to check.\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/access/libraries/ContractOwnershipStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {NotContractOwner, NotTargetContractOwner} from \"./../errors/ContractOwnershipErrors.sol\";\nimport {TargetIsNotAContract} from \"./../errors/Common.sol\";\nimport {OwnershipTransferred} from \"./../events/ERC173Events.sol\";\nimport {IERC173} from \"./../interfaces/IERC173.sol\";\nimport {Address} from \"./../../utils/libraries/Address.sol\";\nimport {ProxyInitialization} from \"./../../proxy/libraries/ProxyInitialization.sol\";\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ContractOwnershipStorage {\n    using Address for address;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        address contractOwner;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.access.ContractOwnership.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.access.ContractOwnership.phase\")) - 1);\n\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function constructorInit(Layout storage s, address initialOwner) internal {\n        if (initialOwner != address(0)) {\n            s.contractOwner = initialOwner;\n            emit OwnershipTransferred(address(0), initialOwner);\n        }\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\n    }\n\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function proxyInit(Layout storage s, address initialOwner) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.constructorInit(initialOwner);\n    }\n\n    /// @notice Sets the address of the new contract owner.\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\n        address previousOwner = s.contractOwner;\n        if (sender != previousOwner) revert NotContractOwner(sender);\n        if (previousOwner != newOwner) {\n            s.contractOwner = newOwner;\n            emit OwnershipTransferred(previousOwner, newOwner);\n        }\n    }\n\n    /// @notice Gets the address of the contract owner.\n    /// @return contractOwner The address of the contract owner.\n    function owner(Layout storage s) internal view returns (address contractOwner) {\n        return s.contractOwner;\n    }\n\n    /// @notice Checks whether an account is the owner of a target contract.\n    /// @param targetContract The contract to check.\n    /// @param account The account to check.\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\n        return IERC173(targetContract).owner() == account;\n    }\n\n    /// @notice Ensures that an account is the contract owner.\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\n    /// @param account The account.\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\n        if (account != s.contractOwner) revert NotContractOwner(account);\n    }\n\n    /// @notice Enforces that an account is the owner of a target contract.\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\n    /// @param targetContract The contract to check.\n    /// @param account The account to check.\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/access/libraries/SafeContractOwnershipStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \"./../errors/ContractOwnershipErrors.sol\";\nimport {TargetIsNotAContract} from \"./../errors/Common.sol\";\nimport {OwnershipTransferred, OwnershipTransferPending} from \"./../events/ERC173Events.sol\";\nimport {IERC173} from \"./../interfaces/IERC173.sol\";\nimport {Address} from \"./../../utils/libraries/Address.sol\";\nimport {ProxyInitialization} from \"./../../proxy/libraries/ProxyInitialization.sol\";\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary SafeContractOwnershipStorage {\n    using Address for address;\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        address contractOwner;\n        address pendingContractOwner;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.access.SafeContractOwnership.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.access.SafeContractOwnership.phase\")) - 1);\n\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function constructorInit(Layout storage s, address initialOwner) internal {\n        if (initialOwner != address(0)) {\n            s.contractOwner = initialOwner;\n            emit OwnershipTransferred(address(0), initialOwner);\n        }\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\n    }\n\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner The initial contract owner.\n    function proxyInit(Layout storage s, address initialOwner) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.constructorInit(initialOwner);\n    }\n\n    /// @notice Sets an address as the pending new contract owner.\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\n        address currentOwner = s.contractOwner;\n        if (sender != currentOwner) revert NotContractOwner(sender);\n        if (newOwner == address(0)) {\n            s.contractOwner = address(0);\n            s.pendingContractOwner = address(0);\n            emit OwnershipTransferred(currentOwner, address(0));\n        } else {\n            if (currentOwner != newOwner) {\n                s.pendingContractOwner = newOwner;\n                emit OwnershipTransferPending(newOwner);\n            }\n        }\n    }\n\n    /// @notice Sets the pending contract owner as the new contract owner.\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\n    /// @dev Emits an {OwnershipTransferred} event.\n    function acceptOwnership(Layout storage s, address sender) internal {\n        address pendingContractOwner = s.pendingContractOwner;\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\n        s.contractOwner = pendingContractOwner;\n        s.pendingContractOwner = address(0);\n    }\n\n    /// @notice Gets the address of the contract owner.\n    /// @return contractOwner The address of the contract owner.\n    function owner(Layout storage s) internal view returns (address contractOwner) {\n        return s.contractOwner;\n    }\n\n    /// @notice Gets the address of the pending contract owner.\n    /// @return pendingContractOwner The address of the pending contract owner.\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\n        return s.pendingContractOwner;\n    }\n\n    /// @notice Checks whether an account is the owner of a target contract.\n    /// @param targetContract The contract to check.\n    /// @param account The account to check.\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\n        return IERC173(targetContract).owner() == account;\n    }\n\n    /// @notice Ensures that an account is the contract owner.\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\n    /// @param account The account.\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\n        if (account != s.contractOwner) revert NotContractOwner(account);\n    }\n\n    /// @notice Enforces that an account is the owner of a target contract.\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\n    /// @param targetContract The contract to check.\n    /// @param account The account to check.\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/access/SafeContractOwnership.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {SafeContractOwnershipStorage} from \"./libraries/SafeContractOwnershipStorage.sol\";\nimport {SafeContractOwnershipBase} from \"./base/SafeContractOwnershipBase.sol\";\nimport {InterfaceDetection} from \"./../introspection/InterfaceDetection.sol\";\n\n/// @title ERC173 Contract Ownership Standard (immutable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract SafeContractOwnership is SafeContractOwnershipBase, InterfaceDetection {\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n\n    /// @notice Initializes the storage with an initial contract owner.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n    /// @param initialOwner the initial contract owner.\n    constructor(address initialOwner) {\n        SafeContractOwnershipStorage.layout().constructorInit(initialOwner);\n    }\n}\n"},"contracts/CommonErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\nerror EtherReceptionDisabled();\n\n/// @notice Thrown when the multiple related arrays have different lengths.\nerror InconsistentArrayLengths();\n\n/// @notice Thrown when an ETH transfer has failed.\nerror TransferFailed();\n"},"contracts/cryptography/interfaces/IERC1271.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Standard Signature Validation Method for Contracts.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1271\ninterface IERC1271 {\n    /// @notice Returns whether the signature is valid for the data hash.\n    /// @param hash The hash of the signed data.\n    /// @param signature The signature for `hash`.\n    /// @return magicValue `0x1626ba7e` (`bytes4(keccak256(\"isValidSignature(bytes32,bytes)\")`) if the signature is valid, else any other value.\n    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"},"contracts/diamond/Diamond.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {EtherReceptionDisabled} from \"./../CommonErrors.sol\";\nimport {FacetCut, Initialization} from \"./DiamondCommon.sol\";\nimport {DiamondStorage} from \"./libraries/DiamondStorage.sol\";\n\n/// @title ERC2535 Diamond Standard, Diamond.\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\ncontract Diamond {\n    using DiamondStorage for DiamondStorage.Layout;\n\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\n    /// @dev Emits a {DiamondCut} event.\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\n    constructor(FacetCut[] memory cuts, Initialization[] memory initializations) payable {\n        DiamondStorage.layout().diamondCut(cuts, initializations);\n    }\n\n    /// @notice Execute a function from a facet with delegatecall.\n    /// @dev Reverts with {FunctionNotFound} if the function selector is not found.\n    fallback() external payable {\n        DiamondStorage.layout().delegateOnFallback();\n    }\n\n    receive() external payable virtual {\n        revert EtherReceptionDisabled();\n    }\n}\n"},"contracts/diamond/DiamondCommon.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\nstruct Facet {\n    address facet;\n    bytes4[] selectors;\n}\n\nenum FacetCutAction {\n    ADD,\n    REPLACE,\n    REMOVE\n}\n// Add=0, Replace=1, Remove=2\n\nstruct FacetCut {\n    address facet;\n    FacetCutAction action;\n    bytes4[] selectors;\n}\n\nstruct Initialization {\n    address target;\n    bytes data;\n}\n"},"contracts/diamond/errors/DiamondErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\n/// @param facet The facet address.\nerror EmptyFacet(address facet);\n\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\n/// @param facet The facet address.\nerror NonContractFacet(address facet);\n\n/// @notice Thrown when trying to add a function selector that has already been added.\n/// @param facet The facet address which already has the function.\n/// @param selector The function selector which has already been added.\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\n\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\n/// @param facet The facet address which is not zero.\nerror RemovingWithNonZeroAddressFacet(address facet);\n\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\n/// @param selector The function selector which has not been added.\nerror FunctionNotFound(bytes4 selector);\n\n/// @notice Thrown when trying to remove or replace an immutable function.\n/// @param selector The function selector which is immutable.\nerror ModifyingImmutableFunction(bytes4 selector);\n\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\n/// @param facet The facet address.\n/// @param selector The function selector.\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\n\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\nerror ZeroAddressTargetInitCallButNonEmptyData();\n\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\n/// @param target The target address for the initialization call.\nerror EmptyInitCallData(address target);\n\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\n/// @param target The target address for the initialization call.\nerror NonContractInitCallTarget(address target);\n\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\n/// @param target The target address for the initialization call.\n/// @param data The data for the initialization call.\nerror InitCallReverted(address target, bytes data);\n"},"contracts/diamond/events/DiamondCutEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {FacetCut} from \"./../DiamondCommon.sol\";\n\n/// @notice Emitted when at least a cut action is operated on the diamond.\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\n/// @param target The address of the contract where `data` was executed.\n/// @param data The encoded function call executed on `target`.\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\n"},"contracts/diamond/facets/DiamondCutFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {FacetCut, Initialization} from \"./../DiamondCommon.sol\";\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IDiamondCut} from \"./../interfaces/IDiamondCut.sol\";\nimport {IDiamondCutBatchInit} from \"./../interfaces/IDiamondCutBatchInit.sol\";\nimport {DiamondStorage} from \"./../libraries/DiamondStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Diamond Cut (facet version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract DiamondCutFacet is IDiamondCut, IDiamondCutBatchInit, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using DiamondStorage for DiamondStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initDiamondCutStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        DiamondStorage.initDiamondCut();\n    }\n\n    /// @inheritdoc IDiamondCut\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        DiamondStorage.layout().diamondCut(cuts, target, data);\n    }\n\n    /// @inheritdoc IDiamondCutBatchInit\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        DiamondStorage.layout().diamondCut(cuts, initializations);\n    }\n}\n"},"contracts/diamond/facets/DiamondLoupeFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {Facet} from \"./../DiamondCommon.sol\";\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IDiamondLoupe} from \"./../interfaces/IDiamondLoupe.sol\";\nimport {DiamondStorage} from \"./../libraries/DiamondStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Diamond Loupe (facet version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract DiamondLoupeFacet is IDiamondLoupe, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using DiamondStorage for DiamondStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initDiamondLoupeStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        DiamondStorage.initDiamondLoupe();\n    }\n\n    /// @inheritdoc IDiamondLoupe\n    function facets() external view returns (Facet[] memory facets_) {\n        facets_ = DiamondStorage.layout().facets();\n    }\n\n    /// @inheritdoc IDiamondLoupe\n    function facetFunctionSelectors(address facet) external view returns (bytes4[] memory facetFunctionSelectors_) {\n        facetFunctionSelectors_ = DiamondStorage.layout().facetFunctionSelectors(facet);\n    }\n\n    /// @inheritdoc IDiamondLoupe\n    function facetAddresses() external view returns (address[] memory facetAddresses_) {\n        facetAddresses_ = DiamondStorage.layout().facetAddresses();\n    }\n\n    /// @inheritdoc IDiamondLoupe\n    function facetAddress(bytes4 functionSelector) external view returns (address facetAddress_) {\n        facetAddress_ = DiamondStorage.layout().facetAddress(functionSelector);\n    }\n}\n"},"contracts/diamond/interfaces/IDiamondCut.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {FacetCut} from \"./../DiamondCommon.sol\";\n\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\ninterface IDiamondCut {\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\n    /// @dev Emits a {DiamondCut} event.\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n    /// @param target The address of the contract to execute `data` on.\n    /// @param data The encoded function call to execute on `target`.\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\n}\n"},"contracts/diamond/interfaces/IDiamondCutBatchInit.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {FacetCut, Initialization} from \"./../DiamondCommon.sol\";\n\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\ninterface IDiamondCutBatchInit {\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\n    /// @dev Emits a {DiamondCut} event.\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\n}\n"},"contracts/diamond/interfaces/IDiamondLoupe.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\nimport {Facet} from \"./../DiamondCommon.sol\";\n\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\ninterface IDiamondLoupe {\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\n    function facets() external view returns (Facet[] memory diamondFacets);\n\n    /// @notice Gets all the function selectors supported by a facet.\n    /// @param facetAddress The facet address.\n    /// @return selectors The function selectors supported by `facet`.\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\n\n    /// @notice Get all the facet addresses used by the diamond.\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\n\n    /// @notice Gets the facet address that supports a given function selector.\n    /// @param functionSelector The function selector.\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\n}\n"},"contracts/diamond/libraries/DiamondStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\npragma experimental ABIEncoderV2;\n\n// solhint-disable-next-line max-line-length\nimport {\n    EmptyFacet,\n    NonContractFacet,\n    FunctionAlreadyPresent,\n    RemovingWithNonZeroAddressFacet,\n    FunctionNotFound,\n    ModifyingImmutableFunction,\n    ReplacingFunctionByItself,\n    ZeroAddressTargetInitCallButNonEmptyData,\n    EmptyInitCallData,\n    NonContractInitCallTarget,\n    InitCallReverted\n} from \"./../errors/DiamondErrors.sol\";\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \"./../DiamondCommon.sol\";\nimport {DiamondCut} from \"./../events/DiamondCutEvents.sol\";\nimport {IDiamondCut} from \"./../interfaces/IDiamondCut.sol\";\nimport {IDiamondCutBatchInit} from \"./../interfaces/IDiamondCutBatchInit.sol\";\nimport {IDiamondLoupe} from \"./../interfaces/IDiamondLoupe.sol\";\nimport {Address} from \"./../../utils/libraries/Address.sol\";\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\nlibrary DiamondStorage {\n    using Address for address;\n    using DiamondStorage for DiamondStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        // selector => (facet address, selector slot position)\n        mapping(bytes4 => bytes32) diamondFacets;\n        // number of selectors registered in selectorSlots\n        uint16 selectorCount;\n        // array of selector slots with 8 selectors per slot\n        mapping(uint256 => bytes32) selectorSlots;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.Diamond.storage\")) - 1);\n\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\n\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\n    function initDiamondCut() internal {\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\n    function initDiamondLoupe() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\n    }\n\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\n        s.cutFacets(cuts);\n        initializationCall(target, data);\n        emit DiamondCut(cuts, target, data);\n    }\n\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\n        s.cutFacets(cuts);\n        uint256 length = initializations.length;\n        for (uint256 i; i < length; ++i) {\n            initializationCall(initializations[i].target, initializations[i].data);\n        }\n        emit DiamondCut(cuts, address(0), \"\");\n    }\n\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\n        uint256 originalSelectorCount = s.selectorCount;\n        uint256 selectorCount = originalSelectorCount;\n        bytes32 selectorSlot;\n\n        // Check if last selector slot is not full\n        if (selectorCount & 7 > 0) {\n            // get last selectorSlot\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\n        }\n\n        uint256 length = facetCuts.length;\n        for (uint256 i; i < length; ++i) {\n            FacetCut memory facetCut = facetCuts[i];\n\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\n\n            FacetCutAction action = facetCut.action;\n            if (action == FacetCutAction.ADD) {\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\n            } else if (action == FacetCutAction.REPLACE) {\n                s.replaceFacetSelectors(facetCut);\n            } else {\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\n            }\n        }\n\n        if (selectorCount != originalSelectorCount) {\n            s.selectorCount = uint16(selectorCount);\n        }\n\n        // If last selector slot is not full\n        if (selectorCount & 7 > 0) {\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\n        }\n    }\n\n    function addFacetSelectors(\n        Layout storage s,\n        uint256 selectorCount,\n        bytes32 selectorSlot,\n        FacetCut memory facetCut\n    ) internal returns (uint256, bytes32) {\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\n\n        uint256 length = facetCut.selectors.length;\n        for (uint256 i; i < length; ++i) {\n            bytes4 selector = facetCut.selectors[i];\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\n\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\n\n            // add facet for selector\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\n\n            // clear selector position in slot and add selector\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\n\n            // if slot is full then write it to storage\n            if (selectorInSlotPosition == 224) {\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\n                selectorSlot = 0;\n            }\n\n            unchecked {\n                ++selectorCount;\n            }\n        }\n\n        return (selectorCount, selectorSlot);\n    }\n\n    function removeFacetSelectors(\n        Layout storage s,\n        uint256 selectorCount,\n        bytes32 selectorSlot,\n        FacetCut memory facetCut\n    ) internal returns (uint256, bytes32) {\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\n\n        uint256 selectorSlotCount = selectorCount >> 3;\n        uint256 selectorInSlotIndex = selectorCount & 7;\n\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\n            bytes4 selector = facetCut.selectors[i];\n            bytes32 oldFacet = s.diamondFacets[selector];\n\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\n\n            if (selectorSlot == 0) {\n                unchecked {\n                    selectorSlotCount--;\n                }\n                selectorSlot = s.selectorSlots[selectorSlotCount];\n                selectorInSlotIndex = 7;\n            } else {\n                unchecked {\n                    selectorInSlotIndex--;\n                }\n            }\n\n            bytes4 lastSelector;\n            uint256 oldSelectorsSlotCount;\n            uint256 oldSelectorInSlotPosition;\n\n            // adding a block here prevents stack too deep error\n            {\n                // replace selector with last selector in l.facets\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\n\n                if (lastSelector != selector) {\n                    // update last selector slot position info\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\n                }\n\n                delete s.diamondFacets[selector];\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\n            }\n\n            if (oldSelectorsSlotCount != selectorSlotCount) {\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\n\n                // clears the selector we are deleting and puts the last selector in its place.\n                oldSelectorSlot =\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\n\n                // update storage with the modified slot\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\n            } else {\n                // clears the selector we are deleting and puts the last selector in its place.\n                selectorSlot =\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\n            }\n\n            if (selectorInSlotIndex == 0) {\n                delete s.selectorSlots[selectorSlotCount];\n                selectorSlot = 0;\n            }\n        }\n\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\n\n        return (selectorCount, selectorSlot);\n    }\n\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\n        address facet = facetCut.facet;\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\n\n        uint256 length = facetCut.selectors.length;\n        for (uint256 i; i < length; ++i) {\n            bytes4 selector = facetCut.selectors[i];\n            bytes32 oldFacet = s.diamondFacets[selector];\n            address oldFacetAddress = address(bytes20(oldFacet));\n\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\n\n            // replace old facet address\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\n        }\n    }\n\n    function initializationCall(address target, bytes memory data) internal {\n        if (target == address(0)) {\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\n        } else {\n            if (data.length == 0) revert EmptyInitCallData(target);\n            if (target != address(this)) {\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\n            }\n\n            (bool success, bytes memory returndata) = target.delegatecall(data);\n            if (!success) {\n                uint256 returndataLength = returndata.length;\n                if (returndataLength != 0) {\n                    assembly {\n                        revert(add(32, returndata), returndataLength)\n                    }\n                } else {\n                    revert InitCallReverted(target, data);\n                }\n            }\n        }\n    }\n\n    function delegateOnFallback(Layout storage s) internal {\n        bytes4 selector = msg.sig;\n        address facet = s.facetAddress(selector);\n        if (facet == address(0)) revert FunctionNotFound(selector);\n        assembly {\n            calldatacopy(0, 0, calldatasize())\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\n            returndatacopy(0, 0, returndatasize())\n            switch result\n            case 0 {\n                revert(0, returndatasize())\n            }\n            default {\n                return(0, returndatasize())\n            }\n        }\n    }\n\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\n        unchecked {\n            uint16 selectorCount = s.selectorCount;\n            diamondFacets = new Facet[](selectorCount);\n\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\n            uint256 numFacets;\n            uint256 selectorIndex;\n\n            // loop through function selectors\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\n                bytes32 slot = s.selectorSlots[slotIndex];\n\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\n                    ++selectorIndex;\n\n                    if (selectorIndex > selectorCount) {\n                        break;\n                    }\n\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\n                    address facet = address(bytes20(s.diamondFacets[selector]));\n\n                    bool continueLoop;\n\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\n                        if (diamondFacets[facetIndex].facet == facet) {\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\n                            ++numFacetSelectors[facetIndex];\n                            continueLoop = true;\n                            break;\n                        }\n                    }\n\n                    if (continueLoop) {\n                        continue;\n                    }\n\n                    diamondFacets[numFacets].facet = facet;\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\n                    diamondFacets[numFacets].selectors[0] = selector;\n                    numFacetSelectors[numFacets] = 1;\n                    ++numFacets;\n                }\n            }\n\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\n                uint256 numSelectors = numFacetSelectors[facetIndex];\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\n\n                // setting the number of selectors\n                assembly {\n                    mstore(selectors, numSelectors)\n                }\n            }\n\n            // setting the number of facets\n            assembly {\n                mstore(diamondFacets, numFacets)\n            }\n        }\n    }\n\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\n        unchecked {\n            uint16 selectorCount = s.selectorCount;\n            selectors = new bytes4[](selectorCount);\n\n            uint256 numSelectors;\n            uint256 selectorIndex;\n\n            // loop through function selectors\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\n                bytes32 slot = s.selectorSlots[slotIndex];\n\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\n                    ++selectorIndex;\n\n                    if (selectorIndex > selectorCount) {\n                        break;\n                    }\n\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\n\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\n                        selectors[numSelectors] = selector;\n                        ++numSelectors;\n                    }\n                }\n            }\n\n            // set the number of selectors in the array\n            assembly {\n                mstore(selectors, numSelectors)\n            }\n        }\n    }\n\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\n        unchecked {\n            uint16 selectorCount = s.selectorCount;\n            addresses = new address[](selectorCount);\n            uint256 numFacets;\n            uint256 selectorIndex;\n\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\n                bytes32 slot = s.selectorSlots[slotIndex];\n\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\n                    ++selectorIndex;\n\n                    if (selectorIndex > selectorCount) {\n                        break;\n                    }\n\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\n                    address facet = address(bytes20(s.diamondFacets[selector]));\n\n                    bool continueLoop;\n\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\n                        if (facet == addresses[facetIndex]) {\n                            continueLoop = true;\n                            break;\n                        }\n                    }\n\n                    if (continueLoop) {\n                        continue;\n                    }\n\n                    addresses[numFacets] = facet;\n                    ++numFacets;\n                }\n            }\n\n            // set the number of facet addresses in the array\n            assembly {\n                mstore(addresses, numFacets)\n            }\n        }\n    }\n\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\n        facet = address(bytes20(s.diamondFacets[selector]));\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/introspection/errors/InterfaceDetectionErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\nerror IllegalInterfaceId();\n"},"contracts/introspection/facets/InterfaceDetectionFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {InterfaceDetection} from \"./../InterfaceDetection.sol\";\n\n/// @title ERC165 Interface Detection Standard (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\ncontract InterfaceDetectionFacet is InterfaceDetection {}\n"},"contracts/introspection/InterfaceDetection.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC165} from \"./interfaces/IERC165.sol\";\nimport {InterfaceDetectionStorage} from \"./libraries/InterfaceDetectionStorage.sol\";\n\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\nabstract contract InterfaceDetection is IERC165 {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\n    }\n}\n"},"contracts/introspection/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC165 Interface Detection Standard.\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\ninterface IERC165 {\n    /// @notice Returns whether this contract implements a given interface.\n    /// @dev Note: This function call must use less than 30 000 gas.\n    /// @param interfaceId the interface identifier to test.\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\n}\n"},"contracts/introspection/libraries/InterfaceDetectionStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IllegalInterfaceId} from \"./../errors/InterfaceDetectionErrors.sol\";\nimport {IERC165} from \"./../interfaces/IERC165.sol\";\n\nlibrary InterfaceDetectionStorage {\n    struct Layout {\n        mapping(bytes4 => bool) supportedInterfaces;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.introspection.InterfaceDetection.storage\")) - 1);\n\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\n\n    /// @notice Sets or unsets an ERC165 interface.\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\n    /// @param interfaceId the interface identifier.\n    /// @param supported True to set the interface, false to unset it.\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\n        s.supportedInterfaces[interfaceId] = supported;\n    }\n\n    /// @notice Returns whether this contract implements a given interface.\n    /// @dev Note: This function call must use less than 30 000 gas.\n    /// @param interfaceId The interface identifier to test.\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\n            return false;\n        }\n        if (interfaceId == type(IERC165).interfaceId) {\n            return true;\n        }\n        return s.supportedInterfaces[interfaceId];\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/lifecycle/base/CheckpointsBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ICheckpoints} from \"./../interfaces/ICheckpoints.sol\";\nimport {CheckpointsStorage} from \"./../libraries/CheckpointsStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Timestamp-based checkpoints management (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract CheckpointsBase is ICheckpoints, Context {\n    using CheckpointsStorage for CheckpointsStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Sets the checkpoints.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\n    /// @param checkpointId The checkpoint identifiers.\n    /// @param timestamp The checkpoint timestamps.\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\n    }\n\n    /// @notice Sets a batch of checkpoints.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\n    /// @param checkpointIds The checkpoint identifier.\n    /// @param timestamps The checkpoint timestamp.\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\n    }\n\n    /// @notice Sets the checkpoint to the current block timestamp.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\n    /// @dev Emits a {CheckpointSet} event.\n    /// @param checkpointId The checkpoint identifier.\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\n    }\n\n    /// @inheritdoc ICheckpoints\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\n    }\n\n    /// @inheritdoc ICheckpoints\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\n    }\n}\n"},"contracts/lifecycle/base/PauseBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IPause} from \"./../interfaces/IPause.sol\";\nimport {PauseStorage} from \"./../libraries/PauseStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Pausing mechanism (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract PauseBase is IPause, Context {\n    using PauseStorage for PauseStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Pauses the contract.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {Paused} if the contract is paused.\n    /// @dev Emits a {Paused} event.\n    function pause() external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        PauseStorage.layout().pause();\n    }\n\n    /// @notice Unpauses the contract.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\n    /// @dev Emits an {Unpaused} event.\n    function unpause() external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        PauseStorage.layout().unpause();\n    }\n\n    // /// @inheritdoc IPause\n    function paused() external view virtual returns (bool) {\n        return PauseStorage.layout().paused();\n    }\n}\n"},"contracts/lifecycle/Checkpoints.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {CheckpointsBase} from \"./base/CheckpointsBase.sol\";\nimport {ContractOwnership} from \"./../access/ContractOwnership.sol\";\n\n/// @title Timestamp-based checkpoints management (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract Checkpoints is CheckpointsBase, ContractOwnership {}\n"},"contracts/lifecycle/errors/CheckpointsErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to set a checkpoint which is already set.\n/// @param checkpointId The checkpoint identifier.\nerror CheckpointAlreadySet(bytes32 checkpointId);\n\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\n/// @param checkpointId The checkpoint identifier.\nerror CheckpointNotReached(bytes32 checkpointId);\n\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\n/// @param checkpointId The checkpoint identifier.\nerror CheckpointReached(bytes32 checkpointId);\n"},"contracts/lifecycle/errors/PauseErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the contract is paused but is required not to.\nerror Paused();\n\n/// @notice Thrown when the contract is not paused but is required to.\nerror NotPaused();\n"},"contracts/lifecycle/events/CheckpointsEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when a checkpoint is set.\n/// @param checkpointId The checkpoint identifier.\n/// @param timestamp The timestamp associated to the checkpoint.\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\n"},"contracts/lifecycle/events/PauseEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when the pause is triggered.\nevent Pause();\n\n/// @notice Emitted when the pause is lifted.\nevent Unpause();\n"},"contracts/lifecycle/facets/CheckpointsFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {CheckpointsBase} from \"./../base/CheckpointsBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Timestamp-based checkpoints management (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\ncontract CheckpointsFacet is CheckpointsBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/lifecycle/facets/PauseFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PauseStorage} from \"./../libraries/PauseStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {PauseBase} from \"./../base/PauseBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Pausing mechanism (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\ncontract PauseFacet is PauseBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using PauseStorage for PauseStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with an initial pause state.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits a {Paused} event if `isPaused` is true.\n    /// @param isPaused The initial pause state.\n    function initPauseStorage(bool isPaused) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        PauseStorage.layout().proxyInit(isPaused);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/lifecycle/interfaces/ICheckpoints.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Timestamp-based checkpoints management (functions)\ninterface ICheckpoints {\n    /// @notice Gets the checkpoint timestamp.\n    /// @param checkpointId The checkpoint identifier.\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\n\n    /// @notice Retrieves whether the checkpoint has been reached already.\n    /// @param checkpointId The checkpoint identifier.\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\n}\n"},"contracts/lifecycle/interfaces/IPause.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Pausing mechanism (functions)\ninterface IPause {\n    /// @notice Gets the paused state of the contract.\n    /// @return isPaused The paused state of the contract.\n    function paused() external view returns (bool isPaused);\n}\n"},"contracts/lifecycle/libraries/CheckpointsStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \"./../errors/CheckpointsErrors.sol\";\nimport {InconsistentArrayLengths} from \"./../../CommonErrors.sol\";\nimport {CheckpointSet} from \"./../events/CheckpointsEvents.sol\";\n\nlibrary CheckpointsStorage {\n    using CheckpointsStorage for CheckpointsStorage.Layout;\n\n    struct Layout {\n        // checkpointId => timestamp\n        mapping(bytes32 => uint256) checkpoints;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.lifecycle.Checkpoints.storage\")) - 1);\n\n    /// @notice Sets the checkpoint.\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\n    /// @param checkpointId The checkpoint identifier.\n    /// @param timestamp The checkpoint timestamp.\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\n        if (timestamp != 0) {\n            s.checkpoints[checkpointId] = timestamp;\n            emit CheckpointSet(checkpointId, timestamp);\n        }\n    }\n\n    /// @notice Sets a batch of checkpoints.\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\n    /// @param checkpointIds The checkpoint identifiers.\n    /// @param timestamps The checkpoint timestamps.\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\n        uint256 length = checkpointIds.length;\n        if (length != timestamps.length) revert InconsistentArrayLengths();\n\n        for (uint256 i; i < length; ++i) {\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\n        }\n    }\n\n    /// @notice Sets the checkpoint to the current block timestamp.\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\n    /// @dev Emits a {CheckpointSet} event.\n    /// @param checkpointId The checkpoint identifier.\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\n        s.enforceCheckpointNotReached(checkpointId);\n        s.checkpoints[checkpointId] = block.timestamp;\n        emit CheckpointSet(checkpointId, block.timestamp);\n    }\n\n    /// @notice Gets the checkpoint timestamp.\n    /// @param checkpointId The checkpoint identifier.\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\n        return s.checkpoints[checkpointId];\n    }\n\n    /// @notice Retrieves whether the checkpoint has been reached already.\n    /// @param checkpointId The checkpoint identifier.\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\n    }\n\n    /// @notice Ensures that the checkpoint has been reached already.\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\n    /// @param checkpointId The checkpoint identifier.\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\n    }\n\n    /// @notice Ensures that the checkpoint has not been reached yet.\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\n    /// @param checkpointId The checkpoint identifier.\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/lifecycle/libraries/PauseStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {Paused, NotPaused} from \"./../errors/PauseErrors.sol\";\nimport {Pause, Unpause} from \"./../events/PauseEvents.sol\";\nimport {ProxyInitialization} from \"./../../proxy/libraries/ProxyInitialization.sol\";\n\nlibrary PauseStorage {\n    using PauseStorage for PauseStorage.Layout;\n\n    struct Layout {\n        bool isPaused;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.lifecycle.Pause.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.lifecycle.Pause.phase\")) - 1);\n\n    /// @notice Initializes the storage with an initial pause state (immutable version).\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @dev Emits a {Pause} event if `isPaused` is true.\n    /// @param isPaused The initial pause state.\n    function constructorInit(Layout storage s, bool isPaused) internal {\n        if (isPaused) {\n            s.isPaused = true;\n            emit Pause();\n        }\n    }\n\n    /// @notice Initializes the storage with an initial pause state (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits a {Pause} event if `isPaused` is true.\n    /// @param isPaused The initial pause state.\n    function proxyInit(Layout storage s, bool isPaused) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.constructorInit(isPaused);\n    }\n\n    /// @notice Pauses the contract.\n    /// @dev Reverts with {Paused} if the contract is paused.\n    /// @dev Emits a {Pause} event.\n    function pause(Layout storage s) internal {\n        s.enforceIsNotPaused();\n        s.isPaused = true;\n        emit Pause();\n    }\n\n    /// @notice Unpauses the contract.\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\n    /// @dev Emits an {Unpause} event.\n    function unpause(Layout storage s) internal {\n        s.enforceIsPaused();\n        s.isPaused = false;\n        emit Unpause();\n    }\n\n    /// @notice Gets the paused state of the contract.\n    /// @return isPaused The paused state of the contract.\n    function paused(Layout storage s) internal view returns (bool isPaused) {\n        return s.isPaused;\n    }\n\n    /// @notice Ensures that the contract is paused.\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\n    function enforceIsPaused(Layout storage s) internal view {\n        if (!s.isPaused) revert NotPaused();\n    }\n\n    /// @notice Ensures that the contract is not paused.\n    /// @dev Reverts with {Paused} if the contract is paused.\n    function enforceIsNotPaused(Layout storage s) internal view {\n        if (s.isPaused) revert Paused();\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/lifecycle/Pause.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PauseStorage} from \"./libraries/PauseStorage.sol\";\nimport {PauseBase} from \"./base/PauseBase.sol\";\nimport {ContractOwnership} from \"../access/ContractOwnership.sol\";\n\n/// @title Pausing mechanism (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract Pause is PauseBase, ContractOwnership {\n    using PauseStorage for PauseStorage.Layout;\n\n    /// @notice Initializes the storage with an initial pause state.\n    /// @dev Emits a {Paused} event if `isPaused` is true.\n    /// @param isPaused The initial pause state.\n    constructor(bool isPaused) {\n        PauseStorage.layout().constructorInit(isPaused);\n    }\n}\n"},"contracts/metatx/base/ForwarderRegistryContextBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IForwarderRegistry} from \"./../interfaces/IForwarderRegistry.sol\";\nimport {ERC2771Calldata} from \"./../libraries/ERC2771Calldata.sol\";\n\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\nabstract contract ForwarderRegistryContextBase {\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\n\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\n    constructor(IForwarderRegistry forwarderRegistry) {\n        _FORWARDER_REGISTRY = forwarderRegistry;\n    }\n\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\n    function _msgSender() internal view virtual returns (address) {\n        // ERC2771 meta-transactions disabled\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\n            return msg.sender;\n        }\n\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\n        // solhint-disable-next-line avoid-tx-origin\n        if (msg.sender == tx.origin || msg.data.length < 24) {\n            return msg.sender;\n        }\n\n        address sender = ERC2771Calldata.msgSender();\n\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\n            return sender;\n        }\n\n        return msg.sender;\n    }\n\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\n    function _msgData() internal view virtual returns (bytes calldata) {\n        // ERC2771 meta-transactions disabled\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\n            return msg.data;\n        }\n\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\n        // solhint-disable-next-line avoid-tx-origin\n        if (msg.sender == tx.origin || msg.data.length < 24) {\n            return msg.data;\n        }\n\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\n        if (\n            msg.sender == address(_FORWARDER_REGISTRY) ||\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\n        ) {\n            return ERC2771Calldata.msgData();\n        }\n\n        return msg.data;\n    }\n}\n"},"contracts/metatx/facets/ForwarderRegistryContextFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC2771} from \"./../interfaces/IERC2771.sol\";\nimport {IForwarderRegistry} from \"./../interfaces/IForwarderRegistry.sol\";\n\n/// @title Meta-Transactions Forwarder Registry Context (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\ncontract ForwarderRegistryContextFacet is IERC2771 {\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\n\n    constructor(IForwarderRegistry forwarderRegistry_) {\n        _FORWARDER_REGISTRY = forwarderRegistry_;\n    }\n\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\n        return _FORWARDER_REGISTRY;\n    }\n\n    /// @inheritdoc IERC2771\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\n        // ERC2771 meta-transactions disabled\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\n            return false;\n        }\n\n        return forwarder == address(_FORWARDER_REGISTRY);\n    }\n}\n"},"contracts/metatx/ForwarderRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC1271} from \"./../cryptography/interfaces/IERC1271.sol\";\nimport {IForwarderRegistry} from \"./interfaces/IForwarderRegistry.sol\";\nimport {IERC2771} from \"./interfaces/IERC2771.sol\";\nimport {ERC2771Calldata} from \"./libraries/ERC2771Calldata.sol\";\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\n/// @title Meta-Transactions Forwarder Registry.\n/// @notice Users can allow specific EIP-2771 forwarders to forward meta-transactions on their behalf, per target contract.\n/// @dev This contract should be deployed uniquely per network, in a non-upgradeable way.\ncontract ForwarderRegistry is IForwarderRegistry, IERC2771 {\n    using Address for address;\n    using ECDSA for bytes32;\n\n    struct Forwarder {\n        uint248 nonce;\n        bool approved;\n    }\n\n    error ForwarderNotApproved(address sender, address forwarder, address target);\n    error InvalidEIP1271Signature();\n    error WrongSigner();\n\n    bytes4 private constant EIP1271_MAGICVALUE = 0x1626ba7e;\n    bytes32 private constant EIP712_DOMAIN_NAME = keccak256(\"ForwarderRegistry\");\n    bytes32 private constant APPROVAL_TYPEHASH =\n        keccak256(\"ForwarderApproval(address sender,address forwarder,address target,bool approved,uint256 nonce)\");\n\n    // sender => forwarder => target => Forwarder\n    mapping(address => mapping(address => mapping(address => Forwarder))) private _forwarders;\n\n    uint256 private immutable _DEPLOYMENT_CHAIN_ID;\n    bytes32 private immutable _DEPLOYMENT_DOMAIN_SEPARATOR;\n\n    /// @notice Emitted when a forwarder is approved or disapproved.\n    /// @param sender The account for which `forwarder` is approved or disapproved.\n    /// @param forwarder The account approved or disapproved as forwarder.\n    /// @param target The target contract approved or disapproved as forwarder.\n    /// @param approved True for an approval, false for a disapproval.\n    /// @param nonce The `sender`'s account nonce before the approval change.\n    event ForwarderApproval(address indexed sender, address indexed forwarder, address indexed target, bool approved, uint256 nonce);\n\n    constructor() {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        _DEPLOYMENT_CHAIN_ID = chainId;\n        _DEPLOYMENT_DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId);\n    }\n\n    /// @notice Approves or disapproves a forwarder for the sender.\n    /// @dev Emits a {ForwarderApproval} event.\n    /// @param forwarder The address of the forwarder to change the approval of.\n    function setForwarderApproval(address forwarder, address target, bool approved) external {\n        Forwarder storage forwarderData = _forwarders[msg.sender][forwarder][target];\n        _setForwarderApproval(forwarderData, msg.sender, forwarder, target, approved, forwarderData.nonce);\n    }\n\n    /// @notice Approves or disapproves a forwarder using a signature.\n    /// @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\n    /// @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\n    /// @dev Emits a {ForwarderApproval} event.\n    /// @param sender The address which signed the approval of the approval.\n    /// @param forwarder The address of the forwarder to change the approval of.\n    /// @param target The target contract to change the approval of.\n    /// @param approved Whether to approve or disapprove the forwarder.\n    /// @param signature Signature by `sender` for approving forwarder.\n    /// @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271.\n    function setForwarderApproval(\n        address sender,\n        address forwarder,\n        address target,\n        bool approved,\n        bytes calldata signature,\n        bool isEIP1271Signature\n    ) public {\n        Forwarder storage forwarderData = _forwarders[sender][forwarder][target];\n        uint256 nonce = forwarderData.nonce;\n\n        _requireValidSignature(sender, forwarder, target, approved, nonce, signature, isEIP1271Signature);\n        _setForwarderApproval(forwarderData, sender, forwarder, target, approved, nonce);\n    }\n\n    /// @notice Forwards the meta-transaction using EIP-2771.\n    /// @dev Reverts with {ForwarderNotApproved} if the caller has not been previously approved as a forwarder by the sender.\n    /// @param target The destination of the call (that will receive the meta-transaction).\n    /// @param data The content of the call (the `sender` address will be appended to it according to EIP-2771).\n    function forward(address target, bytes calldata data) external payable {\n        address sender = ERC2771Calldata.msgSender();\n        if (!_forwarders[sender][msg.sender][target].approved) revert ForwarderNotApproved(sender, msg.sender, target);\n        target.functionCallWithValue(abi.encodePacked(data, sender), msg.value);\n    }\n\n    /// @notice Approves the forwarder and forwards the meta-transaction using EIP-2771.\n    /// @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\n    /// @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\n    /// @dev Emits a {ForwarderApproval} event.\n    /// @param signature Signature by `sender` for approving the forwarder.\n    /// @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271.\n    /// @param target The destination of the call (that will receive the meta-transaction).\n    /// @param data The content of the call (the `sender` address will be appended to it according to EIP-2771).\n    function approveAndForward(bytes calldata signature, bool isEIP1271Signature, address target, bytes calldata data) external payable {\n        address sender = ERC2771Calldata.msgSender();\n        setForwarderApproval(sender, msg.sender, target, true, signature, isEIP1271Signature);\n        target.functionCallWithValue(abi.encodePacked(data, sender), msg.value);\n    }\n\n    /// @notice Returns the EIP-712 DOMAIN_SEPARATOR.\n    /// @return domainSeparator The EIP-712 domain separator.\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() public view returns (bytes32 domainSeparator) {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n\n        // in case a fork happens, to support the chain that had to change its chainId, we compute the domain operator\n        return chainId == _DEPLOYMENT_CHAIN_ID ? _DEPLOYMENT_DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\n    }\n\n    /// @notice Gets the current nonce for the sender/forwarder pair.\n    /// @param sender The sender account.\n    /// @param forwarder The forwarder account.\n    /// @param target The target contract.\n    /// @return nonce The current nonce for the `sender`/`forwarder`/`target` tuple.\n    function getNonce(address sender, address forwarder, address target) external view returns (uint256 nonce) {\n        return _forwarders[sender][forwarder][target].nonce;\n    }\n\n    /// @inheritdoc IForwarderRegistry\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool) {\n        return _forwarders[sender][forwarder][target].approved;\n    }\n\n    /// @inheritdoc IERC2771\n    function isTrustedForwarder(address) external pure returns (bool) {\n        return true;\n    }\n\n    function _requireValidSignature(\n        address sender,\n        address forwarder,\n        address target,\n        bool approved,\n        uint256 nonce,\n        bytes calldata signature,\n        bool isEIP1271Signature\n    ) private view {\n        bytes memory data = abi.encodePacked(\n            \"\\x19\\x01\",\n            DOMAIN_SEPARATOR(),\n            keccak256(abi.encode(APPROVAL_TYPEHASH, sender, forwarder, target, approved, nonce))\n        );\n        if (isEIP1271Signature) {\n            if (IERC1271(sender).isValidSignature(keccak256(data), signature) != EIP1271_MAGICVALUE) revert InvalidEIP1271Signature();\n        } else {\n            if (keccak256(data).recover(signature) != sender) revert WrongSigner();\n        }\n    }\n\n    function _setForwarderApproval(\n        Forwarder storage forwarderData,\n        address sender,\n        address forwarder,\n        address target,\n        bool approved,\n        uint256 nonce\n    ) private {\n        forwarderData.approved = approved;\n        unchecked {\n            forwarderData.nonce = uint248(nonce + 1);\n        }\n        emit ForwarderApproval(sender, forwarder, target, approved, nonce);\n    }\n\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\n        return\n            keccak256(\n                abi.encode(\n                    keccak256(\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\"),\n                    EIP712_DOMAIN_NAME,\n                    chainId,\n                    address(this)\n                )\n            );\n    }\n}\n"},"contracts/metatx/ForwarderRegistryContext.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IForwarderRegistry} from \"./interfaces/IForwarderRegistry.sol\";\nimport {IERC2771} from \"./interfaces/IERC2771.sol\";\nimport {ForwarderRegistryContextBase} from \"./base/ForwarderRegistryContextBase.sol\";\n\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\n\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\n        return _FORWARDER_REGISTRY;\n    }\n\n    /// @inheritdoc IERC2771\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\n        // ERC2771 meta-transactions disabled\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\n            return false;\n        }\n\n        return forwarder == address(_FORWARDER_REGISTRY);\n    }\n}\n"},"contracts/metatx/interfaces/IERC2771.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Secure Protocol for Native Meta Transactions.\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\ninterface IERC2771 {\n    /// @notice Checks whether a forwarder is trusted.\n    /// @param forwarder The forwarder to check.\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\n}\n"},"contracts/metatx/interfaces/IForwarderRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Meta-Transactions Forwarder Registry.\ninterface IForwarderRegistry {\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\n    /// @param sender The sender account.\n    /// @param forwarder The forwarder account.\n    /// @param target The target contract.\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\n}\n"},"contracts/metatx/libraries/ERC2771Calldata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\nlibrary ERC2771Calldata {\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\n    function msgSender() internal pure returns (address sender) {\n        assembly {\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\n        }\n    }\n\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\n    function msgData() internal pure returns (bytes calldata data) {\n        unchecked {\n            return msg.data[:msg.data.length - 20];\n        }\n    }\n}\n"},"contracts/mocks/access/AccessControlMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {AccessControlStorage} from \"./../../access/libraries/AccessControlStorage.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract AccessControlMock is AccessControl, ForwarderRegistryContext {\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant TEST_ROLE = \"tester\";\n\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceHasRole(bytes32 role, address account) external view {\n        AccessControlStorage.layout().enforceHasRole(role, account);\n    }\n\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) external view {\n        AccessControlStorage.enforceHasTargetContractRole(targetContract, role, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/access/ContractOwnershipMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ContractOwnershipMock is ContractOwnership, ForwarderRegistryContext {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(\n        address initialOwner,\n        IForwarderRegistry forwarderRegistry\n    ) ContractOwnership(initialOwner) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceIsContractOwner(address account) external view {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(account);\n    }\n\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\n        ContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/access/facets/AccessControlFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {AccessControlFacet} from \"./../../../access/facets/AccessControlFacet.sol\";\n\ncontract AccessControlFacetMock is AccessControlFacet {\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant TEST_ROLE = \"tester\";\n\n    constructor(IForwarderRegistry forwarderRegistry) AccessControlFacet(forwarderRegistry) {}\n\n    function enforceHasRole(bytes32 role, address account) external view {\n        AccessControlStorage.layout().enforceHasRole(role, account);\n    }\n\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) external view {\n        AccessControlStorage.enforceHasTargetContractRole(targetContract, role, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ContractOwnershipStorage} from \"./../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ContractOwnershipFacet} from \"./../../../access/facets/ContractOwnershipFacet.sol\";\n\ncontract ContractOwnershipFacetMock is ContractOwnershipFacet {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnershipFacet(forwarderRegistry) {}\n\n    function enforceIsContractOwner(address account) external view {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(account);\n    }\n\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\n        ContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {SafeContractOwnershipStorage} from \"./../../../access/libraries/SafeContractOwnershipStorage.sol\";\nimport {SafeContractOwnershipFacet} from \"./../../../access/facets/SafeContractOwnershipFacet.sol\";\n\ncontract SafeContractOwnershipFacetMock is SafeContractOwnershipFacet {\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) SafeContractOwnershipFacet(forwarderRegistry) {}\n\n    function enforceIsContractOwner(address account) external view {\n        SafeContractOwnershipStorage.layout().enforceIsContractOwner(account);\n    }\n\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\n        SafeContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/access/SafeContractOwnershipMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {SafeContractOwnershipStorage} from \"./../../access/libraries/SafeContractOwnershipStorage.sol\";\nimport {SafeContractOwnership} from \"./../../access/SafeContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract SafeContractOwnershipMock is SafeContractOwnership, ForwarderRegistryContext {\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\n\n    constructor(\n        address initialOwner,\n        IForwarderRegistry forwarderRegistry\n    ) SafeContractOwnership(initialOwner) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceIsContractOwner(address account) external view {\n        SafeContractOwnershipStorage.layout().enforceIsContractOwner(account);\n    }\n\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\n        SafeContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/cryptography/ERC1654Mock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC1271} from \"./../../cryptography/interfaces/IERC1271.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\ncontract ERC1271Mock is IERC1271 {\n    using ECDSA for bytes32;\n\n    address internal immutable _OWNER;\n\n    constructor(address owner) {\n        _OWNER = owner;\n    }\n\n    function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4 magicValue) {\n        address signer = hash.recover(signature);\n        if (signer == _OWNER) {\n            return 0x1626ba7e;\n        } else {\n            return 0xffffffff;\n        }\n    }\n}\n"},"contracts/mocks/diamond/DiamondMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {FacetCutAction, FacetCut, Initialization} from \"./../../diamond/DiamondCommon.sol\";\nimport {DiamondStorage} from \"./../../diamond/libraries/DiamondStorage.sol\";\nimport {Diamond} from \"./../../diamond/Diamond.sol\";\n\ncontract DiamondMock is Diamond {\n    using DiamondStorage for DiamondStorage.Layout;\n\n    event ImmutableFunctionCalled();\n\n    constructor(FacetCut[] memory cuts, Initialization[] memory initializations) payable Diamond(cuts, initializations) {\n        bytes4[] memory selectors = new bytes4[](1);\n        selectors[0] = DiamondMock.immutableFunction.selector;\n        FacetCut[] memory cut = new FacetCut[](1);\n        cut[0].facet = address(this);\n        cut[0].action = FacetCutAction.ADD;\n        cut[0].selectors = selectors;\n\n        DiamondStorage.layout().diamondCut(cut, address(0), \"\");\n    }\n\n    function immutableFunction() external {\n        emit ImmutableFunctionCalled();\n    }\n}\n"},"contracts/mocks/diamond/FacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\ncontract FacetMock {\n    event FacetFunctionCalled();\n\n    error RevertedWithMessage();\n\n    function doSomething() external {\n        emit FacetFunctionCalled();\n    }\n\n    function revertsWithoutMessage() external pure {\n        // solhint-disable-next-line gas-custom-errors, reason-string\n        revert();\n    }\n\n    function revertsWithMessage() external pure {\n        revert RevertedWithMessage();\n    }\n\n    // These functions are placeholders for tests to manipulate the selectorCount in different scenarios\n    function a() external pure {}\n\n    function b() external pure {}\n\n    function c() external pure {}\n\n    function d() external pure {}\n\n    function e() external pure {}\n\n    function f() external pure {}\n\n    function g() external pure {}\n\n    function h() external pure {}\n\n    function i() external pure {}\n\n    function j() external pure {}\n\n    function k() external pure {}\n}\n"},"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {InterfaceDetectionFacet} from \"./../../../introspection/facets/InterfaceDetectionFacet.sol\";\n\ncontract InterfaceDetectionFacetMock is InterfaceDetectionFacet {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    function setSupportedInterface(bytes4 interfaceId, bool supported) external {\n        InterfaceDetectionStorage.layout().setSupportedInterface(interfaceId, supported);\n    }\n}\n"},"contracts/mocks/introspection/InterfaceDetectionMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\ncontract InterfaceDetectionMock is InterfaceDetection {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    function setSupportedInterface(bytes4 interfaceId, bool supported) external {\n        InterfaceDetectionStorage.layout().setSupportedInterface(interfaceId, supported);\n    }\n}\n"},"contracts/mocks/lifecycle/CheckpointsMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {CheckpointsStorage} from \"./../../lifecycle/libraries/CheckpointsStorage.sol\";\nimport {Checkpoints} from \"./../../lifecycle/Checkpoints.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract CheckpointsMock is Checkpoints, ForwarderRegistryContext {\n    using CheckpointsStorage for CheckpointsStorage.Layout;\n\n    bytes32 public constant START_CHECKPOINTID = \"START\";\n\n    constructor(IForwarderRegistry forwarderRegistry) Checkpoints() ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceCheckpointReached(bytes32 checkpointId) external view {\n        CheckpointsStorage.layout().enforceCheckpointReached(checkpointId);\n    }\n\n    function enforceCheckpointNotReached(bytes32 checkpointId) external view {\n        CheckpointsStorage.layout().enforceCheckpointNotReached(checkpointId);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {CheckpointsStorage} from \"./../../../lifecycle/libraries/CheckpointsStorage.sol\";\nimport {CheckpointsFacet} from \"./../../../lifecycle/facets/CheckpointsFacet.sol\";\n\ncontract CheckpointsFacetMock is CheckpointsFacet {\n    using CheckpointsStorage for CheckpointsStorage.Layout;\n\n    bytes32 public constant START_CHECKPOINTID = \"START\";\n\n    constructor(IForwarderRegistry forwarderRegistry) CheckpointsFacet(forwarderRegistry) {}\n\n    function enforceCheckpointReached(bytes32 checkpointId) external view {\n        CheckpointsStorage.layout().enforceCheckpointReached(checkpointId);\n    }\n\n    function enforceCheckpointNotReached(bytes32 checkpointId) external view {\n        CheckpointsStorage.layout().enforceCheckpointNotReached(checkpointId);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/lifecycle/facets/PauseFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PauseStorage} from \"./../../../lifecycle/libraries/PauseStorage.sol\";\nimport {PauseFacet} from \"./../../../lifecycle/facets/PauseFacet.sol\";\n\ncontract PauseFacetMock is PauseFacet {\n    using PauseStorage for PauseStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) PauseFacet(forwarderRegistry) {}\n\n    function enforceIsPaused() external view {\n        PauseStorage.layout().enforceIsPaused();\n    }\n\n    function enforceIsNotPaused() external view {\n        PauseStorage.layout().enforceIsNotPaused();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/lifecycle/PauseMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PauseStorage} from \"./../../lifecycle/libraries/PauseStorage.sol\";\nimport {Pause} from \"./../../lifecycle/Pause.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract PauseMock is Pause, ForwarderRegistryContext {\n    using PauseStorage for PauseStorage.Layout;\n\n    constructor(\n        bool isPaused,\n        IForwarderRegistry forwarderRegistry\n    ) Pause(isPaused) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceIsPaused() external view {\n        PauseStorage.layout().enforceIsPaused();\n    }\n\n    function enforceIsNotPaused() external view {\n        PauseStorage.layout().enforceIsNotPaused();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/metatx/ForwarderMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\n\ncontract ForwarderMock {\n    using Address for address;\n\n    /// @notice Forward without appending a sender address to the calldata, so that msg.data.length < 24 (non-EIP-2771)\n    function non2771Forward(address target, bytes calldata data) external payable {\n        target.functionCallWithValue(data, msg.value);\n    }\n\n    /// @notice Forward while appending a sender address to the calldata (EIP-2771-compatible)\n    function forward(address from, address target, bytes calldata data) external payable {\n        target.functionCallWithValue(abi.encodePacked(data, from), msg.value);\n    }\n}\n"},"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ForwarderRegistryContext} from \"../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ForwarderRegistryReceiverMock is ForwarderRegistryContext {\n    mapping(address => uint256) internal _d;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    // test function without arguments, so that msg.data.length < 24\n    function smallDataTest() external {\n        address sender = _msgSender();\n        _msgData();\n        ++_d[sender];\n    }\n\n    function test(uint256 d) external {\n        address sender = _msgSender();\n        _msgData();\n        _d[sender] = d;\n    }\n\n    function getData(address who) external view returns (uint256) {\n        return _d[who];\n    }\n}\n"},"contracts/mocks/payment/CumulativeMerkleClaimMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {CumulativeMerkleClaim} from \"./../../payment/CumulativeMerkleClaim.sol\";\n\ncontract CumulativeMerkleClaimMock is CumulativeMerkleClaim {\n    event Distributed(address recipient, uint256 amount);\n\n    function _distributePayout(address recipient, bytes calldata claimData) internal virtual override {\n        uint256 amount = abi.decode(claimData, (uint256));\n        emit Distributed(recipient, amount);\n    }\n}\n"},"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PayoutWalletFacet} from \"./../../../payment/facets/PayoutWalletFacet.sol\";\n\ncontract PayoutWalletFacetMock is PayoutWalletFacet {\n    constructor(IForwarderRegistry forwarderRegistry) PayoutWalletFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/payment/PayoutWalletMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PayoutWallet} from \"./../../payment/PayoutWallet.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract PayoutWalletMock is PayoutWallet, ForwarderRegistryContext {\n    constructor(\n        address payable initialPayoutWallet,\n        IForwarderRegistry forwarderRegistry\n    ) PayoutWallet(initialPayoutWallet) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ProxyAdminFacet} from \"./../../../proxy/facets/ProxyAdminFacet.sol\";\n\ncontract ProxyAdminFacetMock is ProxyAdminFacet {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ProxyAdminFacet(forwarderRegistry) {}\n\n    function enforceIsProxyAdmin(address account) external view {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/proxy/ProxyAdminMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ProxyAdmin} from \"./../../proxy/ProxyAdmin.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ProxyAdminMock is ProxyAdmin, ForwarderRegistryContext {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(address admin, IForwarderRegistry forwarderRegistry) ProxyAdmin(admin) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function enforceIsProxyAdmin(address account) external view {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(account);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {TokenRecoveryFacet} from \"./../../../security/facets/TokenRecoveryFacet.sol\";\n\ncontract TokenRecoveryFacetMock is TokenRecoveryFacet {\n    constructor(IForwarderRegistry forwarderRegistry) TokenRecoveryFacet(forwarderRegistry) {}\n\n    receive() external payable {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/security/SealedExecutorMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {SealedExecutor} from \"./../../security/SealedExecutor.sol\";\n\ncontract SealedExecutorMock is SealedExecutor {\n    constructor(IForwarderRegistry forwarderRegistry) SealedExecutor(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/security/TokenRecoveryMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {TokenRecovery} from \"./../../security/TokenRecovery.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\n\ncontract TokenRecoveryMock is TokenRecovery, ForwarderRegistryContext {\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    receive() external payable {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {ERC1155StakingLinearPool} from \"./../../../staking/linear/stake/ERC1155StakingLinearPool.sol\";\nimport {LinearPool_ERC20Rewards} from \"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC1155} from \"./../../../token/ERC1155/interfaces/IERC1155.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract ERC1155StakingERC20RewardsLinearPoolMock is ERC1155StakingLinearPool, LinearPool_ERC20Rewards {\n    constructor(\n        IERC1155 stakingToken,\n        IERC20 rewardToken,\n        address rewardHolder,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ERC1155StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\n\n    function _computeClaim(\n        address staker,\n        uint256 claimable,\n        bytes calldata claimData\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\n    }\n\n    function _tokenValue(uint256, uint256 amount) internal view virtual override returns (uint256) {\n        return amount;\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\n        return LinearPool._msgSender();\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\n        return LinearPool._msgData();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {ERC20StakingLinearPool} from \"./../../../staking/linear/stake/ERC20StakingLinearPool.sol\";\nimport {LinearPool_ERC20Rewards} from \"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract ERC20StakingERC20RewardsLinearPoolMock is ERC20StakingLinearPool, LinearPool_ERC20Rewards {\n    constructor(\n        IERC20 stakingToken,\n        IERC20 rewardToken,\n        address rewardHolder,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\n\n    function _computeClaim(\n        address staker,\n        uint256 claimable,\n        bytes calldata claimData\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\n        return LinearPool._msgSender();\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\n        return LinearPool._msgData();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {ERC721StakingLinearPool} from \"./../../../staking/linear/stake/ERC721StakingLinearPool.sol\";\nimport {LinearPool_ERC20Rewards} from \"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC721} from \"./../../../token/ERC721/interfaces/IERC721.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract ERC721StakingERC20RewardsLinearPoolMock is ERC721StakingLinearPool, LinearPool_ERC20Rewards {\n    constructor(\n        IERC721 stakingToken,\n        IERC20 rewardToken,\n        address rewardHolder,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ERC721StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\n\n    function _computeClaim(\n        address staker,\n        uint256 claimable,\n        bytes calldata claimData\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\n    }\n\n    function _tokenValue(uint256) internal view virtual override returns (uint256) {\n        return 1;\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\n        return LinearPool._msgSender();\n    }\n\n    /// @inheritdoc LinearPool\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\n        return LinearPool._msgData();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract LinearPoolClaimRemainderMock is LinearPool {\n    event ClaimTransferred(uint256 totalReward, uint256 transferredReward);\n\n    constructor(uint8 scalingFactorDecimals, IForwarderRegistry forwarderRegistry) LinearPool(scalingFactorDecimals, forwarderRegistry) {}\n\n    function _computeStake(address, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(stakeData, (uint256));\n    }\n\n    function _computeWithdraw(address, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(withdrawData, (uint256));\n    }\n\n    function _computeClaim(address, uint256 claimable, bytes calldata) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\n        claimed = claimable - 1;\n        unclaimed = 1;\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {}\n}\n"},"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract LinearPoolInvalidClaimSumMock is LinearPool {\n    event ClaimTransferred(uint256 totalReward, uint256 transferredReward);\n\n    constructor(uint8 scalingFactorDecimals, IForwarderRegistry forwarderRegistry) LinearPool(scalingFactorDecimals, forwarderRegistry) {}\n\n    function _computeStake(address, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(stakeData, (uint256));\n    }\n\n    function _computeWithdraw(address, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(withdrawData, (uint256));\n    }\n\n    function _computeClaim(address, uint256 claimable, bytes calldata) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\n        claimed = claimable;\n        unclaimed = 1;\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {}\n}\n"},"contracts/mocks/staking/linear/LinearPoolMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../../../staking/linear/LinearPool.sol\";\nimport {LinearPoolReentrancyAttacker} from \"./LinearPoolReentrancyAttacker.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\ncontract LinearPoolMock is LinearPool {\n    LinearPoolReentrancyAttacker public immutable REENTRANCY_ATTACKER;\n\n    event ComputeStakeCalled(address staker, bytes stakeData);\n    event ComputeWithdrawCalled(address staker, bytes withdrawData);\n    event ComputeClaimCalled(address staker, uint256 claimable, bytes claimData);\n    event ComputeAddRewardCalled(address rewarder, uint256 reward);\n\n    constructor(\n        LinearPoolReentrancyAttacker reentrancyAttacker,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\n        REENTRANCY_ATTACKER = reentrancyAttacker;\n    }\n\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(stakeData, (uint256));\n        REENTRANCY_ATTACKER.stake(stakeData);\n        emit ComputeStakeCalled(staker, stakeData);\n    }\n\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(withdrawData, (uint256));\n        REENTRANCY_ATTACKER.withdraw(withdrawData);\n        emit ComputeWithdrawCalled(staker, withdrawData);\n    }\n\n    function _computeClaim(\n        address staker,\n        uint256 claimable,\n        bytes calldata claimData\n    ) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\n        claimed = claimable;\n        unclaimed = 0;\n        REENTRANCY_ATTACKER.claim(claimData);\n        emit ComputeClaimCalled(staker, claimable, claimData);\n    }\n\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {\n        emit ComputeAddRewardCalled(rewarder, reward);\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {ILinearPool} from \"./../../../staking/linear/interfaces/ILinearPool.sol\";\n\ncontract LinearPoolReentrancyAttacker {\n    ILinearPool public target;\n\n    function setTarget(address targetAddress) external {\n        target = ILinearPool(targetAddress);\n    }\n\n    function stake(bytes calldata stakeData) external {\n        if (address(target) != address(0)) {\n            target.stake(stakeData);\n        }\n    }\n\n    function withdraw(bytes calldata withdrawData) external {\n        if (address(target) != address(0)) {\n            target.withdraw(withdrawData);\n        }\n    }\n\n    function claim(bytes calldata claimData) external {\n        if (address(target) != address(0)) {\n            target.claim(claimData);\n        }\n    }\n}\n"},"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC1155TokenReceiver} from \"./../../../token/ERC1155/interfaces/IERC1155TokenReceiver.sol\";\nimport {ERC1155Storage} from \"./../../../token/ERC1155/libraries/ERC1155Storage.sol\";\nimport {ERC1155TokenReceiver} from \"./../../../token/ERC1155/ERC1155TokenReceiver.sol\";\n\n/// @title ERC1155 Receiver Mock\ncontract ERC1155TokenReceiverMock is ERC1155TokenReceiver {\n    bool internal immutable ACCEPT_1155;\n    address internal immutable _TOKEN_ADDRESS_1155;\n\n    event ERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data);\n    event ERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data);\n\n    error WrongToken();\n\n    constructor(bool accept1155, address tokenAddress) {\n        ACCEPT_1155 = accept1155;\n        _TOKEN_ADDRESS_1155 = tokenAddress;\n    }\n\n    //=================================================== ERC1155Receiver ====================================================//\n\n    /// @inheritdoc IERC1155TokenReceiver\n    /// @dev reverts if the sender is not the supported ERC1155 contract.\n    function onERC1155Received(\n        address operator,\n        address from,\n        uint256 id,\n        uint256 value,\n        bytes memory data\n    ) public virtual override returns (bytes4) {\n        if (msg.sender != _TOKEN_ADDRESS_1155) revert WrongToken();\n        if (ACCEPT_1155) {\n            emit ERC1155Received(operator, from, id, value, data);\n            return ERC1155Storage.ERC1155_SINGLE_RECEIVED;\n        } else {\n            return 0x0;\n        }\n    }\n\n    /// @inheritdoc IERC1155TokenReceiver\n    /// @dev reverts if the sender is not the supported ERC1155 contract.\n    function onERC1155BatchReceived(\n        address operator,\n        address from,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes memory data\n    ) public virtual override returns (bytes4) {\n        if (msg.sender != _TOKEN_ADDRESS_1155) revert WrongToken();\n        if (ACCEPT_1155) {\n            emit ERC1155BatchReceived(operator, from, ids, values, data);\n            return ERC1155Storage.ERC1155_BATCH_RECEIVED;\n        } else {\n            return 0x0;\n        }\n    }\n}\n"},"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155} from \"./../../../token/ERC1155/ERC1155.sol\";\nimport {ERC1155Mintable} from \"./../../../token/ERC1155/ERC1155Mintable.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155WithoutOperatorFiltererMock is ERC1155, ERC1155Mintable, ForwarderRegistryContext {\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155BurnableFacet} from \"./../../../../token/ERC1155/facets/ERC1155BurnableFacet.sol\";\n\n/// @title ERC1155BurnableFacetMock\ncontract ERC1155BurnableFacetMock is ERC1155BurnableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155BurnableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155DeliverableFacet} from \"./../../../../token/ERC1155/facets/ERC1155DeliverableFacet.sol\";\n\n/// @title ERC1155DeliverableFacetMock\ncontract ERC1155DeliverableFacetMock is ERC1155DeliverableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155DeliverableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Facet} from \"./../../../../token/ERC1155/facets/ERC1155Facet.sol\";\n\n/// @title ERC1155FacetMock\ncontract ERC1155FacetMock is ERC1155Facet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155Facet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155MetadataFacet} from \"./../../../../token/ERC1155/facets/ERC1155MetadataFacet.sol\";\n\n/// @title ERC1155MetadataFacetMock\ncontract ERC1155MetadataFacetMock is ERC1155MetadataFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155MetadataFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155MintableFacet} from \"./../../../../token/ERC1155/facets/ERC1155MintableFacet.sol\";\n\n/// @title ERC1155MintableFacetMock\ncontract ERC1155MintableFacetMock is ERC1155MintableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155MintableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155WithOperatorFiltererFacet} from \"./../../../../token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol\";\n\n/// @title ERC1155FacetMock\ncontract ERC1155WithOperatorFiltererFacetMock is ERC1155WithOperatorFiltererFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155WithOperatorFiltererFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ERC1155FullBurn} from \"./../../../../token/ERC1155/preset/ERC1155FullBurn.sol\";\n\n/// @title ERC1155FullBurnMock\ncontract ERC1155FullBurnMock is ERC1155FullBurn {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    ) ERC1155FullBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ERC1155Full} from \"./../../../../token/ERC1155/preset/ERC1155Full.sol\";\n\n/// @title ERC1155FullMock\ncontract ERC1155FullMock is ERC1155Full {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    ) ERC1155Full(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155FullBurnProxied} from \"./../../../../../token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol\";\n\ncontract ERC1155FullBurnProxiedMock is ERC1155FullBurnProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155FullBurnProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155FullProxied} from \"./../../../../../token/ERC1155/preset/proxied/ERC1155FullProxied.sol\";\n\ncontract ERC1155FullProxiedMock is ERC1155FullProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155FullProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../../../../token/ERC1155/libraries/ERC1155Storage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {ERC1155Base} from \"./../../../../token/ERC1155/base/ERC1155Base.sol\";\nimport {ERC1155MintableBase} from \"./../../../../token/ERC1155/base/ERC1155MintableBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155WithoutOperatorFiltererProxiedMock is\n    ERC1155Base,\n    ERC1155MintableBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init() external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC1155Storage.init();\n        ERC1155Storage.initERC1155Mintable();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC20Receiver} from \"./../../../token/ERC20/interfaces/IERC20Receiver.sol\";\nimport {ERC20Storage} from \"./../../../token/ERC20/libraries/ERC20Storage.sol\";\nimport {ERC20Receiver} from \"./../../../token/ERC20/ERC20Receiver.sol\";\n\n/// @title ERC20 Receiver Mock.\ncontract ERC20ReceiverMock is ERC20Receiver {\n    bool internal immutable _ACCCEPT;\n    address internal immutable _TOKEN_ADDRESS;\n\n    event ERC20Received(address sender, address from, uint256 value, bytes data);\n\n    error WrongToken();\n\n    constructor(bool accept, address tokenAddress) {\n        _ACCCEPT = accept;\n        _TOKEN_ADDRESS = tokenAddress;\n    }\n\n    //==================================================== ERC20Receiver ====================================================//\n\n    /// @inheritdoc IERC20Receiver\n    function onERC20Received(address sender, address from, uint256 value, bytes memory data) public virtual override returns (bytes4) {\n        if (msg.sender != _TOKEN_ADDRESS) revert WrongToken();\n        if (_ACCCEPT) {\n            emit ERC20Received(sender, from, value, data);\n            return ERC20Storage.ERC20_RECEIVED;\n        } else {\n            return 0x0;\n        }\n    }\n}\n"},"contracts/mocks/token/ERC20/ERC677Mock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IERC677} from \"./../../../token/ERC20/interfaces/IERC677.sol\";\nimport {IERC677Receiver} from \"./../../../token/ERC20/interfaces/IERC677Receiver.sol\";\nimport {ERC20Storage} from \"./../../../token/ERC20/libraries/ERC20Storage.sol\";\nimport {Address} from \"./../../../utils/libraries/Address.sol\";\nimport {ERC20FixedSupply} from \"./../../../token/ERC20/preset/ERC20FixedSupply.sol\";\n\ncontract ERC677Mock is ERC20FixedSupply, IERC677 {\n    using ERC20Storage for ERC20Storage.Layout;\n    using Address for address;\n\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        uint8 tokenDecimals,\n        address[] memory holders,\n        uint256[] memory allocations,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20FixedSupply(tokenName, tokenSymbol, tokenDecimals, holders, allocations, forwarderRegistry) {}\n\n    function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success) {\n        address sender = _msgSender();\n        ERC20Storage.layout().transfer(sender, receiver, amount);\n        if (!receiver.hasBytecode()) return true;\n        return IERC677Receiver(receiver).onTokenTransfer(sender, amount, data);\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20BatchTransfersFacet} from \"./../../../../token/ERC20/facets/ERC20BatchTransfersFacet.sol\";\n\ncontract ERC20BatchTransfersFacetMock is ERC20BatchTransfersFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20BatchTransfersFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20BurnableFacet} from \"./../../../../token/ERC20/facets/ERC20BurnableFacet.sol\";\n\ncontract ERC20BurnableFacetMock is ERC20BurnableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20BurnableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20DetailedFacet} from \"./../../../../token/ERC20/facets/ERC20DetailedFacet.sol\";\n\ncontract ERC20DetailedFacetMock is ERC20DetailedFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20DetailedFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Facet} from \"./../../../../token/ERC20/facets/ERC20Facet.sol\";\n\ncontract ERC20FacetMock is ERC20Facet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20Facet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20MetadataFacet} from \"./../../../../token/ERC20/facets/ERC20MetadataFacet.sol\";\n\ncontract ERC20MetadataFacetMock is ERC20MetadataFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MetadataFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20MintableFacet} from \"./../../../../token/ERC20/facets/ERC20MintableFacet.sol\";\n\ncontract ERC20MintableFacetMock is ERC20MintableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MintableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20PermitFacet} from \"./../../../../token/ERC20/facets/ERC20PermitFacet.sol\";\n\ncontract ERC20PermitFacetMock is ERC20PermitFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20PermitFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20SafeTransfersFacet} from \"./../../../../token/ERC20/facets/ERC20SafeTransfersFacet.sol\";\n\ncontract ERC20SafeTransfersFacetMock is ERC20SafeTransfersFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20SafeTransfersFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20FixedSupply} from \"./../../../../token/ERC20/preset/ERC20FixedSupply.sol\";\n\ncontract ERC20FixedSupplyMock is ERC20FixedSupply {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        uint8 tokenDecimals,\n        address[] memory holders,\n        uint256[] memory allocations,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20FixedSupply(tokenName, tokenSymbol, tokenDecimals, holders, allocations, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20MintBurn} from \"./../../../../token/ERC20/preset/ERC20MintBurn.sol\";\n\ncontract ERC20MintBurnMock is ERC20MintBurn {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        uint8 tokenDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20MintBurn(tokenName, tokenSymbol, tokenDecimals, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20FixedSupplyProxied} from \"./../../../../../token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol\";\n\ncontract ERC20FixedSupplyProxiedMock is ERC20FixedSupplyProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20FixedSupplyProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20MintBurnProxied} from \"./../../../../../token/ERC20/preset/proxied/ERC20MintBurnProxied.sol\";\n\ncontract ERC20MintBurnProxiedMock is ERC20MintBurnProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MintBurnProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC721Receiver} from \"./../../../token/ERC721/interfaces/IERC721Receiver.sol\";\nimport {ERC721Storage} from \"./../../../token/ERC721/libraries/ERC721Storage.sol\";\nimport {ERC721Receiver} from \"./../../../token/ERC721/ERC721Receiver.sol\";\n\n/// @title ERC721 Receiver Mock\ncontract ERC721ReceiverMock is ERC721Receiver {\n    bool internal immutable _ACCEPT_721;\n    address internal immutable _TOKEN_ADDRESS_721;\n\n    event ERC721Received(address operator, address from, uint256 tokenId, bytes data);\n\n    error WrongToken();\n\n    constructor(bool accept721, address tokenAddress) ERC721Receiver() {\n        _ACCEPT_721 = accept721;\n        _TOKEN_ADDRESS_721 = tokenAddress;\n    }\n\n    //=================================================== ERC721Receiver ====================================================//\n\n    /// @inheritdoc IERC721Receiver\n    /// @dev reverts if the sender is not the supported ERC721 contract.\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public virtual override returns (bytes4) {\n        if (msg.sender != _TOKEN_ADDRESS_721) revert WrongToken();\n        if (_ACCEPT_721) {\n            emit ERC721Received(operator, from, tokenId, data);\n            return ERC721Storage.ERC721_RECEIVED;\n        } else {\n            return 0x0;\n        }\n    }\n}\n"},"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721} from \"./../../../token/ERC721/ERC721.sol\";\nimport {ERC721BatchTransfer} from \"./../../../token/ERC721/ERC721BatchTransfer.sol\";\nimport {ERC721Mintable} from \"./../../../token/ERC721/ERC721Mintable.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721WithoutOperatorFiltererMock is ERC721, ERC721BatchTransfer, ERC721Mintable, ForwarderRegistryContext {\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721BatchTransferFacet} from \"./../../../../token/ERC721/facets/ERC721BatchTransferFacet.sol\";\n\n/// @title ERC721BatchTransferFacetMock\ncontract ERC721BatchTransferFacetMock is ERC721BatchTransferFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BatchTransferFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererFacet} from \"./../../../../token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol\";\n\n/// @title ERC721BatchTransferFacetMock\ncontract ERC721BatchTransferWithOperatorFiltererFacetMock is ERC721BatchTransferWithOperatorFiltererFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BatchTransferWithOperatorFiltererFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721BurnableFacet} from \"./../../../../token/ERC721/facets/ERC721BurnableFacet.sol\";\n\n/// @title ERC721BurnableFacetMock\ncontract ERC721BurnableFacetMock is ERC721BurnableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BurnableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721DeliverableFacet} from \"./../../../../token/ERC721/facets/ERC721DeliverableFacet.sol\";\n\n/// @title ERC721DeliverableFacetMock\ncontract ERC721DeliverableFacetMock is ERC721DeliverableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721DeliverableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721DeliverableOnceFacet} from \"./../../../../token/ERC721/facets/ERC721DeliverableOnceFacet.sol\";\n\n/// @title ERC721DeliverableOnceFacetMock\ncontract ERC721DeliverableOnceFacetMock is ERC721DeliverableOnceFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721DeliverableOnceFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Facet} from \"./../../../../token/ERC721/facets/ERC721Facet.sol\";\n\n/// @title ERC721FacetMock\ncontract ERC721FacetMock is ERC721Facet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721Facet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721MetadataFacet} from \"./../../../../token/ERC721/facets/ERC721MetadataFacet.sol\";\n\n/// @title ERC721MetadataFacetMock\ncontract ERC721MetadataFacetMock is ERC721MetadataFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MetadataFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721MintableFacet} from \"./../../../../token/ERC721/facets/ERC721MintableFacet.sol\";\n\n/// @title ERC721MintableFacetMock\ncontract ERC721MintableFacetMock is ERC721MintableFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MintableFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721MintableOnceFacet} from \"./../../../../token/ERC721/facets/ERC721MintableOnceFacet.sol\";\n\n/// @title ERC721MintableOnceFacetMock\ncontract ERC721MintableOnceFacetMock is ERC721MintableOnceFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MintableOnceFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721WithOperatorFiltererFacet} from \"./../../../../token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol\";\n\n/// @title ERC721FacetMock\ncontract ERC721WithOperatorFiltererFacetMock is ERC721WithOperatorFiltererFacet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721WithOperatorFiltererFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ERC721FullBurn} from \"./../../../../token/ERC721/preset/ERC721FullBurn.sol\";\n\n/// @title ERC721FullBurnMock\ncontract ERC721FullBurnMock is ERC721FullBurn {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    ) ERC721FullBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ERC721FullMintOnceBurn} from \"./../../../../token/ERC721/preset/ERC721FullMintOnceBurn.sol\";\n\n/// @title ERC721FullBurnMock\ncontract ERC721FullMintOnceBurnMock is ERC721FullMintOnceBurn {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    ) ERC721FullMintOnceBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ERC721Full} from \"./../../../../token/ERC721/preset/ERC721Full.sol\";\n\n/// @title ERC721FullMock\ncontract ERC721FullMock is ERC721Full {\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    ) ERC721Full(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721FullBurnProxied} from \"./../../../../../token/ERC721/preset/proxied/ERC721FullBurnProxied.sol\";\n\ncontract ERC721FullBurnProxiedMock is ERC721FullBurnProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullBurnProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721FullMintOnceBurnProxied} from \"./../../../../../token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol\";\n\ncontract ERC721FullMintOnceBurnProxiedMock is ERC721FullMintOnceBurnProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullMintOnceBurnProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721FullProxied} from \"./../../../../../token/ERC721/preset/proxied/ERC721FullProxied.sol\";\n\ncontract ERC721FullProxiedMock is ERC721FullProxied {\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullProxied(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../../../../token/ERC721/libraries/ERC721Storage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {ERC721Base} from \"./../../../../token/ERC721/base/ERC721Base.sol\";\nimport {ERC721BatchTransferBase} from \"./../../../../token/ERC721/base/ERC721BatchTransferBase.sol\";\nimport {ERC721MintableBase} from \"./../../../../token/ERC721/base/ERC721MintableBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721WithoutOperatorFiltererProxiedMock is\n    ERC721Base,\n    ERC721BatchTransferBase,\n    ERC721MintableBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init() external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC721Storage.init();\n        ERC721Storage.initERC721BatchTransfer();\n        ERC721Storage.initERC721Mintable();\n    }\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC2981Facet} from \"./../../../../token/royalty/facets/ERC2981Facet.sol\";\n\n/// @title ERC2981FacetMock\ncontract ERC2981FacetMock is ERC2981Facet {\n    constructor(IForwarderRegistry forwarderRegistry) ERC2981Facet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {OperatorFiltererFacet} from \"./../../../../token/royalty/facets/OperatorFiltererFacet.sol\";\n\n/// @title OperatorFiltererFacetMock\ncontract OperatorFiltererFacetMock is OperatorFiltererFacet {\n    constructor(IForwarderRegistry forwarderRegistry) OperatorFiltererFacet(forwarderRegistry) {}\n\n    function __msgData() external view returns (bytes calldata) {\n        return _msgData();\n    }\n}\n"},"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IOperatorFilterRegistry} from \"./../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\";\n\ncontract OperatorFilterRegistryMock is IOperatorFilterRegistry {\n    bool public operatorAllowed;\n\n    constructor(bool allowed) {\n        operatorAllowed = allowed;\n    }\n\n    function isOperatorAllowed(address, address) external view returns (bool) {\n        return operatorAllowed;\n    }\n\n    function register(address registrant) external {}\n\n    function registerAndSubscribe(address registrant, address subscription) external {}\n\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external {}\n\n    function unregister(address addr) external {}\n\n    function updateOperator(address registrant, address operator, bool filtered) external {}\n\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external {}\n\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external {}\n\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external {}\n\n    function subscribe(address registrant, address registrantToSubscribe) external {}\n\n    function unsubscribe(address registrant, bool copyExistingEntries) external {}\n\n    function subscriptionOf(address addr) external returns (address registrant) {}\n\n    function subscribers(address registrant) external returns (address[] memory) {}\n\n    function subscriberAt(address registrant, uint256 index) external returns (address) {}\n\n    function copyEntriesOf(address registrant, address registrantToCopy) external {}\n\n    function isOperatorFiltered(address registrant, address operator) external returns (bool) {}\n\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool) {}\n\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool) {}\n\n    function filteredOperators(address addr) external returns (address[] memory) {}\n\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory) {}\n\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address) {}\n\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32) {}\n\n    function isRegistered(address addr) external returns (bool) {}\n\n    function codeHashOf(address addr) external returns (bytes32) {}\n}\n"},"contracts/mocks/utils/Bytes32Mock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {Bytes32} from \"./../../utils/libraries/Bytes32.sol\";\n\ncontract Bytes32Mock {\n    function toBase32String(bytes32 value) external pure returns (string memory) {\n        return Bytes32.toBase32String(value);\n    }\n\n    function toASCIIString(bytes32 value) external pure returns (string memory) {\n        return Bytes32.toASCIIString(value);\n    }\n}\n"},"contracts/mocks/utils/MultiStaticCallMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {MultiStaticCall} from \"./../../utils/MultiStaticCall.sol\";\n\ncontract MultiStaticCallMock is MultiStaticCall {\n    error Reverted();\n\n    function getBlockNumber() public view returns (uint256 blockNumber) {\n        blockNumber = block.number;\n    }\n\n    function getCurrentBlockCoinbase() public view returns (address coinbase) {\n        coinbase = block.coinbase;\n    }\n\n    function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {\n        gaslimit = block.gaslimit;\n    }\n\n    function getCurrentBlockTimestamp() public view returns (uint256 timestamp) {\n        timestamp = block.timestamp;\n    }\n\n    function getEthBalance(address addr) public view returns (uint256 balance) {\n        balance = addr.balance;\n    }\n\n    function revertingCall() public pure {\n        revert Reverted();\n    }\n\n    function revertingCallWithoutMessage() public pure {\n        // solhint-disable-next-line gas-custom-errors, reason-string\n        revert();\n    }\n}\n"},"contracts/mocks/vrf/VRFV2WrapperMock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC677Receiver} from \"./../../token/ERC20/interfaces/IERC677Receiver.sol\";\nimport {VRFV2WrapperInterface} from \"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\";\nimport {VRFConsumerBaseV2} from \"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol\";\n\ncontract VRFV2WrapperMock is IERC677Receiver, VRFV2WrapperInterface {\n    uint256 public lastRequestId;\n\n    mapping(uint256 => VRFConsumerBaseV2) public consumers;\n    mapping(uint256 => uint32) public numWords;\n\n    function calculateRequestPrice(uint32) external pure returns (uint256) {\n        return 100;\n    }\n\n    function estimateRequestPrice(uint32, uint256) external pure returns (uint256) {\n        return 100;\n    }\n\n    function onTokenTransfer(address from, uint256, bytes calldata data) external returns (bool) {\n        (, , uint32 nWords) = abi.decode(data, (uint32, uint16, uint32));\n        uint256 requestId = lastRequestId + 1;\n        consumers[requestId] = VRFConsumerBaseV2(from);\n        numWords[requestId] = nWords;\n        lastRequestId = requestId;\n        return true;\n    }\n\n    function fulfillRandomnessRequest(uint256 requestId) external {\n        uint32 nWords = numWords[requestId];\n        uint256[] memory randomWords = new uint256[](nWords);\n        for (uint256 i; i < nWords; ++i) {\n            randomWords[i] = 123;\n        }\n        consumers[requestId].rawFulfillRandomWords(requestId, randomWords);\n    }\n\n    function fulfillRandomWords(VRFConsumerBaseV2 consumer, uint256 requestId, uint256[] memory randomWords) external {\n        consumer.rawFulfillRandomWords(requestId, randomWords);\n    }\n}\n"},"contracts/payment/base/PayoutWalletBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IPayoutWallet} from \"./../interfaces/IPayoutWallet.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {PayoutWalletStorage} from \"./../libraries/PayoutWalletStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Payout wallet (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\n\n    /// @notice Sets the payout wallet.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param newPayoutWallet The payout wallet.\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\n    }\n\n    /// @notice Gets the payout wallet.\n    /// @return wallet The payout wallet.\n    function payoutWallet() external view virtual returns (address payable wallet) {\n        return PayoutWalletStorage.layout().payoutWallet();\n    }\n}\n"},"contracts/payment/CumulativeMerkleClaim.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {MerkleProof} from \"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\";\nimport {ContractOwnershipStorage} from \"./../access/libraries/ContractOwnershipStorage.sol\";\nimport {PauseStorage} from \"./../lifecycle/libraries/PauseStorage.sol\";\nimport {ContractOwnership} from \"./../access/ContractOwnership.sol\";\nimport {Pause} from \"./../lifecycle/Pause.sol\";\n\n/// @title CumulativeMerkleClaim\n/// @notice This contract is designed for claiming payouts which will cumulate over time.\n/// @notice A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).\n/// @notice Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the current\n/// @notice unclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.\n/// @notice A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees.\nabstract contract CumulativeMerkleClaim is Pause {\n    using MerkleProof for bytes32[];\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using PauseStorage for PauseStorage.Layout;\n\n    bytes32 public root;\n    uint256 public nonce;\n\n    mapping(bytes32 => bool) public claimed;\n\n    /// @notice Emitted when a new merkle root is set.\n    /// @param root The new merkle root.\n    event MerkleRootSet(bytes32 root);\n\n    /// @notice Emitted when a payout is claimed.\n    /// @param root The merkle root on which the claim was made.\n    /// @param recipient The recipient of the claim.\n    /// @param claimData The encoded claim data for the claim.\n    /// @param nonce The nonce as when the claim was made.\n    event PayoutClaimed(bytes32 indexed root, address indexed recipient, bytes claimData, uint256 nonce);\n\n    /// @notice Thrown when trying to claim the same leaf more than once.\n    /// @param recipient The recipient of the claim.\n    /// @param claimData The encoded claim data for the claim.\n    /// @param nonce The nonce as when the claim was made.\n    error AlreadyClaimed(address recipient, bytes claimData, uint256 nonce);\n\n    /// @notice Thrown when a proof cannot be verified.\n    /// @param recipient The recipient of the claim.\n    /// @param claimData The encoded claim data for the claim.\n    /// @param nonce The nonce as when the claim was made.\n    error InvalidProof(address recipient, bytes claimData, uint256 nonce);\n\n    constructor() Pause(true) ContractOwnership(msg.sender) {}\n\n    /// @notice Sets the merkle root for a new claiming period and unpauses the contract.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\n    /// @dev Emits an {Unpaused} event.\n    /// @dev Emits a {MerkleRootSet} event.\n    /// @param merkleRoot The merkle root to set.\n    function setMerkleRoot(bytes32 merkleRoot) public {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        PauseStorage.layout().unpause();\n        root = merkleRoot;\n        unchecked {\n            ++nonce;\n        }\n        emit MerkleRootSet(merkleRoot);\n    }\n\n    /// @notice Executes the payout for a given user (anyone can call this function).\n    /// @dev Reverts with {Paused} if the contract is paused.\n    /// @dev Reverts with {AlreadyClaimed} if this specific payout has already been claimed.\n    /// @dev Reverts with {InvalidProof} if the merkle proof cannot be verified.\n    /// @dev Emits a {PayoutClaimed} event.\n    /// @param recipient Address of the user to claim the payout\n    /// @param claimData Encoded claim data for `recipient`\n    /// @param proof Merkle proof of the user based on the merkle root\n    function claimPayout(address recipient, bytes calldata claimData, bytes32[] calldata proof) external {\n        PauseStorage.layout().enforceIsNotPaused();\n\n        uint256 currentNonce = nonce;\n        bytes32 currentRoot = root;\n        bytes32 leaf = keccak256(abi.encodePacked(recipient, claimData, currentNonce));\n\n        if (claimed[leaf]) revert AlreadyClaimed(recipient, claimData, currentNonce);\n        if (!proof.verifyCalldata(currentRoot, leaf)) revert InvalidProof(recipient, claimData, currentNonce);\n\n        claimed[leaf] = true;\n\n        emit PayoutClaimed(currentRoot, recipient, claimData, currentNonce);\n\n        _distributePayout(recipient, claimData);\n    }\n\n    /// @notice Distributes the payout to the recipient.\n    /// @dev This virtual function must be implemented by inheriting contracts.\n    /// @param recipient Address of the user to claim the payout\n    /// @param claimData Encoded claim data for `recipient`. The encoding is specific to the inheriting contract, for example a quantity of tokens.\n    function _distributePayout(address recipient, bytes calldata claimData) internal virtual;\n}\n"},"contracts/payment/errors/PayoutWalletErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when setting the zero address as the payout wallet.\nerror ZeroAddressPayoutWallet();\n"},"contracts/payment/events/PayoutWalletEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when the payout wallet address changes.\n/// @param payoutWallet the new payout wallet address.\nevent PayoutWalletSet(address payoutWallet);\n"},"contracts/payment/facets/PayoutWalletFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {PayoutWalletStorage} from \"./../libraries/PayoutWalletStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {PayoutWalletBase} from \"./../base/PayoutWalletBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Payout wallet (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\ncontract PayoutWalletFacet is PayoutWalletBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with an initial payout wallet.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param initialPayoutWallet The initial payout wallet.\n    function initPayoutWalletStorage(address payable initialPayoutWallet) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        PayoutWalletStorage.layout().proxyInit(initialPayoutWallet);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/payment/interfaces/IPayoutWallet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Payout wallet (functions)\ninterface IPayoutWallet {\n    /// @notice Gets the payout wallet.\n    /// @return wallet The payout wallet.\n    function payoutWallet() external view returns (address payable wallet);\n}\n"},"contracts/payment/libraries/PayoutWalletStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ZeroAddressPayoutWallet} from \"./../errors/PayoutWalletErrors.sol\";\nimport {PayoutWalletSet} from \"./../events/PayoutWalletEvents.sol\";\nimport {ProxyInitialization} from \"./../../proxy/libraries/ProxyInitialization.sol\";\n\nlibrary PayoutWalletStorage {\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\n\n    struct Layout {\n        address payable wallet;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.payment.PayoutWallet.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.payment.PayoutWallet.phase\")) - 1);\n\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param initialPayoutWallet The initial payout wallet.\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\n        s.setPayoutWallet(initialPayoutWallet);\n    }\n\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param initialPayoutWallet The initial payout wallet.\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.setPayoutWallet(initialPayoutWallet);\n    }\n\n    /// @notice Sets the payout wallet.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param newPayoutWallet The payout wallet.\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\n        s.wallet = newPayoutWallet;\n        emit PayoutWalletSet(newPayoutWallet);\n    }\n\n    /// @notice Gets the payout wallet.\n    /// @return wallet The payout wallet.\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\n        return s.wallet;\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/payment/PayoutWallet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {PayoutWalletStorage} from \"./libraries/PayoutWalletStorage.sol\";\nimport {PayoutWalletBase} from \"./base/PayoutWalletBase.sol\";\nimport {ContractOwnership} from \"../access/ContractOwnership.sol\";\n\n/// @title Payout wallet (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract PayoutWallet is PayoutWalletBase, ContractOwnership {\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\n\n    /// @notice Initializes the storage with an initial payout wallet.\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n    /// @dev Emits a {PayoutWalletSet} event.\n    /// @param initialPayoutWallet The initial payout wallet.\n    constructor(address payable initialPayoutWallet) {\n        PayoutWalletStorage.layout().constructorInit(initialPayoutWallet);\n    }\n}\n"},"contracts/proxy/base/ProxyAdminBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IProxyAdmin} from \"./../interfaces/IProxyAdmin.sol\";\nimport {ProxyAdminStorage} from \"./../libraries/ProxyAdminStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\n/// @dev This contract is to be used via inheritance in a proxied implementation.\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    /// @notice Sets a new proxy admin.\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n    /// @param newAdmin The new proxy admin.\n    function changeProxyAdmin(address newAdmin) external virtual {\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\n    }\n\n    /// @notice Gets the proxy admin.\n    /// @return admin The proxy admin.\n    function proxyAdmin() external view virtual returns (address admin) {\n        return ProxyAdminStorage.layout().proxyAdmin();\n    }\n}\n"},"contracts/proxy/errors/ProxyAdminErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the initial admin is not set.\nerror NoInitialProxyAdmin();\n\n/// @notice Thrown when an account is not the proxy admin but is required to.\n/// @param account The account that was checked.\nerror NotProxyAdmin(address account);\n"},"contracts/proxy/errors/ProxyInitializationErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when trying to set a phase value that has already been reached.\n/// @param currentPhase The current phase.\n/// @param newPhase The new phase trying to be set.\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\n"},"contracts/proxy/events/ProxyAdminEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when the proxy admin changes.\n/// @param previousAdmin the previous admin.\n/// @param newAdmin the new admin.\nevent AdminChanged(address previousAdmin, address newAdmin);\n"},"contracts/proxy/facets/ProxyAdminFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ProxyAdminStorage} from \"./../libraries/ProxyAdminStorage.sol\";\nimport {ProxyAdminBase} from \"./../base/ProxyAdminBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\ncontract ProxyAdminFacet is ProxyAdminBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with an initial admin.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\n    /// @param initialAdmin The initial payout wallet.\n    function initProxyAdminStorage(address initialAdmin) external {\n        ProxyAdminStorage.layout().proxyInit(initialAdmin);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/proxy/interfaces/IProxyAdmin.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\ninterface IProxyAdmin {\n    /// @notice Sets a new proxy admin.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n    /// @param newAdmin The new proxy admin.\n    function changeProxyAdmin(address newAdmin) external;\n\n    /// @notice Gets the proxy admin.\n    /// @return admin The proxy admin\n    function proxyAdmin() external view returns (address admin);\n}\n"},"contracts/proxy/libraries/ProxyAdminStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \"./../errors/ProxyAdminErrors.sol\";\nimport {AdminChanged} from \"./../events/ProxyAdminEvents.sol\";\nimport {ProxyInitialization} from \"./ProxyInitialization.sol\";\n\nlibrary ProxyAdminStorage {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    struct Layout {\n        address admin;\n    }\n\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"eip1967.proxy.admin.phase\")) - 1);\n\n    /// @notice Initializes the storage with an initial admin (immutable version).\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\n    /// @dev Emits an {AdminChanged} event.\n    /// @param initialAdmin The initial payout wallet.\n    function constructorInit(Layout storage s, address initialAdmin) internal {\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\n        s.admin = initialAdmin;\n        emit AdminChanged(address(0), initialAdmin);\n    }\n\n    /// @notice Initializes the storage with an initial admin (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\n    /// @dev Emits an {AdminChanged} event.\n    /// @param initialAdmin The initial payout wallet.\n    function proxyInit(Layout storage s, address initialAdmin) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.constructorInit(initialAdmin);\n    }\n\n    /// @notice Sets a new proxy admin.\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n    /// @param newAdmin The new proxy admin.\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\n        address previousAdmin = s.admin;\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\n        if (previousAdmin != newAdmin) {\n            s.admin = newAdmin;\n            emit AdminChanged(previousAdmin, newAdmin);\n        }\n    }\n\n    /// @notice Gets the proxy admin.\n    /// @return admin The proxy admin\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\n        return s.admin;\n    }\n\n    /// @notice Ensures that an account is the proxy admin.\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\n    /// @param account The account.\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\n        if (account != s.admin) revert NotProxyAdmin(account);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/proxy/libraries/ProxyInitialization.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {InitializationPhaseAlreadyReached} from \"./../errors/ProxyInitializationErrors.sol\";\nimport {StorageSlot} from \"@openzeppelin/contracts/utils/StorageSlot.sol\";\n\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\nlibrary ProxyInitialization {\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\n    /// @param storageSlot the storage slot where `phase` is stored.\n    /// @param phase the initialization phase.\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\n        uint256 currentPhase = currentVersion.value;\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\n        currentVersion.value = phase;\n    }\n}\n"},"contracts/proxy/ProxyAdmin.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ProxyAdminStorage} from \"./libraries/ProxyAdminStorage.sol\";\nimport {ProxyAdminBase} from \"./base/ProxyAdminBase.sol\";\n\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ProxyAdmin is ProxyAdminBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    /// @notice Initializes the storage with an initial admin.\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\n    /// @param initialAdmin The initial payout wallet.\n    constructor(address initialAdmin) {\n        ProxyAdminStorage.layout().constructorInit(initialAdmin);\n    }\n}\n"},"contracts/security/base/SealsBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ISeals} from \"./../interfaces/ISeals.sol\";\nimport {SealsStorage} from \"./../libraries/SealsStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Uniquely identified seals management (proxiable version).\nabstract contract SealsBase is ISeals, Context {\n    using SealsStorage for SealsStorage.Layout;\n\n    /// @notice Retrieves whether a seal has been used already.\n    /// @param sealId the seal identifier.\n    /// @return wasSealed Whether a seal has been used already.\n    function isSealed(uint256 sealId) external view virtual returns (bool wasSealed) {\n        return SealsStorage.layout().isSealed(sealId);\n    }\n}\n"},"contracts/security/base/TokenRecoveryBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC721} from \"./../../token/ERC721/interfaces/IERC721.sol\";\nimport {ITokenRecovery} from \"./../interfaces/ITokenRecovery.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {TokenRecoveryLibrary} from \"./../libraries/TokenRecoveryLibrary.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @inheritdoc ITokenRecovery\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\n    }\n\n    /// @inheritdoc ITokenRecovery\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\n    }\n\n    /// @inheritdoc ITokenRecovery\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\n    }\n}\n"},"contracts/security/errors/SealsErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to seal a sealId which has already been used.\n/// @param sealId The seal identifier.\nerror AlreadySealed(uint256 sealId);\n"},"contracts/security/events/SealsEvents.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when a seal is used.\n/// @param sealId the seal identifier.\n/// @param sealer the sealer address.\nevent Sealed(uint256 sealId, address sealer);\n"},"contracts/security/facets/TokenRecoveryFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {TokenRecoveryBase} from \"./../base/TokenRecoveryBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\ncontract TokenRecoveryFacet is TokenRecoveryBase, ForwarderRegistryContextBase {\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/security/interfaces/ISeals.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title Uniquely identified seals management.\ninterface ISeals {\n    /// @notice Retrieves whether a seal has been used already.\n    /// @param sealId the seal identifier.\n    /// @return wasSealed Whether a seal has been used already.\n    function isSealed(uint256 sealId) external view returns (bool wasSealed);\n}\n"},"contracts/security/interfaces/ITokenRecovery.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC721} from \"./../../token/ERC721/interfaces/IERC721.sol\";\n\n/// @title Uniquely identified seals management.\ninterface ITokenRecovery {\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\n    ///  so that the extraction is limited to only amounts sent accidentally.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param amounts the list of token amounts to transfer.\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\n\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\n    ///  so that the extraction is limited to only amounts sent accidentally.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param tokens the list of ERC20 token addresses.\n    /// @param amounts the list of token amounts to transfer.\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\n\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\n    ///  so that the extraction is limited to only tokens sent accidentally.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param contracts the list of ERC721 contract addresses.\n    /// @param tokenIds the list of token ids to transfer.\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\n}\n"},"contracts/security/libraries/SealsStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {AlreadySealed} from \"./../errors/SealsErrors.sol\";\nimport {Sealed} from \"./../events/SealsEvents.sol\";\n\nlibrary SealsStorage {\n    using SealsStorage for SealsStorage.Layout;\n\n    struct Layout {\n        mapping(uint256 => bool) seals;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.security.Seals.storage\")) - 1);\n\n    /// @notice Registers a unique seal identifier.\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\n    /// @dev Emits a {Sealed} event.\n    /// @param sealer The sealer address\n    /// @param sealId The seal identifier.\n    function seal(Layout storage s, address sealer, uint256 sealId) internal {\n        if (s.seals[sealId]) revert AlreadySealed(sealId);\n        s.seals[sealId] = true;\n        emit Sealed(sealId, sealer);\n    }\n\n    /// @notice Retrieves whether a seal has been used already.\n    /// @param sealId the seal identifier.\n    /// @return wasSealed Whether a seal has been used already.\n    function isSealed(Layout storage s, uint256 sealId) internal view returns (bool) {\n        return s.seals[sealId];\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/security/libraries/TokenRecoveryLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {InconsistentArrayLengths} from \"./../../CommonErrors.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC721} from \"./../../token/ERC721/interfaces/IERC721.sol\";\nimport {IERC165} from \"./../../introspection/interfaces/IERC165.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\n\nlibrary TokenRecoveryLibrary {\n    using SafeERC20 for IERC20;\n    using Address for address payable;\n\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\n    /// @param tokenContract The token contract being recovered.\n    error IncorrectTokenContractType(address tokenContract);\n\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\n    ///  so that the extraction is limited to only amounts sent accidentally.\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param amounts the list of token amounts to transfer.\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\n        uint256 length = accounts.length;\n        if (length != amounts.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            accounts[i].sendValue(amounts[i]);\n        }\n    }\n\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\n    ///  so that the extraction is limited to only amounts sent accidentally.\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param tokens the list of ERC20 token addresses.\n    /// @param amounts the list of token amounts to transfer.\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\n        uint256 length = accounts.length;\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\n        }\n    }\n\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\n    ///  so that the extraction is limited to only tokens sent accidentally.\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\n    /// @param accounts the list of accounts to transfer the tokens to.\n    /// @param contracts the list of ERC721 contract addresses.\n    /// @param tokenIds the list of token ids to transfer.\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\n        uint256 length = accounts.length;\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            IERC721 tokenContract = contracts[i];\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\n                revert IncorrectTokenContractType(address(tokenContract));\n            }\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\n        }\n    }\n}\n"},"contracts/security/SealedExecutor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../metatx/interfaces/IForwarderRegistry.sol\";\nimport {AccessControlStorage} from \"./../access/libraries/AccessControlStorage.sol\";\nimport {SealsStorage} from \"./libraries/SealsStorage.sol\";\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {SealsBase} from \"./base/SealsBase.sol\";\nimport {ContractOwnership} from \"./../access/ContractOwnership.sol\";\nimport {AccessControl} from \"./../access/AccessControl.sol\";\nimport {ForwarderRegistryContextBase} from \"./../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Sealead executions via calls on target contracts.\n/// @notice Enables contract calls to be performed uniquely thanks to a seal identifier.\n/// @notice Multiple executions can happen for example due to automation bugs in a backend or in a script.\n/// @notice Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,\n/// @notice such as a constant defined in a script or in a unique database field.\ncontract SealedExecutor is SealsBase, AccessControl, ForwarderRegistryContextBase {\n    using SealsStorage for SealsStorage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n    using Address for address;\n\n    bytes32 public constant SEALER_ROLE = \"sealer\";\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) ContractOwnership(msg.sender) {}\n\n    /// @notice Calls a contract function uniquely for a given seal identifier.\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the sealer role.\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\n    /// @dev Emits a {Sealed} event.\n    /// @param target The target contract.\n    /// @param callData The encoded function call.\n    /// @param sealId The seal identifier.\n    /// @param returnData The data returned by the call.\n    function sealedCall(address target, bytes calldata callData, uint256 sealId) external returns (bytes memory returnData) {\n        address sealer = _msgSender();\n        AccessControlStorage.layout().enforceHasRole(SEALER_ROLE, sealer);\n        SealsStorage.layout().seal(sealer, sealId);\n        return target.functionCall(callData);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/security/TokenRecovery.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {TokenRecoveryBase} from \"./base/TokenRecoveryBase.sol\";\nimport {ContractOwnership} from \"./../access/ContractOwnership.sol\";\n\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\n"},"contracts/staking/linear/interfaces/ILinearPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\ninterface ILinearPool {\n    function lastTimeRewardApplicable() external view returns (uint256);\n\n    function rewardPerStakePoint() external view returns (uint256);\n\n    function earned(address account) external view returns (uint256);\n\n    function stake(bytes calldata stakeData) external payable;\n\n    function withdraw(bytes calldata withdrawData) external;\n\n    function claim(bytes calldata claimData) external;\n\n    function addReward(uint256 reward, uint256 duration) external payable;\n}\n"},"contracts/staking/linear/LinearPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport {TokenRecovery} from \"./../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../metatx/ForwarderRegistryContext.sol\";\nimport {AccessControlStorage} from \"./../../access/libraries/AccessControlStorage.sol\";\nimport {SafeERC20, IERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {ILinearPool} from \"./interfaces/ILinearPool.sol\";\nimport {IForwarderRegistry} from \"./../../metatx/interfaces/IForwarderRegistry.sol\";\n\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\n\n/// @title Linear rewards distribution staking pool.\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \"stake points\", then used to compute the user rewards share.\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\n    using AccessControlStorage for AccessControlStorage.Layout;\n    using SafeERC20 for IERC20;\n    using Math for uint256;\n\n    bytes32 public constant REWARDER_ROLE = \"rewarder\";\n\n    uint256 public immutable SCALING_FACTOR;\n\n    uint256 public totalStaked;\n    uint256 public lastUpdated;\n    uint256 public rewardRate;\n    uint256 public rewardPerStakePointStored;\n    uint256 public distributionEnd;\n\n    mapping(address staker => uint256 stakePoints) public staked;\n    mapping(address staker => uint256 reward) public rewards;\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\n\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\n\n    error ScalingFactorOutOfBounds();\n    error InvalidStakeAmount();\n    error InvalidWithdrawAmount();\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\n    error InvalidRewardAmount();\n    error InvalidDuration();\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\n    error RewardOverflow();\n\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\n    /// @param forwarderRegistry The address of the forwarder registry contract.\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\n    ///      the higher the precision loss can be if the scaling factor is too low.\n    constructor(\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\n    }\n\n    function _updateReward(address account) internal {\n        rewardPerStakePointStored = rewardPerStakePoint();\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\n            // ensure rewards before the first staker do not get lost\n            lastUpdated = lastTimeRewardApplicable();\n        }\n        if (account != address(0)) {\n            rewards[account] = earned(account);\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\n        }\n    }\n\n    /// @notice Returns the last time rewards are applicable.\n    /// @return The minimum of the current block timestamp and the distribution end.\n    function lastTimeRewardApplicable() public view returns (uint256) {\n        uint256 currentDistributionEnd = distributionEnd;\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\n    }\n\n    /// @notice Returns the current reward per stake point.\n    /// @return The sum of the last stored value and the new rewards since the last update\n    function rewardPerStakePoint() public view returns (uint256) {\n        uint256 currentTotalStaked = totalStaked;\n        if (currentTotalStaked == 0) {\n            return rewardPerStakePointStored;\n        }\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\n    }\n\n    /// @notice Returns the amount of rewards earned by the account.\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\n    /// @param account The address of the account to check.\n    function earned(address account) public view returns (uint256) {\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\n    }\n\n    /// @notice Stakes to the pool.\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\n    function stake(bytes calldata stakeData) public payable virtual {\n        _stake(_msgSender(), stakeData);\n    }\n\n    /// @notice Stakes to the pool.\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\n    /// @param staker The address of the staker.\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\n        _updateReward(staker);\n        uint256 stakePoints = _computeStake(staker, stakeData);\n        require(stakePoints != 0, InvalidStakeAmount());\n        totalStaked += stakePoints;\n        staked[staker] += stakePoints;\n        emit Staked(staker, stakeData, stakePoints);\n    }\n\n    /// @notice Withdraws from the pool.\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\n    function withdraw(bytes calldata withdrawData) public virtual {\n        _withdraw(_msgSender(), withdrawData);\n    }\n\n    /// @notice Withdraws from the pool.\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\n    /// @param staker The address of the staker.\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\n        _updateReward(staker);\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\n        require(stakePoints != 0, InvalidWithdrawAmount());\n        uint256 currentStaked = staked[staker];\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\n        unchecked {\n            // no underflow possible\n            staked[staker] = currentStaked - stakePoints;\n            totalStaked -= stakePoints;\n        }\n        emit Withdrawn(staker, withdrawData, stakePoints);\n    }\n\n    /// @notice Claims the rewards for the sender.\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\n    function claim(bytes calldata claimData) public virtual nonReentrant {\n        address staker = _msgSender();\n        _updateReward(staker);\n        uint256 reward = earned(staker);\n        if (reward != 0) {\n            uint256 claimable = reward / SCALING_FACTOR;\n            uint256 dust = reward % SCALING_FACTOR;\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\n            emit Claimed(staker, claimData, claimed, unclaimed);\n        }\n    }\n\n    /// @notice Adds rewards to the pool.\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\n    /// @param reward The amount of rewards to be added.\n    /// @param duration The duration of the rewards distribution.\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\n        address rewarder = _msgSender();\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\n\n        require(reward != 0, InvalidRewardAmount());\n        require(duration != 0, InvalidDuration());\n\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\n        require(success, RewardOverflow());\n\n        _updateReward(address(0));\n\n        uint256 currentDistributionEnd = distributionEnd;\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\n\n        if (block.timestamp >= currentDistributionEnd) {\n            // No current distribution\n            rewardRate = totalReward / duration;\n            distributionEnd = newDisrtibutionEnd;\n        } else {\n            uint256 currentRewardRate = rewardRate;\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\n            require(success, RewardOverflow());\n\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\n                // New distribution ends before current distribution\n                // Keep the current distribution end and increase the reward rate accordingly\n                duration = currentDistributionEnd - block.timestamp;\n                rewardRate = totalReward / duration;\n            } else {\n                // New distribution ends after current distribution\n                // Extend the current distribution end and increase the reward rate accordingly\n                uint256 newRewardRate = totalReward / duration;\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\n                rewardRate = newRewardRate;\n                distributionEnd = newDisrtibutionEnd;\n            }\n        }\n        lastUpdated = block.timestamp;\n\n        _computeAddReward(rewarder, reward);\n\n        emit RewardAdded(rewarder, reward, duration);\n    }\n\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\n    /// @param sender The address of the sender.\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\n    /// @return stakePoints The amount of stake points computed from the stakeData.\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\n\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\n    /// @param sender The address of the sender.\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\n\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\n    /// @param sender The address of the sender.\n    /// @param claimable The amount of rewards which can be claimed.\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\n    /// @return claimed The amount of rewards that was claimed.\n    /// @return unclaimed The amount of rewards that was not claimed.\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\n\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\n    /// @param sender The address of the sender.\n    /// @param reward The amount of rewards to be added.\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {ContractOwnershipStorage} from \"./../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {SafeERC20, IERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\n/// @title LinearPool_ERC20Rewards\n/// @notice A linear pool that allows for ERC20 rewards distribution.\n// solhint-disable-next-line contract-name-capwords\nabstract contract LinearPool_ERC20Rewards is ContractOwnership {\n    using SafeERC20 for IERC20;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    IERC20 public immutable REWARD_TOKEN;\n\n    address public rewardHolder;\n\n    event RewardHolderSet(address indexed rewardHolder);\n\n    /// @dev Emits a {RewardHolderSet} event with the initial reward holder address.\n    /// @param rewardToken The ERC20 token used for rewards.\n    /// @param rewardHolder_ The address that holds the rewards.\n    constructor(IERC20 rewardToken, address rewardHolder_) {\n        REWARD_TOKEN = rewardToken;\n        rewardHolder = rewardHolder_;\n        emit RewardHolderSet(rewardHolder_);\n    }\n\n    /// @notice Sets the reward holder address.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\n    /// @param rewardHolder_ The address of the reward holder.\n    function setRewardHolder(address rewardHolder_) external {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        if (rewardHolder_ != rewardHolder) {\n            rewardHolder = rewardHolder_;\n            emit RewardHolderSet(rewardHolder_);\n        }\n    }\n\n    /// @notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\n    /// @param staker The address of the staker.\n    /// @param claimable The amount of REWARD_TOKEN to be transferred.\n    /// @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\n    /// @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0.\n    function _computeClaim(address staker, uint256 claimable, bytes calldata) internal virtual returns (uint256 claimed, uint256 unclaimed) {\n        claimed = claimable;\n        unclaimed = 0;\n        REWARD_TOKEN.safeTransferFrom(rewardHolder, staker, claimable);\n    }\n\n    /// @notice Computes the reward for a staker.\n    /// @dev This function is empty since the rewards do not need to be transferred to this contract.\n    function _computeAddReward(address, uint256) internal virtual {}\n}\n"},"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../LinearPool.sol\";\nimport {ERC1155TokenReceiver} from \"./../../../token/ERC1155/ERC1155TokenReceiver.sol\";\nimport {IERC1155} from \"./../../../token/ERC1155/interfaces/IERC1155.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {InconsistentArrayLengths} from \"./../../../CommonErrors.sol\";\n\n/// @title ERC1155StakingLinearPool\n/// @notice A linear pool that allows staking of ERC1155 tokens.\nabstract contract ERC1155StakingLinearPool is LinearPool, ERC1155TokenReceiver {\n    IERC1155 public immutable STAKING_TOKEN;\n\n    mapping(address staker => mapping(uint256 id => uint256 amount)) public balances;\n\n    error InvalidToken();\n    error NotEnoughBalance(address staker, uint256 id, uint256 amount, uint256 balance);\n\n    constructor(\n        IERC1155 stakingToken,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\n        STAKING_TOKEN = stakingToken;\n    }\n\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\n    /// @param operator The address of the operator.\n    /// @param from The address of the sender.\n    /// @param id The id of the token received.\n    /// @param amount The amount of tokens received.\n    /// @return bytes4 The function selector of the callback.\n    function onERC1155Received(\n        address operator,\n        address from,\n        uint256 id,\n        uint256 amount,\n        bytes calldata\n    ) external virtual override returns (bytes4) {\n        if (operator != address(this)) {\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\n            bool requiresTransfer = false;\n            bool batch = false;\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, id, amount)));\n        }\n        return this.onERC1155Received.selector;\n    }\n\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\n    /// @param operator The address of the operator.\n    /// @param from The address of the sender.\n    /// @param ids The ids of the tokens received.\n    /// @param amounts The amounts of tokens received.\n    /// @return bytes4 The function selector of the callback.\n    function onERC1155BatchReceived(\n        address operator,\n        address from,\n        uint256[] calldata ids,\n        uint256[] calldata amounts,\n        bytes calldata\n    ) external virtual override returns (bytes4) {\n        if (operator != address(this)) {\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\n            bool requiresTransfer = false;\n            bool batch = true;\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, ids, amounts)));\n        }\n        return this.onERC1155BatchReceived.selector;\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param stakeData The data to be used for staking, encoded as\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\n    function stake(bytes calldata stakeData) public payable virtual override {\n        bool requiresTransfer = true;\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\n    }\n\n    /// @inheritdoc LinearPool\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\n        bool batch = abi.decode(data, (bool));\n        if (batch) {\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(data, (bool, uint256[], uint256[]));\n            uint256 count = ids.length;\n            require(count == amounts.length, InconsistentArrayLengths());\n            for (uint256 i; i != count; ++i) {\n                uint256 id = ids[i];\n                uint256 amount = amounts[i];\n                balances[staker][id] += amount;\n                stakePoints += _tokenValue(id, amount);\n            }\n            if (requiresTransfer) {\n                STAKING_TOKEN.safeBatchTransferFrom(staker, address(this), ids, amounts, \"\");\n            }\n        } else {\n            (, uint256 id, uint256 amount) = abi.decode(data, (bool, uint256, uint256));\n            balances[staker][id] += amount;\n            stakePoints = _tokenValue(id, amount);\n            if (requiresTransfer) {\n                STAKING_TOKEN.safeTransferFrom(staker, address(this), id, amount, \"\");\n            }\n        }\n    }\n\n    /// @inheritdoc LinearPool\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\n    /// @dev Reverts with {NotEnoughBalance} if the staker does not have enough balance for the given id and amount.\n    /// @param withdrawData The data to be used for withdrawing, encoded as\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        bool batch = abi.decode(withdrawData, (bool));\n        if (batch) {\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(withdrawData, (bool, uint256[], uint256[]));\n            uint256 count = ids.length;\n            require(count == amounts.length, InconsistentArrayLengths());\n            for (uint256 i; i != count; ++i) {\n                uint256 id = ids[i];\n                uint256 amount = amounts[i];\n                uint256 balance = balances[staker][id];\n                require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\n                balances[staker][id] = balance - amount;\n                stakePoints += _tokenValue(id, amount);\n            }\n            STAKING_TOKEN.safeBatchTransferFrom(address(this), staker, ids, amounts, \"\");\n        } else {\n            (, uint256 id, uint256 amount) = abi.decode(withdrawData, (bool, uint256, uint256));\n            uint256 balance = balances[staker][id];\n            require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\n            balances[staker][id] = balance - amount;\n            stakePoints = _tokenValue(id, amount);\n            STAKING_TOKEN.safeTransferFrom(address(this), staker, id, amount, \"\");\n        }\n    }\n\n    /// @notice Computes the stake points for a given token id and amount.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return stakePoints The computed stake points for the given token id and amount.\n    function _tokenValue(uint256 id, uint256 amount) internal view virtual returns (uint256 stakePoints);\n}\n"},"contracts/staking/linear/stake/ERC20StakingLinearPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../LinearPool.sol\";\nimport {ERC20Receiver} from \"./../../../token/ERC20/ERC20Receiver.sol\";\nimport {TokenRecoveryBase} from \"./../../../security/base/TokenRecoveryBase.sol\";\nimport {SafeERC20, IERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\n/// @title ERC20StakingLinearPool\n/// @notice A linear pool that allows staking of ERC20 tokens.\n/// @notice WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens.\nabstract contract ERC20StakingLinearPool is LinearPool, ERC20Receiver {\n    using SafeERC20 for IERC20;\n\n    IERC20 public immutable STAKING_TOKEN;\n\n    error InvalidToken();\n    error InvalidRecoveryAmount(uint256 requested, uint256 recoverable);\n\n    constructor(\n        IERC20 stakingToken,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\n        STAKING_TOKEN = stakingToken;\n    }\n\n    /// @notice Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\n    /// @dev Reverts  with {InvalidToken} if the sender is not the staking token.\n    /// @param from The address of the sender.\n    /// @param value The amount of tokens received.\n    /// @return bytes4 The function selector of the callback.\n    function onERC20Received(address, address from, uint256 value, bytes calldata) external virtual override returns (bytes4) {\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\n        bool requiresTransfer = false;\n        _stake(from, abi.encode(requiresTransfer, abi.encode(value)));\n        return this.onERC20Received.selector;\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param stakeData The data to be used for staking, encoded as (uint256 value)\n    function stake(bytes calldata stakeData) public payable virtual override {\n        bool requiresTransfer = true;\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes data) where data is (uint256 value).\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\n        stakePoints = abi.decode(data, (uint256));\n        if (requiresTransfer) {\n            STAKING_TOKEN.safeTransferFrom(staker, address(this), stakePoints);\n        }\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param withdrawData The data to be used for withdrawing, encoded as (uint256 value)\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        stakePoints = abi.decode(withdrawData, (uint256));\n        STAKING_TOKEN.safeTransfer(staker, stakePoints);\n    }\n\n    /// @inheritdoc TokenRecoveryBase\n    /// @dev Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual override {\n        uint256 stakingTokenRecoveryAmount;\n        for (uint256 i; i < tokens.length; ++i) {\n            if (tokens[i] == STAKING_TOKEN) {\n                stakingTokenRecoveryAmount += amounts[i];\n            }\n        }\n        if (stakingTokenRecoveryAmount != 0) {\n            uint256 recoverable = STAKING_TOKEN.balanceOf(address(this)) - totalStaked;\n            if (stakingTokenRecoveryAmount > recoverable) {\n                revert InvalidRecoveryAmount(stakingTokenRecoveryAmount, recoverable);\n            }\n        }\n        super.recoverERC20s(accounts, tokens, amounts);\n    }\n}\n"},"contracts/staking/linear/stake/ERC721StakingLinearPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {LinearPool} from \"./../LinearPool.sol\";\nimport {ERC721Receiver} from \"./../../../token/ERC721/ERC721Receiver.sol\";\nimport {TokenRecoveryBase} from \"./../../../security/base/TokenRecoveryBase.sol\";\nimport {IERC721} from \"./../../../token/ERC721/interfaces/IERC721.sol\";\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\n\n/// @title ERC721StakingLinearPool\n/// @notice A linear pool that allows staking of ERC721 tokens.\nabstract contract ERC721StakingLinearPool is LinearPool, ERC721Receiver {\n    IERC721 public immutable STAKING_TOKEN;\n\n    mapping(uint256 tokenId => address owner) public tokenOwners;\n\n    error InvalidToken();\n    error NotTheTokenOwner(address staker, uint256 tokenId, address owner);\n    error InvalidRecoveryToken(uint256 tokenId);\n\n    constructor(\n        IERC721 stakingToken,\n        uint8 scalingFactorDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\n        STAKING_TOKEN = stakingToken;\n    }\n\n    /// @notice Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\n    /// @param from The address of the sender.\n    /// @param tokenId The ID of the token received.\n    /// @return bytes4 The function selector of the callback.\n    /// @dev Reverts with {InvalidToken} if the sender is not the staking token.\n    function onERC721Received(address, address from, uint256 tokenId, bytes calldata) external virtual override returns (bytes4) {\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\n        bool requiresTransfer = false;\n        bool batch = false;\n        _stake(from, abi.encode(requiresTransfer, abi.encode(batch, tokenId)));\n        return this.onERC721Received.selector;\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param stakeData The data to be used for staking, encoded as\n    ///   (bool batch, uint256 tokenId) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\n    function stake(bytes calldata stakeData) public payable virtual override {\n        bool requiresTransfer = true;\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\n    ///   (bool batch, uint256 tokenId) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\n        bool batch = abi.decode(data, (bool));\n        if (batch) {\n            (, uint256[] memory tokenIds) = abi.decode(data, (bool, uint256[]));\n            uint256 count = tokenIds.length;\n            for (uint256 i; i != count; ++i) {\n                uint256 tokenId = tokenIds[i];\n                tokenOwners[tokenId] = staker;\n                stakePoints += _tokenValue(tokenId);\n                // batch case always requires transfer\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\n            }\n        } else {\n            (, uint256 tokenId) = abi.decode(data, (bool, uint256));\n            tokenOwners[tokenId] = staker;\n            stakePoints = _tokenValue(tokenId);\n            if (requiresTransfer) {\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\n            }\n        }\n    }\n\n    /// @inheritdoc LinearPool\n    /// @param withdrawData The data to be used for withdrawing, encoded as\n    ///   (bool batch, uint256 tokenId) where batch is false, or\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\n        bool batch = abi.decode(withdrawData, (bool));\n        if (batch) {\n            (, uint256[] memory tokenIds) = abi.decode(withdrawData, (bool, uint256[]));\n            uint256 count = tokenIds.length;\n            for (uint256 i; i != count; ++i) {\n                uint256 tokenId = tokenIds[i];\n                address tokenOwner = tokenOwners[tokenId];\n                require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\n                delete tokenOwners[tokenId];\n                stakePoints += _tokenValue(tokenId);\n                STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\n            }\n        } else {\n            (, uint256 tokenId) = abi.decode(withdrawData, (bool, uint256));\n            address tokenOwner = tokenOwners[tokenId];\n            require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\n            delete tokenOwners[tokenId];\n            stakePoints = _tokenValue(tokenId);\n            STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\n        }\n    }\n\n    /// @inheritdoc TokenRecoveryBase\n    /// @dev Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual override {\n        for (uint256 i; i != contracts.length; ++i) {\n            if (contracts[i] == STAKING_TOKEN) {\n                uint256 tokenId = tokenIds[i];\n                require(tokenOwners[tokenId] == address(0), InvalidRecoveryToken(tokenId));\n            }\n        }\n        super.recoverERC721s(accounts, contracts, tokenIds);\n    }\n\n    /// @notice Computes the stake points for a given token ID.\n    /// @param tokenId The ID of the token.\n    /// @return stakePoints The stake points for the token.\n    function _tokenValue(uint256 tokenId) internal view virtual returns (uint256 stakePoints);\n}\n"},"contracts/token/ERC1155/base/ERC1155Base.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155} from \"./../interfaces/IERC1155.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1155 Multi Token Standard (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract ERC1155Base is IERC1155, Context {\n    using ERC1155Storage for ERC1155Storage.Layout;\n\n    /// @inheritdoc IERC1155\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\n    }\n\n    /// @inheritdoc IERC1155\n    function safeBatchTransferFrom(\n        address from,\n        address to,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes calldata data\n    ) external virtual {\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\n    }\n\n    /// @inheritdoc IERC1155\n    function setApprovalForAll(address operator, bool approved) external virtual {\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC1155\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\n    }\n\n    /// @inheritdoc IERC1155\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\n        return ERC1155Storage.layout().balanceOf(owner, id);\n    }\n\n    /// @inheritdoc IERC1155\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\n    }\n}\n"},"contracts/token/ERC1155/base/ERC1155BurnableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155Burnable} from \"./../interfaces/IERC1155Burnable.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\n    using ERC1155Storage for ERC1155Storage.Layout;\n\n    /// @inheritdoc IERC1155Burnable\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\n    }\n\n    /// @inheritdoc IERC1155Burnable\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\n    }\n}\n"},"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155Deliverable} from \"./../interfaces/IERC1155Deliverable.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\n    using ERC1155Storage for ERC1155Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\n    bytes32 private constant _MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC1155Deliverable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\n        address sender = _msgSender();\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\n    }\n}\n"},"contracts/token/ERC1155/base/ERC1155MetadataBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {InconsistentArrayLengths} from \"./../../../CommonErrors.sol\";\nimport {NotMetadataResolver} from \"./../../metadata/errors/TokenMetadataErrors.sol\";\nimport {URI} from \"./../events/ERC1155Events.sol\";\nimport {IERC1155MetadataURI} from \"./../interfaces/IERC1155MetadataURI.sol\";\nimport {IERC1155MetadataSetter} from \"./../interfaces/IERC1155MetadataSetter.sol\";\nimport {TokenMetadataStorage} from \"./../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {TokenMetadataBase} from \"./../../metadata/base/TokenMetadataBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    /// @inheritdoc IERC1155MetadataURI\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\n    }\n\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\n    /// @dev Reverts if the caller is not the metadata resolver.\n    /// @dev Emits a {URI} event.\n    /// @param tokenId The token identifier.\n    /// @param tokenURI The token metadata URI.\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\n        emit URI(tokenURI, tokenId);\n    }\n\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\n    /// @dev Reverts if the caller is not the metadata resolver.\n    /// @dev Emits a {URI} event for each token.\n    /// @param tokenIds The token identifiers.\n    /// @param tokenURIs The token metadata URIs.\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\n\n        for (uint256 i; i < tokenIds.length; ++i) {\n            emit URI(tokenURIs[i], tokenIds[i]);\n        }\n    }\n}\n"},"contracts/token/ERC1155/base/ERC1155MintableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155Mintable} from \"./../interfaces/IERC1155Mintable.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\n    using ERC1155Storage for ERC1155Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC1155Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\n        address sender = _msgSender();\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\n    }\n\n    /// @inheritdoc IERC1155Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\n        address sender = _msgSender();\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\n    }\n}\n"},"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155} from \"./../interfaces/IERC1155.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {OperatorFiltererStorage} from \"./../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\n    using ERC1155Storage for ERC1155Storage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    /// @inheritdoc IERC1155\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\n    }\n\n    /// @inheritdoc IERC1155\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\n    function safeBatchTransferFrom(\n        address from,\n        address to,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes calldata data\n    ) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\n    }\n\n    /// @inheritdoc IERC1155\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\n    function setApprovalForAll(address operator, bool approved) external virtual {\n        if (approved) {\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\n        }\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC1155\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\n    }\n\n    /// @inheritdoc IERC1155\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\n        return ERC1155Storage.layout().balanceOf(owner, id);\n    }\n\n    /// @inheritdoc IERC1155\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\n    }\n}\n"},"contracts/token/ERC1155/ERC1155.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {ERC1155Base} from \"./base/ERC1155Base.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC1155 Multi Token Standard (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155 is ERC1155Base, InterfaceDetection {\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\n    constructor() {\n        ERC1155Storage.init();\n    }\n}\n"},"contracts/token/ERC1155/ERC1155Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {ERC1155BurnableBase} from \"./base/ERC1155BurnableBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155Burnable is ERC1155BurnableBase {\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable\n    constructor() {\n        ERC1155Storage.initERC1155Burnable();\n    }\n}\n"},"contracts/token/ERC1155/ERC1155Deliverable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {ERC1155DeliverableBase} from \"./base/ERC1155DeliverableBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\n    constructor() {\n        ERC1155Storage.initERC1155Deliverable();\n    }\n}\n"},"contracts/token/ERC1155/ERC1155Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ITokenMetadataResolver} from \"./../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {TokenMetadataStorage} from \"./../metadata/libraries/TokenMetadataStorage.sol\";\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {ERC1155MetadataBase} from \"./base/ERC1155MetadataBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\n    /// @param name The name of the token.\n    /// @param symbol The symbol of the token.\n    /// @param metadataResolver The address of the metadata resolver contract.\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\n        ERC1155Storage.initERC1155MetadataURI();\n    }\n}\n"},"contracts/token/ERC1155/ERC1155Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {ERC1155MintableBase} from \"./base/ERC1155MintableBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\n    constructor() {\n        ERC1155Storage.initERC1155Mintable();\n    }\n}\n"},"contracts/token/ERC1155/ERC1155TokenReceiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC1155TokenReceiver} from \"./interfaces/IERC1155TokenReceiver.sol\";\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC1155 Multi Token Standard, Token Receiver (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, InterfaceDetection {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\n    constructor() {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155TokenReceiver).interfaceId, true);\n    }\n}\n"},"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IOperatorFilterRegistry} from \"./../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC1155Storage} from \"./libraries/ERC1155Storage.sol\";\nimport {OperatorFiltererStorage} from \"./../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ERC1155WithOperatorFiltererBase} from \"./base/ERC1155WithOperatorFiltererBase.sol\";\nimport {OperatorFiltererBase} from \"./../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\n\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\n        ERC1155Storage.init();\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\n    }\n}\n"},"contracts/token/ERC1155/errors/ERC1155Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to approveForAll oneself.\n/// @param account The account trying to approveForAll itself.\nerror ERC1155SelfApprovalForAll(address account);\n\n/// @notice Thrown when transferring tokens to the zero address.\nerror ERC1155TransferToAddressZero();\n\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\n/// @param sender The sender.\n/// @param owner The owner.\nerror ERC1155NonApproved(address sender, address owner);\n\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\n/// @param owner The owner.\n/// @param id The token identifier.\n/// @param balance The current balance.\n/// @param value The amount of tokens to transfer.\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\n\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\n/// @param recipient The recipient.\n/// @param id The token identifier.\n/// @param balance The current balance.\n/// @param value The amount of tokens to transfer.\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\n\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\n/// @param recipient The recipient contract.\n/// @param id The token identifier.\n/// @param value The amount of tokens to transfer.\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\n\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\n/// @param recipient The recipient contract.\n/// @param ids The token identifiers.\n/// @param values The amounts of tokens to transfer.\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\n\n/// @notice Thrown when querying the balance of the zero address.\nerror ERC1155BalanceOfAddressZero();\n"},"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when minting tokens to the zero address.\nerror ERC1155MintToAddressZero();\n"},"contracts/token/ERC1155/events/ERC1155Events.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when some token is transferred.\n/// @param operator The initiator of the transfer.\n/// @param from The previous token owner.\n/// @param to The new token owner.\n/// @param id The transferred token identifier.\n/// @param value The amount of token.\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n/// @notice Emitted when a batch of tokens is transferred.\n/// @param operator The initiator of the transfer.\n/// @param from The previous tokens owner.\n/// @param to The new tokens owner.\n/// @param ids The transferred tokens identifiers.\n/// @param values The amounts of tokens.\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\n\n/// @notice Emitted when an approval for all tokens is set or unset.\n/// @param owner The tokens owner.\n/// @param operator The approved address.\n/// @param approved True when then approval is set, false when it is unset.\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n/// @notice Emitted when a token metadata URI is set updated.\n/// @param value The token metadata URI.\n/// @param id The token identifier.\nevent URI(string value, uint256 indexed id);\n"},"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC1155BurnableBase} from \"./../base/ERC1155BurnableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC1155BurnableFacet is ERC1155BurnableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Burnable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC1155BurnableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC1155Storage.initERC1155Burnable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC1155DeliverableBase} from \"./../base/ERC1155DeliverableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC1155DeliverableFacet is ERC1155DeliverableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC1155DeliverableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC1155Storage.initERC1155Deliverable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/facets/ERC1155Facet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC1155Base} from \"./../base/ERC1155Base.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC1155Facet is ERC1155Base, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC1155Storage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC1155Storage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {TokenMetadataStorage} from \"./../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ERC1155MetadataBase} from \"./../base/ERC1155MetadataBase.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (facet version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC1155MetadataFacet is ERC1155MetadataBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with the contract metadata.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param name The name of the token.\n    /// @param symbol The symbol of the token.\n    /// @param metadataResolver The address of the metadata resolver contract.\n    function initERC1155MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\n        ERC1155Storage.initERC1155MetadataURI();\n    }\n}\n"},"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC1155MintableBase} from \"./../base/ERC1155MintableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC1155MintableFacet is ERC1155MintableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Mintable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC1155MintableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC1155Storage.initERC1155Mintable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC1155Storage} from \"./../libraries/ERC1155Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC1155WithOperatorFiltererBase} from \"./../base/ERC1155WithOperatorFiltererBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC1155 Multi Token Standard with Operator Filterer (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\ncontract ERC1155WithOperatorFiltererFacet is ERC1155WithOperatorFiltererBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC1155Storage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC1155Storage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\ninterface IERC1155 {\n    /// @notice Safely transfers some token.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits a {TransferSingle} event.\n    /// @param from Current token owner.\n    /// @param to Address of the new token owner.\n    /// @param id Identifier of the token to transfer.\n    /// @param value Amount of token to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\n\n    /// @notice Safely transfers a batch of tokens.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `ids` and `values` have different lengths.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\n    /// @dev Emits a {TransferBatch} event.\n    /// @param from Current tokens owner.\n    /// @param to Address of the new tokens owner.\n    /// @param ids Identifiers of the tokens to transfer.\n    /// @param values Amounts of tokens to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\n\n    /// @notice Enables or disables an operator's approval.\n    /// @dev Emits an {ApprovalForAll} event.\n    /// @param operator Address of the operator.\n    /// @param approved True to approve the operator, false to revoke its approval.\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /// @notice Retrieves the approval status of an operator for a given owner.\n    /// @param owner Address of the authorisation giver.\n    /// @param operator Address of the operator.\n    /// @return approved True if the operator is approved, false if not.\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\n\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\n    /// @param owner The account to retrieve the balance of.\n    /// @param id The identifier to retrieve the balance of.\n    /// @return balance The balance of `id` owned by account `owner`.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\n\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\n    /// @dev Reverts if `owners` and `ids` have different lengths.\n    /// @param owners The addresses of the token holders\n    /// @param ids The identifiers to retrieve the balance of.\n    /// @return balances The balances of `ids` owned by accounts `owners`.\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\ninterface IERC1155Burnable {\n    /// @notice Burns some token.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\n    /// @dev Emits an {IERC1155-TransferSingle} event.\n    /// @param from Address of the current token owner.\n    /// @param id Identifier of the token to burn.\n    /// @param value Amount of token to burn.\n    function burnFrom(address from, uint256 id, uint256 value) external;\n\n    /// @notice Burns multiple tokens.\n    /// @dev Reverts if `ids` and `values` have different lengths.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\n    /// @dev Emits an {IERC1155-TransferBatch} event.\n    /// @param from Address of the current tokens owner.\n    /// @param ids Identifiers of the tokens to burn.\n    /// @param values Amounts of tokens to burn.\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\ninterface IERC1155Deliverable {\n    /// @notice Safely mints tokens to multiple recipients.\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\n    /// @dev Reverts if one of `recipients` is the zero address.\n    /// @dev Reverts if one of `recipients` balance overflows.\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\n    /// @param recipients Addresses of the new tokens owners.\n    /// @param ids Identifiers of the tokens to mint.\n    /// @param values Amounts of tokens to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\ninterface IERC1155MetadataSetter {\n    /// @notice Sets the metadata URI for a token.\n    /// @dev Emits a {URI} event.\n    /// @param tokenId The token identifier.\n    /// @param tokenURI The token metadata URI.\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\n\n    /// @notice Sets the metadata URIs for a batch of tokens.\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\n    /// @dev Emits a {URI} event for each token.\n    /// @param tokenIds The token identifiers.\n    /// @param tokenURIs The token metadata URIs.\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\ninterface IERC1155MetadataURI {\n    /// @notice Retrieves the URI for a given token.\n    /// @dev URIs are defined in RFC 3986.\n    /// @dev The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\n    ///  an implementation to return a valid string even if the token does not exist.\n    /// @return metadataURI The URI associated to the token.\n    function uri(uint256 id) external view returns (string memory metadataURI);\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\ninterface IERC1155Mintable {\n    /// @notice Safely mints some token.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `to`'s balance of `id` overflows.\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits an {IERC1155-TransferSingle} event.\n    /// @param to Address of the new token owner.\n    /// @param id Identifier of the token to mint.\n    /// @param value Amount of token to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\n\n    /// @notice Safely mints a batch of tokens.\n    /// @dev Reverts if `ids` and `values` have different lengths.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\n    /// @dev Emits an {IERC1155-TransferBatch} event.\n    /// @param to Address of the new tokens owner.\n    /// @param ids Identifiers of the tokens to mint.\n    /// @param values Amounts of tokens to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\n}\n"},"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\ninterface IERC1155TokenReceiver {\n    /// @notice Handles the receipt of a single ERC1155 token type.\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\n    /// @dev Return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (`0xf23a6e61`) to accept the transfer.\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\n\n    /// @notice Handles the receipt of multiple ERC1155 token types.\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\n    /// @dev Return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (`0xbc197c81`) to accept the transfer.\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\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 magicValue);\n}\n"},"contracts/token/ERC1155/libraries/ERC1155Storage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n// solhint-disable-next-line max-line-length\nimport {\n    ERC1155SelfApprovalForAll,\n    ERC1155TransferToAddressZero,\n    ERC1155NonApproved,\n    ERC1155InsufficientBalance,\n    ERC1155BalanceOverflow,\n    ERC1155SafeTransferRejected,\n    ERC1155SafeBatchTransferRejected,\n    ERC1155BalanceOfAddressZero\n} from \"./../errors/ERC1155Errors.sol\";\nimport {ERC1155MintToAddressZero} from \"./../errors/ERC1155MintableErrors.sol\";\nimport {InconsistentArrayLengths} from \"./../../../CommonErrors.sol\";\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \"./../events/ERC1155Events.sol\";\nimport {IERC1155} from \"./../interfaces/IERC1155.sol\";\nimport {IERC1155MetadataURI} from \"./../interfaces/IERC1155MetadataURI.sol\";\nimport {IERC1155Mintable} from \"./../interfaces/IERC1155Mintable.sol\";\nimport {IERC1155Deliverable} from \"./../interfaces/IERC1155Deliverable.sol\";\nimport {IERC1155Burnable} from \"./../interfaces/IERC1155Burnable.sol\";\nimport {IERC1155TokenReceiver} from \"./../interfaces/IERC1155TokenReceiver.sol\";\nimport {Address} from \"./../../../utils/libraries/Address.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC1155Storage {\n    using Address for address;\n    using ERC1155Storage for ERC1155Storage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        mapping(uint256 => mapping(address => uint256)) balances;\n        mapping(address => mapping(address => bool)) operators;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.token.ERC1155.ERC1155.storage\")) - 1);\n\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\n    function init() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\n    function initERC1155MetadataURI() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\n    function initERC1155Mintable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\n    function initERC1155Deliverable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\n    function initERC1155Burnable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\n    }\n\n    /// @notice Safely transfers some token by a sender.\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits a {TransferSingle} event.\n    /// @param sender The message sender.\n    /// @param from Current token owner.\n    /// @param to Address of the new token owner.\n    /// @param id Identifier of the token to transfer.\n    /// @param value Amount of token to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\n\n        _transferToken(s, from, to, id, value);\n\n        emit TransferSingle(sender, from, to, id, value);\n\n        if (to.hasBytecode()) {\n            _callOnERC1155Received(sender, from, to, id, value, data);\n        }\n    }\n\n    /// @notice Safely transfers a batch of tokens by a sender.\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\n    /// @dev Emits a {TransferBatch} event.\n    /// @param sender The message sender.\n    /// @param from Current tokens owner.\n    /// @param to Address of the new tokens owner.\n    /// @param ids Identifiers of the tokens to transfer.\n    /// @param values Amounts of tokens to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeBatchTransferFrom(\n        Layout storage s,\n        address sender,\n        address from,\n        address to,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes calldata data\n    ) internal {\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\n        uint256 length = ids.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\n\n        for (uint256 i; i < length; ++i) {\n            _transferToken(s, from, to, ids[i], values[i]);\n        }\n\n        emit TransferBatch(sender, from, to, ids, values);\n\n        if (to.hasBytecode()) {\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\n        }\n    }\n\n    /// @notice Safely mints some token by a sender.\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits a {TransferSingle} event.\n    /// @param sender The message sender.\n    /// @param to Address of the new token owner.\n    /// @param id Identifier of the token to mint.\n    /// @param value Amount of token to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\n        if (to == address(0)) revert ERC1155MintToAddressZero();\n\n        _mintToken(s, to, id, value);\n\n        emit TransferSingle(sender, address(0), to, id, value);\n\n        if (to.hasBytecode()) {\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\n        }\n    }\n\n    /// @notice Safely mints a batch of tokens by a sender.\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\n    /// @dev Emits a {TransferBatch} event.\n    /// @param sender The message sender.\n    /// @param to Address of the new tokens owner.\n    /// @param ids Identifiers of the tokens to mint.\n    /// @param values Amounts of tokens to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\n        if (to == address(0)) revert ERC1155MintToAddressZero();\n        uint256 length = ids.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        for (uint256 i; i < length; ++i) {\n            _mintToken(s, to, ids[i], values[i]);\n        }\n\n        emit TransferBatch(sender, address(0), to, ids, values);\n\n        if (to.hasBytecode()) {\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\n        }\n    }\n\n    /// @notice Safely mints tokens to multiple recipients by a sender.\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\n    /// @param sender The message sender.\n    /// @param recipients Addresses of the new tokens owners.\n    /// @param ids Identifiers of the tokens to mint.\n    /// @param values Amounts of tokens to mint.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeDeliver(\n        Layout storage s,\n        address sender,\n        address[] memory recipients,\n        uint256[] memory ids,\n        uint256[] memory values,\n        bytes memory data\n    ) internal {\n        uint256 length = recipients.length;\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\n        }\n    }\n\n    /// @notice Burns some token by a sender.\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\n    /// @dev Emits a {TransferSingle} event.\n    /// @param sender The message sender.\n    /// @param from Address of the current token owner.\n    /// @param id Identifier of the token to burn.\n    /// @param value Amount of token to burn.\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\n        _burnToken(s, from, id, value);\n        emit TransferSingle(sender, from, address(0), id, value);\n    }\n\n    /// @notice Burns multiple tokens by a sender.\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\n    /// @dev Emits an {IERC1155-TransferBatch} event.\n    /// @param sender The message sender.\n    /// @param from Address of the current tokens owner.\n    /// @param ids Identifiers of the tokens to burn.\n    /// @param values Amounts of tokens to burn.\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\n        uint256 length = ids.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\n\n        for (uint256 i; i < length; ++i) {\n            _burnToken(s, from, ids[i], values[i]);\n        }\n\n        emit TransferBatch(sender, from, address(0), ids, values);\n    }\n\n    /// @notice Enables or disables an operator's approval by a sender.\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\n    /// @dev Emits an {ApprovalForAll} event.\n    /// @param sender The message sender.\n    /// @param operator Address of the operator.\n    /// @param approved True to approve the operator, false to revoke its approval.\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\n        s.operators[sender][operator] = approved;\n        emit ApprovalForAll(sender, operator, approved);\n    }\n\n    /// @notice Retrieves the approval status of an operator for a given owner.\n    /// @param owner Address of the authorisation giver.\n    /// @param operator Address of the operator.\n    /// @return approved True if the operator is approved, false if not.\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\n        return s.operators[owner][operator];\n    }\n\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\n    /// @param owner The account to retrieve the balance of.\n    /// @param id The identifier to retrieve the balance of.\n    /// @return balance The balance of `id` owned by account `owner`.\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\n        return s.balances[id][owner];\n    }\n\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\n    /// @param owners The addresses of the token holders\n    /// @param ids The identifiers to retrieve the balance of.\n    /// @return balances The balances of `ids` owned by accounts `owners`.\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\n        uint256 length = owners.length;\n        if (length != ids.length) revert InconsistentArrayLengths();\n\n        balances = new uint256[](owners.length);\n\n        for (uint256 i; i < length; ++i) {\n            balances[i] = s.balanceOf(owners[i], ids[i]);\n        }\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\n    /// @param owner The token owner.\n    /// @param account The account to check the operatability of.\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\n        return (owner == account) || s.operators[owner][account];\n    }\n\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\n        if (value != 0) {\n            uint256 fromBalance = s.balances[id][from];\n            unchecked {\n                uint256 newFromBalance = fromBalance - value;\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\n                if (from != to) {\n                    uint256 toBalance = s.balances[id][to];\n                    uint256 newToBalance = toBalance + value;\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\n\n                    s.balances[id][from] = newFromBalance;\n                    s.balances[id][to] = newToBalance;\n                }\n            }\n        }\n    }\n\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\n        if (value != 0) {\n            unchecked {\n                uint256 balance = s.balances[id][to];\n                uint256 newBalance = balance + value;\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\n                s.balances[id][to] = newBalance;\n            }\n        }\n    }\n\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\n        if (value != 0) {\n            uint256 balance = s.balances[id][from];\n            unchecked {\n                uint256 newBalance = balance - value;\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\n                s.balances[id][from] = newBalance;\n            }\n        }\n    }\n\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n    /// @param sender The message sender.\n    /// @param from Previous token owner.\n    /// @param to New token owner.\n    /// @param id Identifier of the token transferred.\n    /// @param value Value transferred.\n    /// @param data Optional data to send along with the receiver contract call.\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\n            revert ERC1155SafeTransferRejected(to, id, value);\n    }\n\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\n    /// @param sender The message sender.\n    /// @param from Previous token owner.\n    /// @param to New token owner.\n    /// @param ids Identifiers of the tokens transferred.\n    /// @param values Values transferred.\n    /// @param data Optional data to send along with the receiver contract call.\n    function _callOnERC1155BatchReceived(\n        address sender,\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory values,\n        bytes memory data\n    ) private {\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\n    }\n}\n"},"contracts/token/ERC1155/preset/ERC1155Full.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC1155WithOperatorFilterer} from \"./../ERC1155WithOperatorFilterer.sol\";\nimport {ERC1155Metadata} from \"./../ERC1155Metadata.sol\";\nimport {ERC1155Mintable} from \"./../ERC1155Mintable.sol\";\nimport {ERC1155Deliverable} from \"./../ERC1155Deliverable.sol\";\nimport {ERC2981} from \"./../../royalty/ERC2981.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155Full is\n    ERC1155WithOperatorFilterer,\n    ERC1155Metadata,\n    ERC1155Mintable,\n    ERC1155Deliverable,\n    ERC2981,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    )\n        ContractOwnership(msg.sender)\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\n        ERC1155WithOperatorFilterer(filterRegistry)\n        ForwarderRegistryContext(forwarderRegistry)\n    {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/preset/ERC1155FullBurn.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC1155WithOperatorFilterer} from \"./../ERC1155WithOperatorFilterer.sol\";\nimport {ERC1155Metadata} from \"./../ERC1155Metadata.sol\";\nimport {ERC1155Mintable} from \"./../ERC1155Mintable.sol\";\nimport {ERC1155Deliverable} from \"./../ERC1155Deliverable.sol\";\nimport {ERC1155Burnable} from \"./../ERC1155Burnable.sol\";\nimport {ERC2981} from \"./../../royalty/ERC2981.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155FullBurn is\n    ERC1155WithOperatorFilterer,\n    ERC1155Metadata,\n    ERC1155Mintable,\n    ERC1155Deliverable,\n    ERC1155Burnable,\n    ERC2981,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    )\n        ContractOwnership(msg.sender)\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\n        ERC1155WithOperatorFilterer(filterRegistry)\n        ForwarderRegistryContext(forwarderRegistry)\n    {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC1155Storage} from \"./../../libraries/ERC1155Storage.sol\";\nimport {ERC2981Storage} from \"./../../../royalty/libraries/ERC2981Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {OperatorFiltererStorage} from \"./../../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC1155WithOperatorFiltererBase} from \"./../../base/ERC1155WithOperatorFiltererBase.sol\";\nimport {ERC1155MetadataBase} from \"./../../base/ERC1155MetadataBase.sol\";\nimport {ERC1155MintableBase} from \"./../../base/ERC1155MintableBase.sol\";\nimport {ERC1155DeliverableBase} from \"./../../base/ERC1155DeliverableBase.sol\";\nimport {ERC1155BurnableBase} from \"./../../base/ERC1155BurnableBase.sol\";\nimport {ERC2981Base} from \"./../../../royalty/base/ERC2981Base.sol\";\nimport {OperatorFiltererBase} from \"./../../../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155FullBurnProxied is\n    ERC1155WithOperatorFiltererBase,\n    ERC1155MetadataBase,\n    ERC1155MintableBase,\n    ERC1155DeliverableBase,\n    ERC1155BurnableBase,\n    ERC2981Base,\n    OperatorFiltererBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    TokenRecoveryBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC1155Storage.init();\n        ERC1155Storage.initERC1155MetadataURI();\n        ERC1155Storage.initERC1155Mintable();\n        ERC1155Storage.initERC1155Deliverable();\n        ERC1155Storage.initERC1155Burnable();\n        ERC2981Storage.init();\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC1155Storage} from \"./../../libraries/ERC1155Storage.sol\";\nimport {ERC2981Storage} from \"./../../../royalty/libraries/ERC2981Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {OperatorFiltererStorage} from \"./../../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC1155WithOperatorFiltererBase} from \"./../../base/ERC1155WithOperatorFiltererBase.sol\";\nimport {ERC1155MetadataBase} from \"./../../base/ERC1155MetadataBase.sol\";\nimport {ERC1155MintableBase} from \"./../../base/ERC1155MintableBase.sol\";\nimport {ERC1155DeliverableBase} from \"./../../base/ERC1155DeliverableBase.sol\";\nimport {ERC2981Base} from \"./../../../royalty/base/ERC2981Base.sol\";\nimport {OperatorFiltererBase} from \"./../../../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC1155FullProxied is\n    ERC1155WithOperatorFiltererBase,\n    ERC1155MetadataBase,\n    ERC1155MintableBase,\n    ERC1155DeliverableBase,\n    ERC2981Base,\n    OperatorFiltererBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    TokenRecoveryBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC1155Storage.init();\n        ERC1155Storage.initERC1155MetadataURI();\n        ERC1155Storage.initERC1155Mintable();\n        ERC1155Storage.initERC1155Deliverable();\n        ERC2981Storage.init();\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/base/ERC20Base.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20} from \"./../interfaces/IERC20.sol\";\nimport {IERC20Allowance} from \"./../interfaces/IERC20Allowance.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\n    using ERC20Storage for ERC20Storage.Layout;\n\n    /// @inheritdoc IERC20\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20Allowance\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\n        return true;\n    }\n\n    /// @inheritdoc IERC20Allowance\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() external view virtual returns (uint256 supply) {\n        return ERC20Storage.layout().totalSupply();\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\n        return ERC20Storage.layout().balanceOf(owner);\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\n        return ERC20Storage.layout().allowance(owner, spender);\n    }\n}\n"},"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20BatchTransfers} from \"./../interfaces/IERC20BatchTransfers.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\n    using ERC20Storage for ERC20Storage.Layout;\n\n    /// @inheritdoc IERC20BatchTransfers\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\n        return true;\n    }\n\n    /// @inheritdoc IERC20BatchTransfers\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\n        return true;\n    }\n}\n"},"contracts/token/ERC20/base/ERC20BurnableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Burnable} from \"./../interfaces/IERC20Burnable.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\n    using ERC20Storage for ERC20Storage.Layout;\n\n    /// @inheritdoc IERC20Burnable\n    function burn(uint256 value) external virtual returns (bool) {\n        ERC20Storage.layout().burn(_msgSender(), value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20Burnable\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20Burnable\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\n        return true;\n    }\n}\n"},"contracts/token/ERC20/base/ERC20DetailedBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Detailed} from \"./../interfaces/IERC20Detailed.sol\";\nimport {ERC20DetailedStorage} from \"./../libraries/ERC20DetailedStorage.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\nabstract contract ERC20DetailedBase is IERC20Detailed {\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n\n    /// @inheritdoc IERC20Detailed\n    function name() external view virtual returns (string memory) {\n        return ERC20DetailedStorage.layout().name();\n    }\n\n    /// @inheritdoc IERC20Detailed\n    function symbol() external view virtual returns (string memory) {\n        return ERC20DetailedStorage.layout().symbol();\n    }\n\n    /// @inheritdoc IERC20Detailed\n    function decimals() external view virtual returns (uint8) {\n        return ERC20DetailedStorage.layout().decimals();\n    }\n}\n"},"contracts/token/ERC20/base/ERC20MetadataBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Metadata} from \"./../interfaces/IERC20Metadata.sol\";\nimport {ERC20MetadataStorage} from \"./../libraries/ERC20MetadataStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Sets the token URI.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @param uri The token URI.\n    function setTokenURI(string calldata uri) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        ERC20MetadataStorage.layout().setTokenURI(uri);\n    }\n\n    /// @inheritdoc IERC20Metadata\n    function tokenURI() external view virtual returns (string memory) {\n        return ERC20MetadataStorage.layout().tokenURI();\n    }\n}\n"},"contracts/token/ERC20/base/ERC20MintableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Mintable} from \"./../interfaces/IERC20Mintable.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\n    using ERC20Storage for ERC20Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC20Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function mint(address to, uint256 value) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC20Storage.layout().mint(to, value);\n    }\n\n    /// @inheritdoc IERC20Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC20Storage.layout().batchMint(recipients, values);\n    }\n}\n"},"contracts/token/ERC20/base/ERC20PermitBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Permit} from \"./../interfaces/IERC20Permit.sol\";\nimport {ERC20PermitStorage} from \"./../libraries/ERC20PermitStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\n/// @dev Note: This contract requires ERC20Detailed.\nabstract contract ERC20PermitBase is IERC20Permit, Context {\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\n\n    /// @inheritdoc IERC20Permit\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\n    }\n\n    /// @inheritdoc IERC20Permit\n    function nonces(address owner) external view virtual returns (uint256) {\n        return ERC20PermitStorage.layout().nonces(owner);\n    }\n\n    /// @inheritdoc IERC20Permit\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\n    }\n}\n"},"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20SafeTransfers} from \"./../interfaces/IERC20SafeTransfers.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\n    using ERC20Storage for ERC20Storage.Layout;\n\n    /// @inheritdoc IERC20SafeTransfers\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\n        return true;\n    }\n\n    /// @inheritdoc IERC20SafeTransfers\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\n        return true;\n    }\n}\n"},"contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20Storage} from \"./libraries/ERC20Storage.sol\";\nimport {ERC20Base} from \"./base/ERC20Base.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC20 Fungible Token Standard (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n    constructor() {\n        ERC20Storage.init();\n    }\n}\n"},"contracts/token/ERC20/ERC20BatchTransfers.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20Storage} from \"./libraries/ERC20Storage.sol\";\nimport {ERC20BatchTransfersBase} from \"./base/ERC20BatchTransfersBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n    constructor() {\n        ERC20Storage.initERC20BatchTransfers();\n    }\n}\n"},"contracts/token/ERC20/ERC20Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20Storage} from \"./libraries/ERC20Storage.sol\";\nimport {ERC20BurnableBase} from \"./base/ERC20BurnableBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20Burnable is ERC20BurnableBase {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\n    constructor() {\n        ERC20Storage.initERC20Burnable();\n    }\n}\n"},"contracts/token/ERC20/ERC20Detailed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20DetailedStorage} from \"./libraries/ERC20DetailedStorage.sol\";\nimport {ERC20DetailedBase} from \"./base/ERC20DetailedBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20Detailed is ERC20DetailedBase {\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n\n    /// @notice Initializes the storage with the token details.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenDecimals The token decimals.\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\n    }\n}\n"},"contracts/token/ERC20/ERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20MetadataStorage} from \"./libraries/ERC20MetadataStorage.sol\";\nimport {ERC20MetadataBase} from \"./base/ERC20MetadataBase.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\n    constructor() {\n        ERC20MetadataStorage.init();\n    }\n}\n"},"contracts/token/ERC20/ERC20Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20Storage} from \"./libraries/ERC20Storage.sol\";\nimport {ERC20MintableBase} from \"./base/ERC20MintableBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20Mintable is ERC20MintableBase, AccessControl {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\n    constructor() {\n        ERC20Storage.initERC20Mintable();\n    }\n}\n"},"contracts/token/ERC20/ERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20PermitStorage} from \"./libraries/ERC20PermitStorage.sol\";\nimport {ERC20PermitBase} from \"./base/ERC20PermitBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\n/// @dev Note: This contract requires ERC20Detailed.\nabstract contract ERC20Permit is ERC20PermitBase {\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\n    constructor() {\n        ERC20PermitStorage.init();\n    }\n}\n"},"contracts/token/ERC20/ERC20Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Receiver} from \"./interfaces/IERC20Receiver.sol\";\nimport {InterfaceDetectionStorage} from \"../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {InterfaceDetection} from \"../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC20 Fungible Token Standard, Receiver (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20Receiver is IERC20Receiver, InterfaceDetection {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Receiver.\n    constructor() {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Receiver).interfaceId, true);\n    }\n}\n"},"contracts/token/ERC20/ERC20SafeTransfers.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20Storage} from \"./libraries/ERC20Storage.sol\";\nimport {ERC20SafeTransfersBase} from \"./base/ERC20SafeTransfersBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\n    constructor() {\n        ERC20Storage.initERC20SafeTransfers();\n    }\n}\n"},"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the allowance increase creates an overflow.\n/// @param owner The owner of the tokens.\n/// @param spender The spender of the tokens.\n/// @param allowance The current allowance.\n/// @param increment The allowance increase.\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\n"},"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\nerror ERC20BatchTransferValuesOverflow();\n"},"contracts/token/ERC20/errors/ERC20Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when setting an allowance to the the zero address.\n/// @param owner The owner of the tokens.\nerror ERC20ApprovalToAddressZero(address owner);\n\n/// @notice Thrown when the allowance decreases below the current alowance set.\n/// @param owner The owner of the tokens.\n/// @param spender The spender of the tokens.\n/// @param allowance The current allowance.\n/// @param decrement The allowance decrease.\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\n\n/// @notice Thrown when transferring tokens to the zero address.\n/// @param owner The account from which the tokens are transferred.\nerror ERC20TransferToAddressZero(address owner);\n\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\n/// @param owner The owner of the tokens.\n/// @param balance The current balance.\n/// @param value The amount of tokens being transferred.\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\n"},"contracts/token/ERC20/errors/ERC20MintableErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the minting tokens to the zero address.\nerror ERC20MintToAddressZero();\n\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\nerror ERC20BatchMintValuesOverflow();\n\n/// @notice Thrown when the minting tokens overflows the supply.\n/// @param supply The current supply.\n/// @param value The amount of tokens being minted.\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\n"},"contracts/token/ERC20/errors/ERC20PermitErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when the permit is from the zero address.\nerror ERC20PermitFromAddressZero();\n\n/// @notice Thrown when the permit is expired.\n/// @param deadline The permit deadline.\nerror ERC20PermitExpired(uint256 deadline);\n\n/// @notice Thrown when the permit signature cannot be verified.\nerror ERC20PermitInvalidSignature();\n"},"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\n/// @param recipient The recipient contract.\nerror ERC20SafeTransferRejected(address recipient);\n"},"contracts/token/ERC20/events/ERC20Events.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when tokens are transferred, including zero value transfers.\n/// @param from The account where the transferred tokens are withdrawn from.\n/// @param to The account where the transferred tokens are deposited to.\n/// @param value The amount of tokens being transferred.\nevent Transfer(address indexed from, address indexed to, uint256 value);\n\n/// @notice Emitted when an approval is set.\n/// @param owner The account granting an allowance to `spender`.\n/// @param spender The account being granted an allowance from `owner`.\n/// @param value The allowance amount being granted.\nevent Approval(address indexed owner, address indexed spender, uint256 value);\n"},"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20BatchTransfersBase} from \"./../base/ERC20BatchTransfersBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC20BatchTransfersFacet is ERC20BatchTransfersBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20BatchTransfersStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.initERC20BatchTransfers();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20BurnableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20BurnableBase} from \"./../base/ERC20BurnableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC20BurnableFacet is ERC20BurnableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20BurnableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.initERC20Burnable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20DetailedFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20DetailedStorage} from \"./../libraries/ERC20DetailedStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20DetailedBase} from \"./../base/ERC20DetailedBase.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC20DetailedFacet is ERC20DetailedBase, ForwarderRegistryContextBase {\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with the token details.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenDecimals The token decimals.\n    function initERC20DetailedStorage(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20Facet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20Base} from \"./../base/ERC20Base.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC20Facet is ERC20Base, ForwarderRegistryContextBase {\n    using ERC20Storage for ERC20Storage.Layout;\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20Storage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.init();\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20StorageWithAllocations(address[] calldata initialHolders, uint256[] calldata initialAllocations) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.initWithAllocations(initialHolders, initialAllocations);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20MetadataFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20MetadataStorage} from \"./../libraries/ERC20MetadataStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20MetadataBase} from \"./../base/ERC20MetadataBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}.\ncontract ERC20MetadataFacet is ERC20MetadataBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\n    function initERC20MetadataStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20MetadataStorage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20MintableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20MintableBase} from \"./../base/ERC20MintableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\ncontract ERC20MintableFacet is ERC20MintableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20MintableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.initERC20Mintable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20PermitFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20PermitStorage} from \"./../libraries/ERC20PermitStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20PermitBase} from \"./../base/ERC20PermitBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}.\ncontract ERC20PermitFacet is ERC20PermitBase, ForwarderRegistryContextBase {\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20PermitStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20PermitStorage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../libraries/ERC20Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC20SafeTransfersBase} from \"./../base/ERC20SafeTransfersBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC20SafeTransfersFacet is ERC20SafeTransfersBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC20SafeTransfersStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC20Storage.initERC20SafeTransfers();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, basic interface (functions).\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\ninterface IERC20 {\n    /// @notice Sets the allowance to an account from the sender.\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n    /// @dev Reverts if `spender` is the zero address.\n    /// @dev Emits an {Approval} event.\n    /// @param spender The account being granted the allowance by the message caller.\n    /// @param value The allowance amount to grant.\n    /// @return result Whether the operation succeeded.\n    function approve(address spender, uint256 value) external returns (bool result);\n\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if the sender does not have at least `value` of balance.\n    /// @dev Emits a {Transfer} event.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @return result Whether the operation succeeded.\n    function transfer(address to, uint256 value) external returns (bool result);\n\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `from` does not have at least `value` of balance.\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Emits a {Transfer} event.\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\n    /// @param from The account which owns the tokens to transfer.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @return result Whether the operation succeeded.\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\n\n    /// @notice Gets the total token supply.\n    /// @return supply The total token supply.\n    function totalSupply() external view returns (uint256 supply);\n\n    /// @notice Gets an account balance.\n    /// @param owner The account whose balance will be returned.\n    /// @return balance The account balance.\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\n    /// @param owner The account that has granted an allowance to `spender`.\n    /// @param spender The account that was granted an allowance by `owner`.\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\n    function allowance(address owner, address spender) external view returns (uint256 value);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Allowance.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Allowance.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\ninterface IERC20Allowance {\n    /// @notice Increases the allowance granted to an account by the sender.\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\n    /// @dev Reverts if `spender` is the zero address.\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\n    /// @param spender The account whose allowance is being increased.\n    /// @param value The allowance amount increase.\n    /// @return result Whether the operation succeeded.\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\n\n    /// @notice Decreases the allowance granted to an account by the sender.\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\n    /// @dev Reverts if `spender` is the zero address.\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\n    /// @param spender The account whose allowance is being decreased.\n    /// @param value The allowance amount decrease.\n    /// @return result Whether the operation succeeded.\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\n}\n"},"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\ninterface IERC20BatchTransfers {\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\n    /// @dev Reverts if `recipients` and `values` have different lengths.\n    /// @dev Reverts if one of `recipients` is the zero address.\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\n    /// @param recipients The list of accounts to transfer the tokens to.\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\n    /// @return result Whether the operation succeeded.\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\n\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\n    /// @dev Reverts if `recipients` and `values` have different lengths.\n    /// @dev Reverts if one of `recipients` is the zero address.\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\n    /// @param from The account which owns the tokens to be transferred.\n    /// @param recipients The list of accounts to transfer the tokens to.\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\n    /// @return result Whether the operation succeeded.\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Burnable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\ninterface IERC20Burnable {\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\n    /// @dev Reverts if the sender does not have at least `value` of balance.\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\n    /// @param value The amount of tokens to burn.\n    /// @return result Whether the operation succeeded.\n    function burn(uint256 value) external returns (bool result);\n\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\n    /// @dev Reverts if `from` does not have at least `value` of balance.\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\n    /// @param from The account to burn the tokens from.\n    /// @param value The amount of tokens to burn.\n    /// @return result Whether the operation succeeded.\n    function burnFrom(address from, uint256 value) external returns (bool result);\n\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\n    /// @dev Reverts if `owners` and `values` have different lengths.\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\n    /// @param owners The list of accounts to burn the tokens from.\n    /// @param values The list of amounts of tokens to burn.\n    /// @return result Whether the operation succeeded.\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Detailed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Detailed.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\ninterface IERC20Detailed {\n    /// @notice Gets the name of the token. E.g. \"My Token\".\n    /// @return tokenName The name of the token.\n    function name() external view returns (string memory tokenName);\n\n    /// @notice Gets the symbol of the token. E.g. \"TOK\".\n    /// @return tokenSymbol The symbol of the token.\n    function symbol() external view returns (string memory tokenSymbol);\n\n    /// @notice Gets the number of decimals used to display the balances.\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\n    /// @return nbDecimals The number of decimals used to display the balances.\n    function decimals() external view returns (uint8 nbDecimals);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\ninterface IERC20Metadata {\n    /// @notice Gets the token metadata URI.\n    /// @return uri The token metadata URI.\n    function tokenURI() external view returns (string memory uri);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Mintable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\ninterface IERC20Mintable {\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if the total supply overflows.\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\n    /// @param to The account to mint the tokens to.\n    /// @param value The amount of tokens to mint.\n    function mint(address to, uint256 value) external;\n\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\n    /// @dev Reverts if `recipients` and `values` have different lengths.\n    /// @dev Reverts if one of `recipients` is the zero address.\n    /// @dev Reverts if the total supply overflows.\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\n    /// @param recipients The list of accounts to mint the tokens to.\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\n}\n"},"contracts/token/ERC20/interfaces/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\ninterface IERC20Permit {\n    /// @notice Sets the allowance to an account from another account using a signed permit.\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\n    /// @dev Reverts if `owner` is the zero address.\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\n    /// @dev Emits an {IERC20-Approval} event.\n    /// @param owner The token owner granting the allowance to `spender`.\n    /// @param spender The token spender being granted the allowance by `owner`.\n    /// @param value The allowance amount to grant.\n    /// @param deadline The deadline from which the permit signature is no longer valid.\n    /// @param v Permit signature v parameter\n    /// @param r Permit signature r parameter.\n    /// @param s Permit signature s parameter.\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\n\n    /// @notice Gets the current permit nonce of an account.\n    /// @param owner The account to check the nonce of.\n    /// @return nonce The current permit nonce of `owner`.\n    function nonces(address owner) external view returns (uint256 nonce);\n\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\n    ///  keccak256(\n    ///      abi.encode(\n    ///          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n    ///          keccak256(bytes(name)),\n    ///          keccak256(bytes(version)),\n    ///          chainId,\n    ///          address(this)))\n    ///\n    ///  where\n    ///   - `name` (string) is the ERC-20 token name.\n    ///   - `version` (string) refers to the ERC-20 token contract version.\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\n    ///\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\n}\n"},"contracts/token/ERC20/interfaces/IERC20Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, Tokens Receiver.\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\ninterface IERC20Receiver {\n    /// @notice Handles the receipt of ERC20 tokens.\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\n    /// @param operator The initiator of the safe transfer.\n    /// @param from The previous tokens owner.\n    /// @param value The amount of tokens transferred.\n    /// @param data Optional additional data with no specified format.\n    /// @return magicValue `bytes4(keccak256(\"onERC20Received(address,address,uint256,bytes)\"))` (`0x4fc35859`) to accept, any other value to refuse.\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\n}\n"},"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\ninterface IERC20SafeTransfers {\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if the sender does not have at least `value` of balance.\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n    /// @dev Emits an {IERC20-Transfer} event.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\n    /// @return result Whether the operation succeeded.\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\n\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `from` does not have at least `value` of balance.\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\n    /// @dev Emits an {IERC20-Transfer} event.\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\n    /// @param from The account which owns the tokens to transfer.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\n    /// @return result Whether the operation succeeded.\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\n}\n"},"contracts/token/ERC20/interfaces/IERC677.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC677 transferAndCall Token Standard, basic interface.\n/// @dev See https://github.com/ethereum/EIPs/issues/677\ninterface IERC677 {\n    function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success);\n}\n"},"contracts/token/ERC20/interfaces/IERC677Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC677 transferAndCall Token Standard, receiver interface.\n/// @dev See https://github.com/ethereum/EIPs/issues/677\ninterface IERC677Receiver {\n    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool success);\n}\n"},"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Detailed} from \"./../interfaces/IERC20Detailed.sol\";\nimport {ProxyInitialization} from \"./../../../proxy/libraries/ProxyInitialization.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC20DetailedStorage {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n\n    struct Layout {\n        string tokenName;\n        string tokenSymbol;\n        uint8 tokenDecimals;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20Detailed.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20Detailed.phase\")) - 1);\n\n    /// @notice Initializes the storage with the token details (immutable version).\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenDecimals The token decimals.\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\n        s.tokenName = tokenName;\n        s.tokenSymbol = tokenSymbol;\n        s.tokenDecimals = tokenDecimals;\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\n    }\n\n    /// @notice Initializes the storage with the token details (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenDecimals The token decimals.\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.tokenName = tokenName;\n        s.tokenSymbol = tokenSymbol;\n        s.tokenDecimals = tokenDecimals;\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\n    }\n\n    /// @notice Gets the name of the token. E.g. \"My Token\".\n    /// @return tokenName The name of the token.\n    function name(Layout storage s) internal view returns (string memory tokenName) {\n        return s.tokenName;\n    }\n\n    /// @notice Gets the symbol of the token. E.g. \"TOK\".\n    /// @return tokenSymbol The symbol of the token.\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\n        return s.tokenSymbol;\n    }\n\n    /// @notice Gets the number of decimals used to display the balances.\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\n    /// @return nbDecimals The number of decimals used to display the balances.\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\n        return s.tokenDecimals;\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC20Metadata} from \"./../interfaces/IERC20Metadata.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC20MetadataStorage {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\n\n    struct Layout {\n        string uri;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20Metadata.storage\")) - 1);\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\n    function init() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\n    }\n\n    /// @notice Sets the token URI.\n    /// @param uri The token URI.\n    function setTokenURI(Layout storage s, string calldata uri) internal {\n        s.uri = uri;\n    }\n\n    /// @notice Gets the token metadata URI.\n    /// @return uri The token metadata URI.\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\n        return s.uri;\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/token/ERC20/libraries/ERC20PermitStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \"./../errors/ERC20PermitErrors.sol\";\nimport {IERC20Permit} from \"./../interfaces/IERC20Permit.sol\";\nimport {ERC20Storage} from \"./ERC20Storage.sol\";\nimport {ERC20DetailedStorage} from \"./ERC20DetailedStorage.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC20PermitStorage {\n    using ERC20Storage for ERC20Storage.Layout;\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        mapping(address => uint256) accountNonces;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20Permit.storage\")) - 1);\n\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\n    function init() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\n    }\n\n    /// @notice Sets the allowance to an account from another account using a signed permit.\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\n    /// @dev Emits an {IERC20-Approval} event.\n    /// @param owner The token owner granting the allowance to `spender`.\n    /// @param spender The token spender being granted the allowance by `owner`.\n    /// @param value The allowance amount to grant.\n    /// @param deadline The deadline from which the permit signature is no longer valid.\n    /// @param v Permit signature v parameter\n    /// @param r Permit signature r parameter.\n    /// @param s Permit signature s parameter.\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\n        unchecked {\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\n            bytes32 hash = keccak256(abi.encodePacked(\"\\x19\\x01\", DOMAIN_SEPARATOR(), hashStruct));\n            address signer = ecrecover(hash, v, r, s);\n            if (signer != owner) revert ERC20PermitInvalidSignature();\n        }\n        ERC20Storage.layout().approve(owner, spender, value);\n    }\n\n    /// @notice Gets the current permit nonce of an account.\n    /// @param owner The account to check the nonce of.\n    /// @return nonce The current permit nonce of `owner`.\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\n        return s.accountNonces[owner];\n    }\n\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\n    ///  keccak256(\n    ///      abi.encode(\n    ///          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n    ///          keccak256(bytes(name)),\n    ///          keccak256(bytes(version)),\n    ///          chainId,\n    ///          address(this)))\n    ///\n    ///  where\n    ///   - `name` (string) is the ERC-20 token name.\n    ///   - `version` (string) refers to the ERC-20 token contract version.\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\n    ///\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        return\n            keccak256(\n                abi.encode(\n                    keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\n                    keccak256(\"1\"),\n                    chainId,\n                    address(this)\n                )\n            );\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/token/ERC20/libraries/ERC20Storage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n// solhint-disable-next-line max-line-length\nimport {\n    ERC20ApprovalToAddressZero,\n    ERC20InsufficientAllowance,\n    ERC20TransferToAddressZero,\n    ERC20InsufficientBalance\n} from \"./../errors/ERC20Errors.sol\";\nimport {ERC20AllowanceOverflow} from \"./../errors/ERC20AllowanceErrors.sol\";\nimport {ERC20BatchTransferValuesOverflow} from \"./../errors/ERC20BatchTransfersErrors.sol\";\nimport {ERC20SafeTransferRejected} from \"./../errors/ERC20SafeTransfersErrors.sol\";\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \"./../errors/ERC20MintableErrors.sol\";\nimport {InconsistentArrayLengths} from \"./../../../CommonErrors.sol\";\nimport {Transfer, Approval} from \"./../events/ERC20Events.sol\";\nimport {IERC20} from \"./../interfaces/IERC20.sol\";\nimport {IERC20Allowance} from \"./../interfaces/IERC20Allowance.sol\";\nimport {IERC20BatchTransfers} from \"./../interfaces/IERC20BatchTransfers.sol\";\nimport {IERC20SafeTransfers} from \"./../interfaces/IERC20SafeTransfers.sol\";\nimport {IERC20Mintable} from \"./../interfaces/IERC20Mintable.sol\";\nimport {IERC20Burnable} from \"./../interfaces/IERC20Burnable.sol\";\nimport {IERC20Receiver} from \"./../interfaces/IERC20Receiver.sol\";\nimport {Address} from \"./../../../utils/libraries/Address.sol\";\nimport {ProxyInitialization} from \"./../../../proxy/libraries/ProxyInitialization.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC20Storage {\n    using Address for address;\n    using ERC20Storage for ERC20Storage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        mapping(address => uint256) balances;\n        mapping(address => mapping(address => uint256)) allowances;\n        uint256 supply;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.core.token.ERC20.ERC20.phase\")) - 1);\n\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n    function init() internal {\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        init();\n        layout().batchMint(initialHolders, initialAllocations);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n    function initERC20BatchTransfers() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\n    function initERC20SafeTransfers() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\n    function initERC20Mintable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\n    function initERC20Burnable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\n    }\n\n    /// @notice Sets the allowance to an account by an owner.\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n    /// @dev Emits an {Approval} event.\n    /// @param owner The account to set the allowance from.\n    /// @param spender The account being granted the allowance by `owner`.\n    /// @param value The allowance amount to grant.\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\n        s.allowances[owner][spender] = value;\n        emit Approval(owner, spender, value);\n    }\n\n    /// @notice Increases the allowance granted to an account by an owner.\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\n    /// @param owner The account increasing the allowance.\n    /// @param spender The account whose allowance is being increased.\n    /// @param value The allowance amount increase.\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\n        uint256 currentAllowance = s.allowances[owner][spender];\n        if (value != 0) {\n            unchecked {\n                uint256 newAllowance = currentAllowance + value;\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\n                s.allowances[owner][spender] = newAllowance;\n                currentAllowance = newAllowance;\n            }\n        }\n        emit Approval(owner, spender, currentAllowance);\n    }\n\n    /// @notice Decreases the allowance granted to an account by an owner.\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\n    /// @param owner The account decreasing the allowance.\n    /// @param spender The account whose allowance is being decreased.\n    /// @param value The allowance amount decrease.\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\n        uint256 currentAllowance = s.allowances[owner][spender];\n\n        if (currentAllowance != type(uint256).max && value != 0) {\n            unchecked {\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\n                uint256 newAllowance = currentAllowance - value;\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\n                s.allowances[owner][spender] = newAllowance;\n                currentAllowance = newAllowance;\n            }\n        }\n        emit Approval(owner, spender, currentAllowance);\n    }\n\n    /// @notice Transfers an amount of tokens from an account to a recipient.\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Emits a {Transfer} event.\n    /// @param from The account transferring the tokens.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\n\n        if (value != 0) {\n            uint256 balance = s.balances[from];\n            unchecked {\n                uint256 newBalance = balance - value;\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\n                if (from != to) {\n                    s.balances[from] = newBalance;\n                    s.balances[to] += value;\n                }\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Emits a {Transfer} event.\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\n    /// @param sender The message sender.\n    /// @param from The account which owns the tokens to transfer.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\n        if (from != sender) {\n            s.decreaseAllowance(from, sender, value);\n        }\n        s.transfer(from, to, value);\n    }\n\n    //================================================= Batch Transfers ==================================================//\n\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\n    /// @dev Emits a {Transfer} event for each transfer.\n    /// @param from The account transferring the tokens.\n    /// @param recipients The list of accounts to transfer the tokens to.\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\n        uint256 length = recipients.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        if (length == 0) return;\n\n        uint256 balance = s.balances[from];\n\n        uint256 totalValue;\n        uint256 selfTransferTotalValue;\n        for (uint256 i; i < length; ++i) {\n            address to = recipients[i];\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\n\n            uint256 value = values[i];\n            if (value != 0) {\n                unchecked {\n                    uint256 newTotalValue = totalValue + value;\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\n                    totalValue = newTotalValue;\n                    if (from != to) {\n                        s.balances[to] += value;\n                    } else {\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\n                    }\n                }\n            }\n            emit Transfer(from, to, value);\n        }\n\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\n            unchecked {\n                uint256 newBalance = balance - totalValue;\n                // balance must be sufficient, including self-transfers\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\n            }\n        }\n    }\n\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\n    /// @dev Emits a {Transfer} event for each transfer.\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n    /// @param sender The message sender.\n    /// @param from The account transferring the tokens.\n    /// @param recipients The list of accounts to transfer the tokens to.\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\n        uint256 length = recipients.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        if (length == 0) return;\n\n        uint256 balance = s.balances[from];\n\n        uint256 totalValue;\n        uint256 selfTransferTotalValue;\n        for (uint256 i; i < length; ++i) {\n            address to = recipients[i];\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\n\n            uint256 value = values[i];\n\n            if (value != 0) {\n                unchecked {\n                    uint256 newTotalValue = totalValue + value;\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\n                    totalValue = newTotalValue;\n                    if (from != to) {\n                        s.balances[to] += value;\n                    } else {\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\n                    }\n                }\n            }\n\n            emit Transfer(from, to, value);\n\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\n                unchecked {\n                    uint256 newBalance = balance - totalValue;\n                    // balance must be sufficient, including self-transfers\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\n                }\n            }\n        }\n\n        if (from != sender) {\n            s.decreaseAllowance(from, sender, totalValue);\n        }\n    }\n\n    //================================================= Safe Transfers ==================================================//\n\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @param from The account transferring the tokens.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\n        s.transfer(from, to, value);\n        if (to.hasBytecode()) {\n            _callOnERC20Received(from, from, to, value, data);\n        }\n    }\n\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n    /// @param sender The message sender.\n    /// @param from The account transferring the tokens.\n    /// @param to The account to transfer the tokens to.\n    /// @param value The amount of tokens to transfer.\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\n        s.transferFrom(sender, from, to, value);\n        if (to.hasBytecode()) {\n            _callOnERC20Received(sender, from, to, value, data);\n        }\n    }\n\n    //================================================= Minting ==================================================//\n\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\n    /// @param to The account to mint the tokens to.\n    /// @param value The amount of tokens to mint.\n    function mint(Layout storage s, address to, uint256 value) internal {\n        if (to == address(0)) revert ERC20MintToAddressZero();\n        if (value != 0) {\n            uint256 supply = s.supply;\n            unchecked {\n                uint256 newSupply = supply + value;\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\n                s.supply = newSupply;\n                s.balances[to] += value; // balance cannot overflow if supply does not\n            }\n        }\n        emit Transfer(address(0), to, value);\n    }\n\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\n    /// @param recipients The list of accounts to mint the tokens to.\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\n        uint256 length = recipients.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        if (length == 0) return;\n\n        uint256 totalValue;\n        for (uint256 i; i < length; ++i) {\n            address to = recipients[i];\n            if (to == address(0)) revert ERC20MintToAddressZero();\n\n            uint256 value = values[i];\n            if (value != 0) {\n                unchecked {\n                    uint256 newTotalValue = totalValue + value;\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\n                    totalValue = newTotalValue;\n                    s.balances[to] += value; // balance cannot overflow if supply does not\n                }\n            }\n            emit Transfer(address(0), to, value);\n        }\n\n        if (totalValue != 0) {\n            unchecked {\n                uint256 supply = s.supply;\n                uint256 newSupply = supply + totalValue;\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\n                s.supply = newSupply;\n            }\n        }\n    }\n\n    //================================================= Burning ==================================================//\n\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\n    /// @param from The account burning the tokens.\n    /// @param value The amount of tokens to burn.\n    function burn(Layout storage s, address from, uint256 value) internal {\n        if (value != 0) {\n            uint256 balance = s.balances[from];\n            unchecked {\n                uint256 newBalance = balance - value;\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\n                s.balances[from] = newBalance;\n                s.supply -= value; // will not underflow if balance does not\n            }\n        }\n\n        emit Transfer(from, address(0), value);\n    }\n\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n    /// @param sender The message sender.\n    /// @param from The account to burn the tokens from.\n    /// @param value The amount of tokens to burn.\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\n        if (from != sender) {\n            s.decreaseAllowance(from, sender, value);\n        }\n        s.burn(from, value);\n    }\n\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\n    ///  at least the corresponding `value` of allowance by this `owner`.\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\n    /// @param sender The message sender.\n    /// @param owners The list of accounts to burn the tokens from.\n    /// @param values The list of amounts of tokens to burn.\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\n        uint256 length = owners.length;\n        if (length != values.length) revert InconsistentArrayLengths();\n\n        if (length == 0) return;\n\n        uint256 totalValue;\n        for (uint256 i; i < length; ++i) {\n            address from = owners[i];\n            uint256 value = values[i];\n\n            if (from != sender) {\n                s.decreaseAllowance(from, sender, value);\n            }\n\n            if (value != 0) {\n                uint256 balance = s.balances[from];\n                unchecked {\n                    uint256 newBalance = balance - value;\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\n                    s.balances[from] = newBalance;\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\n                }\n            }\n\n            emit Transfer(from, address(0), value);\n        }\n\n        if (totalValue != 0) {\n            unchecked {\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\n            }\n        }\n    }\n\n    /// @notice Gets the total token supply.\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\n    /// @return supply The total token supply.\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\n        return s.supply;\n    }\n\n    /// @notice Gets an account balance.\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\n    /// @param owner The account whose balance will be returned.\n    /// @return balance The account balance.\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\n        return s.balances[owner];\n    }\n\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\n    /// @param owner The account that has granted an allowance to `spender`.\n    /// @param spender The account that was granted an allowance by `owner`.\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\n        return s.allowances[owner][spender];\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n    /// @param sender The message sender.\n    /// @param from Previous token owner.\n    /// @param to New token owner.\n    /// @param value The value transferred.\n    /// @param data Optional data to send along with the receiver contract call.\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\n    }\n}\n"},"contracts/token/ERC20/preset/ERC20FixedSupply.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../../../token/ERC20/libraries/ERC20Storage.sol\";\nimport {ERC20} from \"./../ERC20.sol\";\nimport {ERC20Detailed} from \"./../ERC20Detailed.sol\";\nimport {ERC20Metadata} from \"./../ERC20Metadata.sol\";\nimport {ERC20Permit} from \"./../ERC20Permit.sol\";\nimport {ERC20SafeTransfers} from \"./../ERC20SafeTransfers.sol\";\nimport {ERC20BatchTransfers} from \"./../ERC20BatchTransfers.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).\ncontract ERC20FixedSupply is\n    ERC20,\n    ERC20Detailed,\n    ERC20Metadata,\n    ERC20Permit,\n    ERC20SafeTransfers,\n    ERC20BatchTransfers,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    using ERC20Storage for ERC20Storage.Layout;\n\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        uint8 tokenDecimals,\n        address[] memory holders,\n        uint256[] memory allocations,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {\n        ERC20Storage.layout().batchMint(holders, allocations);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/preset/ERC20MintBurn.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20} from \"./../ERC20.sol\";\nimport {ERC20Detailed} from \"./../ERC20Detailed.sol\";\nimport {ERC20Metadata} from \"./../ERC20Metadata.sol\";\nimport {ERC20Permit} from \"./../ERC20Permit.sol\";\nimport {ERC20SafeTransfers} from \"./../ERC20SafeTransfers.sol\";\nimport {ERC20BatchTransfers} from \"./../ERC20BatchTransfers.sol\";\nimport {ERC20Mintable} from \"./../ERC20Mintable.sol\";\nimport {ERC20Burnable} from \"./../ERC20Burnable.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version).\ncontract ERC20MintBurn is\n    ERC20,\n    ERC20Detailed,\n    ERC20Metadata,\n    ERC20Permit,\n    ERC20SafeTransfers,\n    ERC20BatchTransfers,\n    ERC20Mintable,\n    ERC20Burnable,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        uint8 tokenDecimals,\n        IForwarderRegistry forwarderRegistry\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../../../../token/ERC20/libraries/ERC20Storage.sol\";\nimport {ERC20DetailedStorage} from \"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\";\nimport {ERC20MetadataStorage} from \"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\";\nimport {ERC20PermitStorage} from \"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC20Base} from \"./../../base/ERC20Base.sol\";\nimport {ERC20DetailedBase} from \"./../../base/ERC20DetailedBase.sol\";\nimport {ERC20MetadataBase} from \"./../../base/ERC20MetadataBase.sol\";\nimport {ERC20PermitBase} from \"./../../base/ERC20PermitBase.sol\";\nimport {ERC20SafeTransfersBase} from \"./../../base/ERC20SafeTransfersBase.sol\";\nimport {ERC20BatchTransfersBase} from \"./../../base/ERC20BatchTransfersBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (proxied version).\ncontract ERC20FixedSupplyProxied is\n    ERC20Base,\n    ERC20DetailedBase,\n    ERC20MetadataBase,\n    ERC20PermitBase,\n    ERC20SafeTransfersBase,\n    ERC20BatchTransfersBase,\n    InterfaceDetection,\n    TokenRecoveryBase,\n    ContractOwnershipBase,\n    ForwarderRegistryContext\n{\n    using ERC20Storage for ERC20Storage.Layout;\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        uint8 tokenDecimals,\n        address[] calldata holders,\n        uint256[] calldata allocations\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC20Storage.init();\n        ERC20Storage.initERC20BatchTransfers();\n        ERC20Storage.initERC20SafeTransfers();\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\n        ERC20MetadataStorage.init();\n        ERC20PermitStorage.init();\n        ERC20Storage.layout().batchMint(holders, allocations);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC20Storage} from \"./../../../../token/ERC20/libraries/ERC20Storage.sol\";\nimport {ERC20DetailedStorage} from \"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\";\nimport {ERC20MetadataStorage} from \"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\";\nimport {ERC20PermitStorage} from \"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC20Base} from \"./../../base/ERC20Base.sol\";\nimport {ERC20DetailedBase} from \"./../../base/ERC20DetailedBase.sol\";\nimport {ERC20MetadataBase} from \"./../../base/ERC20MetadataBase.sol\";\nimport {ERC20PermitBase} from \"./../../base/ERC20PermitBase.sol\";\nimport {ERC20SafeTransfersBase} from \"./../../base/ERC20SafeTransfersBase.sol\";\nimport {ERC20BatchTransfersBase} from \"./../../base/ERC20BatchTransfersBase.sol\";\nimport {ERC20MintableBase} from \"./../../base/ERC20MintableBase.sol\";\nimport {ERC20BurnableBase} from \"./../../base/ERC20BurnableBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version).\ncontract ERC20MintBurnProxied is\n    ERC20Base,\n    ERC20DetailedBase,\n    ERC20PermitBase,\n    ERC20MetadataBase,\n    ERC20SafeTransfersBase,\n    ERC20BatchTransfersBase,\n    ERC20MintableBase,\n    ERC20BurnableBase,\n    AccessControlBase,\n    InterfaceDetection,\n    TokenRecoveryBase,\n    ContractOwnershipBase,\n    ForwarderRegistryContext\n{\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC20Storage.init();\n        ERC20Storage.initERC20BatchTransfers();\n        ERC20Storage.initERC20SafeTransfers();\n        ERC20Storage.initERC20Mintable();\n        ERC20Storage.initERC20Burnable();\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\n        ERC20MetadataStorage.init();\n        ERC20PermitStorage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/base/ERC721Base.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721} from \"./../interfaces/IERC721.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\nabstract contract ERC721Base is IERC721, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n\n    /// @inheritdoc IERC721\n    function approve(address to, uint256 tokenId) external virtual {\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function setApprovalForAll(address operator, bool approved) external virtual {\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC721\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\n    }\n\n    /// @inheritdoc IERC721\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\n        return ERC721Storage.layout().balanceOf(owner);\n    }\n\n    /// @inheritdoc IERC721\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\n        return ERC721Storage.layout().ownerOf(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\n        return ERC721Storage.layout().getApproved(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721BatchTransferBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721BatchTransfer} from \"./../interfaces/IERC721BatchTransfer.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n\n    /// @inheritdoc IERC721BatchTransfer\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721BatchTransfer} from \"./../interfaces/IERC721BatchTransfer.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {OperatorFiltererStorage} from \"./../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    /// @inheritdoc IERC721BatchTransfer\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721BurnableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Burnable} from \"./../interfaces/IERC721Burnable.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n\n    /// @inheritdoc IERC721Burnable\n    function burnFrom(address from, uint256 tokenId) external virtual {\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\n    }\n\n    /// @inheritdoc IERC721Burnable\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721DeliverableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Deliverable} from \"./../interfaces/IERC721Deliverable.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\n    bytes32 private constant _MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC721Deliverable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().deliver(recipients, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Deliverable} from \"./../interfaces/IERC721Deliverable.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\n    bytes32 private constant _MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC721Deliverable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721MetadataBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Metadata} from \"./../interfaces/IERC721Metadata.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {TokenMetadataBase} from \"./../../metadata/base/TokenMetadataBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\n    using ERC721Storage for ERC721Storage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    /// @inheritdoc IERC721Metadata\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\n        return TokenMetadataBase.name();\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\n        return TokenMetadataBase.symbol();\n    }\n\n    /// @inheritdoc IERC721Metadata\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721MintableBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Mintable} from \"./../interfaces/IERC721Mintable.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function mint(address to, uint256 tokenId) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().mint(to, tokenId);\n    }\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\n    }\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().batchMint(to, tokenIds);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721MintableOnceBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Mintable} from \"./../interfaces/IERC721Mintable.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {AccessControlStorage} from \"./../../../access/libraries/AccessControlStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n/// @dev Note: This contract requires AccessControl.\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using AccessControlStorage for AccessControlStorage.Layout;\n\n    bytes32 public constant MINTER_ROLE = \"minter\";\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n    function mint(address to, uint256 tokenId) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().mintOnce(to, tokenId);\n    }\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\n    }\n\n    /// @inheritdoc IERC721Mintable\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\n    }\n\n    /// @notice Gets whether a token was burnt.\n    /// @param tokenId The token identifier.\n    /// @return tokenWasBurnt Whether the token was burnt.\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\n        return ERC721Storage.layout().wasBurnt(tokenId);\n    }\n}\n"},"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721} from \"./../interfaces/IERC721.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {OperatorFiltererStorage} from \"./../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\n/// @dev Note: This contract requires OperatorFilterer.\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\n    using ERC721Storage for ERC721Storage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    /// @inheritdoc IERC721\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\n    function approve(address to, uint256 tokenId) external virtual {\n        if (to != address(0)) {\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\n        }\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\n    function setApprovalForAll(address operator, bool approved) external virtual {\n        if (approved) {\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\n        }\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /// @inheritdoc IERC721\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\n        address sender = _msgSender();\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\n    }\n\n    /// @inheritdoc IERC721\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\n        return ERC721Storage.layout().balanceOf(owner);\n    }\n\n    /// @inheritdoc IERC721\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\n        return ERC721Storage.layout().ownerOf(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\n        return ERC721Storage.layout().getApproved(tokenId);\n    }\n\n    /// @inheritdoc IERC721\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\n    }\n}\n"},"contracts/token/ERC721/ERC721.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721Base} from \"./base/ERC721Base.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721 is ERC721Base, InterfaceDetection {\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\n    constructor() {\n        ERC721Storage.init();\n    }\n}\n"},"contracts/token/ERC721/ERC721BatchTransfer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721BatchTransferBase} from \"./base/ERC721BatchTransferBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721BatchTransfer is ERC721BatchTransferBase {\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\n    constructor() {\n        ERC721Storage.initERC721BatchTransfer();\n    }\n}\n"},"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\n    constructor() {\n        ERC721Storage.initERC721BatchTransfer();\n    }\n}\n"},"contracts/token/ERC721/ERC721Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721BurnableBase} from \"./base/ERC721BurnableBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721Burnable is ERC721BurnableBase {\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\n    constructor() {\n        ERC721Storage.initERC721Burnable();\n    }\n}\n"},"contracts/token/ERC721/ERC721Deliverable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721DeliverableBase} from \"./base/ERC721DeliverableBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n    constructor() {\n        ERC721Storage.initERC721Deliverable();\n    }\n}\n"},"contracts/token/ERC721/ERC721DeliverableOnce.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721DeliverableOnceBase} from \"./base/ERC721DeliverableOnceBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721DeliverableOnce is ERC721DeliverableOnceBase, AccessControl {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n    constructor() {\n        ERC721Storage.initERC721Deliverable();\n    }\n}\n"},"contracts/token/ERC721/ERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ITokenMetadataResolver} from \"./../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {TokenMetadataStorage} from \"./../metadata/libraries/TokenMetadataStorage.sol\";\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721MetadataBase} from \"./base/ERC721MetadataBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721Metadata is ERC721MetadataBase {\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\n    /// @param name The name of the token.\n    /// @param symbol The symbol of the token.\n    /// @param metadataResolver The address of the metadata resolver contract.\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\n        ERC721Storage.initERC721Metadata();\n    }\n}\n"},"contracts/token/ERC721/ERC721Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721MintableBase} from \"./base/ERC721MintableBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n    constructor() {\n        ERC721Storage.initERC721Mintable();\n    }\n}\n"},"contracts/token/ERC721/ERC721MintableOnce.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {ERC721MintableOnceBase} from \"./base/ERC721MintableOnceBase.sol\";\nimport {AccessControl} from \"./../../access/AccessControl.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721MintableOnce is ERC721MintableOnceBase, AccessControl {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n    constructor() {\n        ERC721Storage.initERC721Mintable();\n    }\n}\n"},"contracts/token/ERC721/ERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC721Receiver} from \"./interfaces/IERC721Receiver.sol\";\nimport {InterfaceDetectionStorage} from \"./../../introspection/libraries/InterfaceDetectionStorage.sol\";\nimport {InterfaceDetection} from \"./../../introspection/InterfaceDetection.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721Receiver is IERC721Receiver, InterfaceDetection {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Receiver.\n    constructor() {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Receiver).interfaceId, true);\n    }\n}\n"},"contracts/token/ERC721/ERC721WithOperatorFilterer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IOperatorFilterRegistry} from \"./../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721Storage} from \"./libraries/ERC721Storage.sol\";\nimport {OperatorFiltererStorage} from \"./../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ERC721WithOperatorFiltererBase} from \"./base/ERC721WithOperatorFiltererBase.sol\";\nimport {OperatorFiltererBase} from \"./../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\n        ERC721Storage.init();\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\n    }\n}\n"},"contracts/token/ERC721/errors/ERC721Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when trying to approve oneself.\n/// @param account The account trying to approve itself.\nerror ERC721SelfApproval(address account);\n\n/// @notice Thrown when trying to approveForAll oneself.\n/// @param account The account trying to approveForAll itself.\nerror ERC721SelfApprovalForAll(address account);\n\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\n/// @param sender The message sender.\n/// @param tokenId The identifier of the token.\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\n\n/// @notice Thrown when transferring a token to the zero address.\nerror ERC721TransferToAddressZero();\n\n/// @notice Thrown when a token does not exist but is required to.\n/// @param tokenId The identifier of the token that was checked.\nerror ERC721NonExistingToken(uint256 tokenId);\n\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\n/// @param sender The message sender.\n/// @param tokenId The identifier of the token.\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\n\n/// @notice Thrown when a token is not owned by the expected account.\n/// @param account The account that was expected to own the token.\n/// @param tokenId The identifier of the token.\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\n\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\n/// @param recipient The recipient contract.\n/// @param tokenId The identifier of the token.\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\n\n/// @notice Thrown when querying the balance of the zero address.\nerror ERC721BalanceOfAddressZero();\n"},"contracts/token/ERC721/errors/ERC721MintableErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when minting a token to the zero address.\nerror ERC721MintToAddressZero();\n\n/// @notice Thrown when minting a token that already exists.\n/// @param tokenId The identifier of the token that already exists.\nerror ERC721ExistingToken(uint256 tokenId);\n"},"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\n/// @param tokenId The identifier of the token that has been burnt before.\nerror ERC721BurntToken(uint256 tokenId);\n"},"contracts/token/ERC721/events/ERC721Events.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Emitted when a token is transferred.\n/// @param from The previous token owner.\n/// @param to The new token owner.\n/// @param tokenId The transferred token identifier.\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n/// @notice Emitted when a single token approval is set.\n/// @param owner The token owner.\n/// @param approved The approved address.\n/// @param tokenId The approved token identifier.\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n/// @notice Emitted when an approval for all tokens is set or unset.\n/// @param owner The tokens owner.\n/// @param operator The approved address.\n/// @param approved True when then approval is set, false when it is unset.\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n"},"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721BatchTransferBase} from \"./../base/ERC721BatchTransferBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC721BatchTransferFacet is ERC721BatchTransferBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721BatchTransferStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721BatchTransfer();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \"./../base/ERC721BatchTransferWithOperatorFiltererBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}.\ncontract ERC721BatchTransferWithOperatorFiltererFacet is ERC721BatchTransferWithOperatorFiltererBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721BatchTransferStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721BatchTransfer();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721BurnableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721BurnableBase} from \"./../base/ERC721BurnableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC721BurnableFacet is ERC721BurnableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721BurnableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721Burnable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721DeliverableBase} from \"./../base/ERC721DeliverableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\ncontract ERC721DeliverableFacet is ERC721DeliverableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721DeliverableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721Deliverable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721DeliverableOnceBase} from \"./../base/ERC721DeliverableOnceBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\ncontract ERC721DeliverableOnceFacet is ERC721DeliverableOnceBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721DeliverableOnceStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721Deliverable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721Facet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721Base} from \"./../base/ERC721Base.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\ncontract ERC721Facet is ERC721Base, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721Storage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721MetadataFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {TokenMetadataStorage} from \"./../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ERC721MetadataBase} from \"./../base/ERC721MetadataBase.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\ncontract ERC721MetadataFacet is ERC721MetadataBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Initializes the storage with the contract metadata.\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param name The name of the token.\n    /// @param symbol The symbol of the token.\n    /// @param metadataResolver The address of the metadata resolver contract.\n    function initERC721MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\n        ERC721Storage.initERC721Metadata();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721MintableFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721MintableBase} from \"./../base/ERC721MintableBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\ncontract ERC721MintableFacet is ERC721MintableBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721MintableStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721Mintable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721MintableOnceBase} from \"./../base/ERC721MintableOnceBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\ncontract ERC721MintableOnceFacet is ERC721MintableOnceBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721MintableOnceStorage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.initERC721Mintable();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC721Storage} from \"./../libraries/ERC721Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC721WithOperatorFiltererBase} from \"./../base/ERC721WithOperatorFiltererBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\ncontract ERC721WithOperatorFiltererFacet is ERC721WithOperatorFiltererBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC721Storage() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC721Storage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/interfaces/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\ninterface IERC721 {\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\n    /// @dev Note: There can only be one approved address per token at a given time.\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\n    /// @dev Reverts if `tokenId` does not exist.\n    /// @dev Reverts if `to` is the token owner.\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\n    /// @dev Emits an {Approval} event.\n    /// @param to The address to approve, or the zero address to remove any existing approval.\n    /// @param tokenId The token identifier to give approval for.\n    function approve(address to, uint256 tokenId) external;\n\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\n    /// @dev Reverts if the sender is the same as `operator`.\n    /// @dev Emits an {ApprovalForAll} event.\n    /// @param operator The address to approve for all tokens.\n    /// @param approved True to set an approval for all tokens, false to unset it.\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Emits a {Transfer} event.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\n    /// @param tokenId The identifier of the token to transfer.\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /// @notice Safely transfers the ownership of a token to a recipient.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer.\n    /// @param tokenId The identifier of the token to transfer.\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /// @notice Safely transfers the ownership of a token to a recipient.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer.\n    /// @param tokenId The identifier of the token to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /// @notice Gets the balance of an address.\n    /// @dev Reverts if `owner` is the zero address.\n    /// @param owner The address to query the balance of.\n    /// @return balance The amount owned by the owner.\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /// @notice Gets the owner of a token.\n    /// @dev Reverts if `tokenId` does not exist.\n    /// @param tokenId The token identifier to query the owner of.\n    /// @return tokenOwner The owner of the token identifier.\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\n\n    /// @notice Gets the approved address for a token.\n    /// @dev Reverts if `tokenId` does not exist.\n    /// @param tokenId The token identifier to query the approval of.\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\n    function getApproved(uint256 tokenId) external view returns (address approved);\n\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\n    /// @param owner The address which gives the approval for all tokens.\n    /// @param operator The address which receives the approval for all tokens.\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\n}\n"},"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\ninterface IERC721BatchTransfer {\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\n    /// @dev Resets the token approval for each of `tokenIds`.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\n    /// @param from Current tokens owner.\n    /// @param to Address of the new token owner.\n    /// @param tokenIds Identifiers of the tokens to transfer.\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\n}\n"},"contracts/token/ERC721/interfaces/IERC721Burnable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\ninterface IERC721Burnable {\n    /// @notice Burns a token.\n    /// @dev Reverts if `tokenId` is not owned by `from`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\n    /// @param from The current token owner.\n    /// @param tokenId The identifier of the token to burn.\n    function burnFrom(address from, uint256 tokenId) external;\n\n    /// @notice Burns a batch of tokens.\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\n    /// @param from The current tokens owner.\n    /// @param tokenIds The identifiers of the tokens to burn.\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\n}\n"},"contracts/token/ERC721/interfaces/IERC721Deliverable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\ninterface IERC721Deliverable {\n    /// @notice Unsafely mints tokens to multiple recipients.\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\n    /// @dev Reverts if one of `recipients` is the zero address.\n    /// @dev Reverts if one of `tokenIds` already exists.\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n    /// @param recipients Addresses of the new tokens owners.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\n}\n"},"contracts/token/ERC721/interfaces/IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\ninterface IERC721Metadata {\n    /// @notice Gets the name of the token. E.g. \"My Token\".\n    /// @return tokenName The name of the token.\n    function name() external view returns (string memory tokenName);\n\n    /// @notice Gets the symbol of the token. E.g. \"TOK\".\n    /// @return tokenSymbol The symbol of the token.\n    function symbol() external view returns (string memory tokenSymbol);\n\n    /// @notice Gets the metadata URI for a token identifier.\n    /// @dev Reverts if `tokenId` does not exist.\n    /// @param tokenId The token identifier.\n    /// @return uri The metadata URI for the token identifier.\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\n}\n"},"contracts/token/ERC721/interfaces/IERC721Mintable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\ninterface IERC721Mintable {\n    /// @notice Unsafely mints a token.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `tokenId` already exists.\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    function mint(address to, uint256 tokenId) external;\n\n    /// @notice Safely mints a token.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if `tokenId` already exists.\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    /// @param data Optional data to pass along to the receiver call.\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\n\n    /// @notice Unsafely mints a batch of tokens.\n    /// @dev Reverts if `to` is the zero address.\n    /// @dev Reverts if one of `tokenIds` already exists.\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\n    /// @param to Address of the new tokens owner.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function batchMint(address to, uint256[] calldata tokenIds) external;\n}\n"},"contracts/token/ERC721/interfaces/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\ninterface IERC721Receiver {\n    /// @notice Handles the receipt of an ERC721 token.\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\n    /// @dev Note: The ERC721 contract address is always the message sender.\n    /// @param operator The initiator of the safe transfer.\n    /// @param from The previous token owner.\n    /// @param tokenId The token identifier.\n    /// @param data Optional additional data with no specified format.\n    /// @return magicValue `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` (`0x150b7a02`) to accept, any other value to refuse.\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\n}\n"},"contracts/token/ERC721/libraries/ERC721Storage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n// solhint-disable-next-line max-line-length\nimport {\n    ERC721SelfApproval,\n    ERC721SelfApprovalForAll,\n    ERC721NonApprovedForApproval,\n    ERC721TransferToAddressZero,\n    ERC721NonExistingToken,\n    ERC721NonApprovedForTransfer,\n    ERC721NonOwnedToken,\n    ERC721SafeTransferRejected,\n    ERC721BalanceOfAddressZero\n} from \"./../errors/ERC721Errors.sol\";\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \"./../errors/ERC721MintableErrors.sol\";\nimport {ERC721BurntToken} from \"./../errors/ERC721MintableOnceErrors.sol\";\nimport {InconsistentArrayLengths} from \"./../../../CommonErrors.sol\";\nimport {Transfer, Approval, ApprovalForAll} from \"./../events/ERC721Events.sol\";\nimport {IERC721} from \"./../interfaces/IERC721.sol\";\nimport {IERC721BatchTransfer} from \"./../interfaces/IERC721BatchTransfer.sol\";\nimport {IERC721Metadata} from \"./../interfaces/IERC721Metadata.sol\";\nimport {IERC721Mintable} from \"./../interfaces/IERC721Mintable.sol\";\nimport {IERC721Deliverable} from \"./../interfaces/IERC721Deliverable.sol\";\nimport {IERC721Burnable} from \"./../interfaces/IERC721Burnable.sol\";\nimport {IERC721Receiver} from \"./../interfaces/IERC721Receiver.sol\";\nimport {Address} from \"./../../../utils/libraries/Address.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC721Storage {\n    using Address for address;\n    using ERC721Storage for ERC721Storage.Layout;\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        mapping(uint256 => uint256) owners;\n        mapping(address => uint256) balances;\n        mapping(uint256 => address) approvals;\n        mapping(address => mapping(address => bool)) operators;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.token.ERC721.ERC721.storage\")) - 1);\n\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\n\n    // Single token approval flag\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\n\n    // Burnt token magic value\n    // This magic number is used as the owner's value to indicate that the token has been burnt\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\n    function init() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\n    function initERC721BatchTransfer() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\n    function initERC721Metadata() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n    function initERC721Mintable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n    function initERC721Deliverable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\n    }\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\n    function initERC721Burnable() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\n    }\n\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\n    /// @dev Emits an {Approval} event.\n    /// @param sender The message sender.\n    /// @param to The address to approve, or the zero address to remove any existing approval.\n    /// @param tokenId The token identifier to give approval for.\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\n        uint256 owner = s.owners[tokenId];\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n        address ownerAddress = _tokenOwner(owner);\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\n        if (to == address(0)) {\n            if (_tokenHasApproval(owner)) {\n                // remove the approval bit if it is present\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\n            }\n        } else {\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\n            if (owner != ownerWithApprovalBit) {\n                // add the approval bit if it is not present\n                s.owners[tokenId] = ownerWithApprovalBit;\n            }\n            s.approvals[tokenId] = to;\n        }\n        emit Approval(ownerAddress, to, tokenId);\n    }\n\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\n    /// @dev Emits an {ApprovalForAll} event.\n    /// @param sender The message sender.\n    /// @param operator The address to approve for all tokens.\n    /// @param approved True to set an approval for all tokens, false to unset it.\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\n        s.operators[sender][operator] = approved;\n        emit ApprovalForAll(sender, operator, approved);\n    }\n\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Emits a {Transfer} event.\n    /// @param sender The message sender.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer.\n    /// @param tokenId The identifier of the token to transfer.\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\n        if (to == address(0)) revert ERC721TransferToAddressZero();\n\n        uint256 owner = s.owners[tokenId];\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\n\n        if (!_isOperatable(s, from, sender)) {\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\n        }\n\n        s.owners[tokenId] = uint256(uint160(to));\n        if (from != to) {\n            unchecked {\n                // cannot underflow as balance is verified through ownership\n                --s.balances[from];\n                //  cannot overflow as supply cannot overflow\n                ++s.balances[to];\n            }\n        }\n\n        emit Transfer(from, to, tokenId);\n    }\n\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @param sender The message sender.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer.\n    /// @param tokenId The identifier of the token to transfer.\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\n        s.transferFrom(sender, from, to, tokenId);\n        if (to.hasBytecode()) {\n            _callOnERC721Received(sender, from, to, tokenId, \"\");\n        }\n    }\n\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Resets the token approval for `tokenId`.\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event.\n    /// @param sender The message sender.\n    /// @param from The current token owner.\n    /// @param to The recipient of the token transfer.\n    /// @param tokenId The identifier of the token to transfer.\n    /// @param data Optional data to send along to a receiver contract.\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\n        s.transferFrom(sender, from, to, tokenId);\n        if (to.hasBytecode()) {\n            _callOnERC721Received(sender, from, to, tokenId, data);\n        }\n    }\n\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\n    /// @dev Resets the token approval for each of `tokenIds`.\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\n    /// @param sender The message sender.\n    /// @param from Current tokens owner.\n    /// @param to Address of the new token owner.\n    /// @param tokenIds Identifiers of the tokens to transfer.\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\n        if (to == address(0)) revert ERC721TransferToAddressZero();\n        bool operatable = _isOperatable(s, from, sender);\n\n        uint256 length = tokenIds.length;\n        for (uint256 i; i < length; ++i) {\n            uint256 tokenId = tokenIds[i];\n            uint256 owner = s.owners[tokenId];\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\n            if (!operatable) {\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\n            }\n            s.owners[tokenId] = uint256(uint160(to));\n            emit Transfer(from, to, tokenId);\n        }\n\n        if (from != to && length != 0) {\n            unchecked {\n                // cannot underflow as balance is verified through ownership\n                s.balances[from] -= length;\n                // cannot overflow as supply cannot overflow\n                s.balances[to] += length;\n            }\n        }\n    }\n\n    /// @notice Unsafely mints a token.\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n    /// @dev Emits a {Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\n        if (to == address(0)) revert ERC721MintToAddressZero();\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\n\n        s.owners[tokenId] = uint256(uint160(to));\n\n        unchecked {\n            // cannot overflow due to the cost of minting individual tokens\n            ++s.balances[to];\n        }\n\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    /// @notice Safely mints a token.\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    /// @param data Optional data to pass along to the receiver call.\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\n        s.mint(to, tokenId);\n        if (to.hasBytecode()) {\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\n        }\n    }\n\n    /// @notice Unsafely mints a batch of tokens.\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\n    /// @param to Address of the new tokens owner.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\n        if (to == address(0)) revert ERC721MintToAddressZero();\n\n        uint256 length = tokenIds.length;\n        for (uint256 i; i < length; ++i) {\n            uint256 tokenId = tokenIds[i];\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\n\n            s.owners[tokenId] = uint256(uint160(to));\n            emit Transfer(address(0), to, tokenId);\n        }\n\n        unchecked {\n            s.balances[to] += length;\n        }\n    }\n\n    /// @notice Unsafely mints tokens to multiple recipients.\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n    /// @param recipients Addresses of the new tokens owners.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\n        uint256 length = recipients.length;\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            s.mint(recipients[i], tokenIds[i]);\n        }\n    }\n\n    /// @notice Unsafely mints a token once.\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n    /// @dev Emits a {Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\n        if (to == address(0)) revert ERC721MintToAddressZero();\n\n        uint256 owner = s.owners[tokenId];\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\n\n        s.owners[tokenId] = uint256(uint160(to));\n\n        unchecked {\n            // cannot overflow due to the cost of minting individual tokens\n            ++s.balances[to];\n        }\n\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    /// @notice Safely mints a token once.\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n    /// @dev Emits a {Transfer} event from the zero address.\n    /// @param to Address of the new token owner.\n    /// @param tokenId Identifier of the token to mint.\n    /// @param data Optional data to pass along to the receiver call.\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\n        s.mintOnce(to, tokenId);\n        if (to.hasBytecode()) {\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\n        }\n    }\n\n    /// @notice Unsafely mints a batch of tokens once.\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\n    /// @param to Address of the new tokens owner.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\n        if (to == address(0)) revert ERC721MintToAddressZero();\n\n        uint256 length = tokenIds.length;\n        for (uint256 i; i < length; ++i) {\n            uint256 tokenId = tokenIds[i];\n            uint256 owner = s.owners[tokenId];\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\n\n            s.owners[tokenId] = uint256(uint160(to));\n\n            emit Transfer(address(0), to, tokenId);\n        }\n\n        unchecked {\n            s.balances[to] += length;\n        }\n    }\n\n    /// @notice Unsafely mints tokens to multiple recipients once.\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n    /// @param recipients Addresses of the new tokens owners.\n    /// @param tokenIds Identifiers of the tokens to mint.\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\n        uint256 length = recipients.length;\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\n        for (uint256 i; i < length; ++i) {\n            address to = recipients[i];\n            if (to == address(0)) revert ERC721MintToAddressZero();\n\n            uint256 tokenId = tokenIds[i];\n            uint256 owner = s.owners[tokenId];\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\n\n            s.owners[tokenId] = uint256(uint160(to));\n            unchecked {\n                ++s.balances[to];\n            }\n\n            emit Transfer(address(0), to, tokenId);\n        }\n    }\n\n    /// @notice Burns a token by a sender.\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\n    /// @param sender The message sender.\n    /// @param from The current token owner.\n    /// @param tokenId The identifier of the token to burn.\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\n        uint256 owner = s.owners[tokenId];\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\n\n        if (!_isOperatable(s, from, sender)) {\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\n        }\n\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\n\n        unchecked {\n            // cannot underflow as balance is verified through TOKEN ownership\n            --s.balances[from];\n        }\n        emit Transfer(from, address(0), tokenId);\n    }\n\n    /// @notice Burns a batch of tokens by a sender.\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\n    /// @param sender The message sender.\n    /// @param from The current tokens owner.\n    /// @param tokenIds The identifiers of the tokens to burn.\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\n        bool operatable = _isOperatable(s, from, sender);\n\n        uint256 length = tokenIds.length;\n        for (uint256 i; i < length; ++i) {\n            uint256 tokenId = tokenIds[i];\n            uint256 owner = s.owners[tokenId];\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\n            if (!operatable) {\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\n            }\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\n            emit Transfer(from, address(0), tokenId);\n        }\n\n        if (length != 0) {\n            unchecked {\n                s.balances[from] -= length;\n            }\n        }\n    }\n\n    /// @notice Gets the balance of an address.\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\n    /// @param owner The address to query the balance of.\n    /// @return balance The amount owned by the owner.\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\n        return s.balances[owner];\n    }\n\n    /// @notice Gets the owner of a token.\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @param tokenId The token identifier to query the owner of.\n    /// @return tokenOwner The owner of the token.\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\n        uint256 owner = s.owners[tokenId];\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n        return _tokenOwner(owner);\n    }\n\n    /// @notice Gets the approved address for a token.\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n    /// @param tokenId The token identifier to query the approval of.\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\n        uint256 owner = s.owners[tokenId];\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\n        if (_tokenHasApproval(owner)) {\n            return s.approvals[tokenId];\n        } else {\n            return address(0);\n        }\n    }\n\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\n    /// @param owner The address which gives the approval for all tokens.\n    /// @param operator The address which receives the approval for all tokens.\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\n        return s.operators[owner][operator];\n    }\n\n    /// @notice Gets whether a token was burnt.\n    /// @param tokenId The token identifier.\n    /// @return tokenWasBurnt Whether the token was burnt.\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\n        return _tokenWasBurnt(s.owners[tokenId]);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n    /// @param sender The message sender.\n    /// @param from Previous token owner.\n    /// @param to New token owner.\n    /// @param tokenId Identifier of the token transferred.\n    /// @param data Optional data to send along with the receiver contract call.\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\n    }\n\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\n    /// @param owner The token owner.\n    /// @param account The account to check the operatability of.\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\n        return (owner == account) || s.operators[owner][account];\n    }\n\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\n        return address(uint160(owner));\n    }\n\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\n        return uint160(owner) != 0;\n    }\n\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\n        return owner == BURNT_TOKEN_OWNER_VALUE;\n    }\n\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\n    }\n}\n"},"contracts/token/ERC721/preset/ERC721Full.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721WithOperatorFilterer} from \"./../ERC721WithOperatorFilterer.sol\";\nimport {ERC721BatchTransferWithOperatorFilterer} from \"./../ERC721BatchTransferWithOperatorFilterer.sol\";\nimport {ERC721Metadata} from \"./../ERC721Metadata.sol\";\nimport {ERC721Mintable} from \"./../ERC721Mintable.sol\";\nimport {ERC721Deliverable} from \"./../ERC721Deliverable.sol\";\nimport {ERC2981} from \"./../../royalty/ERC2981.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721Full is\n    ERC721WithOperatorFilterer,\n    ERC721BatchTransferWithOperatorFilterer,\n    ERC721Metadata,\n    ERC721Mintable,\n    ERC721Deliverable,\n    ERC2981,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    )\n        ContractOwnership(msg.sender)\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\n        ERC721WithOperatorFilterer(filterRegistry)\n        ForwarderRegistryContext(forwarderRegistry)\n    {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/preset/ERC721FullBurn.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721WithOperatorFilterer} from \"./../ERC721WithOperatorFilterer.sol\";\nimport {ERC721BatchTransferWithOperatorFilterer} from \"./../ERC721BatchTransferWithOperatorFilterer.sol\";\nimport {ERC721Metadata} from \"./../ERC721Metadata.sol\";\nimport {ERC721Mintable} from \"./../ERC721Mintable.sol\";\nimport {ERC721Deliverable} from \"./../ERC721Deliverable.sol\";\nimport {ERC721Burnable} from \"./../ERC721Burnable.sol\";\nimport {ERC2981} from \"./../../royalty/ERC2981.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721FullBurn is\n    ERC721WithOperatorFilterer,\n    ERC721BatchTransferWithOperatorFilterer,\n    ERC721Metadata,\n    ERC721Mintable,\n    ERC721Deliverable,\n    ERC721Burnable,\n    ERC2981,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    )\n        ContractOwnership(msg.sender)\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\n        ERC721WithOperatorFilterer(filterRegistry)\n        ForwarderRegistryContext(forwarderRegistry)\n    {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721WithOperatorFilterer} from \"./../ERC721WithOperatorFilterer.sol\";\nimport {ERC721BatchTransferWithOperatorFilterer} from \"./../ERC721BatchTransferWithOperatorFilterer.sol\";\nimport {ERC721Metadata} from \"./../ERC721Metadata.sol\";\nimport {ERC721MintableOnce} from \"./../ERC721MintableOnce.sol\";\nimport {ERC721DeliverableOnce} from \"./../ERC721DeliverableOnce.sol\";\nimport {ERC721Burnable} from \"./../ERC721Burnable.sol\";\nimport {ERC2981} from \"./../../royalty/ERC2981.sol\";\nimport {ContractOwnership} from \"./../../../access/ContractOwnership.sol\";\nimport {TokenRecovery} from \"./../../../security/TokenRecovery.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721FullMintOnceBurn is\n    ERC721WithOperatorFilterer,\n    ERC721BatchTransferWithOperatorFilterer,\n    ERC721Metadata,\n    ERC721MintableOnce,\n    ERC721DeliverableOnce,\n    ERC721Burnable,\n    ERC2981,\n    TokenRecovery,\n    ForwarderRegistryContext\n{\n    constructor(\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry,\n        IForwarderRegistry forwarderRegistry\n    )\n        ContractOwnership(msg.sender)\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\n        ERC721WithOperatorFilterer(filterRegistry)\n        ForwarderRegistryContext(forwarderRegistry)\n    {}\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721Storage} from \"./../../libraries/ERC721Storage.sol\";\nimport {ERC2981Storage} from \"./../../../royalty/libraries/ERC2981Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {OperatorFiltererStorage} from \"./../../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC721WithOperatorFiltererBase} from \"./../../base/ERC721WithOperatorFiltererBase.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\";\nimport {ERC721MetadataBase} from \"./../../base/ERC721MetadataBase.sol\";\nimport {ERC721MintableBase} from \"./../../base/ERC721MintableBase.sol\";\nimport {ERC721DeliverableBase} from \"./../../base/ERC721DeliverableBase.sol\";\nimport {ERC721BurnableBase} from \"./../../base/ERC721BurnableBase.sol\";\nimport {ERC2981Base} from \"./../../../royalty/base/ERC2981Base.sol\";\nimport {OperatorFiltererBase} from \"./../../../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721FullBurnProxied is\n    ERC721WithOperatorFiltererBase,\n    ERC721BatchTransferWithOperatorFiltererBase,\n    ERC721MetadataBase,\n    ERC721MintableBase,\n    ERC721DeliverableBase,\n    ERC721BurnableBase,\n    ERC2981Base,\n    OperatorFiltererBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    TokenRecoveryBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC721Storage.init();\n        ERC721Storage.initERC721BatchTransfer();\n        ERC721Storage.initERC721Metadata();\n        ERC721Storage.initERC721Mintable();\n        ERC721Storage.initERC721Deliverable();\n        ERC721Storage.initERC721Burnable();\n        ERC2981Storage.init();\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721Storage} from \"./../../libraries/ERC721Storage.sol\";\nimport {ERC2981Storage} from \"./../../../royalty/libraries/ERC2981Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {OperatorFiltererStorage} from \"./../../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC721WithOperatorFiltererBase} from \"./../../base/ERC721WithOperatorFiltererBase.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\";\nimport {ERC721MetadataBase} from \"./../../base/ERC721MetadataBase.sol\";\nimport {ERC721MintableOnceBase} from \"./../../base/ERC721MintableOnceBase.sol\";\nimport {ERC721DeliverableOnceBase} from \"./../../base/ERC721DeliverableOnceBase.sol\";\nimport {ERC721BurnableBase} from \"./../../base/ERC721BurnableBase.sol\";\nimport {ERC2981Base} from \"./../../../royalty/base/ERC2981Base.sol\";\nimport {OperatorFiltererBase} from \"./../../../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721FullMintOnceBurnProxied is\n    ERC721WithOperatorFiltererBase,\n    ERC721BatchTransferWithOperatorFiltererBase,\n    ERC721MetadataBase,\n    ERC721MintableOnceBase,\n    ERC721DeliverableOnceBase,\n    ERC721BurnableBase,\n    ERC2981Base,\n    OperatorFiltererBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    TokenRecoveryBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC721Storage.init();\n        ERC721Storage.initERC721BatchTransfer();\n        ERC721Storage.initERC721Metadata();\n        ERC721Storage.initERC721Mintable();\n        ERC721Storage.initERC721Deliverable();\n        ERC721Storage.initERC721Burnable();\n        ERC2981Storage.init();\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ITokenMetadataResolver} from \"./../../../metadata/interfaces/ITokenMetadataResolver.sol\";\nimport {IOperatorFilterRegistry} from \"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\";\nimport {ERC721Storage} from \"./../../libraries/ERC721Storage.sol\";\nimport {ERC2981Storage} from \"./../../../royalty/libraries/ERC2981Storage.sol\";\nimport {TokenMetadataStorage} from \"./../../../metadata/libraries/TokenMetadataStorage.sol\";\nimport {OperatorFiltererStorage} from \"./../../../royalty/libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {ERC721WithOperatorFiltererBase} from \"./../../base/ERC721WithOperatorFiltererBase.sol\";\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\";\nimport {ERC721MetadataBase} from \"./../../base/ERC721MetadataBase.sol\";\nimport {ERC721MintableBase} from \"./../../base/ERC721MintableBase.sol\";\nimport {ERC721DeliverableBase} from \"./../../base/ERC721DeliverableBase.sol\";\nimport {ERC2981Base} from \"./../../../royalty/base/ERC2981Base.sol\";\nimport {OperatorFiltererBase} from \"./../../../royalty/base/OperatorFiltererBase.sol\";\nimport {ContractOwnershipBase} from \"./../../../../access/base/ContractOwnershipBase.sol\";\nimport {AccessControlBase} from \"./../../../../access/base/AccessControlBase.sol\";\nimport {TokenRecoveryBase} from \"./../../../../security/base/TokenRecoveryBase.sol\";\nimport {InterfaceDetection} from \"./../../../../introspection/InterfaceDetection.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../../metatx/base/ForwarderRegistryContextBase.sol\";\nimport {ForwarderRegistryContext} from \"./../../../../metatx/ForwarderRegistryContext.sol\";\n\ncontract ERC721FullProxied is\n    ERC721WithOperatorFiltererBase,\n    ERC721BatchTransferWithOperatorFiltererBase,\n    ERC721MetadataBase,\n    ERC721MintableBase,\n    ERC721DeliverableBase,\n    ERC2981Base,\n    OperatorFiltererBase,\n    ContractOwnershipBase,\n    AccessControlBase,\n    TokenRecoveryBase,\n    InterfaceDetection,\n    ForwarderRegistryContext\n{\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\n\n    function init(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver metadataResolver,\n        IOperatorFilterRegistry filterRegistry\n    ) external {\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\n        ERC721Storage.init();\n        ERC721Storage.initERC721BatchTransfer();\n        ERC721Storage.initERC721Metadata();\n        ERC721Storage.initERC721Mintable();\n        ERC721Storage.initERC721Deliverable();\n        ERC2981Storage.init();\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/metadata/base/TokenMetadataBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ITokenMetadataResolver} from \"./../interfaces/ITokenMetadataResolver.sol\";\nimport {TokenMetadataStorage} from \"./../libraries/TokenMetadataStorage.sol\";\n\n/// @title TokenMetadataBase (proxiable version).\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\n/// @dev This contract is to be used via inheritance in a proxied implementation.\nabstract contract TokenMetadataBase {\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\n\n    /// @notice Gets the token name. E.g. \"My Token\".\n    /// @return tokenName The token name.\n    function name() public view virtual returns (string memory tokenName) {\n        return TokenMetadataStorage.layout().name();\n    }\n\n    /// @notice Gets the token symbol. E.g. \"TOK\".\n    /// @return tokenSymbol The token symbol.\n    function symbol() public view virtual returns (string memory tokenSymbol) {\n        return TokenMetadataStorage.layout().symbol();\n    }\n\n    /// @notice Gets the token metadata resolver address.\n    /// @return tokenMetadataResolver The token metadata resolver address.\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\n        return TokenMetadataStorage.layout().metadataResolver();\n    }\n}\n"},"contracts/token/metadata/errors/TokenMetadataErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when an account is not the metadata resolver but is required to.\n/// @param account The account that was checked.\nerror NotMetadataResolver(address account);\n"},"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ITokenMetadataResolver\n/// @notice Interface for Token Metadata Resolvers.\ninterface ITokenMetadataResolver {\n    /// @notice Gets the token metadata URI for a token.\n    /// @param tokenContract The token contract for which to retrieve the token URI.\n    /// @param tokenId The token identifier.\n    /// @return tokenURI The token metadata URI.\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\n}\n"},"contracts/token/metadata/libraries/TokenMetadataStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ITokenMetadataResolver} from \"./../interfaces/ITokenMetadataResolver.sol\";\nimport {ProxyInitialization} from \"./../../../proxy/libraries/ProxyInitialization.sol\";\n\nlibrary TokenMetadataStorage {\n    struct Layout {\n        string tokenName;\n        string tokenSymbol;\n        ITokenMetadataResolver tokenMetadataResolver;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.token.metadata.TokenMetadata.storage\")) - 1);\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.token.metadata.TokenMetadata.phase\")) - 1);\n\n    /// @notice Initializes the metadata storage (immutable version).\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\n    function constructorInit(\n        Layout storage s,\n        string memory tokenName,\n        string memory tokenSymbol,\n        ITokenMetadataResolver tokenMetadataResolver\n    ) internal {\n        s.tokenName = tokenName;\n        s.tokenSymbol = tokenSymbol;\n        s.tokenMetadataResolver = tokenMetadataResolver;\n    }\n\n    /// @notice Initializes the metadata storage (proxied version).\n    /// @notice Sets the proxy initialization phase to `1`.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param tokenName The token name.\n    /// @param tokenSymbol The token symbol.\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\n    function proxyInit(\n        Layout storage s,\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        ITokenMetadataResolver tokenMetadataResolver\n    ) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.tokenName = tokenName;\n        s.tokenSymbol = tokenSymbol;\n        s.tokenMetadataResolver = tokenMetadataResolver;\n    }\n\n    /// @notice Gets the name of the token.\n    /// @return tokenName The name of the token contract.\n    function name(Layout storage s) internal view returns (string memory tokenName) {\n        return s.tokenName;\n    }\n\n    /// @notice Gets the symbol of the token.\n    /// @return tokenSymbol The symbol of the token contract.\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\n        return s.tokenSymbol;\n    }\n\n    /// @notice Gets the address of the token metadata resolver.\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\n        return s.tokenMetadataResolver;\n    }\n\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\n    /// @param tokenContract The address of the token contract.\n    /// @param tokenId The ID of the token.\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/token/metadata/TokenMetadataResolverPerToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {InconsistentArrayLengths} from \"./../../CommonErrors.sol\";\nimport {ITokenMetadataResolver} from \"./interfaces/ITokenMetadataResolver.sol\";\nimport {AccessControlStorage} from \"./../../access/libraries/AccessControlStorage.sol\";\n\n/// @title TokenMetadataResolverPerToken.\n/// @notice Token Metadata Resolver which stores the metadata URI for each token.\n/// @notice Only minters of the target token contract can set the token metadata URI for this target contract.\ncontract TokenMetadataResolverPerToken is ITokenMetadataResolver {\n    using AccessControlStorage for address;\n\n    bytes32 public constant MINTER_ROLE = \"minter\";\n\n    mapping(address => mapping(uint256 => string)) public metadataURI;\n\n    /// @notice Sets the metadata URI for a token on a contract.\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\n    /// @param tokenContract The token contract on which to set the token URI.\n    /// @param tokenId The token identifier.\n    /// @param tokenURI The token metadata URI.\n    function setTokenURI(address tokenContract, uint256 tokenId, string calldata tokenURI) public virtual {\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\n        metadataURI[tokenContract][tokenId] = tokenURI;\n    }\n\n    /// @notice Sets the metadata URIs for a batch of tokens on a contract.\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\n    /// @param tokenContract The token contract on which to set the token URI.\n    /// @param tokenIds The token identifiers.\n    /// @param tokenURIs The token metadata URIs.\n    function batchSetTokenURI(address tokenContract, uint256[] calldata tokenIds, string[] calldata tokenURIs) public virtual {\n        uint256 length = tokenIds.length;\n        if (length != tokenURIs.length) {\n            revert InconsistentArrayLengths();\n        }\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\n\n        for (uint256 i; i < length; ++i) {\n            metadataURI[tokenContract][tokenIds[i]] = tokenURIs[i];\n        }\n    }\n\n    /// @notice Gets the token metadata URI for a token.\n    /// @param tokenContract The token contract for which to retrieve the token URI.\n    /// @param tokenId The token identifier.\n    /// @return tokenURI The token metadata URI.\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view virtual override returns (string memory tokenURI) {\n        return metadataURI[tokenContract][tokenId];\n    }\n}\n"},"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IERC1155MetadataSetter} from \"./../ERC1155/interfaces/IERC1155MetadataSetter.sol\";\nimport {TokenMetadataResolverPerToken} from \"./TokenMetadataResolverPerToken.sol\";\n\n/// @title TokenMetadataResolverPerTokenERC1155.\n/// @notice Token Metadata Resolver which stores the metadata URI for each token, for ERC1155 token contracts.\n/// @notice When a metadata URI is set, the target ERC1155 contract will be asked to emit a URI event.\n/// @notice Only minters of the target token contract can set the token metadata URI for this target contract.\ncontract TokenMetadataResolverPerTokenERC1155 is TokenMetadataResolverPerToken {\n    /// @inheritdoc TokenMetadataResolverPerToken\n    /// @dev The token contract emits a {URI} event.\n    function setTokenURI(address tokenContract, uint256 tokenId, string calldata tokenURI) public override {\n        super.setTokenURI(tokenContract, tokenId, tokenURI);\n        IERC1155MetadataSetter(tokenContract).setTokenURI(tokenId, tokenURI);\n    }\n\n    /// @inheritdoc TokenMetadataResolverPerToken\n    /// @dev The token contract emits a {URI} event for each token.\n    function batchSetTokenURI(address tokenContract, uint256[] calldata tokenIds, string[] calldata tokenURIs) public override {\n        super.batchSetTokenURI(tokenContract, tokenIds, tokenURIs);\n        IERC1155MetadataSetter(tokenContract).batchSetTokenURI(tokenIds, tokenURIs);\n    }\n}\n"},"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {ITokenMetadataResolver} from \"./interfaces/ITokenMetadataResolver.sol\";\nimport {LinkTokenInterface} from \"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\";\nimport {VRFV2WrapperInterface} from \"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Strings} from \"@openzeppelin/contracts/utils/Strings.sol\";\nimport {VRFV2WrapperConsumerBase} from \"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol\";\n\n/// @title TokenMetadataResolverRandomizedReveal.\n/// @notice Token Metadata Resolver with a reveal mechanism.\n/// @notice Before reveal, all the tokens have the same metadata URI. After reveal tokens have individual metadata URIs based on a random offset.\n/// @notice This resolver is designed to work with incremental token IDs NFTs starting at 0 and a fixed token supply.\ncontract TokenMetadataResolverRandomizedReveal is ITokenMetadataResolver, VRFV2WrapperConsumerBase {\n    using ContractOwnershipStorage for address;\n    using Strings for uint256;\n\n    enum RevealStatus {\n        NotRequested, // 0\n        Requested, // 1\n        Revealed // 2\n    }\n\n    mapping(address => string) public preRevealTokenMetadataURI; // tokenContract => pre-reveal token metadata URI\n    mapping(address => string) public postRevealBaseMetadataURI; // tokenContract => post-reveal base metadata URI\n    mapping(address => uint256) public tokenSupply; // tokenContract => token supply\n    mapping(address => RevealStatus) public revealStatus; // tokenContract => reveal status\n    mapping(address => uint256) public metadataOffset; // tokenContract => metadata offset\n    mapping(uint256 => address) public requestIdToTokenContract; // requestId => tokenContract\n\n    /// @notice Emitted when the token data is set.\n    /// @param tokenContract The token contract on which the base metadata URI was set.\n    /// @param preRevealTokenMetadataURI The pre-reveal token metadata URI.\n    /// @param postRevealBaseMetadataURI The post-reveal base metadata URI.\n    /// @param tokenSupply The token supply.\n    event TokenDataSet(address tokenContract, string preRevealTokenMetadataURI, string postRevealBaseMetadataURI, uint256 tokenSupply);\n\n    /// @notice Emitted when a request to reveal tokens is made.\n    /// @param tokenContract The token contract on which the tokens are requested to reveal.\n    /// @param requestId The ChainLink VRF request ID.\n    event RevealRequested(address tokenContract, uint256 requestId);\n\n    /// @notice Emitted when the tokens are revealed.\n    /// @param tokenContract The token contract on which the tokens are revealed.\n    /// @param requestId The ChainLink VRF request ID.\n    /// @param metadataOffset The random metadata offset.\n    event TokensRevealed(address tokenContract, uint256 requestId, uint256 metadataOffset);\n\n    /// @notice Thrown when trying to set an empty pre-reveal token metadata URI.\n    /// @param tokenContract The token contract which data is being set.\n    error EmptyPreRevealTokenMetadataURI(address tokenContract);\n\n    /// @notice Thrown when trying to set an empty post-reveal base metadata URI.\n    /// @param tokenContract The token contract which data is being set.\n    error EmptyPostRevealBaseMetadataURI(address tokenContract);\n\n    /// @notice Thrown when setting token data with a zero token supply.\n    /// @param tokenContract The token contract which data is being set.\n    error ZeroTokenSupply(address tokenContract);\n\n    /// @notice Thrown when requesting to reveal tokens but the token data is not set.\n    /// @param tokenContract The token contract on which is being requested to reveal.\n    error TokenDataNotSet(address tokenContract);\n\n    /// @notice Thrown when trying to set the metadata for a token which has already been requested to reveal.\n    /// @param tokenContract The token contract which is already requested to reveal.\n    error RevealAlreadyRequested(address tokenContract);\n\n    /// @notice Emitted when trying to reveal a token which is already revealed.\n    /// @param tokenContract The token contract which is already revealed.\n    error TokensAlreadyRevealed(address tokenContract);\n\n    /// @notice Thrown when trying to call the `onTokenTransfer` function but the sender is not the LINK token contract.\n    error WrongLINKTokenAddress(address wrongAddress);\n\n    /// @notice Thrown when trying to fulfill a randomness request with a wrong request ID (ie. not associated to a token contract).\n    /// @param requestId The request ID.\n    error UnknownRequestId(uint256 requestId);\n\n    constructor(address linkToken, address vrfWrapper) VRFV2WrapperConsumerBase(linkToken, vrfWrapper) {}\n\n    /// @notice Sets the metadata URIs and the token supply for a token contract.\n    /// @dev Reverts with {EmptyPreRevealTokenMetadataURI} if the pre-reveal token metadata URI is empty.\n    /// @dev Reverts with {EmptyPostRevealBaseMetadataURIs} if the post-reveal base metadata URI is empty.\n    /// @dev Reverts with {ZeroTokenSupply} if the token supply is 0.\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n    /// @dev Reverts with {RevealAlreadyRequested} if reveal has already been requested.\n    /// @dev Emits a {TokenDataSet} event.\n    /// @param tokenContract The token contract on which to set the base metadata URI.\n    /// @param preRevealTokenURI The pre-reveal token metadata URI.\n    /// @param postRevealBaseURI The post-reveal base metadata URI.\n    /// @param supply The token supply.\n    function setTokenData(address tokenContract, string calldata preRevealTokenURI, string calldata postRevealBaseURI, uint256 supply) external {\n        if (bytes(preRevealTokenURI).length == 0) revert EmptyPreRevealTokenMetadataURI(tokenContract);\n        if (bytes(postRevealBaseURI).length == 0) revert EmptyPostRevealBaseMetadataURI(tokenContract);\n        if (supply == 0) revert ZeroTokenSupply(tokenContract);\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\n        if (revealStatus[tokenContract] != RevealStatus.NotRequested) revert RevealAlreadyRequested(tokenContract);\n        preRevealTokenMetadataURI[tokenContract] = preRevealTokenURI;\n        postRevealBaseMetadataURI[tokenContract] = postRevealBaseURI;\n        tokenSupply[tokenContract] = supply;\n        emit TokenDataSet(tokenContract, preRevealTokenURI, postRevealBaseURI, supply);\n    }\n\n    /// @notice Requests to switch the base metadata URI to the post-reveal URI while applying a fixed random offset to the metadata token id.\n    /// @notice The random offset is requested via Chainlink VRF direct funding method:\n    /// @notice  - payment of LINK token  will be made, and pre-approval of LINK to this contract is required\n    /// @notice    (the amount to be approved cannot reliably be known in advance, but can be estimated with `VRF_V2_WRAPPER.estimateRequestPrice`),\n    /// @notice  - the randomness request will be fulfilled later by a call to the `rawFulfillRandomWords` callback.\n    /// @notice This function can be called multiple times as long as the tokens have not been effectively revealed yet, so that any failure to\n    /// @notice  execute the fulfill callback (such as because of insufficient gas) does not prevent from retrying.\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n    /// @dev Reverts with {TokenDataNotSet} if the token data has not been set yet.\n    /// @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\n    /// @dev Emits a {RevealRequested} event.\n    /// @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from the sender to this contract.\n    /// @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from this contract to the VRF Wrapper.\n    /// @param tokenContract The token contract for which to reveal the tokens.\n    /// @param callbackGasLimit The gas limit to set for the VRF V2 wrapper callback.\n    /// @param requestConfirmations The number of confirmations to wait before fulfilling the request.\n    function requestReveal(address tokenContract, uint32 callbackGasLimit, uint16 requestConfirmations) external {\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\n        if (tokenSupply[tokenContract] == 0) revert TokenDataNotSet(tokenContract);\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) revert TokensAlreadyRevealed(tokenContract);\n        uint256 requestPrice = VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit);\n        LINK.transferFrom(msg.sender, address(this), requestPrice);\n        LINK.transferAndCall(address(VRF_V2_WRAPPER), requestPrice, abi.encode(callbackGasLimit, requestConfirmations, 1));\n        uint256 requestId = VRF_V2_WRAPPER.lastRequestId();\n        requestIdToTokenContract[requestId] = tokenContract;\n        revealStatus[tokenContract] = RevealStatus.Requested;\n        emit RevealRequested(tokenContract, requestId);\n    }\n\n    /// @inheritdoc ITokenMetadataResolver\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI) {\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) {\n            uint256 metadataId = (tokenId + metadataOffset[tokenContract]) % tokenSupply[tokenContract];\n            return string(abi.encodePacked(postRevealBaseMetadataURI[tokenContract], metadataId.toString()));\n        } else {\n            return preRevealTokenMetadataURI[tokenContract];\n        }\n    }\n\n    /// @notice Callback function called by the VRF V2 wrapper when the randomness is received. Applies the random offset.\n    /// @dev Reverts with {UnknownRequestId} if the request ID is not associated to a token contract.\n    /// @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\n    /// @dev Emits a {TokensRevealed} event.\n    /// @param requestId The ChainLink VRF request ID.\n    /// @param randomWords The randomness result.\n    function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual override {\n        address tokenContract = requestIdToTokenContract[requestId];\n        if (tokenContract == address(0)) revert UnknownRequestId(requestId);\n        delete requestIdToTokenContract[requestId];\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) revert TokensAlreadyRevealed(tokenContract);\n        uint256 offset = randomWords[0] % tokenSupply[tokenContract];\n        metadataOffset[tokenContract] = offset;\n        revealStatus[tokenContract] = RevealStatus.Revealed;\n        emit TokensRevealed(tokenContract, requestId, offset);\n    }\n\n    // solhint-disable-next-line func-name-mixedcase\n    function CHAINLINK_LINK_TOKEN() external view returns (LinkTokenInterface) {\n        return LINK;\n    }\n\n    // solhint-disable-next-line func-name-mixedcase\n    function CHAINLINK_VRF_WRAPPER() external view returns (VRFV2WrapperInterface) {\n        return VRF_V2_WRAPPER;\n    }\n}\n"},"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {ITokenMetadataResolver} from \"./interfaces/ITokenMetadataResolver.sol\";\nimport {ContractOwnershipStorage} from \"./../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Strings} from \"@openzeppelin/contracts/utils/Strings.sol\";\n\n/// @title TokenMetadataResolverWithBaseURI.\n/// @notice Token Metadata Resolver which uses a base metadata URI concatenated with the token identifier to produce a token metadata URI.\n/// @notice Only the owner of the target token contract can set the base metadata URI for this target contract.\ncontract TokenMetadataResolverWithBaseURI is ITokenMetadataResolver {\n    using ContractOwnershipStorage for address;\n    using Strings for uint256;\n\n    mapping(address => string) public baseMetadataURI;\n\n    /// @notice Emitted when the base metadata URI is set.\n    /// @param tokenContract The token contract on which the base metadata URI was set.\n    /// @param baseMetadataURI The base metadata URI.\n    event BaseMetadataURISet(address tokenContract, string baseMetadataURI);\n\n    /// @notice Sets the base metadata URI.\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n    /// @dev Emits a {BaseMetadataURISet} event.\n    /// @param tokenContract The token contract on which to set the base metadata URI.\n    /// @param baseURI The base metadata URI.\n    function setBaseMetadataURI(address tokenContract, string calldata baseURI) external {\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\n        baseMetadataURI[tokenContract] = baseURI;\n        emit BaseMetadataURISet(tokenContract, baseURI);\n    }\n\n    /// @notice Gets the token metadata URI for a token as the concatenation of the base metadata URI and the token identifier.\n    /// @param tokenContract The token contract for which to retrieve the token URI.\n    /// @param tokenId The token identifier.\n    /// @return tokenURI The token metadata URI as the concatenation of the base metadata URI and the token identifier.\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI) {\n        return string(abi.encodePacked(baseMetadataURI[tokenContract], tokenId.toString()));\n    }\n}\n"},"contracts/token/royalty/base/ERC2981Base.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IERC2981} from \"./../interfaces/IERC2981.sol\";\nimport {ERC2981Storage} from \"./../libraries/ERC2981Storage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract ERC2981Base is Context, IERC2981 {\n    using ERC2981Storage for ERC2981Storage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\n\n    /// @notice Sets the royalty percentage.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\n    }\n\n    /// @notice Sets the royalty receiver.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\n    /// @param receiver The new receiver to set.\n    function setRoyaltyReceiver(address receiver) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\n    }\n\n    /// @inheritdoc IERC2981\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\n    }\n}\n"},"contracts/token/royalty/base/OperatorFiltererBase.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {IOperatorFilterRegistry} from \"./../interfaces/IOperatorFilterRegistry.sol\";\nimport {OperatorFiltererStorage} from \"./../libraries/OperatorFiltererStorage.sol\";\nimport {ContractOwnershipStorage} from \"./../../../access/libraries/ContractOwnershipStorage.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\n/// @title Operator Filterer for token contracts (proxiable version).\n/// @dev This contract is to be used via inheritance in a proxied implementation.\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\nabstract contract OperatorFiltererBase is Context {\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\n\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\n    }\n\n    /// @notice Gets the operator filter registry address.\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\n    }\n}\n"},"contracts/token/royalty/ERC2981.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC2981Storage} from \"./libraries/ERC2981Storage.sol\";\nimport {ERC2981Base} from \"./base/ERC2981Base.sol\";\nimport {ContractOwnership} from \"./../../access/ContractOwnership.sol\";\n\n/// @title ERC2981 NFT Royalty Standard (immutable version).\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\n    constructor() {\n        ERC2981Storage.init();\n    }\n}\n"},"contracts/token/royalty/errors/ERC2981Errors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\n/// @param percentage The royalty percentage that was attempted to be set.\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\n\n/// @notice Thrown when setting a royalty receiver that is the zero address.\nerror ERC2981IncorrectRoyaltyReceiver();\n"},"contracts/token/royalty/errors/OperatorFiltererErrors.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\n/// @param operator The address that is not authorized.\nerror OperatorNotAllowed(address operator);\n"},"contracts/token/royalty/facets/ERC2981Facet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {ERC2981Storage} from \"./../libraries/ERC2981Storage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {ERC2981Base} from \"./../base/ERC2981Base.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title ERC2981 NFT Royalty Standard (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}.\ncontract ERC2981Facet is ERC2981Base, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    function initERC2981() external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        ERC2981Storage.init();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/royalty/facets/OperatorFiltererFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\nimport {IForwarderRegistry} from \"./../../../metatx/interfaces/IForwarderRegistry.sol\";\nimport {IOperatorFilterRegistry} from \"./../interfaces/IOperatorFilterRegistry.sol\";\nimport {OperatorFiltererStorage} from \"./../libraries/OperatorFiltererStorage.sol\";\nimport {ProxyAdminStorage} from \"./../../../proxy/libraries/ProxyAdminStorage.sol\";\nimport {OperatorFiltererBase} from \"./../base/OperatorFiltererBase.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\nimport {ForwarderRegistryContextBase} from \"./../../../metatx/base/ForwarderRegistryContextBase.sol\";\n\n/// @title Operator Filterer for token contracts (facet version).\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\ncontract OperatorFiltererFacet is OperatorFiltererBase, ForwarderRegistryContextBase {\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\n\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\n    function initOperatorFilterer(IOperatorFilterRegistry operatorFilterRegistry) external {\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\n        OperatorFiltererStorage.layout().proxyInit(operatorFilterRegistry);\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\n        return ForwarderRegistryContextBase._msgSender();\n    }\n\n    /// @inheritdoc ForwarderRegistryContextBase\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\n        return ForwarderRegistryContextBase._msgData();\n    }\n}\n"},"contracts/token/royalty/interfaces/IERC2981.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\n/// @title ERC2981 NFT Royalty Standard.\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\ninterface IERC2981 {\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\n    /// @param tokenId The NFT asset queried for royalty information\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\n    /// @return receiver Address of who should be sent the royalty payment\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\n}\n"},"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\ninterface IOperatorFilterRegistry {\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\n\n    function register(address registrant) external;\n\n    function registerAndSubscribe(address registrant, address subscription) external;\n\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\n\n    function unregister(address addr) external;\n\n    function updateOperator(address registrant, address operator, bool filtered) external;\n\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\n\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\n\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\n\n    function subscribe(address registrant, address registrantToSubscribe) external;\n\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\n\n    function subscriptionOf(address addr) external returns (address registrant);\n\n    function subscribers(address registrant) external returns (address[] memory);\n\n    function subscriberAt(address registrant, uint256 index) external returns (address);\n\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\n\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\n\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\n\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\n\n    function filteredOperators(address addr) external returns (address[] memory);\n\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\n\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\n\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\n\n    function isRegistered(address addr) external returns (bool);\n\n    function codeHashOf(address addr) external returns (bytes32);\n}\n"},"contracts/token/royalty/libraries/ERC2981Storage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \"./../errors/ERC2981Errors.sol\";\nimport {IERC2981} from \"./../interfaces/IERC2981.sol\";\nimport {InterfaceDetectionStorage} from \"./../../../introspection/libraries/InterfaceDetectionStorage.sol\";\n\nlibrary ERC2981Storage {\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\n\n    struct Layout {\n        address royaltyReceiver;\n        uint96 royaltyPercentage;\n    }\n\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.token.royalty.ERC2981.storage\")) - 1);\n\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\n\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\n    function init() internal {\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\n    }\n\n    /// @notice Sets the royalty percentage.\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\n        }\n        s.royaltyPercentage = uint96(percentage);\n    }\n\n    /// @notice Sets the royalty receiver.\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\n    /// @param receiver The new receiver to set.\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\n        if (receiver == address(0)) {\n            revert ERC2981IncorrectRoyaltyReceiver();\n        }\n        s.royaltyReceiver = receiver;\n    }\n\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\n    // / @param tokenId The NFT asset queried for royalty information\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\n    /// @return receiver Address of who should be sent the royalty payment\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\n        receiver = s.royaltyReceiver;\n        uint256 royaltyPercentage = s.royaltyPercentage;\n        if (salePrice == 0 || royaltyPercentage == 0) {\n            royaltyAmount = 0;\n        } else {\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\n            } else {\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\n            }\n        }\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n}\n"},"contracts/token/royalty/libraries/OperatorFiltererStorage.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {OperatorNotAllowed} from \"./../errors/OperatorFiltererErrors.sol\";\nimport {IOperatorFilterRegistry} from \"./../interfaces/IOperatorFilterRegistry.sol\";\nimport {ProxyInitialization} from \"./../../../proxy/libraries/ProxyInitialization.sol\";\n\nlibrary OperatorFiltererStorage {\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\n\n    struct Layout {\n        IOperatorFilterRegistry registry;\n    }\n\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\"animoca.token.royalty.OperatorFilterer.phase\")) - 1);\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\"animoca.token.royalty.OperatorFilterer.storage\")) - 1);\n\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\n        s.registry = registry;\n    }\n\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\n        s.constructorInit(registry);\n    }\n\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\n        s.registry = registry;\n    }\n\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\n        // Allow spending tokens from addresses with balance\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\n        if (sender != from) {\n            _checkFilterOperator(s, sender);\n        }\n    }\n\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\n        _checkFilterOperator(s, operator);\n    }\n\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\n        return s.registry;\n    }\n\n    function layout() internal pure returns (Layout storage s) {\n        bytes32 position = LAYOUT_STORAGE_SLOT;\n        assembly {\n            s.slot := position\n        }\n    }\n\n    function _checkFilterOperator(Layout storage s, address operator) private view {\n        IOperatorFilterRegistry registry = s.registry;\n        // Check registry code length to facilitate testing in environments without a deployed registry.\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\n            if (!registry.isOperatorAllowed(address(this), operator)) {\n                revert OperatorNotAllowed(operator);\n            }\n        }\n    }\n}\n"},"contracts/utils/libraries/Address.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nlibrary Address {\n    /// @notice Checks if the address is a deployed smart contract.\n    /// @param addr The address to check.\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\n    function hasBytecode(address addr) internal view returns (bool) {\n        uint256 size;\n        assembly {\n            size := extcodesize(addr)\n        }\n        return size != 0;\n    }\n}\n"},"contracts/utils/libraries/Bytes32.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nlibrary Bytes32 {\n    /// @notice Converts bytes32 to base32 string.\n    /// @param value value to convert.\n    /// @return the converted base32 string.\n    function toBase32String(bytes32 value) internal pure returns (string memory) {\n        bytes32 base32Alphabet = 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637;\n        uint256 i = uint256(value);\n        uint256 k = 52;\n        bytes memory bstr = new bytes(k);\n        unchecked {\n            bstr[--k] = base32Alphabet[uint8((i % 8) << 2)]; // uint8 s = uint8((256 - skip) % 5);  // (i % (2**s)) << (5-s)\n            i /= 8;\n            while (k > 0) {\n                bstr[--k] = base32Alphabet[i % 32];\n                i /= 32;\n            }\n        }\n        return string(bstr);\n    }\n\n    /// @notice Converts a bytes32 value to an ASCII string, trimming the tailing zeros.\n    /// @param value value to convert.\n    /// @return the converted ASCII string.\n    function toASCIIString(bytes32 value) internal pure returns (string memory) {\n        if (value == 0x00) return \"\";\n        bytes memory bytesString = bytes(abi.encodePacked(value));\n        uint256 pos = 31;\n        while (true) {\n            if (bytesString[pos] != 0) break;\n            unchecked {\n                --pos;\n            }\n        }\n        unchecked {\n            bytes memory asciiString = new bytes(pos + 1);\n            for (uint256 i; i <= pos; ++i) {\n                asciiString[i] = bytesString[i];\n            }\n            return string(asciiString);\n        }\n    }\n}\n"},"contracts/utils/MultiStaticCall.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.30;\n\n/// @title MultiStaticCall - Aggregate results from multiple static calls\n/// @dev Derived from https://github.com/makerdao/multicall (MIT licence)\ncontract MultiStaticCall {\n    struct Call {\n        address target;\n        bytes callData;\n    }\n\n    struct Result {\n        bool success;\n        bytes returnData;\n    }\n\n    /// @notice Emitted when a static call reverts without return data.\n    /// @param target The target contract address of the static call.\n    /// @param data The encoded function call executed on `target`.\n    error StaticCallReverted(address target, bytes data);\n\n    /// @notice Aggregates the results of multiple static calls.\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\n    /// @param calls The list of target contracts and encoded function calls for each static call.\n    /// @return returnData The list of success flags and raw return data for each static call.\n    function tryAggregate(bool requireSuccess, Call[] calldata calls) public view returns (Result[] memory returnData) {\n        uint256 length = calls.length;\n        returnData = new Result[](length);\n        for (uint256 i; i < length; ++i) {\n            address target = calls[i].target;\n            bytes calldata data = calls[i].callData;\n            (bool success, bytes memory ret) = target.staticcall(data);\n\n            if (requireSuccess && !success) {\n                uint256 returndataLength = ret.length;\n                if (returndataLength != 0) {\n                    assembly {\n                        revert(add(32, ret), returndataLength)\n                    }\n                } else {\n                    revert StaticCallReverted(target, data);\n                }\n            }\n\n            returnData[i] = Result(success, ret);\n        }\n    }\n\n    /// @notice Aggregates the results of multiple static calls, together with the associated block number.\n    /// @dev Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\n    /// @param calls The list of target contracts and encoded function calls for each static call.\n    /// @return blockNumber The latest mined block number indicating at which point the return data is valid.\n    /// @return returnData The list of success flags and raw return data for each static call.\n    function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public view returns (uint256 blockNumber, Result[] memory returnData) {\n        blockNumber = block.number;\n        returnData = tryAggregate(requireSuccess, calls);\n    }\n}\n"}},"settings":{"viaIR":true,"optimizer":{"enabled":true,"runs":99999},"evmVersion":"paris","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"metadata":{"useLiteralContent":true}}},"output":{"sources":{"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol":{"ast":{"absolutePath":"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol","exportedSymbols":{"LinkTokenInterface":[94]},"id":95,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"32:23:0"},{"abstract":false,"baseContracts":[],"canonicalName":"LinkTokenInterface","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":94,"linearizedBaseContracts":[94],"name":"LinkTokenInterface","nameLocation":"120:18:0","nodeType":"ContractDefinition","nodes":[{"functionSelector":"dd62ed3e","id":10,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"152:9:0","nodeType":"FunctionDefinition","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"mutability":"mutable","name":"owner","nameLocation":"170:5:0","nodeType":"VariableDeclaration","scope":10,"src":"162:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2,"name":"address","nodeType":"ElementaryTypeName","src":"162:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"spender","nameLocation":"185:7:0","nodeType":"VariableDeclaration","scope":10,"src":"177:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4,"name":"address","nodeType":"ElementaryTypeName","src":"177:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"161:32:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8,"mutability":"mutable","name":"remaining","nameLocation":"225:9:0","nodeType":"VariableDeclaration","scope":10,"src":"217:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7,"name":"uint256","nodeType":"ElementaryTypeName","src":"217:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"216:19:0"},"scope":94,"src":"143:93:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"095ea7b3","id":19,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"249:7:0","nodeType":"FunctionDefinition","parameters":{"id":15,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"mutability":"mutable","name":"spender","nameLocation":"265:7:0","nodeType":"VariableDeclaration","scope":19,"src":"257:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"257:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14,"mutability":"mutable","name":"value","nameLocation":"282:5:0","nodeType":"VariableDeclaration","scope":19,"src":"274:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13,"name":"uint256","nodeType":"ElementaryTypeName","src":"274:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"256:32:0"},"returnParameters":{"id":18,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17,"mutability":"mutable","name":"success","nameLocation":"312:7:0","nodeType":"VariableDeclaration","scope":19,"src":"307:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16,"name":"bool","nodeType":"ElementaryTypeName","src":"307:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"306:14:0"},"scope":94,"src":"240:81:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"70a08231","id":26,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"334:9:0","nodeType":"FunctionDefinition","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21,"mutability":"mutable","name":"owner","nameLocation":"357:5:0","nodeType":"VariableDeclaration","scope":26,"src":"349:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20,"name":"address","nodeType":"ElementaryTypeName","src":"349:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"343:23:0"},"returnParameters":{"id":25,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24,"mutability":"mutable","name":"balance","nameLocation":"398:7:0","nodeType":"VariableDeclaration","scope":26,"src":"390:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23,"name":"uint256","nodeType":"ElementaryTypeName","src":"390:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"389:17:0"},"scope":94,"src":"325:82:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"313ce567","id":31,"implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"420:8:0","nodeType":"FunctionDefinition","parameters":{"id":27,"nodeType":"ParameterList","parameters":[],"src":"428:2:0"},"returnParameters":{"id":30,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"decimalPlaces","nameLocation":"460:13:0","nodeType":"VariableDeclaration","scope":31,"src":"454:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28,"name":"uint8","nodeType":"ElementaryTypeName","src":"454:5:0","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"453:21:0"},"scope":94,"src":"411:64:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"66188463","id":40,"implemented":false,"kind":"function","modifiers":[],"name":"decreaseApproval","nameLocation":"488:16:0","nodeType":"FunctionDefinition","parameters":{"id":36,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33,"mutability":"mutable","name":"spender","nameLocation":"513:7:0","nodeType":"VariableDeclaration","scope":40,"src":"505:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32,"name":"address","nodeType":"ElementaryTypeName","src":"505:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":35,"mutability":"mutable","name":"addedValue","nameLocation":"530:10:0","nodeType":"VariableDeclaration","scope":40,"src":"522:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34,"name":"uint256","nodeType":"ElementaryTypeName","src":"522:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"504:37:0"},"returnParameters":{"id":39,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38,"mutability":"mutable","name":"success","nameLocation":"565:7:0","nodeType":"VariableDeclaration","scope":40,"src":"560:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37,"name":"bool","nodeType":"ElementaryTypeName","src":"560:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"559:14:0"},"scope":94,"src":"479:95:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"d73dd623","id":47,"implemented":false,"kind":"function","modifiers":[],"name":"increaseApproval","nameLocation":"587:16:0","nodeType":"FunctionDefinition","parameters":{"id":45,"nodeType":"ParameterList","parameters":[{"constant":false,"id":42,"mutability":"mutable","name":"spender","nameLocation":"612:7:0","nodeType":"VariableDeclaration","scope":47,"src":"604:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":41,"name":"address","nodeType":"ElementaryTypeName","src":"604:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":44,"mutability":"mutable","name":"subtractedValue","nameLocation":"629:15:0","nodeType":"VariableDeclaration","scope":47,"src":"621:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":43,"name":"uint256","nodeType":"ElementaryTypeName","src":"621:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"603:42:0"},"returnParameters":{"id":46,"nodeType":"ParameterList","parameters":[],"src":"654:0:0"},"scope":94,"src":"578:77:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"06fdde03","id":52,"implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"668:4:0","nodeType":"FunctionDefinition","parameters":{"id":48,"nodeType":"ParameterList","parameters":[],"src":"672:2:0"},"returnParameters":{"id":51,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50,"mutability":"mutable","name":"tokenName","nameLocation":"712:9:0","nodeType":"VariableDeclaration","scope":52,"src":"698:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":49,"name":"string","nodeType":"ElementaryTypeName","src":"698:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"697:25:0"},"scope":94,"src":"659:64:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"95d89b41","id":57,"implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"736:6:0","nodeType":"FunctionDefinition","parameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"742:2:0"},"returnParameters":{"id":56,"nodeType":"ParameterList","parameters":[{"constant":false,"id":55,"mutability":"mutable","name":"tokenSymbol","nameLocation":"782:11:0","nodeType":"VariableDeclaration","scope":57,"src":"768:25:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":54,"name":"string","nodeType":"ElementaryTypeName","src":"768:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"767:27:0"},"scope":94,"src":"727:68:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"18160ddd","id":62,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"808:11:0","nodeType":"FunctionDefinition","parameters":{"id":58,"nodeType":"ParameterList","parameters":[],"src":"819:2:0"},"returnParameters":{"id":61,"nodeType":"ParameterList","parameters":[{"constant":false,"id":60,"mutability":"mutable","name":"totalTokensIssued","nameLocation":"853:17:0","nodeType":"VariableDeclaration","scope":62,"src":"845:25:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":59,"name":"uint256","nodeType":"ElementaryTypeName","src":"845:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"844:27:0"},"scope":94,"src":"799:73:0","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"a9059cbb","id":71,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"885:8:0","nodeType":"FunctionDefinition","parameters":{"id":67,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64,"mutability":"mutable","name":"to","nameLocation":"902:2:0","nodeType":"VariableDeclaration","scope":71,"src":"894:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":63,"name":"address","nodeType":"ElementaryTypeName","src":"894:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":66,"mutability":"mutable","name":"value","nameLocation":"914:5:0","nodeType":"VariableDeclaration","scope":71,"src":"906:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":65,"name":"uint256","nodeType":"ElementaryTypeName","src":"906:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"893:27:0"},"returnParameters":{"id":70,"nodeType":"ParameterList","parameters":[{"constant":false,"id":69,"mutability":"mutable","name":"success","nameLocation":"944:7:0","nodeType":"VariableDeclaration","scope":71,"src":"939:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":68,"name":"bool","nodeType":"ElementaryTypeName","src":"939:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"938:14:0"},"scope":94,"src":"876:77:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"4000aea0","id":82,"implemented":false,"kind":"function","modifiers":[],"name":"transferAndCall","nameLocation":"966:15:0","nodeType":"FunctionDefinition","parameters":{"id":78,"nodeType":"ParameterList","parameters":[{"constant":false,"id":73,"mutability":"mutable","name":"to","nameLocation":"990:2:0","nodeType":"VariableDeclaration","scope":82,"src":"982:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":72,"name":"address","nodeType":"ElementaryTypeName","src":"982:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":75,"mutability":"mutable","name":"value","nameLocation":"1002:5:0","nodeType":"VariableDeclaration","scope":82,"src":"994:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":74,"name":"uint256","nodeType":"ElementaryTypeName","src":"994:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":77,"mutability":"mutable","name":"data","nameLocation":"1024:4:0","nodeType":"VariableDeclaration","scope":82,"src":"1009:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":76,"name":"bytes","nodeType":"ElementaryTypeName","src":"1009:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"981:48:0"},"returnParameters":{"id":81,"nodeType":"ParameterList","parameters":[{"constant":false,"id":80,"mutability":"mutable","name":"success","nameLocation":"1053:7:0","nodeType":"VariableDeclaration","scope":82,"src":"1048:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":79,"name":"bool","nodeType":"ElementaryTypeName","src":"1048:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1047:14:0"},"scope":94,"src":"957:105:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"23b872dd","id":93,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"1075:12:0","nodeType":"FunctionDefinition","parameters":{"id":89,"nodeType":"ParameterList","parameters":[{"constant":false,"id":84,"mutability":"mutable","name":"from","nameLocation":"1096:4:0","nodeType":"VariableDeclaration","scope":93,"src":"1088:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":83,"name":"address","nodeType":"ElementaryTypeName","src":"1088:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":86,"mutability":"mutable","name":"to","nameLocation":"1110:2:0","nodeType":"VariableDeclaration","scope":93,"src":"1102:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":85,"name":"address","nodeType":"ElementaryTypeName","src":"1102:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":88,"mutability":"mutable","name":"value","nameLocation":"1122:5:0","nodeType":"VariableDeclaration","scope":93,"src":"1114:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":87,"name":"uint256","nodeType":"ElementaryTypeName","src":"1114:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1087:41:0"},"returnParameters":{"id":92,"nodeType":"ParameterList","parameters":[{"constant":false,"id":91,"mutability":"mutable","name":"success","nameLocation":"1152:7:0","nodeType":"VariableDeclaration","scope":93,"src":"1147:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":90,"name":"bool","nodeType":"ElementaryTypeName","src":"1147:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1146:14:0"},"scope":94,"src":"1066:95:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":95,"src":"110:1053:0","usedErrors":[],"usedEvents":[]}],"src":"32:1132:0"},"id":0},"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol":{"ast":{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol","exportedSymbols":{"VRFConsumerBaseV2":[152]},"id":153,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":96,"literals":["solidity","^","0.8",".4"],"nodeType":"PragmaDirective","src":"32:23:1"},{"abstract":true,"baseContracts":[],"canonicalName":"VRFConsumerBaseV2","contractDependencies":[],"contractKind":"contract","documentation":{"id":97,"nodeType":"StructuredDocumentation","src":"57:5201:1","text":" @notice Interface for contracts using VRF randomness\n *****************************************************************************\n @dev PURPOSE\n @dev Reggie the Random Oracle (not his real job) wants to provide randomness\n @dev to Vera the verifier in such a way that Vera can be sure he's not\n @dev making his output up to suit himself. Reggie provides Vera a public key\n @dev to which he knows the secret key. Each time Vera provides a seed to\n @dev Reggie, he gives back a value which is computed completely\n @dev deterministically from the seed and the secret key.\n @dev Reggie provides a proof by which Vera can verify that the output was\n @dev correctly computed once Reggie tells it to her, but without that proof,\n @dev the output is indistinguishable to her from a uniform random sample\n @dev from the output space.\n @dev The purpose of this contract is to make it easy for unrelated contracts\n @dev to talk to Vera the verifier about the work Reggie is doing, to provide\n @dev simple access to a verifiable source of randomness. It ensures 2 things:\n @dev 1. The fulfillment came from the VRFCoordinator\n @dev 2. The consumer contract implements fulfillRandomWords.\n *****************************************************************************\n @dev USAGE\n @dev Calling contracts must inherit from VRFConsumerBase, and can\n @dev initialize VRFConsumerBase's attributes in their constructor as\n @dev shown:\n @dev   contract VRFConsumer {\n @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)\n @dev       VRFConsumerBase(_vrfCoordinator) public {\n @dev         <initialization with other arguments goes here>\n @dev       }\n @dev   }\n @dev The oracle will have given you an ID for the VRF keypair they have\n @dev committed to (let's call it keyHash). Create subscription, fund it\n @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface\n @dev subscription management functions).\n @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,\n @dev callbackGasLimit, numWords),\n @dev see (VRFCoordinatorInterface for a description of the arguments).\n @dev Once the VRFCoordinator has received and validated the oracle's response\n @dev to your request, it will call your contract's fulfillRandomWords method.\n @dev The randomness argument to fulfillRandomWords is a set of random words\n @dev generated from your requestId and the blockHash of the request.\n @dev If your contract could have concurrent requests open, you can use the\n @dev requestId returned from requestRandomWords to track which response is associated\n @dev with which randomness request.\n @dev See \"SECURITY CONSIDERATIONS\" for principles to keep in mind,\n @dev if your contract could have multiple requests in flight simultaneously.\n @dev Colliding `requestId`s are cryptographically impossible as long as seeds\n @dev differ.\n *****************************************************************************\n @dev SECURITY CONSIDERATIONS\n @dev A method with the ability to call your fulfillRandomness method directly\n @dev could spoof a VRF response with any random value, so it's critical that\n @dev it cannot be directly called by anything other than this base contract\n @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).\n @dev For your users to trust that your contract's random behavior is free\n @dev from malicious interference, it's best if you can write it so that all\n @dev behaviors implied by a VRF response are executed *during* your\n @dev fulfillRandomness method. If your contract must store the response (or\n @dev anything derived from it) and use it later, you must ensure that any\n @dev user-significant behavior which depends on that stored value cannot be\n @dev manipulated by a subsequent VRF request.\n @dev Similarly, both miners and the VRF oracle itself have some influence\n @dev over the order in which VRF responses appear on the blockchain, so if\n @dev your contract could have multiple VRF requests in flight simultaneously,\n @dev you must ensure that the order in which the VRF responses arrive cannot\n @dev be used to manipulate your contract's user-significant behavior.\n @dev Since the block hash of the block which contains the requestRandomness\n @dev call is mixed into the input to the VRF *last*, a sufficiently powerful\n @dev miner could, in principle, fork the blockchain to evict the block\n @dev containing the request, forcing the request to be included in a\n @dev different block with a different hash, and therefore a different input\n @dev to the VRF. However, such an attack would incur a substantial economic\n @dev cost. This cost scales with the number of blocks the VRF oracle waits\n @dev until it calls responds to a request. It is for this reason that\n @dev that you can signal to an oracle you'd like them to wait longer before\n @dev responding to the request (however this is not enforced in the contract\n @dev and so remains effective only in the case of unmodified oracle software)."},"fullyImplemented":false,"id":152,"linearizedBaseContracts":[152],"name":"VRFConsumerBaseV2","nameLocation":"5277:17:1","nodeType":"ContractDefinition","nodes":[{"errorSelector":"1cf993f4","id":103,"name":"OnlyCoordinatorCanFulfill","nameLocation":"5305:25:1","nodeType":"ErrorDefinition","parameters":{"id":102,"nodeType":"ParameterList","parameters":[{"constant":false,"id":99,"mutability":"mutable","name":"have","nameLocation":"5339:4:1","nodeType":"VariableDeclaration","scope":103,"src":"5331:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":98,"name":"address","nodeType":"ElementaryTypeName","src":"5331:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":101,"mutability":"mutable","name":"want","nameLocation":"5353:4:1","nodeType":"VariableDeclaration","scope":103,"src":"5345:12:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"5345:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5330:28:1"},"src":"5299:60:1"},{"constant":false,"id":105,"mutability":"immutable","name":"vrfCoordinator","nameLocation":"5473:14:1","nodeType":"VariableDeclaration","scope":152,"src":"5447:40:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":104,"name":"address","nodeType":"ElementaryTypeName","src":"5447:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"private"},{"body":{"id":115,"nodeType":"Block","src":"5612:43:1","statements":[{"expression":{"id":113,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":111,"name":"vrfCoordinator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":105,"src":"5618:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":112,"name":"_vrfCoordinator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"5635:15:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5618:32:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":114,"nodeType":"ExpressionStatement","src":"5618:32:1"}]},"documentation":{"id":106,"nodeType":"StructuredDocumentation","src":"5492:72:1","text":" @param _vrfCoordinator address of VRFCoordinator contract"},"id":116,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":108,"mutability":"mutable","name":"_vrfCoordinator","nameLocation":"5592:15:1","nodeType":"VariableDeclaration","scope":116,"src":"5584:23:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":107,"name":"address","nodeType":"ElementaryTypeName","src":"5584:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5578:33:1"},"returnParameters":{"id":110,"nodeType":"ParameterList","parameters":[],"src":"5612:0:1"},"scope":152,"src":"5567:88:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"documentation":{"id":117,"nodeType":"StructuredDocumentation","src":"5659:686:1","text":" @notice fulfillRandomness handles the VRF response. Your contract must\n @notice implement it. See \"SECURITY CONSIDERATIONS\" above for important\n @notice principles to keep in mind when implementing your fulfillRandomness\n @notice method.\n @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this\n @dev signature, and will call it once it has verified the proof\n @dev associated with the randomness. (It is triggered via a call to\n @dev rawFulfillRandomness, below.)\n @param requestId The Id initially returned by requestRandomness\n @param randomWords the VRF output expanded to the requested number of words"},"id":125,"implemented":false,"kind":"function","modifiers":[],"name":"fulfillRandomWords","nameLocation":"6449:18:1","nodeType":"FunctionDefinition","parameters":{"id":123,"nodeType":"ParameterList","parameters":[{"constant":false,"id":119,"mutability":"mutable","name":"requestId","nameLocation":"6476:9:1","nodeType":"VariableDeclaration","scope":125,"src":"6468:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":118,"name":"uint256","nodeType":"ElementaryTypeName","src":"6468:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":122,"mutability":"mutable","name":"randomWords","nameLocation":"6504:11:1","nodeType":"VariableDeclaration","scope":125,"src":"6487:28:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":120,"name":"uint256","nodeType":"ElementaryTypeName","src":"6487:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":121,"nodeType":"ArrayTypeName","src":"6487:9:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"6467:49:1"},"returnParameters":{"id":124,"nodeType":"ParameterList","parameters":[],"src":"6533:0:1"},"scope":152,"src":"6440:94:1","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":150,"nodeType":"Block","src":"6818:167:1","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":136,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":133,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6828:3:1","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6832:6:1","memberName":"sender","nodeType":"MemberAccess","src":"6828:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":135,"name":"vrfCoordinator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":105,"src":"6842:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6828:28:1","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":144,"nodeType":"IfStatement","src":"6824:109:1","trueBody":{"id":143,"nodeType":"Block","src":"6858:75:1","statements":[{"errorCall":{"arguments":[{"expression":{"id":138,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6899:3:1","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6903:6:1","memberName":"sender","nodeType":"MemberAccess","src":"6899:10:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":140,"name":"vrfCoordinator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":105,"src":"6911:14:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":137,"name":"OnlyCoordinatorCanFulfill","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":103,"src":"6873:25:1","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":141,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6873:53:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":142,"nodeType":"RevertStatement","src":"6866:60:1"}]}},{"expression":{"arguments":[{"id":146,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":127,"src":"6957:9:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":147,"name":"randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":130,"src":"6968:11:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"id":145,"name":"fulfillRandomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":125,"src":"6938:18:1","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (uint256,uint256[] memory)"}},"id":148,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6938:42:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":149,"nodeType":"ExpressionStatement","src":"6938:42:1"}]},"functionSelector":"1fe543e3","id":151,"implemented":true,"kind":"function","modifiers":[],"name":"rawFulfillRandomWords","nameLocation":"6738:21:1","nodeType":"FunctionDefinition","parameters":{"id":131,"nodeType":"ParameterList","parameters":[{"constant":false,"id":127,"mutability":"mutable","name":"requestId","nameLocation":"6768:9:1","nodeType":"VariableDeclaration","scope":151,"src":"6760:17:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":126,"name":"uint256","nodeType":"ElementaryTypeName","src":"6760:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":130,"mutability":"mutable","name":"randomWords","nameLocation":"6796:11:1","nodeType":"VariableDeclaration","scope":151,"src":"6779:28:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":128,"name":"uint256","nodeType":"ElementaryTypeName","src":"6779:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":129,"nodeType":"ArrayTypeName","src":"6779:9:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"6759:49:1"},"returnParameters":{"id":132,"nodeType":"ParameterList","parameters":[],"src":"6818:0:1"},"scope":152,"src":"6729:256:1","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":153,"src":"5259:1728:1","usedErrors":[103],"usedEvents":[]}],"src":"32:6956:1"},"id":1},"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol":{"ast":{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol","exportedSymbols":{"LinkTokenInterface":[94],"VRFV2WrapperConsumerBase":[257],"VRFV2WrapperInterface":[284]},"id":258,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":154,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"32:23:2"},{"absolutePath":"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol","file":"../shared/interfaces/LinkTokenInterface.sol","id":156,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":258,"sourceUnit":95,"src":"57:79:2","symbolAliases":[{"foreign":{"id":155,"name":"LinkTokenInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":94,"src":"65:18:2","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","file":"./interfaces/VRFV2WrapperInterface.sol","id":158,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":258,"sourceUnit":285,"src":"137:77:2","symbolAliases":[{"foreign":{"id":157,"name":"VRFV2WrapperInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"145:21:2","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"VRFV2WrapperConsumerBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":159,"nodeType":"StructuredDocumentation","src":"216:1344:2","text":" @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\n ********************************************************************************\n @dev PURPOSE\n @dev Create VRF V2 requests without the need for subscription management. Rather than creating\n @dev and funding a VRF V2 subscription, a user can use this wrapper to create one off requests,\n @dev paying up front rather than at fulfillment.\n @dev Since the price is determined using the gas price of the request transaction rather than\n @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\n @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\n *****************************************************************************\n @dev USAGE\n @dev Calling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be funded\n @dev with enough LINK to make the request, otherwise requests will revert. To request randomness,\n @dev call the 'requestRandomness' function with the desired VRF parameters. This function handles\n @dev paying for the request based on the current pricing.\n @dev Consumers must implement the fullfillRandomWords function, which will be called during\n @dev fulfillment with the randomness result."},"fullyImplemented":false,"id":257,"linearizedBaseContracts":[257],"name":"VRFV2WrapperConsumerBase","nameLocation":"1579:24:2","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":162,"mutability":"immutable","name":"LINK","nameLocation":"1730:4:2","nodeType":"VariableDeclaration","scope":257,"src":"1692:42:2","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"},"typeName":{"id":161,"nodeType":"UserDefinedTypeName","pathNode":{"id":160,"name":"LinkTokenInterface","nameLocations":["1692:18:2"],"nodeType":"IdentifierPath","referencedDeclaration":94,"src":"1692:18:2"},"referencedDeclaration":94,"src":"1692:18:2","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"visibility":"internal"},{"constant":false,"id":165,"mutability":"immutable","name":"VRF_V2_WRAPPER","nameLocation":"1863:14:2","nodeType":"VariableDeclaration","scope":257,"src":"1822:55:2","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"},"typeName":{"id":164,"nodeType":"UserDefinedTypeName","pathNode":{"id":163,"name":"VRFV2WrapperInterface","nameLocations":["1822:21:2"],"nodeType":"IdentifierPath","referencedDeclaration":284,"src":"1822:21:2"},"referencedDeclaration":284,"src":"1822:21:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"visibility":"internal"},{"body":{"id":185,"nodeType":"Block","src":"2060:102:2","statements":[{"expression":{"id":177,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":173,"name":"LINK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":162,"src":"2066:4:2","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":175,"name":"_link","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":168,"src":"2092:5:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":174,"name":"LinkTokenInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":94,"src":"2073:18:2","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinkTokenInterface_$94_$","typeString":"type(contract LinkTokenInterface)"}},"id":176,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2073:25:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"src":"2066:32:2","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"id":178,"nodeType":"ExpressionStatement","src":"2066:32:2"},{"expression":{"id":183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":179,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"2104:14:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":181,"name":"_vrfV2Wrapper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":170,"src":"2143:13:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":180,"name":"VRFV2WrapperInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"2121:21:2","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_VRFV2WrapperInterface_$284_$","typeString":"type(contract VRFV2WrapperInterface)"}},"id":182,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2121:36:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"src":"2104:53:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"id":184,"nodeType":"ExpressionStatement","src":"2104:53:2"}]},"documentation":{"id":166,"nodeType":"StructuredDocumentation","src":"1882:125:2","text":" @param _link is the address of LinkToken\n @param _vrfV2Wrapper is the address of the VRFV2Wrapper contract"},"id":186,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":171,"nodeType":"ParameterList","parameters":[{"constant":false,"id":168,"mutability":"mutable","name":"_link","nameLocation":"2030:5:2","nodeType":"VariableDeclaration","scope":186,"src":"2022:13:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":167,"name":"address","nodeType":"ElementaryTypeName","src":"2022:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":170,"mutability":"mutable","name":"_vrfV2Wrapper","nameLocation":"2045:13:2","nodeType":"VariableDeclaration","scope":186,"src":"2037:21:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":169,"name":"address","nodeType":"ElementaryTypeName","src":"2037:7:2","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2021:38:2"},"returnParameters":{"id":172,"nodeType":"ParameterList","parameters":[],"src":"2060:0:2"},"scope":257,"src":"2010:152:2","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":221,"nodeType":"Block","src":"3045:245:2","statements":[{"expression":{"arguments":[{"arguments":[{"id":203,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"3087:14:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}],"id":202,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3079:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":201,"name":"address","nodeType":"ElementaryTypeName","src":"3079:7:2","typeDescriptions":{}}},"id":204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3079:23:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":207,"name":"_callbackGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":189,"src":"3147:17:2","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":205,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"3110:14:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"id":206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3125:21:2","memberName":"calculateRequestPrice","nodeType":"MemberAccess","referencedDeclaration":273,"src":"3110:36:2","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint32_$returns$_t_uint256_$","typeString":"function (uint32) view external returns (uint256)"}},"id":208,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3110:55:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":211,"name":"_callbackGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":189,"src":"3184:17:2","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":212,"name":"_requestConfirmations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":191,"src":"3203:21:2","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},{"id":213,"name":"_numWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":193,"src":"3226:9:2","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_uint16","typeString":"uint16"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":209,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3173:3:2","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":210,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3177:6:2","memberName":"encode","nodeType":"MemberAccess","src":"3173:10:2","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":214,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3173:63:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":198,"name":"LINK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":162,"src":"3051:4:2","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"id":200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3056:15:2","memberName":"transferAndCall","nodeType":"MemberAccess","referencedDeclaration":82,"src":"3051:20:2","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory) external returns (bool)"}},"id":215,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3051:191:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":216,"nodeType":"ExpressionStatement","src":"3051:191:2"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":217,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"3255:14:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"id":218,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3270:13:2","memberName":"lastRequestId","nodeType":"MemberAccess","referencedDeclaration":265,"src":"3255:28:2","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":219,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3255:30:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":197,"id":220,"nodeType":"Return","src":"3248:37:2"}]},"documentation":{"id":187,"nodeType":"StructuredDocumentation","src":"2166:630:2","text":" @dev Requests randomness from the VRF V2 wrapper.\n @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\n        fulfillRandomWords function.\n @param _requestConfirmations is the number of confirmations to wait before fulfilling the\n        request. A higher number of confirmations increases security by reducing the likelihood\n        that a chain re-org changes a published randomness outcome.\n @param _numWords is the number of random words to request.\n @return requestId is the VRF V2 request ID of the newly created randomness request."},"id":222,"implemented":true,"kind":"function","modifiers":[],"name":"requestRandomness","nameLocation":"2900:17:2","nodeType":"FunctionDefinition","parameters":{"id":194,"nodeType":"ParameterList","parameters":[{"constant":false,"id":189,"mutability":"mutable","name":"_callbackGasLimit","nameLocation":"2930:17:2","nodeType":"VariableDeclaration","scope":222,"src":"2923:24:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":188,"name":"uint32","nodeType":"ElementaryTypeName","src":"2923:6:2","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":191,"mutability":"mutable","name":"_requestConfirmations","nameLocation":"2960:21:2","nodeType":"VariableDeclaration","scope":222,"src":"2953:28:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":190,"name":"uint16","nodeType":"ElementaryTypeName","src":"2953:6:2","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"},{"constant":false,"id":193,"mutability":"mutable","name":"_numWords","nameLocation":"2994:9:2","nodeType":"VariableDeclaration","scope":222,"src":"2987:16:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":192,"name":"uint32","nodeType":"ElementaryTypeName","src":"2987:6:2","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"2917:90:2"},"returnParameters":{"id":197,"nodeType":"ParameterList","parameters":[{"constant":false,"id":196,"mutability":"mutable","name":"requestId","nameLocation":"3034:9:2","nodeType":"VariableDeclaration","scope":222,"src":"3026:17:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":195,"name":"uint256","nodeType":"ElementaryTypeName","src":"3026:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3025:19:2"},"scope":257,"src":"2891:399:2","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"documentation":{"id":223,"nodeType":"StructuredDocumentation","src":"3294:238:2","text":" @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\n @notice implement it.\n @param _requestId is the VRF V2 request ID.\n @param _randomWords is the randomness result."},"id":231,"implemented":false,"kind":"function","modifiers":[],"name":"fulfillRandomWords","nameLocation":"3636:18:2","nodeType":"FunctionDefinition","parameters":{"id":229,"nodeType":"ParameterList","parameters":[{"constant":false,"id":225,"mutability":"mutable","name":"_requestId","nameLocation":"3663:10:2","nodeType":"VariableDeclaration","scope":231,"src":"3655:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":224,"name":"uint256","nodeType":"ElementaryTypeName","src":"3655:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":228,"mutability":"mutable","name":"_randomWords","nameLocation":"3692:12:2","nodeType":"VariableDeclaration","scope":231,"src":"3675:29:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":226,"name":"uint256","nodeType":"ElementaryTypeName","src":"3675:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":227,"nodeType":"ArrayTypeName","src":"3675:9:2","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3654:51:2"},"returnParameters":{"id":230,"nodeType":"ParameterList","parameters":[],"src":"3722:0:2"},"scope":257,"src":"3627:96:2","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":255,"nodeType":"Block","src":"3818:193:2","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":240,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3883:3:2","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3887:6:2","memberName":"sender","nodeType":"MemberAccess","src":"3883:10:2","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":244,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"3905:14:2","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}],"id":243,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3897:7:2","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":242,"name":"address","nodeType":"ElementaryTypeName","src":"3897:7:2","typeDescriptions":{}}},"id":245,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3897:23:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3883:37:2","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6f6e6c792056524620563220777261707065722063616e2066756c66696c6c","id":247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3922:33:2","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa95521b046a2d95983c62c6e75719a4673781a4fe8781bb969717b747c5c845","typeString":"literal_string \"only VRF V2 wrapper can fulfill\""},"value":"only VRF V2 wrapper can fulfill"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fa95521b046a2d95983c62c6e75719a4673781a4fe8781bb969717b747c5c845","typeString":"literal_string \"only VRF V2 wrapper can fulfill\""}],"id":239,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"3875:7:2","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":248,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3875:81:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":249,"nodeType":"ExpressionStatement","src":"3875:81:2"},{"expression":{"arguments":[{"id":251,"name":"_requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":233,"src":"3981:10:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":252,"name":"_randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":236,"src":"3993:12:2","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"id":250,"name":"fulfillRandomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":231,"src":"3962:18:2","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (uint256,uint256[] memory)"}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3962:44:2","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":254,"nodeType":"ExpressionStatement","src":"3962:44:2"}]},"functionSelector":"1fe543e3","id":256,"implemented":true,"kind":"function","modifiers":[],"name":"rawFulfillRandomWords","nameLocation":"3736:21:2","nodeType":"FunctionDefinition","parameters":{"id":237,"nodeType":"ParameterList","parameters":[{"constant":false,"id":233,"mutability":"mutable","name":"_requestId","nameLocation":"3766:10:2","nodeType":"VariableDeclaration","scope":256,"src":"3758:18:2","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":232,"name":"uint256","nodeType":"ElementaryTypeName","src":"3758:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":236,"mutability":"mutable","name":"_randomWords","nameLocation":"3795:12:2","nodeType":"VariableDeclaration","scope":256,"src":"3778:29:2","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":234,"name":"uint256","nodeType":"ElementaryTypeName","src":"3778:7:2","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":235,"nodeType":"ArrayTypeName","src":"3778:9:2","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3757:51:2"},"returnParameters":{"id":238,"nodeType":"ParameterList","parameters":[],"src":"3818:0:2"},"scope":257,"src":"3727:284:2","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":258,"src":"1561:2452:2","usedErrors":[],"usedEvents":[]}],"src":"32:3982:2"},"id":2},"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol":{"ast":{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","exportedSymbols":{"VRFV2WrapperInterface":[284]},"id":285,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":259,"literals":["solidity","^","0.8",".0"],"nodeType":"PragmaDirective","src":"32:23:3"},{"abstract":false,"baseContracts":[],"canonicalName":"VRFV2WrapperInterface","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":284,"linearizedBaseContracts":[284],"name":"VRFV2WrapperInterface","nameLocation":"120:21:3","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":260,"nodeType":"StructuredDocumentation","src":"146:187:3","text":" @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\n be relied option within the same transaction that the request was made."},"functionSelector":"fc2a88c3","id":265,"implemented":false,"kind":"function","modifiers":[],"name":"lastRequestId","nameLocation":"345:13:3","nodeType":"FunctionDefinition","parameters":{"id":261,"nodeType":"ParameterList","parameters":[],"src":"358:2:3"},"returnParameters":{"id":264,"nodeType":"ParameterList","parameters":[{"constant":false,"id":263,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":265,"src":"384:7:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":262,"name":"uint256","nodeType":"ElementaryTypeName","src":"384:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"383:9:3"},"scope":284,"src":"336:57:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":266,"nodeType":"StructuredDocumentation","src":"397:411:3","text":" @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\n @notice block.\n @dev This function relies on the transaction gas price which is not automatically set during\n @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\n @param _callbackGasLimit is the gas limit used to estimate the price."},"functionSelector":"4306d354","id":273,"implemented":false,"kind":"function","modifiers":[],"name":"calculateRequestPrice","nameLocation":"820:21:3","nodeType":"FunctionDefinition","parameters":{"id":269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":268,"mutability":"mutable","name":"_callbackGasLimit","nameLocation":"854:17:3","nodeType":"VariableDeclaration","scope":273,"src":"847:24:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":267,"name":"uint32","nodeType":"ElementaryTypeName","src":"847:6:3","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"841:34:3"},"returnParameters":{"id":272,"nodeType":"ParameterList","parameters":[{"constant":false,"id":271,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":273,"src":"899:7:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":270,"name":"uint256","nodeType":"ElementaryTypeName","src":"899:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"898:9:3"},"scope":284,"src":"811:97:3","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":274,"nodeType":"StructuredDocumentation","src":"912:380:3","text":" @notice Estimates the price of a VRF request with a specific gas limit and gas price.\n @dev This is a convenience function that can be called in simulation to better understand\n @dev pricing.\n @param _callbackGasLimit is the gas limit used to estimate the price.\n @param _requestGasPriceWei is the gas price in wei used for the estimation."},"functionSelector":"7fb5d19d","id":283,"implemented":false,"kind":"function","modifiers":[],"name":"estimateRequestPrice","nameLocation":"1304:20:3","nodeType":"FunctionDefinition","parameters":{"id":279,"nodeType":"ParameterList","parameters":[{"constant":false,"id":276,"mutability":"mutable","name":"_callbackGasLimit","nameLocation":"1332:17:3","nodeType":"VariableDeclaration","scope":283,"src":"1325:24:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":275,"name":"uint32","nodeType":"ElementaryTypeName","src":"1325:6:3","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":278,"mutability":"mutable","name":"_requestGasPriceWei","nameLocation":"1359:19:3","nodeType":"VariableDeclaration","scope":283,"src":"1351:27:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":277,"name":"uint256","nodeType":"ElementaryTypeName","src":"1351:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1324:55:3"},"returnParameters":{"id":282,"nodeType":"ParameterList","parameters":[{"constant":false,"id":281,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":283,"src":"1403:7:3","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":280,"name":"uint256","nodeType":"ElementaryTypeName","src":"1403:7:3","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1402:9:3"},"scope":284,"src":"1295:117:3","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":285,"src":"110:1304:3","usedErrors":[],"usedEvents":[]}],"src":"32:1383:3"},"id":3},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/IERC1363.sol","exportedSymbols":{"IERC1363":[366],"IERC165":[4348],"IERC20":[452]},"id":367,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":286,"literals":["solidity",">=","0.6",".2"],"nodeType":"PragmaDirective","src":"107:24:4"},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"./IERC20.sol","id":288,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":367,"sourceUnit":375,"src":"133:36:4","symbolAliases":[{"foreign":{"id":287,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"141:6:4","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC165.sol","file":"./IERC165.sol","id":290,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":367,"sourceUnit":371,"src":"170:38:4","symbolAliases":[{"foreign":{"id":289,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4348,"src":"178:7:4","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":292,"name":"IERC20","nameLocations":["590:6:4"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"590:6:4"},"id":293,"nodeType":"InheritanceSpecifier","src":"590:6:4"},{"baseName":{"id":294,"name":"IERC165","nameLocations":["598:7:4"],"nodeType":"IdentifierPath","referencedDeclaration":4348,"src":"598:7:4"},"id":295,"nodeType":"InheritanceSpecifier","src":"598:7:4"}],"canonicalName":"IERC1363","contractDependencies":[],"contractKind":"interface","documentation":{"id":291,"nodeType":"StructuredDocumentation","src":"210:357:4","text":" @title IERC1363\n @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction."},"fullyImplemented":false,"id":366,"linearizedBaseContracts":[366,4348,452],"name":"IERC1363","nameLocation":"578:8:4","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":296,"nodeType":"StructuredDocumentation","src":"1148:370:4","text":" @dev Moves a `value` amount of tokens from the caller's account to `to`\n and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n @param to The address which you want to transfer to.\n @param value The amount of tokens to be transferred.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"1296ee62","id":305,"implemented":false,"kind":"function","modifiers":[],"name":"transferAndCall","nameLocation":"1532:15:4","nodeType":"FunctionDefinition","parameters":{"id":301,"nodeType":"ParameterList","parameters":[{"constant":false,"id":298,"mutability":"mutable","name":"to","nameLocation":"1556:2:4","nodeType":"VariableDeclaration","scope":305,"src":"1548:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":297,"name":"address","nodeType":"ElementaryTypeName","src":"1548:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":300,"mutability":"mutable","name":"value","nameLocation":"1568:5:4","nodeType":"VariableDeclaration","scope":305,"src":"1560:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":299,"name":"uint256","nodeType":"ElementaryTypeName","src":"1560:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1547:27:4"},"returnParameters":{"id":304,"nodeType":"ParameterList","parameters":[{"constant":false,"id":303,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":305,"src":"1593:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":302,"name":"bool","nodeType":"ElementaryTypeName","src":"1593:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1592:6:4"},"scope":366,"src":"1523:76:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":306,"nodeType":"StructuredDocumentation","src":"1605:453:4","text":" @dev Moves a `value` amount of tokens from the caller's account to `to`\n and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n @param to The address which you want to transfer to.\n @param value The amount of tokens to be transferred.\n @param data Additional data with no specified format, sent in call to `to`.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"4000aea0","id":317,"implemented":false,"kind":"function","modifiers":[],"name":"transferAndCall","nameLocation":"2072:15:4","nodeType":"FunctionDefinition","parameters":{"id":313,"nodeType":"ParameterList","parameters":[{"constant":false,"id":308,"mutability":"mutable","name":"to","nameLocation":"2096:2:4","nodeType":"VariableDeclaration","scope":317,"src":"2088:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":307,"name":"address","nodeType":"ElementaryTypeName","src":"2088:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":310,"mutability":"mutable","name":"value","nameLocation":"2108:5:4","nodeType":"VariableDeclaration","scope":317,"src":"2100:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":309,"name":"uint256","nodeType":"ElementaryTypeName","src":"2100:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":312,"mutability":"mutable","name":"data","nameLocation":"2130:4:4","nodeType":"VariableDeclaration","scope":317,"src":"2115:19:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":311,"name":"bytes","nodeType":"ElementaryTypeName","src":"2115:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2087:48:4"},"returnParameters":{"id":316,"nodeType":"ParameterList","parameters":[{"constant":false,"id":315,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":317,"src":"2154:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":314,"name":"bool","nodeType":"ElementaryTypeName","src":"2154:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2153:6:4"},"scope":366,"src":"2063:97:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":318,"nodeType":"StructuredDocumentation","src":"2166:453:4","text":" @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n @param from The address which you want to send tokens from.\n @param to The address which you want to transfer to.\n @param value The amount of tokens to be transferred.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"d8fbe994","id":329,"implemented":false,"kind":"function","modifiers":[],"name":"transferFromAndCall","nameLocation":"2633:19:4","nodeType":"FunctionDefinition","parameters":{"id":325,"nodeType":"ParameterList","parameters":[{"constant":false,"id":320,"mutability":"mutable","name":"from","nameLocation":"2661:4:4","nodeType":"VariableDeclaration","scope":329,"src":"2653:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":319,"name":"address","nodeType":"ElementaryTypeName","src":"2653:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":322,"mutability":"mutable","name":"to","nameLocation":"2675:2:4","nodeType":"VariableDeclaration","scope":329,"src":"2667:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":321,"name":"address","nodeType":"ElementaryTypeName","src":"2667:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":324,"mutability":"mutable","name":"value","nameLocation":"2687:5:4","nodeType":"VariableDeclaration","scope":329,"src":"2679:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":323,"name":"uint256","nodeType":"ElementaryTypeName","src":"2679:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2652:41:4"},"returnParameters":{"id":328,"nodeType":"ParameterList","parameters":[{"constant":false,"id":327,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":329,"src":"2712:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":326,"name":"bool","nodeType":"ElementaryTypeName","src":"2712:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2711:6:4"},"scope":366,"src":"2624:94:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":330,"nodeType":"StructuredDocumentation","src":"2724:536:4","text":" @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n @param from The address which you want to send tokens from.\n @param to The address which you want to transfer to.\n @param value The amount of tokens to be transferred.\n @param data Additional data with no specified format, sent in call to `to`.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"c1d34b89","id":343,"implemented":false,"kind":"function","modifiers":[],"name":"transferFromAndCall","nameLocation":"3274:19:4","nodeType":"FunctionDefinition","parameters":{"id":339,"nodeType":"ParameterList","parameters":[{"constant":false,"id":332,"mutability":"mutable","name":"from","nameLocation":"3302:4:4","nodeType":"VariableDeclaration","scope":343,"src":"3294:12:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":331,"name":"address","nodeType":"ElementaryTypeName","src":"3294:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":334,"mutability":"mutable","name":"to","nameLocation":"3316:2:4","nodeType":"VariableDeclaration","scope":343,"src":"3308:10:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":333,"name":"address","nodeType":"ElementaryTypeName","src":"3308:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":336,"mutability":"mutable","name":"value","nameLocation":"3328:5:4","nodeType":"VariableDeclaration","scope":343,"src":"3320:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":335,"name":"uint256","nodeType":"ElementaryTypeName","src":"3320:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":338,"mutability":"mutable","name":"data","nameLocation":"3350:4:4","nodeType":"VariableDeclaration","scope":343,"src":"3335:19:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":337,"name":"bytes","nodeType":"ElementaryTypeName","src":"3335:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3293:62:4"},"returnParameters":{"id":342,"nodeType":"ParameterList","parameters":[{"constant":false,"id":341,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":343,"src":"3374:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":340,"name":"bool","nodeType":"ElementaryTypeName","src":"3374:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3373:6:4"},"scope":366,"src":"3265:115:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":344,"nodeType":"StructuredDocumentation","src":"3386:390:4","text":" @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n @param spender The address which will spend the funds.\n @param value The amount of tokens to be spent.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"3177029f","id":353,"implemented":false,"kind":"function","modifiers":[],"name":"approveAndCall","nameLocation":"3790:14:4","nodeType":"FunctionDefinition","parameters":{"id":349,"nodeType":"ParameterList","parameters":[{"constant":false,"id":346,"mutability":"mutable","name":"spender","nameLocation":"3813:7:4","nodeType":"VariableDeclaration","scope":353,"src":"3805:15:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":345,"name":"address","nodeType":"ElementaryTypeName","src":"3805:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":348,"mutability":"mutable","name":"value","nameLocation":"3830:5:4","nodeType":"VariableDeclaration","scope":353,"src":"3822:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":347,"name":"uint256","nodeType":"ElementaryTypeName","src":"3822:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3804:32:4"},"returnParameters":{"id":352,"nodeType":"ParameterList","parameters":[{"constant":false,"id":351,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":353,"src":"3855:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":350,"name":"bool","nodeType":"ElementaryTypeName","src":"3855:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3854:6:4"},"scope":366,"src":"3781:80:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":354,"nodeType":"StructuredDocumentation","src":"3867:478:4","text":" @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n @param spender The address which will spend the funds.\n @param value The amount of tokens to be spent.\n @param data Additional data with no specified format, sent in call to `spender`.\n @return A boolean value indicating whether the operation succeeded unless throwing."},"functionSelector":"cae9ca51","id":365,"implemented":false,"kind":"function","modifiers":[],"name":"approveAndCall","nameLocation":"4359:14:4","nodeType":"FunctionDefinition","parameters":{"id":361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":356,"mutability":"mutable","name":"spender","nameLocation":"4382:7:4","nodeType":"VariableDeclaration","scope":365,"src":"4374:15:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":355,"name":"address","nodeType":"ElementaryTypeName","src":"4374:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":358,"mutability":"mutable","name":"value","nameLocation":"4399:5:4","nodeType":"VariableDeclaration","scope":365,"src":"4391:13:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":357,"name":"uint256","nodeType":"ElementaryTypeName","src":"4391:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":360,"mutability":"mutable","name":"data","nameLocation":"4421:4:4","nodeType":"VariableDeclaration","scope":365,"src":"4406:19:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":359,"name":"bytes","nodeType":"ElementaryTypeName","src":"4406:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4373:53:4"},"returnParameters":{"id":364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":363,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":365,"src":"4445:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":362,"name":"bool","nodeType":"ElementaryTypeName","src":"4445:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4444:6:4"},"scope":366,"src":"4350:101:4","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":367,"src":"568:3885:4","usedErrors":[],"usedEvents":[386,395]}],"src":"107:4347:4"},"id":4},"@openzeppelin/contracts/interfaces/IERC165.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/IERC165.sol","exportedSymbols":{"IERC165":[4348]},"id":371,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":368,"literals":["solidity",">=","0.4",".16"],"nodeType":"PragmaDirective","src":"106:25:5"},{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","file":"../utils/introspection/IERC165.sol","id":370,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":371,"sourceUnit":4349,"src":"133:59:5","symbolAliases":[{"foreign":{"id":369,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4348,"src":"141:7:5","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""}],"src":"106:87:5"},"id":5},"@openzeppelin/contracts/interfaces/IERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","exportedSymbols":{"IERC20":[452]},"id":375,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":372,"literals":["solidity",">=","0.4",".16"],"nodeType":"PragmaDirective","src":"105:25:6"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"../token/ERC20/IERC20.sol","id":374,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":375,"sourceUnit":453,"src":"132:49:6","symbolAliases":[{"foreign":{"id":373,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"140:6:6","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""}],"src":"105:77:6"},"id":6},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","exportedSymbols":{"IERC20":[452]},"id":453,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":376,"literals":["solidity",">=","0.4",".16"],"nodeType":"PragmaDirective","src":"106:25:7"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20","contractDependencies":[],"contractKind":"interface","documentation":{"id":377,"nodeType":"StructuredDocumentation","src":"133:71:7","text":" @dev Interface of the ERC-20 standard as defined in the ERC."},"fullyImplemented":false,"id":452,"linearizedBaseContracts":[452],"name":"IERC20","nameLocation":"215:6:7","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"documentation":{"id":378,"nodeType":"StructuredDocumentation","src":"228:158:7","text":" @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."},"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","id":386,"name":"Transfer","nameLocation":"397:8:7","nodeType":"EventDefinition","parameters":{"id":385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":380,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"422:4:7","nodeType":"VariableDeclaration","scope":386,"src":"406:20:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":379,"name":"address","nodeType":"ElementaryTypeName","src":"406:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":382,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"444:2:7","nodeType":"VariableDeclaration","scope":386,"src":"428:18:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":381,"name":"address","nodeType":"ElementaryTypeName","src":"428:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":384,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"456:5:7","nodeType":"VariableDeclaration","scope":386,"src":"448:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":383,"name":"uint256","nodeType":"ElementaryTypeName","src":"448:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"405:57:7"},"src":"391:72:7"},{"anonymous":false,"documentation":{"id":387,"nodeType":"StructuredDocumentation","src":"469:148:7","text":" @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."},"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","id":395,"name":"Approval","nameLocation":"628:8:7","nodeType":"EventDefinition","parameters":{"id":394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":389,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"653:5:7","nodeType":"VariableDeclaration","scope":395,"src":"637:21:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":388,"name":"address","nodeType":"ElementaryTypeName","src":"637:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":391,"indexed":true,"mutability":"mutable","name":"spender","nameLocation":"676:7:7","nodeType":"VariableDeclaration","scope":395,"src":"660:23:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":390,"name":"address","nodeType":"ElementaryTypeName","src":"660:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":393,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"693:5:7","nodeType":"VariableDeclaration","scope":395,"src":"685:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":392,"name":"uint256","nodeType":"ElementaryTypeName","src":"685:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"636:63:7"},"src":"622:78:7"},{"documentation":{"id":396,"nodeType":"StructuredDocumentation","src":"706:65:7","text":" @dev Returns the value of tokens in existence."},"functionSelector":"18160ddd","id":401,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"785:11:7","nodeType":"FunctionDefinition","parameters":{"id":397,"nodeType":"ParameterList","parameters":[],"src":"796:2:7"},"returnParameters":{"id":400,"nodeType":"ParameterList","parameters":[{"constant":false,"id":399,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":401,"src":"822:7:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":398,"name":"uint256","nodeType":"ElementaryTypeName","src":"822:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"821:9:7"},"scope":452,"src":"776:55:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":402,"nodeType":"StructuredDocumentation","src":"837:71:7","text":" @dev Returns the value of tokens owned by `account`."},"functionSelector":"70a08231","id":409,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"922:9:7","nodeType":"FunctionDefinition","parameters":{"id":405,"nodeType":"ParameterList","parameters":[{"constant":false,"id":404,"mutability":"mutable","name":"account","nameLocation":"940:7:7","nodeType":"VariableDeclaration","scope":409,"src":"932:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":403,"name":"address","nodeType":"ElementaryTypeName","src":"932:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"931:17:7"},"returnParameters":{"id":408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":407,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":409,"src":"972:7:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":406,"name":"uint256","nodeType":"ElementaryTypeName","src":"972:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"971:9:7"},"scope":452,"src":"913:68:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":410,"nodeType":"StructuredDocumentation","src":"987:213:7","text":" @dev Moves a `value` amount of tokens from the caller's account to `to`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"a9059cbb","id":419,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"1214:8:7","nodeType":"FunctionDefinition","parameters":{"id":415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":412,"mutability":"mutable","name":"to","nameLocation":"1231:2:7","nodeType":"VariableDeclaration","scope":419,"src":"1223:10:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":411,"name":"address","nodeType":"ElementaryTypeName","src":"1223:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":414,"mutability":"mutable","name":"value","nameLocation":"1243:5:7","nodeType":"VariableDeclaration","scope":419,"src":"1235:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":413,"name":"uint256","nodeType":"ElementaryTypeName","src":"1235:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1222:27:7"},"returnParameters":{"id":418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":417,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":419,"src":"1268:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":416,"name":"bool","nodeType":"ElementaryTypeName","src":"1268:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1267:6:7"},"scope":452,"src":"1205:69:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":420,"nodeType":"StructuredDocumentation","src":"1280:264:7","text":" @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."},"functionSelector":"dd62ed3e","id":429,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"1558:9:7","nodeType":"FunctionDefinition","parameters":{"id":425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":422,"mutability":"mutable","name":"owner","nameLocation":"1576:5:7","nodeType":"VariableDeclaration","scope":429,"src":"1568:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":421,"name":"address","nodeType":"ElementaryTypeName","src":"1568:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":424,"mutability":"mutable","name":"spender","nameLocation":"1591:7:7","nodeType":"VariableDeclaration","scope":429,"src":"1583:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":423,"name":"address","nodeType":"ElementaryTypeName","src":"1583:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1567:32:7"},"returnParameters":{"id":428,"nodeType":"ParameterList","parameters":[{"constant":false,"id":427,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":429,"src":"1623:7:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":426,"name":"uint256","nodeType":"ElementaryTypeName","src":"1623:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1622:9:7"},"scope":452,"src":"1549:83:7","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":430,"nodeType":"StructuredDocumentation","src":"1638:667:7","text":" @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."},"functionSelector":"095ea7b3","id":439,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"2319:7:7","nodeType":"FunctionDefinition","parameters":{"id":435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":432,"mutability":"mutable","name":"spender","nameLocation":"2335:7:7","nodeType":"VariableDeclaration","scope":439,"src":"2327:15:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":431,"name":"address","nodeType":"ElementaryTypeName","src":"2327:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":434,"mutability":"mutable","name":"value","nameLocation":"2352:5:7","nodeType":"VariableDeclaration","scope":439,"src":"2344:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":433,"name":"uint256","nodeType":"ElementaryTypeName","src":"2344:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2326:32:7"},"returnParameters":{"id":438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":437,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":439,"src":"2377:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":436,"name":"bool","nodeType":"ElementaryTypeName","src":"2377:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2376:6:7"},"scope":452,"src":"2310:73:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":440,"nodeType":"StructuredDocumentation","src":"2389:297:7","text":" @dev Moves a `value` amount of tokens from `from` to `to` using the\n allowance mechanism. `value` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."},"functionSelector":"23b872dd","id":451,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"2700:12:7","nodeType":"FunctionDefinition","parameters":{"id":447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":442,"mutability":"mutable","name":"from","nameLocation":"2721:4:7","nodeType":"VariableDeclaration","scope":451,"src":"2713:12:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":441,"name":"address","nodeType":"ElementaryTypeName","src":"2713:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":444,"mutability":"mutable","name":"to","nameLocation":"2735:2:7","nodeType":"VariableDeclaration","scope":451,"src":"2727:10:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":443,"name":"address","nodeType":"ElementaryTypeName","src":"2727:7:7","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":446,"mutability":"mutable","name":"value","nameLocation":"2747:5:7","nodeType":"VariableDeclaration","scope":451,"src":"2739:13:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":445,"name":"uint256","nodeType":"ElementaryTypeName","src":"2739:7:7","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2712:41:7"},"returnParameters":{"id":450,"nodeType":"ParameterList","parameters":[{"constant":false,"id":449,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":451,"src":"2772:4:7","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":448,"name":"bool","nodeType":"ElementaryTypeName","src":"2772:4:7","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2771:6:7"},"scope":452,"src":"2691:87:7","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":453,"src":"205:2575:7","usedErrors":[],"usedEvents":[386,395]}],"src":"106:2675:7"},"id":7},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","exportedSymbols":{"IERC1363":[366],"IERC20":[452],"SafeERC20":[916]},"id":917,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":454,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"115:24:8"},{"absolutePath":"@openzeppelin/contracts/token/ERC20/IERC20.sol","file":"../IERC20.sol","id":456,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":917,"sourceUnit":453,"src":"141:37:8","symbolAliases":[{"foreign":{"id":455,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"149:6:8","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC1363.sol","file":"../../../interfaces/IERC1363.sol","id":458,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":917,"sourceUnit":367,"src":"179:58:8","symbolAliases":[{"foreign":{"id":457,"name":"IERC1363","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":366,"src":"187:8:8","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SafeERC20","contractDependencies":[],"contractKind":"library","documentation":{"id":459,"nodeType":"StructuredDocumentation","src":"239:458:8","text":" @title SafeERC20\n @dev Wrappers around ERC-20 operations that throw on failure (when the token\n contract returns false). Tokens that return no value (and instead revert or\n throw on failure) are also supported, non-reverting calls are assumed to be\n successful.\n To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n which allows you to call the safe operations as `token.safeTransfer(...)`, etc."},"fullyImplemented":true,"id":916,"linearizedBaseContracts":[916],"name":"SafeERC20","nameLocation":"706:9:8","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":460,"nodeType":"StructuredDocumentation","src":"722:65:8","text":" @dev An operation with an ERC-20 token failed."},"errorSelector":"5274afe7","id":464,"name":"SafeERC20FailedOperation","nameLocation":"798:24:8","nodeType":"ErrorDefinition","parameters":{"id":463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":462,"mutability":"mutable","name":"token","nameLocation":"831:5:8","nodeType":"VariableDeclaration","scope":464,"src":"823:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":461,"name":"address","nodeType":"ElementaryTypeName","src":"823:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"822:15:8"},"src":"792:46:8"},{"documentation":{"id":465,"nodeType":"StructuredDocumentation","src":"844:71:8","text":" @dev Indicates a failed `decreaseAllowance` request."},"errorSelector":"e570110f","id":473,"name":"SafeERC20FailedDecreaseAllowance","nameLocation":"926:32:8","nodeType":"ErrorDefinition","parameters":{"id":472,"nodeType":"ParameterList","parameters":[{"constant":false,"id":467,"mutability":"mutable","name":"spender","nameLocation":"967:7:8","nodeType":"VariableDeclaration","scope":473,"src":"959:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":466,"name":"address","nodeType":"ElementaryTypeName","src":"959:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":469,"mutability":"mutable","name":"currentAllowance","nameLocation":"984:16:8","nodeType":"VariableDeclaration","scope":473,"src":"976:24:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":468,"name":"uint256","nodeType":"ElementaryTypeName","src":"976:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":471,"mutability":"mutable","name":"requestedDecrease","nameLocation":"1010:17:8","nodeType":"VariableDeclaration","scope":473,"src":"1002:25:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":470,"name":"uint256","nodeType":"ElementaryTypeName","src":"1002:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"958:70:8"},"src":"920:109:8"},{"body":{"id":496,"nodeType":"Block","src":"1291:88:8","statements":[{"expression":{"arguments":[{"id":485,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":477,"src":"1321:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"arguments":[{"expression":{"id":488,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":477,"src":"1343:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1349:8:8","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":419,"src":"1343:14:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},{"components":[{"id":490,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":479,"src":"1360:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":491,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":481,"src":"1364:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":492,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1359:11:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}],"expression":{"id":486,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1328:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":487,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1332:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"1328:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":493,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1328:43:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":484,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":874,"src":"1301:19:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1301:71:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":495,"nodeType":"ExpressionStatement","src":"1301:71:8"}]},"documentation":{"id":474,"nodeType":"StructuredDocumentation","src":"1035:179:8","text":" @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n non-reverting calls are assumed to be successful."},"id":497,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransfer","nameLocation":"1228:12:8","nodeType":"FunctionDefinition","parameters":{"id":482,"nodeType":"ParameterList","parameters":[{"constant":false,"id":477,"mutability":"mutable","name":"token","nameLocation":"1248:5:8","nodeType":"VariableDeclaration","scope":497,"src":"1241:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":476,"nodeType":"UserDefinedTypeName","pathNode":{"id":475,"name":"IERC20","nameLocations":["1241:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1241:6:8"},"referencedDeclaration":452,"src":"1241:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":479,"mutability":"mutable","name":"to","nameLocation":"1263:2:8","nodeType":"VariableDeclaration","scope":497,"src":"1255:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":478,"name":"address","nodeType":"ElementaryTypeName","src":"1255:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":481,"mutability":"mutable","name":"value","nameLocation":"1275:5:8","nodeType":"VariableDeclaration","scope":497,"src":"1267:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":480,"name":"uint256","nodeType":"ElementaryTypeName","src":"1267:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1240:41:8"},"returnParameters":{"id":483,"nodeType":"ParameterList","parameters":[],"src":"1291:0:8"},"scope":916,"src":"1219:160:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":523,"nodeType":"Block","src":"1708:98:8","statements":[{"expression":{"arguments":[{"id":511,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":501,"src":"1738:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"arguments":[{"expression":{"id":514,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":501,"src":"1760:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":515,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1766:12:8","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":451,"src":"1760:18:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"}},{"components":[{"id":516,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":503,"src":"1781:4:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":517,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":505,"src":"1787:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":518,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"1791:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":519,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1780:17:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_address_$_t_uint256_$","typeString":"tuple(address,address,uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_address_$_t_uint256_$","typeString":"tuple(address,address,uint256)"}],"expression":{"id":512,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1745:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":513,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1749:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"1745:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":520,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1745:53:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":510,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":874,"src":"1718:19:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1718:81:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":522,"nodeType":"ExpressionStatement","src":"1718:81:8"}]},"documentation":{"id":498,"nodeType":"StructuredDocumentation","src":"1385:228:8","text":" @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n calling contract. If `token` returns no value, non-reverting calls are assumed to be successful."},"id":524,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"1627:16:8","nodeType":"FunctionDefinition","parameters":{"id":508,"nodeType":"ParameterList","parameters":[{"constant":false,"id":501,"mutability":"mutable","name":"token","nameLocation":"1651:5:8","nodeType":"VariableDeclaration","scope":524,"src":"1644:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":500,"nodeType":"UserDefinedTypeName","pathNode":{"id":499,"name":"IERC20","nameLocations":["1644:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1644:6:8"},"referencedDeclaration":452,"src":"1644:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":503,"mutability":"mutable","name":"from","nameLocation":"1666:4:8","nodeType":"VariableDeclaration","scope":524,"src":"1658:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":502,"name":"address","nodeType":"ElementaryTypeName","src":"1658:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":505,"mutability":"mutable","name":"to","nameLocation":"1680:2:8","nodeType":"VariableDeclaration","scope":524,"src":"1672:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":504,"name":"address","nodeType":"ElementaryTypeName","src":"1672:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":507,"mutability":"mutable","name":"value","nameLocation":"1692:5:8","nodeType":"VariableDeclaration","scope":524,"src":"1684:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":506,"name":"uint256","nodeType":"ElementaryTypeName","src":"1684:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1643:55:8"},"returnParameters":{"id":509,"nodeType":"ParameterList","parameters":[],"src":"1708:0:8"},"scope":916,"src":"1618:188:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":549,"nodeType":"Block","src":"2033:99:8","statements":[{"expression":{"arguments":[{"id":538,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":528,"src":"2074:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"arguments":[{"expression":{"id":541,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":528,"src":"2096:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2102:8:8","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":419,"src":"2096:14:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},{"components":[{"id":543,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":530,"src":"2113:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":544,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":532,"src":"2117:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":545,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2112:11:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}],"expression":{"id":539,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2081:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":540,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2085:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"2081:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2081:43:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":537,"name":"_callOptionalReturnBool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":915,"src":"2050:23:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (contract IERC20,bytes memory) returns (bool)"}},"id":547,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2050:75:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":536,"id":548,"nodeType":"Return","src":"2043:82:8"}]},"documentation":{"id":525,"nodeType":"StructuredDocumentation","src":"1812:126:8","text":" @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful."},"id":550,"implemented":true,"kind":"function","modifiers":[],"name":"trySafeTransfer","nameLocation":"1952:15:8","nodeType":"FunctionDefinition","parameters":{"id":533,"nodeType":"ParameterList","parameters":[{"constant":false,"id":528,"mutability":"mutable","name":"token","nameLocation":"1975:5:8","nodeType":"VariableDeclaration","scope":550,"src":"1968:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":527,"nodeType":"UserDefinedTypeName","pathNode":{"id":526,"name":"IERC20","nameLocations":["1968:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1968:6:8"},"referencedDeclaration":452,"src":"1968:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":530,"mutability":"mutable","name":"to","nameLocation":"1990:2:8","nodeType":"VariableDeclaration","scope":550,"src":"1982:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":529,"name":"address","nodeType":"ElementaryTypeName","src":"1982:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":532,"mutability":"mutable","name":"value","nameLocation":"2002:5:8","nodeType":"VariableDeclaration","scope":550,"src":"1994:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":531,"name":"uint256","nodeType":"ElementaryTypeName","src":"1994:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1967:41:8"},"returnParameters":{"id":536,"nodeType":"ParameterList","parameters":[{"constant":false,"id":535,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":550,"src":"2027:4:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":534,"name":"bool","nodeType":"ElementaryTypeName","src":"2027:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2026:6:8"},"scope":916,"src":"1943:189:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":578,"nodeType":"Block","src":"2381:109:8","statements":[{"expression":{"arguments":[{"id":566,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":554,"src":"2422:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"arguments":[{"expression":{"id":569,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":554,"src":"2444:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2450:12:8","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":451,"src":"2444:18:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"}},{"components":[{"id":571,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":556,"src":"2465:4:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":572,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":558,"src":"2471:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":573,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":560,"src":"2475:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":574,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2464:17:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_address_$_t_uint256_$","typeString":"tuple(address,address,uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_address_$_t_uint256_$","typeString":"tuple(address,address,uint256)"}],"expression":{"id":567,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2429:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":568,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2433:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"2429:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2429:53:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":565,"name":"_callOptionalReturnBool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":915,"src":"2398:23:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (contract IERC20,bytes memory) returns (bool)"}},"id":576,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2398:85:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":564,"id":577,"nodeType":"Return","src":"2391:92:8"}]},"documentation":{"id":551,"nodeType":"StructuredDocumentation","src":"2138:130:8","text":" @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful."},"id":579,"implemented":true,"kind":"function","modifiers":[],"name":"trySafeTransferFrom","nameLocation":"2282:19:8","nodeType":"FunctionDefinition","parameters":{"id":561,"nodeType":"ParameterList","parameters":[{"constant":false,"id":554,"mutability":"mutable","name":"token","nameLocation":"2309:5:8","nodeType":"VariableDeclaration","scope":579,"src":"2302:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":553,"nodeType":"UserDefinedTypeName","pathNode":{"id":552,"name":"IERC20","nameLocations":["2302:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"2302:6:8"},"referencedDeclaration":452,"src":"2302:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":556,"mutability":"mutable","name":"from","nameLocation":"2324:4:8","nodeType":"VariableDeclaration","scope":579,"src":"2316:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":555,"name":"address","nodeType":"ElementaryTypeName","src":"2316:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":558,"mutability":"mutable","name":"to","nameLocation":"2338:2:8","nodeType":"VariableDeclaration","scope":579,"src":"2330:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":557,"name":"address","nodeType":"ElementaryTypeName","src":"2330:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":560,"mutability":"mutable","name":"value","nameLocation":"2350:5:8","nodeType":"VariableDeclaration","scope":579,"src":"2342:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":559,"name":"uint256","nodeType":"ElementaryTypeName","src":"2342:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2301:55:8"},"returnParameters":{"id":564,"nodeType":"ParameterList","parameters":[{"constant":false,"id":563,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":579,"src":"2375:4:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":562,"name":"bool","nodeType":"ElementaryTypeName","src":"2375:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2374:6:8"},"scope":916,"src":"2273:217:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":609,"nodeType":"Block","src":"3232:139:8","statements":[{"assignments":[591],"declarations":[{"constant":false,"id":591,"mutability":"mutable","name":"oldAllowance","nameLocation":"3250:12:8","nodeType":"VariableDeclaration","scope":609,"src":"3242:20:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":590,"name":"uint256","nodeType":"ElementaryTypeName","src":"3242:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":600,"initialValue":{"arguments":[{"arguments":[{"id":596,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3289:4:8","typeDescriptions":{"typeIdentifier":"t_contract$_SafeERC20_$916","typeString":"library SafeERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeERC20_$916","typeString":"library SafeERC20"}],"id":595,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3281:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":594,"name":"address","nodeType":"ElementaryTypeName","src":"3281:7:8","typeDescriptions":{}}},"id":597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3281:13:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":598,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":585,"src":"3296:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":592,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":583,"src":"3265:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":593,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3271:9:8","memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":429,"src":"3265:15:8","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view external returns (uint256)"}},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3265:39:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3242:62:8"},{"expression":{"arguments":[{"id":602,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":583,"src":"3327:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":603,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":585,"src":"3334:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":604,"name":"oldAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":591,"src":"3343:12:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":605,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":587,"src":"3358:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3343:20:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":601,"name":"forceApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":700,"src":"3314:12:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$","typeString":"function (contract IERC20,address,uint256)"}},"id":607,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3314:50:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":608,"nodeType":"ExpressionStatement","src":"3314:50:8"}]},"documentation":{"id":580,"nodeType":"StructuredDocumentation","src":"2496:645:8","text":" @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n non-reverting calls are assumed to be successful.\n IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior."},"id":610,"implemented":true,"kind":"function","modifiers":[],"name":"safeIncreaseAllowance","nameLocation":"3155:21:8","nodeType":"FunctionDefinition","parameters":{"id":588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":583,"mutability":"mutable","name":"token","nameLocation":"3184:5:8","nodeType":"VariableDeclaration","scope":610,"src":"3177:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":582,"nodeType":"UserDefinedTypeName","pathNode":{"id":581,"name":"IERC20","nameLocations":["3177:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"3177:6:8"},"referencedDeclaration":452,"src":"3177:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":585,"mutability":"mutable","name":"spender","nameLocation":"3199:7:8","nodeType":"VariableDeclaration","scope":610,"src":"3191:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":584,"name":"address","nodeType":"ElementaryTypeName","src":"3191:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":587,"mutability":"mutable","name":"value","nameLocation":"3216:5:8","nodeType":"VariableDeclaration","scope":610,"src":"3208:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":586,"name":"uint256","nodeType":"ElementaryTypeName","src":"3208:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3176:46:8"},"returnParameters":{"id":589,"nodeType":"ParameterList","parameters":[],"src":"3232:0:8"},"scope":916,"src":"3146:225:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":652,"nodeType":"Block","src":"4137:370:8","statements":[{"id":651,"nodeType":"UncheckedBlock","src":"4147:354:8","statements":[{"assignments":[622],"declarations":[{"constant":false,"id":622,"mutability":"mutable","name":"currentAllowance","nameLocation":"4179:16:8","nodeType":"VariableDeclaration","scope":651,"src":"4171:24:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":621,"name":"uint256","nodeType":"ElementaryTypeName","src":"4171:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":631,"initialValue":{"arguments":[{"arguments":[{"id":627,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4222:4:8","typeDescriptions":{"typeIdentifier":"t_contract$_SafeERC20_$916","typeString":"library SafeERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeERC20_$916","typeString":"library SafeERC20"}],"id":626,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4214:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":625,"name":"address","nodeType":"ElementaryTypeName","src":"4214:7:8","typeDescriptions":{}}},"id":628,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4214:13:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":629,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"4229:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":623,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":614,"src":"4198:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4204:9:8","memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":429,"src":"4198:15:8","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view external returns (uint256)"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4198:39:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4171:66:8"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":634,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":632,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":622,"src":"4255:16:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":633,"name":"requestedDecrease","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":618,"src":"4274:17:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4255:36:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":642,"nodeType":"IfStatement","src":"4251:160:8","trueBody":{"id":641,"nodeType":"Block","src":"4293:118:8","statements":[{"errorCall":{"arguments":[{"id":636,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"4351:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":637,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":622,"src":"4360:16:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":638,"name":"requestedDecrease","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":618,"src":"4378:17:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":635,"name":"SafeERC20FailedDecreaseAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":473,"src":"4318:32:8","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4318:78:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":640,"nodeType":"RevertStatement","src":"4311:85:8"}]}},{"expression":{"arguments":[{"id":644,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":614,"src":"4437:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":645,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":616,"src":"4444:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":646,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":622,"src":"4453:16:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":647,"name":"requestedDecrease","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":618,"src":"4472:17:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4453:36:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":643,"name":"forceApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":700,"src":"4424:12:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$","typeString":"function (contract IERC20,address,uint256)"}},"id":649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4424:66:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":650,"nodeType":"ExpressionStatement","src":"4424:66:8"}]}]},"documentation":{"id":611,"nodeType":"StructuredDocumentation","src":"3377:657:8","text":" @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n value, non-reverting calls are assumed to be successful.\n IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior."},"id":653,"implemented":true,"kind":"function","modifiers":[],"name":"safeDecreaseAllowance","nameLocation":"4048:21:8","nodeType":"FunctionDefinition","parameters":{"id":619,"nodeType":"ParameterList","parameters":[{"constant":false,"id":614,"mutability":"mutable","name":"token","nameLocation":"4077:5:8","nodeType":"VariableDeclaration","scope":653,"src":"4070:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":613,"nodeType":"UserDefinedTypeName","pathNode":{"id":612,"name":"IERC20","nameLocations":["4070:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"4070:6:8"},"referencedDeclaration":452,"src":"4070:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":616,"mutability":"mutable","name":"spender","nameLocation":"4092:7:8","nodeType":"VariableDeclaration","scope":653,"src":"4084:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":615,"name":"address","nodeType":"ElementaryTypeName","src":"4084:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":618,"mutability":"mutable","name":"requestedDecrease","nameLocation":"4109:17:8","nodeType":"VariableDeclaration","scope":653,"src":"4101:25:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":617,"name":"uint256","nodeType":"ElementaryTypeName","src":"4101:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4069:58:8"},"returnParameters":{"id":620,"nodeType":"ParameterList","parameters":[],"src":"4137:0:8"},"scope":916,"src":"4039:468:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":699,"nodeType":"Block","src":"5161:303:8","statements":[{"assignments":[665],"declarations":[{"constant":false,"id":665,"mutability":"mutable","name":"approvalCall","nameLocation":"5184:12:8","nodeType":"VariableDeclaration","scope":699,"src":"5171:25:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":664,"name":"bytes","nodeType":"ElementaryTypeName","src":"5171:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":674,"initialValue":{"arguments":[{"expression":{"id":668,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"5214:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5220:7:8","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":439,"src":"5214:13:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},{"components":[{"id":670,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":659,"src":"5230:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":671,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":661,"src":"5239:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":672,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5229:16:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}],"expression":{"id":666,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5199:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":667,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5203:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"5199:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":673,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5199:47:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"5171:75:8"},{"condition":{"id":679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5261:45:8","subExpression":{"arguments":[{"id":676,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"5286:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":677,"name":"approvalCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5293:12:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":675,"name":"_callOptionalReturnBool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":915,"src":"5262:23:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (contract IERC20,bytes memory) returns (bool)"}},"id":678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5262:44:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":698,"nodeType":"IfStatement","src":"5257:201:8","trueBody":{"id":697,"nodeType":"Block","src":"5308:150:8","statements":[{"expression":{"arguments":[{"id":681,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"5342:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"arguments":[{"expression":{"id":684,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"5364:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":685,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5370:7:8","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":439,"src":"5364:13:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"}},{"components":[{"id":686,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":659,"src":"5380:7:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"30","id":687,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5389:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":688,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5379:12:8","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_rational_0_by_1_$","typeString":"tuple(address,int_const 0)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,uint256) external returns (bool)"},{"typeIdentifier":"t_tuple$_t_address_$_t_rational_0_by_1_$","typeString":"tuple(address,int_const 0)"}],"expression":{"id":682,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5349:3:8","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":683,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5353:10:8","memberName":"encodeCall","nodeType":"MemberAccess","src":"5349:14:8","typeDescriptions":{"typeIdentifier":"t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5349:43:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":680,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":874,"src":"5322:19:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5322:71:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":691,"nodeType":"ExpressionStatement","src":"5322:71:8"},{"expression":{"arguments":[{"id":693,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"5427:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":694,"name":"approvalCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5434:12:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":692,"name":"_callOptionalReturn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":874,"src":"5407:19:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (contract IERC20,bytes memory)"}},"id":695,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5407:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":696,"nodeType":"ExpressionStatement","src":"5407:40:8"}]}}]},"documentation":{"id":654,"nodeType":"StructuredDocumentation","src":"4513:566:8","text":" @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n to be set to zero before setting it to a non-zero value, such as USDT.\n NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n set here."},"id":700,"implemented":true,"kind":"function","modifiers":[],"name":"forceApprove","nameLocation":"5093:12:8","nodeType":"FunctionDefinition","parameters":{"id":662,"nodeType":"ParameterList","parameters":[{"constant":false,"id":657,"mutability":"mutable","name":"token","nameLocation":"5113:5:8","nodeType":"VariableDeclaration","scope":700,"src":"5106:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":656,"nodeType":"UserDefinedTypeName","pathNode":{"id":655,"name":"IERC20","nameLocations":["5106:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"5106:6:8"},"referencedDeclaration":452,"src":"5106:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":659,"mutability":"mutable","name":"spender","nameLocation":"5128:7:8","nodeType":"VariableDeclaration","scope":700,"src":"5120:15:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":658,"name":"address","nodeType":"ElementaryTypeName","src":"5120:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":661,"mutability":"mutable","name":"value","nameLocation":"5145:5:8","nodeType":"VariableDeclaration","scope":700,"src":"5137:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":660,"name":"uint256","nodeType":"ElementaryTypeName","src":"5137:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5105:46:8"},"returnParameters":{"id":663,"nodeType":"ParameterList","parameters":[],"src":"5161:0:8"},"scope":916,"src":"5084:380:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":742,"nodeType":"Block","src":"5911:219:8","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":713,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":706,"src":"5925:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5928:4:8","memberName":"code","nodeType":"MemberAccess","src":"5925:7:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5933:6:8","memberName":"length","nodeType":"MemberAccess","src":"5925:14:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5943:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5925:19:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"id":731,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6011:39:8","subExpression":{"arguments":[{"id":727,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":706,"src":"6034:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":728,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"6038:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":729,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":710,"src":"6045:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":725,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":704,"src":"6012:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"id":726,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6018:15:8","memberName":"transferAndCall","nodeType":"MemberAccess","referencedDeclaration":317,"src":"6012:21:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory) external returns (bool)"}},"id":730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6012:38:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":740,"nodeType":"IfStatement","src":"6007:117:8","trueBody":{"id":739,"nodeType":"Block","src":"6052:72:8","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":735,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":704,"src":"6106:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}],"id":734,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6098:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":733,"name":"address","nodeType":"ElementaryTypeName","src":"6098:7:8","typeDescriptions":{}}},"id":736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6098:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":732,"name":"SafeERC20FailedOperation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"6073:24:8","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6073:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":738,"nodeType":"RevertStatement","src":"6066:47:8"}]}},"id":741,"nodeType":"IfStatement","src":"5921:203:8","trueBody":{"id":724,"nodeType":"Block","src":"5946:55:8","statements":[{"expression":{"arguments":[{"id":719,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":704,"src":"5973:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},{"id":720,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":706,"src":"5980:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":721,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"5984:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":718,"name":"safeTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":497,"src":"5960:12:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$","typeString":"function (contract IERC20,address,uint256)"}},"id":722,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5960:30:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":723,"nodeType":"ExpressionStatement","src":"5960:30:8"}]}}]},"documentation":{"id":701,"nodeType":"StructuredDocumentation","src":"5470:333:8","text":" @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n targeting contracts.\n Reverts if the returned value is other than `true`."},"id":743,"implemented":true,"kind":"function","modifiers":[],"name":"transferAndCallRelaxed","nameLocation":"5817:22:8","nodeType":"FunctionDefinition","parameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":704,"mutability":"mutable","name":"token","nameLocation":"5849:5:8","nodeType":"VariableDeclaration","scope":743,"src":"5840:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},"typeName":{"id":703,"nodeType":"UserDefinedTypeName","pathNode":{"id":702,"name":"IERC1363","nameLocations":["5840:8:8"],"nodeType":"IdentifierPath","referencedDeclaration":366,"src":"5840:8:8"},"referencedDeclaration":366,"src":"5840:8:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"visibility":"internal"},{"constant":false,"id":706,"mutability":"mutable","name":"to","nameLocation":"5864:2:8","nodeType":"VariableDeclaration","scope":743,"src":"5856:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":705,"name":"address","nodeType":"ElementaryTypeName","src":"5856:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":708,"mutability":"mutable","name":"value","nameLocation":"5876:5:8","nodeType":"VariableDeclaration","scope":743,"src":"5868:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"5868:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":710,"mutability":"mutable","name":"data","nameLocation":"5896:4:8","nodeType":"VariableDeclaration","scope":743,"src":"5883:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":709,"name":"bytes","nodeType":"ElementaryTypeName","src":"5883:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5839:62:8"},"returnParameters":{"id":712,"nodeType":"ParameterList","parameters":[],"src":"5911:0:8"},"scope":916,"src":"5808:322:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":789,"nodeType":"Block","src":"6649:239:8","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":758,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":751,"src":"6663:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6666:4:8","memberName":"code","nodeType":"MemberAccess","src":"6663:7:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6671:6:8","memberName":"length","nodeType":"MemberAccess","src":"6663:14:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":761,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6681:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6663:19:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"id":778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6759:49:8","subExpression":{"arguments":[{"id":773,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":749,"src":"6786:4:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":774,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":751,"src":"6792:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":775,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":753,"src":"6796:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":776,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":755,"src":"6803:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":771,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":747,"src":"6760:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"id":772,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6766:19:8","memberName":"transferFromAndCall","nodeType":"MemberAccess","referencedDeclaration":343,"src":"6760:25:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,address,uint256,bytes memory) external returns (bool)"}},"id":777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6760:48:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":787,"nodeType":"IfStatement","src":"6755:127:8","trueBody":{"id":786,"nodeType":"Block","src":"6810:72:8","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":782,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":747,"src":"6864:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}],"id":781,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6856:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":780,"name":"address","nodeType":"ElementaryTypeName","src":"6856:7:8","typeDescriptions":{}}},"id":783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6856:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":779,"name":"SafeERC20FailedOperation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"6831:24:8","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6831:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":785,"nodeType":"RevertStatement","src":"6824:47:8"}]}},"id":788,"nodeType":"IfStatement","src":"6659:223:8","trueBody":{"id":770,"nodeType":"Block","src":"6684:65:8","statements":[{"expression":{"arguments":[{"id":764,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":747,"src":"6715:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},{"id":765,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":749,"src":"6722:4:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":766,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":751,"src":"6728:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":767,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":753,"src":"6732:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":763,"name":"safeTransferFrom","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":524,"src":"6698:16:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6698:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":769,"nodeType":"ExpressionStatement","src":"6698:40:8"}]}}]},"documentation":{"id":744,"nodeType":"StructuredDocumentation","src":"6136:341:8","text":" @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n targeting contracts.\n Reverts if the returned value is other than `true`."},"id":790,"implemented":true,"kind":"function","modifiers":[],"name":"transferFromAndCallRelaxed","nameLocation":"6491:26:8","nodeType":"FunctionDefinition","parameters":{"id":756,"nodeType":"ParameterList","parameters":[{"constant":false,"id":747,"mutability":"mutable","name":"token","nameLocation":"6536:5:8","nodeType":"VariableDeclaration","scope":790,"src":"6527:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},"typeName":{"id":746,"nodeType":"UserDefinedTypeName","pathNode":{"id":745,"name":"IERC1363","nameLocations":["6527:8:8"],"nodeType":"IdentifierPath","referencedDeclaration":366,"src":"6527:8:8"},"referencedDeclaration":366,"src":"6527:8:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"visibility":"internal"},{"constant":false,"id":749,"mutability":"mutable","name":"from","nameLocation":"6559:4:8","nodeType":"VariableDeclaration","scope":790,"src":"6551:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":748,"name":"address","nodeType":"ElementaryTypeName","src":"6551:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":751,"mutability":"mutable","name":"to","nameLocation":"6581:2:8","nodeType":"VariableDeclaration","scope":790,"src":"6573:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":750,"name":"address","nodeType":"ElementaryTypeName","src":"6573:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":753,"mutability":"mutable","name":"value","nameLocation":"6601:5:8","nodeType":"VariableDeclaration","scope":790,"src":"6593:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":752,"name":"uint256","nodeType":"ElementaryTypeName","src":"6593:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":755,"mutability":"mutable","name":"data","nameLocation":"6629:4:8","nodeType":"VariableDeclaration","scope":790,"src":"6616:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":754,"name":"bytes","nodeType":"ElementaryTypeName","src":"6616:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6517:122:8"},"returnParameters":{"id":757,"nodeType":"ParameterList","parameters":[],"src":"6649:0:8"},"scope":916,"src":"6482:406:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":832,"nodeType":"Block","src":"7655:218:8","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":803,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"7669:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7672:4:8","memberName":"code","nodeType":"MemberAccess","src":"7669:7:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":805,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7677:6:8","memberName":"length","nodeType":"MemberAccess","src":"7669:14:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":806,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7687:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7669:19:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"id":821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"7755:38:8","subExpression":{"arguments":[{"id":817,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"7777:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":818,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":798,"src":"7781:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":819,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":800,"src":"7788:4:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":815,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":794,"src":"7756:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"id":816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7762:14:8","memberName":"approveAndCall","nodeType":"MemberAccess","referencedDeclaration":365,"src":"7756:20:8","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory) external returns (bool)"}},"id":820,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7756:37:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":830,"nodeType":"IfStatement","src":"7751:116:8","trueBody":{"id":829,"nodeType":"Block","src":"7795:72:8","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":825,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":794,"src":"7849:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}],"id":824,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7841:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":823,"name":"address","nodeType":"ElementaryTypeName","src":"7841:7:8","typeDescriptions":{}}},"id":826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7841:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":822,"name":"SafeERC20FailedOperation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"7816:24:8","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":827,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7816:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":828,"nodeType":"RevertStatement","src":"7809:47:8"}]}},"id":831,"nodeType":"IfStatement","src":"7665:202:8","trueBody":{"id":814,"nodeType":"Block","src":"7690:55:8","statements":[{"expression":{"arguments":[{"id":809,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":794,"src":"7717:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},{"id":810,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"7724:2:8","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":811,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":798,"src":"7728:5:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":808,"name":"forceApprove","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":700,"src":"7704:12:8","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$","typeString":"function (contract IERC20,address,uint256)"}},"id":812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7704:30:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":813,"nodeType":"ExpressionStatement","src":"7704:30:8"}]}}]},"documentation":{"id":791,"nodeType":"StructuredDocumentation","src":"6894:654:8","text":" @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n targeting contracts.\n NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n once without retrying, and relies on the returned value to be true.\n Reverts if the returned value is other than `true`."},"id":833,"implemented":true,"kind":"function","modifiers":[],"name":"approveAndCallRelaxed","nameLocation":"7562:21:8","nodeType":"FunctionDefinition","parameters":{"id":801,"nodeType":"ParameterList","parameters":[{"constant":false,"id":794,"mutability":"mutable","name":"token","nameLocation":"7593:5:8","nodeType":"VariableDeclaration","scope":833,"src":"7584:14:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"},"typeName":{"id":793,"nodeType":"UserDefinedTypeName","pathNode":{"id":792,"name":"IERC1363","nameLocations":["7584:8:8"],"nodeType":"IdentifierPath","referencedDeclaration":366,"src":"7584:8:8"},"referencedDeclaration":366,"src":"7584:8:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1363_$366","typeString":"contract IERC1363"}},"visibility":"internal"},{"constant":false,"id":796,"mutability":"mutable","name":"to","nameLocation":"7608:2:8","nodeType":"VariableDeclaration","scope":833,"src":"7600:10:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":795,"name":"address","nodeType":"ElementaryTypeName","src":"7600:7:8","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":798,"mutability":"mutable","name":"value","nameLocation":"7620:5:8","nodeType":"VariableDeclaration","scope":833,"src":"7612:13:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":797,"name":"uint256","nodeType":"ElementaryTypeName","src":"7612:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":800,"mutability":"mutable","name":"data","nameLocation":"7640:4:8","nodeType":"VariableDeclaration","scope":833,"src":"7627:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":799,"name":"bytes","nodeType":"ElementaryTypeName","src":"7627:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7583:62:8"},"returnParameters":{"id":802,"nodeType":"ParameterList","parameters":[],"src":"7655:0:8"},"scope":916,"src":"7553:320:8","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":873,"nodeType":"Block","src":"8440:650:8","statements":[{"assignments":[843],"declarations":[{"constant":false,"id":843,"mutability":"mutable","name":"returnSize","nameLocation":"8458:10:8","nodeType":"VariableDeclaration","scope":873,"src":"8450:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":842,"name":"uint256","nodeType":"ElementaryTypeName","src":"8450:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":844,"nodeType":"VariableDeclarationStatement","src":"8450:18:8"},{"assignments":[846],"declarations":[{"constant":false,"id":846,"mutability":"mutable","name":"returnValue","nameLocation":"8486:11:8","nodeType":"VariableDeclaration","scope":873,"src":"8478:19:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":845,"name":"uint256","nodeType":"ElementaryTypeName","src":"8478:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":847,"nodeType":"VariableDeclarationStatement","src":"8478:19:8"},{"AST":{"nativeSrc":"8532:396:8","nodeType":"YulBlock","src":"8532:396:8","statements":[{"nativeSrc":"8546:75:8","nodeType":"YulVariableDeclaration","src":"8546:75:8","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nativeSrc":"8566:3:8","nodeType":"YulIdentifier","src":"8566:3:8"},"nativeSrc":"8566:5:8","nodeType":"YulFunctionCall","src":"8566:5:8"},{"name":"token","nativeSrc":"8573:5:8","nodeType":"YulIdentifier","src":"8573:5:8"},{"kind":"number","nativeSrc":"8580:1:8","nodeType":"YulLiteral","src":"8580:1:8","type":"","value":"0"},{"arguments":[{"name":"data","nativeSrc":"8587:4:8","nodeType":"YulIdentifier","src":"8587:4:8"},{"kind":"number","nativeSrc":"8593:4:8","nodeType":"YulLiteral","src":"8593:4:8","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"8583:3:8","nodeType":"YulIdentifier","src":"8583:3:8"},"nativeSrc":"8583:15:8","nodeType":"YulFunctionCall","src":"8583:15:8"},{"arguments":[{"name":"data","nativeSrc":"8606:4:8","nodeType":"YulIdentifier","src":"8606:4:8"}],"functionName":{"name":"mload","nativeSrc":"8600:5:8","nodeType":"YulIdentifier","src":"8600:5:8"},"nativeSrc":"8600:11:8","nodeType":"YulFunctionCall","src":"8600:11:8"},{"kind":"number","nativeSrc":"8613:1:8","nodeType":"YulLiteral","src":"8613:1:8","type":"","value":"0"},{"kind":"number","nativeSrc":"8616:4:8","nodeType":"YulLiteral","src":"8616:4:8","type":"","value":"0x20"}],"functionName":{"name":"call","nativeSrc":"8561:4:8","nodeType":"YulIdentifier","src":"8561:4:8"},"nativeSrc":"8561:60:8","nodeType":"YulFunctionCall","src":"8561:60:8"},"variables":[{"name":"success","nativeSrc":"8550:7:8","nodeType":"YulTypedName","src":"8550:7:8","type":""}]},{"body":{"nativeSrc":"8682:157:8","nodeType":"YulBlock","src":"8682:157:8","statements":[{"nativeSrc":"8700:22:8","nodeType":"YulVariableDeclaration","src":"8700:22:8","value":{"arguments":[{"kind":"number","nativeSrc":"8717:4:8","nodeType":"YulLiteral","src":"8717:4:8","type":"","value":"0x40"}],"functionName":{"name":"mload","nativeSrc":"8711:5:8","nodeType":"YulIdentifier","src":"8711:5:8"},"nativeSrc":"8711:11:8","nodeType":"YulFunctionCall","src":"8711:11:8"},"variables":[{"name":"ptr","nativeSrc":"8704:3:8","nodeType":"YulTypedName","src":"8704:3:8","type":""}]},{"expression":{"arguments":[{"name":"ptr","nativeSrc":"8754:3:8","nodeType":"YulIdentifier","src":"8754:3:8"},{"kind":"number","nativeSrc":"8759:1:8","nodeType":"YulLiteral","src":"8759:1:8","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"8762:14:8","nodeType":"YulIdentifier","src":"8762:14:8"},"nativeSrc":"8762:16:8","nodeType":"YulFunctionCall","src":"8762:16:8"}],"functionName":{"name":"returndatacopy","nativeSrc":"8739:14:8","nodeType":"YulIdentifier","src":"8739:14:8"},"nativeSrc":"8739:40:8","nodeType":"YulFunctionCall","src":"8739:40:8"},"nativeSrc":"8739:40:8","nodeType":"YulExpressionStatement","src":"8739:40:8"},{"expression":{"arguments":[{"name":"ptr","nativeSrc":"8803:3:8","nodeType":"YulIdentifier","src":"8803:3:8"},{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"8808:14:8","nodeType":"YulIdentifier","src":"8808:14:8"},"nativeSrc":"8808:16:8","nodeType":"YulFunctionCall","src":"8808:16:8"}],"functionName":{"name":"revert","nativeSrc":"8796:6:8","nodeType":"YulIdentifier","src":"8796:6:8"},"nativeSrc":"8796:29:8","nodeType":"YulFunctionCall","src":"8796:29:8"},"nativeSrc":"8796:29:8","nodeType":"YulExpressionStatement","src":"8796:29:8"}]},"condition":{"arguments":[{"name":"success","nativeSrc":"8673:7:8","nodeType":"YulIdentifier","src":"8673:7:8"}],"functionName":{"name":"iszero","nativeSrc":"8666:6:8","nodeType":"YulIdentifier","src":"8666:6:8"},"nativeSrc":"8666:15:8","nodeType":"YulFunctionCall","src":"8666:15:8"},"nativeSrc":"8663:176:8","nodeType":"YulIf","src":"8663:176:8"},{"nativeSrc":"8852:30:8","nodeType":"YulAssignment","src":"8852:30:8","value":{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"8866:14:8","nodeType":"YulIdentifier","src":"8866:14:8"},"nativeSrc":"8866:16:8","nodeType":"YulFunctionCall","src":"8866:16:8"},"variableNames":[{"name":"returnSize","nativeSrc":"8852:10:8","nodeType":"YulIdentifier","src":"8852:10:8"}]},{"nativeSrc":"8895:23:8","nodeType":"YulAssignment","src":"8895:23:8","value":{"arguments":[{"kind":"number","nativeSrc":"8916:1:8","nodeType":"YulLiteral","src":"8916:1:8","type":"","value":"0"}],"functionName":{"name":"mload","nativeSrc":"8910:5:8","nodeType":"YulIdentifier","src":"8910:5:8"},"nativeSrc":"8910:8:8","nodeType":"YulFunctionCall","src":"8910:8:8"},"variableNames":[{"name":"returnValue","nativeSrc":"8895:11:8","nodeType":"YulIdentifier","src":"8895:11:8"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":839,"isOffset":false,"isSlot":false,"src":"8587:4:8","valueSize":1},{"declaration":839,"isOffset":false,"isSlot":false,"src":"8606:4:8","valueSize":1},{"declaration":843,"isOffset":false,"isSlot":false,"src":"8852:10:8","valueSize":1},{"declaration":846,"isOffset":false,"isSlot":false,"src":"8895:11:8","valueSize":1},{"declaration":837,"isOffset":false,"isSlot":false,"src":"8573:5:8","valueSize":1}],"flags":["memory-safe"],"id":848,"nodeType":"InlineAssembly","src":"8507:421:8"},{"condition":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":851,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":849,"name":"returnSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":843,"src":"8942:10:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":850,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8956:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8942:15:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":860,"name":"returnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":846,"src":"8994:11:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"31","id":861,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9009:1:8","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"8994:16:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":863,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"8942:68:8","trueExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"arguments":[{"id":854,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":837,"src":"8968:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}],"id":853,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8960:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":852,"name":"address","nodeType":"ElementaryTypeName","src":"8960:7:8","typeDescriptions":{}}},"id":855,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8960:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":856,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8975:4:8","memberName":"code","nodeType":"MemberAccess","src":"8960:19:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8980:6:8","memberName":"length","nodeType":"MemberAccess","src":"8960:26:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":858,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8990:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8960:31:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":872,"nodeType":"IfStatement","src":"8938:146:8","trueBody":{"id":871,"nodeType":"Block","src":"9012:72:8","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":867,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":837,"src":"9066:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}],"id":866,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9058:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":865,"name":"address","nodeType":"ElementaryTypeName","src":"9058:7:8","typeDescriptions":{}}},"id":868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9058:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":864,"name":"SafeERC20FailedOperation","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"9033:24:8","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":869,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9033:40:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":870,"nodeType":"RevertStatement","src":"9026:47:8"}]}}]},"documentation":{"id":834,"nodeType":"StructuredDocumentation","src":"7879:486:8","text":" @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n on the return value: the return value is optional (but if data is returned, it must not be false).\n @param token The token targeted by the call.\n @param data The call data (encoded using abi.encode or one of its variants).\n This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements."},"id":874,"implemented":true,"kind":"function","modifiers":[],"name":"_callOptionalReturn","nameLocation":"8379:19:8","nodeType":"FunctionDefinition","parameters":{"id":840,"nodeType":"ParameterList","parameters":[{"constant":false,"id":837,"mutability":"mutable","name":"token","nameLocation":"8406:5:8","nodeType":"VariableDeclaration","scope":874,"src":"8399:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":836,"nodeType":"UserDefinedTypeName","pathNode":{"id":835,"name":"IERC20","nameLocations":["8399:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"8399:6:8"},"referencedDeclaration":452,"src":"8399:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":839,"mutability":"mutable","name":"data","nameLocation":"8426:4:8","nodeType":"VariableDeclaration","scope":874,"src":"8413:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":838,"name":"bytes","nodeType":"ElementaryTypeName","src":"8413:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8398:33:8"},"returnParameters":{"id":841,"nodeType":"ParameterList","parameters":[],"src":"8440:0:8"},"scope":916,"src":"8370:720:8","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":914,"nodeType":"Block","src":"9681:391:8","statements":[{"assignments":[886],"declarations":[{"constant":false,"id":886,"mutability":"mutable","name":"success","nameLocation":"9696:7:8","nodeType":"VariableDeclaration","scope":914,"src":"9691:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":885,"name":"bool","nodeType":"ElementaryTypeName","src":"9691:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":887,"nodeType":"VariableDeclarationStatement","src":"9691:12:8"},{"assignments":[889],"declarations":[{"constant":false,"id":889,"mutability":"mutable","name":"returnSize","nameLocation":"9721:10:8","nodeType":"VariableDeclaration","scope":914,"src":"9713:18:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":888,"name":"uint256","nodeType":"ElementaryTypeName","src":"9713:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":890,"nodeType":"VariableDeclarationStatement","src":"9713:18:8"},{"assignments":[892],"declarations":[{"constant":false,"id":892,"mutability":"mutable","name":"returnValue","nameLocation":"9749:11:8","nodeType":"VariableDeclaration","scope":914,"src":"9741:19:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":891,"name":"uint256","nodeType":"ElementaryTypeName","src":"9741:7:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":893,"nodeType":"VariableDeclarationStatement","src":"9741:19:8"},{"AST":{"nativeSrc":"9795:174:8","nodeType":"YulBlock","src":"9795:174:8","statements":[{"nativeSrc":"9809:71:8","nodeType":"YulAssignment","src":"9809:71:8","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nativeSrc":"9825:3:8","nodeType":"YulIdentifier","src":"9825:3:8"},"nativeSrc":"9825:5:8","nodeType":"YulFunctionCall","src":"9825:5:8"},{"name":"token","nativeSrc":"9832:5:8","nodeType":"YulIdentifier","src":"9832:5:8"},{"kind":"number","nativeSrc":"9839:1:8","nodeType":"YulLiteral","src":"9839:1:8","type":"","value":"0"},{"arguments":[{"name":"data","nativeSrc":"9846:4:8","nodeType":"YulIdentifier","src":"9846:4:8"},{"kind":"number","nativeSrc":"9852:4:8","nodeType":"YulLiteral","src":"9852:4:8","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"9842:3:8","nodeType":"YulIdentifier","src":"9842:3:8"},"nativeSrc":"9842:15:8","nodeType":"YulFunctionCall","src":"9842:15:8"},{"arguments":[{"name":"data","nativeSrc":"9865:4:8","nodeType":"YulIdentifier","src":"9865:4:8"}],"functionName":{"name":"mload","nativeSrc":"9859:5:8","nodeType":"YulIdentifier","src":"9859:5:8"},"nativeSrc":"9859:11:8","nodeType":"YulFunctionCall","src":"9859:11:8"},{"kind":"number","nativeSrc":"9872:1:8","nodeType":"YulLiteral","src":"9872:1:8","type":"","value":"0"},{"kind":"number","nativeSrc":"9875:4:8","nodeType":"YulLiteral","src":"9875:4:8","type":"","value":"0x20"}],"functionName":{"name":"call","nativeSrc":"9820:4:8","nodeType":"YulIdentifier","src":"9820:4:8"},"nativeSrc":"9820:60:8","nodeType":"YulFunctionCall","src":"9820:60:8"},"variableNames":[{"name":"success","nativeSrc":"9809:7:8","nodeType":"YulIdentifier","src":"9809:7:8"}]},{"nativeSrc":"9893:30:8","nodeType":"YulAssignment","src":"9893:30:8","value":{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"9907:14:8","nodeType":"YulIdentifier","src":"9907:14:8"},"nativeSrc":"9907:16:8","nodeType":"YulFunctionCall","src":"9907:16:8"},"variableNames":[{"name":"returnSize","nativeSrc":"9893:10:8","nodeType":"YulIdentifier","src":"9893:10:8"}]},{"nativeSrc":"9936:23:8","nodeType":"YulAssignment","src":"9936:23:8","value":{"arguments":[{"kind":"number","nativeSrc":"9957:1:8","nodeType":"YulLiteral","src":"9957:1:8","type":"","value":"0"}],"functionName":{"name":"mload","nativeSrc":"9951:5:8","nodeType":"YulIdentifier","src":"9951:5:8"},"nativeSrc":"9951:8:8","nodeType":"YulFunctionCall","src":"9951:8:8"},"variableNames":[{"name":"returnValue","nativeSrc":"9936:11:8","nodeType":"YulIdentifier","src":"9936:11:8"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":880,"isOffset":false,"isSlot":false,"src":"9846:4:8","valueSize":1},{"declaration":880,"isOffset":false,"isSlot":false,"src":"9865:4:8","valueSize":1},{"declaration":889,"isOffset":false,"isSlot":false,"src":"9893:10:8","valueSize":1},{"declaration":892,"isOffset":false,"isSlot":false,"src":"9936:11:8","valueSize":1},{"declaration":886,"isOffset":false,"isSlot":false,"src":"9809:7:8","valueSize":1},{"declaration":878,"isOffset":false,"isSlot":false,"src":"9832:5:8","valueSize":1}],"flags":["memory-safe"],"id":894,"nodeType":"InlineAssembly","src":"9770:199:8"},{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":895,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":886,"src":"9985:7:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":896,"name":"returnSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":889,"src":"9997:10:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":897,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10011:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9997:15:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":909,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":907,"name":"returnValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":892,"src":"10048:11:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":908,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10063:1:8","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"10048:16:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":910,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9997:67:8","trueExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"arguments":[{"id":901,"name":"token","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":878,"src":"10023:5:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}],"id":900,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10015:7:8","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":899,"name":"address","nodeType":"ElementaryTypeName","src":"10015:7:8","typeDescriptions":{}}},"id":902,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10015:14:8","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10030:4:8","memberName":"code","nodeType":"MemberAccess","src":"10015:19:8","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10035:6:8","memberName":"length","nodeType":"MemberAccess","src":"10015:26:8","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10044:1:8","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10015:30:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":911,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9996:69:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9985:80:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":884,"id":913,"nodeType":"Return","src":"9978:87:8"}]},"documentation":{"id":875,"nodeType":"StructuredDocumentation","src":"9096:491:8","text":" @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n on the return value: the return value is optional (but if data is returned, it must not be false).\n @param token The token targeted by the call.\n @param data The call data (encoded using abi.encode or one of its variants).\n This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead."},"id":915,"implemented":true,"kind":"function","modifiers":[],"name":"_callOptionalReturnBool","nameLocation":"9601:23:8","nodeType":"FunctionDefinition","parameters":{"id":881,"nodeType":"ParameterList","parameters":[{"constant":false,"id":878,"mutability":"mutable","name":"token","nameLocation":"9632:5:8","nodeType":"VariableDeclaration","scope":915,"src":"9625:12:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":877,"nodeType":"UserDefinedTypeName","pathNode":{"id":876,"name":"IERC20","nameLocations":["9625:6:8"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"9625:6:8"},"referencedDeclaration":452,"src":"9625:6:8","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":880,"mutability":"mutable","name":"data","nameLocation":"9652:4:8","nodeType":"VariableDeclaration","scope":915,"src":"9639:17:8","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":879,"name":"bytes","nodeType":"ElementaryTypeName","src":"9639:5:8","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9624:33:8"},"returnParameters":{"id":884,"nodeType":"ParameterList","parameters":[{"constant":false,"id":883,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":915,"src":"9675:4:8","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":882,"name":"bool","nodeType":"ElementaryTypeName","src":"9675:4:8","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"9674:6:8"},"scope":916,"src":"9592:480:8","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":917,"src":"698:9376:8","usedErrors":[464,473],"usedEvents":[]}],"src":"115:9960:8"},"id":8},"@openzeppelin/contracts/utils/Address.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","exportedSymbols":{"Address":[1176],"Errors":[1228]},"id":1177,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":918,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"101:24:9"},{"absolutePath":"@openzeppelin/contracts/utils/Errors.sol","file":"./Errors.sol","id":920,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":1177,"sourceUnit":1229,"src":"127:36:9","symbolAliases":[{"foreign":{"id":919,"name":"Errors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1228,"src":"135:6:9","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Address","contractDependencies":[],"contractKind":"library","documentation":{"id":921,"nodeType":"StructuredDocumentation","src":"165:67:9","text":" @dev Collection of functions related to the address type"},"fullyImplemented":true,"id":1176,"linearizedBaseContracts":[1176],"name":"Address","nameLocation":"241:7:9","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":922,"nodeType":"StructuredDocumentation","src":"255:75:9","text":" @dev There's no code at `target` (it is not a contract)."},"errorSelector":"9996b315","id":926,"name":"AddressEmptyCode","nameLocation":"341:16:9","nodeType":"ErrorDefinition","parameters":{"id":925,"nodeType":"ParameterList","parameters":[{"constant":false,"id":924,"mutability":"mutable","name":"target","nameLocation":"366:6:9","nodeType":"VariableDeclaration","scope":926,"src":"358:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":923,"name":"address","nodeType":"ElementaryTypeName","src":"358:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"357:16:9"},"src":"335:39:9"},{"body":{"id":973,"nodeType":"Block","src":"1361:294:9","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":936,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1383:4:9","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}],"id":935,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1375:7:9","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":934,"name":"address","nodeType":"ElementaryTypeName","src":"1375:7:9","typeDescriptions":{}}},"id":937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1375:13:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":938,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1389:7:9","memberName":"balance","nodeType":"MemberAccess","src":"1375:21:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":939,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":931,"src":"1399:6:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1375:30:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":953,"nodeType":"IfStatement","src":"1371:125:9","trueBody":{"id":952,"nodeType":"Block","src":"1407:89:9","statements":[{"errorCall":{"arguments":[{"expression":{"arguments":[{"id":946,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1463:4:9","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}],"id":945,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1455:7:9","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":944,"name":"address","nodeType":"ElementaryTypeName","src":"1455:7:9","typeDescriptions":{}}},"id":947,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1455:13:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":948,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1469:7:9","memberName":"balance","nodeType":"MemberAccess","src":"1455:21:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":949,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":931,"src":"1478:6:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":941,"name":"Errors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1228,"src":"1428:6:9","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Errors_$1228_$","typeString":"type(library Errors)"}},"id":943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1435:19:9","memberName":"InsufficientBalance","nodeType":"MemberAccess","referencedDeclaration":1216,"src":"1428:26:9","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1428:57:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":951,"nodeType":"RevertStatement","src":"1421:64:9"}]}},{"assignments":[955,957],"declarations":[{"constant":false,"id":955,"mutability":"mutable","name":"success","nameLocation":"1512:7:9","nodeType":"VariableDeclaration","scope":973,"src":"1507:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":954,"name":"bool","nodeType":"ElementaryTypeName","src":"1507:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":957,"mutability":"mutable","name":"returndata","nameLocation":"1534:10:9","nodeType":"VariableDeclaration","scope":973,"src":"1521:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":956,"name":"bytes","nodeType":"ElementaryTypeName","src":"1521:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":964,"initialValue":{"arguments":[{"hexValue":"","id":962,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1578:2:9","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":958,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":929,"src":"1548:9:9","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1558:4:9","memberName":"call","nodeType":"MemberAccess","src":"1548:14:9","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":960,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":931,"src":"1570:6:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"1548:29:9","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1548:33:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"1506:75:9"},{"condition":{"id":966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1595:8:9","subExpression":{"id":965,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":955,"src":"1596:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":972,"nodeType":"IfStatement","src":"1591:58:9","trueBody":{"id":971,"nodeType":"Block","src":"1605:44:9","statements":[{"expression":{"arguments":[{"id":968,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":957,"src":"1627:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":967,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1175,"src":"1619:7:9","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1619:19:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":970,"nodeType":"ExpressionStatement","src":"1619:19:9"}]}}]},"documentation":{"id":927,"nodeType":"StructuredDocumentation","src":"380:905:9","text":" @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\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 https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]."},"id":974,"implemented":true,"kind":"function","modifiers":[],"name":"sendValue","nameLocation":"1299:9:9","nodeType":"FunctionDefinition","parameters":{"id":932,"nodeType":"ParameterList","parameters":[{"constant":false,"id":929,"mutability":"mutable","name":"recipient","nameLocation":"1325:9:9","nodeType":"VariableDeclaration","scope":974,"src":"1309:25:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":928,"name":"address","nodeType":"ElementaryTypeName","src":"1309:15:9","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":931,"mutability":"mutable","name":"amount","nameLocation":"1344:6:9","nodeType":"VariableDeclaration","scope":974,"src":"1336:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":930,"name":"uint256","nodeType":"ElementaryTypeName","src":"1336:7:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1308:43:9"},"returnParameters":{"id":933,"nodeType":"ParameterList","parameters":[],"src":"1361:0:9"},"scope":1176,"src":"1290:365:9","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":990,"nodeType":"Block","src":"2589:62:9","statements":[{"expression":{"arguments":[{"id":985,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":977,"src":"2628:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":986,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":979,"src":"2636:4:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"hexValue":"30","id":987,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2642:1:9","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":984,"name":"functionCallWithValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1041,"src":"2606:21:9","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bytes memory,uint256) returns (bytes memory)"}},"id":988,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2606:38:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":983,"id":989,"nodeType":"Return","src":"2599:45:9"}]},"documentation":{"id":975,"nodeType":"StructuredDocumentation","src":"1661:834:9","text":" @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 If `target` reverts with a revert reason or custom error, it is bubbled\n up by this function (like regular Solidity function calls). However, if\n the call reverted with no returned reason, this function reverts with a\n {Errors.FailedCall} error.\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 Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert."},"id":991,"implemented":true,"kind":"function","modifiers":[],"name":"functionCall","nameLocation":"2509:12:9","nodeType":"FunctionDefinition","parameters":{"id":980,"nodeType":"ParameterList","parameters":[{"constant":false,"id":977,"mutability":"mutable","name":"target","nameLocation":"2530:6:9","nodeType":"VariableDeclaration","scope":991,"src":"2522:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":976,"name":"address","nodeType":"ElementaryTypeName","src":"2522:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":979,"mutability":"mutable","name":"data","nameLocation":"2551:4:9","nodeType":"VariableDeclaration","scope":991,"src":"2538:17:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":978,"name":"bytes","nodeType":"ElementaryTypeName","src":"2538:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2521:35:9"},"returnParameters":{"id":983,"nodeType":"ParameterList","parameters":[{"constant":false,"id":982,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":991,"src":"2575:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":981,"name":"bytes","nodeType":"ElementaryTypeName","src":"2575:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2574:14:9"},"scope":1176,"src":"2500:151:9","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1040,"nodeType":"Block","src":"3088:294:9","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":1005,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3110:4:9","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}],"id":1004,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3102:7:9","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1003,"name":"address","nodeType":"ElementaryTypeName","src":"3102:7:9","typeDescriptions":{}}},"id":1006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3102:13:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3116:7:9","memberName":"balance","nodeType":"MemberAccess","src":"3102:21:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1008,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"3126:5:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3102:29:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1022,"nodeType":"IfStatement","src":"3098:123:9","trueBody":{"id":1021,"nodeType":"Block","src":"3133:88:9","statements":[{"errorCall":{"arguments":[{"expression":{"arguments":[{"id":1015,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3189:4:9","typeDescriptions":{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Address_$1176","typeString":"library Address"}],"id":1014,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3181:7:9","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":1013,"name":"address","nodeType":"ElementaryTypeName","src":"3181:7:9","typeDescriptions":{}}},"id":1016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3181:13:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3195:7:9","memberName":"balance","nodeType":"MemberAccess","src":"3181:21:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1018,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"3204:5:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1010,"name":"Errors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1228,"src":"3154:6:9","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Errors_$1228_$","typeString":"type(library Errors)"}},"id":1012,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3161:19:9","memberName":"InsufficientBalance","nodeType":"MemberAccess","referencedDeclaration":1216,"src":"3154:26:9","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":1019,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3154:56:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1020,"nodeType":"RevertStatement","src":"3147:63:9"}]}},{"assignments":[1024,1026],"declarations":[{"constant":false,"id":1024,"mutability":"mutable","name":"success","nameLocation":"3236:7:9","nodeType":"VariableDeclaration","scope":1040,"src":"3231:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1023,"name":"bool","nodeType":"ElementaryTypeName","src":"3231:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1026,"mutability":"mutable","name":"returndata","nameLocation":"3258:10:9","nodeType":"VariableDeclaration","scope":1040,"src":"3245:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1025,"name":"bytes","nodeType":"ElementaryTypeName","src":"3245:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1033,"initialValue":{"arguments":[{"id":1031,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":996,"src":"3298:4:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":1027,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":994,"src":"3272:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1028,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3279:4:9","memberName":"call","nodeType":"MemberAccess","src":"3272:11:9","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":1030,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"id":1029,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":998,"src":"3291:5:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"3272:25:9","typeDescriptions":{"typeIdentifier":"t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value","typeString":"function (bytes memory) payable returns (bool,bytes memory)"}},"id":1032,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3272:31:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"3230:73:9"},{"expression":{"arguments":[{"id":1035,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":994,"src":"3347:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1036,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1024,"src":"3355:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":1037,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1026,"src":"3364:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1034,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1133,"src":"3320:26:9","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory) view returns (bytes memory)"}},"id":1038,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3320:55:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1002,"id":1039,"nodeType":"Return","src":"3313:62:9"}]},"documentation":{"id":992,"nodeType":"StructuredDocumentation","src":"2657:313:9","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`."},"id":1041,"implemented":true,"kind":"function","modifiers":[],"name":"functionCallWithValue","nameLocation":"2984:21:9","nodeType":"FunctionDefinition","parameters":{"id":999,"nodeType":"ParameterList","parameters":[{"constant":false,"id":994,"mutability":"mutable","name":"target","nameLocation":"3014:6:9","nodeType":"VariableDeclaration","scope":1041,"src":"3006:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":993,"name":"address","nodeType":"ElementaryTypeName","src":"3006:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":996,"mutability":"mutable","name":"data","nameLocation":"3035:4:9","nodeType":"VariableDeclaration","scope":1041,"src":"3022:17:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":995,"name":"bytes","nodeType":"ElementaryTypeName","src":"3022:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":998,"mutability":"mutable","name":"value","nameLocation":"3049:5:9","nodeType":"VariableDeclaration","scope":1041,"src":"3041:13:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":997,"name":"uint256","nodeType":"ElementaryTypeName","src":"3041:7:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3005:50:9"},"returnParameters":{"id":1002,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1001,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1041,"src":"3074:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1000,"name":"bytes","nodeType":"ElementaryTypeName","src":"3074:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3073:14:9"},"scope":1176,"src":"2975:407:9","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1066,"nodeType":"Block","src":"3621:154:9","statements":[{"assignments":[1052,1054],"declarations":[{"constant":false,"id":1052,"mutability":"mutable","name":"success","nameLocation":"3637:7:9","nodeType":"VariableDeclaration","scope":1066,"src":"3632:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1051,"name":"bool","nodeType":"ElementaryTypeName","src":"3632:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1054,"mutability":"mutable","name":"returndata","nameLocation":"3659:10:9","nodeType":"VariableDeclaration","scope":1066,"src":"3646:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1053,"name":"bytes","nodeType":"ElementaryTypeName","src":"3646:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1059,"initialValue":{"arguments":[{"id":1057,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1046,"src":"3691:4:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":1055,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1044,"src":"3673:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1056,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3680:10:9","memberName":"staticcall","nodeType":"MemberAccess","src":"3673:17:9","typeDescriptions":{"typeIdentifier":"t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) view returns (bool,bytes memory)"}},"id":1058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3673:23:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"3631:65:9"},{"expression":{"arguments":[{"id":1061,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1044,"src":"3740:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1062,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1052,"src":"3748:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":1063,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1054,"src":"3757:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1060,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1133,"src":"3713:26:9","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory) view returns (bytes memory)"}},"id":1064,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3713:55:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1050,"id":1065,"nodeType":"Return","src":"3706:62:9"}]},"documentation":{"id":1042,"nodeType":"StructuredDocumentation","src":"3388:128:9","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call."},"id":1067,"implemented":true,"kind":"function","modifiers":[],"name":"functionStaticCall","nameLocation":"3530:18:9","nodeType":"FunctionDefinition","parameters":{"id":1047,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1044,"mutability":"mutable","name":"target","nameLocation":"3557:6:9","nodeType":"VariableDeclaration","scope":1067,"src":"3549:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1043,"name":"address","nodeType":"ElementaryTypeName","src":"3549:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1046,"mutability":"mutable","name":"data","nameLocation":"3578:4:9","nodeType":"VariableDeclaration","scope":1067,"src":"3565:17:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1045,"name":"bytes","nodeType":"ElementaryTypeName","src":"3565:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3548:35:9"},"returnParameters":{"id":1050,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1049,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1067,"src":"3607:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1048,"name":"bytes","nodeType":"ElementaryTypeName","src":"3607:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3606:14:9"},"scope":1176,"src":"3521:254:9","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1092,"nodeType":"Block","src":"4013:156:9","statements":[{"assignments":[1078,1080],"declarations":[{"constant":false,"id":1078,"mutability":"mutable","name":"success","nameLocation":"4029:7:9","nodeType":"VariableDeclaration","scope":1092,"src":"4024:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1077,"name":"bool","nodeType":"ElementaryTypeName","src":"4024:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1080,"mutability":"mutable","name":"returndata","nameLocation":"4051:10:9","nodeType":"VariableDeclaration","scope":1092,"src":"4038:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1079,"name":"bytes","nodeType":"ElementaryTypeName","src":"4038:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1085,"initialValue":{"arguments":[{"id":1083,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1072,"src":"4085:4:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":1081,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1070,"src":"4065:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4072:12:9","memberName":"delegatecall","nodeType":"MemberAccess","src":"4065:19:9","typeDescriptions":{"typeIdentifier":"t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) returns (bool,bytes memory)"}},"id":1084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4065:25:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4023:67:9"},{"expression":{"arguments":[{"id":1087,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1070,"src":"4134:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":1088,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1078,"src":"4142:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":1089,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1080,"src":"4151:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1086,"name":"verifyCallResultFromTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1133,"src":"4107:26:9","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (address,bool,bytes memory) view returns (bytes memory)"}},"id":1090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4107:55:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1076,"id":1091,"nodeType":"Return","src":"4100:62:9"}]},"documentation":{"id":1068,"nodeType":"StructuredDocumentation","src":"3781:130:9","text":" @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a delegate call."},"id":1093,"implemented":true,"kind":"function","modifiers":[],"name":"functionDelegateCall","nameLocation":"3925:20:9","nodeType":"FunctionDefinition","parameters":{"id":1073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1070,"mutability":"mutable","name":"target","nameLocation":"3954:6:9","nodeType":"VariableDeclaration","scope":1093,"src":"3946:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1069,"name":"address","nodeType":"ElementaryTypeName","src":"3946:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1072,"mutability":"mutable","name":"data","nameLocation":"3975:4:9","nodeType":"VariableDeclaration","scope":1093,"src":"3962:17:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1071,"name":"bytes","nodeType":"ElementaryTypeName","src":"3962:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3945:35:9"},"returnParameters":{"id":1076,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1075,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1093,"src":"3999:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1074,"name":"bytes","nodeType":"ElementaryTypeName","src":"3999:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3998:14:9"},"scope":1176,"src":"3916:253:9","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1132,"nodeType":"Block","src":"4595:424:9","statements":[{"condition":{"id":1106,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4609:8:9","subExpression":{"id":1105,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1098,"src":"4610:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1130,"nodeType":"Block","src":"4669:344:9","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1112,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1100,"src":"4857:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1113,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4868:6:9","memberName":"length","nodeType":"MemberAccess","src":"4857:17:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4878:1:9","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4857:22:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":1116,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1096,"src":"4883:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":1117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4890:4:9","memberName":"code","nodeType":"MemberAccess","src":"4883:11:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4895:6:9","memberName":"length","nodeType":"MemberAccess","src":"4883:18:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1119,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4905:1:9","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4883:23:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4857:49:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1127,"nodeType":"IfStatement","src":"4853:119:9","trueBody":{"id":1126,"nodeType":"Block","src":"4908:64:9","statements":[{"errorCall":{"arguments":[{"id":1123,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1096,"src":"4950:6:9","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1122,"name":"AddressEmptyCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":926,"src":"4933:16:9","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":1124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4933:24:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1125,"nodeType":"RevertStatement","src":"4926:31:9"}]}},{"expression":{"id":1128,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1100,"src":"4992:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1104,"id":1129,"nodeType":"Return","src":"4985:17:9"}]},"id":1131,"nodeType":"IfStatement","src":"4605:408:9","trueBody":{"id":1111,"nodeType":"Block","src":"4619:44:9","statements":[{"expression":{"arguments":[{"id":1108,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1100,"src":"4641:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1107,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1175,"src":"4633:7:9","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":1109,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4633:19:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1110,"nodeType":"ExpressionStatement","src":"4633:19:9"}]}}]},"documentation":{"id":1094,"nodeType":"StructuredDocumentation","src":"4175:257:9","text":" @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n of an unsuccessful call."},"id":1133,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResultFromTarget","nameLocation":"4446:26:9","nodeType":"FunctionDefinition","parameters":{"id":1101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1096,"mutability":"mutable","name":"target","nameLocation":"4490:6:9","nodeType":"VariableDeclaration","scope":1133,"src":"4482:14:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1095,"name":"address","nodeType":"ElementaryTypeName","src":"4482:7:9","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":1098,"mutability":"mutable","name":"success","nameLocation":"4511:7:9","nodeType":"VariableDeclaration","scope":1133,"src":"4506:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1097,"name":"bool","nodeType":"ElementaryTypeName","src":"4506:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1100,"mutability":"mutable","name":"returndata","nameLocation":"4541:10:9","nodeType":"VariableDeclaration","scope":1133,"src":"4528:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1099,"name":"bytes","nodeType":"ElementaryTypeName","src":"4528:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4472:85:9"},"returnParameters":{"id":1104,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1103,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1133,"src":"4581:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1102,"name":"bytes","nodeType":"ElementaryTypeName","src":"4581:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4580:14:9"},"scope":1176,"src":"4437:582:9","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":1154,"nodeType":"Block","src":"5323:122:9","statements":[{"condition":{"id":1144,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5337:8:9","subExpression":{"id":1143,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1136,"src":"5338:7:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1152,"nodeType":"Block","src":"5397:42:9","statements":[{"expression":{"id":1150,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1138,"src":"5418:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":1142,"id":1151,"nodeType":"Return","src":"5411:17:9"}]},"id":1153,"nodeType":"IfStatement","src":"5333:106:9","trueBody":{"id":1149,"nodeType":"Block","src":"5347:44:9","statements":[{"expression":{"arguments":[{"id":1146,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1138,"src":"5369:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1145,"name":"_revert","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1175,"src":"5361:7:9","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":1147,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5361:19:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1148,"nodeType":"ExpressionStatement","src":"5361:19:9"}]}}]},"documentation":{"id":1134,"nodeType":"StructuredDocumentation","src":"5025:191:9","text":" @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n revert reason or with a default {Errors.FailedCall} error."},"id":1155,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCallResult","nameLocation":"5230:16:9","nodeType":"FunctionDefinition","parameters":{"id":1139,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1136,"mutability":"mutable","name":"success","nameLocation":"5252:7:9","nodeType":"VariableDeclaration","scope":1155,"src":"5247:12:9","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1135,"name":"bool","nodeType":"ElementaryTypeName","src":"5247:4:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1138,"mutability":"mutable","name":"returndata","nameLocation":"5274:10:9","nodeType":"VariableDeclaration","scope":1155,"src":"5261:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1137,"name":"bytes","nodeType":"ElementaryTypeName","src":"5261:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5246:39:9"},"returnParameters":{"id":1142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1141,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1155,"src":"5309:12:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1140,"name":"bytes","nodeType":"ElementaryTypeName","src":"5309:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5308:14:9"},"scope":1176,"src":"5221:224:9","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1174,"nodeType":"Block","src":"5614:379:9","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":1161,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1158,"src":"5690:10:9","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1162,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5701:6:9","memberName":"length","nodeType":"MemberAccess","src":"5690:17:9","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":1163,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5710:1:9","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5690:21:9","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":1172,"nodeType":"Block","src":"5936:51:9","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":1167,"name":"Errors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1228,"src":"5957:6:9","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Errors_$1228_$","typeString":"type(library Errors)"}},"id":1169,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5964:10:9","memberName":"FailedCall","nodeType":"MemberAccess","referencedDeclaration":1219,"src":"5957:17:9","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":1170,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5957:19:9","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1171,"nodeType":"RevertStatement","src":"5950:26:9"}]},"id":1173,"nodeType":"IfStatement","src":"5686:301:9","trueBody":{"id":1166,"nodeType":"Block","src":"5713:217:9","statements":[{"AST":{"nativeSrc":"5840:80:9","nodeType":"YulBlock","src":"5840:80:9","statements":[{"expression":{"arguments":[{"arguments":[{"name":"returndata","nativeSrc":"5869:10:9","nodeType":"YulIdentifier","src":"5869:10:9"},{"kind":"number","nativeSrc":"5881:4:9","nodeType":"YulLiteral","src":"5881:4:9","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"5865:3:9","nodeType":"YulIdentifier","src":"5865:3:9"},"nativeSrc":"5865:21:9","nodeType":"YulFunctionCall","src":"5865:21:9"},{"arguments":[{"name":"returndata","nativeSrc":"5894:10:9","nodeType":"YulIdentifier","src":"5894:10:9"}],"functionName":{"name":"mload","nativeSrc":"5888:5:9","nodeType":"YulIdentifier","src":"5888:5:9"},"nativeSrc":"5888:17:9","nodeType":"YulFunctionCall","src":"5888:17:9"}],"functionName":{"name":"revert","nativeSrc":"5858:6:9","nodeType":"YulIdentifier","src":"5858:6:9"},"nativeSrc":"5858:48:9","nodeType":"YulFunctionCall","src":"5858:48:9"},"nativeSrc":"5858:48:9","nodeType":"YulExpressionStatement","src":"5858:48:9"}]},"evmVersion":"paris","externalReferences":[{"declaration":1158,"isOffset":false,"isSlot":false,"src":"5869:10:9","valueSize":1},{"declaration":1158,"isOffset":false,"isSlot":false,"src":"5894:10:9","valueSize":1}],"flags":["memory-safe"],"id":1165,"nodeType":"InlineAssembly","src":"5815:105:9"}]}}]},"documentation":{"id":1156,"nodeType":"StructuredDocumentation","src":"5451:103:9","text":" @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}."},"id":1175,"implemented":true,"kind":"function","modifiers":[],"name":"_revert","nameLocation":"5568:7:9","nodeType":"FunctionDefinition","parameters":{"id":1159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1158,"mutability":"mutable","name":"returndata","nameLocation":"5589:10:9","nodeType":"VariableDeclaration","scope":1175,"src":"5576:23:9","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1157,"name":"bytes","nodeType":"ElementaryTypeName","src":"5576:5:9","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5575:25:9"},"returnParameters":{"id":1160,"nodeType":"ParameterList","parameters":[],"src":"5614:0:9"},"scope":1176,"src":"5559:434:9","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":1177,"src":"233:5762:9","usedErrors":[926],"usedEvents":[]}],"src":"101:5895:9"},"id":9},"@openzeppelin/contracts/utils/Context.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","exportedSymbols":{"Context":[1206]},"id":1207,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1178,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"101:24:10"},{"abstract":true,"baseContracts":[],"canonicalName":"Context","contractDependencies":[],"contractKind":"contract","documentation":{"id":1179,"nodeType":"StructuredDocumentation","src":"127:496:10","text":" @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 This contract is only required for intermediate, library-like contracts."},"fullyImplemented":true,"id":1206,"linearizedBaseContracts":[1206],"name":"Context","nameLocation":"642:7:10","nodeType":"ContractDefinition","nodes":[{"body":{"id":1187,"nodeType":"Block","src":"718:34:10","statements":[{"expression":{"expression":{"id":1184,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"735:3:10","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1185,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"739:6:10","memberName":"sender","nodeType":"MemberAccess","src":"735:10:10","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":1183,"id":1186,"nodeType":"Return","src":"728:17:10"}]},"id":1188,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"665:10:10","nodeType":"FunctionDefinition","parameters":{"id":1180,"nodeType":"ParameterList","parameters":[],"src":"675:2:10"},"returnParameters":{"id":1183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1182,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1188,"src":"709:7:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1181,"name":"address","nodeType":"ElementaryTypeName","src":"709:7:10","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"708:9:10"},"scope":1206,"src":"656:96:10","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":1196,"nodeType":"Block","src":"825:32:10","statements":[{"expression":{"expression":{"id":1193,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"842:3:10","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":1194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"846:4:10","memberName":"data","nodeType":"MemberAccess","src":"842:8:10","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":1192,"id":1195,"nodeType":"Return","src":"835:15:10"}]},"id":1197,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"767:8:10","nodeType":"FunctionDefinition","parameters":{"id":1189,"nodeType":"ParameterList","parameters":[],"src":"775:2:10"},"returnParameters":{"id":1192,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1191,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1197,"src":"809:14:10","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":1190,"name":"bytes","nodeType":"ElementaryTypeName","src":"809:5:10","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"808:16:10"},"scope":1206,"src":"758:99:10","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":1204,"nodeType":"Block","src":"935:25:10","statements":[{"expression":{"hexValue":"30","id":1202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"952:1:10","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":1201,"id":1203,"nodeType":"Return","src":"945:8:10"}]},"id":1205,"implemented":true,"kind":"function","modifiers":[],"name":"_contextSuffixLength","nameLocation":"872:20:10","nodeType":"FunctionDefinition","parameters":{"id":1198,"nodeType":"ParameterList","parameters":[],"src":"892:2:10"},"returnParameters":{"id":1201,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1200,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1205,"src":"926:7:10","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1199,"name":"uint256","nodeType":"ElementaryTypeName","src":"926:7:10","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"925:9:10"},"scope":1206,"src":"863:97:10","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":1207,"src":"624:338:10","usedErrors":[],"usedEvents":[]}],"src":"101:862:10"},"id":10},"@openzeppelin/contracts/utils/Errors.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Errors.sol","exportedSymbols":{"Errors":[1228]},"id":1229,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1208,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"100:24:11"},{"abstract":false,"baseContracts":[],"canonicalName":"Errors","contractDependencies":[],"contractKind":"library","documentation":{"id":1209,"nodeType":"StructuredDocumentation","src":"126:284:11","text":" @dev Collection of common custom errors used in multiple contracts\n IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n It is recommended to avoid relying on the error API for critical functionality.\n _Available since v5.1._"},"fullyImplemented":true,"id":1228,"linearizedBaseContracts":[1228],"name":"Errors","nameLocation":"419:6:11","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":1210,"nodeType":"StructuredDocumentation","src":"432:94:11","text":" @dev The ETH balance of the account is not enough to perform the operation."},"errorSelector":"cf479181","id":1216,"name":"InsufficientBalance","nameLocation":"537:19:11","nodeType":"ErrorDefinition","parameters":{"id":1215,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1212,"mutability":"mutable","name":"balance","nameLocation":"565:7:11","nodeType":"VariableDeclaration","scope":1216,"src":"557:15:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1211,"name":"uint256","nodeType":"ElementaryTypeName","src":"557:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1214,"mutability":"mutable","name":"needed","nameLocation":"582:6:11","nodeType":"VariableDeclaration","scope":1216,"src":"574:14:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1213,"name":"uint256","nodeType":"ElementaryTypeName","src":"574:7:11","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"556:33:11"},"src":"531:59:11"},{"documentation":{"id":1217,"nodeType":"StructuredDocumentation","src":"596:89:11","text":" @dev A call to an address target failed. The target may have reverted."},"errorSelector":"d6bda275","id":1219,"name":"FailedCall","nameLocation":"696:10:11","nodeType":"ErrorDefinition","parameters":{"id":1218,"nodeType":"ParameterList","parameters":[],"src":"706:2:11"},"src":"690:19:11"},{"documentation":{"id":1220,"nodeType":"StructuredDocumentation","src":"715:46:11","text":" @dev The deployment failed."},"errorSelector":"b06ebf3d","id":1222,"name":"FailedDeployment","nameLocation":"772:16:11","nodeType":"ErrorDefinition","parameters":{"id":1221,"nodeType":"ParameterList","parameters":[],"src":"788:2:11"},"src":"766:25:11"},{"documentation":{"id":1223,"nodeType":"StructuredDocumentation","src":"797:58:11","text":" @dev A necessary precompile is missing."},"errorSelector":"42b01bce","id":1227,"name":"MissingPrecompile","nameLocation":"866:17:11","nodeType":"ErrorDefinition","parameters":{"id":1226,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1225,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1227,"src":"884:7:11","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1224,"name":"address","nodeType":"ElementaryTypeName","src":"884:7:11","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"883:9:11"},"src":"860:33:11"}],"scope":1229,"src":"411:484:11","usedErrors":[1216,1219,1222,1227],"usedEvents":[]}],"src":"100:796:11"},"id":11},"@openzeppelin/contracts/utils/Panic.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Panic.sol","exportedSymbols":{"Panic":[1280]},"id":1281,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1230,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"99:24:12"},{"abstract":false,"baseContracts":[],"canonicalName":"Panic","contractDependencies":[],"contractKind":"library","documentation":{"id":1231,"nodeType":"StructuredDocumentation","src":"125:489:12","text":" @dev Helper library for emitting standardized panic codes.\n ```solidity\n contract Example {\n      using Panic for uint256;\n      // Use any of the declared internal constants\n      function foo() { Panic.GENERIC.panic(); }\n      // Alternatively\n      function foo() { Panic.panic(Panic.GENERIC); }\n }\n ```\n Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n _Available since v5.1._"},"fullyImplemented":true,"id":1280,"linearizedBaseContracts":[1280],"name":"Panic","nameLocation":"665:5:12","nodeType":"ContractDefinition","nodes":[{"constant":true,"documentation":{"id":1232,"nodeType":"StructuredDocumentation","src":"677:36:12","text":"@dev generic / unspecified error"},"id":1235,"mutability":"constant","name":"GENERIC","nameLocation":"744:7:12","nodeType":"VariableDeclaration","scope":1280,"src":"718:40:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1233,"name":"uint256","nodeType":"ElementaryTypeName","src":"718:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783030","id":1234,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"754:4:12","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x00"},"visibility":"internal"},{"constant":true,"documentation":{"id":1236,"nodeType":"StructuredDocumentation","src":"764:37:12","text":"@dev used by the assert() builtin"},"id":1239,"mutability":"constant","name":"ASSERT","nameLocation":"832:6:12","nodeType":"VariableDeclaration","scope":1280,"src":"806:39:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1237,"name":"uint256","nodeType":"ElementaryTypeName","src":"806:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783031","id":1238,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"841:4:12","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"0x01"},"visibility":"internal"},{"constant":true,"documentation":{"id":1240,"nodeType":"StructuredDocumentation","src":"851:41:12","text":"@dev arithmetic underflow or overflow"},"id":1243,"mutability":"constant","name":"UNDER_OVERFLOW","nameLocation":"923:14:12","nodeType":"VariableDeclaration","scope":1280,"src":"897:47:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1241,"name":"uint256","nodeType":"ElementaryTypeName","src":"897:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783131","id":1242,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"940:4:12","typeDescriptions":{"typeIdentifier":"t_rational_17_by_1","typeString":"int_const 17"},"value":"0x11"},"visibility":"internal"},{"constant":true,"documentation":{"id":1244,"nodeType":"StructuredDocumentation","src":"950:35:12","text":"@dev division or modulo by zero"},"id":1247,"mutability":"constant","name":"DIVISION_BY_ZERO","nameLocation":"1016:16:12","nodeType":"VariableDeclaration","scope":1280,"src":"990:49:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1245,"name":"uint256","nodeType":"ElementaryTypeName","src":"990:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783132","id":1246,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1035:4:12","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"0x12"},"visibility":"internal"},{"constant":true,"documentation":{"id":1248,"nodeType":"StructuredDocumentation","src":"1045:30:12","text":"@dev enum conversion error"},"id":1251,"mutability":"constant","name":"ENUM_CONVERSION_ERROR","nameLocation":"1106:21:12","nodeType":"VariableDeclaration","scope":1280,"src":"1080:54:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1249,"name":"uint256","nodeType":"ElementaryTypeName","src":"1080:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783231","id":1250,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1130:4:12","typeDescriptions":{"typeIdentifier":"t_rational_33_by_1","typeString":"int_const 33"},"value":"0x21"},"visibility":"internal"},{"constant":true,"documentation":{"id":1252,"nodeType":"StructuredDocumentation","src":"1140:36:12","text":"@dev invalid encoding in storage"},"id":1255,"mutability":"constant","name":"STORAGE_ENCODING_ERROR","nameLocation":"1207:22:12","nodeType":"VariableDeclaration","scope":1280,"src":"1181:55:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1253,"name":"uint256","nodeType":"ElementaryTypeName","src":"1181:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783232","id":1254,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1232:4:12","typeDescriptions":{"typeIdentifier":"t_rational_34_by_1","typeString":"int_const 34"},"value":"0x22"},"visibility":"internal"},{"constant":true,"documentation":{"id":1256,"nodeType":"StructuredDocumentation","src":"1242:24:12","text":"@dev empty array pop"},"id":1259,"mutability":"constant","name":"EMPTY_ARRAY_POP","nameLocation":"1297:15:12","nodeType":"VariableDeclaration","scope":1280,"src":"1271:48:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1257,"name":"uint256","nodeType":"ElementaryTypeName","src":"1271:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783331","id":1258,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1315:4:12","typeDescriptions":{"typeIdentifier":"t_rational_49_by_1","typeString":"int_const 49"},"value":"0x31"},"visibility":"internal"},{"constant":true,"documentation":{"id":1260,"nodeType":"StructuredDocumentation","src":"1325:35:12","text":"@dev array out of bounds access"},"id":1263,"mutability":"constant","name":"ARRAY_OUT_OF_BOUNDS","nameLocation":"1391:19:12","nodeType":"VariableDeclaration","scope":1280,"src":"1365:52:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1261,"name":"uint256","nodeType":"ElementaryTypeName","src":"1365:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783332","id":1262,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1413:4:12","typeDescriptions":{"typeIdentifier":"t_rational_50_by_1","typeString":"int_const 50"},"value":"0x32"},"visibility":"internal"},{"constant":true,"documentation":{"id":1264,"nodeType":"StructuredDocumentation","src":"1423:65:12","text":"@dev resource error (too large allocation or too large array)"},"id":1267,"mutability":"constant","name":"RESOURCE_ERROR","nameLocation":"1519:14:12","nodeType":"VariableDeclaration","scope":1280,"src":"1493:47:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1265,"name":"uint256","nodeType":"ElementaryTypeName","src":"1493:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783431","id":1266,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1536:4:12","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"0x41"},"visibility":"internal"},{"constant":true,"documentation":{"id":1268,"nodeType":"StructuredDocumentation","src":"1546:42:12","text":"@dev calling invalid internal function"},"id":1271,"mutability":"constant","name":"INVALID_INTERNAL_FUNCTION","nameLocation":"1619:25:12","nodeType":"VariableDeclaration","scope":1280,"src":"1593:58:12","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1269,"name":"uint256","nodeType":"ElementaryTypeName","src":"1593:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"30783531","id":1270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1647:4:12","typeDescriptions":{"typeIdentifier":"t_rational_81_by_1","typeString":"int_const 81"},"value":"0x51"},"visibility":"internal"},{"body":{"id":1278,"nodeType":"Block","src":"1819:151:12","statements":[{"AST":{"nativeSrc":"1854:110:12","nodeType":"YulBlock","src":"1854:110:12","statements":[{"expression":{"arguments":[{"kind":"number","nativeSrc":"1875:4:12","nodeType":"YulLiteral","src":"1875:4:12","type":"","value":"0x00"},{"kind":"number","nativeSrc":"1881:10:12","nodeType":"YulLiteral","src":"1881:10:12","type":"","value":"0x4e487b71"}],"functionName":{"name":"mstore","nativeSrc":"1868:6:12","nodeType":"YulIdentifier","src":"1868:6:12"},"nativeSrc":"1868:24:12","nodeType":"YulFunctionCall","src":"1868:24:12"},"nativeSrc":"1868:24:12","nodeType":"YulExpressionStatement","src":"1868:24:12"},{"expression":{"arguments":[{"kind":"number","nativeSrc":"1912:4:12","nodeType":"YulLiteral","src":"1912:4:12","type":"","value":"0x20"},{"name":"code","nativeSrc":"1918:4:12","nodeType":"YulIdentifier","src":"1918:4:12"}],"functionName":{"name":"mstore","nativeSrc":"1905:6:12","nodeType":"YulIdentifier","src":"1905:6:12"},"nativeSrc":"1905:18:12","nodeType":"YulFunctionCall","src":"1905:18:12"},"nativeSrc":"1905:18:12","nodeType":"YulExpressionStatement","src":"1905:18:12"},{"expression":{"arguments":[{"kind":"number","nativeSrc":"1943:4:12","nodeType":"YulLiteral","src":"1943:4:12","type":"","value":"0x1c"},{"kind":"number","nativeSrc":"1949:4:12","nodeType":"YulLiteral","src":"1949:4:12","type":"","value":"0x24"}],"functionName":{"name":"revert","nativeSrc":"1936:6:12","nodeType":"YulIdentifier","src":"1936:6:12"},"nativeSrc":"1936:18:12","nodeType":"YulFunctionCall","src":"1936:18:12"},"nativeSrc":"1936:18:12","nodeType":"YulExpressionStatement","src":"1936:18:12"}]},"evmVersion":"paris","externalReferences":[{"declaration":1274,"isOffset":false,"isSlot":false,"src":"1918:4:12","valueSize":1}],"flags":["memory-safe"],"id":1277,"nodeType":"InlineAssembly","src":"1829:135:12"}]},"documentation":{"id":1272,"nodeType":"StructuredDocumentation","src":"1658:113:12","text":"@dev Reverts with a panic code. Recommended to use with\n the internal constants with predefined codes."},"id":1279,"implemented":true,"kind":"function","modifiers":[],"name":"panic","nameLocation":"1785:5:12","nodeType":"FunctionDefinition","parameters":{"id":1275,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1274,"mutability":"mutable","name":"code","nameLocation":"1799:4:12","nodeType":"VariableDeclaration","scope":1279,"src":"1791:12:12","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1273,"name":"uint256","nodeType":"ElementaryTypeName","src":"1791:7:12","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1790:14:12"},"returnParameters":{"id":1276,"nodeType":"ParameterList","parameters":[],"src":"1819:0:12"},"scope":1280,"src":"1776:194:12","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1281,"src":"657:1315:12","usedErrors":[],"usedEvents":[]}],"src":"99:1874:12"},"id":12},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/ReentrancyGuard.sol","exportedSymbols":{"ReentrancyGuard":[1349]},"id":1350,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1282,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"109:24:13"},{"abstract":true,"baseContracts":[],"canonicalName":"ReentrancyGuard","contractDependencies":[],"contractKind":"contract","documentation":{"id":1283,"nodeType":"StructuredDocumentation","src":"135:894:13","text":" @dev Contract module that helps prevent reentrant calls to a function.\n Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n available, which can be applied to functions to make sure there are no nested\n (reentrant) calls to them.\n Note that because there is a single `nonReentrant` guard, functions marked as\n `nonReentrant` may not call one another. This can be worked around by making\n those functions `private`, and then adding `external` `nonReentrant` entry\n points to them.\n TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n consider using {ReentrancyGuardTransient} instead.\n TIP: If you would like to learn more about reentrancy and alternative ways\n to protect against it, check out our blog post\n https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]."},"fullyImplemented":true,"id":1349,"linearizedBaseContracts":[1349],"name":"ReentrancyGuard","nameLocation":"1048:15:13","nodeType":"ContractDefinition","nodes":[{"constant":true,"id":1286,"mutability":"constant","name":"NOT_ENTERED","nameLocation":"1843:11:13","nodeType":"VariableDeclaration","scope":1349,"src":"1818:40:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1284,"name":"uint256","nodeType":"ElementaryTypeName","src":"1818:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"31","id":1285,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1857:1:13","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"visibility":"private"},{"constant":true,"id":1289,"mutability":"constant","name":"ENTERED","nameLocation":"1889:7:13","nodeType":"VariableDeclaration","scope":1349,"src":"1864:36:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1287,"name":"uint256","nodeType":"ElementaryTypeName","src":"1864:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"32","id":1288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1899:1:13","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"visibility":"private"},{"constant":false,"id":1291,"mutability":"mutable","name":"_status","nameLocation":"1923:7:13","nodeType":"VariableDeclaration","scope":1349,"src":"1907:23:13","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1290,"name":"uint256","nodeType":"ElementaryTypeName","src":"1907:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"documentation":{"id":1292,"nodeType":"StructuredDocumentation","src":"1937:52:13","text":" @dev Unauthorized reentrant call."},"errorSelector":"3ee5aeb5","id":1294,"name":"ReentrancyGuardReentrantCall","nameLocation":"2000:28:13","nodeType":"ErrorDefinition","parameters":{"id":1293,"nodeType":"ParameterList","parameters":[],"src":"2028:2:13"},"src":"1994:37:13"},{"body":{"id":1301,"nodeType":"Block","src":"2051:38:13","statements":[{"expression":{"id":1299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1297,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1291,"src":"2061:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1298,"name":"NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1286,"src":"2071:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2061:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1300,"nodeType":"ExpressionStatement","src":"2061:21:13"}]},"id":1302,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1295,"nodeType":"ParameterList","parameters":[],"src":"2048:2:13"},"returnParameters":{"id":1296,"nodeType":"ParameterList","parameters":[],"src":"2051:0:13"},"scope":1349,"src":"2037:52:13","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":1312,"nodeType":"Block","src":"2490:79:13","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":1305,"name":"_nonReentrantBefore","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1329,"src":"2500:19:13","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":1306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2500:21:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1307,"nodeType":"ExpressionStatement","src":"2500:21:13"},{"id":1308,"nodeType":"PlaceholderStatement","src":"2531:1:13"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":1309,"name":"_nonReentrantAfter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1337,"src":"2542:18:13","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":1310,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2542:20:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":1311,"nodeType":"ExpressionStatement","src":"2542:20:13"}]},"documentation":{"id":1303,"nodeType":"StructuredDocumentation","src":"2095:366:13","text":" @dev Prevents a contract from calling itself, directly or indirectly.\n Calling a `nonReentrant` function from another `nonReentrant`\n function is not supported. It is possible to prevent this from happening\n by making the `nonReentrant` function external, and making it call a\n `private` function that does the actual work."},"id":1313,"name":"nonReentrant","nameLocation":"2475:12:13","nodeType":"ModifierDefinition","parameters":{"id":1304,"nodeType":"ParameterList","parameters":[],"src":"2487:2:13"},"src":"2466:103:13","virtual":false,"visibility":"internal"},{"body":{"id":1328,"nodeType":"Block","src":"2614:268:13","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1316,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1291,"src":"2702:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1317,"name":"ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1289,"src":"2713:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2702:18:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1323,"nodeType":"IfStatement","src":"2698:86:13","trueBody":{"id":1322,"nodeType":"Block","src":"2722:62:13","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":1319,"name":"ReentrancyGuardReentrantCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1294,"src":"2743:28:13","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":1320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2743:30:13","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1321,"nodeType":"RevertStatement","src":"2736:37:13"}]}},{"expression":{"id":1326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1324,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1291,"src":"2858:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1325,"name":"ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1289,"src":"2868:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2858:17:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1327,"nodeType":"ExpressionStatement","src":"2858:17:13"}]},"id":1329,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantBefore","nameLocation":"2584:19:13","nodeType":"FunctionDefinition","parameters":{"id":1314,"nodeType":"ParameterList","parameters":[],"src":"2603:2:13"},"returnParameters":{"id":1315,"nodeType":"ParameterList","parameters":[],"src":"2614:0:13"},"scope":1349,"src":"2575:307:13","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":1336,"nodeType":"Block","src":"2926:170:13","statements":[{"expression":{"id":1334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1332,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1291,"src":"3068:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":1333,"name":"NOT_ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1286,"src":"3078:11:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3068:21:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1335,"nodeType":"ExpressionStatement","src":"3068:21:13"}]},"id":1337,"implemented":true,"kind":"function","modifiers":[],"name":"_nonReentrantAfter","nameLocation":"2897:18:13","nodeType":"FunctionDefinition","parameters":{"id":1330,"nodeType":"ParameterList","parameters":[],"src":"2915:2:13"},"returnParameters":{"id":1331,"nodeType":"ParameterList","parameters":[],"src":"2926:0:13"},"scope":1349,"src":"2888:208:13","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":1347,"nodeType":"Block","src":"3339:42:13","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1345,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1343,"name":"_status","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1291,"src":"3356:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":1344,"name":"ENTERED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1289,"src":"3367:7:13","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3356:18:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":1342,"id":1346,"nodeType":"Return","src":"3349:25:13"}]},"documentation":{"id":1338,"nodeType":"StructuredDocumentation","src":"3102:168:13","text":" @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n `nonReentrant` function in the call stack."},"id":1348,"implemented":true,"kind":"function","modifiers":[],"name":"_reentrancyGuardEntered","nameLocation":"3284:23:13","nodeType":"FunctionDefinition","parameters":{"id":1339,"nodeType":"ParameterList","parameters":[],"src":"3307:2:13"},"returnParameters":{"id":1342,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1341,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1348,"src":"3333:4:13","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1340,"name":"bool","nodeType":"ElementaryTypeName","src":"3333:4:13","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3332:6:13"},"scope":1349,"src":"3275:106:13","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":1350,"src":"1030:2353:13","usedErrors":[1294],"usedEvents":[]}],"src":"109:3275:13"},"id":13},"@openzeppelin/contracts/utils/StorageSlot.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","exportedSymbols":{"StorageSlot":[1473]},"id":1474,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1351,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"193:24:14"},{"abstract":false,"baseContracts":[],"canonicalName":"StorageSlot","contractDependencies":[],"contractKind":"library","documentation":{"id":1352,"nodeType":"StructuredDocumentation","src":"219:1187:14","text":" @dev Library for reading and writing primitive types to specific storage slots.\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 The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n Example usage to set ERC-1967 implementation slot:\n ```solidity\n contract ERC1967 {\n     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n     function _getImplementation() internal view returns (address) {\n         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n     }\n     function _setImplementation(address newImplementation) internal {\n         require(newImplementation.code.length > 0);\n         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n     }\n }\n ```\n TIP: Consider using this library along with {SlotDerivation}."},"fullyImplemented":true,"id":1473,"linearizedBaseContracts":[1473],"name":"StorageSlot","nameLocation":"1415:11:14","nodeType":"ContractDefinition","nodes":[{"canonicalName":"StorageSlot.AddressSlot","id":1355,"members":[{"constant":false,"id":1354,"mutability":"mutable","name":"value","nameLocation":"1470:5:14","nodeType":"VariableDeclaration","scope":1355,"src":"1462:13:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1353,"name":"address","nodeType":"ElementaryTypeName","src":"1462:7:14","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"AddressSlot","nameLocation":"1440:11:14","nodeType":"StructDefinition","scope":1473,"src":"1433:49:14","visibility":"public"},{"canonicalName":"StorageSlot.BooleanSlot","id":1358,"members":[{"constant":false,"id":1357,"mutability":"mutable","name":"value","nameLocation":"1522:5:14","nodeType":"VariableDeclaration","scope":1358,"src":"1517:10:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1356,"name":"bool","nodeType":"ElementaryTypeName","src":"1517:4:14","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"name":"BooleanSlot","nameLocation":"1495:11:14","nodeType":"StructDefinition","scope":1473,"src":"1488:46:14","visibility":"public"},{"canonicalName":"StorageSlot.Bytes32Slot","id":1361,"members":[{"constant":false,"id":1360,"mutability":"mutable","name":"value","nameLocation":"1577:5:14","nodeType":"VariableDeclaration","scope":1361,"src":"1569:13:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1359,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1569:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"name":"Bytes32Slot","nameLocation":"1547:11:14","nodeType":"StructDefinition","scope":1473,"src":"1540:49:14","visibility":"public"},{"canonicalName":"StorageSlot.Uint256Slot","id":1364,"members":[{"constant":false,"id":1363,"mutability":"mutable","name":"value","nameLocation":"1632:5:14","nodeType":"VariableDeclaration","scope":1364,"src":"1624:13:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1362,"name":"uint256","nodeType":"ElementaryTypeName","src":"1624:7:14","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Uint256Slot","nameLocation":"1602:11:14","nodeType":"StructDefinition","scope":1473,"src":"1595:49:14","visibility":"public"},{"canonicalName":"StorageSlot.Int256Slot","id":1367,"members":[{"constant":false,"id":1366,"mutability":"mutable","name":"value","nameLocation":"1685:5:14","nodeType":"VariableDeclaration","scope":1367,"src":"1678:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":1365,"name":"int256","nodeType":"ElementaryTypeName","src":"1678:6:14","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"name":"Int256Slot","nameLocation":"1657:10:14","nodeType":"StructDefinition","scope":1473,"src":"1650:47:14","visibility":"public"},{"canonicalName":"StorageSlot.StringSlot","id":1370,"members":[{"constant":false,"id":1369,"mutability":"mutable","name":"value","nameLocation":"1738:5:14","nodeType":"VariableDeclaration","scope":1370,"src":"1731:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":1368,"name":"string","nodeType":"ElementaryTypeName","src":"1731:6:14","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"name":"StringSlot","nameLocation":"1710:10:14","nodeType":"StructDefinition","scope":1473,"src":"1703:47:14","visibility":"public"},{"canonicalName":"StorageSlot.BytesSlot","id":1373,"members":[{"constant":false,"id":1372,"mutability":"mutable","name":"value","nameLocation":"1789:5:14","nodeType":"VariableDeclaration","scope":1373,"src":"1783:11:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1371,"name":"bytes","nodeType":"ElementaryTypeName","src":"1783:5:14","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"BytesSlot","nameLocation":"1763:9:14","nodeType":"StructDefinition","scope":1473,"src":"1756:45:14","visibility":"public"},{"body":{"id":1383,"nodeType":"Block","src":"1983:79:14","statements":[{"AST":{"nativeSrc":"2018:38:14","nodeType":"YulBlock","src":"2018:38:14","statements":[{"nativeSrc":"2032:14:14","nodeType":"YulAssignment","src":"2032:14:14","value":{"name":"slot","nativeSrc":"2042:4:14","nodeType":"YulIdentifier","src":"2042:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"2032:6:14","nodeType":"YulIdentifier","src":"2032:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1380,"isOffset":false,"isSlot":true,"src":"2032:6:14","suffix":"slot","valueSize":1},{"declaration":1376,"isOffset":false,"isSlot":false,"src":"2042:4:14","valueSize":1}],"flags":["memory-safe"],"id":1382,"nodeType":"InlineAssembly","src":"1993:63:14"}]},"documentation":{"id":1374,"nodeType":"StructuredDocumentation","src":"1807:87:14","text":" @dev Returns an `AddressSlot` with member `value` located at `slot`."},"id":1384,"implemented":true,"kind":"function","modifiers":[],"name":"getAddressSlot","nameLocation":"1908:14:14","nodeType":"FunctionDefinition","parameters":{"id":1377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1376,"mutability":"mutable","name":"slot","nameLocation":"1931:4:14","nodeType":"VariableDeclaration","scope":1384,"src":"1923:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1375,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1923:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1922:14:14"},"returnParameters":{"id":1381,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1380,"mutability":"mutable","name":"r","nameLocation":"1980:1:14","nodeType":"VariableDeclaration","scope":1384,"src":"1960:21:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1355_storage_ptr","typeString":"struct StorageSlot.AddressSlot"},"typeName":{"id":1379,"nodeType":"UserDefinedTypeName","pathNode":{"id":1378,"name":"AddressSlot","nameLocations":["1960:11:14"],"nodeType":"IdentifierPath","referencedDeclaration":1355,"src":"1960:11:14"},"referencedDeclaration":1355,"src":"1960:11:14","typeDescriptions":{"typeIdentifier":"t_struct$_AddressSlot_$1355_storage_ptr","typeString":"struct StorageSlot.AddressSlot"}},"visibility":"internal"}],"src":"1959:23:14"},"scope":1473,"src":"1899:163:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1394,"nodeType":"Block","src":"2243:79:14","statements":[{"AST":{"nativeSrc":"2278:38:14","nodeType":"YulBlock","src":"2278:38:14","statements":[{"nativeSrc":"2292:14:14","nodeType":"YulAssignment","src":"2292:14:14","value":{"name":"slot","nativeSrc":"2302:4:14","nodeType":"YulIdentifier","src":"2302:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"2292:6:14","nodeType":"YulIdentifier","src":"2292:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1391,"isOffset":false,"isSlot":true,"src":"2292:6:14","suffix":"slot","valueSize":1},{"declaration":1387,"isOffset":false,"isSlot":false,"src":"2302:4:14","valueSize":1}],"flags":["memory-safe"],"id":1393,"nodeType":"InlineAssembly","src":"2253:63:14"}]},"documentation":{"id":1385,"nodeType":"StructuredDocumentation","src":"2068:86:14","text":" @dev Returns a `BooleanSlot` with member `value` located at `slot`."},"id":1395,"implemented":true,"kind":"function","modifiers":[],"name":"getBooleanSlot","nameLocation":"2168:14:14","nodeType":"FunctionDefinition","parameters":{"id":1388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1387,"mutability":"mutable","name":"slot","nameLocation":"2191:4:14","nodeType":"VariableDeclaration","scope":1395,"src":"2183:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1386,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2183:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2182:14:14"},"returnParameters":{"id":1392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1391,"mutability":"mutable","name":"r","nameLocation":"2240:1:14","nodeType":"VariableDeclaration","scope":1395,"src":"2220:21:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$1358_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"},"typeName":{"id":1390,"nodeType":"UserDefinedTypeName","pathNode":{"id":1389,"name":"BooleanSlot","nameLocations":["2220:11:14"],"nodeType":"IdentifierPath","referencedDeclaration":1358,"src":"2220:11:14"},"referencedDeclaration":1358,"src":"2220:11:14","typeDescriptions":{"typeIdentifier":"t_struct$_BooleanSlot_$1358_storage_ptr","typeString":"struct StorageSlot.BooleanSlot"}},"visibility":"internal"}],"src":"2219:23:14"},"scope":1473,"src":"2159:163:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1405,"nodeType":"Block","src":"2503:79:14","statements":[{"AST":{"nativeSrc":"2538:38:14","nodeType":"YulBlock","src":"2538:38:14","statements":[{"nativeSrc":"2552:14:14","nodeType":"YulAssignment","src":"2552:14:14","value":{"name":"slot","nativeSrc":"2562:4:14","nodeType":"YulIdentifier","src":"2562:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"2552:6:14","nodeType":"YulIdentifier","src":"2552:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1402,"isOffset":false,"isSlot":true,"src":"2552:6:14","suffix":"slot","valueSize":1},{"declaration":1398,"isOffset":false,"isSlot":false,"src":"2562:4:14","valueSize":1}],"flags":["memory-safe"],"id":1404,"nodeType":"InlineAssembly","src":"2513:63:14"}]},"documentation":{"id":1396,"nodeType":"StructuredDocumentation","src":"2328:86:14","text":" @dev Returns a `Bytes32Slot` with member `value` located at `slot`."},"id":1406,"implemented":true,"kind":"function","modifiers":[],"name":"getBytes32Slot","nameLocation":"2428:14:14","nodeType":"FunctionDefinition","parameters":{"id":1399,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1398,"mutability":"mutable","name":"slot","nameLocation":"2451:4:14","nodeType":"VariableDeclaration","scope":1406,"src":"2443:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1397,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2443:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2442:14:14"},"returnParameters":{"id":1403,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1402,"mutability":"mutable","name":"r","nameLocation":"2500:1:14","nodeType":"VariableDeclaration","scope":1406,"src":"2480:21:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$1361_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"},"typeName":{"id":1401,"nodeType":"UserDefinedTypeName","pathNode":{"id":1400,"name":"Bytes32Slot","nameLocations":["2480:11:14"],"nodeType":"IdentifierPath","referencedDeclaration":1361,"src":"2480:11:14"},"referencedDeclaration":1361,"src":"2480:11:14","typeDescriptions":{"typeIdentifier":"t_struct$_Bytes32Slot_$1361_storage_ptr","typeString":"struct StorageSlot.Bytes32Slot"}},"visibility":"internal"}],"src":"2479:23:14"},"scope":1473,"src":"2419:163:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1416,"nodeType":"Block","src":"2763:79:14","statements":[{"AST":{"nativeSrc":"2798:38:14","nodeType":"YulBlock","src":"2798:38:14","statements":[{"nativeSrc":"2812:14:14","nodeType":"YulAssignment","src":"2812:14:14","value":{"name":"slot","nativeSrc":"2822:4:14","nodeType":"YulIdentifier","src":"2822:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"2812:6:14","nodeType":"YulIdentifier","src":"2812:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1413,"isOffset":false,"isSlot":true,"src":"2812:6:14","suffix":"slot","valueSize":1},{"declaration":1409,"isOffset":false,"isSlot":false,"src":"2822:4:14","valueSize":1}],"flags":["memory-safe"],"id":1415,"nodeType":"InlineAssembly","src":"2773:63:14"}]},"documentation":{"id":1407,"nodeType":"StructuredDocumentation","src":"2588:86:14","text":" @dev Returns a `Uint256Slot` with member `value` located at `slot`."},"id":1417,"implemented":true,"kind":"function","modifiers":[],"name":"getUint256Slot","nameLocation":"2688:14:14","nodeType":"FunctionDefinition","parameters":{"id":1410,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1409,"mutability":"mutable","name":"slot","nameLocation":"2711:4:14","nodeType":"VariableDeclaration","scope":1417,"src":"2703:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1408,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2703:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2702:14:14"},"returnParameters":{"id":1414,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1413,"mutability":"mutable","name":"r","nameLocation":"2760:1:14","nodeType":"VariableDeclaration","scope":1417,"src":"2740:21:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"},"typeName":{"id":1412,"nodeType":"UserDefinedTypeName","pathNode":{"id":1411,"name":"Uint256Slot","nameLocations":["2740:11:14"],"nodeType":"IdentifierPath","referencedDeclaration":1364,"src":"2740:11:14"},"referencedDeclaration":1364,"src":"2740:11:14","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"}},"visibility":"internal"}],"src":"2739:23:14"},"scope":1473,"src":"2679:163:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1427,"nodeType":"Block","src":"3020:79:14","statements":[{"AST":{"nativeSrc":"3055:38:14","nodeType":"YulBlock","src":"3055:38:14","statements":[{"nativeSrc":"3069:14:14","nodeType":"YulAssignment","src":"3069:14:14","value":{"name":"slot","nativeSrc":"3079:4:14","nodeType":"YulIdentifier","src":"3079:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"3069:6:14","nodeType":"YulIdentifier","src":"3069:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1424,"isOffset":false,"isSlot":true,"src":"3069:6:14","suffix":"slot","valueSize":1},{"declaration":1420,"isOffset":false,"isSlot":false,"src":"3079:4:14","valueSize":1}],"flags":["memory-safe"],"id":1426,"nodeType":"InlineAssembly","src":"3030:63:14"}]},"documentation":{"id":1418,"nodeType":"StructuredDocumentation","src":"2848:85:14","text":" @dev Returns a `Int256Slot` with member `value` located at `slot`."},"id":1428,"implemented":true,"kind":"function","modifiers":[],"name":"getInt256Slot","nameLocation":"2947:13:14","nodeType":"FunctionDefinition","parameters":{"id":1421,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1420,"mutability":"mutable","name":"slot","nameLocation":"2969:4:14","nodeType":"VariableDeclaration","scope":1428,"src":"2961:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1419,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2961:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2960:14:14"},"returnParameters":{"id":1425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1424,"mutability":"mutable","name":"r","nameLocation":"3017:1:14","nodeType":"VariableDeclaration","scope":1428,"src":"2998:20:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Int256Slot_$1367_storage_ptr","typeString":"struct StorageSlot.Int256Slot"},"typeName":{"id":1423,"nodeType":"UserDefinedTypeName","pathNode":{"id":1422,"name":"Int256Slot","nameLocations":["2998:10:14"],"nodeType":"IdentifierPath","referencedDeclaration":1367,"src":"2998:10:14"},"referencedDeclaration":1367,"src":"2998:10:14","typeDescriptions":{"typeIdentifier":"t_struct$_Int256Slot_$1367_storage_ptr","typeString":"struct StorageSlot.Int256Slot"}},"visibility":"internal"}],"src":"2997:22:14"},"scope":1473,"src":"2938:161:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1438,"nodeType":"Block","src":"3277:79:14","statements":[{"AST":{"nativeSrc":"3312:38:14","nodeType":"YulBlock","src":"3312:38:14","statements":[{"nativeSrc":"3326:14:14","nodeType":"YulAssignment","src":"3326:14:14","value":{"name":"slot","nativeSrc":"3336:4:14","nodeType":"YulIdentifier","src":"3336:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"3326:6:14","nodeType":"YulIdentifier","src":"3326:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1435,"isOffset":false,"isSlot":true,"src":"3326:6:14","suffix":"slot","valueSize":1},{"declaration":1431,"isOffset":false,"isSlot":false,"src":"3336:4:14","valueSize":1}],"flags":["memory-safe"],"id":1437,"nodeType":"InlineAssembly","src":"3287:63:14"}]},"documentation":{"id":1429,"nodeType":"StructuredDocumentation","src":"3105:85:14","text":" @dev Returns a `StringSlot` with member `value` located at `slot`."},"id":1439,"implemented":true,"kind":"function","modifiers":[],"name":"getStringSlot","nameLocation":"3204:13:14","nodeType":"FunctionDefinition","parameters":{"id":1432,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1431,"mutability":"mutable","name":"slot","nameLocation":"3226:4:14","nodeType":"VariableDeclaration","scope":1439,"src":"3218:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1430,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3218:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3217:14:14"},"returnParameters":{"id":1436,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1435,"mutability":"mutable","name":"r","nameLocation":"3274:1:14","nodeType":"VariableDeclaration","scope":1439,"src":"3255:20:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_StringSlot_$1370_storage_ptr","typeString":"struct StorageSlot.StringSlot"},"typeName":{"id":1434,"nodeType":"UserDefinedTypeName","pathNode":{"id":1433,"name":"StringSlot","nameLocations":["3255:10:14"],"nodeType":"IdentifierPath","referencedDeclaration":1370,"src":"3255:10:14"},"referencedDeclaration":1370,"src":"3255:10:14","typeDescriptions":{"typeIdentifier":"t_struct$_StringSlot_$1370_storage_ptr","typeString":"struct StorageSlot.StringSlot"}},"visibility":"internal"}],"src":"3254:22:14"},"scope":1473,"src":"3195:161:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1449,"nodeType":"Block","src":"3558:85:14","statements":[{"AST":{"nativeSrc":"3593:44:14","nodeType":"YulBlock","src":"3593:44:14","statements":[{"nativeSrc":"3607:20:14","nodeType":"YulAssignment","src":"3607:20:14","value":{"name":"store.slot","nativeSrc":"3617:10:14","nodeType":"YulIdentifier","src":"3617:10:14"},"variableNames":[{"name":"r.slot","nativeSrc":"3607:6:14","nodeType":"YulIdentifier","src":"3607:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1446,"isOffset":false,"isSlot":true,"src":"3607:6:14","suffix":"slot","valueSize":1},{"declaration":1442,"isOffset":false,"isSlot":true,"src":"3617:10:14","suffix":"slot","valueSize":1}],"flags":["memory-safe"],"id":1448,"nodeType":"InlineAssembly","src":"3568:69:14"}]},"documentation":{"id":1440,"nodeType":"StructuredDocumentation","src":"3362:101:14","text":" @dev Returns an `StringSlot` representation of the string storage pointer `store`."},"id":1450,"implemented":true,"kind":"function","modifiers":[],"name":"getStringSlot","nameLocation":"3477:13:14","nodeType":"FunctionDefinition","parameters":{"id":1443,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1442,"mutability":"mutable","name":"store","nameLocation":"3506:5:14","nodeType":"VariableDeclaration","scope":1450,"src":"3491:20:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":1441,"name":"string","nodeType":"ElementaryTypeName","src":"3491:6:14","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3490:22:14"},"returnParameters":{"id":1447,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1446,"mutability":"mutable","name":"r","nameLocation":"3555:1:14","nodeType":"VariableDeclaration","scope":1450,"src":"3536:20:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_StringSlot_$1370_storage_ptr","typeString":"struct StorageSlot.StringSlot"},"typeName":{"id":1445,"nodeType":"UserDefinedTypeName","pathNode":{"id":1444,"name":"StringSlot","nameLocations":["3536:10:14"],"nodeType":"IdentifierPath","referencedDeclaration":1370,"src":"3536:10:14"},"referencedDeclaration":1370,"src":"3536:10:14","typeDescriptions":{"typeIdentifier":"t_struct$_StringSlot_$1370_storage_ptr","typeString":"struct StorageSlot.StringSlot"}},"visibility":"internal"}],"src":"3535:22:14"},"scope":1473,"src":"3468:175:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1460,"nodeType":"Block","src":"3818:79:14","statements":[{"AST":{"nativeSrc":"3853:38:14","nodeType":"YulBlock","src":"3853:38:14","statements":[{"nativeSrc":"3867:14:14","nodeType":"YulAssignment","src":"3867:14:14","value":{"name":"slot","nativeSrc":"3877:4:14","nodeType":"YulIdentifier","src":"3877:4:14"},"variableNames":[{"name":"r.slot","nativeSrc":"3867:6:14","nodeType":"YulIdentifier","src":"3867:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1457,"isOffset":false,"isSlot":true,"src":"3867:6:14","suffix":"slot","valueSize":1},{"declaration":1453,"isOffset":false,"isSlot":false,"src":"3877:4:14","valueSize":1}],"flags":["memory-safe"],"id":1459,"nodeType":"InlineAssembly","src":"3828:63:14"}]},"documentation":{"id":1451,"nodeType":"StructuredDocumentation","src":"3649:84:14","text":" @dev Returns a `BytesSlot` with member `value` located at `slot`."},"id":1461,"implemented":true,"kind":"function","modifiers":[],"name":"getBytesSlot","nameLocation":"3747:12:14","nodeType":"FunctionDefinition","parameters":{"id":1454,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1453,"mutability":"mutable","name":"slot","nameLocation":"3768:4:14","nodeType":"VariableDeclaration","scope":1461,"src":"3760:12:14","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":1452,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3760:7:14","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3759:14:14"},"returnParameters":{"id":1458,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1457,"mutability":"mutable","name":"r","nameLocation":"3815:1:14","nodeType":"VariableDeclaration","scope":1461,"src":"3797:19:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_BytesSlot_$1373_storage_ptr","typeString":"struct StorageSlot.BytesSlot"},"typeName":{"id":1456,"nodeType":"UserDefinedTypeName","pathNode":{"id":1455,"name":"BytesSlot","nameLocations":["3797:9:14"],"nodeType":"IdentifierPath","referencedDeclaration":1373,"src":"3797:9:14"},"referencedDeclaration":1373,"src":"3797:9:14","typeDescriptions":{"typeIdentifier":"t_struct$_BytesSlot_$1373_storage_ptr","typeString":"struct StorageSlot.BytesSlot"}},"visibility":"internal"}],"src":"3796:21:14"},"scope":1473,"src":"3738:159:14","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1471,"nodeType":"Block","src":"4094:85:14","statements":[{"AST":{"nativeSrc":"4129:44:14","nodeType":"YulBlock","src":"4129:44:14","statements":[{"nativeSrc":"4143:20:14","nodeType":"YulAssignment","src":"4143:20:14","value":{"name":"store.slot","nativeSrc":"4153:10:14","nodeType":"YulIdentifier","src":"4153:10:14"},"variableNames":[{"name":"r.slot","nativeSrc":"4143:6:14","nodeType":"YulIdentifier","src":"4143:6:14"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1468,"isOffset":false,"isSlot":true,"src":"4143:6:14","suffix":"slot","valueSize":1},{"declaration":1464,"isOffset":false,"isSlot":true,"src":"4153:10:14","suffix":"slot","valueSize":1}],"flags":["memory-safe"],"id":1470,"nodeType":"InlineAssembly","src":"4104:69:14"}]},"documentation":{"id":1462,"nodeType":"StructuredDocumentation","src":"3903:99:14","text":" @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`."},"id":1472,"implemented":true,"kind":"function","modifiers":[],"name":"getBytesSlot","nameLocation":"4016:12:14","nodeType":"FunctionDefinition","parameters":{"id":1465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1464,"mutability":"mutable","name":"store","nameLocation":"4043:5:14","nodeType":"VariableDeclaration","scope":1472,"src":"4029:19:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":1463,"name":"bytes","nodeType":"ElementaryTypeName","src":"4029:5:14","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4028:21:14"},"returnParameters":{"id":1469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1468,"mutability":"mutable","name":"r","nameLocation":"4091:1:14","nodeType":"VariableDeclaration","scope":1472,"src":"4073:19:14","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_BytesSlot_$1373_storage_ptr","typeString":"struct StorageSlot.BytesSlot"},"typeName":{"id":1467,"nodeType":"UserDefinedTypeName","pathNode":{"id":1466,"name":"BytesSlot","nameLocations":["4073:9:14"],"nodeType":"IdentifierPath","referencedDeclaration":1373,"src":"4073:9:14"},"referencedDeclaration":1373,"src":"4073:9:14","typeDescriptions":{"typeIdentifier":"t_struct$_BytesSlot_$1373_storage_ptr","typeString":"struct StorageSlot.BytesSlot"}},"visibility":"internal"}],"src":"4072:21:14"},"scope":1473,"src":"4007:172:14","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":1474,"src":"1407:2774:14","usedErrors":[],"usedEvents":[]}],"src":"193:3989:14"},"id":14},"@openzeppelin/contracts/utils/Strings.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","exportedSymbols":{"Math":[5969],"SafeCast":[7734],"SignedMath":[7878],"Strings":[2875]},"id":2876,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":1475,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"101:24:15"},{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","file":"./math/Math.sol","id":1477,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2876,"sourceUnit":5970,"src":"127:37:15","symbolAliases":[{"foreign":{"id":1476,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5969,"src":"135:4:15","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/math/SafeCast.sol","file":"./math/SafeCast.sol","id":1479,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2876,"sourceUnit":7735,"src":"165:45:15","symbolAliases":[{"foreign":{"id":1478,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"173:8:15","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/math/SignedMath.sol","file":"./math/SignedMath.sol","id":1481,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":2876,"sourceUnit":7879,"src":"211:49:15","symbolAliases":[{"foreign":{"id":1480,"name":"SignedMath","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7878,"src":"219:10:15","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Strings","contractDependencies":[],"contractKind":"library","documentation":{"id":1482,"nodeType":"StructuredDocumentation","src":"262:34:15","text":" @dev String operations."},"fullyImplemented":true,"id":2875,"linearizedBaseContracts":[2875],"name":"Strings","nameLocation":"305:7:15","nodeType":"ContractDefinition","nodes":[{"global":false,"id":1484,"libraryName":{"id":1483,"name":"SafeCast","nameLocations":["325:8:15"],"nodeType":"IdentifierPath","referencedDeclaration":7734,"src":"325:8:15"},"nodeType":"UsingForDirective","src":"319:21:15"},{"constant":true,"id":1487,"mutability":"constant","name":"HEX_DIGITS","nameLocation":"371:10:15","nodeType":"VariableDeclaration","scope":2875,"src":"346:56:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"},"typeName":{"id":1485,"name":"bytes16","nodeType":"ElementaryTypeName","src":"346:7:15","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"value":{"hexValue":"30313233343536373839616263646566","id":1486,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"384:18:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_cb29997ed99ead0db59ce4d12b7d3723198c827273e5796737c926d78019c39f","typeString":"literal_string \"0123456789abcdef\""},"value":"0123456789abcdef"},"visibility":"private"},{"constant":true,"id":1490,"mutability":"constant","name":"ADDRESS_LENGTH","nameLocation":"431:14:15","nodeType":"VariableDeclaration","scope":2875,"src":"408:42:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1488,"name":"uint8","nodeType":"ElementaryTypeName","src":"408:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"value":{"hexValue":"3230","id":1489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"448:2:15","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"visibility":"private"},{"constant":true,"id":1526,"mutability":"constant","name":"SPECIAL_CHARS_LOOKUP","nameLocation":"481:20:15","nodeType":"VariableDeclaration","scope":2875,"src":"456:302:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1491,"name":"uint256","nodeType":"ElementaryTypeName","src":"456:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"commonType":{"typeIdentifier":"t_rational_4951760157141521116776380160_by_1","typeString":"int_const 4951760157141521116776380160"},"id":1525,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_rational_17179883264_by_1","typeString":"int_const 17179883264"},"id":1520,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_rational_14080_by_1","typeString":"int_const 14080"},"id":1515,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_rational_5888_by_1","typeString":"int_const 5888"},"id":1510,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_rational_1792_by_1","typeString":"int_const 1792"},"id":1505,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_rational_768_by_1","typeString":"int_const 768"},"id":1500,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"},"id":1494,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1492,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"513:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783038","id":1493,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"518:4:15","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"0x08"},"src":"513:9:15","typeDescriptions":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"}}],"id":1495,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"512:11:15","typeDescriptions":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_512_by_1","typeString":"int_const 512"},"id":1498,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"552:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783039","id":1497,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"557:4:15","typeDescriptions":{"typeIdentifier":"t_rational_9_by_1","typeString":"int_const 9"},"value":"0x09"},"src":"552:9:15","typeDescriptions":{"typeIdentifier":"t_rational_512_by_1","typeString":"int_const 512"}}],"id":1499,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"551:11:15","typeDescriptions":{"typeIdentifier":"t_rational_512_by_1","typeString":"int_const 512"}},"src":"512:50:15","typeDescriptions":{"typeIdentifier":"t_rational_768_by_1","typeString":"int_const 768"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_1024_by_1","typeString":"int_const 1024"},"id":1503,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1501,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"585:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783061","id":1502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"590:4:15","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"0x0a"},"src":"585:9:15","typeDescriptions":{"typeIdentifier":"t_rational_1024_by_1","typeString":"int_const 1024"}}],"id":1504,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"584:11:15","typeDescriptions":{"typeIdentifier":"t_rational_1024_by_1","typeString":"int_const 1024"}},"src":"512:83:15","typeDescriptions":{"typeIdentifier":"t_rational_1792_by_1","typeString":"int_const 1792"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_4096_by_1","typeString":"int_const 4096"},"id":1508,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1506,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"622:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783063","id":1507,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"627:4:15","typeDescriptions":{"typeIdentifier":"t_rational_12_by_1","typeString":"int_const 12"},"value":"0x0c"},"src":"622:9:15","typeDescriptions":{"typeIdentifier":"t_rational_4096_by_1","typeString":"int_const 4096"}}],"id":1509,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"621:11:15","typeDescriptions":{"typeIdentifier":"t_rational_4096_by_1","typeString":"int_const 4096"}},"src":"512:120:15","typeDescriptions":{"typeIdentifier":"t_rational_5888_by_1","typeString":"int_const 5888"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_8192_by_1","typeString":"int_const 8192"},"id":1513,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"661:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783064","id":1512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"666:4:15","typeDescriptions":{"typeIdentifier":"t_rational_13_by_1","typeString":"int_const 13"},"value":"0x0d"},"src":"661:9:15","typeDescriptions":{"typeIdentifier":"t_rational_8192_by_1","typeString":"int_const 8192"}}],"id":1514,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"660:11:15","typeDescriptions":{"typeIdentifier":"t_rational_8192_by_1","typeString":"int_const 8192"}},"src":"512:159:15","typeDescriptions":{"typeIdentifier":"t_rational_14080_by_1","typeString":"int_const 14080"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_17179869184_by_1","typeString":"int_const 17179869184"},"id":1518,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"706:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783232","id":1517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"711:4:15","typeDescriptions":{"typeIdentifier":"t_rational_34_by_1","typeString":"int_const 34"},"value":"0x22"},"src":"706:9:15","typeDescriptions":{"typeIdentifier":"t_rational_17179869184_by_1","typeString":"int_const 17179869184"}}],"id":1519,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"705:11:15","typeDescriptions":{"typeIdentifier":"t_rational_17179869184_by_1","typeString":"int_const 17179869184"}},"src":"512:204:15","typeDescriptions":{"typeIdentifier":"t_rational_17179883264_by_1","typeString":"int_const 17179883264"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_4951760157141521099596496896_by_1","typeString":"int_const 4951760157141521099596496896"},"id":1523,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":1521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"748:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"30783563","id":1522,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"753:4:15","typeDescriptions":{"typeIdentifier":"t_rational_92_by_1","typeString":"int_const 92"},"value":"0x5c"},"src":"748:9:15","typeDescriptions":{"typeIdentifier":"t_rational_4951760157141521099596496896_by_1","typeString":"int_const 4951760157141521099596496896"}}],"id":1524,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"747:11:15","typeDescriptions":{"typeIdentifier":"t_rational_4951760157141521099596496896_by_1","typeString":"int_const 4951760157141521099596496896"}},"src":"512:246:15","typeDescriptions":{"typeIdentifier":"t_rational_4951760157141521116776380160_by_1","typeString":"int_const 4951760157141521116776380160"}},"visibility":"private"},{"documentation":{"id":1527,"nodeType":"StructuredDocumentation","src":"778:81:15","text":" @dev The `value` string doesn't fit in the specified `length`."},"errorSelector":"e22e27eb","id":1533,"name":"StringsInsufficientHexLength","nameLocation":"870:28:15","nodeType":"ErrorDefinition","parameters":{"id":1532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1529,"mutability":"mutable","name":"value","nameLocation":"907:5:15","nodeType":"VariableDeclaration","scope":1533,"src":"899:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1528,"name":"uint256","nodeType":"ElementaryTypeName","src":"899:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1531,"mutability":"mutable","name":"length","nameLocation":"922:6:15","nodeType":"VariableDeclaration","scope":1533,"src":"914:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1530,"name":"uint256","nodeType":"ElementaryTypeName","src":"914:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"898:31:15"},"src":"864:66:15"},{"documentation":{"id":1534,"nodeType":"StructuredDocumentation","src":"936:108:15","text":" @dev The string being parsed contains characters that are not in scope of the given base."},"errorSelector":"94e2737e","id":1536,"name":"StringsInvalidChar","nameLocation":"1055:18:15","nodeType":"ErrorDefinition","parameters":{"id":1535,"nodeType":"ParameterList","parameters":[],"src":"1073:2:15"},"src":"1049:27:15"},{"documentation":{"id":1537,"nodeType":"StructuredDocumentation","src":"1082:84:15","text":" @dev The string being parsed is not a properly formatted address."},"errorSelector":"1d15ae44","id":1539,"name":"StringsInvalidAddressFormat","nameLocation":"1177:27:15","nodeType":"ErrorDefinition","parameters":{"id":1538,"nodeType":"ParameterList","parameters":[],"src":"1204:2:15"},"src":"1171:36:15"},{"body":{"id":1586,"nodeType":"Block","src":"1379:563:15","statements":[{"id":1585,"nodeType":"UncheckedBlock","src":"1389:547:15","statements":[{"assignments":[1548],"declarations":[{"constant":false,"id":1548,"mutability":"mutable","name":"length","nameLocation":"1421:6:15","nodeType":"VariableDeclaration","scope":1585,"src":"1413:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1547,"name":"uint256","nodeType":"ElementaryTypeName","src":"1413:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1555,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1551,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1542,"src":"1441:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1549,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5969,"src":"1430:4:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$5969_$","typeString":"type(library Math)"}},"id":1550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1435:5:15","memberName":"log10","nodeType":"MemberAccess","referencedDeclaration":5801,"src":"1430:10:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":1552,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1430:17:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1553,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1450:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1430:21:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1413:38:15"},{"assignments":[1557],"declarations":[{"constant":false,"id":1557,"mutability":"mutable","name":"buffer","nameLocation":"1479:6:15","nodeType":"VariableDeclaration","scope":1585,"src":"1465:20:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1556,"name":"string","nodeType":"ElementaryTypeName","src":"1465:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":1562,"initialValue":{"arguments":[{"id":1560,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1548,"src":"1499:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1488:10:15","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"},"typeName":{"id":1558,"name":"string","nodeType":"ElementaryTypeName","src":"1492:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"id":1561,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1488:18:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"nodeType":"VariableDeclarationStatement","src":"1465:41:15"},{"assignments":[1564],"declarations":[{"constant":false,"id":1564,"mutability":"mutable","name":"ptr","nameLocation":"1528:3:15","nodeType":"VariableDeclaration","scope":1585,"src":"1520:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1563,"name":"uint256","nodeType":"ElementaryTypeName","src":"1520:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1565,"nodeType":"VariableDeclarationStatement","src":"1520:11:15"},{"AST":{"nativeSrc":"1570:69:15","nodeType":"YulBlock","src":"1570:69:15","statements":[{"nativeSrc":"1588:37:15","nodeType":"YulAssignment","src":"1588:37:15","value":{"arguments":[{"arguments":[{"name":"buffer","nativeSrc":"1603:6:15","nodeType":"YulIdentifier","src":"1603:6:15"},{"kind":"number","nativeSrc":"1611:4:15","nodeType":"YulLiteral","src":"1611:4:15","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"1599:3:15","nodeType":"YulIdentifier","src":"1599:3:15"},"nativeSrc":"1599:17:15","nodeType":"YulFunctionCall","src":"1599:17:15"},{"name":"length","nativeSrc":"1618:6:15","nodeType":"YulIdentifier","src":"1618:6:15"}],"functionName":{"name":"add","nativeSrc":"1595:3:15","nodeType":"YulIdentifier","src":"1595:3:15"},"nativeSrc":"1595:30:15","nodeType":"YulFunctionCall","src":"1595:30:15"},"variableNames":[{"name":"ptr","nativeSrc":"1588:3:15","nodeType":"YulIdentifier","src":"1588:3:15"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1557,"isOffset":false,"isSlot":false,"src":"1603:6:15","valueSize":1},{"declaration":1548,"isOffset":false,"isSlot":false,"src":"1618:6:15","valueSize":1},{"declaration":1564,"isOffset":false,"isSlot":false,"src":"1588:3:15","valueSize":1}],"flags":["memory-safe"],"id":1566,"nodeType":"InlineAssembly","src":"1545:94:15"},{"body":{"id":1581,"nodeType":"Block","src":"1665:234:15","statements":[{"expression":{"id":1569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"1683:5:15","subExpression":{"id":1568,"name":"ptr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1564,"src":"1683:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1570,"nodeType":"ExpressionStatement","src":"1683:5:15"},{"AST":{"nativeSrc":"1731:86:15","nodeType":"YulBlock","src":"1731:86:15","statements":[{"expression":{"arguments":[{"name":"ptr","nativeSrc":"1761:3:15","nodeType":"YulIdentifier","src":"1761:3:15"},{"arguments":[{"arguments":[{"name":"value","nativeSrc":"1775:5:15","nodeType":"YulIdentifier","src":"1775:5:15"},{"kind":"number","nativeSrc":"1782:2:15","nodeType":"YulLiteral","src":"1782:2:15","type":"","value":"10"}],"functionName":{"name":"mod","nativeSrc":"1771:3:15","nodeType":"YulIdentifier","src":"1771:3:15"},"nativeSrc":"1771:14:15","nodeType":"YulFunctionCall","src":"1771:14:15"},{"name":"HEX_DIGITS","nativeSrc":"1787:10:15","nodeType":"YulIdentifier","src":"1787:10:15"}],"functionName":{"name":"byte","nativeSrc":"1766:4:15","nodeType":"YulIdentifier","src":"1766:4:15"},"nativeSrc":"1766:32:15","nodeType":"YulFunctionCall","src":"1766:32:15"}],"functionName":{"name":"mstore8","nativeSrc":"1753:7:15","nodeType":"YulIdentifier","src":"1753:7:15"},"nativeSrc":"1753:46:15","nodeType":"YulFunctionCall","src":"1753:46:15"},"nativeSrc":"1753:46:15","nodeType":"YulExpressionStatement","src":"1753:46:15"}]},"evmVersion":"paris","externalReferences":[{"declaration":1487,"isOffset":false,"isSlot":false,"src":"1787:10:15","valueSize":1},{"declaration":1564,"isOffset":false,"isSlot":false,"src":"1761:3:15","valueSize":1},{"declaration":1542,"isOffset":false,"isSlot":false,"src":"1775:5:15","valueSize":1}],"flags":["memory-safe"],"id":1571,"nodeType":"InlineAssembly","src":"1706:111:15"},{"expression":{"id":1574,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1572,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1542,"src":"1834:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"hexValue":"3130","id":1573,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1843:2:15","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"src":"1834:11:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1575,"nodeType":"ExpressionStatement","src":"1834:11:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1578,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1576,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1542,"src":"1867:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":1577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1876:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1867:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1580,"nodeType":"IfStatement","src":"1863:21:15","trueBody":{"id":1579,"nodeType":"Break","src":"1879:5:15"}}]},"condition":{"hexValue":"74727565","id":1567,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1659:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"id":1582,"nodeType":"WhileStatement","src":"1652:247:15"},{"expression":{"id":1583,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1557,"src":"1919:6:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1546,"id":1584,"nodeType":"Return","src":"1912:13:15"}]}]},"documentation":{"id":1540,"nodeType":"StructuredDocumentation","src":"1213:90:15","text":" @dev Converts a `uint256` to its ASCII `string` decimal representation."},"id":1587,"implemented":true,"kind":"function","modifiers":[],"name":"toString","nameLocation":"1317:8:15","nodeType":"FunctionDefinition","parameters":{"id":1543,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1542,"mutability":"mutable","name":"value","nameLocation":"1334:5:15","nodeType":"VariableDeclaration","scope":1587,"src":"1326:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1541,"name":"uint256","nodeType":"ElementaryTypeName","src":"1326:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1325:15:15"},"returnParameters":{"id":1546,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1545,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1587,"src":"1364:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1544,"name":"string","nodeType":"ElementaryTypeName","src":"1364:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1363:15:15"},"scope":2875,"src":"1308:634:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1612,"nodeType":"Block","src":"2118:92:15","statements":[{"expression":{"arguments":[{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":1600,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1598,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1590,"src":"2149:5:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"30","id":1599,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2157:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2149:9:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"hexValue":"","id":1602,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2167:2:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"id":1603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"2149:20:15","trueExpression":{"hexValue":"2d","id":1601,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2161:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561","typeString":"literal_string \"-\""},"value":"-"},"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"arguments":[{"arguments":[{"id":1607,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1590,"src":"2195:5:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"expression":{"id":1605,"name":"SignedMath","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7878,"src":"2180:10:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SignedMath_$7878_$","typeString":"type(library SignedMath)"}},"id":1606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2191:3:15","memberName":"abs","nodeType":"MemberAccess","referencedDeclaration":7877,"src":"2180:14:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_int256_$returns$_t_uint256_$","typeString":"function (int256) pure returns (uint256)"}},"id":1608,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2180:21:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1604,"name":"toString","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1587,"src":"2171:8:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256) pure returns (string memory)"}},"id":1609,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2171:31:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":1596,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2135:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1595,"name":"string","nodeType":"ElementaryTypeName","src":"2135:6:15","typeDescriptions":{}}},"id":1597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2142:6:15","memberName":"concat","nodeType":"MemberAccess","src":"2135:13:15","typeDescriptions":{"typeIdentifier":"t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$","typeString":"function () pure returns (string memory)"}},"id":1610,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2135:68:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1594,"id":1611,"nodeType":"Return","src":"2128:75:15"}]},"documentation":{"id":1588,"nodeType":"StructuredDocumentation","src":"1948:89:15","text":" @dev Converts a `int256` to its ASCII `string` decimal representation."},"id":1613,"implemented":true,"kind":"function","modifiers":[],"name":"toStringSigned","nameLocation":"2051:14:15","nodeType":"FunctionDefinition","parameters":{"id":1591,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1590,"mutability":"mutable","name":"value","nameLocation":"2073:5:15","nodeType":"VariableDeclaration","scope":1613,"src":"2066:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":1589,"name":"int256","nodeType":"ElementaryTypeName","src":"2066:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"2065:14:15"},"returnParameters":{"id":1594,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1593,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1613,"src":"2103:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1592,"name":"string","nodeType":"ElementaryTypeName","src":"2103:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2102:15:15"},"scope":2875,"src":"2042:168:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1632,"nodeType":"Block","src":"2389:100:15","statements":[{"id":1631,"nodeType":"UncheckedBlock","src":"2399:84:15","statements":[{"expression":{"arguments":[{"id":1622,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1616,"src":"2442:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":1625,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1616,"src":"2461:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":1623,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5969,"src":"2449:4:15","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$5969_$","typeString":"type(library Math)"}},"id":1624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2454:6:15","memberName":"log256","nodeType":"MemberAccess","referencedDeclaration":5912,"src":"2449:11:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":1626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2449:18:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1627,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2470:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2449:22:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1621,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[1633,1716,1736],"referencedDeclaration":1716,"src":"2430:11:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":1629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2430:42:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1620,"id":1630,"nodeType":"Return","src":"2423:49:15"}]}]},"documentation":{"id":1614,"nodeType":"StructuredDocumentation","src":"2216:94:15","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation."},"id":1633,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"2324:11:15","nodeType":"FunctionDefinition","parameters":{"id":1617,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1616,"mutability":"mutable","name":"value","nameLocation":"2344:5:15","nodeType":"VariableDeclaration","scope":1633,"src":"2336:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1615,"name":"uint256","nodeType":"ElementaryTypeName","src":"2336:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2335:15:15"},"returnParameters":{"id":1620,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1619,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1633,"src":"2374:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1618,"name":"string","nodeType":"ElementaryTypeName","src":"2374:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2373:15:15"},"scope":2875,"src":"2315:174:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1715,"nodeType":"Block","src":"2702:435:15","statements":[{"assignments":[1644],"declarations":[{"constant":false,"id":1644,"mutability":"mutable","name":"localValue","nameLocation":"2720:10:15","nodeType":"VariableDeclaration","scope":1715,"src":"2712:18:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1643,"name":"uint256","nodeType":"ElementaryTypeName","src":"2712:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1646,"initialValue":{"id":1645,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1636,"src":"2733:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2712:26:15"},{"assignments":[1648],"declarations":[{"constant":false,"id":1648,"mutability":"mutable","name":"buffer","nameLocation":"2761:6:15","nodeType":"VariableDeclaration","scope":1715,"src":"2748:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1647,"name":"bytes","nodeType":"ElementaryTypeName","src":"2748:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1657,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1653,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1651,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2780:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1652,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1638,"src":"2784:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2780:10:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32","id":1654,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2793:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"2780:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1650,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"2770:9:15","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":1649,"name":"bytes","nodeType":"ElementaryTypeName","src":"2774:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":1656,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2770:25:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"2748:47:15"},{"expression":{"id":1662,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1658,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1648,"src":"2805:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1660,"indexExpression":{"hexValue":"30","id":1659,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2812:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2805:9:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":1661,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2817:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d","typeString":"literal_string \"0\""},"value":"0"},"src":"2805:15:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1663,"nodeType":"ExpressionStatement","src":"2805:15:15"},{"expression":{"id":1668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1664,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1648,"src":"2830:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1666,"indexExpression":{"hexValue":"31","id":1665,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2837:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2830:9:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"78","id":1667,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2842:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_7521d1cadbcfa91eec65aa16715b94ffc1c9654ba57ea2ef1a2127bca1127a83","typeString":"literal_string \"x\""},"value":"x"},"src":"2830:15:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1669,"nodeType":"ExpressionStatement","src":"2830:15:15"},{"body":{"id":1698,"nodeType":"Block","src":"2900:95:15","statements":[{"expression":{"id":1692,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1684,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1648,"src":"2914:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1686,"indexExpression":{"id":1685,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1671,"src":"2921:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2914:9:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":1687,"name":"HEX_DIGITS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1487,"src":"2926:10:15","typeDescriptions":{"typeIdentifier":"t_bytes16","typeString":"bytes16"}},"id":1691,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1688,"name":"localValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1644,"src":"2937:10:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"307866","id":1689,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2950:3:15","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"0xf"},"src":"2937:16:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2926:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"2914:40:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1693,"nodeType":"ExpressionStatement","src":"2914:40:15"},{"expression":{"id":1696,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1694,"name":"localValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1644,"src":"2968:10:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":1695,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2983:1:15","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"2968:16:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1697,"nodeType":"ExpressionStatement","src":"2968:16:15"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1680,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1678,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1671,"src":"2888:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"31","id":1679,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2892:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2888:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1699,"initializationExpression":{"assignments":[1671],"declarations":[{"constant":false,"id":1671,"mutability":"mutable","name":"i","nameLocation":"2868:1:15","nodeType":"VariableDeclaration","scope":1699,"src":"2860:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1670,"name":"uint256","nodeType":"ElementaryTypeName","src":"2860:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1677,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1676,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":1672,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2872:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":1673,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1638,"src":"2876:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2872:10:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":1675,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2885:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2872:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2860:26:15"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":1682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"2895:3:15","subExpression":{"id":1681,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1671,"src":"2897:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1683,"nodeType":"ExpressionStatement","src":"2895:3:15"},"nodeType":"ForStatement","src":"2855:140:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1702,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1700,"name":"localValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1644,"src":"3008:10:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":1701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3022:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3008:15:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1709,"nodeType":"IfStatement","src":"3004:96:15","trueBody":{"id":1708,"nodeType":"Block","src":"3025:75:15","statements":[{"errorCall":{"arguments":[{"id":1704,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1636,"src":"3075:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1705,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1638,"src":"3082:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1703,"name":"StringsInsufficientHexLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1533,"src":"3046:28:15","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":1706,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3046:43:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1707,"nodeType":"RevertStatement","src":"3039:50:15"}]}},{"expression":{"arguments":[{"id":1712,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1648,"src":"3123:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1711,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3116:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1710,"name":"string","nodeType":"ElementaryTypeName","src":"3116:6:15","typeDescriptions":{}}},"id":1713,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3116:14:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1642,"id":1714,"nodeType":"Return","src":"3109:21:15"}]},"documentation":{"id":1634,"nodeType":"StructuredDocumentation","src":"2495:112:15","text":" @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length."},"id":1716,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"2621:11:15","nodeType":"FunctionDefinition","parameters":{"id":1639,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1636,"mutability":"mutable","name":"value","nameLocation":"2641:5:15","nodeType":"VariableDeclaration","scope":1716,"src":"2633:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1635,"name":"uint256","nodeType":"ElementaryTypeName","src":"2633:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1638,"mutability":"mutable","name":"length","nameLocation":"2656:6:15","nodeType":"VariableDeclaration","scope":1716,"src":"2648:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1637,"name":"uint256","nodeType":"ElementaryTypeName","src":"2648:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2632:31:15"},"returnParameters":{"id":1642,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1641,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1716,"src":"2687:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1640,"name":"string","nodeType":"ElementaryTypeName","src":"2687:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2686:15:15"},"scope":2875,"src":"2612:525:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1735,"nodeType":"Block","src":"3369:75:15","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"id":1729,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1719,"src":"3414:4:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1728,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3406:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":1727,"name":"uint160","nodeType":"ElementaryTypeName","src":"3406:7:15","typeDescriptions":{}}},"id":1730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3406:13:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":1726,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3398:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":1725,"name":"uint256","nodeType":"ElementaryTypeName","src":"3398:7:15","typeDescriptions":{}}},"id":1731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3398:22:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1732,"name":"ADDRESS_LENGTH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1490,"src":"3422:14:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":1724,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[1633,1716,1736],"referencedDeclaration":1716,"src":"3386:11:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (uint256,uint256) pure returns (string memory)"}},"id":1733,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3386:51:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1723,"id":1734,"nodeType":"Return","src":"3379:58:15"}]},"documentation":{"id":1717,"nodeType":"StructuredDocumentation","src":"3143:148:15","text":" @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n representation."},"id":1736,"implemented":true,"kind":"function","modifiers":[],"name":"toHexString","nameLocation":"3305:11:15","nodeType":"FunctionDefinition","parameters":{"id":1720,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1719,"mutability":"mutable","name":"addr","nameLocation":"3325:4:15","nodeType":"VariableDeclaration","scope":1736,"src":"3317:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1718,"name":"address","nodeType":"ElementaryTypeName","src":"3317:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3316:14:15"},"returnParameters":{"id":1723,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1722,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1736,"src":"3354:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1721,"name":"string","nodeType":"ElementaryTypeName","src":"3354:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3353:15:15"},"scope":2875,"src":"3296:148:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1800,"nodeType":"Block","src":"3701:642:15","statements":[{"assignments":[1745],"declarations":[{"constant":false,"id":1745,"mutability":"mutable","name":"buffer","nameLocation":"3724:6:15","nodeType":"VariableDeclaration","scope":1800,"src":"3711:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1744,"name":"bytes","nodeType":"ElementaryTypeName","src":"3711:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1752,"initialValue":{"arguments":[{"arguments":[{"id":1749,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1739,"src":"3751:4:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":1748,"name":"toHexString","nodeType":"Identifier","overloadedDeclarations":[1633,1716,1736],"referencedDeclaration":1736,"src":"3739:11:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_address_$returns$_t_string_memory_ptr_$","typeString":"function (address) pure returns (string memory)"}},"id":1750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3739:17:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1747,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3733:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1746,"name":"bytes","nodeType":"ElementaryTypeName","src":"3733:5:15","typeDescriptions":{}}},"id":1751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3733:24:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"3711:46:15"},{"assignments":[1754],"declarations":[{"constant":false,"id":1754,"mutability":"mutable","name":"hashValue","nameLocation":"3850:9:15","nodeType":"VariableDeclaration","scope":1800,"src":"3842:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1753,"name":"uint256","nodeType":"ElementaryTypeName","src":"3842:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1755,"nodeType":"VariableDeclarationStatement","src":"3842:17:15"},{"AST":{"nativeSrc":"3894:78:15","nodeType":"YulBlock","src":"3894:78:15","statements":[{"nativeSrc":"3908:54:15","nodeType":"YulAssignment","src":"3908:54:15","value":{"arguments":[{"kind":"number","nativeSrc":"3925:2:15","nodeType":"YulLiteral","src":"3925:2:15","type":"","value":"96"},{"arguments":[{"arguments":[{"name":"buffer","nativeSrc":"3943:6:15","nodeType":"YulIdentifier","src":"3943:6:15"},{"kind":"number","nativeSrc":"3951:4:15","nodeType":"YulLiteral","src":"3951:4:15","type":"","value":"0x22"}],"functionName":{"name":"add","nativeSrc":"3939:3:15","nodeType":"YulIdentifier","src":"3939:3:15"},"nativeSrc":"3939:17:15","nodeType":"YulFunctionCall","src":"3939:17:15"},{"kind":"number","nativeSrc":"3958:2:15","nodeType":"YulLiteral","src":"3958:2:15","type":"","value":"40"}],"functionName":{"name":"keccak256","nativeSrc":"3929:9:15","nodeType":"YulIdentifier","src":"3929:9:15"},"nativeSrc":"3929:32:15","nodeType":"YulFunctionCall","src":"3929:32:15"}],"functionName":{"name":"shr","nativeSrc":"3921:3:15","nodeType":"YulIdentifier","src":"3921:3:15"},"nativeSrc":"3921:41:15","nodeType":"YulFunctionCall","src":"3921:41:15"},"variableNames":[{"name":"hashValue","nativeSrc":"3908:9:15","nodeType":"YulIdentifier","src":"3908:9:15"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":1745,"isOffset":false,"isSlot":false,"src":"3943:6:15","valueSize":1},{"declaration":1754,"isOffset":false,"isSlot":false,"src":"3908:9:15","valueSize":1}],"flags":["memory-safe"],"id":1756,"nodeType":"InlineAssembly","src":"3869:103:15"},{"body":{"id":1793,"nodeType":"Block","src":"4015:291:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1780,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1771,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1769,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1767,"name":"hashValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1754,"src":"4121:9:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"307866","id":1768,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4133:3:15","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"0xf"},"src":"4121:15:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"37","id":1770,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4139:1:15","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"4121:19:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":1779,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"baseExpression":{"id":1774,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1745,"src":"4150:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1776,"indexExpression":{"id":1775,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1758,"src":"4157:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4150:9:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":1773,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4144:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":1772,"name":"uint8","nodeType":"ElementaryTypeName","src":"4144:5:15","typeDescriptions":{}}},"id":1777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4144:16:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3936","id":1778,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4163:2:15","typeDescriptions":{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},"value":"96"},"src":"4144:21:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4121:44:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1788,"nodeType":"IfStatement","src":"4117:150:15","trueBody":{"id":1787,"nodeType":"Block","src":"4167:100:15","statements":[{"expression":{"id":1785,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":1781,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1745,"src":"4235:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1783,"indexExpression":{"id":1782,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1758,"src":"4242:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4235:9:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"^=","rightHandSide":{"hexValue":"30783230","id":1784,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4248:4:15","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"0x20"},"src":"4235:17:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":1786,"nodeType":"ExpressionStatement","src":"4235:17:15"}]}},{"expression":{"id":1791,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":1789,"name":"hashValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1754,"src":"4280:9:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":1790,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4294:1:15","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"4280:15:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1792,"nodeType":"ExpressionStatement","src":"4280:15:15"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1761,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1758,"src":"4003:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"31","id":1762,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4007:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"4003:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1794,"initializationExpression":{"assignments":[1758],"declarations":[{"constant":false,"id":1758,"mutability":"mutable","name":"i","nameLocation":"3995:1:15","nodeType":"VariableDeclaration","scope":1794,"src":"3987:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1757,"name":"uint256","nodeType":"ElementaryTypeName","src":"3987:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1760,"initialValue":{"hexValue":"3431","id":1759,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3999:2:15","typeDescriptions":{"typeIdentifier":"t_rational_41_by_1","typeString":"int_const 41"},"value":"41"},"nodeType":"VariableDeclarationStatement","src":"3987:14:15"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":1765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"4010:3:15","subExpression":{"id":1764,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1758,"src":"4012:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1766,"nodeType":"ExpressionStatement","src":"4010:3:15"},"nodeType":"ForStatement","src":"3982:324:15"},{"expression":{"arguments":[{"id":1797,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1745,"src":"4329:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1796,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4322:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":1795,"name":"string","nodeType":"ElementaryTypeName","src":"4322:6:15","typeDescriptions":{}}},"id":1798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4322:14:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":1743,"id":1799,"nodeType":"Return","src":"4315:21:15"}]},"documentation":{"id":1737,"nodeType":"StructuredDocumentation","src":"3450:165:15","text":" @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n representation, according to EIP-55."},"id":1801,"implemented":true,"kind":"function","modifiers":[],"name":"toChecksumHexString","nameLocation":"3629:19:15","nodeType":"FunctionDefinition","parameters":{"id":1740,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1739,"mutability":"mutable","name":"addr","nameLocation":"3657:4:15","nodeType":"VariableDeclaration","scope":1801,"src":"3649:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":1738,"name":"address","nodeType":"ElementaryTypeName","src":"3649:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3648:14:15"},"returnParameters":{"id":1743,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1742,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1801,"src":"3686:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1741,"name":"string","nodeType":"ElementaryTypeName","src":"3686:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3685:15:15"},"scope":2875,"src":"3620:723:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1837,"nodeType":"Block","src":"4498:104:15","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":1813,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1804,"src":"4521:1:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1812,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4515:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1811,"name":"bytes","nodeType":"ElementaryTypeName","src":"4515:5:15","typeDescriptions":{}}},"id":1814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4515:8:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4524:6:15","memberName":"length","nodeType":"MemberAccess","src":"4515:15:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":1818,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1806,"src":"4540:1:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1817,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4534:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1816,"name":"bytes","nodeType":"ElementaryTypeName","src":"4534:5:15","typeDescriptions":{}}},"id":1819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4534:8:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4543:6:15","memberName":"length","nodeType":"MemberAccess","src":"4534:15:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4515:34:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":1834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":1825,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1804,"src":"4569:1:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1824,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4563:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1823,"name":"bytes","nodeType":"ElementaryTypeName","src":"4563:5:15","typeDescriptions":{}}},"id":1826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4563:8:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1822,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4553:9:15","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1827,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4553:19:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"id":1831,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1806,"src":"4592:1:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1830,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4586:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1829,"name":"bytes","nodeType":"ElementaryTypeName","src":"4586:5:15","typeDescriptions":{}}},"id":1832,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4586:8:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":1828,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4576:9:15","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":1833,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4576:19:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4553:42:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4515:80:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":1810,"id":1836,"nodeType":"Return","src":"4508:87:15"}]},"documentation":{"id":1802,"nodeType":"StructuredDocumentation","src":"4349:66:15","text":" @dev Returns true if the two strings are equal."},"id":1838,"implemented":true,"kind":"function","modifiers":[],"name":"equal","nameLocation":"4429:5:15","nodeType":"FunctionDefinition","parameters":{"id":1807,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1804,"mutability":"mutable","name":"a","nameLocation":"4449:1:15","nodeType":"VariableDeclaration","scope":1838,"src":"4435:15:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1803,"name":"string","nodeType":"ElementaryTypeName","src":"4435:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":1806,"mutability":"mutable","name":"b","nameLocation":"4466:1:15","nodeType":"VariableDeclaration","scope":1838,"src":"4452:15:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1805,"name":"string","nodeType":"ElementaryTypeName","src":"4452:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"4434:34:15"},"returnParameters":{"id":1810,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1809,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1838,"src":"4492:4:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1808,"name":"bool","nodeType":"ElementaryTypeName","src":"4492:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4491:6:15"},"scope":2875,"src":"4420:182:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1856,"nodeType":"Block","src":"4899:64:15","statements":[{"expression":{"arguments":[{"id":1847,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1841,"src":"4926:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":1848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4933:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":1851,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1841,"src":"4942:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1850,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4936:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1849,"name":"bytes","nodeType":"ElementaryTypeName","src":"4936:5:15","typeDescriptions":{}}},"id":1852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4936:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4949:6:15","memberName":"length","nodeType":"MemberAccess","src":"4936:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1846,"name":"parseUint","nodeType":"Identifier","overloadedDeclarations":[1857,1888],"referencedDeclaration":1888,"src":"4916:9:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (uint256)"}},"id":1854,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4916:40:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1845,"id":1855,"nodeType":"Return","src":"4909:47:15"}]},"documentation":{"id":1839,"nodeType":"StructuredDocumentation","src":"4608:214:15","text":" @dev Parse a decimal string and returns the value as a `uint256`.\n Requirements:\n - The string must be formatted as `[0-9]*`\n - The result must fit into an `uint256` type"},"id":1857,"implemented":true,"kind":"function","modifiers":[],"name":"parseUint","nameLocation":"4836:9:15","nodeType":"FunctionDefinition","parameters":{"id":1842,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1841,"mutability":"mutable","name":"input","nameLocation":"4860:5:15","nodeType":"VariableDeclaration","scope":1857,"src":"4846:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1840,"name":"string","nodeType":"ElementaryTypeName","src":"4846:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"4845:21:15"},"returnParameters":{"id":1845,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1844,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1857,"src":"4890:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1843,"name":"uint256","nodeType":"ElementaryTypeName","src":"4890:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4889:9:15"},"scope":2875,"src":"4827:136:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1887,"nodeType":"Block","src":"5368:153:15","statements":[{"assignments":[1870,1872],"declarations":[{"constant":false,"id":1870,"mutability":"mutable","name":"success","nameLocation":"5384:7:15","nodeType":"VariableDeclaration","scope":1887,"src":"5379:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1869,"name":"bool","nodeType":"ElementaryTypeName","src":"5379:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1872,"mutability":"mutable","name":"value","nameLocation":"5401:5:15","nodeType":"VariableDeclaration","scope":1887,"src":"5393:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1871,"name":"uint256","nodeType":"ElementaryTypeName","src":"5393:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1878,"initialValue":{"arguments":[{"id":1874,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1860,"src":"5423:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":1875,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1862,"src":"5430:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1876,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1864,"src":"5437:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1873,"name":"tryParseUint","nodeType":"Identifier","overloadedDeclarations":[1909,1946],"referencedDeclaration":1946,"src":"5410:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":1877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5410:31:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"5378:63:15"},{"condition":{"id":1880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5455:8:15","subExpression":{"id":1879,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1870,"src":"5456:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1884,"nodeType":"IfStatement","src":"5451:41:15","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":1881,"name":"StringsInvalidChar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1536,"src":"5472:18:15","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":1882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5472:20:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":1883,"nodeType":"RevertStatement","src":"5465:27:15"}},{"expression":{"id":1885,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1872,"src":"5509:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":1868,"id":1886,"nodeType":"Return","src":"5502:12:15"}]},"documentation":{"id":1858,"nodeType":"StructuredDocumentation","src":"4969:294:15","text":" @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `[0-9]*`\n - The result must fit into an `uint256` type"},"id":1888,"implemented":true,"kind":"function","modifiers":[],"name":"parseUint","nameLocation":"5277:9:15","nodeType":"FunctionDefinition","parameters":{"id":1865,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1860,"mutability":"mutable","name":"input","nameLocation":"5301:5:15","nodeType":"VariableDeclaration","scope":1888,"src":"5287:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1859,"name":"string","nodeType":"ElementaryTypeName","src":"5287:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":1862,"mutability":"mutable","name":"begin","nameLocation":"5316:5:15","nodeType":"VariableDeclaration","scope":1888,"src":"5308:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1861,"name":"uint256","nodeType":"ElementaryTypeName","src":"5308:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1864,"mutability":"mutable","name":"end","nameLocation":"5331:3:15","nodeType":"VariableDeclaration","scope":1888,"src":"5323:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1863,"name":"uint256","nodeType":"ElementaryTypeName","src":"5323:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5286:49:15"},"returnParameters":{"id":1868,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1867,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":1888,"src":"5359:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1866,"name":"uint256","nodeType":"ElementaryTypeName","src":"5359:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5358:9:15"},"scope":2875,"src":"5268:253:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1908,"nodeType":"Block","src":"5842:83:15","statements":[{"expression":{"arguments":[{"id":1899,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1891,"src":"5888:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":1900,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5895:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":1903,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1891,"src":"5904:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1902,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5898:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1901,"name":"bytes","nodeType":"ElementaryTypeName","src":"5898:5:15","typeDescriptions":{}}},"id":1904,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5898:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1905,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5911:6:15","memberName":"length","nodeType":"MemberAccess","src":"5898:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1898,"name":"_tryParseUintUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2016,"src":"5859:28:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":1906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5859:59:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":1897,"id":1907,"nodeType":"Return","src":"5852:66:15"}]},"documentation":{"id":1889,"nodeType":"StructuredDocumentation","src":"5527:215:15","text":" @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`."},"id":1909,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseUint","nameLocation":"5756:12:15","nodeType":"FunctionDefinition","parameters":{"id":1892,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1891,"mutability":"mutable","name":"input","nameLocation":"5783:5:15","nodeType":"VariableDeclaration","scope":1909,"src":"5769:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1890,"name":"string","nodeType":"ElementaryTypeName","src":"5769:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5768:21:15"},"returnParameters":{"id":1897,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1894,"mutability":"mutable","name":"success","nameLocation":"5818:7:15","nodeType":"VariableDeclaration","scope":1909,"src":"5813:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1893,"name":"bool","nodeType":"ElementaryTypeName","src":"5813:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1896,"mutability":"mutable","name":"value","nameLocation":"5835:5:15","nodeType":"VariableDeclaration","scope":1909,"src":"5827:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1895,"name":"uint256","nodeType":"ElementaryTypeName","src":"5827:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5812:29:15"},"scope":2875,"src":"5747:178:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":1945,"nodeType":"Block","src":"6327:144:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":1933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1923,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1916,"src":"6341:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":1926,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"6353:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1925,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6347:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1924,"name":"bytes","nodeType":"ElementaryTypeName","src":"6347:5:15","typeDescriptions":{}}},"id":1927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6347:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":1928,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6360:6:15","memberName":"length","nodeType":"MemberAccess","src":"6347:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6341:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1930,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1914,"src":"6370:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":1931,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1916,"src":"6378:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6370:11:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6341:40:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":1938,"nodeType":"IfStatement","src":"6337:63:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":1934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6391:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":1935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6398:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":1936,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6390:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":1922,"id":1937,"nodeType":"Return","src":"6383:17:15"}},{"expression":{"arguments":[{"id":1940,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1912,"src":"6446:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":1941,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1914,"src":"6453:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":1942,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1916,"src":"6460:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1939,"name":"_tryParseUintUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2016,"src":"6417:28:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":1943,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6417:47:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":1922,"id":1944,"nodeType":"Return","src":"6410:54:15"}]},"documentation":{"id":1910,"nodeType":"StructuredDocumentation","src":"5931:238:15","text":" @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n character.\n NOTE: This function will revert if the result does not fit in a `uint256`."},"id":1946,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseUint","nameLocation":"6183:12:15","nodeType":"FunctionDefinition","parameters":{"id":1917,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1912,"mutability":"mutable","name":"input","nameLocation":"6219:5:15","nodeType":"VariableDeclaration","scope":1946,"src":"6205:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1911,"name":"string","nodeType":"ElementaryTypeName","src":"6205:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":1914,"mutability":"mutable","name":"begin","nameLocation":"6242:5:15","nodeType":"VariableDeclaration","scope":1946,"src":"6234:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1913,"name":"uint256","nodeType":"ElementaryTypeName","src":"6234:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1916,"mutability":"mutable","name":"end","nameLocation":"6265:3:15","nodeType":"VariableDeclaration","scope":1946,"src":"6257:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1915,"name":"uint256","nodeType":"ElementaryTypeName","src":"6257:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6195:79:15"},"returnParameters":{"id":1922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1919,"mutability":"mutable","name":"success","nameLocation":"6303:7:15","nodeType":"VariableDeclaration","scope":1946,"src":"6298:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1918,"name":"bool","nodeType":"ElementaryTypeName","src":"6298:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1921,"mutability":"mutable","name":"value","nameLocation":"6320:5:15","nodeType":"VariableDeclaration","scope":1946,"src":"6312:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1920,"name":"uint256","nodeType":"ElementaryTypeName","src":"6312:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6297:29:15"},"scope":2875,"src":"6174:297:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2015,"nodeType":"Block","src":"6874:347:15","statements":[{"assignments":[1961],"declarations":[{"constant":false,"id":1961,"mutability":"mutable","name":"buffer","nameLocation":"6897:6:15","nodeType":"VariableDeclaration","scope":2015,"src":"6884:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":1960,"name":"bytes","nodeType":"ElementaryTypeName","src":"6884:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":1966,"initialValue":{"arguments":[{"id":1964,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1949,"src":"6912:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":1963,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6906:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":1962,"name":"bytes","nodeType":"ElementaryTypeName","src":"6906:5:15","typeDescriptions":{}}},"id":1965,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6906:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"6884:34:15"},{"assignments":[1968],"declarations":[{"constant":false,"id":1968,"mutability":"mutable","name":"result","nameLocation":"6937:6:15","nodeType":"VariableDeclaration","scope":2015,"src":"6929:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1967,"name":"uint256","nodeType":"ElementaryTypeName","src":"6929:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1970,"initialValue":{"hexValue":"30","id":1969,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6946:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6929:18:15"},{"body":{"id":2009,"nodeType":"Block","src":"6995:189:15","statements":[{"assignments":[1982],"declarations":[{"constant":false,"id":1982,"mutability":"mutable","name":"chr","nameLocation":"7015:3:15","nodeType":"VariableDeclaration","scope":2009,"src":"7009:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":1981,"name":"uint8","nodeType":"ElementaryTypeName","src":"7009:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":1992,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":1987,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1961,"src":"7064:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":1988,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1972,"src":"7072:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":1986,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"7041:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":1989,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7041:33:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":1985,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7034:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":1984,"name":"bytes1","nodeType":"ElementaryTypeName","src":"7034:6:15","typeDescriptions":{}}},"id":1990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7034:41:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":1983,"name":"_tryParseChr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2696,"src":"7021:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes1_$returns$_t_uint8_$","typeString":"function (bytes1) pure returns (uint8)"}},"id":1991,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7021:55:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"7009:67:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":1995,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1993,"name":"chr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1982,"src":"7094:3:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"39","id":1994,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7100:1:15","typeDescriptions":{"typeIdentifier":"t_rational_9_by_1","typeString":"int_const 9"},"value":"9"},"src":"7094:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2000,"nodeType":"IfStatement","src":"7090:30:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":1996,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7111:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":1997,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7118:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":1998,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"7110:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":1959,"id":1999,"nodeType":"Return","src":"7103:17:15"}},{"expression":{"id":2003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2001,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1968,"src":"7134:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"hexValue":"3130","id":2002,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7144:2:15","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"src":"7134:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2004,"nodeType":"ExpressionStatement","src":"7134:12:15"},{"expression":{"id":2007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2005,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1968,"src":"7160:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":2006,"name":"chr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1982,"src":"7170:3:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"7160:13:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2008,"nodeType":"ExpressionStatement","src":"7160:13:15"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":1977,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":1975,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1972,"src":"6981:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":1976,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1953,"src":"6985:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6981:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2010,"initializationExpression":{"assignments":[1972],"declarations":[{"constant":false,"id":1972,"mutability":"mutable","name":"i","nameLocation":"6970:1:15","nodeType":"VariableDeclaration","scope":2010,"src":"6962:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1971,"name":"uint256","nodeType":"ElementaryTypeName","src":"6962:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":1974,"initialValue":{"id":1973,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1951,"src":"6974:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6962:17:15"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":1979,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"6990:3:15","subExpression":{"id":1978,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1972,"src":"6992:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":1980,"nodeType":"ExpressionStatement","src":"6990:3:15"},"nodeType":"ForStatement","src":"6957:227:15"},{"expression":{"components":[{"hexValue":"74727565","id":2011,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7201:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":2012,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1968,"src":"7207:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2013,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7200:14:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":1959,"id":2014,"nodeType":"Return","src":"7193:21:15"}]},"documentation":{"id":1947,"nodeType":"StructuredDocumentation","src":"6477:224:15","text":" @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior."},"id":2016,"implemented":true,"kind":"function","modifiers":[],"name":"_tryParseUintUncheckedBounds","nameLocation":"6715:28:15","nodeType":"FunctionDefinition","parameters":{"id":1954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1949,"mutability":"mutable","name":"input","nameLocation":"6767:5:15","nodeType":"VariableDeclaration","scope":2016,"src":"6753:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":1948,"name":"string","nodeType":"ElementaryTypeName","src":"6753:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":1951,"mutability":"mutable","name":"begin","nameLocation":"6790:5:15","nodeType":"VariableDeclaration","scope":2016,"src":"6782:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1950,"name":"uint256","nodeType":"ElementaryTypeName","src":"6782:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":1953,"mutability":"mutable","name":"end","nameLocation":"6813:3:15","nodeType":"VariableDeclaration","scope":2016,"src":"6805:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1952,"name":"uint256","nodeType":"ElementaryTypeName","src":"6805:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6743:79:15"},"returnParameters":{"id":1959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":1956,"mutability":"mutable","name":"success","nameLocation":"6850:7:15","nodeType":"VariableDeclaration","scope":2016,"src":"6845:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":1955,"name":"bool","nodeType":"ElementaryTypeName","src":"6845:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":1958,"mutability":"mutable","name":"value","nameLocation":"6867:5:15","nodeType":"VariableDeclaration","scope":2016,"src":"6859:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":1957,"name":"uint256","nodeType":"ElementaryTypeName","src":"6859:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6844:29:15"},"scope":2875,"src":"6706:515:15","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":2034,"nodeType":"Block","src":"7518:63:15","statements":[{"expression":{"arguments":[{"id":2025,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2019,"src":"7544:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2026,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7551:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2029,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2019,"src":"7560:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2028,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7554:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2027,"name":"bytes","nodeType":"ElementaryTypeName","src":"7554:5:15","typeDescriptions":{}}},"id":2030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7554:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7567:6:15","memberName":"length","nodeType":"MemberAccess","src":"7554:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2024,"name":"parseInt","nodeType":"Identifier","overloadedDeclarations":[2035,2066],"referencedDeclaration":2066,"src":"7535:8:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_int256_$","typeString":"function (string memory,uint256,uint256) pure returns (int256)"}},"id":2032,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7535:39:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":2023,"id":2033,"nodeType":"Return","src":"7528:46:15"}]},"documentation":{"id":2017,"nodeType":"StructuredDocumentation","src":"7227:216:15","text":" @dev Parse a decimal string and returns the value as a `int256`.\n Requirements:\n - The string must be formatted as `[-+]?[0-9]*`\n - The result must fit in an `int256` type."},"id":2035,"implemented":true,"kind":"function","modifiers":[],"name":"parseInt","nameLocation":"7457:8:15","nodeType":"FunctionDefinition","parameters":{"id":2020,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2019,"mutability":"mutable","name":"input","nameLocation":"7480:5:15","nodeType":"VariableDeclaration","scope":2035,"src":"7466:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2018,"name":"string","nodeType":"ElementaryTypeName","src":"7466:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"7465:21:15"},"returnParameters":{"id":2023,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2022,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2035,"src":"7510:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2021,"name":"int256","nodeType":"ElementaryTypeName","src":"7510:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"7509:8:15"},"scope":2875,"src":"7448:133:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2065,"nodeType":"Block","src":"7986:151:15","statements":[{"assignments":[2048,2050],"declarations":[{"constant":false,"id":2048,"mutability":"mutable","name":"success","nameLocation":"8002:7:15","nodeType":"VariableDeclaration","scope":2065,"src":"7997:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2047,"name":"bool","nodeType":"ElementaryTypeName","src":"7997:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2050,"mutability":"mutable","name":"value","nameLocation":"8018:5:15","nodeType":"VariableDeclaration","scope":2065,"src":"8011:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2049,"name":"int256","nodeType":"ElementaryTypeName","src":"8011:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":2056,"initialValue":{"arguments":[{"id":2052,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2038,"src":"8039:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2053,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2040,"src":"8046:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2054,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2042,"src":"8053:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2051,"name":"tryParseInt","nodeType":"Identifier","overloadedDeclarations":[2087,2129],"referencedDeclaration":2129,"src":"8027:11:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,int256)"}},"id":2055,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8027:30:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_int256_$","typeString":"tuple(bool,int256)"}},"nodeType":"VariableDeclarationStatement","src":"7996:61:15"},{"condition":{"id":2058,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"8071:8:15","subExpression":{"id":2057,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2048,"src":"8072:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2062,"nodeType":"IfStatement","src":"8067:41:15","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":2059,"name":"StringsInvalidChar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1536,"src":"8088:18:15","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":2060,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8088:20:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":2061,"nodeType":"RevertStatement","src":"8081:27:15"}},{"expression":{"id":2063,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2050,"src":"8125:5:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":2046,"id":2064,"nodeType":"Return","src":"8118:12:15"}]},"documentation":{"id":2036,"nodeType":"StructuredDocumentation","src":"7587:296:15","text":" @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `[-+]?[0-9]*`\n - The result must fit in an `int256` type."},"id":2066,"implemented":true,"kind":"function","modifiers":[],"name":"parseInt","nameLocation":"7897:8:15","nodeType":"FunctionDefinition","parameters":{"id":2043,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2038,"mutability":"mutable","name":"input","nameLocation":"7920:5:15","nodeType":"VariableDeclaration","scope":2066,"src":"7906:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2037,"name":"string","nodeType":"ElementaryTypeName","src":"7906:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2040,"mutability":"mutable","name":"begin","nameLocation":"7935:5:15","nodeType":"VariableDeclaration","scope":2066,"src":"7927:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2039,"name":"uint256","nodeType":"ElementaryTypeName","src":"7927:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2042,"mutability":"mutable","name":"end","nameLocation":"7950:3:15","nodeType":"VariableDeclaration","scope":2066,"src":"7942:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2041,"name":"uint256","nodeType":"ElementaryTypeName","src":"7942:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7905:49:15"},"returnParameters":{"id":2046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2045,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2066,"src":"7978:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2044,"name":"int256","nodeType":"ElementaryTypeName","src":"7978:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"7977:8:15"},"scope":2875,"src":"7888:249:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2086,"nodeType":"Block","src":"8528:82:15","statements":[{"expression":{"arguments":[{"id":2077,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2069,"src":"8573:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2078,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8580:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2081,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2069,"src":"8589:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2080,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8583:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2079,"name":"bytes","nodeType":"ElementaryTypeName","src":"8583:5:15","typeDescriptions":{}}},"id":2082,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8583:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2083,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8596:6:15","memberName":"length","nodeType":"MemberAccess","src":"8583:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2076,"name":"_tryParseIntUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2250,"src":"8545:27:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,int256)"}},"id":2084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8545:58:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_int256_$","typeString":"tuple(bool,int256)"}},"functionReturnParameters":2075,"id":2085,"nodeType":"Return","src":"8538:65:15"}]},"documentation":{"id":2067,"nodeType":"StructuredDocumentation","src":"8143:287:15","text":" @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n the result does not fit in a `int256`.\n NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`."},"id":2087,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseInt","nameLocation":"8444:11:15","nodeType":"FunctionDefinition","parameters":{"id":2070,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2069,"mutability":"mutable","name":"input","nameLocation":"8470:5:15","nodeType":"VariableDeclaration","scope":2087,"src":"8456:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2068,"name":"string","nodeType":"ElementaryTypeName","src":"8456:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"8455:21:15"},"returnParameters":{"id":2075,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2072,"mutability":"mutable","name":"success","nameLocation":"8505:7:15","nodeType":"VariableDeclaration","scope":2087,"src":"8500:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2071,"name":"bool","nodeType":"ElementaryTypeName","src":"8500:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2074,"mutability":"mutable","name":"value","nameLocation":"8521:5:15","nodeType":"VariableDeclaration","scope":2087,"src":"8514:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2073,"name":"int256","nodeType":"ElementaryTypeName","src":"8514:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"8499:28:15"},"scope":2875,"src":"8435:175:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"constant":true,"id":2092,"mutability":"constant","name":"ABS_MIN_INT256","nameLocation":"8641:14:15","nodeType":"VariableDeclaration","scope":2875,"src":"8616:50:15","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2088,"name":"uint256","nodeType":"ElementaryTypeName","src":"8616:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"commonType":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1","typeString":"int_const 5789...(69 digits omitted)...9968"},"id":2091,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":2089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8658:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"323535","id":2090,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8663:3:15","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"8658:8:15","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1","typeString":"int_const 5789...(69 digits omitted)...9968"}},"visibility":"private"},{"body":{"id":2128,"nodeType":"Block","src":"9132:143:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2116,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2106,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2099,"src":"9146:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":2109,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2095,"src":"9158:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2108,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9152:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2107,"name":"bytes","nodeType":"ElementaryTypeName","src":"9152:5:15","typeDescriptions":{}}},"id":2110,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9152:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2111,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9165:6:15","memberName":"length","nodeType":"MemberAccess","src":"9152:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9146:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2113,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2097,"src":"9175:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":2114,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2099,"src":"9183:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9175:11:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9146:40:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2121,"nodeType":"IfStatement","src":"9142:63:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":2117,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"9196:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":2118,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9203:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":2119,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"9195:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":2105,"id":2120,"nodeType":"Return","src":"9188:17:15"}},{"expression":{"arguments":[{"id":2123,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2095,"src":"9250:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2124,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2097,"src":"9257:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2125,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2099,"src":"9264:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2122,"name":"_tryParseIntUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2250,"src":"9222:27:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,int256)"}},"id":2126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9222:46:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_int256_$","typeString":"tuple(bool,int256)"}},"functionReturnParameters":2105,"id":2127,"nodeType":"Return","src":"9215:53:15"}]},"documentation":{"id":2093,"nodeType":"StructuredDocumentation","src":"8673:303:15","text":" @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n character or if the result does not fit in a `int256`.\n NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`."},"id":2129,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseInt","nameLocation":"8990:11:15","nodeType":"FunctionDefinition","parameters":{"id":2100,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2095,"mutability":"mutable","name":"input","nameLocation":"9025:5:15","nodeType":"VariableDeclaration","scope":2129,"src":"9011:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2094,"name":"string","nodeType":"ElementaryTypeName","src":"9011:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2097,"mutability":"mutable","name":"begin","nameLocation":"9048:5:15","nodeType":"VariableDeclaration","scope":2129,"src":"9040:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2096,"name":"uint256","nodeType":"ElementaryTypeName","src":"9040:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2099,"mutability":"mutable","name":"end","nameLocation":"9071:3:15","nodeType":"VariableDeclaration","scope":2129,"src":"9063:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2098,"name":"uint256","nodeType":"ElementaryTypeName","src":"9063:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9001:79:15"},"returnParameters":{"id":2105,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2102,"mutability":"mutable","name":"success","nameLocation":"9109:7:15","nodeType":"VariableDeclaration","scope":2129,"src":"9104:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2101,"name":"bool","nodeType":"ElementaryTypeName","src":"9104:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2104,"mutability":"mutable","name":"value","nameLocation":"9125:5:15","nodeType":"VariableDeclaration","scope":2129,"src":"9118:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2103,"name":"int256","nodeType":"ElementaryTypeName","src":"9118:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"9103:28:15"},"scope":2875,"src":"8981:294:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2249,"nodeType":"Block","src":"9675:812:15","statements":[{"assignments":[2144],"declarations":[{"constant":false,"id":2144,"mutability":"mutable","name":"buffer","nameLocation":"9698:6:15","nodeType":"VariableDeclaration","scope":2249,"src":"9685:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2143,"name":"bytes","nodeType":"ElementaryTypeName","src":"9685:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2149,"initialValue":{"arguments":[{"id":2147,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2132,"src":"9713:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2146,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9707:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2145,"name":"bytes","nodeType":"ElementaryTypeName","src":"9707:5:15","typeDescriptions":{}}},"id":2148,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9707:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"9685:34:15"},{"assignments":[2151],"declarations":[{"constant":false,"id":2151,"mutability":"mutable","name":"sign","nameLocation":"9783:4:15","nodeType":"VariableDeclaration","scope":2249,"src":"9776:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"typeName":{"id":2150,"name":"bytes1","nodeType":"ElementaryTypeName","src":"9776:6:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"visibility":"internal"}],"id":2167,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2154,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2152,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2134,"src":"9790:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2153,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2136,"src":"9799:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9790:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"arguments":[{"id":2162,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2144,"src":"9847:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2163,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2134,"src":"9855:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2161,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"9824:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":2164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9824:37:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2160,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9817:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2159,"name":"bytes1","nodeType":"ElementaryTypeName","src":"9817:6:15","typeDescriptions":{}}},"id":2165,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9817:45:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"9790:72:15","trueExpression":{"arguments":[{"hexValue":"30","id":2157,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9812:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2156,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9805:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2155,"name":"bytes1","nodeType":"ElementaryTypeName","src":"9805:6:15","typeDescriptions":{}}},"id":2158,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9805:9:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"VariableDeclarationStatement","src":"9776:86:15"},{"assignments":[2169],"declarations":[{"constant":false,"id":2169,"mutability":"mutable","name":"positiveSign","nameLocation":"9948:12:15","nodeType":"VariableDeclaration","scope":2249,"src":"9943:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2168,"name":"bool","nodeType":"ElementaryTypeName","src":"9943:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2176,"initialValue":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2175,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2170,"name":"sign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2151,"src":"9963:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"2b","id":2173,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9978:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_728b8dbbe730d9acd55e30e768e6a28a04bea0c61b88108287c2c87d79c98bb8","typeString":"literal_string \"+\""},"value":"+"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_728b8dbbe730d9acd55e30e768e6a28a04bea0c61b88108287c2c87d79c98bb8","typeString":"literal_string \"+\""}],"id":2172,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9971:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2171,"name":"bytes1","nodeType":"ElementaryTypeName","src":"9971:6:15","typeDescriptions":{}}},"id":2174,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9971:11:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"9963:19:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"9943:39:15"},{"assignments":[2178],"declarations":[{"constant":false,"id":2178,"mutability":"mutable","name":"negativeSign","nameLocation":"9997:12:15","nodeType":"VariableDeclaration","scope":2249,"src":"9992:17:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2177,"name":"bool","nodeType":"ElementaryTypeName","src":"9992:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2185,"initialValue":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2179,"name":"sign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2151,"src":"10012:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"2d","id":2182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10027:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561","typeString":"literal_string \"-\""},"value":"-"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561","typeString":"literal_string \"-\""}],"id":2181,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10020:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2180,"name":"bytes1","nodeType":"ElementaryTypeName","src":"10020:6:15","typeDescriptions":{}}},"id":2183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10020:11:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"10012:19:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"9992:39:15"},{"assignments":[2187],"declarations":[{"constant":false,"id":2187,"mutability":"mutable","name":"offset","nameLocation":"10049:6:15","nodeType":"VariableDeclaration","scope":2249,"src":"10041:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2186,"name":"uint256","nodeType":"ElementaryTypeName","src":"10041:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2194,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"components":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2188,"name":"positiveSign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2169,"src":"10059:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":2189,"name":"negativeSign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2178,"src":"10075:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"10059:28:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":2191,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"10058:30:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10089:6:15","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"10058:37:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$","typeString":"function (bool) pure returns (uint256)"}},"id":2193,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10058:39:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10041:56:15"},{"assignments":[2196,2198],"declarations":[{"constant":false,"id":2196,"mutability":"mutable","name":"absSuccess","nameLocation":"10114:10:15","nodeType":"VariableDeclaration","scope":2249,"src":"10109:15:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2195,"name":"bool","nodeType":"ElementaryTypeName","src":"10109:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2198,"mutability":"mutable","name":"absValue","nameLocation":"10134:8:15","nodeType":"VariableDeclaration","scope":2249,"src":"10126:16:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2197,"name":"uint256","nodeType":"ElementaryTypeName","src":"10126:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2206,"initialValue":{"arguments":[{"id":2200,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2132,"src":"10159:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2201,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2134,"src":"10166:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":2202,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2187,"src":"10174:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10166:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2204,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2136,"src":"10182:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2199,"name":"tryParseUint","nodeType":"Identifier","overloadedDeclarations":[1909,1946],"referencedDeclaration":1946,"src":"10146:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":2205,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10146:40:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"10108:78:15"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2207,"name":"absSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2196,"src":"10201:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2208,"name":"absValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2198,"src":"10215:8:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2209,"name":"ABS_MIN_INT256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2092,"src":"10226:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10215:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"10201:39:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2233,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2227,"name":"absSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2196,"src":"10343:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":2228,"name":"negativeSign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2178,"src":"10357:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"10343:26:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2232,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2230,"name":"absValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2198,"src":"10373:8:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2231,"name":"ABS_MIN_INT256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2092,"src":"10385:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10373:26:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"10343:56:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"expression":{"components":[{"hexValue":"66616c7365","id":2243,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"10471:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":2244,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10478:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":2245,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"10470:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":2142,"id":2246,"nodeType":"Return","src":"10463:17:15"},"id":2247,"nodeType":"IfStatement","src":"10339:141:15","trueBody":{"id":2242,"nodeType":"Block","src":"10401:56:15","statements":[{"expression":{"components":[{"hexValue":"74727565","id":2234,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"10423:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"expression":{"arguments":[{"id":2237,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10434:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":2236,"name":"int256","nodeType":"ElementaryTypeName","src":"10434:6:15","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"}],"id":2235,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"10429:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2238,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10429:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_int256","typeString":"type(int256)"}},"id":2239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10442:3:15","memberName":"min","nodeType":"MemberAccess","src":"10429:16:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":2240,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"10422:24:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_int256_$","typeString":"tuple(bool,int256)"}},"functionReturnParameters":2142,"id":2241,"nodeType":"Return","src":"10415:31:15"}]}},"id":2248,"nodeType":"IfStatement","src":"10197:283:15","trueBody":{"id":2226,"nodeType":"Block","src":"10242:91:15","statements":[{"expression":{"components":[{"hexValue":"74727565","id":2212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"10264:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"condition":{"id":2213,"name":"negativeSign","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2178,"src":"10270:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"id":2221,"name":"absValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2198,"src":"10312:8:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2220,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10305:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":2219,"name":"int256","nodeType":"ElementaryTypeName","src":"10305:6:15","typeDescriptions":{}}},"id":2222,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10305:16:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"id":2223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"10270:51:15","trueExpression":{"id":2218,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"-","prefix":true,"src":"10285:17:15","subExpression":{"arguments":[{"id":2216,"name":"absValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2198,"src":"10293:8:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2215,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10286:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":2214,"name":"int256","nodeType":"ElementaryTypeName","src":"10286:6:15","typeDescriptions":{}}},"id":2217,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10286:16:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":2224,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"10263:59:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_int256_$","typeString":"tuple(bool,int256)"}},"functionReturnParameters":2142,"id":2225,"nodeType":"Return","src":"10256:66:15"}]}}]},"documentation":{"id":2130,"nodeType":"StructuredDocumentation","src":"9281:223:15","text":" @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior."},"id":2250,"implemented":true,"kind":"function","modifiers":[],"name":"_tryParseIntUncheckedBounds","nameLocation":"9518:27:15","nodeType":"FunctionDefinition","parameters":{"id":2137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2132,"mutability":"mutable","name":"input","nameLocation":"9569:5:15","nodeType":"VariableDeclaration","scope":2250,"src":"9555:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2131,"name":"string","nodeType":"ElementaryTypeName","src":"9555:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2134,"mutability":"mutable","name":"begin","nameLocation":"9592:5:15","nodeType":"VariableDeclaration","scope":2250,"src":"9584:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2133,"name":"uint256","nodeType":"ElementaryTypeName","src":"9584:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2136,"mutability":"mutable","name":"end","nameLocation":"9615:3:15","nodeType":"VariableDeclaration","scope":2250,"src":"9607:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2135,"name":"uint256","nodeType":"ElementaryTypeName","src":"9607:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9545:79:15"},"returnParameters":{"id":2142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2139,"mutability":"mutable","name":"success","nameLocation":"9652:7:15","nodeType":"VariableDeclaration","scope":2250,"src":"9647:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2138,"name":"bool","nodeType":"ElementaryTypeName","src":"9647:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2141,"mutability":"mutable","name":"value","nameLocation":"9668:5:15","nodeType":"VariableDeclaration","scope":2250,"src":"9661:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":2140,"name":"int256","nodeType":"ElementaryTypeName","src":"9661:6:15","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"9646:28:15"},"scope":2875,"src":"9509:978:15","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":2268,"nodeType":"Block","src":"10832:67:15","statements":[{"expression":{"arguments":[{"id":2259,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2253,"src":"10862:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10869:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2263,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2253,"src":"10878:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10872:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2261,"name":"bytes","nodeType":"ElementaryTypeName","src":"10872:5:15","typeDescriptions":{}}},"id":2264,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10872:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10885:6:15","memberName":"length","nodeType":"MemberAccess","src":"10872:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2258,"name":"parseHexUint","nodeType":"Identifier","overloadedDeclarations":[2269,2300],"referencedDeclaration":2300,"src":"10849:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (uint256)"}},"id":2266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10849:43:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2257,"id":2267,"nodeType":"Return","src":"10842:50:15"}]},"documentation":{"id":2251,"nodeType":"StructuredDocumentation","src":"10493:259:15","text":" @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n Requirements:\n - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n - The result must fit in an `uint256` type."},"id":2269,"implemented":true,"kind":"function","modifiers":[],"name":"parseHexUint","nameLocation":"10766:12:15","nodeType":"FunctionDefinition","parameters":{"id":2254,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2253,"mutability":"mutable","name":"input","nameLocation":"10793:5:15","nodeType":"VariableDeclaration","scope":2269,"src":"10779:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2252,"name":"string","nodeType":"ElementaryTypeName","src":"10779:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"10778:21:15"},"returnParameters":{"id":2257,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2256,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2269,"src":"10823:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2255,"name":"uint256","nodeType":"ElementaryTypeName","src":"10823:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10822:9:15"},"scope":2875,"src":"10757:142:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2299,"nodeType":"Block","src":"11320:156:15","statements":[{"assignments":[2282,2284],"declarations":[{"constant":false,"id":2282,"mutability":"mutable","name":"success","nameLocation":"11336:7:15","nodeType":"VariableDeclaration","scope":2299,"src":"11331:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2281,"name":"bool","nodeType":"ElementaryTypeName","src":"11331:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2284,"mutability":"mutable","name":"value","nameLocation":"11353:5:15","nodeType":"VariableDeclaration","scope":2299,"src":"11345:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2283,"name":"uint256","nodeType":"ElementaryTypeName","src":"11345:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2290,"initialValue":{"arguments":[{"id":2286,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2272,"src":"11378:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2287,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2274,"src":"11385:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2288,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2276,"src":"11392:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2285,"name":"tryParseHexUint","nodeType":"Identifier","overloadedDeclarations":[2321,2358],"referencedDeclaration":2358,"src":"11362:15:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":2289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11362:34:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"11330:66:15"},{"condition":{"id":2292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"11410:8:15","subExpression":{"id":2291,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2282,"src":"11411:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2296,"nodeType":"IfStatement","src":"11406:41:15","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":2293,"name":"StringsInvalidChar","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1536,"src":"11427:18:15","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":2294,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11427:20:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":2295,"nodeType":"RevertStatement","src":"11420:27:15"}},{"expression":{"id":2297,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2284,"src":"11464:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":2280,"id":2298,"nodeType":"Return","src":"11457:12:15"}]},"documentation":{"id":2270,"nodeType":"StructuredDocumentation","src":"10905:307:15","text":" @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n - The result must fit in an `uint256` type."},"id":2300,"implemented":true,"kind":"function","modifiers":[],"name":"parseHexUint","nameLocation":"11226:12:15","nodeType":"FunctionDefinition","parameters":{"id":2277,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2272,"mutability":"mutable","name":"input","nameLocation":"11253:5:15","nodeType":"VariableDeclaration","scope":2300,"src":"11239:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2271,"name":"string","nodeType":"ElementaryTypeName","src":"11239:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2274,"mutability":"mutable","name":"begin","nameLocation":"11268:5:15","nodeType":"VariableDeclaration","scope":2300,"src":"11260:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2273,"name":"uint256","nodeType":"ElementaryTypeName","src":"11260:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2276,"mutability":"mutable","name":"end","nameLocation":"11283:3:15","nodeType":"VariableDeclaration","scope":2300,"src":"11275:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2275,"name":"uint256","nodeType":"ElementaryTypeName","src":"11275:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11238:49:15"},"returnParameters":{"id":2280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2279,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2300,"src":"11311:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2278,"name":"uint256","nodeType":"ElementaryTypeName","src":"11311:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11310:9:15"},"scope":2875,"src":"11217:259:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2320,"nodeType":"Block","src":"11803:86:15","statements":[{"expression":{"arguments":[{"id":2311,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2303,"src":"11852:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11859:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2315,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2303,"src":"11868:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2314,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11862:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2313,"name":"bytes","nodeType":"ElementaryTypeName","src":"11862:5:15","typeDescriptions":{}}},"id":2316,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11862:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11875:6:15","memberName":"length","nodeType":"MemberAccess","src":"11862:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2310,"name":"_tryParseHexUintUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2461,"src":"11820:31:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":2318,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11820:62:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":2309,"id":2319,"nodeType":"Return","src":"11813:69:15"}]},"documentation":{"id":2301,"nodeType":"StructuredDocumentation","src":"11482:218:15","text":" @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`."},"id":2321,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseHexUint","nameLocation":"11714:15:15","nodeType":"FunctionDefinition","parameters":{"id":2304,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2303,"mutability":"mutable","name":"input","nameLocation":"11744:5:15","nodeType":"VariableDeclaration","scope":2321,"src":"11730:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2302,"name":"string","nodeType":"ElementaryTypeName","src":"11730:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"11729:21:15"},"returnParameters":{"id":2309,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2306,"mutability":"mutable","name":"success","nameLocation":"11779:7:15","nodeType":"VariableDeclaration","scope":2321,"src":"11774:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2305,"name":"bool","nodeType":"ElementaryTypeName","src":"11774:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2308,"mutability":"mutable","name":"value","nameLocation":"11796:5:15","nodeType":"VariableDeclaration","scope":2321,"src":"11788:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2307,"name":"uint256","nodeType":"ElementaryTypeName","src":"11788:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11773:29:15"},"scope":2875,"src":"11705:184:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2357,"nodeType":"Block","src":"12297:147:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2345,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2335,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2328,"src":"12311:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":2338,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2324,"src":"12323:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2337,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12317:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2336,"name":"bytes","nodeType":"ElementaryTypeName","src":"12317:5:15","typeDescriptions":{}}},"id":2339,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12317:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12330:6:15","memberName":"length","nodeType":"MemberAccess","src":"12317:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12311:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2342,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2326,"src":"12340:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":2343,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2328,"src":"12348:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12340:11:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12311:40:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2350,"nodeType":"IfStatement","src":"12307:63:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":2346,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"12361:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":2347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12368:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":2348,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"12360:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":2334,"id":2349,"nodeType":"Return","src":"12353:17:15"}},{"expression":{"arguments":[{"id":2352,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2324,"src":"12419:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2353,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2326,"src":"12426:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2354,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2328,"src":"12433:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2351,"name":"_tryParseHexUintUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2461,"src":"12387:31:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":2355,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12387:50:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":2334,"id":2356,"nodeType":"Return","src":"12380:57:15"}]},"documentation":{"id":2322,"nodeType":"StructuredDocumentation","src":"11895:241:15","text":" @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`."},"id":2358,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseHexUint","nameLocation":"12150:15:15","nodeType":"FunctionDefinition","parameters":{"id":2329,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2324,"mutability":"mutable","name":"input","nameLocation":"12189:5:15","nodeType":"VariableDeclaration","scope":2358,"src":"12175:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2323,"name":"string","nodeType":"ElementaryTypeName","src":"12175:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2326,"mutability":"mutable","name":"begin","nameLocation":"12212:5:15","nodeType":"VariableDeclaration","scope":2358,"src":"12204:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2325,"name":"uint256","nodeType":"ElementaryTypeName","src":"12204:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2328,"mutability":"mutable","name":"end","nameLocation":"12235:3:15","nodeType":"VariableDeclaration","scope":2358,"src":"12227:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2327,"name":"uint256","nodeType":"ElementaryTypeName","src":"12227:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12165:79:15"},"returnParameters":{"id":2334,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2331,"mutability":"mutable","name":"success","nameLocation":"12273:7:15","nodeType":"VariableDeclaration","scope":2358,"src":"12268:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2330,"name":"bool","nodeType":"ElementaryTypeName","src":"12268:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2333,"mutability":"mutable","name":"value","nameLocation":"12290:5:15","nodeType":"VariableDeclaration","scope":2358,"src":"12282:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2332,"name":"uint256","nodeType":"ElementaryTypeName","src":"12282:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12267:29:15"},"scope":2875,"src":"12141:303:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2460,"nodeType":"Block","src":"12853:881:15","statements":[{"assignments":[2373],"declarations":[{"constant":false,"id":2373,"mutability":"mutable","name":"buffer","nameLocation":"12876:6:15","nodeType":"VariableDeclaration","scope":2460,"src":"12863:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2372,"name":"bytes","nodeType":"ElementaryTypeName","src":"12863:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2378,"initialValue":{"arguments":[{"id":2376,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2361,"src":"12891:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2375,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12885:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2374,"name":"bytes","nodeType":"ElementaryTypeName","src":"12885:5:15","typeDescriptions":{}}},"id":2377,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12885:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"12863:34:15"},{"assignments":[2380],"declarations":[{"constant":false,"id":2380,"mutability":"mutable","name":"hasPrefix","nameLocation":"12950:9:15","nodeType":"VariableDeclaration","scope":2460,"src":"12945:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2379,"name":"bool","nodeType":"ElementaryTypeName","src":"12945:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2400,"initialValue":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2399,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2385,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2381,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2365,"src":"12963:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2382,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2363,"src":"12969:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":2383,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12977:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"12969:9:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12963:15:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":2386,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12962:17:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_bytes2","typeString":"bytes2"},"id":2398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":2390,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2373,"src":"13013:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2391,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2363,"src":"13021:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2389,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"12990:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":2392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12990:37:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2388,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12983:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes2_$","typeString":"type(bytes2)"},"typeName":{"id":2387,"name":"bytes2","nodeType":"ElementaryTypeName","src":"12983:6:15","typeDescriptions":{}}},"id":2393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12983:45:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes2","typeString":"bytes2"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"3078","id":2396,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"13039:4:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837","typeString":"literal_string \"0x\""},"value":"0x"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837","typeString":"literal_string \"0x\""}],"id":2395,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13032:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes2_$","typeString":"type(bytes2)"},"typeName":{"id":2394,"name":"bytes2","nodeType":"ElementaryTypeName","src":"13032:6:15","typeDescriptions":{}}},"id":2397,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13032:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes2","typeString":"bytes2"}},"src":"12983:61:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12962:82:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"12945:99:15"},{"assignments":[2402],"declarations":[{"constant":false,"id":2402,"mutability":"mutable","name":"offset","nameLocation":"13133:6:15","nodeType":"VariableDeclaration","scope":2460,"src":"13125:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2401,"name":"uint256","nodeType":"ElementaryTypeName","src":"13125:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2408,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":2403,"name":"hasPrefix","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2380,"src":"13142:9:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13152:6:15","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"13142:16:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$","typeString":"function (bool) pure returns (uint256)"}},"id":2405,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13142:18:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"32","id":2406,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13163:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"13142:22:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13125:39:15"},{"assignments":[2410],"declarations":[{"constant":false,"id":2410,"mutability":"mutable","name":"result","nameLocation":"13183:6:15","nodeType":"VariableDeclaration","scope":2460,"src":"13175:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2409,"name":"uint256","nodeType":"ElementaryTypeName","src":"13175:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2412,"initialValue":{"hexValue":"30","id":2411,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13192:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"13175:18:15"},{"body":{"id":2454,"nodeType":"Block","src":"13250:447:15","statements":[{"assignments":[2426],"declarations":[{"constant":false,"id":2426,"mutability":"mutable","name":"chr","nameLocation":"13270:3:15","nodeType":"VariableDeclaration","scope":2454,"src":"13264:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":2425,"name":"uint8","nodeType":"ElementaryTypeName","src":"13264:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":2436,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"id":2431,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2373,"src":"13319:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2432,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2414,"src":"13327:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2430,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"13296:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":2433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13296:33:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2429,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13289:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2428,"name":"bytes1","nodeType":"ElementaryTypeName","src":"13289:6:15","typeDescriptions":{}}},"id":2434,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13289:41:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":2427,"name":"_tryParseChr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2696,"src":"13276:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes1_$returns$_t_uint8_$","typeString":"function (bytes1) pure returns (uint8)"}},"id":2435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13276:55:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"13264:67:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2437,"name":"chr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2426,"src":"13349:3:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3135","id":2438,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13355:2:15","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"15"},"src":"13349:8:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2444,"nodeType":"IfStatement","src":"13345:31:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":2440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"13367:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":2441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13374:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":2442,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"13366:10:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":2371,"id":2443,"nodeType":"Return","src":"13359:17:15"}},{"expression":{"id":2447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2445,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2410,"src":"13390:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"hexValue":"3136","id":2446,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13400:2:15","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"13390:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2448,"nodeType":"ExpressionStatement","src":"13390:12:15"},{"id":2453,"nodeType":"UncheckedBlock","src":"13416:271:15","statements":[{"expression":{"id":2451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2449,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2410,"src":"13659:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":2450,"name":"chr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2426,"src":"13669:3:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"13659:13:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2452,"nodeType":"ExpressionStatement","src":"13659:13:15"}]}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2419,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2414,"src":"13236:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":2420,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2365,"src":"13240:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13236:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2455,"initializationExpression":{"assignments":[2414],"declarations":[{"constant":false,"id":2414,"mutability":"mutable","name":"i","nameLocation":"13216:1:15","nodeType":"VariableDeclaration","scope":2455,"src":"13208:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2413,"name":"uint256","nodeType":"ElementaryTypeName","src":"13208:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2418,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2415,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2363,"src":"13220:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":2416,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2402,"src":"13228:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13220:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13208:26:15"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":2423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"13245:3:15","subExpression":{"id":2422,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2414,"src":"13247:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2424,"nodeType":"ExpressionStatement","src":"13245:3:15"},"nodeType":"ForStatement","src":"13203:494:15"},{"expression":{"components":[{"hexValue":"74727565","id":2456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"13714:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":2457,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2410,"src":"13720:6:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2458,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13713:14:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"functionReturnParameters":2371,"id":2459,"nodeType":"Return","src":"13706:21:15"}]},"documentation":{"id":2359,"nodeType":"StructuredDocumentation","src":"12450:227:15","text":" @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior."},"id":2461,"implemented":true,"kind":"function","modifiers":[],"name":"_tryParseHexUintUncheckedBounds","nameLocation":"12691:31:15","nodeType":"FunctionDefinition","parameters":{"id":2366,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2361,"mutability":"mutable","name":"input","nameLocation":"12746:5:15","nodeType":"VariableDeclaration","scope":2461,"src":"12732:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2360,"name":"string","nodeType":"ElementaryTypeName","src":"12732:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2363,"mutability":"mutable","name":"begin","nameLocation":"12769:5:15","nodeType":"VariableDeclaration","scope":2461,"src":"12761:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2362,"name":"uint256","nodeType":"ElementaryTypeName","src":"12761:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2365,"mutability":"mutable","name":"end","nameLocation":"12792:3:15","nodeType":"VariableDeclaration","scope":2461,"src":"12784:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2364,"name":"uint256","nodeType":"ElementaryTypeName","src":"12784:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12722:79:15"},"returnParameters":{"id":2371,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2368,"mutability":"mutable","name":"success","nameLocation":"12829:7:15","nodeType":"VariableDeclaration","scope":2461,"src":"12824:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2367,"name":"bool","nodeType":"ElementaryTypeName","src":"12824:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2370,"mutability":"mutable","name":"value","nameLocation":"12846:5:15","nodeType":"VariableDeclaration","scope":2461,"src":"12838:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2369,"name":"uint256","nodeType":"ElementaryTypeName","src":"12838:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12823:29:15"},"scope":2875,"src":"12682:1052:15","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":2479,"nodeType":"Block","src":"14032:67:15","statements":[{"expression":{"arguments":[{"id":2470,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2464,"src":"14062:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14069:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2474,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2464,"src":"14078:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2473,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14072:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2472,"name":"bytes","nodeType":"ElementaryTypeName","src":"14072:5:15","typeDescriptions":{}}},"id":2475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14072:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14085:6:15","memberName":"length","nodeType":"MemberAccess","src":"14072:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2469,"name":"parseAddress","nodeType":"Identifier","overloadedDeclarations":[2480,2511],"referencedDeclaration":2511,"src":"14049:12:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_address_$","typeString":"function (string memory,uint256,uint256) pure returns (address)"}},"id":2477,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14049:43:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":2468,"id":2478,"nodeType":"Return","src":"14042:50:15"}]},"documentation":{"id":2462,"nodeType":"StructuredDocumentation","src":"13740:212:15","text":" @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n Requirements:\n - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`"},"id":2480,"implemented":true,"kind":"function","modifiers":[],"name":"parseAddress","nameLocation":"13966:12:15","nodeType":"FunctionDefinition","parameters":{"id":2465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2464,"mutability":"mutable","name":"input","nameLocation":"13993:5:15","nodeType":"VariableDeclaration","scope":2480,"src":"13979:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2463,"name":"string","nodeType":"ElementaryTypeName","src":"13979:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"13978:21:15"},"returnParameters":{"id":2468,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2467,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2480,"src":"14023:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2466,"name":"address","nodeType":"ElementaryTypeName","src":"14023:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14022:9:15"},"scope":2875,"src":"13957:142:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2510,"nodeType":"Block","src":"14472:165:15","statements":[{"assignments":[2493,2495],"declarations":[{"constant":false,"id":2493,"mutability":"mutable","name":"success","nameLocation":"14488:7:15","nodeType":"VariableDeclaration","scope":2510,"src":"14483:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2492,"name":"bool","nodeType":"ElementaryTypeName","src":"14483:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2495,"mutability":"mutable","name":"value","nameLocation":"14505:5:15","nodeType":"VariableDeclaration","scope":2510,"src":"14497:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2494,"name":"address","nodeType":"ElementaryTypeName","src":"14497:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":2501,"initialValue":{"arguments":[{"id":2497,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2483,"src":"14530:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2498,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2485,"src":"14537:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2499,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2487,"src":"14544:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2496,"name":"tryParseAddress","nodeType":"Identifier","overloadedDeclarations":[2532,2636],"referencedDeclaration":2636,"src":"14514:15:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_address_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,address)"}},"id":2500,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14514:34:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_address_$","typeString":"tuple(bool,address)"}},"nodeType":"VariableDeclarationStatement","src":"14482:66:15"},{"condition":{"id":2503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"14562:8:15","subExpression":{"id":2502,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2493,"src":"14563:7:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2507,"nodeType":"IfStatement","src":"14558:50:15","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":2504,"name":"StringsInvalidAddressFormat","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1539,"src":"14579:27:15","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":2505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14579:29:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":2506,"nodeType":"RevertStatement","src":"14572:36:15"}},{"expression":{"id":2508,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2495,"src":"14625:5:15","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":2491,"id":2509,"nodeType":"Return","src":"14618:12:15"}]},"documentation":{"id":2481,"nodeType":"StructuredDocumentation","src":"14105:259:15","text":" @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`"},"id":2511,"implemented":true,"kind":"function","modifiers":[],"name":"parseAddress","nameLocation":"14378:12:15","nodeType":"FunctionDefinition","parameters":{"id":2488,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2483,"mutability":"mutable","name":"input","nameLocation":"14405:5:15","nodeType":"VariableDeclaration","scope":2511,"src":"14391:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2482,"name":"string","nodeType":"ElementaryTypeName","src":"14391:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2485,"mutability":"mutable","name":"begin","nameLocation":"14420:5:15","nodeType":"VariableDeclaration","scope":2511,"src":"14412:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2484,"name":"uint256","nodeType":"ElementaryTypeName","src":"14412:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2487,"mutability":"mutable","name":"end","nameLocation":"14435:3:15","nodeType":"VariableDeclaration","scope":2511,"src":"14427:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2486,"name":"uint256","nodeType":"ElementaryTypeName","src":"14427:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"14390:49:15"},"returnParameters":{"id":2491,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2490,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2511,"src":"14463:7:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2489,"name":"address","nodeType":"ElementaryTypeName","src":"14463:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14462:9:15"},"scope":2875,"src":"14369:268:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2531,"nodeType":"Block","src":"14944:70:15","statements":[{"expression":{"arguments":[{"id":2522,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2514,"src":"14977:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"30","id":2523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14984:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"expression":{"arguments":[{"id":2526,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2514,"src":"14993:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2525,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14987:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2524,"name":"bytes","nodeType":"ElementaryTypeName","src":"14987:5:15","typeDescriptions":{}}},"id":2527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14987:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2528,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15000:6:15","memberName":"length","nodeType":"MemberAccess","src":"14987:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2521,"name":"tryParseAddress","nodeType":"Identifier","overloadedDeclarations":[2532,2636],"referencedDeclaration":2636,"src":"14961:15:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_address_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,address)"}},"id":2529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14961:46:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_address_$","typeString":"tuple(bool,address)"}},"functionReturnParameters":2520,"id":2530,"nodeType":"Return","src":"14954:53:15"}]},"documentation":{"id":2512,"nodeType":"StructuredDocumentation","src":"14643:198:15","text":" @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n formatted address. See {parseAddress-string} requirements."},"id":2532,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseAddress","nameLocation":"14855:15:15","nodeType":"FunctionDefinition","parameters":{"id":2515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2514,"mutability":"mutable","name":"input","nameLocation":"14885:5:15","nodeType":"VariableDeclaration","scope":2532,"src":"14871:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2513,"name":"string","nodeType":"ElementaryTypeName","src":"14871:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"14870:21:15"},"returnParameters":{"id":2520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2517,"mutability":"mutable","name":"success","nameLocation":"14920:7:15","nodeType":"VariableDeclaration","scope":2532,"src":"14915:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2516,"name":"bool","nodeType":"ElementaryTypeName","src":"14915:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2519,"mutability":"mutable","name":"value","nameLocation":"14937:5:15","nodeType":"VariableDeclaration","scope":2532,"src":"14929:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2518,"name":"address","nodeType":"ElementaryTypeName","src":"14929:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14914:29:15"},"scope":2875,"src":"14846:168:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2635,"nodeType":"Block","src":"15407:733:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2552,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2546,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2539,"src":"15421:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":2549,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2535,"src":"15433:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2548,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15427:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2547,"name":"bytes","nodeType":"ElementaryTypeName","src":"15427:5:15","typeDescriptions":{}}},"id":2550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15427:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2551,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15440:6:15","memberName":"length","nodeType":"MemberAccess","src":"15427:19:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15421:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2553,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2537,"src":"15450:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":2554,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2539,"src":"15458:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15450:11:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"15421:40:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2564,"nodeType":"IfStatement","src":"15417:72:15","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":2557,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"15471:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"arguments":[{"hexValue":"30","id":2560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15486:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15478:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2558,"name":"address","nodeType":"ElementaryTypeName","src":"15478:7:15","typeDescriptions":{}}},"id":2561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15478:10:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":2562,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"15470:19:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_address_$","typeString":"tuple(bool,address)"}},"functionReturnParameters":2545,"id":2563,"nodeType":"Return","src":"15463:26:15"}},{"assignments":[2566],"declarations":[{"constant":false,"id":2566,"mutability":"mutable","name":"hasPrefix","nameLocation":"15505:9:15","nodeType":"VariableDeclaration","scope":2635,"src":"15500:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2565,"name":"bool","nodeType":"ElementaryTypeName","src":"15500:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":2589,"initialValue":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2567,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2539,"src":"15518:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2568,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2537,"src":"15524:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":2569,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15532:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"15524:9:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15518:15:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":2572,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"15517:17:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_bytes2","typeString":"bytes2"},"id":2587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"arguments":[{"id":2578,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2535,"src":"15574:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2577,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15568:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2576,"name":"bytes","nodeType":"ElementaryTypeName","src":"15568:5:15","typeDescriptions":{}}},"id":2579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15568:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2580,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2537,"src":"15582:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2575,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"15545:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":2581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15545:43:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2574,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15538:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes2_$","typeString":"type(bytes2)"},"typeName":{"id":2573,"name":"bytes2","nodeType":"ElementaryTypeName","src":"15538:6:15","typeDescriptions":{}}},"id":2582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15538:51:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes2","typeString":"bytes2"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"3078","id":2585,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"15600:4:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837","typeString":"literal_string \"0x\""},"value":"0x"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837","typeString":"literal_string \"0x\""}],"id":2584,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15593:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes2_$","typeString":"type(bytes2)"},"typeName":{"id":2583,"name":"bytes2","nodeType":"ElementaryTypeName","src":"15593:6:15","typeDescriptions":{}}},"id":2586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15593:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes2","typeString":"bytes2"}},"src":"15538:67:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"15517:88:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"15500:105:15"},{"assignments":[2591],"declarations":[{"constant":false,"id":2591,"mutability":"mutable","name":"expectedLength","nameLocation":"15694:14:15","nodeType":"VariableDeclaration","scope":2635,"src":"15686:22:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2590,"name":"uint256","nodeType":"ElementaryTypeName","src":"15686:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2599,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3430","id":2592,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15711:2:15","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"value":"40"},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":2593,"name":"hasPrefix","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2566,"src":"15716:9:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15726:6:15","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"15716:16:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$","typeString":"function (bool) pure returns (uint256)"}},"id":2595,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15716:18:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"32","id":2596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15737:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"15716:22:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15711:27:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"15686:52:15"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2600,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2539,"src":"15803:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":2601,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2537,"src":"15809:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15803:11:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":2603,"name":"expectedLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2591,"src":"15818:14:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15803:29:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":2633,"nodeType":"Block","src":"16083:51:15","statements":[{"expression":{"components":[{"hexValue":"66616c7365","id":2626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"16105:5:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"arguments":[{"hexValue":"30","id":2629,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16120:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2628,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16112:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2627,"name":"address","nodeType":"ElementaryTypeName","src":"16112:7:15","typeDescriptions":{}}},"id":2630,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16112:10:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":2631,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"16104:19:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_address_$","typeString":"tuple(bool,address)"}},"functionReturnParameters":2545,"id":2632,"nodeType":"Return","src":"16097:26:15"}]},"id":2634,"nodeType":"IfStatement","src":"15799:335:15","trueBody":{"id":2625,"nodeType":"Block","src":"15834:243:15","statements":[{"assignments":[2606,2608],"declarations":[{"constant":false,"id":2606,"mutability":"mutable","name":"s","nameLocation":"15955:1:15","nodeType":"VariableDeclaration","scope":2625,"src":"15950:6:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2605,"name":"bool","nodeType":"ElementaryTypeName","src":"15950:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2608,"mutability":"mutable","name":"v","nameLocation":"15966:1:15","nodeType":"VariableDeclaration","scope":2625,"src":"15958:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2607,"name":"uint256","nodeType":"ElementaryTypeName","src":"15958:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2614,"initialValue":{"arguments":[{"id":2610,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2535,"src":"16003:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":2611,"name":"begin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2537,"src":"16010:5:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":2612,"name":"end","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2539,"src":"16017:3:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2609,"name":"_tryParseHexUintUncheckedBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2461,"src":"15971:31:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (string memory,uint256,uint256) pure returns (bool,uint256)"}},"id":2613,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15971:50:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"15949:72:15"},{"expression":{"components":[{"id":2615,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2606,"src":"16043:1:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"arguments":[{"id":2620,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2608,"src":"16062:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2619,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16054:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":2618,"name":"uint160","nodeType":"ElementaryTypeName","src":"16054:7:15","typeDescriptions":{}}},"id":2621,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16054:10:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":2617,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16046:7:15","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2616,"name":"address","nodeType":"ElementaryTypeName","src":"16046:7:15","typeDescriptions":{}}},"id":2622,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16046:19:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":2623,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"16042:24:15","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_address_$","typeString":"tuple(bool,address)"}},"functionReturnParameters":2545,"id":2624,"nodeType":"Return","src":"16035:31:15"}]}}]},"documentation":{"id":2533,"nodeType":"StructuredDocumentation","src":"15020:226:15","text":" @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n formatted address. See {parseAddress-string-uint256-uint256} requirements."},"id":2636,"implemented":true,"kind":"function","modifiers":[],"name":"tryParseAddress","nameLocation":"15260:15:15","nodeType":"FunctionDefinition","parameters":{"id":2540,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2535,"mutability":"mutable","name":"input","nameLocation":"15299:5:15","nodeType":"VariableDeclaration","scope":2636,"src":"15285:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2534,"name":"string","nodeType":"ElementaryTypeName","src":"15285:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":2537,"mutability":"mutable","name":"begin","nameLocation":"15322:5:15","nodeType":"VariableDeclaration","scope":2636,"src":"15314:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2536,"name":"uint256","nodeType":"ElementaryTypeName","src":"15314:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":2539,"mutability":"mutable","name":"end","nameLocation":"15345:3:15","nodeType":"VariableDeclaration","scope":2636,"src":"15337:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2538,"name":"uint256","nodeType":"ElementaryTypeName","src":"15337:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15275:79:15"},"returnParameters":{"id":2545,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2542,"mutability":"mutable","name":"success","nameLocation":"15383:7:15","nodeType":"VariableDeclaration","scope":2636,"src":"15378:12:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":2541,"name":"bool","nodeType":"ElementaryTypeName","src":"15378:4:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":2544,"mutability":"mutable","name":"value","nameLocation":"15400:5:15","nodeType":"VariableDeclaration","scope":2636,"src":"15392:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2543,"name":"address","nodeType":"ElementaryTypeName","src":"15392:7:15","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"15377:29:15"},"scope":2875,"src":"15251:889:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2695,"nodeType":"Block","src":"16209:461:15","statements":[{"assignments":[2644],"declarations":[{"constant":false,"id":2644,"mutability":"mutable","name":"value","nameLocation":"16225:5:15","nodeType":"VariableDeclaration","scope":2695,"src":"16219:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":2643,"name":"uint8","nodeType":"ElementaryTypeName","src":"16219:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":2649,"initialValue":{"arguments":[{"id":2647,"name":"chr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2638,"src":"16239:3:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":2646,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16233:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":2645,"name":"uint8","nodeType":"ElementaryTypeName","src":"16233:5:15","typeDescriptions":{}}},"id":2648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16233:10:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"16219:24:15"},{"id":2692,"nodeType":"UncheckedBlock","src":"16403:238:15","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2650,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16431:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3437","id":2651,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16439:2:15","typeDescriptions":{"typeIdentifier":"t_rational_47_by_1","typeString":"int_const 47"},"value":"47"},"src":"16431:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2653,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16445:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3538","id":2654,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16453:2:15","typeDescriptions":{"typeIdentifier":"t_rational_58_by_1","typeString":"int_const 58"},"value":"58"},"src":"16445:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16431:24:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2667,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2663,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2661,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16491:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3936","id":2662,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16499:2:15","typeDescriptions":{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},"value":"96"},"src":"16491:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2664,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16505:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"313033","id":2665,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16513:3:15","typeDescriptions":{"typeIdentifier":"t_rational_103_by_1","typeString":"int_const 103"},"value":"103"},"src":"16505:11:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16491:25:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":2678,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2672,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16552:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"3634","id":2673,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16560:2:15","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"16552:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":2677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2675,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16566:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3731","id":2676,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16574:2:15","typeDescriptions":{"typeIdentifier":"t_rational_71_by_1","typeString":"int_const 71"},"value":"71"},"src":"16566:10:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16552:24:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"expression":{"expression":{"arguments":[{"id":2685,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16620:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":2684,"name":"uint8","nodeType":"ElementaryTypeName","src":"16620:5:15","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":2683,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"16615:4:15","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":2686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16615:11:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":2687,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"16627:3:15","memberName":"max","nodeType":"MemberAccess","src":"16615:15:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":2642,"id":2688,"nodeType":"Return","src":"16608:22:15"},"id":2689,"nodeType":"IfStatement","src":"16548:82:15","trueBody":{"expression":{"id":2681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2679,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16578:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"hexValue":"3535","id":2680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16587:2:15","typeDescriptions":{"typeIdentifier":"t_rational_55_by_1","typeString":"int_const 55"},"value":"55"},"src":"16578:11:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":2682,"nodeType":"ExpressionStatement","src":"16578:11:15"}},"id":2690,"nodeType":"IfStatement","src":"16487:143:15","trueBody":{"expression":{"id":2670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2668,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16518:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"hexValue":"3837","id":2669,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16527:2:15","typeDescriptions":{"typeIdentifier":"t_rational_87_by_1","typeString":"int_const 87"},"value":"87"},"src":"16518:11:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":2671,"nodeType":"ExpressionStatement","src":"16518:11:15"}},"id":2691,"nodeType":"IfStatement","src":"16427:203:15","trueBody":{"expression":{"id":2659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":2657,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16457:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"hexValue":"3438","id":2658,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16466:2:15","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},"src":"16457:11:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":2660,"nodeType":"ExpressionStatement","src":"16457:11:15"}}]},{"expression":{"id":2693,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2644,"src":"16658:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":2642,"id":2694,"nodeType":"Return","src":"16651:12:15"}]},"id":2696,"implemented":true,"kind":"function","modifiers":[],"name":"_tryParseChr","nameLocation":"16155:12:15","nodeType":"FunctionDefinition","parameters":{"id":2639,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2638,"mutability":"mutable","name":"chr","nameLocation":"16175:3:15","nodeType":"VariableDeclaration","scope":2696,"src":"16168:10:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"typeName":{"id":2637,"name":"bytes1","nodeType":"ElementaryTypeName","src":"16168:6:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"visibility":"internal"}],"src":"16167:12:15"},"returnParameters":{"id":2642,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2641,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2696,"src":"16202:5:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":2640,"name":"uint8","nodeType":"ElementaryTypeName","src":"16202:5:15","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"16201:7:15"},"scope":2875,"src":"16146:524:15","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":2861,"nodeType":"Block","src":"17336:1331:15","statements":[{"assignments":[2705],"declarations":[{"constant":false,"id":2705,"mutability":"mutable","name":"buffer","nameLocation":"17359:6:15","nodeType":"VariableDeclaration","scope":2861,"src":"17346:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2704,"name":"bytes","nodeType":"ElementaryTypeName","src":"17346:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2710,"initialValue":{"arguments":[{"id":2708,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2699,"src":"17374:5:15","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":2707,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17368:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":2706,"name":"bytes","nodeType":"ElementaryTypeName","src":"17368:5:15","typeDescriptions":{}}},"id":2709,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17368:12:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"17346:34:15"},{"assignments":[2712],"declarations":[{"constant":false,"id":2712,"mutability":"mutable","name":"output","nameLocation":"17403:6:15","nodeType":"VariableDeclaration","scope":2861,"src":"17390:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2711,"name":"bytes","nodeType":"ElementaryTypeName","src":"17390:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":2720,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":2715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17422:1:15","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"expression":{"id":2716,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2705,"src":"17426:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17433:6:15","memberName":"length","nodeType":"MemberAccess","src":"17426:13:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17422:17:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2714,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"17412:9:15","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":2713,"name":"bytes","nodeType":"ElementaryTypeName","src":"17416:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":2719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17412:28:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"17390:50:15"},{"assignments":[2722],"declarations":[{"constant":false,"id":2722,"mutability":"mutable","name":"outputLength","nameLocation":"17481:12:15","nodeType":"VariableDeclaration","scope":2861,"src":"17473:20:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2721,"name":"uint256","nodeType":"ElementaryTypeName","src":"17473:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2724,"initialValue":{"hexValue":"30","id":2723,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17496:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"17473:24:15"},{"body":{"id":2853,"nodeType":"Block","src":"17548:854:15","statements":[{"assignments":[2736],"declarations":[{"constant":false,"id":2736,"mutability":"mutable","name":"char","nameLocation":"17569:4:15","nodeType":"VariableDeclaration","scope":2853,"src":"17562:11:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"typeName":{"id":2735,"name":"bytes1","nodeType":"ElementaryTypeName","src":"17562:6:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"visibility":"internal"}],"id":2744,"initialValue":{"arguments":[{"arguments":[{"id":2740,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2705,"src":"17606:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":2741,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"17614:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2739,"name":"_unsafeReadBytesOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2874,"src":"17583:22:15","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$","typeString":"function (bytes memory,uint256) pure returns (bytes32)"}},"id":2742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17583:33:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2738,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17576:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes1_$","typeString":"type(bytes1)"},"typeName":{"id":2737,"name":"bytes1","nodeType":"ElementaryTypeName","src":"17576:6:15","typeDescriptions":{}}},"id":2743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17576:41:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"VariableDeclarationStatement","src":"17562:55:15"},{"condition":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2756,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2745,"name":"SPECIAL_CHARS_LOOKUP","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1526,"src":"17637:20:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":2746,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17661:1:15","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"arguments":[{"id":2749,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"17672:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes1","typeString":"bytes1"}],"id":2748,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17666:5:15","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":2747,"name":"uint8","nodeType":"ElementaryTypeName","src":"17666:5:15","typeDescriptions":{}}},"id":2750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17666:11:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"17661:16:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2752,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"17660:18:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17637:41:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":2754,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"17636:43:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":2755,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17683:1:15","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"17636:48:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":2757,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"17635:50:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":2851,"nodeType":"Block","src":"18330:62:15","statements":[{"expression":{"id":2849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2844,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"18348:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2847,"indexExpression":{"id":2846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"18355:14:15","subExpression":{"id":2845,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"18355:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18348:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":2848,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"18373:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"18348:29:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2850,"nodeType":"ExpressionStatement","src":"18348:29:15"}]},"id":2852,"nodeType":"IfStatement","src":"17631:761:15","trueBody":{"id":2843,"nodeType":"Block","src":"17687:637:15","statements":[{"expression":{"id":2763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2758,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"17705:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2761,"indexExpression":{"id":2760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"17712:14:15","subExpression":{"id":2759,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17712:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17705:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"5c","id":2762,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17730:4:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_731553fa98541ade8b78284229adfe09a819380dee9244baac20dd1e0aa24095","typeString":"literal_string \"\\\""},"value":"\\"},"src":"17705:29:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2764,"nodeType":"ExpressionStatement","src":"17705:29:15"},{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2765,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"17756:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783038","id":2766,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17764:4:15","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"0x08"},"src":"17756:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2775,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"17825:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783039","id":2776,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17833:4:15","typeDescriptions":{"typeIdentifier":"t_rational_9_by_1","typeString":"int_const 9"},"value":"0x09"},"src":"17825:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2787,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2785,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"17894:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783061","id":2786,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17902:4:15","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"0x0a"},"src":"17894:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2795,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"17963:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783063","id":2796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17971:4:15","typeDescriptions":{"typeIdentifier":"t_rational_12_by_1","typeString":"int_const 12"},"value":"0x0c"},"src":"17963:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2805,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"18032:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783064","id":2806,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18040:4:15","typeDescriptions":{"typeIdentifier":"t_rational_13_by_1","typeString":"int_const 13"},"value":"0x0d"},"src":"18032:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2817,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2815,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"18101:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783563","id":2816,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18109:4:15","typeDescriptions":{"typeIdentifier":"t_rational_92_by_1","typeString":"int_const 92"},"value":"0x5c"},"src":"18101:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":2827,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2825,"name":"char","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2736,"src":"18171:4:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783232","id":2826,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18179:4:15","typeDescriptions":{"typeIdentifier":"t_rational_34_by_1","typeString":"int_const 34"},"value":"0x22"},"src":"18171:12:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2836,"nodeType":"IfStatement","src":"18167:143:15","trueBody":{"id":2835,"nodeType":"Block","src":"18185:125:15","statements":[{"expression":{"id":2833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2828,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"18263:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2831,"indexExpression":{"id":2830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"18270:14:15","subExpression":{"id":2829,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"18270:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18263:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"22","id":2832,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18288:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_6e9f33448a4153023cdaf3eb759f1afdc24aba433a3e18b683f8c04a6eaa69f0","typeString":"literal_string \"\"\""},"value":"\""},"src":"18263:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2834,"nodeType":"ExpressionStatement","src":"18263:28:15"}]}},"id":2837,"nodeType":"IfStatement","src":"18097:213:15","trueBody":{"expression":{"id":2823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2818,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"18115:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2821,"indexExpression":{"id":2820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"18122:14:15","subExpression":{"id":2819,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"18122:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18115:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"5c","id":2822,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18140:4:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_731553fa98541ade8b78284229adfe09a819380dee9244baac20dd1e0aa24095","typeString":"literal_string \"\\\""},"value":"\\"},"src":"18115:29:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2824,"nodeType":"ExpressionStatement","src":"18115:29:15"}},"id":2838,"nodeType":"IfStatement","src":"18028:282:15","trueBody":{"expression":{"id":2813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2808,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"18046:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2811,"indexExpression":{"id":2810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"18053:14:15","subExpression":{"id":2809,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"18053:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18046:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"72","id":2812,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18071:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_414f72a4d550cad29f17d9d99a4af64b3776ec5538cd440cef0f03fef2e9e010","typeString":"literal_string \"r\""},"value":"r"},"src":"18046:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2814,"nodeType":"ExpressionStatement","src":"18046:28:15"}},"id":2839,"nodeType":"IfStatement","src":"17959:351:15","trueBody":{"expression":{"id":2803,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2798,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"17977:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2801,"indexExpression":{"id":2800,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"17984:14:15","subExpression":{"id":2799,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17984:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17977:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66","id":2802,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"18002:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_d1e8aeb79500496ef3dc2e57ba746a8315d048b7a664a2bf948db4fa91960483","typeString":"literal_string \"f\""},"value":"f"},"src":"17977:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2804,"nodeType":"ExpressionStatement","src":"17977:28:15"}},"id":2840,"nodeType":"IfStatement","src":"17890:420:15","trueBody":{"expression":{"id":2793,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2788,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"17908:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2791,"indexExpression":{"id":2790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"17915:14:15","subExpression":{"id":2789,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17915:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17908:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"6e","id":2792,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17933:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_4b4ecedb4964a40fe416b16c7bd8b46092040ec42ef0aa69e59f09872f105cf3","typeString":"literal_string \"n\""},"value":"n"},"src":"17908:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2794,"nodeType":"ExpressionStatement","src":"17908:28:15"}},"id":2841,"nodeType":"IfStatement","src":"17821:489:15","trueBody":{"expression":{"id":2783,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2778,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"17839:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2781,"indexExpression":{"id":2780,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"17846:14:15","subExpression":{"id":2779,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17846:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17839:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74","id":2782,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17864:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_cac1bb71f0a97c8ac94ca9546b43178a9ad254c7b757ac07433aa6df35cd8089","typeString":"literal_string \"t\""},"value":"t"},"src":"17839:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2784,"nodeType":"ExpressionStatement","src":"17839:28:15"}},"id":2842,"nodeType":"IfStatement","src":"17752:558:15","trueBody":{"expression":{"id":2773,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":2768,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"17770:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2771,"indexExpression":{"id":2770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"17777:14:15","subExpression":{"id":2769,"name":"outputLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2722,"src":"17777:12:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17770:22:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"62","id":2772,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"17795:3:15","typeDescriptions":{"typeIdentifier":"t_stringliteral_b5553de315e0edf504d9150af82dafa5c4667fa618ed0a6f19c69b41166c5510","typeString":"literal_string \"b\""},"value":"b"},"src":"17770:28:15","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":2774,"nodeType":"ExpressionStatement","src":"17770:28:15"}}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2731,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2728,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"17524:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":2729,"name":"buffer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2705,"src":"17528:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2730,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17535:6:15","memberName":"length","nodeType":"MemberAccess","src":"17528:13:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17524:17:15","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":2854,"initializationExpression":{"assignments":[2726],"declarations":[{"constant":false,"id":2726,"mutability":"mutable","name":"i","nameLocation":"17521:1:15","nodeType":"VariableDeclaration","scope":2854,"src":"17513:9:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2725,"name":"uint256","nodeType":"ElementaryTypeName","src":"17513:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":2727,"nodeType":"VariableDeclarationStatement","src":"17513:9:15"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":2733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"17543:3:15","subExpression":{"id":2732,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2726,"src":"17545:1:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2734,"nodeType":"ExpressionStatement","src":"17543:3:15"},"nodeType":"ForStatement","src":"17508:894:15"},{"AST":{"nativeSrc":"18500:129:15","nodeType":"YulBlock","src":"18500:129:15","statements":[{"expression":{"arguments":[{"name":"output","nativeSrc":"18521:6:15","nodeType":"YulIdentifier","src":"18521:6:15"},{"name":"outputLength","nativeSrc":"18529:12:15","nodeType":"YulIdentifier","src":"18529:12:15"}],"functionName":{"name":"mstore","nativeSrc":"18514:6:15","nodeType":"YulIdentifier","src":"18514:6:15"},"nativeSrc":"18514:28:15","nodeType":"YulFunctionCall","src":"18514:28:15"},"nativeSrc":"18514:28:15","nodeType":"YulExpressionStatement","src":"18514:28:15"},{"expression":{"arguments":[{"kind":"number","nativeSrc":"18562:4:15","nodeType":"YulLiteral","src":"18562:4:15","type":"","value":"0x40"},{"arguments":[{"name":"output","nativeSrc":"18572:6:15","nodeType":"YulIdentifier","src":"18572:6:15"},{"arguments":[{"kind":"number","nativeSrc":"18584:1:15","nodeType":"YulLiteral","src":"18584:1:15","type":"","value":"5"},{"arguments":[{"kind":"number","nativeSrc":"18591:1:15","nodeType":"YulLiteral","src":"18591:1:15","type":"","value":"5"},{"arguments":[{"name":"outputLength","nativeSrc":"18598:12:15","nodeType":"YulIdentifier","src":"18598:12:15"},{"kind":"number","nativeSrc":"18612:2:15","nodeType":"YulLiteral","src":"18612:2:15","type":"","value":"63"}],"functionName":{"name":"add","nativeSrc":"18594:3:15","nodeType":"YulIdentifier","src":"18594:3:15"},"nativeSrc":"18594:21:15","nodeType":"YulFunctionCall","src":"18594:21:15"}],"functionName":{"name":"shr","nativeSrc":"18587:3:15","nodeType":"YulIdentifier","src":"18587:3:15"},"nativeSrc":"18587:29:15","nodeType":"YulFunctionCall","src":"18587:29:15"}],"functionName":{"name":"shl","nativeSrc":"18580:3:15","nodeType":"YulIdentifier","src":"18580:3:15"},"nativeSrc":"18580:37:15","nodeType":"YulFunctionCall","src":"18580:37:15"}],"functionName":{"name":"add","nativeSrc":"18568:3:15","nodeType":"YulIdentifier","src":"18568:3:15"},"nativeSrc":"18568:50:15","nodeType":"YulFunctionCall","src":"18568:50:15"}],"functionName":{"name":"mstore","nativeSrc":"18555:6:15","nodeType":"YulIdentifier","src":"18555:6:15"},"nativeSrc":"18555:64:15","nodeType":"YulFunctionCall","src":"18555:64:15"},"nativeSrc":"18555:64:15","nodeType":"YulExpressionStatement","src":"18555:64:15"}]},"evmVersion":"paris","externalReferences":[{"declaration":2712,"isOffset":false,"isSlot":false,"src":"18521:6:15","valueSize":1},{"declaration":2712,"isOffset":false,"isSlot":false,"src":"18572:6:15","valueSize":1},{"declaration":2722,"isOffset":false,"isSlot":false,"src":"18529:12:15","valueSize":1},{"declaration":2722,"isOffset":false,"isSlot":false,"src":"18598:12:15","valueSize":1}],"flags":["memory-safe"],"id":2855,"nodeType":"InlineAssembly","src":"18475:154:15"},{"expression":{"arguments":[{"id":2858,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"18653:6:15","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2857,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18646:6:15","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":2856,"name":"string","nodeType":"ElementaryTypeName","src":"18646:6:15","typeDescriptions":{}}},"id":2859,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18646:14:15","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":2703,"id":2860,"nodeType":"Return","src":"18639:21:15"}]},"documentation":{"id":2697,"nodeType":"StructuredDocumentation","src":"16676:576:15","text":" @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n characters that are not in this range, but other tooling may provide different results."},"id":2862,"implemented":true,"kind":"function","modifiers":[],"name":"escapeJSON","nameLocation":"17266:10:15","nodeType":"FunctionDefinition","parameters":{"id":2700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2699,"mutability":"mutable","name":"input","nameLocation":"17291:5:15","nodeType":"VariableDeclaration","scope":2862,"src":"17277:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2698,"name":"string","nodeType":"ElementaryTypeName","src":"17277:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"17276:21:15"},"returnParameters":{"id":2703,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2702,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2862,"src":"17321:13:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":2701,"name":"string","nodeType":"ElementaryTypeName","src":"17321:6:15","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"17320:15:15"},"scope":2875,"src":"17257:1410:15","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2873,"nodeType":"Block","src":"19052:225:15","statements":[{"AST":{"nativeSrc":"19201:70:15","nodeType":"YulBlock","src":"19201:70:15","statements":[{"nativeSrc":"19215:46:15","nodeType":"YulAssignment","src":"19215:46:15","value":{"arguments":[{"arguments":[{"arguments":[{"name":"buffer","nativeSrc":"19238:6:15","nodeType":"YulIdentifier","src":"19238:6:15"},{"kind":"number","nativeSrc":"19246:4:15","nodeType":"YulLiteral","src":"19246:4:15","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"19234:3:15","nodeType":"YulIdentifier","src":"19234:3:15"},"nativeSrc":"19234:17:15","nodeType":"YulFunctionCall","src":"19234:17:15"},{"name":"offset","nativeSrc":"19253:6:15","nodeType":"YulIdentifier","src":"19253:6:15"}],"functionName":{"name":"add","nativeSrc":"19230:3:15","nodeType":"YulIdentifier","src":"19230:3:15"},"nativeSrc":"19230:30:15","nodeType":"YulFunctionCall","src":"19230:30:15"}],"functionName":{"name":"mload","nativeSrc":"19224:5:15","nodeType":"YulIdentifier","src":"19224:5:15"},"nativeSrc":"19224:37:15","nodeType":"YulFunctionCall","src":"19224:37:15"},"variableNames":[{"name":"value","nativeSrc":"19215:5:15","nodeType":"YulIdentifier","src":"19215:5:15"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":2865,"isOffset":false,"isSlot":false,"src":"19238:6:15","valueSize":1},{"declaration":2867,"isOffset":false,"isSlot":false,"src":"19253:6:15","valueSize":1},{"declaration":2870,"isOffset":false,"isSlot":false,"src":"19215:5:15","valueSize":1}],"flags":["memory-safe"],"id":2872,"nodeType":"InlineAssembly","src":"19176:95:15"}]},"documentation":{"id":2863,"nodeType":"StructuredDocumentation","src":"18673:268:15","text":" @dev Reads a bytes32 from a bytes array without bounds checking.\n NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n assembly block as such would prevent some optimizations."},"id":2874,"implemented":true,"kind":"function","modifiers":[],"name":"_unsafeReadBytesOffset","nameLocation":"18955:22:15","nodeType":"FunctionDefinition","parameters":{"id":2868,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2865,"mutability":"mutable","name":"buffer","nameLocation":"18991:6:15","nodeType":"VariableDeclaration","scope":2874,"src":"18978:19:15","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2864,"name":"bytes","nodeType":"ElementaryTypeName","src":"18978:5:15","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":2867,"mutability":"mutable","name":"offset","nameLocation":"19007:6:15","nodeType":"VariableDeclaration","scope":2874,"src":"18999:14:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2866,"name":"uint256","nodeType":"ElementaryTypeName","src":"18999:7:15","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18977:37:15"},"returnParameters":{"id":2871,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2870,"mutability":"mutable","name":"value","nameLocation":"19045:5:15","nodeType":"VariableDeclaration","scope":2874,"src":"19037:13:15","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2869,"name":"bytes32","nodeType":"ElementaryTypeName","src":"19037:7:15","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"19036:15:15"},"scope":2875,"src":"18946:331:15","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":2876,"src":"297:18982:15","usedErrors":[1533,1536,1539],"usedEvents":[]}],"src":"101:19179:15"},"id":15},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","exportedSymbols":{"ECDSA":[3223]},"id":3224,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":2877,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"112:24:16"},{"abstract":false,"baseContracts":[],"canonicalName":"ECDSA","contractDependencies":[],"contractKind":"library","documentation":{"id":2878,"nodeType":"StructuredDocumentation","src":"138:205:16","text":" @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."},"fullyImplemented":true,"id":3223,"linearizedBaseContracts":[3223],"name":"ECDSA","nameLocation":"352:5:16","nodeType":"ContractDefinition","nodes":[{"canonicalName":"ECDSA.RecoverError","id":2883,"members":[{"id":2879,"name":"NoError","nameLocation":"392:7:16","nodeType":"EnumValue","src":"392:7:16"},{"id":2880,"name":"InvalidSignature","nameLocation":"409:16:16","nodeType":"EnumValue","src":"409:16:16"},{"id":2881,"name":"InvalidSignatureLength","nameLocation":"435:22:16","nodeType":"EnumValue","src":"435:22:16"},{"id":2882,"name":"InvalidSignatureS","nameLocation":"467:17:16","nodeType":"EnumValue","src":"467:17:16"}],"name":"RecoverError","nameLocation":"369:12:16","nodeType":"EnumDefinition","src":"364:126:16"},{"documentation":{"id":2884,"nodeType":"StructuredDocumentation","src":"496:63:16","text":" @dev The signature derives the `address(0)`."},"errorSelector":"f645eedf","id":2886,"name":"ECDSAInvalidSignature","nameLocation":"570:21:16","nodeType":"ErrorDefinition","parameters":{"id":2885,"nodeType":"ParameterList","parameters":[],"src":"591:2:16"},"src":"564:30:16"},{"documentation":{"id":2887,"nodeType":"StructuredDocumentation","src":"600:60:16","text":" @dev The signature has an invalid length."},"errorSelector":"fce698f7","id":2891,"name":"ECDSAInvalidSignatureLength","nameLocation":"671:27:16","nodeType":"ErrorDefinition","parameters":{"id":2890,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2889,"mutability":"mutable","name":"length","nameLocation":"707:6:16","nodeType":"VariableDeclaration","scope":2891,"src":"699:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":2888,"name":"uint256","nodeType":"ElementaryTypeName","src":"699:7:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"698:16:16"},"src":"665:50:16"},{"documentation":{"id":2892,"nodeType":"StructuredDocumentation","src":"721:85:16","text":" @dev The signature has an S value that is in the upper half order."},"errorSelector":"d78bce0c","id":2896,"name":"ECDSAInvalidSignatureS","nameLocation":"817:22:16","nodeType":"ErrorDefinition","parameters":{"id":2895,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2894,"mutability":"mutable","name":"s","nameLocation":"848:1:16","nodeType":"VariableDeclaration","scope":2896,"src":"840:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2893,"name":"bytes32","nodeType":"ElementaryTypeName","src":"840:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"839:11:16"},"src":"811:40:16"},{"body":{"id":2948,"nodeType":"Block","src":"2285:622:16","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":2914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":2911,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2901,"src":"2299:9:16","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2309:6:16","memberName":"length","nodeType":"MemberAccess","src":"2299:16:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"3635","id":2913,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2319:2:16","typeDescriptions":{"typeIdentifier":"t_rational_65_by_1","typeString":"int_const 65"},"value":"65"},"src":"2299:22:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":2946,"nodeType":"Block","src":"2793:108:16","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":2935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2823:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":2934,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2815:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":2933,"name":"address","nodeType":"ElementaryTypeName","src":"2815:7:16","typeDescriptions":{}}},"id":2936,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2815:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":2937,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"2827:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":2938,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2840:22:16","memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":2881,"src":"2827:35:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"arguments":[{"expression":{"id":2941,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2901,"src":"2872:9:16","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":2942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2882:6:16","memberName":"length","nodeType":"MemberAccess","src":"2872:16:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":2940,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2864:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":2939,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2864:7:16","typeDescriptions":{}}},"id":2943,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2864:25:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":2944,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2814:76:16","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":2910,"id":2945,"nodeType":"Return","src":"2807:83:16"}]},"id":2947,"nodeType":"IfStatement","src":"2295:606:16","trueBody":{"id":2932,"nodeType":"Block","src":"2323:464:16","statements":[{"assignments":[2916],"declarations":[{"constant":false,"id":2916,"mutability":"mutable","name":"r","nameLocation":"2345:1:16","nodeType":"VariableDeclaration","scope":2932,"src":"2337:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2915,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2337:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":2917,"nodeType":"VariableDeclarationStatement","src":"2337:9:16"},{"assignments":[2919],"declarations":[{"constant":false,"id":2919,"mutability":"mutable","name":"s","nameLocation":"2368:1:16","nodeType":"VariableDeclaration","scope":2932,"src":"2360:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2918,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2360:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":2920,"nodeType":"VariableDeclarationStatement","src":"2360:9:16"},{"assignments":[2922],"declarations":[{"constant":false,"id":2922,"mutability":"mutable","name":"v","nameLocation":"2389:1:16","nodeType":"VariableDeclaration","scope":2932,"src":"2383:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":2921,"name":"uint8","nodeType":"ElementaryTypeName","src":"2383:5:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":2923,"nodeType":"VariableDeclarationStatement","src":"2383:7:16"},{"AST":{"nativeSrc":"2560:171:16","nodeType":"YulBlock","src":"2560:171:16","statements":[{"nativeSrc":"2578:32:16","nodeType":"YulAssignment","src":"2578:32:16","value":{"arguments":[{"arguments":[{"name":"signature","nativeSrc":"2593:9:16","nodeType":"YulIdentifier","src":"2593:9:16"},{"kind":"number","nativeSrc":"2604:4:16","nodeType":"YulLiteral","src":"2604:4:16","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"2589:3:16","nodeType":"YulIdentifier","src":"2589:3:16"},"nativeSrc":"2589:20:16","nodeType":"YulFunctionCall","src":"2589:20:16"}],"functionName":{"name":"mload","nativeSrc":"2583:5:16","nodeType":"YulIdentifier","src":"2583:5:16"},"nativeSrc":"2583:27:16","nodeType":"YulFunctionCall","src":"2583:27:16"},"variableNames":[{"name":"r","nativeSrc":"2578:1:16","nodeType":"YulIdentifier","src":"2578:1:16"}]},{"nativeSrc":"2627:32:16","nodeType":"YulAssignment","src":"2627:32:16","value":{"arguments":[{"arguments":[{"name":"signature","nativeSrc":"2642:9:16","nodeType":"YulIdentifier","src":"2642:9:16"},{"kind":"number","nativeSrc":"2653:4:16","nodeType":"YulLiteral","src":"2653:4:16","type":"","value":"0x40"}],"functionName":{"name":"add","nativeSrc":"2638:3:16","nodeType":"YulIdentifier","src":"2638:3:16"},"nativeSrc":"2638:20:16","nodeType":"YulFunctionCall","src":"2638:20:16"}],"functionName":{"name":"mload","nativeSrc":"2632:5:16","nodeType":"YulIdentifier","src":"2632:5:16"},"nativeSrc":"2632:27:16","nodeType":"YulFunctionCall","src":"2632:27:16"},"variableNames":[{"name":"s","nativeSrc":"2627:1:16","nodeType":"YulIdentifier","src":"2627:1:16"}]},{"nativeSrc":"2676:41:16","nodeType":"YulAssignment","src":"2676:41:16","value":{"arguments":[{"kind":"number","nativeSrc":"2686:1:16","nodeType":"YulLiteral","src":"2686:1:16","type":"","value":"0"},{"arguments":[{"arguments":[{"name":"signature","nativeSrc":"2699:9:16","nodeType":"YulIdentifier","src":"2699:9:16"},{"kind":"number","nativeSrc":"2710:4:16","nodeType":"YulLiteral","src":"2710:4:16","type":"","value":"0x60"}],"functionName":{"name":"add","nativeSrc":"2695:3:16","nodeType":"YulIdentifier","src":"2695:3:16"},"nativeSrc":"2695:20:16","nodeType":"YulFunctionCall","src":"2695:20:16"}],"functionName":{"name":"mload","nativeSrc":"2689:5:16","nodeType":"YulIdentifier","src":"2689:5:16"},"nativeSrc":"2689:27:16","nodeType":"YulFunctionCall","src":"2689:27:16"}],"functionName":{"name":"byte","nativeSrc":"2681:4:16","nodeType":"YulIdentifier","src":"2681:4:16"},"nativeSrc":"2681:36:16","nodeType":"YulFunctionCall","src":"2681:36:16"},"variableNames":[{"name":"v","nativeSrc":"2676:1:16","nodeType":"YulIdentifier","src":"2676:1:16"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":2916,"isOffset":false,"isSlot":false,"src":"2578:1:16","valueSize":1},{"declaration":2919,"isOffset":false,"isSlot":false,"src":"2627:1:16","valueSize":1},{"declaration":2901,"isOffset":false,"isSlot":false,"src":"2593:9:16","valueSize":1},{"declaration":2901,"isOffset":false,"isSlot":false,"src":"2642:9:16","valueSize":1},{"declaration":2901,"isOffset":false,"isSlot":false,"src":"2699:9:16","valueSize":1},{"declaration":2922,"isOffset":false,"isSlot":false,"src":"2676:1:16","valueSize":1}],"flags":["memory-safe"],"id":2924,"nodeType":"InlineAssembly","src":"2535:196:16"},{"expression":{"arguments":[{"id":2926,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2899,"src":"2762:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":2927,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2922,"src":"2768:1:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":2928,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2916,"src":"2771:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":2929,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2919,"src":"2774:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2925,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[2949,3029,3137],"referencedDeclaration":3137,"src":"2751:10:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)"}},"id":2930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2751:25:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":2910,"id":2931,"nodeType":"Return","src":"2744:32:16"}]}}]},"documentation":{"id":2897,"nodeType":"StructuredDocumentation","src":"857:1267:16","text":" @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n return address(0) without also returning an error description. Errors are documented using an enum (error type)\n and a bytes32 providing additional information about the error.\n If no error is returned, then the address can be used for verification purposes.\n The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]"},"id":2949,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"2138:10:16","nodeType":"FunctionDefinition","parameters":{"id":2902,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2899,"mutability":"mutable","name":"hash","nameLocation":"2166:4:16","nodeType":"VariableDeclaration","scope":2949,"src":"2158:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2898,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2158:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2901,"mutability":"mutable","name":"signature","nameLocation":"2193:9:16","nodeType":"VariableDeclaration","scope":2949,"src":"2180:22:16","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2900,"name":"bytes","nodeType":"ElementaryTypeName","src":"2180:5:16","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2148:60:16"},"returnParameters":{"id":2910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2904,"mutability":"mutable","name":"recovered","nameLocation":"2240:9:16","nodeType":"VariableDeclaration","scope":2949,"src":"2232:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2903,"name":"address","nodeType":"ElementaryTypeName","src":"2232:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2907,"mutability":"mutable","name":"err","nameLocation":"2264:3:16","nodeType":"VariableDeclaration","scope":2949,"src":"2251:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":2906,"nodeType":"UserDefinedTypeName","pathNode":{"id":2905,"name":"RecoverError","nameLocations":["2251:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"2251:12:16"},"referencedDeclaration":2883,"src":"2251:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":2909,"mutability":"mutable","name":"errArg","nameLocation":"2277:6:16","nodeType":"VariableDeclaration","scope":2949,"src":"2269:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2908,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2269:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2231:53:16"},"scope":3223,"src":"2129:778:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":2978,"nodeType":"Block","src":"3801:168:16","statements":[{"assignments":[2960,2963,2965],"declarations":[{"constant":false,"id":2960,"mutability":"mutable","name":"recovered","nameLocation":"3820:9:16","nodeType":"VariableDeclaration","scope":2978,"src":"3812:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2959,"name":"address","nodeType":"ElementaryTypeName","src":"3812:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2963,"mutability":"mutable","name":"error","nameLocation":"3844:5:16","nodeType":"VariableDeclaration","scope":2978,"src":"3831:18:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":2962,"nodeType":"UserDefinedTypeName","pathNode":{"id":2961,"name":"RecoverError","nameLocations":["3831:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"3831:12:16"},"referencedDeclaration":2883,"src":"3831:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":2965,"mutability":"mutable","name":"errorArg","nameLocation":"3859:8:16","nodeType":"VariableDeclaration","scope":2978,"src":"3851:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2964,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3851:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":2970,"initialValue":{"arguments":[{"id":2967,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2952,"src":"3882:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":2968,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2954,"src":"3888:9:16","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":2966,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[2949,3029,3137],"referencedDeclaration":2949,"src":"3871:10:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError,bytes32)"}},"id":2969,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3871:27:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"nodeType":"VariableDeclarationStatement","src":"3811:87:16"},{"expression":{"arguments":[{"id":2972,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2963,"src":"3920:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"id":2973,"name":"errorArg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2965,"src":"3927:8:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":2971,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3222,"src":"3908:11:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$2883_$_t_bytes32_$returns$__$","typeString":"function (enum ECDSA.RecoverError,bytes32) pure"}},"id":2974,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3908:28:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":2975,"nodeType":"ExpressionStatement","src":"3908:28:16"},{"expression":{"id":2976,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2960,"src":"3953:9:16","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":2958,"id":2977,"nodeType":"Return","src":"3946:16:16"}]},"documentation":{"id":2950,"nodeType":"StructuredDocumentation","src":"2913:796:16","text":" @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it."},"id":2979,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"3723:7:16","nodeType":"FunctionDefinition","parameters":{"id":2955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2952,"mutability":"mutable","name":"hash","nameLocation":"3739:4:16","nodeType":"VariableDeclaration","scope":2979,"src":"3731:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2951,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3731:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2954,"mutability":"mutable","name":"signature","nameLocation":"3758:9:16","nodeType":"VariableDeclaration","scope":2979,"src":"3745:22:16","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2953,"name":"bytes","nodeType":"ElementaryTypeName","src":"3745:5:16","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3730:38:16"},"returnParameters":{"id":2958,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2957,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":2979,"src":"3792:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2956,"name":"address","nodeType":"ElementaryTypeName","src":"3792:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3791:9:16"},"scope":3223,"src":"3714:255:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3028,"nodeType":"Block","src":"4348:342:16","statements":[{"id":3027,"nodeType":"UncheckedBlock","src":"4358:326:16","statements":[{"assignments":[2997],"declarations":[{"constant":false,"id":2997,"mutability":"mutable","name":"s","nameLocation":"4390:1:16","nodeType":"VariableDeclaration","scope":3027,"src":"4382:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2996,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4382:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3004,"initialValue":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":2998,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2986,"src":"4394:2:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"arguments":[{"hexValue":"307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666","id":3001,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4407:66:16","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"},"value":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1","typeString":"int_const 5789...(69 digits omitted)...9967"}],"id":3000,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4399:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":2999,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4399:7:16","typeDescriptions":{}}},"id":3002,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4399:75:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4394:80:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4382:92:16"},{"assignments":[3006],"declarations":[{"constant":false,"id":3006,"mutability":"mutable","name":"v","nameLocation":"4591:1:16","nodeType":"VariableDeclaration","scope":3027,"src":"4585:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3005,"name":"uint8","nodeType":"ElementaryTypeName","src":"4585:5:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"id":3019,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3014,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3011,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2986,"src":"4610:2:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3010,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4602:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":3009,"name":"uint256","nodeType":"ElementaryTypeName","src":"4602:7:16","typeDescriptions":{}}},"id":3012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4602:11:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"323535","id":3013,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4617:3:16","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"4602:18:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":3015,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"4601:20:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"3237","id":3016,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4624:2:16","typeDescriptions":{"typeIdentifier":"t_rational_27_by_1","typeString":"int_const 27"},"value":"27"},"src":"4601:25:16","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3008,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4595:5:16","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":3007,"name":"uint8","nodeType":"ElementaryTypeName","src":"4595:5:16","typeDescriptions":{}}},"id":3018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4595:32:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"VariableDeclarationStatement","src":"4585:42:16"},{"expression":{"arguments":[{"id":3021,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2982,"src":"4659:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3022,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3006,"src":"4665:1:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":3023,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2984,"src":"4668:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3024,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2997,"src":"4671:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3020,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[2949,3029,3137],"referencedDeclaration":3137,"src":"4648:10:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)"}},"id":3025,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4648:25:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":2995,"id":3026,"nodeType":"Return","src":"4641:32:16"}]}]},"documentation":{"id":2980,"nodeType":"StructuredDocumentation","src":"3975:205:16","text":" @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]"},"id":3029,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"4194:10:16","nodeType":"FunctionDefinition","parameters":{"id":2987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2982,"mutability":"mutable","name":"hash","nameLocation":"4222:4:16","nodeType":"VariableDeclaration","scope":3029,"src":"4214:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2981,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4214:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2984,"mutability":"mutable","name":"r","nameLocation":"4244:1:16","nodeType":"VariableDeclaration","scope":3029,"src":"4236:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2983,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4236:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":2986,"mutability":"mutable","name":"vs","nameLocation":"4263:2:16","nodeType":"VariableDeclaration","scope":3029,"src":"4255:10:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2985,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4255:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4204:67:16"},"returnParameters":{"id":2995,"nodeType":"ParameterList","parameters":[{"constant":false,"id":2989,"mutability":"mutable","name":"recovered","nameLocation":"4303:9:16","nodeType":"VariableDeclaration","scope":3029,"src":"4295:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2988,"name":"address","nodeType":"ElementaryTypeName","src":"4295:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":2992,"mutability":"mutable","name":"err","nameLocation":"4327:3:16","nodeType":"VariableDeclaration","scope":3029,"src":"4314:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":2991,"nodeType":"UserDefinedTypeName","pathNode":{"id":2990,"name":"RecoverError","nameLocations":["4314:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"4314:12:16"},"referencedDeclaration":2883,"src":"4314:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":2994,"mutability":"mutable","name":"errArg","nameLocation":"4340:6:16","nodeType":"VariableDeclaration","scope":3029,"src":"4332:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":2993,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4332:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4294:53:16"},"scope":3223,"src":"4185:505:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3061,"nodeType":"Block","src":"4903:164:16","statements":[{"assignments":[3042,3045,3047],"declarations":[{"constant":false,"id":3042,"mutability":"mutable","name":"recovered","nameLocation":"4922:9:16","nodeType":"VariableDeclaration","scope":3061,"src":"4914:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3041,"name":"address","nodeType":"ElementaryTypeName","src":"4914:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3045,"mutability":"mutable","name":"error","nameLocation":"4946:5:16","nodeType":"VariableDeclaration","scope":3061,"src":"4933:18:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":3044,"nodeType":"UserDefinedTypeName","pathNode":{"id":3043,"name":"RecoverError","nameLocations":["4933:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"4933:12:16"},"referencedDeclaration":2883,"src":"4933:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":3047,"mutability":"mutable","name":"errorArg","nameLocation":"4961:8:16","nodeType":"VariableDeclaration","scope":3061,"src":"4953:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3046,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4953:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3053,"initialValue":{"arguments":[{"id":3049,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3032,"src":"4984:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3050,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3034,"src":"4990:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3051,"name":"vs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3036,"src":"4993:2:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3048,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[2949,3029,3137],"referencedDeclaration":3029,"src":"4973:10:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)"}},"id":3052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4973:23:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"nodeType":"VariableDeclarationStatement","src":"4913:83:16"},{"expression":{"arguments":[{"id":3055,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3045,"src":"5018:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"id":3056,"name":"errorArg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3047,"src":"5025:8:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3054,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3222,"src":"5006:11:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$2883_$_t_bytes32_$returns$__$","typeString":"function (enum ECDSA.RecoverError,bytes32) pure"}},"id":3057,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5006:28:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3058,"nodeType":"ExpressionStatement","src":"5006:28:16"},{"expression":{"id":3059,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3042,"src":"5051:9:16","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3040,"id":3060,"nodeType":"Return","src":"5044:16:16"}]},"documentation":{"id":3030,"nodeType":"StructuredDocumentation","src":"4696:116:16","text":" @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately."},"id":3062,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"4826:7:16","nodeType":"FunctionDefinition","parameters":{"id":3037,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3032,"mutability":"mutable","name":"hash","nameLocation":"4842:4:16","nodeType":"VariableDeclaration","scope":3062,"src":"4834:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3031,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4834:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3034,"mutability":"mutable","name":"r","nameLocation":"4856:1:16","nodeType":"VariableDeclaration","scope":3062,"src":"4848:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3033,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4848:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3036,"mutability":"mutable","name":"vs","nameLocation":"4867:2:16","nodeType":"VariableDeclaration","scope":3062,"src":"4859:10:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3035,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4859:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4833:37:16"},"returnParameters":{"id":3040,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3039,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3062,"src":"4894:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3038,"name":"address","nodeType":"ElementaryTypeName","src":"4894:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4893:9:16"},"scope":3223,"src":"4817:250:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3136,"nodeType":"Block","src":"5382:1372:16","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3083,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3071,"src":"6278:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3082,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6270:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":3081,"name":"uint256","nodeType":"ElementaryTypeName","src":"6270:7:16","typeDescriptions":{}}},"id":3084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6270:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130","id":3085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6283:66:16","typeDescriptions":{"typeIdentifier":"t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1","typeString":"int_const 5789...(69 digits omitted)...7168"},"value":"0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"},"src":"6270:79:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3097,"nodeType":"IfStatement","src":"6266:164:16","trueBody":{"id":3096,"nodeType":"Block","src":"6351:79:16","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":3089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6381:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3088,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6373:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3087,"name":"address","nodeType":"ElementaryTypeName","src":"6373:7:16","typeDescriptions":{}}},"id":3090,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6373:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":3091,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"6385:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3092,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6398:17:16","memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":2882,"src":"6385:30:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"id":3093,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3071,"src":"6417:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":3094,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6372:47:16","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":3080,"id":3095,"nodeType":"Return","src":"6365:54:16"}]}},{"assignments":[3099],"declarations":[{"constant":false,"id":3099,"mutability":"mutable","name":"signer","nameLocation":"6532:6:16","nodeType":"VariableDeclaration","scope":3136,"src":"6524:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3098,"name":"address","nodeType":"ElementaryTypeName","src":"6524:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":3106,"initialValue":{"arguments":[{"id":3101,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3065,"src":"6551:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3102,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3067,"src":"6557:1:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":3103,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3069,"src":"6560:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3104,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3071,"src":"6563:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3100,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"6541:9:16","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":3105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6541:24:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6524:41:16"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":3112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3107,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3099,"src":"6579:6:16","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":3110,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6597:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3109,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6589:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3108,"name":"address","nodeType":"ElementaryTypeName","src":"6589:7:16","typeDescriptions":{}}},"id":3111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6589:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6579:20:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3126,"nodeType":"IfStatement","src":"6575:113:16","trueBody":{"id":3125,"nodeType":"Block","src":"6601:87:16","statements":[{"expression":{"components":[{"arguments":[{"hexValue":"30","id":3115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6631:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3114,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6623:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":3113,"name":"address","nodeType":"ElementaryTypeName","src":"6623:7:16","typeDescriptions":{}}},"id":3116,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6623:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":3117,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"6635:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3118,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6648:16:16","memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":2880,"src":"6635:29:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"arguments":[{"hexValue":"30","id":3121,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6674:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3120,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6666:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":3119,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6666:7:16","typeDescriptions":{}}},"id":3122,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6666:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":3123,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6622:55:16","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":3080,"id":3124,"nodeType":"Return","src":"6615:62:16"}]}},{"expression":{"components":[{"id":3127,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3099,"src":"6706:6:16","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":3128,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"6714:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6727:7:16","memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":2879,"src":"6714:20:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"arguments":[{"hexValue":"30","id":3132,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6744:1:16","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":3131,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6736:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":3130,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6736:7:16","typeDescriptions":{}}},"id":3133,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6736:10:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":3134,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6705:42:16","typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"functionReturnParameters":3080,"id":3135,"nodeType":"Return","src":"6698:49:16"}]},"documentation":{"id":3063,"nodeType":"StructuredDocumentation","src":"5073:125:16","text":" @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately."},"id":3137,"implemented":true,"kind":"function","modifiers":[],"name":"tryRecover","nameLocation":"5212:10:16","nodeType":"FunctionDefinition","parameters":{"id":3072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3065,"mutability":"mutable","name":"hash","nameLocation":"5240:4:16","nodeType":"VariableDeclaration","scope":3137,"src":"5232:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3064,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5232:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3067,"mutability":"mutable","name":"v","nameLocation":"5260:1:16","nodeType":"VariableDeclaration","scope":3137,"src":"5254:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3066,"name":"uint8","nodeType":"ElementaryTypeName","src":"5254:5:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":3069,"mutability":"mutable","name":"r","nameLocation":"5279:1:16","nodeType":"VariableDeclaration","scope":3137,"src":"5271:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3068,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5271:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3071,"mutability":"mutable","name":"s","nameLocation":"5298:1:16","nodeType":"VariableDeclaration","scope":3137,"src":"5290:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3070,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5290:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5222:83:16"},"returnParameters":{"id":3080,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3074,"mutability":"mutable","name":"recovered","nameLocation":"5337:9:16","nodeType":"VariableDeclaration","scope":3137,"src":"5329:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3073,"name":"address","nodeType":"ElementaryTypeName","src":"5329:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3077,"mutability":"mutable","name":"err","nameLocation":"5361:3:16","nodeType":"VariableDeclaration","scope":3137,"src":"5348:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":3076,"nodeType":"UserDefinedTypeName","pathNode":{"id":3075,"name":"RecoverError","nameLocations":["5348:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"5348:12:16"},"referencedDeclaration":2883,"src":"5348:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":3079,"mutability":"mutable","name":"errArg","nameLocation":"5374:6:16","nodeType":"VariableDeclaration","scope":3137,"src":"5366:14:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3078,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5366:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5328:53:16"},"scope":3223,"src":"5203:1551:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3172,"nodeType":"Block","src":"6981:166:16","statements":[{"assignments":[3152,3155,3157],"declarations":[{"constant":false,"id":3152,"mutability":"mutable","name":"recovered","nameLocation":"7000:9:16","nodeType":"VariableDeclaration","scope":3172,"src":"6992:17:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3151,"name":"address","nodeType":"ElementaryTypeName","src":"6992:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":3155,"mutability":"mutable","name":"error","nameLocation":"7024:5:16","nodeType":"VariableDeclaration","scope":3172,"src":"7011:18:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":3154,"nodeType":"UserDefinedTypeName","pathNode":{"id":3153,"name":"RecoverError","nameLocations":["7011:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"7011:12:16"},"referencedDeclaration":2883,"src":"7011:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":3157,"mutability":"mutable","name":"errorArg","nameLocation":"7039:8:16","nodeType":"VariableDeclaration","scope":3172,"src":"7031:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3156,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7031:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3164,"initialValue":{"arguments":[{"id":3159,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3140,"src":"7062:4:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3160,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3142,"src":"7068:1:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":3161,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3144,"src":"7071:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3162,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3146,"src":"7074:1:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3158,"name":"tryRecover","nodeType":"Identifier","overloadedDeclarations":[2949,3029,3137],"referencedDeclaration":3137,"src":"7051:10:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)"}},"id":3163,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7051:25:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_enum$_RecoverError_$2883_$_t_bytes32_$","typeString":"tuple(address,enum ECDSA.RecoverError,bytes32)"}},"nodeType":"VariableDeclarationStatement","src":"6991:85:16"},{"expression":{"arguments":[{"id":3166,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3155,"src":"7098:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},{"id":3167,"name":"errorArg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3157,"src":"7105:8:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3165,"name":"_throwError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3222,"src":"7086:11:16","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_RecoverError_$2883_$_t_bytes32_$returns$__$","typeString":"function (enum ECDSA.RecoverError,bytes32) pure"}},"id":3168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7086:28:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":3169,"nodeType":"ExpressionStatement","src":"7086:28:16"},{"expression":{"id":3170,"name":"recovered","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3152,"src":"7131:9:16","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":3150,"id":3171,"nodeType":"Return","src":"7124:16:16"}]},"documentation":{"id":3138,"nodeType":"StructuredDocumentation","src":"6760:122:16","text":" @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately."},"id":3173,"implemented":true,"kind":"function","modifiers":[],"name":"recover","nameLocation":"6896:7:16","nodeType":"FunctionDefinition","parameters":{"id":3147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3140,"mutability":"mutable","name":"hash","nameLocation":"6912:4:16","nodeType":"VariableDeclaration","scope":3173,"src":"6904:12:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3139,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6904:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3142,"mutability":"mutable","name":"v","nameLocation":"6924:1:16","nodeType":"VariableDeclaration","scope":3173,"src":"6918:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":3141,"name":"uint8","nodeType":"ElementaryTypeName","src":"6918:5:16","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":3144,"mutability":"mutable","name":"r","nameLocation":"6935:1:16","nodeType":"VariableDeclaration","scope":3173,"src":"6927:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3143,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6927:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3146,"mutability":"mutable","name":"s","nameLocation":"6946:1:16","nodeType":"VariableDeclaration","scope":3173,"src":"6938:9:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3145,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6938:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6903:45:16"},"returnParameters":{"id":3150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3149,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3173,"src":"6972:7:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3148,"name":"address","nodeType":"ElementaryTypeName","src":"6972:7:16","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6971:9:16"},"scope":3223,"src":"6887:260:16","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3221,"nodeType":"Block","src":"7352:460:16","statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"id":3185,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3182,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3177,"src":"7366:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":3183,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"7375:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3184,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7388:7:16","memberName":"NoError","nodeType":"MemberAccess","referencedDeclaration":2879,"src":"7375:20:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"src":"7366:29:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"id":3191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3188,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3177,"src":"7462:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":3189,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"7471:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3190,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7484:16:16","memberName":"InvalidSignature","nodeType":"MemberAccess","referencedDeclaration":2880,"src":"7471:29:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"src":"7462:38:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"id":3199,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3196,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3177,"src":"7567:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":3197,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"7576:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3198,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7589:22:16","memberName":"InvalidSignatureLength","nodeType":"MemberAccess","referencedDeclaration":2881,"src":"7576:35:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"src":"7567:44:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"id":3211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3208,"name":"error","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3177,"src":"7701:5:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":3209,"name":"RecoverError","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2883,"src":"7710:12:16","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RecoverError_$2883_$","typeString":"type(enum ECDSA.RecoverError)"}},"id":3210,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7723:17:16","memberName":"InvalidSignatureS","nodeType":"MemberAccess","referencedDeclaration":2882,"src":"7710:30:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"src":"7701:39:16","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3217,"nodeType":"IfStatement","src":"7697:109:16","trueBody":{"id":3216,"nodeType":"Block","src":"7742:64:16","statements":[{"errorCall":{"arguments":[{"id":3213,"name":"errorArg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3179,"src":"7786:8:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3212,"name":"ECDSAInvalidSignatureS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2896,"src":"7763:22:16","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes32_$returns$_t_error_$","typeString":"function (bytes32) pure returns (error)"}},"id":3214,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7763:32:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3215,"nodeType":"RevertStatement","src":"7756:39:16"}]}},"id":3218,"nodeType":"IfStatement","src":"7563:243:16","trueBody":{"id":3207,"nodeType":"Block","src":"7613:78:16","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":3203,"name":"errorArg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3179,"src":"7670:8:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3202,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7662:7:16","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":3201,"name":"uint256","nodeType":"ElementaryTypeName","src":"7662:7:16","typeDescriptions":{}}},"id":3204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7662:17:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3200,"name":"ECDSAInvalidSignatureLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2891,"src":"7634:27:16","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":3205,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7634:46:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3206,"nodeType":"RevertStatement","src":"7627:53:16"}]}},"id":3219,"nodeType":"IfStatement","src":"7458:348:16","trueBody":{"id":3195,"nodeType":"Block","src":"7502:55:16","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":3192,"name":"ECDSAInvalidSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2886,"src":"7523:21:16","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":3193,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7523:23:16","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3194,"nodeType":"RevertStatement","src":"7516:30:16"}]}},"id":3220,"nodeType":"IfStatement","src":"7362:444:16","trueBody":{"id":3187,"nodeType":"Block","src":"7397:55:16","statements":[{"functionReturnParameters":3181,"id":3186,"nodeType":"Return","src":"7411:7:16"}]}}]},"documentation":{"id":3174,"nodeType":"StructuredDocumentation","src":"7153:122:16","text":" @dev Optionally reverts with the corresponding custom error according to the `error` argument provided."},"id":3222,"implemented":true,"kind":"function","modifiers":[],"name":"_throwError","nameLocation":"7289:11:16","nodeType":"FunctionDefinition","parameters":{"id":3180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3177,"mutability":"mutable","name":"error","nameLocation":"7314:5:16","nodeType":"VariableDeclaration","scope":3222,"src":"7301:18:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"},"typeName":{"id":3176,"nodeType":"UserDefinedTypeName","pathNode":{"id":3175,"name":"RecoverError","nameLocations":["7301:12:16"],"nodeType":"IdentifierPath","referencedDeclaration":2883,"src":"7301:12:16"},"referencedDeclaration":2883,"src":"7301:12:16","typeDescriptions":{"typeIdentifier":"t_enum$_RecoverError_$2883","typeString":"enum ECDSA.RecoverError"}},"visibility":"internal"},{"constant":false,"id":3179,"mutability":"mutable","name":"errorArg","nameLocation":"7329:8:16","nodeType":"VariableDeclaration","scope":3222,"src":"7321:16:16","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3178,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7321:7:16","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"7300:38:16"},"returnParameters":{"id":3181,"nodeType":"ParameterList","parameters":[],"src":"7352:0:16"},"scope":3223,"src":"7280:532:16","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":3224,"src":"344:7470:16","usedErrors":[2886,2891,2896],"usedEvents":[]}],"src":"112:7703:16"},"id":16},"@openzeppelin/contracts/utils/cryptography/Hashes.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/cryptography/Hashes.sol","exportedSymbols":{"Hashes":[3263]},"id":3264,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3225,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"113:24:17"},{"abstract":false,"baseContracts":[],"canonicalName":"Hashes","contractDependencies":[],"contractKind":"library","documentation":{"id":3226,"nodeType":"StructuredDocumentation","src":"139:81:17","text":" @dev Library of standard hash functions.\n _Available since v5.1._"},"fullyImplemented":true,"id":3263,"linearizedBaseContracts":[3263],"name":"Hashes","nameLocation":"229:6:17","nodeType":"ContractDefinition","nodes":[{"body":{"id":3249,"nodeType":"Block","src":"588:83:17","statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3236,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3229,"src":"605:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3237,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3231,"src":"609:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"605:5:17","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"id":3244,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3231,"src":"659:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3245,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3229,"src":"662:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3243,"name":"efficientKeccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3262,"src":"640:18:17","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":3246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"640:24:17","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"605:59:17","trueExpression":{"arguments":[{"id":3240,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3229,"src":"632:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3241,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3231,"src":"635:1:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3239,"name":"efficientKeccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3262,"src":"613:18:17","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":3242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"613:24:17","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3235,"id":3248,"nodeType":"Return","src":"598:66:17"}]},"documentation":{"id":3227,"nodeType":"StructuredDocumentation","src":"242:257:17","text":" @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\n NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library]."},"id":3250,"implemented":true,"kind":"function","modifiers":[],"name":"commutativeKeccak256","nameLocation":"513:20:17","nodeType":"FunctionDefinition","parameters":{"id":3232,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3229,"mutability":"mutable","name":"a","nameLocation":"542:1:17","nodeType":"VariableDeclaration","scope":3250,"src":"534:9:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3228,"name":"bytes32","nodeType":"ElementaryTypeName","src":"534:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3231,"mutability":"mutable","name":"b","nameLocation":"553:1:17","nodeType":"VariableDeclaration","scope":3250,"src":"545:9:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3230,"name":"bytes32","nodeType":"ElementaryTypeName","src":"545:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"533:22:17"},"returnParameters":{"id":3235,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3234,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3250,"src":"579:7:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3233,"name":"bytes32","nodeType":"ElementaryTypeName","src":"579:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"578:9:17"},"scope":3263,"src":"504:167:17","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3261,"nodeType":"Block","src":"879:151:17","statements":[{"AST":{"nativeSrc":"914:110:17","nodeType":"YulBlock","src":"914:110:17","statements":[{"expression":{"arguments":[{"kind":"number","nativeSrc":"935:4:17","nodeType":"YulLiteral","src":"935:4:17","type":"","value":"0x00"},{"name":"a","nativeSrc":"941:1:17","nodeType":"YulIdentifier","src":"941:1:17"}],"functionName":{"name":"mstore","nativeSrc":"928:6:17","nodeType":"YulIdentifier","src":"928:6:17"},"nativeSrc":"928:15:17","nodeType":"YulFunctionCall","src":"928:15:17"},"nativeSrc":"928:15:17","nodeType":"YulExpressionStatement","src":"928:15:17"},{"expression":{"arguments":[{"kind":"number","nativeSrc":"963:4:17","nodeType":"YulLiteral","src":"963:4:17","type":"","value":"0x20"},{"name":"b","nativeSrc":"969:1:17","nodeType":"YulIdentifier","src":"969:1:17"}],"functionName":{"name":"mstore","nativeSrc":"956:6:17","nodeType":"YulIdentifier","src":"956:6:17"},"nativeSrc":"956:15:17","nodeType":"YulFunctionCall","src":"956:15:17"},"nativeSrc":"956:15:17","nodeType":"YulExpressionStatement","src":"956:15:17"},{"nativeSrc":"984:30:17","nodeType":"YulAssignment","src":"984:30:17","value":{"arguments":[{"kind":"number","nativeSrc":"1003:4:17","nodeType":"YulLiteral","src":"1003:4:17","type":"","value":"0x00"},{"kind":"number","nativeSrc":"1009:4:17","nodeType":"YulLiteral","src":"1009:4:17","type":"","value":"0x40"}],"functionName":{"name":"keccak256","nativeSrc":"993:9:17","nodeType":"YulIdentifier","src":"993:9:17"},"nativeSrc":"993:21:17","nodeType":"YulFunctionCall","src":"993:21:17"},"variableNames":[{"name":"value","nativeSrc":"984:5:17","nodeType":"YulIdentifier","src":"984:5:17"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":3253,"isOffset":false,"isSlot":false,"src":"941:1:17","valueSize":1},{"declaration":3255,"isOffset":false,"isSlot":false,"src":"969:1:17","valueSize":1},{"declaration":3258,"isOffset":false,"isSlot":false,"src":"984:5:17","valueSize":1}],"flags":["memory-safe"],"id":3260,"nodeType":"InlineAssembly","src":"889:135:17"}]},"documentation":{"id":3251,"nodeType":"StructuredDocumentation","src":"677:109:17","text":" @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory."},"id":3262,"implemented":true,"kind":"function","modifiers":[],"name":"efficientKeccak256","nameLocation":"800:18:17","nodeType":"FunctionDefinition","parameters":{"id":3256,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3253,"mutability":"mutable","name":"a","nameLocation":"827:1:17","nodeType":"VariableDeclaration","scope":3262,"src":"819:9:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3252,"name":"bytes32","nodeType":"ElementaryTypeName","src":"819:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3255,"mutability":"mutable","name":"b","nameLocation":"838:1:17","nodeType":"VariableDeclaration","scope":3262,"src":"830:9:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3254,"name":"bytes32","nodeType":"ElementaryTypeName","src":"830:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"818:22:17"},"returnParameters":{"id":3259,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3258,"mutability":"mutable","name":"value","nameLocation":"872:5:17","nodeType":"VariableDeclaration","scope":3262,"src":"864:13:17","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3257,"name":"bytes32","nodeType":"ElementaryTypeName","src":"864:7:17","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"863:15:17"},"scope":3263,"src":"791:239:17","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":3264,"src":"221:811:17","usedErrors":[],"usedEvents":[]}],"src":"113:920:17"},"id":17},"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","exportedSymbols":{"Hashes":[3263],"MerkleProof":[4336]},"id":4337,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":3265,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"206:24:18"},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/Hashes.sol","file":"./Hashes.sol","id":3267,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":4337,"sourceUnit":3264,"src":"232:36:18","symbolAliases":[{"foreign":{"id":3266,"name":"Hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3263,"src":"240:6:18","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"MerkleProof","contractDependencies":[],"contractKind":"library","documentation":{"id":3268,"nodeType":"StructuredDocumentation","src":"270:1082:18","text":" @dev These functions deal with verification of Merkle Tree proofs.\n The tree and the proofs can be generated using our\n https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\n You will find a quickstart guide in the readme.\n WARNING: You should avoid using leaf values that are 64 bytes long prior to\n hashing, or use a hash function other than keccak256 for hashing leaves.\n This is because the concatenation of a sorted pair of internal nodes in\n the Merkle tree could be reinterpreted as a leaf value.\n OpenZeppelin's JavaScript library generates Merkle trees that are safe\n against this attack out of the box.\n IMPORTANT: Consider memory side-effects when using custom hashing functions\n that access memory in an unsafe way.\n NOTE: This library supports proof verification for merkle trees built using\n custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving\n leaf inclusion in trees built using non-commutative hashing functions requires\n additional logic that is not supported by this library."},"fullyImplemented":true,"id":4336,"linearizedBaseContracts":[4336],"name":"MerkleProof","nameLocation":"1361:11:18","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":3269,"nodeType":"StructuredDocumentation","src":"1379:60:18","text":"@dev The multiproof provided is not valid."},"errorSelector":"35140492","id":3271,"name":"MerkleProofInvalidMultiproof","nameLocation":"1450:28:18","nodeType":"ErrorDefinition","parameters":{"id":3270,"nodeType":"ParameterList","parameters":[],"src":"1478:2:18"},"src":"1444:37:18"},{"body":{"id":3291,"nodeType":"Block","src":"1999:57:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3285,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3275,"src":"2029:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":3286,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3279,"src":"2036:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3284,"name":"processProof","nodeType":"Identifier","overloadedDeclarations":[3333,3415],"referencedDeclaration":3333,"src":"2016:12:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32[] memory,bytes32) pure returns (bytes32)"}},"id":3287,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2016:25:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3288,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3277,"src":"2045:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2016:33:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3283,"id":3290,"nodeType":"Return","src":"2009:40:18"}]},"documentation":{"id":3272,"nodeType":"StructuredDocumentation","src":"1487:410:18","text":" @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n defined by `root`. For this, a `proof` must be provided, containing\n sibling hashes on the branch from the leaf to the root of the tree. Each\n pair of leaves and each pair of pre-images are assumed to be sorted.\n This version handles proofs in memory with the default hashing function."},"id":3292,"implemented":true,"kind":"function","modifiers":[],"name":"verify","nameLocation":"1911:6:18","nodeType":"FunctionDefinition","parameters":{"id":3280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3275,"mutability":"mutable","name":"proof","nameLocation":"1935:5:18","nodeType":"VariableDeclaration","scope":3292,"src":"1918:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3273,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1918:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3274,"nodeType":"ArrayTypeName","src":"1918:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3277,"mutability":"mutable","name":"root","nameLocation":"1950:4:18","nodeType":"VariableDeclaration","scope":3292,"src":"1942:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3276,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1942:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3279,"mutability":"mutable","name":"leaf","nameLocation":"1964:4:18","nodeType":"VariableDeclaration","scope":3292,"src":"1956:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3278,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1956:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1917:52:18"},"returnParameters":{"id":3283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3282,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3292,"src":"1993:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3281,"name":"bool","nodeType":"ElementaryTypeName","src":"1993:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1992:6:18"},"scope":4336,"src":"1902:154:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3332,"nodeType":"Block","src":"2549:216:18","statements":[{"assignments":[3304],"declarations":[{"constant":false,"id":3304,"mutability":"mutable","name":"computedHash","nameLocation":"2567:12:18","nodeType":"VariableDeclaration","scope":3332,"src":"2559:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3303,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2559:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3306,"initialValue":{"id":3305,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3298,"src":"2582:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2559:27:18"},{"body":{"id":3328,"nodeType":"Block","src":"2639:91:18","statements":[{"expression":{"id":3326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3318,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3304,"src":"2653:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3321,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3304,"src":"2696:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"baseExpression":{"id":3322,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3296,"src":"2710:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3324,"indexExpression":{"id":3323,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3308,"src":"2716:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2710:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3319,"name":"Hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3263,"src":"2668:6:18","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashes_$3263_$","typeString":"type(library Hashes)"}},"id":3320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2675:20:18","memberName":"commutativeKeccak256","nodeType":"MemberAccess","referencedDeclaration":3250,"src":"2668:27:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":3325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2668:51:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2653:66:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3327,"nodeType":"ExpressionStatement","src":"2653:66:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3314,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3311,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3308,"src":"2616:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":3312,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3296,"src":"2620:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2626:6:18","memberName":"length","nodeType":"MemberAccess","src":"2620:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2616:16:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3329,"initializationExpression":{"assignments":[3308],"declarations":[{"constant":false,"id":3308,"mutability":"mutable","name":"i","nameLocation":"2609:1:18","nodeType":"VariableDeclaration","scope":3329,"src":"2601:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3307,"name":"uint256","nodeType":"ElementaryTypeName","src":"2601:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3310,"initialValue":{"hexValue":"30","id":3309,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2613:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2601:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2634:3:18","subExpression":{"id":3315,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3308,"src":"2634:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3317,"nodeType":"ExpressionStatement","src":"2634:3:18"},"nodeType":"ForStatement","src":"2596:134:18"},{"expression":{"id":3330,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3304,"src":"2746:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3302,"id":3331,"nodeType":"Return","src":"2739:19:18"}]},"documentation":{"id":3293,"nodeType":"StructuredDocumentation","src":"2062:390:18","text":" @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n hash matches the root of the tree. When processing the proof, the pairs\n of leaves & pre-images are assumed to be sorted.\n This version handles proofs in memory with the default hashing function."},"id":3333,"implemented":true,"kind":"function","modifiers":[],"name":"processProof","nameLocation":"2466:12:18","nodeType":"FunctionDefinition","parameters":{"id":3299,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3296,"mutability":"mutable","name":"proof","nameLocation":"2496:5:18","nodeType":"VariableDeclaration","scope":3333,"src":"2479:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3294,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2479:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3295,"nodeType":"ArrayTypeName","src":"2479:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3298,"mutability":"mutable","name":"leaf","nameLocation":"2511:4:18","nodeType":"VariableDeclaration","scope":3333,"src":"2503:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3297,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2503:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2478:38:18"},"returnParameters":{"id":3302,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3301,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3333,"src":"2540:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3300,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2540:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2539:9:18"},"scope":4336,"src":"2457:308:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3364,"nodeType":"Block","src":"3376:65:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3357,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3337,"src":"3406:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":3358,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3341,"src":"3413:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3359,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3351,"src":"3419:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}],"id":3356,"name":"processProof","nodeType":"Identifier","overloadedDeclarations":[3333,3415],"referencedDeclaration":3415,"src":"3393:12:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_bytes32_$_t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$_$returns$_t_bytes32_$","typeString":"function (bytes32[] memory,bytes32,function (bytes32,bytes32) view returns (bytes32)) view returns (bytes32)"}},"id":3360,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3393:33:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3361,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3339,"src":"3430:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3393:41:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3355,"id":3363,"nodeType":"Return","src":"3386:48:18"}]},"documentation":{"id":3334,"nodeType":"StructuredDocumentation","src":"2771:407:18","text":" @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n defined by `root`. For this, a `proof` must be provided, containing\n sibling hashes on the branch from the leaf to the root of the tree. Each\n pair of leaves and each pair of pre-images are assumed to be sorted.\n This version handles proofs in memory with a custom hashing function."},"id":3365,"implemented":true,"kind":"function","modifiers":[],"name":"verify","nameLocation":"3192:6:18","nodeType":"FunctionDefinition","parameters":{"id":3352,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3337,"mutability":"mutable","name":"proof","nameLocation":"3225:5:18","nodeType":"VariableDeclaration","scope":3365,"src":"3208:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3335,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3208:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3336,"nodeType":"ArrayTypeName","src":"3208:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3339,"mutability":"mutable","name":"root","nameLocation":"3248:4:18","nodeType":"VariableDeclaration","scope":3365,"src":"3240:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3338,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3240:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3341,"mutability":"mutable","name":"leaf","nameLocation":"3270:4:18","nodeType":"VariableDeclaration","scope":3365,"src":"3262:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3340,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3262:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3351,"mutability":"mutable","name":"hasher","nameLocation":"3334:6:18","nodeType":"VariableDeclaration","scope":3365,"src":"3284:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3350,"nodeType":"FunctionTypeName","parameterTypes":{"id":3346,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3343,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3350,"src":"3293:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3342,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3293:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3345,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3350,"src":"3302:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3344,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3302:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3292:18:18"},"returnParameterTypes":{"id":3349,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3348,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3350,"src":"3325:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3347,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3325:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3324:9:18"},"src":"3284:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"3198:148:18"},"returnParameters":{"id":3355,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3354,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3365,"src":"3370:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3353,"name":"bool","nodeType":"ElementaryTypeName","src":"3370:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3369:6:18"},"scope":4336,"src":"3183:258:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3414,"nodeType":"Block","src":"4019:195:18","statements":[{"assignments":[3387],"declarations":[{"constant":false,"id":3387,"mutability":"mutable","name":"computedHash","nameLocation":"4037:12:18","nodeType":"VariableDeclaration","scope":3414,"src":"4029:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3386,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4029:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3389,"initialValue":{"id":3388,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3371,"src":"4052:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4029:27:18"},{"body":{"id":3410,"nodeType":"Block","src":"4109:70:18","statements":[{"expression":{"id":3408,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3401,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3387,"src":"4123:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3403,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3387,"src":"4145:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"baseExpression":{"id":3404,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3369,"src":"4159:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3406,"indexExpression":{"id":3405,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3391,"src":"4165:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4159:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3402,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3381,"src":"4138:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}},"id":3407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4138:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4123:45:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3409,"nodeType":"ExpressionStatement","src":"4123:45:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3394,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3391,"src":"4086:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":3395,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3369,"src":"4090:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4096:6:18","memberName":"length","nodeType":"MemberAccess","src":"4090:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4086:16:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3411,"initializationExpression":{"assignments":[3391],"declarations":[{"constant":false,"id":3391,"mutability":"mutable","name":"i","nameLocation":"4079:1:18","nodeType":"VariableDeclaration","scope":3411,"src":"4071:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3390,"name":"uint256","nodeType":"ElementaryTypeName","src":"4071:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3393,"initialValue":{"hexValue":"30","id":3392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4083:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"4071:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3399,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4104:3:18","subExpression":{"id":3398,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3391,"src":"4104:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3400,"nodeType":"ExpressionStatement","src":"4104:3:18"},"nodeType":"ForStatement","src":"4066:113:18"},{"expression":{"id":3412,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3387,"src":"4195:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3385,"id":3413,"nodeType":"Return","src":"4188:19:18"}]},"documentation":{"id":3366,"nodeType":"StructuredDocumentation","src":"3447:387:18","text":" @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n hash matches the root of the tree. When processing the proof, the pairs\n of leaves & pre-images are assumed to be sorted.\n This version handles proofs in memory with a custom hashing function."},"id":3415,"implemented":true,"kind":"function","modifiers":[],"name":"processProof","nameLocation":"3848:12:18","nodeType":"FunctionDefinition","parameters":{"id":3382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3369,"mutability":"mutable","name":"proof","nameLocation":"3887:5:18","nodeType":"VariableDeclaration","scope":3415,"src":"3870:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3367,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3870:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3368,"nodeType":"ArrayTypeName","src":"3870:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3371,"mutability":"mutable","name":"leaf","nameLocation":"3910:4:18","nodeType":"VariableDeclaration","scope":3415,"src":"3902:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3370,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3902:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3381,"mutability":"mutable","name":"hasher","nameLocation":"3974:6:18","nodeType":"VariableDeclaration","scope":3415,"src":"3924:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3380,"nodeType":"FunctionTypeName","parameterTypes":{"id":3376,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3373,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3380,"src":"3933:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3372,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3933:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3375,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3380,"src":"3942:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3374,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3942:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3932:18:18"},"returnParameterTypes":{"id":3379,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3378,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3380,"src":"3965:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3377,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3965:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3964:9:18"},"src":"3924:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"3860:126:18"},"returnParameters":{"id":3385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3384,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3415,"src":"4010:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3383,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4010:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4009:9:18"},"scope":4336,"src":"3839:375:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3435,"nodeType":"Block","src":"4744:65:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3433,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3429,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3419,"src":"4782:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},{"id":3430,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3423,"src":"4789:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3428,"name":"processProofCalldata","nodeType":"Identifier","overloadedDeclarations":[3477,3559],"referencedDeclaration":3477,"src":"4761:20:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32[] calldata,bytes32) pure returns (bytes32)"}},"id":3431,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4761:33:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3432,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3421,"src":"4798:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4761:41:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3427,"id":3434,"nodeType":"Return","src":"4754:48:18"}]},"documentation":{"id":3416,"nodeType":"StructuredDocumentation","src":"4220:412:18","text":" @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n defined by `root`. For this, a `proof` must be provided, containing\n sibling hashes on the branch from the leaf to the root of the tree. Each\n pair of leaves and each pair of pre-images are assumed to be sorted.\n This version handles proofs in calldata with the default hashing function."},"id":3436,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCalldata","nameLocation":"4646:14:18","nodeType":"FunctionDefinition","parameters":{"id":3424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3419,"mutability":"mutable","name":"proof","nameLocation":"4680:5:18","nodeType":"VariableDeclaration","scope":3436,"src":"4661:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3417,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4661:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3418,"nodeType":"ArrayTypeName","src":"4661:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3421,"mutability":"mutable","name":"root","nameLocation":"4695:4:18","nodeType":"VariableDeclaration","scope":3436,"src":"4687:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3420,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4687:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3423,"mutability":"mutable","name":"leaf","nameLocation":"4709:4:18","nodeType":"VariableDeclaration","scope":3436,"src":"4701:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3422,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4701:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4660:54:18"},"returnParameters":{"id":3427,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3426,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3436,"src":"4738:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3425,"name":"bool","nodeType":"ElementaryTypeName","src":"4738:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4737:6:18"},"scope":4336,"src":"4637:172:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3476,"nodeType":"Block","src":"5314:216:18","statements":[{"assignments":[3448],"declarations":[{"constant":false,"id":3448,"mutability":"mutable","name":"computedHash","nameLocation":"5332:12:18","nodeType":"VariableDeclaration","scope":3476,"src":"5324:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3447,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5324:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3450,"initialValue":{"id":3449,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3442,"src":"5347:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"5324:27:18"},{"body":{"id":3472,"nodeType":"Block","src":"5404:91:18","statements":[{"expression":{"id":3470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3462,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"5418:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3465,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"5461:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"baseExpression":{"id":3466,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3440,"src":"5475:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":3468,"indexExpression":{"id":3467,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3452,"src":"5481:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5475:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3463,"name":"Hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3263,"src":"5433:6:18","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashes_$3263_$","typeString":"type(library Hashes)"}},"id":3464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5440:20:18","memberName":"commutativeKeccak256","nodeType":"MemberAccess","referencedDeclaration":3250,"src":"5433:27:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":3469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5433:51:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5418:66:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3471,"nodeType":"ExpressionStatement","src":"5418:66:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3455,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3452,"src":"5381:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":3456,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3440,"src":"5385:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":3457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5391:6:18","memberName":"length","nodeType":"MemberAccess","src":"5385:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5381:16:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3473,"initializationExpression":{"assignments":[3452],"declarations":[{"constant":false,"id":3452,"mutability":"mutable","name":"i","nameLocation":"5374:1:18","nodeType":"VariableDeclaration","scope":3473,"src":"5366:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3451,"name":"uint256","nodeType":"ElementaryTypeName","src":"5366:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3454,"initialValue":{"hexValue":"30","id":3453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5378:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"5366:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5399:3:18","subExpression":{"id":3459,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3452,"src":"5399:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3461,"nodeType":"ExpressionStatement","src":"5399:3:18"},"nodeType":"ForStatement","src":"5361:134:18"},{"expression":{"id":3474,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3448,"src":"5511:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3446,"id":3475,"nodeType":"Return","src":"5504:19:18"}]},"documentation":{"id":3437,"nodeType":"StructuredDocumentation","src":"4815:392:18","text":" @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n hash matches the root of the tree. When processing the proof, the pairs\n of leaves & pre-images are assumed to be sorted.\n This version handles proofs in calldata with the default hashing function."},"id":3477,"implemented":true,"kind":"function","modifiers":[],"name":"processProofCalldata","nameLocation":"5221:20:18","nodeType":"FunctionDefinition","parameters":{"id":3443,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3440,"mutability":"mutable","name":"proof","nameLocation":"5261:5:18","nodeType":"VariableDeclaration","scope":3477,"src":"5242:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3438,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5242:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3439,"nodeType":"ArrayTypeName","src":"5242:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3442,"mutability":"mutable","name":"leaf","nameLocation":"5276:4:18","nodeType":"VariableDeclaration","scope":3477,"src":"5268:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3441,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5268:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5241:40:18"},"returnParameters":{"id":3446,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3445,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3477,"src":"5305:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3444,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5305:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5304:9:18"},"scope":4336,"src":"5212:318:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3508,"nodeType":"Block","src":"6153:73:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3501,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3481,"src":"6191:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},{"id":3502,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3485,"src":"6198:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3503,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3495,"src":"6204:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}],"id":3500,"name":"processProofCalldata","nodeType":"Identifier","overloadedDeclarations":[3477,3559],"referencedDeclaration":3559,"src":"6170:20:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_bytes32_$_t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$_$returns$_t_bytes32_$","typeString":"function (bytes32[] calldata,bytes32,function (bytes32,bytes32) view returns (bytes32)) view returns (bytes32)"}},"id":3504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6170:41:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3505,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3483,"src":"6215:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"6170:49:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3499,"id":3507,"nodeType":"Return","src":"6163:56:18"}]},"documentation":{"id":3478,"nodeType":"StructuredDocumentation","src":"5536:409:18","text":" @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n defined by `root`. For this, a `proof` must be provided, containing\n sibling hashes on the branch from the leaf to the root of the tree. Each\n pair of leaves and each pair of pre-images are assumed to be sorted.\n This version handles proofs in calldata with a custom hashing function."},"id":3509,"implemented":true,"kind":"function","modifiers":[],"name":"verifyCalldata","nameLocation":"5959:14:18","nodeType":"FunctionDefinition","parameters":{"id":3496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3481,"mutability":"mutable","name":"proof","nameLocation":"6002:5:18","nodeType":"VariableDeclaration","scope":3509,"src":"5983:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3479,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5983:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3480,"nodeType":"ArrayTypeName","src":"5983:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3483,"mutability":"mutable","name":"root","nameLocation":"6025:4:18","nodeType":"VariableDeclaration","scope":3509,"src":"6017:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3482,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6017:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3485,"mutability":"mutable","name":"leaf","nameLocation":"6047:4:18","nodeType":"VariableDeclaration","scope":3509,"src":"6039:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3484,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6039:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3495,"mutability":"mutable","name":"hasher","nameLocation":"6111:6:18","nodeType":"VariableDeclaration","scope":3509,"src":"6061:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3494,"nodeType":"FunctionTypeName","parameterTypes":{"id":3490,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3487,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3494,"src":"6070:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3486,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6070:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3489,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3494,"src":"6079:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3488,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6079:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6069:18:18"},"returnParameterTypes":{"id":3493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3492,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3494,"src":"6102:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3491,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6102:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6101:9:18"},"src":"6061:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"5973:150:18"},"returnParameters":{"id":3499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3498,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3509,"src":"6147:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3497,"name":"bool","nodeType":"ElementaryTypeName","src":"6147:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6146:6:18"},"scope":4336,"src":"5950:276:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3558,"nodeType":"Block","src":"6816:195:18","statements":[{"assignments":[3531],"declarations":[{"constant":false,"id":3531,"mutability":"mutable","name":"computedHash","nameLocation":"6834:12:18","nodeType":"VariableDeclaration","scope":3558,"src":"6826:20:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3530,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6826:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3533,"initialValue":{"id":3532,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3515,"src":"6849:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"6826:27:18"},{"body":{"id":3554,"nodeType":"Block","src":"6906:70:18","statements":[{"expression":{"id":3552,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":3545,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3531,"src":"6920:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3547,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3531,"src":"6942:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"baseExpression":{"id":3548,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3513,"src":"6956:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":3550,"indexExpression":{"id":3549,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3535,"src":"6962:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6956:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3546,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3525,"src":"6935:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}},"id":3551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6935:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"6920:45:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3553,"nodeType":"ExpressionStatement","src":"6920:45:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3538,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3535,"src":"6883:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":3539,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3513,"src":"6887:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":3540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6893:6:18","memberName":"length","nodeType":"MemberAccess","src":"6887:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6883:16:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3555,"initializationExpression":{"assignments":[3535],"declarations":[{"constant":false,"id":3535,"mutability":"mutable","name":"i","nameLocation":"6876:1:18","nodeType":"VariableDeclaration","scope":3555,"src":"6868:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3534,"name":"uint256","nodeType":"ElementaryTypeName","src":"6868:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3537,"initialValue":{"hexValue":"30","id":3536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6880:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"6868:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"6901:3:18","subExpression":{"id":3542,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3535,"src":"6901:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3544,"nodeType":"ExpressionStatement","src":"6901:3:18"},"nodeType":"ForStatement","src":"6863:113:18"},{"expression":{"id":3556,"name":"computedHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3531,"src":"6992:12:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3529,"id":3557,"nodeType":"Return","src":"6985:19:18"}]},"documentation":{"id":3510,"nodeType":"StructuredDocumentation","src":"6232:389:18","text":" @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\n from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\n hash matches the root of the tree. When processing the proof, the pairs\n of leaves & pre-images are assumed to be sorted.\n This version handles proofs in calldata with a custom hashing function."},"id":3559,"implemented":true,"kind":"function","modifiers":[],"name":"processProofCalldata","nameLocation":"6635:20:18","nodeType":"FunctionDefinition","parameters":{"id":3526,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3513,"mutability":"mutable","name":"proof","nameLocation":"6684:5:18","nodeType":"VariableDeclaration","scope":3559,"src":"6665:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3511,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6665:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3512,"nodeType":"ArrayTypeName","src":"6665:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3515,"mutability":"mutable","name":"leaf","nameLocation":"6707:4:18","nodeType":"VariableDeclaration","scope":3559,"src":"6699:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3514,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6699:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3525,"mutability":"mutable","name":"hasher","nameLocation":"6771:6:18","nodeType":"VariableDeclaration","scope":3559,"src":"6721:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3524,"nodeType":"FunctionTypeName","parameterTypes":{"id":3520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3517,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3524,"src":"6730:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3516,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6730:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3519,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3524,"src":"6739:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3518,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6739:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6729:18:18"},"returnParameterTypes":{"id":3523,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3522,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3524,"src":"6762:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3521,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6762:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6761:9:18"},"src":"6721:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"6655:128:18"},"returnParameters":{"id":3529,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3528,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3559,"src":"6807:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3527,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6807:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6806:9:18"},"scope":4336,"src":"6626:385:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3584,"nodeType":"Block","src":"7797:76:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3577,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3563,"src":"7832:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":3578,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3566,"src":"7839:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},{"id":3579,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3571,"src":"7851:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"},{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}],"id":3576,"name":"processMultiProof","nodeType":"Identifier","overloadedDeclarations":[3743,3947],"referencedDeclaration":3743,"src":"7814:17:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_array$_t_bool_$dyn_memory_ptr_$_t_array$_t_bytes32_$dyn_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes32[] memory,bool[] memory,bytes32[] memory) pure returns (bytes32)"}},"id":3580,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7814:44:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3581,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3568,"src":"7862:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7814:52:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3575,"id":3583,"nodeType":"Return","src":"7807:59:18"}]},"documentation":{"id":3560,"nodeType":"StructuredDocumentation","src":"7017:593:18","text":" @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n This version handles multiproofs in memory with the default hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n The `leaves` must be validated independently. See {processMultiProof}."},"id":3585,"implemented":true,"kind":"function","modifiers":[],"name":"multiProofVerify","nameLocation":"7624:16:18","nodeType":"FunctionDefinition","parameters":{"id":3572,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3563,"mutability":"mutable","name":"proof","nameLocation":"7667:5:18","nodeType":"VariableDeclaration","scope":3585,"src":"7650:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3561,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7650:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3562,"nodeType":"ArrayTypeName","src":"7650:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3566,"mutability":"mutable","name":"proofFlags","nameLocation":"7696:10:18","nodeType":"VariableDeclaration","scope":3585,"src":"7682:24:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3564,"name":"bool","nodeType":"ElementaryTypeName","src":"7682:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3565,"nodeType":"ArrayTypeName","src":"7682:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3568,"mutability":"mutable","name":"root","nameLocation":"7724:4:18","nodeType":"VariableDeclaration","scope":3585,"src":"7716:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3567,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7716:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3571,"mutability":"mutable","name":"leaves","nameLocation":"7755:6:18","nodeType":"VariableDeclaration","scope":3585,"src":"7738:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3569,"name":"bytes32","nodeType":"ElementaryTypeName","src":"7738:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3570,"nodeType":"ArrayTypeName","src":"7738:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"7640:127:18"},"returnParameters":{"id":3575,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3574,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3585,"src":"7791:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3573,"name":"bool","nodeType":"ElementaryTypeName","src":"7791:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7790:6:18"},"scope":4336,"src":"7615:258:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3742,"nodeType":"Block","src":"9159:2104:18","statements":[{"assignments":[3601],"declarations":[{"constant":false,"id":3601,"mutability":"mutable","name":"leavesLen","nameLocation":"9551:9:18","nodeType":"VariableDeclaration","scope":3742,"src":"9543:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3600,"name":"uint256","nodeType":"ElementaryTypeName","src":"9543:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3604,"initialValue":{"expression":{"id":3602,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3595,"src":"9563:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9570:6:18","memberName":"length","nodeType":"MemberAccess","src":"9563:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9543:33:18"},{"assignments":[3606],"declarations":[{"constant":false,"id":3606,"mutability":"mutable","name":"proofFlagsLen","nameLocation":"9594:13:18","nodeType":"VariableDeclaration","scope":3742,"src":"9586:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3605,"name":"uint256","nodeType":"ElementaryTypeName","src":"9586:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3609,"initialValue":{"expression":{"id":3607,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3592,"src":"9610:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},"id":3608,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9621:6:18","memberName":"length","nodeType":"MemberAccess","src":"9610:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9586:41:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3613,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3610,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3601,"src":"9675:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":3611,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3589,"src":"9687:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3612,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9693:6:18","memberName":"length","nodeType":"MemberAccess","src":"9687:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9675:24:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3614,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3606,"src":"9703:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":3615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9719:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"9703:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9675:45:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3622,"nodeType":"IfStatement","src":"9671:113:18","trueBody":{"id":3621,"nodeType":"Block","src":"9722:62:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":3618,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"9743:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":3619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9743:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3620,"nodeType":"RevertStatement","src":"9736:37:18"}]}},{"assignments":[3627],"declarations":[{"constant":false,"id":3627,"mutability":"mutable","name":"hashes","nameLocation":"10045:6:18","nodeType":"VariableDeclaration","scope":3742,"src":"10028:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3625,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10028:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3626,"nodeType":"ArrayTypeName","src":"10028:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":3633,"initialValue":{"arguments":[{"id":3631,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3606,"src":"10068:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3630,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"10054:13:18","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":3628,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10058:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3629,"nodeType":"ArrayTypeName","src":"10058:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":3632,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10054:28:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"10028:54:18"},{"assignments":[3635],"declarations":[{"constant":false,"id":3635,"mutability":"mutable","name":"leafPos","nameLocation":"10100:7:18","nodeType":"VariableDeclaration","scope":3742,"src":"10092:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3634,"name":"uint256","nodeType":"ElementaryTypeName","src":"10092:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3637,"initialValue":{"hexValue":"30","id":3636,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10110:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"10092:19:18"},{"assignments":[3639],"declarations":[{"constant":false,"id":3639,"mutability":"mutable","name":"hashPos","nameLocation":"10129:7:18","nodeType":"VariableDeclaration","scope":3742,"src":"10121:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3638,"name":"uint256","nodeType":"ElementaryTypeName","src":"10121:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3641,"initialValue":{"hexValue":"30","id":3640,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10139:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"10121:19:18"},{"assignments":[3643],"declarations":[{"constant":false,"id":3643,"mutability":"mutable","name":"proofPos","nameLocation":"10158:8:18","nodeType":"VariableDeclaration","scope":3742,"src":"10150:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3642,"name":"uint256","nodeType":"ElementaryTypeName","src":"10150:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3645,"initialValue":{"hexValue":"30","id":3644,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10169:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"10150:20:18"},{"body":{"id":3705,"nodeType":"Block","src":"10590:310:18","statements":[{"assignments":[3657],"declarations":[{"constant":false,"id":3657,"mutability":"mutable","name":"a","nameLocation":"10612:1:18","nodeType":"VariableDeclaration","scope":3705,"src":"10604:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3656,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10604:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3670,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3658,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3635,"src":"10616:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3659,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3601,"src":"10626:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10616:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3665,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3627,"src":"10658:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3668,"indexExpression":{"id":3667,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10665:9:18","subExpression":{"id":3666,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3639,"src":"10665:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10658:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"10616:59:18","trueExpression":{"baseExpression":{"id":3661,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3595,"src":"10638:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3664,"indexExpression":{"id":3663,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10645:9:18","subExpression":{"id":3662,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3635,"src":"10645:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10638:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"10604:71:18"},{"assignments":[3672],"declarations":[{"constant":false,"id":3672,"mutability":"mutable","name":"b","nameLocation":"10697:1:18","nodeType":"VariableDeclaration","scope":3705,"src":"10689:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3671,"name":"bytes32","nodeType":"ElementaryTypeName","src":"10689:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3694,"initialValue":{"condition":{"baseExpression":{"id":3673,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3592,"src":"10701:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},"id":3675,"indexExpression":{"id":3674,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3647,"src":"10712:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10701:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3689,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3589,"src":"10813:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3692,"indexExpression":{"id":3691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10819:10:18","subExpression":{"id":3690,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3643,"src":"10819:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10813:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"10701:129:18","trueExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3678,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3676,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3635,"src":"10734:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3677,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3601,"src":"10744:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10734:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3683,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3627,"src":"10776:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3686,"indexExpression":{"id":3685,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10783:9:18","subExpression":{"id":3684,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3639,"src":"10783:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10776:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"10734:59:18","trueExpression":{"baseExpression":{"id":3679,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3595,"src":"10756:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3682,"indexExpression":{"id":3681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10763:9:18","subExpression":{"id":3680,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3635,"src":"10763:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10756:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":3688,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"10733:61:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"10689:141:18"},{"expression":{"id":3703,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":3695,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3627,"src":"10844:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3697,"indexExpression":{"id":3696,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3647,"src":"10851:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10844:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3700,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3657,"src":"10884:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3701,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3672,"src":"10887:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":3698,"name":"Hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3263,"src":"10856:6:18","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashes_$3263_$","typeString":"type(library Hashes)"}},"id":3699,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10863:20:18","memberName":"commutativeKeccak256","nodeType":"MemberAccess","referencedDeclaration":3250,"src":"10856:27:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":3702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10856:33:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"10844:45:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3704,"nodeType":"ExpressionStatement","src":"10844:45:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3650,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3647,"src":"10566:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3651,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3606,"src":"10570:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10566:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3706,"initializationExpression":{"assignments":[3647],"declarations":[{"constant":false,"id":3647,"mutability":"mutable","name":"i","nameLocation":"10559:1:18","nodeType":"VariableDeclaration","scope":3706,"src":"10551:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3646,"name":"uint256","nodeType":"ElementaryTypeName","src":"10551:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3649,"initialValue":{"hexValue":"30","id":3648,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10563:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"10551:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10585:3:18","subExpression":{"id":3653,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3647,"src":"10585:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3655,"nodeType":"ExpressionStatement","src":"10585:3:18"},"nodeType":"ForStatement","src":"10546:354:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3707,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3606,"src":"10914:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3708,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10930:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10914:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3729,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3727,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3601,"src":"11155:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3728,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11167:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11155:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":3739,"nodeType":"Block","src":"11217:40:18","statements":[{"expression":{"baseExpression":{"id":3735,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3589,"src":"11238:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3737,"indexExpression":{"hexValue":"30","id":3736,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11244:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11238:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3599,"id":3738,"nodeType":"Return","src":"11231:15:18"}]},"id":3740,"nodeType":"IfStatement","src":"11151:106:18","trueBody":{"id":3734,"nodeType":"Block","src":"11170:41:18","statements":[{"expression":{"baseExpression":{"id":3730,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3595,"src":"11191:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3732,"indexExpression":{"hexValue":"30","id":3731,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11198:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11191:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3599,"id":3733,"nodeType":"Return","src":"11184:16:18"}]}},"id":3741,"nodeType":"IfStatement","src":"10910:347:18","trueBody":{"id":3726,"nodeType":"Block","src":"10933:212:18","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3710,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3643,"src":"10951:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":3711,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3589,"src":"10963:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10969:6:18","memberName":"length","nodeType":"MemberAccess","src":"10963:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10951:24:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3718,"nodeType":"IfStatement","src":"10947:100:18","trueBody":{"id":3717,"nodeType":"Block","src":"10977:70:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":3714,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"11002:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":3715,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11002:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3716,"nodeType":"RevertStatement","src":"10995:37:18"}]}},{"id":3725,"nodeType":"UncheckedBlock","src":"11060:75:18","statements":[{"expression":{"baseExpression":{"id":3719,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3627,"src":"11095:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3723,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3720,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3606,"src":"11102:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":3721,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11118:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"11102:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11095:25:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3599,"id":3724,"nodeType":"Return","src":"11088:32:18"}]}]}}]},"documentation":{"id":3586,"nodeType":"StructuredDocumentation","src":"7879:1100:18","text":" @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n respectively.\n This version handles multiproofs in memory with the default hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n validating the leaves elsewhere."},"id":3743,"implemented":true,"kind":"function","modifiers":[],"name":"processMultiProof","nameLocation":"8993:17:18","nodeType":"FunctionDefinition","parameters":{"id":3596,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3589,"mutability":"mutable","name":"proof","nameLocation":"9037:5:18","nodeType":"VariableDeclaration","scope":3743,"src":"9020:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3587,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9020:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3588,"nodeType":"ArrayTypeName","src":"9020:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3592,"mutability":"mutable","name":"proofFlags","nameLocation":"9066:10:18","nodeType":"VariableDeclaration","scope":3743,"src":"9052:24:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3590,"name":"bool","nodeType":"ElementaryTypeName","src":"9052:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3591,"nodeType":"ArrayTypeName","src":"9052:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3595,"mutability":"mutable","name":"leaves","nameLocation":"9103:6:18","nodeType":"VariableDeclaration","scope":3743,"src":"9086:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3593,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9086:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3594,"nodeType":"ArrayTypeName","src":"9086:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"9010:105:18"},"returnParameters":{"id":3599,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3598,"mutability":"mutable","name":"merkleRoot","nameLocation":"9147:10:18","nodeType":"VariableDeclaration","scope":3743,"src":"9139:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3597,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9139:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"9138:20:18"},"scope":4336,"src":"8984:2279:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":3779,"nodeType":"Block","src":"12112:84:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3771,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3747,"src":"12147:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":3772,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3750,"src":"12154:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},{"id":3773,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3755,"src":"12166:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":3774,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3765,"src":"12174:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"},{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}],"id":3770,"name":"processMultiProof","nodeType":"Identifier","overloadedDeclarations":[3743,3947],"referencedDeclaration":3947,"src":"12129:17:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_array$_t_bool_$dyn_memory_ptr_$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$_$returns$_t_bytes32_$","typeString":"function (bytes32[] memory,bool[] memory,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32)) view returns (bytes32)"}},"id":3775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12129:52:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3776,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3752,"src":"12185:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"12129:60:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3769,"id":3778,"nodeType":"Return","src":"12122:67:18"}]},"documentation":{"id":3744,"nodeType":"StructuredDocumentation","src":"11269:590:18","text":" @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n This version handles multiproofs in memory with a custom hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n The `leaves` must be validated independently. See {processMultiProof}."},"id":3780,"implemented":true,"kind":"function","modifiers":[],"name":"multiProofVerify","nameLocation":"11873:16:18","nodeType":"FunctionDefinition","parameters":{"id":3766,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3747,"mutability":"mutable","name":"proof","nameLocation":"11916:5:18","nodeType":"VariableDeclaration","scope":3780,"src":"11899:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3745,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11899:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3746,"nodeType":"ArrayTypeName","src":"11899:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3750,"mutability":"mutable","name":"proofFlags","nameLocation":"11945:10:18","nodeType":"VariableDeclaration","scope":3780,"src":"11931:24:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3748,"name":"bool","nodeType":"ElementaryTypeName","src":"11931:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3749,"nodeType":"ArrayTypeName","src":"11931:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3752,"mutability":"mutable","name":"root","nameLocation":"11973:4:18","nodeType":"VariableDeclaration","scope":3780,"src":"11965:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3751,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11965:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3755,"mutability":"mutable","name":"leaves","nameLocation":"12004:6:18","nodeType":"VariableDeclaration","scope":3780,"src":"11987:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3753,"name":"bytes32","nodeType":"ElementaryTypeName","src":"11987:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3754,"nodeType":"ArrayTypeName","src":"11987:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3765,"mutability":"mutable","name":"hasher","nameLocation":"12070:6:18","nodeType":"VariableDeclaration","scope":3780,"src":"12020:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3764,"nodeType":"FunctionTypeName","parameterTypes":{"id":3760,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3757,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3764,"src":"12029:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3756,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12029:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3759,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3764,"src":"12038:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3758,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12038:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"12028:18:18"},"returnParameterTypes":{"id":3763,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3762,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3764,"src":"12061:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3761,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12061:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"12060:9:18"},"src":"12020:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"11889:193:18"},"returnParameters":{"id":3769,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3768,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3780,"src":"12106:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3767,"name":"bool","nodeType":"ElementaryTypeName","src":"12106:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"12105:6:18"},"scope":4336,"src":"11864:332:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3946,"nodeType":"Block","src":"13545:2083:18","statements":[{"assignments":[3806],"declarations":[{"constant":false,"id":3806,"mutability":"mutable","name":"leavesLen","nameLocation":"13937:9:18","nodeType":"VariableDeclaration","scope":3946,"src":"13929:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3805,"name":"uint256","nodeType":"ElementaryTypeName","src":"13929:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3809,"initialValue":{"expression":{"id":3807,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3790,"src":"13949:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13956:6:18","memberName":"length","nodeType":"MemberAccess","src":"13949:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13929:33:18"},{"assignments":[3811],"declarations":[{"constant":false,"id":3811,"mutability":"mutable","name":"proofFlagsLen","nameLocation":"13980:13:18","nodeType":"VariableDeclaration","scope":3946,"src":"13972:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3810,"name":"uint256","nodeType":"ElementaryTypeName","src":"13972:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3814,"initialValue":{"expression":{"id":3812,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3787,"src":"13996:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},"id":3813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14007:6:18","memberName":"length","nodeType":"MemberAccess","src":"13996:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13972:41:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3818,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3815,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3806,"src":"14061:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":3816,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3784,"src":"14073:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3817,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14079:6:18","memberName":"length","nodeType":"MemberAccess","src":"14073:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14061:24:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3819,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3811,"src":"14089:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":3820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14105:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"14089:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14061:45:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3827,"nodeType":"IfStatement","src":"14057:113:18","trueBody":{"id":3826,"nodeType":"Block","src":"14108:62:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":3823,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"14129:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":3824,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14129:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3825,"nodeType":"RevertStatement","src":"14122:37:18"}]}},{"assignments":[3832],"declarations":[{"constant":false,"id":3832,"mutability":"mutable","name":"hashes","nameLocation":"14431:6:18","nodeType":"VariableDeclaration","scope":3946,"src":"14414:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3830,"name":"bytes32","nodeType":"ElementaryTypeName","src":"14414:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3831,"nodeType":"ArrayTypeName","src":"14414:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":3838,"initialValue":{"arguments":[{"id":3836,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3811,"src":"14454:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":3835,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"14440:13:18","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":3833,"name":"bytes32","nodeType":"ElementaryTypeName","src":"14444:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3834,"nodeType":"ArrayTypeName","src":"14444:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":3837,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14440:28:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"14414:54:18"},{"assignments":[3840],"declarations":[{"constant":false,"id":3840,"mutability":"mutable","name":"leafPos","nameLocation":"14486:7:18","nodeType":"VariableDeclaration","scope":3946,"src":"14478:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3839,"name":"uint256","nodeType":"ElementaryTypeName","src":"14478:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3842,"initialValue":{"hexValue":"30","id":3841,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14496:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"14478:19:18"},{"assignments":[3844],"declarations":[{"constant":false,"id":3844,"mutability":"mutable","name":"hashPos","nameLocation":"14515:7:18","nodeType":"VariableDeclaration","scope":3946,"src":"14507:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3843,"name":"uint256","nodeType":"ElementaryTypeName","src":"14507:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3846,"initialValue":{"hexValue":"30","id":3845,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14525:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"14507:19:18"},{"assignments":[3848],"declarations":[{"constant":false,"id":3848,"mutability":"mutable","name":"proofPos","nameLocation":"14544:8:18","nodeType":"VariableDeclaration","scope":3946,"src":"14536:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3847,"name":"uint256","nodeType":"ElementaryTypeName","src":"14536:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3850,"initialValue":{"hexValue":"30","id":3849,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14555:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"14536:20:18"},{"body":{"id":3909,"nodeType":"Block","src":"14976:289:18","statements":[{"assignments":[3862],"declarations":[{"constant":false,"id":3862,"mutability":"mutable","name":"a","nameLocation":"14998:1:18","nodeType":"VariableDeclaration","scope":3909,"src":"14990:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3861,"name":"bytes32","nodeType":"ElementaryTypeName","src":"14990:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3875,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3863,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3840,"src":"15002:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3864,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3806,"src":"15012:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15002:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3870,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3832,"src":"15044:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3873,"indexExpression":{"id":3872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"15051:9:18","subExpression":{"id":3871,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3844,"src":"15051:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15044:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"15002:59:18","trueExpression":{"baseExpression":{"id":3866,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3790,"src":"15024:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3869,"indexExpression":{"id":3868,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"15031:9:18","subExpression":{"id":3867,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3840,"src":"15031:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15024:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"14990:71:18"},{"assignments":[3877],"declarations":[{"constant":false,"id":3877,"mutability":"mutable","name":"b","nameLocation":"15083:1:18","nodeType":"VariableDeclaration","scope":3909,"src":"15075:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3876,"name":"bytes32","nodeType":"ElementaryTypeName","src":"15075:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":3899,"initialValue":{"condition":{"baseExpression":{"id":3878,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3787,"src":"15087:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[] memory"}},"id":3880,"indexExpression":{"id":3879,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3852,"src":"15098:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15087:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3894,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3784,"src":"15199:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3897,"indexExpression":{"id":3896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"15205:10:18","subExpression":{"id":3895,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3848,"src":"15205:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15199:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"15087:129:18","trueExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3883,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3881,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3840,"src":"15120:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3882,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3806,"src":"15130:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15120:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":3888,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3832,"src":"15162:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3891,"indexExpression":{"id":3890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"15169:9:18","subExpression":{"id":3889,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3844,"src":"15169:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15162:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"15120:59:18","trueExpression":{"baseExpression":{"id":3884,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3790,"src":"15142:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3887,"indexExpression":{"id":3886,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"15149:9:18","subExpression":{"id":3885,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3840,"src":"15149:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15142:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":3893,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"15119:61:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"15075:141:18"},{"expression":{"id":3907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":3900,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3832,"src":"15230:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3902,"indexExpression":{"id":3901,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3852,"src":"15237:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"15230:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":3904,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3862,"src":"15249:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":3905,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3877,"src":"15252:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":3903,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3800,"src":"15242:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}},"id":3906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15242:12:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"15230:24:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3908,"nodeType":"ExpressionStatement","src":"15230:24:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3855,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3852,"src":"14952:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":3856,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3811,"src":"14956:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14952:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3910,"initializationExpression":{"assignments":[3852],"declarations":[{"constant":false,"id":3852,"mutability":"mutable","name":"i","nameLocation":"14945:1:18","nodeType":"VariableDeclaration","scope":3910,"src":"14937:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3851,"name":"uint256","nodeType":"ElementaryTypeName","src":"14937:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3854,"initialValue":{"hexValue":"30","id":3853,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14949:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"14937:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":3859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"14971:3:18","subExpression":{"id":3858,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3852,"src":"14971:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":3860,"nodeType":"ExpressionStatement","src":"14971:3:18"},"nodeType":"ForStatement","src":"14932:333:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3911,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3811,"src":"15279:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3912,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15295:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15279:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3931,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3806,"src":"15520:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":3932,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15532:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15520:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":3943,"nodeType":"Block","src":"15582:40:18","statements":[{"expression":{"baseExpression":{"id":3939,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3784,"src":"15603:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3941,"indexExpression":{"hexValue":"30","id":3940,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15609:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15603:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3804,"id":3942,"nodeType":"Return","src":"15596:15:18"}]},"id":3944,"nodeType":"IfStatement","src":"15516:106:18","trueBody":{"id":3938,"nodeType":"Block","src":"15535:41:18","statements":[{"expression":{"baseExpression":{"id":3934,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3790,"src":"15556:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3936,"indexExpression":{"hexValue":"30","id":3935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15563:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15556:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3804,"id":3937,"nodeType":"Return","src":"15549:16:18"}]}},"id":3945,"nodeType":"IfStatement","src":"15275:347:18","trueBody":{"id":3930,"nodeType":"Block","src":"15298:212:18","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3914,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3848,"src":"15316:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":3915,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3784,"src":"15328:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3916,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15334:6:18","memberName":"length","nodeType":"MemberAccess","src":"15328:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15316:24:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3922,"nodeType":"IfStatement","src":"15312:100:18","trueBody":{"id":3921,"nodeType":"Block","src":"15342:70:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":3918,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"15367:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":3919,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15367:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":3920,"nodeType":"RevertStatement","src":"15360:37:18"}]}},{"id":3929,"nodeType":"UncheckedBlock","src":"15425:75:18","statements":[{"expression":{"baseExpression":{"id":3923,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3832,"src":"15460:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3927,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":3926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3924,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3811,"src":"15467:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":3925,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15483:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"15467:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15460:25:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3804,"id":3928,"nodeType":"Return","src":"15453:32:18"}]}]}}]},"documentation":{"id":3781,"nodeType":"StructuredDocumentation","src":"12202:1097:18","text":" @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n respectively.\n This version handles multiproofs in memory with a custom hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n validating the leaves elsewhere."},"id":3947,"implemented":true,"kind":"function","modifiers":[],"name":"processMultiProof","nameLocation":"13313:17:18","nodeType":"FunctionDefinition","parameters":{"id":3801,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3784,"mutability":"mutable","name":"proof","nameLocation":"13357:5:18","nodeType":"VariableDeclaration","scope":3947,"src":"13340:22:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3782,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13340:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3783,"nodeType":"ArrayTypeName","src":"13340:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3787,"mutability":"mutable","name":"proofFlags","nameLocation":"13386:10:18","nodeType":"VariableDeclaration","scope":3947,"src":"13372:24:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_memory_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3785,"name":"bool","nodeType":"ElementaryTypeName","src":"13372:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3786,"nodeType":"ArrayTypeName","src":"13372:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3790,"mutability":"mutable","name":"leaves","nameLocation":"13423:6:18","nodeType":"VariableDeclaration","scope":3947,"src":"13406:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3788,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13406:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3789,"nodeType":"ArrayTypeName","src":"13406:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3800,"mutability":"mutable","name":"hasher","nameLocation":"13489:6:18","nodeType":"VariableDeclaration","scope":3947,"src":"13439:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":3799,"nodeType":"FunctionTypeName","parameterTypes":{"id":3795,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3792,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3799,"src":"13448:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3791,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13448:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3794,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3799,"src":"13457:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3793,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13457:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"13447:18:18"},"returnParameterTypes":{"id":3798,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3797,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3799,"src":"13480:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3796,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13480:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"13479:9:18"},"src":"13439:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"13330:171:18"},"returnParameters":{"id":3804,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3803,"mutability":"mutable","name":"merkleRoot","nameLocation":"13533:10:18","nodeType":"VariableDeclaration","scope":3947,"src":"13525:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3802,"name":"bytes32","nodeType":"ElementaryTypeName","src":"13525:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"13524:20:18"},"scope":4336,"src":"13304:2324:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":3972,"nodeType":"Block","src":"16436:84:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":3970,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":3965,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3951,"src":"16479:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},{"id":3966,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3954,"src":"16486:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},{"id":3967,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3959,"src":"16498:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"},{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"},{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}],"id":3964,"name":"processMultiProofCalldata","nodeType":"Identifier","overloadedDeclarations":[4131,4335],"referencedDeclaration":4131,"src":"16453:25:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_array$_t_bool_$dyn_calldata_ptr_$_t_array$_t_bytes32_$dyn_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes32[] calldata,bool[] calldata,bytes32[] memory) pure returns (bytes32)"}},"id":3968,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16453:52:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":3969,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3956,"src":"16509:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"16453:60:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":3963,"id":3971,"nodeType":"Return","src":"16446:67:18"}]},"documentation":{"id":3948,"nodeType":"StructuredDocumentation","src":"15634:603:18","text":" @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n This version handles multiproofs in calldata with the default hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n The `leaves` must be validated independently. See {processMultiProofCalldata}."},"id":3973,"implemented":true,"kind":"function","modifiers":[],"name":"multiProofVerifyCalldata","nameLocation":"16251:24:18","nodeType":"FunctionDefinition","parameters":{"id":3960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3951,"mutability":"mutable","name":"proof","nameLocation":"16304:5:18","nodeType":"VariableDeclaration","scope":3973,"src":"16285:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3949,"name":"bytes32","nodeType":"ElementaryTypeName","src":"16285:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3950,"nodeType":"ArrayTypeName","src":"16285:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3954,"mutability":"mutable","name":"proofFlags","nameLocation":"16335:10:18","nodeType":"VariableDeclaration","scope":3973,"src":"16319:26:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3952,"name":"bool","nodeType":"ElementaryTypeName","src":"16319:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3953,"nodeType":"ArrayTypeName","src":"16319:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3956,"mutability":"mutable","name":"root","nameLocation":"16363:4:18","nodeType":"VariableDeclaration","scope":3973,"src":"16355:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3955,"name":"bytes32","nodeType":"ElementaryTypeName","src":"16355:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":3959,"mutability":"mutable","name":"leaves","nameLocation":"16394:6:18","nodeType":"VariableDeclaration","scope":3973,"src":"16377:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3957,"name":"bytes32","nodeType":"ElementaryTypeName","src":"16377:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3958,"nodeType":"ArrayTypeName","src":"16377:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"16275:131:18"},"returnParameters":{"id":3963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3962,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":3973,"src":"16430:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":3961,"name":"bool","nodeType":"ElementaryTypeName","src":"16430:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"16429:6:18"},"scope":4336,"src":"16242:278:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4130,"nodeType":"Block","src":"17820:2104:18","statements":[{"assignments":[3989],"declarations":[{"constant":false,"id":3989,"mutability":"mutable","name":"leavesLen","nameLocation":"18212:9:18","nodeType":"VariableDeclaration","scope":4130,"src":"18204:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3988,"name":"uint256","nodeType":"ElementaryTypeName","src":"18204:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3992,"initialValue":{"expression":{"id":3990,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3983,"src":"18224:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":3991,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"18231:6:18","memberName":"length","nodeType":"MemberAccess","src":"18224:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18204:33:18"},{"assignments":[3994],"declarations":[{"constant":false,"id":3994,"mutability":"mutable","name":"proofFlagsLen","nameLocation":"18255:13:18","nodeType":"VariableDeclaration","scope":4130,"src":"18247:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3993,"name":"uint256","nodeType":"ElementaryTypeName","src":"18247:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":3997,"initialValue":{"expression":{"id":3995,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3980,"src":"18271:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},"id":3996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"18282:6:18","memberName":"length","nodeType":"MemberAccess","src":"18271:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18247:41:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":3998,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3989,"src":"18336:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":3999,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3977,"src":"18348:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4000,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"18354:6:18","memberName":"length","nodeType":"MemberAccess","src":"18348:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18336:24:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4004,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4002,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"18364:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":4003,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18380:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"18364:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18336:45:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4010,"nodeType":"IfStatement","src":"18332:113:18","trueBody":{"id":4009,"nodeType":"Block","src":"18383:62:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":4006,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"18404:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":4007,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18404:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":4008,"nodeType":"RevertStatement","src":"18397:37:18"}]}},{"assignments":[4015],"declarations":[{"constant":false,"id":4015,"mutability":"mutable","name":"hashes","nameLocation":"18706:6:18","nodeType":"VariableDeclaration","scope":4130,"src":"18689:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4013,"name":"bytes32","nodeType":"ElementaryTypeName","src":"18689:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4014,"nodeType":"ArrayTypeName","src":"18689:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":4021,"initialValue":{"arguments":[{"id":4019,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"18729:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4018,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"18715:13:18","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":4016,"name":"bytes32","nodeType":"ElementaryTypeName","src":"18719:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4017,"nodeType":"ArrayTypeName","src":"18719:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":4020,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18715:28:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"18689:54:18"},{"assignments":[4023],"declarations":[{"constant":false,"id":4023,"mutability":"mutable","name":"leafPos","nameLocation":"18761:7:18","nodeType":"VariableDeclaration","scope":4130,"src":"18753:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4022,"name":"uint256","nodeType":"ElementaryTypeName","src":"18753:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4025,"initialValue":{"hexValue":"30","id":4024,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18771:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"18753:19:18"},{"assignments":[4027],"declarations":[{"constant":false,"id":4027,"mutability":"mutable","name":"hashPos","nameLocation":"18790:7:18","nodeType":"VariableDeclaration","scope":4130,"src":"18782:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4026,"name":"uint256","nodeType":"ElementaryTypeName","src":"18782:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4029,"initialValue":{"hexValue":"30","id":4028,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18800:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"18782:19:18"},{"assignments":[4031],"declarations":[{"constant":false,"id":4031,"mutability":"mutable","name":"proofPos","nameLocation":"18819:8:18","nodeType":"VariableDeclaration","scope":4130,"src":"18811:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4030,"name":"uint256","nodeType":"ElementaryTypeName","src":"18811:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4033,"initialValue":{"hexValue":"30","id":4032,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18830:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"18811:20:18"},{"body":{"id":4093,"nodeType":"Block","src":"19251:310:18","statements":[{"assignments":[4045],"declarations":[{"constant":false,"id":4045,"mutability":"mutable","name":"a","nameLocation":"19273:1:18","nodeType":"VariableDeclaration","scope":4093,"src":"19265:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4044,"name":"bytes32","nodeType":"ElementaryTypeName","src":"19265:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":4058,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4048,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4046,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4023,"src":"19277:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4047,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3989,"src":"19287:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19277:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4053,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4015,"src":"19319:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4056,"indexExpression":{"id":4055,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19326:9:18","subExpression":{"id":4054,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"19326:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19319:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"19277:59:18","trueExpression":{"baseExpression":{"id":4049,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3983,"src":"19299:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4052,"indexExpression":{"id":4051,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19306:9:18","subExpression":{"id":4050,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4023,"src":"19306:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19299:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"19265:71:18"},{"assignments":[4060],"declarations":[{"constant":false,"id":4060,"mutability":"mutable","name":"b","nameLocation":"19358:1:18","nodeType":"VariableDeclaration","scope":4093,"src":"19350:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4059,"name":"bytes32","nodeType":"ElementaryTypeName","src":"19350:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":4082,"initialValue":{"condition":{"baseExpression":{"id":4061,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3980,"src":"19362:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},"id":4063,"indexExpression":{"id":4062,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4035,"src":"19373:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19362:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4077,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3977,"src":"19474:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4080,"indexExpression":{"id":4079,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19480:10:18","subExpression":{"id":4078,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"19480:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19474:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4081,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"19362:129:18","trueExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4064,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4023,"src":"19395:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4065,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3989,"src":"19405:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19395:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4071,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4015,"src":"19437:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4074,"indexExpression":{"id":4073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19444:9:18","subExpression":{"id":4072,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4027,"src":"19444:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19437:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4075,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"19395:59:18","trueExpression":{"baseExpression":{"id":4067,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3983,"src":"19417:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4070,"indexExpression":{"id":4069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19424:9:18","subExpression":{"id":4068,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4023,"src":"19424:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19417:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":4076,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"19394:61:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"19350:141:18"},{"expression":{"id":4091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4083,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4015,"src":"19505:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4085,"indexExpression":{"id":4084,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4035,"src":"19512:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"19505:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4088,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4045,"src":"19545:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":4089,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4060,"src":"19548:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":4086,"name":"Hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3263,"src":"19517:6:18","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Hashes_$3263_$","typeString":"type(library Hashes)"}},"id":4087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19524:20:18","memberName":"commutativeKeccak256","nodeType":"MemberAccess","referencedDeclaration":3250,"src":"19517:27:18","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) pure returns (bytes32)"}},"id":4090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19517:33:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"19505:45:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4092,"nodeType":"ExpressionStatement","src":"19505:45:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4038,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4035,"src":"19227:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4039,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"19231:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19227:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4094,"initializationExpression":{"assignments":[4035],"declarations":[{"constant":false,"id":4035,"mutability":"mutable","name":"i","nameLocation":"19220:1:18","nodeType":"VariableDeclaration","scope":4094,"src":"19212:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4034,"name":"uint256","nodeType":"ElementaryTypeName","src":"19212:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4037,"initialValue":{"hexValue":"30","id":4036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19224:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"19212:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":4042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"19246:3:18","subExpression":{"id":4041,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4035,"src":"19246:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4043,"nodeType":"ExpressionStatement","src":"19246:3:18"},"nodeType":"ForStatement","src":"19207:354:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4095,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"19575:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4096,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19591:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"19575:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4115,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3989,"src":"19816:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4116,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19828:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"19816:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":4127,"nodeType":"Block","src":"19878:40:18","statements":[{"expression":{"baseExpression":{"id":4123,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3977,"src":"19899:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4125,"indexExpression":{"hexValue":"30","id":4124,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19905:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19899:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3987,"id":4126,"nodeType":"Return","src":"19892:15:18"}]},"id":4128,"nodeType":"IfStatement","src":"19812:106:18","trueBody":{"id":4122,"nodeType":"Block","src":"19831:41:18","statements":[{"expression":{"baseExpression":{"id":4118,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3983,"src":"19852:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4120,"indexExpression":{"hexValue":"30","id":4119,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19859:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19852:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3987,"id":4121,"nodeType":"Return","src":"19845:16:18"}]}},"id":4129,"nodeType":"IfStatement","src":"19571:347:18","trueBody":{"id":4114,"nodeType":"Block","src":"19594:212:18","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4098,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4031,"src":"19612:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":4099,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3977,"src":"19624:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19630:6:18","memberName":"length","nodeType":"MemberAccess","src":"19624:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19612:24:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4106,"nodeType":"IfStatement","src":"19608:100:18","trueBody":{"id":4105,"nodeType":"Block","src":"19638:70:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":4102,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"19663:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":4103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19663:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":4104,"nodeType":"RevertStatement","src":"19656:37:18"}]}},{"id":4113,"nodeType":"UncheckedBlock","src":"19721:75:18","statements":[{"expression":{"baseExpression":{"id":4107,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4015,"src":"19756:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4111,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4110,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4108,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3994,"src":"19763:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":4109,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19779:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"19763:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"19756:25:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":3987,"id":4112,"nodeType":"Return","src":"19749:32:18"}]}]}}]},"documentation":{"id":3974,"nodeType":"StructuredDocumentation","src":"16526:1102:18","text":" @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n respectively.\n This version handles multiproofs in calldata with the default hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n validating the leaves elsewhere."},"id":4131,"implemented":true,"kind":"function","modifiers":[],"name":"processMultiProofCalldata","nameLocation":"17642:25:18","nodeType":"FunctionDefinition","parameters":{"id":3984,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3977,"mutability":"mutable","name":"proof","nameLocation":"17696:5:18","nodeType":"VariableDeclaration","scope":4131,"src":"17677:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3975,"name":"bytes32","nodeType":"ElementaryTypeName","src":"17677:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3976,"nodeType":"ArrayTypeName","src":"17677:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":3980,"mutability":"mutable","name":"proofFlags","nameLocation":"17727:10:18","nodeType":"VariableDeclaration","scope":4131,"src":"17711:26:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":3978,"name":"bool","nodeType":"ElementaryTypeName","src":"17711:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":3979,"nodeType":"ArrayTypeName","src":"17711:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":3983,"mutability":"mutable","name":"leaves","nameLocation":"17764:6:18","nodeType":"VariableDeclaration","scope":4131,"src":"17747:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":3981,"name":"bytes32","nodeType":"ElementaryTypeName","src":"17747:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":3982,"nodeType":"ArrayTypeName","src":"17747:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"17667:109:18"},"returnParameters":{"id":3987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3986,"mutability":"mutable","name":"merkleRoot","nameLocation":"17808:10:18","nodeType":"VariableDeclaration","scope":4131,"src":"17800:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":3985,"name":"bytes32","nodeType":"ElementaryTypeName","src":"17800:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"17799:20:18"},"scope":4336,"src":"17633:2291:18","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4167,"nodeType":"Block","src":"20795:92:18","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":4165,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4159,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4135,"src":"20838:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},{"id":4160,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4138,"src":"20845:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},{"id":4161,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4143,"src":"20857:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},{"id":4162,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4153,"src":"20865:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"},{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"},{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"},{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}],"id":4158,"name":"processMultiProofCalldata","nodeType":"Identifier","overloadedDeclarations":[4131,4335],"referencedDeclaration":4335,"src":"20812:25:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_array$_t_bool_$dyn_calldata_ptr_$_t_array$_t_bytes32_$dyn_memory_ptr_$_t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$_$returns$_t_bytes32_$","typeString":"function (bytes32[] calldata,bool[] calldata,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32)) view returns (bytes32)"}},"id":4163,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20812:60:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":4164,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4140,"src":"20876:4:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"20812:68:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":4157,"id":4166,"nodeType":"Return","src":"20805:75:18"}]},"documentation":{"id":4132,"nodeType":"StructuredDocumentation","src":"19930:600:18","text":" @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\n `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\n This version handles multiproofs in calldata with a custom hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\n NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\n The `leaves` must be validated independently. See {processMultiProofCalldata}."},"id":4168,"implemented":true,"kind":"function","modifiers":[],"name":"multiProofVerifyCalldata","nameLocation":"20544:24:18","nodeType":"FunctionDefinition","parameters":{"id":4154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4135,"mutability":"mutable","name":"proof","nameLocation":"20597:5:18","nodeType":"VariableDeclaration","scope":4168,"src":"20578:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4133,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20578:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4134,"nodeType":"ArrayTypeName","src":"20578:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":4138,"mutability":"mutable","name":"proofFlags","nameLocation":"20628:10:18","nodeType":"VariableDeclaration","scope":4168,"src":"20612:26:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":4136,"name":"bool","nodeType":"ElementaryTypeName","src":"20612:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4137,"nodeType":"ArrayTypeName","src":"20612:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":4140,"mutability":"mutable","name":"root","nameLocation":"20656:4:18","nodeType":"VariableDeclaration","scope":4168,"src":"20648:12:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4139,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20648:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4143,"mutability":"mutable","name":"leaves","nameLocation":"20687:6:18","nodeType":"VariableDeclaration","scope":4168,"src":"20670:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4141,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20670:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4142,"nodeType":"ArrayTypeName","src":"20670:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":4153,"mutability":"mutable","name":"hasher","nameLocation":"20753:6:18","nodeType":"VariableDeclaration","scope":4168,"src":"20703:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":4152,"nodeType":"FunctionTypeName","parameterTypes":{"id":4148,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4145,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4152,"src":"20712:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4144,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20712:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4147,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4152,"src":"20721:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4146,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20721:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"20711:18:18"},"returnParameterTypes":{"id":4151,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4150,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4152,"src":"20744:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4149,"name":"bytes32","nodeType":"ElementaryTypeName","src":"20744:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"20743:9:18"},"src":"20703:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"20568:197:18"},"returnParameters":{"id":4157,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4156,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4168,"src":"20789:4:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4155,"name":"bool","nodeType":"ElementaryTypeName","src":"20789:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"20788:6:18"},"scope":4336,"src":"20535:352:18","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":4334,"nodeType":"Block","src":"22250:2083:18","statements":[{"assignments":[4194],"declarations":[{"constant":false,"id":4194,"mutability":"mutable","name":"leavesLen","nameLocation":"22642:9:18","nodeType":"VariableDeclaration","scope":4334,"src":"22634:17:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4193,"name":"uint256","nodeType":"ElementaryTypeName","src":"22634:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4197,"initialValue":{"expression":{"id":4195,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4178,"src":"22654:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4196,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22661:6:18","memberName":"length","nodeType":"MemberAccess","src":"22654:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22634:33:18"},{"assignments":[4199],"declarations":[{"constant":false,"id":4199,"mutability":"mutable","name":"proofFlagsLen","nameLocation":"22685:13:18","nodeType":"VariableDeclaration","scope":4334,"src":"22677:21:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4198,"name":"uint256","nodeType":"ElementaryTypeName","src":"22677:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4202,"initialValue":{"expression":{"id":4200,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4175,"src":"22701:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},"id":4201,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22712:6:18","memberName":"length","nodeType":"MemberAccess","src":"22701:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22677:41:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4203,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4194,"src":"22766:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":4204,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4172,"src":"22778:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22784:6:18","memberName":"length","nodeType":"MemberAccess","src":"22778:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22766:24:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4207,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4199,"src":"22794:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":4208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22810:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"22794:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22766:45:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4215,"nodeType":"IfStatement","src":"22762:113:18","trueBody":{"id":4214,"nodeType":"Block","src":"22813:62:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":4211,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"22834:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":4212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22834:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":4213,"nodeType":"RevertStatement","src":"22827:37:18"}]}},{"assignments":[4220],"declarations":[{"constant":false,"id":4220,"mutability":"mutable","name":"hashes","nameLocation":"23136:6:18","nodeType":"VariableDeclaration","scope":4334,"src":"23119:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4218,"name":"bytes32","nodeType":"ElementaryTypeName","src":"23119:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4219,"nodeType":"ArrayTypeName","src":"23119:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"id":4226,"initialValue":{"arguments":[{"id":4224,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4199,"src":"23159:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4223,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"23145:13:18","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes32_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes32[] memory)"},"typeName":{"baseType":{"id":4221,"name":"bytes32","nodeType":"ElementaryTypeName","src":"23149:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4222,"nodeType":"ArrayTypeName","src":"23149:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},"id":4225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23145:28:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"nodeType":"VariableDeclarationStatement","src":"23119:54:18"},{"assignments":[4228],"declarations":[{"constant":false,"id":4228,"mutability":"mutable","name":"leafPos","nameLocation":"23191:7:18","nodeType":"VariableDeclaration","scope":4334,"src":"23183:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4227,"name":"uint256","nodeType":"ElementaryTypeName","src":"23183:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4230,"initialValue":{"hexValue":"30","id":4229,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23201:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"23183:19:18"},{"assignments":[4232],"declarations":[{"constant":false,"id":4232,"mutability":"mutable","name":"hashPos","nameLocation":"23220:7:18","nodeType":"VariableDeclaration","scope":4334,"src":"23212:15:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4231,"name":"uint256","nodeType":"ElementaryTypeName","src":"23212:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4234,"initialValue":{"hexValue":"30","id":4233,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23230:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"23212:19:18"},{"assignments":[4236],"declarations":[{"constant":false,"id":4236,"mutability":"mutable","name":"proofPos","nameLocation":"23249:8:18","nodeType":"VariableDeclaration","scope":4334,"src":"23241:16:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4235,"name":"uint256","nodeType":"ElementaryTypeName","src":"23241:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4238,"initialValue":{"hexValue":"30","id":4237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23260:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"23241:20:18"},{"body":{"id":4297,"nodeType":"Block","src":"23681:289:18","statements":[{"assignments":[4250],"declarations":[{"constant":false,"id":4250,"mutability":"mutable","name":"a","nameLocation":"23703:1:18","nodeType":"VariableDeclaration","scope":4297,"src":"23695:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4249,"name":"bytes32","nodeType":"ElementaryTypeName","src":"23695:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":4263,"initialValue":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4251,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"23707:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4252,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4194,"src":"23717:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23707:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4258,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4220,"src":"23749:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4261,"indexExpression":{"id":4260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23756:9:18","subExpression":{"id":4259,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4232,"src":"23756:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23749:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"23707:59:18","trueExpression":{"baseExpression":{"id":4254,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4178,"src":"23729:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4257,"indexExpression":{"id":4256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23736:9:18","subExpression":{"id":4255,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"23736:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23729:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"23695:71:18"},{"assignments":[4265],"declarations":[{"constant":false,"id":4265,"mutability":"mutable","name":"b","nameLocation":"23788:1:18","nodeType":"VariableDeclaration","scope":4297,"src":"23780:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4264,"name":"bytes32","nodeType":"ElementaryTypeName","src":"23780:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":4287,"initialValue":{"condition":{"baseExpression":{"id":4266,"name":"proofFlags","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4175,"src":"23792:10:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[] calldata"}},"id":4268,"indexExpression":{"id":4267,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4240,"src":"23803:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23792:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4282,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4172,"src":"23904:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4285,"indexExpression":{"id":4284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23910:10:18","subExpression":{"id":4283,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4236,"src":"23910:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23904:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4286,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"23792:129:18","trueExpression":{"components":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4271,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4269,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"23825:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4270,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4194,"src":"23835:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23825:19:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"baseExpression":{"id":4276,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4220,"src":"23867:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4279,"indexExpression":{"id":4278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23874:9:18","subExpression":{"id":4277,"name":"hashPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4232,"src":"23874:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23867:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4280,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"23825:59:18","trueExpression":{"baseExpression":{"id":4272,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4178,"src":"23847:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4275,"indexExpression":{"id":4274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23854:9:18","subExpression":{"id":4273,"name":"leafPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"23854:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23847:17:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":4281,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"23824:61:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"23780:141:18"},{"expression":{"id":4295,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4288,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4220,"src":"23935:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4290,"indexExpression":{"id":4289,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4240,"src":"23942:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"23935:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4292,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4250,"src":"23954:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":4293,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4265,"src":"23957:1:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":4291,"name":"hasher","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4188,"src":"23947:6:18","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"}},"id":4294,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23947:12:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"23935:24:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4296,"nodeType":"ExpressionStatement","src":"23935:24:18"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4243,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4240,"src":"23657:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4244,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4199,"src":"23661:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23657:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4298,"initializationExpression":{"assignments":[4240],"declarations":[{"constant":false,"id":4240,"mutability":"mutable","name":"i","nameLocation":"23650:1:18","nodeType":"VariableDeclaration","scope":4298,"src":"23642:9:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4239,"name":"uint256","nodeType":"ElementaryTypeName","src":"23642:7:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4242,"initialValue":{"hexValue":"30","id":4241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23654:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"23642:13:18"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":4247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"23676:3:18","subExpression":{"id":4246,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4240,"src":"23676:1:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4248,"nodeType":"ExpressionStatement","src":"23676:3:18"},"nodeType":"ForStatement","src":"23637:333:18"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4299,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4199,"src":"23984:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24000:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"23984:17:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4319,"name":"leavesLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4194,"src":"24225:9:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24237:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"24225:13:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":4331,"nodeType":"Block","src":"24287:40:18","statements":[{"expression":{"baseExpression":{"id":4327,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4172,"src":"24308:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4329,"indexExpression":{"hexValue":"30","id":4328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24314:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24308:8:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":4192,"id":4330,"nodeType":"Return","src":"24301:15:18"}]},"id":4332,"nodeType":"IfStatement","src":"24221:106:18","trueBody":{"id":4326,"nodeType":"Block","src":"24240:41:18","statements":[{"expression":{"baseExpression":{"id":4322,"name":"leaves","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4178,"src":"24261:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4324,"indexExpression":{"hexValue":"30","id":4323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24268:1:18","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24261:9:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":4192,"id":4325,"nodeType":"Return","src":"24254:16:18"}]}},"id":4333,"nodeType":"IfStatement","src":"23980:347:18","trueBody":{"id":4318,"nodeType":"Block","src":"24003:212:18","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4305,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4302,"name":"proofPos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4236,"src":"24021:8:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":4303,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4172,"src":"24033:5:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":4304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"24039:6:18","memberName":"length","nodeType":"MemberAccess","src":"24033:12:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24021:24:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4310,"nodeType":"IfStatement","src":"24017:100:18","trueBody":{"id":4309,"nodeType":"Block","src":"24047:70:18","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":4306,"name":"MerkleProofInvalidMultiproof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3271,"src":"24072:28:18","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":4307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24072:30:18","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":4308,"nodeType":"RevertStatement","src":"24065:37:18"}]}},{"id":4317,"nodeType":"UncheckedBlock","src":"24130:75:18","statements":[{"expression":{"baseExpression":{"id":4311,"name":"hashes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4220,"src":"24165:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[] memory"}},"id":4315,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4314,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4312,"name":"proofFlagsLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4199,"src":"24172:13:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":4313,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24188:1:18","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"24172:17:18","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24165:25:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":4192,"id":4316,"nodeType":"Return","src":"24158:32:18"}]}]}}]},"documentation":{"id":4169,"nodeType":"StructuredDocumentation","src":"20893:1099:18","text":" @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\n proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\n leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\n respectively.\n This version handles multiproofs in calldata with a custom hashing function.\n CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\n is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\n tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\n NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\n and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\n validating the leaves elsewhere."},"id":4335,"implemented":true,"kind":"function","modifiers":[],"name":"processMultiProofCalldata","nameLocation":"22006:25:18","nodeType":"FunctionDefinition","parameters":{"id":4189,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4172,"mutability":"mutable","name":"proof","nameLocation":"22060:5:18","nodeType":"VariableDeclaration","scope":4335,"src":"22041:24:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4170,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22041:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4171,"nodeType":"ArrayTypeName","src":"22041:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":4175,"mutability":"mutable","name":"proofFlags","nameLocation":"22091:10:18","nodeType":"VariableDeclaration","scope":4335,"src":"22075:26:18","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_calldata_ptr","typeString":"bool[]"},"typeName":{"baseType":{"id":4173,"name":"bool","nodeType":"ElementaryTypeName","src":"22075:4:18","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4174,"nodeType":"ArrayTypeName","src":"22075:6:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bool_$dyn_storage_ptr","typeString":"bool[]"}},"visibility":"internal"},{"constant":false,"id":4178,"mutability":"mutable","name":"leaves","nameLocation":"22128:6:18","nodeType":"VariableDeclaration","scope":4335,"src":"22111:23:18","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":4176,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22111:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4177,"nodeType":"ArrayTypeName","src":"22111:9:18","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":4188,"mutability":"mutable","name":"hasher","nameLocation":"22194:6:18","nodeType":"VariableDeclaration","scope":4335,"src":"22144:56:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"typeName":{"id":4187,"nodeType":"FunctionTypeName","parameterTypes":{"id":4183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4180,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4187,"src":"22153:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4179,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22153:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4182,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4187,"src":"22162:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4181,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22162:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"22152:18:18"},"returnParameterTypes":{"id":4186,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4185,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4187,"src":"22185:7:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4184,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22185:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"22184:9:18"},"src":"22144:56:18","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes32) view returns (bytes32)"},"visibility":"internal"},"visibility":"internal"}],"src":"22031:175:18"},"returnParameters":{"id":4192,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4191,"mutability":"mutable","name":"merkleRoot","nameLocation":"22238:10:18","nodeType":"VariableDeclaration","scope":4335,"src":"22230:18:18","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4190,"name":"bytes32","nodeType":"ElementaryTypeName","src":"22230:7:18","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"22229:20:18"},"scope":4336,"src":"21997:2336:18","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":4337,"src":"1353:22982:18","usedErrors":[3271],"usedEvents":[]}],"src":"206:24130:18"},"id":18},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/introspection/IERC165.sol","exportedSymbols":{"IERC165":[4348]},"id":4349,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4338,"literals":["solidity",">=","0.4",".16"],"nodeType":"PragmaDirective","src":"115:25:19"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC165","contractDependencies":[],"contractKind":"interface","documentation":{"id":4339,"nodeType":"StructuredDocumentation","src":"142:280:19","text":" @dev Interface of the ERC-165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[ERC].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."},"fullyImplemented":false,"id":4348,"linearizedBaseContracts":[4348],"name":"IERC165","nameLocation":"433:7:19","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":4340,"nodeType":"StructuredDocumentation","src":"447:340:19","text":" @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[ERC section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."},"functionSelector":"01ffc9a7","id":4347,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"801:17:19","nodeType":"FunctionDefinition","parameters":{"id":4343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4342,"mutability":"mutable","name":"interfaceId","nameLocation":"826:11:19","nodeType":"VariableDeclaration","scope":4347,"src":"819:18:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":4341,"name":"bytes4","nodeType":"ElementaryTypeName","src":"819:6:19","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"818:20:19"},"returnParameters":{"id":4346,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4345,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4347,"src":"862:4:19","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4344,"name":"bool","nodeType":"ElementaryTypeName","src":"862:4:19","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"861:6:19"},"scope":4348,"src":"792:76:19","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":4349,"src":"423:447:19","usedErrors":[],"usedEvents":[]}],"src":"115:756:19"},"id":19},"@openzeppelin/contracts/utils/math/Math.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","exportedSymbols":{"Math":[5969],"Panic":[1280],"SafeCast":[7734]},"id":5970,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":4350,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"103:24:20"},{"absolutePath":"@openzeppelin/contracts/utils/Panic.sol","file":"../Panic.sol","id":4352,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":5970,"sourceUnit":1281,"src":"129:35:20","symbolAliases":[{"foreign":{"id":4351,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"137:5:20","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/math/SafeCast.sol","file":"./SafeCast.sol","id":4354,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":5970,"sourceUnit":7735,"src":"165:40:20","symbolAliases":[{"foreign":{"id":4353,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"173:8:20","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Math","contractDependencies":[],"contractKind":"library","documentation":{"id":4355,"nodeType":"StructuredDocumentation","src":"207:73:20","text":" @dev Standard math utilities missing in the Solidity language."},"fullyImplemented":true,"id":5969,"linearizedBaseContracts":[5969],"name":"Math","nameLocation":"289:4:20","nodeType":"ContractDefinition","nodes":[{"canonicalName":"Math.Rounding","id":4360,"members":[{"id":4356,"name":"Floor","nameLocation":"324:5:20","nodeType":"EnumValue","src":"324:5:20"},{"id":4357,"name":"Ceil","nameLocation":"367:4:20","nodeType":"EnumValue","src":"367:4:20"},{"id":4358,"name":"Trunc","nameLocation":"409:5:20","nodeType":"EnumValue","src":"409:5:20"},{"id":4359,"name":"Expand","nameLocation":"439:6:20","nodeType":"EnumValue","src":"439:6:20"}],"name":"Rounding","nameLocation":"305:8:20","nodeType":"EnumDefinition","src":"300:169:20"},{"body":{"id":4373,"nodeType":"Block","src":"731:112:20","statements":[{"AST":{"nativeSrc":"766:71:20","nodeType":"YulBlock","src":"766:71:20","statements":[{"nativeSrc":"780:16:20","nodeType":"YulAssignment","src":"780:16:20","value":{"arguments":[{"name":"a","nativeSrc":"791:1:20","nodeType":"YulIdentifier","src":"791:1:20"},{"name":"b","nativeSrc":"794:1:20","nodeType":"YulIdentifier","src":"794:1:20"}],"functionName":{"name":"add","nativeSrc":"787:3:20","nodeType":"YulIdentifier","src":"787:3:20"},"nativeSrc":"787:9:20","nodeType":"YulFunctionCall","src":"787:9:20"},"variableNames":[{"name":"low","nativeSrc":"780:3:20","nodeType":"YulIdentifier","src":"780:3:20"}]},{"nativeSrc":"809:18:20","nodeType":"YulAssignment","src":"809:18:20","value":{"arguments":[{"name":"low","nativeSrc":"820:3:20","nodeType":"YulIdentifier","src":"820:3:20"},{"name":"a","nativeSrc":"825:1:20","nodeType":"YulIdentifier","src":"825:1:20"}],"functionName":{"name":"lt","nativeSrc":"817:2:20","nodeType":"YulIdentifier","src":"817:2:20"},"nativeSrc":"817:10:20","nodeType":"YulFunctionCall","src":"817:10:20"},"variableNames":[{"name":"high","nativeSrc":"809:4:20","nodeType":"YulIdentifier","src":"809:4:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4363,"isOffset":false,"isSlot":false,"src":"791:1:20","valueSize":1},{"declaration":4363,"isOffset":false,"isSlot":false,"src":"825:1:20","valueSize":1},{"declaration":4365,"isOffset":false,"isSlot":false,"src":"794:1:20","valueSize":1},{"declaration":4368,"isOffset":false,"isSlot":false,"src":"809:4:20","valueSize":1},{"declaration":4370,"isOffset":false,"isSlot":false,"src":"780:3:20","valueSize":1},{"declaration":4370,"isOffset":false,"isSlot":false,"src":"820:3:20","valueSize":1}],"flags":["memory-safe"],"id":4372,"nodeType":"InlineAssembly","src":"741:96:20"}]},"documentation":{"id":4361,"nodeType":"StructuredDocumentation","src":"475:163:20","text":" @dev Return the 512-bit addition of two uint256.\n The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low."},"id":4374,"implemented":true,"kind":"function","modifiers":[],"name":"add512","nameLocation":"652:6:20","nodeType":"FunctionDefinition","parameters":{"id":4366,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4363,"mutability":"mutable","name":"a","nameLocation":"667:1:20","nodeType":"VariableDeclaration","scope":4374,"src":"659:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4362,"name":"uint256","nodeType":"ElementaryTypeName","src":"659:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4365,"mutability":"mutable","name":"b","nameLocation":"678:1:20","nodeType":"VariableDeclaration","scope":4374,"src":"670:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4364,"name":"uint256","nodeType":"ElementaryTypeName","src":"670:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"658:22:20"},"returnParameters":{"id":4371,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4368,"mutability":"mutable","name":"high","nameLocation":"712:4:20","nodeType":"VariableDeclaration","scope":4374,"src":"704:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4367,"name":"uint256","nodeType":"ElementaryTypeName","src":"704:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4370,"mutability":"mutable","name":"low","nameLocation":"726:3:20","nodeType":"VariableDeclaration","scope":4374,"src":"718:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4369,"name":"uint256","nodeType":"ElementaryTypeName","src":"718:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"703:27:20"},"scope":5969,"src":"643:200:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4387,"nodeType":"Block","src":"1115:462:20","statements":[{"AST":{"nativeSrc":"1437:134:20","nodeType":"YulBlock","src":"1437:134:20","statements":[{"nativeSrc":"1451:30:20","nodeType":"YulVariableDeclaration","src":"1451:30:20","value":{"arguments":[{"name":"a","nativeSrc":"1468:1:20","nodeType":"YulIdentifier","src":"1468:1:20"},{"name":"b","nativeSrc":"1471:1:20","nodeType":"YulIdentifier","src":"1471:1:20"},{"arguments":[{"kind":"number","nativeSrc":"1478:1:20","nodeType":"YulLiteral","src":"1478:1:20","type":"","value":"0"}],"functionName":{"name":"not","nativeSrc":"1474:3:20","nodeType":"YulIdentifier","src":"1474:3:20"},"nativeSrc":"1474:6:20","nodeType":"YulFunctionCall","src":"1474:6:20"}],"functionName":{"name":"mulmod","nativeSrc":"1461:6:20","nodeType":"YulIdentifier","src":"1461:6:20"},"nativeSrc":"1461:20:20","nodeType":"YulFunctionCall","src":"1461:20:20"},"variables":[{"name":"mm","nativeSrc":"1455:2:20","nodeType":"YulTypedName","src":"1455:2:20","type":""}]},{"nativeSrc":"1494:16:20","nodeType":"YulAssignment","src":"1494:16:20","value":{"arguments":[{"name":"a","nativeSrc":"1505:1:20","nodeType":"YulIdentifier","src":"1505:1:20"},{"name":"b","nativeSrc":"1508:1:20","nodeType":"YulIdentifier","src":"1508:1:20"}],"functionName":{"name":"mul","nativeSrc":"1501:3:20","nodeType":"YulIdentifier","src":"1501:3:20"},"nativeSrc":"1501:9:20","nodeType":"YulFunctionCall","src":"1501:9:20"},"variableNames":[{"name":"low","nativeSrc":"1494:3:20","nodeType":"YulIdentifier","src":"1494:3:20"}]},{"nativeSrc":"1523:38:20","nodeType":"YulAssignment","src":"1523:38:20","value":{"arguments":[{"arguments":[{"name":"mm","nativeSrc":"1539:2:20","nodeType":"YulIdentifier","src":"1539:2:20"},{"name":"low","nativeSrc":"1543:3:20","nodeType":"YulIdentifier","src":"1543:3:20"}],"functionName":{"name":"sub","nativeSrc":"1535:3:20","nodeType":"YulIdentifier","src":"1535:3:20"},"nativeSrc":"1535:12:20","nodeType":"YulFunctionCall","src":"1535:12:20"},{"arguments":[{"name":"mm","nativeSrc":"1552:2:20","nodeType":"YulIdentifier","src":"1552:2:20"},{"name":"low","nativeSrc":"1556:3:20","nodeType":"YulIdentifier","src":"1556:3:20"}],"functionName":{"name":"lt","nativeSrc":"1549:2:20","nodeType":"YulIdentifier","src":"1549:2:20"},"nativeSrc":"1549:11:20","nodeType":"YulFunctionCall","src":"1549:11:20"}],"functionName":{"name":"sub","nativeSrc":"1531:3:20","nodeType":"YulIdentifier","src":"1531:3:20"},"nativeSrc":"1531:30:20","nodeType":"YulFunctionCall","src":"1531:30:20"},"variableNames":[{"name":"high","nativeSrc":"1523:4:20","nodeType":"YulIdentifier","src":"1523:4:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4377,"isOffset":false,"isSlot":false,"src":"1468:1:20","valueSize":1},{"declaration":4377,"isOffset":false,"isSlot":false,"src":"1505:1:20","valueSize":1},{"declaration":4379,"isOffset":false,"isSlot":false,"src":"1471:1:20","valueSize":1},{"declaration":4379,"isOffset":false,"isSlot":false,"src":"1508:1:20","valueSize":1},{"declaration":4382,"isOffset":false,"isSlot":false,"src":"1523:4:20","valueSize":1},{"declaration":4384,"isOffset":false,"isSlot":false,"src":"1494:3:20","valueSize":1},{"declaration":4384,"isOffset":false,"isSlot":false,"src":"1543:3:20","valueSize":1},{"declaration":4384,"isOffset":false,"isSlot":false,"src":"1556:3:20","valueSize":1}],"flags":["memory-safe"],"id":4386,"nodeType":"InlineAssembly","src":"1412:159:20"}]},"documentation":{"id":4375,"nodeType":"StructuredDocumentation","src":"849:173:20","text":" @dev Return the 512-bit multiplication of two uint256.\n The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low."},"id":4388,"implemented":true,"kind":"function","modifiers":[],"name":"mul512","nameLocation":"1036:6:20","nodeType":"FunctionDefinition","parameters":{"id":4380,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4377,"mutability":"mutable","name":"a","nameLocation":"1051:1:20","nodeType":"VariableDeclaration","scope":4388,"src":"1043:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4376,"name":"uint256","nodeType":"ElementaryTypeName","src":"1043:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4379,"mutability":"mutable","name":"b","nameLocation":"1062:1:20","nodeType":"VariableDeclaration","scope":4388,"src":"1054:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4378,"name":"uint256","nodeType":"ElementaryTypeName","src":"1054:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1042:22:20"},"returnParameters":{"id":4385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4382,"mutability":"mutable","name":"high","nameLocation":"1096:4:20","nodeType":"VariableDeclaration","scope":4388,"src":"1088:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4381,"name":"uint256","nodeType":"ElementaryTypeName","src":"1088:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4384,"mutability":"mutable","name":"low","nameLocation":"1110:3:20","nodeType":"VariableDeclaration","scope":4388,"src":"1102:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4383,"name":"uint256","nodeType":"ElementaryTypeName","src":"1102:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1087:27:20"},"scope":5969,"src":"1027:550:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4422,"nodeType":"Block","src":"1784:149:20","statements":[{"id":4421,"nodeType":"UncheckedBlock","src":"1794:133:20","statements":[{"assignments":[4401],"declarations":[{"constant":false,"id":4401,"mutability":"mutable","name":"c","nameLocation":"1826:1:20","nodeType":"VariableDeclaration","scope":4421,"src":"1818:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4400,"name":"uint256","nodeType":"ElementaryTypeName","src":"1818:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4405,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4402,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4391,"src":"1830:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":4403,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4393,"src":"1834:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1830:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1818:17:20"},{"expression":{"id":4410,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4406,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4396,"src":"1849:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4407,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4401,"src":"1859:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":4408,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4391,"src":"1864:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1859:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1849:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4411,"nodeType":"ExpressionStatement","src":"1849:16:20"},{"expression":{"id":4419,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4412,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4398,"src":"1879:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4413,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4401,"src":"1888:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"id":4416,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4396,"src":"1908:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4414,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"1892:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4415,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1901:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"1892:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1892:24:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1888:28:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1879:37:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4420,"nodeType":"ExpressionStatement","src":"1879:37:20"}]}]},"documentation":{"id":4389,"nodeType":"StructuredDocumentation","src":"1583:105:20","text":" @dev Returns the addition of two unsigned integers, with a success flag (no overflow)."},"id":4423,"implemented":true,"kind":"function","modifiers":[],"name":"tryAdd","nameLocation":"1702:6:20","nodeType":"FunctionDefinition","parameters":{"id":4394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4391,"mutability":"mutable","name":"a","nameLocation":"1717:1:20","nodeType":"VariableDeclaration","scope":4423,"src":"1709:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4390,"name":"uint256","nodeType":"ElementaryTypeName","src":"1709:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4393,"mutability":"mutable","name":"b","nameLocation":"1728:1:20","nodeType":"VariableDeclaration","scope":4423,"src":"1720:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4392,"name":"uint256","nodeType":"ElementaryTypeName","src":"1720:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1708:22:20"},"returnParameters":{"id":4399,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4396,"mutability":"mutable","name":"success","nameLocation":"1759:7:20","nodeType":"VariableDeclaration","scope":4423,"src":"1754:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4395,"name":"bool","nodeType":"ElementaryTypeName","src":"1754:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4398,"mutability":"mutable","name":"result","nameLocation":"1776:6:20","nodeType":"VariableDeclaration","scope":4423,"src":"1768:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4397,"name":"uint256","nodeType":"ElementaryTypeName","src":"1768:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1753:30:20"},"scope":5969,"src":"1693:240:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4457,"nodeType":"Block","src":"2143:149:20","statements":[{"id":4456,"nodeType":"UncheckedBlock","src":"2153:133:20","statements":[{"assignments":[4436],"declarations":[{"constant":false,"id":4436,"mutability":"mutable","name":"c","nameLocation":"2185:1:20","nodeType":"VariableDeclaration","scope":4456,"src":"2177:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4435,"name":"uint256","nodeType":"ElementaryTypeName","src":"2177:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4440,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4437,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4426,"src":"2189:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4438,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4428,"src":"2193:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2189:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2177:17:20"},{"expression":{"id":4445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4441,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4431,"src":"2208:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4444,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4442,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4436,"src":"2218:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":4443,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4426,"src":"2223:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2218:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2208:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4446,"nodeType":"ExpressionStatement","src":"2208:16:20"},{"expression":{"id":4454,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4447,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4433,"src":"2238:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4448,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4436,"src":"2247:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"id":4451,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4431,"src":"2267:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4449,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"2251:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2260:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"2251:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2251:24:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2247:28:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2238:37:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4455,"nodeType":"ExpressionStatement","src":"2238:37:20"}]}]},"documentation":{"id":4424,"nodeType":"StructuredDocumentation","src":"1939:108:20","text":" @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow)."},"id":4458,"implemented":true,"kind":"function","modifiers":[],"name":"trySub","nameLocation":"2061:6:20","nodeType":"FunctionDefinition","parameters":{"id":4429,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4426,"mutability":"mutable","name":"a","nameLocation":"2076:1:20","nodeType":"VariableDeclaration","scope":4458,"src":"2068:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4425,"name":"uint256","nodeType":"ElementaryTypeName","src":"2068:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4428,"mutability":"mutable","name":"b","nameLocation":"2087:1:20","nodeType":"VariableDeclaration","scope":4458,"src":"2079:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4427,"name":"uint256","nodeType":"ElementaryTypeName","src":"2079:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2067:22:20"},"returnParameters":{"id":4434,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4431,"mutability":"mutable","name":"success","nameLocation":"2118:7:20","nodeType":"VariableDeclaration","scope":4458,"src":"2113:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4430,"name":"bool","nodeType":"ElementaryTypeName","src":"2113:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4433,"mutability":"mutable","name":"result","nameLocation":"2135:6:20","nodeType":"VariableDeclaration","scope":4458,"src":"2127:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4432,"name":"uint256","nodeType":"ElementaryTypeName","src":"2127:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2112:30:20"},"scope":5969,"src":"2052:240:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4487,"nodeType":"Block","src":"2505:391:20","statements":[{"id":4486,"nodeType":"UncheckedBlock","src":"2515:375:20","statements":[{"assignments":[4471],"declarations":[{"constant":false,"id":4471,"mutability":"mutable","name":"c","nameLocation":"2547:1:20","nodeType":"VariableDeclaration","scope":4486,"src":"2539:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4470,"name":"uint256","nodeType":"ElementaryTypeName","src":"2539:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4475,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4472,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4461,"src":"2551:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4473,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4463,"src":"2555:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2551:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2539:17:20"},{"AST":{"nativeSrc":"2595:188:20","nodeType":"YulBlock","src":"2595:188:20","statements":[{"nativeSrc":"2727:42:20","nodeType":"YulAssignment","src":"2727:42:20","value":{"arguments":[{"arguments":[{"arguments":[{"name":"c","nativeSrc":"2748:1:20","nodeType":"YulIdentifier","src":"2748:1:20"},{"name":"a","nativeSrc":"2751:1:20","nodeType":"YulIdentifier","src":"2751:1:20"}],"functionName":{"name":"div","nativeSrc":"2744:3:20","nodeType":"YulIdentifier","src":"2744:3:20"},"nativeSrc":"2744:9:20","nodeType":"YulFunctionCall","src":"2744:9:20"},{"name":"b","nativeSrc":"2755:1:20","nodeType":"YulIdentifier","src":"2755:1:20"}],"functionName":{"name":"eq","nativeSrc":"2741:2:20","nodeType":"YulIdentifier","src":"2741:2:20"},"nativeSrc":"2741:16:20","nodeType":"YulFunctionCall","src":"2741:16:20"},{"arguments":[{"name":"a","nativeSrc":"2766:1:20","nodeType":"YulIdentifier","src":"2766:1:20"}],"functionName":{"name":"iszero","nativeSrc":"2759:6:20","nodeType":"YulIdentifier","src":"2759:6:20"},"nativeSrc":"2759:9:20","nodeType":"YulFunctionCall","src":"2759:9:20"}],"functionName":{"name":"or","nativeSrc":"2738:2:20","nodeType":"YulIdentifier","src":"2738:2:20"},"nativeSrc":"2738:31:20","nodeType":"YulFunctionCall","src":"2738:31:20"},"variableNames":[{"name":"success","nativeSrc":"2727:7:20","nodeType":"YulIdentifier","src":"2727:7:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4461,"isOffset":false,"isSlot":false,"src":"2751:1:20","valueSize":1},{"declaration":4461,"isOffset":false,"isSlot":false,"src":"2766:1:20","valueSize":1},{"declaration":4463,"isOffset":false,"isSlot":false,"src":"2755:1:20","valueSize":1},{"declaration":4471,"isOffset":false,"isSlot":false,"src":"2748:1:20","valueSize":1},{"declaration":4466,"isOffset":false,"isSlot":false,"src":"2727:7:20","valueSize":1}],"flags":["memory-safe"],"id":4476,"nodeType":"InlineAssembly","src":"2570:213:20"},{"expression":{"id":4484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4477,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4468,"src":"2842:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4478,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4471,"src":"2851:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"id":4481,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4466,"src":"2871:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4479,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"2855:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2864:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"2855:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2855:24:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2851:28:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2842:37:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4485,"nodeType":"ExpressionStatement","src":"2842:37:20"}]}]},"documentation":{"id":4459,"nodeType":"StructuredDocumentation","src":"2298:111:20","text":" @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow)."},"id":4488,"implemented":true,"kind":"function","modifiers":[],"name":"tryMul","nameLocation":"2423:6:20","nodeType":"FunctionDefinition","parameters":{"id":4464,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4461,"mutability":"mutable","name":"a","nameLocation":"2438:1:20","nodeType":"VariableDeclaration","scope":4488,"src":"2430:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4460,"name":"uint256","nodeType":"ElementaryTypeName","src":"2430:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4463,"mutability":"mutable","name":"b","nameLocation":"2449:1:20","nodeType":"VariableDeclaration","scope":4488,"src":"2441:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4462,"name":"uint256","nodeType":"ElementaryTypeName","src":"2441:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2429:22:20"},"returnParameters":{"id":4469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4466,"mutability":"mutable","name":"success","nameLocation":"2480:7:20","nodeType":"VariableDeclaration","scope":4488,"src":"2475:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4465,"name":"bool","nodeType":"ElementaryTypeName","src":"2475:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4468,"mutability":"mutable","name":"result","nameLocation":"2497:6:20","nodeType":"VariableDeclaration","scope":4488,"src":"2489:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4467,"name":"uint256","nodeType":"ElementaryTypeName","src":"2489:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2474:30:20"},"scope":5969,"src":"2414:482:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4508,"nodeType":"Block","src":"3111:231:20","statements":[{"id":4507,"nodeType":"UncheckedBlock","src":"3121:215:20","statements":[{"expression":{"id":4504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4500,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4496,"src":"3145:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4501,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4493,"src":"3155:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3159:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3155:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3145:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4505,"nodeType":"ExpressionStatement","src":"3145:15:20"},{"AST":{"nativeSrc":"3199:127:20","nodeType":"YulBlock","src":"3199:127:20","statements":[{"nativeSrc":"3293:19:20","nodeType":"YulAssignment","src":"3293:19:20","value":{"arguments":[{"name":"a","nativeSrc":"3307:1:20","nodeType":"YulIdentifier","src":"3307:1:20"},{"name":"b","nativeSrc":"3310:1:20","nodeType":"YulIdentifier","src":"3310:1:20"}],"functionName":{"name":"div","nativeSrc":"3303:3:20","nodeType":"YulIdentifier","src":"3303:3:20"},"nativeSrc":"3303:9:20","nodeType":"YulFunctionCall","src":"3303:9:20"},"variableNames":[{"name":"result","nativeSrc":"3293:6:20","nodeType":"YulIdentifier","src":"3293:6:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4491,"isOffset":false,"isSlot":false,"src":"3307:1:20","valueSize":1},{"declaration":4493,"isOffset":false,"isSlot":false,"src":"3310:1:20","valueSize":1},{"declaration":4498,"isOffset":false,"isSlot":false,"src":"3293:6:20","valueSize":1}],"flags":["memory-safe"],"id":4506,"nodeType":"InlineAssembly","src":"3174:152:20"}]}]},"documentation":{"id":4489,"nodeType":"StructuredDocumentation","src":"2902:113:20","text":" @dev Returns the division of two unsigned integers, with a success flag (no division by zero)."},"id":4509,"implemented":true,"kind":"function","modifiers":[],"name":"tryDiv","nameLocation":"3029:6:20","nodeType":"FunctionDefinition","parameters":{"id":4494,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4491,"mutability":"mutable","name":"a","nameLocation":"3044:1:20","nodeType":"VariableDeclaration","scope":4509,"src":"3036:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4490,"name":"uint256","nodeType":"ElementaryTypeName","src":"3036:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4493,"mutability":"mutable","name":"b","nameLocation":"3055:1:20","nodeType":"VariableDeclaration","scope":4509,"src":"3047:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4492,"name":"uint256","nodeType":"ElementaryTypeName","src":"3047:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3035:22:20"},"returnParameters":{"id":4499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4496,"mutability":"mutable","name":"success","nameLocation":"3086:7:20","nodeType":"VariableDeclaration","scope":4509,"src":"3081:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4495,"name":"bool","nodeType":"ElementaryTypeName","src":"3081:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4498,"mutability":"mutable","name":"result","nameLocation":"3103:6:20","nodeType":"VariableDeclaration","scope":4509,"src":"3095:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4497,"name":"uint256","nodeType":"ElementaryTypeName","src":"3095:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3080:30:20"},"scope":5969,"src":"3020:322:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4529,"nodeType":"Block","src":"3567:231:20","statements":[{"id":4528,"nodeType":"UncheckedBlock","src":"3577:215:20","statements":[{"expression":{"id":4525,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4521,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4517,"src":"3601:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4522,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4514,"src":"3611:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3615:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3611:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3601:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4526,"nodeType":"ExpressionStatement","src":"3601:15:20"},{"AST":{"nativeSrc":"3655:127:20","nodeType":"YulBlock","src":"3655:127:20","statements":[{"nativeSrc":"3749:19:20","nodeType":"YulAssignment","src":"3749:19:20","value":{"arguments":[{"name":"a","nativeSrc":"3763:1:20","nodeType":"YulIdentifier","src":"3763:1:20"},{"name":"b","nativeSrc":"3766:1:20","nodeType":"YulIdentifier","src":"3766:1:20"}],"functionName":{"name":"mod","nativeSrc":"3759:3:20","nodeType":"YulIdentifier","src":"3759:3:20"},"nativeSrc":"3759:9:20","nodeType":"YulFunctionCall","src":"3759:9:20"},"variableNames":[{"name":"result","nativeSrc":"3749:6:20","nodeType":"YulIdentifier","src":"3749:6:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4512,"isOffset":false,"isSlot":false,"src":"3763:1:20","valueSize":1},{"declaration":4514,"isOffset":false,"isSlot":false,"src":"3766:1:20","valueSize":1},{"declaration":4519,"isOffset":false,"isSlot":false,"src":"3749:6:20","valueSize":1}],"flags":["memory-safe"],"id":4527,"nodeType":"InlineAssembly","src":"3630:152:20"}]}]},"documentation":{"id":4510,"nodeType":"StructuredDocumentation","src":"3348:123:20","text":" @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero)."},"id":4530,"implemented":true,"kind":"function","modifiers":[],"name":"tryMod","nameLocation":"3485:6:20","nodeType":"FunctionDefinition","parameters":{"id":4515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4512,"mutability":"mutable","name":"a","nameLocation":"3500:1:20","nodeType":"VariableDeclaration","scope":4530,"src":"3492:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4511,"name":"uint256","nodeType":"ElementaryTypeName","src":"3492:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4514,"mutability":"mutable","name":"b","nameLocation":"3511:1:20","nodeType":"VariableDeclaration","scope":4530,"src":"3503:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4513,"name":"uint256","nodeType":"ElementaryTypeName","src":"3503:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3491:22:20"},"returnParameters":{"id":4520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4517,"mutability":"mutable","name":"success","nameLocation":"3542:7:20","nodeType":"VariableDeclaration","scope":4530,"src":"3537:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4516,"name":"bool","nodeType":"ElementaryTypeName","src":"3537:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4519,"mutability":"mutable","name":"result","nameLocation":"3559:6:20","nodeType":"VariableDeclaration","scope":4530,"src":"3551:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4518,"name":"uint256","nodeType":"ElementaryTypeName","src":"3551:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3536:30:20"},"scope":5969,"src":"3476:322:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4559,"nodeType":"Block","src":"3989:122:20","statements":[{"assignments":[4541,4543],"declarations":[{"constant":false,"id":4541,"mutability":"mutable","name":"success","nameLocation":"4005:7:20","nodeType":"VariableDeclaration","scope":4559,"src":"4000:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4540,"name":"bool","nodeType":"ElementaryTypeName","src":"4000:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4543,"mutability":"mutable","name":"result","nameLocation":"4022:6:20","nodeType":"VariableDeclaration","scope":4559,"src":"4014:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4542,"name":"uint256","nodeType":"ElementaryTypeName","src":"4014:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4548,"initialValue":{"arguments":[{"id":4545,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4533,"src":"4039:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4546,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4535,"src":"4042:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4544,"name":"tryAdd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4423,"src":"4032:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (bool,uint256)"}},"id":4547,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4032:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"3999:45:20"},{"expression":{"arguments":[{"id":4550,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4541,"src":"4069:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4551,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4543,"src":"4078:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"arguments":[{"id":4554,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4091:7:20","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":4553,"name":"uint256","nodeType":"ElementaryTypeName","src":"4091:7:20","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":4552,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4086:4:20","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":4555,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4086:13:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":4556,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4100:3:20","memberName":"max","nodeType":"MemberAccess","src":"4086:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4549,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"4061:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":4557,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4061:43:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4539,"id":4558,"nodeType":"Return","src":"4054:50:20"}]},"documentation":{"id":4531,"nodeType":"StructuredDocumentation","src":"3804:103:20","text":" @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing."},"id":4560,"implemented":true,"kind":"function","modifiers":[],"name":"saturatingAdd","nameLocation":"3921:13:20","nodeType":"FunctionDefinition","parameters":{"id":4536,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4533,"mutability":"mutable","name":"a","nameLocation":"3943:1:20","nodeType":"VariableDeclaration","scope":4560,"src":"3935:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4532,"name":"uint256","nodeType":"ElementaryTypeName","src":"3935:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4535,"mutability":"mutable","name":"b","nameLocation":"3954:1:20","nodeType":"VariableDeclaration","scope":4560,"src":"3946:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4534,"name":"uint256","nodeType":"ElementaryTypeName","src":"3946:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3934:22:20"},"returnParameters":{"id":4539,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4538,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4560,"src":"3980:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4537,"name":"uint256","nodeType":"ElementaryTypeName","src":"3980:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3979:9:20"},"scope":5969,"src":"3912:199:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4579,"nodeType":"Block","src":"4294:73:20","statements":[{"assignments":[null,4571],"declarations":[null,{"constant":false,"id":4571,"mutability":"mutable","name":"result","nameLocation":"4315:6:20","nodeType":"VariableDeclaration","scope":4579,"src":"4307:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4570,"name":"uint256","nodeType":"ElementaryTypeName","src":"4307:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4576,"initialValue":{"arguments":[{"id":4573,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4563,"src":"4332:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4574,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4565,"src":"4335:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4572,"name":"trySub","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4458,"src":"4325:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (bool,uint256)"}},"id":4575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4325:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"4304:33:20"},{"expression":{"id":4577,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4571,"src":"4354:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4569,"id":4578,"nodeType":"Return","src":"4347:13:20"}]},"documentation":{"id":4561,"nodeType":"StructuredDocumentation","src":"4117:95:20","text":" @dev Unsigned saturating subtraction, bounds to zero instead of overflowing."},"id":4580,"implemented":true,"kind":"function","modifiers":[],"name":"saturatingSub","nameLocation":"4226:13:20","nodeType":"FunctionDefinition","parameters":{"id":4566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4563,"mutability":"mutable","name":"a","nameLocation":"4248:1:20","nodeType":"VariableDeclaration","scope":4580,"src":"4240:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4562,"name":"uint256","nodeType":"ElementaryTypeName","src":"4240:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4565,"mutability":"mutable","name":"b","nameLocation":"4259:1:20","nodeType":"VariableDeclaration","scope":4580,"src":"4251:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4564,"name":"uint256","nodeType":"ElementaryTypeName","src":"4251:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4239:22:20"},"returnParameters":{"id":4569,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4568,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4580,"src":"4285:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4567,"name":"uint256","nodeType":"ElementaryTypeName","src":"4285:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4284:9:20"},"scope":5969,"src":"4217:150:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4609,"nodeType":"Block","src":"4564:122:20","statements":[{"assignments":[4591,4593],"declarations":[{"constant":false,"id":4591,"mutability":"mutable","name":"success","nameLocation":"4580:7:20","nodeType":"VariableDeclaration","scope":4609,"src":"4575:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4590,"name":"bool","nodeType":"ElementaryTypeName","src":"4575:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4593,"mutability":"mutable","name":"result","nameLocation":"4597:6:20","nodeType":"VariableDeclaration","scope":4609,"src":"4589:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4592,"name":"uint256","nodeType":"ElementaryTypeName","src":"4589:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4598,"initialValue":{"arguments":[{"id":4595,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4583,"src":"4614:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4596,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4585,"src":"4617:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4594,"name":"tryMul","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4488,"src":"4607:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (bool,uint256)"}},"id":4597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4607:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"4574:45:20"},{"expression":{"arguments":[{"id":4600,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4591,"src":"4644:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4601,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4593,"src":"4653:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"arguments":[{"id":4604,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4666:7:20","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":4603,"name":"uint256","nodeType":"ElementaryTypeName","src":"4666:7:20","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":4602,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4661:4:20","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":4605,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4661:13:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":4606,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4675:3:20","memberName":"max","nodeType":"MemberAccess","src":"4661:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4599,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"4636:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":4607,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4636:43:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4589,"id":4608,"nodeType":"Return","src":"4629:50:20"}]},"documentation":{"id":4581,"nodeType":"StructuredDocumentation","src":"4373:109:20","text":" @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing."},"id":4610,"implemented":true,"kind":"function","modifiers":[],"name":"saturatingMul","nameLocation":"4496:13:20","nodeType":"FunctionDefinition","parameters":{"id":4586,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4583,"mutability":"mutable","name":"a","nameLocation":"4518:1:20","nodeType":"VariableDeclaration","scope":4610,"src":"4510:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4582,"name":"uint256","nodeType":"ElementaryTypeName","src":"4510:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4585,"mutability":"mutable","name":"b","nameLocation":"4529:1:20","nodeType":"VariableDeclaration","scope":4610,"src":"4521:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4584,"name":"uint256","nodeType":"ElementaryTypeName","src":"4521:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4509:22:20"},"returnParameters":{"id":4589,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4588,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4610,"src":"4555:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4587,"name":"uint256","nodeType":"ElementaryTypeName","src":"4555:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4554:9:20"},"scope":5969,"src":"4487:199:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4636,"nodeType":"Block","src":"5158:207:20","statements":[{"id":4635,"nodeType":"UncheckedBlock","src":"5168:191:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4622,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4617,"src":"5306:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4623,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4615,"src":"5312:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":4624,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4617,"src":"5316:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5312:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4626,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5311:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"id":4629,"name":"condition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4613,"src":"5337:9:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4627,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"5321:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5330:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"5321:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5321:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5311:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4632,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5310:38:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5306:42:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4621,"id":4634,"nodeType":"Return","src":"5299:49:20"}]}]},"documentation":{"id":4611,"nodeType":"StructuredDocumentation","src":"4692:374:20","text":" @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n one branch when needed, making this function more expensive."},"id":4637,"implemented":true,"kind":"function","modifiers":[],"name":"ternary","nameLocation":"5080:7:20","nodeType":"FunctionDefinition","parameters":{"id":4618,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4613,"mutability":"mutable","name":"condition","nameLocation":"5093:9:20","nodeType":"VariableDeclaration","scope":4637,"src":"5088:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4612,"name":"bool","nodeType":"ElementaryTypeName","src":"5088:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4615,"mutability":"mutable","name":"a","nameLocation":"5112:1:20","nodeType":"VariableDeclaration","scope":4637,"src":"5104:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4614,"name":"uint256","nodeType":"ElementaryTypeName","src":"5104:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4617,"mutability":"mutable","name":"b","nameLocation":"5123:1:20","nodeType":"VariableDeclaration","scope":4637,"src":"5115:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4616,"name":"uint256","nodeType":"ElementaryTypeName","src":"5115:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5087:38:20"},"returnParameters":{"id":4621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4620,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4637,"src":"5149:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4619,"name":"uint256","nodeType":"ElementaryTypeName","src":"5149:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5148:9:20"},"scope":5969,"src":"5071:294:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4655,"nodeType":"Block","src":"5502:44:20","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4648,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4640,"src":"5527:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":4649,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4642,"src":"5531:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5527:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4651,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4640,"src":"5534:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4652,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4642,"src":"5537:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4647,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"5519:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":4653,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5519:20:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4646,"id":4654,"nodeType":"Return","src":"5512:27:20"}]},"documentation":{"id":4638,"nodeType":"StructuredDocumentation","src":"5371:59:20","text":" @dev Returns the largest of two numbers."},"id":4656,"implemented":true,"kind":"function","modifiers":[],"name":"max","nameLocation":"5444:3:20","nodeType":"FunctionDefinition","parameters":{"id":4643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4640,"mutability":"mutable","name":"a","nameLocation":"5456:1:20","nodeType":"VariableDeclaration","scope":4656,"src":"5448:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4639,"name":"uint256","nodeType":"ElementaryTypeName","src":"5448:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4642,"mutability":"mutable","name":"b","nameLocation":"5467:1:20","nodeType":"VariableDeclaration","scope":4656,"src":"5459:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4641,"name":"uint256","nodeType":"ElementaryTypeName","src":"5459:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5447:22:20"},"returnParameters":{"id":4646,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4645,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4656,"src":"5493:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4644,"name":"uint256","nodeType":"ElementaryTypeName","src":"5493:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5492:9:20"},"scope":5969,"src":"5435:111:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4674,"nodeType":"Block","src":"5684:44:20","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4667,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4659,"src":"5709:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":4668,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4661,"src":"5713:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5709:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":4670,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4659,"src":"5716:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4671,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4661,"src":"5719:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4666,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"5701:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":4672,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5701:20:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4665,"id":4673,"nodeType":"Return","src":"5694:27:20"}]},"documentation":{"id":4657,"nodeType":"StructuredDocumentation","src":"5552:60:20","text":" @dev Returns the smallest of two numbers."},"id":4675,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"5626:3:20","nodeType":"FunctionDefinition","parameters":{"id":4662,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4659,"mutability":"mutable","name":"a","nameLocation":"5638:1:20","nodeType":"VariableDeclaration","scope":4675,"src":"5630:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4658,"name":"uint256","nodeType":"ElementaryTypeName","src":"5630:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4661,"mutability":"mutable","name":"b","nameLocation":"5649:1:20","nodeType":"VariableDeclaration","scope":4675,"src":"5641:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4660,"name":"uint256","nodeType":"ElementaryTypeName","src":"5641:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5629:22:20"},"returnParameters":{"id":4665,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4664,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4675,"src":"5675:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4663,"name":"uint256","nodeType":"ElementaryTypeName","src":"5675:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5674:9:20"},"scope":5969,"src":"5617:111:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4697,"nodeType":"Block","src":"5912:82:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4685,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4678,"src":"5967:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":4686,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4680,"src":"5971:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5967:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4688,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5966:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4689,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4678,"src":"5977:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":4690,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4680,"src":"5981:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5977:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4692,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5976:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"hexValue":"32","id":4693,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5986:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"5976:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5966:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4684,"id":4696,"nodeType":"Return","src":"5959:28:20"}]},"documentation":{"id":4676,"nodeType":"StructuredDocumentation","src":"5734:102:20","text":" @dev Returns the average of two numbers. The result is rounded towards\n zero."},"id":4698,"implemented":true,"kind":"function","modifiers":[],"name":"average","nameLocation":"5850:7:20","nodeType":"FunctionDefinition","parameters":{"id":4681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4678,"mutability":"mutable","name":"a","nameLocation":"5866:1:20","nodeType":"VariableDeclaration","scope":4698,"src":"5858:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4677,"name":"uint256","nodeType":"ElementaryTypeName","src":"5858:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4680,"mutability":"mutable","name":"b","nameLocation":"5877:1:20","nodeType":"VariableDeclaration","scope":4698,"src":"5869:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4679,"name":"uint256","nodeType":"ElementaryTypeName","src":"5869:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5857:22:20"},"returnParameters":{"id":4684,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4683,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4698,"src":"5903:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4682,"name":"uint256","nodeType":"ElementaryTypeName","src":"5903:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5902:9:20"},"scope":5969,"src":"5841:153:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4738,"nodeType":"Block","src":"6286:633:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4708,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4703,"src":"6300:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4709,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6305:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6300:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4719,"nodeType":"IfStatement","src":"6296:150:20","trueBody":{"id":4718,"nodeType":"Block","src":"6308:138:20","statements":[{"expression":{"arguments":[{"expression":{"id":4714,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"6412:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6418:16:20","memberName":"DIVISION_BY_ZERO","nodeType":"MemberAccess","referencedDeclaration":1247,"src":"6412:22:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4711,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"6400:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6406:5:20","memberName":"panic","nodeType":"MemberAccess","referencedDeclaration":1279,"src":"6400:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$__$","typeString":"function (uint256) pure"}},"id":4716,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6400:35:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4717,"nodeType":"ExpressionStatement","src":"6400:35:20"}]}},{"id":4737,"nodeType":"UncheckedBlock","src":"6829:84:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4735,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4724,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4722,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4701,"src":"6876:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4723,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6880:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6876:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4720,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"6860:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4721,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6869:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"6860:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4725,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6860:22:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4731,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4728,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4726,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4701,"src":"6887:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":4727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6891:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"6887:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4729,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6886:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":4730,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4703,"src":"6896:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6886:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":4732,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6900:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"6886:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4734,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6885:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6860:42:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4707,"id":4736,"nodeType":"Return","src":"6853:49:20"}]}]},"documentation":{"id":4699,"nodeType":"StructuredDocumentation","src":"6000:210:20","text":" @dev Returns the ceiling of the division of two numbers.\n This differs from standard division with `/` in that it rounds towards infinity instead\n of rounding towards zero."},"id":4739,"implemented":true,"kind":"function","modifiers":[],"name":"ceilDiv","nameLocation":"6224:7:20","nodeType":"FunctionDefinition","parameters":{"id":4704,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4701,"mutability":"mutable","name":"a","nameLocation":"6240:1:20","nodeType":"VariableDeclaration","scope":4739,"src":"6232:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4700,"name":"uint256","nodeType":"ElementaryTypeName","src":"6232:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4703,"mutability":"mutable","name":"b","nameLocation":"6251:1:20","nodeType":"VariableDeclaration","scope":4739,"src":"6243:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4702,"name":"uint256","nodeType":"ElementaryTypeName","src":"6243:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6231:22:20"},"returnParameters":{"id":4707,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4706,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4739,"src":"6277:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4705,"name":"uint256","nodeType":"ElementaryTypeName","src":"6277:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6276:9:20"},"scope":5969,"src":"6215:704:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4874,"nodeType":"Block","src":"7340:3585:20","statements":[{"id":4873,"nodeType":"UncheckedBlock","src":"7350:3569:20","statements":[{"assignments":[4752,4754],"declarations":[{"constant":false,"id":4752,"mutability":"mutable","name":"high","nameLocation":"7383:4:20","nodeType":"VariableDeclaration","scope":4873,"src":"7375:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4751,"name":"uint256","nodeType":"ElementaryTypeName","src":"7375:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4754,"mutability":"mutable","name":"low","nameLocation":"7397:3:20","nodeType":"VariableDeclaration","scope":4873,"src":"7389:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4753,"name":"uint256","nodeType":"ElementaryTypeName","src":"7389:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4759,"initialValue":{"arguments":[{"id":4756,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4742,"src":"7411:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4757,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4744,"src":"7414:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4755,"name":"mul512","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4388,"src":"7404:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256,uint256)"}},"id":4758,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7404:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"7374:42:20"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4760,"name":"high","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4752,"src":"7498:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4761,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7506:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7498:9:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4768,"nodeType":"IfStatement","src":"7494:365:20","trueBody":{"id":4767,"nodeType":"Block","src":"7509:350:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4763,"name":"low","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4754,"src":"7827:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":4764,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"7833:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7827:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4750,"id":4766,"nodeType":"Return","src":"7820:24:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4771,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4769,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"7969:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":4770,"name":"high","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4752,"src":"7984:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7969:19:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4787,"nodeType":"IfStatement","src":"7965:142:20","trueBody":{"id":4786,"nodeType":"Block","src":"7990:117:20","statements":[{"expression":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4776,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"8028:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4777,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8043:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8028:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"expression":{"id":4779,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"8046:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4780,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8052:16:20","memberName":"DIVISION_BY_ZERO","nodeType":"MemberAccess","referencedDeclaration":1247,"src":"8046:22:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":4781,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"8070:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4782,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8076:14:20","memberName":"UNDER_OVERFLOW","nodeType":"MemberAccess","referencedDeclaration":1243,"src":"8070:20:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4775,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"8020:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":4783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8020:71:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4772,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"8008:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8014:5:20","memberName":"panic","nodeType":"MemberAccess","referencedDeclaration":1279,"src":"8008:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$__$","typeString":"function (uint256) pure"}},"id":4784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8008:84:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4785,"nodeType":"ExpressionStatement","src":"8008:84:20"}]}},{"assignments":[4789],"declarations":[{"constant":false,"id":4789,"mutability":"mutable","name":"remainder","nameLocation":"8367:9:20","nodeType":"VariableDeclaration","scope":4873,"src":"8359:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4788,"name":"uint256","nodeType":"ElementaryTypeName","src":"8359:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4790,"nodeType":"VariableDeclarationStatement","src":"8359:17:20"},{"AST":{"nativeSrc":"8415:283:20","nodeType":"YulBlock","src":"8415:283:20","statements":[{"nativeSrc":"8484:38:20","nodeType":"YulAssignment","src":"8484:38:20","value":{"arguments":[{"name":"x","nativeSrc":"8504:1:20","nodeType":"YulIdentifier","src":"8504:1:20"},{"name":"y","nativeSrc":"8507:1:20","nodeType":"YulIdentifier","src":"8507:1:20"},{"name":"denominator","nativeSrc":"8510:11:20","nodeType":"YulIdentifier","src":"8510:11:20"}],"functionName":{"name":"mulmod","nativeSrc":"8497:6:20","nodeType":"YulIdentifier","src":"8497:6:20"},"nativeSrc":"8497:25:20","nodeType":"YulFunctionCall","src":"8497:25:20"},"variableNames":[{"name":"remainder","nativeSrc":"8484:9:20","nodeType":"YulIdentifier","src":"8484:9:20"}]},{"nativeSrc":"8604:37:20","nodeType":"YulAssignment","src":"8604:37:20","value":{"arguments":[{"name":"high","nativeSrc":"8616:4:20","nodeType":"YulIdentifier","src":"8616:4:20"},{"arguments":[{"name":"remainder","nativeSrc":"8625:9:20","nodeType":"YulIdentifier","src":"8625:9:20"},{"name":"low","nativeSrc":"8636:3:20","nodeType":"YulIdentifier","src":"8636:3:20"}],"functionName":{"name":"gt","nativeSrc":"8622:2:20","nodeType":"YulIdentifier","src":"8622:2:20"},"nativeSrc":"8622:18:20","nodeType":"YulFunctionCall","src":"8622:18:20"}],"functionName":{"name":"sub","nativeSrc":"8612:3:20","nodeType":"YulIdentifier","src":"8612:3:20"},"nativeSrc":"8612:29:20","nodeType":"YulFunctionCall","src":"8612:29:20"},"variableNames":[{"name":"high","nativeSrc":"8604:4:20","nodeType":"YulIdentifier","src":"8604:4:20"}]},{"nativeSrc":"8658:26:20","nodeType":"YulAssignment","src":"8658:26:20","value":{"arguments":[{"name":"low","nativeSrc":"8669:3:20","nodeType":"YulIdentifier","src":"8669:3:20"},{"name":"remainder","nativeSrc":"8674:9:20","nodeType":"YulIdentifier","src":"8674:9:20"}],"functionName":{"name":"sub","nativeSrc":"8665:3:20","nodeType":"YulIdentifier","src":"8665:3:20"},"nativeSrc":"8665:19:20","nodeType":"YulFunctionCall","src":"8665:19:20"},"variableNames":[{"name":"low","nativeSrc":"8658:3:20","nodeType":"YulIdentifier","src":"8658:3:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4746,"isOffset":false,"isSlot":false,"src":"8510:11:20","valueSize":1},{"declaration":4752,"isOffset":false,"isSlot":false,"src":"8604:4:20","valueSize":1},{"declaration":4752,"isOffset":false,"isSlot":false,"src":"8616:4:20","valueSize":1},{"declaration":4754,"isOffset":false,"isSlot":false,"src":"8636:3:20","valueSize":1},{"declaration":4754,"isOffset":false,"isSlot":false,"src":"8658:3:20","valueSize":1},{"declaration":4754,"isOffset":false,"isSlot":false,"src":"8669:3:20","valueSize":1},{"declaration":4789,"isOffset":false,"isSlot":false,"src":"8484:9:20","valueSize":1},{"declaration":4789,"isOffset":false,"isSlot":false,"src":"8625:9:20","valueSize":1},{"declaration":4789,"isOffset":false,"isSlot":false,"src":"8674:9:20","valueSize":1},{"declaration":4742,"isOffset":false,"isSlot":false,"src":"8504:1:20","valueSize":1},{"declaration":4744,"isOffset":false,"isSlot":false,"src":"8507:1:20","valueSize":1}],"flags":["memory-safe"],"id":4791,"nodeType":"InlineAssembly","src":"8390:308:20"},{"assignments":[4793],"declarations":[{"constant":false,"id":4793,"mutability":"mutable","name":"twos","nameLocation":"8910:4:20","nodeType":"VariableDeclaration","scope":4873,"src":"8902:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4792,"name":"uint256","nodeType":"ElementaryTypeName","src":"8902:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4800,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4794,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"8917:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"30","id":4795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8932:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4796,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"8936:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8932:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4798,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8931:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8917:31:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8902:46:20"},{"AST":{"nativeSrc":"8987:359:20","nodeType":"YulBlock","src":"8987:359:20","statements":[{"nativeSrc":"9052:37:20","nodeType":"YulAssignment","src":"9052:37:20","value":{"arguments":[{"name":"denominator","nativeSrc":"9071:11:20","nodeType":"YulIdentifier","src":"9071:11:20"},{"name":"twos","nativeSrc":"9084:4:20","nodeType":"YulIdentifier","src":"9084:4:20"}],"functionName":{"name":"div","nativeSrc":"9067:3:20","nodeType":"YulIdentifier","src":"9067:3:20"},"nativeSrc":"9067:22:20","nodeType":"YulFunctionCall","src":"9067:22:20"},"variableNames":[{"name":"denominator","nativeSrc":"9052:11:20","nodeType":"YulIdentifier","src":"9052:11:20"}]},{"nativeSrc":"9153:21:20","nodeType":"YulAssignment","src":"9153:21:20","value":{"arguments":[{"name":"low","nativeSrc":"9164:3:20","nodeType":"YulIdentifier","src":"9164:3:20"},{"name":"twos","nativeSrc":"9169:4:20","nodeType":"YulIdentifier","src":"9169:4:20"}],"functionName":{"name":"div","nativeSrc":"9160:3:20","nodeType":"YulIdentifier","src":"9160:3:20"},"nativeSrc":"9160:14:20","nodeType":"YulFunctionCall","src":"9160:14:20"},"variableNames":[{"name":"low","nativeSrc":"9153:3:20","nodeType":"YulIdentifier","src":"9153:3:20"}]},{"nativeSrc":"9293:39:20","nodeType":"YulAssignment","src":"9293:39:20","value":{"arguments":[{"arguments":[{"arguments":[{"kind":"number","nativeSrc":"9313:1:20","nodeType":"YulLiteral","src":"9313:1:20","type":"","value":"0"},{"name":"twos","nativeSrc":"9316:4:20","nodeType":"YulIdentifier","src":"9316:4:20"}],"functionName":{"name":"sub","nativeSrc":"9309:3:20","nodeType":"YulIdentifier","src":"9309:3:20"},"nativeSrc":"9309:12:20","nodeType":"YulFunctionCall","src":"9309:12:20"},{"name":"twos","nativeSrc":"9323:4:20","nodeType":"YulIdentifier","src":"9323:4:20"}],"functionName":{"name":"div","nativeSrc":"9305:3:20","nodeType":"YulIdentifier","src":"9305:3:20"},"nativeSrc":"9305:23:20","nodeType":"YulFunctionCall","src":"9305:23:20"},{"kind":"number","nativeSrc":"9330:1:20","nodeType":"YulLiteral","src":"9330:1:20","type":"","value":"1"}],"functionName":{"name":"add","nativeSrc":"9301:3:20","nodeType":"YulIdentifier","src":"9301:3:20"},"nativeSrc":"9301:31:20","nodeType":"YulFunctionCall","src":"9301:31:20"},"variableNames":[{"name":"twos","nativeSrc":"9293:4:20","nodeType":"YulIdentifier","src":"9293:4:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":4746,"isOffset":false,"isSlot":false,"src":"9052:11:20","valueSize":1},{"declaration":4746,"isOffset":false,"isSlot":false,"src":"9071:11:20","valueSize":1},{"declaration":4754,"isOffset":false,"isSlot":false,"src":"9153:3:20","valueSize":1},{"declaration":4754,"isOffset":false,"isSlot":false,"src":"9164:3:20","valueSize":1},{"declaration":4793,"isOffset":false,"isSlot":false,"src":"9084:4:20","valueSize":1},{"declaration":4793,"isOffset":false,"isSlot":false,"src":"9169:4:20","valueSize":1},{"declaration":4793,"isOffset":false,"isSlot":false,"src":"9293:4:20","valueSize":1},{"declaration":4793,"isOffset":false,"isSlot":false,"src":"9316:4:20","valueSize":1},{"declaration":4793,"isOffset":false,"isSlot":false,"src":"9323:4:20","valueSize":1}],"flags":["memory-safe"],"id":4801,"nodeType":"InlineAssembly","src":"8962:384:20"},{"expression":{"id":4806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4802,"name":"low","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4754,"src":"9409:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4805,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4803,"name":"high","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4752,"src":"9416:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4804,"name":"twos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4793,"src":"9423:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9416:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9409:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4807,"nodeType":"ExpressionStatement","src":"9409:18:20"},{"assignments":[4809],"declarations":[{"constant":false,"id":4809,"mutability":"mutable","name":"inverse","nameLocation":"9770:7:20","nodeType":"VariableDeclaration","scope":4873,"src":"9762:15:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4808,"name":"uint256","nodeType":"ElementaryTypeName","src":"9762:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4816,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"33","id":4810,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9781:1:20","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4811,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"9785:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9781:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4813,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9780:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"hexValue":"32","id":4814,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9800:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"9780:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9762:39:20"},{"expression":{"id":4823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4817,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10018:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10029:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4819,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10033:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4820,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10047:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10033:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10029:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10018:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4824,"nodeType":"ExpressionStatement","src":"10018:36:20"},{"expression":{"id":4831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4825,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10088:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4826,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10099:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4827,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10103:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4828,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10117:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10103:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10099:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10088:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4832,"nodeType":"ExpressionStatement","src":"10088:36:20"},{"expression":{"id":4839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4833,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10160:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4838,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4834,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10171:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4837,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4835,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10175:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4836,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10189:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10175:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10171:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10160:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4840,"nodeType":"ExpressionStatement","src":"10160:36:20"},{"expression":{"id":4847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4841,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10231:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10242:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4843,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10246:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4844,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10260:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10246:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10242:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10231:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4848,"nodeType":"ExpressionStatement","src":"10231:36:20"},{"expression":{"id":4855,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4849,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10304:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4850,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10315:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4851,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10319:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4852,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10333:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10319:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10315:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10304:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4856,"nodeType":"ExpressionStatement","src":"10304:36:20"},{"expression":{"id":4863,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4857,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10378:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"*=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"32","id":4858,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10389:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4859,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4746,"src":"10393:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4860,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10407:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10393:21:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10389:25:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10378:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4864,"nodeType":"ExpressionStatement","src":"10378:36:20"},{"expression":{"id":4869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4865,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4749,"src":"10859:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4868,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4866,"name":"low","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4754,"src":"10868:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":4867,"name":"inverse","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4809,"src":"10874:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10868:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10859:22:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4870,"nodeType":"ExpressionStatement","src":"10859:22:20"},{"expression":{"id":4871,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4749,"src":"10902:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4750,"id":4872,"nodeType":"Return","src":"10895:13:20"}]}]},"documentation":{"id":4740,"nodeType":"StructuredDocumentation","src":"6925:312:20","text":" @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n denominator == 0.\n Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n Uniswap Labs also under MIT license."},"id":4875,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"7251:6:20","nodeType":"FunctionDefinition","parameters":{"id":4747,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4742,"mutability":"mutable","name":"x","nameLocation":"7266:1:20","nodeType":"VariableDeclaration","scope":4875,"src":"7258:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4741,"name":"uint256","nodeType":"ElementaryTypeName","src":"7258:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4744,"mutability":"mutable","name":"y","nameLocation":"7277:1:20","nodeType":"VariableDeclaration","scope":4875,"src":"7269:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4743,"name":"uint256","nodeType":"ElementaryTypeName","src":"7269:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4746,"mutability":"mutable","name":"denominator","nameLocation":"7288:11:20","nodeType":"VariableDeclaration","scope":4875,"src":"7280:19:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4745,"name":"uint256","nodeType":"ElementaryTypeName","src":"7280:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7257:43:20"},"returnParameters":{"id":4750,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4749,"mutability":"mutable","name":"result","nameLocation":"7332:6:20","nodeType":"VariableDeclaration","scope":4875,"src":"7324:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4748,"name":"uint256","nodeType":"ElementaryTypeName","src":"7324:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7323:16:20"},"scope":5969,"src":"7242:3683:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4911,"nodeType":"Block","src":"11164:128:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4909,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4891,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4878,"src":"11188:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4892,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4880,"src":"11191:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4893,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4882,"src":"11194:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4890,"name":"mulDiv","nodeType":"Identifier","overloadedDeclarations":[4875,4912],"referencedDeclaration":4875,"src":"11181:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":4894,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11181:25:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4898,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4885,"src":"11242:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":4897,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"11225:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":4899,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11225:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4901,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4878,"src":"11262:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4902,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4880,"src":"11265:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4903,"name":"denominator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4882,"src":"11268:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4900,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"11255:6:20","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":4904,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11255:25:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11283:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11255:29:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11225:59:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4895,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"11209:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4896,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11218:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"11209:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11209:76:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11181:104:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4889,"id":4910,"nodeType":"Return","src":"11174:111:20"}]},"documentation":{"id":4876,"nodeType":"StructuredDocumentation","src":"10931:118:20","text":" @dev Calculates x * y / denominator with full precision, following the selected rounding direction."},"id":4912,"implemented":true,"kind":"function","modifiers":[],"name":"mulDiv","nameLocation":"11063:6:20","nodeType":"FunctionDefinition","parameters":{"id":4886,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4878,"mutability":"mutable","name":"x","nameLocation":"11078:1:20","nodeType":"VariableDeclaration","scope":4912,"src":"11070:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4877,"name":"uint256","nodeType":"ElementaryTypeName","src":"11070:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4880,"mutability":"mutable","name":"y","nameLocation":"11089:1:20","nodeType":"VariableDeclaration","scope":4912,"src":"11081:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4879,"name":"uint256","nodeType":"ElementaryTypeName","src":"11081:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4882,"mutability":"mutable","name":"denominator","nameLocation":"11100:11:20","nodeType":"VariableDeclaration","scope":4912,"src":"11092:19:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4881,"name":"uint256","nodeType":"ElementaryTypeName","src":"11092:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4885,"mutability":"mutable","name":"rounding","nameLocation":"11122:8:20","nodeType":"VariableDeclaration","scope":4912,"src":"11113:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":4884,"nodeType":"UserDefinedTypeName","pathNode":{"id":4883,"name":"Rounding","nameLocations":["11113:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"11113:8:20"},"referencedDeclaration":4360,"src":"11113:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"11069:62:20"},"returnParameters":{"id":4889,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4888,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4912,"src":"11155:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4887,"name":"uint256","nodeType":"ElementaryTypeName","src":"11155:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11154:9:20"},"scope":5969,"src":"11054:238:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":4961,"nodeType":"Block","src":"11500:245:20","statements":[{"id":4960,"nodeType":"UncheckedBlock","src":"11510:229:20","statements":[{"assignments":[4925,4927],"declarations":[{"constant":false,"id":4925,"mutability":"mutable","name":"high","nameLocation":"11543:4:20","nodeType":"VariableDeclaration","scope":4960,"src":"11535:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4924,"name":"uint256","nodeType":"ElementaryTypeName","src":"11535:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4927,"mutability":"mutable","name":"low","nameLocation":"11557:3:20","nodeType":"VariableDeclaration","scope":4960,"src":"11549:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4926,"name":"uint256","nodeType":"ElementaryTypeName","src":"11549:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4932,"initialValue":{"arguments":[{"id":4929,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4915,"src":"11571:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4930,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4917,"src":"11574:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4928,"name":"mul512","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4388,"src":"11564:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (uint256,uint256)"}},"id":4931,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11564:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"11534:42:20"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4933,"name":"high","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4925,"src":"11594:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":4934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11602:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"id":4935,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4919,"src":"11607:1:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"11602:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11594:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4946,"nodeType":"IfStatement","src":"11590:86:20","trueBody":{"id":4945,"nodeType":"Block","src":"11610:66:20","statements":[{"expression":{"arguments":[{"expression":{"id":4941,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"11640:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4942,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"11646:14:20","memberName":"UNDER_OVERFLOW","nodeType":"MemberAccess","referencedDeclaration":1243,"src":"11640:20:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4938,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"11628:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":4940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11634:5:20","memberName":"panic","nodeType":"MemberAccess","referencedDeclaration":1279,"src":"11628:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$__$","typeString":"function (uint256) pure"}},"id":4943,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11628:33:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4944,"nodeType":"ExpressionStatement","src":"11628:33:20"}]}},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4958,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4947,"name":"high","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4925,"src":"11697:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint16","typeString":"uint16"},"id":4950,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"323536","id":4948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11706:3:20","typeDescriptions":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"},"value":"256"},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4949,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4919,"src":"11712:1:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"11706:7:20","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"id":4951,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11705:9:20","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"11697:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4953,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11696:19:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4954,"name":"low","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4927,"src":"11719:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":4955,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4919,"src":"11726:1:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"11719:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":4957,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"11718:10:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11696:32:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4923,"id":4959,"nodeType":"Return","src":"11689:39:20"}]}]},"documentation":{"id":4913,"nodeType":"StructuredDocumentation","src":"11298:111:20","text":" @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256."},"id":4962,"implemented":true,"kind":"function","modifiers":[],"name":"mulShr","nameLocation":"11423:6:20","nodeType":"FunctionDefinition","parameters":{"id":4920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4915,"mutability":"mutable","name":"x","nameLocation":"11438:1:20","nodeType":"VariableDeclaration","scope":4962,"src":"11430:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4914,"name":"uint256","nodeType":"ElementaryTypeName","src":"11430:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4917,"mutability":"mutable","name":"y","nameLocation":"11449:1:20","nodeType":"VariableDeclaration","scope":4962,"src":"11441:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4916,"name":"uint256","nodeType":"ElementaryTypeName","src":"11441:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4919,"mutability":"mutable","name":"n","nameLocation":"11458:1:20","nodeType":"VariableDeclaration","scope":4962,"src":"11452:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":4918,"name":"uint8","nodeType":"ElementaryTypeName","src":"11452:5:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"11429:31:20"},"returnParameters":{"id":4923,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4922,"mutability":"mutable","name":"result","nameLocation":"11492:6:20","nodeType":"VariableDeclaration","scope":4962,"src":"11484:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4921,"name":"uint256","nodeType":"ElementaryTypeName","src":"11484:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11483:16:20"},"scope":5969,"src":"11414:331:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5000,"nodeType":"Block","src":"11963:113:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4978,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4965,"src":"11987:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4979,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4967,"src":"11990:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4980,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4969,"src":"11993:1:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"id":4977,"name":"mulShr","nodeType":"Identifier","overloadedDeclarations":[4962,5001],"referencedDeclaration":4962,"src":"11980:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint8_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint8) pure returns (uint256)"}},"id":4981,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11980:15:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4985,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4972,"src":"12031:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":4984,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"12014:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":4986,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12014:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4995,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4988,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4965,"src":"12051:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":4989,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4967,"src":"12054:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4992,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":4990,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12057:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"id":4991,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4969,"src":"12062:1:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"12057:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4987,"name":"mulmod","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-16,"src":"12044:6:20","typeDescriptions":{"typeIdentifier":"t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) pure returns (uint256)"}},"id":4993,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12044:20:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4994,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12067:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"12044:24:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12014:54:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":4982,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"11998:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":4983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12007:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"11998:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":4997,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11998:71:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11980:89:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":4976,"id":4999,"nodeType":"Return","src":"11973:96:20"}]},"documentation":{"id":4963,"nodeType":"StructuredDocumentation","src":"11751:109:20","text":" @dev Calculates x * y >> n with full precision, following the selected rounding direction."},"id":5001,"implemented":true,"kind":"function","modifiers":[],"name":"mulShr","nameLocation":"11874:6:20","nodeType":"FunctionDefinition","parameters":{"id":4973,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4965,"mutability":"mutable","name":"x","nameLocation":"11889:1:20","nodeType":"VariableDeclaration","scope":5001,"src":"11881:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4964,"name":"uint256","nodeType":"ElementaryTypeName","src":"11881:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4967,"mutability":"mutable","name":"y","nameLocation":"11900:1:20","nodeType":"VariableDeclaration","scope":5001,"src":"11892:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4966,"name":"uint256","nodeType":"ElementaryTypeName","src":"11892:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4969,"mutability":"mutable","name":"n","nameLocation":"11909:1:20","nodeType":"VariableDeclaration","scope":5001,"src":"11903:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":4968,"name":"uint8","nodeType":"ElementaryTypeName","src":"11903:5:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":4972,"mutability":"mutable","name":"rounding","nameLocation":"11921:8:20","nodeType":"VariableDeclaration","scope":5001,"src":"11912:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":4971,"nodeType":"UserDefinedTypeName","pathNode":{"id":4970,"name":"Rounding","nameLocations":["11912:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"11912:8:20"},"referencedDeclaration":4360,"src":"11912:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"11880:50:20"},"returnParameters":{"id":4976,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4975,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5001,"src":"11954:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4974,"name":"uint256","nodeType":"ElementaryTypeName","src":"11954:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11953:9:20"},"scope":5969,"src":"11865:211:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5097,"nodeType":"Block","src":"12710:1849:20","statements":[{"id":5096,"nodeType":"UncheckedBlock","src":"12720:1833:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5011,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5006,"src":"12748:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12753:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"12748:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5016,"nodeType":"IfStatement","src":"12744:20:20","trueBody":{"expression":{"hexValue":"30","id":5014,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12763:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":5010,"id":5015,"nodeType":"Return","src":"12756:8:20"}},{"assignments":[5018],"declarations":[{"constant":false,"id":5018,"mutability":"mutable","name":"remainder","nameLocation":"13243:9:20","nodeType":"VariableDeclaration","scope":5096,"src":"13235:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5017,"name":"uint256","nodeType":"ElementaryTypeName","src":"13235:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5022,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5021,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5019,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5004,"src":"13255:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"id":5020,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5006,"src":"13259:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13255:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13235:25:20"},{"assignments":[5024],"declarations":[{"constant":false,"id":5024,"mutability":"mutable","name":"gcd","nameLocation":"13282:3:20","nodeType":"VariableDeclaration","scope":5096,"src":"13274:11:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5023,"name":"uint256","nodeType":"ElementaryTypeName","src":"13274:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5026,"initialValue":{"id":5025,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5006,"src":"13288:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13274:15:20"},{"assignments":[5028],"declarations":[{"constant":false,"id":5028,"mutability":"mutable","name":"x","nameLocation":"13432:1:20","nodeType":"VariableDeclaration","scope":5096,"src":"13425:8:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":5027,"name":"int256","nodeType":"ElementaryTypeName","src":"13425:6:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":5030,"initialValue":{"hexValue":"30","id":5029,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13436:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"13425:12:20"},{"assignments":[5032],"declarations":[{"constant":false,"id":5032,"mutability":"mutable","name":"y","nameLocation":"13458:1:20","nodeType":"VariableDeclaration","scope":5096,"src":"13451:8:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":5031,"name":"int256","nodeType":"ElementaryTypeName","src":"13451:6:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":5034,"initialValue":{"hexValue":"31","id":5033,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13462:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"13451:12:20"},{"body":{"id":5071,"nodeType":"Block","src":"13501:882:20","statements":[{"assignments":[5039],"declarations":[{"constant":false,"id":5039,"mutability":"mutable","name":"quotient","nameLocation":"13527:8:20","nodeType":"VariableDeclaration","scope":5071,"src":"13519:16:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5038,"name":"uint256","nodeType":"ElementaryTypeName","src":"13519:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5043,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5040,"name":"gcd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5024,"src":"13538:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5041,"name":"remainder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5018,"src":"13544:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13538:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13519:34:20"},{"expression":{"id":5054,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":5044,"name":"gcd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5024,"src":"13573:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5045,"name":"remainder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5018,"src":"13578:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5046,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"13572:16:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"id":5047,"name":"remainder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5018,"src":"13678:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5052,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5048,"name":"gcd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5024,"src":"13923:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5051,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5049,"name":"remainder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5018,"src":"13929:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5050,"name":"quotient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5039,"src":"13941:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13929:20:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13923:26:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5053,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13591:376:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"src":"13572:395:20","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5055,"nodeType":"ExpressionStatement","src":"13572:395:20"},{"expression":{"id":5069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":5056,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5028,"src":"13987:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},{"id":5057,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5032,"src":"13990:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":5058,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"13986:6:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_int256_$_t_int256_$","typeString":"tuple(int256,int256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"components":[{"id":5059,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5032,"src":"14072:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":5067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5060,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5028,"src":"14326:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":5066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5061,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5032,"src":"14330:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"id":5064,"name":"quotient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5039,"src":"14341:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5063,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14334:6:20","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":5062,"name":"int256","nodeType":"ElementaryTypeName","src":"14334:6:20","typeDescriptions":{}}},"id":5065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14334:16:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"14330:20:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"14326:24:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":5068,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"13995:373:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_int256_$_t_int256_$","typeString":"tuple(int256,int256)"}},"src":"13986:382:20","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5070,"nodeType":"ExpressionStatement","src":"13986:382:20"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5037,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5035,"name":"remainder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5018,"src":"13485:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":5036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13498:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"13485:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5072,"nodeType":"WhileStatement","src":"13478:905:20"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5075,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5073,"name":"gcd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5024,"src":"14401:3:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"31","id":5074,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14408:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"14401:8:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5078,"nodeType":"IfStatement","src":"14397:22:20","trueBody":{"expression":{"hexValue":"30","id":5076,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14418:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":5010,"id":5077,"nodeType":"Return","src":"14411:8:20"}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":5082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5080,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5028,"src":"14470:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"30","id":5081,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14474:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14470:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5089,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5083,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5006,"src":"14477:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"id":5087,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"-","prefix":true,"src":"14489:2:20","subExpression":{"id":5086,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5028,"src":"14490:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":5085,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14481:7:20","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":5084,"name":"uint256","nodeType":"ElementaryTypeName","src":"14481:7:20","typeDescriptions":{}}},"id":5088,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14481:11:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14477:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":5092,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5028,"src":"14502:1:20","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":5091,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14494:7:20","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":5090,"name":"uint256","nodeType":"ElementaryTypeName","src":"14494:7:20","typeDescriptions":{}}},"id":5093,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14494:10:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5079,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4637,"src":"14462:7:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (bool,uint256,uint256) pure returns (uint256)"}},"id":5094,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14462:43:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5010,"id":5095,"nodeType":"Return","src":"14455:50:20"}]}]},"documentation":{"id":5002,"nodeType":"StructuredDocumentation","src":"12082:553:20","text":" @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n If the input value is not inversible, 0 is returned.\n NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}."},"id":5098,"implemented":true,"kind":"function","modifiers":[],"name":"invMod","nameLocation":"12649:6:20","nodeType":"FunctionDefinition","parameters":{"id":5007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5004,"mutability":"mutable","name":"a","nameLocation":"12664:1:20","nodeType":"VariableDeclaration","scope":5098,"src":"12656:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5003,"name":"uint256","nodeType":"ElementaryTypeName","src":"12656:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5006,"mutability":"mutable","name":"n","nameLocation":"12675:1:20","nodeType":"VariableDeclaration","scope":5098,"src":"12667:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5005,"name":"uint256","nodeType":"ElementaryTypeName","src":"12667:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12655:22:20"},"returnParameters":{"id":5010,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5009,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5098,"src":"12701:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5008,"name":"uint256","nodeType":"ElementaryTypeName","src":"12701:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12700:9:20"},"scope":5969,"src":"12640:1919:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5118,"nodeType":"Block","src":"15159:82:20","statements":[{"id":5117,"nodeType":"UncheckedBlock","src":"15169:66:20","statements":[{"expression":{"arguments":[{"id":5110,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5101,"src":"15212:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5113,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5111,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5103,"src":"15215:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"32","id":5112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15219:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"15215:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5114,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5103,"src":"15222:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5108,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5969,"src":"15200:4:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Math_$5969_$","typeString":"type(library Math)"}},"id":5109,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15205:6:20","memberName":"modExp","nodeType":"MemberAccess","referencedDeclaration":5155,"src":"15200:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256,uint256) view returns (uint256)"}},"id":5115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15200:24:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5107,"id":5116,"nodeType":"Return","src":"15193:31:20"}]}]},"documentation":{"id":5099,"nodeType":"StructuredDocumentation","src":"14565:514:20","text":" @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n NOTE: this function does NOT check that `p` is a prime greater than `2`."},"id":5119,"implemented":true,"kind":"function","modifiers":[],"name":"invModPrime","nameLocation":"15093:11:20","nodeType":"FunctionDefinition","parameters":{"id":5104,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5101,"mutability":"mutable","name":"a","nameLocation":"15113:1:20","nodeType":"VariableDeclaration","scope":5119,"src":"15105:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5100,"name":"uint256","nodeType":"ElementaryTypeName","src":"15105:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5103,"mutability":"mutable","name":"p","nameLocation":"15124:1:20","nodeType":"VariableDeclaration","scope":5119,"src":"15116:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5102,"name":"uint256","nodeType":"ElementaryTypeName","src":"15116:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15104:22:20"},"returnParameters":{"id":5107,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5106,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5119,"src":"15150:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5105,"name":"uint256","nodeType":"ElementaryTypeName","src":"15150:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15149:9:20"},"scope":5969,"src":"15084:157:20","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5154,"nodeType":"Block","src":"16011:174:20","statements":[{"assignments":[5132,5134],"declarations":[{"constant":false,"id":5132,"mutability":"mutable","name":"success","nameLocation":"16027:7:20","nodeType":"VariableDeclaration","scope":5154,"src":"16022:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5131,"name":"bool","nodeType":"ElementaryTypeName","src":"16022:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5134,"mutability":"mutable","name":"result","nameLocation":"16044:6:20","nodeType":"VariableDeclaration","scope":5154,"src":"16036:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5133,"name":"uint256","nodeType":"ElementaryTypeName","src":"16036:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5140,"initialValue":{"arguments":[{"id":5136,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5122,"src":"16064:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5137,"name":"e","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5124,"src":"16067:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5138,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5126,"src":"16070:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5135,"name":"tryModExp","nodeType":"Identifier","overloadedDeclarations":[5179,5261],"referencedDeclaration":5179,"src":"16054:9:20","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$","typeString":"function (uint256,uint256,uint256) view returns (bool,uint256)"}},"id":5139,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16054:18:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"16021:51:20"},{"condition":{"id":5142,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"16086:8:20","subExpression":{"id":5141,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5132,"src":"16087:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5151,"nodeType":"IfStatement","src":"16082:74:20","trueBody":{"id":5150,"nodeType":"Block","src":"16096:60:20","statements":[{"expression":{"arguments":[{"expression":{"id":5146,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"16122:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":5147,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"16128:16:20","memberName":"DIVISION_BY_ZERO","nodeType":"MemberAccess","referencedDeclaration":1247,"src":"16122:22:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5143,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"16110:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":5145,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16116:5:20","memberName":"panic","nodeType":"MemberAccess","referencedDeclaration":1279,"src":"16110:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$__$","typeString":"function (uint256) pure"}},"id":5148,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16110:35:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5149,"nodeType":"ExpressionStatement","src":"16110:35:20"}]}},{"expression":{"id":5152,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5134,"src":"16172:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5130,"id":5153,"nodeType":"Return","src":"16165:13:20"}]},"documentation":{"id":5120,"nodeType":"StructuredDocumentation","src":"15247:678:20","text":" @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n Requirements:\n - modulus can't be zero\n - underlying staticcall to precompile must succeed\n IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n sure the chain you're using it on supports the precompiled contract for modular exponentiation\n at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n interpreted as 0."},"id":5155,"implemented":true,"kind":"function","modifiers":[],"name":"modExp","nameLocation":"15939:6:20","nodeType":"FunctionDefinition","parameters":{"id":5127,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5122,"mutability":"mutable","name":"b","nameLocation":"15954:1:20","nodeType":"VariableDeclaration","scope":5155,"src":"15946:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5121,"name":"uint256","nodeType":"ElementaryTypeName","src":"15946:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5124,"mutability":"mutable","name":"e","nameLocation":"15965:1:20","nodeType":"VariableDeclaration","scope":5155,"src":"15957:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5123,"name":"uint256","nodeType":"ElementaryTypeName","src":"15957:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5126,"mutability":"mutable","name":"m","nameLocation":"15976:1:20","nodeType":"VariableDeclaration","scope":5155,"src":"15968:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5125,"name":"uint256","nodeType":"ElementaryTypeName","src":"15968:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15945:33:20"},"returnParameters":{"id":5130,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5129,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5155,"src":"16002:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5128,"name":"uint256","nodeType":"ElementaryTypeName","src":"16002:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16001:9:20"},"scope":5969,"src":"15930:255:20","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5178,"nodeType":"Block","src":"17039:1493:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5169,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5162,"src":"17053:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":5170,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17058:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"17053:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5176,"nodeType":"IfStatement","src":"17049:29:20","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":5172,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"17069:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"hexValue":"30","id":5173,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17076:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"id":5174,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"17068:10:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_rational_0_by_1_$","typeString":"tuple(bool,int_const 0)"}},"functionReturnParameters":5168,"id":5175,"nodeType":"Return","src":"17061:17:20"}},{"AST":{"nativeSrc":"17113:1413:20","nodeType":"YulBlock","src":"17113:1413:20","statements":[{"nativeSrc":"17127:22:20","nodeType":"YulVariableDeclaration","src":"17127:22:20","value":{"arguments":[{"kind":"number","nativeSrc":"17144:4:20","nodeType":"YulLiteral","src":"17144:4:20","type":"","value":"0x40"}],"functionName":{"name":"mload","nativeSrc":"17138:5:20","nodeType":"YulIdentifier","src":"17138:5:20"},"nativeSrc":"17138:11:20","nodeType":"YulFunctionCall","src":"17138:11:20"},"variables":[{"name":"ptr","nativeSrc":"17131:3:20","nodeType":"YulTypedName","src":"17131:3:20","type":""}]},{"expression":{"arguments":[{"name":"ptr","nativeSrc":"18057:3:20","nodeType":"YulIdentifier","src":"18057:3:20"},{"kind":"number","nativeSrc":"18062:4:20","nodeType":"YulLiteral","src":"18062:4:20","type":"","value":"0x20"}],"functionName":{"name":"mstore","nativeSrc":"18050:6:20","nodeType":"YulIdentifier","src":"18050:6:20"},"nativeSrc":"18050:17:20","nodeType":"YulFunctionCall","src":"18050:17:20"},"nativeSrc":"18050:17:20","nodeType":"YulExpressionStatement","src":"18050:17:20"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nativeSrc":"18091:3:20","nodeType":"YulIdentifier","src":"18091:3:20"},{"kind":"number","nativeSrc":"18096:4:20","nodeType":"YulLiteral","src":"18096:4:20","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"18087:3:20","nodeType":"YulIdentifier","src":"18087:3:20"},"nativeSrc":"18087:14:20","nodeType":"YulFunctionCall","src":"18087:14:20"},{"kind":"number","nativeSrc":"18103:4:20","nodeType":"YulLiteral","src":"18103:4:20","type":"","value":"0x20"}],"functionName":{"name":"mstore","nativeSrc":"18080:6:20","nodeType":"YulIdentifier","src":"18080:6:20"},"nativeSrc":"18080:28:20","nodeType":"YulFunctionCall","src":"18080:28:20"},"nativeSrc":"18080:28:20","nodeType":"YulExpressionStatement","src":"18080:28:20"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nativeSrc":"18132:3:20","nodeType":"YulIdentifier","src":"18132:3:20"},{"kind":"number","nativeSrc":"18137:4:20","nodeType":"YulLiteral","src":"18137:4:20","type":"","value":"0x40"}],"functionName":{"name":"add","nativeSrc":"18128:3:20","nodeType":"YulIdentifier","src":"18128:3:20"},"nativeSrc":"18128:14:20","nodeType":"YulFunctionCall","src":"18128:14:20"},{"kind":"number","nativeSrc":"18144:4:20","nodeType":"YulLiteral","src":"18144:4:20","type":"","value":"0x20"}],"functionName":{"name":"mstore","nativeSrc":"18121:6:20","nodeType":"YulIdentifier","src":"18121:6:20"},"nativeSrc":"18121:28:20","nodeType":"YulFunctionCall","src":"18121:28:20"},"nativeSrc":"18121:28:20","nodeType":"YulExpressionStatement","src":"18121:28:20"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nativeSrc":"18173:3:20","nodeType":"YulIdentifier","src":"18173:3:20"},{"kind":"number","nativeSrc":"18178:4:20","nodeType":"YulLiteral","src":"18178:4:20","type":"","value":"0x60"}],"functionName":{"name":"add","nativeSrc":"18169:3:20","nodeType":"YulIdentifier","src":"18169:3:20"},"nativeSrc":"18169:14:20","nodeType":"YulFunctionCall","src":"18169:14:20"},{"name":"b","nativeSrc":"18185:1:20","nodeType":"YulIdentifier","src":"18185:1:20"}],"functionName":{"name":"mstore","nativeSrc":"18162:6:20","nodeType":"YulIdentifier","src":"18162:6:20"},"nativeSrc":"18162:25:20","nodeType":"YulFunctionCall","src":"18162:25:20"},"nativeSrc":"18162:25:20","nodeType":"YulExpressionStatement","src":"18162:25:20"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nativeSrc":"18211:3:20","nodeType":"YulIdentifier","src":"18211:3:20"},{"kind":"number","nativeSrc":"18216:4:20","nodeType":"YulLiteral","src":"18216:4:20","type":"","value":"0x80"}],"functionName":{"name":"add","nativeSrc":"18207:3:20","nodeType":"YulIdentifier","src":"18207:3:20"},"nativeSrc":"18207:14:20","nodeType":"YulFunctionCall","src":"18207:14:20"},{"name":"e","nativeSrc":"18223:1:20","nodeType":"YulIdentifier","src":"18223:1:20"}],"functionName":{"name":"mstore","nativeSrc":"18200:6:20","nodeType":"YulIdentifier","src":"18200:6:20"},"nativeSrc":"18200:25:20","nodeType":"YulFunctionCall","src":"18200:25:20"},"nativeSrc":"18200:25:20","nodeType":"YulExpressionStatement","src":"18200:25:20"},{"expression":{"arguments":[{"arguments":[{"name":"ptr","nativeSrc":"18249:3:20","nodeType":"YulIdentifier","src":"18249:3:20"},{"kind":"number","nativeSrc":"18254:4:20","nodeType":"YulLiteral","src":"18254:4:20","type":"","value":"0xa0"}],"functionName":{"name":"add","nativeSrc":"18245:3:20","nodeType":"YulIdentifier","src":"18245:3:20"},"nativeSrc":"18245:14:20","nodeType":"YulFunctionCall","src":"18245:14:20"},{"name":"m","nativeSrc":"18261:1:20","nodeType":"YulIdentifier","src":"18261:1:20"}],"functionName":{"name":"mstore","nativeSrc":"18238:6:20","nodeType":"YulIdentifier","src":"18238:6:20"},"nativeSrc":"18238:25:20","nodeType":"YulFunctionCall","src":"18238:25:20"},"nativeSrc":"18238:25:20","nodeType":"YulExpressionStatement","src":"18238:25:20"},{"nativeSrc":"18425:57:20","nodeType":"YulAssignment","src":"18425:57:20","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nativeSrc":"18447:3:20","nodeType":"YulIdentifier","src":"18447:3:20"},"nativeSrc":"18447:5:20","nodeType":"YulFunctionCall","src":"18447:5:20"},{"kind":"number","nativeSrc":"18454:4:20","nodeType":"YulLiteral","src":"18454:4:20","type":"","value":"0x05"},{"name":"ptr","nativeSrc":"18460:3:20","nodeType":"YulIdentifier","src":"18460:3:20"},{"kind":"number","nativeSrc":"18465:4:20","nodeType":"YulLiteral","src":"18465:4:20","type":"","value":"0xc0"},{"kind":"number","nativeSrc":"18471:4:20","nodeType":"YulLiteral","src":"18471:4:20","type":"","value":"0x00"},{"kind":"number","nativeSrc":"18477:4:20","nodeType":"YulLiteral","src":"18477:4:20","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nativeSrc":"18436:10:20","nodeType":"YulIdentifier","src":"18436:10:20"},"nativeSrc":"18436:46:20","nodeType":"YulFunctionCall","src":"18436:46:20"},"variableNames":[{"name":"success","nativeSrc":"18425:7:20","nodeType":"YulIdentifier","src":"18425:7:20"}]},{"nativeSrc":"18495:21:20","nodeType":"YulAssignment","src":"18495:21:20","value":{"arguments":[{"kind":"number","nativeSrc":"18511:4:20","nodeType":"YulLiteral","src":"18511:4:20","type":"","value":"0x00"}],"functionName":{"name":"mload","nativeSrc":"18505:5:20","nodeType":"YulIdentifier","src":"18505:5:20"},"nativeSrc":"18505:11:20","nodeType":"YulFunctionCall","src":"18505:11:20"},"variableNames":[{"name":"result","nativeSrc":"18495:6:20","nodeType":"YulIdentifier","src":"18495:6:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":5158,"isOffset":false,"isSlot":false,"src":"18185:1:20","valueSize":1},{"declaration":5160,"isOffset":false,"isSlot":false,"src":"18223:1:20","valueSize":1},{"declaration":5162,"isOffset":false,"isSlot":false,"src":"18261:1:20","valueSize":1},{"declaration":5167,"isOffset":false,"isSlot":false,"src":"18495:6:20","valueSize":1},{"declaration":5165,"isOffset":false,"isSlot":false,"src":"18425:7:20","valueSize":1}],"flags":["memory-safe"],"id":5177,"nodeType":"InlineAssembly","src":"17088:1438:20"}]},"documentation":{"id":5156,"nodeType":"StructuredDocumentation","src":"16191:738:20","text":" @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n to operate modulo 0 or if the underlying precompile reverted.\n IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n of a revert, but the result may be incorrectly interpreted as 0."},"id":5179,"implemented":true,"kind":"function","modifiers":[],"name":"tryModExp","nameLocation":"16943:9:20","nodeType":"FunctionDefinition","parameters":{"id":5163,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5158,"mutability":"mutable","name":"b","nameLocation":"16961:1:20","nodeType":"VariableDeclaration","scope":5179,"src":"16953:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5157,"name":"uint256","nodeType":"ElementaryTypeName","src":"16953:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5160,"mutability":"mutable","name":"e","nameLocation":"16972:1:20","nodeType":"VariableDeclaration","scope":5179,"src":"16964:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5159,"name":"uint256","nodeType":"ElementaryTypeName","src":"16964:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5162,"mutability":"mutable","name":"m","nameLocation":"16983:1:20","nodeType":"VariableDeclaration","scope":5179,"src":"16975:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5161,"name":"uint256","nodeType":"ElementaryTypeName","src":"16975:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16952:33:20"},"returnParameters":{"id":5168,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5165,"mutability":"mutable","name":"success","nameLocation":"17014:7:20","nodeType":"VariableDeclaration","scope":5179,"src":"17009:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5164,"name":"bool","nodeType":"ElementaryTypeName","src":"17009:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5167,"mutability":"mutable","name":"result","nameLocation":"17031:6:20","nodeType":"VariableDeclaration","scope":5179,"src":"17023:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5166,"name":"uint256","nodeType":"ElementaryTypeName","src":"17023:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17008:30:20"},"scope":5969,"src":"16934:1598:20","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5214,"nodeType":"Block","src":"18729:179:20","statements":[{"assignments":[5192,5194],"declarations":[{"constant":false,"id":5192,"mutability":"mutable","name":"success","nameLocation":"18745:7:20","nodeType":"VariableDeclaration","scope":5214,"src":"18740:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5191,"name":"bool","nodeType":"ElementaryTypeName","src":"18740:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5194,"mutability":"mutable","name":"result","nameLocation":"18767:6:20","nodeType":"VariableDeclaration","scope":5214,"src":"18754:19:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5193,"name":"bytes","nodeType":"ElementaryTypeName","src":"18754:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":5200,"initialValue":{"arguments":[{"id":5196,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5182,"src":"18787:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5197,"name":"e","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5184,"src":"18790:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5198,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5186,"src":"18793:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5195,"name":"tryModExp","nodeType":"Identifier","overloadedDeclarations":[5179,5261],"referencedDeclaration":5261,"src":"18777:9:20","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory,bytes memory,bytes memory) view returns (bool,bytes memory)"}},"id":5199,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18777:18:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"18739:56:20"},{"condition":{"id":5202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"18809:8:20","subExpression":{"id":5201,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5192,"src":"18810:7:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5211,"nodeType":"IfStatement","src":"18805:74:20","trueBody":{"id":5210,"nodeType":"Block","src":"18819:60:20","statements":[{"expression":{"arguments":[{"expression":{"id":5206,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"18845:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":5207,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"18851:16:20","memberName":"DIVISION_BY_ZERO","nodeType":"MemberAccess","referencedDeclaration":1247,"src":"18845:22:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":5203,"name":"Panic","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1280,"src":"18833:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Panic_$1280_$","typeString":"type(library Panic)"}},"id":5205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"18839:5:20","memberName":"panic","nodeType":"MemberAccess","referencedDeclaration":1279,"src":"18833:11:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$__$","typeString":"function (uint256) pure"}},"id":5208,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18833:35:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":5209,"nodeType":"ExpressionStatement","src":"18833:35:20"}]}},{"expression":{"id":5212,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5194,"src":"18895:6:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":5190,"id":5213,"nodeType":"Return","src":"18888:13:20"}]},"documentation":{"id":5180,"nodeType":"StructuredDocumentation","src":"18538:85:20","text":" @dev Variant of {modExp} that supports inputs of arbitrary length."},"id":5215,"implemented":true,"kind":"function","modifiers":[],"name":"modExp","nameLocation":"18637:6:20","nodeType":"FunctionDefinition","parameters":{"id":5187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5182,"mutability":"mutable","name":"b","nameLocation":"18657:1:20","nodeType":"VariableDeclaration","scope":5215,"src":"18644:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5181,"name":"bytes","nodeType":"ElementaryTypeName","src":"18644:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5184,"mutability":"mutable","name":"e","nameLocation":"18673:1:20","nodeType":"VariableDeclaration","scope":5215,"src":"18660:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5183,"name":"bytes","nodeType":"ElementaryTypeName","src":"18660:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5186,"mutability":"mutable","name":"m","nameLocation":"18689:1:20","nodeType":"VariableDeclaration","scope":5215,"src":"18676:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5185,"name":"bytes","nodeType":"ElementaryTypeName","src":"18676:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"18643:48:20"},"returnParameters":{"id":5190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5189,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5215,"src":"18715:12:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5188,"name":"bytes","nodeType":"ElementaryTypeName","src":"18715:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"18714:14:20"},"scope":5969,"src":"18628:280:20","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5260,"nodeType":"Block","src":"19162:771:20","statements":[{"condition":{"arguments":[{"id":5230,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5222,"src":"19187:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":5229,"name":"_zeroBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5294,"src":"19176:10:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (bytes memory) pure returns (bool)"}},"id":5231,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19176:13:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5239,"nodeType":"IfStatement","src":"19172:47:20","trueBody":{"expression":{"components":[{"hexValue":"66616c7365","id":5232,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"19199:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},{"arguments":[{"hexValue":"30","id":5235,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19216:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":5234,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"19206:9:20","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":5233,"name":"bytes","nodeType":"ElementaryTypeName","src":"19210:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":5236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19206:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"id":5237,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"19198:21:20","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"functionReturnParameters":5228,"id":5238,"nodeType":"Return","src":"19191:28:20"}},{"assignments":[5241],"declarations":[{"constant":false,"id":5241,"mutability":"mutable","name":"mLen","nameLocation":"19238:4:20","nodeType":"VariableDeclaration","scope":5260,"src":"19230:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5240,"name":"uint256","nodeType":"ElementaryTypeName","src":"19230:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5244,"initialValue":{"expression":{"id":5242,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5222,"src":"19245:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5243,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19247:6:20","memberName":"length","nodeType":"MemberAccess","src":"19245:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19230:23:20"},{"expression":{"id":5257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5245,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5227,"src":"19335:6:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":5248,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5218,"src":"19361:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19363:6:20","memberName":"length","nodeType":"MemberAccess","src":"19361:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"expression":{"id":5250,"name":"e","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5220,"src":"19371:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19373:6:20","memberName":"length","nodeType":"MemberAccess","src":"19371:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5252,"name":"mLen","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5241,"src":"19381:4:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":5253,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5218,"src":"19387:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5254,"name":"e","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5220,"src":"19390:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":5255,"name":"m","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5222,"src":"19393:1:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":5246,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"19344:3:20","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":5247,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"19348:12:20","memberName":"encodePacked","nodeType":"MemberAccess","src":"19344:16:20","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":5256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19344:51:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"src":"19335:60:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5258,"nodeType":"ExpressionStatement","src":"19335:60:20"},{"AST":{"nativeSrc":"19431:496:20","nodeType":"YulBlock","src":"19431:496:20","statements":[{"nativeSrc":"19445:32:20","nodeType":"YulVariableDeclaration","src":"19445:32:20","value":{"arguments":[{"name":"result","nativeSrc":"19464:6:20","nodeType":"YulIdentifier","src":"19464:6:20"},{"kind":"number","nativeSrc":"19472:4:20","nodeType":"YulLiteral","src":"19472:4:20","type":"","value":"0x20"}],"functionName":{"name":"add","nativeSrc":"19460:3:20","nodeType":"YulIdentifier","src":"19460:3:20"},"nativeSrc":"19460:17:20","nodeType":"YulFunctionCall","src":"19460:17:20"},"variables":[{"name":"dataPtr","nativeSrc":"19449:7:20","nodeType":"YulTypedName","src":"19449:7:20","type":""}]},{"nativeSrc":"19567:73:20","nodeType":"YulAssignment","src":"19567:73:20","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nativeSrc":"19589:3:20","nodeType":"YulIdentifier","src":"19589:3:20"},"nativeSrc":"19589:5:20","nodeType":"YulFunctionCall","src":"19589:5:20"},{"kind":"number","nativeSrc":"19596:4:20","nodeType":"YulLiteral","src":"19596:4:20","type":"","value":"0x05"},{"name":"dataPtr","nativeSrc":"19602:7:20","nodeType":"YulIdentifier","src":"19602:7:20"},{"arguments":[{"name":"result","nativeSrc":"19617:6:20","nodeType":"YulIdentifier","src":"19617:6:20"}],"functionName":{"name":"mload","nativeSrc":"19611:5:20","nodeType":"YulIdentifier","src":"19611:5:20"},"nativeSrc":"19611:13:20","nodeType":"YulFunctionCall","src":"19611:13:20"},{"name":"dataPtr","nativeSrc":"19626:7:20","nodeType":"YulIdentifier","src":"19626:7:20"},{"name":"mLen","nativeSrc":"19635:4:20","nodeType":"YulIdentifier","src":"19635:4:20"}],"functionName":{"name":"staticcall","nativeSrc":"19578:10:20","nodeType":"YulIdentifier","src":"19578:10:20"},"nativeSrc":"19578:62:20","nodeType":"YulFunctionCall","src":"19578:62:20"},"variableNames":[{"name":"success","nativeSrc":"19567:7:20","nodeType":"YulIdentifier","src":"19567:7:20"}]},{"expression":{"arguments":[{"name":"result","nativeSrc":"19796:6:20","nodeType":"YulIdentifier","src":"19796:6:20"},{"name":"mLen","nativeSrc":"19804:4:20","nodeType":"YulIdentifier","src":"19804:4:20"}],"functionName":{"name":"mstore","nativeSrc":"19789:6:20","nodeType":"YulIdentifier","src":"19789:6:20"},"nativeSrc":"19789:20:20","nodeType":"YulFunctionCall","src":"19789:20:20"},"nativeSrc":"19789:20:20","nodeType":"YulExpressionStatement","src":"19789:20:20"},{"expression":{"arguments":[{"kind":"number","nativeSrc":"19892:4:20","nodeType":"YulLiteral","src":"19892:4:20","type":"","value":"0x40"},{"arguments":[{"name":"dataPtr","nativeSrc":"19902:7:20","nodeType":"YulIdentifier","src":"19902:7:20"},{"name":"mLen","nativeSrc":"19911:4:20","nodeType":"YulIdentifier","src":"19911:4:20"}],"functionName":{"name":"add","nativeSrc":"19898:3:20","nodeType":"YulIdentifier","src":"19898:3:20"},"nativeSrc":"19898:18:20","nodeType":"YulFunctionCall","src":"19898:18:20"}],"functionName":{"name":"mstore","nativeSrc":"19885:6:20","nodeType":"YulIdentifier","src":"19885:6:20"},"nativeSrc":"19885:32:20","nodeType":"YulFunctionCall","src":"19885:32:20"},"nativeSrc":"19885:32:20","nodeType":"YulExpressionStatement","src":"19885:32:20"}]},"evmVersion":"paris","externalReferences":[{"declaration":5241,"isOffset":false,"isSlot":false,"src":"19635:4:20","valueSize":1},{"declaration":5241,"isOffset":false,"isSlot":false,"src":"19804:4:20","valueSize":1},{"declaration":5241,"isOffset":false,"isSlot":false,"src":"19911:4:20","valueSize":1},{"declaration":5227,"isOffset":false,"isSlot":false,"src":"19464:6:20","valueSize":1},{"declaration":5227,"isOffset":false,"isSlot":false,"src":"19617:6:20","valueSize":1},{"declaration":5227,"isOffset":false,"isSlot":false,"src":"19796:6:20","valueSize":1},{"declaration":5225,"isOffset":false,"isSlot":false,"src":"19567:7:20","valueSize":1}],"flags":["memory-safe"],"id":5259,"nodeType":"InlineAssembly","src":"19406:521:20"}]},"documentation":{"id":5216,"nodeType":"StructuredDocumentation","src":"18914:88:20","text":" @dev Variant of {tryModExp} that supports inputs of arbitrary length."},"id":5261,"implemented":true,"kind":"function","modifiers":[],"name":"tryModExp","nameLocation":"19016:9:20","nodeType":"FunctionDefinition","parameters":{"id":5223,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5218,"mutability":"mutable","name":"b","nameLocation":"19048:1:20","nodeType":"VariableDeclaration","scope":5261,"src":"19035:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5217,"name":"bytes","nodeType":"ElementaryTypeName","src":"19035:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5220,"mutability":"mutable","name":"e","nameLocation":"19072:1:20","nodeType":"VariableDeclaration","scope":5261,"src":"19059:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5219,"name":"bytes","nodeType":"ElementaryTypeName","src":"19059:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":5222,"mutability":"mutable","name":"m","nameLocation":"19096:1:20","nodeType":"VariableDeclaration","scope":5261,"src":"19083:14:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5221,"name":"bytes","nodeType":"ElementaryTypeName","src":"19083:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"19025:78:20"},"returnParameters":{"id":5228,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5225,"mutability":"mutable","name":"success","nameLocation":"19132:7:20","nodeType":"VariableDeclaration","scope":5261,"src":"19127:12:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5224,"name":"bool","nodeType":"ElementaryTypeName","src":"19127:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":5227,"mutability":"mutable","name":"result","nameLocation":"19154:6:20","nodeType":"VariableDeclaration","scope":5261,"src":"19141:19:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5226,"name":"bytes","nodeType":"ElementaryTypeName","src":"19141:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"19126:35:20"},"scope":5969,"src":"19007:926:20","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":5293,"nodeType":"Block","src":"20088:176:20","statements":[{"body":{"id":5289,"nodeType":"Block","src":"20145:92:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":5284,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":5280,"name":"byteArray","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5264,"src":"20163:9:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5282,"indexExpression":{"id":5281,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5270,"src":"20173:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"20163:12:20","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":5283,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20179:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"20163:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5288,"nodeType":"IfStatement","src":"20159:68:20","trueBody":{"id":5287,"nodeType":"Block","src":"20182:45:20","statements":[{"expression":{"hexValue":"66616c7365","id":5285,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"20207:5:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":5268,"id":5286,"nodeType":"Return","src":"20200:12:20"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5273,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5270,"src":"20118:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":5274,"name":"byteArray","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5264,"src":"20122:9:20","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":5275,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"20132:6:20","memberName":"length","nodeType":"MemberAccess","src":"20122:16:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"20118:20:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5290,"initializationExpression":{"assignments":[5270],"declarations":[{"constant":false,"id":5270,"mutability":"mutable","name":"i","nameLocation":"20111:1:20","nodeType":"VariableDeclaration","scope":5290,"src":"20103:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5269,"name":"uint256","nodeType":"ElementaryTypeName","src":"20103:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5272,"initialValue":{"hexValue":"30","id":5271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20115:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"20103:13:20"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":5278,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"20140:3:20","subExpression":{"id":5277,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5270,"src":"20142:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5279,"nodeType":"ExpressionStatement","src":"20140:3:20"},"nodeType":"ForStatement","src":"20098:139:20"},{"expression":{"hexValue":"74727565","id":5291,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"20253:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":5268,"id":5292,"nodeType":"Return","src":"20246:11:20"}]},"documentation":{"id":5262,"nodeType":"StructuredDocumentation","src":"19939:72:20","text":" @dev Returns whether the provided byte array is zero."},"id":5294,"implemented":true,"kind":"function","modifiers":[],"name":"_zeroBytes","nameLocation":"20025:10:20","nodeType":"FunctionDefinition","parameters":{"id":5265,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5264,"mutability":"mutable","name":"byteArray","nameLocation":"20049:9:20","nodeType":"VariableDeclaration","scope":5294,"src":"20036:22:20","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":5263,"name":"bytes","nodeType":"ElementaryTypeName","src":"20036:5:20","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"20035:24:20"},"returnParameters":{"id":5268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5267,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5294,"src":"20082:4:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5266,"name":"bool","nodeType":"ElementaryTypeName","src":"20082:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"20081:6:20"},"scope":5969,"src":"20016:248:20","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":5512,"nodeType":"Block","src":"20624:5124:20","statements":[{"id":5511,"nodeType":"UncheckedBlock","src":"20634:5108:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5302,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"20728:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"hexValue":"31","id":5303,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20733:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"20728:6:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5308,"nodeType":"IfStatement","src":"20724:53:20","trueBody":{"id":5307,"nodeType":"Block","src":"20736:41:20","statements":[{"expression":{"id":5305,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"20761:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5301,"id":5306,"nodeType":"Return","src":"20754:8:20"}]}},{"assignments":[5310],"declarations":[{"constant":false,"id":5310,"mutability":"mutable","name":"aa","nameLocation":"21712:2:20","nodeType":"VariableDeclaration","scope":5511,"src":"21704:10:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5309,"name":"uint256","nodeType":"ElementaryTypeName","src":"21704:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5312,"initialValue":{"id":5311,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"21717:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21704:14:20"},{"assignments":[5314],"declarations":[{"constant":false,"id":5314,"mutability":"mutable","name":"xn","nameLocation":"21740:2:20","nodeType":"VariableDeclaration","scope":5511,"src":"21732:10:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5313,"name":"uint256","nodeType":"ElementaryTypeName","src":"21732:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5316,"initialValue":{"hexValue":"31","id":5315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21745:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"VariableDeclarationStatement","src":"21732:14:20"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5317,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"21765:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_340282366920938463463374607431768211456_by_1","typeString":"int_const 3402...(31 digits omitted)...1456"},"id":5320,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21772:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313238","id":5319,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21777:3:20","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"21772:8:20","typeDescriptions":{"typeIdentifier":"t_rational_340282366920938463463374607431768211456_by_1","typeString":"int_const 3402...(31 digits omitted)...1456"}}],"id":5321,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"21771:10:20","typeDescriptions":{"typeIdentifier":"t_rational_340282366920938463463374607431768211456_by_1","typeString":"int_const 3402...(31 digits omitted)...1456"}},"src":"21765:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5332,"nodeType":"IfStatement","src":"21761:92:20","trueBody":{"id":5331,"nodeType":"Block","src":"21783:70:20","statements":[{"expression":{"id":5325,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5323,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"21801:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"313238","id":5324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21808:3:20","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"src":"21801:10:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5326,"nodeType":"ExpressionStatement","src":"21801:10:20"},{"expression":{"id":5329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5327,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"21829:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"3634","id":5328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21836:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"21829:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5330,"nodeType":"ExpressionStatement","src":"21829:9:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5338,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5333,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"21870:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_18446744073709551616_by_1","typeString":"int_const 18446744073709551616"},"id":5336,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5334,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21877:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"3634","id":5335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21882:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"21877:7:20","typeDescriptions":{"typeIdentifier":"t_rational_18446744073709551616_by_1","typeString":"int_const 18446744073709551616"}}],"id":5337,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"21876:9:20","typeDescriptions":{"typeIdentifier":"t_rational_18446744073709551616_by_1","typeString":"int_const 18446744073709551616"}},"src":"21870:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5348,"nodeType":"IfStatement","src":"21866:90:20","trueBody":{"id":5347,"nodeType":"Block","src":"21887:69:20","statements":[{"expression":{"id":5341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5339,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"21905:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3634","id":5340,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21912:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"21905:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5342,"nodeType":"ExpressionStatement","src":"21905:9:20"},{"expression":{"id":5345,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5343,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"21932:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"3332","id":5344,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21939:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"21932:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5346,"nodeType":"ExpressionStatement","src":"21932:9:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5349,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"21973:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_4294967296_by_1","typeString":"int_const 4294967296"},"id":5352,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21980:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"3332","id":5351,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21985:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"21980:7:20","typeDescriptions":{"typeIdentifier":"t_rational_4294967296_by_1","typeString":"int_const 4294967296"}}],"id":5353,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"21979:9:20","typeDescriptions":{"typeIdentifier":"t_rational_4294967296_by_1","typeString":"int_const 4294967296"}},"src":"21973:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5364,"nodeType":"IfStatement","src":"21969:90:20","trueBody":{"id":5363,"nodeType":"Block","src":"21990:69:20","statements":[{"expression":{"id":5357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5355,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22008:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3332","id":5356,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22015:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"22008:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5358,"nodeType":"ExpressionStatement","src":"22008:9:20"},{"expression":{"id":5361,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5359,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22035:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"3136","id":5360,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22042:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"22035:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5362,"nodeType":"ExpressionStatement","src":"22035:9:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5370,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5365,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22076:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_65536_by_1","typeString":"int_const 65536"},"id":5368,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5366,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22083:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"3136","id":5367,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22088:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"22083:7:20","typeDescriptions":{"typeIdentifier":"t_rational_65536_by_1","typeString":"int_const 65536"}}],"id":5369,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"22082:9:20","typeDescriptions":{"typeIdentifier":"t_rational_65536_by_1","typeString":"int_const 65536"}},"src":"22076:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5380,"nodeType":"IfStatement","src":"22072:89:20","trueBody":{"id":5379,"nodeType":"Block","src":"22093:68:20","statements":[{"expression":{"id":5373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5371,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22111:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"3136","id":5372,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22118:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"22111:9:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5374,"nodeType":"ExpressionStatement","src":"22111:9:20"},{"expression":{"id":5377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5375,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22138:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"38","id":5376,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22145:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"22138:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5378,"nodeType":"ExpressionStatement","src":"22138:8:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5386,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5381,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22178:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"},"id":5384,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5382,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22185:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"38","id":5383,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22190:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"22185:6:20","typeDescriptions":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"}}],"id":5385,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"22184:8:20","typeDescriptions":{"typeIdentifier":"t_rational_256_by_1","typeString":"int_const 256"}},"src":"22178:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5396,"nodeType":"IfStatement","src":"22174:87:20","trueBody":{"id":5395,"nodeType":"Block","src":"22194:67:20","statements":[{"expression":{"id":5389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5387,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22212:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"38","id":5388,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22219:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"22212:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5390,"nodeType":"ExpressionStatement","src":"22212:8:20"},{"expression":{"id":5393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5391,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22238:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"34","id":5392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22245:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"22238:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5394,"nodeType":"ExpressionStatement","src":"22238:8:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5397,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22278:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"id":5400,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5398,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22285:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"34","id":5399,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22290:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"22285:6:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"}}],"id":5401,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"22284:8:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"}},"src":"22278:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5412,"nodeType":"IfStatement","src":"22274:87:20","trueBody":{"id":5411,"nodeType":"Block","src":"22294:67:20","statements":[{"expression":{"id":5405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5403,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22312:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":">>=","rightHandSide":{"hexValue":"34","id":5404,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22319:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"22312:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5406,"nodeType":"ExpressionStatement","src":"22312:8:20"},{"expression":{"id":5409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5407,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22338:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"32","id":5408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22345:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"22338:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5410,"nodeType":"ExpressionStatement","src":"22338:8:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5413,"name":"aa","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5310,"src":"22378:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"id":5416,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5414,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22385:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"32","id":5415,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22390:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"22385:6:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"}}],"id":5417,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"22384:8:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"}},"src":"22378:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5424,"nodeType":"IfStatement","src":"22374:61:20","trueBody":{"id":5423,"nodeType":"Block","src":"22394:41:20","statements":[{"expression":{"id":5421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5419,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22412:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"<<=","rightHandSide":{"hexValue":"31","id":5420,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22419:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"22412:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5422,"nodeType":"ExpressionStatement","src":"22412:8:20"}]}},{"expression":{"id":5432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5425,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22855:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"33","id":5426,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22861:1:20","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5427,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"22865:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22861:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5429,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"22860:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5430,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22872:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"22860:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22855:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5433,"nodeType":"ExpressionStatement","src":"22855:18:20"},{"expression":{"id":5443,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5434,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24760:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5442,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5435,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24766:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5436,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"24771:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5437,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24775:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24771:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24766:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5440,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"24765:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24782:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"24765:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24760:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5444,"nodeType":"ExpressionStatement","src":"24760:23:20"},{"expression":{"id":5454,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5445,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24869:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5446,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24875:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5447,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"24880:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5448,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24884:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24880:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24875:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5451,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"24874:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24891:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"24874:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24869:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5455,"nodeType":"ExpressionStatement","src":"24869:23:20"},{"expression":{"id":5465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5456,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24980:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5461,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5457,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24986:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5458,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"24991:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5459,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"24995:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24991:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24986:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5462,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"24985:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5463,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25002:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"24985:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24980:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5466,"nodeType":"ExpressionStatement","src":"24980:23:20"},{"expression":{"id":5476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5467,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25089:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5475,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5472,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5468,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25095:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5471,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5469,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"25100:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5470,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25104:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25100:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25095:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5473,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"25094:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5474,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25111:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"25094:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25089:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5477,"nodeType":"ExpressionStatement","src":"25089:23:20"},{"expression":{"id":5487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5478,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25199:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5479,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25205:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5480,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"25210:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5481,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25214:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25210:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25205:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5484,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"25204:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5485,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25221:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"25204:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25199:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5488,"nodeType":"ExpressionStatement","src":"25199:23:20"},{"expression":{"id":5498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5489,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25309:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5490,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25315:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5493,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5491,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"25320:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5492,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25324:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25320:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25315:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5495,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"25314:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":5496,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25331:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"25314:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25309:23:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5499,"nodeType":"ExpressionStatement","src":"25309:23:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5500,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25698:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5507,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5503,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25719:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5504,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5297,"src":"25724:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":5505,"name":"xn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5314,"src":"25728:2:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25724:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25719:11:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5501,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"25703:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25712:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"25703:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25703:28:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25698:33:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5301,"id":5510,"nodeType":"Return","src":"25691:40:20"}]}]},"documentation":{"id":5295,"nodeType":"StructuredDocumentation","src":"20270:292:20","text":" @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n towards zero.\n This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n using integer operations."},"id":5513,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"20576:4:20","nodeType":"FunctionDefinition","parameters":{"id":5298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5297,"mutability":"mutable","name":"a","nameLocation":"20589:1:20","nodeType":"VariableDeclaration","scope":5513,"src":"20581:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5296,"name":"uint256","nodeType":"ElementaryTypeName","src":"20581:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"20580:11:20"},"returnParameters":{"id":5301,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5300,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5513,"src":"20615:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5299,"name":"uint256","nodeType":"ElementaryTypeName","src":"20615:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"20614:9:20"},"scope":5969,"src":"20567:5181:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5546,"nodeType":"Block","src":"25921:171:20","statements":[{"id":5545,"nodeType":"UncheckedBlock","src":"25931:155:20","statements":[{"assignments":[5525],"declarations":[{"constant":false,"id":5525,"mutability":"mutable","name":"result","nameLocation":"25963:6:20","nodeType":"VariableDeclaration","scope":5545,"src":"25955:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5524,"name":"uint256","nodeType":"ElementaryTypeName","src":"25955:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5529,"initialValue":{"arguments":[{"id":5527,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5516,"src":"25977:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5526,"name":"sqrt","nodeType":"Identifier","overloadedDeclarations":[5513,5547],"referencedDeclaration":5513,"src":"25972:4:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25972:7:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25955:24:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5530,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5525,"src":"26000:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":5541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5534,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5519,"src":"26042:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":5533,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"26025:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":5535,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26025:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5536,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5525,"src":"26055:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":5537,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5525,"src":"26064:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26055:15:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":5539,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5516,"src":"26073:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26055:19:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"26025:49:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5531,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26009:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5532,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26018:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26009:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5542,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26009:66:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26000:75:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5523,"id":5544,"nodeType":"Return","src":"25993:82:20"}]}]},"documentation":{"id":5514,"nodeType":"StructuredDocumentation","src":"25754:86:20","text":" @dev Calculates sqrt(a), following the selected rounding direction."},"id":5547,"implemented":true,"kind":"function","modifiers":[],"name":"sqrt","nameLocation":"25854:4:20","nodeType":"FunctionDefinition","parameters":{"id":5520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5516,"mutability":"mutable","name":"a","nameLocation":"25867:1:20","nodeType":"VariableDeclaration","scope":5547,"src":"25859:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5515,"name":"uint256","nodeType":"ElementaryTypeName","src":"25859:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5519,"mutability":"mutable","name":"rounding","nameLocation":"25879:8:20","nodeType":"VariableDeclaration","scope":5547,"src":"25870:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":5518,"nodeType":"UserDefinedTypeName","pathNode":{"id":5517,"name":"Rounding","nameLocations":["25870:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"25870:8:20"},"referencedDeclaration":4360,"src":"25870:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"25858:30:20"},"returnParameters":{"id":5523,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5522,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5547,"src":"25912:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5521,"name":"uint256","nodeType":"ElementaryTypeName","src":"25912:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"25911:9:20"},"scope":5969,"src":"25845:247:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5637,"nodeType":"Block","src":"26281:2334:20","statements":[{"expression":{"id":5564,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5555,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26363:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5558,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"26383:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666666666666666666666666666666666666666666666666666666666666666","id":5559,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26387:34:20","typeDescriptions":{"typeIdentifier":"t_rational_340282366920938463463374607431768211455_by_1","typeString":"int_const 3402...(31 digits omitted)...1455"},"value":"0xffffffffffffffffffffffffffffffff"},"src":"26383:38:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5556,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26367:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26376:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26367:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5561,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26367:55:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"37","id":5562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26426:1:20","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"26367:60:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26363:64:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5565,"nodeType":"ExpressionStatement","src":"26363:64:20"},{"expression":{"id":5578,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5566,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26503:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5574,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5569,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"26525:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5570,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26530:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26525:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5572,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"26524:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307866666666666666666666666666666666","id":5573,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26535:18:20","typeDescriptions":{"typeIdentifier":"t_rational_18446744073709551615_by_1","typeString":"int_const 18446744073709551615"},"value":"0xffffffffffffffff"},"src":"26524:29:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5567,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26508:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26517:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26508:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26508:46:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"36","id":5576,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26558:1:20","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"26508:51:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26503:56:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5579,"nodeType":"ExpressionStatement","src":"26503:56:20"},{"expression":{"id":5592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5580,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26634:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5583,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"26656:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5584,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26661:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26656:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5586,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"26655:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666666666666666","id":5587,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26666:10:20","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"src":"26655:21:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5581,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26639:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26648:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26639:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26639:38:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":5590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26681:1:20","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"26639:43:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26634:48:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5593,"nodeType":"ExpressionStatement","src":"26634:48:20"},{"expression":{"id":5606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5594,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26757:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5605,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5597,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"26779:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5598,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26784:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26779:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5600,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"26778:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307866666666","id":5601,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26789:6:20","typeDescriptions":{"typeIdentifier":"t_rational_65535_by_1","typeString":"int_const 65535"},"value":"0xffff"},"src":"26778:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5595,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26762:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5596,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26771:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26762:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26762:34:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"34","id":5604,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26800:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"26762:39:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26757:44:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5607,"nodeType":"ExpressionStatement","src":"26757:44:20"},{"expression":{"id":5620,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5608,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26874:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5613,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5611,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"26896:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5612,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26901:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26896:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5614,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"26895:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666","id":5615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26906:4:20","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"0xff"},"src":"26895:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5609,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26879:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"26888:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26879:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26879:32:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"33","id":5618,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26915:1:20","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"26879:37:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26874:42:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5621,"nodeType":"ExpressionStatement","src":"26874:42:20"},{"expression":{"id":5634,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5622,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"26988:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5625,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5550,"src":"27010:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5626,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5553,"src":"27015:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"27010:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5628,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"27009:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307866","id":5629,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27020:3:20","typeDescriptions":{"typeIdentifier":"t_rational_15_by_1","typeString":"int_const 15"},"value":"0xf"},"src":"27009:14:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5623,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"26993:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"27002:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"26993:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26993:31:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"32","id":5632,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27028:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"26993:36:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26988:41:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5635,"nodeType":"ExpressionStatement","src":"26988:41:20"},{"AST":{"nativeSrc":"28490:119:20","nodeType":"YulBlock","src":"28490:119:20","statements":[{"nativeSrc":"28504:95:20","nodeType":"YulAssignment","src":"28504:95:20","value":{"arguments":[{"name":"r","nativeSrc":"28512:1:20","nodeType":"YulIdentifier","src":"28512:1:20"},{"arguments":[{"arguments":[{"name":"r","nativeSrc":"28524:1:20","nodeType":"YulIdentifier","src":"28524:1:20"},{"name":"x","nativeSrc":"28527:1:20","nodeType":"YulIdentifier","src":"28527:1:20"}],"functionName":{"name":"shr","nativeSrc":"28520:3:20","nodeType":"YulIdentifier","src":"28520:3:20"},"nativeSrc":"28520:9:20","nodeType":"YulFunctionCall","src":"28520:9:20"},{"kind":"number","nativeSrc":"28531:66:20","nodeType":"YulLiteral","src":"28531:66:20","type":"","value":"0x0000010102020202030303030303030300000000000000000000000000000000"}],"functionName":{"name":"byte","nativeSrc":"28515:4:20","nodeType":"YulIdentifier","src":"28515:4:20"},"nativeSrc":"28515:83:20","nodeType":"YulFunctionCall","src":"28515:83:20"}],"functionName":{"name":"or","nativeSrc":"28509:2:20","nodeType":"YulIdentifier","src":"28509:2:20"},"nativeSrc":"28509:90:20","nodeType":"YulFunctionCall","src":"28509:90:20"},"variableNames":[{"name":"r","nativeSrc":"28504:1:20","nodeType":"YulIdentifier","src":"28504:1:20"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":5553,"isOffset":false,"isSlot":false,"src":"28504:1:20","valueSize":1},{"declaration":5553,"isOffset":false,"isSlot":false,"src":"28512:1:20","valueSize":1},{"declaration":5553,"isOffset":false,"isSlot":false,"src":"28524:1:20","valueSize":1},{"declaration":5550,"isOffset":false,"isSlot":false,"src":"28527:1:20","valueSize":1}],"flags":["memory-safe"],"id":5636,"nodeType":"InlineAssembly","src":"28465:144:20"}]},"documentation":{"id":5548,"nodeType":"StructuredDocumentation","src":"26098:119:20","text":" @dev Return the log in base 2 of a positive value rounded towards zero.\n Returns 0 if given 0."},"id":5638,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"26231:4:20","nodeType":"FunctionDefinition","parameters":{"id":5551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5550,"mutability":"mutable","name":"x","nameLocation":"26244:1:20","nodeType":"VariableDeclaration","scope":5638,"src":"26236:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5549,"name":"uint256","nodeType":"ElementaryTypeName","src":"26236:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"26235:11:20"},"returnParameters":{"id":5554,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5553,"mutability":"mutable","name":"r","nameLocation":"26278:1:20","nodeType":"VariableDeclaration","scope":5638,"src":"26270:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5552,"name":"uint256","nodeType":"ElementaryTypeName","src":"26270:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"26269:11:20"},"scope":5969,"src":"26222:2393:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5671,"nodeType":"Block","src":"28848:175:20","statements":[{"id":5670,"nodeType":"UncheckedBlock","src":"28858:159:20","statements":[{"assignments":[5650],"declarations":[{"constant":false,"id":5650,"mutability":"mutable","name":"result","nameLocation":"28890:6:20","nodeType":"VariableDeclaration","scope":5670,"src":"28882:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5649,"name":"uint256","nodeType":"ElementaryTypeName","src":"28882:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5654,"initialValue":{"arguments":[{"id":5652,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5641,"src":"28904:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5651,"name":"log2","nodeType":"Identifier","overloadedDeclarations":[5638,5672],"referencedDeclaration":5638,"src":"28899:4:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5653,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28899:11:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"28882:28:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5655,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5650,"src":"28931:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":5666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5659,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5644,"src":"28973:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":5658,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"28956:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":5660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28956:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5663,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5661,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28986:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"id":5662,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5650,"src":"28991:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"28986:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":5664,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5641,"src":"29000:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"28986:19:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"28956:49:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5656,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"28940:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"28949:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"28940:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28940:66:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"28931:75:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5648,"id":5669,"nodeType":"Return","src":"28924:82:20"}]}]},"documentation":{"id":5639,"nodeType":"StructuredDocumentation","src":"28621:142:20","text":" @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":5672,"implemented":true,"kind":"function","modifiers":[],"name":"log2","nameLocation":"28777:4:20","nodeType":"FunctionDefinition","parameters":{"id":5645,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5641,"mutability":"mutable","name":"value","nameLocation":"28790:5:20","nodeType":"VariableDeclaration","scope":5672,"src":"28782:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5640,"name":"uint256","nodeType":"ElementaryTypeName","src":"28782:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5644,"mutability":"mutable","name":"rounding","nameLocation":"28806:8:20","nodeType":"VariableDeclaration","scope":5672,"src":"28797:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":5643,"nodeType":"UserDefinedTypeName","pathNode":{"id":5642,"name":"Rounding","nameLocations":["28797:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"28797:8:20"},"referencedDeclaration":4360,"src":"28797:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"28781:34:20"},"returnParameters":{"id":5648,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5647,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5672,"src":"28839:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5646,"name":"uint256","nodeType":"ElementaryTypeName","src":"28839:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"28838:9:20"},"scope":5969,"src":"28768:255:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5800,"nodeType":"Block","src":"29216:854:20","statements":[{"assignments":[5681],"declarations":[{"constant":false,"id":5681,"mutability":"mutable","name":"result","nameLocation":"29234:6:20","nodeType":"VariableDeclaration","scope":5800,"src":"29226:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5680,"name":"uint256","nodeType":"ElementaryTypeName","src":"29226:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5683,"initialValue":{"hexValue":"30","id":5682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29243:1:20","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"29226:18:20"},{"id":5797,"nodeType":"UncheckedBlock","src":"29254:787:20","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5684,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29282:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":5687,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29291:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":5686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29297:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"29291:8:20","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"29282:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5700,"nodeType":"IfStatement","src":"29278:103:20","trueBody":{"id":5699,"nodeType":"Block","src":"29301:80:20","statements":[{"expression":{"id":5693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5689,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29319:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"},"id":5692,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5690,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29328:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3634","id":5691,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29334:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"29328:8:20","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1","typeString":"int_const 1000...(57 digits omitted)...0000"}},"src":"29319:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5694,"nodeType":"ExpressionStatement","src":"29319:17:20"},{"expression":{"id":5697,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5695,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29354:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3634","id":5696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29364:2:20","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},"src":"29354:12:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5698,"nodeType":"ExpressionStatement","src":"29354:12:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5705,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5701,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29398:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":5704,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5702,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29407:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":5703,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29413:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"29407:8:20","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"29398:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5717,"nodeType":"IfStatement","src":"29394:103:20","trueBody":{"id":5716,"nodeType":"Block","src":"29417:80:20","statements":[{"expression":{"id":5710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5706,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29435:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"},"id":5709,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5707,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29444:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3332","id":5708,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29450:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"29444:8:20","typeDescriptions":{"typeIdentifier":"t_rational_100000000000000000000000000000000_by_1","typeString":"int_const 1000...(25 digits omitted)...0000"}},"src":"29435:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5711,"nodeType":"ExpressionStatement","src":"29435:17:20"},{"expression":{"id":5714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5712,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29470:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3332","id":5713,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29480:2:20","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"29470:12:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5715,"nodeType":"ExpressionStatement","src":"29470:12:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5718,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29514:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":5721,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5719,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29523:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":5720,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29529:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"29523:8:20","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"29514:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5734,"nodeType":"IfStatement","src":"29510:103:20","trueBody":{"id":5733,"nodeType":"Block","src":"29533:80:20","statements":[{"expression":{"id":5727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5723,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29551:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"},"id":5726,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5724,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29560:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"3136","id":5725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29566:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"29560:8:20","typeDescriptions":{"typeIdentifier":"t_rational_10000000000000000_by_1","typeString":"int_const 10000000000000000"}},"src":"29551:17:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5728,"nodeType":"ExpressionStatement","src":"29551:17:20"},{"expression":{"id":5731,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5729,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29586:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"3136","id":5730,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29596:2:20","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},"src":"29586:12:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5732,"nodeType":"ExpressionStatement","src":"29586:12:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5735,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29630:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":5738,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5736,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29639:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":5737,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29645:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"29639:7:20","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"29630:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5751,"nodeType":"IfStatement","src":"29626:100:20","trueBody":{"id":5750,"nodeType":"Block","src":"29648:78:20","statements":[{"expression":{"id":5744,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5740,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29666:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"},"id":5743,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5741,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29675:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"38","id":5742,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29681:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"29675:7:20","typeDescriptions":{"typeIdentifier":"t_rational_100000000_by_1","typeString":"int_const 100000000"}},"src":"29666:16:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5745,"nodeType":"ExpressionStatement","src":"29666:16:20"},{"expression":{"id":5748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5746,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29700:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"38","id":5747,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29710:1:20","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"29700:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5749,"nodeType":"ExpressionStatement","src":"29700:11:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5756,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5752,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29743:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":5755,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5753,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29752:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":5754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29758:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"29752:7:20","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"29743:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5768,"nodeType":"IfStatement","src":"29739:100:20","trueBody":{"id":5767,"nodeType":"Block","src":"29761:78:20","statements":[{"expression":{"id":5761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5757,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29779:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"},"id":5760,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5758,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29788:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"34","id":5759,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29794:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"29788:7:20","typeDescriptions":{"typeIdentifier":"t_rational_10000_by_1","typeString":"int_const 10000"}},"src":"29779:16:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5762,"nodeType":"ExpressionStatement","src":"29779:16:20"},{"expression":{"id":5765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5763,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29813:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"34","id":5764,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29823:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"29813:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5766,"nodeType":"ExpressionStatement","src":"29813:11:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5773,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5769,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29856:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":5772,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5770,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29865:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":5771,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29871:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"29865:7:20","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"29856:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5785,"nodeType":"IfStatement","src":"29852:100:20","trueBody":{"id":5784,"nodeType":"Block","src":"29874:78:20","statements":[{"expression":{"id":5778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5774,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29892:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"commonType":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"id":5777,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5775,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29901:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"32","id":5776,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29907:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"29901:7:20","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"}},"src":"29892:16:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5779,"nodeType":"ExpressionStatement","src":"29892:16:20"},{"expression":{"id":5782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5780,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"29926:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"32","id":5781,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29936:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"29926:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5783,"nodeType":"ExpressionStatement","src":"29926:11:20"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5786,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5675,"src":"29969:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"commonType":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"id":5789,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5787,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29978:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"hexValue":"31","id":5788,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29984:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"29978:7:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"}},"src":"29969:16:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":5796,"nodeType":"IfStatement","src":"29965:66:20","trueBody":{"id":5795,"nodeType":"Block","src":"29987:44:20","statements":[{"expression":{"id":5793,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5791,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"30005:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"hexValue":"31","id":5792,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30015:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"30005:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5794,"nodeType":"ExpressionStatement","src":"30005:11:20"}]}}]},{"expression":{"id":5798,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5681,"src":"30057:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5679,"id":5799,"nodeType":"Return","src":"30050:13:20"}]},"documentation":{"id":5673,"nodeType":"StructuredDocumentation","src":"29029:120:20","text":" @dev Return the log in base 10 of a positive value rounded towards zero.\n Returns 0 if given 0."},"id":5801,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"29163:5:20","nodeType":"FunctionDefinition","parameters":{"id":5676,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5675,"mutability":"mutable","name":"value","nameLocation":"29177:5:20","nodeType":"VariableDeclaration","scope":5801,"src":"29169:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5674,"name":"uint256","nodeType":"ElementaryTypeName","src":"29169:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"29168:15:20"},"returnParameters":{"id":5679,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5678,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5801,"src":"29207:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5677,"name":"uint256","nodeType":"ElementaryTypeName","src":"29207:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"29206:9:20"},"scope":5969,"src":"29154:916:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5834,"nodeType":"Block","src":"30305:177:20","statements":[{"id":5833,"nodeType":"UncheckedBlock","src":"30315:161:20","statements":[{"assignments":[5813],"declarations":[{"constant":false,"id":5813,"mutability":"mutable","name":"result","nameLocation":"30347:6:20","nodeType":"VariableDeclaration","scope":5833,"src":"30339:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5812,"name":"uint256","nodeType":"ElementaryTypeName","src":"30339:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5817,"initialValue":{"arguments":[{"id":5815,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5804,"src":"30362:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5814,"name":"log10","nodeType":"Identifier","overloadedDeclarations":[5801,5835],"referencedDeclaration":5801,"src":"30356:5:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30356:12:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"30339:29:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5818,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5813,"src":"30389:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":5829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5822,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5807,"src":"30431:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":5821,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"30414:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":5823,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30414:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":5824,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30444:2:20","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":5825,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5813,"src":"30450:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30444:12:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":5827,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5804,"src":"30459:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30444:20:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"30414:50:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5819,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"30398:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"30407:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"30398:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5830,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30398:67:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30389:76:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5811,"id":5832,"nodeType":"Return","src":"30382:83:20"}]}]},"documentation":{"id":5802,"nodeType":"StructuredDocumentation","src":"30076:143:20","text":" @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":5835,"implemented":true,"kind":"function","modifiers":[],"name":"log10","nameLocation":"30233:5:20","nodeType":"FunctionDefinition","parameters":{"id":5808,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5804,"mutability":"mutable","name":"value","nameLocation":"30247:5:20","nodeType":"VariableDeclaration","scope":5835,"src":"30239:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5803,"name":"uint256","nodeType":"ElementaryTypeName","src":"30239:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5807,"mutability":"mutable","name":"rounding","nameLocation":"30263:8:20","nodeType":"VariableDeclaration","scope":5835,"src":"30254:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":5806,"nodeType":"UserDefinedTypeName","pathNode":{"id":5805,"name":"Rounding","nameLocations":["30254:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"30254:8:20"},"referencedDeclaration":4360,"src":"30254:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"30238:34:20"},"returnParameters":{"id":5811,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5810,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5835,"src":"30296:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5809,"name":"uint256","nodeType":"ElementaryTypeName","src":"30296:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30295:9:20"},"scope":5969,"src":"30224:258:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5911,"nodeType":"Block","src":"30800:675:20","statements":[{"expression":{"id":5852,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5843,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"30882:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5851,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5846,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5838,"src":"30902:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666666666666666666666666666666666666666666666666666666666666666","id":5847,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30906:34:20","typeDescriptions":{"typeIdentifier":"t_rational_340282366920938463463374607431768211455_by_1","typeString":"int_const 3402...(31 digits omitted)...1455"},"value":"0xffffffffffffffffffffffffffffffff"},"src":"30902:38:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5844,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"30886:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"30895:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"30886:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30886:55:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"37","id":5850,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30945:1:20","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"30886:60:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30882:64:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5853,"nodeType":"ExpressionStatement","src":"30882:64:20"},{"expression":{"id":5866,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5854,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31022:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5857,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5838,"src":"31044:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5858,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31049:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31044:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5860,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31043:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307866666666666666666666666666666666","id":5861,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31054:18:20","typeDescriptions":{"typeIdentifier":"t_rational_18446744073709551615_by_1","typeString":"int_const 18446744073709551615"},"value":"0xffffffffffffffff"},"src":"31043:29:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5855,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"31027:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5856,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"31036:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"31027:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5863,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31027:46:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"36","id":5864,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31077:1:20","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"31027:51:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31022:56:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5867,"nodeType":"ExpressionStatement","src":"31022:56:20"},{"expression":{"id":5880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5868,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31153:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5871,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5838,"src":"31175:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5872,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31180:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31175:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5874,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31174:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666666666666666","id":5875,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31185:10:20","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"src":"31174:21:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5869,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"31158:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"31167:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"31158:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31158:38:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":5878,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31200:1:20","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"31158:43:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31153:48:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5881,"nodeType":"ExpressionStatement","src":"31153:48:20"},{"expression":{"id":5894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":5882,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31276:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"|=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5893,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5885,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5838,"src":"31298:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5886,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31303:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31298:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5888,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31297:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"307866666666","id":5889,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31308:6:20","typeDescriptions":{"typeIdentifier":"t_rational_65535_by_1","typeString":"int_const 65535"},"value":"0xffff"},"src":"31297:17:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5883,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"31281:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5884,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"31290:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"31281:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31281:34:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"34","id":5892,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31319:1:20","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"31281:39:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31276:44:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":5895,"nodeType":"ExpressionStatement","src":"31276:44:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5909,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5896,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31426:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":5897,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31431:1:20","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"31426:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5899,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31425:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5902,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5838,"src":"31453:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":5903,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5841,"src":"31458:1:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31453:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5905,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31452:8:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30786666","id":5906,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31463:4:20","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"0xff"},"src":"31452:15:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5900,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"31436:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5901,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"31445:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"31436:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31436:32:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31425:43:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5842,"id":5910,"nodeType":"Return","src":"31418:50:20"}]},"documentation":{"id":5836,"nodeType":"StructuredDocumentation","src":"30488:246:20","text":" @dev Return the log in base 256 of a positive value rounded towards zero.\n Returns 0 if given 0.\n Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string."},"id":5912,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"30748:6:20","nodeType":"FunctionDefinition","parameters":{"id":5839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5838,"mutability":"mutable","name":"x","nameLocation":"30763:1:20","nodeType":"VariableDeclaration","scope":5912,"src":"30755:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5837,"name":"uint256","nodeType":"ElementaryTypeName","src":"30755:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30754:11:20"},"returnParameters":{"id":5842,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5841,"mutability":"mutable","name":"r","nameLocation":"30797:1:20","nodeType":"VariableDeclaration","scope":5912,"src":"30789:9:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5840,"name":"uint256","nodeType":"ElementaryTypeName","src":"30789:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30788:11:20"},"scope":5969,"src":"30739:736:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5948,"nodeType":"Block","src":"31712:184:20","statements":[{"id":5947,"nodeType":"UncheckedBlock","src":"31722:168:20","statements":[{"assignments":[5924],"declarations":[{"constant":false,"id":5924,"mutability":"mutable","name":"result","nameLocation":"31754:6:20","nodeType":"VariableDeclaration","scope":5947,"src":"31746:14:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5923,"name":"uint256","nodeType":"ElementaryTypeName","src":"31746:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":5928,"initialValue":{"arguments":[{"id":5926,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5915,"src":"31770:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":5925,"name":"log256","nodeType":"Identifier","overloadedDeclarations":[5912,5949],"referencedDeclaration":5912,"src":"31763:6:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":5927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31763:13:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"31746:30:20"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5945,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5929,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5924,"src":"31797:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":5943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5933,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5918,"src":"31839:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":5932,"name":"unsignedRoundsUp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5968,"src":"31822:16:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_enum$_Rounding_$4360_$returns$_t_bool_$","typeString":"function (enum Math.Rounding) pure returns (bool)"}},"id":5934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31822:26:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":5935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31852:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":5938,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":5936,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5924,"src":"31858:6:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"33","id":5937,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31868:1:20","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"31858:11:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":5939,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"31857:13:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31852:18:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":5941,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5915,"src":"31873:5:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31852:26:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"31822:56:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":5930,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"31806:8:20","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":5931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"31815:6:20","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"31806:15:20","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":5944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31806:73:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"31797:82:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":5922,"id":5946,"nodeType":"Return","src":"31790:89:20"}]}]},"documentation":{"id":5913,"nodeType":"StructuredDocumentation","src":"31481:144:20","text":" @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n Returns 0 if given 0."},"id":5949,"implemented":true,"kind":"function","modifiers":[],"name":"log256","nameLocation":"31639:6:20","nodeType":"FunctionDefinition","parameters":{"id":5919,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5915,"mutability":"mutable","name":"value","nameLocation":"31654:5:20","nodeType":"VariableDeclaration","scope":5949,"src":"31646:13:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5914,"name":"uint256","nodeType":"ElementaryTypeName","src":"31646:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":5918,"mutability":"mutable","name":"rounding","nameLocation":"31670:8:20","nodeType":"VariableDeclaration","scope":5949,"src":"31661:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":5917,"nodeType":"UserDefinedTypeName","pathNode":{"id":5916,"name":"Rounding","nameLocations":["31661:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"31661:8:20"},"referencedDeclaration":4360,"src":"31661:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"31645:34:20"},"returnParameters":{"id":5922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5921,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5949,"src":"31703:7:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5920,"name":"uint256","nodeType":"ElementaryTypeName","src":"31703:7:20","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"31702:9:20"},"scope":5969,"src":"31630:266:20","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":5967,"nodeType":"Block","src":"32094:48:20","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":5965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":5963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":5960,"name":"rounding","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5953,"src":"32117:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}],"id":5959,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"32111:5:20","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":5958,"name":"uint8","nodeType":"ElementaryTypeName","src":"32111:5:20","typeDescriptions":{}}},"id":5961,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"32111:15:20","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"32","id":5962,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"32129:1:20","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"32111:19:20","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31","id":5964,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"32134:1:20","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"32111:24:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":5957,"id":5966,"nodeType":"Return","src":"32104:31:20"}]},"documentation":{"id":5950,"nodeType":"StructuredDocumentation","src":"31902:113:20","text":" @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers."},"id":5968,"implemented":true,"kind":"function","modifiers":[],"name":"unsignedRoundsUp","nameLocation":"32029:16:20","nodeType":"FunctionDefinition","parameters":{"id":5954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5953,"mutability":"mutable","name":"rounding","nameLocation":"32055:8:20","nodeType":"VariableDeclaration","scope":5968,"src":"32046:17:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"},"typeName":{"id":5952,"nodeType":"UserDefinedTypeName","pathNode":{"id":5951,"name":"Rounding","nameLocations":["32046:8:20"],"nodeType":"IdentifierPath","referencedDeclaration":4360,"src":"32046:8:20"},"referencedDeclaration":4360,"src":"32046:8:20","typeDescriptions":{"typeIdentifier":"t_enum$_Rounding_$4360","typeString":"enum Math.Rounding"}},"visibility":"internal"}],"src":"32045:19:20"},"returnParameters":{"id":5957,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5956,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":5968,"src":"32088:4:20","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":5955,"name":"bool","nodeType":"ElementaryTypeName","src":"32088:4:20","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"32087:6:20"},"scope":5969,"src":"32020:122:20","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":5970,"src":"281:31863:20","usedErrors":[],"usedEvents":[]}],"src":"103:32042:20"},"id":20},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/math/SafeCast.sol","exportedSymbols":{"SafeCast":[7734]},"id":7735,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":5971,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"192:24:21"},{"abstract":false,"baseContracts":[],"canonicalName":"SafeCast","contractDependencies":[],"contractKind":"library","documentation":{"id":5972,"nodeType":"StructuredDocumentation","src":"218:550:21","text":" @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n checks.\n Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n easily result in undesired exploitation or bugs, since developers usually\n assume that overflows raise errors. `SafeCast` restores this intuition by\n reverting the transaction when such an operation overflows.\n Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always."},"fullyImplemented":true,"id":7734,"linearizedBaseContracts":[7734],"name":"SafeCast","nameLocation":"777:8:21","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":5973,"nodeType":"StructuredDocumentation","src":"792:68:21","text":" @dev Value doesn't fit in an uint of `bits` size."},"errorSelector":"6dfcc650","id":5979,"name":"SafeCastOverflowedUintDowncast","nameLocation":"871:30:21","nodeType":"ErrorDefinition","parameters":{"id":5978,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5975,"mutability":"mutable","name":"bits","nameLocation":"908:4:21","nodeType":"VariableDeclaration","scope":5979,"src":"902:10:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5974,"name":"uint8","nodeType":"ElementaryTypeName","src":"902:5:21","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":5977,"mutability":"mutable","name":"value","nameLocation":"922:5:21","nodeType":"VariableDeclaration","scope":5979,"src":"914:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5976,"name":"uint256","nodeType":"ElementaryTypeName","src":"914:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"901:27:21"},"src":"865:64:21"},{"documentation":{"id":5980,"nodeType":"StructuredDocumentation","src":"935:75:21","text":" @dev An int value doesn't fit in an uint of `bits` size."},"errorSelector":"a8ce4432","id":5984,"name":"SafeCastOverflowedIntToUint","nameLocation":"1021:27:21","nodeType":"ErrorDefinition","parameters":{"id":5983,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5982,"mutability":"mutable","name":"value","nameLocation":"1056:5:21","nodeType":"VariableDeclaration","scope":5984,"src":"1049:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":5981,"name":"int256","nodeType":"ElementaryTypeName","src":"1049:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1048:14:21"},"src":"1015:48:21"},{"documentation":{"id":5985,"nodeType":"StructuredDocumentation","src":"1069:67:21","text":" @dev Value doesn't fit in an int of `bits` size."},"errorSelector":"327269a7","id":5991,"name":"SafeCastOverflowedIntDowncast","nameLocation":"1147:29:21","nodeType":"ErrorDefinition","parameters":{"id":5990,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5987,"mutability":"mutable","name":"bits","nameLocation":"1183:4:21","nodeType":"VariableDeclaration","scope":5991,"src":"1177:10:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":5986,"name":"uint8","nodeType":"ElementaryTypeName","src":"1177:5:21","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":5989,"mutability":"mutable","name":"value","nameLocation":"1196:5:21","nodeType":"VariableDeclaration","scope":5991,"src":"1189:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":5988,"name":"int256","nodeType":"ElementaryTypeName","src":"1189:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1176:26:21"},"src":"1141:62:21"},{"documentation":{"id":5992,"nodeType":"StructuredDocumentation","src":"1209:75:21","text":" @dev An uint value doesn't fit in an int of `bits` size."},"errorSelector":"24775e06","id":5996,"name":"SafeCastOverflowedUintToInt","nameLocation":"1295:27:21","nodeType":"ErrorDefinition","parameters":{"id":5995,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5994,"mutability":"mutable","name":"value","nameLocation":"1331:5:21","nodeType":"VariableDeclaration","scope":5996,"src":"1323:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5993,"name":"uint256","nodeType":"ElementaryTypeName","src":"1323:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1322:15:21"},"src":"1289:49:21"},{"body":{"id":6023,"nodeType":"Block","src":"1695:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6010,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6004,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5999,"src":"1709:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6007,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1722:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint248_$","typeString":"type(uint248)"},"typeName":{"id":6006,"name":"uint248","nodeType":"ElementaryTypeName","src":"1722:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint248_$","typeString":"type(uint248)"}],"id":6005,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1717:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6008,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1717:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint248","typeString":"type(uint248)"}},"id":6009,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1731:3:21","memberName":"max","nodeType":"MemberAccess","src":"1717:17:21","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"src":"1709:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6017,"nodeType":"IfStatement","src":"1705:105:21","trueBody":{"id":6016,"nodeType":"Block","src":"1736:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323438","id":6012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1788:3:21","typeDescriptions":{"typeIdentifier":"t_rational_248_by_1","typeString":"int_const 248"},"value":"248"},{"id":6013,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5999,"src":"1793:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_248_by_1","typeString":"int_const 248"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6011,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"1757:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6014,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1757:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6015,"nodeType":"RevertStatement","src":"1750:49:21"}]}},{"expression":{"arguments":[{"id":6020,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5999,"src":"1834:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1826:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint248_$","typeString":"type(uint248)"},"typeName":{"id":6018,"name":"uint248","nodeType":"ElementaryTypeName","src":"1826:7:21","typeDescriptions":{}}},"id":6021,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1826:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"functionReturnParameters":6003,"id":6022,"nodeType":"Return","src":"1819:21:21"}]},"documentation":{"id":5997,"nodeType":"StructuredDocumentation","src":"1344:280:21","text":" @dev Returns the downcasted uint248 from uint256, reverting on\n overflow (when the input is greater than largest uint248).\n Counterpart to Solidity's `uint248` operator.\n Requirements:\n - input must fit into 248 bits"},"id":6024,"implemented":true,"kind":"function","modifiers":[],"name":"toUint248","nameLocation":"1638:9:21","nodeType":"FunctionDefinition","parameters":{"id":6000,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5999,"mutability":"mutable","name":"value","nameLocation":"1656:5:21","nodeType":"VariableDeclaration","scope":6024,"src":"1648:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5998,"name":"uint256","nodeType":"ElementaryTypeName","src":"1648:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1647:15:21"},"returnParameters":{"id":6003,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6002,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6024,"src":"1686:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"},"typeName":{"id":6001,"name":"uint248","nodeType":"ElementaryTypeName","src":"1686:7:21","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"visibility":"internal"}],"src":"1685:9:21"},"scope":7734,"src":"1629:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6051,"nodeType":"Block","src":"2204:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6032,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6027,"src":"2218:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6035,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2231:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint240_$","typeString":"type(uint240)"},"typeName":{"id":6034,"name":"uint240","nodeType":"ElementaryTypeName","src":"2231:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint240_$","typeString":"type(uint240)"}],"id":6033,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2226:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2226:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint240","typeString":"type(uint240)"}},"id":6037,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2240:3:21","memberName":"max","nodeType":"MemberAccess","src":"2226:17:21","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"src":"2218:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6045,"nodeType":"IfStatement","src":"2214:105:21","trueBody":{"id":6044,"nodeType":"Block","src":"2245:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323430","id":6040,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2297:3:21","typeDescriptions":{"typeIdentifier":"t_rational_240_by_1","typeString":"int_const 240"},"value":"240"},{"id":6041,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6027,"src":"2302:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_240_by_1","typeString":"int_const 240"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6039,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"2266:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6042,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2266:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6043,"nodeType":"RevertStatement","src":"2259:49:21"}]}},{"expression":{"arguments":[{"id":6048,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6027,"src":"2343:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6047,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2335:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint240_$","typeString":"type(uint240)"},"typeName":{"id":6046,"name":"uint240","nodeType":"ElementaryTypeName","src":"2335:7:21","typeDescriptions":{}}},"id":6049,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2335:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"functionReturnParameters":6031,"id":6050,"nodeType":"Return","src":"2328:21:21"}]},"documentation":{"id":6025,"nodeType":"StructuredDocumentation","src":"1853:280:21","text":" @dev Returns the downcasted uint240 from uint256, reverting on\n overflow (when the input is greater than largest uint240).\n Counterpart to Solidity's `uint240` operator.\n Requirements:\n - input must fit into 240 bits"},"id":6052,"implemented":true,"kind":"function","modifiers":[],"name":"toUint240","nameLocation":"2147:9:21","nodeType":"FunctionDefinition","parameters":{"id":6028,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6027,"mutability":"mutable","name":"value","nameLocation":"2165:5:21","nodeType":"VariableDeclaration","scope":6052,"src":"2157:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6026,"name":"uint256","nodeType":"ElementaryTypeName","src":"2157:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2156:15:21"},"returnParameters":{"id":6031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6030,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6052,"src":"2195:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"},"typeName":{"id":6029,"name":"uint240","nodeType":"ElementaryTypeName","src":"2195:7:21","typeDescriptions":{"typeIdentifier":"t_uint240","typeString":"uint240"}},"visibility":"internal"}],"src":"2194:9:21"},"scope":7734,"src":"2138:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6079,"nodeType":"Block","src":"2713:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6060,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6055,"src":"2727:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6063,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2740:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint232_$","typeString":"type(uint232)"},"typeName":{"id":6062,"name":"uint232","nodeType":"ElementaryTypeName","src":"2740:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint232_$","typeString":"type(uint232)"}],"id":6061,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2735:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6064,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2735:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint232","typeString":"type(uint232)"}},"id":6065,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2749:3:21","memberName":"max","nodeType":"MemberAccess","src":"2735:17:21","typeDescriptions":{"typeIdentifier":"t_uint232","typeString":"uint232"}},"src":"2727:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6073,"nodeType":"IfStatement","src":"2723:105:21","trueBody":{"id":6072,"nodeType":"Block","src":"2754:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323332","id":6068,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2806:3:21","typeDescriptions":{"typeIdentifier":"t_rational_232_by_1","typeString":"int_const 232"},"value":"232"},{"id":6069,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6055,"src":"2811:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_232_by_1","typeString":"int_const 232"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6067,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"2775:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6070,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2775:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6071,"nodeType":"RevertStatement","src":"2768:49:21"}]}},{"expression":{"arguments":[{"id":6076,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6055,"src":"2852:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6075,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2844:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint232_$","typeString":"type(uint232)"},"typeName":{"id":6074,"name":"uint232","nodeType":"ElementaryTypeName","src":"2844:7:21","typeDescriptions":{}}},"id":6077,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2844:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint232","typeString":"uint232"}},"functionReturnParameters":6059,"id":6078,"nodeType":"Return","src":"2837:21:21"}]},"documentation":{"id":6053,"nodeType":"StructuredDocumentation","src":"2362:280:21","text":" @dev Returns the downcasted uint232 from uint256, reverting on\n overflow (when the input is greater than largest uint232).\n Counterpart to Solidity's `uint232` operator.\n Requirements:\n - input must fit into 232 bits"},"id":6080,"implemented":true,"kind":"function","modifiers":[],"name":"toUint232","nameLocation":"2656:9:21","nodeType":"FunctionDefinition","parameters":{"id":6056,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6055,"mutability":"mutable","name":"value","nameLocation":"2674:5:21","nodeType":"VariableDeclaration","scope":6080,"src":"2666:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6054,"name":"uint256","nodeType":"ElementaryTypeName","src":"2666:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2665:15:21"},"returnParameters":{"id":6059,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6058,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6080,"src":"2704:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint232","typeString":"uint232"},"typeName":{"id":6057,"name":"uint232","nodeType":"ElementaryTypeName","src":"2704:7:21","typeDescriptions":{"typeIdentifier":"t_uint232","typeString":"uint232"}},"visibility":"internal"}],"src":"2703:9:21"},"scope":7734,"src":"2647:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6107,"nodeType":"Block","src":"3222:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6094,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6088,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6083,"src":"3236:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6091,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3249:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint224_$","typeString":"type(uint224)"},"typeName":{"id":6090,"name":"uint224","nodeType":"ElementaryTypeName","src":"3249:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint224_$","typeString":"type(uint224)"}],"id":6089,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3244:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6092,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3244:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint224","typeString":"type(uint224)"}},"id":6093,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3258:3:21","memberName":"max","nodeType":"MemberAccess","src":"3244:17:21","typeDescriptions":{"typeIdentifier":"t_uint224","typeString":"uint224"}},"src":"3236:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6101,"nodeType":"IfStatement","src":"3232:105:21","trueBody":{"id":6100,"nodeType":"Block","src":"3263:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323234","id":6096,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3315:3:21","typeDescriptions":{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},"value":"224"},{"id":6097,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6083,"src":"3320:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6095,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"3284:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3284:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6099,"nodeType":"RevertStatement","src":"3277:49:21"}]}},{"expression":{"arguments":[{"id":6104,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6083,"src":"3361:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6103,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3353:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint224_$","typeString":"type(uint224)"},"typeName":{"id":6102,"name":"uint224","nodeType":"ElementaryTypeName","src":"3353:7:21","typeDescriptions":{}}},"id":6105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3353:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint224","typeString":"uint224"}},"functionReturnParameters":6087,"id":6106,"nodeType":"Return","src":"3346:21:21"}]},"documentation":{"id":6081,"nodeType":"StructuredDocumentation","src":"2871:280:21","text":" @dev Returns the downcasted uint224 from uint256, reverting on\n overflow (when the input is greater than largest uint224).\n Counterpart to Solidity's `uint224` operator.\n Requirements:\n - input must fit into 224 bits"},"id":6108,"implemented":true,"kind":"function","modifiers":[],"name":"toUint224","nameLocation":"3165:9:21","nodeType":"FunctionDefinition","parameters":{"id":6084,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6083,"mutability":"mutable","name":"value","nameLocation":"3183:5:21","nodeType":"VariableDeclaration","scope":6108,"src":"3175:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6082,"name":"uint256","nodeType":"ElementaryTypeName","src":"3175:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3174:15:21"},"returnParameters":{"id":6087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6086,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6108,"src":"3213:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint224","typeString":"uint224"},"typeName":{"id":6085,"name":"uint224","nodeType":"ElementaryTypeName","src":"3213:7:21","typeDescriptions":{"typeIdentifier":"t_uint224","typeString":"uint224"}},"visibility":"internal"}],"src":"3212:9:21"},"scope":7734,"src":"3156:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6135,"nodeType":"Block","src":"3731:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6116,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6111,"src":"3745:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6119,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3758:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint216_$","typeString":"type(uint216)"},"typeName":{"id":6118,"name":"uint216","nodeType":"ElementaryTypeName","src":"3758:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint216_$","typeString":"type(uint216)"}],"id":6117,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3753:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6120,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3753:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint216","typeString":"type(uint216)"}},"id":6121,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3767:3:21","memberName":"max","nodeType":"MemberAccess","src":"3753:17:21","typeDescriptions":{"typeIdentifier":"t_uint216","typeString":"uint216"}},"src":"3745:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6129,"nodeType":"IfStatement","src":"3741:105:21","trueBody":{"id":6128,"nodeType":"Block","src":"3772:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323136","id":6124,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3824:3:21","typeDescriptions":{"typeIdentifier":"t_rational_216_by_1","typeString":"int_const 216"},"value":"216"},{"id":6125,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6111,"src":"3829:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_216_by_1","typeString":"int_const 216"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6123,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"3793:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3793:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6127,"nodeType":"RevertStatement","src":"3786:49:21"}]}},{"expression":{"arguments":[{"id":6132,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6111,"src":"3870:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6131,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3862:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint216_$","typeString":"type(uint216)"},"typeName":{"id":6130,"name":"uint216","nodeType":"ElementaryTypeName","src":"3862:7:21","typeDescriptions":{}}},"id":6133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3862:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint216","typeString":"uint216"}},"functionReturnParameters":6115,"id":6134,"nodeType":"Return","src":"3855:21:21"}]},"documentation":{"id":6109,"nodeType":"StructuredDocumentation","src":"3380:280:21","text":" @dev Returns the downcasted uint216 from uint256, reverting on\n overflow (when the input is greater than largest uint216).\n Counterpart to Solidity's `uint216` operator.\n Requirements:\n - input must fit into 216 bits"},"id":6136,"implemented":true,"kind":"function","modifiers":[],"name":"toUint216","nameLocation":"3674:9:21","nodeType":"FunctionDefinition","parameters":{"id":6112,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6111,"mutability":"mutable","name":"value","nameLocation":"3692:5:21","nodeType":"VariableDeclaration","scope":6136,"src":"3684:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6110,"name":"uint256","nodeType":"ElementaryTypeName","src":"3684:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3683:15:21"},"returnParameters":{"id":6115,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6114,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6136,"src":"3722:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint216","typeString":"uint216"},"typeName":{"id":6113,"name":"uint216","nodeType":"ElementaryTypeName","src":"3722:7:21","typeDescriptions":{"typeIdentifier":"t_uint216","typeString":"uint216"}},"visibility":"internal"}],"src":"3721:9:21"},"scope":7734,"src":"3665:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6163,"nodeType":"Block","src":"4240:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6144,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6139,"src":"4254:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6147,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4267:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint208_$","typeString":"type(uint208)"},"typeName":{"id":6146,"name":"uint208","nodeType":"ElementaryTypeName","src":"4267:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint208_$","typeString":"type(uint208)"}],"id":6145,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4262:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6148,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4262:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint208","typeString":"type(uint208)"}},"id":6149,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4276:3:21","memberName":"max","nodeType":"MemberAccess","src":"4262:17:21","typeDescriptions":{"typeIdentifier":"t_uint208","typeString":"uint208"}},"src":"4254:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6157,"nodeType":"IfStatement","src":"4250:105:21","trueBody":{"id":6156,"nodeType":"Block","src":"4281:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323038","id":6152,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4333:3:21","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"value":"208"},{"id":6153,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6139,"src":"4338:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6151,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"4302:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4302:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6155,"nodeType":"RevertStatement","src":"4295:49:21"}]}},{"expression":{"arguments":[{"id":6160,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6139,"src":"4379:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6159,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4371:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint208_$","typeString":"type(uint208)"},"typeName":{"id":6158,"name":"uint208","nodeType":"ElementaryTypeName","src":"4371:7:21","typeDescriptions":{}}},"id":6161,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4371:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint208","typeString":"uint208"}},"functionReturnParameters":6143,"id":6162,"nodeType":"Return","src":"4364:21:21"}]},"documentation":{"id":6137,"nodeType":"StructuredDocumentation","src":"3889:280:21","text":" @dev Returns the downcasted uint208 from uint256, reverting on\n overflow (when the input is greater than largest uint208).\n Counterpart to Solidity's `uint208` operator.\n Requirements:\n - input must fit into 208 bits"},"id":6164,"implemented":true,"kind":"function","modifiers":[],"name":"toUint208","nameLocation":"4183:9:21","nodeType":"FunctionDefinition","parameters":{"id":6140,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6139,"mutability":"mutable","name":"value","nameLocation":"4201:5:21","nodeType":"VariableDeclaration","scope":6164,"src":"4193:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6138,"name":"uint256","nodeType":"ElementaryTypeName","src":"4193:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4192:15:21"},"returnParameters":{"id":6143,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6142,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6164,"src":"4231:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint208","typeString":"uint208"},"typeName":{"id":6141,"name":"uint208","nodeType":"ElementaryTypeName","src":"4231:7:21","typeDescriptions":{"typeIdentifier":"t_uint208","typeString":"uint208"}},"visibility":"internal"}],"src":"4230:9:21"},"scope":7734,"src":"4174:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6191,"nodeType":"Block","src":"4749:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6178,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6172,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6167,"src":"4763:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6175,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4776:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint200_$","typeString":"type(uint200)"},"typeName":{"id":6174,"name":"uint200","nodeType":"ElementaryTypeName","src":"4776:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint200_$","typeString":"type(uint200)"}],"id":6173,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4771:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6176,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4771:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint200","typeString":"type(uint200)"}},"id":6177,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4785:3:21","memberName":"max","nodeType":"MemberAccess","src":"4771:17:21","typeDescriptions":{"typeIdentifier":"t_uint200","typeString":"uint200"}},"src":"4763:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6185,"nodeType":"IfStatement","src":"4759:105:21","trueBody":{"id":6184,"nodeType":"Block","src":"4790:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323030","id":6180,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4842:3:21","typeDescriptions":{"typeIdentifier":"t_rational_200_by_1","typeString":"int_const 200"},"value":"200"},{"id":6181,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6167,"src":"4847:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_200_by_1","typeString":"int_const 200"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6179,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"4811:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6182,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4811:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6183,"nodeType":"RevertStatement","src":"4804:49:21"}]}},{"expression":{"arguments":[{"id":6188,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6167,"src":"4888:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6187,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4880:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint200_$","typeString":"type(uint200)"},"typeName":{"id":6186,"name":"uint200","nodeType":"ElementaryTypeName","src":"4880:7:21","typeDescriptions":{}}},"id":6189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4880:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint200","typeString":"uint200"}},"functionReturnParameters":6171,"id":6190,"nodeType":"Return","src":"4873:21:21"}]},"documentation":{"id":6165,"nodeType":"StructuredDocumentation","src":"4398:280:21","text":" @dev Returns the downcasted uint200 from uint256, reverting on\n overflow (when the input is greater than largest uint200).\n Counterpart to Solidity's `uint200` operator.\n Requirements:\n - input must fit into 200 bits"},"id":6192,"implemented":true,"kind":"function","modifiers":[],"name":"toUint200","nameLocation":"4692:9:21","nodeType":"FunctionDefinition","parameters":{"id":6168,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6167,"mutability":"mutable","name":"value","nameLocation":"4710:5:21","nodeType":"VariableDeclaration","scope":6192,"src":"4702:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6166,"name":"uint256","nodeType":"ElementaryTypeName","src":"4702:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4701:15:21"},"returnParameters":{"id":6171,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6170,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6192,"src":"4740:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint200","typeString":"uint200"},"typeName":{"id":6169,"name":"uint200","nodeType":"ElementaryTypeName","src":"4740:7:21","typeDescriptions":{"typeIdentifier":"t_uint200","typeString":"uint200"}},"visibility":"internal"}],"src":"4739:9:21"},"scope":7734,"src":"4683:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6219,"nodeType":"Block","src":"5258:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6200,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6195,"src":"5272:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6203,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5285:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint192_$","typeString":"type(uint192)"},"typeName":{"id":6202,"name":"uint192","nodeType":"ElementaryTypeName","src":"5285:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint192_$","typeString":"type(uint192)"}],"id":6201,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"5280:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5280:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint192","typeString":"type(uint192)"}},"id":6205,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5294:3:21","memberName":"max","nodeType":"MemberAccess","src":"5280:17:21","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"src":"5272:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6213,"nodeType":"IfStatement","src":"5268:105:21","trueBody":{"id":6212,"nodeType":"Block","src":"5299:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313932","id":6208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5351:3:21","typeDescriptions":{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},"value":"192"},{"id":6209,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6195,"src":"5356:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6207,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"5320:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5320:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6211,"nodeType":"RevertStatement","src":"5313:49:21"}]}},{"expression":{"arguments":[{"id":6216,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6195,"src":"5397:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6215,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5389:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint192_$","typeString":"type(uint192)"},"typeName":{"id":6214,"name":"uint192","nodeType":"ElementaryTypeName","src":"5389:7:21","typeDescriptions":{}}},"id":6217,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5389:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"functionReturnParameters":6199,"id":6218,"nodeType":"Return","src":"5382:21:21"}]},"documentation":{"id":6193,"nodeType":"StructuredDocumentation","src":"4907:280:21","text":" @dev Returns the downcasted uint192 from uint256, reverting on\n overflow (when the input is greater than largest uint192).\n Counterpart to Solidity's `uint192` operator.\n Requirements:\n - input must fit into 192 bits"},"id":6220,"implemented":true,"kind":"function","modifiers":[],"name":"toUint192","nameLocation":"5201:9:21","nodeType":"FunctionDefinition","parameters":{"id":6196,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6195,"mutability":"mutable","name":"value","nameLocation":"5219:5:21","nodeType":"VariableDeclaration","scope":6220,"src":"5211:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6194,"name":"uint256","nodeType":"ElementaryTypeName","src":"5211:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5210:15:21"},"returnParameters":{"id":6199,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6198,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6220,"src":"5249:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"},"typeName":{"id":6197,"name":"uint192","nodeType":"ElementaryTypeName","src":"5249:7:21","typeDescriptions":{"typeIdentifier":"t_uint192","typeString":"uint192"}},"visibility":"internal"}],"src":"5248:9:21"},"scope":7734,"src":"5192:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6247,"nodeType":"Block","src":"5767:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6234,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6228,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6223,"src":"5781:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6231,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5794:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint184_$","typeString":"type(uint184)"},"typeName":{"id":6230,"name":"uint184","nodeType":"ElementaryTypeName","src":"5794:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint184_$","typeString":"type(uint184)"}],"id":6229,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"5789:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6232,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5789:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint184","typeString":"type(uint184)"}},"id":6233,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5803:3:21","memberName":"max","nodeType":"MemberAccess","src":"5789:17:21","typeDescriptions":{"typeIdentifier":"t_uint184","typeString":"uint184"}},"src":"5781:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6241,"nodeType":"IfStatement","src":"5777:105:21","trueBody":{"id":6240,"nodeType":"Block","src":"5808:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313834","id":6236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5860:3:21","typeDescriptions":{"typeIdentifier":"t_rational_184_by_1","typeString":"int_const 184"},"value":"184"},{"id":6237,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6223,"src":"5865:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_184_by_1","typeString":"int_const 184"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6235,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"5829:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6238,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5829:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6239,"nodeType":"RevertStatement","src":"5822:49:21"}]}},{"expression":{"arguments":[{"id":6244,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6223,"src":"5906:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6243,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5898:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint184_$","typeString":"type(uint184)"},"typeName":{"id":6242,"name":"uint184","nodeType":"ElementaryTypeName","src":"5898:7:21","typeDescriptions":{}}},"id":6245,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5898:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint184","typeString":"uint184"}},"functionReturnParameters":6227,"id":6246,"nodeType":"Return","src":"5891:21:21"}]},"documentation":{"id":6221,"nodeType":"StructuredDocumentation","src":"5416:280:21","text":" @dev Returns the downcasted uint184 from uint256, reverting on\n overflow (when the input is greater than largest uint184).\n Counterpart to Solidity's `uint184` operator.\n Requirements:\n - input must fit into 184 bits"},"id":6248,"implemented":true,"kind":"function","modifiers":[],"name":"toUint184","nameLocation":"5710:9:21","nodeType":"FunctionDefinition","parameters":{"id":6224,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6223,"mutability":"mutable","name":"value","nameLocation":"5728:5:21","nodeType":"VariableDeclaration","scope":6248,"src":"5720:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6222,"name":"uint256","nodeType":"ElementaryTypeName","src":"5720:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5719:15:21"},"returnParameters":{"id":6227,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6226,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6248,"src":"5758:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint184","typeString":"uint184"},"typeName":{"id":6225,"name":"uint184","nodeType":"ElementaryTypeName","src":"5758:7:21","typeDescriptions":{"typeIdentifier":"t_uint184","typeString":"uint184"}},"visibility":"internal"}],"src":"5757:9:21"},"scope":7734,"src":"5701:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6275,"nodeType":"Block","src":"6276:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6256,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6251,"src":"6290:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6259,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6303:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint176_$","typeString":"type(uint176)"},"typeName":{"id":6258,"name":"uint176","nodeType":"ElementaryTypeName","src":"6303:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint176_$","typeString":"type(uint176)"}],"id":6257,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6298:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6298:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint176","typeString":"type(uint176)"}},"id":6261,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6312:3:21","memberName":"max","nodeType":"MemberAccess","src":"6298:17:21","typeDescriptions":{"typeIdentifier":"t_uint176","typeString":"uint176"}},"src":"6290:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6269,"nodeType":"IfStatement","src":"6286:105:21","trueBody":{"id":6268,"nodeType":"Block","src":"6317:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313736","id":6264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6369:3:21","typeDescriptions":{"typeIdentifier":"t_rational_176_by_1","typeString":"int_const 176"},"value":"176"},{"id":6265,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6251,"src":"6374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_176_by_1","typeString":"int_const 176"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6263,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"6338:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6338:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6267,"nodeType":"RevertStatement","src":"6331:49:21"}]}},{"expression":{"arguments":[{"id":6272,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6251,"src":"6415:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6271,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6407:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint176_$","typeString":"type(uint176)"},"typeName":{"id":6270,"name":"uint176","nodeType":"ElementaryTypeName","src":"6407:7:21","typeDescriptions":{}}},"id":6273,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6407:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint176","typeString":"uint176"}},"functionReturnParameters":6255,"id":6274,"nodeType":"Return","src":"6400:21:21"}]},"documentation":{"id":6249,"nodeType":"StructuredDocumentation","src":"5925:280:21","text":" @dev Returns the downcasted uint176 from uint256, reverting on\n overflow (when the input is greater than largest uint176).\n Counterpart to Solidity's `uint176` operator.\n Requirements:\n - input must fit into 176 bits"},"id":6276,"implemented":true,"kind":"function","modifiers":[],"name":"toUint176","nameLocation":"6219:9:21","nodeType":"FunctionDefinition","parameters":{"id":6252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6251,"mutability":"mutable","name":"value","nameLocation":"6237:5:21","nodeType":"VariableDeclaration","scope":6276,"src":"6229:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6250,"name":"uint256","nodeType":"ElementaryTypeName","src":"6229:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6228:15:21"},"returnParameters":{"id":6255,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6254,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6276,"src":"6267:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint176","typeString":"uint176"},"typeName":{"id":6253,"name":"uint176","nodeType":"ElementaryTypeName","src":"6267:7:21","typeDescriptions":{"typeIdentifier":"t_uint176","typeString":"uint176"}},"visibility":"internal"}],"src":"6266:9:21"},"scope":7734,"src":"6210:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6303,"nodeType":"Block","src":"6785:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6290,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6284,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6279,"src":"6799:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6287,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6812:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint168_$","typeString":"type(uint168)"},"typeName":{"id":6286,"name":"uint168","nodeType":"ElementaryTypeName","src":"6812:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint168_$","typeString":"type(uint168)"}],"id":6285,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6807:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6807:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint168","typeString":"type(uint168)"}},"id":6289,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6821:3:21","memberName":"max","nodeType":"MemberAccess","src":"6807:17:21","typeDescriptions":{"typeIdentifier":"t_uint168","typeString":"uint168"}},"src":"6799:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6297,"nodeType":"IfStatement","src":"6795:105:21","trueBody":{"id":6296,"nodeType":"Block","src":"6826:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313638","id":6292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6878:3:21","typeDescriptions":{"typeIdentifier":"t_rational_168_by_1","typeString":"int_const 168"},"value":"168"},{"id":6293,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6279,"src":"6883:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_168_by_1","typeString":"int_const 168"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6291,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"6847:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6294,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6847:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6295,"nodeType":"RevertStatement","src":"6840:49:21"}]}},{"expression":{"arguments":[{"id":6300,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6279,"src":"6924:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6299,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6916:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint168_$","typeString":"type(uint168)"},"typeName":{"id":6298,"name":"uint168","nodeType":"ElementaryTypeName","src":"6916:7:21","typeDescriptions":{}}},"id":6301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6916:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint168","typeString":"uint168"}},"functionReturnParameters":6283,"id":6302,"nodeType":"Return","src":"6909:21:21"}]},"documentation":{"id":6277,"nodeType":"StructuredDocumentation","src":"6434:280:21","text":" @dev Returns the downcasted uint168 from uint256, reverting on\n overflow (when the input is greater than largest uint168).\n Counterpart to Solidity's `uint168` operator.\n Requirements:\n - input must fit into 168 bits"},"id":6304,"implemented":true,"kind":"function","modifiers":[],"name":"toUint168","nameLocation":"6728:9:21","nodeType":"FunctionDefinition","parameters":{"id":6280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6279,"mutability":"mutable","name":"value","nameLocation":"6746:5:21","nodeType":"VariableDeclaration","scope":6304,"src":"6738:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6278,"name":"uint256","nodeType":"ElementaryTypeName","src":"6738:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6737:15:21"},"returnParameters":{"id":6283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6282,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6304,"src":"6776:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint168","typeString":"uint168"},"typeName":{"id":6281,"name":"uint168","nodeType":"ElementaryTypeName","src":"6776:7:21","typeDescriptions":{"typeIdentifier":"t_uint168","typeString":"uint168"}},"visibility":"internal"}],"src":"6775:9:21"},"scope":7734,"src":"6719:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6331,"nodeType":"Block","src":"7294:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6312,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6307,"src":"7308:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6315,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7321:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":6314,"name":"uint160","nodeType":"ElementaryTypeName","src":"7321:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"}],"id":6313,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"7316:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7316:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint160","typeString":"type(uint160)"}},"id":6317,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7330:3:21","memberName":"max","nodeType":"MemberAccess","src":"7316:17:21","typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"src":"7308:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6325,"nodeType":"IfStatement","src":"7304:105:21","trueBody":{"id":6324,"nodeType":"Block","src":"7335:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313630","id":6320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7387:3:21","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},{"id":6321,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6307,"src":"7392:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6319,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"7356:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6322,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7356:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6323,"nodeType":"RevertStatement","src":"7349:49:21"}]}},{"expression":{"arguments":[{"id":6328,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6307,"src":"7433:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6327,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7425:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":6326,"name":"uint160","nodeType":"ElementaryTypeName","src":"7425:7:21","typeDescriptions":{}}},"id":6329,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7425:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"functionReturnParameters":6311,"id":6330,"nodeType":"Return","src":"7418:21:21"}]},"documentation":{"id":6305,"nodeType":"StructuredDocumentation","src":"6943:280:21","text":" @dev Returns the downcasted uint160 from uint256, reverting on\n overflow (when the input is greater than largest uint160).\n Counterpart to Solidity's `uint160` operator.\n Requirements:\n - input must fit into 160 bits"},"id":6332,"implemented":true,"kind":"function","modifiers":[],"name":"toUint160","nameLocation":"7237:9:21","nodeType":"FunctionDefinition","parameters":{"id":6308,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6307,"mutability":"mutable","name":"value","nameLocation":"7255:5:21","nodeType":"VariableDeclaration","scope":6332,"src":"7247:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6306,"name":"uint256","nodeType":"ElementaryTypeName","src":"7247:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7246:15:21"},"returnParameters":{"id":6311,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6310,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6332,"src":"7285:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"},"typeName":{"id":6309,"name":"uint160","nodeType":"ElementaryTypeName","src":"7285:7:21","typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"visibility":"internal"}],"src":"7284:9:21"},"scope":7734,"src":"7228:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6359,"nodeType":"Block","src":"7803:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6340,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6335,"src":"7817:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6343,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7830:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint152_$","typeString":"type(uint152)"},"typeName":{"id":6342,"name":"uint152","nodeType":"ElementaryTypeName","src":"7830:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint152_$","typeString":"type(uint152)"}],"id":6341,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"7825:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6344,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7825:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint152","typeString":"type(uint152)"}},"id":6345,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7839:3:21","memberName":"max","nodeType":"MemberAccess","src":"7825:17:21","typeDescriptions":{"typeIdentifier":"t_uint152","typeString":"uint152"}},"src":"7817:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6353,"nodeType":"IfStatement","src":"7813:105:21","trueBody":{"id":6352,"nodeType":"Block","src":"7844:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313532","id":6348,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7896:3:21","typeDescriptions":{"typeIdentifier":"t_rational_152_by_1","typeString":"int_const 152"},"value":"152"},{"id":6349,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6335,"src":"7901:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_152_by_1","typeString":"int_const 152"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6347,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"7865:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7865:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6351,"nodeType":"RevertStatement","src":"7858:49:21"}]}},{"expression":{"arguments":[{"id":6356,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6335,"src":"7942:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6355,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7934:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint152_$","typeString":"type(uint152)"},"typeName":{"id":6354,"name":"uint152","nodeType":"ElementaryTypeName","src":"7934:7:21","typeDescriptions":{}}},"id":6357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7934:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint152","typeString":"uint152"}},"functionReturnParameters":6339,"id":6358,"nodeType":"Return","src":"7927:21:21"}]},"documentation":{"id":6333,"nodeType":"StructuredDocumentation","src":"7452:280:21","text":" @dev Returns the downcasted uint152 from uint256, reverting on\n overflow (when the input is greater than largest uint152).\n Counterpart to Solidity's `uint152` operator.\n Requirements:\n - input must fit into 152 bits"},"id":6360,"implemented":true,"kind":"function","modifiers":[],"name":"toUint152","nameLocation":"7746:9:21","nodeType":"FunctionDefinition","parameters":{"id":6336,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6335,"mutability":"mutable","name":"value","nameLocation":"7764:5:21","nodeType":"VariableDeclaration","scope":6360,"src":"7756:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6334,"name":"uint256","nodeType":"ElementaryTypeName","src":"7756:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7755:15:21"},"returnParameters":{"id":6339,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6338,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6360,"src":"7794:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint152","typeString":"uint152"},"typeName":{"id":6337,"name":"uint152","nodeType":"ElementaryTypeName","src":"7794:7:21","typeDescriptions":{"typeIdentifier":"t_uint152","typeString":"uint152"}},"visibility":"internal"}],"src":"7793:9:21"},"scope":7734,"src":"7737:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6387,"nodeType":"Block","src":"8312:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6368,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6363,"src":"8326:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6371,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8339:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint144_$","typeString":"type(uint144)"},"typeName":{"id":6370,"name":"uint144","nodeType":"ElementaryTypeName","src":"8339:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint144_$","typeString":"type(uint144)"}],"id":6369,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"8334:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6372,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8334:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint144","typeString":"type(uint144)"}},"id":6373,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8348:3:21","memberName":"max","nodeType":"MemberAccess","src":"8334:17:21","typeDescriptions":{"typeIdentifier":"t_uint144","typeString":"uint144"}},"src":"8326:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6381,"nodeType":"IfStatement","src":"8322:105:21","trueBody":{"id":6380,"nodeType":"Block","src":"8353:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313434","id":6376,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8405:3:21","typeDescriptions":{"typeIdentifier":"t_rational_144_by_1","typeString":"int_const 144"},"value":"144"},{"id":6377,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6363,"src":"8410:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_144_by_1","typeString":"int_const 144"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6375,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"8374:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6378,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8374:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6379,"nodeType":"RevertStatement","src":"8367:49:21"}]}},{"expression":{"arguments":[{"id":6384,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6363,"src":"8451:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6383,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8443:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint144_$","typeString":"type(uint144)"},"typeName":{"id":6382,"name":"uint144","nodeType":"ElementaryTypeName","src":"8443:7:21","typeDescriptions":{}}},"id":6385,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8443:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint144","typeString":"uint144"}},"functionReturnParameters":6367,"id":6386,"nodeType":"Return","src":"8436:21:21"}]},"documentation":{"id":6361,"nodeType":"StructuredDocumentation","src":"7961:280:21","text":" @dev Returns the downcasted uint144 from uint256, reverting on\n overflow (when the input is greater than largest uint144).\n Counterpart to Solidity's `uint144` operator.\n Requirements:\n - input must fit into 144 bits"},"id":6388,"implemented":true,"kind":"function","modifiers":[],"name":"toUint144","nameLocation":"8255:9:21","nodeType":"FunctionDefinition","parameters":{"id":6364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6363,"mutability":"mutable","name":"value","nameLocation":"8273:5:21","nodeType":"VariableDeclaration","scope":6388,"src":"8265:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6362,"name":"uint256","nodeType":"ElementaryTypeName","src":"8265:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8264:15:21"},"returnParameters":{"id":6367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6366,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6388,"src":"8303:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint144","typeString":"uint144"},"typeName":{"id":6365,"name":"uint144","nodeType":"ElementaryTypeName","src":"8303:7:21","typeDescriptions":{"typeIdentifier":"t_uint144","typeString":"uint144"}},"visibility":"internal"}],"src":"8302:9:21"},"scope":7734,"src":"8246:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6415,"nodeType":"Block","src":"8821:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6396,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6391,"src":"8835:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6399,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8848:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint136_$","typeString":"type(uint136)"},"typeName":{"id":6398,"name":"uint136","nodeType":"ElementaryTypeName","src":"8848:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint136_$","typeString":"type(uint136)"}],"id":6397,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"8843:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8843:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint136","typeString":"type(uint136)"}},"id":6401,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8857:3:21","memberName":"max","nodeType":"MemberAccess","src":"8843:17:21","typeDescriptions":{"typeIdentifier":"t_uint136","typeString":"uint136"}},"src":"8835:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6409,"nodeType":"IfStatement","src":"8831:105:21","trueBody":{"id":6408,"nodeType":"Block","src":"8862:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313336","id":6404,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8914:3:21","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},{"id":6405,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6391,"src":"8919:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6403,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"8883:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6406,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8883:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6407,"nodeType":"RevertStatement","src":"8876:49:21"}]}},{"expression":{"arguments":[{"id":6412,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6391,"src":"8960:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6411,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8952:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint136_$","typeString":"type(uint136)"},"typeName":{"id":6410,"name":"uint136","nodeType":"ElementaryTypeName","src":"8952:7:21","typeDescriptions":{}}},"id":6413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8952:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint136","typeString":"uint136"}},"functionReturnParameters":6395,"id":6414,"nodeType":"Return","src":"8945:21:21"}]},"documentation":{"id":6389,"nodeType":"StructuredDocumentation","src":"8470:280:21","text":" @dev Returns the downcasted uint136 from uint256, reverting on\n overflow (when the input is greater than largest uint136).\n Counterpart to Solidity's `uint136` operator.\n Requirements:\n - input must fit into 136 bits"},"id":6416,"implemented":true,"kind":"function","modifiers":[],"name":"toUint136","nameLocation":"8764:9:21","nodeType":"FunctionDefinition","parameters":{"id":6392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6391,"mutability":"mutable","name":"value","nameLocation":"8782:5:21","nodeType":"VariableDeclaration","scope":6416,"src":"8774:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6390,"name":"uint256","nodeType":"ElementaryTypeName","src":"8774:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8773:15:21"},"returnParameters":{"id":6395,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6394,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6416,"src":"8812:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint136","typeString":"uint136"},"typeName":{"id":6393,"name":"uint136","nodeType":"ElementaryTypeName","src":"8812:7:21","typeDescriptions":{"typeIdentifier":"t_uint136","typeString":"uint136"}},"visibility":"internal"}],"src":"8811:9:21"},"scope":7734,"src":"8755:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6443,"nodeType":"Block","src":"9330:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6430,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6424,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6419,"src":"9344:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6427,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9357:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":6426,"name":"uint128","nodeType":"ElementaryTypeName","src":"9357:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"}],"id":6425,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"9352:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9352:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint128","typeString":"type(uint128)"}},"id":6429,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9366:3:21","memberName":"max","nodeType":"MemberAccess","src":"9352:17:21","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"src":"9344:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6437,"nodeType":"IfStatement","src":"9340:105:21","trueBody":{"id":6436,"nodeType":"Block","src":"9371:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313238","id":6432,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9423:3:21","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},{"id":6433,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6419,"src":"9428:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6431,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"9392:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6434,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9392:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6435,"nodeType":"RevertStatement","src":"9385:49:21"}]}},{"expression":{"arguments":[{"id":6440,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6419,"src":"9469:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6439,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9461:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint128_$","typeString":"type(uint128)"},"typeName":{"id":6438,"name":"uint128","nodeType":"ElementaryTypeName","src":"9461:7:21","typeDescriptions":{}}},"id":6441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9461:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"functionReturnParameters":6423,"id":6442,"nodeType":"Return","src":"9454:21:21"}]},"documentation":{"id":6417,"nodeType":"StructuredDocumentation","src":"8979:280:21","text":" @dev Returns the downcasted uint128 from uint256, reverting on\n overflow (when the input is greater than largest uint128).\n Counterpart to Solidity's `uint128` operator.\n Requirements:\n - input must fit into 128 bits"},"id":6444,"implemented":true,"kind":"function","modifiers":[],"name":"toUint128","nameLocation":"9273:9:21","nodeType":"FunctionDefinition","parameters":{"id":6420,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6419,"mutability":"mutable","name":"value","nameLocation":"9291:5:21","nodeType":"VariableDeclaration","scope":6444,"src":"9283:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6418,"name":"uint256","nodeType":"ElementaryTypeName","src":"9283:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9282:15:21"},"returnParameters":{"id":6423,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6422,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6444,"src":"9321:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"},"typeName":{"id":6421,"name":"uint128","nodeType":"ElementaryTypeName","src":"9321:7:21","typeDescriptions":{"typeIdentifier":"t_uint128","typeString":"uint128"}},"visibility":"internal"}],"src":"9320:9:21"},"scope":7734,"src":"9264:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6471,"nodeType":"Block","src":"9839:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6452,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6447,"src":"9853:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6455,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9866:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"},"typeName":{"id":6454,"name":"uint120","nodeType":"ElementaryTypeName","src":"9866:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"}],"id":6453,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"9861:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6456,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9861:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint120","typeString":"type(uint120)"}},"id":6457,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9875:3:21","memberName":"max","nodeType":"MemberAccess","src":"9861:17:21","typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"}},"src":"9853:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6465,"nodeType":"IfStatement","src":"9849:105:21","trueBody":{"id":6464,"nodeType":"Block","src":"9880:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313230","id":6460,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9932:3:21","typeDescriptions":{"typeIdentifier":"t_rational_120_by_1","typeString":"int_const 120"},"value":"120"},{"id":6461,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6447,"src":"9937:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_120_by_1","typeString":"int_const 120"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6459,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"9901:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6462,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9901:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6463,"nodeType":"RevertStatement","src":"9894:49:21"}]}},{"expression":{"arguments":[{"id":6468,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6447,"src":"9978:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6467,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9970:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint120_$","typeString":"type(uint120)"},"typeName":{"id":6466,"name":"uint120","nodeType":"ElementaryTypeName","src":"9970:7:21","typeDescriptions":{}}},"id":6469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9970:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"}},"functionReturnParameters":6451,"id":6470,"nodeType":"Return","src":"9963:21:21"}]},"documentation":{"id":6445,"nodeType":"StructuredDocumentation","src":"9488:280:21","text":" @dev Returns the downcasted uint120 from uint256, reverting on\n overflow (when the input is greater than largest uint120).\n Counterpart to Solidity's `uint120` operator.\n Requirements:\n - input must fit into 120 bits"},"id":6472,"implemented":true,"kind":"function","modifiers":[],"name":"toUint120","nameLocation":"9782:9:21","nodeType":"FunctionDefinition","parameters":{"id":6448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6447,"mutability":"mutable","name":"value","nameLocation":"9800:5:21","nodeType":"VariableDeclaration","scope":6472,"src":"9792:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6446,"name":"uint256","nodeType":"ElementaryTypeName","src":"9792:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9791:15:21"},"returnParameters":{"id":6451,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6450,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6472,"src":"9830:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"},"typeName":{"id":6449,"name":"uint120","nodeType":"ElementaryTypeName","src":"9830:7:21","typeDescriptions":{"typeIdentifier":"t_uint120","typeString":"uint120"}},"visibility":"internal"}],"src":"9829:9:21"},"scope":7734,"src":"9773:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6499,"nodeType":"Block","src":"10348:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6480,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6475,"src":"10362:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6483,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10375:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":6482,"name":"uint112","nodeType":"ElementaryTypeName","src":"10375:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"}],"id":6481,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"10370:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6484,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10370:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint112","typeString":"type(uint112)"}},"id":6485,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10384:3:21","memberName":"max","nodeType":"MemberAccess","src":"10370:17:21","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"src":"10362:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6493,"nodeType":"IfStatement","src":"10358:105:21","trueBody":{"id":6492,"nodeType":"Block","src":"10389:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313132","id":6488,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10441:3:21","typeDescriptions":{"typeIdentifier":"t_rational_112_by_1","typeString":"int_const 112"},"value":"112"},{"id":6489,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6475,"src":"10446:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_112_by_1","typeString":"int_const 112"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6487,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"10410:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10410:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6491,"nodeType":"RevertStatement","src":"10403:49:21"}]}},{"expression":{"arguments":[{"id":6496,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6475,"src":"10487:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10479:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint112_$","typeString":"type(uint112)"},"typeName":{"id":6494,"name":"uint112","nodeType":"ElementaryTypeName","src":"10479:7:21","typeDescriptions":{}}},"id":6497,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10479:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"functionReturnParameters":6479,"id":6498,"nodeType":"Return","src":"10472:21:21"}]},"documentation":{"id":6473,"nodeType":"StructuredDocumentation","src":"9997:280:21","text":" @dev Returns the downcasted uint112 from uint256, reverting on\n overflow (when the input is greater than largest uint112).\n Counterpart to Solidity's `uint112` operator.\n Requirements:\n - input must fit into 112 bits"},"id":6500,"implemented":true,"kind":"function","modifiers":[],"name":"toUint112","nameLocation":"10291:9:21","nodeType":"FunctionDefinition","parameters":{"id":6476,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6475,"mutability":"mutable","name":"value","nameLocation":"10309:5:21","nodeType":"VariableDeclaration","scope":6500,"src":"10301:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6474,"name":"uint256","nodeType":"ElementaryTypeName","src":"10301:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10300:15:21"},"returnParameters":{"id":6479,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6478,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6500,"src":"10339:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"},"typeName":{"id":6477,"name":"uint112","nodeType":"ElementaryTypeName","src":"10339:7:21","typeDescriptions":{"typeIdentifier":"t_uint112","typeString":"uint112"}},"visibility":"internal"}],"src":"10338:9:21"},"scope":7734,"src":"10282:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6527,"nodeType":"Block","src":"10857:152:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6508,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6503,"src":"10871:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6511,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10884:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint104_$","typeString":"type(uint104)"},"typeName":{"id":6510,"name":"uint104","nodeType":"ElementaryTypeName","src":"10884:7:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint104_$","typeString":"type(uint104)"}],"id":6509,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"10879:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10879:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint104","typeString":"type(uint104)"}},"id":6513,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10893:3:21","memberName":"max","nodeType":"MemberAccess","src":"10879:17:21","typeDescriptions":{"typeIdentifier":"t_uint104","typeString":"uint104"}},"src":"10871:25:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6521,"nodeType":"IfStatement","src":"10867:105:21","trueBody":{"id":6520,"nodeType":"Block","src":"10898:74:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313034","id":6516,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10950:3:21","typeDescriptions":{"typeIdentifier":"t_rational_104_by_1","typeString":"int_const 104"},"value":"104"},{"id":6517,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6503,"src":"10955:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_104_by_1","typeString":"int_const 104"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6515,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"10919:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10919:42:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6519,"nodeType":"RevertStatement","src":"10912:49:21"}]}},{"expression":{"arguments":[{"id":6524,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6503,"src":"10996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6523,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10988:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint104_$","typeString":"type(uint104)"},"typeName":{"id":6522,"name":"uint104","nodeType":"ElementaryTypeName","src":"10988:7:21","typeDescriptions":{}}},"id":6525,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10988:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint104","typeString":"uint104"}},"functionReturnParameters":6507,"id":6526,"nodeType":"Return","src":"10981:21:21"}]},"documentation":{"id":6501,"nodeType":"StructuredDocumentation","src":"10506:280:21","text":" @dev Returns the downcasted uint104 from uint256, reverting on\n overflow (when the input is greater than largest uint104).\n Counterpart to Solidity's `uint104` operator.\n Requirements:\n - input must fit into 104 bits"},"id":6528,"implemented":true,"kind":"function","modifiers":[],"name":"toUint104","nameLocation":"10800:9:21","nodeType":"FunctionDefinition","parameters":{"id":6504,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6503,"mutability":"mutable","name":"value","nameLocation":"10818:5:21","nodeType":"VariableDeclaration","scope":6528,"src":"10810:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6502,"name":"uint256","nodeType":"ElementaryTypeName","src":"10810:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10809:15:21"},"returnParameters":{"id":6507,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6506,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6528,"src":"10848:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint104","typeString":"uint104"},"typeName":{"id":6505,"name":"uint104","nodeType":"ElementaryTypeName","src":"10848:7:21","typeDescriptions":{"typeIdentifier":"t_uint104","typeString":"uint104"}},"visibility":"internal"}],"src":"10847:9:21"},"scope":7734,"src":"10791:218:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6555,"nodeType":"Block","src":"11360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6542,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6536,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6531,"src":"11374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6539,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint96_$","typeString":"type(uint96)"},"typeName":{"id":6538,"name":"uint96","nodeType":"ElementaryTypeName","src":"11387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint96_$","typeString":"type(uint96)"}],"id":6537,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"11382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6540,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint96","typeString":"type(uint96)"}},"id":6541,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"11395:3:21","memberName":"max","nodeType":"MemberAccess","src":"11382:16:21","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"src":"11374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6549,"nodeType":"IfStatement","src":"11370:103:21","trueBody":{"id":6548,"nodeType":"Block","src":"11400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3936","id":6544,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},"value":"96"},{"id":6545,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6531,"src":"11456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6543,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"11421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6547,"nodeType":"RevertStatement","src":"11414:48:21"}]}},{"expression":{"arguments":[{"id":6552,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6531,"src":"11496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6551,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint96_$","typeString":"type(uint96)"},"typeName":{"id":6550,"name":"uint96","nodeType":"ElementaryTypeName","src":"11489:6:21","typeDescriptions":{}}},"id":6553,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"functionReturnParameters":6535,"id":6554,"nodeType":"Return","src":"11482:20:21"}]},"documentation":{"id":6529,"nodeType":"StructuredDocumentation","src":"11015:276:21","text":" @dev Returns the downcasted uint96 from uint256, reverting on\n overflow (when the input is greater than largest uint96).\n Counterpart to Solidity's `uint96` operator.\n Requirements:\n - input must fit into 96 bits"},"id":6556,"implemented":true,"kind":"function","modifiers":[],"name":"toUint96","nameLocation":"11305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6531,"mutability":"mutable","name":"value","nameLocation":"11322:5:21","nodeType":"VariableDeclaration","scope":6556,"src":"11314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6530,"name":"uint256","nodeType":"ElementaryTypeName","src":"11314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11313:15:21"},"returnParameters":{"id":6535,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6534,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6556,"src":"11352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"},"typeName":{"id":6533,"name":"uint96","nodeType":"ElementaryTypeName","src":"11352:6:21","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"visibility":"internal"}],"src":"11351:8:21"},"scope":7734,"src":"11296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6583,"nodeType":"Block","src":"11860:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6564,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6559,"src":"11874:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6567,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11887:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint88_$","typeString":"type(uint88)"},"typeName":{"id":6566,"name":"uint88","nodeType":"ElementaryTypeName","src":"11887:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint88_$","typeString":"type(uint88)"}],"id":6565,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"11882:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11882:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint88","typeString":"type(uint88)"}},"id":6569,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"11895:3:21","memberName":"max","nodeType":"MemberAccess","src":"11882:16:21","typeDescriptions":{"typeIdentifier":"t_uint88","typeString":"uint88"}},"src":"11874:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6577,"nodeType":"IfStatement","src":"11870:103:21","trueBody":{"id":6576,"nodeType":"Block","src":"11900:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3838","id":6572,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11952:2:21","typeDescriptions":{"typeIdentifier":"t_rational_88_by_1","typeString":"int_const 88"},"value":"88"},{"id":6573,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6559,"src":"11956:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_88_by_1","typeString":"int_const 88"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6571,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"11921:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6574,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11921:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6575,"nodeType":"RevertStatement","src":"11914:48:21"}]}},{"expression":{"arguments":[{"id":6580,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6559,"src":"11996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6579,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint88_$","typeString":"type(uint88)"},"typeName":{"id":6578,"name":"uint88","nodeType":"ElementaryTypeName","src":"11989:6:21","typeDescriptions":{}}},"id":6581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint88","typeString":"uint88"}},"functionReturnParameters":6563,"id":6582,"nodeType":"Return","src":"11982:20:21"}]},"documentation":{"id":6557,"nodeType":"StructuredDocumentation","src":"11515:276:21","text":" @dev Returns the downcasted uint88 from uint256, reverting on\n overflow (when the input is greater than largest uint88).\n Counterpart to Solidity's `uint88` operator.\n Requirements:\n - input must fit into 88 bits"},"id":6584,"implemented":true,"kind":"function","modifiers":[],"name":"toUint88","nameLocation":"11805:8:21","nodeType":"FunctionDefinition","parameters":{"id":6560,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6559,"mutability":"mutable","name":"value","nameLocation":"11822:5:21","nodeType":"VariableDeclaration","scope":6584,"src":"11814:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6558,"name":"uint256","nodeType":"ElementaryTypeName","src":"11814:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11813:15:21"},"returnParameters":{"id":6563,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6562,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6584,"src":"11852:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint88","typeString":"uint88"},"typeName":{"id":6561,"name":"uint88","nodeType":"ElementaryTypeName","src":"11852:6:21","typeDescriptions":{"typeIdentifier":"t_uint88","typeString":"uint88"}},"visibility":"internal"}],"src":"11851:8:21"},"scope":7734,"src":"11796:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6611,"nodeType":"Block","src":"12360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6592,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"12374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6595,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint80_$","typeString":"type(uint80)"},"typeName":{"id":6594,"name":"uint80","nodeType":"ElementaryTypeName","src":"12387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint80_$","typeString":"type(uint80)"}],"id":6593,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"12382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint80","typeString":"type(uint80)"}},"id":6597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"12395:3:21","memberName":"max","nodeType":"MemberAccess","src":"12382:16:21","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"src":"12374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6605,"nodeType":"IfStatement","src":"12370:103:21","trueBody":{"id":6604,"nodeType":"Block","src":"12400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3830","id":6600,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_80_by_1","typeString":"int_const 80"},"value":"80"},{"id":6601,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"12456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_80_by_1","typeString":"int_const 80"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6599,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"12421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6603,"nodeType":"RevertStatement","src":"12414:48:21"}]}},{"expression":{"arguments":[{"id":6608,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6587,"src":"12496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6607,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint80_$","typeString":"type(uint80)"},"typeName":{"id":6606,"name":"uint80","nodeType":"ElementaryTypeName","src":"12489:6:21","typeDescriptions":{}}},"id":6609,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"functionReturnParameters":6591,"id":6610,"nodeType":"Return","src":"12482:20:21"}]},"documentation":{"id":6585,"nodeType":"StructuredDocumentation","src":"12015:276:21","text":" @dev Returns the downcasted uint80 from uint256, reverting on\n overflow (when the input is greater than largest uint80).\n Counterpart to Solidity's `uint80` operator.\n Requirements:\n - input must fit into 80 bits"},"id":6612,"implemented":true,"kind":"function","modifiers":[],"name":"toUint80","nameLocation":"12305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6587,"mutability":"mutable","name":"value","nameLocation":"12322:5:21","nodeType":"VariableDeclaration","scope":6612,"src":"12314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6586,"name":"uint256","nodeType":"ElementaryTypeName","src":"12314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12313:15:21"},"returnParameters":{"id":6591,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6590,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6612,"src":"12352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"},"typeName":{"id":6589,"name":"uint80","nodeType":"ElementaryTypeName","src":"12352:6:21","typeDescriptions":{"typeIdentifier":"t_uint80","typeString":"uint80"}},"visibility":"internal"}],"src":"12351:8:21"},"scope":7734,"src":"12296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6639,"nodeType":"Block","src":"12860:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6620,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6615,"src":"12874:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6623,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12887:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint72_$","typeString":"type(uint72)"},"typeName":{"id":6622,"name":"uint72","nodeType":"ElementaryTypeName","src":"12887:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint72_$","typeString":"type(uint72)"}],"id":6621,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"12882:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12882:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint72","typeString":"type(uint72)"}},"id":6625,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"12895:3:21","memberName":"max","nodeType":"MemberAccess","src":"12882:16:21","typeDescriptions":{"typeIdentifier":"t_uint72","typeString":"uint72"}},"src":"12874:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6633,"nodeType":"IfStatement","src":"12870:103:21","trueBody":{"id":6632,"nodeType":"Block","src":"12900:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3732","id":6628,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12952:2:21","typeDescriptions":{"typeIdentifier":"t_rational_72_by_1","typeString":"int_const 72"},"value":"72"},{"id":6629,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6615,"src":"12956:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_72_by_1","typeString":"int_const 72"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6627,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"12921:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12921:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6631,"nodeType":"RevertStatement","src":"12914:48:21"}]}},{"expression":{"arguments":[{"id":6636,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6615,"src":"12996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6635,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint72_$","typeString":"type(uint72)"},"typeName":{"id":6634,"name":"uint72","nodeType":"ElementaryTypeName","src":"12989:6:21","typeDescriptions":{}}},"id":6637,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint72","typeString":"uint72"}},"functionReturnParameters":6619,"id":6638,"nodeType":"Return","src":"12982:20:21"}]},"documentation":{"id":6613,"nodeType":"StructuredDocumentation","src":"12515:276:21","text":" @dev Returns the downcasted uint72 from uint256, reverting on\n overflow (when the input is greater than largest uint72).\n Counterpart to Solidity's `uint72` operator.\n Requirements:\n - input must fit into 72 bits"},"id":6640,"implemented":true,"kind":"function","modifiers":[],"name":"toUint72","nameLocation":"12805:8:21","nodeType":"FunctionDefinition","parameters":{"id":6616,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6615,"mutability":"mutable","name":"value","nameLocation":"12822:5:21","nodeType":"VariableDeclaration","scope":6640,"src":"12814:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6614,"name":"uint256","nodeType":"ElementaryTypeName","src":"12814:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12813:15:21"},"returnParameters":{"id":6619,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6618,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6640,"src":"12852:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint72","typeString":"uint72"},"typeName":{"id":6617,"name":"uint72","nodeType":"ElementaryTypeName","src":"12852:6:21","typeDescriptions":{"typeIdentifier":"t_uint72","typeString":"uint72"}},"visibility":"internal"}],"src":"12851:8:21"},"scope":7734,"src":"12796:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6667,"nodeType":"Block","src":"13360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6648,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6643,"src":"13374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6651,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":6650,"name":"uint64","nodeType":"ElementaryTypeName","src":"13387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"}],"id":6649,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"13382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6652,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint64","typeString":"type(uint64)"}},"id":6653,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"13395:3:21","memberName":"max","nodeType":"MemberAccess","src":"13382:16:21","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"13374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6661,"nodeType":"IfStatement","src":"13370:103:21","trueBody":{"id":6660,"nodeType":"Block","src":"13400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3634","id":6656,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},{"id":6657,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6643,"src":"13456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6655,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"13421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6659,"nodeType":"RevertStatement","src":"13414:48:21"}]}},{"expression":{"arguments":[{"id":6664,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6643,"src":"13496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6663,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":6662,"name":"uint64","nodeType":"ElementaryTypeName","src":"13489:6:21","typeDescriptions":{}}},"id":6665,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"functionReturnParameters":6647,"id":6666,"nodeType":"Return","src":"13482:20:21"}]},"documentation":{"id":6641,"nodeType":"StructuredDocumentation","src":"13015:276:21","text":" @dev Returns the downcasted uint64 from uint256, reverting on\n overflow (when the input is greater than largest uint64).\n Counterpart to Solidity's `uint64` operator.\n Requirements:\n - input must fit into 64 bits"},"id":6668,"implemented":true,"kind":"function","modifiers":[],"name":"toUint64","nameLocation":"13305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6644,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6643,"mutability":"mutable","name":"value","nameLocation":"13322:5:21","nodeType":"VariableDeclaration","scope":6668,"src":"13314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6642,"name":"uint256","nodeType":"ElementaryTypeName","src":"13314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13313:15:21"},"returnParameters":{"id":6647,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6646,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6668,"src":"13352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":6645,"name":"uint64","nodeType":"ElementaryTypeName","src":"13352:6:21","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"13351:8:21"},"scope":7734,"src":"13296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6695,"nodeType":"Block","src":"13860:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6676,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6671,"src":"13874:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6679,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13887:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint56_$","typeString":"type(uint56)"},"typeName":{"id":6678,"name":"uint56","nodeType":"ElementaryTypeName","src":"13887:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint56_$","typeString":"type(uint56)"}],"id":6677,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"13882:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13882:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint56","typeString":"type(uint56)"}},"id":6681,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"13895:3:21","memberName":"max","nodeType":"MemberAccess","src":"13882:16:21","typeDescriptions":{"typeIdentifier":"t_uint56","typeString":"uint56"}},"src":"13874:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6689,"nodeType":"IfStatement","src":"13870:103:21","trueBody":{"id":6688,"nodeType":"Block","src":"13900:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3536","id":6684,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13952:2:21","typeDescriptions":{"typeIdentifier":"t_rational_56_by_1","typeString":"int_const 56"},"value":"56"},{"id":6685,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6671,"src":"13956:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_56_by_1","typeString":"int_const 56"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6683,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"13921:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13921:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6687,"nodeType":"RevertStatement","src":"13914:48:21"}]}},{"expression":{"arguments":[{"id":6692,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6671,"src":"13996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6691,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint56_$","typeString":"type(uint56)"},"typeName":{"id":6690,"name":"uint56","nodeType":"ElementaryTypeName","src":"13989:6:21","typeDescriptions":{}}},"id":6693,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint56","typeString":"uint56"}},"functionReturnParameters":6675,"id":6694,"nodeType":"Return","src":"13982:20:21"}]},"documentation":{"id":6669,"nodeType":"StructuredDocumentation","src":"13515:276:21","text":" @dev Returns the downcasted uint56 from uint256, reverting on\n overflow (when the input is greater than largest uint56).\n Counterpart to Solidity's `uint56` operator.\n Requirements:\n - input must fit into 56 bits"},"id":6696,"implemented":true,"kind":"function","modifiers":[],"name":"toUint56","nameLocation":"13805:8:21","nodeType":"FunctionDefinition","parameters":{"id":6672,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6671,"mutability":"mutable","name":"value","nameLocation":"13822:5:21","nodeType":"VariableDeclaration","scope":6696,"src":"13814:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6670,"name":"uint256","nodeType":"ElementaryTypeName","src":"13814:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"13813:15:21"},"returnParameters":{"id":6675,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6674,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6696,"src":"13852:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint56","typeString":"uint56"},"typeName":{"id":6673,"name":"uint56","nodeType":"ElementaryTypeName","src":"13852:6:21","typeDescriptions":{"typeIdentifier":"t_uint56","typeString":"uint56"}},"visibility":"internal"}],"src":"13851:8:21"},"scope":7734,"src":"13796:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6723,"nodeType":"Block","src":"14360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6704,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6699,"src":"14374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6707,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":6706,"name":"uint48","nodeType":"ElementaryTypeName","src":"14387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"}],"id":6705,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"14382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6708,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint48","typeString":"type(uint48)"}},"id":6709,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"14395:3:21","memberName":"max","nodeType":"MemberAccess","src":"14382:16:21","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"src":"14374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6717,"nodeType":"IfStatement","src":"14370:103:21","trueBody":{"id":6716,"nodeType":"Block","src":"14400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3438","id":6712,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},{"id":6713,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6699,"src":"14456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6711,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"14421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6714,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6715,"nodeType":"RevertStatement","src":"14414:48:21"}]}},{"expression":{"arguments":[{"id":6720,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6699,"src":"14496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6719,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint48_$","typeString":"type(uint48)"},"typeName":{"id":6718,"name":"uint48","nodeType":"ElementaryTypeName","src":"14489:6:21","typeDescriptions":{}}},"id":6721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"functionReturnParameters":6703,"id":6722,"nodeType":"Return","src":"14482:20:21"}]},"documentation":{"id":6697,"nodeType":"StructuredDocumentation","src":"14015:276:21","text":" @dev Returns the downcasted uint48 from uint256, reverting on\n overflow (when the input is greater than largest uint48).\n Counterpart to Solidity's `uint48` operator.\n Requirements:\n - input must fit into 48 bits"},"id":6724,"implemented":true,"kind":"function","modifiers":[],"name":"toUint48","nameLocation":"14305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6699,"mutability":"mutable","name":"value","nameLocation":"14322:5:21","nodeType":"VariableDeclaration","scope":6724,"src":"14314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6698,"name":"uint256","nodeType":"ElementaryTypeName","src":"14314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"14313:15:21"},"returnParameters":{"id":6703,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6702,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6724,"src":"14352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"},"typeName":{"id":6701,"name":"uint48","nodeType":"ElementaryTypeName","src":"14352:6:21","typeDescriptions":{"typeIdentifier":"t_uint48","typeString":"uint48"}},"visibility":"internal"}],"src":"14351:8:21"},"scope":7734,"src":"14296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6751,"nodeType":"Block","src":"14860:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6732,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6727,"src":"14874:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6735,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14887:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint40_$","typeString":"type(uint40)"},"typeName":{"id":6734,"name":"uint40","nodeType":"ElementaryTypeName","src":"14887:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint40_$","typeString":"type(uint40)"}],"id":6733,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"14882:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6736,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14882:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint40","typeString":"type(uint40)"}},"id":6737,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"14895:3:21","memberName":"max","nodeType":"MemberAccess","src":"14882:16:21","typeDescriptions":{"typeIdentifier":"t_uint40","typeString":"uint40"}},"src":"14874:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6745,"nodeType":"IfStatement","src":"14870:103:21","trueBody":{"id":6744,"nodeType":"Block","src":"14900:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3430","id":6740,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14952:2:21","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"value":"40"},{"id":6741,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6727,"src":"14956:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6739,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"14921:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14921:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6743,"nodeType":"RevertStatement","src":"14914:48:21"}]}},{"expression":{"arguments":[{"id":6748,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6727,"src":"14996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6747,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint40_$","typeString":"type(uint40)"},"typeName":{"id":6746,"name":"uint40","nodeType":"ElementaryTypeName","src":"14989:6:21","typeDescriptions":{}}},"id":6749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint40","typeString":"uint40"}},"functionReturnParameters":6731,"id":6750,"nodeType":"Return","src":"14982:20:21"}]},"documentation":{"id":6725,"nodeType":"StructuredDocumentation","src":"14515:276:21","text":" @dev Returns the downcasted uint40 from uint256, reverting on\n overflow (when the input is greater than largest uint40).\n Counterpart to Solidity's `uint40` operator.\n Requirements:\n - input must fit into 40 bits"},"id":6752,"implemented":true,"kind":"function","modifiers":[],"name":"toUint40","nameLocation":"14805:8:21","nodeType":"FunctionDefinition","parameters":{"id":6728,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6727,"mutability":"mutable","name":"value","nameLocation":"14822:5:21","nodeType":"VariableDeclaration","scope":6752,"src":"14814:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6726,"name":"uint256","nodeType":"ElementaryTypeName","src":"14814:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"14813:15:21"},"returnParameters":{"id":6731,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6730,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6752,"src":"14852:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint40","typeString":"uint40"},"typeName":{"id":6729,"name":"uint40","nodeType":"ElementaryTypeName","src":"14852:6:21","typeDescriptions":{"typeIdentifier":"t_uint40","typeString":"uint40"}},"visibility":"internal"}],"src":"14851:8:21"},"scope":7734,"src":"14796:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6779,"nodeType":"Block","src":"15360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6766,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6760,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6755,"src":"15374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6763,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":6762,"name":"uint32","nodeType":"ElementaryTypeName","src":"15387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"}],"id":6761,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"15382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6764,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint32","typeString":"type(uint32)"}},"id":6765,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"15395:3:21","memberName":"max","nodeType":"MemberAccess","src":"15382:16:21","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"15374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6773,"nodeType":"IfStatement","src":"15370:103:21","trueBody":{"id":6772,"nodeType":"Block","src":"15400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3332","id":6768,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},{"id":6769,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6755,"src":"15456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6767,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"15421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6770,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6771,"nodeType":"RevertStatement","src":"15414:48:21"}]}},{"expression":{"arguments":[{"id":6776,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6755,"src":"15496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6775,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":6774,"name":"uint32","nodeType":"ElementaryTypeName","src":"15489:6:21","typeDescriptions":{}}},"id":6777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"functionReturnParameters":6759,"id":6778,"nodeType":"Return","src":"15482:20:21"}]},"documentation":{"id":6753,"nodeType":"StructuredDocumentation","src":"15015:276:21","text":" @dev Returns the downcasted uint32 from uint256, reverting on\n overflow (when the input is greater than largest uint32).\n Counterpart to Solidity's `uint32` operator.\n Requirements:\n - input must fit into 32 bits"},"id":6780,"implemented":true,"kind":"function","modifiers":[],"name":"toUint32","nameLocation":"15305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6756,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6755,"mutability":"mutable","name":"value","nameLocation":"15322:5:21","nodeType":"VariableDeclaration","scope":6780,"src":"15314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6754,"name":"uint256","nodeType":"ElementaryTypeName","src":"15314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15313:15:21"},"returnParameters":{"id":6759,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6758,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6780,"src":"15352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":6757,"name":"uint32","nodeType":"ElementaryTypeName","src":"15352:6:21","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"15351:8:21"},"scope":7734,"src":"15296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6807,"nodeType":"Block","src":"15860:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6788,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6783,"src":"15874:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6791,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15887:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint24_$","typeString":"type(uint24)"},"typeName":{"id":6790,"name":"uint24","nodeType":"ElementaryTypeName","src":"15887:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint24_$","typeString":"type(uint24)"}],"id":6789,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"15882:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6792,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15882:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint24","typeString":"type(uint24)"}},"id":6793,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"15895:3:21","memberName":"max","nodeType":"MemberAccess","src":"15882:16:21","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"src":"15874:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6801,"nodeType":"IfStatement","src":"15870:103:21","trueBody":{"id":6800,"nodeType":"Block","src":"15900:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3234","id":6796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15952:2:21","typeDescriptions":{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},"value":"24"},{"id":6797,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6783,"src":"15956:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6795,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"15921:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15921:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6799,"nodeType":"RevertStatement","src":"15914:48:21"}]}},{"expression":{"arguments":[{"id":6804,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6783,"src":"15996:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6803,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint24_$","typeString":"type(uint24)"},"typeName":{"id":6802,"name":"uint24","nodeType":"ElementaryTypeName","src":"15989:6:21","typeDescriptions":{}}},"id":6805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"functionReturnParameters":6787,"id":6806,"nodeType":"Return","src":"15982:20:21"}]},"documentation":{"id":6781,"nodeType":"StructuredDocumentation","src":"15515:276:21","text":" @dev Returns the downcasted uint24 from uint256, reverting on\n overflow (when the input is greater than largest uint24).\n Counterpart to Solidity's `uint24` operator.\n Requirements:\n - input must fit into 24 bits"},"id":6808,"implemented":true,"kind":"function","modifiers":[],"name":"toUint24","nameLocation":"15805:8:21","nodeType":"FunctionDefinition","parameters":{"id":6784,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6783,"mutability":"mutable","name":"value","nameLocation":"15822:5:21","nodeType":"VariableDeclaration","scope":6808,"src":"15814:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6782,"name":"uint256","nodeType":"ElementaryTypeName","src":"15814:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15813:15:21"},"returnParameters":{"id":6787,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6786,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6808,"src":"15852:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"},"typeName":{"id":6785,"name":"uint24","nodeType":"ElementaryTypeName","src":"15852:6:21","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"visibility":"internal"}],"src":"15851:8:21"},"scope":7734,"src":"15796:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6835,"nodeType":"Block","src":"16360:149:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6816,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6811,"src":"16374:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6819,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16387:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"},"typeName":{"id":6818,"name":"uint16","nodeType":"ElementaryTypeName","src":"16387:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"}],"id":6817,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"16382:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16382:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint16","typeString":"type(uint16)"}},"id":6821,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"16395:3:21","memberName":"max","nodeType":"MemberAccess","src":"16382:16:21","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"16374:24:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6829,"nodeType":"IfStatement","src":"16370:103:21","trueBody":{"id":6828,"nodeType":"Block","src":"16400:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3136","id":6824,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16452:2:21","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},{"id":6825,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6811,"src":"16456:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6823,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"16421:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16421:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6827,"nodeType":"RevertStatement","src":"16414:48:21"}]}},{"expression":{"arguments":[{"id":6832,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6811,"src":"16496:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6831,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16489:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"},"typeName":{"id":6830,"name":"uint16","nodeType":"ElementaryTypeName","src":"16489:6:21","typeDescriptions":{}}},"id":6833,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16489:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"functionReturnParameters":6815,"id":6834,"nodeType":"Return","src":"16482:20:21"}]},"documentation":{"id":6809,"nodeType":"StructuredDocumentation","src":"16015:276:21","text":" @dev Returns the downcasted uint16 from uint256, reverting on\n overflow (when the input is greater than largest uint16).\n Counterpart to Solidity's `uint16` operator.\n Requirements:\n - input must fit into 16 bits"},"id":6836,"implemented":true,"kind":"function","modifiers":[],"name":"toUint16","nameLocation":"16305:8:21","nodeType":"FunctionDefinition","parameters":{"id":6812,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6811,"mutability":"mutable","name":"value","nameLocation":"16322:5:21","nodeType":"VariableDeclaration","scope":6836,"src":"16314:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6810,"name":"uint256","nodeType":"ElementaryTypeName","src":"16314:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16313:15:21"},"returnParameters":{"id":6815,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6814,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6836,"src":"16352:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":6813,"name":"uint16","nodeType":"ElementaryTypeName","src":"16352:6:21","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"}],"src":"16351:8:21"},"scope":7734,"src":"16296:213:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6863,"nodeType":"Block","src":"16854:146:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":6850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6844,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6839,"src":"16868:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"expression":{"arguments":[{"id":6847,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16881:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":6846,"name":"uint8","nodeType":"ElementaryTypeName","src":"16881:5:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"}],"id":6845,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"16876:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":6848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16876:11:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint8","typeString":"type(uint8)"}},"id":6849,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"16888:3:21","memberName":"max","nodeType":"MemberAccess","src":"16876:15:21","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"16868:23:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6857,"nodeType":"IfStatement","src":"16864:101:21","trueBody":{"id":6856,"nodeType":"Block","src":"16893:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"38","id":6852,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16945:1:21","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},{"id":6853,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6839,"src":"16948:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6851,"name":"SafeCastOverflowedUintDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5979,"src":"16914:30:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$","typeString":"function (uint8,uint256) pure returns (error)"}},"id":6854,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16914:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6855,"nodeType":"RevertStatement","src":"16907:47:21"}]}},{"expression":{"arguments":[{"id":6860,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6839,"src":"16987:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":6859,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16981:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":6858,"name":"uint8","nodeType":"ElementaryTypeName","src":"16981:5:21","typeDescriptions":{}}},"id":6861,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16981:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":6843,"id":6862,"nodeType":"Return","src":"16974:19:21"}]},"documentation":{"id":6837,"nodeType":"StructuredDocumentation","src":"16515:272:21","text":" @dev Returns the downcasted uint8 from uint256, reverting on\n overflow (when the input is greater than largest uint8).\n Counterpart to Solidity's `uint8` operator.\n Requirements:\n - input must fit into 8 bits"},"id":6864,"implemented":true,"kind":"function","modifiers":[],"name":"toUint8","nameLocation":"16801:7:21","nodeType":"FunctionDefinition","parameters":{"id":6840,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6839,"mutability":"mutable","name":"value","nameLocation":"16817:5:21","nodeType":"VariableDeclaration","scope":6864,"src":"16809:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6838,"name":"uint256","nodeType":"ElementaryTypeName","src":"16809:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16808:15:21"},"returnParameters":{"id":6843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6842,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6864,"src":"16847:5:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":6841,"name":"uint8","nodeType":"ElementaryTypeName","src":"16847:5:21","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"16846:7:21"},"scope":7734,"src":"16792:208:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6886,"nodeType":"Block","src":"17236:128:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":6874,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6872,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6867,"src":"17250:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"30","id":6873,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17258:1:21","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"17250:9:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6880,"nodeType":"IfStatement","src":"17246:81:21","trueBody":{"id":6879,"nodeType":"Block","src":"17261:66:21","statements":[{"errorCall":{"arguments":[{"id":6876,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6867,"src":"17310:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6875,"name":"SafeCastOverflowedIntToUint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5984,"src":"17282:27:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_int256_$returns$_t_error_$","typeString":"function (int256) pure returns (error)"}},"id":6877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17282:34:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6878,"nodeType":"RevertStatement","src":"17275:41:21"}]}},{"expression":{"arguments":[{"id":6883,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6867,"src":"17351:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6882,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17343:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":6881,"name":"uint256","nodeType":"ElementaryTypeName","src":"17343:7:21","typeDescriptions":{}}},"id":6884,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17343:14:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":6871,"id":6885,"nodeType":"Return","src":"17336:21:21"}]},"documentation":{"id":6865,"nodeType":"StructuredDocumentation","src":"17006:160:21","text":" @dev Converts a signed int256 into an unsigned uint256.\n Requirements:\n - input must be greater than or equal to 0."},"id":6887,"implemented":true,"kind":"function","modifiers":[],"name":"toUint256","nameLocation":"17180:9:21","nodeType":"FunctionDefinition","parameters":{"id":6868,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6867,"mutability":"mutable","name":"value","nameLocation":"17197:5:21","nodeType":"VariableDeclaration","scope":6887,"src":"17190:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6866,"name":"int256","nodeType":"ElementaryTypeName","src":"17190:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"17189:14:21"},"returnParameters":{"id":6871,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6870,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":6887,"src":"17227:7:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6869,"name":"uint256","nodeType":"ElementaryTypeName","src":"17227:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17226:9:21"},"scope":7734,"src":"17171:193:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6912,"nodeType":"Block","src":"17761:150:21","statements":[{"expression":{"id":6900,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6895,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6893,"src":"17771:10:21","typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":6898,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6890,"src":"17791:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6897,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17784:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int248_$","typeString":"type(int248)"},"typeName":{"id":6896,"name":"int248","nodeType":"ElementaryTypeName","src":"17784:6:21","typeDescriptions":{}}},"id":6899,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17784:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"}},"src":"17771:26:21","typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"}},"id":6901,"nodeType":"ExpressionStatement","src":"17771:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":6904,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6902,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6893,"src":"17811:10:21","typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":6903,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6890,"src":"17825:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"17811:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6911,"nodeType":"IfStatement","src":"17807:98:21","trueBody":{"id":6910,"nodeType":"Block","src":"17832:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323438","id":6906,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17883:3:21","typeDescriptions":{"typeIdentifier":"t_rational_248_by_1","typeString":"int_const 248"},"value":"248"},{"id":6907,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6890,"src":"17888:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_248_by_1","typeString":"int_const 248"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6905,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"17853:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":6908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17853:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6909,"nodeType":"RevertStatement","src":"17846:48:21"}]}}]},"documentation":{"id":6888,"nodeType":"StructuredDocumentation","src":"17370:312:21","text":" @dev Returns the downcasted int248 from int256, reverting on\n overflow (when the input is less than smallest int248 or\n greater than largest int248).\n Counterpart to Solidity's `int248` operator.\n Requirements:\n - input must fit into 248 bits"},"id":6913,"implemented":true,"kind":"function","modifiers":[],"name":"toInt248","nameLocation":"17696:8:21","nodeType":"FunctionDefinition","parameters":{"id":6891,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6890,"mutability":"mutable","name":"value","nameLocation":"17712:5:21","nodeType":"VariableDeclaration","scope":6913,"src":"17705:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6889,"name":"int256","nodeType":"ElementaryTypeName","src":"17705:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"17704:14:21"},"returnParameters":{"id":6894,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6893,"mutability":"mutable","name":"downcasted","nameLocation":"17749:10:21","nodeType":"VariableDeclaration","scope":6913,"src":"17742:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"},"typeName":{"id":6892,"name":"int248","nodeType":"ElementaryTypeName","src":"17742:6:21","typeDescriptions":{"typeIdentifier":"t_int248","typeString":"int248"}},"visibility":"internal"}],"src":"17741:19:21"},"scope":7734,"src":"17687:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6938,"nodeType":"Block","src":"18308:150:21","statements":[{"expression":{"id":6926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6921,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6919,"src":"18318:10:21","typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":6924,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6916,"src":"18338:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6923,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18331:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int240_$","typeString":"type(int240)"},"typeName":{"id":6922,"name":"int240","nodeType":"ElementaryTypeName","src":"18331:6:21","typeDescriptions":{}}},"id":6925,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18331:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"}},"src":"18318:26:21","typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"}},"id":6927,"nodeType":"ExpressionStatement","src":"18318:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":6930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6928,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6919,"src":"18358:10:21","typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":6929,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6916,"src":"18372:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"18358:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6937,"nodeType":"IfStatement","src":"18354:98:21","trueBody":{"id":6936,"nodeType":"Block","src":"18379:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323430","id":6932,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18430:3:21","typeDescriptions":{"typeIdentifier":"t_rational_240_by_1","typeString":"int_const 240"},"value":"240"},{"id":6933,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6916,"src":"18435:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_240_by_1","typeString":"int_const 240"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6931,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"18400:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":6934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18400:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6935,"nodeType":"RevertStatement","src":"18393:48:21"}]}}]},"documentation":{"id":6914,"nodeType":"StructuredDocumentation","src":"17917:312:21","text":" @dev Returns the downcasted int240 from int256, reverting on\n overflow (when the input is less than smallest int240 or\n greater than largest int240).\n Counterpart to Solidity's `int240` operator.\n Requirements:\n - input must fit into 240 bits"},"id":6939,"implemented":true,"kind":"function","modifiers":[],"name":"toInt240","nameLocation":"18243:8:21","nodeType":"FunctionDefinition","parameters":{"id":6917,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6916,"mutability":"mutable","name":"value","nameLocation":"18259:5:21","nodeType":"VariableDeclaration","scope":6939,"src":"18252:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6915,"name":"int256","nodeType":"ElementaryTypeName","src":"18252:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"18251:14:21"},"returnParameters":{"id":6920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6919,"mutability":"mutable","name":"downcasted","nameLocation":"18296:10:21","nodeType":"VariableDeclaration","scope":6939,"src":"18289:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"},"typeName":{"id":6918,"name":"int240","nodeType":"ElementaryTypeName","src":"18289:6:21","typeDescriptions":{"typeIdentifier":"t_int240","typeString":"int240"}},"visibility":"internal"}],"src":"18288:19:21"},"scope":7734,"src":"18234:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6964,"nodeType":"Block","src":"18855:150:21","statements":[{"expression":{"id":6952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6947,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6945,"src":"18865:10:21","typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":6950,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6942,"src":"18885:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6949,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18878:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int232_$","typeString":"type(int232)"},"typeName":{"id":6948,"name":"int232","nodeType":"ElementaryTypeName","src":"18878:6:21","typeDescriptions":{}}},"id":6951,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18878:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"}},"src":"18865:26:21","typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"}},"id":6953,"nodeType":"ExpressionStatement","src":"18865:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":6956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6954,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6945,"src":"18905:10:21","typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":6955,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6942,"src":"18919:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"18905:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6963,"nodeType":"IfStatement","src":"18901:98:21","trueBody":{"id":6962,"nodeType":"Block","src":"18926:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323332","id":6958,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18977:3:21","typeDescriptions":{"typeIdentifier":"t_rational_232_by_1","typeString":"int_const 232"},"value":"232"},{"id":6959,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6942,"src":"18982:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_232_by_1","typeString":"int_const 232"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6957,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"18947:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":6960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18947:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6961,"nodeType":"RevertStatement","src":"18940:48:21"}]}}]},"documentation":{"id":6940,"nodeType":"StructuredDocumentation","src":"18464:312:21","text":" @dev Returns the downcasted int232 from int256, reverting on\n overflow (when the input is less than smallest int232 or\n greater than largest int232).\n Counterpart to Solidity's `int232` operator.\n Requirements:\n - input must fit into 232 bits"},"id":6965,"implemented":true,"kind":"function","modifiers":[],"name":"toInt232","nameLocation":"18790:8:21","nodeType":"FunctionDefinition","parameters":{"id":6943,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6942,"mutability":"mutable","name":"value","nameLocation":"18806:5:21","nodeType":"VariableDeclaration","scope":6965,"src":"18799:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6941,"name":"int256","nodeType":"ElementaryTypeName","src":"18799:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"18798:14:21"},"returnParameters":{"id":6946,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6945,"mutability":"mutable","name":"downcasted","nameLocation":"18843:10:21","nodeType":"VariableDeclaration","scope":6965,"src":"18836:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"},"typeName":{"id":6944,"name":"int232","nodeType":"ElementaryTypeName","src":"18836:6:21","typeDescriptions":{"typeIdentifier":"t_int232","typeString":"int232"}},"visibility":"internal"}],"src":"18835:19:21"},"scope":7734,"src":"18781:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":6990,"nodeType":"Block","src":"19402:150:21","statements":[{"expression":{"id":6978,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6973,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6971,"src":"19412:10:21","typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":6976,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6968,"src":"19432:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6975,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19425:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int224_$","typeString":"type(int224)"},"typeName":{"id":6974,"name":"int224","nodeType":"ElementaryTypeName","src":"19425:6:21","typeDescriptions":{}}},"id":6977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19425:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"}},"src":"19412:26:21","typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"}},"id":6979,"nodeType":"ExpressionStatement","src":"19412:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":6982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":6980,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6971,"src":"19452:10:21","typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":6981,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6968,"src":"19466:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"19452:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":6989,"nodeType":"IfStatement","src":"19448:98:21","trueBody":{"id":6988,"nodeType":"Block","src":"19473:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323234","id":6984,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19524:3:21","typeDescriptions":{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},"value":"224"},{"id":6985,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6968,"src":"19529:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":6983,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"19494:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":6986,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19494:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":6987,"nodeType":"RevertStatement","src":"19487:48:21"}]}}]},"documentation":{"id":6966,"nodeType":"StructuredDocumentation","src":"19011:312:21","text":" @dev Returns the downcasted int224 from int256, reverting on\n overflow (when the input is less than smallest int224 or\n greater than largest int224).\n Counterpart to Solidity's `int224` operator.\n Requirements:\n - input must fit into 224 bits"},"id":6991,"implemented":true,"kind":"function","modifiers":[],"name":"toInt224","nameLocation":"19337:8:21","nodeType":"FunctionDefinition","parameters":{"id":6969,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6968,"mutability":"mutable","name":"value","nameLocation":"19353:5:21","nodeType":"VariableDeclaration","scope":6991,"src":"19346:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6967,"name":"int256","nodeType":"ElementaryTypeName","src":"19346:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"19345:14:21"},"returnParameters":{"id":6972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6971,"mutability":"mutable","name":"downcasted","nameLocation":"19390:10:21","nodeType":"VariableDeclaration","scope":6991,"src":"19383:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"},"typeName":{"id":6970,"name":"int224","nodeType":"ElementaryTypeName","src":"19383:6:21","typeDescriptions":{"typeIdentifier":"t_int224","typeString":"int224"}},"visibility":"internal"}],"src":"19382:19:21"},"scope":7734,"src":"19328:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7016,"nodeType":"Block","src":"19949:150:21","statements":[{"expression":{"id":7004,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":6999,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6997,"src":"19959:10:21","typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7002,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6994,"src":"19979:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7001,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19972:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int216_$","typeString":"type(int216)"},"typeName":{"id":7000,"name":"int216","nodeType":"ElementaryTypeName","src":"19972:6:21","typeDescriptions":{}}},"id":7003,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19972:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"}},"src":"19959:26:21","typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"}},"id":7005,"nodeType":"ExpressionStatement","src":"19959:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7006,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6997,"src":"19999:10:21","typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7007,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6994,"src":"20013:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"19999:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7015,"nodeType":"IfStatement","src":"19995:98:21","trueBody":{"id":7014,"nodeType":"Block","src":"20020:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323136","id":7010,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20071:3:21","typeDescriptions":{"typeIdentifier":"t_rational_216_by_1","typeString":"int_const 216"},"value":"216"},{"id":7011,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6994,"src":"20076:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_216_by_1","typeString":"int_const 216"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7009,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"20041:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7012,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20041:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7013,"nodeType":"RevertStatement","src":"20034:48:21"}]}}]},"documentation":{"id":6992,"nodeType":"StructuredDocumentation","src":"19558:312:21","text":" @dev Returns the downcasted int216 from int256, reverting on\n overflow (when the input is less than smallest int216 or\n greater than largest int216).\n Counterpart to Solidity's `int216` operator.\n Requirements:\n - input must fit into 216 bits"},"id":7017,"implemented":true,"kind":"function","modifiers":[],"name":"toInt216","nameLocation":"19884:8:21","nodeType":"FunctionDefinition","parameters":{"id":6995,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6994,"mutability":"mutable","name":"value","nameLocation":"19900:5:21","nodeType":"VariableDeclaration","scope":7017,"src":"19893:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":6993,"name":"int256","nodeType":"ElementaryTypeName","src":"19893:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"19892:14:21"},"returnParameters":{"id":6998,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6997,"mutability":"mutable","name":"downcasted","nameLocation":"19937:10:21","nodeType":"VariableDeclaration","scope":7017,"src":"19930:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"},"typeName":{"id":6996,"name":"int216","nodeType":"ElementaryTypeName","src":"19930:6:21","typeDescriptions":{"typeIdentifier":"t_int216","typeString":"int216"}},"visibility":"internal"}],"src":"19929:19:21"},"scope":7734,"src":"19875:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7042,"nodeType":"Block","src":"20496:150:21","statements":[{"expression":{"id":7030,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7025,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7023,"src":"20506:10:21","typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7028,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7020,"src":"20526:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7027,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"20519:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int208_$","typeString":"type(int208)"},"typeName":{"id":7026,"name":"int208","nodeType":"ElementaryTypeName","src":"20519:6:21","typeDescriptions":{}}},"id":7029,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20519:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"}},"src":"20506:26:21","typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"}},"id":7031,"nodeType":"ExpressionStatement","src":"20506:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7034,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7032,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7023,"src":"20546:10:21","typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7033,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7020,"src":"20560:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"20546:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7041,"nodeType":"IfStatement","src":"20542:98:21","trueBody":{"id":7040,"nodeType":"Block","src":"20567:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323038","id":7036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20618:3:21","typeDescriptions":{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},"value":"208"},{"id":7037,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7020,"src":"20623:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_208_by_1","typeString":"int_const 208"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7035,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"20588:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7038,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20588:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7039,"nodeType":"RevertStatement","src":"20581:48:21"}]}}]},"documentation":{"id":7018,"nodeType":"StructuredDocumentation","src":"20105:312:21","text":" @dev Returns the downcasted int208 from int256, reverting on\n overflow (when the input is less than smallest int208 or\n greater than largest int208).\n Counterpart to Solidity's `int208` operator.\n Requirements:\n - input must fit into 208 bits"},"id":7043,"implemented":true,"kind":"function","modifiers":[],"name":"toInt208","nameLocation":"20431:8:21","nodeType":"FunctionDefinition","parameters":{"id":7021,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7020,"mutability":"mutable","name":"value","nameLocation":"20447:5:21","nodeType":"VariableDeclaration","scope":7043,"src":"20440:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7019,"name":"int256","nodeType":"ElementaryTypeName","src":"20440:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"20439:14:21"},"returnParameters":{"id":7024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7023,"mutability":"mutable","name":"downcasted","nameLocation":"20484:10:21","nodeType":"VariableDeclaration","scope":7043,"src":"20477:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"},"typeName":{"id":7022,"name":"int208","nodeType":"ElementaryTypeName","src":"20477:6:21","typeDescriptions":{"typeIdentifier":"t_int208","typeString":"int208"}},"visibility":"internal"}],"src":"20476:19:21"},"scope":7734,"src":"20422:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7068,"nodeType":"Block","src":"21043:150:21","statements":[{"expression":{"id":7056,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7051,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7049,"src":"21053:10:21","typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7054,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7046,"src":"21073:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7053,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21066:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int200_$","typeString":"type(int200)"},"typeName":{"id":7052,"name":"int200","nodeType":"ElementaryTypeName","src":"21066:6:21","typeDescriptions":{}}},"id":7055,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21066:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"}},"src":"21053:26:21","typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"}},"id":7057,"nodeType":"ExpressionStatement","src":"21053:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7058,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7049,"src":"21093:10:21","typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7059,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7046,"src":"21107:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"21093:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7067,"nodeType":"IfStatement","src":"21089:98:21","trueBody":{"id":7066,"nodeType":"Block","src":"21114:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"323030","id":7062,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21165:3:21","typeDescriptions":{"typeIdentifier":"t_rational_200_by_1","typeString":"int_const 200"},"value":"200"},{"id":7063,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7046,"src":"21170:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_200_by_1","typeString":"int_const 200"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7061,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"21135:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7064,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21135:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7065,"nodeType":"RevertStatement","src":"21128:48:21"}]}}]},"documentation":{"id":7044,"nodeType":"StructuredDocumentation","src":"20652:312:21","text":" @dev Returns the downcasted int200 from int256, reverting on\n overflow (when the input is less than smallest int200 or\n greater than largest int200).\n Counterpart to Solidity's `int200` operator.\n Requirements:\n - input must fit into 200 bits"},"id":7069,"implemented":true,"kind":"function","modifiers":[],"name":"toInt200","nameLocation":"20978:8:21","nodeType":"FunctionDefinition","parameters":{"id":7047,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7046,"mutability":"mutable","name":"value","nameLocation":"20994:5:21","nodeType":"VariableDeclaration","scope":7069,"src":"20987:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7045,"name":"int256","nodeType":"ElementaryTypeName","src":"20987:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"20986:14:21"},"returnParameters":{"id":7050,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7049,"mutability":"mutable","name":"downcasted","nameLocation":"21031:10:21","nodeType":"VariableDeclaration","scope":7069,"src":"21024:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"},"typeName":{"id":7048,"name":"int200","nodeType":"ElementaryTypeName","src":"21024:6:21","typeDescriptions":{"typeIdentifier":"t_int200","typeString":"int200"}},"visibility":"internal"}],"src":"21023:19:21"},"scope":7734,"src":"20969:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7094,"nodeType":"Block","src":"21590:150:21","statements":[{"expression":{"id":7082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7077,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7075,"src":"21600:10:21","typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7080,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"21620:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7079,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21613:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int192_$","typeString":"type(int192)"},"typeName":{"id":7078,"name":"int192","nodeType":"ElementaryTypeName","src":"21613:6:21","typeDescriptions":{}}},"id":7081,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21613:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"}},"src":"21600:26:21","typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"}},"id":7083,"nodeType":"ExpressionStatement","src":"21600:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7084,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7075,"src":"21640:10:21","typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7085,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"21654:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"21640:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7093,"nodeType":"IfStatement","src":"21636:98:21","trueBody":{"id":7092,"nodeType":"Block","src":"21661:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313932","id":7088,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21712:3:21","typeDescriptions":{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},"value":"192"},{"id":7089,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7072,"src":"21717:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_192_by_1","typeString":"int_const 192"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7087,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"21682:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21682:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7091,"nodeType":"RevertStatement","src":"21675:48:21"}]}}]},"documentation":{"id":7070,"nodeType":"StructuredDocumentation","src":"21199:312:21","text":" @dev Returns the downcasted int192 from int256, reverting on\n overflow (when the input is less than smallest int192 or\n greater than largest int192).\n Counterpart to Solidity's `int192` operator.\n Requirements:\n - input must fit into 192 bits"},"id":7095,"implemented":true,"kind":"function","modifiers":[],"name":"toInt192","nameLocation":"21525:8:21","nodeType":"FunctionDefinition","parameters":{"id":7073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7072,"mutability":"mutable","name":"value","nameLocation":"21541:5:21","nodeType":"VariableDeclaration","scope":7095,"src":"21534:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7071,"name":"int256","nodeType":"ElementaryTypeName","src":"21534:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"21533:14:21"},"returnParameters":{"id":7076,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7075,"mutability":"mutable","name":"downcasted","nameLocation":"21578:10:21","nodeType":"VariableDeclaration","scope":7095,"src":"21571:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"},"typeName":{"id":7074,"name":"int192","nodeType":"ElementaryTypeName","src":"21571:6:21","typeDescriptions":{"typeIdentifier":"t_int192","typeString":"int192"}},"visibility":"internal"}],"src":"21570:19:21"},"scope":7734,"src":"21516:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7120,"nodeType":"Block","src":"22137:150:21","statements":[{"expression":{"id":7108,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7103,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7101,"src":"22147:10:21","typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7106,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7098,"src":"22167:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7105,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22160:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int184_$","typeString":"type(int184)"},"typeName":{"id":7104,"name":"int184","nodeType":"ElementaryTypeName","src":"22160:6:21","typeDescriptions":{}}},"id":7107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22160:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"}},"src":"22147:26:21","typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"}},"id":7109,"nodeType":"ExpressionStatement","src":"22147:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7110,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7101,"src":"22187:10:21","typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7111,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7098,"src":"22201:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"22187:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7119,"nodeType":"IfStatement","src":"22183:98:21","trueBody":{"id":7118,"nodeType":"Block","src":"22208:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313834","id":7114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22259:3:21","typeDescriptions":{"typeIdentifier":"t_rational_184_by_1","typeString":"int_const 184"},"value":"184"},{"id":7115,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7098,"src":"22264:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_184_by_1","typeString":"int_const 184"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7113,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"22229:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22229:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7117,"nodeType":"RevertStatement","src":"22222:48:21"}]}}]},"documentation":{"id":7096,"nodeType":"StructuredDocumentation","src":"21746:312:21","text":" @dev Returns the downcasted int184 from int256, reverting on\n overflow (when the input is less than smallest int184 or\n greater than largest int184).\n Counterpart to Solidity's `int184` operator.\n Requirements:\n - input must fit into 184 bits"},"id":7121,"implemented":true,"kind":"function","modifiers":[],"name":"toInt184","nameLocation":"22072:8:21","nodeType":"FunctionDefinition","parameters":{"id":7099,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7098,"mutability":"mutable","name":"value","nameLocation":"22088:5:21","nodeType":"VariableDeclaration","scope":7121,"src":"22081:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7097,"name":"int256","nodeType":"ElementaryTypeName","src":"22081:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"22080:14:21"},"returnParameters":{"id":7102,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7101,"mutability":"mutable","name":"downcasted","nameLocation":"22125:10:21","nodeType":"VariableDeclaration","scope":7121,"src":"22118:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"},"typeName":{"id":7100,"name":"int184","nodeType":"ElementaryTypeName","src":"22118:6:21","typeDescriptions":{"typeIdentifier":"t_int184","typeString":"int184"}},"visibility":"internal"}],"src":"22117:19:21"},"scope":7734,"src":"22063:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7146,"nodeType":"Block","src":"22684:150:21","statements":[{"expression":{"id":7134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7129,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7127,"src":"22694:10:21","typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7132,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7124,"src":"22714:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7131,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22707:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int176_$","typeString":"type(int176)"},"typeName":{"id":7130,"name":"int176","nodeType":"ElementaryTypeName","src":"22707:6:21","typeDescriptions":{}}},"id":7133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22707:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"}},"src":"22694:26:21","typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"}},"id":7135,"nodeType":"ExpressionStatement","src":"22694:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7136,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7127,"src":"22734:10:21","typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7137,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7124,"src":"22748:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"22734:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7145,"nodeType":"IfStatement","src":"22730:98:21","trueBody":{"id":7144,"nodeType":"Block","src":"22755:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313736","id":7140,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22806:3:21","typeDescriptions":{"typeIdentifier":"t_rational_176_by_1","typeString":"int_const 176"},"value":"176"},{"id":7141,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7124,"src":"22811:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_176_by_1","typeString":"int_const 176"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7139,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"22776:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22776:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7143,"nodeType":"RevertStatement","src":"22769:48:21"}]}}]},"documentation":{"id":7122,"nodeType":"StructuredDocumentation","src":"22293:312:21","text":" @dev Returns the downcasted int176 from int256, reverting on\n overflow (when the input is less than smallest int176 or\n greater than largest int176).\n Counterpart to Solidity's `int176` operator.\n Requirements:\n - input must fit into 176 bits"},"id":7147,"implemented":true,"kind":"function","modifiers":[],"name":"toInt176","nameLocation":"22619:8:21","nodeType":"FunctionDefinition","parameters":{"id":7125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7124,"mutability":"mutable","name":"value","nameLocation":"22635:5:21","nodeType":"VariableDeclaration","scope":7147,"src":"22628:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7123,"name":"int256","nodeType":"ElementaryTypeName","src":"22628:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"22627:14:21"},"returnParameters":{"id":7128,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7127,"mutability":"mutable","name":"downcasted","nameLocation":"22672:10:21","nodeType":"VariableDeclaration","scope":7147,"src":"22665:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"},"typeName":{"id":7126,"name":"int176","nodeType":"ElementaryTypeName","src":"22665:6:21","typeDescriptions":{"typeIdentifier":"t_int176","typeString":"int176"}},"visibility":"internal"}],"src":"22664:19:21"},"scope":7734,"src":"22610:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7172,"nodeType":"Block","src":"23231:150:21","statements":[{"expression":{"id":7160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7155,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7153,"src":"23241:10:21","typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7158,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7150,"src":"23261:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7157,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23254:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int168_$","typeString":"type(int168)"},"typeName":{"id":7156,"name":"int168","nodeType":"ElementaryTypeName","src":"23254:6:21","typeDescriptions":{}}},"id":7159,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23254:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"}},"src":"23241:26:21","typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"}},"id":7161,"nodeType":"ExpressionStatement","src":"23241:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7162,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7153,"src":"23281:10:21","typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7163,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7150,"src":"23295:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"23281:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7171,"nodeType":"IfStatement","src":"23277:98:21","trueBody":{"id":7170,"nodeType":"Block","src":"23302:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313638","id":7166,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23353:3:21","typeDescriptions":{"typeIdentifier":"t_rational_168_by_1","typeString":"int_const 168"},"value":"168"},{"id":7167,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7150,"src":"23358:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_168_by_1","typeString":"int_const 168"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7165,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"23323:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23323:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7169,"nodeType":"RevertStatement","src":"23316:48:21"}]}}]},"documentation":{"id":7148,"nodeType":"StructuredDocumentation","src":"22840:312:21","text":" @dev Returns the downcasted int168 from int256, reverting on\n overflow (when the input is less than smallest int168 or\n greater than largest int168).\n Counterpart to Solidity's `int168` operator.\n Requirements:\n - input must fit into 168 bits"},"id":7173,"implemented":true,"kind":"function","modifiers":[],"name":"toInt168","nameLocation":"23166:8:21","nodeType":"FunctionDefinition","parameters":{"id":7151,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7150,"mutability":"mutable","name":"value","nameLocation":"23182:5:21","nodeType":"VariableDeclaration","scope":7173,"src":"23175:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7149,"name":"int256","nodeType":"ElementaryTypeName","src":"23175:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"23174:14:21"},"returnParameters":{"id":7154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7153,"mutability":"mutable","name":"downcasted","nameLocation":"23219:10:21","nodeType":"VariableDeclaration","scope":7173,"src":"23212:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"},"typeName":{"id":7152,"name":"int168","nodeType":"ElementaryTypeName","src":"23212:6:21","typeDescriptions":{"typeIdentifier":"t_int168","typeString":"int168"}},"visibility":"internal"}],"src":"23211:19:21"},"scope":7734,"src":"23157:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7198,"nodeType":"Block","src":"23778:150:21","statements":[{"expression":{"id":7186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7181,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7179,"src":"23788:10:21","typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7184,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7176,"src":"23808:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7183,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23801:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int160_$","typeString":"type(int160)"},"typeName":{"id":7182,"name":"int160","nodeType":"ElementaryTypeName","src":"23801:6:21","typeDescriptions":{}}},"id":7185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23801:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"}},"src":"23788:26:21","typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"}},"id":7187,"nodeType":"ExpressionStatement","src":"23788:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7188,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7179,"src":"23828:10:21","typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7189,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7176,"src":"23842:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"23828:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7197,"nodeType":"IfStatement","src":"23824:98:21","trueBody":{"id":7196,"nodeType":"Block","src":"23849:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313630","id":7192,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23900:3:21","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},{"id":7193,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7176,"src":"23905:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7191,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"23870:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7194,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23870:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7195,"nodeType":"RevertStatement","src":"23863:48:21"}]}}]},"documentation":{"id":7174,"nodeType":"StructuredDocumentation","src":"23387:312:21","text":" @dev Returns the downcasted int160 from int256, reverting on\n overflow (when the input is less than smallest int160 or\n greater than largest int160).\n Counterpart to Solidity's `int160` operator.\n Requirements:\n - input must fit into 160 bits"},"id":7199,"implemented":true,"kind":"function","modifiers":[],"name":"toInt160","nameLocation":"23713:8:21","nodeType":"FunctionDefinition","parameters":{"id":7177,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7176,"mutability":"mutable","name":"value","nameLocation":"23729:5:21","nodeType":"VariableDeclaration","scope":7199,"src":"23722:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7175,"name":"int256","nodeType":"ElementaryTypeName","src":"23722:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"23721:14:21"},"returnParameters":{"id":7180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7179,"mutability":"mutable","name":"downcasted","nameLocation":"23766:10:21","nodeType":"VariableDeclaration","scope":7199,"src":"23759:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"},"typeName":{"id":7178,"name":"int160","nodeType":"ElementaryTypeName","src":"23759:6:21","typeDescriptions":{"typeIdentifier":"t_int160","typeString":"int160"}},"visibility":"internal"}],"src":"23758:19:21"},"scope":7734,"src":"23704:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7224,"nodeType":"Block","src":"24325:150:21","statements":[{"expression":{"id":7212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7207,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7205,"src":"24335:10:21","typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7210,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7202,"src":"24355:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7209,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"24348:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int152_$","typeString":"type(int152)"},"typeName":{"id":7208,"name":"int152","nodeType":"ElementaryTypeName","src":"24348:6:21","typeDescriptions":{}}},"id":7211,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24348:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"}},"src":"24335:26:21","typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"}},"id":7213,"nodeType":"ExpressionStatement","src":"24335:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7216,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7214,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7205,"src":"24375:10:21","typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7215,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7202,"src":"24389:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"24375:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7223,"nodeType":"IfStatement","src":"24371:98:21","trueBody":{"id":7222,"nodeType":"Block","src":"24396:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313532","id":7218,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24447:3:21","typeDescriptions":{"typeIdentifier":"t_rational_152_by_1","typeString":"int_const 152"},"value":"152"},{"id":7219,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7202,"src":"24452:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_152_by_1","typeString":"int_const 152"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7217,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"24417:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24417:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7221,"nodeType":"RevertStatement","src":"24410:48:21"}]}}]},"documentation":{"id":7200,"nodeType":"StructuredDocumentation","src":"23934:312:21","text":" @dev Returns the downcasted int152 from int256, reverting on\n overflow (when the input is less than smallest int152 or\n greater than largest int152).\n Counterpart to Solidity's `int152` operator.\n Requirements:\n - input must fit into 152 bits"},"id":7225,"implemented":true,"kind":"function","modifiers":[],"name":"toInt152","nameLocation":"24260:8:21","nodeType":"FunctionDefinition","parameters":{"id":7203,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7202,"mutability":"mutable","name":"value","nameLocation":"24276:5:21","nodeType":"VariableDeclaration","scope":7225,"src":"24269:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7201,"name":"int256","nodeType":"ElementaryTypeName","src":"24269:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"24268:14:21"},"returnParameters":{"id":7206,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7205,"mutability":"mutable","name":"downcasted","nameLocation":"24313:10:21","nodeType":"VariableDeclaration","scope":7225,"src":"24306:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"},"typeName":{"id":7204,"name":"int152","nodeType":"ElementaryTypeName","src":"24306:6:21","typeDescriptions":{"typeIdentifier":"t_int152","typeString":"int152"}},"visibility":"internal"}],"src":"24305:19:21"},"scope":7734,"src":"24251:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7250,"nodeType":"Block","src":"24872:150:21","statements":[{"expression":{"id":7238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7233,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7231,"src":"24882:10:21","typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7236,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7228,"src":"24902:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7235,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"24895:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int144_$","typeString":"type(int144)"},"typeName":{"id":7234,"name":"int144","nodeType":"ElementaryTypeName","src":"24895:6:21","typeDescriptions":{}}},"id":7237,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24895:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"}},"src":"24882:26:21","typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"}},"id":7239,"nodeType":"ExpressionStatement","src":"24882:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7240,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7231,"src":"24922:10:21","typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7241,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7228,"src":"24936:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"24922:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7249,"nodeType":"IfStatement","src":"24918:98:21","trueBody":{"id":7248,"nodeType":"Block","src":"24943:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313434","id":7244,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24994:3:21","typeDescriptions":{"typeIdentifier":"t_rational_144_by_1","typeString":"int_const 144"},"value":"144"},{"id":7245,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7228,"src":"24999:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_144_by_1","typeString":"int_const 144"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7243,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"24964:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24964:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7247,"nodeType":"RevertStatement","src":"24957:48:21"}]}}]},"documentation":{"id":7226,"nodeType":"StructuredDocumentation","src":"24481:312:21","text":" @dev Returns the downcasted int144 from int256, reverting on\n overflow (when the input is less than smallest int144 or\n greater than largest int144).\n Counterpart to Solidity's `int144` operator.\n Requirements:\n - input must fit into 144 bits"},"id":7251,"implemented":true,"kind":"function","modifiers":[],"name":"toInt144","nameLocation":"24807:8:21","nodeType":"FunctionDefinition","parameters":{"id":7229,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7228,"mutability":"mutable","name":"value","nameLocation":"24823:5:21","nodeType":"VariableDeclaration","scope":7251,"src":"24816:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7227,"name":"int256","nodeType":"ElementaryTypeName","src":"24816:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"24815:14:21"},"returnParameters":{"id":7232,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7231,"mutability":"mutable","name":"downcasted","nameLocation":"24860:10:21","nodeType":"VariableDeclaration","scope":7251,"src":"24853:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"},"typeName":{"id":7230,"name":"int144","nodeType":"ElementaryTypeName","src":"24853:6:21","typeDescriptions":{"typeIdentifier":"t_int144","typeString":"int144"}},"visibility":"internal"}],"src":"24852:19:21"},"scope":7734,"src":"24798:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7276,"nodeType":"Block","src":"25419:150:21","statements":[{"expression":{"id":7264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7259,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7257,"src":"25429:10:21","typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7262,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7254,"src":"25449:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7261,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25442:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int136_$","typeString":"type(int136)"},"typeName":{"id":7260,"name":"int136","nodeType":"ElementaryTypeName","src":"25442:6:21","typeDescriptions":{}}},"id":7263,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25442:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"}},"src":"25429:26:21","typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"}},"id":7265,"nodeType":"ExpressionStatement","src":"25429:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7266,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7257,"src":"25469:10:21","typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7267,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7254,"src":"25483:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"25469:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7275,"nodeType":"IfStatement","src":"25465:98:21","trueBody":{"id":7274,"nodeType":"Block","src":"25490:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313336","id":7270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25541:3:21","typeDescriptions":{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},"value":"136"},{"id":7271,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7254,"src":"25546:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_136_by_1","typeString":"int_const 136"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7269,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"25511:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7272,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25511:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7273,"nodeType":"RevertStatement","src":"25504:48:21"}]}}]},"documentation":{"id":7252,"nodeType":"StructuredDocumentation","src":"25028:312:21","text":" @dev Returns the downcasted int136 from int256, reverting on\n overflow (when the input is less than smallest int136 or\n greater than largest int136).\n Counterpart to Solidity's `int136` operator.\n Requirements:\n - input must fit into 136 bits"},"id":7277,"implemented":true,"kind":"function","modifiers":[],"name":"toInt136","nameLocation":"25354:8:21","nodeType":"FunctionDefinition","parameters":{"id":7255,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7254,"mutability":"mutable","name":"value","nameLocation":"25370:5:21","nodeType":"VariableDeclaration","scope":7277,"src":"25363:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7253,"name":"int256","nodeType":"ElementaryTypeName","src":"25363:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"25362:14:21"},"returnParameters":{"id":7258,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7257,"mutability":"mutable","name":"downcasted","nameLocation":"25407:10:21","nodeType":"VariableDeclaration","scope":7277,"src":"25400:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"},"typeName":{"id":7256,"name":"int136","nodeType":"ElementaryTypeName","src":"25400:6:21","typeDescriptions":{"typeIdentifier":"t_int136","typeString":"int136"}},"visibility":"internal"}],"src":"25399:19:21"},"scope":7734,"src":"25345:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7302,"nodeType":"Block","src":"25966:150:21","statements":[{"expression":{"id":7290,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7285,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7283,"src":"25976:10:21","typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7288,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7280,"src":"25996:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7287,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"25989:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int128_$","typeString":"type(int128)"},"typeName":{"id":7286,"name":"int128","nodeType":"ElementaryTypeName","src":"25989:6:21","typeDescriptions":{}}},"id":7289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25989:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"}},"src":"25976:26:21","typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"}},"id":7291,"nodeType":"ExpressionStatement","src":"25976:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7292,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7283,"src":"26016:10:21","typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7293,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7280,"src":"26030:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"26016:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7301,"nodeType":"IfStatement","src":"26012:98:21","trueBody":{"id":7300,"nodeType":"Block","src":"26037:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313238","id":7296,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26088:3:21","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},{"id":7297,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7280,"src":"26093:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7295,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"26058:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7298,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26058:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7299,"nodeType":"RevertStatement","src":"26051:48:21"}]}}]},"documentation":{"id":7278,"nodeType":"StructuredDocumentation","src":"25575:312:21","text":" @dev Returns the downcasted int128 from int256, reverting on\n overflow (when the input is less than smallest int128 or\n greater than largest int128).\n Counterpart to Solidity's `int128` operator.\n Requirements:\n - input must fit into 128 bits"},"id":7303,"implemented":true,"kind":"function","modifiers":[],"name":"toInt128","nameLocation":"25901:8:21","nodeType":"FunctionDefinition","parameters":{"id":7281,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7280,"mutability":"mutable","name":"value","nameLocation":"25917:5:21","nodeType":"VariableDeclaration","scope":7303,"src":"25910:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7279,"name":"int256","nodeType":"ElementaryTypeName","src":"25910:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"25909:14:21"},"returnParameters":{"id":7284,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7283,"mutability":"mutable","name":"downcasted","nameLocation":"25954:10:21","nodeType":"VariableDeclaration","scope":7303,"src":"25947:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"},"typeName":{"id":7282,"name":"int128","nodeType":"ElementaryTypeName","src":"25947:6:21","typeDescriptions":{"typeIdentifier":"t_int128","typeString":"int128"}},"visibility":"internal"}],"src":"25946:19:21"},"scope":7734,"src":"25892:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7328,"nodeType":"Block","src":"26513:150:21","statements":[{"expression":{"id":7316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7311,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7309,"src":"26523:10:21","typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7314,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7306,"src":"26543:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7313,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26536:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int120_$","typeString":"type(int120)"},"typeName":{"id":7312,"name":"int120","nodeType":"ElementaryTypeName","src":"26536:6:21","typeDescriptions":{}}},"id":7315,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26536:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"}},"src":"26523:26:21","typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"}},"id":7317,"nodeType":"ExpressionStatement","src":"26523:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7318,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7309,"src":"26563:10:21","typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7319,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7306,"src":"26577:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"26563:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7327,"nodeType":"IfStatement","src":"26559:98:21","trueBody":{"id":7326,"nodeType":"Block","src":"26584:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313230","id":7322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26635:3:21","typeDescriptions":{"typeIdentifier":"t_rational_120_by_1","typeString":"int_const 120"},"value":"120"},{"id":7323,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7306,"src":"26640:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_120_by_1","typeString":"int_const 120"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7321,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"26605:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26605:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7325,"nodeType":"RevertStatement","src":"26598:48:21"}]}}]},"documentation":{"id":7304,"nodeType":"StructuredDocumentation","src":"26122:312:21","text":" @dev Returns the downcasted int120 from int256, reverting on\n overflow (when the input is less than smallest int120 or\n greater than largest int120).\n Counterpart to Solidity's `int120` operator.\n Requirements:\n - input must fit into 120 bits"},"id":7329,"implemented":true,"kind":"function","modifiers":[],"name":"toInt120","nameLocation":"26448:8:21","nodeType":"FunctionDefinition","parameters":{"id":7307,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7306,"mutability":"mutable","name":"value","nameLocation":"26464:5:21","nodeType":"VariableDeclaration","scope":7329,"src":"26457:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7305,"name":"int256","nodeType":"ElementaryTypeName","src":"26457:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"26456:14:21"},"returnParameters":{"id":7310,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7309,"mutability":"mutable","name":"downcasted","nameLocation":"26501:10:21","nodeType":"VariableDeclaration","scope":7329,"src":"26494:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"},"typeName":{"id":7308,"name":"int120","nodeType":"ElementaryTypeName","src":"26494:6:21","typeDescriptions":{"typeIdentifier":"t_int120","typeString":"int120"}},"visibility":"internal"}],"src":"26493:19:21"},"scope":7734,"src":"26439:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7354,"nodeType":"Block","src":"27060:150:21","statements":[{"expression":{"id":7342,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7337,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7335,"src":"27070:10:21","typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7340,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7332,"src":"27090:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7339,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"27083:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int112_$","typeString":"type(int112)"},"typeName":{"id":7338,"name":"int112","nodeType":"ElementaryTypeName","src":"27083:6:21","typeDescriptions":{}}},"id":7341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27083:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"}},"src":"27070:26:21","typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"}},"id":7343,"nodeType":"ExpressionStatement","src":"27070:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7344,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7335,"src":"27110:10:21","typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7345,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7332,"src":"27124:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"27110:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7353,"nodeType":"IfStatement","src":"27106:98:21","trueBody":{"id":7352,"nodeType":"Block","src":"27131:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313132","id":7348,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27182:3:21","typeDescriptions":{"typeIdentifier":"t_rational_112_by_1","typeString":"int_const 112"},"value":"112"},{"id":7349,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7332,"src":"27187:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_112_by_1","typeString":"int_const 112"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7347,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"27152:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27152:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7351,"nodeType":"RevertStatement","src":"27145:48:21"}]}}]},"documentation":{"id":7330,"nodeType":"StructuredDocumentation","src":"26669:312:21","text":" @dev Returns the downcasted int112 from int256, reverting on\n overflow (when the input is less than smallest int112 or\n greater than largest int112).\n Counterpart to Solidity's `int112` operator.\n Requirements:\n - input must fit into 112 bits"},"id":7355,"implemented":true,"kind":"function","modifiers":[],"name":"toInt112","nameLocation":"26995:8:21","nodeType":"FunctionDefinition","parameters":{"id":7333,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7332,"mutability":"mutable","name":"value","nameLocation":"27011:5:21","nodeType":"VariableDeclaration","scope":7355,"src":"27004:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7331,"name":"int256","nodeType":"ElementaryTypeName","src":"27004:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"27003:14:21"},"returnParameters":{"id":7336,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7335,"mutability":"mutable","name":"downcasted","nameLocation":"27048:10:21","nodeType":"VariableDeclaration","scope":7355,"src":"27041:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"},"typeName":{"id":7334,"name":"int112","nodeType":"ElementaryTypeName","src":"27041:6:21","typeDescriptions":{"typeIdentifier":"t_int112","typeString":"int112"}},"visibility":"internal"}],"src":"27040:19:21"},"scope":7734,"src":"26986:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7380,"nodeType":"Block","src":"27607:150:21","statements":[{"expression":{"id":7368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7363,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7361,"src":"27617:10:21","typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7366,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7358,"src":"27637:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7365,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"27630:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int104_$","typeString":"type(int104)"},"typeName":{"id":7364,"name":"int104","nodeType":"ElementaryTypeName","src":"27630:6:21","typeDescriptions":{}}},"id":7367,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27630:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"}},"src":"27617:26:21","typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"}},"id":7369,"nodeType":"ExpressionStatement","src":"27617:26:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7370,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7361,"src":"27657:10:21","typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7371,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7358,"src":"27671:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"27657:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7379,"nodeType":"IfStatement","src":"27653:98:21","trueBody":{"id":7378,"nodeType":"Block","src":"27678:73:21","statements":[{"errorCall":{"arguments":[{"hexValue":"313034","id":7374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"27729:3:21","typeDescriptions":{"typeIdentifier":"t_rational_104_by_1","typeString":"int_const 104"},"value":"104"},{"id":7375,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7358,"src":"27734:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_104_by_1","typeString":"int_const 104"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7373,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"27699:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7376,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27699:41:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7377,"nodeType":"RevertStatement","src":"27692:48:21"}]}}]},"documentation":{"id":7356,"nodeType":"StructuredDocumentation","src":"27216:312:21","text":" @dev Returns the downcasted int104 from int256, reverting on\n overflow (when the input is less than smallest int104 or\n greater than largest int104).\n Counterpart to Solidity's `int104` operator.\n Requirements:\n - input must fit into 104 bits"},"id":7381,"implemented":true,"kind":"function","modifiers":[],"name":"toInt104","nameLocation":"27542:8:21","nodeType":"FunctionDefinition","parameters":{"id":7359,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7358,"mutability":"mutable","name":"value","nameLocation":"27558:5:21","nodeType":"VariableDeclaration","scope":7381,"src":"27551:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7357,"name":"int256","nodeType":"ElementaryTypeName","src":"27551:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"27550:14:21"},"returnParameters":{"id":7362,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7361,"mutability":"mutable","name":"downcasted","nameLocation":"27595:10:21","nodeType":"VariableDeclaration","scope":7381,"src":"27588:17:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"},"typeName":{"id":7360,"name":"int104","nodeType":"ElementaryTypeName","src":"27588:6:21","typeDescriptions":{"typeIdentifier":"t_int104","typeString":"int104"}},"visibility":"internal"}],"src":"27587:19:21"},"scope":7734,"src":"27533:224:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7406,"nodeType":"Block","src":"28147:148:21","statements":[{"expression":{"id":7394,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7389,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7387,"src":"28157:10:21","typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7392,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7384,"src":"28176:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7391,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"28170:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int96_$","typeString":"type(int96)"},"typeName":{"id":7390,"name":"int96","nodeType":"ElementaryTypeName","src":"28170:5:21","typeDescriptions":{}}},"id":7393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28170:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"}},"src":"28157:25:21","typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"}},"id":7395,"nodeType":"ExpressionStatement","src":"28157:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7396,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7387,"src":"28196:10:21","typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7397,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7384,"src":"28210:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"28196:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7405,"nodeType":"IfStatement","src":"28192:97:21","trueBody":{"id":7404,"nodeType":"Block","src":"28217:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3936","id":7400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28268:2:21","typeDescriptions":{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},"value":"96"},{"id":7401,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7384,"src":"28272:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_96_by_1","typeString":"int_const 96"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7399,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"28238:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28238:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7403,"nodeType":"RevertStatement","src":"28231:47:21"}]}}]},"documentation":{"id":7382,"nodeType":"StructuredDocumentation","src":"27763:307:21","text":" @dev Returns the downcasted int96 from int256, reverting on\n overflow (when the input is less than smallest int96 or\n greater than largest int96).\n Counterpart to Solidity's `int96` operator.\n Requirements:\n - input must fit into 96 bits"},"id":7407,"implemented":true,"kind":"function","modifiers":[],"name":"toInt96","nameLocation":"28084:7:21","nodeType":"FunctionDefinition","parameters":{"id":7385,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7384,"mutability":"mutable","name":"value","nameLocation":"28099:5:21","nodeType":"VariableDeclaration","scope":7407,"src":"28092:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7383,"name":"int256","nodeType":"ElementaryTypeName","src":"28092:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"28091:14:21"},"returnParameters":{"id":7388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7387,"mutability":"mutable","name":"downcasted","nameLocation":"28135:10:21","nodeType":"VariableDeclaration","scope":7407,"src":"28129:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"},"typeName":{"id":7386,"name":"int96","nodeType":"ElementaryTypeName","src":"28129:5:21","typeDescriptions":{"typeIdentifier":"t_int96","typeString":"int96"}},"visibility":"internal"}],"src":"28128:18:21"},"scope":7734,"src":"28075:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7432,"nodeType":"Block","src":"28685:148:21","statements":[{"expression":{"id":7420,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7415,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7413,"src":"28695:10:21","typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7418,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7410,"src":"28714:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7417,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"28708:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int88_$","typeString":"type(int88)"},"typeName":{"id":7416,"name":"int88","nodeType":"ElementaryTypeName","src":"28708:5:21","typeDescriptions":{}}},"id":7419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28708:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"}},"src":"28695:25:21","typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"}},"id":7421,"nodeType":"ExpressionStatement","src":"28695:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7422,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7413,"src":"28734:10:21","typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7423,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7410,"src":"28748:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"28734:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7431,"nodeType":"IfStatement","src":"28730:97:21","trueBody":{"id":7430,"nodeType":"Block","src":"28755:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3838","id":7426,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28806:2:21","typeDescriptions":{"typeIdentifier":"t_rational_88_by_1","typeString":"int_const 88"},"value":"88"},{"id":7427,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7410,"src":"28810:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_88_by_1","typeString":"int_const 88"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7425,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"28776:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28776:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7429,"nodeType":"RevertStatement","src":"28769:47:21"}]}}]},"documentation":{"id":7408,"nodeType":"StructuredDocumentation","src":"28301:307:21","text":" @dev Returns the downcasted int88 from int256, reverting on\n overflow (when the input is less than smallest int88 or\n greater than largest int88).\n Counterpart to Solidity's `int88` operator.\n Requirements:\n - input must fit into 88 bits"},"id":7433,"implemented":true,"kind":"function","modifiers":[],"name":"toInt88","nameLocation":"28622:7:21","nodeType":"FunctionDefinition","parameters":{"id":7411,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7410,"mutability":"mutable","name":"value","nameLocation":"28637:5:21","nodeType":"VariableDeclaration","scope":7433,"src":"28630:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7409,"name":"int256","nodeType":"ElementaryTypeName","src":"28630:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"28629:14:21"},"returnParameters":{"id":7414,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7413,"mutability":"mutable","name":"downcasted","nameLocation":"28673:10:21","nodeType":"VariableDeclaration","scope":7433,"src":"28667:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"},"typeName":{"id":7412,"name":"int88","nodeType":"ElementaryTypeName","src":"28667:5:21","typeDescriptions":{"typeIdentifier":"t_int88","typeString":"int88"}},"visibility":"internal"}],"src":"28666:18:21"},"scope":7734,"src":"28613:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7458,"nodeType":"Block","src":"29223:148:21","statements":[{"expression":{"id":7446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7441,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7439,"src":"29233:10:21","typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7444,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7436,"src":"29252:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7443,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"29246:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int80_$","typeString":"type(int80)"},"typeName":{"id":7442,"name":"int80","nodeType":"ElementaryTypeName","src":"29246:5:21","typeDescriptions":{}}},"id":7445,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29246:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"}},"src":"29233:25:21","typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"}},"id":7447,"nodeType":"ExpressionStatement","src":"29233:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7448,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7439,"src":"29272:10:21","typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7449,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7436,"src":"29286:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"29272:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7457,"nodeType":"IfStatement","src":"29268:97:21","trueBody":{"id":7456,"nodeType":"Block","src":"29293:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3830","id":7452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29344:2:21","typeDescriptions":{"typeIdentifier":"t_rational_80_by_1","typeString":"int_const 80"},"value":"80"},{"id":7453,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7436,"src":"29348:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_80_by_1","typeString":"int_const 80"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7451,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"29314:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29314:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7455,"nodeType":"RevertStatement","src":"29307:47:21"}]}}]},"documentation":{"id":7434,"nodeType":"StructuredDocumentation","src":"28839:307:21","text":" @dev Returns the downcasted int80 from int256, reverting on\n overflow (when the input is less than smallest int80 or\n greater than largest int80).\n Counterpart to Solidity's `int80` operator.\n Requirements:\n - input must fit into 80 bits"},"id":7459,"implemented":true,"kind":"function","modifiers":[],"name":"toInt80","nameLocation":"29160:7:21","nodeType":"FunctionDefinition","parameters":{"id":7437,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7436,"mutability":"mutable","name":"value","nameLocation":"29175:5:21","nodeType":"VariableDeclaration","scope":7459,"src":"29168:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7435,"name":"int256","nodeType":"ElementaryTypeName","src":"29168:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"29167:14:21"},"returnParameters":{"id":7440,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7439,"mutability":"mutable","name":"downcasted","nameLocation":"29211:10:21","nodeType":"VariableDeclaration","scope":7459,"src":"29205:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"},"typeName":{"id":7438,"name":"int80","nodeType":"ElementaryTypeName","src":"29205:5:21","typeDescriptions":{"typeIdentifier":"t_int80","typeString":"int80"}},"visibility":"internal"}],"src":"29204:18:21"},"scope":7734,"src":"29151:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7484,"nodeType":"Block","src":"29761:148:21","statements":[{"expression":{"id":7472,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7467,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7465,"src":"29771:10:21","typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7470,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7462,"src":"29790:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7469,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"29784:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int72_$","typeString":"type(int72)"},"typeName":{"id":7468,"name":"int72","nodeType":"ElementaryTypeName","src":"29784:5:21","typeDescriptions":{}}},"id":7471,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29784:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"}},"src":"29771:25:21","typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"}},"id":7473,"nodeType":"ExpressionStatement","src":"29771:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7474,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7465,"src":"29810:10:21","typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7475,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7462,"src":"29824:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"29810:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7483,"nodeType":"IfStatement","src":"29806:97:21","trueBody":{"id":7482,"nodeType":"Block","src":"29831:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3732","id":7478,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"29882:2:21","typeDescriptions":{"typeIdentifier":"t_rational_72_by_1","typeString":"int_const 72"},"value":"72"},{"id":7479,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7462,"src":"29886:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_72_by_1","typeString":"int_const 72"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7477,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"29852:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29852:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7481,"nodeType":"RevertStatement","src":"29845:47:21"}]}}]},"documentation":{"id":7460,"nodeType":"StructuredDocumentation","src":"29377:307:21","text":" @dev Returns the downcasted int72 from int256, reverting on\n overflow (when the input is less than smallest int72 or\n greater than largest int72).\n Counterpart to Solidity's `int72` operator.\n Requirements:\n - input must fit into 72 bits"},"id":7485,"implemented":true,"kind":"function","modifiers":[],"name":"toInt72","nameLocation":"29698:7:21","nodeType":"FunctionDefinition","parameters":{"id":7463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7462,"mutability":"mutable","name":"value","nameLocation":"29713:5:21","nodeType":"VariableDeclaration","scope":7485,"src":"29706:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7461,"name":"int256","nodeType":"ElementaryTypeName","src":"29706:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"29705:14:21"},"returnParameters":{"id":7466,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7465,"mutability":"mutable","name":"downcasted","nameLocation":"29749:10:21","nodeType":"VariableDeclaration","scope":7485,"src":"29743:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"},"typeName":{"id":7464,"name":"int72","nodeType":"ElementaryTypeName","src":"29743:5:21","typeDescriptions":{"typeIdentifier":"t_int72","typeString":"int72"}},"visibility":"internal"}],"src":"29742:18:21"},"scope":7734,"src":"29689:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7510,"nodeType":"Block","src":"30299:148:21","statements":[{"expression":{"id":7498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7493,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7491,"src":"30309:10:21","typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7496,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7488,"src":"30328:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30322:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int64_$","typeString":"type(int64)"},"typeName":{"id":7494,"name":"int64","nodeType":"ElementaryTypeName","src":"30322:5:21","typeDescriptions":{}}},"id":7497,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30322:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"}},"src":"30309:25:21","typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"}},"id":7499,"nodeType":"ExpressionStatement","src":"30309:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7500,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7491,"src":"30348:10:21","typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7501,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7488,"src":"30362:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"30348:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7509,"nodeType":"IfStatement","src":"30344:97:21","trueBody":{"id":7508,"nodeType":"Block","src":"30369:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3634","id":7504,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30420:2:21","typeDescriptions":{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},"value":"64"},{"id":7505,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7488,"src":"30424:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_64_by_1","typeString":"int_const 64"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7503,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"30390:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7506,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30390:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7507,"nodeType":"RevertStatement","src":"30383:47:21"}]}}]},"documentation":{"id":7486,"nodeType":"StructuredDocumentation","src":"29915:307:21","text":" @dev Returns the downcasted int64 from int256, reverting on\n overflow (when the input is less than smallest int64 or\n greater than largest int64).\n Counterpart to Solidity's `int64` operator.\n Requirements:\n - input must fit into 64 bits"},"id":7511,"implemented":true,"kind":"function","modifiers":[],"name":"toInt64","nameLocation":"30236:7:21","nodeType":"FunctionDefinition","parameters":{"id":7489,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7488,"mutability":"mutable","name":"value","nameLocation":"30251:5:21","nodeType":"VariableDeclaration","scope":7511,"src":"30244:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7487,"name":"int256","nodeType":"ElementaryTypeName","src":"30244:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"30243:14:21"},"returnParameters":{"id":7492,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7491,"mutability":"mutable","name":"downcasted","nameLocation":"30287:10:21","nodeType":"VariableDeclaration","scope":7511,"src":"30281:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"},"typeName":{"id":7490,"name":"int64","nodeType":"ElementaryTypeName","src":"30281:5:21","typeDescriptions":{"typeIdentifier":"t_int64","typeString":"int64"}},"visibility":"internal"}],"src":"30280:18:21"},"scope":7734,"src":"30227:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7536,"nodeType":"Block","src":"30837:148:21","statements":[{"expression":{"id":7524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7519,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7517,"src":"30847:10:21","typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7522,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7514,"src":"30866:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7521,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30860:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int56_$","typeString":"type(int56)"},"typeName":{"id":7520,"name":"int56","nodeType":"ElementaryTypeName","src":"30860:5:21","typeDescriptions":{}}},"id":7523,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30860:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"}},"src":"30847:25:21","typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"}},"id":7525,"nodeType":"ExpressionStatement","src":"30847:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7528,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7526,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7517,"src":"30886:10:21","typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7527,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7514,"src":"30900:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"30886:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7535,"nodeType":"IfStatement","src":"30882:97:21","trueBody":{"id":7534,"nodeType":"Block","src":"30907:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3536","id":7530,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30958:2:21","typeDescriptions":{"typeIdentifier":"t_rational_56_by_1","typeString":"int_const 56"},"value":"56"},{"id":7531,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7514,"src":"30962:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_56_by_1","typeString":"int_const 56"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7529,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"30928:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7532,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30928:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7533,"nodeType":"RevertStatement","src":"30921:47:21"}]}}]},"documentation":{"id":7512,"nodeType":"StructuredDocumentation","src":"30453:307:21","text":" @dev Returns the downcasted int56 from int256, reverting on\n overflow (when the input is less than smallest int56 or\n greater than largest int56).\n Counterpart to Solidity's `int56` operator.\n Requirements:\n - input must fit into 56 bits"},"id":7537,"implemented":true,"kind":"function","modifiers":[],"name":"toInt56","nameLocation":"30774:7:21","nodeType":"FunctionDefinition","parameters":{"id":7515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7514,"mutability":"mutable","name":"value","nameLocation":"30789:5:21","nodeType":"VariableDeclaration","scope":7537,"src":"30782:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7513,"name":"int256","nodeType":"ElementaryTypeName","src":"30782:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"30781:14:21"},"returnParameters":{"id":7518,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7517,"mutability":"mutable","name":"downcasted","nameLocation":"30825:10:21","nodeType":"VariableDeclaration","scope":7537,"src":"30819:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"},"typeName":{"id":7516,"name":"int56","nodeType":"ElementaryTypeName","src":"30819:5:21","typeDescriptions":{"typeIdentifier":"t_int56","typeString":"int56"}},"visibility":"internal"}],"src":"30818:18:21"},"scope":7734,"src":"30765:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7562,"nodeType":"Block","src":"31375:148:21","statements":[{"expression":{"id":7550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7545,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7543,"src":"31385:10:21","typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7548,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7540,"src":"31404:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7547,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"31398:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int48_$","typeString":"type(int48)"},"typeName":{"id":7546,"name":"int48","nodeType":"ElementaryTypeName","src":"31398:5:21","typeDescriptions":{}}},"id":7549,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31398:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"}},"src":"31385:25:21","typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"}},"id":7551,"nodeType":"ExpressionStatement","src":"31385:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7552,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7543,"src":"31424:10:21","typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7553,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7540,"src":"31438:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"31424:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7561,"nodeType":"IfStatement","src":"31420:97:21","trueBody":{"id":7560,"nodeType":"Block","src":"31445:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3438","id":7556,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31496:2:21","typeDescriptions":{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},"value":"48"},{"id":7557,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7540,"src":"31500:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_48_by_1","typeString":"int_const 48"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7555,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"31466:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31466:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7559,"nodeType":"RevertStatement","src":"31459:47:21"}]}}]},"documentation":{"id":7538,"nodeType":"StructuredDocumentation","src":"30991:307:21","text":" @dev Returns the downcasted int48 from int256, reverting on\n overflow (when the input is less than smallest int48 or\n greater than largest int48).\n Counterpart to Solidity's `int48` operator.\n Requirements:\n - input must fit into 48 bits"},"id":7563,"implemented":true,"kind":"function","modifiers":[],"name":"toInt48","nameLocation":"31312:7:21","nodeType":"FunctionDefinition","parameters":{"id":7541,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7540,"mutability":"mutable","name":"value","nameLocation":"31327:5:21","nodeType":"VariableDeclaration","scope":7563,"src":"31320:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7539,"name":"int256","nodeType":"ElementaryTypeName","src":"31320:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"31319:14:21"},"returnParameters":{"id":7544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7543,"mutability":"mutable","name":"downcasted","nameLocation":"31363:10:21","nodeType":"VariableDeclaration","scope":7563,"src":"31357:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"},"typeName":{"id":7542,"name":"int48","nodeType":"ElementaryTypeName","src":"31357:5:21","typeDescriptions":{"typeIdentifier":"t_int48","typeString":"int48"}},"visibility":"internal"}],"src":"31356:18:21"},"scope":7734,"src":"31303:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7588,"nodeType":"Block","src":"31913:148:21","statements":[{"expression":{"id":7576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7571,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7569,"src":"31923:10:21","typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7574,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7566,"src":"31942:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7573,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"31936:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int40_$","typeString":"type(int40)"},"typeName":{"id":7572,"name":"int40","nodeType":"ElementaryTypeName","src":"31936:5:21","typeDescriptions":{}}},"id":7575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"31936:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"}},"src":"31923:25:21","typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"}},"id":7577,"nodeType":"ExpressionStatement","src":"31923:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7578,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7569,"src":"31962:10:21","typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7579,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7566,"src":"31976:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"31962:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7587,"nodeType":"IfStatement","src":"31958:97:21","trueBody":{"id":7586,"nodeType":"Block","src":"31983:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3430","id":7582,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"32034:2:21","typeDescriptions":{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},"value":"40"},{"id":7583,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7566,"src":"32038:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_40_by_1","typeString":"int_const 40"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7581,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"32004:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"32004:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7585,"nodeType":"RevertStatement","src":"31997:47:21"}]}}]},"documentation":{"id":7564,"nodeType":"StructuredDocumentation","src":"31529:307:21","text":" @dev Returns the downcasted int40 from int256, reverting on\n overflow (when the input is less than smallest int40 or\n greater than largest int40).\n Counterpart to Solidity's `int40` operator.\n Requirements:\n - input must fit into 40 bits"},"id":7589,"implemented":true,"kind":"function","modifiers":[],"name":"toInt40","nameLocation":"31850:7:21","nodeType":"FunctionDefinition","parameters":{"id":7567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7566,"mutability":"mutable","name":"value","nameLocation":"31865:5:21","nodeType":"VariableDeclaration","scope":7589,"src":"31858:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7565,"name":"int256","nodeType":"ElementaryTypeName","src":"31858:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"31857:14:21"},"returnParameters":{"id":7570,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7569,"mutability":"mutable","name":"downcasted","nameLocation":"31901:10:21","nodeType":"VariableDeclaration","scope":7589,"src":"31895:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"},"typeName":{"id":7568,"name":"int40","nodeType":"ElementaryTypeName","src":"31895:5:21","typeDescriptions":{"typeIdentifier":"t_int40","typeString":"int40"}},"visibility":"internal"}],"src":"31894:18:21"},"scope":7734,"src":"31841:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7614,"nodeType":"Block","src":"32451:148:21","statements":[{"expression":{"id":7602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7597,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7595,"src":"32461:10:21","typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7600,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7592,"src":"32480:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7599,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"32474:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int32_$","typeString":"type(int32)"},"typeName":{"id":7598,"name":"int32","nodeType":"ElementaryTypeName","src":"32474:5:21","typeDescriptions":{}}},"id":7601,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"32474:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"}},"src":"32461:25:21","typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"}},"id":7603,"nodeType":"ExpressionStatement","src":"32461:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7604,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7595,"src":"32500:10:21","typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7605,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7592,"src":"32514:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"32500:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7613,"nodeType":"IfStatement","src":"32496:97:21","trueBody":{"id":7612,"nodeType":"Block","src":"32521:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3332","id":7608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"32572:2:21","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},{"id":7609,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7592,"src":"32576:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7607,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"32542:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7610,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"32542:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7611,"nodeType":"RevertStatement","src":"32535:47:21"}]}}]},"documentation":{"id":7590,"nodeType":"StructuredDocumentation","src":"32067:307:21","text":" @dev Returns the downcasted int32 from int256, reverting on\n overflow (when the input is less than smallest int32 or\n greater than largest int32).\n Counterpart to Solidity's `int32` operator.\n Requirements:\n - input must fit into 32 bits"},"id":7615,"implemented":true,"kind":"function","modifiers":[],"name":"toInt32","nameLocation":"32388:7:21","nodeType":"FunctionDefinition","parameters":{"id":7593,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7592,"mutability":"mutable","name":"value","nameLocation":"32403:5:21","nodeType":"VariableDeclaration","scope":7615,"src":"32396:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7591,"name":"int256","nodeType":"ElementaryTypeName","src":"32396:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"32395:14:21"},"returnParameters":{"id":7596,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7595,"mutability":"mutable","name":"downcasted","nameLocation":"32439:10:21","nodeType":"VariableDeclaration","scope":7615,"src":"32433:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"},"typeName":{"id":7594,"name":"int32","nodeType":"ElementaryTypeName","src":"32433:5:21","typeDescriptions":{"typeIdentifier":"t_int32","typeString":"int32"}},"visibility":"internal"}],"src":"32432:18:21"},"scope":7734,"src":"32379:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7640,"nodeType":"Block","src":"32989:148:21","statements":[{"expression":{"id":7628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7623,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7621,"src":"32999:10:21","typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7626,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7618,"src":"33018:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7625,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"33012:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int24_$","typeString":"type(int24)"},"typeName":{"id":7624,"name":"int24","nodeType":"ElementaryTypeName","src":"33012:5:21","typeDescriptions":{}}},"id":7627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"33012:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"}},"src":"32999:25:21","typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"}},"id":7629,"nodeType":"ExpressionStatement","src":"32999:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7632,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7630,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7621,"src":"33038:10:21","typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7631,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7618,"src":"33052:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"33038:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7639,"nodeType":"IfStatement","src":"33034:97:21","trueBody":{"id":7638,"nodeType":"Block","src":"33059:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3234","id":7634,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"33110:2:21","typeDescriptions":{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},"value":"24"},{"id":7635,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7618,"src":"33114:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7633,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"33080:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7636,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"33080:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7637,"nodeType":"RevertStatement","src":"33073:47:21"}]}}]},"documentation":{"id":7616,"nodeType":"StructuredDocumentation","src":"32605:307:21","text":" @dev Returns the downcasted int24 from int256, reverting on\n overflow (when the input is less than smallest int24 or\n greater than largest int24).\n Counterpart to Solidity's `int24` operator.\n Requirements:\n - input must fit into 24 bits"},"id":7641,"implemented":true,"kind":"function","modifiers":[],"name":"toInt24","nameLocation":"32926:7:21","nodeType":"FunctionDefinition","parameters":{"id":7619,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7618,"mutability":"mutable","name":"value","nameLocation":"32941:5:21","nodeType":"VariableDeclaration","scope":7641,"src":"32934:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7617,"name":"int256","nodeType":"ElementaryTypeName","src":"32934:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"32933:14:21"},"returnParameters":{"id":7622,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7621,"mutability":"mutable","name":"downcasted","nameLocation":"32977:10:21","nodeType":"VariableDeclaration","scope":7641,"src":"32971:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"},"typeName":{"id":7620,"name":"int24","nodeType":"ElementaryTypeName","src":"32971:5:21","typeDescriptions":{"typeIdentifier":"t_int24","typeString":"int24"}},"visibility":"internal"}],"src":"32970:18:21"},"scope":7734,"src":"32917:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7666,"nodeType":"Block","src":"33527:148:21","statements":[{"expression":{"id":7654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7649,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7647,"src":"33537:10:21","typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7652,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7644,"src":"33556:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7651,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"33550:5:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int16_$","typeString":"type(int16)"},"typeName":{"id":7650,"name":"int16","nodeType":"ElementaryTypeName","src":"33550:5:21","typeDescriptions":{}}},"id":7653,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"33550:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"}},"src":"33537:25:21","typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"}},"id":7655,"nodeType":"ExpressionStatement","src":"33537:25:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7656,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7647,"src":"33576:10:21","typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7657,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7644,"src":"33590:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"33576:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7665,"nodeType":"IfStatement","src":"33572:97:21","trueBody":{"id":7664,"nodeType":"Block","src":"33597:72:21","statements":[{"errorCall":{"arguments":[{"hexValue":"3136","id":7660,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"33648:2:21","typeDescriptions":{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},"value":"16"},{"id":7661,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7644,"src":"33652:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_16_by_1","typeString":"int_const 16"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7659,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"33618:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"33618:40:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7663,"nodeType":"RevertStatement","src":"33611:47:21"}]}}]},"documentation":{"id":7642,"nodeType":"StructuredDocumentation","src":"33143:307:21","text":" @dev Returns the downcasted int16 from int256, reverting on\n overflow (when the input is less than smallest int16 or\n greater than largest int16).\n Counterpart to Solidity's `int16` operator.\n Requirements:\n - input must fit into 16 bits"},"id":7667,"implemented":true,"kind":"function","modifiers":[],"name":"toInt16","nameLocation":"33464:7:21","nodeType":"FunctionDefinition","parameters":{"id":7645,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7644,"mutability":"mutable","name":"value","nameLocation":"33479:5:21","nodeType":"VariableDeclaration","scope":7667,"src":"33472:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7643,"name":"int256","nodeType":"ElementaryTypeName","src":"33472:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"33471:14:21"},"returnParameters":{"id":7648,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7647,"mutability":"mutable","name":"downcasted","nameLocation":"33515:10:21","nodeType":"VariableDeclaration","scope":7667,"src":"33509:16:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"},"typeName":{"id":7646,"name":"int16","nodeType":"ElementaryTypeName","src":"33509:5:21","typeDescriptions":{"typeIdentifier":"t_int16","typeString":"int16"}},"visibility":"internal"}],"src":"33508:18:21"},"scope":7734,"src":"33455:220:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7692,"nodeType":"Block","src":"34058:146:21","statements":[{"expression":{"id":7680,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":7675,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7673,"src":"34068:10:21","typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":7678,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7670,"src":"34086:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7677,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"34081:4:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int8_$","typeString":"type(int8)"},"typeName":{"id":7676,"name":"int8","nodeType":"ElementaryTypeName","src":"34081:4:21","typeDescriptions":{}}},"id":7679,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34081:11:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"}},"src":"34068:24:21","typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"}},"id":7681,"nodeType":"ExpressionStatement","src":"34068:24:21"},{"condition":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7682,"name":"downcasted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7673,"src":"34106:10:21","typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":7683,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7670,"src":"34120:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"34106:19:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7691,"nodeType":"IfStatement","src":"34102:96:21","trueBody":{"id":7690,"nodeType":"Block","src":"34127:71:21","statements":[{"errorCall":{"arguments":[{"hexValue":"38","id":7686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"34178:1:21","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},{"id":7687,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7670,"src":"34181:5:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7685,"name":"SafeCastOverflowedIntDowncast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5991,"src":"34148:29:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$","typeString":"function (uint8,int256) pure returns (error)"}},"id":7688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34148:39:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7689,"nodeType":"RevertStatement","src":"34141:46:21"}]}}]},"documentation":{"id":7668,"nodeType":"StructuredDocumentation","src":"33681:302:21","text":" @dev Returns the downcasted int8 from int256, reverting on\n overflow (when the input is less than smallest int8 or\n greater than largest int8).\n Counterpart to Solidity's `int8` operator.\n Requirements:\n - input must fit into 8 bits"},"id":7693,"implemented":true,"kind":"function","modifiers":[],"name":"toInt8","nameLocation":"33997:6:21","nodeType":"FunctionDefinition","parameters":{"id":7671,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7670,"mutability":"mutable","name":"value","nameLocation":"34011:5:21","nodeType":"VariableDeclaration","scope":7693,"src":"34004:12:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7669,"name":"int256","nodeType":"ElementaryTypeName","src":"34004:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"34003:14:21"},"returnParameters":{"id":7674,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7673,"mutability":"mutable","name":"downcasted","nameLocation":"34046:10:21","nodeType":"VariableDeclaration","scope":7693,"src":"34041:15:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"},"typeName":{"id":7672,"name":"int8","nodeType":"ElementaryTypeName","src":"34041:4:21","typeDescriptions":{"typeIdentifier":"t_int8","typeString":"int8"}},"visibility":"internal"}],"src":"34040:17:21"},"scope":7734,"src":"33988:216:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7722,"nodeType":"Block","src":"34444:250:21","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7701,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7696,"src":"34557:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"arguments":[{"expression":{"arguments":[{"id":7706,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"34578:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":7705,"name":"int256","nodeType":"ElementaryTypeName","src":"34578:6:21","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"}],"id":7704,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"34573:4:21","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":7707,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34573:12:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_int256","typeString":"type(int256)"}},"id":7708,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"34586:3:21","memberName":"max","nodeType":"MemberAccess","src":"34573:16:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7703,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"34565:7:21","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":7702,"name":"uint256","nodeType":"ElementaryTypeName","src":"34565:7:21","typeDescriptions":{}}},"id":7709,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34565:25:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"34557:33:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":7716,"nodeType":"IfStatement","src":"34553:105:21","trueBody":{"id":7715,"nodeType":"Block","src":"34592:66:21","statements":[{"errorCall":{"arguments":[{"id":7712,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7696,"src":"34641:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7711,"name":"SafeCastOverflowedUintToInt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5996,"src":"34613:27:21","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":7713,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34613:34:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":7714,"nodeType":"RevertStatement","src":"34606:41:21"}]}},{"expression":{"arguments":[{"id":7719,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7696,"src":"34681:5:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7718,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"34674:6:21","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":7717,"name":"int256","nodeType":"ElementaryTypeName","src":"34674:6:21","typeDescriptions":{}}},"id":7720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"34674:13:21","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":7700,"id":7721,"nodeType":"Return","src":"34667:20:21"}]},"documentation":{"id":7694,"nodeType":"StructuredDocumentation","src":"34210:165:21","text":" @dev Converts an unsigned uint256 into a signed int256.\n Requirements:\n - input must be less than or equal to maxInt256."},"id":7723,"implemented":true,"kind":"function","modifiers":[],"name":"toInt256","nameLocation":"34389:8:21","nodeType":"FunctionDefinition","parameters":{"id":7697,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7696,"mutability":"mutable","name":"value","nameLocation":"34406:5:21","nodeType":"VariableDeclaration","scope":7723,"src":"34398:13:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7695,"name":"uint256","nodeType":"ElementaryTypeName","src":"34398:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"34397:15:21"},"returnParameters":{"id":7700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7699,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7723,"src":"34436:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7698,"name":"int256","nodeType":"ElementaryTypeName","src":"34436:6:21","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"34435:8:21"},"scope":7734,"src":"34380:314:21","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7732,"nodeType":"Block","src":"34853:87:21","statements":[{"AST":{"nativeSrc":"34888:46:21","nodeType":"YulBlock","src":"34888:46:21","statements":[{"nativeSrc":"34902:22:21","nodeType":"YulAssignment","src":"34902:22:21","value":{"arguments":[{"arguments":[{"name":"b","nativeSrc":"34921:1:21","nodeType":"YulIdentifier","src":"34921:1:21"}],"functionName":{"name":"iszero","nativeSrc":"34914:6:21","nodeType":"YulIdentifier","src":"34914:6:21"},"nativeSrc":"34914:9:21","nodeType":"YulFunctionCall","src":"34914:9:21"}],"functionName":{"name":"iszero","nativeSrc":"34907:6:21","nodeType":"YulIdentifier","src":"34907:6:21"},"nativeSrc":"34907:17:21","nodeType":"YulFunctionCall","src":"34907:17:21"},"variableNames":[{"name":"u","nativeSrc":"34902:1:21","nodeType":"YulIdentifier","src":"34902:1:21"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":7726,"isOffset":false,"isSlot":false,"src":"34921:1:21","valueSize":1},{"declaration":7729,"isOffset":false,"isSlot":false,"src":"34902:1:21","valueSize":1}],"flags":["memory-safe"],"id":7731,"nodeType":"InlineAssembly","src":"34863:71:21"}]},"documentation":{"id":7724,"nodeType":"StructuredDocumentation","src":"34700:90:21","text":" @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump."},"id":7733,"implemented":true,"kind":"function","modifiers":[],"name":"toUint","nameLocation":"34804:6:21","nodeType":"FunctionDefinition","parameters":{"id":7727,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7726,"mutability":"mutable","name":"b","nameLocation":"34816:1:21","nodeType":"VariableDeclaration","scope":7733,"src":"34811:6:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7725,"name":"bool","nodeType":"ElementaryTypeName","src":"34811:4:21","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"34810:8:21"},"returnParameters":{"id":7730,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7729,"mutability":"mutable","name":"u","nameLocation":"34850:1:21","nodeType":"VariableDeclaration","scope":7733,"src":"34842:9:21","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7728,"name":"uint256","nodeType":"ElementaryTypeName","src":"34842:7:21","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"34841:11:21"},"scope":7734,"src":"34795:145:21","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":7735,"src":"769:34173:21","usedErrors":[5979,5984,5991,5996],"usedEvents":[]}],"src":"192:34751:21"},"id":21},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"ast":{"absolutePath":"@openzeppelin/contracts/utils/math/SignedMath.sol","exportedSymbols":{"SafeCast":[7734],"SignedMath":[7878]},"id":7879,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7736,"literals":["solidity","^","0.8",".20"],"nodeType":"PragmaDirective","src":"109:24:22"},{"absolutePath":"@openzeppelin/contracts/utils/math/SafeCast.sol","file":"./SafeCast.sol","id":7738,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7879,"sourceUnit":7735,"src":"135:40:22","symbolAliases":[{"foreign":{"id":7737,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"143:8:22","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SignedMath","contractDependencies":[],"contractKind":"library","documentation":{"id":7739,"nodeType":"StructuredDocumentation","src":"177:80:22","text":" @dev Standard signed math utilities missing in the Solidity language."},"fullyImplemented":true,"id":7878,"linearizedBaseContracts":[7878],"name":"SignedMath","nameLocation":"266:10:22","nodeType":"ContractDefinition","nodes":[{"body":{"id":7768,"nodeType":"Block","src":"746:215:22","statements":[{"id":7767,"nodeType":"UncheckedBlock","src":"756:199:22","statements":[{"expression":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7751,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7746,"src":"894:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7752,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7744,"src":"900:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":7753,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7746,"src":"904:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"900:5:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7755,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"899:7:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"arguments":[{"arguments":[{"id":7760,"name":"condition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7742,"src":"932:9:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":7758,"name":"SafeCast","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7734,"src":"916:8:22","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeCast_$7734_$","typeString":"type(library SafeCast)"}},"id":7759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"925:6:22","memberName":"toUint","nodeType":"MemberAccess","referencedDeclaration":7733,"src":"916:15:22","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$returns$_t_uint256_$","typeString":"function (bool) pure returns (uint256)"}},"id":7761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"916:26:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7757,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"909:6:22","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":7756,"name":"int256","nodeType":"ElementaryTypeName","src":"909:6:22","typeDescriptions":{}}},"id":7762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"909:34:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"899:44:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7764,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"898:46:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"894:50:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":7750,"id":7766,"nodeType":"Return","src":"887:57:22"}]}]},"documentation":{"id":7740,"nodeType":"StructuredDocumentation","src":"283:374:22","text":" @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n one branch when needed, making this function more expensive."},"id":7769,"implemented":true,"kind":"function","modifiers":[],"name":"ternary","nameLocation":"671:7:22","nodeType":"FunctionDefinition","parameters":{"id":7747,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7742,"mutability":"mutable","name":"condition","nameLocation":"684:9:22","nodeType":"VariableDeclaration","scope":7769,"src":"679:14:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7741,"name":"bool","nodeType":"ElementaryTypeName","src":"679:4:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":7744,"mutability":"mutable","name":"a","nameLocation":"702:1:22","nodeType":"VariableDeclaration","scope":7769,"src":"695:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7743,"name":"int256","nodeType":"ElementaryTypeName","src":"695:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":7746,"mutability":"mutable","name":"b","nameLocation":"712:1:22","nodeType":"VariableDeclaration","scope":7769,"src":"705:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7745,"name":"int256","nodeType":"ElementaryTypeName","src":"705:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"678:36:22"},"returnParameters":{"id":7750,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7749,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7769,"src":"738:6:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7748,"name":"int256","nodeType":"ElementaryTypeName","src":"738:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"737:8:22"},"scope":7878,"src":"662:299:22","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7787,"nodeType":"Block","src":"1102:44:22","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7780,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7772,"src":"1127:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":7781,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7774,"src":"1131:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1127:5:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":7783,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7772,"src":"1134:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},{"id":7784,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7774,"src":"1137:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_int256","typeString":"int256"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7779,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7769,"src":"1119:7:22","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_int256_$_t_int256_$returns$_t_int256_$","typeString":"function (bool,int256,int256) pure returns (int256)"}},"id":7785,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1119:20:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":7778,"id":7786,"nodeType":"Return","src":"1112:27:22"}]},"documentation":{"id":7770,"nodeType":"StructuredDocumentation","src":"967:66:22","text":" @dev Returns the largest of two signed numbers."},"id":7788,"implemented":true,"kind":"function","modifiers":[],"name":"max","nameLocation":"1047:3:22","nodeType":"FunctionDefinition","parameters":{"id":7775,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7772,"mutability":"mutable","name":"a","nameLocation":"1058:1:22","nodeType":"VariableDeclaration","scope":7788,"src":"1051:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7771,"name":"int256","nodeType":"ElementaryTypeName","src":"1051:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":7774,"mutability":"mutable","name":"b","nameLocation":"1068:1:22","nodeType":"VariableDeclaration","scope":7788,"src":"1061:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7773,"name":"int256","nodeType":"ElementaryTypeName","src":"1061:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1050:20:22"},"returnParameters":{"id":7778,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7777,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7788,"src":"1094:6:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7776,"name":"int256","nodeType":"ElementaryTypeName","src":"1094:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1093:8:22"},"scope":7878,"src":"1038:108:22","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7806,"nodeType":"Block","src":"1288:44:22","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7799,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7791,"src":"1313:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":7800,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7793,"src":"1317:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1313:5:22","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":7802,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7791,"src":"1320:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},{"id":7803,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7793,"src":"1323:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_int256","typeString":"int256"},{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7798,"name":"ternary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7769,"src":"1305:7:22","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bool_$_t_int256_$_t_int256_$returns$_t_int256_$","typeString":"function (bool,int256,int256) pure returns (int256)"}},"id":7804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1305:20:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":7797,"id":7805,"nodeType":"Return","src":"1298:27:22"}]},"documentation":{"id":7789,"nodeType":"StructuredDocumentation","src":"1152:67:22","text":" @dev Returns the smallest of two signed numbers."},"id":7807,"implemented":true,"kind":"function","modifiers":[],"name":"min","nameLocation":"1233:3:22","nodeType":"FunctionDefinition","parameters":{"id":7794,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7791,"mutability":"mutable","name":"a","nameLocation":"1244:1:22","nodeType":"VariableDeclaration","scope":7807,"src":"1237:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7790,"name":"int256","nodeType":"ElementaryTypeName","src":"1237:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":7793,"mutability":"mutable","name":"b","nameLocation":"1254:1:22","nodeType":"VariableDeclaration","scope":7807,"src":"1247:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7792,"name":"int256","nodeType":"ElementaryTypeName","src":"1247:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1236:20:22"},"returnParameters":{"id":7797,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7796,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7807,"src":"1280:6:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7795,"name":"int256","nodeType":"ElementaryTypeName","src":"1280:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1279:8:22"},"scope":7878,"src":"1224:108:22","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7850,"nodeType":"Block","src":"1537:162:22","statements":[{"assignments":[7818],"declarations":[{"constant":false,"id":7818,"mutability":"mutable","name":"x","nameLocation":"1606:1:22","nodeType":"VariableDeclaration","scope":7850,"src":"1599:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7817,"name":"int256","nodeType":"ElementaryTypeName","src":"1599:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":7831,"initialValue":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7819,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"1611:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":7820,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7812,"src":"1615:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1611:5:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7822,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1610:7:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7825,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7823,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"1622:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":7824,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7812,"src":"1626:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1622:5:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7826,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1621:7:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"31","id":7827,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1632:1:22","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1621:12:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7829,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1620:14:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1610:24:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"VariableDeclarationStatement","src":"1599:35:22"},{"expression":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7832,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7818,"src":"1651:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":7840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":7837,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7818,"src":"1671:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7836,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1663:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":7835,"name":"uint256","nodeType":"ElementaryTypeName","src":"1663:7:22","typeDescriptions":{}}},"id":7838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1663:10:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"323535","id":7839,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1677:3:22","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"1663:17:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":7834,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1656:6:22","typeDescriptions":{"typeIdentifier":"t_type$_t_int256_$","typeString":"type(int256)"},"typeName":{"id":7833,"name":"int256","nodeType":"ElementaryTypeName","src":"1656:6:22","typeDescriptions":{}}},"id":7841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1656:25:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7842,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7810,"src":"1685:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":7843,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7812,"src":"1689:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1685:5:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7845,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1684:7:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1656:35:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7847,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"1655:37:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"1651:41:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"functionReturnParameters":7816,"id":7849,"nodeType":"Return","src":"1644:48:22"}]},"documentation":{"id":7808,"nodeType":"StructuredDocumentation","src":"1338:126:22","text":" @dev Returns the average of two signed numbers without overflow.\n The result is rounded towards zero."},"id":7851,"implemented":true,"kind":"function","modifiers":[],"name":"average","nameLocation":"1478:7:22","nodeType":"FunctionDefinition","parameters":{"id":7813,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7810,"mutability":"mutable","name":"a","nameLocation":"1493:1:22","nodeType":"VariableDeclaration","scope":7851,"src":"1486:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7809,"name":"int256","nodeType":"ElementaryTypeName","src":"1486:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"},{"constant":false,"id":7812,"mutability":"mutable","name":"b","nameLocation":"1503:1:22","nodeType":"VariableDeclaration","scope":7851,"src":"1496:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7811,"name":"int256","nodeType":"ElementaryTypeName","src":"1496:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1485:20:22"},"returnParameters":{"id":7816,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7815,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7851,"src":"1529:6:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7814,"name":"int256","nodeType":"ElementaryTypeName","src":"1529:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1528:8:22"},"scope":7878,"src":"1469:230:22","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":7876,"nodeType":"Block","src":"1843:767:22","statements":[{"id":7875,"nodeType":"UncheckedBlock","src":"1853:751:22","statements":[{"assignments":[7860],"declarations":[{"constant":false,"id":7860,"mutability":"mutable","name":"mask","nameLocation":"2424:4:22","nodeType":"VariableDeclaration","scope":7875,"src":"2417:11:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7859,"name":"int256","nodeType":"ElementaryTypeName","src":"2417:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"id":7864,"initialValue":{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7863,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7861,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7854,"src":"2431:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"323535","id":7862,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2436:3:22","typeDescriptions":{"typeIdentifier":"t_rational_255_by_1","typeString":"int_const 255"},"value":"255"},"src":"2431:8:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"VariableDeclarationStatement","src":"2417:22:22"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_int256","typeString":"int256"},"id":7869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":7867,"name":"n","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7854,"src":"2576:1:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":7868,"name":"mask","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7860,"src":"2580:4:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"2576:8:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"id":7870,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2575:10:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"nodeType":"BinaryOperation","operator":"^","rightExpression":{"id":7871,"name":"mask","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7860,"src":"2588:4:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"src":"2575:17:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_int256","typeString":"int256"}],"id":7866,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2567:7:22","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":7865,"name":"uint256","nodeType":"ElementaryTypeName","src":"2567:7:22","typeDescriptions":{}}},"id":7873,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2567:26:22","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":7858,"id":7874,"nodeType":"Return","src":"2560:33:22"}]}]},"documentation":{"id":7852,"nodeType":"StructuredDocumentation","src":"1705:78:22","text":" @dev Returns the absolute unsigned value of a signed value."},"id":7877,"implemented":true,"kind":"function","modifiers":[],"name":"abs","nameLocation":"1797:3:22","nodeType":"FunctionDefinition","parameters":{"id":7855,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7854,"mutability":"mutable","name":"n","nameLocation":"1808:1:22","nodeType":"VariableDeclaration","scope":7877,"src":"1801:8:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"},"typeName":{"id":7853,"name":"int256","nodeType":"ElementaryTypeName","src":"1801:6:22","typeDescriptions":{"typeIdentifier":"t_int256","typeString":"int256"}},"visibility":"internal"}],"src":"1800:10:22"},"returnParameters":{"id":7858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7857,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":7877,"src":"1834:7:22","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7856,"name":"uint256","nodeType":"ElementaryTypeName","src":"1834:7:22","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1833:9:22"},"scope":7878,"src":"1788:822:22","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":7879,"src":"258:2354:22","usedErrors":[],"usedEvents":[]}],"src":"109:2504:22"},"id":22},"contracts/CommonErrors.sol":{"ast":{"absolutePath":"contracts/CommonErrors.sol","exportedSymbols":{"EtherReceptionDisabled":[7883],"InconsistentArrayLengths":[7886],"TransferFailed":[7889]},"id":7890,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7880,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:23"},{"documentation":{"id":7881,"nodeType":"StructuredDocumentation","src":"58:84:23","text":"@notice Thrown when trying to transfer tokens without calldata to the contract."},"errorSelector":"7b5c3290","id":7883,"name":"EtherReceptionDisabled","nameLocation":"148:22:23","nodeType":"ErrorDefinition","parameters":{"id":7882,"nodeType":"ParameterList","parameters":[],"src":"170:2:23"},"src":"142:31:23"},{"documentation":{"id":7884,"nodeType":"StructuredDocumentation","src":"175:76:23","text":"@notice Thrown when the multiple related arrays have different lengths."},"errorSelector":"65825336","id":7886,"name":"InconsistentArrayLengths","nameLocation":"257:24:23","nodeType":"ErrorDefinition","parameters":{"id":7885,"nodeType":"ParameterList","parameters":[],"src":"281:2:23"},"src":"251:33:23"},{"documentation":{"id":7887,"nodeType":"StructuredDocumentation","src":"286:52:23","text":"@notice Thrown when an ETH transfer has failed."},"errorSelector":"90b8ec18","id":7889,"name":"TransferFailed","nameLocation":"344:14:23","nodeType":"ErrorDefinition","parameters":{"id":7888,"nodeType":"ParameterList","parameters":[],"src":"358:2:23"},"src":"338:23:23"}],"src":"32:330:23"},"id":23},"contracts/access/AccessControl.sol":{"ast":{"absolutePath":"contracts/access/AccessControl.sol","exportedSymbols":{"AccessControl":[7901],"AccessControlBase":[8091],"ContractOwnership":[7934]},"id":7902,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7891,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:24"},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./base/AccessControlBase.sol","id":7893,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7902,"sourceUnit":8092,"src":"58:63:24","symbolAliases":[{"foreign":{"id":7892,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"66:17:24","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./ContractOwnership.sol","id":7895,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7902,"sourceUnit":7935,"src":"122:58:24","symbolAliases":[{"foreign":{"id":7894,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"130:17:24","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7897,"name":"AccessControlBase","nameLocations":["384:17:24"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"384:17:24"},"id":7898,"nodeType":"InheritanceSpecifier","src":"384:17:24"},{"baseName":{"id":7899,"name":"ContractOwnership","nameLocations":["403:17:24"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"403:17:24"},"id":7900,"nodeType":"InheritanceSpecifier","src":"403:17:24"}],"canonicalName":"AccessControl","contractDependencies":[],"contractKind":"contract","documentation":{"id":7896,"nodeType":"StructuredDocumentation","src":"182:167:24","text":"@title Access control via roles management (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":7901,"linearizedBaseContracts":[7901,7934,11554,11579,8139,8091,1206,8562,8546],"name":"AccessControl","nameLocation":"367:13:24","nodeType":"ContractDefinition","nodes":[],"scope":7902,"src":"349:74:24","usedErrors":[8223,8246,11559],"usedEvents":[8269,8278,8287]}],"src":"32:392:24"},"id":24},"contracts/access/ContractOwnership.sol":{"ast":{"absolutePath":"contracts/access/ContractOwnership.sol","exportedSymbols":{"ContractOwnership":[7934],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"InterfaceDetection":[11554]},"id":7935,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7903,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:25"},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./libraries/ContractOwnershipStorage.sol","id":7905,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7935,"sourceUnit":9110,"src":"58:82:25","symbolAliases":[{"foreign":{"id":7904,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"66:24:25","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./base/ContractOwnershipBase.sol","id":7907,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7935,"sourceUnit":8140,"src":"141:71:25","symbolAliases":[{"foreign":{"id":7906,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"149:21:25","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../introspection/InterfaceDetection.sol","id":7909,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7935,"sourceUnit":11555,"src":"213:77:25","symbolAliases":[{"foreign":{"id":7908,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"221:18:25","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7911,"name":"ContractOwnershipBase","nameLocations":["549:21:25"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"549:21:25"},"id":7912,"nodeType":"InheritanceSpecifier","src":"549:21:25"},{"baseName":{"id":7913,"name":"InterfaceDetection","nameLocations":["572:18:25"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"572:18:25"},"id":7914,"nodeType":"InheritanceSpecifier","src":"572:18:25"}],"canonicalName":"ContractOwnership","contractDependencies":[],"contractKind":"contract","documentation":{"id":7910,"nodeType":"StructuredDocumentation","src":"292:218:25","text":"@title ERC173 Contract Ownership Standard (immutable version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":7934,"linearizedBaseContracts":[7934,11554,11579,8139,1206,8562],"name":"ContractOwnership","nameLocation":"528:17:25","nodeType":"ContractDefinition","nodes":[{"global":false,"id":7918,"libraryName":{"id":7915,"name":"ContractOwnershipStorage","nameLocations":["603:24:25"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"603:24:25"},"nodeType":"UsingForDirective","src":"597:67:25","typeName":{"id":7917,"nodeType":"UserDefinedTypeName","pathNode":{"id":7916,"name":"ContractOwnershipStorage.Layout","nameLocations":["632:24:25","657:6:25"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"632:31:25"},"referencedDeclaration":8882,"src":"632:31:25","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":7932,"nodeType":"Block","src":"998:80:25","statements":[{"expression":{"arguments":[{"id":7929,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7921,"src":"1058:12:25","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":7924,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1008:24:25","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":7926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1033:6:25","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1008:31:25","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":7927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1008:33:25","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":7928,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1042:15:25","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":8952,"src":"1008:49:25","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":7930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1008:63:25","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7931,"nodeType":"ExpressionStatement","src":"1008:63:25"}]},"documentation":{"id":7919,"nodeType":"StructuredDocumentation","src":"670:289:25","text":"@notice Initializes the storage with an initial contract owner.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner the initial contract owner."},"id":7933,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":7922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7921,"mutability":"mutable","name":"initialOwner","nameLocation":"984:12:25","nodeType":"VariableDeclaration","scope":7933,"src":"976:20:25","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":7920,"name":"address","nodeType":"ElementaryTypeName","src":"976:7:25","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"975:22:25"},"returnParameters":{"id":7923,"nodeType":"ParameterList","parameters":[],"src":"998:0:25"},"scope":7934,"src":"964:114:25","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":7935,"src":"510:570:25","usedErrors":[8246,11559],"usedEvents":[8287]}],"src":"32:1049:25"},"id":25},"contracts/access/SafeContractOwnership.sol":{"ast":{"absolutePath":"contracts/access/SafeContractOwnership.sol","exportedSymbols":{"InterfaceDetection":[11554],"SafeContractOwnership":[7967],"SafeContractOwnershipBase":[8214],"SafeContractOwnershipStorage":[9462]},"id":7968,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7936,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:26"},{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","file":"./libraries/SafeContractOwnershipStorage.sol","id":7938,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7968,"sourceUnit":9463,"src":"58:90:26","symbolAliases":[{"foreign":{"id":7937,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"66:28:26","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/SafeContractOwnershipBase.sol","file":"./base/SafeContractOwnershipBase.sol","id":7940,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7968,"sourceUnit":8215,"src":"149:79:26","symbolAliases":[{"foreign":{"id":7939,"name":"SafeContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8214,"src":"157:25:26","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../introspection/InterfaceDetection.sol","id":7942,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":7968,"sourceUnit":11555,"src":"229:77:26","symbolAliases":[{"foreign":{"id":7941,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"237:18:26","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7944,"name":"SafeContractOwnershipBase","nameLocations":["569:25:26"],"nodeType":"IdentifierPath","referencedDeclaration":8214,"src":"569:25:26"},"id":7945,"nodeType":"InheritanceSpecifier","src":"569:25:26"},{"baseName":{"id":7946,"name":"InterfaceDetection","nameLocations":["596:18:26"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"596:18:26"},"id":7947,"nodeType":"InheritanceSpecifier","src":"596:18:26"}],"canonicalName":"SafeContractOwnership","contractDependencies":[],"contractKind":"contract","documentation":{"id":7943,"nodeType":"StructuredDocumentation","src":"308:218:26","text":"@title ERC173 Contract Ownership Standard (immutable version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":7967,"linearizedBaseContracts":[7967,11554,11579,8214,1206,8588],"name":"SafeContractOwnership","nameLocation":"544:21:26","nodeType":"ContractDefinition","nodes":[{"global":false,"id":7951,"libraryName":{"id":7948,"name":"SafeContractOwnershipStorage","nameLocations":["627:28:26"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"627:28:26"},"nodeType":"UsingForDirective","src":"621:75:26","typeName":{"id":7950,"nodeType":"UserDefinedTypeName","pathNode":{"id":7949,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["660:28:26","689:6:26"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"660:35:26"},"referencedDeclaration":9144,"src":"660:35:26","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"body":{"id":7965,"nodeType":"Block","src":"1030:84:26","statements":[{"expression":{"arguments":[{"id":7962,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7954,"src":"1094:12:26","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":7957,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1040:28:26","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":7959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1069:6:26","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1040:35:26","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":7960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1040:37:26","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":7961,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1078:15:26","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":9214,"src":"1040:53:26","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address)"}},"id":7963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1040:67:26","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":7964,"nodeType":"ExpressionStatement","src":"1040:67:26"}]},"documentation":{"id":7952,"nodeType":"StructuredDocumentation","src":"702:289:26","text":"@notice Initializes the storage with an initial contract owner.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner the initial contract owner."},"id":7966,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":7955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7954,"mutability":"mutable","name":"initialOwner","nameLocation":"1016:12:26","nodeType":"VariableDeclaration","scope":7966,"src":"1008:20:26","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":7953,"name":"address","nodeType":"ElementaryTypeName","src":"1008:7:26","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1007:22:26"},"returnParameters":{"id":7956,"nodeType":"ParameterList","parameters":[],"src":"1030:0:26"},"scope":7967,"src":"996:118:26","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":7968,"src":"526:590:26","usedErrors":[8246,8251,11559],"usedEvents":[8287,8292]}],"src":"32:1085:26"},"id":26},"contracts/access/base/AccessControlBase.sol":{"ast":{"absolutePath":"contracts/access/base/AccessControlBase.sol","exportedSymbols":{"AccessControlBase":[8091],"AccessControlStorage":[8851],"Context":[1206],"ContractOwnershipStorage":[9109],"IAccessControl":[8546]},"id":8092,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":7969,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:27"},{"absolutePath":"contracts/access/interfaces/IAccessControl.sol","file":"./../../access/interfaces/IAccessControl.sol","id":7971,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8092,"sourceUnit":8547,"src":"58:76:27","symbolAliases":[{"foreign":{"id":7970,"name":"IAccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8546,"src":"66:14:27","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../libraries/AccessControlStorage.sol","id":7973,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8092,"sourceUnit":8852,"src":"135:77:27","symbolAliases":[{"foreign":{"id":7972,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"143:20:27","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../libraries/ContractOwnershipStorage.sol","id":7975,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8092,"sourceUnit":9110,"src":"213:85:27","symbolAliases":[{"foreign":{"id":7974,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"221:24:27","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":7977,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8092,"sourceUnit":1207,"src":"299:66:27","symbolAliases":[{"foreign":{"id":7976,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"307:7:27","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":7979,"name":"IAccessControl","nameLocations":["632:14:27"],"nodeType":"IdentifierPath","referencedDeclaration":8546,"src":"632:14:27"},"id":7980,"nodeType":"InheritanceSpecifier","src":"632:14:27"},{"baseName":{"id":7981,"name":"Context","nameLocations":["648:7:27"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"648:7:27"},"id":7982,"nodeType":"InheritanceSpecifier","src":"648:7:27"}],"canonicalName":"AccessControlBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":7978,"nodeType":"StructuredDocumentation","src":"367:226:27","text":"@title Access control via roles management (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":8091,"linearizedBaseContracts":[8091,1206,8546],"name":"AccessControlBase","nameLocation":"611:17:27","nodeType":"ContractDefinition","nodes":[{"global":false,"id":7986,"libraryName":{"id":7983,"name":"AccessControlStorage","nameLocations":["668:20:27"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"668:20:27"},"nodeType":"UsingForDirective","src":"662:59:27","typeName":{"id":7985,"nodeType":"UserDefinedTypeName","pathNode":{"id":7984,"name":"AccessControlStorage.Layout","nameLocations":["693:20:27","714:6:27"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"693:27:27"},"referencedDeclaration":8616,"src":"693:27:27","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"global":false,"id":7990,"libraryName":{"id":7987,"name":"ContractOwnershipStorage","nameLocations":["732:24:27"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"732:24:27"},"nodeType":"UsingForDirective","src":"726:67:27","typeName":{"id":7989,"nodeType":"UserDefinedTypeName","pathNode":{"id":7988,"name":"ContractOwnershipStorage.Layout","nameLocations":["761:24:27","786:6:27"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"761:31:27"},"referencedDeclaration":8882,"src":"761:31:27","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":8021,"nodeType":"Block","src":"1183:198:27","statements":[{"assignments":[7999],"declarations":[{"constant":false,"id":7999,"mutability":"mutable","name":"operator","nameLocation":"1201:8:27","nodeType":"VariableDeclaration","scope":8021,"src":"1193:16:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":7998,"name":"address","nodeType":"ElementaryTypeName","src":"1193:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8002,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":8000,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1212:10:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8001,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1212:12:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1193:31:27"},{"expression":{"arguments":[{"id":8008,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7999,"src":"1291:8:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8003,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1234:24:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":8005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1259:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1234:31:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":8006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1234:33:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8007,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1268:22:27","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1234:56:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":8009,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1234:66:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8010,"nodeType":"ExpressionStatement","src":"1234:66:27"},{"expression":{"arguments":[{"id":8016,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7993,"src":"1350:4:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8017,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7995,"src":"1356:7:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8018,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7999,"src":"1365:8:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8011,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1310:20:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":8013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1331:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1310:27:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":8014,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1310:29:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8015,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1340:9:27","memberName":"grantRole","nodeType":"MemberAccess","referencedDeclaration":8667,"src":"1310:39:27","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address,address)"}},"id":8019,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1310:64:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8020,"nodeType":"ExpressionStatement","src":"1310:64:27"}]},"documentation":{"id":7991,"nodeType":"StructuredDocumentation","src":"799:312:27","text":"@notice Grants a role to an account.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Emits a {RoleGranted} event if the account did not previously have the role.\n @param role The role to grant.\n @param account The account to grant the role to."},"functionSelector":"2f2ff15d","id":8022,"implemented":true,"kind":"function","modifiers":[],"name":"grantRole","nameLocation":"1125:9:27","nodeType":"FunctionDefinition","parameters":{"id":7996,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7993,"mutability":"mutable","name":"role","nameLocation":"1143:4:27","nodeType":"VariableDeclaration","scope":8022,"src":"1135:12:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":7992,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1135:7:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":7995,"mutability":"mutable","name":"account","nameLocation":"1157:7:27","nodeType":"VariableDeclaration","scope":8022,"src":"1149:15:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":7994,"name":"address","nodeType":"ElementaryTypeName","src":"1149:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1134:31:27"},"returnParameters":{"id":7997,"nodeType":"ParameterList","parameters":[],"src":"1183:0:27"},"scope":8091,"src":"1116:265:27","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":8053,"nodeType":"Block","src":"1770:199:27","statements":[{"assignments":[8031],"declarations":[{"constant":false,"id":8031,"mutability":"mutable","name":"operator","nameLocation":"1788:8:27","nodeType":"VariableDeclaration","scope":8053,"src":"1780:16:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8030,"name":"address","nodeType":"ElementaryTypeName","src":"1780:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8034,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":8032,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1799:10:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8033,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1799:12:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1780:31:27"},{"expression":{"arguments":[{"id":8040,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8031,"src":"1878:8:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8035,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1821:24:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":8037,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1846:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1821:31:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":8038,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1821:33:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8039,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1855:22:27","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1821:56:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":8041,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1821:66:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8042,"nodeType":"ExpressionStatement","src":"1821:66:27"},{"expression":{"arguments":[{"id":8048,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8025,"src":"1938:4:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8049,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8027,"src":"1944:7:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8050,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8031,"src":"1953:8:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8043,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1897:20:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":8045,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1918:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1897:27:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":8046,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1897:29:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8047,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1927:10:27","memberName":"revokeRole","nodeType":"MemberAccess","referencedDeclaration":8704,"src":"1897:40:27","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address,address)"}},"id":8051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1897:65:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8052,"nodeType":"ExpressionStatement","src":"1897:65:27"}]},"documentation":{"id":8023,"nodeType":"StructuredDocumentation","src":"1387:310:27","text":"@notice Revokes a role from an account.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Emits a {RoleRevoked} event if the account previously had the role.\n @param role The role to revoke.\n @param account The account to revoke the role from."},"functionSelector":"d547741f","id":8054,"implemented":true,"kind":"function","modifiers":[],"name":"revokeRole","nameLocation":"1711:10:27","nodeType":"FunctionDefinition","parameters":{"id":8028,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8025,"mutability":"mutable","name":"role","nameLocation":"1730:4:27","nodeType":"VariableDeclaration","scope":8054,"src":"1722:12:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8024,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1722:7:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8027,"mutability":"mutable","name":"account","nameLocation":"1744:7:27","nodeType":"VariableDeclaration","scope":8054,"src":"1736:15:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8026,"name":"address","nodeType":"ElementaryTypeName","src":"1736:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1721:31:27"},"returnParameters":{"id":8029,"nodeType":"ParameterList","parameters":[],"src":"1770:0:27"},"scope":8091,"src":"1702:267:27","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[8535],"body":{"id":8070,"nodeType":"Block","src":"2063:79:27","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8065,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2116:10:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8066,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2116:12:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8067,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8057,"src":"2130:4:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8060,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"2073:20:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":8062,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2094:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"2073:27:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":8063,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2073:29:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8064,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2103:12:27","memberName":"renounceRole","nodeType":"MemberAccess","referencedDeclaration":8739,"src":"2073:42:27","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8616_storage_ptr_$_t_address_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,address,bytes32)"}},"id":8068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2073:62:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8069,"nodeType":"ExpressionStatement","src":"2073:62:27"}]},"documentation":{"id":8055,"nodeType":"StructuredDocumentation","src":"1975:30:27","text":"@inheritdoc IAccessControl"},"functionSelector":"8bb9c5bf","id":8071,"implemented":true,"kind":"function","modifiers":[],"name":"renounceRole","nameLocation":"2019:12:27","nodeType":"FunctionDefinition","parameters":{"id":8058,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8057,"mutability":"mutable","name":"role","nameLocation":"2040:4:27","nodeType":"VariableDeclaration","scope":8071,"src":"2032:12:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8056,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2032:7:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2031:14:27"},"returnParameters":{"id":8059,"nodeType":"ParameterList","parameters":[],"src":"2063:0:27"},"scope":8091,"src":"2010:132:27","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[8545],"body":{"id":8089,"nodeType":"Block","src":"2277:76:27","statements":[{"expression":{"arguments":[{"id":8085,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8074,"src":"2332:4:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8086,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8076,"src":"2338:7:27","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8081,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"2294:20:27","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":8082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2315:6:27","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"2294:27:27","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":8083,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2294:29:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8084,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2324:7:27","memberName":"hasRole","nodeType":"MemberAccess","referencedDeclaration":8760,"src":"2294:37:27","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view returns (bool)"}},"id":8087,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2294:52:27","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":8080,"id":8088,"nodeType":"Return","src":"2287:59:27"}]},"documentation":{"id":8072,"nodeType":"StructuredDocumentation","src":"2148:30:27","text":"@inheritdoc IAccessControl"},"functionSelector":"91d14854","id":8090,"implemented":true,"kind":"function","modifiers":[],"name":"hasRole","nameLocation":"2192:7:27","nodeType":"FunctionDefinition","parameters":{"id":8077,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8074,"mutability":"mutable","name":"role","nameLocation":"2208:4:27","nodeType":"VariableDeclaration","scope":8090,"src":"2200:12:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8073,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2200:7:27","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8076,"mutability":"mutable","name":"account","nameLocation":"2222:7:27","nodeType":"VariableDeclaration","scope":8090,"src":"2214:15:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8075,"name":"address","nodeType":"ElementaryTypeName","src":"2214:7:27","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2199:31:27"},"returnParameters":{"id":8080,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8079,"mutability":"mutable","name":"hasRole_","nameLocation":"2267:8:27","nodeType":"VariableDeclaration","scope":8090,"src":"2262:13:27","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8078,"name":"bool","nodeType":"ElementaryTypeName","src":"2262:4:27","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2261:15:27"},"scope":8091,"src":"2183:170:27","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":8092,"src":"593:1762:27","usedErrors":[8223,8246],"usedEvents":[8269,8278]}],"src":"32:2324:27"},"id":27},"contracts/access/base/ContractOwnershipBase.sol":{"ast":{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"IERC173":[8562]},"id":8140,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8093,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:28"},{"absolutePath":"contracts/access/interfaces/IERC173.sol","file":"./../interfaces/IERC173.sol","id":8095,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8140,"sourceUnit":8563,"src":"58:52:28","symbolAliases":[{"foreign":{"id":8094,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"66:7:28","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../libraries/ContractOwnershipStorage.sol","id":8097,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8140,"sourceUnit":9110,"src":"111:85:28","symbolAliases":[{"foreign":{"id":8096,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"119:24:28","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":8099,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8140,"sourceUnit":1207,"src":"197:66:28","symbolAliases":[{"foreign":{"id":8098,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"205:7:28","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":8101,"name":"IERC173","nameLocations":["586:7:28"],"nodeType":"IdentifierPath","referencedDeclaration":8562,"src":"586:7:28"},"id":8102,"nodeType":"InheritanceSpecifier","src":"586:7:28"},{"baseName":{"id":8103,"name":"Context","nameLocations":["595:7:28"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"595:7:28"},"id":8104,"nodeType":"InheritanceSpecifier","src":"595:7:28"}],"canonicalName":"ContractOwnershipBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":8100,"nodeType":"StructuredDocumentation","src":"265:278:28","text":"@title ERC173 Contract Ownership Standard (proxiable version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":8139,"linearizedBaseContracts":[8139,1206,8562],"name":"ContractOwnershipBase","nameLocation":"561:21:28","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8108,"libraryName":{"id":8105,"name":"ContractOwnershipStorage","nameLocations":["615:24:28"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"615:24:28"},"nodeType":"UsingForDirective","src":"609:67:28","typeName":{"id":8107,"nodeType":"UserDefinedTypeName","pathNode":{"id":8106,"name":"ContractOwnershipStorage.Layout","nameLocations":["644:24:28","669:6:28"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"644:31:28"},"referencedDeclaration":8882,"src":"644:31:28","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"baseFunctions":[8561],"body":{"id":8120,"nodeType":"Block","src":"765:65:28","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8114,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"782:24:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":8115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"807:6:28","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"782:31:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":8116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"782:33:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8117,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"816:5:28","memberName":"owner","nodeType":"MemberAccess","referencedDeclaration":9029,"src":"782:39:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$returns$_t_address_$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer) view returns (address)"}},"id":8118,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"782:41:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8113,"id":8119,"nodeType":"Return","src":"775:48:28"}]},"documentation":{"id":8109,"nodeType":"StructuredDocumentation","src":"682:23:28","text":"@inheritdoc IERC173"},"functionSelector":"8da5cb5b","id":8121,"implemented":true,"kind":"function","modifiers":[],"name":"owner","nameLocation":"719:5:28","nodeType":"FunctionDefinition","parameters":{"id":8110,"nodeType":"ParameterList","parameters":[],"src":"724:2:28"},"returnParameters":{"id":8113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8112,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8121,"src":"756:7:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8111,"name":"address","nodeType":"ElementaryTypeName","src":"756:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"755:9:28"},"scope":8139,"src":"710:120:28","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[8555],"body":{"id":8137,"nodeType":"Block","src":"924:92:28","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8132,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"986:10:28","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"986:12:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8134,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8124,"src":"1000:8:28","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8127,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"934:24:28","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":8129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"959:6:28","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"934:31:28","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":8130,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"934:33:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8131,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"968:17:28","memberName":"transferOwnership","nodeType":"MemberAccess","referencedDeclaration":9016,"src":"934:51:28","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address,address)"}},"id":8135,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"934:75:28","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8136,"nodeType":"ExpressionStatement","src":"934:75:28"}]},"documentation":{"id":8122,"nodeType":"StructuredDocumentation","src":"836:23:28","text":"@inheritdoc IERC173"},"functionSelector":"f2fde38b","id":8138,"implemented":true,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"873:17:28","nodeType":"FunctionDefinition","parameters":{"id":8125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8124,"mutability":"mutable","name":"newOwner","nameLocation":"899:8:28","nodeType":"VariableDeclaration","scope":8138,"src":"891:16:28","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8123,"name":"address","nodeType":"ElementaryTypeName","src":"891:7:28","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"890:18:28"},"returnParameters":{"id":8126,"nodeType":"ParameterList","parameters":[],"src":"924:0:28"},"scope":8139,"src":"864:152:28","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":8140,"src":"543:475:28","usedErrors":[8246],"usedEvents":[8287]}],"src":"32:987:28"},"id":28},"contracts/access/base/SafeContractOwnershipBase.sol":{"ast":{"absolutePath":"contracts/access/base/SafeContractOwnershipBase.sol","exportedSymbols":{"Context":[1206],"IERC173Safe":[8588],"SafeContractOwnershipBase":[8214],"SafeContractOwnershipStorage":[9462]},"id":8215,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8141,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:29"},{"absolutePath":"contracts/access/interfaces/IERC173Safe.sol","file":"./../interfaces/IERC173Safe.sol","id":8143,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8215,"sourceUnit":8589,"src":"58:60:29","symbolAliases":[{"foreign":{"id":8142,"name":"IERC173Safe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8588,"src":"66:11:29","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","file":"./../libraries/SafeContractOwnershipStorage.sol","id":8145,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8215,"sourceUnit":9463,"src":"119:93:29","symbolAliases":[{"foreign":{"id":8144,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"127:28:29","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":8147,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8215,"sourceUnit":1207,"src":"213:66:29","symbolAliases":[{"foreign":{"id":8146,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"221:7:29","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":8149,"name":"IERC173Safe","nameLocations":["635:11:29"],"nodeType":"IdentifierPath","referencedDeclaration":8588,"src":"635:11:29"},"id":8150,"nodeType":"InheritanceSpecifier","src":"635:11:29"},{"baseName":{"id":8151,"name":"Context","nameLocations":["648:7:29"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"648:7:29"},"id":8152,"nodeType":"InheritanceSpecifier","src":"648:7:29"}],"canonicalName":"SafeContractOwnershipBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":8148,"nodeType":"StructuredDocumentation","src":"281:307:29","text":"@title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":8214,"linearizedBaseContracts":[8214,1206,8588],"name":"SafeContractOwnershipBase","nameLocation":"606:25:29","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8156,"libraryName":{"id":8153,"name":"SafeContractOwnershipStorage","nameLocations":["668:28:29"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"668:28:29"},"nodeType":"UsingForDirective","src":"662:75:29","typeName":{"id":8155,"nodeType":"UserDefinedTypeName","pathNode":{"id":8154,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["701:28:29","730:6:29"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"701:35:29"},"referencedDeclaration":9144,"src":"701:35:29","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"baseFunctions":[8571],"body":{"id":8172,"nodeType":"Block","src":"835:96:29","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8167,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"901:10:29","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"901:12:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8169,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8159,"src":"915:8:29","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8162,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"845:28:29","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":8164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"874:6:29","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"845:35:29","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":8165,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"845:37:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":8166,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"883:17:29","memberName":"transferOwnership","nodeType":"MemberAccess","referencedDeclaration":9312,"src":"845:55:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address,address)"}},"id":8170,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"845:79:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8171,"nodeType":"ExpressionStatement","src":"845:79:29"}]},"documentation":{"id":8157,"nodeType":"StructuredDocumentation","src":"743:27:29","text":"@inheritdoc IERC173Safe"},"functionSelector":"f2fde38b","id":8173,"implemented":true,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"784:17:29","nodeType":"FunctionDefinition","parameters":{"id":8160,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8159,"mutability":"mutable","name":"newOwner","nameLocation":"810:8:29","nodeType":"VariableDeclaration","scope":8173,"src":"802:16:29","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8158,"name":"address","nodeType":"ElementaryTypeName","src":"802:7:29","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"801:18:29"},"returnParameters":{"id":8161,"nodeType":"ParameterList","parameters":[],"src":"835:0:29"},"scope":8214,"src":"775:156:29","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[8575],"body":{"id":8186,"nodeType":"Block","src":"1011:84:29","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8182,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1075:10:29","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1075:12:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8177,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1021:28:29","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":8179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1050:6:29","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1021:35:29","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":8180,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1021:37:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":8181,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1059:15:29","memberName":"acceptOwnership","nodeType":"MemberAccess","referencedDeclaration":9356,"src":"1021:53:29","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address)"}},"id":8184,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1021:67:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8185,"nodeType":"ExpressionStatement","src":"1021:67:29"}]},"documentation":{"id":8174,"nodeType":"StructuredDocumentation","src":"937:27:29","text":"@inheritdoc IERC173Safe"},"functionSelector":"79ba5097","id":8187,"implemented":true,"kind":"function","modifiers":[],"name":"acceptOwnership","nameLocation":"978:15:29","nodeType":"FunctionDefinition","parameters":{"id":8175,"nodeType":"ParameterList","parameters":[],"src":"993:2:29"},"returnParameters":{"id":8176,"nodeType":"ParameterList","parameters":[],"src":"1011:0:29"},"scope":8214,"src":"969:126:29","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[8581],"body":{"id":8199,"nodeType":"Block","src":"1188:69:29","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8193,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1205:28:29","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":8194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1234:6:29","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1205:35:29","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":8195,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1205:37:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":8196,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1243:5:29","memberName":"owner","nodeType":"MemberAccess","referencedDeclaration":9369,"src":"1205:43:29","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$9144_storage_ptr_$returns$_t_address_$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer) view returns (address)"}},"id":8197,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1205:45:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8192,"id":8198,"nodeType":"Return","src":"1198:52:29"}]},"documentation":{"id":8188,"nodeType":"StructuredDocumentation","src":"1101:27:29","text":"@inheritdoc IERC173Safe"},"functionSelector":"8da5cb5b","id":8200,"implemented":true,"kind":"function","modifiers":[],"name":"owner","nameLocation":"1142:5:29","nodeType":"FunctionDefinition","parameters":{"id":8189,"nodeType":"ParameterList","parameters":[],"src":"1147:2:29"},"returnParameters":{"id":8192,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8191,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8200,"src":"1179:7:29","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8190,"name":"address","nodeType":"ElementaryTypeName","src":"1179:7:29","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1178:9:29"},"scope":8214,"src":"1133:124:29","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[8587],"body":{"id":8212,"nodeType":"Block","src":"1357:76:29","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8206,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1374:28:29","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":8207,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1403:6:29","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1374:35:29","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":8208,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1374:37:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":8209,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1412:12:29","memberName":"pendingOwner","nodeType":"MemberAccess","referencedDeclaration":9382,"src":"1374:50:29","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$9144_storage_ptr_$returns$_t_address_$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer) view returns (address)"}},"id":8210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1374:52:29","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8205,"id":8211,"nodeType":"Return","src":"1367:59:29"}]},"documentation":{"id":8201,"nodeType":"StructuredDocumentation","src":"1263:27:29","text":"@inheritdoc IERC173Safe"},"functionSelector":"e30c3978","id":8213,"implemented":true,"kind":"function","modifiers":[],"name":"pendingOwner","nameLocation":"1304:12:29","nodeType":"FunctionDefinition","parameters":{"id":8202,"nodeType":"ParameterList","parameters":[],"src":"1316:2:29"},"returnParameters":{"id":8205,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8204,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8213,"src":"1348:7:29","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8203,"name":"address","nodeType":"ElementaryTypeName","src":"1348:7:29","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1347:9:29"},"scope":8214,"src":"1295:138:29","stateMutability":"view","virtual":true,"visibility":"public"}],"scope":8215,"src":"588:847:29","usedErrors":[8246,8251],"usedEvents":[8287,8292]}],"src":"32:1404:29"},"id":29},"contracts/access/errors/AccessControlErrors.sol":{"ast":{"absolutePath":"contracts/access/errors/AccessControlErrors.sol","exportedSymbols":{"NotRoleHolder":[8223],"NotTargetContractRoleHolder":[8232]},"id":8233,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8216,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:30"},{"documentation":{"id":8217,"nodeType":"StructuredDocumentation","src":"58:165:30","text":"@notice Thrown when an account does not have the required role.\n @param role The role the caller is missing.\n @param account The account that was checked."},"errorSelector":"7aa72882","id":8223,"name":"NotRoleHolder","nameLocation":"229:13:30","nodeType":"ErrorDefinition","parameters":{"id":8222,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8219,"mutability":"mutable","name":"role","nameLocation":"251:4:30","nodeType":"VariableDeclaration","scope":8223,"src":"243:12:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8218,"name":"bytes32","nodeType":"ElementaryTypeName","src":"243:7:30","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8221,"mutability":"mutable","name":"account","nameLocation":"265:7:30","nodeType":"VariableDeclaration","scope":8223,"src":"257:15:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8220,"name":"address","nodeType":"ElementaryTypeName","src":"257:7:30","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"242:31:30"},"src":"223:51:30"},{"documentation":{"id":8224,"nodeType":"StructuredDocumentation","src":"276:238:30","text":"@notice Thrown when an account does not have the required role on a target contract.\n @param targetContract The contract that was checked.\n @param role The role that was checked.\n @param account The account that was checked."},"errorSelector":"7a436c16","id":8232,"name":"NotTargetContractRoleHolder","nameLocation":"520:27:30","nodeType":"ErrorDefinition","parameters":{"id":8231,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8226,"mutability":"mutable","name":"targetContract","nameLocation":"556:14:30","nodeType":"VariableDeclaration","scope":8232,"src":"548:22:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8225,"name":"address","nodeType":"ElementaryTypeName","src":"548:7:30","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8228,"mutability":"mutable","name":"role","nameLocation":"580:4:30","nodeType":"VariableDeclaration","scope":8232,"src":"572:12:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8227,"name":"bytes32","nodeType":"ElementaryTypeName","src":"572:7:30","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8230,"mutability":"mutable","name":"account","nameLocation":"594:7:30","nodeType":"VariableDeclaration","scope":8232,"src":"586:15:30","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8229,"name":"address","nodeType":"ElementaryTypeName","src":"586:7:30","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"547:55:30"},"src":"514:89:30"}],"src":"32:572:30"},"id":30},"contracts/access/errors/Common.sol":{"ast":{"absolutePath":"contracts/access/errors/Common.sol","exportedSymbols":{"TargetIsNotAContract":[8239]},"id":8240,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8234,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:31"},{"documentation":{"id":8235,"nodeType":"StructuredDocumentation","src":"58:128:31","text":"@notice Thrown when the target contract is actually not a contract.\n @param targetContract The contract that was checked"},"errorSelector":"73a5b5e3","id":8239,"name":"TargetIsNotAContract","nameLocation":"192:20:31","nodeType":"ErrorDefinition","parameters":{"id":8238,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8237,"mutability":"mutable","name":"targetContract","nameLocation":"221:14:31","nodeType":"VariableDeclaration","scope":8239,"src":"213:22:31","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8236,"name":"address","nodeType":"ElementaryTypeName","src":"213:7:31","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"212:24:31"},"src":"186:51:31"}],"src":"32:206:31"},"id":31},"contracts/access/errors/ContractOwnershipErrors.sol":{"ast":{"absolutePath":"contracts/access/errors/ContractOwnershipErrors.sol","exportedSymbols":{"NotContractOwner":[8246],"NotPendingContractOwner":[8251],"NotTargetContractOwner":[8258]},"id":8259,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8241,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:32"},{"documentation":{"id":8242,"nodeType":"StructuredDocumentation","src":"58:130:32","text":"@notice Thrown when an account is not the contract owner but is required to.\n @param account The account that was checked."},"errorSelector":"2ef4875e","id":8246,"name":"NotContractOwner","nameLocation":"194:16:32","nodeType":"ErrorDefinition","parameters":{"id":8245,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8244,"mutability":"mutable","name":"account","nameLocation":"219:7:32","nodeType":"VariableDeclaration","scope":8246,"src":"211:15:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8243,"name":"address","nodeType":"ElementaryTypeName","src":"211:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"210:17:32"},"src":"188:40:32"},{"documentation":{"id":8247,"nodeType":"StructuredDocumentation","src":"230:138:32","text":"@notice Thrown when an account is not the pending contract owner but is required to.\n @param account The account that was checked."},"errorSelector":"61848752","id":8251,"name":"NotPendingContractOwner","nameLocation":"374:23:32","nodeType":"ErrorDefinition","parameters":{"id":8250,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8249,"mutability":"mutable","name":"account","nameLocation":"406:7:32","nodeType":"VariableDeclaration","scope":8251,"src":"398:15:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8248,"name":"address","nodeType":"ElementaryTypeName","src":"398:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"397:17:32"},"src":"368:47:32"},{"documentation":{"id":8252,"nodeType":"StructuredDocumentation","src":"417:194:32","text":"@notice Thrown when an account is not the target contract owner but is required to.\n @param targetContract The contract that was checked.\n @param account The account that was checked."},"errorSelector":"29b9b08b","id":8258,"name":"NotTargetContractOwner","nameLocation":"617:22:32","nodeType":"ErrorDefinition","parameters":{"id":8257,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8254,"mutability":"mutable","name":"targetContract","nameLocation":"648:14:32","nodeType":"VariableDeclaration","scope":8258,"src":"640:22:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8253,"name":"address","nodeType":"ElementaryTypeName","src":"640:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8256,"mutability":"mutable","name":"account","nameLocation":"672:7:32","nodeType":"VariableDeclaration","scope":8258,"src":"664:15:32","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8255,"name":"address","nodeType":"ElementaryTypeName","src":"664:7:32","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"639:41:32"},"src":"611:70:32"}],"src":"32:650:32"},"id":32},"contracts/access/events/AccessControlEvents.sol":{"ast":{"absolutePath":"contracts/access/events/AccessControlEvents.sol","exportedSymbols":{"RoleGranted":[8269],"RoleRevoked":[8278]},"id":8279,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8260,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:33"},{"anonymous":false,"documentation":{"id":8261,"nodeType":"StructuredDocumentation","src":"58:223:33","text":"@notice Emitted when `role` is granted to `account`.\n @param role The role that has been granted.\n @param account The account that has been granted the role.\n @param operator The account that granted the role."},"eventSelector":"2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d","id":8269,"name":"RoleGranted","nameLocation":"287:11:33","nodeType":"EventDefinition","parameters":{"id":8268,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8263,"indexed":false,"mutability":"mutable","name":"role","nameLocation":"307:4:33","nodeType":"VariableDeclaration","scope":8269,"src":"299:12:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8262,"name":"bytes32","nodeType":"ElementaryTypeName","src":"299:7:33","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8265,"indexed":false,"mutability":"mutable","name":"account","nameLocation":"321:7:33","nodeType":"VariableDeclaration","scope":8269,"src":"313:15:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8264,"name":"address","nodeType":"ElementaryTypeName","src":"313:7:33","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8267,"indexed":false,"mutability":"mutable","name":"operator","nameLocation":"338:8:33","nodeType":"VariableDeclaration","scope":8269,"src":"330:16:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8266,"name":"address","nodeType":"ElementaryTypeName","src":"330:7:33","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"298:49:33"},"src":"281:67:33"},{"anonymous":false,"documentation":{"id":8270,"nodeType":"StructuredDocumentation","src":"350:225:33","text":"@notice Emitted when `role` is revoked from `account`.\n @param role The role that has been revoked.\n @param account The account that has been revoked the role.\n @param operator The account that revoked the role."},"eventSelector":"f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b","id":8278,"name":"RoleRevoked","nameLocation":"581:11:33","nodeType":"EventDefinition","parameters":{"id":8277,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8272,"indexed":false,"mutability":"mutable","name":"role","nameLocation":"601:4:33","nodeType":"VariableDeclaration","scope":8278,"src":"593:12:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8271,"name":"bytes32","nodeType":"ElementaryTypeName","src":"593:7:33","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8274,"indexed":false,"mutability":"mutable","name":"account","nameLocation":"615:7:33","nodeType":"VariableDeclaration","scope":8278,"src":"607:15:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8273,"name":"address","nodeType":"ElementaryTypeName","src":"607:7:33","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8276,"indexed":false,"mutability":"mutable","name":"operator","nameLocation":"632:8:33","nodeType":"VariableDeclaration","scope":8278,"src":"624:16:33","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8275,"name":"address","nodeType":"ElementaryTypeName","src":"624:7:33","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"592:49:33"},"src":"575:67:33"}],"src":"32:611:33"},"id":33},"contracts/access/events/ERC173Events.sol":{"ast":{"absolutePath":"contracts/access/events/ERC173Events.sol","exportedSymbols":{"OwnershipTransferPending":[8292],"OwnershipTransferred":[8287]},"id":8293,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8280,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:34"},{"anonymous":false,"documentation":{"id":8281,"nodeType":"StructuredDocumentation","src":"58:155:34","text":"@notice Emitted when the contract ownership changes.\n @param previousOwner the previous contract owner.\n @param newOwner the new contract owner."},"eventSelector":"8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","id":8287,"name":"OwnershipTransferred","nameLocation":"219:20:34","nodeType":"EventDefinition","parameters":{"id":8286,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8283,"indexed":true,"mutability":"mutable","name":"previousOwner","nameLocation":"256:13:34","nodeType":"VariableDeclaration","scope":8287,"src":"240:29:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8282,"name":"address","nodeType":"ElementaryTypeName","src":"240:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8285,"indexed":true,"mutability":"mutable","name":"newOwner","nameLocation":"287:8:34","nodeType":"VariableDeclaration","scope":8287,"src":"271:24:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8284,"name":"address","nodeType":"ElementaryTypeName","src":"271:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"239:57:34"},"src":"213:84:34"},{"anonymous":false,"documentation":{"id":8288,"nodeType":"StructuredDocumentation","src":"299:121:34","text":"@notice Emitted when a new contract owner is pending.\n @param pendingOwner the address of the new contract owner."},"eventSelector":"fcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568","id":8292,"name":"OwnershipTransferPending","nameLocation":"426:24:34","nodeType":"EventDefinition","parameters":{"id":8291,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8290,"indexed":true,"mutability":"mutable","name":"pendingOwner","nameLocation":"467:12:34","nodeType":"VariableDeclaration","scope":8292,"src":"451:28:34","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8289,"name":"address","nodeType":"ElementaryTypeName","src":"451:7:34","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"450:30:34"},"src":"420:61:34"}],"src":"32:450:34"},"id":34},"contracts/access/facets/AccessControlFacet.sol":{"ast":{"absolutePath":"contracts/access/facets/AccessControlFacet.sol","exportedSymbols":{"AccessControlBase":[8091],"AccessControlFacet":[8346],"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":8347,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8294,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:35"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":8296,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8347,"sourceUnit":13387,"src":"57:84:35","symbolAliases":[{"foreign":{"id":8295,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:35","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../base/AccessControlBase.sol","id":8298,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8347,"sourceUnit":8092,"src":"142:66:35","symbolAliases":[{"foreign":{"id":8297,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"150:17:35","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":8300,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8347,"sourceUnit":1207,"src":"209:66:35","symbolAliases":[{"foreign":{"id":8299,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"217:7:35","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":8302,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8347,"sourceUnit":13298,"src":"276:98:35","symbolAliases":[{"foreign":{"id":8301,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"284:28:35","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":8304,"name":"AccessControlBase","nameLocations":["662:17:35"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"662:17:35"},"id":8305,"nodeType":"InheritanceSpecifier","src":"662:17:35"},{"baseName":{"id":8306,"name":"ForwarderRegistryContextBase","nameLocations":["681:28:35"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"681:28:35"},"id":8307,"nodeType":"InheritanceSpecifier","src":"681:28:35"}],"canonicalName":"AccessControlFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":8303,"nodeType":"StructuredDocumentation","src":"376:255:35","text":"@title Access control via roles management (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ContractOwnershipFacet}."},"fullyImplemented":true,"id":8346,"linearizedBaseContracts":[8346,13297,8091,1206,8546],"name":"AccessControlFacet","nameLocation":"640:18:35","nodeType":"ContractDefinition","nodes":[{"body":{"id":8316,"nodeType":"Block","src":"814:2:35","statements":[]},"id":8317,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":8313,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8310,"src":"795:17:35","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":8314,"kind":"baseConstructorSpecifier","modifierName":{"id":8312,"name":"ForwarderRegistryContextBase","nameLocations":["766:28:35"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"766:28:35"},"nodeType":"ModifierInvocation","src":"766:47:35"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":8311,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8310,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"747:17:35","nodeType":"VariableDeclaration","scope":8317,"src":"728:36:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":8309,"nodeType":"UserDefinedTypeName","pathNode":{"id":8308,"name":"IForwarderRegistry","nameLocations":["728:18:35"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"728:18:35"},"referencedDeclaration":13386,"src":"728:18:35","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"727:38:35"},"returnParameters":{"id":8315,"nodeType":"ParameterList","parameters":[],"src":"814:0:35"},"scope":8346,"src":"716:100:35","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":8330,"nodeType":"Block","src":"981:65:35","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8326,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"998:28:35","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8327,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1027:10:35","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"998:39:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"998:41:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8325,"id":8329,"nodeType":"Return","src":"991:48:35"}]},"documentation":{"id":8318,"nodeType":"StructuredDocumentation","src":"822:44:35","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8331,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"880:10:35","nodeType":"FunctionDefinition","overrides":{"id":8322,"nodeType":"OverrideSpecifier","overrides":[{"id":8320,"name":"Context","nameLocations":["924:7:35"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"924:7:35"},{"id":8321,"name":"ForwarderRegistryContextBase","nameLocations":["933:28:35"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"933:28:35"}],"src":"915:47:35"},"parameters":{"id":8319,"nodeType":"ParameterList","parameters":[],"src":"890:2:35"},"returnParameters":{"id":8325,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8324,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8331,"src":"972:7:35","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8323,"name":"address","nodeType":"ElementaryTypeName","src":"972:7:35","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"971:9:35"},"scope":8346,"src":"871:175:35","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":8344,"nodeType":"Block","src":"1216:63:35","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8340,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1233:28:35","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1262:8:35","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1233:37:35","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":8342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1233:39:35","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":8339,"id":8343,"nodeType":"Return","src":"1226:46:35"}]},"documentation":{"id":8332,"nodeType":"StructuredDocumentation","src":"1052:44:35","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8345,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1110:8:35","nodeType":"FunctionDefinition","overrides":{"id":8336,"nodeType":"OverrideSpecifier","overrides":[{"id":8334,"name":"Context","nameLocations":["1152:7:35"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1152:7:35"},{"id":8335,"name":"ForwarderRegistryContextBase","nameLocations":["1161:28:35"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1161:28:35"}],"src":"1143:47:35"},"parameters":{"id":8333,"nodeType":"ParameterList","parameters":[],"src":"1118:2:35"},"returnParameters":{"id":8339,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8338,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8345,"src":"1200:14:35","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8337,"name":"bytes","nodeType":"ElementaryTypeName","src":"1200:5:35","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1199:16:35"},"scope":8346,"src":"1101:178:35","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":8347,"src":"631:650:35","usedErrors":[8223,8246],"usedEvents":[8269,8278]}],"src":"32:1250:35"},"id":35},"contracts/access/facets/ContractOwnershipFacet.sol":{"ast":{"absolutePath":"contracts/access/facets/ContractOwnershipFacet.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipFacet":[8436],"ContractOwnershipStorage":[9109],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":8437,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8348,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:36"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":8350,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":13387,"src":"57:84:36","symbolAliases":[{"foreign":{"id":8349,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../libraries/ContractOwnershipStorage.sol","id":8352,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":9110,"src":"142:85:36","symbolAliases":[{"foreign":{"id":8351,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"150:24:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":8354,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":19478,"src":"228:80:36","symbolAliases":[{"foreign":{"id":8353,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"236:17:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../base/ContractOwnershipBase.sol","id":8356,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":8140,"src":"309:74:36","symbolAliases":[{"foreign":{"id":8355,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"317:21:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":8358,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":1207,"src":"384:66:36","symbolAliases":[{"foreign":{"id":8357,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"392:7:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":8360,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8437,"sourceUnit":13298,"src":"451:98:36","symbolAliases":[{"foreign":{"id":8359,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"459:28:36","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":8362,"name":"ContractOwnershipBase","nameLocations":["915:21:36"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"915:21:36"},"id":8363,"nodeType":"InheritanceSpecifier","src":"915:21:36"},{"baseName":{"id":8364,"name":"ForwarderRegistryContextBase","nameLocations":["938:28:36"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"938:28:36"},"id":8365,"nodeType":"InheritanceSpecifier","src":"938:28:36"}],"canonicalName":"ContractOwnershipFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":8361,"nodeType":"StructuredDocumentation","src":"551:329:36","text":"@title ERC173 Contract Ownership Standard (facet version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":8436,"linearizedBaseContracts":[8436,13297,8139,1206,8562],"name":"ContractOwnershipFacet","nameLocation":"889:22:36","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8369,"libraryName":{"id":8366,"name":"ProxyAdminStorage","nameLocations":["979:17:36"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"979:17:36"},"nodeType":"UsingForDirective","src":"973:53:36","typeName":{"id":8368,"nodeType":"UserDefinedTypeName","pathNode":{"id":8367,"name":"ProxyAdminStorage.Layout","nameLocations":["1001:17:36","1019:6:36"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1001:24:36"},"referencedDeclaration":19308,"src":"1001:24:36","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":8373,"libraryName":{"id":8370,"name":"ContractOwnershipStorage","nameLocations":["1037:24:36"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"1037:24:36"},"nodeType":"UsingForDirective","src":"1031:67:36","typeName":{"id":8372,"nodeType":"UserDefinedTypeName","pathNode":{"id":8371,"name":"ContractOwnershipStorage.Layout","nameLocations":["1066:24:36","1091:6:36"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"1066:31:36"},"referencedDeclaration":8882,"src":"1066:31:36","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":8382,"nodeType":"Block","src":"1202:2:36","statements":[]},"id":8383,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":8379,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8376,"src":"1183:17:36","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":8380,"kind":"baseConstructorSpecifier","modifierName":{"id":8378,"name":"ForwarderRegistryContextBase","nameLocations":["1154:28:36"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1154:28:36"},"nodeType":"ModifierInvocation","src":"1154:47:36"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":8377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8376,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1135:17:36","nodeType":"VariableDeclaration","scope":8383,"src":"1116:36:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":8375,"nodeType":"UserDefinedTypeName","pathNode":{"id":8374,"name":"IForwarderRegistry","nameLocations":["1116:18:36"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1116:18:36"},"referencedDeclaration":13386,"src":"1116:18:36","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1115:38:36"},"returnParameters":{"id":8381,"nodeType":"ParameterList","parameters":[],"src":"1202:0:36"},"scope":8436,"src":"1104:100:36","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":8406,"nodeType":"Block","src":"1851:144:36","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8394,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[8421],"referencedDeclaration":8421,"src":"1908:10:36","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1908:12:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8389,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1861:17:36","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":8391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1879:6:36","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1861:24:36","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":8392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1861:26:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":8393,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1888:19:36","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1861:46:36","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":8396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1861:60:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8397,"nodeType":"ExpressionStatement","src":"1861:60:36"},{"expression":{"arguments":[{"id":8403,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8386,"src":"1975:12:36","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8398,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1931:24:36","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":8400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1956:6:36","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1931:31:36","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":8401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1931:33:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8402,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1965:9:36","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"1931:43:36","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":8404,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1931:57:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8405,"nodeType":"ExpressionStatement","src":"1931:57:36"}]},"documentation":{"id":8384,"nodeType":"StructuredDocumentation","src":"1210:567:36","text":"@notice Initializes the storage with an initial contract owner (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"functionSelector":"63e340d6","id":8407,"implemented":true,"kind":"function","modifiers":[],"name":"initContractOwnershipStorage","nameLocation":"1791:28:36","nodeType":"FunctionDefinition","parameters":{"id":8387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8386,"mutability":"mutable","name":"initialOwner","nameLocation":"1828:12:36","nodeType":"VariableDeclaration","scope":8407,"src":"1820:20:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8385,"name":"address","nodeType":"ElementaryTypeName","src":"1820:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1819:22:36"},"returnParameters":{"id":8388,"nodeType":"ParameterList","parameters":[],"src":"1851:0:36"},"scope":8436,"src":"1782:213:36","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":8420,"nodeType":"Block","src":"2160:65:36","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8416,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2177:28:36","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2206:10:36","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2177:39:36","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8418,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2177:41:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8415,"id":8419,"nodeType":"Return","src":"2170:48:36"}]},"documentation":{"id":8408,"nodeType":"StructuredDocumentation","src":"2001:44:36","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8421,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"2059:10:36","nodeType":"FunctionDefinition","overrides":{"id":8412,"nodeType":"OverrideSpecifier","overrides":[{"id":8410,"name":"Context","nameLocations":["2103:7:36"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2103:7:36"},{"id":8411,"name":"ForwarderRegistryContextBase","nameLocations":["2112:28:36"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2112:28:36"}],"src":"2094:47:36"},"parameters":{"id":8409,"nodeType":"ParameterList","parameters":[],"src":"2069:2:36"},"returnParameters":{"id":8415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8414,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8421,"src":"2151:7:36","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8413,"name":"address","nodeType":"ElementaryTypeName","src":"2151:7:36","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2150:9:36"},"scope":8436,"src":"2050:175:36","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":8434,"nodeType":"Block","src":"2395:63:36","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8430,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2412:28:36","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2441:8:36","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2412:37:36","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":8432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2412:39:36","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":8429,"id":8433,"nodeType":"Return","src":"2405:46:36"}]},"documentation":{"id":8422,"nodeType":"StructuredDocumentation","src":"2231:44:36","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8435,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2289:8:36","nodeType":"FunctionDefinition","overrides":{"id":8426,"nodeType":"OverrideSpecifier","overrides":[{"id":8424,"name":"Context","nameLocations":["2331:7:36"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2331:7:36"},{"id":8425,"name":"ForwarderRegistryContextBase","nameLocations":["2340:28:36"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2340:28:36"}],"src":"2322:47:36"},"parameters":{"id":8423,"nodeType":"ParameterList","parameters":[],"src":"2297:2:36"},"returnParameters":{"id":8429,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8428,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8435,"src":"2379:14:36","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8427,"name":"bytes","nodeType":"ElementaryTypeName","src":"2379:5:36","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2378:16:36"},"scope":8436,"src":"2280:178:36","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":8437,"src":"880:1580:36","usedErrors":[8246,11559,19183,19192],"usedEvents":[8287]}],"src":"32:2429:36"},"id":36},"contracts/access/facets/SafeContractOwnershipFacet.sol":{"ast":{"absolutePath":"contracts/access/facets/SafeContractOwnershipFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477],"SafeContractOwnershipBase":[8214],"SafeContractOwnershipFacet":[8526],"SafeContractOwnershipStorage":[9462]},"id":8527,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8438,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:37"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":8440,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":13387,"src":"57:84:37","symbolAliases":[{"foreign":{"id":8439,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","file":"./../libraries/SafeContractOwnershipStorage.sol","id":8442,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":9463,"src":"142:93:37","symbolAliases":[{"foreign":{"id":8441,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"150:28:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":8444,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":19478,"src":"236:80:37","symbolAliases":[{"foreign":{"id":8443,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"244:17:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/SafeContractOwnershipBase.sol","file":"./../base/SafeContractOwnershipBase.sol","id":8446,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":8215,"src":"317:82:37","symbolAliases":[{"foreign":{"id":8445,"name":"SafeContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8214,"src":"325:25:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":8448,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":1207,"src":"400:66:37","symbolAliases":[{"foreign":{"id":8447,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"408:7:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":8450,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8527,"sourceUnit":13298,"src":"467:98:37","symbolAliases":[{"foreign":{"id":8449,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"475:28:37","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":8452,"name":"SafeContractOwnershipBase","nameLocations":["935:25:37"],"nodeType":"IdentifierPath","referencedDeclaration":8214,"src":"935:25:37"},"id":8453,"nodeType":"InheritanceSpecifier","src":"935:25:37"},{"baseName":{"id":8454,"name":"ForwarderRegistryContextBase","nameLocations":["962:28:37"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"962:28:37"},"id":8455,"nodeType":"InheritanceSpecifier","src":"962:28:37"}],"canonicalName":"SafeContractOwnershipFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":8451,"nodeType":"StructuredDocumentation","src":"567:329:37","text":"@title ERC173 Contract Ownership Standard (facet version).\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":8526,"linearizedBaseContracts":[8526,13297,8214,1206,8588],"name":"SafeContractOwnershipFacet","nameLocation":"905:26:37","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8459,"libraryName":{"id":8456,"name":"ProxyAdminStorage","nameLocations":["1003:17:37"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1003:17:37"},"nodeType":"UsingForDirective","src":"997:53:37","typeName":{"id":8458,"nodeType":"UserDefinedTypeName","pathNode":{"id":8457,"name":"ProxyAdminStorage.Layout","nameLocations":["1025:17:37","1043:6:37"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1025:24:37"},"referencedDeclaration":19308,"src":"1025:24:37","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":8463,"libraryName":{"id":8460,"name":"SafeContractOwnershipStorage","nameLocations":["1061:28:37"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"1061:28:37"},"nodeType":"UsingForDirective","src":"1055:75:37","typeName":{"id":8462,"nodeType":"UserDefinedTypeName","pathNode":{"id":8461,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["1094:28:37","1123:6:37"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"1094:35:37"},"referencedDeclaration":9144,"src":"1094:35:37","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"body":{"id":8472,"nodeType":"Block","src":"1234:2:37","statements":[]},"id":8473,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":8469,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8466,"src":"1215:17:37","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":8470,"kind":"baseConstructorSpecifier","modifierName":{"id":8468,"name":"ForwarderRegistryContextBase","nameLocations":["1186:28:37"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1186:28:37"},"nodeType":"ModifierInvocation","src":"1186:47:37"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":8467,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8466,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1167:17:37","nodeType":"VariableDeclaration","scope":8473,"src":"1148:36:37","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":8465,"nodeType":"UserDefinedTypeName","pathNode":{"id":8464,"name":"IForwarderRegistry","nameLocations":["1148:18:37"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1148:18:37"},"referencedDeclaration":13386,"src":"1148:18:37","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1147:38:37"},"returnParameters":{"id":8471,"nodeType":"ParameterList","parameters":[],"src":"1234:0:37"},"scope":8526,"src":"1136:100:37","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":8496,"nodeType":"Block","src":"1883:148:37","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":8484,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[8511],"referencedDeclaration":8511,"src":"1940:10:37","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1940:12:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8479,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1893:17:37","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":8481,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1911:6:37","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1893:24:37","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":8482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1893:26:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":8483,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1920:19:37","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1893:46:37","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":8486,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1893:60:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8487,"nodeType":"ExpressionStatement","src":"1893:60:37"},{"expression":{"arguments":[{"id":8493,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8476,"src":"2011:12:37","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8488,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1963:28:37","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":8490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1992:6:37","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1963:35:37","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":8491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1963:37:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":8492,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2001:9:37","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":9237,"src":"1963:47:37","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address)"}},"id":8494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1963:61:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8495,"nodeType":"ExpressionStatement","src":"1963:61:37"}]},"documentation":{"id":8474,"nodeType":"StructuredDocumentation","src":"1242:567:37","text":"@notice Initializes the storage with an initial contract owner (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"functionSelector":"63e340d6","id":8497,"implemented":true,"kind":"function","modifiers":[],"name":"initContractOwnershipStorage","nameLocation":"1823:28:37","nodeType":"FunctionDefinition","parameters":{"id":8477,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8476,"mutability":"mutable","name":"initialOwner","nameLocation":"1860:12:37","nodeType":"VariableDeclaration","scope":8497,"src":"1852:20:37","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8475,"name":"address","nodeType":"ElementaryTypeName","src":"1852:7:37","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1851:22:37"},"returnParameters":{"id":8478,"nodeType":"ParameterList","parameters":[],"src":"1883:0:37"},"scope":8526,"src":"1814:217:37","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":8510,"nodeType":"Block","src":"2196:65:37","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8506,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2213:28:37","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8507,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2242:10:37","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2213:39:37","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":8508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2213:41:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":8505,"id":8509,"nodeType":"Return","src":"2206:48:37"}]},"documentation":{"id":8498,"nodeType":"StructuredDocumentation","src":"2037:44:37","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8511,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"2095:10:37","nodeType":"FunctionDefinition","overrides":{"id":8502,"nodeType":"OverrideSpecifier","overrides":[{"id":8500,"name":"Context","nameLocations":["2139:7:37"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2139:7:37"},{"id":8501,"name":"ForwarderRegistryContextBase","nameLocations":["2148:28:37"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2148:28:37"}],"src":"2130:47:37"},"parameters":{"id":8499,"nodeType":"ParameterList","parameters":[],"src":"2105:2:37"},"returnParameters":{"id":8505,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8504,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8511,"src":"2187:7:37","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8503,"name":"address","nodeType":"ElementaryTypeName","src":"2187:7:37","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2186:9:37"},"scope":8526,"src":"2086:175:37","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":8524,"nodeType":"Block","src":"2431:63:37","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8520,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2448:28:37","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":8521,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2477:8:37","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2448:37:37","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":8522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2448:39:37","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":8519,"id":8523,"nodeType":"Return","src":"2441:46:37"}]},"documentation":{"id":8512,"nodeType":"StructuredDocumentation","src":"2267:44:37","text":"@inheritdoc ForwarderRegistryContextBase"},"id":8525,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2325:8:37","nodeType":"FunctionDefinition","overrides":{"id":8516,"nodeType":"OverrideSpecifier","overrides":[{"id":8514,"name":"Context","nameLocations":["2367:7:37"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2367:7:37"},{"id":8515,"name":"ForwarderRegistryContextBase","nameLocations":["2376:28:37"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2376:28:37"}],"src":"2358:47:37"},"parameters":{"id":8513,"nodeType":"ParameterList","parameters":[],"src":"2333:2:37"},"returnParameters":{"id":8519,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8518,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":8525,"src":"2415:14:37","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":8517,"name":"bytes","nodeType":"ElementaryTypeName","src":"2415:5:37","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2414:16:37"},"scope":8526,"src":"2316:178:37","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":8527,"src":"896:1600:37","usedErrors":[8246,8251,11559,19183,19192],"usedEvents":[8287,8292]}],"src":"32:2465:37"},"id":37},"contracts/access/interfaces/IAccessControl.sol":{"ast":{"absolutePath":"contracts/access/interfaces/IAccessControl.sol","exportedSymbols":{"IAccessControl":[8546]},"id":8547,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8528,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:38"},{"abstract":false,"baseContracts":[],"canonicalName":"IAccessControl","contractDependencies":[],"contractKind":"interface","documentation":{"id":8529,"nodeType":"StructuredDocumentation","src":"58:59:38","text":"@title Access control via roles management (functions)"},"fullyImplemented":false,"id":8546,"linearizedBaseContracts":[8546],"name":"IAccessControl","nameLocation":"127:14:38","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":8530,"nodeType":"StructuredDocumentation","src":"148:182:38","text":"@notice Renounces a role by the sender.\n @dev Reverts if `sender` does not have `role`.\n @dev Emits a {RoleRevoked} event.\n @param role The role to renounce."},"functionSelector":"8bb9c5bf","id":8535,"implemented":false,"kind":"function","modifiers":[],"name":"renounceRole","nameLocation":"344:12:38","nodeType":"FunctionDefinition","parameters":{"id":8533,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8532,"mutability":"mutable","name":"role","nameLocation":"365:4:38","nodeType":"VariableDeclaration","scope":8535,"src":"357:12:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8531,"name":"bytes32","nodeType":"ElementaryTypeName","src":"357:7:38","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"356:14:38"},"returnParameters":{"id":8534,"nodeType":"ParameterList","parameters":[],"src":"379:0:38"},"scope":8546,"src":"335:45:38","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":8536,"nodeType":"StructuredDocumentation","src":"386:173:38","text":"@notice Retrieves whether an account has a role.\n @param role The role.\n @param account The account.\n @return hasRole_ Whether `account` has `role`."},"functionSelector":"91d14854","id":8545,"implemented":false,"kind":"function","modifiers":[],"name":"hasRole","nameLocation":"573:7:38","nodeType":"FunctionDefinition","parameters":{"id":8541,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8538,"mutability":"mutable","name":"role","nameLocation":"589:4:38","nodeType":"VariableDeclaration","scope":8545,"src":"581:12:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8537,"name":"bytes32","nodeType":"ElementaryTypeName","src":"581:7:38","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8540,"mutability":"mutable","name":"account","nameLocation":"603:7:38","nodeType":"VariableDeclaration","scope":8545,"src":"595:15:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8539,"name":"address","nodeType":"ElementaryTypeName","src":"595:7:38","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"580:31:38"},"returnParameters":{"id":8544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8543,"mutability":"mutable","name":"hasRole_","nameLocation":"640:8:38","nodeType":"VariableDeclaration","scope":8545,"src":"635:13:38","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8542,"name":"bool","nodeType":"ElementaryTypeName","src":"635:4:38","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"634:15:38"},"scope":8546,"src":"564:86:38","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":8547,"src":"117:535:38","usedErrors":[],"usedEvents":[]}],"src":"32:621:38"},"id":38},"contracts/access/interfaces/IERC173.sol":{"ast":{"absolutePath":"contracts/access/interfaces/IERC173.sol","exportedSymbols":{"IERC173":[8562]},"id":8563,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8548,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:39"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC173","contractDependencies":[],"contractKind":"interface","documentation":{"id":8549,"nodeType":"StructuredDocumentation","src":"58:182:39","text":"@title ERC-173 Contract Ownership Standard (functions)\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0"},"fullyImplemented":false,"id":8562,"linearizedBaseContracts":[8562],"name":"IERC173","nameLocation":"250:7:39","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":8550,"nodeType":"StructuredDocumentation","src":"264:342:39","text":"@notice Sets the address of the new contract owner.\n @dev Reverts if the sender is not the contract owner.\n @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\n @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership."},"functionSelector":"f2fde38b","id":8555,"implemented":false,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"620:17:39","nodeType":"FunctionDefinition","parameters":{"id":8553,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8552,"mutability":"mutable","name":"newOwner","nameLocation":"646:8:39","nodeType":"VariableDeclaration","scope":8555,"src":"638:16:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8551,"name":"address","nodeType":"ElementaryTypeName","src":"638:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"637:18:39"},"returnParameters":{"id":8554,"nodeType":"ParameterList","parameters":[],"src":"664:0:39"},"scope":8562,"src":"611:54:39","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":8556,"nodeType":"StructuredDocumentation","src":"671:116:39","text":"@notice Gets the address of the contract owner.\n @return contractOwner The address of the contract owner."},"functionSelector":"8da5cb5b","id":8561,"implemented":false,"kind":"function","modifiers":[],"name":"owner","nameLocation":"801:5:39","nodeType":"FunctionDefinition","parameters":{"id":8557,"nodeType":"ParameterList","parameters":[],"src":"806:2:39"},"returnParameters":{"id":8560,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8559,"mutability":"mutable","name":"contractOwner","nameLocation":"840:13:39","nodeType":"VariableDeclaration","scope":8561,"src":"832:21:39","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8558,"name":"address","nodeType":"ElementaryTypeName","src":"832:7:39","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"831:23:39"},"scope":8562,"src":"792:63:39","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":8563,"src":"240:617:39","usedErrors":[],"usedEvents":[]}],"src":"32:826:39"},"id":39},"contracts/access/interfaces/IERC173Safe.sol":{"ast":{"absolutePath":"contracts/access/interfaces/IERC173Safe.sol","exportedSymbols":{"IERC173Safe":[8588]},"id":8589,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8564,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:40"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC173Safe","contractDependencies":[],"contractKind":"interface","documentation":{"id":8565,"nodeType":"StructuredDocumentation","src":"58:211:40","text":"@title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\n @dev See https://eips.ethereum.org/EIPS/eip-173\n @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0"},"fullyImplemented":false,"id":8588,"linearizedBaseContracts":[8588],"name":"IERC173Safe","nameLocation":"279:11:40","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":8566,"nodeType":"StructuredDocumentation","src":"297:450:40","text":"@notice Sets an address as the pending new contract owner.\n @dev Reverts if the sender is not the contract owner.\n @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\n @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\n @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership."},"functionSelector":"f2fde38b","id":8571,"implemented":false,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"761:17:40","nodeType":"FunctionDefinition","parameters":{"id":8569,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8568,"mutability":"mutable","name":"newOwner","nameLocation":"787:8:40","nodeType":"VariableDeclaration","scope":8571,"src":"779:16:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8567,"name":"address","nodeType":"ElementaryTypeName","src":"779:7:40","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"778:18:40"},"returnParameters":{"id":8570,"nodeType":"ParameterList","parameters":[],"src":"805:0:40"},"scope":8588,"src":"752:54:40","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":8572,"nodeType":"StructuredDocumentation","src":"812:192:40","text":"@notice Sets the pending contract owner as the new contract owner.\n @dev Reverts if the sender is not the pending contract owner.\n @dev Emits an {OwnershipTransferred} event."},"functionSelector":"79ba5097","id":8575,"implemented":false,"kind":"function","modifiers":[],"name":"acceptOwnership","nameLocation":"1018:15:40","nodeType":"FunctionDefinition","parameters":{"id":8573,"nodeType":"ParameterList","parameters":[],"src":"1033:2:40"},"returnParameters":{"id":8574,"nodeType":"ParameterList","parameters":[],"src":"1044:0:40"},"scope":8588,"src":"1009:36:40","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":8576,"nodeType":"StructuredDocumentation","src":"1051:116:40","text":"@notice Gets the address of the contract owner.\n @return contractOwner The address of the contract owner."},"functionSelector":"8da5cb5b","id":8581,"implemented":false,"kind":"function","modifiers":[],"name":"owner","nameLocation":"1181:5:40","nodeType":"FunctionDefinition","parameters":{"id":8577,"nodeType":"ParameterList","parameters":[],"src":"1186:2:40"},"returnParameters":{"id":8580,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8579,"mutability":"mutable","name":"contractOwner","nameLocation":"1220:13:40","nodeType":"VariableDeclaration","scope":8581,"src":"1212:21:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8578,"name":"address","nodeType":"ElementaryTypeName","src":"1212:7:40","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1211:23:40"},"scope":8588,"src":"1172:63:40","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":8582,"nodeType":"StructuredDocumentation","src":"1241:139:40","text":"@notice Gets the address of the pending contract owner.\n @return pendingContractOwner The address of the pending contract owner."},"functionSelector":"e30c3978","id":8587,"implemented":false,"kind":"function","modifiers":[],"name":"pendingOwner","nameLocation":"1394:12:40","nodeType":"FunctionDefinition","parameters":{"id":8583,"nodeType":"ParameterList","parameters":[],"src":"1406:2:40"},"returnParameters":{"id":8586,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8585,"mutability":"mutable","name":"pendingContractOwner","nameLocation":"1440:20:40","nodeType":"VariableDeclaration","scope":8587,"src":"1432:28:40","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8584,"name":"address","nodeType":"ElementaryTypeName","src":"1432:7:40","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1431:30:40"},"scope":8588,"src":"1385:77:40","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":8589,"src":"269:1195:40","usedErrors":[],"usedEvents":[]}],"src":"32:1433:40"},"id":40},"contracts/access/libraries/AccessControlStorage.sol":{"ast":{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","exportedSymbols":{"AccessControlStorage":[8851],"Address":[38035],"IAccessControl":[8546],"NotRoleHolder":[8223],"NotTargetContractRoleHolder":[8232],"RoleGranted":[8269],"RoleRevoked":[8278],"TargetIsNotAContract":[8239]},"id":8852,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8590,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:41"},{"absolutePath":"contracts/access/errors/AccessControlErrors.sol","file":"./../errors/AccessControlErrors.sol","id":8593,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8852,"sourceUnit":8233,"src":"58:95:41","symbolAliases":[{"foreign":{"id":8591,"name":"NotRoleHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8223,"src":"66:13:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":8592,"name":"NotTargetContractRoleHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8232,"src":"81:27:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/errors/Common.sol","file":"./../errors/Common.sol","id":8595,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8852,"sourceUnit":8240,"src":"154:60:41","symbolAliases":[{"foreign":{"id":8594,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"162:20:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/events/AccessControlEvents.sol","file":"./../events/AccessControlEvents.sol","id":8598,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8852,"sourceUnit":8279,"src":"215:77:41","symbolAliases":[{"foreign":{"id":8596,"name":"RoleGranted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8269,"src":"223:11:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":8597,"name":"RoleRevoked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8278,"src":"236:11:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/interfaces/IAccessControl.sol","file":"./../interfaces/IAccessControl.sol","id":8600,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8852,"sourceUnit":8547,"src":"293:66:41","symbolAliases":[{"foreign":{"id":8599,"name":"IAccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8546,"src":"301:14:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../utils/libraries/Address.sol","id":8602,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":8852,"sourceUnit":38036,"src":"360:60:41","symbolAliases":[{"foreign":{"id":8601,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"368:7:41","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"AccessControlStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":8851,"linearizedBaseContracts":[8851],"name":"AccessControlStorage","nameLocation":"430:20:41","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8605,"libraryName":{"id":8603,"name":"Address","nameLocations":["463:7:41"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"463:7:41"},"nodeType":"UsingForDirective","src":"457:26:41","typeName":{"id":8604,"name":"address","nodeType":"ElementaryTypeName","src":"475:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":8609,"libraryName":{"id":8606,"name":"AccessControlStorage","nameLocations":["494:20:41"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"494:20:41"},"nodeType":"UsingForDirective","src":"488:59:41","typeName":{"id":8608,"nodeType":"UserDefinedTypeName","pathNode":{"id":8607,"name":"AccessControlStorage.Layout","nameLocations":["519:20:41","540:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"519:27:41"},"referencedDeclaration":8616,"src":"519:27:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"canonicalName":"AccessControlStorage.Layout","id":8616,"members":[{"constant":false,"id":8615,"mutability":"mutable","name":"roles","nameLocation":"622:5:41","nodeType":"VariableDeclaration","scope":8616,"src":"577:50:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"},"typeName":{"id":8614,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":8610,"name":"bytes32","nodeType":"ElementaryTypeName","src":"585:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"577:44:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":8613,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":8611,"name":"address","nodeType":"ElementaryTypeName","src":"604:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"596:24:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":8612,"name":"bool","nodeType":"ElementaryTypeName","src":"615:4:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}}},"visibility":"internal"}],"name":"Layout","nameLocation":"560:6:41","nodeType":"StructDefinition","scope":8851,"src":"553:81:41","visibility":"public"},{"constant":true,"id":8629,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"666:19:41","nodeType":"VariableDeclaration","scope":8851,"src":"640:124:41","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8617,"name":"bytes32","nodeType":"ElementaryTypeName","src":"640:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8627,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6163636573732e416363657373436f6e74726f6c2e73746f72616765","id":8623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"714:43:41","typeDescriptions":{"typeIdentifier":"t_stringliteral_c8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b23","typeString":"literal_string \"animoca.core.access.AccessControl.storage\""},"value":"animoca.core.access.AccessControl.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b23","typeString":"literal_string \"animoca.core.access.AccessControl.storage\""}],"id":8622,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"704:9:41","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":8624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"704:54:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":8621,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"696:7:41","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":8620,"name":"uint256","nodeType":"ElementaryTypeName","src":"696:7:41","typeDescriptions":{}}},"id":8625,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"696:63:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":8626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"762:1:41","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"696:67:41","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8619,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"688:7:41","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":8618,"name":"bytes32","nodeType":"ElementaryTypeName","src":"688:7:41","typeDescriptions":{}}},"id":8628,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"688:76:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":8666,"nodeType":"Block","src":"1240:156:41","statements":[{"condition":{"id":8647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1254:25:41","subExpression":{"arguments":[{"id":8644,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8635,"src":"1265:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8645,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8637,"src":"1271:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":8642,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8633,"src":"1255:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8643,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1257:7:41","memberName":"hasRole","nodeType":"MemberAccess","referencedDeclaration":8760,"src":"1255:9:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view returns (bool)"}},"id":8646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1255:24:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8665,"nodeType":"IfStatement","src":"1250:140:41","trueBody":{"id":8664,"nodeType":"Block","src":"1281:109:41","statements":[{"expression":{"id":8656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":8648,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8633,"src":"1295:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8652,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1297:5:41","memberName":"roles","nodeType":"MemberAccess","referencedDeclaration":8615,"src":"1295:7:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"}},"id":8653,"indexExpression":{"id":8650,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8635,"src":"1303:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1295:13:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":8654,"indexExpression":{"id":8651,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8637,"src":"1309:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1295:22:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":8655,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1320:4:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"1295:29:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8657,"nodeType":"ExpressionStatement","src":"1295:29:41"},{"eventCall":{"arguments":[{"id":8659,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8635,"src":"1355:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8660,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8637,"src":"1361:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8661,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8639,"src":"1370:8:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8658,"name":"RoleGranted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8269,"src":"1343:11:41","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address)"}},"id":8662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1343:36:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8663,"nodeType":"EmitStatement","src":"1338:41:41"}]}}]},"documentation":{"id":8630,"nodeType":"StructuredDocumentation","src":"771:369:41","text":"@notice Grants a role to an account.\n @dev Note: Call to this function should be properly access controlled.\n @dev Emits a {RoleGranted} event if the account did not previously have the role.\n @param role The role to grant.\n @param account The account to grant the role to.\n @param operator The account requesting the role change."},"id":8667,"implemented":true,"kind":"function","modifiers":[],"name":"grantRole","nameLocation":"1154:9:41","nodeType":"FunctionDefinition","parameters":{"id":8640,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8633,"mutability":"mutable","name":"s","nameLocation":"1179:1:41","nodeType":"VariableDeclaration","scope":8667,"src":"1164:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8632,"nodeType":"UserDefinedTypeName","pathNode":{"id":8631,"name":"Layout","nameLocations":["1164:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"1164:6:41"},"referencedDeclaration":8616,"src":"1164:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8635,"mutability":"mutable","name":"role","nameLocation":"1190:4:41","nodeType":"VariableDeclaration","scope":8667,"src":"1182:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8634,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1182:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8637,"mutability":"mutable","name":"account","nameLocation":"1204:7:41","nodeType":"VariableDeclaration","scope":8667,"src":"1196:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8636,"name":"address","nodeType":"ElementaryTypeName","src":"1196:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8639,"mutability":"mutable","name":"operator","nameLocation":"1221:8:41","nodeType":"VariableDeclaration","scope":8667,"src":"1213:16:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8638,"name":"address","nodeType":"ElementaryTypeName","src":"1213:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1163:67:41"},"returnParameters":{"id":8641,"nodeType":"ParameterList","parameters":[],"src":"1240:0:41"},"scope":8851,"src":"1145:251:41","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":8703,"nodeType":"Block","src":"1870:156:41","statements":[{"condition":{"arguments":[{"id":8682,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8673,"src":"1894:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8683,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"1900:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":8680,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8671,"src":"1884:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8681,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1886:7:41","memberName":"hasRole","nodeType":"MemberAccess","referencedDeclaration":8760,"src":"1884:9:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view returns (bool)"}},"id":8684,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1884:24:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8702,"nodeType":"IfStatement","src":"1880:140:41","trueBody":{"id":8701,"nodeType":"Block","src":"1910:110:41","statements":[{"expression":{"id":8693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":8685,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8671,"src":"1924:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8689,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1926:5:41","memberName":"roles","nodeType":"MemberAccess","referencedDeclaration":8615,"src":"1924:7:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"}},"id":8690,"indexExpression":{"id":8687,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8673,"src":"1932:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1924:13:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":8691,"indexExpression":{"id":8688,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"1938:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1924:22:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":8692,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1949:5:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"1924:30:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8694,"nodeType":"ExpressionStatement","src":"1924:30:41"},{"eventCall":{"arguments":[{"id":8696,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8673,"src":"1985:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8697,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8675,"src":"1991:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8698,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8677,"src":"2000:8:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8695,"name":"RoleRevoked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8278,"src":"1973:11:41","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address)"}},"id":8699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1973:36:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8700,"nodeType":"EmitStatement","src":"1968:41:41"}]}}]},"documentation":{"id":8668,"nodeType":"StructuredDocumentation","src":"1402:367:41","text":"@notice Revokes a role from an account.\n @dev Note: Call to this function should be properly access controlled.\n @dev Emits a {RoleRevoked} event if the account previously had the role.\n @param role The role to revoke.\n @param account The account to revoke the role from.\n @param operator The account requesting the role change."},"id":8704,"implemented":true,"kind":"function","modifiers":[],"name":"revokeRole","nameLocation":"1783:10:41","nodeType":"FunctionDefinition","parameters":{"id":8678,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8671,"mutability":"mutable","name":"s","nameLocation":"1809:1:41","nodeType":"VariableDeclaration","scope":8704,"src":"1794:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8670,"nodeType":"UserDefinedTypeName","pathNode":{"id":8669,"name":"Layout","nameLocations":["1794:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"1794:6:41"},"referencedDeclaration":8616,"src":"1794:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8673,"mutability":"mutable","name":"role","nameLocation":"1820:4:41","nodeType":"VariableDeclaration","scope":8704,"src":"1812:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8672,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1812:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8675,"mutability":"mutable","name":"account","nameLocation":"1834:7:41","nodeType":"VariableDeclaration","scope":8704,"src":"1826:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8674,"name":"address","nodeType":"ElementaryTypeName","src":"1826:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8677,"mutability":"mutable","name":"operator","nameLocation":"1851:8:41","nodeType":"VariableDeclaration","scope":8704,"src":"1843:16:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8676,"name":"address","nodeType":"ElementaryTypeName","src":"1843:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1793:67:41"},"returnParameters":{"id":8679,"nodeType":"ParameterList","parameters":[],"src":"1870:0:41"},"scope":8851,"src":"1774:252:41","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":8738,"nodeType":"Block","src":"2361:134:41","statements":[{"expression":{"arguments":[{"id":8718,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8712,"src":"2388:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8719,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8710,"src":"2394:6:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":8715,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8708,"src":"2371:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8717,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2373:14:41","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"2371:16:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":8720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2371:30:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8721,"nodeType":"ExpressionStatement","src":"2371:30:41"},{"expression":{"id":8730,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":8722,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8708,"src":"2411:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8726,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2413:5:41","memberName":"roles","nodeType":"MemberAccess","referencedDeclaration":8615,"src":"2411:7:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"}},"id":8727,"indexExpression":{"id":8724,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8712,"src":"2419:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2411:13:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":8728,"indexExpression":{"id":8725,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8710,"src":"2425:6:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2411:21:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":8729,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2435:5:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"2411:29:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8731,"nodeType":"ExpressionStatement","src":"2411:29:41"},{"eventCall":{"arguments":[{"id":8733,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8712,"src":"2467:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8734,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8710,"src":"2473:6:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8735,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8710,"src":"2481:6:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8732,"name":"RoleRevoked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8278,"src":"2455:11:41","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$","typeString":"function (bytes32,address,address)"}},"id":8736,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2455:33:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8737,"nodeType":"EmitStatement","src":"2450:38:41"}]},"documentation":{"id":8705,"nodeType":"StructuredDocumentation","src":"2032:245:41","text":"@notice Renounces a role by the sender.\n @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\n @dev Emits a {RoleRevoked} event.\n @param sender The message sender.\n @param role The role to renounce."},"id":8739,"implemented":true,"kind":"function","modifiers":[],"name":"renounceRole","nameLocation":"2291:12:41","nodeType":"FunctionDefinition","parameters":{"id":8713,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8708,"mutability":"mutable","name":"s","nameLocation":"2319:1:41","nodeType":"VariableDeclaration","scope":8739,"src":"2304:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8707,"nodeType":"UserDefinedTypeName","pathNode":{"id":8706,"name":"Layout","nameLocations":["2304:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"2304:6:41"},"referencedDeclaration":8616,"src":"2304:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8710,"mutability":"mutable","name":"sender","nameLocation":"2330:6:41","nodeType":"VariableDeclaration","scope":8739,"src":"2322:14:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8709,"name":"address","nodeType":"ElementaryTypeName","src":"2322:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8712,"mutability":"mutable","name":"role","nameLocation":"2346:4:41","nodeType":"VariableDeclaration","scope":8739,"src":"2338:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8711,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2338:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2303:48:41"},"returnParameters":{"id":8714,"nodeType":"ParameterList","parameters":[],"src":"2361:0:41"},"scope":8851,"src":"2282:213:41","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":8759,"nodeType":"Block","src":"2783:46:41","statements":[{"expression":{"baseExpression":{"baseExpression":{"expression":{"id":8752,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8743,"src":"2800:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8753,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2802:5:41","memberName":"roles","nodeType":"MemberAccess","referencedDeclaration":8615,"src":"2800:7:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(bytes32 => mapping(address => bool))"}},"id":8755,"indexExpression":{"id":8754,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8745,"src":"2808:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2800:13:41","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":8757,"indexExpression":{"id":8756,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8747,"src":"2814:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2800:22:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":8751,"id":8758,"nodeType":"Return","src":"2793:29:41"}]},"documentation":{"id":8740,"nodeType":"StructuredDocumentation","src":"2501:173:41","text":"@notice Retrieves whether an account has a role.\n @param role The role.\n @param account The account.\n @return hasRole_ Whether `account` has `role`."},"id":8760,"implemented":true,"kind":"function","modifiers":[],"name":"hasRole","nameLocation":"2688:7:41","nodeType":"FunctionDefinition","parameters":{"id":8748,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8743,"mutability":"mutable","name":"s","nameLocation":"2711:1:41","nodeType":"VariableDeclaration","scope":8760,"src":"2696:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8742,"nodeType":"UserDefinedTypeName","pathNode":{"id":8741,"name":"Layout","nameLocations":["2696:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"2696:6:41"},"referencedDeclaration":8616,"src":"2696:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8745,"mutability":"mutable","name":"role","nameLocation":"2722:4:41","nodeType":"VariableDeclaration","scope":8760,"src":"2714:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8744,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2714:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8747,"mutability":"mutable","name":"account","nameLocation":"2736:7:41","nodeType":"VariableDeclaration","scope":8760,"src":"2728:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8746,"name":"address","nodeType":"ElementaryTypeName","src":"2728:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2695:49:41"},"returnParameters":{"id":8751,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8750,"mutability":"mutable","name":"hasRole_","nameLocation":"2773:8:41","nodeType":"VariableDeclaration","scope":8760,"src":"2768:13:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8749,"name":"bool","nodeType":"ElementaryTypeName","src":"2768:4:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2767:15:41"},"scope":8851,"src":"2679:150:41","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":8789,"nodeType":"Block","src":"3274:165:41","statements":[{"condition":{"id":8775,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3288:29:41","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8772,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8763,"src":"3289:14:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8773,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3304:11:41","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"3289:26:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":8774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3289:28:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8780,"nodeType":"IfStatement","src":"3284:78:41","trueBody":{"errorCall":{"arguments":[{"id":8777,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8763,"src":"3347:14:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8776,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"3326:20:41","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":8778,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3326:36:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":8779,"nodeType":"RevertStatement","src":"3319:43:41"}},{"expression":{"arguments":[{"id":8785,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8765,"src":"3418:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8786,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8767,"src":"3424:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"id":8782,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8763,"src":"3394:14:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8781,"name":"IAccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8546,"src":"3379:14:41","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IAccessControl_$8546_$","typeString":"type(contract IAccessControl)"}},"id":8783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3379:30:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IAccessControl_$8546","typeString":"contract IAccessControl"}},"id":8784,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3410:7:41","memberName":"hasRole","nodeType":"MemberAccess","referencedDeclaration":8545,"src":"3379:38:41","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes32_$_t_address_$returns$_t_bool_$","typeString":"function (bytes32,address) view external returns (bool)"}},"id":8787,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3379:53:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":8771,"id":8788,"nodeType":"Return","src":"3372:60:41"}]},"documentation":{"id":8761,"nodeType":"StructuredDocumentation","src":"2835:296:41","text":"@notice Checks whether an account has a role in a target contract.\n @param targetContract The contract to check.\n @param role The role to check.\n @param account The account to check.\n @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`."},"id":8790,"implemented":true,"kind":"function","modifiers":[],"name":"hasTargetContractRole","nameLocation":"3145:21:41","nodeType":"FunctionDefinition","parameters":{"id":8768,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8763,"mutability":"mutable","name":"targetContract","nameLocation":"3175:14:41","nodeType":"VariableDeclaration","scope":8790,"src":"3167:22:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8762,"name":"address","nodeType":"ElementaryTypeName","src":"3167:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8765,"mutability":"mutable","name":"role","nameLocation":"3199:4:41","nodeType":"VariableDeclaration","scope":8790,"src":"3191:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8764,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3191:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8767,"mutability":"mutable","name":"account","nameLocation":"3213:7:41","nodeType":"VariableDeclaration","scope":8790,"src":"3205:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8766,"name":"address","nodeType":"ElementaryTypeName","src":"3205:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3166:55:41"},"returnParameters":{"id":8771,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8770,"mutability":"mutable","name":"hasTargetContractRole_","nameLocation":"3250:22:41","nodeType":"VariableDeclaration","scope":8790,"src":"3245:27:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":8769,"name":"bool","nodeType":"ElementaryTypeName","src":"3245:4:41","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3244:29:41"},"scope":8851,"src":"3136:303:41","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":8813,"nodeType":"Block","src":"3727:83:41","statements":[{"condition":{"id":8806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3741:25:41","subExpression":{"arguments":[{"id":8803,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8796,"src":"3752:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8804,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8798,"src":"3758:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":8801,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8794,"src":"3742:1:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":8802,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3744:7:41","memberName":"hasRole","nodeType":"MemberAccess","referencedDeclaration":8760,"src":"3742:9:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view returns (bool)"}},"id":8805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3742:24:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8812,"nodeType":"IfStatement","src":"3737:66:41","trueBody":{"errorCall":{"arguments":[{"id":8808,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8796,"src":"3789:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8809,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8798,"src":"3795:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8807,"name":"NotRoleHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8223,"src":"3775:13:41","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes32_$_t_address_$returns$_t_error_$","typeString":"function (bytes32,address) pure returns (error)"}},"id":8810,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3775:28:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":8811,"nodeType":"RevertStatement","src":"3768:35:41"}}]},"documentation":{"id":8791,"nodeType":"StructuredDocumentation","src":"3445:190:41","text":"@notice Ensures that an account has a role.\n @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\n @param role The role.\n @param account The account."},"id":8814,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasRole","nameLocation":"3649:14:41","nodeType":"FunctionDefinition","parameters":{"id":8799,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8794,"mutability":"mutable","name":"s","nameLocation":"3679:1:41","nodeType":"VariableDeclaration","scope":8814,"src":"3664:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8793,"nodeType":"UserDefinedTypeName","pathNode":{"id":8792,"name":"Layout","nameLocations":["3664:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"3664:6:41"},"referencedDeclaration":8616,"src":"3664:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8796,"mutability":"mutable","name":"role","nameLocation":"3690:4:41","nodeType":"VariableDeclaration","scope":8814,"src":"3682:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8795,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3682:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8798,"mutability":"mutable","name":"account","nameLocation":"3704:7:41","nodeType":"VariableDeclaration","scope":8814,"src":"3696:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8797,"name":"address","nodeType":"ElementaryTypeName","src":"3696:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3663:49:41"},"returnParameters":{"id":8800,"nodeType":"ParameterList","parameters":[],"src":"3727:0:41"},"scope":8851,"src":"3640:170:41","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":8837,"nodeType":"Block","src":"4229:141:41","statements":[{"condition":{"id":8829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4243:53:41","subExpression":{"arguments":[{"id":8825,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8817,"src":"4266:14:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8826,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8819,"src":"4282:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8827,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8821,"src":"4288:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8824,"name":"hasTargetContractRole","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8790,"src":"4244:21:41","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes32_$_t_address_$returns$_t_bool_$","typeString":"function (address,bytes32,address) view returns (bool)"}},"id":8828,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4244:52:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8836,"nodeType":"IfStatement","src":"4239:124:41","trueBody":{"errorCall":{"arguments":[{"id":8831,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8817,"src":"4333:14:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8832,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8819,"src":"4349:4:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":8833,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8821,"src":"4355:7:41","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8830,"name":"NotTargetContractRoleHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8232,"src":"4305:27:41","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes32_$_t_address_$returns$_t_error_$","typeString":"function (address,bytes32,address) pure returns (error)"}},"id":8834,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4305:58:41","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":8835,"nodeType":"RevertStatement","src":"4298:65:41"}}]},"documentation":{"id":8815,"nodeType":"StructuredDocumentation","src":"3816:301:41","text":"@notice Enforces that an account has a role in a target contract.\n @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\n @param targetContract The contract to check.\n @param role The role to check.\n @param account The account to check."},"id":8838,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasTargetContractRole","nameLocation":"4131:28:41","nodeType":"FunctionDefinition","parameters":{"id":8822,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8817,"mutability":"mutable","name":"targetContract","nameLocation":"4168:14:41","nodeType":"VariableDeclaration","scope":8838,"src":"4160:22:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8816,"name":"address","nodeType":"ElementaryTypeName","src":"4160:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8819,"mutability":"mutable","name":"role","nameLocation":"4192:4:41","nodeType":"VariableDeclaration","scope":8838,"src":"4184:12:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8818,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4184:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":8821,"mutability":"mutable","name":"account","nameLocation":"4206:7:41","nodeType":"VariableDeclaration","scope":8838,"src":"4198:15:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8820,"name":"address","nodeType":"ElementaryTypeName","src":"4198:7:41","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4159:55:41"},"returnParameters":{"id":8823,"nodeType":"ParameterList","parameters":[],"src":"4229:0:41"},"scope":8851,"src":"4122:248:41","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":8849,"nodeType":"Block","src":"4435:115:41","statements":[{"assignments":[8845],"declarations":[{"constant":false,"id":8845,"mutability":"mutable","name":"position","nameLocation":"4453:8:41","nodeType":"VariableDeclaration","scope":8849,"src":"4445:16:41","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8844,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4445:7:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":8847,"initialValue":{"id":8846,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8629,"src":"4464:19:41","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4445:38:41"},{"AST":{"nativeSrc":"4502:42:41","nodeType":"YulBlock","src":"4502:42:41","statements":[{"nativeSrc":"4516:18:41","nodeType":"YulAssignment","src":"4516:18:41","value":{"name":"position","nativeSrc":"4526:8:41","nodeType":"YulIdentifier","src":"4526:8:41"},"variableNames":[{"name":"s.slot","nativeSrc":"4516:6:41","nodeType":"YulIdentifier","src":"4516:6:41"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":8845,"isOffset":false,"isSlot":false,"src":"4526:8:41","valueSize":1},{"declaration":8842,"isOffset":false,"isSlot":true,"src":"4516:6:41","suffix":"slot","valueSize":1}],"id":8848,"nodeType":"InlineAssembly","src":"4493:51:41"}]},"id":8850,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"4385:6:41","nodeType":"FunctionDefinition","parameters":{"id":8839,"nodeType":"ParameterList","parameters":[],"src":"4391:2:41"},"returnParameters":{"id":8843,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8842,"mutability":"mutable","name":"s","nameLocation":"4432:1:41","nodeType":"VariableDeclaration","scope":8850,"src":"4417:16:41","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"},"typeName":{"id":8841,"nodeType":"UserDefinedTypeName","pathNode":{"id":8840,"name":"Layout","nameLocations":["4417:6:41"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"4417:6:41"},"referencedDeclaration":8616,"src":"4417:6:41","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}},"visibility":"internal"}],"src":"4416:18:41"},"scope":8851,"src":"4376:174:41","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":8852,"src":"422:4130:41","usedErrors":[],"usedEvents":[]}],"src":"32:4521:41"},"id":41},"contracts/access/libraries/ContractOwnershipStorage.sol":{"ast":{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","exportedSymbols":{"Address":[38035],"ContractOwnershipStorage":[9109],"IERC173":[8562],"InterfaceDetectionStorage":[11680],"NotContractOwner":[8246],"NotTargetContractOwner":[8258],"OwnershipTransferred":[8287],"ProxyInitialization":[19524],"TargetIsNotAContract":[8239]},"id":9110,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":8853,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:42"},{"absolutePath":"contracts/access/errors/ContractOwnershipErrors.sol","file":"./../errors/ContractOwnershipErrors.sol","id":8856,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":8259,"src":"58:97:42","symbolAliases":[{"foreign":{"id":8854,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"66:16:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":8855,"name":"NotTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8258,"src":"84:22:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/errors/Common.sol","file":"./../errors/Common.sol","id":8858,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":8240,"src":"156:60:42","symbolAliases":[{"foreign":{"id":8857,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"164:20:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/events/ERC173Events.sol","file":"./../events/ERC173Events.sol","id":8860,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":8293,"src":"217:66:42","symbolAliases":[{"foreign":{"id":8859,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"225:20:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/interfaces/IERC173.sol","file":"./../interfaces/IERC173.sol","id":8862,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":8563,"src":"284:52:42","symbolAliases":[{"foreign":{"id":8861,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"292:7:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../utils/libraries/Address.sol","id":8864,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":38036,"src":"337:60:42","symbolAliases":[{"foreign":{"id":8863,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"345:7:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../proxy/libraries/ProxyInitialization.sol","id":8866,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":19525,"src":"398:84:42","symbolAliases":[{"foreign":{"id":8865,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"406:19:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":8868,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9110,"sourceUnit":11681,"src":"483:104:42","symbolAliases":[{"foreign":{"id":8867,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"491:25:42","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ContractOwnershipStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":9109,"linearizedBaseContracts":[9109],"name":"ContractOwnershipStorage","nameLocation":"597:24:42","nodeType":"ContractDefinition","nodes":[{"global":false,"id":8871,"libraryName":{"id":8869,"name":"Address","nameLocations":["634:7:42"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"634:7:42"},"nodeType":"UsingForDirective","src":"628:26:42","typeName":{"id":8870,"name":"address","nodeType":"ElementaryTypeName","src":"646:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":8875,"libraryName":{"id":8872,"name":"ContractOwnershipStorage","nameLocations":["665:24:42"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"665:24:42"},"nodeType":"UsingForDirective","src":"659:67:42","typeName":{"id":8874,"nodeType":"UserDefinedTypeName","pathNode":{"id":8873,"name":"ContractOwnershipStorage.Layout","nameLocations":["694:24:42","719:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"694:31:42"},"referencedDeclaration":8882,"src":"694:31:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":8879,"libraryName":{"id":8876,"name":"InterfaceDetectionStorage","nameLocations":["737:25:42"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"737:25:42"},"nodeType":"UsingForDirective","src":"731:69:42","typeName":{"id":8878,"nodeType":"UserDefinedTypeName","pathNode":{"id":8877,"name":"InterfaceDetectionStorage.Layout","nameLocations":["767:25:42","793:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"767:32:42"},"referencedDeclaration":11590,"src":"767:32:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ContractOwnershipStorage.Layout","id":8882,"members":[{"constant":false,"id":8881,"mutability":"mutable","name":"contractOwner","nameLocation":"838:13:42","nodeType":"VariableDeclaration","scope":8882,"src":"830:21:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8880,"name":"address","nodeType":"ElementaryTypeName","src":"830:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"Layout","nameLocation":"813:6:42","nodeType":"StructDefinition","scope":9109,"src":"806:52:42","visibility":"public"},{"constant":true,"id":8895,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"890:19:42","nodeType":"VariableDeclaration","scope":9109,"src":"864:128:42","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8883,"name":"bytes32","nodeType":"ElementaryTypeName","src":"864:7:42","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8893,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6163636573732e436f6e74726163744f776e6572736869702e73746f72616765","id":8889,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"938:47:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_c9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cd","typeString":"literal_string \"animoca.core.access.ContractOwnership.storage\""},"value":"animoca.core.access.ContractOwnership.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cd","typeString":"literal_string \"animoca.core.access.ContractOwnership.storage\""}],"id":8888,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"928:9:42","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":8890,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"928:58:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":8887,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"920:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":8886,"name":"uint256","nodeType":"ElementaryTypeName","src":"920:7:42","typeDescriptions":{}}},"id":8891,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"920:67:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":8892,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"990:1:42","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"920:71:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8885,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"912:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":8884,"name":"bytes32","nodeType":"ElementaryTypeName","src":"912:7:42","typeDescriptions":{}}},"id":8894,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"912:80:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":8908,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"1024:21:42","nodeType":"VariableDeclaration","scope":9109,"src":"998:128:42","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":8896,"name":"bytes32","nodeType":"ElementaryTypeName","src":"998:7:42","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":8906,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6163636573732e436f6e74726163744f776e6572736869702e7068617365","id":8902,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1074:45:42","typeDescriptions":{"typeIdentifier":"t_stringliteral_5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb84","typeString":"literal_string \"animoca.core.access.ContractOwnership.phase\""},"value":"animoca.core.access.ContractOwnership.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb84","typeString":"literal_string \"animoca.core.access.ContractOwnership.phase\""}],"id":8901,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1064:9:42","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":8903,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1064:56:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":8900,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1056:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":8899,"name":"uint256","nodeType":"ElementaryTypeName","src":"1056:7:42","typeDescriptions":{}}},"id":8904,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1056:65:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":8905,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1124:1:42","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1056:69:42","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":8898,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1048:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":8897,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1048:7:42","typeDescriptions":{}}},"id":8907,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1048:78:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":8951,"nodeType":"Block","src":"1635:267:42","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8917,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8914,"src":"1649:12:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":8920,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1673:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8919,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1665:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8918,"name":"address","nodeType":"ElementaryTypeName","src":"1665:7:42","typeDescriptions":{}}},"id":8921,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1665:10:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1649:26:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8938,"nodeType":"IfStatement","src":"1645:152:42","trueBody":{"id":8937,"nodeType":"Block","src":"1677:120:42","statements":[{"expression":{"id":8927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":8923,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8912,"src":"1691:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8925,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1693:13:42","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":8881,"src":"1691:15:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":8926,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8914,"src":"1709:12:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1691:30:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":8928,"nodeType":"ExpressionStatement","src":"1691:30:42"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":8932,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1769:1:42","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":8931,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1761:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":8930,"name":"address","nodeType":"ElementaryTypeName","src":"1761:7:42","typeDescriptions":{}}},"id":8933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1761:10:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":8934,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8914,"src":"1773:12:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":8929,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"1740:20:42","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":8935,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1740:46:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8936,"nodeType":"EmitStatement","src":"1735:51:42"}]}},{"expression":{"arguments":[{"expression":{"arguments":[{"id":8945,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"1868:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}],"id":8944,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1863:4:42","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":8946,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1863:13:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC173_$8562","typeString":"type(contract IERC173)"}},"id":8947,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1877:11:42","memberName":"interfaceId","nodeType":"MemberAccess","src":"1863:25:42","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":8948,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1890:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":8939,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1806:25:42","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":8941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1832:6:42","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"1806:32:42","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":8942,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1806:34:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":8943,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1841:21:42","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"1806:56:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":8949,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1806:89:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8950,"nodeType":"ExpressionStatement","src":"1806:89:42"}]},"documentation":{"id":8909,"nodeType":"StructuredDocumentation","src":"1133:423:42","text":"@notice Initializes the storage with an initial contract owner (immutable version).\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"id":8952,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1570:15:42","nodeType":"FunctionDefinition","parameters":{"id":8915,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8912,"mutability":"mutable","name":"s","nameLocation":"1601:1:42","nodeType":"VariableDeclaration","scope":8952,"src":"1586:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":8911,"nodeType":"UserDefinedTypeName","pathNode":{"id":8910,"name":"Layout","nameLocations":["1586:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"1586:6:42"},"referencedDeclaration":8882,"src":"1586:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8914,"mutability":"mutable","name":"initialOwner","nameLocation":"1612:12:42","nodeType":"VariableDeclaration","scope":8952,"src":"1604:20:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8913,"name":"address","nodeType":"ElementaryTypeName","src":"1604:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1585:40:42"},"returnParameters":{"id":8916,"nodeType":"ParameterList","parameters":[],"src":"1635:0:42"},"scope":9109,"src":"1561:341:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":8974,"nodeType":"Block","src":"2567:112:42","statements":[{"expression":{"arguments":[{"id":8964,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8908,"src":"2606:21:42","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":8965,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2629:1:42","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":8961,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2577:19:42","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":8963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2597:8:42","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2577:28:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":8966,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2577:54:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8967,"nodeType":"ExpressionStatement","src":"2577:54:42"},{"expression":{"arguments":[{"id":8971,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8958,"src":"2659:12:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":8968,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8956,"src":"2641:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8970,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2643:15:42","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":8952,"src":"2641:17:42","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":8972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2641:31:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":8973,"nodeType":"ExpressionStatement","src":"2641:31:42"}]},"documentation":{"id":8953,"nodeType":"StructuredDocumentation","src":"1908:586:42","text":"@notice Initializes the storage with an initial contract owner (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"id":8975,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"2508:9:42","nodeType":"FunctionDefinition","parameters":{"id":8959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8956,"mutability":"mutable","name":"s","nameLocation":"2533:1:42","nodeType":"VariableDeclaration","scope":8975,"src":"2518:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":8955,"nodeType":"UserDefinedTypeName","pathNode":{"id":8954,"name":"Layout","nameLocations":["2518:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2518:6:42"},"referencedDeclaration":8882,"src":"2518:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8958,"mutability":"mutable","name":"initialOwner","nameLocation":"2544:12:42","nodeType":"VariableDeclaration","scope":8975,"src":"2536:20:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8957,"name":"address","nodeType":"ElementaryTypeName","src":"2536:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2517:40:42"},"returnParameters":{"id":8960,"nodeType":"ParameterList","parameters":[],"src":"2567:0:42"},"scope":9109,"src":"2499:180:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9015,"nodeType":"Block","src":"3142:281:42","statements":[{"assignments":[8987],"declarations":[{"constant":false,"id":8987,"mutability":"mutable","name":"previousOwner","nameLocation":"3160:13:42","nodeType":"VariableDeclaration","scope":9015,"src":"3152:21:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8986,"name":"address","nodeType":"ElementaryTypeName","src":"3152:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":8990,"initialValue":{"expression":{"id":8988,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8979,"src":"3176:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":8989,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3178:13:42","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":8881,"src":"3176:15:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"3152:39:42"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":8993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8991,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8981,"src":"3205:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":8992,"name":"previousOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8987,"src":"3215:13:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3205:23:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":8998,"nodeType":"IfStatement","src":"3201:60:42","trueBody":{"errorCall":{"arguments":[{"id":8995,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8981,"src":"3254:6:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":8994,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"3237:16:42","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":8996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3237:24:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":8997,"nodeType":"RevertStatement","src":"3230:31:42"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":8999,"name":"previousOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8987,"src":"3275:13:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":9000,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8983,"src":"3292:8:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3275:25:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9014,"nodeType":"IfStatement","src":"3271:146:42","trueBody":{"id":9013,"nodeType":"Block","src":"3302:115:42","statements":[{"expression":{"id":9006,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9002,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8979,"src":"3316:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":9004,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3318:13:42","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":8881,"src":"3316:15:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9005,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8983,"src":"3334:8:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3316:26:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9007,"nodeType":"ExpressionStatement","src":"3316:26:42"},{"eventCall":{"arguments":[{"id":9009,"name":"previousOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8987,"src":"3382:13:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9010,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8983,"src":"3397:8:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9008,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"3361:20:42","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":9011,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3361:45:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9012,"nodeType":"EmitStatement","src":"3356:50:42"}]}}]},"documentation":{"id":8976,"nodeType":"StructuredDocumentation","src":"2685:364:42","text":"@notice Sets the address of the new contract owner.\n @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\n @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\n @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership."},"id":9016,"implemented":true,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"3063:17:42","nodeType":"FunctionDefinition","parameters":{"id":8984,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8979,"mutability":"mutable","name":"s","nameLocation":"3096:1:42","nodeType":"VariableDeclaration","scope":9016,"src":"3081:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":8978,"nodeType":"UserDefinedTypeName","pathNode":{"id":8977,"name":"Layout","nameLocations":["3081:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"3081:6:42"},"referencedDeclaration":8882,"src":"3081:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":8981,"mutability":"mutable","name":"sender","nameLocation":"3107:6:42","nodeType":"VariableDeclaration","scope":9016,"src":"3099:14:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8980,"name":"address","nodeType":"ElementaryTypeName","src":"3099:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":8983,"mutability":"mutable","name":"newOwner","nameLocation":"3123:8:42","nodeType":"VariableDeclaration","scope":9016,"src":"3115:16:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":8982,"name":"address","nodeType":"ElementaryTypeName","src":"3115:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3080:52:42"},"returnParameters":{"id":8985,"nodeType":"ParameterList","parameters":[],"src":"3142:0:42"},"scope":9109,"src":"3054:369:42","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9028,"nodeType":"Block","src":"3629:39:42","statements":[{"expression":{"expression":{"id":9025,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9020,"src":"3646:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":9026,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3648:13:42","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":8881,"src":"3646:15:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":9024,"id":9027,"nodeType":"Return","src":"3639:22:42"}]},"documentation":{"id":9017,"nodeType":"StructuredDocumentation","src":"3429:116:42","text":"@notice Gets the address of the contract owner.\n @return contractOwner The address of the contract owner."},"id":9029,"implemented":true,"kind":"function","modifiers":[],"name":"owner","nameLocation":"3559:5:42","nodeType":"FunctionDefinition","parameters":{"id":9021,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9020,"mutability":"mutable","name":"s","nameLocation":"3580:1:42","nodeType":"VariableDeclaration","scope":9029,"src":"3565:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":9019,"nodeType":"UserDefinedTypeName","pathNode":{"id":9018,"name":"Layout","nameLocations":["3565:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"3565:6:42"},"referencedDeclaration":8882,"src":"3565:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"}],"src":"3564:18:42"},"returnParameters":{"id":9024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9023,"mutability":"mutable","name":"contractOwner","nameLocation":"3614:13:42","nodeType":"VariableDeclaration","scope":9029,"src":"3606:21:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9022,"name":"address","nodeType":"ElementaryTypeName","src":"3606:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3605:23:42"},"scope":9109,"src":"3550:118:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9056,"nodeType":"Block","src":"4064:154:42","statements":[{"condition":{"id":9042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4078:29:42","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9039,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9032,"src":"4079:14:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9040,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4094:11:42","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"4079:26:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":9041,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4079:28:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9047,"nodeType":"IfStatement","src":"4074:78:42","trueBody":{"errorCall":{"arguments":[{"id":9044,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9032,"src":"4137:14:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9043,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"4116:20:42","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9045,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4116:36:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9046,"nodeType":"RevertStatement","src":"4109:43:42"}},{"expression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9054,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":9049,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9032,"src":"4177:14:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9048,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"4169:7:42","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}},"id":9050,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4169:23:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC173_$8562","typeString":"contract IERC173"}},"id":9051,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4193:5:42","memberName":"owner","nodeType":"MemberAccess","referencedDeclaration":8561,"src":"4169:29:42","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":9052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4169:31:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":9053,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9034,"src":"4204:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4169:42:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":9038,"id":9055,"nodeType":"Return","src":"4162:49:42"}]},"documentation":{"id":9030,"nodeType":"StructuredDocumentation","src":"3674:261:42","text":"@notice Checks whether an account is the owner of a target contract.\n @param targetContract The contract to check.\n @param account The account to check.\n @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`."},"id":9057,"implemented":true,"kind":"function","modifiers":[],"name":"isTargetContractOwner","nameLocation":"3949:21:42","nodeType":"FunctionDefinition","parameters":{"id":9035,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9032,"mutability":"mutable","name":"targetContract","nameLocation":"3979:14:42","nodeType":"VariableDeclaration","scope":9057,"src":"3971:22:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9031,"name":"address","nodeType":"ElementaryTypeName","src":"3971:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9034,"mutability":"mutable","name":"account","nameLocation":"4003:7:42","nodeType":"VariableDeclaration","scope":9057,"src":"3995:15:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9033,"name":"address","nodeType":"ElementaryTypeName","src":"3995:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3970:41:42"},"returnParameters":{"id":9038,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9037,"mutability":"mutable","name":"isTargetContractOwner_","nameLocation":"4040:22:42","nodeType":"VariableDeclaration","scope":9057,"src":"4035:27:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9036,"name":"bool","nodeType":"ElementaryTypeName","src":"4035:4:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4034:29:42"},"scope":9109,"src":"3940:278:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9075,"nodeType":"Block","src":"4489:81:42","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9066,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9063,"src":"4503:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":9067,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9061,"src":"4514:1:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":9068,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4516:13:42","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":8881,"src":"4514:15:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4503:26:42","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9074,"nodeType":"IfStatement","src":"4499:64:42","trueBody":{"errorCall":{"arguments":[{"id":9071,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9063,"src":"4555:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9070,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"4538:16:42","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9072,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4538:25:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9073,"nodeType":"RevertStatement","src":"4531:32:42"}}]},"documentation":{"id":9058,"nodeType":"StructuredDocumentation","src":"4224:179:42","text":"@notice Ensures that an account is the contract owner.\n @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\n @param account The account."},"id":9076,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"4417:22:42","nodeType":"FunctionDefinition","parameters":{"id":9064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9061,"mutability":"mutable","name":"s","nameLocation":"4455:1:42","nodeType":"VariableDeclaration","scope":9076,"src":"4440:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":9060,"nodeType":"UserDefinedTypeName","pathNode":{"id":9059,"name":"Layout","nameLocations":["4440:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"4440:6:42"},"referencedDeclaration":8882,"src":"4440:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9063,"mutability":"mutable","name":"account","nameLocation":"4466:7:42","nodeType":"VariableDeclaration","scope":9076,"src":"4458:15:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9062,"name":"address","nodeType":"ElementaryTypeName","src":"4458:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4439:35:42"},"returnParameters":{"id":9065,"nodeType":"ParameterList","parameters":[],"src":"4489:0:42"},"scope":9109,"src":"4408:162:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9095,"nodeType":"Block","src":"4930:124:42","statements":[{"condition":{"id":9088,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4944:47:42","subExpression":{"arguments":[{"id":9085,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9079,"src":"4967:14:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9086,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9081,"src":"4983:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9084,"name":"isTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9057,"src":"4945:21:42","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (address,address) view returns (bool)"}},"id":9087,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4945:46:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9094,"nodeType":"IfStatement","src":"4940:107:42","trueBody":{"errorCall":{"arguments":[{"id":9090,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9079,"src":"5023:14:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9091,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9081,"src":"5039:7:42","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9089,"name":"NotTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8258,"src":"5000:22:42","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":9092,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5000:47:42","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9093,"nodeType":"RevertStatement","src":"4993:54:42"}}]},"documentation":{"id":9077,"nodeType":"StructuredDocumentation","src":"4576:256:42","text":"@notice Enforces that an account is the owner of a target contract.\n @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\n @param targetContract The contract to check.\n @param account The account to check."},"id":9096,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"4846:28:42","nodeType":"FunctionDefinition","parameters":{"id":9082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9079,"mutability":"mutable","name":"targetContract","nameLocation":"4883:14:42","nodeType":"VariableDeclaration","scope":9096,"src":"4875:22:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9078,"name":"address","nodeType":"ElementaryTypeName","src":"4875:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9081,"mutability":"mutable","name":"account","nameLocation":"4907:7:42","nodeType":"VariableDeclaration","scope":9096,"src":"4899:15:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9080,"name":"address","nodeType":"ElementaryTypeName","src":"4899:7:42","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4874:41:42"},"returnParameters":{"id":9083,"nodeType":"ParameterList","parameters":[],"src":"4930:0:42"},"scope":9109,"src":"4837:217:42","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9107,"nodeType":"Block","src":"5119:115:42","statements":[{"assignments":[9103],"declarations":[{"constant":false,"id":9103,"mutability":"mutable","name":"position","nameLocation":"5137:8:42","nodeType":"VariableDeclaration","scope":9107,"src":"5129:16:42","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9102,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5129:7:42","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":9105,"initialValue":{"id":9104,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8895,"src":"5148:19:42","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"5129:38:42"},{"AST":{"nativeSrc":"5186:42:42","nodeType":"YulBlock","src":"5186:42:42","statements":[{"nativeSrc":"5200:18:42","nodeType":"YulAssignment","src":"5200:18:42","value":{"name":"position","nativeSrc":"5210:8:42","nodeType":"YulIdentifier","src":"5210:8:42"},"variableNames":[{"name":"s.slot","nativeSrc":"5200:6:42","nodeType":"YulIdentifier","src":"5200:6:42"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":9103,"isOffset":false,"isSlot":false,"src":"5210:8:42","valueSize":1},{"declaration":9100,"isOffset":false,"isSlot":true,"src":"5200:6:42","suffix":"slot","valueSize":1}],"id":9106,"nodeType":"InlineAssembly","src":"5177:51:42"}]},"id":9108,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"5069:6:42","nodeType":"FunctionDefinition","parameters":{"id":9097,"nodeType":"ParameterList","parameters":[],"src":"5075:2:42"},"returnParameters":{"id":9101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9100,"mutability":"mutable","name":"s","nameLocation":"5116:1:42","nodeType":"VariableDeclaration","scope":9108,"src":"5101:16:42","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"},"typeName":{"id":9099,"nodeType":"UserDefinedTypeName","pathNode":{"id":9098,"name":"Layout","nameLocations":["5101:6:42"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"5101:6:42"},"referencedDeclaration":8882,"src":"5101:6:42","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}},"visibility":"internal"}],"src":"5100:18:42"},"scope":9109,"src":"5060:174:42","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":9110,"src":"589:4647:42","usedErrors":[],"usedEvents":[]}],"src":"32:5205:42"},"id":42},"contracts/access/libraries/SafeContractOwnershipStorage.sol":{"ast":{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","exportedSymbols":{"Address":[38035],"IERC173":[8562],"InterfaceDetectionStorage":[11680],"NotContractOwner":[8246],"NotPendingContractOwner":[8251],"NotTargetContractOwner":[8258],"OwnershipTransferPending":[8292],"OwnershipTransferred":[8287],"ProxyInitialization":[19524],"SafeContractOwnershipStorage":[9462],"TargetIsNotAContract":[8239]},"id":9463,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9111,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:43"},{"absolutePath":"contracts/access/errors/ContractOwnershipErrors.sol","file":"./../errors/ContractOwnershipErrors.sol","id":9115,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":8259,"src":"58:122:43","symbolAliases":[{"foreign":{"id":9112,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"66:16:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9113,"name":"NotPendingContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8251,"src":"84:23:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9114,"name":"NotTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8258,"src":"109:22:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/errors/Common.sol","file":"./../errors/Common.sol","id":9117,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":8240,"src":"181:60:43","symbolAliases":[{"foreign":{"id":9116,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"189:20:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/events/ERC173Events.sol","file":"./../events/ERC173Events.sol","id":9120,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":8293,"src":"242:92:43","symbolAliases":[{"foreign":{"id":9118,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"250:20:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9119,"name":"OwnershipTransferPending","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8292,"src":"272:24:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/interfaces/IERC173.sol","file":"./../interfaces/IERC173.sol","id":9122,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":8563,"src":"335:52:43","symbolAliases":[{"foreign":{"id":9121,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"343:7:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../utils/libraries/Address.sol","id":9124,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":38036,"src":"388:60:43","symbolAliases":[{"foreign":{"id":9123,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"396:7:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../proxy/libraries/ProxyInitialization.sol","id":9126,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":19525,"src":"449:84:43","symbolAliases":[{"foreign":{"id":9125,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"457:19:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":9128,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9463,"sourceUnit":11681,"src":"534:104:43","symbolAliases":[{"foreign":{"id":9127,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"542:25:43","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SafeContractOwnershipStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":9462,"linearizedBaseContracts":[9462],"name":"SafeContractOwnershipStorage","nameLocation":"648:28:43","nodeType":"ContractDefinition","nodes":[{"global":false,"id":9131,"libraryName":{"id":9129,"name":"Address","nameLocations":["689:7:43"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"689:7:43"},"nodeType":"UsingForDirective","src":"683:26:43","typeName":{"id":9130,"name":"address","nodeType":"ElementaryTypeName","src":"701:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":9135,"libraryName":{"id":9132,"name":"SafeContractOwnershipStorage","nameLocations":["720:28:43"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"720:28:43"},"nodeType":"UsingForDirective","src":"714:75:43","typeName":{"id":9134,"nodeType":"UserDefinedTypeName","pathNode":{"id":9133,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["753:28:43","782:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"753:35:43"},"referencedDeclaration":9144,"src":"753:35:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"global":false,"id":9139,"libraryName":{"id":9136,"name":"InterfaceDetectionStorage","nameLocations":["800:25:43"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"800:25:43"},"nodeType":"UsingForDirective","src":"794:69:43","typeName":{"id":9138,"nodeType":"UserDefinedTypeName","pathNode":{"id":9137,"name":"InterfaceDetectionStorage.Layout","nameLocations":["830:25:43","856:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"830:32:43"},"referencedDeclaration":11590,"src":"830:32:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"SafeContractOwnershipStorage.Layout","id":9144,"members":[{"constant":false,"id":9141,"mutability":"mutable","name":"contractOwner","nameLocation":"901:13:43","nodeType":"VariableDeclaration","scope":9144,"src":"893:21:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9140,"name":"address","nodeType":"ElementaryTypeName","src":"893:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9143,"mutability":"mutable","name":"pendingContractOwner","nameLocation":"932:20:43","nodeType":"VariableDeclaration","scope":9144,"src":"924:28:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9142,"name":"address","nodeType":"ElementaryTypeName","src":"924:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"Layout","nameLocation":"876:6:43","nodeType":"StructDefinition","scope":9462,"src":"869:90:43","visibility":"public"},{"constant":true,"id":9157,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"991:19:43","nodeType":"VariableDeclaration","scope":9462,"src":"965:132:43","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9145,"name":"bytes32","nodeType":"ElementaryTypeName","src":"965:7:43","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9155,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6163636573732e53616665436f6e74726163744f776e6572736869702e73746f72616765","id":9151,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1039:51:43","typeDescriptions":{"typeIdentifier":"t_stringliteral_9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c","typeString":"literal_string \"animoca.core.access.SafeContractOwnership.storage\""},"value":"animoca.core.access.SafeContractOwnership.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c","typeString":"literal_string \"animoca.core.access.SafeContractOwnership.storage\""}],"id":9150,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1029:9:43","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":9152,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1029:62:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":9149,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1021:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9148,"name":"uint256","nodeType":"ElementaryTypeName","src":"1021:7:43","typeDescriptions":{}}},"id":9153,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1021:71:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":9154,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1095:1:43","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1021:75:43","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9147,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1013:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":9146,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1013:7:43","typeDescriptions":{}}},"id":9156,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1013:84:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":9170,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"1129:21:43","nodeType":"VariableDeclaration","scope":9462,"src":"1103:132:43","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9158,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1103:7:43","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":9168,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6163636573732e53616665436f6e74726163744f776e6572736869702e7068617365","id":9164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1179:49:43","typeDescriptions":{"typeIdentifier":"t_stringliteral_0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41ce","typeString":"literal_string \"animoca.core.access.SafeContractOwnership.phase\""},"value":"animoca.core.access.SafeContractOwnership.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41ce","typeString":"literal_string \"animoca.core.access.SafeContractOwnership.phase\""}],"id":9163,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1169:9:43","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":9165,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1169:60:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":9162,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1161:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":9161,"name":"uint256","nodeType":"ElementaryTypeName","src":"1161:7:43","typeDescriptions":{}}},"id":9166,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1161:69:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":9167,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1233:1:43","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1161:73:43","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":9160,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1153:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":9159,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1153:7:43","typeDescriptions":{}}},"id":9169,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1153:82:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":9213,"nodeType":"Block","src":"1744:267:43","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9179,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9176,"src":"1758:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":9182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1782:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9181,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1774:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9180,"name":"address","nodeType":"ElementaryTypeName","src":"1774:7:43","typeDescriptions":{}}},"id":9183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1774:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1758:26:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9200,"nodeType":"IfStatement","src":"1754:152:43","trueBody":{"id":9199,"nodeType":"Block","src":"1786:120:43","statements":[{"expression":{"id":9189,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9185,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9174,"src":"1800:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9187,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1802:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"1800:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9188,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9176,"src":"1818:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1800:30:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9190,"nodeType":"ExpressionStatement","src":"1800:30:43"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":9194,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1878:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9193,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1870:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9192,"name":"address","nodeType":"ElementaryTypeName","src":"1870:7:43","typeDescriptions":{}}},"id":9195,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1870:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9196,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9176,"src":"1882:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9191,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"1849:20:43","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":9197,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1849:46:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9198,"nodeType":"EmitStatement","src":"1844:51:43"}]}},{"expression":{"arguments":[{"expression":{"arguments":[{"id":9207,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"1977:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}],"id":9206,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1972:4:43","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":9208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1972:13:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC173_$8562","typeString":"type(contract IERC173)"}},"id":9209,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1986:11:43","memberName":"interfaceId","nodeType":"MemberAccess","src":"1972:25:43","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":9210,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1999:4:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9201,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1915:25:43","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":9203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1941:6:43","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"1915:32:43","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":9204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1915:34:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":9205,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1950:21:43","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"1915:56:43","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":9211,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1915:89:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9212,"nodeType":"ExpressionStatement","src":"1915:89:43"}]},"documentation":{"id":9171,"nodeType":"StructuredDocumentation","src":"1242:423:43","text":"@notice Initializes the storage with an initial contract owner (immutable version).\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"id":9214,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1679:15:43","nodeType":"FunctionDefinition","parameters":{"id":9177,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9174,"mutability":"mutable","name":"s","nameLocation":"1710:1:43","nodeType":"VariableDeclaration","scope":9214,"src":"1695:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9173,"nodeType":"UserDefinedTypeName","pathNode":{"id":9172,"name":"Layout","nameLocations":["1695:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"1695:6:43"},"referencedDeclaration":9144,"src":"1695:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9176,"mutability":"mutable","name":"initialOwner","nameLocation":"1721:12:43","nodeType":"VariableDeclaration","scope":9214,"src":"1713:20:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9175,"name":"address","nodeType":"ElementaryTypeName","src":"1713:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1694:40:43"},"returnParameters":{"id":9178,"nodeType":"ParameterList","parameters":[],"src":"1744:0:43"},"scope":9462,"src":"1670:341:43","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9236,"nodeType":"Block","src":"2676:112:43","statements":[{"expression":{"arguments":[{"id":9226,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9170,"src":"2715:21:43","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":9227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2738:1:43","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":9223,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2686:19:43","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":9225,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2706:8:43","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2686:28:43","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":9228,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2686:54:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9229,"nodeType":"ExpressionStatement","src":"2686:54:43"},{"expression":{"arguments":[{"id":9233,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9220,"src":"2768:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":9230,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9218,"src":"2750:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9232,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2752:15:43","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":9214,"src":"2750:17:43","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address)"}},"id":9234,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2750:31:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9235,"nodeType":"ExpressionStatement","src":"2750:31:43"}]},"documentation":{"id":9215,"nodeType":"StructuredDocumentation","src":"2017:586:43","text":"@notice Initializes the storage with an initial contract owner (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC173.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\n @param initialOwner The initial contract owner."},"id":9237,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"2617:9:43","nodeType":"FunctionDefinition","parameters":{"id":9221,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9218,"mutability":"mutable","name":"s","nameLocation":"2642:1:43","nodeType":"VariableDeclaration","scope":9237,"src":"2627:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9217,"nodeType":"UserDefinedTypeName","pathNode":{"id":9216,"name":"Layout","nameLocations":["2627:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"2627:6:43"},"referencedDeclaration":9144,"src":"2627:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9220,"mutability":"mutable","name":"initialOwner","nameLocation":"2653:12:43","nodeType":"VariableDeclaration","scope":9237,"src":"2645:20:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9219,"name":"address","nodeType":"ElementaryTypeName","src":"2645:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2626:40:43"},"returnParameters":{"id":9222,"nodeType":"ParameterList","parameters":[],"src":"2676:0:43"},"scope":9462,"src":"2608:180:43","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9311,"nodeType":"Block","src":"3359:511:43","statements":[{"assignments":[9249],"declarations":[{"constant":false,"id":9249,"mutability":"mutable","name":"currentOwner","nameLocation":"3377:12:43","nodeType":"VariableDeclaration","scope":9311,"src":"3369:20:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9248,"name":"address","nodeType":"ElementaryTypeName","src":"3369:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9252,"initialValue":{"expression":{"id":9250,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9241,"src":"3392:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9251,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3394:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"3392:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"3369:38:43"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9255,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9253,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9243,"src":"3421:6:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":9254,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9249,"src":"3431:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3421:22:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9260,"nodeType":"IfStatement","src":"3417:59:43","trueBody":{"errorCall":{"arguments":[{"id":9257,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9243,"src":"3469:6:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9256,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"3452:16:43","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3452:24:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9259,"nodeType":"RevertStatement","src":"3445:31:43"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9266,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9261,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9245,"src":"3490:8:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":9264,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3510:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9263,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3502:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9262,"name":"address","nodeType":"ElementaryTypeName","src":"3502:7:43","typeDescriptions":{}}},"id":9265,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3502:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3490:22:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":9309,"nodeType":"Block","src":"3687:177:43","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9294,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9249,"src":"3705:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":9295,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9245,"src":"3721:8:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3705:24:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9308,"nodeType":"IfStatement","src":"3701:153:43","trueBody":{"id":9307,"nodeType":"Block","src":"3731:123:43","statements":[{"expression":{"id":9301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9297,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9241,"src":"3749:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9299,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3751:20:43","memberName":"pendingContractOwner","nodeType":"MemberAccess","referencedDeclaration":9143,"src":"3749:22:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9300,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9245,"src":"3774:8:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3749:33:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9302,"nodeType":"ExpressionStatement","src":"3749:33:43"},{"eventCall":{"arguments":[{"id":9304,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9245,"src":"3830:8:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9303,"name":"OwnershipTransferPending","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8292,"src":"3805:24:43","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":9305,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3805:34:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9306,"nodeType":"EmitStatement","src":"3800:39:43"}]}}]},"id":9310,"nodeType":"IfStatement","src":"3486:378:43","trueBody":{"id":9293,"nodeType":"Block","src":"3514:167:43","statements":[{"expression":{"id":9274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9267,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9241,"src":"3528:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9269,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3530:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"3528:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":9272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3554:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9271,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3546:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9270,"name":"address","nodeType":"ElementaryTypeName","src":"3546:7:43","typeDescriptions":{}}},"id":9273,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3546:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3528:28:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9275,"nodeType":"ExpressionStatement","src":"3528:28:43"},{"expression":{"id":9283,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9276,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9241,"src":"3570:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9278,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"3572:20:43","memberName":"pendingContractOwner","nodeType":"MemberAccess","referencedDeclaration":9143,"src":"3570:22:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":9281,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3603:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9280,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3595:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9279,"name":"address","nodeType":"ElementaryTypeName","src":"3595:7:43","typeDescriptions":{}}},"id":9282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3595:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3570:35:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9284,"nodeType":"ExpressionStatement","src":"3570:35:43"},{"eventCall":{"arguments":[{"id":9286,"name":"currentOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9249,"src":"3645:12:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":9289,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3667:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9288,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3659:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9287,"name":"address","nodeType":"ElementaryTypeName","src":"3659:7:43","typeDescriptions":{}}},"id":9290,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3659:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9285,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"3624:20:43","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":9291,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3624:46:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9292,"nodeType":"EmitStatement","src":"3619:51:43"}]}}]},"documentation":{"id":9238,"nodeType":"StructuredDocumentation","src":"2794:472:43","text":"@notice Sets an address as the pending new contract owner.\n @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\n @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\n @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\n @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership."},"id":9312,"implemented":true,"kind":"function","modifiers":[],"name":"transferOwnership","nameLocation":"3280:17:43","nodeType":"FunctionDefinition","parameters":{"id":9246,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9241,"mutability":"mutable","name":"s","nameLocation":"3313:1:43","nodeType":"VariableDeclaration","scope":9312,"src":"3298:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9240,"nodeType":"UserDefinedTypeName","pathNode":{"id":9239,"name":"Layout","nameLocations":["3298:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"3298:6:43"},"referencedDeclaration":9144,"src":"3298:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9243,"mutability":"mutable","name":"sender","nameLocation":"3324:6:43","nodeType":"VariableDeclaration","scope":9312,"src":"3316:14:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9242,"name":"address","nodeType":"ElementaryTypeName","src":"3316:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9245,"mutability":"mutable","name":"newOwner","nameLocation":"3340:8:43","nodeType":"VariableDeclaration","scope":9312,"src":"3332:16:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9244,"name":"address","nodeType":"ElementaryTypeName","src":"3332:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3297:52:43"},"returnParameters":{"id":9247,"nodeType":"ParameterList","parameters":[],"src":"3359:0:43"},"scope":9462,"src":"3271:599:43","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9355,"nodeType":"Block","src":"4170:321:43","statements":[{"assignments":[9322],"declarations":[{"constant":false,"id":9322,"mutability":"mutable","name":"pendingContractOwner","nameLocation":"4188:20:43","nodeType":"VariableDeclaration","scope":9355,"src":"4180:28:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9321,"name":"address","nodeType":"ElementaryTypeName","src":"4180:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":9325,"initialValue":{"expression":{"id":9323,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9316,"src":"4211:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9324,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4213:20:43","memberName":"pendingContractOwner","nodeType":"MemberAccess","referencedDeclaration":9143,"src":"4211:22:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4180:53:43"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9326,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9318,"src":"4247:6:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":9327,"name":"pendingContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9322,"src":"4257:20:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4247:30:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9333,"nodeType":"IfStatement","src":"4243:74:43","trueBody":{"errorCall":{"arguments":[{"id":9330,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9318,"src":"4310:6:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9329,"name":"NotPendingContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8251,"src":"4286:23:43","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4286:31:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9332,"nodeType":"RevertStatement","src":"4279:38:43"}},{"eventCall":{"arguments":[{"expression":{"id":9335,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9316,"src":"4353:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9336,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4355:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"4353:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9337,"name":"pendingContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9322,"src":"4370:20:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9334,"name":"OwnershipTransferred","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8287,"src":"4332:20:43","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":9338,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4332:59:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9339,"nodeType":"EmitStatement","src":"4327:64:43"},{"expression":{"id":9344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9340,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9316,"src":"4401:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9342,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"4403:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"4401:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":9343,"name":"pendingContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9322,"src":"4419:20:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4401:38:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9345,"nodeType":"ExpressionStatement","src":"4401:38:43"},{"expression":{"id":9353,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":9346,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9316,"src":"4449:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9348,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"4451:20:43","memberName":"pendingContractOwner","nodeType":"MemberAccess","referencedDeclaration":9143,"src":"4449:22:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"hexValue":"30","id":9351,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4482:1:43","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":9350,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4474:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":9349,"name":"address","nodeType":"ElementaryTypeName","src":"4474:7:43","typeDescriptions":{}}},"id":9352,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4474:10:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4449:35:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9354,"nodeType":"ExpressionStatement","src":"4449:35:43"}]},"documentation":{"id":9313,"nodeType":"StructuredDocumentation","src":"3876:221:43","text":"@notice Sets the pending contract owner as the new contract owner.\n @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\n @dev Emits an {OwnershipTransferred} event."},"id":9356,"implemented":true,"kind":"function","modifiers":[],"name":"acceptOwnership","nameLocation":"4111:15:43","nodeType":"FunctionDefinition","parameters":{"id":9319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9316,"mutability":"mutable","name":"s","nameLocation":"4142:1:43","nodeType":"VariableDeclaration","scope":9356,"src":"4127:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9315,"nodeType":"UserDefinedTypeName","pathNode":{"id":9314,"name":"Layout","nameLocations":["4127:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"4127:6:43"},"referencedDeclaration":9144,"src":"4127:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9318,"mutability":"mutable","name":"sender","nameLocation":"4153:6:43","nodeType":"VariableDeclaration","scope":9356,"src":"4145:14:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9317,"name":"address","nodeType":"ElementaryTypeName","src":"4145:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4126:34:43"},"returnParameters":{"id":9320,"nodeType":"ParameterList","parameters":[],"src":"4170:0:43"},"scope":9462,"src":"4102:389:43","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":9368,"nodeType":"Block","src":"4697:39:43","statements":[{"expression":{"expression":{"id":9365,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9360,"src":"4714:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9366,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4716:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"4714:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":9364,"id":9367,"nodeType":"Return","src":"4707:22:43"}]},"documentation":{"id":9357,"nodeType":"StructuredDocumentation","src":"4497:116:43","text":"@notice Gets the address of the contract owner.\n @return contractOwner The address of the contract owner."},"id":9369,"implemented":true,"kind":"function","modifiers":[],"name":"owner","nameLocation":"4627:5:43","nodeType":"FunctionDefinition","parameters":{"id":9361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9360,"mutability":"mutable","name":"s","nameLocation":"4648:1:43","nodeType":"VariableDeclaration","scope":9369,"src":"4633:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9359,"nodeType":"UserDefinedTypeName","pathNode":{"id":9358,"name":"Layout","nameLocations":["4633:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"4633:6:43"},"referencedDeclaration":9144,"src":"4633:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"}],"src":"4632:18:43"},"returnParameters":{"id":9364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9363,"mutability":"mutable","name":"contractOwner","nameLocation":"4682:13:43","nodeType":"VariableDeclaration","scope":9369,"src":"4674:21:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9362,"name":"address","nodeType":"ElementaryTypeName","src":"4674:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4673:23:43"},"scope":9462,"src":"4618:118:43","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9381,"nodeType":"Block","src":"4979:46:43","statements":[{"expression":{"expression":{"id":9378,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9373,"src":"4996:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9379,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4998:20:43","memberName":"pendingContractOwner","nodeType":"MemberAccess","referencedDeclaration":9143,"src":"4996:22:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":9377,"id":9380,"nodeType":"Return","src":"4989:29:43"}]},"documentation":{"id":9370,"nodeType":"StructuredDocumentation","src":"4742:139:43","text":"@notice Gets the address of the pending contract owner.\n @return pendingContractOwner The address of the pending contract owner."},"id":9382,"implemented":true,"kind":"function","modifiers":[],"name":"pendingOwner","nameLocation":"4895:12:43","nodeType":"FunctionDefinition","parameters":{"id":9374,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9373,"mutability":"mutable","name":"s","nameLocation":"4923:1:43","nodeType":"VariableDeclaration","scope":9382,"src":"4908:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9372,"nodeType":"UserDefinedTypeName","pathNode":{"id":9371,"name":"Layout","nameLocations":["4908:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"4908:6:43"},"referencedDeclaration":9144,"src":"4908:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"}],"src":"4907:18:43"},"returnParameters":{"id":9377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9376,"mutability":"mutable","name":"pendingContractOwner","nameLocation":"4957:20:43","nodeType":"VariableDeclaration","scope":9382,"src":"4949:28:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9375,"name":"address","nodeType":"ElementaryTypeName","src":"4949:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4948:30:43"},"scope":9462,"src":"4886:139:43","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9409,"nodeType":"Block","src":"5421:154:43","statements":[{"condition":{"id":9395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5435:29:43","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9392,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9385,"src":"5436:14:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5451:11:43","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"5436:26:43","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":9394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5436:28:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9400,"nodeType":"IfStatement","src":"5431:78:43","trueBody":{"errorCall":{"arguments":[{"id":9397,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9385,"src":"5494:14:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9396,"name":"TargetIsNotAContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8239,"src":"5473:20:43","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9398,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5473:36:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9399,"nodeType":"RevertStatement","src":"5466:43:43"}},{"expression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":9402,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9385,"src":"5534:14:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9401,"name":"IERC173","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8562,"src":"5526:7:43","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC173_$8562_$","typeString":"type(contract IERC173)"}},"id":9403,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5526:23:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC173_$8562","typeString":"contract IERC173"}},"id":9404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5550:5:43","memberName":"owner","nodeType":"MemberAccess","referencedDeclaration":8561,"src":"5526:29:43","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_address_$","typeString":"function () view external returns (address)"}},"id":9405,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5526:31:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":9406,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9387,"src":"5561:7:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5526:42:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":9391,"id":9408,"nodeType":"Return","src":"5519:49:43"}]},"documentation":{"id":9383,"nodeType":"StructuredDocumentation","src":"5031:261:43","text":"@notice Checks whether an account is the owner of a target contract.\n @param targetContract The contract to check.\n @param account The account to check.\n @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`."},"id":9410,"implemented":true,"kind":"function","modifiers":[],"name":"isTargetContractOwner","nameLocation":"5306:21:43","nodeType":"FunctionDefinition","parameters":{"id":9388,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9385,"mutability":"mutable","name":"targetContract","nameLocation":"5336:14:43","nodeType":"VariableDeclaration","scope":9410,"src":"5328:22:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9384,"name":"address","nodeType":"ElementaryTypeName","src":"5328:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9387,"mutability":"mutable","name":"account","nameLocation":"5360:7:43","nodeType":"VariableDeclaration","scope":9410,"src":"5352:15:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9386,"name":"address","nodeType":"ElementaryTypeName","src":"5352:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5327:41:43"},"returnParameters":{"id":9391,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9390,"mutability":"mutable","name":"isTargetContractOwner_","nameLocation":"5397:22:43","nodeType":"VariableDeclaration","scope":9410,"src":"5392:27:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":9389,"name":"bool","nodeType":"ElementaryTypeName","src":"5392:4:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5391:29:43"},"scope":9462,"src":"5297:278:43","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9428,"nodeType":"Block","src":"5846:81:43","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":9422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":9419,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9416,"src":"5860:7:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":9420,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9414,"src":"5871:1:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":9421,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5873:13:43","memberName":"contractOwner","nodeType":"MemberAccess","referencedDeclaration":9141,"src":"5871:15:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5860:26:43","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9427,"nodeType":"IfStatement","src":"5856:64:43","trueBody":{"errorCall":{"arguments":[{"id":9424,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9416,"src":"5912:7:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":9423,"name":"NotContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8246,"src":"5895:16:43","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":9425,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5895:25:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9426,"nodeType":"RevertStatement","src":"5888:32:43"}}]},"documentation":{"id":9411,"nodeType":"StructuredDocumentation","src":"5581:179:43","text":"@notice Ensures that an account is the contract owner.\n @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\n @param account The account."},"id":9429,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"5774:22:43","nodeType":"FunctionDefinition","parameters":{"id":9417,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9414,"mutability":"mutable","name":"s","nameLocation":"5812:1:43","nodeType":"VariableDeclaration","scope":9429,"src":"5797:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9413,"nodeType":"UserDefinedTypeName","pathNode":{"id":9412,"name":"Layout","nameLocations":["5797:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"5797:6:43"},"referencedDeclaration":9144,"src":"5797:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":9416,"mutability":"mutable","name":"account","nameLocation":"5823:7:43","nodeType":"VariableDeclaration","scope":9429,"src":"5815:15:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9415,"name":"address","nodeType":"ElementaryTypeName","src":"5815:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5796:35:43"},"returnParameters":{"id":9418,"nodeType":"ParameterList","parameters":[],"src":"5846:0:43"},"scope":9462,"src":"5765:162:43","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9448,"nodeType":"Block","src":"6287:124:43","statements":[{"condition":{"id":9441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6301:47:43","subExpression":{"arguments":[{"id":9438,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9432,"src":"6324:14:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9439,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9434,"src":"6340:7:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9437,"name":"isTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9410,"src":"6302:21:43","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (address,address) view returns (bool)"}},"id":9440,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6302:46:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":9447,"nodeType":"IfStatement","src":"6297:107:43","trueBody":{"errorCall":{"arguments":[{"id":9443,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9432,"src":"6380:14:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9444,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9434,"src":"6396:7:43","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":9442,"name":"NotTargetContractOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8258,"src":"6357:22:43","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":9445,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6357:47:43","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9446,"nodeType":"RevertStatement","src":"6350:54:43"}}]},"documentation":{"id":9430,"nodeType":"StructuredDocumentation","src":"5933:256:43","text":"@notice Enforces that an account is the owner of a target contract.\n @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\n @param targetContract The contract to check.\n @param account The account to check."},"id":9449,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"6203:28:43","nodeType":"FunctionDefinition","parameters":{"id":9435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9432,"mutability":"mutable","name":"targetContract","nameLocation":"6240:14:43","nodeType":"VariableDeclaration","scope":9449,"src":"6232:22:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9431,"name":"address","nodeType":"ElementaryTypeName","src":"6232:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9434,"mutability":"mutable","name":"account","nameLocation":"6264:7:43","nodeType":"VariableDeclaration","scope":9449,"src":"6256:15:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9433,"name":"address","nodeType":"ElementaryTypeName","src":"6256:7:43","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"6231:41:43"},"returnParameters":{"id":9436,"nodeType":"ParameterList","parameters":[],"src":"6287:0:43"},"scope":9462,"src":"6194:217:43","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":9460,"nodeType":"Block","src":"6476:115:43","statements":[{"assignments":[9456],"declarations":[{"constant":false,"id":9456,"mutability":"mutable","name":"position","nameLocation":"6494:8:43","nodeType":"VariableDeclaration","scope":9460,"src":"6486:16:43","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9455,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6486:7:43","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":9458,"initialValue":{"id":9457,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9157,"src":"6505:19:43","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"6486:38:43"},{"AST":{"nativeSrc":"6543:42:43","nodeType":"YulBlock","src":"6543:42:43","statements":[{"nativeSrc":"6557:18:43","nodeType":"YulAssignment","src":"6557:18:43","value":{"name":"position","nativeSrc":"6567:8:43","nodeType":"YulIdentifier","src":"6567:8:43"},"variableNames":[{"name":"s.slot","nativeSrc":"6557:6:43","nodeType":"YulIdentifier","src":"6557:6:43"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":9456,"isOffset":false,"isSlot":false,"src":"6567:8:43","valueSize":1},{"declaration":9453,"isOffset":false,"isSlot":true,"src":"6557:6:43","suffix":"slot","valueSize":1}],"id":9459,"nodeType":"InlineAssembly","src":"6534:51:43"}]},"id":9461,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"6426:6:43","nodeType":"FunctionDefinition","parameters":{"id":9450,"nodeType":"ParameterList","parameters":[],"src":"6432:2:43"},"returnParameters":{"id":9454,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9453,"mutability":"mutable","name":"s","nameLocation":"6473:1:43","nodeType":"VariableDeclaration","scope":9461,"src":"6458:16:43","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"},"typeName":{"id":9452,"nodeType":"UserDefinedTypeName","pathNode":{"id":9451,"name":"Layout","nameLocations":["6458:6:43"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"6458:6:43"},"referencedDeclaration":9144,"src":"6458:6:43","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}},"visibility":"internal"}],"src":"6457:18:43"},"scope":9462,"src":"6417:174:43","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":9463,"src":"640:5953:43","usedErrors":[],"usedEvents":[]}],"src":"32:6562:43"},"id":43},"contracts/cryptography/interfaces/IERC1271.sol":{"ast":{"absolutePath":"contracts/cryptography/interfaces/IERC1271.sol","exportedSymbols":{"IERC1271":[9476]},"id":9477,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9464,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:44"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1271","contractDependencies":[],"contractKind":"interface","documentation":{"id":9465,"nodeType":"StructuredDocumentation","src":"58:116:44","text":"@title Standard Signature Validation Method for Contracts.\n @dev See https://eips.ethereum.org/EIPS/eip-1271"},"fullyImplemented":false,"id":9476,"linearizedBaseContracts":[9476],"name":"IERC1271","nameLocation":"184:8:44","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":9466,"nodeType":"StructuredDocumentation","src":"199:314:44","text":"@notice Returns whether the signature is valid for the data hash.\n @param hash The hash of the signed data.\n @param signature The signature for `hash`.\n @return magicValue `0x1626ba7e` (`bytes4(keccak256(\"isValidSignature(bytes32,bytes)\")`) if the signature is valid, else any other value."},"functionSelector":"1626ba7e","id":9475,"implemented":false,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"527:16:44","nodeType":"FunctionDefinition","parameters":{"id":9471,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9468,"mutability":"mutable","name":"hash","nameLocation":"552:4:44","nodeType":"VariableDeclaration","scope":9475,"src":"544:12:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":9467,"name":"bytes32","nodeType":"ElementaryTypeName","src":"544:7:44","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":9470,"mutability":"mutable","name":"signature","nameLocation":"571:9:44","nodeType":"VariableDeclaration","scope":9475,"src":"558:22:44","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9469,"name":"bytes","nodeType":"ElementaryTypeName","src":"558:5:44","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"543:38:44"},"returnParameters":{"id":9474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9473,"mutability":"mutable","name":"magicValue","nameLocation":"612:10:44","nodeType":"VariableDeclaration","scope":9475,"src":"605:17:44","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9472,"name":"bytes4","nodeType":"ElementaryTypeName","src":"605:6:44","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"604:19:44"},"scope":9476,"src":"518:106:44","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":9477,"src":"174:452:44","usedErrors":[],"usedEvents":[]}],"src":"32:595:44"},"id":44},"contracts/diamond/Diamond.sol":{"ast":{"absolutePath":"contracts/diamond/Diamond.sol","exportedSymbols":{"Diamond":[9533],"DiamondStorage":[11524],"EtherReceptionDisabled":[7883],"FacetCut":[9555],"Initialization":[9560]},"id":9534,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9478,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:45"},{"id":9479,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"56:33:45"},{"absolutePath":"contracts/CommonErrors.sol","file":"./../CommonErrors.sol","id":9481,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9534,"sourceUnit":7890,"src":"91:61:45","symbolAliases":[{"foreign":{"id":9480,"name":"EtherReceptionDisabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7883,"src":"99:22:45","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./DiamondCommon.sol","id":9484,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9534,"sourceUnit":9561,"src":"153:61:45","symbolAliases":[{"foreign":{"id":9482,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"161:8:45","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9483,"name":"Initialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9560,"src":"171:14:45","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/libraries/DiamondStorage.sol","file":"./libraries/DiamondStorage.sol","id":9486,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9534,"sourceUnit":11525,"src":"215:62:45","symbolAliases":[{"foreign":{"id":9485,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"223:14:45","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Diamond","contractDependencies":[],"contractKind":"contract","documentation":{"id":9487,"nodeType":"StructuredDocumentation","src":"279:99:45","text":"@title ERC2535 Diamond Standard, Diamond.\n @dev See https://eips.ethereum.org/EIPS/eip-2535"},"fullyImplemented":true,"id":9533,"linearizedBaseContracts":[9533],"name":"Diamond","nameLocation":"387:7:45","nodeType":"ContractDefinition","nodes":[{"global":false,"id":9491,"libraryName":{"id":9488,"name":"DiamondStorage","nameLocations":["407:14:45"],"nodeType":"IdentifierPath","referencedDeclaration":11524,"src":"407:14:45"},"nodeType":"UsingForDirective","src":"401:47:45","typeName":{"id":9490,"nodeType":"UserDefinedTypeName","pathNode":{"id":9489,"name":"DiamondStorage.Layout","nameLocations":["426:14:45","441:6:45"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"426:21:45"},"referencedDeclaration":10024,"src":"426:21:45","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}}},{"body":{"id":9512,"nodeType":"Block","src":"898:74:45","statements":[{"expression":{"arguments":[{"id":9508,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9496,"src":"943:4:45","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},{"id":9509,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9500,"src":"949:15:45","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"},{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9503,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"908:14:45","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"923:6:45","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"908:21:45","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9506,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"908:23:45","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9507,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"932:10:45","memberName":"diamondCut","nodeType":"MemberAccess","referencedDeclaration":10197,"src":"908:34:45","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,struct Initialization memory[] memory)"}},"id":9510,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"908:57:45","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9511,"nodeType":"ExpressionStatement","src":"908:57:45"}]},"documentation":{"id":9492,"nodeType":"StructuredDocumentation","src":"454:354:45","text":"@notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\n @dev Emits a {DiamondCut} event.\n @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n @param initializations The list of addresses and encoded function calls to execute with delegatecall."},"id":9513,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":9501,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9496,"mutability":"mutable","name":"cuts","nameLocation":"843:4:45","nodeType":"VariableDeclaration","scope":9513,"src":"825:22:45","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9494,"nodeType":"UserDefinedTypeName","pathNode":{"id":9493,"name":"FacetCut","nameLocations":["825:8:45"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"825:8:45"},"referencedDeclaration":9555,"src":"825:8:45","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9495,"nodeType":"ArrayTypeName","src":"825:10:45","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9500,"mutability":"mutable","name":"initializations","nameLocation":"873:15:45","nodeType":"VariableDeclaration","scope":9513,"src":"849:39:45","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization[]"},"typeName":{"baseType":{"id":9498,"nodeType":"UserDefinedTypeName","pathNode":{"id":9497,"name":"Initialization","nameLocations":["849:14:45"],"nodeType":"IdentifierPath","referencedDeclaration":9560,"src":"849:14:45"},"referencedDeclaration":9560,"src":"849:14:45","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_storage_ptr","typeString":"struct Initialization"}},"id":9499,"nodeType":"ArrayTypeName","src":"849:16:45","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_storage_$dyn_storage_ptr","typeString":"struct Initialization[]"}},"visibility":"internal"}],"src":"824:65:45"},"returnParameters":{"id":9502,"nodeType":"ParameterList","parameters":[],"src":"898:0:45"},"scope":9533,"src":"813:159:45","stateMutability":"payable","virtual":false,"visibility":"public"},{"body":{"id":9524,"nodeType":"Block","src":"1157:61:45","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9517,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1167:14:45","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1182:6:45","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"1167:21:45","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9520,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1167:23:45","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9521,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1191:18:45","memberName":"delegateOnFallback","nodeType":"MemberAccess","referencedDeclaration":11030,"src":"1167:42:45","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer)"}},"id":9522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1167:44:45","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9523,"nodeType":"ExpressionStatement","src":"1167:44:45"}]},"documentation":{"id":9514,"nodeType":"StructuredDocumentation","src":"978:146:45","text":"@notice Execute a function from a facet with delegatecall.\n @dev Reverts with {FunctionNotFound} if the function selector is not found."},"id":9525,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":9515,"nodeType":"ParameterList","parameters":[],"src":"1137:2:45"},"returnParameters":{"id":9516,"nodeType":"ParameterList","parameters":[],"src":"1157:0:45"},"scope":9533,"src":"1129:89:45","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":9531,"nodeType":"Block","src":"1259:48:45","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":9528,"name":"EtherReceptionDisabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7883,"src":"1276:22:45","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":9529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1276:24:45","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":9530,"nodeType":"RevertStatement","src":"1269:31:45"}]},"id":9532,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":9526,"nodeType":"ParameterList","parameters":[],"src":"1231:2:45"},"returnParameters":{"id":9527,"nodeType":"ParameterList","parameters":[],"src":"1259:0:45"},"scope":9533,"src":"1224:83:45","stateMutability":"payable","virtual":true,"visibility":"external"}],"scope":9534,"src":"378:931:45","usedErrors":[7883,9567,9572,9579,9584,9589,9594,9601,9604,9609,9614,9621],"usedEvents":[9637]}],"src":"32:1278:45"},"id":45},"contracts/diamond/DiamondCommon.sol":{"ast":{"absolutePath":"contracts/diamond/DiamondCommon.sol","exportedSymbols":{"Facet":[9542],"FacetCut":[9555],"FacetCutAction":[9546],"Initialization":[9560]},"id":9561,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9535,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:46"},{"id":9536,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:46"},{"canonicalName":"Facet","id":9542,"members":[{"constant":false,"id":9538,"mutability":"mutable","name":"facet","nameLocation":"119:5:46","nodeType":"VariableDeclaration","scope":9542,"src":"111:13:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9537,"name":"address","nodeType":"ElementaryTypeName","src":"111:7:46","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9541,"mutability":"mutable","name":"selectors","nameLocation":"139:9:46","nodeType":"VariableDeclaration","scope":9542,"src":"130:18:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":9539,"name":"bytes4","nodeType":"ElementaryTypeName","src":"130:6:46","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":9540,"nodeType":"ArrayTypeName","src":"130:8:46","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"name":"Facet","nameLocation":"99:5:46","nodeType":"StructDefinition","scope":9561,"src":"92:59:46","visibility":"public"},{"canonicalName":"FacetCutAction","id":9546,"members":[{"id":9543,"name":"ADD","nameLocation":"179:3:46","nodeType":"EnumValue","src":"179:3:46"},{"id":9544,"name":"REPLACE","nameLocation":"188:7:46","nodeType":"EnumValue","src":"188:7:46"},{"id":9545,"name":"REMOVE","nameLocation":"201:6:46","nodeType":"EnumValue","src":"201:6:46"}],"name":"FacetCutAction","nameLocation":"158:14:46","nodeType":"EnumDefinition","src":"153:56:46"},{"canonicalName":"FacetCut","id":9555,"members":[{"constant":false,"id":9548,"mutability":"mutable","name":"facet","nameLocation":"271:5:46","nodeType":"VariableDeclaration","scope":9555,"src":"263:13:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9547,"name":"address","nodeType":"ElementaryTypeName","src":"263:7:46","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9551,"mutability":"mutable","name":"action","nameLocation":"297:6:46","nodeType":"VariableDeclaration","scope":9555,"src":"282:21:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"},"typeName":{"id":9550,"nodeType":"UserDefinedTypeName","pathNode":{"id":9549,"name":"FacetCutAction","nameLocations":["282:14:46"],"nodeType":"IdentifierPath","referencedDeclaration":9546,"src":"282:14:46"},"referencedDeclaration":9546,"src":"282:14:46","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"visibility":"internal"},{"constant":false,"id":9554,"mutability":"mutable","name":"selectors","nameLocation":"318:9:46","nodeType":"VariableDeclaration","scope":9555,"src":"309:18:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":9552,"name":"bytes4","nodeType":"ElementaryTypeName","src":"309:6:46","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":9553,"nodeType":"ArrayTypeName","src":"309:8:46","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"name":"FacetCut","nameLocation":"248:8:46","nodeType":"StructDefinition","scope":9561,"src":"241:89:46","visibility":"public"},{"canonicalName":"Initialization","id":9560,"members":[{"constant":false,"id":9557,"mutability":"mutable","name":"target","nameLocation":"368:6:46","nodeType":"VariableDeclaration","scope":9560,"src":"360:14:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9556,"name":"address","nodeType":"ElementaryTypeName","src":"360:7:46","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9559,"mutability":"mutable","name":"data","nameLocation":"386:4:46","nodeType":"VariableDeclaration","scope":9560,"src":"380:10:46","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":9558,"name":"bytes","nodeType":"ElementaryTypeName","src":"380:5:46","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"Initialization","nameLocation":"339:14:46","nodeType":"StructDefinition","scope":9561,"src":"332:61:46","visibility":"public"}],"src":"32:362:46"},"id":46},"contracts/diamond/errors/DiamondErrors.sol":{"ast":{"absolutePath":"contracts/diamond/errors/DiamondErrors.sol","exportedSymbols":{"EmptyFacet":[9567],"EmptyInitCallData":[9609],"FunctionAlreadyPresent":[9579],"FunctionNotFound":[9589],"InitCallReverted":[9621],"ModifyingImmutableFunction":[9594],"NonContractFacet":[9572],"NonContractInitCallTarget":[9614],"RemovingWithNonZeroAddressFacet":[9584],"ReplacingFunctionByItself":[9601],"ZeroAddressTargetInitCallButNonEmptyData":[9604]},"id":9622,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9562,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:47"},{"documentation":{"id":9563,"nodeType":"StructuredDocumentation","src":"58:131:47","text":"@notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\n @param facet The facet address."},"errorSelector":"b39ad1bb","id":9567,"name":"EmptyFacet","nameLocation":"195:10:47","nodeType":"ErrorDefinition","parameters":{"id":9566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9565,"mutability":"mutable","name":"facet","nameLocation":"214:5:47","nodeType":"VariableDeclaration","scope":9567,"src":"206:13:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9564,"name":"address","nodeType":"ElementaryTypeName","src":"206:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"205:15:47"},"src":"189:32:47"},{"documentation":{"id":9568,"nodeType":"StructuredDocumentation","src":"223:127:47","text":"@notice Thrown when trying to add or replace a facet which is not a deployed contract.\n @param facet The facet address."},"errorSelector":"32185e02","id":9572,"name":"NonContractFacet","nameLocation":"356:16:47","nodeType":"ErrorDefinition","parameters":{"id":9571,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9570,"mutability":"mutable","name":"facet","nameLocation":"381:5:47","nodeType":"VariableDeclaration","scope":9572,"src":"373:13:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9569,"name":"address","nodeType":"ElementaryTypeName","src":"373:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"372:15:47"},"src":"350:38:47"},{"documentation":{"id":9573,"nodeType":"StructuredDocumentation","src":"390:226:47","text":"@notice Thrown when trying to add a function selector that has already been added.\n @param facet The facet address which already has the function.\n @param selector The function selector which has already been added."},"errorSelector":"be33d136","id":9579,"name":"FunctionAlreadyPresent","nameLocation":"622:22:47","nodeType":"ErrorDefinition","parameters":{"id":9578,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9575,"mutability":"mutable","name":"facet","nameLocation":"653:5:47","nodeType":"VariableDeclaration","scope":9579,"src":"645:13:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9574,"name":"address","nodeType":"ElementaryTypeName","src":"645:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9577,"mutability":"mutable","name":"selector","nameLocation":"667:8:47","nodeType":"VariableDeclaration","scope":9579,"src":"660:15:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9576,"name":"bytes4","nodeType":"ElementaryTypeName","src":"660:6:47","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"644:32:47"},"src":"616:61:47"},{"documentation":{"id":9580,"nodeType":"StructuredDocumentation","src":"679:145:47","text":"@notice Thrown when trying to remove function selectors with a non-zero facet address.\n @param facet The facet address which is not zero."},"errorSelector":"91a5e1a3","id":9584,"name":"RemovingWithNonZeroAddressFacet","nameLocation":"830:31:47","nodeType":"ErrorDefinition","parameters":{"id":9583,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9582,"mutability":"mutable","name":"facet","nameLocation":"870:5:47","nodeType":"VariableDeclaration","scope":9584,"src":"862:13:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9581,"name":"address","nodeType":"ElementaryTypeName","src":"862:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"861:15:47"},"src":"824:53:47"},{"documentation":{"id":9585,"nodeType":"StructuredDocumentation","src":"879:174:47","text":"@notice Thrown when trying to execute, remove or replace a function selector that has not been added.\n @param selector The function selector which has not been added."},"errorSelector":"5416eb98","id":9589,"name":"FunctionNotFound","nameLocation":"1059:16:47","nodeType":"ErrorDefinition","parameters":{"id":9588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9587,"mutability":"mutable","name":"selector","nameLocation":"1083:8:47","nodeType":"VariableDeclaration","scope":9589,"src":"1076:15:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9586,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1076:6:47","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1075:17:47"},"src":"1053:40:47"},{"documentation":{"id":9590,"nodeType":"StructuredDocumentation","src":"1095:137:47","text":"@notice Thrown when trying to remove or replace an immutable function.\n @param selector The function selector which is immutable."},"errorSelector":"c792bbba","id":9594,"name":"ModifyingImmutableFunction","nameLocation":"1238:26:47","nodeType":"ErrorDefinition","parameters":{"id":9593,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9592,"mutability":"mutable","name":"selector","nameLocation":"1272:8:47","nodeType":"VariableDeclaration","scope":9594,"src":"1265:15:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9591,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1265:6:47","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1264:17:47"},"src":"1232:50:47"},{"documentation":{"id":9595,"nodeType":"StructuredDocumentation","src":"1284:167:47","text":"@notice Thrown when trying to replace a function with itself (from the same facet).\n @param facet The facet address.\n @param selector The function selector."},"errorSelector":"73d5d797","id":9601,"name":"ReplacingFunctionByItself","nameLocation":"1457:25:47","nodeType":"ErrorDefinition","parameters":{"id":9600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9597,"mutability":"mutable","name":"facet","nameLocation":"1491:5:47","nodeType":"VariableDeclaration","scope":9601,"src":"1483:13:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9596,"name":"address","nodeType":"ElementaryTypeName","src":"1483:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9599,"mutability":"mutable","name":"selector","nameLocation":"1505:8:47","nodeType":"VariableDeclaration","scope":9601,"src":"1498:15:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9598,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1498:6:47","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1482:32:47"},"src":"1451:64:47"},{"documentation":{"id":9602,"nodeType":"StructuredDocumentation","src":"1517:113:47","text":"@notice Thrown when trying to call an initialization function with a zero address target and non-empty data."},"errorSelector":"e694fd80","id":9604,"name":"ZeroAddressTargetInitCallButNonEmptyData","nameLocation":"1636:40:47","nodeType":"ErrorDefinition","parameters":{"id":9603,"nodeType":"ParameterList","parameters":[],"src":"1676:2:47"},"src":"1630:49:47"},{"documentation":{"id":9605,"nodeType":"StructuredDocumentation","src":"1681:162:47","text":"@notice Thrown when trying to call an initialization function with a target and empty data.\n @param target The target address for the initialization call."},"errorSelector":"f2a21400","id":9609,"name":"EmptyInitCallData","nameLocation":"1849:17:47","nodeType":"ErrorDefinition","parameters":{"id":9608,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9607,"mutability":"mutable","name":"target","nameLocation":"1875:6:47","nodeType":"VariableDeclaration","scope":9609,"src":"1867:14:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9606,"name":"address","nodeType":"ElementaryTypeName","src":"1867:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1866:16:47"},"src":"1843:40:47"},{"documentation":{"id":9610,"nodeType":"StructuredDocumentation","src":"1885:159:47","text":"@notice Thrown when trying to call an initialization function on a non-contract address.\n @param target The target address for the initialization call."},"errorSelector":"df3b7fa9","id":9614,"name":"NonContractInitCallTarget","nameLocation":"2050:25:47","nodeType":"ErrorDefinition","parameters":{"id":9613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9612,"mutability":"mutable","name":"target","nameLocation":"2084:6:47","nodeType":"VariableDeclaration","scope":9614,"src":"2076:14:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9611,"name":"address","nodeType":"ElementaryTypeName","src":"2076:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2075:16:47"},"src":"2044:48:47"},{"documentation":{"id":9615,"nodeType":"StructuredDocumentation","src":"2094:221:47","text":"@notice Thrown when trying to call an initialization function which reverts without return data.\n @param target The target address for the initialization call.\n @param data The data for the initialization call."},"errorSelector":"e83ddca5","id":9621,"name":"InitCallReverted","nameLocation":"2321:16:47","nodeType":"ErrorDefinition","parameters":{"id":9620,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9617,"mutability":"mutable","name":"target","nameLocation":"2346:6:47","nodeType":"VariableDeclaration","scope":9621,"src":"2338:14:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9616,"name":"address","nodeType":"ElementaryTypeName","src":"2338:7:47","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9619,"mutability":"mutable","name":"data","nameLocation":"2360:4:47","nodeType":"VariableDeclaration","scope":9621,"src":"2354:10:47","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9618,"name":"bytes","nodeType":"ElementaryTypeName","src":"2354:5:47","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2337:28:47"},"src":"2315:51:47"}],"src":"32:2335:47"},"id":47},"contracts/diamond/events/DiamondCutEvents.sol":{"ast":{"absolutePath":"contracts/diamond/events/DiamondCutEvents.sol","exportedSymbols":{"DiamondCut":[9637],"FacetCut":[9555]},"id":9638,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9623,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:48"},{"id":9624,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:48"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9626,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9638,"sourceUnit":9561,"src":"92:48:48","symbolAliases":[{"foreign":{"id":9625,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"100:8:48","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"anonymous":false,"documentation":{"id":9627,"nodeType":"StructuredDocumentation","src":"142:312:48","text":"@notice Emitted when at least a cut action is operated on the diamond.\n @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\n @param target The address of the contract where `data` was executed.\n @param data The encoded function call executed on `target`."},"eventSelector":"8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673","id":9637,"name":"DiamondCut","nameLocation":"460:10:48","nodeType":"EventDefinition","parameters":{"id":9636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9631,"indexed":false,"mutability":"mutable","name":"cuts","nameLocation":"482:4:48","nodeType":"VariableDeclaration","scope":9637,"src":"471:15:48","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9629,"nodeType":"UserDefinedTypeName","pathNode":{"id":9628,"name":"FacetCut","nameLocations":["471:8:48"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"471:8:48"},"referencedDeclaration":9555,"src":"471:8:48","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9630,"nodeType":"ArrayTypeName","src":"471:10:48","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9633,"indexed":false,"mutability":"mutable","name":"target","nameLocation":"496:6:48","nodeType":"VariableDeclaration","scope":9637,"src":"488:14:48","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9632,"name":"address","nodeType":"ElementaryTypeName","src":"488:7:48","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9635,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"510:4:48","nodeType":"VariableDeclaration","scope":9637,"src":"504:10:48","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":9634,"name":"bytes","nodeType":"ElementaryTypeName","src":"504:5:48","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"470:45:48"},"src":"454:62:48"}],"src":"32:485:48"},"id":48},"contracts/diamond/facets/DiamondCutFacet.sol":{"ast":{"absolutePath":"contracts/diamond/facets/DiamondCutFacet.sol","exportedSymbols":{"DiamondCutFacet":[9763],"DiamondStorage":[11524],"FacetCut":[9555],"ForwarderRegistryContextBase":[13297],"IDiamondCut":[9910],"IDiamondCutBatchInit":[9930],"IForwarderRegistry":[13386],"Initialization":[9560],"ProxyAdminStorage":[19477]},"id":9764,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9639,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:49"},{"id":9640,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"56:33:49"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9643,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":9561,"src":"91:64:49","symbolAliases":[{"foreign":{"id":9641,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"99:8:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9642,"name":"Initialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9560,"src":"109:14:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":9645,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":13387,"src":"156:84:49","symbolAliases":[{"foreign":{"id":9644,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"164:18:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondCut.sol","file":"./../interfaces/IDiamondCut.sol","id":9647,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":9911,"src":"241:60:49","symbolAliases":[{"foreign":{"id":9646,"name":"IDiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9910,"src":"249:11:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondCutBatchInit.sol","file":"./../interfaces/IDiamondCutBatchInit.sol","id":9649,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":9931,"src":"302:78:49","symbolAliases":[{"foreign":{"id":9648,"name":"IDiamondCutBatchInit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9930,"src":"310:20:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/libraries/DiamondStorage.sol","file":"./../libraries/DiamondStorage.sol","id":9651,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":11525,"src":"381:65:49","symbolAliases":[{"foreign":{"id":9650,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"389:14:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":9653,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":19478,"src":"447:80:49","symbolAliases":[{"foreign":{"id":9652,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"455:17:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":9655,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9764,"sourceUnit":13298,"src":"528:98:49","symbolAliases":[{"foreign":{"id":9654,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"536:28:49","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":9657,"name":"IDiamondCut","nameLocations":["835:11:49"],"nodeType":"IdentifierPath","referencedDeclaration":9910,"src":"835:11:49"},"id":9658,"nodeType":"InheritanceSpecifier","src":"835:11:49"},{"baseName":{"id":9659,"name":"IDiamondCutBatchInit","nameLocations":["848:20:49"],"nodeType":"IdentifierPath","referencedDeclaration":9930,"src":"848:20:49"},"id":9660,"nodeType":"InheritanceSpecifier","src":"848:20:49"},{"baseName":{"id":9661,"name":"ForwarderRegistryContextBase","nameLocations":["870:28:49"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"870:28:49"},"id":9662,"nodeType":"InheritanceSpecifier","src":"870:28:49"}],"canonicalName":"DiamondCutFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":9656,"nodeType":"StructuredDocumentation","src":"628:179:49","text":"@title Diamond Cut (facet version).\n @dev See https://eips.ethereum.org/EIPS/eip-2535\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":9763,"linearizedBaseContracts":[9763,13297,9930,9910],"name":"DiamondCutFacet","nameLocation":"816:15:49","nodeType":"ContractDefinition","nodes":[{"global":false,"id":9666,"libraryName":{"id":9663,"name":"ProxyAdminStorage","nameLocations":["911:17:49"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"911:17:49"},"nodeType":"UsingForDirective","src":"905:53:49","typeName":{"id":9665,"nodeType":"UserDefinedTypeName","pathNode":{"id":9664,"name":"ProxyAdminStorage.Layout","nameLocations":["933:17:49","951:6:49"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"933:24:49"},"referencedDeclaration":19308,"src":"933:24:49","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":9670,"libraryName":{"id":9667,"name":"DiamondStorage","nameLocations":["969:14:49"],"nodeType":"IdentifierPath","referencedDeclaration":11524,"src":"969:14:49"},"nodeType":"UsingForDirective","src":"963:47:49","typeName":{"id":9669,"nodeType":"UserDefinedTypeName","pathNode":{"id":9668,"name":"DiamondStorage.Layout","nameLocations":["988:14:49","1003:6:49"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"988:21:49"},"referencedDeclaration":10024,"src":"988:21:49","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}}},{"body":{"id":9679,"nodeType":"Block","src":"1114:2:49","statements":[]},"id":9680,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":9676,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9673,"src":"1095:17:49","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":9677,"kind":"baseConstructorSpecifier","modifierName":{"id":9675,"name":"ForwarderRegistryContextBase","nameLocations":["1066:28:49"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1066:28:49"},"nodeType":"ModifierInvocation","src":"1066:47:49"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":9674,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9673,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1047:17:49","nodeType":"VariableDeclaration","scope":9680,"src":"1028:36:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":9672,"nodeType":"UserDefinedTypeName","pathNode":{"id":9671,"name":"IForwarderRegistry","nameLocations":["1028:18:49"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1028:18:49"},"referencedDeclaration":13386,"src":"1028:18:49","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1027:38:49"},"returnParameters":{"id":9678,"nodeType":"ParameterList","parameters":[],"src":"1114:0:49"},"scope":9763,"src":"1016:100:49","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":9698,"nodeType":"Block","src":"1347:118:49","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":9689,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"1404:10:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":9690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1404:12:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9684,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1357:17:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":9686,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1375:6:49","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1357:24:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":9687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1357:26:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":9688,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1384:19:49","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1357:46:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":9691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1357:60:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9692,"nodeType":"ExpressionStatement","src":"1357:60:49"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9693,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1427:14:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1442:14:49","memberName":"initDiamondCut","nodeType":"MemberAccess","referencedDeclaration":10091,"src":"1427:29:49","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":9696,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1427:31:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9697,"nodeType":"ExpressionStatement","src":"1427:31:49"}]},"documentation":{"id":9681,"nodeType":"StructuredDocumentation","src":"1122:178:49","text":"@notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"95bce666","id":9699,"implemented":true,"kind":"function","modifiers":[],"name":"initDiamondCutStorage","nameLocation":"1314:21:49","nodeType":"FunctionDefinition","parameters":{"id":9682,"nodeType":"ParameterList","parameters":[],"src":"1335:2:49"},"returnParameters":{"id":9683,"nodeType":"ParameterList","parameters":[],"src":"1347:0:49"},"scope":9763,"src":"1305:160:49","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[9909],"body":{"id":9730,"nodeType":"Block","src":"1675:141:49","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":9716,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"1732:10:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":9717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1732:12:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9711,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1685:17:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":9713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1703:6:49","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1685:24:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":9714,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1685:26:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":9715,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1712:19:49","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1685:46:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":9718,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1685:60:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9719,"nodeType":"ExpressionStatement","src":"1685:60:49"},{"expression":{"arguments":[{"id":9725,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9704,"src":"1790:4:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut calldata[] calldata"}},{"id":9726,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9706,"src":"1796:6:49","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":9727,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9708,"src":"1804:4:49","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut calldata[] calldata"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9720,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1755:14:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1770:6:49","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"1755:21:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9723,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1755:23:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9724,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1779:10:49","memberName":"diamondCut","nodeType":"MemberAccess","referencedDeclaration":10140,"src":"1755:34:49","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,address,bytes memory)"}},"id":9728,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1755:54:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9729,"nodeType":"ExpressionStatement","src":"1755:54:49"}]},"documentation":{"id":9700,"nodeType":"StructuredDocumentation","src":"1471:107:49","text":"@inheritdoc IDiamondCut\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"1f931c1c","id":9731,"implemented":true,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"1592:10:49","nodeType":"FunctionDefinition","parameters":{"id":9709,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9704,"mutability":"mutable","name":"cuts","nameLocation":"1623:4:49","nodeType":"VariableDeclaration","scope":9731,"src":"1603:24:49","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9702,"nodeType":"UserDefinedTypeName","pathNode":{"id":9701,"name":"FacetCut","nameLocations":["1603:8:49"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"1603:8:49"},"referencedDeclaration":9555,"src":"1603:8:49","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9703,"nodeType":"ArrayTypeName","src":"1603:10:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9706,"mutability":"mutable","name":"target","nameLocation":"1637:6:49","nodeType":"VariableDeclaration","scope":9731,"src":"1629:14:49","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9705,"name":"address","nodeType":"ElementaryTypeName","src":"1629:7:49","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9708,"mutability":"mutable","name":"data","nameLocation":"1660:4:49","nodeType":"VariableDeclaration","scope":9731,"src":"1645:19:49","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":9707,"name":"bytes","nodeType":"ElementaryTypeName","src":"1645:5:49","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1602:63:49"},"returnParameters":{"id":9710,"nodeType":"ParameterList","parameters":[],"src":"1675:0:49"},"scope":9763,"src":"1583:233:49","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[9929],"body":{"id":9761,"nodeType":"Block","src":"2041:144:49","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":9748,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"2098:10:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":9749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2098:12:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9743,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"2051:17:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":9745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2069:6:49","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"2051:24:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":9746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2051:26:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":9747,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2078:19:49","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"2051:46:49","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":9750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2051:60:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9751,"nodeType":"ExpressionStatement","src":"2051:60:49"},{"expression":{"arguments":[{"id":9757,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9736,"src":"2156:4:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut calldata[] calldata"}},{"id":9758,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9740,"src":"2162:15:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_calldata_ptr_$dyn_calldata_ptr","typeString":"struct Initialization calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut calldata[] calldata"},{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_calldata_ptr_$dyn_calldata_ptr","typeString":"struct Initialization calldata[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9752,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"2121:14:49","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2136:6:49","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"2121:21:49","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2121:23:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9756,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2145:10:49","memberName":"diamondCut","nodeType":"MemberAccess","referencedDeclaration":10197,"src":"2121:34:49","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,struct Initialization memory[] memory)"}},"id":9759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2121:57:49","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9760,"nodeType":"ExpressionStatement","src":"2121:57:49"}]},"documentation":{"id":9732,"nodeType":"StructuredDocumentation","src":"1822:116:49","text":"@inheritdoc IDiamondCutBatchInit\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"b2afc5b5","id":9762,"implemented":true,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"1952:10:49","nodeType":"FunctionDefinition","parameters":{"id":9741,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9736,"mutability":"mutable","name":"cuts","nameLocation":"1983:4:49","nodeType":"VariableDeclaration","scope":9762,"src":"1963:24:49","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9734,"nodeType":"UserDefinedTypeName","pathNode":{"id":9733,"name":"FacetCut","nameLocations":["1963:8:49"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"1963:8:49"},"referencedDeclaration":9555,"src":"1963:8:49","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9735,"nodeType":"ArrayTypeName","src":"1963:10:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9740,"mutability":"mutable","name":"initializations","nameLocation":"2015:15:49","nodeType":"VariableDeclaration","scope":9762,"src":"1989:41:49","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_calldata_ptr_$dyn_calldata_ptr","typeString":"struct Initialization[]"},"typeName":{"baseType":{"id":9738,"nodeType":"UserDefinedTypeName","pathNode":{"id":9737,"name":"Initialization","nameLocations":["1989:14:49"],"nodeType":"IdentifierPath","referencedDeclaration":9560,"src":"1989:14:49"},"referencedDeclaration":9560,"src":"1989:14:49","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_storage_ptr","typeString":"struct Initialization"}},"id":9739,"nodeType":"ArrayTypeName","src":"1989:16:49","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_storage_$dyn_storage_ptr","typeString":"struct Initialization[]"}},"visibility":"internal"}],"src":"1962:69:49"},"returnParameters":{"id":9742,"nodeType":"ParameterList","parameters":[],"src":"2041:0:49"},"scope":9763,"src":"1943:242:49","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":9764,"src":"807:1380:49","usedErrors":[9567,9572,9579,9584,9589,9594,9601,9604,9609,9614,9621,11559,19183],"usedEvents":[9637]}],"src":"32:2156:49"},"id":49},"contracts/diamond/facets/DiamondLoupeFacet.sol":{"ast":{"absolutePath":"contracts/diamond/facets/DiamondLoupeFacet.sol","exportedSymbols":{"DiamondLoupeFacet":[9891],"DiamondStorage":[11524],"Facet":[9542],"ForwarderRegistryContextBase":[13297],"IDiamondLoupe":[9969],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":9892,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9765,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:50"},{"id":9766,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"56:33:50"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9768,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":9561,"src":"91:45:50","symbolAliases":[{"foreign":{"id":9767,"name":"Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9542,"src":"99:5:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":9770,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":13387,"src":"137:84:50","symbolAliases":[{"foreign":{"id":9769,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"145:18:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondLoupe.sol","file":"./../interfaces/IDiamondLoupe.sol","id":9772,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":9970,"src":"222:64:50","symbolAliases":[{"foreign":{"id":9771,"name":"IDiamondLoupe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9969,"src":"230:13:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/libraries/DiamondStorage.sol","file":"./../libraries/DiamondStorage.sol","id":9774,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":11525,"src":"287:65:50","symbolAliases":[{"foreign":{"id":9773,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"295:14:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":9776,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":19478,"src":"353:80:50","symbolAliases":[{"foreign":{"id":9775,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"361:17:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":9778,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9892,"sourceUnit":13298,"src":"434:98:50","symbolAliases":[{"foreign":{"id":9777,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"442:28:50","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":9780,"name":"IDiamondLoupe","nameLocations":["745:13:50"],"nodeType":"IdentifierPath","referencedDeclaration":9969,"src":"745:13:50"},"id":9781,"nodeType":"InheritanceSpecifier","src":"745:13:50"},{"baseName":{"id":9782,"name":"ForwarderRegistryContextBase","nameLocations":["760:28:50"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"760:28:50"},"id":9783,"nodeType":"InheritanceSpecifier","src":"760:28:50"}],"canonicalName":"DiamondLoupeFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":9779,"nodeType":"StructuredDocumentation","src":"534:181:50","text":"@title Diamond Loupe (facet version).\n @dev See https://eips.ethereum.org/EIPS/eip-2535\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":9891,"linearizedBaseContracts":[9891,13297,9969],"name":"DiamondLoupeFacet","nameLocation":"724:17:50","nodeType":"ContractDefinition","nodes":[{"global":false,"id":9787,"libraryName":{"id":9784,"name":"ProxyAdminStorage","nameLocations":["801:17:50"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"801:17:50"},"nodeType":"UsingForDirective","src":"795:53:50","typeName":{"id":9786,"nodeType":"UserDefinedTypeName","pathNode":{"id":9785,"name":"ProxyAdminStorage.Layout","nameLocations":["823:17:50","841:6:50"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"823:24:50"},"referencedDeclaration":19308,"src":"823:24:50","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":9791,"libraryName":{"id":9788,"name":"DiamondStorage","nameLocations":["859:14:50"],"nodeType":"IdentifierPath","referencedDeclaration":11524,"src":"859:14:50"},"nodeType":"UsingForDirective","src":"853:47:50","typeName":{"id":9790,"nodeType":"UserDefinedTypeName","pathNode":{"id":9789,"name":"DiamondStorage.Layout","nameLocations":["878:14:50","893:6:50"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"878:21:50"},"referencedDeclaration":10024,"src":"878:21:50","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}}},{"body":{"id":9800,"nodeType":"Block","src":"1004:2:50","statements":[]},"id":9801,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":9797,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9794,"src":"985:17:50","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":9798,"kind":"baseConstructorSpecifier","modifierName":{"id":9796,"name":"ForwarderRegistryContextBase","nameLocations":["956:28:50"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"956:28:50"},"nodeType":"ModifierInvocation","src":"956:47:50"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":9795,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9794,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"937:17:50","nodeType":"VariableDeclaration","scope":9801,"src":"918:36:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":9793,"nodeType":"UserDefinedTypeName","pathNode":{"id":9792,"name":"IForwarderRegistry","nameLocations":["918:18:50"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"918:18:50"},"referencedDeclaration":13386,"src":"918:18:50","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"917:38:50"},"returnParameters":{"id":9799,"nodeType":"ParameterList","parameters":[],"src":"1004:0:50"},"scope":9891,"src":"906:100:50","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":9819,"nodeType":"Block","src":"1220:120:50","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":9810,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"1277:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":9811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1277:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9805,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1230:17:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":9807,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1248:6:50","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1230:24:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":9808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1230:26:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":9809,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1257:19:50","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1230:46:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":9812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1230:60:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9813,"nodeType":"ExpressionStatement","src":"1230:60:50"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9814,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1300:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9816,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1315:16:50","memberName":"initDiamondLoupe","nodeType":"MemberAccess","referencedDeclaration":10108,"src":"1300:31:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":9817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1300:33:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":9818,"nodeType":"ExpressionStatement","src":"1300:33:50"}]},"documentation":{"id":9802,"nodeType":"StructuredDocumentation","src":"1012:159:50","text":"@notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"4fe5dd79","id":9820,"implemented":true,"kind":"function","modifiers":[],"name":"initDiamondLoupeStorage","nameLocation":"1185:23:50","nodeType":"FunctionDefinition","parameters":{"id":9803,"nodeType":"ParameterList","parameters":[],"src":"1208:2:50"},"returnParameters":{"id":9804,"nodeType":"ParameterList","parameters":[],"src":"1220:0:50"},"scope":9891,"src":"1176:164:50","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[9944],"body":{"id":9836,"nodeType":"Block","src":"1445:59:50","statements":[{"expression":{"id":9834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9828,"name":"facets_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9826,"src":"1455:7:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9829,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1465:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1480:6:50","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"1465:21:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9831,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1465:23:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9832,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1489:6:50","memberName":"facets","nodeType":"MemberAccess","referencedDeclaration":11248,"src":"1465:30:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$10024_storage_ptr_$returns$_t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer) view returns (struct Facet memory[] memory)"}},"id":9833,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1465:32:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"src":"1455:42:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":9835,"nodeType":"ExpressionStatement","src":"1455:42:50"}]},"documentation":{"id":9821,"nodeType":"StructuredDocumentation","src":"1346:29:50","text":"@inheritdoc IDiamondLoupe"},"functionSelector":"7a0ed627","id":9837,"implemented":true,"kind":"function","modifiers":[],"name":"facets","nameLocation":"1389:6:50","nodeType":"FunctionDefinition","parameters":{"id":9822,"nodeType":"ParameterList","parameters":[],"src":"1395:2:50"},"returnParameters":{"id":9827,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9826,"mutability":"mutable","name":"facets_","nameLocation":"1436:7:50","nodeType":"VariableDeclaration","scope":9837,"src":"1421:22:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet[]"},"typeName":{"baseType":{"id":9824,"nodeType":"UserDefinedTypeName","pathNode":{"id":9823,"name":"Facet","nameLocations":["1421:5:50"],"nodeType":"IdentifierPath","referencedDeclaration":9542,"src":"1421:5:50"},"referencedDeclaration":9542,"src":"1421:5:50","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_storage_ptr","typeString":"struct Facet"}},"id":9825,"nodeType":"ArrayTypeName","src":"1421:7:50","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_storage_$dyn_storage_ptr","typeString":"struct Facet[]"}},"visibility":"internal"}],"src":"1420:24:50"},"scope":9891,"src":"1380:124:50","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[9953],"body":{"id":9855,"nodeType":"Block","src":"1655:96:50","statements":[{"expression":{"id":9853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9846,"name":"facetFunctionSelectors_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9844,"src":"1665:23:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9851,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9840,"src":"1738:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9847,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1691:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1706:6:50","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"1691:21:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1691:23:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9850,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1715:22:50","memberName":"facetFunctionSelectors","nodeType":"MemberAccess","referencedDeclaration":11354,"src":"1691:46:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$10024_storage_ptr_$_t_address_$returns$_t_array$_t_bytes4_$dyn_memory_ptr_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,address) view returns (bytes4[] memory)"}},"id":9852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1691:53:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"src":"1665:79:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":9854,"nodeType":"ExpressionStatement","src":"1665:79:50"}]},"documentation":{"id":9838,"nodeType":"StructuredDocumentation","src":"1510:29:50","text":"@inheritdoc IDiamondLoupe"},"functionSelector":"adfca15e","id":9856,"implemented":true,"kind":"function","modifiers":[],"name":"facetFunctionSelectors","nameLocation":"1553:22:50","nodeType":"FunctionDefinition","parameters":{"id":9841,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9840,"mutability":"mutable","name":"facet","nameLocation":"1584:5:50","nodeType":"VariableDeclaration","scope":9856,"src":"1576:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9839,"name":"address","nodeType":"ElementaryTypeName","src":"1576:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1575:15:50"},"returnParameters":{"id":9845,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9844,"mutability":"mutable","name":"facetFunctionSelectors_","nameLocation":"1630:23:50","nodeType":"VariableDeclaration","scope":9856,"src":"1614:39:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":9842,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1614:6:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":9843,"nodeType":"ArrayTypeName","src":"1614:8:50","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"src":"1613:41:50"},"scope":9891,"src":"1544:207:50","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[9960],"body":{"id":9871,"nodeType":"Block","src":"1874:75:50","statements":[{"expression":{"id":9869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9863,"name":"facetAddresses_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9861,"src":"1884:15:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9864,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"1902:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1917:6:50","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"1902:21:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1902:23:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9867,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1926:14:50","memberName":"facetAddresses","nodeType":"MemberAccess","referencedDeclaration":11487,"src":"1902:38:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$10024_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer) view returns (address[] memory)"}},"id":9868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1902:40:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"src":"1884:58:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":9870,"nodeType":"ExpressionStatement","src":"1884:58:50"}]},"documentation":{"id":9857,"nodeType":"StructuredDocumentation","src":"1757:29:50","text":"@inheritdoc IDiamondLoupe"},"functionSelector":"52ef6b2c","id":9872,"implemented":true,"kind":"function","modifiers":[],"name":"facetAddresses","nameLocation":"1800:14:50","nodeType":"FunctionDefinition","parameters":{"id":9858,"nodeType":"ParameterList","parameters":[],"src":"1814:2:50"},"returnParameters":{"id":9862,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9861,"mutability":"mutable","name":"facetAddresses_","nameLocation":"1857:15:50","nodeType":"VariableDeclaration","scope":9872,"src":"1840:32:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":9859,"name":"address","nodeType":"ElementaryTypeName","src":"1840:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9860,"nodeType":"ArrayTypeName","src":"1840:9:50","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"1839:34:50"},"scope":9891,"src":"1791:158:50","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[9968],"body":{"id":9889,"nodeType":"Block","src":"2082:87:50","statements":[{"expression":{"id":9887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":9880,"name":"facetAddress_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9878,"src":"2092:13:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":9885,"name":"functionSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9875,"src":"2145:16:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":9881,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"2108:14:50","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":9882,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2123:6:50","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"2108:21:50","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":9883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2108:23:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":9884,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2132:12:50","memberName":"facetAddress","nodeType":"MemberAccess","referencedDeclaration":11511,"src":"2108:36:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$10024_storage_ptr_$_t_bytes4_$returns$_t_address_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,bytes4) view returns (address)"}},"id":9886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2108:54:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2092:70:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9888,"nodeType":"ExpressionStatement","src":"2092:70:50"}]},"documentation":{"id":9873,"nodeType":"StructuredDocumentation","src":"1955:29:50","text":"@inheritdoc IDiamondLoupe"},"functionSelector":"cdffacc6","id":9890,"implemented":true,"kind":"function","modifiers":[],"name":"facetAddress","nameLocation":"1998:12:50","nodeType":"FunctionDefinition","parameters":{"id":9876,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9875,"mutability":"mutable","name":"functionSelector","nameLocation":"2018:16:50","nodeType":"VariableDeclaration","scope":9890,"src":"2011:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9874,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2011:6:50","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2010:25:50"},"returnParameters":{"id":9879,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9878,"mutability":"mutable","name":"facetAddress_","nameLocation":"2067:13:50","nodeType":"VariableDeclaration","scope":9890,"src":"2059:21:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9877,"name":"address","nodeType":"ElementaryTypeName","src":"2059:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2058:23:50"},"scope":9891,"src":"1989:180:50","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":9892,"src":"715:1456:50","usedErrors":[11559,19183],"usedEvents":[]}],"src":"32:2140:50"},"id":50},"contracts/diamond/interfaces/IDiamondCut.sol":{"ast":{"absolutePath":"contracts/diamond/interfaces/IDiamondCut.sol","exportedSymbols":{"FacetCut":[9555],"IDiamondCut":[9910]},"id":9911,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9893,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:51"},{"id":9894,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:51"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9896,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9911,"sourceUnit":9561,"src":"92:48:51","symbolAliases":[{"foreign":{"id":9895,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"100:8:51","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IDiamondCut","contractDependencies":[],"contractKind":"interface","documentation":{"id":9897,"nodeType":"StructuredDocumentation","src":"142:186:51","text":"@title ERC2535 Diamond Standard, Diamond Cut (functions).\n @dev See https://eips.ethereum.org/EIPS/eip-2535\n @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c"},"fullyImplemented":false,"id":9910,"linearizedBaseContracts":[9910],"name":"IDiamondCut","nameLocation":"338:11:51","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":9898,"nodeType":"StructuredDocumentation","src":"356:387:51","text":"@notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\n @dev Emits a {DiamondCut} event.\n @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n @param target The address of the contract to execute `data` on.\n @param data The encoded function call to execute on `target`."},"functionSelector":"1f931c1c","id":9909,"implemented":false,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"757:10:51","nodeType":"FunctionDefinition","parameters":{"id":9907,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9902,"mutability":"mutable","name":"cuts","nameLocation":"788:4:51","nodeType":"VariableDeclaration","scope":9909,"src":"768:24:51","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9900,"nodeType":"UserDefinedTypeName","pathNode":{"id":9899,"name":"FacetCut","nameLocations":["768:8:51"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"768:8:51"},"referencedDeclaration":9555,"src":"768:8:51","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9901,"nodeType":"ArrayTypeName","src":"768:10:51","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9904,"mutability":"mutable","name":"target","nameLocation":"802:6:51","nodeType":"VariableDeclaration","scope":9909,"src":"794:14:51","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9903,"name":"address","nodeType":"ElementaryTypeName","src":"794:7:51","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":9906,"mutability":"mutable","name":"data","nameLocation":"825:4:51","nodeType":"VariableDeclaration","scope":9909,"src":"810:19:51","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":9905,"name":"bytes","nodeType":"ElementaryTypeName","src":"810:5:51","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"767:63:51"},"returnParameters":{"id":9908,"nodeType":"ParameterList","parameters":[],"src":"839:0:51"},"scope":9910,"src":"748:92:51","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":9911,"src":"328:514:51","usedErrors":[],"usedEvents":[]}],"src":"32:811:51"},"id":51},"contracts/diamond/interfaces/IDiamondCutBatchInit.sol":{"ast":{"absolutePath":"contracts/diamond/interfaces/IDiamondCutBatchInit.sol","exportedSymbols":{"FacetCut":[9555],"IDiamondCutBatchInit":[9930],"Initialization":[9560]},"id":9931,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9912,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:52"},{"id":9913,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:52"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9916,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9931,"sourceUnit":9561,"src":"92:64:52","symbolAliases":[{"foreign":{"id":9914,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"100:8:52","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9915,"name":"Initialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9560,"src":"110:14:52","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IDiamondCutBatchInit","contractDependencies":[],"contractKind":"interface","documentation":{"id":9917,"nodeType":"StructuredDocumentation","src":"158:194:52","text":"@title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\n @dev See https://eips.ethereum.org/EIPS/eip-XXXX\n @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5"},"fullyImplemented":false,"id":9930,"linearizedBaseContracts":[9930],"name":"IDiamondCutBatchInit","nameLocation":"362:20:52","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":9918,"nodeType":"StructuredDocumentation","src":"389:354:52","text":"@notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\n @dev Emits a {DiamondCut} event.\n @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\n @param initializations The list of addresses and encoded function calls to execute with delegatecall."},"functionSelector":"b2afc5b5","id":9929,"implemented":false,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"757:10:52","nodeType":"FunctionDefinition","parameters":{"id":9927,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9922,"mutability":"mutable","name":"cuts","nameLocation":"788:4:52","nodeType":"VariableDeclaration","scope":9929,"src":"768:24:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_calldata_ptr_$dyn_calldata_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":9920,"nodeType":"UserDefinedTypeName","pathNode":{"id":9919,"name":"FacetCut","nameLocations":["768:8:52"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"768:8:52"},"referencedDeclaration":9555,"src":"768:8:52","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":9921,"nodeType":"ArrayTypeName","src":"768:10:52","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":9926,"mutability":"mutable","name":"initializations","nameLocation":"820:15:52","nodeType":"VariableDeclaration","scope":9929,"src":"794:41:52","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_calldata_ptr_$dyn_calldata_ptr","typeString":"struct Initialization[]"},"typeName":{"baseType":{"id":9924,"nodeType":"UserDefinedTypeName","pathNode":{"id":9923,"name":"Initialization","nameLocations":["794:14:52"],"nodeType":"IdentifierPath","referencedDeclaration":9560,"src":"794:14:52"},"referencedDeclaration":9560,"src":"794:14:52","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_storage_ptr","typeString":"struct Initialization"}},"id":9925,"nodeType":"ArrayTypeName","src":"794:16:52","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_storage_$dyn_storage_ptr","typeString":"struct Initialization[]"}},"visibility":"internal"}],"src":"767:69:52"},"returnParameters":{"id":9928,"nodeType":"ParameterList","parameters":[],"src":"845:0:52"},"scope":9930,"src":"748:98:52","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":9931,"src":"352:496:52","usedErrors":[],"usedEvents":[]}],"src":"32:817:52"},"id":52},"contracts/diamond/interfaces/IDiamondLoupe.sol":{"ast":{"absolutePath":"contracts/diamond/interfaces/IDiamondLoupe.sol","exportedSymbols":{"Facet":[9542],"IDiamondLoupe":[9969]},"id":9970,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9932,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:53"},{"id":9933,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:53"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9935,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":9970,"sourceUnit":9561,"src":"92:45:53","symbolAliases":[{"foreign":{"id":9934,"name":"Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9542,"src":"100:5:53","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"IDiamondLoupe","contractDependencies":[],"contractKind":"interface","documentation":{"id":9936,"nodeType":"StructuredDocumentation","src":"139:176:53","text":"@title ERC2535 Diamond Standard, Diamond Loupe.\n @dev See https://eips.ethereum.org/EIPS/eip-2535\n @dev Note: the ERC-165 identifier for this interface is 0x48e2b093"},"fullyImplemented":false,"id":9969,"linearizedBaseContracts":[9969],"name":"IDiamondLoupe","nameLocation":"325:13:53","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":9937,"nodeType":"StructuredDocumentation","src":"345:190:53","text":"@notice Gets all the facet addresses used by the diamond and their function selectors.\n @return diamondFacets The facet addresses used by the diamond and their function selectors."},"functionSelector":"7a0ed627","id":9944,"implemented":false,"kind":"function","modifiers":[],"name":"facets","nameLocation":"549:6:53","nodeType":"FunctionDefinition","parameters":{"id":9938,"nodeType":"ParameterList","parameters":[],"src":"555:2:53"},"returnParameters":{"id":9943,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9942,"mutability":"mutable","name":"diamondFacets","nameLocation":"596:13:53","nodeType":"VariableDeclaration","scope":9944,"src":"581:28:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet[]"},"typeName":{"baseType":{"id":9940,"nodeType":"UserDefinedTypeName","pathNode":{"id":9939,"name":"Facet","nameLocations":["581:5:53"],"nodeType":"IdentifierPath","referencedDeclaration":9542,"src":"581:5:53"},"referencedDeclaration":9542,"src":"581:5:53","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_storage_ptr","typeString":"struct Facet"}},"id":9941,"nodeType":"ArrayTypeName","src":"581:7:53","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_storage_$dyn_storage_ptr","typeString":"struct Facet[]"}},"visibility":"internal"}],"src":"580:30:53"},"scope":9969,"src":"540:71:53","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":9945,"nodeType":"StructuredDocumentation","src":"617:183:53","text":"@notice Gets all the function selectors supported by a facet.\n @param facetAddress The facet address.\n @return selectors The function selectors supported by `facet`."},"functionSelector":"adfca15e","id":9953,"implemented":false,"kind":"function","modifiers":[],"name":"facetFunctionSelectors","nameLocation":"814:22:53","nodeType":"FunctionDefinition","parameters":{"id":9948,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9947,"mutability":"mutable","name":"facetAddress","nameLocation":"845:12:53","nodeType":"VariableDeclaration","scope":9953,"src":"837:20:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9946,"name":"address","nodeType":"ElementaryTypeName","src":"837:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"836:22:53"},"returnParameters":{"id":9952,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9951,"mutability":"mutable","name":"selectors","nameLocation":"898:9:53","nodeType":"VariableDeclaration","scope":9953,"src":"882:25:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":9949,"name":"bytes4","nodeType":"ElementaryTypeName","src":"882:6:53","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":9950,"nodeType":"ArrayTypeName","src":"882:8:53","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"src":"881:27:53"},"scope":9969,"src":"805:104:53","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":9954,"nodeType":"StructuredDocumentation","src":"915:140:53","text":"@notice Get all the facet addresses used by the diamond.\n @return diamondFacetsAddresses The facet addresses used by the diamond."},"functionSelector":"52ef6b2c","id":9960,"implemented":false,"kind":"function","modifiers":[],"name":"facetAddresses","nameLocation":"1069:14:53","nodeType":"FunctionDefinition","parameters":{"id":9955,"nodeType":"ParameterList","parameters":[],"src":"1083:2:53"},"returnParameters":{"id":9959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9958,"mutability":"mutable","name":"diamondFacetsAddresses","nameLocation":"1126:22:53","nodeType":"VariableDeclaration","scope":9960,"src":"1109:39:53","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":9956,"name":"address","nodeType":"ElementaryTypeName","src":"1109:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":9957,"nodeType":"ArrayTypeName","src":"1109:9:53","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"1108:41:53"},"scope":9969,"src":"1060:90:53","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":9961,"nodeType":"StructuredDocumentation","src":"1156:265:53","text":"@notice Gets the facet address that supports a given function selector.\n @param functionSelector The function selector.\n @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found."},"functionSelector":"cdffacc6","id":9968,"implemented":false,"kind":"function","modifiers":[],"name":"facetAddress","nameLocation":"1435:12:53","nodeType":"FunctionDefinition","parameters":{"id":9964,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9963,"mutability":"mutable","name":"functionSelector","nameLocation":"1455:16:53","nodeType":"VariableDeclaration","scope":9968,"src":"1448:23:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":9962,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1448:6:53","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1447:25:53"},"returnParameters":{"id":9967,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9966,"mutability":"mutable","name":"diamondFacetAddress","nameLocation":"1504:19:53","nodeType":"VariableDeclaration","scope":9968,"src":"1496:27:53","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":9965,"name":"address","nodeType":"ElementaryTypeName","src":"1496:7:53","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1495:29:53"},"scope":9969,"src":"1426:99:53","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":9970,"src":"315:1212:53","usedErrors":[],"usedEvents":[]}],"src":"32:1496:53"},"id":53},"contracts/diamond/libraries/DiamondStorage.sol":{"ast":{"absolutePath":"contracts/diamond/libraries/DiamondStorage.sol","exportedSymbols":{"Address":[38035],"DiamondCut":[9637],"DiamondStorage":[11524],"EmptyFacet":[9567],"EmptyInitCallData":[9609],"Facet":[9542],"FacetCut":[9555],"FacetCutAction":[9546],"FunctionAlreadyPresent":[9579],"FunctionNotFound":[9589],"IDiamondCut":[9910],"IDiamondCutBatchInit":[9930],"IDiamondLoupe":[9969],"InitCallReverted":[9621],"Initialization":[9560],"InterfaceDetectionStorage":[11680],"ModifyingImmutableFunction":[9594],"NonContractFacet":[9572],"NonContractInitCallTarget":[9614],"RemovingWithNonZeroAddressFacet":[9584],"ReplacingFunctionByItself":[9601],"ZeroAddressTargetInitCallButNonEmptyData":[9604]},"id":11525,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":9971,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:54"},{"id":9972,"literals":["experimental","ABIEncoderV2"],"nodeType":"PragmaDirective","src":"57:33:54"},{"absolutePath":"contracts/diamond/errors/DiamondErrors.sol","file":"./../errors/DiamondErrors.sol","id":9984,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9622,"src":"137:357:54","symbolAliases":[{"foreign":{"id":9973,"name":"EmptyFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9567,"src":"150:10:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9974,"name":"NonContractFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9572,"src":"166:16:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9975,"name":"FunctionAlreadyPresent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9579,"src":"188:22:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9976,"name":"RemovingWithNonZeroAddressFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9584,"src":"216:31:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9977,"name":"FunctionNotFound","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9589,"src":"253:16:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9978,"name":"ModifyingImmutableFunction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9594,"src":"275:26:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9979,"name":"ReplacingFunctionByItself","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9601,"src":"307:25:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9980,"name":"ZeroAddressTargetInitCallButNonEmptyData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9604,"src":"338:40:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9981,"name":"EmptyInitCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9609,"src":"384:17:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9982,"name":"NonContractInitCallTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9614,"src":"407:25:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9983,"name":"InitCallReverted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9621,"src":"438:16:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../DiamondCommon.sol","id":9989,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9561,"src":"495:87:54","symbolAliases":[{"foreign":{"id":9985,"name":"Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9542,"src":"503:5:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9986,"name":"FacetCutAction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9546,"src":"510:14:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9987,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"526:8:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":9988,"name":"Initialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9560,"src":"536:14:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/events/DiamondCutEvents.sol","file":"./../events/DiamondCutEvents.sol","id":9991,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9638,"src":"583:60:54","symbolAliases":[{"foreign":{"id":9990,"name":"DiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9637,"src":"591:10:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondCut.sol","file":"./../interfaces/IDiamondCut.sol","id":9993,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9911,"src":"644:60:54","symbolAliases":[{"foreign":{"id":9992,"name":"IDiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9910,"src":"652:11:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondCutBatchInit.sol","file":"./../interfaces/IDiamondCutBatchInit.sol","id":9995,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9931,"src":"705:78:54","symbolAliases":[{"foreign":{"id":9994,"name":"IDiamondCutBatchInit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9930,"src":"713:20:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/interfaces/IDiamondLoupe.sol","file":"./../interfaces/IDiamondLoupe.sol","id":9997,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":9970,"src":"784:64:54","symbolAliases":[{"foreign":{"id":9996,"name":"IDiamondLoupe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9969,"src":"792:13:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../utils/libraries/Address.sol","id":9999,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":38036,"src":"849:60:54","symbolAliases":[{"foreign":{"id":9998,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"857:7:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":10001,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11525,"sourceUnit":11681,"src":"910:104:54","symbolAliases":[{"foreign":{"id":10000,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"918:25:54","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"DiamondStorage","contractDependencies":[],"contractKind":"library","documentation":{"id":10002,"nodeType":"StructuredDocumentation","src":"1016:148:54","text":"@dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)"},"fullyImplemented":true,"id":11524,"linearizedBaseContracts":[11524],"name":"DiamondStorage","nameLocation":"1172:14:54","nodeType":"ContractDefinition","nodes":[{"global":false,"id":10005,"libraryName":{"id":10003,"name":"Address","nameLocations":["1199:7:54"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"1199:7:54"},"nodeType":"UsingForDirective","src":"1193:26:54","typeName":{"id":10004,"name":"address","nodeType":"ElementaryTypeName","src":"1211:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":10009,"libraryName":{"id":10006,"name":"DiamondStorage","nameLocations":["1230:14:54"],"nodeType":"IdentifierPath","referencedDeclaration":11524,"src":"1230:14:54"},"nodeType":"UsingForDirective","src":"1224:47:54","typeName":{"id":10008,"nodeType":"UserDefinedTypeName","pathNode":{"id":10007,"name":"DiamondStorage.Layout","nameLocations":["1249:14:54","1264:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"1249:21:54"},"referencedDeclaration":10024,"src":"1249:21:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}}},{"global":false,"id":10013,"libraryName":{"id":10010,"name":"InterfaceDetectionStorage","nameLocations":["1282:25:54"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1282:25:54"},"nodeType":"UsingForDirective","src":"1276:69:54","typeName":{"id":10012,"nodeType":"UserDefinedTypeName","pathNode":{"id":10011,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1312:25:54","1338:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1312:32:54"},"referencedDeclaration":11590,"src":"1312:32:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"DiamondStorage.Layout","id":10024,"members":[{"constant":false,"id":10017,"mutability":"mutable","name":"diamondFacets","nameLocation":"1465:13:54","nodeType":"VariableDeclaration","scope":10024,"src":"1438:40:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"},"typeName":{"id":10016,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":10014,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1446:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Mapping","src":"1438:26:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":10015,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1456:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},"visibility":"internal"},{"constant":false,"id":10019,"mutability":"mutable","name":"selectorCount","nameLocation":"1554:13:54","nodeType":"VariableDeclaration","scope":10024,"src":"1547:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":10018,"name":"uint16","nodeType":"ElementaryTypeName","src":"1547:6:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"},{"constant":false,"id":10023,"mutability":"mutable","name":"selectorSlots","nameLocation":"1666:13:54","nodeType":"VariableDeclaration","scope":10024,"src":"1638:41:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"},"typeName":{"id":10022,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":10020,"name":"uint256","nodeType":"ElementaryTypeName","src":"1646:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1638:27:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":10021,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1657:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},"visibility":"internal"}],"name":"Layout","nameLocation":"1358:6:54","nodeType":"StructDefinition","scope":11524,"src":"1351:335:54","visibility":"public"},{"constant":true,"id":10037,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"1718:19:54","nodeType":"VariableDeclaration","scope":11524,"src":"1692:111:54","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10025,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1692:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10035,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e4469616d6f6e642e73746f72616765","id":10031,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1766:30:54","typeDescriptions":{"typeIdentifier":"t_stringliteral_65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3","typeString":"literal_string \"animoca.core.Diamond.storage\""},"value":"animoca.core.Diamond.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3","typeString":"literal_string \"animoca.core.Diamond.storage\""}],"id":10030,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1756:9:54","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":10032,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1756:41:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10029,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1748:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":10028,"name":"uint256","nodeType":"ElementaryTypeName","src":"1748:7:54","typeDescriptions":{}}},"id":10033,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1748:50:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":10034,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1801:1:54","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1748:54:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10027,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1740:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10026,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1740:7:54","typeDescriptions":{}}},"id":10036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1740:63:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":10046,"mutability":"constant","name":"CLEAR_ADDRESS_MASK","nameLocation":"1836:18:54","nodeType":"VariableDeclaration","scope":11524,"src":"1810:91:54","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10038,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1810:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"arguments":[{"hexValue":"3078666666666666666666666666666666666666666666666666","id":10043,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1873:26:54","typeDescriptions":{"typeIdentifier":"t_rational_79228162514264337593543950335_by_1","typeString":"int_const 79228162514264337593543950335"},"value":"0xffffffffffffffffffffffff"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_79228162514264337593543950335_by_1","typeString":"int_const 79228162514264337593543950335"}],"id":10042,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1865:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":10041,"name":"uint256","nodeType":"ElementaryTypeName","src":"1865:7:54","typeDescriptions":{}}},"id":10044,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1865:35:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10040,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1857:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10039,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1857:7:54","typeDescriptions":{}}},"id":10045,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1857:44:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":10057,"mutability":"constant","name":"CLEAR_SELECTOR_MASK","nameLocation":"1933:19:54","nodeType":"VariableDeclaration","scope":11524,"src":"1907:83:54","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10047,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1907:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"arguments":[{"commonType":{"typeIdentifier":"t_rational_115792089210356248756420345214020892766250353992003419616917011526809519390720_by_1","typeString":"int_const 1157...(70 digits omitted)...0720"},"id":10054,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"30786666666666666666","id":10052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1971:10:54","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"323234","id":10053,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1985:3:54","typeDescriptions":{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},"value":"224"},"src":"1971:17:54","typeDescriptions":{"typeIdentifier":"t_rational_115792089210356248756420345214020892766250353992003419616917011526809519390720_by_1","typeString":"int_const 1157...(70 digits omitted)...0720"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_115792089210356248756420345214020892766250353992003419616917011526809519390720_by_1","typeString":"int_const 1157...(70 digits omitted)...0720"}],"id":10051,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1963:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":10050,"name":"uint256","nodeType":"ElementaryTypeName","src":"1963:7:54","typeDescriptions":{}}},"id":10055,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1963:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10049,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1955:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10048,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1955:7:54","typeDescriptions":{}}},"id":10056,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1955:35:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":10090,"nodeType":"Block","src":"2135:314:54","statements":[{"assignments":[10065],"declarations":[{"constant":false,"id":10065,"mutability":"mutable","name":"interfaceDetectionLayout","nameLocation":"2186:24:54","nodeType":"VariableDeclaration","scope":10090,"src":"2145:65:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"},"typeName":{"id":10064,"nodeType":"UserDefinedTypeName","pathNode":{"id":10063,"name":"InterfaceDetectionStorage.Layout","nameLocations":["2145:25:54","2171:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"2145:32:54"},"referencedDeclaration":11590,"src":"2145:32:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}},"visibility":"internal"}],"id":10069,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":10066,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2213:25:54","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":10067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2239:6:54","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2213:32:54","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":10068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2213:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"2145:102:54"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":10074,"name":"IDiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9910,"src":"2309:11:54","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDiamondCut_$9910_$","typeString":"type(contract IDiamondCut)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IDiamondCut_$9910_$","typeString":"type(contract IDiamondCut)"}],"id":10073,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2304:4:54","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":10075,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2304:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IDiamondCut_$9910","typeString":"type(contract IDiamondCut)"}},"id":10076,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2322:11:54","memberName":"interfaceId","nodeType":"MemberAccess","src":"2304:29:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":10077,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2335:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":10070,"name":"interfaceDetectionLayout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10065,"src":"2257:24:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":10072,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2282:21:54","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2257:46:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":10078,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2257:83:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10079,"nodeType":"ExpressionStatement","src":"2257:83:54"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":10084,"name":"IDiamondCutBatchInit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9930,"src":"2402:20:54","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDiamondCutBatchInit_$9930_$","typeString":"type(contract IDiamondCutBatchInit)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IDiamondCutBatchInit_$9930_$","typeString":"type(contract IDiamondCutBatchInit)"}],"id":10083,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2397:4:54","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":10085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2397:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IDiamondCutBatchInit_$9930","typeString":"type(contract IDiamondCutBatchInit)"}},"id":10086,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2424:11:54","memberName":"interfaceId","nodeType":"MemberAccess","src":"2397:38:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":10087,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2437:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":10080,"name":"interfaceDetectionLayout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10065,"src":"2350:24:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":10082,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2375:21:54","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2350:46:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":10088,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2350:92:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10089,"nodeType":"ExpressionStatement","src":"2350:92:54"}]},"documentation":{"id":10058,"nodeType":"StructuredDocumentation","src":"1997:98:54","text":"@notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit."},"id":10091,"implemented":true,"kind":"function","modifiers":[],"name":"initDiamondCut","nameLocation":"2109:14:54","nodeType":"FunctionDefinition","parameters":{"id":10059,"nodeType":"ParameterList","parameters":[],"src":"2123:2:54"},"returnParameters":{"id":10060,"nodeType":"ParameterList","parameters":[],"src":"2135:0:54"},"scope":11524,"src":"2100:349:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10107,"nodeType":"Block","src":"2576:112:54","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":10101,"name":"IDiamondLoupe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9969,"src":"2648:13:54","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDiamondLoupe_$9969_$","typeString":"type(contract IDiamondLoupe)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IDiamondLoupe_$9969_$","typeString":"type(contract IDiamondLoupe)"}],"id":10100,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2643:4:54","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":10102,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2643:19:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IDiamondLoupe_$9969","typeString":"type(contract IDiamondLoupe)"}},"id":10103,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2663:11:54","memberName":"interfaceId","nodeType":"MemberAccess","src":"2643:31:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":10104,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2676:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":10095,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2586:25:54","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":10097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2612:6:54","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2586:32:54","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":10098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2586:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":10099,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2621:21:54","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2586:56:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":10105,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2586:95:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10106,"nodeType":"ExpressionStatement","src":"2586:95:54"}]},"documentation":{"id":10092,"nodeType":"StructuredDocumentation","src":"2455:79:54","text":"@notice Marks the following ERC165 interface(s) as supported: DiamondLoupe."},"id":10108,"implemented":true,"kind":"function","modifiers":[],"name":"initDiamondLoupe","nameLocation":"2548:16:54","nodeType":"FunctionDefinition","parameters":{"id":10093,"nodeType":"ParameterList","parameters":[],"src":"2564:2:54"},"returnParameters":{"id":10094,"nodeType":"ParameterList","parameters":[],"src":"2576:0:54"},"scope":11524,"src":"2539:149:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10139,"nodeType":"Block","src":"2800:121:54","statements":[{"expression":{"arguments":[{"id":10125,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10115,"src":"2822:4:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}],"expression":{"id":10122,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10111,"src":"2810:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10124,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2812:9:54","memberName":"cutFacets","nodeType":"MemberAccess","referencedDeclaration":10348,"src":"2810:11:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory)"}},"id":10126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2810:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10127,"nodeType":"ExpressionStatement","src":"2810:17:54"},{"expression":{"arguments":[{"id":10129,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10117,"src":"2856:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10130,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10119,"src":"2864:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":10128,"name":"initializationCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10999,"src":"2837:18:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":10131,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2837:32:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10132,"nodeType":"ExpressionStatement","src":"2837:32:54"},{"eventCall":{"arguments":[{"id":10134,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10115,"src":"2895:4:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},{"id":10135,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10117,"src":"2901:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10136,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10119,"src":"2909:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":10133,"name":"DiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9637,"src":"2884:10:54","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (struct FacetCut memory[] memory,address,bytes memory)"}},"id":10137,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2884:30:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10138,"nodeType":"EmitStatement","src":"2879:35:54"}]},"id":10140,"implemented":true,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"2703:10:54","nodeType":"FunctionDefinition","parameters":{"id":10120,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10111,"mutability":"mutable","name":"s","nameLocation":"2729:1:54","nodeType":"VariableDeclaration","scope":10140,"src":"2714:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10110,"nodeType":"UserDefinedTypeName","pathNode":{"id":10109,"name":"Layout","nameLocations":["2714:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"2714:6:54"},"referencedDeclaration":10024,"src":"2714:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10115,"mutability":"mutable","name":"cuts","nameLocation":"2750:4:54","nodeType":"VariableDeclaration","scope":10140,"src":"2732:22:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":10113,"nodeType":"UserDefinedTypeName","pathNode":{"id":10112,"name":"FacetCut","nameLocations":["2732:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"2732:8:54"},"referencedDeclaration":9555,"src":"2732:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":10114,"nodeType":"ArrayTypeName","src":"2732:10:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":10117,"mutability":"mutable","name":"target","nameLocation":"2764:6:54","nodeType":"VariableDeclaration","scope":10140,"src":"2756:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10116,"name":"address","nodeType":"ElementaryTypeName","src":"2756:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10119,"mutability":"mutable","name":"data","nameLocation":"2785:4:54","nodeType":"VariableDeclaration","scope":10140,"src":"2772:17:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10118,"name":"bytes","nodeType":"ElementaryTypeName","src":"2772:5:54","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2713:77:54"},"returnParameters":{"id":10121,"nodeType":"ParameterList","parameters":[],"src":"2800:0:54"},"scope":11524,"src":"2694:227:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10196,"nodeType":"Block","src":"3039:267:54","statements":[{"expression":{"arguments":[{"id":10157,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10147,"src":"3061:4:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}],"expression":{"id":10154,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10143,"src":"3049:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10156,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3051:9:54","memberName":"cutFacets","nodeType":"MemberAccess","referencedDeclaration":10348,"src":"3049:11:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory)"}},"id":10158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3049:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10159,"nodeType":"ExpressionStatement","src":"3049:17:54"},{"assignments":[10161],"declarations":[{"constant":false,"id":10161,"mutability":"mutable","name":"length","nameLocation":"3084:6:54","nodeType":"VariableDeclaration","scope":10196,"src":"3076:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10160,"name":"uint256","nodeType":"ElementaryTypeName","src":"3076:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10164,"initialValue":{"expression":{"id":10162,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10151,"src":"3093:15:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}},"id":10163,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3109:6:54","memberName":"length","nodeType":"MemberAccess","src":"3093:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3076:39:54"},{"body":{"id":10185,"nodeType":"Block","src":"3158:95:54","statements":[{"expression":{"arguments":[{"expression":{"baseExpression":{"id":10175,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10151,"src":"3191:15:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}},"id":10177,"indexExpression":{"id":10176,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10166,"src":"3207:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3191:18:54","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_memory_ptr","typeString":"struct Initialization memory"}},"id":10178,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3210:6:54","memberName":"target","nodeType":"MemberAccess","referencedDeclaration":9557,"src":"3191:25:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"baseExpression":{"id":10179,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10151,"src":"3218:15:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}},"id":10181,"indexExpression":{"id":10180,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10166,"src":"3234:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3218:18:54","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_memory_ptr","typeString":"struct Initialization memory"}},"id":10182,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3237:4:54","memberName":"data","nodeType":"MemberAccess","referencedDeclaration":9559,"src":"3218:23:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":10174,"name":"initializationCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10999,"src":"3172:18:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":10183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3172:70:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10184,"nodeType":"ExpressionStatement","src":"3172:70:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10170,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10168,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10166,"src":"3141:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":10169,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10161,"src":"3145:6:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3141:10:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10186,"initializationExpression":{"assignments":[10166],"declarations":[{"constant":false,"id":10166,"mutability":"mutable","name":"i","nameLocation":"3138:1:54","nodeType":"VariableDeclaration","scope":10186,"src":"3130:9:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10165,"name":"uint256","nodeType":"ElementaryTypeName","src":"3130:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10167,"nodeType":"VariableDeclarationStatement","src":"3130:9:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":10172,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3153:3:54","subExpression":{"id":10171,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10166,"src":"3155:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10173,"nodeType":"ExpressionStatement","src":"3153:3:54"},"nodeType":"ForStatement","src":"3125:128:54"},{"eventCall":{"arguments":[{"id":10188,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10147,"src":"3278:4:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},{"arguments":[{"hexValue":"30","id":10191,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3292:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10190,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3284:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10189,"name":"address","nodeType":"ElementaryTypeName","src":"3284:7:54","typeDescriptions":{}}},"id":10192,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3284:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"","id":10193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3296:2:54","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":10187,"name":"DiamondCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9637,"src":"3267:10:54","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (struct FacetCut memory[] memory,address,bytes memory)"}},"id":10194,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3267:32:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10195,"nodeType":"EmitStatement","src":"3262:37:54"}]},"id":10197,"implemented":true,"kind":"function","modifiers":[],"name":"diamondCut","nameLocation":"2936:10:54","nodeType":"FunctionDefinition","parameters":{"id":10152,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10143,"mutability":"mutable","name":"s","nameLocation":"2962:1:54","nodeType":"VariableDeclaration","scope":10197,"src":"2947:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10142,"nodeType":"UserDefinedTypeName","pathNode":{"id":10141,"name":"Layout","nameLocations":["2947:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"2947:6:54"},"referencedDeclaration":10024,"src":"2947:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10147,"mutability":"mutable","name":"cuts","nameLocation":"2983:4:54","nodeType":"VariableDeclaration","scope":10197,"src":"2965:22:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":10145,"nodeType":"UserDefinedTypeName","pathNode":{"id":10144,"name":"FacetCut","nameLocations":["2965:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"2965:8:54"},"referencedDeclaration":9555,"src":"2965:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":10146,"nodeType":"ArrayTypeName","src":"2965:10:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":10151,"mutability":"mutable","name":"initializations","nameLocation":"3013:15:54","nodeType":"VariableDeclaration","scope":10197,"src":"2989:39:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization[]"},"typeName":{"baseType":{"id":10149,"nodeType":"UserDefinedTypeName","pathNode":{"id":10148,"name":"Initialization","nameLocations":["2989:14:54"],"nodeType":"IdentifierPath","referencedDeclaration":9560,"src":"2989:14:54"},"referencedDeclaration":9560,"src":"2989:14:54","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_storage_ptr","typeString":"struct Initialization"}},"id":10150,"nodeType":"ArrayTypeName","src":"2989:16:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_storage_$dyn_storage_ptr","typeString":"struct Initialization[]"}},"visibility":"internal"}],"src":"2946:83:54"},"returnParameters":{"id":10153,"nodeType":"ParameterList","parameters":[],"src":"3039:0:54"},"scope":11524,"src":"2927:379:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10347,"nodeType":"Block","src":"3387:1324:54","statements":[{"assignments":[10208],"declarations":[{"constant":false,"id":10208,"mutability":"mutable","name":"originalSelectorCount","nameLocation":"3405:21:54","nodeType":"VariableDeclaration","scope":10347,"src":"3397:29:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10207,"name":"uint256","nodeType":"ElementaryTypeName","src":"3397:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10211,"initialValue":{"expression":{"id":10209,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"3429:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10210,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3431:13:54","memberName":"selectorCount","nodeType":"MemberAccess","referencedDeclaration":10019,"src":"3429:15:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"VariableDeclarationStatement","src":"3397:47:54"},{"assignments":[10213],"declarations":[{"constant":false,"id":10213,"mutability":"mutable","name":"selectorCount","nameLocation":"3462:13:54","nodeType":"VariableDeclaration","scope":10347,"src":"3454:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10212,"name":"uint256","nodeType":"ElementaryTypeName","src":"3454:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10215,"initialValue":{"id":10214,"name":"originalSelectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10208,"src":"3478:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3454:45:54"},{"assignments":[10217],"declarations":[{"constant":false,"id":10217,"mutability":"mutable","name":"selectorSlot","nameLocation":"3517:12:54","nodeType":"VariableDeclaration","scope":10347,"src":"3509:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10216,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3509:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":10218,"nodeType":"VariableDeclarationStatement","src":"3509:20:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10221,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10219,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"3595:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"37","id":10220,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3611:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"3595:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10222,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3615:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3595:21:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10234,"nodeType":"IfStatement","src":"3591:139:54","trueBody":{"id":10233,"nodeType":"Block","src":"3618:112:54","statements":[{"expression":{"id":10231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10224,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"3669:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"id":10225,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"3684:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10226,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3686:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"3684:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10230,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10227,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"3700:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":10228,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3717:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"3700:18:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3684:35:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3669:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10232,"nodeType":"ExpressionStatement","src":"3669:50:54"}]}},{"assignments":[10236],"declarations":[{"constant":false,"id":10236,"mutability":"mutable","name":"length","nameLocation":"3748:6:54","nodeType":"VariableDeclaration","scope":10347,"src":"3740:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10235,"name":"uint256","nodeType":"ElementaryTypeName","src":"3740:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10239,"initialValue":{"expression":{"id":10237,"name":"facetCuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10204,"src":"3757:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"id":10238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3767:6:54","memberName":"length","nodeType":"MemberAccess","src":"3757:16:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3740:33:54"},{"body":{"id":10314,"nodeType":"Block","src":"3816:614:54","statements":[{"assignments":[10251],"declarations":[{"constant":false,"id":10251,"mutability":"mutable","name":"facetCut","nameLocation":"3846:8:54","nodeType":"VariableDeclaration","scope":10314,"src":"3830:24:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut"},"typeName":{"id":10250,"nodeType":"UserDefinedTypeName","pathNode":{"id":10249,"name":"FacetCut","nameLocations":["3830:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"3830:8:54"},"referencedDeclaration":9555,"src":"3830:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"visibility":"internal"}],"id":10255,"initialValue":{"baseExpression":{"id":10252,"name":"facetCuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10204,"src":"3857:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"id":10254,"indexExpression":{"id":10253,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10241,"src":"3867:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3857:12:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"nodeType":"VariableDeclarationStatement","src":"3830:39:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":10256,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"3888:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10257,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3897:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"3888:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10258,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3907:6:54","memberName":"length","nodeType":"MemberAccess","src":"3888:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":10259,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3917:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3888:30:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10266,"nodeType":"IfStatement","src":"3884:69:54","trueBody":{"errorCall":{"arguments":[{"expression":{"id":10262,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"3938:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10263,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3947:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"3938:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10261,"name":"EmptyFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9567,"src":"3927:10:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10264,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3927:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10265,"nodeType":"RevertStatement","src":"3920:33:54"}},{"assignments":[10269],"declarations":[{"constant":false,"id":10269,"mutability":"mutable","name":"action","nameLocation":"3983:6:54","nodeType":"VariableDeclaration","scope":10314,"src":"3968:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"},"typeName":{"id":10268,"nodeType":"UserDefinedTypeName","pathNode":{"id":10267,"name":"FacetCutAction","nameLocations":["3968:14:54"],"nodeType":"IdentifierPath","referencedDeclaration":9546,"src":"3968:14:54"},"referencedDeclaration":9546,"src":"3968:14:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"visibility":"internal"}],"id":10272,"initialValue":{"expression":{"id":10270,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"3992:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10271,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4001:6:54","memberName":"action","nodeType":"MemberAccess","referencedDeclaration":9551,"src":"3992:15:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"nodeType":"VariableDeclarationStatement","src":"3968:39:54"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"},"id":10276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10273,"name":"action","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10269,"src":"4025:6:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":10274,"name":"FacetCutAction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9546,"src":"4035:14:54","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_FacetCutAction_$9546_$","typeString":"type(enum FacetCutAction)"}},"id":10275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4050:3:54","memberName":"ADD","nodeType":"MemberAccess","referencedDeclaration":9543,"src":"4035:18:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"src":"4025:28:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"condition":{"commonType":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"},"id":10292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10289,"name":"action","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10269,"src":"4188:6:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":10290,"name":"FacetCutAction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9546,"src":"4198:14:54","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_FacetCutAction_$9546_$","typeString":"type(enum FacetCutAction)"}},"id":10291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4213:7:54","memberName":"REPLACE","nodeType":"MemberAccess","referencedDeclaration":9544,"src":"4198:22:54","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"src":"4188:32:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":10311,"nodeType":"Block","src":"4294:126:54","statements":[{"expression":{"id":10309,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":10300,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4313:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10301,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"4328:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10302,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"4312:29:54","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":10305,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4367:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10306,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"4382:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":10307,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"4396:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}],"expression":{"id":10303,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"4344:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10304,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4346:20:54","memberName":"removeFacetSelectors","nodeType":"MemberAccess","referencedDeclaration":10805,"src":"4344:22:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_uint256_$_t_bytes32_$_t_struct$_FacetCut_$9555_memory_ptr_$returns$_t_uint256_$_t_bytes32_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,uint256,bytes32,struct FacetCut memory) returns (uint256,bytes32)"}},"id":10308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4344:61:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"src":"4312:93:54","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10310,"nodeType":"ExpressionStatement","src":"4312:93:54"}]},"id":10312,"nodeType":"IfStatement","src":"4184:236:54","trueBody":{"id":10299,"nodeType":"Block","src":"4222:66:54","statements":[{"expression":{"arguments":[{"id":10296,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"4264:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}],"expression":{"id":10293,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"4240:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10295,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4242:21:54","memberName":"replaceFacetSelectors","nodeType":"MemberAccess","referencedDeclaration":10918,"src":"4240:23:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_struct$_FacetCut_$9555_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory)"}},"id":10297,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4240:33:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10298,"nodeType":"ExpressionStatement","src":"4240:33:54"}]}},"id":10313,"nodeType":"IfStatement","src":"4021:399:54","trueBody":{"id":10288,"nodeType":"Block","src":"4055:123:54","statements":[{"expression":{"id":10286,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":10277,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4074:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10278,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"4089:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10279,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"4073:29:54","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":10282,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4125:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10283,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"4140:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":10284,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10251,"src":"4154:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}],"expression":{"id":10280,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"4105:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10281,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4107:17:54","memberName":"addFacetSelectors","nodeType":"MemberAccess","referencedDeclaration":10506,"src":"4105:19:54","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_uint256_$_t_bytes32_$_t_struct$_FacetCut_$9555_memory_ptr_$returns$_t_uint256_$_t_bytes32_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,uint256,bytes32,struct FacetCut memory) returns (uint256,bytes32)"}},"id":10285,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4105:58:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"src":"4073:90:54","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10287,"nodeType":"ExpressionStatement","src":"4073:90:54"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10243,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10241,"src":"3799:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":10244,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10236,"src":"3803:6:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3799:10:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10315,"initializationExpression":{"assignments":[10241],"declarations":[{"constant":false,"id":10241,"mutability":"mutable","name":"i","nameLocation":"3796:1:54","nodeType":"VariableDeclaration","scope":10315,"src":"3788:9:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10240,"name":"uint256","nodeType":"ElementaryTypeName","src":"3788:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10242,"nodeType":"VariableDeclarationStatement","src":"3788:9:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":10247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3811:3:54","subExpression":{"id":10246,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10241,"src":"3813:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10248,"nodeType":"ExpressionStatement","src":"3811:3:54"},"nodeType":"ForStatement","src":"3783:647:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10318,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10316,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4444:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":10317,"name":"originalSelectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10208,"src":"4461:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4444:38:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10329,"nodeType":"IfStatement","src":"4440:108:54","trueBody":{"id":10328,"nodeType":"Block","src":"4484:64:54","statements":[{"expression":{"id":10326,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":10319,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"4498:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10321,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"4500:13:54","memberName":"selectorCount","nodeType":"MemberAccess","referencedDeclaration":10019,"src":"4498:15:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":10324,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4523:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10323,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4516:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"},"typeName":{"id":10322,"name":"uint16","nodeType":"ElementaryTypeName","src":"4516:6:54","typeDescriptions":{}}},"id":10325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4516:21:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"4498:39:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"id":10327,"nodeType":"ExpressionStatement","src":"4498:39:54"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10330,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4607:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"37","id":10331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4623:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"4607:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":10333,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4627:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4607:21:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10346,"nodeType":"IfStatement","src":"4603:102:54","trueBody":{"id":10345,"nodeType":"Block","src":"4630:75:54","statements":[{"expression":{"id":10343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10335,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10200,"src":"4644:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10340,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4646:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"4644:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10341,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10339,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10337,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10213,"src":"4660:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":10338,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4677:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"4660:18:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4644:35:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":10342,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10217,"src":"4682:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4644:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10344,"nodeType":"ExpressionStatement","src":"4644:50:54"}]}}]},"id":10348,"implemented":true,"kind":"function","modifiers":[],"name":"cutFacets","nameLocation":"3321:9:54","nodeType":"FunctionDefinition","parameters":{"id":10205,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10200,"mutability":"mutable","name":"s","nameLocation":"3346:1:54","nodeType":"VariableDeclaration","scope":10348,"src":"3331:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10199,"nodeType":"UserDefinedTypeName","pathNode":{"id":10198,"name":"Layout","nameLocations":["3331:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"3331:6:54"},"referencedDeclaration":10024,"src":"3331:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10204,"mutability":"mutable","name":"facetCuts","nameLocation":"3367:9:54","nodeType":"VariableDeclaration","scope":10348,"src":"3349:27:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":10202,"nodeType":"UserDefinedTypeName","pathNode":{"id":10201,"name":"FacetCut","nameLocations":["3349:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"3349:8:54"},"referencedDeclaration":9555,"src":"3349:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":10203,"nodeType":"ArrayTypeName","src":"3349:10:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"}],"src":"3330:47:54"},"returnParameters":{"id":10206,"nodeType":"ParameterList","parameters":[],"src":"3387:0:54"},"scope":11524,"src":"3312:1399:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10505,"nodeType":"Block","src":"4907:1222:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":10377,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10371,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10365,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"4921:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10366,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4930:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"4921:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":10369,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4947:4:54","typeDescriptions":{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}],"id":10368,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4939:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10367,"name":"address","nodeType":"ElementaryTypeName","src":"4939:7:54","typeDescriptions":{}}},"id":10370,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4939:13:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4921:31:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":10376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4956:29:54","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"expression":{"id":10372,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"4957:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10373,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4966:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"4957:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":10374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4972:11:54","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"4957:26:54","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":10375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4957:28:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4921:64:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10383,"nodeType":"IfStatement","src":"4917:109:54","trueBody":{"errorCall":{"arguments":[{"expression":{"id":10379,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"5011:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10380,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5020:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"5011:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10378,"name":"NonContractFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9572,"src":"4994:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10381,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4994:32:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10382,"nodeType":"RevertStatement","src":"4987:39:54"}},{"assignments":[10385],"declarations":[{"constant":false,"id":10385,"mutability":"mutable","name":"length","nameLocation":"5045:6:54","nodeType":"VariableDeclaration","scope":10505,"src":"5037:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10384,"name":"uint256","nodeType":"ElementaryTypeName","src":"5037:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10389,"initialValue":{"expression":{"expression":{"id":10386,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"5054:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10387,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5063:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"5054:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5073:6:54","memberName":"length","nodeType":"MemberAccess","src":"5054:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5037:42:54"},{"body":{"id":10499,"nodeType":"Block","src":"5122:954:54","statements":[{"assignments":[10400],"declarations":[{"constant":false,"id":10400,"mutability":"mutable","name":"selector","nameLocation":"5143:8:54","nodeType":"VariableDeclaration","scope":10499,"src":"5136:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":10399,"name":"bytes4","nodeType":"ElementaryTypeName","src":"5136:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":10405,"initialValue":{"baseExpression":{"expression":{"id":10401,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"5154:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10402,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5163:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"5154:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10404,"indexExpression":{"id":10403,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10391,"src":"5173:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5154:21:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"5136:39:54"},{"assignments":[10407],"declarations":[{"constant":false,"id":10407,"mutability":"mutable","name":"oldFacetAddress","nameLocation":"5197:15:54","nodeType":"VariableDeclaration","scope":10499,"src":"5189:23:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10406,"name":"address","nodeType":"ElementaryTypeName","src":"5189:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":10418,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":10412,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10351,"src":"5231:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10413,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5233:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"5231:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10415,"indexExpression":{"id":10414,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10400,"src":"5247:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5231:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10411,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5223:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10410,"name":"bytes20","nodeType":"ElementaryTypeName","src":"5223:7:54","typeDescriptions":{}}},"id":10416,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5223:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":10409,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5215:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10408,"name":"address","nodeType":"ElementaryTypeName","src":"5215:7:54","typeDescriptions":{}}},"id":10417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5215:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5189:69:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10419,"name":"oldFacetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10407,"src":"5277:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":10422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5304:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10421,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5296:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10420,"name":"address","nodeType":"ElementaryTypeName","src":"5296:7:54","typeDescriptions":{}}},"id":10423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5296:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5277:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10430,"nodeType":"IfStatement","src":"5273:91:54","trueBody":{"errorCall":{"arguments":[{"id":10426,"name":"oldFacetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10407,"src":"5338:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10427,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10400,"src":"5355:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10425,"name":"FunctionAlreadyPresent","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9579,"src":"5315:22:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes4_$returns$_t_error_$","typeString":"function (address,bytes4) pure returns (error)"}},"id":10428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5315:49:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10429,"nodeType":"RevertStatement","src":"5308:56:54"}},{"expression":{"id":10446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10431,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10351,"src":"5417:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10434,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5419:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"5417:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10435,"indexExpression":{"id":10433,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10400,"src":"5433:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5417:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":10438,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10358,"src":"5453:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10439,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5462:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"5453:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10437,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5445:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10436,"name":"bytes20","nodeType":"ElementaryTypeName","src":"5445:7:54","typeDescriptions":{}}},"id":10440,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5445:23:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"arguments":[{"id":10443,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10353,"src":"5479:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10442,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5471:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10441,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5471:7:54","typeDescriptions":{}}},"id":10444,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5471:22:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5445:48:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5417:76:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10447,"nodeType":"ExpressionStatement","src":"5417:76:54"},{"assignments":[10449],"declarations":[{"constant":false,"id":10449,"mutability":"mutable","name":"selectorInSlotPosition","nameLocation":"5515:22:54","nodeType":"VariableDeclaration","scope":10499,"src":"5507:30:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10448,"name":"uint256","nodeType":"ElementaryTypeName","src":"5507:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10456,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10455,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10452,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10450,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10353,"src":"5541:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"37","id":10451,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5557:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"5541:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":10453,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5540:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":10454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5563:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"5540:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5507:57:54"},{"expression":{"id":10474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10457,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10355,"src":"5643:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10473,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10458,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10355,"src":"5659:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":10463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"~","prefix":true,"src":"5674:48:54","subExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10461,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10459,"name":"CLEAR_SELECTOR_MASK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10057,"src":"5676:19:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10460,"name":"selectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10449,"src":"5699:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5676:45:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10462,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5675:47:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5659:63:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10465,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5658:65:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10471,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":10468,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10400,"src":"5735:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10467,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5727:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10466,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5727:7:54","typeDescriptions":{}}},"id":10469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5727:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10470,"name":"selectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10449,"src":"5748:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5727:43:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10472,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5726:45:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5658:113:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5643:128:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10475,"nodeType":"ExpressionStatement","src":"5643:128:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10476,"name":"selectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10449,"src":"5846:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"323234","id":10477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5872:3:54","typeDescriptions":{"typeIdentifier":"t_rational_224_by_1","typeString":"int_const 224"},"value":"224"},"src":"5846:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10494,"nodeType":"IfStatement","src":"5842:152:54","trueBody":{"id":10493,"nodeType":"Block","src":"5877:117:54","statements":[{"expression":{"id":10487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10479,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10351,"src":"5895:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10484,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5897:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"5895:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10485,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10481,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10353,"src":"5911:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":10482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5928:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"5911:18:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5895:35:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":10486,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10355,"src":"5933:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"5895:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10488,"nodeType":"ExpressionStatement","src":"5895:50:54"},{"expression":{"id":10491,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10489,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10355,"src":"5963:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":10490,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5978:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5963:16:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10492,"nodeType":"ExpressionStatement","src":"5963:16:54"}]}},{"id":10498,"nodeType":"UncheckedBlock","src":"6008:58:54","statements":[{"expression":{"id":10496,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"6036:15:54","subExpression":{"id":10495,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10353,"src":"6038:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10497,"nodeType":"ExpressionStatement","src":"6036:15:54"}]}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10395,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10393,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10391,"src":"5105:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":10394,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10385,"src":"5109:6:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5105:10:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10500,"initializationExpression":{"assignments":[10391],"declarations":[{"constant":false,"id":10391,"mutability":"mutable","name":"i","nameLocation":"5102:1:54","nodeType":"VariableDeclaration","scope":10500,"src":"5094:9:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10390,"name":"uint256","nodeType":"ElementaryTypeName","src":"5094:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10392,"nodeType":"VariableDeclarationStatement","src":"5094:9:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":10397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"5117:3:54","subExpression":{"id":10396,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10391,"src":"5119:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10398,"nodeType":"ExpressionStatement","src":"5117:3:54"},"nodeType":"ForStatement","src":"5089:987:54"},{"expression":{"components":[{"id":10501,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10353,"src":"6094:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10502,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10355,"src":"6109:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10503,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6093:29:54","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"functionReturnParameters":10364,"id":10504,"nodeType":"Return","src":"6086:36:54"}]},"id":10506,"implemented":true,"kind":"function","modifiers":[],"name":"addFacetSelectors","nameLocation":"4726:17:54","nodeType":"FunctionDefinition","parameters":{"id":10359,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10351,"mutability":"mutable","name":"s","nameLocation":"4768:1:54","nodeType":"VariableDeclaration","scope":10506,"src":"4753:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10350,"nodeType":"UserDefinedTypeName","pathNode":{"id":10349,"name":"Layout","nameLocations":["4753:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"4753:6:54"},"referencedDeclaration":10024,"src":"4753:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10353,"mutability":"mutable","name":"selectorCount","nameLocation":"4787:13:54","nodeType":"VariableDeclaration","scope":10506,"src":"4779:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10352,"name":"uint256","nodeType":"ElementaryTypeName","src":"4779:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10355,"mutability":"mutable","name":"selectorSlot","nameLocation":"4818:12:54","nodeType":"VariableDeclaration","scope":10506,"src":"4810:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10354,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4810:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10358,"mutability":"mutable","name":"facetCut","nameLocation":"4856:8:54","nodeType":"VariableDeclaration","scope":10506,"src":"4840:24:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut"},"typeName":{"id":10357,"nodeType":"UserDefinedTypeName","pathNode":{"id":10356,"name":"FacetCut","nameLocations":["4840:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"4840:8:54"},"referencedDeclaration":9555,"src":"4840:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"visibility":"internal"}],"src":"4743:127:54"},"returnParameters":{"id":10364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10361,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10506,"src":"4889:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10360,"name":"uint256","nodeType":"ElementaryTypeName","src":"4889:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10363,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10506,"src":"4898:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10362,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4898:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4888:18:54"},"scope":11524,"src":"4717:1412:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10804,"nodeType":"Block","src":"6328:3010:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10523,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10516,"src":"6342:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10524,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6351:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"6342:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":10527,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6368:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10526,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6360:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10525,"name":"address","nodeType":"ElementaryTypeName","src":"6360:7:54","typeDescriptions":{}}},"id":10528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6360:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6342:28:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10535,"nodeType":"IfStatement","src":"6338:88:54","trueBody":{"errorCall":{"arguments":[{"expression":{"id":10531,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10516,"src":"6411:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10532,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6420:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"6411:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10530,"name":"RemovingWithNonZeroAddressFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9584,"src":"6379:31:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6379:47:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10534,"nodeType":"RevertStatement","src":"6372:54:54"}},{"assignments":[10537],"declarations":[{"constant":false,"id":10537,"mutability":"mutable","name":"selectorSlotCount","nameLocation":"6445:17:54","nodeType":"VariableDeclaration","scope":10804,"src":"6437:25:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10536,"name":"uint256","nodeType":"ElementaryTypeName","src":"6437:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10541,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10538,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10511,"src":"6465:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":10539,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6482:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"6465:18:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6437:46:54"},{"assignments":[10543],"declarations":[{"constant":false,"id":10543,"mutability":"mutable","name":"selectorInSlotIndex","nameLocation":"6501:19:54","nodeType":"VariableDeclaration","scope":10804,"src":"6493:27:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10542,"name":"uint256","nodeType":"ElementaryTypeName","src":"6493:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10547,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10546,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10544,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10511,"src":"6523:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"37","id":10545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6539:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"6523:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6493:47:54"},{"body":{"id":10789,"nodeType":"Block","src":"6603:2609:54","statements":[{"assignments":[10560],"declarations":[{"constant":false,"id":10560,"mutability":"mutable","name":"selector","nameLocation":"6624:8:54","nodeType":"VariableDeclaration","scope":10789,"src":"6617:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":10559,"name":"bytes4","nodeType":"ElementaryTypeName","src":"6617:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":10565,"initialValue":{"baseExpression":{"expression":{"id":10561,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10516,"src":"6635:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10562,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6644:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"6635:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10564,"indexExpression":{"id":10563,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10549,"src":"6654:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6635:21:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"6617:39:54"},{"assignments":[10567],"declarations":[{"constant":false,"id":10567,"mutability":"mutable","name":"oldFacet","nameLocation":"6678:8:54","nodeType":"VariableDeclaration","scope":10789,"src":"6670:16:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10566,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6670:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":10572,"initialValue":{"baseExpression":{"expression":{"id":10568,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"6689:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10569,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6691:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"6689:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10571,"indexExpression":{"id":10570,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"6705:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6689:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"6670:44:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":10577,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"6749:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10578,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6751:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"6749:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10580,"indexExpression":{"id":10579,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"6765:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6749:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10576,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6741:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10575,"name":"bytes20","nodeType":"ElementaryTypeName","src":"6741:7:54","typeDescriptions":{}}},"id":10581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6741:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":10574,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6733:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10573,"name":"address","nodeType":"ElementaryTypeName","src":"6733:7:54","typeDescriptions":{}}},"id":10582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6733:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":10585,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6788:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10584,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6780:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10583,"name":"address","nodeType":"ElementaryTypeName","src":"6780:7:54","typeDescriptions":{}}},"id":10586,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6780:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6733:57:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10592,"nodeType":"IfStatement","src":"6729:96:54","trueBody":{"errorCall":{"arguments":[{"id":10589,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"6816:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10588,"name":"FunctionNotFound","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9589,"src":"6799:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes4_$returns$_t_error_$","typeString":"function (bytes4) pure returns (error)"}},"id":10590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6799:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10591,"nodeType":"RevertStatement","src":"6792:33:54"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":10597,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"6859:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10598,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6861:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"6859:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10600,"indexExpression":{"id":10599,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"6875:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6859:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10596,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6851:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10595,"name":"bytes20","nodeType":"ElementaryTypeName","src":"6851:7:54","typeDescriptions":{}}},"id":10601,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6851:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":10594,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6843:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10593,"name":"address","nodeType":"ElementaryTypeName","src":"6843:7:54","typeDescriptions":{}}},"id":10602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6843:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":10605,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"6898:4:54","typeDescriptions":{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}],"id":10604,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6890:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10603,"name":"address","nodeType":"ElementaryTypeName","src":"6890:7:54","typeDescriptions":{}}},"id":10606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6890:13:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6843:60:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10612,"nodeType":"IfStatement","src":"6839:109:54","trueBody":{"errorCall":{"arguments":[{"id":10609,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"6939:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10608,"name":"ModifyingImmutableFunction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9594,"src":"6912:26:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes4_$returns$_t_error_$","typeString":"function (bytes4) pure returns (error)"}},"id":10610,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6912:36:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10611,"nodeType":"RevertStatement","src":"6905:43:54"}},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10613,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"6967:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":10614,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6983:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6967:17:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":10636,"nodeType":"Block","src":"7202:104:54","statements":[{"id":10635,"nodeType":"UncheckedBlock","src":"7220:72:54","statements":[{"expression":{"id":10633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"7252:21:54","subExpression":{"id":10632,"name":"selectorInSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10543,"src":"7252:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10634,"nodeType":"ExpressionStatement","src":"7252:21:54"}]}]},"id":10637,"nodeType":"IfStatement","src":"6963:343:54","trueBody":{"id":10631,"nodeType":"Block","src":"6986:210:54","statements":[{"id":10619,"nodeType":"UncheckedBlock","src":"7004:70:54","statements":[{"expression":{"id":10617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":false,"src":"7036:19:54","subExpression":{"id":10616,"name":"selectorSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"7036:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10618,"nodeType":"ExpressionStatement","src":"7036:19:54"}]},{"expression":{"id":10625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10620,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"7091:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"id":10621,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"7106:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10622,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7108:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"7106:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10624,"indexExpression":{"id":10623,"name":"selectorSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"7122:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7106:34:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7091:49:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10626,"nodeType":"ExpressionStatement","src":"7091:49:54"},{"expression":{"id":10629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10627,"name":"selectorInSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10543,"src":"7158:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"37","id":10628,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7180:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"7158:23:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10630,"nodeType":"ExpressionStatement","src":"7158:23:54"}]}},{"assignments":[10639],"declarations":[{"constant":false,"id":10639,"mutability":"mutable","name":"lastSelector","nameLocation":"7327:12:54","nodeType":"VariableDeclaration","scope":10789,"src":"7320:19:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":10638,"name":"bytes4","nodeType":"ElementaryTypeName","src":"7320:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":10640,"nodeType":"VariableDeclarationStatement","src":"7320:19:54"},{"assignments":[10642],"declarations":[{"constant":false,"id":10642,"mutability":"mutable","name":"oldSelectorsSlotCount","nameLocation":"7361:21:54","nodeType":"VariableDeclaration","scope":10789,"src":"7353:29:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10641,"name":"uint256","nodeType":"ElementaryTypeName","src":"7353:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10643,"nodeType":"VariableDeclarationStatement","src":"7353:29:54"},{"assignments":[10645],"declarations":[{"constant":false,"id":10645,"mutability":"mutable","name":"oldSelectorInSlotPosition","nameLocation":"7404:25:54","nodeType":"VariableDeclaration","scope":10789,"src":"7396:33:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10644,"name":"uint256","nodeType":"ElementaryTypeName","src":"7396:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10646,"nodeType":"VariableDeclarationStatement","src":"7396:33:54"},{"id":10714,"nodeType":"Block","src":"7509:678:54","statements":[{"expression":{"id":10657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10647,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"7594:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10650,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"7616:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10653,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10651,"name":"selectorInSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10543,"src":"7633:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":10652,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7656:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"7633:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":10654,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7632:26:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7616:42:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10649,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7609:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":10648,"name":"bytes4","nodeType":"ElementaryTypeName","src":"7609:6:54","typeDescriptions":{}}},"id":10656,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7609:50:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"7594:65:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":10658,"nodeType":"ExpressionStatement","src":"7594:65:54"},{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":10661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10659,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"7682:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":10660,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"7698:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"7682:24:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10682,"nodeType":"IfStatement","src":"7678:238:54","trueBody":{"id":10681,"nodeType":"Block","src":"7708:208:54","statements":[{"expression":{"id":10679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10662,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"7793:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10665,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7795:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"7793:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10666,"indexExpression":{"id":10664,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"7809:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7793:29:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10678,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10667,"name":"oldFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10567,"src":"7826:8:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":10668,"name":"CLEAR_ADDRESS_MASK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10046,"src":"7837:18:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7826:29:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10670,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"7825:31:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"arguments":[{"baseExpression":{"expression":{"id":10673,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"7867:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10674,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7869:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"7867:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10676,"indexExpression":{"id":10675,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"7883:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7867:29:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10672,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7859:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10671,"name":"bytes20","nodeType":"ElementaryTypeName","src":"7859:7:54","typeDescriptions":{}}},"id":10677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7859:38:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}},"src":"7825:72:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"7793:104:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10680,"nodeType":"ExpressionStatement","src":"7793:104:54"}]}},{"expression":{"id":10687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"7934:32:54","subExpression":{"baseExpression":{"expression":{"id":10683,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"7941:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10684,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7943:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"7941:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10686,"indexExpression":{"id":10685,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10560,"src":"7957:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7941:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10688,"nodeType":"ExpressionStatement","src":"7934:32:54"},{"assignments":[10690],"declarations":[{"constant":false,"id":10690,"mutability":"mutable","name":"oldSelectorCount","nameLocation":"7992:16:54","nodeType":"VariableDeclaration","scope":10714,"src":"7984:24:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10689,"name":"uint256","nodeType":"ElementaryTypeName","src":"7984:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10698,"initialValue":{"arguments":[{"arguments":[{"id":10695,"name":"oldFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10567,"src":"8026:8:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10694,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8018:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":10693,"name":"uint256","nodeType":"ElementaryTypeName","src":"8018:7:54","typeDescriptions":{}}},"id":10696,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8018:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":10692,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8011:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"},"typeName":{"id":10691,"name":"uint16","nodeType":"ElementaryTypeName","src":"8011:6:54","typeDescriptions":{}}},"id":10697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8011:25:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"VariableDeclarationStatement","src":"7984:52:54"},{"expression":{"id":10703,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10699,"name":"oldSelectorsSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10642,"src":"8054:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10702,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10700,"name":"oldSelectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10690,"src":"8078:16:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"hexValue":"33","id":10701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8098:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"8078:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8054:45:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10704,"nodeType":"ExpressionStatement","src":"8054:45:54"},{"expression":{"id":10712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10705,"name":"oldSelectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10645,"src":"8117:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10711,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10708,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10706,"name":"oldSelectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10690,"src":"8146:16:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"hexValue":"37","id":10707,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8165:1:54","typeDescriptions":{"typeIdentifier":"t_rational_7_by_1","typeString":"int_const 7"},"value":"7"},"src":"8146:20:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":10709,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8145:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":10710,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8171:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"8145:27:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8117:55:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10713,"nodeType":"ExpressionStatement","src":"8117:55:54"}]},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10715,"name":"oldSelectorsSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10642,"src":"8205:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":10716,"name":"selectorSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"8230:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8205:42:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":10772,"nodeType":"Block","src":"8763:287:54","statements":[{"expression":{"id":10770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10753,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"8877:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10769,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10754,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"8913:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":10759,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"~","prefix":true,"src":"8928:51:54","subExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10757,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10755,"name":"CLEAR_SELECTOR_MASK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10057,"src":"8930:19:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10756,"name":"oldSelectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10645,"src":"8953:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8930:48:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10758,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8929:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8913:66:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10761,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8912:68:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":10764,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"8992:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10763,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8984:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10762,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8984:7:54","typeDescriptions":{}}},"id":10765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8984:21:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10766,"name":"oldSelectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10645,"src":"9009:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8984:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10768,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8983:52:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8912:123:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8877:158:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10771,"nodeType":"ExpressionStatement","src":"8877:158:54"}]},"id":10773,"nodeType":"IfStatement","src":"8201:849:54","trueBody":{"id":10752,"nodeType":"Block","src":"8249:508:54","statements":[{"assignments":[10719],"declarations":[{"constant":false,"id":10719,"mutability":"mutable","name":"oldSelectorSlot","nameLocation":"8275:15:54","nodeType":"VariableDeclaration","scope":10752,"src":"8267:23:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10718,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8267:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":10724,"initialValue":{"baseExpression":{"expression":{"id":10720,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"8293:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10721,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8295:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"8293:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10723,"indexExpression":{"id":10722,"name":"oldSelectorsSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10642,"src":"8309:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8293:38:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"8267:64:54"},{"expression":{"id":10742,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10725,"name":"oldSelectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10719,"src":"8446:15:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10732,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10726,"name":"oldSelectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10719,"src":"8485:15:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":10731,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"~","prefix":true,"src":"8503:51:54","subExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10729,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10727,"name":"CLEAR_SELECTOR_MASK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10057,"src":"8505:19:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10728,"name":"oldSelectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10645,"src":"8528:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8505:48:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10730,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8504:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8485:69:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10733,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8484:71:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":10736,"name":"lastSelector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10639,"src":"8567:12:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10735,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8559:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":10734,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8559:7:54","typeDescriptions":{}}},"id":10737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8559:21:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":">>","rightExpression":{"id":10738,"name":"oldSelectorInSlotPosition","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10645,"src":"8584:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8559:50:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10740,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"8558:52:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8484:126:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8446:164:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10743,"nodeType":"ExpressionStatement","src":"8446:164:54"},{"expression":{"id":10750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10744,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"8686:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10747,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8688:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"8686:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10748,"indexExpression":{"id":10746,"name":"oldSelectorsSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10642,"src":"8702:21:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8686:38:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":10749,"name":"oldSelectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10719,"src":"8727:15:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"8686:56:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10751,"nodeType":"ExpressionStatement","src":"8686:56:54"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10774,"name":"selectorInSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10543,"src":"9068:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":10775,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9091:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9068:24:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10788,"nodeType":"IfStatement","src":"9064:138:54","trueBody":{"id":10787,"nodeType":"Block","src":"9094:108:54","statements":[{"expression":{"id":10781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"9112:41:54","subExpression":{"baseExpression":{"expression":{"id":10777,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10509,"src":"9119:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10778,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9121:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"9119:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":10780,"indexExpression":{"id":10779,"name":"selectorSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"9135:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9119:34:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":10782,"nodeType":"ExpressionStatement","src":"9112:41:54"},{"expression":{"id":10785,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10783,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"9171:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":10784,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9186:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9171:16:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10786,"nodeType":"ExpressionStatement","src":"9171:16:54"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10551,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10549,"src":"6567:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"expression":{"id":10552,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10516,"src":"6571:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10553,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6580:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"6571:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10554,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6590:6:54","memberName":"length","nodeType":"MemberAccess","src":"6571:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6567:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10790,"initializationExpression":{"assignments":[10549],"declarations":[{"constant":false,"id":10549,"mutability":"mutable","name":"i","nameLocation":"6564:1:54","nodeType":"VariableDeclaration","scope":10790,"src":"6556:9:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10548,"name":"uint256","nodeType":"ElementaryTypeName","src":"6556:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10550,"nodeType":"VariableDeclarationStatement","src":"6556:9:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":10557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"6598:3:54","subExpression":{"id":10556,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10549,"src":"6600:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10558,"nodeType":"ExpressionStatement","src":"6598:3:54"},"nodeType":"ForStatement","src":"6551:2661:54"},{"expression":{"id":10798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":10791,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10511,"src":"9222:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10792,"name":"selectorSlotCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10537,"src":"9239:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"33","id":10793,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9260:1:54","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"9239:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":10795,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9238:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"id":10796,"name":"selectorInSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10543,"src":"9265:19:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9238:46:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9222:62:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10799,"nodeType":"ExpressionStatement","src":"9222:62:54"},{"expression":{"components":[{"id":10800,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10511,"src":"9303:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":10801,"name":"selectorSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10513,"src":"9318:12:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10802,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9302:29:54","typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_bytes32_$","typeString":"tuple(uint256,bytes32)"}},"functionReturnParameters":10522,"id":10803,"nodeType":"Return","src":"9295:36:54"}]},"id":10805,"implemented":true,"kind":"function","modifiers":[],"name":"removeFacetSelectors","nameLocation":"6144:20:54","nodeType":"FunctionDefinition","parameters":{"id":10517,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10509,"mutability":"mutable","name":"s","nameLocation":"6189:1:54","nodeType":"VariableDeclaration","scope":10805,"src":"6174:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10508,"nodeType":"UserDefinedTypeName","pathNode":{"id":10507,"name":"Layout","nameLocations":["6174:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"6174:6:54"},"referencedDeclaration":10024,"src":"6174:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10511,"mutability":"mutable","name":"selectorCount","nameLocation":"6208:13:54","nodeType":"VariableDeclaration","scope":10805,"src":"6200:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10510,"name":"uint256","nodeType":"ElementaryTypeName","src":"6200:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10513,"mutability":"mutable","name":"selectorSlot","nameLocation":"6239:12:54","nodeType":"VariableDeclaration","scope":10805,"src":"6231:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10512,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6231:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":10516,"mutability":"mutable","name":"facetCut","nameLocation":"6277:8:54","nodeType":"VariableDeclaration","scope":10805,"src":"6261:24:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut"},"typeName":{"id":10515,"nodeType":"UserDefinedTypeName","pathNode":{"id":10514,"name":"FacetCut","nameLocations":["6261:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"6261:8:54"},"referencedDeclaration":9555,"src":"6261:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"visibility":"internal"}],"src":"6164:127:54"},"returnParameters":{"id":10522,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10519,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10805,"src":"6310:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10518,"name":"uint256","nodeType":"ElementaryTypeName","src":"6310:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10521,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":10805,"src":"6319:7:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10520,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6319:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6309:18:54"},"scope":11524,"src":"6135:3203:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10917,"nodeType":"Block","src":"9428:808:54","statements":[{"assignments":[10815],"declarations":[{"constant":false,"id":10815,"mutability":"mutable","name":"facet","nameLocation":"9446:5:54","nodeType":"VariableDeclaration","scope":10917,"src":"9438:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10814,"name":"address","nodeType":"ElementaryTypeName","src":"9438:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":10818,"initialValue":{"expression":{"id":10816,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10811,"src":"9454:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10817,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9463:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"9454:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"9438:30:54"},{"condition":{"id":10822,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"9482:20:54","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":10819,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10815,"src":"9483:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":10820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9489:11:54","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"9483:17:54","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":10821,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9483:19:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10828,"nodeType":"IfStatement","src":"9478:65:54","trueBody":{"errorCall":{"arguments":[{"expression":{"id":10824,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10811,"src":"9528:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10825,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9537:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"9528:14:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10823,"name":"NonContractFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9572,"src":"9511:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9511:32:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10827,"nodeType":"RevertStatement","src":"9504:39:54"}},{"assignments":[10830],"declarations":[{"constant":false,"id":10830,"mutability":"mutable","name":"length","nameLocation":"9562:6:54","nodeType":"VariableDeclaration","scope":10917,"src":"9554:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10829,"name":"uint256","nodeType":"ElementaryTypeName","src":"9554:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10834,"initialValue":{"expression":{"expression":{"id":10831,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10811,"src":"9571:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10832,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9580:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"9571:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9590:6:54","memberName":"length","nodeType":"MemberAccess","src":"9571:25:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9554:42:54"},{"body":{"id":10915,"nodeType":"Block","src":"9639:591:54","statements":[{"assignments":[10845],"declarations":[{"constant":false,"id":10845,"mutability":"mutable","name":"selector","nameLocation":"9660:8:54","nodeType":"VariableDeclaration","scope":10915,"src":"9653:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":10844,"name":"bytes4","nodeType":"ElementaryTypeName","src":"9653:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":10850,"initialValue":{"baseExpression":{"expression":{"id":10846,"name":"facetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10811,"src":"9671:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":10847,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9680:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"9671:18:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":10849,"indexExpression":{"id":10848,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10836,"src":"9690:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9671:21:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"9653:39:54"},{"assignments":[10852],"declarations":[{"constant":false,"id":10852,"mutability":"mutable","name":"oldFacet","nameLocation":"9714:8:54","nodeType":"VariableDeclaration","scope":10915,"src":"9706:16:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":10851,"name":"bytes32","nodeType":"ElementaryTypeName","src":"9706:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":10857,"initialValue":{"baseExpression":{"expression":{"id":10853,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10808,"src":"9725:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10854,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9727:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"9725:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10856,"indexExpression":{"id":10855,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10845,"src":"9741:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9725:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"9706:44:54"},{"assignments":[10859],"declarations":[{"constant":false,"id":10859,"mutability":"mutable","name":"oldFacetAddress","nameLocation":"9772:15:54","nodeType":"VariableDeclaration","scope":10915,"src":"9764:23:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10858,"name":"address","nodeType":"ElementaryTypeName","src":"9764:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":10867,"initialValue":{"arguments":[{"arguments":[{"id":10864,"name":"oldFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10852,"src":"9806:8:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":10863,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9798:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10862,"name":"bytes20","nodeType":"ElementaryTypeName","src":"9798:7:54","typeDescriptions":{}}},"id":10865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9798:17:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":10861,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9790:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10860,"name":"address","nodeType":"ElementaryTypeName","src":"9790:7:54","typeDescriptions":{}}},"id":10866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9790:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"9764:52:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10868,"name":"oldFacetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10859,"src":"9835:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":10871,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9862:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10870,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9854:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10869,"name":"address","nodeType":"ElementaryTypeName","src":"9854:7:54","typeDescriptions":{}}},"id":10872,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9854:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9835:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10878,"nodeType":"IfStatement","src":"9831:68:54","trueBody":{"errorCall":{"arguments":[{"id":10875,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10845,"src":"9890:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10874,"name":"FunctionNotFound","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9589,"src":"9873:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes4_$returns$_t_error_$","typeString":"function (bytes4) pure returns (error)"}},"id":10876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9873:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10877,"nodeType":"RevertStatement","src":"9866:33:54"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10884,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10879,"name":"oldFacetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10859,"src":"9917:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":10882,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"9944:4:54","typeDescriptions":{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}],"id":10881,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9936:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10880,"name":"address","nodeType":"ElementaryTypeName","src":"9936:7:54","typeDescriptions":{}}},"id":10883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9936:13:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9917:32:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10889,"nodeType":"IfStatement","src":"9913:81:54","trueBody":{"errorCall":{"arguments":[{"id":10886,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10845,"src":"9985:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10885,"name":"ModifyingImmutableFunction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9594,"src":"9958:26:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes4_$returns$_t_error_$","typeString":"function (bytes4) pure returns (error)"}},"id":10887,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9958:36:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10888,"nodeType":"RevertStatement","src":"9951:43:54"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10892,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10890,"name":"oldFacetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10859,"src":"10012:15:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":10891,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10815,"src":"10031:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10012:24:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10898,"nodeType":"IfStatement","src":"10008:79:54","trueBody":{"errorCall":{"arguments":[{"id":10894,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10815,"src":"10071:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10895,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10845,"src":"10078:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":10893,"name":"ReplacingFunctionByItself","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9601,"src":"10045:25:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes4_$returns$_t_error_$","typeString":"function (address,bytes4) pure returns (error)"}},"id":10896,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10045:42:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10897,"nodeType":"RevertStatement","src":"10038:49:54"}},{"expression":{"id":10913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":10899,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10808,"src":"10143:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":10902,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10145:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"10143:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":10903,"indexExpression":{"id":10901,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10845,"src":"10159:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10143:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":10906,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10904,"name":"oldFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10852,"src":"10172:8:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":10905,"name":"CLEAR_ADDRESS_MASK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10046,"src":"10183:18:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"10172:29:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"id":10907,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"10171:31:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"arguments":[{"id":10910,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10815,"src":"10213:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10909,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10205:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":10908,"name":"bytes20","nodeType":"ElementaryTypeName","src":"10205:7:54","typeDescriptions":{}}},"id":10911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10205:14:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}},"src":"10171:48:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"10143:76:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":10914,"nodeType":"ExpressionStatement","src":"10143:76:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10838,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10836,"src":"9622:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":10839,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10830,"src":"9626:6:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9622:10:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10916,"initializationExpression":{"assignments":[10836],"declarations":[{"constant":false,"id":10836,"mutability":"mutable","name":"i","nameLocation":"9619:1:54","nodeType":"VariableDeclaration","scope":10916,"src":"9611:9:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10835,"name":"uint256","nodeType":"ElementaryTypeName","src":"9611:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10837,"nodeType":"VariableDeclarationStatement","src":"9611:9:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":10842,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"9634:3:54","subExpression":{"id":10841,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10836,"src":"9636:1:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":10843,"nodeType":"ExpressionStatement","src":"9634:3:54"},"nodeType":"ForStatement","src":"9606:624:54"}]},"id":10918,"implemented":true,"kind":"function","modifiers":[],"name":"replaceFacetSelectors","nameLocation":"9353:21:54","nodeType":"FunctionDefinition","parameters":{"id":10812,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10808,"mutability":"mutable","name":"s","nameLocation":"9390:1:54","nodeType":"VariableDeclaration","scope":10918,"src":"9375:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":10807,"nodeType":"UserDefinedTypeName","pathNode":{"id":10806,"name":"Layout","nameLocations":["9375:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"9375:6:54"},"referencedDeclaration":10024,"src":"9375:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":10811,"mutability":"mutable","name":"facetCut","nameLocation":"9409:8:54","nodeType":"VariableDeclaration","scope":10918,"src":"9393:24:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut"},"typeName":{"id":10810,"nodeType":"UserDefinedTypeName","pathNode":{"id":10809,"name":"FacetCut","nameLocations":["9393:8:54"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"9393:8:54"},"referencedDeclaration":9555,"src":"9393:8:54","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"visibility":"internal"}],"src":"9374:44:54"},"returnParameters":{"id":10813,"nodeType":"ParameterList","parameters":[],"src":"9428:0:54"},"scope":11524,"src":"9344:892:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":10998,"nodeType":"Block","src":"10314:821:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10925,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10328:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":10928,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10346:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":10927,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10338:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10926,"name":"address","nodeType":"ElementaryTypeName","src":"10338:7:54","typeDescriptions":{}}},"id":10929,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10338:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10328:20:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":10996,"nodeType":"Block","src":"10452:677:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10940,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10922,"src":"10470:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":10941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10475:6:54","memberName":"length","nodeType":"MemberAccess","src":"10470:11:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":10942,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10485:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10470:16:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10948,"nodeType":"IfStatement","src":"10466:54:54","trueBody":{"errorCall":{"arguments":[{"id":10945,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10513:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10944,"name":"EmptyInitCallData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9609,"src":"10495:17:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10946,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10495:25:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10947,"nodeType":"RevertStatement","src":"10488:32:54"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":10954,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10949,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10538:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":10952,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"10556:4:54","typeDescriptions":{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DiamondStorage_$11524","typeString":"library DiamondStorage"}],"id":10951,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10548:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":10950,"name":"address","nodeType":"ElementaryTypeName","src":"10548:7:54","typeDescriptions":{}}},"id":10953,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10548:13:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10538:23:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10965,"nodeType":"IfStatement","src":"10534:129:54","trueBody":{"id":10964,"nodeType":"Block","src":"10563:100:54","statements":[{"condition":{"id":10958,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"10585:21:54","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":10955,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10586:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":10956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10593:11:54","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"10586:18:54","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":10957,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10586:20:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10963,"nodeType":"IfStatement","src":"10581:67:54","trueBody":{"errorCall":{"arguments":[{"id":10960,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10641:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":10959,"name":"NonContractInitCallTarget","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9614,"src":"10615:25:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":10961,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10615:33:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10962,"nodeType":"RevertStatement","src":"10608:40:54"}}]}},{"assignments":[10967,10969],"declarations":[{"constant":false,"id":10967,"mutability":"mutable","name":"success","nameLocation":"10683:7:54","nodeType":"VariableDeclaration","scope":10996,"src":"10678:12:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":10966,"name":"bool","nodeType":"ElementaryTypeName","src":"10678:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":10969,"mutability":"mutable","name":"returndata","nameLocation":"10705:10:54","nodeType":"VariableDeclaration","scope":10996,"src":"10692:23:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10968,"name":"bytes","nodeType":"ElementaryTypeName","src":"10692:5:54","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":10974,"initialValue":{"arguments":[{"id":10972,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10922,"src":"10739:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":10970,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"10719:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":10971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10726:12:54","memberName":"delegatecall","nodeType":"MemberAccess","src":"10719:19:54","typeDescriptions":{"typeIdentifier":"t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) returns (bool,bytes memory)"}},"id":10973,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10719:25:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"10677:67:54"},{"condition":{"id":10976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"10762:8:54","subExpression":{"id":10975,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10967,"src":"10763:7:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10995,"nodeType":"IfStatement","src":"10758:361:54","trueBody":{"id":10994,"nodeType":"Block","src":"10772:347:54","statements":[{"assignments":[10978],"declarations":[{"constant":false,"id":10978,"mutability":"mutable","name":"returndataLength","nameLocation":"10798:16:54","nodeType":"VariableDeclaration","scope":10994,"src":"10790:24:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10977,"name":"uint256","nodeType":"ElementaryTypeName","src":"10790:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":10981,"initialValue":{"expression":{"id":10979,"name":"returndata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10969,"src":"10817:10:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":10980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10828:6:54","memberName":"length","nodeType":"MemberAccess","src":"10817:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10790:44:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10984,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":10982,"name":"returndataLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10978,"src":"10856:16:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":10983,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10876:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10856:21:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":10992,"nodeType":"Block","src":"11027:78:54","statements":[{"errorCall":{"arguments":[{"id":10988,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10920,"src":"11073:6:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":10989,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10922,"src":"11081:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":10987,"name":"InitCallReverted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9621,"src":"11056:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes_memory_ptr_$returns$_t_error_$","typeString":"function (address,bytes memory) pure returns (error)"}},"id":10990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11056:30:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10991,"nodeType":"RevertStatement","src":"11049:37:54"}]},"id":10993,"nodeType":"IfStatement","src":"10852:253:54","trueBody":{"id":10986,"nodeType":"Block","src":"10879:142:54","statements":[{"AST":{"nativeSrc":"10910:93:54","nodeType":"YulBlock","src":"10910:93:54","statements":[{"expression":{"arguments":[{"arguments":[{"kind":"number","nativeSrc":"10947:2:54","nodeType":"YulLiteral","src":"10947:2:54","type":"","value":"32"},{"name":"returndata","nativeSrc":"10951:10:54","nodeType":"YulIdentifier","src":"10951:10:54"}],"functionName":{"name":"add","nativeSrc":"10943:3:54","nodeType":"YulIdentifier","src":"10943:3:54"},"nativeSrc":"10943:19:54","nodeType":"YulFunctionCall","src":"10943:19:54"},{"name":"returndataLength","nativeSrc":"10964:16:54","nodeType":"YulIdentifier","src":"10964:16:54"}],"functionName":{"name":"revert","nativeSrc":"10936:6:54","nodeType":"YulIdentifier","src":"10936:6:54"},"nativeSrc":"10936:45:54","nodeType":"YulFunctionCall","src":"10936:45:54"},"nativeSrc":"10936:45:54","nodeType":"YulExpressionStatement","src":"10936:45:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":10969,"isOffset":false,"isSlot":false,"src":"10951:10:54","valueSize":1},{"declaration":10978,"isOffset":false,"isSlot":false,"src":"10964:16:54","valueSize":1}],"id":10985,"nodeType":"InlineAssembly","src":"10901:102:54"}]}}]}}]},"id":10997,"nodeType":"IfStatement","src":"10324:805:54","trueBody":{"id":10939,"nodeType":"Block","src":"10350:96:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":10934,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":10931,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10922,"src":"10368:4:54","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":10932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10373:6:54","memberName":"length","nodeType":"MemberAccess","src":"10368:11:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":10933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10383:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10368:16:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":10938,"nodeType":"IfStatement","src":"10364:71:54","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":10935,"name":"ZeroAddressTargetInitCallButNonEmptyData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9604,"src":"10393:40:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":10936,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10393:42:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":10937,"nodeType":"RevertStatement","src":"10386:49:54"}}]}}]},"id":10999,"implemented":true,"kind":"function","modifiers":[],"name":"initializationCall","nameLocation":"10251:18:54","nodeType":"FunctionDefinition","parameters":{"id":10923,"nodeType":"ParameterList","parameters":[{"constant":false,"id":10920,"mutability":"mutable","name":"target","nameLocation":"10278:6:54","nodeType":"VariableDeclaration","scope":10999,"src":"10270:14:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":10919,"name":"address","nodeType":"ElementaryTypeName","src":"10270:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":10922,"mutability":"mutable","name":"data","nameLocation":"10299:4:54","nodeType":"VariableDeclaration","scope":10999,"src":"10286:17:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":10921,"name":"bytes","nodeType":"ElementaryTypeName","src":"10286:5:54","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10269:35:54"},"returnParameters":{"id":10924,"nodeType":"ParameterList","parameters":[],"src":"10314:0:54"},"scope":11524,"src":"10242:893:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":11029,"nodeType":"Block","src":"11196:550:54","statements":[{"assignments":[11006],"declarations":[{"constant":false,"id":11006,"mutability":"mutable","name":"selector","nameLocation":"11213:8:54","nodeType":"VariableDeclaration","scope":11029,"src":"11206:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11005,"name":"bytes4","nodeType":"ElementaryTypeName","src":"11206:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":11009,"initialValue":{"expression":{"id":11007,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"11224:3:54","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":11008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11228:3:54","memberName":"sig","nodeType":"MemberAccess","src":"11224:7:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"11206:25:54"},{"assignments":[11011],"declarations":[{"constant":false,"id":11011,"mutability":"mutable","name":"facet","nameLocation":"11249:5:54","nodeType":"VariableDeclaration","scope":11029,"src":"11241:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11010,"name":"address","nodeType":"ElementaryTypeName","src":"11241:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11016,"initialValue":{"arguments":[{"id":11014,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11006,"src":"11272:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"expression":{"id":11012,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11002,"src":"11257:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11013,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11259:12:54","memberName":"facetAddress","nodeType":"MemberAccess","referencedDeclaration":11511,"src":"11257:14:54","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$10024_storage_ptr_$_t_bytes4_$returns$_t_address_$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,bytes4) view returns (address)"}},"id":11015,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11257:24:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"11241:40:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11022,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11017,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11011,"src":"11295:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":11020,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11312:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":11019,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11304:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11018,"name":"address","nodeType":"ElementaryTypeName","src":"11304:7:54","typeDescriptions":{}}},"id":11021,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11304:10:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11295:19:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11027,"nodeType":"IfStatement","src":"11291:58:54","trueBody":{"errorCall":{"arguments":[{"id":11024,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11006,"src":"11340:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"id":11023,"name":"FunctionNotFound","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9589,"src":"11323:16:54","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes4_$returns$_t_error_$","typeString":"function (bytes4) pure returns (error)"}},"id":11025,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11323:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":11026,"nodeType":"RevertStatement","src":"11316:33:54"}},{"AST":{"nativeSrc":"11368:372:54","nodeType":"YulBlock","src":"11368:372:54","statements":[{"expression":{"arguments":[{"kind":"number","nativeSrc":"11395:1:54","nodeType":"YulLiteral","src":"11395:1:54","type":"","value":"0"},{"kind":"number","nativeSrc":"11398:1:54","nodeType":"YulLiteral","src":"11398:1:54","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nativeSrc":"11401:12:54","nodeType":"YulIdentifier","src":"11401:12:54"},"nativeSrc":"11401:14:54","nodeType":"YulFunctionCall","src":"11401:14:54"}],"functionName":{"name":"calldatacopy","nativeSrc":"11382:12:54","nodeType":"YulIdentifier","src":"11382:12:54"},"nativeSrc":"11382:34:54","nodeType":"YulFunctionCall","src":"11382:34:54"},"nativeSrc":"11382:34:54","nodeType":"YulExpressionStatement","src":"11382:34:54"},{"nativeSrc":"11429:65:54","nodeType":"YulVariableDeclaration","src":"11429:65:54","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nativeSrc":"11456:3:54","nodeType":"YulIdentifier","src":"11456:3:54"},"nativeSrc":"11456:5:54","nodeType":"YulFunctionCall","src":"11456:5:54"},{"name":"facet","nativeSrc":"11463:5:54","nodeType":"YulIdentifier","src":"11463:5:54"},{"kind":"number","nativeSrc":"11470:1:54","nodeType":"YulLiteral","src":"11470:1:54","type":"","value":"0"},{"arguments":[],"functionName":{"name":"calldatasize","nativeSrc":"11473:12:54","nodeType":"YulIdentifier","src":"11473:12:54"},"nativeSrc":"11473:14:54","nodeType":"YulFunctionCall","src":"11473:14:54"},{"kind":"number","nativeSrc":"11489:1:54","nodeType":"YulLiteral","src":"11489:1:54","type":"","value":"0"},{"kind":"number","nativeSrc":"11492:1:54","nodeType":"YulLiteral","src":"11492:1:54","type":"","value":"0"}],"functionName":{"name":"delegatecall","nativeSrc":"11443:12:54","nodeType":"YulIdentifier","src":"11443:12:54"},"nativeSrc":"11443:51:54","nodeType":"YulFunctionCall","src":"11443:51:54"},"variables":[{"name":"result","nativeSrc":"11433:6:54","nodeType":"YulTypedName","src":"11433:6:54","type":""}]},{"expression":{"arguments":[{"kind":"number","nativeSrc":"11522:1:54","nodeType":"YulLiteral","src":"11522:1:54","type":"","value":"0"},{"kind":"number","nativeSrc":"11525:1:54","nodeType":"YulLiteral","src":"11525:1:54","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"11528:14:54","nodeType":"YulIdentifier","src":"11528:14:54"},"nativeSrc":"11528:16:54","nodeType":"YulFunctionCall","src":"11528:16:54"}],"functionName":{"name":"returndatacopy","nativeSrc":"11507:14:54","nodeType":"YulIdentifier","src":"11507:14:54"},"nativeSrc":"11507:38:54","nodeType":"YulFunctionCall","src":"11507:38:54"},"nativeSrc":"11507:38:54","nodeType":"YulExpressionStatement","src":"11507:38:54"},{"cases":[{"body":{"nativeSrc":"11591:59:54","nodeType":"YulBlock","src":"11591:59:54","statements":[{"expression":{"arguments":[{"kind":"number","nativeSrc":"11616:1:54","nodeType":"YulLiteral","src":"11616:1:54","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"11619:14:54","nodeType":"YulIdentifier","src":"11619:14:54"},"nativeSrc":"11619:16:54","nodeType":"YulFunctionCall","src":"11619:16:54"}],"functionName":{"name":"revert","nativeSrc":"11609:6:54","nodeType":"YulIdentifier","src":"11609:6:54"},"nativeSrc":"11609:27:54","nodeType":"YulFunctionCall","src":"11609:27:54"},"nativeSrc":"11609:27:54","nodeType":"YulExpressionStatement","src":"11609:27:54"}]},"nativeSrc":"11584:66:54","nodeType":"YulCase","src":"11584:66:54","value":{"kind":"number","nativeSrc":"11589:1:54","nodeType":"YulLiteral","src":"11589:1:54","type":"","value":"0"}},{"body":{"nativeSrc":"11671:59:54","nodeType":"YulBlock","src":"11671:59:54","statements":[{"expression":{"arguments":[{"kind":"number","nativeSrc":"11696:1:54","nodeType":"YulLiteral","src":"11696:1:54","type":"","value":"0"},{"arguments":[],"functionName":{"name":"returndatasize","nativeSrc":"11699:14:54","nodeType":"YulIdentifier","src":"11699:14:54"},"nativeSrc":"11699:16:54","nodeType":"YulFunctionCall","src":"11699:16:54"}],"functionName":{"name":"return","nativeSrc":"11689:6:54","nodeType":"YulIdentifier","src":"11689:6:54"},"nativeSrc":"11689:27:54","nodeType":"YulFunctionCall","src":"11689:27:54"},"nativeSrc":"11689:27:54","nodeType":"YulExpressionStatement","src":"11689:27:54"}]},"nativeSrc":"11663:67:54","nodeType":"YulCase","src":"11663:67:54","value":"default"}],"expression":{"name":"result","nativeSrc":"11565:6:54","nodeType":"YulIdentifier","src":"11565:6:54"},"nativeSrc":"11558:172:54","nodeType":"YulSwitch","src":"11558:172:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":11011,"isOffset":false,"isSlot":false,"src":"11463:5:54","valueSize":1}],"id":11028,"nodeType":"InlineAssembly","src":"11359:381:54"}]},"id":11030,"implemented":true,"kind":"function","modifiers":[],"name":"delegateOnFallback","nameLocation":"11150:18:54","nodeType":"FunctionDefinition","parameters":{"id":11003,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11002,"mutability":"mutable","name":"s","nameLocation":"11184:1:54","nodeType":"VariableDeclaration","scope":11030,"src":"11169:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11001,"nodeType":"UserDefinedTypeName","pathNode":{"id":11000,"name":"Layout","nameLocations":["11169:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"11169:6:54"},"referencedDeclaration":10024,"src":"11169:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"}],"src":"11168:18:54"},"returnParameters":{"id":11004,"nodeType":"ParameterList","parameters":[],"src":"11196:0:54"},"scope":11524,"src":"11141:605:54","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":11247,"nodeType":"Block","src":"11839:2341:54","statements":[{"id":11246,"nodeType":"UncheckedBlock","src":"11849:2325:54","statements":[{"assignments":[11041],"declarations":[{"constant":false,"id":11041,"mutability":"mutable","name":"selectorCount","nameLocation":"11880:13:54","nodeType":"VariableDeclaration","scope":11246,"src":"11873:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":11040,"name":"uint16","nodeType":"ElementaryTypeName","src":"11873:6:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"}],"id":11044,"initialValue":{"expression":{"id":11042,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11033,"src":"11896:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11043,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11898:13:54","memberName":"selectorCount","nodeType":"MemberAccess","referencedDeclaration":10019,"src":"11896:15:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"VariableDeclarationStatement","src":"11873:38:54"},{"expression":{"id":11052,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11045,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"11925:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11050,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11041,"src":"11953:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint16","typeString":"uint16"}],"id":11049,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"11941:11:54","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Facet memory[] memory)"},"typeName":{"baseType":{"id":11047,"nodeType":"UserDefinedTypeName","pathNode":{"id":11046,"name":"Facet","nameLocations":["11945:5:54"],"nodeType":"IdentifierPath","referencedDeclaration":9542,"src":"11945:5:54"},"referencedDeclaration":9542,"src":"11945:5:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_storage_ptr","typeString":"struct Facet"}},"id":11048,"nodeType":"ArrayTypeName","src":"11945:7:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_storage_$dyn_storage_ptr","typeString":"struct Facet[]"}}},"id":11051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11941:26:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"src":"11925:42:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11053,"nodeType":"ExpressionStatement","src":"11925:42:54"},{"assignments":[11058],"declarations":[{"constant":false,"id":11058,"mutability":"mutable","name":"numFacetSelectors","nameLocation":"11999:17:54","nodeType":"VariableDeclaration","scope":11246,"src":"11982:34:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":11056,"name":"uint256","nodeType":"ElementaryTypeName","src":"11982:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11057,"nodeType":"ArrayTypeName","src":"11982:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":11064,"initialValue":{"arguments":[{"id":11062,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11041,"src":"12033:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint16","typeString":"uint16"}],"id":11061,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"12019:13:54","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[] memory)"},"typeName":{"baseType":{"id":11059,"name":"uint256","nodeType":"ElementaryTypeName","src":"12023:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11060,"nodeType":"ArrayTypeName","src":"12023:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"id":11063,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12019:28:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"nodeType":"VariableDeclarationStatement","src":"11982:65:54"},{"assignments":[11066],"declarations":[{"constant":false,"id":11066,"mutability":"mutable","name":"numFacets","nameLocation":"12069:9:54","nodeType":"VariableDeclaration","scope":11246,"src":"12061:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11065,"name":"uint256","nodeType":"ElementaryTypeName","src":"12061:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11067,"nodeType":"VariableDeclarationStatement","src":"12061:17:54"},{"assignments":[11069],"declarations":[{"constant":false,"id":11069,"mutability":"mutable","name":"selectorIndex","nameLocation":"12100:13:54","nodeType":"VariableDeclaration","scope":11246,"src":"12092:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11068,"name":"uint256","nodeType":"ElementaryTypeName","src":"12092:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11070,"nodeType":"VariableDeclarationStatement","src":"12092:21:54"},{"body":{"id":11215,"nodeType":"Block","src":"12243:1398:54","statements":[{"assignments":[11081],"declarations":[{"constant":false,"id":11081,"mutability":"mutable","name":"slot","nameLocation":"12269:4:54","nodeType":"VariableDeclaration","scope":11215,"src":"12261:12:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11080,"name":"bytes32","nodeType":"ElementaryTypeName","src":"12261:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11086,"initialValue":{"baseExpression":{"expression":{"id":11082,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11033,"src":"12276:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11083,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12278:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"12276:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":11085,"indexExpression":{"id":11084,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11072,"src":"12292:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12276:26:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"12261:41:54"},{"body":{"id":11213,"nodeType":"Block","src":"12398:1229:54","statements":[{"expression":{"id":11097,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"12420:15:54","subExpression":{"id":11096,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11069,"src":"12422:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11098,"nodeType":"ExpressionStatement","src":"12420:15:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11099,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11069,"src":"12462:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":11100,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11041,"src":"12478:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"12462:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11104,"nodeType":"IfStatement","src":"12458:89:54","trueBody":{"id":11103,"nodeType":"Block","src":"12493:54:54","statements":[{"id":11102,"nodeType":"Break","src":"12519:5:54"}]}},{"assignments":[11106],"declarations":[{"constant":false,"id":11106,"mutability":"mutable","name":"selector","nameLocation":"12576:8:54","nodeType":"VariableDeclaration","scope":11213,"src":"12569:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11105,"name":"bytes4","nodeType":"ElementaryTypeName","src":"12569:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":11116,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":11114,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11109,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11081,"src":"12594:4:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11110,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11088,"src":"12603:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":11111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12624:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"12603:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11113,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12602:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12594:32:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11108,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12587:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":11107,"name":"bytes4","nodeType":"ElementaryTypeName","src":"12587:6:54","typeDescriptions":{}}},"id":11115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12587:40:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"12569:58:54"},{"assignments":[11118],"declarations":[{"constant":false,"id":11118,"mutability":"mutable","name":"facet","nameLocation":"12657:5:54","nodeType":"VariableDeclaration","scope":11213,"src":"12649:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11117,"name":"address","nodeType":"ElementaryTypeName","src":"12649:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11129,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":11123,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11033,"src":"12681:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11124,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12683:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"12681:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":11126,"indexExpression":{"id":11125,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11106,"src":"12697:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12681:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11122,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12673:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":11121,"name":"bytes20","nodeType":"ElementaryTypeName","src":"12673:7:54","typeDescriptions":{}}},"id":11127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12673:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":11120,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12665:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11119,"name":"address","nodeType":"ElementaryTypeName","src":"12665:7:54","typeDescriptions":{}}},"id":11128,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12665:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12649:59:54"},{"assignments":[11131],"declarations":[{"constant":false,"id":11131,"mutability":"mutable","name":"continueLoop","nameLocation":"12736:12:54","nodeType":"VariableDeclaration","scope":11213,"src":"12731:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11130,"name":"bool","nodeType":"ElementaryTypeName","src":"12731:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":11132,"nodeType":"VariableDeclarationStatement","src":"12731:17:54"},{"body":{"id":11171,"nodeType":"Block","src":"12835:373:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":11142,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"12865:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11144,"indexExpression":{"id":11143,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"12879:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12865:25:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11145,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12891:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9538,"src":"12865:31:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11146,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11118,"src":"12900:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12865:40:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11170,"nodeType":"IfStatement","src":"12861:325:54","trueBody":{"id":11169,"nodeType":"Block","src":"12907:279:54","statements":[{"expression":{"id":11157,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":11148,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"12937:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11150,"indexExpression":{"id":11149,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"12951:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12937:25:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11151,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12963:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9541,"src":"12937:35:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":11155,"indexExpression":{"baseExpression":{"id":11152,"name":"numFacetSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11058,"src":"12973:17:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":11154,"indexExpression":{"id":11153,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"12991:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12973:29:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"12937:66:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11156,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11106,"src":"13006:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"12937:77:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11158,"nodeType":"ExpressionStatement","src":"12937:77:54"},{"expression":{"id":11162,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"13044:31:54","subExpression":{"baseExpression":{"id":11159,"name":"numFacetSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11058,"src":"13046:17:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":11161,"indexExpression":{"id":11160,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"13064:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13046:29:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11163,"nodeType":"ExpressionStatement","src":"13044:31:54"},{"expression":{"id":11166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11164,"name":"continueLoop","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11131,"src":"13105:12:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":11165,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"13120:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"13105:19:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11167,"nodeType":"ExpressionStatement","src":"13105:19:54"},{"id":11168,"nodeType":"Break","src":"13154:5:54"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11136,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"12796:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":11137,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"12810:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12796:23:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11172,"initializationExpression":{"assignments":[11134],"declarations":[{"constant":false,"id":11134,"mutability":"mutable","name":"facetIndex","nameLocation":"12784:10:54","nodeType":"VariableDeclaration","scope":11172,"src":"12776:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11133,"name":"uint256","nodeType":"ElementaryTypeName","src":"12776:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11135,"nodeType":"VariableDeclarationStatement","src":"12776:18:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"12821:12:54","subExpression":{"id":11139,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11134,"src":"12823:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11141,"nodeType":"ExpressionStatement","src":"12821:12:54"},"nodeType":"ForStatement","src":"12771:437:54"},{"condition":{"id":11173,"name":"continueLoop","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11131,"src":"13234:12:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11176,"nodeType":"IfStatement","src":"13230:75:54","trueBody":{"id":11175,"nodeType":"Block","src":"13248:57:54","statements":[{"id":11174,"nodeType":"Continue","src":"13274:8:54"}]}},{"expression":{"id":11182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":11177,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"13327:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11179,"indexExpression":{"id":11178,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13341:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13327:24:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11180,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"13352:5:54","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9538,"src":"13327:30:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11181,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11118,"src":"13360:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13327:38:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11183,"nodeType":"ExpressionStatement","src":"13327:38:54"},{"expression":{"id":11193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":11184,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"13387:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11186,"indexExpression":{"id":11185,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13401:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13387:24:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11187,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"13412:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9541,"src":"13387:34:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11191,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11041,"src":"13437:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint16","typeString":"uint16"}],"id":11190,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"13424:12:54","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes4_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes4[] memory)"},"typeName":{"baseType":{"id":11188,"name":"bytes4","nodeType":"ElementaryTypeName","src":"13428:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11189,"nodeType":"ArrayTypeName","src":"13428:8:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}}},"id":11192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13424:27:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"src":"13387:64:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":11194,"nodeType":"ExpressionStatement","src":"13387:64:54"},{"expression":{"id":11202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":11195,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"13473:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11197,"indexExpression":{"id":11196,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13487:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13473:24:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11198,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13498:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9541,"src":"13473:34:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":11200,"indexExpression":{"hexValue":"30","id":11199,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13508:1:54","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13473:37:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11201,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11106,"src":"13513:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"13473:48:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11203,"nodeType":"ExpressionStatement","src":"13473:48:54"},{"expression":{"id":11208,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11204,"name":"numFacetSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11058,"src":"13543:17:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":11206,"indexExpression":{"id":11205,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13561:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13543:28:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":11207,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13574:1:54","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"13543:32:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11209,"nodeType":"ExpressionStatement","src":"13543:32:54"},{"expression":{"id":11211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"13597:11:54","subExpression":{"id":11210,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13599:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11212,"nodeType":"ExpressionStatement","src":"13597:11:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11092,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11090,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11088,"src":"12353:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"38","id":11091,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12374:1:54","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"12353:22:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11214,"initializationExpression":{"assignments":[11088],"declarations":[{"constant":false,"id":11088,"mutability":"mutable","name":"selectorSlotIndex","nameLocation":"12334:17:54","nodeType":"VariableDeclaration","scope":11214,"src":"12326:25:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11087,"name":"uint256","nodeType":"ElementaryTypeName","src":"12326:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11089,"nodeType":"VariableDeclarationStatement","src":"12326:25:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11094,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"12377:19:54","subExpression":{"id":11093,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11088,"src":"12379:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11095,"nodeType":"ExpressionStatement","src":"12377:19:54"},"nodeType":"ForStatement","src":"12321:1306:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11076,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11074,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11069,"src":"12199:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11075,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11041,"src":"12215:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"12199:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11216,"initializationExpression":{"assignments":[11072],"declarations":[{"constant":false,"id":11072,"mutability":"mutable","name":"slotIndex","nameLocation":"12188:9:54","nodeType":"VariableDeclaration","scope":11216,"src":"12180:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11071,"name":"uint256","nodeType":"ElementaryTypeName","src":"12180:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11073,"nodeType":"VariableDeclarationStatement","src":"12180:17:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"12230:11:54","subExpression":{"id":11077,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11072,"src":"12232:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11079,"nodeType":"ExpressionStatement","src":"12230:11:54"},"nodeType":"ForStatement","src":"12175:1466:54"},{"body":{"id":11243,"nodeType":"Block","src":"13718:315:54","statements":[{"assignments":[11227],"declarations":[{"constant":false,"id":11227,"mutability":"mutable","name":"numSelectors","nameLocation":"13744:12:54","nodeType":"VariableDeclaration","scope":11243,"src":"13736:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11226,"name":"uint256","nodeType":"ElementaryTypeName","src":"13736:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11231,"initialValue":{"baseExpression":{"id":11228,"name":"numFacetSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11058,"src":"13759:17:54","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":11230,"indexExpression":{"id":11229,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"13777:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13759:29:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13736:52:54"},{"assignments":[11236],"declarations":[{"constant":false,"id":11236,"mutability":"mutable","name":"selectors","nameLocation":"13822:9:54","nodeType":"VariableDeclaration","scope":11243,"src":"13806:25:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":11234,"name":"bytes4","nodeType":"ElementaryTypeName","src":"13806:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11235,"nodeType":"ArrayTypeName","src":"13806:8:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"id":11241,"initialValue":{"expression":{"baseExpression":{"id":11237,"name":"diamondFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11038,"src":"13834:13:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet memory[] memory"}},"id":11239,"indexExpression":{"id":11238,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"13848:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13834:25:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_memory_ptr","typeString":"struct Facet memory"}},"id":11240,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13860:9:54","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9541,"src":"13834:35:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"VariableDeclarationStatement","src":"13806:63:54"},{"AST":{"nativeSrc":"13948:71:54","nodeType":"YulBlock","src":"13948:71:54","statements":[{"expression":{"arguments":[{"name":"selectors","nativeSrc":"13977:9:54","nodeType":"YulIdentifier","src":"13977:9:54"},{"name":"numSelectors","nativeSrc":"13988:12:54","nodeType":"YulIdentifier","src":"13988:12:54"}],"functionName":{"name":"mstore","nativeSrc":"13970:6:54","nodeType":"YulIdentifier","src":"13970:6:54"},"nativeSrc":"13970:31:54","nodeType":"YulFunctionCall","src":"13970:31:54"},"nativeSrc":"13970:31:54","nodeType":"YulExpressionStatement","src":"13970:31:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":11227,"isOffset":false,"isSlot":false,"src":"13988:12:54","valueSize":1},{"declaration":11236,"isOffset":false,"isSlot":false,"src":"13977:9:54","valueSize":1}],"id":11242,"nodeType":"InlineAssembly","src":"13939:80:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11220,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"13680:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11221,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11066,"src":"13693:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13680:22:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11244,"initializationExpression":{"assignments":[11218],"declarations":[{"constant":false,"id":11218,"mutability":"mutable","name":"facetIndex","nameLocation":"13668:10:54","nodeType":"VariableDeclaration","scope":11244,"src":"13660:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11217,"name":"uint256","nodeType":"ElementaryTypeName","src":"13660:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11219,"nodeType":"VariableDeclarationStatement","src":"13660:18:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":11224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"13704:12:54","subExpression":{"id":11223,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11218,"src":"13706:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11225,"nodeType":"ExpressionStatement","src":"13704:12:54"},"nodeType":"ForStatement","src":"13655:378:54"},{"AST":{"nativeSrc":"14100:64:54","nodeType":"YulBlock","src":"14100:64:54","statements":[{"expression":{"arguments":[{"name":"diamondFacets","nativeSrc":"14125:13:54","nodeType":"YulIdentifier","src":"14125:13:54"},{"name":"numFacets","nativeSrc":"14140:9:54","nodeType":"YulIdentifier","src":"14140:9:54"}],"functionName":{"name":"mstore","nativeSrc":"14118:6:54","nodeType":"YulIdentifier","src":"14118:6:54"},"nativeSrc":"14118:32:54","nodeType":"YulFunctionCall","src":"14118:32:54"},"nativeSrc":"14118:32:54","nodeType":"YulExpressionStatement","src":"14118:32:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":11038,"isOffset":false,"isSlot":false,"src":"14125:13:54","valueSize":1},{"declaration":11066,"isOffset":false,"isSlot":false,"src":"14140:9:54","valueSize":1}],"id":11245,"nodeType":"InlineAssembly","src":"14091:73:54"}]}]},"id":11248,"implemented":true,"kind":"function","modifiers":[],"name":"facets","nameLocation":"11761:6:54","nodeType":"FunctionDefinition","parameters":{"id":11034,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11033,"mutability":"mutable","name":"s","nameLocation":"11783:1:54","nodeType":"VariableDeclaration","scope":11248,"src":"11768:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11032,"nodeType":"UserDefinedTypeName","pathNode":{"id":11031,"name":"Layout","nameLocations":["11768:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"11768:6:54"},"referencedDeclaration":10024,"src":"11768:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"}],"src":"11767:18:54"},"returnParameters":{"id":11039,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11038,"mutability":"mutable","name":"diamondFacets","nameLocation":"11824:13:54","nodeType":"VariableDeclaration","scope":11248,"src":"11809:28:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_memory_ptr_$dyn_memory_ptr","typeString":"struct Facet[]"},"typeName":{"baseType":{"id":11036,"nodeType":"UserDefinedTypeName","pathNode":{"id":11035,"name":"Facet","nameLocations":["11809:5:54"],"nodeType":"IdentifierPath","referencedDeclaration":9542,"src":"11809:5:54"},"referencedDeclaration":9542,"src":"11809:5:54","typeDescriptions":{"typeIdentifier":"t_struct$_Facet_$9542_storage_ptr","typeString":"struct Facet"}},"id":11037,"nodeType":"ArrayTypeName","src":"11809:7:54","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Facet_$9542_storage_$dyn_storage_ptr","typeString":"struct Facet[]"}},"visibility":"internal"}],"src":"11808:30:54"},"scope":11524,"src":"11752:2428:54","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11353,"nodeType":"Block","src":"14301:1103:54","statements":[{"id":11352,"nodeType":"UncheckedBlock","src":"14311:1087:54","statements":[{"assignments":[11260],"declarations":[{"constant":false,"id":11260,"mutability":"mutable","name":"selectorCount","nameLocation":"14342:13:54","nodeType":"VariableDeclaration","scope":11352,"src":"14335:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":11259,"name":"uint16","nodeType":"ElementaryTypeName","src":"14335:6:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"}],"id":11263,"initialValue":{"expression":{"id":11261,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11251,"src":"14358:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11262,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14360:13:54","memberName":"selectorCount","nodeType":"MemberAccess","referencedDeclaration":10019,"src":"14358:15:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"VariableDeclarationStatement","src":"14335:38:54"},{"expression":{"id":11270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11264,"name":"selectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11257,"src":"14387:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11268,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11260,"src":"14412:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint16","typeString":"uint16"}],"id":11267,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"14399:12:54","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes4_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes4[] memory)"},"typeName":{"baseType":{"id":11265,"name":"bytes4","nodeType":"ElementaryTypeName","src":"14403:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11266,"nodeType":"ArrayTypeName","src":"14403:8:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}}},"id":11269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14399:27:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"src":"14387:39:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":11271,"nodeType":"ExpressionStatement","src":"14387:39:54"},{"assignments":[11273],"declarations":[{"constant":false,"id":11273,"mutability":"mutable","name":"numSelectors","nameLocation":"14449:12:54","nodeType":"VariableDeclaration","scope":11352,"src":"14441:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11272,"name":"uint256","nodeType":"ElementaryTypeName","src":"14441:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11274,"nodeType":"VariableDeclarationStatement","src":"14441:20:54"},{"assignments":[11276],"declarations":[{"constant":false,"id":11276,"mutability":"mutable","name":"selectorIndex","nameLocation":"14483:13:54","nodeType":"VariableDeclaration","scope":11352,"src":"14475:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11275,"name":"uint256","nodeType":"ElementaryTypeName","src":"14475:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11277,"nodeType":"VariableDeclarationStatement","src":"14475:21:54"},{"body":{"id":11349,"nodeType":"Block","src":"14626:620:54","statements":[{"assignments":[11288],"declarations":[{"constant":false,"id":11288,"mutability":"mutable","name":"slot","nameLocation":"14652:4:54","nodeType":"VariableDeclaration","scope":11349,"src":"14644:12:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11287,"name":"bytes32","nodeType":"ElementaryTypeName","src":"14644:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11293,"initialValue":{"baseExpression":{"expression":{"id":11289,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11251,"src":"14659:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11290,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14661:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"14659:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":11292,"indexExpression":{"id":11291,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11279,"src":"14675:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14659:26:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"14644:41:54"},{"body":{"id":11347,"nodeType":"Block","src":"14781:451:54","statements":[{"expression":{"id":11304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"14803:15:54","subExpression":{"id":11303,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11276,"src":"14805:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11305,"nodeType":"ExpressionStatement","src":"14803:15:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11306,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11276,"src":"14845:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":11307,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11260,"src":"14861:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"14845:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11311,"nodeType":"IfStatement","src":"14841:89:54","trueBody":{"id":11310,"nodeType":"Block","src":"14876:54:54","statements":[{"id":11309,"nodeType":"Break","src":"14902:5:54"}]}},{"assignments":[11313],"declarations":[{"constant":false,"id":11313,"mutability":"mutable","name":"selector","nameLocation":"14959:8:54","nodeType":"VariableDeclaration","scope":11347,"src":"14952:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11312,"name":"bytes4","nodeType":"ElementaryTypeName","src":"14952:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":11323,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":11321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11316,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11288,"src":"14977:4:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11319,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11317,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11295,"src":"14986:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":11318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15007:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"14986:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11320,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"14985:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14977:32:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11315,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14970:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":11314,"name":"bytes4","nodeType":"ElementaryTypeName","src":"14970:6:54","typeDescriptions":{}}},"id":11322,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14970:40:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"14952:58:54"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11324,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11253,"src":"15037:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":11329,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11251,"src":"15062:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11330,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15064:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"15062:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":11332,"indexExpression":{"id":11331,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11313,"src":"15078:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15062:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11328,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15054:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":11327,"name":"bytes20","nodeType":"ElementaryTypeName","src":"15054:7:54","typeDescriptions":{}}},"id":11333,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15054:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":11326,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15046:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11325,"name":"address","nodeType":"ElementaryTypeName","src":"15046:7:54","typeDescriptions":{}}},"id":11334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15046:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15037:52:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11346,"nodeType":"IfStatement","src":"15033:181:54","trueBody":{"id":11345,"nodeType":"Block","src":"15091:123:54","statements":[{"expression":{"id":11340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11336,"name":"selectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11257,"src":"15117:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":11338,"indexExpression":{"id":11337,"name":"numSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11273,"src":"15127:12:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"15117:23:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11339,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11313,"src":"15143:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"15117:34:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11341,"nodeType":"ExpressionStatement","src":"15117:34:54"},{"expression":{"id":11343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"15177:14:54","subExpression":{"id":11342,"name":"numSelectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11273,"src":"15179:12:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11344,"nodeType":"ExpressionStatement","src":"15177:14:54"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11297,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11295,"src":"14736:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"38","id":11298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14757:1:54","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"14736:22:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11348,"initializationExpression":{"assignments":[11295],"declarations":[{"constant":false,"id":11295,"mutability":"mutable","name":"selectorSlotIndex","nameLocation":"14717:17:54","nodeType":"VariableDeclaration","scope":11348,"src":"14709:25:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11294,"name":"uint256","nodeType":"ElementaryTypeName","src":"14709:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11296,"nodeType":"VariableDeclarationStatement","src":"14709:25:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"14760:19:54","subExpression":{"id":11300,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11295,"src":"14762:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11302,"nodeType":"ExpressionStatement","src":"14760:19:54"},"nodeType":"ForStatement","src":"14704:528:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11283,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11281,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11276,"src":"14582:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11282,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11260,"src":"14598:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"14582:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11350,"initializationExpression":{"assignments":[11279],"declarations":[{"constant":false,"id":11279,"mutability":"mutable","name":"slotIndex","nameLocation":"14571:9:54","nodeType":"VariableDeclaration","scope":11350,"src":"14563:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11278,"name":"uint256","nodeType":"ElementaryTypeName","src":"14563:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11280,"nodeType":"VariableDeclarationStatement","src":"14563:17:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"14613:11:54","subExpression":{"id":11284,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11279,"src":"14615:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11286,"nodeType":"ExpressionStatement","src":"14613:11:54"},"nodeType":"ForStatement","src":"14558:688:54"},{"AST":{"nativeSrc":"15325:63:54","nodeType":"YulBlock","src":"15325:63:54","statements":[{"expression":{"arguments":[{"name":"selectors","nativeSrc":"15350:9:54","nodeType":"YulIdentifier","src":"15350:9:54"},{"name":"numSelectors","nativeSrc":"15361:12:54","nodeType":"YulIdentifier","src":"15361:12:54"}],"functionName":{"name":"mstore","nativeSrc":"15343:6:54","nodeType":"YulIdentifier","src":"15343:6:54"},"nativeSrc":"15343:31:54","nodeType":"YulFunctionCall","src":"15343:31:54"},"nativeSrc":"15343:31:54","nodeType":"YulExpressionStatement","src":"15343:31:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":11273,"isOffset":false,"isSlot":false,"src":"15361:12:54","valueSize":1},{"declaration":11257,"isOffset":false,"isSlot":false,"src":"15350:9:54","valueSize":1}],"id":11351,"nodeType":"InlineAssembly","src":"15316:72:54"}]}]},"id":11354,"implemented":true,"kind":"function","modifiers":[],"name":"facetFunctionSelectors","nameLocation":"14195:22:54","nodeType":"FunctionDefinition","parameters":{"id":11254,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11251,"mutability":"mutable","name":"s","nameLocation":"14233:1:54","nodeType":"VariableDeclaration","scope":11354,"src":"14218:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11250,"nodeType":"UserDefinedTypeName","pathNode":{"id":11249,"name":"Layout","nameLocations":["14218:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"14218:6:54"},"referencedDeclaration":10024,"src":"14218:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":11253,"mutability":"mutable","name":"facet","nameLocation":"14244:5:54","nodeType":"VariableDeclaration","scope":11354,"src":"14236:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11252,"name":"address","nodeType":"ElementaryTypeName","src":"14236:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14217:33:54"},"returnParameters":{"id":11258,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11257,"mutability":"mutable","name":"selectors","nameLocation":"14290:9:54","nodeType":"VariableDeclaration","scope":11354,"src":"14274:25:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":11255,"name":"bytes4","nodeType":"ElementaryTypeName","src":"14274:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":11256,"nodeType":"ArrayTypeName","src":"14274:8:54","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"src":"14273:27:54"},"scope":11524,"src":"14186:1218:54","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11486,"nodeType":"Block","src":"15503:1435:54","statements":[{"id":11485,"nodeType":"UncheckedBlock","src":"15513:1419:54","statements":[{"assignments":[11364],"declarations":[{"constant":false,"id":11364,"mutability":"mutable","name":"selectorCount","nameLocation":"15544:13:54","nodeType":"VariableDeclaration","scope":11485,"src":"15537:20:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":11363,"name":"uint16","nodeType":"ElementaryTypeName","src":"15537:6:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"}],"id":11367,"initialValue":{"expression":{"id":11365,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11357,"src":"15560:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11366,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15562:13:54","memberName":"selectorCount","nodeType":"MemberAccess","referencedDeclaration":10019,"src":"15560:15:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"nodeType":"VariableDeclarationStatement","src":"15537:38:54"},{"expression":{"id":11374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11368,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11361,"src":"15589:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":11372,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11364,"src":"15615:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint16","typeString":"uint16"}],"id":11371,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"15601:13:54","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (address[] memory)"},"typeName":{"baseType":{"id":11369,"name":"address","nodeType":"ElementaryTypeName","src":"15605:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11370,"nodeType":"ArrayTypeName","src":"15605:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}}},"id":11373,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15601:28:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"src":"15589:40:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":11375,"nodeType":"ExpressionStatement","src":"15589:40:54"},{"assignments":[11377],"declarations":[{"constant":false,"id":11377,"mutability":"mutable","name":"numFacets","nameLocation":"15651:9:54","nodeType":"VariableDeclaration","scope":11485,"src":"15643:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11376,"name":"uint256","nodeType":"ElementaryTypeName","src":"15643:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11378,"nodeType":"VariableDeclarationStatement","src":"15643:17:54"},{"assignments":[11380],"declarations":[{"constant":false,"id":11380,"mutability":"mutable","name":"selectorIndex","nameLocation":"15682:13:54","nodeType":"VariableDeclaration","scope":11485,"src":"15674:21:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11379,"name":"uint256","nodeType":"ElementaryTypeName","src":"15674:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11381,"nodeType":"VariableDeclarationStatement","src":"15674:21:54"},{"body":{"id":11482,"nodeType":"Block","src":"15778:999:54","statements":[{"assignments":[11392],"declarations":[{"constant":false,"id":11392,"mutability":"mutable","name":"slot","nameLocation":"15804:4:54","nodeType":"VariableDeclaration","scope":11482,"src":"15796:12:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11391,"name":"bytes32","nodeType":"ElementaryTypeName","src":"15796:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11397,"initialValue":{"baseExpression":{"expression":{"id":11393,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11357,"src":"15811:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11394,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15813:13:54","memberName":"selectorSlots","nodeType":"MemberAccess","referencedDeclaration":10023,"src":"15811:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bytes32_$","typeString":"mapping(uint256 => bytes32)"}},"id":11396,"indexExpression":{"id":11395,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11383,"src":"15827:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15811:26:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"15796:41:54"},{"body":{"id":11480,"nodeType":"Block","src":"15933:830:54","statements":[{"expression":{"id":11408,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"15955:15:54","subExpression":{"id":11407,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11380,"src":"15957:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11409,"nodeType":"ExpressionStatement","src":"15955:15:54"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11410,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11380,"src":"15997:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":11411,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11364,"src":"16013:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"15997:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11415,"nodeType":"IfStatement","src":"15993:89:54","trueBody":{"id":11414,"nodeType":"Block","src":"16028:54:54","statements":[{"id":11413,"nodeType":"Break","src":"16054:5:54"}]}},{"assignments":[11417],"declarations":[{"constant":false,"id":11417,"mutability":"mutable","name":"selector","nameLocation":"16111:8:54","nodeType":"VariableDeclaration","scope":11480,"src":"16104:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11416,"name":"bytes4","nodeType":"ElementaryTypeName","src":"16104:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"id":11427,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":11425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11420,"name":"slot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11392,"src":"16129:4:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11421,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11399,"src":"16138:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"35","id":11422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16159:1:54","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"16138:22:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":11424,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"16137:24:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16129:32:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11419,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16122:6:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes4_$","typeString":"type(bytes4)"},"typeName":{"id":11418,"name":"bytes4","nodeType":"ElementaryTypeName","src":"16122:6:54","typeDescriptions":{}}},"id":11426,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16122:40:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"VariableDeclarationStatement","src":"16104:58:54"},{"assignments":[11429],"declarations":[{"constant":false,"id":11429,"mutability":"mutable","name":"facet","nameLocation":"16192:5:54","nodeType":"VariableDeclaration","scope":11480,"src":"16184:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11428,"name":"address","nodeType":"ElementaryTypeName","src":"16184:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":11440,"initialValue":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":11434,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11357,"src":"16216:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11435,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16218:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"16216:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":11437,"indexExpression":{"id":11436,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11417,"src":"16232:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16216:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16208:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":11432,"name":"bytes20","nodeType":"ElementaryTypeName","src":"16208:7:54","typeDescriptions":{}}},"id":11438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16208:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":11431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16200:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11430,"name":"address","nodeType":"ElementaryTypeName","src":"16200:7:54","typeDescriptions":{}}},"id":11439,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16200:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"16184:59:54"},{"assignments":[11442],"declarations":[{"constant":false,"id":11442,"mutability":"mutable","name":"continueLoop","nameLocation":"16271:12:54","nodeType":"VariableDeclaration","scope":11480,"src":"16266:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11441,"name":"bool","nodeType":"ElementaryTypeName","src":"16266:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":11443,"nodeType":"VariableDeclarationStatement","src":"16266:17:54"},{"body":{"id":11465,"nodeType":"Block","src":"16369:195:54","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":11457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11453,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11429,"src":"16399:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"baseExpression":{"id":11454,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11361,"src":"16408:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":11456,"indexExpression":{"id":11455,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11445,"src":"16418:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16408:21:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16399:30:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11464,"nodeType":"IfStatement","src":"16395:147:54","trueBody":{"id":11463,"nodeType":"Block","src":"16431:111:54","statements":[{"expression":{"id":11460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11458,"name":"continueLoop","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11442,"src":"16461:12:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":11459,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"16476:4:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"16461:19:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11461,"nodeType":"ExpressionStatement","src":"16461:19:54"},{"id":11462,"nodeType":"Break","src":"16510:5:54"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11447,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11445,"src":"16331:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11448,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11377,"src":"16344:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16331:22:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11466,"initializationExpression":{"assignments":[11445],"declarations":[{"constant":false,"id":11445,"mutability":"mutable","name":"facetIndex","nameLocation":"16319:10:54","nodeType":"VariableDeclaration","scope":11466,"src":"16311:18:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11444,"name":"uint256","nodeType":"ElementaryTypeName","src":"16311:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11446,"nodeType":"VariableDeclarationStatement","src":"16311:18:54"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":11451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"16355:12:54","subExpression":{"id":11450,"name":"facetIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11445,"src":"16357:10:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11452,"nodeType":"ExpressionStatement","src":"16355:12:54"},"nodeType":"ForStatement","src":"16306:258:54"},{"condition":{"id":11467,"name":"continueLoop","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11442,"src":"16590:12:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11470,"nodeType":"IfStatement","src":"16586:75:54","trueBody":{"id":11469,"nodeType":"Block","src":"16604:57:54","statements":[{"id":11468,"nodeType":"Continue","src":"16630:8:54"}]}},{"expression":{"id":11475,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":11471,"name":"addresses","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11361,"src":"16683:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":11473,"indexExpression":{"id":11472,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11377,"src":"16693:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"16683:20:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11474,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11429,"src":"16706:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16683:28:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11476,"nodeType":"ExpressionStatement","src":"16683:28:54"},{"expression":{"id":11478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"16733:11:54","subExpression":{"id":11477,"name":"numFacets","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11377,"src":"16735:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11479,"nodeType":"ExpressionStatement","src":"16733:11:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11401,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11399,"src":"15888:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"38","id":11402,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15909:1:54","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"15888:22:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11481,"initializationExpression":{"assignments":[11399],"declarations":[{"constant":false,"id":11399,"mutability":"mutable","name":"selectorSlotIndex","nameLocation":"15869:17:54","nodeType":"VariableDeclaration","scope":11481,"src":"15861:25:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11398,"name":"uint256","nodeType":"ElementaryTypeName","src":"15861:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11400,"nodeType":"VariableDeclarationStatement","src":"15861:25:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"15912:19:54","subExpression":{"id":11404,"name":"selectorSlotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11399,"src":"15914:17:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11406,"nodeType":"ExpressionStatement","src":"15912:19:54"},"nodeType":"ForStatement","src":"15856:907:54"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11385,"name":"selectorIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11380,"src":"15734:13:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":11386,"name":"selectorCount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11364,"src":"15750:13:54","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"src":"15734:29:54","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11483,"initializationExpression":{"assignments":[11383],"declarations":[{"constant":false,"id":11383,"mutability":"mutable","name":"slotIndex","nameLocation":"15723:9:54","nodeType":"VariableDeclaration","scope":11483,"src":"15715:17:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11382,"name":"uint256","nodeType":"ElementaryTypeName","src":"15715:7:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":11384,"nodeType":"VariableDeclarationStatement","src":"15715:17:54"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":11389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"15765:11:54","subExpression":{"id":11388,"name":"slotIndex","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11383,"src":"15767:9:54","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11390,"nodeType":"ExpressionStatement","src":"15765:11:54"},"nodeType":"ForStatement","src":"15710:1067:54"},{"AST":{"nativeSrc":"16862:60:54","nodeType":"YulBlock","src":"16862:60:54","statements":[{"expression":{"arguments":[{"name":"addresses","nativeSrc":"16887:9:54","nodeType":"YulIdentifier","src":"16887:9:54"},{"name":"numFacets","nativeSrc":"16898:9:54","nodeType":"YulIdentifier","src":"16898:9:54"}],"functionName":{"name":"mstore","nativeSrc":"16880:6:54","nodeType":"YulIdentifier","src":"16880:6:54"},"nativeSrc":"16880:28:54","nodeType":"YulFunctionCall","src":"16880:28:54"},"nativeSrc":"16880:28:54","nodeType":"YulExpressionStatement","src":"16880:28:54"}]},"evmVersion":"paris","externalReferences":[{"declaration":11361,"isOffset":false,"isSlot":false,"src":"16887:9:54","valueSize":1},{"declaration":11377,"isOffset":false,"isSlot":false,"src":"16898:9:54","valueSize":1}],"id":11484,"nodeType":"InlineAssembly","src":"16853:69:54"}]}]},"id":11487,"implemented":true,"kind":"function","modifiers":[],"name":"facetAddresses","nameLocation":"15419:14:54","nodeType":"FunctionDefinition","parameters":{"id":11358,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11357,"mutability":"mutable","name":"s","nameLocation":"15449:1:54","nodeType":"VariableDeclaration","scope":11487,"src":"15434:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11356,"nodeType":"UserDefinedTypeName","pathNode":{"id":11355,"name":"Layout","nameLocations":["15434:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"15434:6:54"},"referencedDeclaration":10024,"src":"15434:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"}],"src":"15433:18:54"},"returnParameters":{"id":11362,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11361,"mutability":"mutable","name":"addresses","nameLocation":"15492:9:54","nodeType":"VariableDeclaration","scope":11487,"src":"15475:26:54","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":11359,"name":"address","nodeType":"ElementaryTypeName","src":"15475:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11360,"nodeType":"ArrayTypeName","src":"15475:9:54","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"15474:28:54"},"scope":11524,"src":"15410:1528:54","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11510,"nodeType":"Block","src":"17039:68:54","statements":[{"expression":{"id":11508,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":11497,"name":"facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11495,"src":"17049:5:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"baseExpression":{"expression":{"id":11502,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11490,"src":"17073:1:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":11503,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17075:13:54","memberName":"diamondFacets","nodeType":"MemberAccess","referencedDeclaration":10017,"src":"17073:15:54","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bytes32_$","typeString":"mapping(bytes4 => bytes32)"}},"id":11505,"indexExpression":{"id":11504,"name":"selector","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11492,"src":"17089:8:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17073:25:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17065:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes20_$","typeString":"type(bytes20)"},"typeName":{"id":11500,"name":"bytes20","nodeType":"ElementaryTypeName","src":"17065:7:54","typeDescriptions":{}}},"id":11506,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17065:34:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes20","typeString":"bytes20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes20","typeString":"bytes20"}],"id":11499,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"17057:7:54","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":11498,"name":"address","nodeType":"ElementaryTypeName","src":"17057:7:54","typeDescriptions":{}}},"id":11507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17057:43:54","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"17049:51:54","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":11509,"nodeType":"ExpressionStatement","src":"17049:51:54"}]},"id":11511,"implemented":true,"kind":"function","modifiers":[],"name":"facetAddress","nameLocation":"16953:12:54","nodeType":"FunctionDefinition","parameters":{"id":11493,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11490,"mutability":"mutable","name":"s","nameLocation":"16981:1:54","nodeType":"VariableDeclaration","scope":11511,"src":"16966:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11489,"nodeType":"UserDefinedTypeName","pathNode":{"id":11488,"name":"Layout","nameLocations":["16966:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"16966:6:54"},"referencedDeclaration":10024,"src":"16966:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":11492,"mutability":"mutable","name":"selector","nameLocation":"16991:8:54","nodeType":"VariableDeclaration","scope":11511,"src":"16984:15:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11491,"name":"bytes4","nodeType":"ElementaryTypeName","src":"16984:6:54","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"16965:35:54"},"returnParameters":{"id":11496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11495,"mutability":"mutable","name":"facet","nameLocation":"17032:5:54","nodeType":"VariableDeclaration","scope":11511,"src":"17024:13:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11494,"name":"address","nodeType":"ElementaryTypeName","src":"17024:7:54","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"17023:15:54"},"scope":11524,"src":"16944:163:54","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11522,"nodeType":"Block","src":"17172:115:54","statements":[{"assignments":[11518],"declarations":[{"constant":false,"id":11518,"mutability":"mutable","name":"position","nameLocation":"17190:8:54","nodeType":"VariableDeclaration","scope":11522,"src":"17182:16:54","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11517,"name":"bytes32","nodeType":"ElementaryTypeName","src":"17182:7:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11520,"initialValue":{"id":11519,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":10037,"src":"17201:19:54","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"17182:38:54"},{"AST":{"nativeSrc":"17239:42:54","nodeType":"YulBlock","src":"17239:42:54","statements":[{"nativeSrc":"17253:18:54","nodeType":"YulAssignment","src":"17253:18:54","value":{"name":"position","nativeSrc":"17263:8:54","nodeType":"YulIdentifier","src":"17263:8:54"},"variableNames":[{"name":"s.slot","nativeSrc":"17253:6:54","nodeType":"YulIdentifier","src":"17253:6:54"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":11518,"isOffset":false,"isSlot":false,"src":"17263:8:54","valueSize":1},{"declaration":11515,"isOffset":false,"isSlot":true,"src":"17253:6:54","suffix":"slot","valueSize":1}],"id":11521,"nodeType":"InlineAssembly","src":"17230:51:54"}]},"id":11523,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"17122:6:54","nodeType":"FunctionDefinition","parameters":{"id":11512,"nodeType":"ParameterList","parameters":[],"src":"17128:2:54"},"returnParameters":{"id":11516,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11515,"mutability":"mutable","name":"s","nameLocation":"17169:1:54","nodeType":"VariableDeclaration","scope":11523,"src":"17154:16:54","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"},"typeName":{"id":11514,"nodeType":"UserDefinedTypeName","pathNode":{"id":11513,"name":"Layout","nameLocations":["17154:6:54"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"17154:6:54"},"referencedDeclaration":10024,"src":"17154:6:54","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}},"visibility":"internal"}],"src":"17153:18:54"},"scope":11524,"src":"17113:174:54","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":11525,"src":"1164:16125:54","usedErrors":[],"usedEvents":[]}],"src":"32:17258:54"},"id":54},"contracts/introspection/InterfaceDetection.sol":{"ast":{"absolutePath":"contracts/introspection/InterfaceDetection.sol","exportedSymbols":{"IERC165":[11579],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":11555,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11526,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:55"},{"absolutePath":"contracts/introspection/interfaces/IERC165.sol","file":"./interfaces/IERC165.sol","id":11528,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11555,"sourceUnit":11580,"src":"58:49:55","symbolAliases":[{"foreign":{"id":11527,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11579,"src":"66:7:55","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./libraries/InterfaceDetectionStorage.sol","id":11530,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11555,"sourceUnit":11681,"src":"108:84:55","symbolAliases":[{"foreign":{"id":11529,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"116:25:55","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":11532,"name":"IERC165","nameLocations":["425:7:55"],"nodeType":"IdentifierPath","referencedDeclaration":11579,"src":"425:7:55"},"id":11533,"nodeType":"InheritanceSpecifier","src":"425:7:55"}],"canonicalName":"InterfaceDetection","contractDependencies":[],"contractKind":"contract","documentation":{"id":11531,"nodeType":"StructuredDocumentation","src":"194:191:55","text":"@title ERC165 Interface Detection Standard (immutable or proxiable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation."},"fullyImplemented":true,"id":11554,"linearizedBaseContracts":[11554,11579],"name":"InterfaceDetection","nameLocation":"403:18:55","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11537,"libraryName":{"id":11534,"name":"InterfaceDetectionStorage","nameLocations":["445:25:55"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"445:25:55"},"nodeType":"UsingForDirective","src":"439:69:55","typeName":{"id":11536,"nodeType":"UserDefinedTypeName","pathNode":{"id":11535,"name":"InterfaceDetectionStorage.Layout","nameLocations":["475:25:55","501:6:55"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"475:32:55"},"referencedDeclaration":11590,"src":"475:32:55","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"baseFunctions":[11578],"body":{"id":11552,"nodeType":"Block","src":"618:89:55","statements":[{"expression":{"arguments":[{"id":11549,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11540,"src":"688:11:55","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11545,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"635:25:55","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":11546,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"661:6:55","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"635:32:55","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":11547,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"635:34:55","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":11548,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"670:17:55","memberName":"supportsInterface","nodeType":"MemberAccess","referencedDeclaration":11667,"src":"635:52:55","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$returns$_t_bool_$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4) view returns (bool)"}},"id":11550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"635:65:55","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":11544,"id":11551,"nodeType":"Return","src":"628:72:55"}]},"documentation":{"id":11538,"nodeType":"StructuredDocumentation","src":"514:23:55","text":"@inheritdoc IERC165"},"functionSelector":"01ffc9a7","id":11553,"implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"551:17:55","nodeType":"FunctionDefinition","parameters":{"id":11541,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11540,"mutability":"mutable","name":"interfaceId","nameLocation":"576:11:55","nodeType":"VariableDeclaration","scope":11553,"src":"569:18:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11539,"name":"bytes4","nodeType":"ElementaryTypeName","src":"569:6:55","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"568:20:55"},"returnParameters":{"id":11544,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11543,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11553,"src":"612:4:55","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11542,"name":"bool","nodeType":"ElementaryTypeName","src":"612:4:55","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"611:6:55"},"scope":11554,"src":"542:165:55","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":11555,"src":"385:324:55","usedErrors":[],"usedEvents":[]}],"src":"32:678:55"},"id":55},"contracts/introspection/errors/InterfaceDetectionErrors.sol":{"ast":{"absolutePath":"contracts/introspection/errors/InterfaceDetectionErrors.sol","exportedSymbols":{"IllegalInterfaceId":[11559]},"id":11560,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11556,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:56"},{"documentation":{"id":11557,"nodeType":"StructuredDocumentation","src":"58:68:56","text":"@notice Thrown when setting the illegal interfaceId 0xffffffff."},"errorSelector":"72c683bb","id":11559,"name":"IllegalInterfaceId","nameLocation":"132:18:56","nodeType":"ErrorDefinition","parameters":{"id":11558,"nodeType":"ParameterList","parameters":[],"src":"150:2:56"},"src":"126:27:56"}],"src":"32:122:56"},"id":56},"contracts/introspection/facets/InterfaceDetectionFacet.sol":{"ast":{"absolutePath":"contracts/introspection/facets/InterfaceDetectionFacet.sol","exportedSymbols":{"InterfaceDetection":[11554],"InterfaceDetectionFacet":[11567]},"id":11568,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11561,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:57"},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../InterfaceDetection.sol","id":11563,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11568,"sourceUnit":11555,"src":"57:63:57","symbolAliases":[{"foreign":{"id":11562,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"65:18:57","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":11565,"name":"InterfaceDetection","nameLocations":["350:18:57"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"350:18:57"},"id":11566,"nodeType":"InheritanceSpecifier","src":"350:18:57"}],"canonicalName":"InterfaceDetectionFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":11564,"nodeType":"StructuredDocumentation","src":"122:192:57","text":"@title ERC165 Interface Detection Standard (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535)."},"fullyImplemented":true,"id":11567,"linearizedBaseContracts":[11567,11554,11579],"name":"InterfaceDetectionFacet","nameLocation":"323:23:57","nodeType":"ContractDefinition","nodes":[],"scope":11568,"src":"314:57:57","usedErrors":[],"usedEvents":[]}],"src":"32:340:57"},"id":57},"contracts/introspection/interfaces/IERC165.sol":{"ast":{"absolutePath":"contracts/introspection/interfaces/IERC165.sol","exportedSymbols":{"IERC165":[11579]},"id":11580,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11569,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:58"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC165","contractDependencies":[],"contractKind":"interface","documentation":{"id":11570,"nodeType":"StructuredDocumentation","src":"58:173:58","text":"@title ERC165 Interface Detection Standard.\n @dev See https://eips.ethereum.org/EIPS/eip-165.\n @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7."},"fullyImplemented":false,"id":11579,"linearizedBaseContracts":[11579],"name":"IERC165","nameLocation":"241:7:58","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":11571,"nodeType":"StructuredDocumentation","src":"255:340:58","text":"@notice Returns whether this contract implements a given interface.\n @dev Note: This function call must use less than 30 000 gas.\n @param interfaceId the interface identifier to test.\n @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."},"functionSelector":"01ffc9a7","id":11578,"implemented":false,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"609:17:58","nodeType":"FunctionDefinition","parameters":{"id":11574,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11573,"mutability":"mutable","name":"interfaceId","nameLocation":"634:11:58","nodeType":"VariableDeclaration","scope":11578,"src":"627:18:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11572,"name":"bytes4","nodeType":"ElementaryTypeName","src":"627:6:58","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"626:20:58"},"returnParameters":{"id":11577,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11576,"mutability":"mutable","name":"supported","nameLocation":"675:9:58","nodeType":"VariableDeclaration","scope":11578,"src":"670:14:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11575,"name":"bool","nodeType":"ElementaryTypeName","src":"670:4:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"669:16:58"},"scope":11579,"src":"600:86:58","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":11580,"src":"231:457:58","usedErrors":[],"usedEvents":[]}],"src":"32:657:58"},"id":58},"contracts/introspection/libraries/InterfaceDetectionStorage.sol":{"ast":{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","exportedSymbols":{"IERC165":[11579],"IllegalInterfaceId":[11559],"InterfaceDetectionStorage":[11680]},"id":11681,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11581,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:59"},{"absolutePath":"contracts/introspection/errors/InterfaceDetectionErrors.sol","file":"./../errors/InterfaceDetectionErrors.sol","id":11583,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11681,"sourceUnit":11560,"src":"58:76:59","symbolAliases":[{"foreign":{"id":11582,"name":"IllegalInterfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11559,"src":"66:18:59","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/interfaces/IERC165.sol","file":"./../interfaces/IERC165.sol","id":11585,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11681,"sourceUnit":11580,"src":"135:52:59","symbolAliases":[{"foreign":{"id":11584,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11579,"src":"143:7:59","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"InterfaceDetectionStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":11680,"linearizedBaseContracts":[11680],"name":"InterfaceDetectionStorage","nameLocation":"197:25:59","nodeType":"ContractDefinition","nodes":[{"canonicalName":"InterfaceDetectionStorage.Layout","id":11590,"members":[{"constant":false,"id":11589,"mutability":"mutable","name":"supportedInterfaces","nameLocation":"277:19:59","nodeType":"VariableDeclaration","scope":11590,"src":"253:43:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bool_$","typeString":"mapping(bytes4 => bool)"},"typeName":{"id":11588,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":11586,"name":"bytes4","nodeType":"ElementaryTypeName","src":"261:6:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Mapping","src":"253:23:59","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bool_$","typeString":"mapping(bytes4 => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":11587,"name":"bool","nodeType":"ElementaryTypeName","src":"271:4:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"internal"}],"name":"Layout","nameLocation":"236:6:59","nodeType":"StructDefinition","scope":11680,"src":"229:74:59","visibility":"public"},{"constant":true,"id":11603,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"335:19:59","nodeType":"VariableDeclaration","scope":11680,"src":"309:136:59","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11591,"name":"bytes32","nodeType":"ElementaryTypeName","src":"309:7:59","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":11601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e696e74726f7370656374696f6e2e496e74657266616365446574656374696f6e2e73746f72616765","id":11597,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"383:55:59","typeDescriptions":{"typeIdentifier":"t_stringliteral_ca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5e","typeString":"literal_string \"animoca.core.introspection.InterfaceDetection.storage\""},"value":"animoca.core.introspection.InterfaceDetection.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_ca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5e","typeString":"literal_string \"animoca.core.introspection.InterfaceDetection.storage\""}],"id":11596,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"373:9:59","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":11598,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"373:66:59","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":11595,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"365:7:59","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":11594,"name":"uint256","nodeType":"ElementaryTypeName","src":"365:7:59","typeDescriptions":{}}},"id":11599,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"365:75:59","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":11600,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"443:1:59","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"365:79:59","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":11593,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"357:7:59","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":11592,"name":"bytes32","nodeType":"ElementaryTypeName","src":"357:7:59","typeDescriptions":{}}},"id":11602,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"357:88:59","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":11606,"mutability":"constant","name":"ILLEGAL_INTERFACE_ID","nameLocation":"477:20:59","nodeType":"VariableDeclaration","scope":11680,"src":"452:58:59","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11604,"name":"bytes4","nodeType":"ElementaryTypeName","src":"452:6:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"hexValue":"30786666666666666666","id":11605,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"500:10:59","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"visibility":"internal"},{"body":{"id":11632,"nodeType":"Block","src":"867:141:59","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":11619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11617,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11612,"src":"881:11:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11618,"name":"ILLEGAL_INTERFACE_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11606,"src":"896:20:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"881:35:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11623,"nodeType":"IfStatement","src":"877:68:59","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":11620,"name":"IllegalInterfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11559,"src":"925:18:59","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":11621,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"925:20:59","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":11622,"nodeType":"RevertStatement","src":"918:27:59"}},{"expression":{"id":11630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":11624,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11610,"src":"955:1:59","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":11627,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"957:19:59","memberName":"supportedInterfaces","nodeType":"MemberAccess","referencedDeclaration":11589,"src":"955:21:59","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bool_$","typeString":"mapping(bytes4 => bool)"}},"id":11628,"indexExpression":{"id":11626,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11612,"src":"977:11:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"955:34:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":11629,"name":"supported","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11614,"src":"992:9:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"955:46:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11631,"nodeType":"ExpressionStatement","src":"955:46:59"}]},"documentation":{"id":11607,"nodeType":"StructuredDocumentation","src":"517:251:59","text":"@notice Sets or unsets an ERC165 interface.\n @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\n @param interfaceId the interface identifier.\n @param supported True to set the interface, false to unset it."},"id":11633,"implemented":true,"kind":"function","modifiers":[],"name":"setSupportedInterface","nameLocation":"782:21:59","nodeType":"FunctionDefinition","parameters":{"id":11615,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11610,"mutability":"mutable","name":"s","nameLocation":"819:1:59","nodeType":"VariableDeclaration","scope":11633,"src":"804:16:59","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"},"typeName":{"id":11609,"nodeType":"UserDefinedTypeName","pathNode":{"id":11608,"name":"Layout","nameLocations":["804:6:59"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"804:6:59"},"referencedDeclaration":11590,"src":"804:6:59","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":11612,"mutability":"mutable","name":"interfaceId","nameLocation":"829:11:59","nodeType":"VariableDeclaration","scope":11633,"src":"822:18:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11611,"name":"bytes4","nodeType":"ElementaryTypeName","src":"822:6:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"constant":false,"id":11614,"mutability":"mutable","name":"supported","nameLocation":"847:9:59","nodeType":"VariableDeclaration","scope":11633,"src":"842:14:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11613,"name":"bool","nodeType":"ElementaryTypeName","src":"842:4:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"803:54:59"},"returnParameters":{"id":11616,"nodeType":"ParameterList","parameters":[],"src":"867:0:59"},"scope":11680,"src":"773:235:59","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":11666,"nodeType":"Block","src":"1463:236:59","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":11646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11644,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11639,"src":"1477:11:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":11645,"name":"ILLEGAL_INTERFACE_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11606,"src":"1492:20:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1477:35:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11650,"nodeType":"IfStatement","src":"1473:78:59","trueBody":{"id":11649,"nodeType":"Block","src":"1514:37:59","statements":[{"expression":{"hexValue":"66616c7365","id":11647,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1535:5:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":11643,"id":11648,"nodeType":"Return","src":"1528:12:59"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":11656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":11651,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11639,"src":"1564:11:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"arguments":[{"id":11653,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11579,"src":"1584:7:59","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$11579_$","typeString":"type(contract IERC165)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC165_$11579_$","typeString":"type(contract IERC165)"}],"id":11652,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1579:4:59","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":11654,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1579:13:59","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC165_$11579","typeString":"type(contract IERC165)"}},"id":11655,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1593:11:59","memberName":"interfaceId","nodeType":"MemberAccess","src":"1579:25:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"1564:40:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":11660,"nodeType":"IfStatement","src":"1560:82:59","trueBody":{"id":11659,"nodeType":"Block","src":"1606:36:59","statements":[{"expression":{"hexValue":"74727565","id":11657,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1627:4:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":11643,"id":11658,"nodeType":"Return","src":"1620:11:59"}]}},{"expression":{"baseExpression":{"expression":{"id":11661,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11637,"src":"1658:1:59","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":11662,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1660:19:59","memberName":"supportedInterfaces","nodeType":"MemberAccess","referencedDeclaration":11589,"src":"1658:21:59","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes4_$_t_bool_$","typeString":"mapping(bytes4 => bool)"}},"id":11664,"indexExpression":{"id":11663,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11639,"src":"1680:11:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1658:34:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":11643,"id":11665,"nodeType":"Return","src":"1651:41:59"}]},"documentation":{"id":11634,"nodeType":"StructuredDocumentation","src":"1014:340:59","text":"@notice Returns whether this contract implements a given interface.\n @dev Note: This function call must use less than 30 000 gas.\n @param interfaceId The interface identifier to test.\n @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."},"id":11667,"implemented":true,"kind":"function","modifiers":[],"name":"supportsInterface","nameLocation":"1368:17:59","nodeType":"FunctionDefinition","parameters":{"id":11640,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11637,"mutability":"mutable","name":"s","nameLocation":"1401:1:59","nodeType":"VariableDeclaration","scope":11667,"src":"1386:16:59","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"},"typeName":{"id":11636,"nodeType":"UserDefinedTypeName","pathNode":{"id":11635,"name":"Layout","nameLocations":["1386:6:59"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1386:6:59"},"referencedDeclaration":11590,"src":"1386:6:59","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":11639,"mutability":"mutable","name":"interfaceId","nameLocation":"1411:11:59","nodeType":"VariableDeclaration","scope":11667,"src":"1404:18:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":11638,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1404:6:59","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1385:38:59"},"returnParameters":{"id":11643,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11642,"mutability":"mutable","name":"supported","nameLocation":"1452:9:59","nodeType":"VariableDeclaration","scope":11667,"src":"1447:14:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11641,"name":"bool","nodeType":"ElementaryTypeName","src":"1447:4:59","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1446:16:59"},"scope":11680,"src":"1359:340:59","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":11678,"nodeType":"Block","src":"1764:115:59","statements":[{"assignments":[11674],"declarations":[{"constant":false,"id":11674,"mutability":"mutable","name":"position","nameLocation":"1782:8:59","nodeType":"VariableDeclaration","scope":11678,"src":"1774:16:59","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11673,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1774:7:59","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":11676,"initialValue":{"id":11675,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11603,"src":"1793:19:59","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1774:38:59"},{"AST":{"nativeSrc":"1831:42:59","nodeType":"YulBlock","src":"1831:42:59","statements":[{"nativeSrc":"1845:18:59","nodeType":"YulAssignment","src":"1845:18:59","value":{"name":"position","nativeSrc":"1855:8:59","nodeType":"YulIdentifier","src":"1855:8:59"},"variableNames":[{"name":"s.slot","nativeSrc":"1845:6:59","nodeType":"YulIdentifier","src":"1845:6:59"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":11674,"isOffset":false,"isSlot":false,"src":"1855:8:59","valueSize":1},{"declaration":11671,"isOffset":false,"isSlot":true,"src":"1845:6:59","suffix":"slot","valueSize":1}],"id":11677,"nodeType":"InlineAssembly","src":"1822:51:59"}]},"id":11679,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"1714:6:59","nodeType":"FunctionDefinition","parameters":{"id":11668,"nodeType":"ParameterList","parameters":[],"src":"1720:2:59"},"returnParameters":{"id":11672,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11671,"mutability":"mutable","name":"s","nameLocation":"1761:1:59","nodeType":"VariableDeclaration","scope":11679,"src":"1746:16:59","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"},"typeName":{"id":11670,"nodeType":"UserDefinedTypeName","pathNode":{"id":11669,"name":"Layout","nameLocations":["1746:6:59"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1746:6:59"},"referencedDeclaration":11590,"src":"1746:6:59","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}},"visibility":"internal"}],"src":"1745:18:59"},"scope":11680,"src":"1705:174:59","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":11681,"src":"189:1692:59","usedErrors":[],"usedEvents":[]}],"src":"32:1850:59"},"id":59},"contracts/lifecycle/Checkpoints.sol":{"ast":{"absolutePath":"contracts/lifecycle/Checkpoints.sol","exportedSymbols":{"Checkpoints":[11692],"CheckpointsBase":[11861],"ContractOwnership":[7934]},"id":11693,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11682,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:60"},{"absolutePath":"contracts/lifecycle/base/CheckpointsBase.sol","file":"./base/CheckpointsBase.sol","id":11684,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11693,"sourceUnit":11862,"src":"58:59:60","symbolAliases":[{"foreign":{"id":11683,"name":"CheckpointsBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11861,"src":"66:15:60","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../access/ContractOwnership.sol","id":11686,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11693,"sourceUnit":7935,"src":"118:68:60","symbolAliases":[{"foreign":{"id":11685,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"126:17:60","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":11688,"name":"CheckpointsBase","nameLocations":["391:15:60"],"nodeType":"IdentifierPath","referencedDeclaration":11861,"src":"391:15:60"},"id":11689,"nodeType":"InheritanceSpecifier","src":"391:15:60"},{"baseName":{"id":11690,"name":"ContractOwnership","nameLocations":["408:17:60"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"408:17:60"},"id":11691,"nodeType":"InheritanceSpecifier","src":"408:17:60"}],"canonicalName":"Checkpoints","contractDependencies":[],"contractKind":"contract","documentation":{"id":11687,"nodeType":"StructuredDocumentation","src":"188:170:60","text":"@title Timestamp-based checkpoints management (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":11692,"linearizedBaseContracts":[11692,7934,11554,11579,8139,11861,1206,8562,12151],"name":"Checkpoints","nameLocation":"376:11:60","nodeType":"ContractDefinition","nodes":[],"scope":11693,"src":"358:70:60","usedErrors":[7886,8246,11559,11946,11956],"usedEvents":[8287,11973]}],"src":"32:397:60"},"id":60},"contracts/lifecycle/Pause.sol":{"ast":{"absolutePath":"contracts/lifecycle/Pause.sol","exportedSymbols":{"ContractOwnership":[7934],"Pause":[11725],"PauseBase":[11939],"PauseStorage":[12598]},"id":11726,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11694,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:61"},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./libraries/PauseStorage.sol","id":11696,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11726,"sourceUnit":12599,"src":"58:58:61","symbolAliases":[{"foreign":{"id":11695,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"66:12:61","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/base/PauseBase.sol","file":"./base/PauseBase.sol","id":11698,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11726,"sourceUnit":11940,"src":"117:47:61","symbolAliases":[{"foreign":{"id":11697,"name":"PauseBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11939,"src":"125:9:61","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"../access/ContractOwnership.sol","id":11700,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11726,"sourceUnit":7935,"src":"165:66:61","symbolAliases":[{"foreign":{"id":11699,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"173:17:61","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":11702,"name":"PauseBase","nameLocations":["409:9:61"],"nodeType":"IdentifierPath","referencedDeclaration":11939,"src":"409:9:61"},"id":11703,"nodeType":"InheritanceSpecifier","src":"409:9:61"},{"baseName":{"id":11704,"name":"ContractOwnership","nameLocations":["420:17:61"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"420:17:61"},"id":11705,"nodeType":"InheritanceSpecifier","src":"420:17:61"}],"canonicalName":"Pause","contractDependencies":[],"contractKind":"contract","documentation":{"id":11701,"nodeType":"StructuredDocumentation","src":"233:149:61","text":"@title Pausing mechanism (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":11725,"linearizedBaseContracts":[11725,7934,11554,11579,8139,11939,1206,8562,12161],"name":"Pause","nameLocation":"400:5:61","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11709,"libraryName":{"id":11706,"name":"PauseStorage","nameLocations":["450:12:61"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"450:12:61"},"nodeType":"UsingForDirective","src":"444:43:61","typeName":{"id":11708,"nodeType":"UserDefinedTypeName","pathNode":{"id":11707,"name":"PauseStorage.Layout","nameLocations":["467:12:61","480:6:61"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"467:19:61"},"referencedDeclaration":12428,"src":"467:19:61","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"body":{"id":11723,"nodeType":"Block","src":"697:64:61","statements":[{"expression":{"arguments":[{"id":11720,"name":"isPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11712,"src":"745:8:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11715,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"707:12:61","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":11717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"720:6:61","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"707:19:61","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":11718,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"707:21:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":11719,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"729:15:61","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":12476,"src":"707:37:61","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer,bool)"}},"id":11721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"707:47:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11722,"nodeType":"ExpressionStatement","src":"707:47:61"}]},"documentation":{"id":11710,"nodeType":"StructuredDocumentation","src":"493:172:61","text":"@notice Initializes the storage with an initial pause state.\n @dev Emits a {Paused} event if `isPaused` is true.\n @param isPaused The initial pause state."},"id":11724,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":11713,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11712,"mutability":"mutable","name":"isPaused","nameLocation":"687:8:61","nodeType":"VariableDeclaration","scope":11724,"src":"682:13:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11711,"name":"bool","nodeType":"ElementaryTypeName","src":"682:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"681:15:61"},"returnParameters":{"id":11714,"nodeType":"ParameterList","parameters":[],"src":"697:0:61"},"scope":11725,"src":"670:91:61","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":11726,"src":"382:381:61","usedErrors":[8246,11559,11961,11964],"usedEvents":[8287,11978,11981]}],"src":"32:732:61"},"id":61},"contracts/lifecycle/base/CheckpointsBase.sol":{"ast":{"absolutePath":"contracts/lifecycle/base/CheckpointsBase.sol","exportedSymbols":{"CheckpointsBase":[11861],"CheckpointsStorage":[12411],"Context":[1206],"ContractOwnershipStorage":[9109],"ICheckpoints":[12151]},"id":11862,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11727,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:62"},{"absolutePath":"contracts/lifecycle/interfaces/ICheckpoints.sol","file":"./../interfaces/ICheckpoints.sol","id":11729,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11862,"sourceUnit":12152,"src":"58:62:62","symbolAliases":[{"foreign":{"id":11728,"name":"ICheckpoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12151,"src":"66:12:62","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/CheckpointsStorage.sol","file":"./../libraries/CheckpointsStorage.sol","id":11731,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11862,"sourceUnit":12412,"src":"121:73:62","symbolAliases":[{"foreign":{"id":11730,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"129:18:62","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":11733,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11862,"sourceUnit":9110,"src":"195:95:62","symbolAliases":[{"foreign":{"id":11732,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"203:24:62","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":11735,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11862,"sourceUnit":1207,"src":"291:66:62","symbolAliases":[{"foreign":{"id":11734,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"299:7:62","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":11737,"name":"ICheckpoints","nameLocations":["625:12:62"],"nodeType":"IdentifierPath","referencedDeclaration":12151,"src":"625:12:62"},"id":11738,"nodeType":"InheritanceSpecifier","src":"625:12:62"},{"baseName":{"id":11739,"name":"Context","nameLocations":["639:7:62"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"639:7:62"},"id":11740,"nodeType":"InheritanceSpecifier","src":"639:7:62"}],"canonicalName":"CheckpointsBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":11736,"nodeType":"StructuredDocumentation","src":"359:229:62","text":"@title Timestamp-based checkpoints management (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":11861,"linearizedBaseContracts":[11861,1206,12151],"name":"CheckpointsBase","nameLocation":"606:15:62","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11744,"libraryName":{"id":11741,"name":"CheckpointsStorage","nameLocations":["659:18:62"],"nodeType":"IdentifierPath","referencedDeclaration":12411,"src":"659:18:62"},"nodeType":"UsingForDirective","src":"653:55:62","typeName":{"id":11743,"nodeType":"UserDefinedTypeName","pathNode":{"id":11742,"name":"CheckpointsStorage.Layout","nameLocations":["682:18:62","701:6:62"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"682:25:62"},"referencedDeclaration":12180,"src":"682:25:62","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}}},{"global":false,"id":11748,"libraryName":{"id":11745,"name":"ContractOwnershipStorage","nameLocations":["719:24:62"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"719:24:62"},"nodeType":"UsingForDirective","src":"713:67:62","typeName":{"id":11747,"nodeType":"UserDefinedTypeName","pathNode":{"id":11746,"name":"ContractOwnershipStorage.Layout","nameLocations":["748:24:62","773:6:62"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"748:31:62"},"referencedDeclaration":8882,"src":"748:31:62","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":11774,"nodeType":"Block","src":"1270:163:62","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":11761,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1337:10:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1337:12:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11756,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1280:24:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":11758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1305:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1280:31:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":11759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1280:33:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":11760,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1314:22:62","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1280:56:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":11763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1280:70:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11764,"nodeType":"ExpressionStatement","src":"1280:70:62"},{"expression":{"arguments":[{"id":11770,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11751,"src":"1402:12:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":11771,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11753,"src":"1416:9:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11765,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"1360:18:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":11767,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1379:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"1360:25:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":11768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1360:27:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":11769,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1388:13:62","memberName":"setCheckpoint","nodeType":"MemberAccess","referencedDeclaration":12234,"src":"1360:41:62","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32,uint256)"}},"id":11772,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1360:66:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11773,"nodeType":"ExpressionStatement","src":"1360:66:62"}]},"documentation":{"id":11749,"nodeType":"StructuredDocumentation","src":"786:398:62","text":"@notice Sets the checkpoints.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\n @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\n @param checkpointId The checkpoint identifiers.\n @param timestamp The checkpoint timestamps."},"functionSelector":"4f410a80","id":11775,"implemented":true,"kind":"function","modifiers":[],"name":"setCheckpoint","nameLocation":"1198:13:62","nodeType":"FunctionDefinition","parameters":{"id":11754,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11751,"mutability":"mutable","name":"checkpointId","nameLocation":"1220:12:62","nodeType":"VariableDeclaration","scope":11775,"src":"1212:20:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11750,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1212:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":11753,"mutability":"mutable","name":"timestamp","nameLocation":"1242:9:62","nodeType":"VariableDeclaration","scope":11775,"src":"1234:17:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11752,"name":"uint256","nodeType":"ElementaryTypeName","src":"1234:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1211:41:62"},"returnParameters":{"id":11755,"nodeType":"ParameterList","parameters":[],"src":"1270:0:62"},"scope":11861,"src":"1189:244:62","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":11803,"nodeType":"Block","src":"1966:170:62","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":11790,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2033:10:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11791,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2033:12:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11785,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1976:24:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":11787,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2001:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1976:31:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":11788,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1976:33:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":11789,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2010:22:62","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1976:56:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":11792,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1976:70:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11793,"nodeType":"ExpressionStatement","src":"1976:70:62"},{"expression":{"arguments":[{"id":11799,"name":"checkpointIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11779,"src":"2103:13:62","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},{"id":11800,"name":"timestamps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11782,"src":"2118:10:62","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11794,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"2056:18:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":11796,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2075:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"2056:25:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":11797,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2056:27:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":11798,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2084:18:62","memberName":"batchSetCheckpoint","nodeType":"MemberAccess","referencedDeclaration":12283,"src":"2056:46:62","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12180_storage_ptr_$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32[] calldata,uint256[] calldata)"}},"id":11801,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2056:73:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11802,"nodeType":"ExpressionStatement","src":"2056:73:62"}]},"documentation":{"id":11776,"nodeType":"StructuredDocumentation","src":"1439:412:62","text":"@notice Sets a batch of checkpoints.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\n @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\n @param checkpointIds The checkpoint identifier.\n @param timestamps The checkpoint timestamp."},"functionSelector":"3b149369","id":11804,"implemented":true,"kind":"function","modifiers":[],"name":"batchSetCheckpoint","nameLocation":"1865:18:62","nodeType":"FunctionDefinition","parameters":{"id":11783,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11779,"mutability":"mutable","name":"checkpointIds","nameLocation":"1903:13:62","nodeType":"VariableDeclaration","scope":11804,"src":"1884:32:62","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":11777,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1884:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":11778,"nodeType":"ArrayTypeName","src":"1884:9:62","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":11782,"mutability":"mutable","name":"timestamps","nameLocation":"1937:10:62","nodeType":"VariableDeclaration","scope":11804,"src":"1918:29:62","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":11780,"name":"uint256","nodeType":"ElementaryTypeName","src":"1918:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":11781,"nodeType":"ArrayTypeName","src":"1918:9:62","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1883:65:62"},"returnParameters":{"id":11784,"nodeType":"ParameterList","parameters":[],"src":"1966:0:62"},"scope":11861,"src":"1856:280:62","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":11827,"nodeType":"Block","src":"2588:156:62","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":11815,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2655:10:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2655:12:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11810,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2598:24:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":11812,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2623:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2598:31:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":11813,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2598:33:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":11814,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2632:22:62","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"2598:56:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":11817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2598:70:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11818,"nodeType":"ExpressionStatement","src":"2598:70:62"},{"expression":{"arguments":[{"id":11824,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11807,"src":"2724:12:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11819,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"2678:18:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":11821,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2697:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"2678:25:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":11822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2678:27:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":11823,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2706:17:62","memberName":"triggerCheckpoint","nodeType":"MemberAccess","referencedDeclaration":12314,"src":"2678:45:62","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32)"}},"id":11825,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2678:59:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11826,"nodeType":"ExpressionStatement","src":"2678:59:62"}]},"documentation":{"id":11805,"nodeType":"StructuredDocumentation","src":"2142:375:62","text":"@notice Sets the checkpoint to the current block timestamp.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\n @dev Emits a {CheckpointSet} event.\n @param checkpointId The checkpoint identifier."},"functionSelector":"deb4d746","id":11828,"implemented":true,"kind":"function","modifiers":[],"name":"triggerCheckpoint","nameLocation":"2531:17:62","nodeType":"FunctionDefinition","parameters":{"id":11808,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11807,"mutability":"mutable","name":"checkpointId","nameLocation":"2557:12:62","nodeType":"VariableDeclaration","scope":11828,"src":"2549:20:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11806,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2549:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2548:22:62"},"returnParameters":{"id":11809,"nodeType":"ParameterList","parameters":[],"src":"2588:0:62"},"scope":11861,"src":"2522:222:62","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[12142],"body":{"id":11843,"nodeType":"Block","src":"2865:76:62","statements":[{"expression":{"arguments":[{"id":11840,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11831,"src":"2921:12:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11836,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"2882:18:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":11837,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2901:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"2882:25:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":11838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2882:27:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":11839,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2910:10:62","memberName":"checkpoint","nodeType":"MemberAccess","referencedDeclaration":12331,"src":"2882:38:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view returns (uint256)"}},"id":11841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2882:52:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":11835,"id":11842,"nodeType":"Return","src":"2875:59:62"}]},"documentation":{"id":11829,"nodeType":"StructuredDocumentation","src":"2750:28:62","text":"@inheritdoc ICheckpoints"},"functionSelector":"5b34eba0","id":11844,"implemented":true,"kind":"function","modifiers":[],"name":"checkpoint","nameLocation":"2792:10:62","nodeType":"FunctionDefinition","parameters":{"id":11832,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11831,"mutability":"mutable","name":"checkpointId","nameLocation":"2811:12:62","nodeType":"VariableDeclaration","scope":11844,"src":"2803:20:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11830,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2803:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2802:22:62"},"returnParameters":{"id":11835,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11834,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11844,"src":"2856:7:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11833,"name":"uint256","nodeType":"ElementaryTypeName","src":"2856:7:62","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2855:9:62"},"scope":11861,"src":"2783:158:62","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[12150],"body":{"id":11859,"nodeType":"Block","src":"3066:83:62","statements":[{"expression":{"arguments":[{"id":11856,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11847,"src":"3129:12:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11852,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"3083:18:62","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":11853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3102:6:62","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"3083:25:62","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":11854,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3083:27:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":11855,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3111:17:62","memberName":"checkpointReached","nodeType":"MemberAccess","referencedDeclaration":12359,"src":"3083:45:62","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$_t_bool_$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view returns (bool)"}},"id":11857,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3083:59:62","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":11851,"id":11858,"nodeType":"Return","src":"3076:66:62"}]},"documentation":{"id":11845,"nodeType":"StructuredDocumentation","src":"2947:28:62","text":"@inheritdoc ICheckpoints"},"functionSelector":"151bdba6","id":11860,"implemented":true,"kind":"function","modifiers":[],"name":"checkpointReached","nameLocation":"2989:17:62","nodeType":"FunctionDefinition","parameters":{"id":11848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11847,"mutability":"mutable","name":"checkpointId","nameLocation":"3015:12:62","nodeType":"VariableDeclaration","scope":11860,"src":"3007:20:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11846,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3007:7:62","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3006:22:62"},"returnParameters":{"id":11851,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11850,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11860,"src":"3060:4:62","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11849,"name":"bool","nodeType":"ElementaryTypeName","src":"3060:4:62","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3059:6:62"},"scope":11861,"src":"2980:169:62","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":11862,"src":"588:2563:62","usedErrors":[7886,8246,11946,11956],"usedEvents":[11973]}],"src":"32:3120:62"},"id":62},"contracts/lifecycle/base/PauseBase.sol":{"ast":{"absolutePath":"contracts/lifecycle/base/PauseBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"IPause":[12161],"PauseBase":[11939],"PauseStorage":[12598]},"id":11940,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11863,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:63"},{"absolutePath":"contracts/lifecycle/interfaces/IPause.sol","file":"./../interfaces/IPause.sol","id":11865,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11940,"sourceUnit":12162,"src":"58:50:63","symbolAliases":[{"foreign":{"id":11864,"name":"IPause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12161,"src":"66:6:63","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./../libraries/PauseStorage.sol","id":11867,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11940,"sourceUnit":12599,"src":"109:61:63","symbolAliases":[{"foreign":{"id":11866,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"117:12:63","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":11869,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11940,"sourceUnit":9110,"src":"171:95:63","symbolAliases":[{"foreign":{"id":11868,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"179:24:63","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":11871,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":11940,"sourceUnit":1207,"src":"267:66:63","symbolAliases":[{"foreign":{"id":11870,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"275:7:63","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":11873,"name":"IPause","nameLocations":["574:6:63"],"nodeType":"IdentifierPath","referencedDeclaration":12161,"src":"574:6:63"},"id":11874,"nodeType":"InheritanceSpecifier","src":"574:6:63"},{"baseName":{"id":11875,"name":"Context","nameLocations":["582:7:63"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"582:7:63"},"id":11876,"nodeType":"InheritanceSpecifier","src":"582:7:63"}],"canonicalName":"PauseBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":11872,"nodeType":"StructuredDocumentation","src":"335:208:63","text":"@title Pausing mechanism (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":11939,"linearizedBaseContracts":[11939,1206,12161],"name":"PauseBase","nameLocation":"561:9:63","nodeType":"ContractDefinition","nodes":[{"global":false,"id":11880,"libraryName":{"id":11877,"name":"PauseStorage","nameLocations":["602:12:63"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"602:12:63"},"nodeType":"UsingForDirective","src":"596:43:63","typeName":{"id":11879,"nodeType":"UserDefinedTypeName","pathNode":{"id":11878,"name":"PauseStorage.Layout","nameLocations":["619:12:63","632:6:63"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"619:19:63"},"referencedDeclaration":12428,"src":"619:19:63","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"global":false,"id":11884,"libraryName":{"id":11881,"name":"ContractOwnershipStorage","nameLocations":["650:24:63"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"650:24:63"},"nodeType":"UsingForDirective","src":"644:67:63","typeName":{"id":11883,"nodeType":"UserDefinedTypeName","pathNode":{"id":11882,"name":"ContractOwnershipStorage.Layout","nameLocations":["679:24:63","704:6:63"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"679:31:63"},"referencedDeclaration":8882,"src":"679:31:63","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":11904,"nodeType":"Block","src":"973:126:63","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":11893,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1040:10:63","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11894,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1040:12:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11888,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"983:24:63","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":11890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1008:6:63","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"983:31:63","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":11891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"983:33:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":11892,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1017:22:63","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"983:56:63","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":11895,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"983:70:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11896,"nodeType":"ExpressionStatement","src":"983:70:63"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11897,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"1063:12:63","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":11899,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1076:6:63","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"1063:19:63","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":11900,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1063:21:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":11901,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1085:5:63","memberName":"pause","nodeType":"MemberAccess","referencedDeclaration":12521,"src":"1063:27:63","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer)"}},"id":11902,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1063:29:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11903,"nodeType":"ExpressionStatement","src":"1063:29:63"}]},"documentation":{"id":11885,"nodeType":"StructuredDocumentation","src":"717:217:63","text":"@notice Pauses the contract.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {Paused} if the contract is paused.\n @dev Emits a {Paused} event."},"functionSelector":"8456cb59","id":11905,"implemented":true,"kind":"function","modifiers":[],"name":"pause","nameLocation":"948:5:63","nodeType":"FunctionDefinition","parameters":{"id":11886,"nodeType":"ParameterList","parameters":[],"src":"953:2:63"},"returnParameters":{"id":11887,"nodeType":"ParameterList","parameters":[],"src":"973:0:63"},"scope":11939,"src":"939:160:63","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":11925,"nodeType":"Block","src":"1375:128:63","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":11914,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1442:10:63","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":11915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1442:12:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11909,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1385:24:63","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":11911,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1410:6:63","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1385:31:63","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":11912,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1385:33:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":11913,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1419:22:63","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1385:56:63","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":11916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1385:70:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11917,"nodeType":"ExpressionStatement","src":"1385:70:63"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11918,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"1465:12:63","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":11920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1478:6:63","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"1465:19:63","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":11921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1465:21:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":11922,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1487:7:63","memberName":"unpause","nodeType":"MemberAccess","referencedDeclaration":12543,"src":"1465:29:63","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer)"}},"id":11923,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1465:31:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":11924,"nodeType":"ExpressionStatement","src":"1465:31:63"}]},"documentation":{"id":11906,"nodeType":"StructuredDocumentation","src":"1105:229:63","text":"@notice Unpauses the contract.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {NotPaused} if the contract is not paused.\n @dev Emits an {Unpaused} event."},"functionSelector":"3f4ba83a","id":11926,"implemented":true,"kind":"function","modifiers":[],"name":"unpause","nameLocation":"1348:7:63","nodeType":"FunctionDefinition","parameters":{"id":11907,"nodeType":"ParameterList","parameters":[],"src":"1355:2:63"},"returnParameters":{"id":11908,"nodeType":"ParameterList","parameters":[],"src":"1375:0:63"},"scope":11939,"src":"1339:164:63","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[12160],"body":{"id":11937,"nodeType":"Block","src":"1594:54:63","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":11931,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"1611:12:63","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":11932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1624:6:63","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"1611:19:63","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":11933,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:21:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":11934,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1633:6:63","memberName":"paused","nodeType":"MemberAccess","referencedDeclaration":12556,"src":"1611:28:63","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$_t_bool_$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view returns (bool)"}},"id":11935,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:30:63","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":11930,"id":11936,"nodeType":"Return","src":"1604:37:63"}]},"functionSelector":"5c975abb","id":11938,"implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"1548:6:63","nodeType":"FunctionDefinition","parameters":{"id":11927,"nodeType":"ParameterList","parameters":[],"src":"1554:2:63"},"returnParameters":{"id":11930,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11929,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":11938,"src":"1588:4:63","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":11928,"name":"bool","nodeType":"ElementaryTypeName","src":"1588:4:63","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1587:6:63"},"scope":11939,"src":"1539:109:63","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":11940,"src":"543:1107:63","usedErrors":[8246,11961,11964],"usedEvents":[11978,11981]}],"src":"32:1619:63"},"id":63},"contracts/lifecycle/errors/CheckpointsErrors.sol":{"ast":{"absolutePath":"contracts/lifecycle/errors/CheckpointsErrors.sol","exportedSymbols":{"CheckpointAlreadySet":[11946],"CheckpointNotReached":[11951],"CheckpointReached":[11956]},"id":11957,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11941,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:64"},{"documentation":{"id":11942,"nodeType":"StructuredDocumentation","src":"58:124:64","text":"@notice Thrown when trying to set a checkpoint which is already set.\n @param checkpointId The checkpoint identifier."},"errorSelector":"33e962eb","id":11946,"name":"CheckpointAlreadySet","nameLocation":"188:20:64","nodeType":"ErrorDefinition","parameters":{"id":11945,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11944,"mutability":"mutable","name":"checkpointId","nameLocation":"217:12:64","nodeType":"VariableDeclaration","scope":11946,"src":"209:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11943,"name":"bytes32","nodeType":"ElementaryTypeName","src":"209:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"208:22:64"},"src":"182:49:64"},{"documentation":{"id":11947,"nodeType":"StructuredDocumentation","src":"233:133:64","text":"@notice Thrown when a checkpoint has not been reached yet but is required to.\n @param checkpointId The checkpoint identifier."},"errorSelector":"a7afbc52","id":11951,"name":"CheckpointNotReached","nameLocation":"372:20:64","nodeType":"ErrorDefinition","parameters":{"id":11950,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11949,"mutability":"mutable","name":"checkpointId","nameLocation":"401:12:64","nodeType":"VariableDeclaration","scope":11951,"src":"393:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11948,"name":"bytes32","nodeType":"ElementaryTypeName","src":"393:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"392:22:64"},"src":"366:49:64"},{"documentation":{"id":11952,"nodeType":"StructuredDocumentation","src":"417:137:64","text":"@notice Thrown when a checkpoint has already been reached but is required not to.\n @param checkpointId The checkpoint identifier."},"errorSelector":"8e54d909","id":11956,"name":"CheckpointReached","nameLocation":"560:17:64","nodeType":"ErrorDefinition","parameters":{"id":11955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11954,"mutability":"mutable","name":"checkpointId","nameLocation":"586:12:64","nodeType":"VariableDeclaration","scope":11956,"src":"578:20:64","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11953,"name":"bytes32","nodeType":"ElementaryTypeName","src":"578:7:64","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"577:22:64"},"src":"554:46:64"}],"src":"32:569:64"},"id":64},"contracts/lifecycle/errors/PauseErrors.sol":{"ast":{"absolutePath":"contracts/lifecycle/errors/PauseErrors.sol","exportedSymbols":{"NotPaused":[11964],"Paused":[11961]},"id":11965,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11958,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:65"},{"documentation":{"id":11959,"nodeType":"StructuredDocumentation","src":"58:71:65","text":"@notice Thrown when the contract is paused but is required not to."},"errorSelector":"9e87fac8","id":11961,"name":"Paused","nameLocation":"135:6:65","nodeType":"ErrorDefinition","parameters":{"id":11960,"nodeType":"ParameterList","parameters":[],"src":"141:2:65"},"src":"129:15:65"},{"documentation":{"id":11962,"nodeType":"StructuredDocumentation","src":"146:71:65","text":"@notice Thrown when the contract is not paused but is required to."},"errorSelector":"6cd60201","id":11964,"name":"NotPaused","nameLocation":"223:9:65","nodeType":"ErrorDefinition","parameters":{"id":11963,"nodeType":"ParameterList","parameters":[],"src":"232:2:65"},"src":"217:18:65"}],"src":"32:204:65"},"id":65},"contracts/lifecycle/events/CheckpointsEvents.sol":{"ast":{"absolutePath":"contracts/lifecycle/events/CheckpointsEvents.sol","exportedSymbols":{"CheckpointSet":[11973]},"id":11974,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11966,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:66"},{"anonymous":false,"documentation":{"id":11967,"nodeType":"StructuredDocumentation","src":"58:162:66","text":"@notice Emitted when a checkpoint is set.\n @param checkpointId The checkpoint identifier.\n @param timestamp The timestamp associated to the checkpoint."},"eventSelector":"099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953","id":11973,"name":"CheckpointSet","nameLocation":"226:13:66","nodeType":"EventDefinition","parameters":{"id":11972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":11969,"indexed":false,"mutability":"mutable","name":"checkpointId","nameLocation":"248:12:66","nodeType":"VariableDeclaration","scope":11973,"src":"240:20:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":11968,"name":"bytes32","nodeType":"ElementaryTypeName","src":"240:7:66","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":11971,"indexed":false,"mutability":"mutable","name":"timestamp","nameLocation":"270:9:66","nodeType":"VariableDeclaration","scope":11973,"src":"262:17:66","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11970,"name":"uint256","nodeType":"ElementaryTypeName","src":"262:7:66","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"239:41:66"},"src":"220:61:66"}],"src":"32:250:66"},"id":66},"contracts/lifecycle/events/PauseEvents.sol":{"ast":{"absolutePath":"contracts/lifecycle/events/PauseEvents.sol","exportedSymbols":{"Pause":[11978],"Unpause":[11981]},"id":11982,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11975,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:67"},{"anonymous":false,"documentation":{"id":11976,"nodeType":"StructuredDocumentation","src":"58:49:67","text":"@notice Emitted when the pause is triggered."},"eventSelector":"6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625","id":11978,"name":"Pause","nameLocation":"113:5:67","nodeType":"EventDefinition","parameters":{"id":11977,"nodeType":"ParameterList","parameters":[],"src":"118:2:67"},"src":"107:14:67"},{"anonymous":false,"documentation":{"id":11979,"nodeType":"StructuredDocumentation","src":"123:46:67","text":"@notice Emitted when the pause is lifted."},"eventSelector":"7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33","id":11981,"name":"Unpause","nameLocation":"175:7:67","nodeType":"EventDefinition","parameters":{"id":11980,"nodeType":"ParameterList","parameters":[],"src":"182:2:67"},"src":"169:16:67"}],"src":"32:154:67"},"id":67},"contracts/lifecycle/facets/CheckpointsFacet.sol":{"ast":{"absolutePath":"contracts/lifecycle/facets/CheckpointsFacet.sol","exportedSymbols":{"CheckpointsBase":[11861],"CheckpointsFacet":[12041],"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":12042,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":11983,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:68"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":11985,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12042,"sourceUnit":13387,"src":"57:84:68","symbolAliases":[{"foreign":{"id":11984,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:68","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":11987,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12042,"sourceUnit":19478,"src":"142:80:68","symbolAliases":[{"foreign":{"id":11986,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"150:17:68","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/base/CheckpointsBase.sol","file":"./../base/CheckpointsBase.sol","id":11989,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12042,"sourceUnit":11862,"src":"223:62:68","symbolAliases":[{"foreign":{"id":11988,"name":"CheckpointsBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11861,"src":"231:15:68","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":11991,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12042,"sourceUnit":1207,"src":"286:66:68","symbolAliases":[{"foreign":{"id":11990,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"294:7:68","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":11993,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12042,"sourceUnit":13298,"src":"353:98:68","symbolAliases":[{"foreign":{"id":11992,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"361:28:68","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":11995,"name":"CheckpointsBase","nameLocations":["762:15:68"],"nodeType":"IdentifierPath","referencedDeclaration":11861,"src":"762:15:68"},"id":11996,"nodeType":"InheritanceSpecifier","src":"762:15:68"},{"baseName":{"id":11997,"name":"ForwarderRegistryContextBase","nameLocations":["779:28:68"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"779:28:68"},"id":11998,"nodeType":"InheritanceSpecifier","src":"779:28:68"}],"canonicalName":"CheckpointsFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":11994,"nodeType":"StructuredDocumentation","src":"453:280:68","text":"@title Timestamp-based checkpoints management (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}."},"fullyImplemented":true,"id":12041,"linearizedBaseContracts":[12041,13297,11861,1206,12151],"name":"CheckpointsFacet","nameLocation":"742:16:68","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12002,"libraryName":{"id":11999,"name":"ProxyAdminStorage","nameLocations":["820:17:68"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"820:17:68"},"nodeType":"UsingForDirective","src":"814:53:68","typeName":{"id":12001,"nodeType":"UserDefinedTypeName","pathNode":{"id":12000,"name":"ProxyAdminStorage.Layout","nameLocations":["842:17:68","860:6:68"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"842:24:68"},"referencedDeclaration":19308,"src":"842:24:68","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":12011,"nodeType":"Block","src":"971:2:68","statements":[]},"id":12012,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":12008,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12005,"src":"952:17:68","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":12009,"kind":"baseConstructorSpecifier","modifierName":{"id":12007,"name":"ForwarderRegistryContextBase","nameLocations":["923:28:68"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"923:28:68"},"nodeType":"ModifierInvocation","src":"923:47:68"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":12006,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12005,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"904:17:68","nodeType":"VariableDeclaration","scope":12012,"src":"885:36:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":12004,"nodeType":"UserDefinedTypeName","pathNode":{"id":12003,"name":"IForwarderRegistry","nameLocations":["885:18:68"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"885:18:68"},"referencedDeclaration":13386,"src":"885:18:68","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"884:38:68"},"returnParameters":{"id":12010,"nodeType":"ParameterList","parameters":[],"src":"971:0:68"},"scope":12041,"src":"873:100:68","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":12025,"nodeType":"Block","src":"1138:65:68","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12021,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1155:28:68","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":12022,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1184:10:68","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1155:39:68","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":12023,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1155:41:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":12020,"id":12024,"nodeType":"Return","src":"1148:48:68"}]},"documentation":{"id":12013,"nodeType":"StructuredDocumentation","src":"979:44:68","text":"@inheritdoc ForwarderRegistryContextBase"},"id":12026,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1037:10:68","nodeType":"FunctionDefinition","overrides":{"id":12017,"nodeType":"OverrideSpecifier","overrides":[{"id":12015,"name":"Context","nameLocations":["1081:7:68"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1081:7:68"},{"id":12016,"name":"ForwarderRegistryContextBase","nameLocations":["1090:28:68"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1090:28:68"}],"src":"1072:47:68"},"parameters":{"id":12014,"nodeType":"ParameterList","parameters":[],"src":"1047:2:68"},"returnParameters":{"id":12020,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12019,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12026,"src":"1129:7:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12018,"name":"address","nodeType":"ElementaryTypeName","src":"1129:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1128:9:68"},"scope":12041,"src":"1028:175:68","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":12039,"nodeType":"Block","src":"1373:63:68","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12035,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1390:28:68","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":12036,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1419:8:68","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1390:37:68","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":12037,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1390:39:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":12034,"id":12038,"nodeType":"Return","src":"1383:46:68"}]},"documentation":{"id":12027,"nodeType":"StructuredDocumentation","src":"1209:44:68","text":"@inheritdoc ForwarderRegistryContextBase"},"id":12040,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1267:8:68","nodeType":"FunctionDefinition","overrides":{"id":12031,"nodeType":"OverrideSpecifier","overrides":[{"id":12029,"name":"Context","nameLocations":["1309:7:68"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1309:7:68"},{"id":12030,"name":"ForwarderRegistryContextBase","nameLocations":["1318:28:68"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1318:28:68"}],"src":"1300:47:68"},"parameters":{"id":12028,"nodeType":"ParameterList","parameters":[],"src":"1275:2:68"},"returnParameters":{"id":12034,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12033,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12040,"src":"1357:14:68","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12032,"name":"bytes","nodeType":"ElementaryTypeName","src":"1357:5:68","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1356:16:68"},"scope":12041,"src":"1258:178:68","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":12042,"src":"733:705:68","usedErrors":[7886,8246,11946,11956],"usedEvents":[11973]}],"src":"32:1407:68"},"id":68},"contracts/lifecycle/facets/PauseFacet.sol":{"ast":{"absolutePath":"contracts/lifecycle/facets/PauseFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"PauseBase":[11939],"PauseFacet":[12131],"PauseStorage":[12598],"ProxyAdminStorage":[19477]},"id":12132,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12043,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:69"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":12045,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":13387,"src":"57:84:69","symbolAliases":[{"foreign":{"id":12044,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./../libraries/PauseStorage.sol","id":12047,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":12599,"src":"142:61:69","symbolAliases":[{"foreign":{"id":12046,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"150:12:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":12049,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":19478,"src":"204:80:69","symbolAliases":[{"foreign":{"id":12048,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"212:17:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/base/PauseBase.sol","file":"./../base/PauseBase.sol","id":12051,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":11940,"src":"285:50:69","symbolAliases":[{"foreign":{"id":12050,"name":"PauseBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11939,"src":"293:9:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":12053,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":1207,"src":"336:66:69","symbolAliases":[{"foreign":{"id":12052,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"344:7:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":12055,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12132,"sourceUnit":13298,"src":"403:98:69","symbolAliases":[{"foreign":{"id":12054,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"411:28:69","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":12057,"name":"PauseBase","nameLocations":["785:9:69"],"nodeType":"IdentifierPath","referencedDeclaration":11939,"src":"785:9:69"},"id":12058,"nodeType":"InheritanceSpecifier","src":"785:9:69"},{"baseName":{"id":12059,"name":"ForwarderRegistryContextBase","nameLocations":["796:28:69"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"796:28:69"},"id":12060,"nodeType":"InheritanceSpecifier","src":"796:28:69"}],"canonicalName":"PauseFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":12056,"nodeType":"StructuredDocumentation","src":"503:259:69","text":"@title Pausing mechanism (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}."},"fullyImplemented":true,"id":12131,"linearizedBaseContracts":[12131,13297,11939,1206,12161],"name":"PauseFacet","nameLocation":"771:10:69","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12064,"libraryName":{"id":12061,"name":"ProxyAdminStorage","nameLocations":["837:17:69"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"837:17:69"},"nodeType":"UsingForDirective","src":"831:53:69","typeName":{"id":12063,"nodeType":"UserDefinedTypeName","pathNode":{"id":12062,"name":"ProxyAdminStorage.Layout","nameLocations":["859:17:69","877:6:69"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"859:24:69"},"referencedDeclaration":19308,"src":"859:24:69","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":12068,"libraryName":{"id":12065,"name":"PauseStorage","nameLocations":["895:12:69"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"895:12:69"},"nodeType":"UsingForDirective","src":"889:43:69","typeName":{"id":12067,"nodeType":"UserDefinedTypeName","pathNode":{"id":12066,"name":"PauseStorage.Layout","nameLocations":["912:12:69","925:6:69"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"912:19:69"},"referencedDeclaration":12428,"src":"912:19:69","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"body":{"id":12077,"nodeType":"Block","src":"1036:2:69","statements":[]},"id":12078,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":12074,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12071,"src":"1017:17:69","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":12075,"kind":"baseConstructorSpecifier","modifierName":{"id":12073,"name":"ForwarderRegistryContextBase","nameLocations":["988:28:69"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"988:28:69"},"nodeType":"ModifierInvocation","src":"988:47:69"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":12072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12071,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"969:17:69","nodeType":"VariableDeclaration","scope":12078,"src":"950:36:69","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":12070,"nodeType":"UserDefinedTypeName","pathNode":{"id":12069,"name":"IForwarderRegistry","nameLocations":["950:18:69"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"950:18:69"},"referencedDeclaration":13386,"src":"950:18:69","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"949:38:69"},"returnParameters":{"id":12076,"nodeType":"ParameterList","parameters":[],"src":"1036:0:69"},"scope":12131,"src":"938:100:69","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12101,"nodeType":"Block","src":"1531:128:69","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":12089,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[12116],"referencedDeclaration":12116,"src":"1588:10:69","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":12090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1588:12:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12084,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1541:17:69","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":12086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1559:6:69","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1541:24:69","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":12087,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1541:26:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":12088,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1568:19:69","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1541:46:69","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":12091,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1541:60:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12092,"nodeType":"ExpressionStatement","src":"1541:60:69"},{"expression":{"arguments":[{"id":12098,"name":"isPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12081,"src":"1643:8:69","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12093,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"1611:12:69","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":12095,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1624:6:69","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"1611:19:69","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":12096,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:21:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12097,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1633:9:69","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":12499,"src":"1611:31:69","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer,bool)"}},"id":12099,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:41:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12100,"nodeType":"ExpressionStatement","src":"1611:41:69"}]},"documentation":{"id":12079,"nodeType":"StructuredDocumentation","src":"1044:432:69","text":"@notice Initializes the storage with an initial pause state.\n @notice Sets the proxy initialization phase to `1`.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits a {Paused} event if `isPaused` is true.\n @param isPaused The initial pause state."},"functionSelector":"b606577c","id":12102,"implemented":true,"kind":"function","modifiers":[],"name":"initPauseStorage","nameLocation":"1490:16:69","nodeType":"FunctionDefinition","parameters":{"id":12082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12081,"mutability":"mutable","name":"isPaused","nameLocation":"1512:8:69","nodeType":"VariableDeclaration","scope":12102,"src":"1507:13:69","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12080,"name":"bool","nodeType":"ElementaryTypeName","src":"1507:4:69","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1506:15:69"},"returnParameters":{"id":12083,"nodeType":"ParameterList","parameters":[],"src":"1531:0:69"},"scope":12131,"src":"1481:178:69","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":12115,"nodeType":"Block","src":"1824:65:69","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12111,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1841:28:69","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":12112,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1870:10:69","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1841:39:69","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":12113,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1841:41:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":12110,"id":12114,"nodeType":"Return","src":"1834:48:69"}]},"documentation":{"id":12103,"nodeType":"StructuredDocumentation","src":"1665:44:69","text":"@inheritdoc ForwarderRegistryContextBase"},"id":12116,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1723:10:69","nodeType":"FunctionDefinition","overrides":{"id":12107,"nodeType":"OverrideSpecifier","overrides":[{"id":12105,"name":"Context","nameLocations":["1767:7:69"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1767:7:69"},{"id":12106,"name":"ForwarderRegistryContextBase","nameLocations":["1776:28:69"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1776:28:69"}],"src":"1758:47:69"},"parameters":{"id":12104,"nodeType":"ParameterList","parameters":[],"src":"1733:2:69"},"returnParameters":{"id":12110,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12109,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12116,"src":"1815:7:69","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12108,"name":"address","nodeType":"ElementaryTypeName","src":"1815:7:69","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1814:9:69"},"scope":12131,"src":"1714:175:69","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":12129,"nodeType":"Block","src":"2059:63:69","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12125,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2076:28:69","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":12126,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2105:8:69","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2076:37:69","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":12127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2076:39:69","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":12124,"id":12128,"nodeType":"Return","src":"2069:46:69"}]},"documentation":{"id":12117,"nodeType":"StructuredDocumentation","src":"1895:44:69","text":"@inheritdoc ForwarderRegistryContextBase"},"id":12130,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1953:8:69","nodeType":"FunctionDefinition","overrides":{"id":12121,"nodeType":"OverrideSpecifier","overrides":[{"id":12119,"name":"Context","nameLocations":["1995:7:69"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1995:7:69"},{"id":12120,"name":"ForwarderRegistryContextBase","nameLocations":["2004:28:69"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2004:28:69"}],"src":"1986:47:69"},"parameters":{"id":12118,"nodeType":"ParameterList","parameters":[],"src":"1961:2:69"},"returnParameters":{"id":12124,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12123,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12130,"src":"2043:14:69","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12122,"name":"bytes","nodeType":"ElementaryTypeName","src":"2043:5:69","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2042:16:69"},"scope":12131,"src":"1944:178:69","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":12132,"src":"762:1362:69","usedErrors":[8246,11961,11964,19183,19192],"usedEvents":[11978,11981]}],"src":"32:2093:69"},"id":69},"contracts/lifecycle/interfaces/ICheckpoints.sol":{"ast":{"absolutePath":"contracts/lifecycle/interfaces/ICheckpoints.sol","exportedSymbols":{"ICheckpoints":[12151]},"id":12152,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12133,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:70"},{"abstract":false,"baseContracts":[],"canonicalName":"ICheckpoints","contractDependencies":[],"contractKind":"interface","documentation":{"id":12134,"nodeType":"StructuredDocumentation","src":"58:62:70","text":"@title Timestamp-based checkpoints management (functions)"},"fullyImplemented":false,"id":12151,"linearizedBaseContracts":[12151],"name":"ICheckpoints","nameLocation":"130:12:70","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":12135,"nodeType":"StructuredDocumentation","src":"149:222:70","text":"@notice Gets the checkpoint timestamp.\n @param checkpointId The checkpoint identifier.\n @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."},"functionSelector":"5b34eba0","id":12142,"implemented":false,"kind":"function","modifiers":[],"name":"checkpoint","nameLocation":"385:10:70","nodeType":"FunctionDefinition","parameters":{"id":12138,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12137,"mutability":"mutable","name":"checkpointId","nameLocation":"404:12:70","nodeType":"VariableDeclaration","scope":12142,"src":"396:20:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12136,"name":"bytes32","nodeType":"ElementaryTypeName","src":"396:7:70","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"395:22:70"},"returnParameters":{"id":12141,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12140,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12142,"src":"441:7:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12139,"name":"uint256","nodeType":"ElementaryTypeName","src":"441:7:70","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"440:9:70"},"scope":12151,"src":"376:74:70","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":12143,"nodeType":"StructuredDocumentation","src":"456:258:70","text":"@notice Retrieves whether the checkpoint has been reached already.\n @param checkpointId The checkpoint identifier.\n @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."},"functionSelector":"151bdba6","id":12150,"implemented":false,"kind":"function","modifiers":[],"name":"checkpointReached","nameLocation":"728:17:70","nodeType":"FunctionDefinition","parameters":{"id":12146,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12145,"mutability":"mutable","name":"checkpointId","nameLocation":"754:12:70","nodeType":"VariableDeclaration","scope":12150,"src":"746:20:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12144,"name":"bytes32","nodeType":"ElementaryTypeName","src":"746:7:70","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"745:22:70"},"returnParameters":{"id":12149,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12148,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12150,"src":"791:4:70","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12147,"name":"bool","nodeType":"ElementaryTypeName","src":"791:4:70","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"790:6:70"},"scope":12151,"src":"719:78:70","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":12152,"src":"120:679:70","usedErrors":[],"usedEvents":[]}],"src":"32:768:70"},"id":70},"contracts/lifecycle/interfaces/IPause.sol":{"ast":{"absolutePath":"contracts/lifecycle/interfaces/IPause.sol","exportedSymbols":{"IPause":[12161]},"id":12162,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12153,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:71"},{"abstract":false,"baseContracts":[],"canonicalName":"IPause","contractDependencies":[],"contractKind":"interface","documentation":{"id":12154,"nodeType":"StructuredDocumentation","src":"58:41:71","text":"@title Pausing mechanism (functions)"},"fullyImplemented":false,"id":12161,"linearizedBaseContracts":[12161],"name":"IPause","nameLocation":"109:6:71","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":12155,"nodeType":"StructuredDocumentation","src":"122:109:71","text":"@notice Gets the paused state of the contract.\n @return isPaused The paused state of the contract."},"functionSelector":"5c975abb","id":12160,"implemented":false,"kind":"function","modifiers":[],"name":"paused","nameLocation":"245:6:71","nodeType":"FunctionDefinition","parameters":{"id":12156,"nodeType":"ParameterList","parameters":[],"src":"251:2:71"},"returnParameters":{"id":12159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12158,"mutability":"mutable","name":"isPaused","nameLocation":"282:8:71","nodeType":"VariableDeclaration","scope":12160,"src":"277:13:71","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12157,"name":"bool","nodeType":"ElementaryTypeName","src":"277:4:71","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"276:15:71"},"scope":12161,"src":"236:56:71","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":12162,"src":"99:195:71","usedErrors":[],"usedEvents":[]}],"src":"32:263:71"},"id":71},"contracts/lifecycle/libraries/CheckpointsStorage.sol":{"ast":{"absolutePath":"contracts/lifecycle/libraries/CheckpointsStorage.sol","exportedSymbols":{"CheckpointAlreadySet":[11946],"CheckpointNotReached":[11951],"CheckpointReached":[11956],"CheckpointSet":[11973],"CheckpointsStorage":[12411],"InconsistentArrayLengths":[7886]},"id":12412,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12163,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:72"},{"absolutePath":"contracts/lifecycle/errors/CheckpointsErrors.sol","file":"./../errors/CheckpointsErrors.sol","id":12167,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12412,"sourceUnit":11957,"src":"58:112:72","symbolAliases":[{"foreign":{"id":12164,"name":"CheckpointAlreadySet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11946,"src":"66:20:72","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":12165,"name":"CheckpointNotReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11951,"src":"88:20:72","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":12166,"name":"CheckpointReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11956,"src":"110:17:72","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../CommonErrors.sol","id":12169,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12412,"sourceUnit":7890,"src":"171:66:72","symbolAliases":[{"foreign":{"id":12168,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"179:24:72","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/events/CheckpointsEvents.sol","file":"./../events/CheckpointsEvents.sol","id":12171,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12412,"sourceUnit":11974,"src":"238:64:72","symbolAliases":[{"foreign":{"id":12170,"name":"CheckpointSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11973,"src":"246:13:72","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"CheckpointsStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":12411,"linearizedBaseContracts":[12411],"name":"CheckpointsStorage","nameLocation":"312:18:72","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12175,"libraryName":{"id":12172,"name":"CheckpointsStorage","nameLocations":["343:18:72"],"nodeType":"IdentifierPath","referencedDeclaration":12411,"src":"343:18:72"},"nodeType":"UsingForDirective","src":"337:55:72","typeName":{"id":12174,"nodeType":"UserDefinedTypeName","pathNode":{"id":12173,"name":"CheckpointsStorage.Layout","nameLocations":["366:18:72","385:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"366:25:72"},"referencedDeclaration":12180,"src":"366:25:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}}},{"canonicalName":"CheckpointsStorage.Layout","id":12180,"members":[{"constant":false,"id":12179,"mutability":"mutable","name":"checkpoints","nameLocation":"487:11:72","nodeType":"VariableDeclaration","scope":12180,"src":"459:39:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"typeName":{"id":12178,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":12176,"name":"bytes32","nodeType":"ElementaryTypeName","src":"467:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"459:27:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":12177,"name":"uint256","nodeType":"ElementaryTypeName","src":"478:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"}],"name":"Layout","nameLocation":"405:6:72","nodeType":"StructDefinition","scope":12411,"src":"398:107:72","visibility":"public"},{"constant":true,"id":12193,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"537:19:72","nodeType":"VariableDeclaration","scope":12411,"src":"511:125:72","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12181,"name":"bytes32","nodeType":"ElementaryTypeName","src":"511:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12191,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6c6966656379636c652e436865636b706f696e74732e73746f72616765","id":12187,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"585:44:72","typeDescriptions":{"typeIdentifier":"t_stringliteral_0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716c","typeString":"literal_string \"animoca.core.lifecycle.Checkpoints.storage\""},"value":"animoca.core.lifecycle.Checkpoints.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716c","typeString":"literal_string \"animoca.core.lifecycle.Checkpoints.storage\""}],"id":12186,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"575:9:72","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12188,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"575:55:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12185,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"567:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12184,"name":"uint256","nodeType":"ElementaryTypeName","src":"567:7:72","typeDescriptions":{}}},"id":12189,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"567:64:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":12190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"634:1:72","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"567:68:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12183,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"559:7:72","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":12182,"name":"bytes32","nodeType":"ElementaryTypeName","src":"559:7:72","typeDescriptions":{}}},"id":12192,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"559:77:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":12233,"nodeType":"Block","src":"1048:246:72","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"expression":{"id":12204,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12197,"src":"1062:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12205,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1064:11:72","memberName":"checkpoints","nodeType":"MemberAccess","referencedDeclaration":12179,"src":"1062:13:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":12207,"indexExpression":{"id":12206,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12199,"src":"1076:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1062:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":12208,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1093:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1062:32:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12214,"nodeType":"IfStatement","src":"1058:79:72","trueBody":{"errorCall":{"arguments":[{"id":12211,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12199,"src":"1124:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12210,"name":"CheckpointAlreadySet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11946,"src":"1103:20:72","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes32_$returns$_t_error_$","typeString":"function (bytes32) pure returns (error)"}},"id":12212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1103:34:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12213,"nodeType":"RevertStatement","src":"1096:41:72"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12217,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12215,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12201,"src":"1151:9:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":12216,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1164:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1151:14:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12232,"nodeType":"IfStatement","src":"1147:141:72","trueBody":{"id":12231,"nodeType":"Block","src":"1167:121:72","statements":[{"expression":{"id":12224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":12218,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12197,"src":"1181:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12221,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1183:11:72","memberName":"checkpoints","nodeType":"MemberAccess","referencedDeclaration":12179,"src":"1181:13:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":12222,"indexExpression":{"id":12220,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12199,"src":"1195:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1181:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":12223,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12201,"src":"1211:9:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1181:39:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12225,"nodeType":"ExpressionStatement","src":"1181:39:72"},{"eventCall":{"arguments":[{"id":12227,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12199,"src":"1253:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":12228,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12201,"src":"1267:9:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12226,"name":"CheckpointSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11973,"src":"1239:13:72","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":12229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1239:38:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12230,"nodeType":"EmitStatement","src":"1234:43:72"}]}}]},"documentation":{"id":12194,"nodeType":"StructuredDocumentation","src":"643:309:72","text":"@notice Sets the checkpoint.\n @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\n @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\n @param checkpointId The checkpoint identifier.\n @param timestamp The checkpoint timestamp."},"id":12234,"implemented":true,"kind":"function","modifiers":[],"name":"setCheckpoint","nameLocation":"966:13:72","nodeType":"FunctionDefinition","parameters":{"id":12202,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12197,"mutability":"mutable","name":"s","nameLocation":"995:1:72","nodeType":"VariableDeclaration","scope":12234,"src":"980:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12196,"nodeType":"UserDefinedTypeName","pathNode":{"id":12195,"name":"Layout","nameLocations":["980:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"980:6:72"},"referencedDeclaration":12180,"src":"980:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12199,"mutability":"mutable","name":"checkpointId","nameLocation":"1006:12:72","nodeType":"VariableDeclaration","scope":12234,"src":"998:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12198,"name":"bytes32","nodeType":"ElementaryTypeName","src":"998:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":12201,"mutability":"mutable","name":"timestamp","nameLocation":"1028:9:72","nodeType":"VariableDeclaration","scope":12234,"src":"1020:17:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12200,"name":"uint256","nodeType":"ElementaryTypeName","src":"1020:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"979:59:72"},"returnParameters":{"id":12203,"nodeType":"ParameterList","parameters":[],"src":"1048:0:72"},"scope":12411,"src":"957:337:72","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12282,"nodeType":"Block","src":"1753:246:72","statements":[{"assignments":[12248],"declarations":[{"constant":false,"id":12248,"mutability":"mutable","name":"length","nameLocation":"1771:6:72","nodeType":"VariableDeclaration","scope":12282,"src":"1763:14:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12247,"name":"uint256","nodeType":"ElementaryTypeName","src":"1763:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12251,"initialValue":{"expression":{"id":12249,"name":"checkpointIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12241,"src":"1780:13:72","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":12250,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1794:6:72","memberName":"length","nodeType":"MemberAccess","src":"1780:20:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1763:37:72"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12255,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12252,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12248,"src":"1814:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":12253,"name":"timestamps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12244,"src":"1824:10:72","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":12254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1835:6:72","memberName":"length","nodeType":"MemberAccess","src":"1824:17:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1814:27:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12259,"nodeType":"IfStatement","src":"1810:66:72","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12256,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"1850:24:72","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":12257,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1850:26:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12258,"nodeType":"RevertStatement","src":"1843:33:72"}},{"body":{"id":12280,"nodeType":"Block","src":"1920:73:72","statements":[{"expression":{"arguments":[{"baseExpression":{"id":12272,"name":"checkpointIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12241,"src":"1950:13:72","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":12274,"indexExpression":{"id":12273,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12261,"src":"1964:1:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1950:16:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"baseExpression":{"id":12275,"name":"timestamps","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12244,"src":"1968:10:72","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":12277,"indexExpression":{"id":12276,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12261,"src":"1979:1:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1968:13:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12269,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12238,"src":"1934:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12271,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1936:13:72","memberName":"setCheckpoint","nodeType":"MemberAccess","referencedDeclaration":12234,"src":"1934:15:72","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32,uint256)"}},"id":12278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1934:48:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12279,"nodeType":"ExpressionStatement","src":"1934:48:72"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12263,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12261,"src":"1903:1:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":12264,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12248,"src":"1907:6:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1903:10:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12281,"initializationExpression":{"assignments":[12261],"declarations":[{"constant":false,"id":12261,"mutability":"mutable","name":"i","nameLocation":"1900:1:72","nodeType":"VariableDeclaration","scope":12281,"src":"1892:9:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12260,"name":"uint256","nodeType":"ElementaryTypeName","src":"1892:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12262,"nodeType":"VariableDeclarationStatement","src":"1892:9:72"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":12267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"1915:3:72","subExpression":{"id":12266,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12261,"src":"1917:1:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12268,"nodeType":"ExpressionStatement","src":"1915:3:72"},"nodeType":"ForStatement","src":"1887:106:72"}]},"documentation":{"id":12235,"nodeType":"StructuredDocumentation","src":"1300:328:72","text":"@notice Sets a batch of checkpoints.\n @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\n @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\n @param checkpointIds The checkpoint identifiers.\n @param timestamps The checkpoint timestamps."},"id":12283,"implemented":true,"kind":"function","modifiers":[],"name":"batchSetCheckpoint","nameLocation":"1642:18:72","nodeType":"FunctionDefinition","parameters":{"id":12245,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12238,"mutability":"mutable","name":"s","nameLocation":"1676:1:72","nodeType":"VariableDeclaration","scope":12283,"src":"1661:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12237,"nodeType":"UserDefinedTypeName","pathNode":{"id":12236,"name":"Layout","nameLocations":["1661:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"1661:6:72"},"referencedDeclaration":12180,"src":"1661:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12241,"mutability":"mutable","name":"checkpointIds","nameLocation":"1698:13:72","nodeType":"VariableDeclaration","scope":12283,"src":"1679:32:72","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":12239,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1679:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":12240,"nodeType":"ArrayTypeName","src":"1679:9:72","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":12244,"mutability":"mutable","name":"timestamps","nameLocation":"1732:10:72","nodeType":"VariableDeclaration","scope":12283,"src":"1713:29:72","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":12242,"name":"uint256","nodeType":"ElementaryTypeName","src":"1713:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12243,"nodeType":"ArrayTypeName","src":"1713:9:72","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1660:83:72"},"returnParameters":{"id":12246,"nodeType":"ParameterList","parameters":[],"src":"1753:0:72"},"scope":12411,"src":"1633:366:72","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12313,"nodeType":"Block","src":"2375:174:72","statements":[{"expression":{"arguments":[{"id":12295,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12289,"src":"2415:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":12292,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12287,"src":"2385:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12294,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2387:27:72","memberName":"enforceCheckpointNotReached","nodeType":"MemberAccess","referencedDeclaration":12398,"src":"2385:29:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view"}},"id":12296,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2385:43:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12297,"nodeType":"ExpressionStatement","src":"2385:43:72"},{"expression":{"id":12305,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":12298,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12287,"src":"2438:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12301,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2440:11:72","memberName":"checkpoints","nodeType":"MemberAccess","referencedDeclaration":12179,"src":"2438:13:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":12302,"indexExpression":{"id":12300,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12289,"src":"2452:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2438:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":12303,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2468:5:72","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2474:9:72","memberName":"timestamp","nodeType":"MemberAccess","src":"2468:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2438:45:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12306,"nodeType":"ExpressionStatement","src":"2438:45:72"},{"eventCall":{"arguments":[{"id":12308,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12289,"src":"2512:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":12309,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2526:5:72","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2532:9:72","memberName":"timestamp","nodeType":"MemberAccess","src":"2526:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12307,"name":"CheckpointSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11973,"src":"2498:13:72","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":12311,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2498:44:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12312,"nodeType":"EmitStatement","src":"2493:49:72"}]},"documentation":{"id":12284,"nodeType":"StructuredDocumentation","src":"2005:289:72","text":"@notice Sets the checkpoint to the current block timestamp.\n @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\n @dev Emits a {CheckpointSet} event.\n @param checkpointId The checkpoint identifier."},"id":12314,"implemented":true,"kind":"function","modifiers":[],"name":"triggerCheckpoint","nameLocation":"2308:17:72","nodeType":"FunctionDefinition","parameters":{"id":12290,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12287,"mutability":"mutable","name":"s","nameLocation":"2341:1:72","nodeType":"VariableDeclaration","scope":12314,"src":"2326:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12286,"nodeType":"UserDefinedTypeName","pathNode":{"id":12285,"name":"Layout","nameLocations":["2326:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"2326:6:72"},"referencedDeclaration":12180,"src":"2326:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12289,"mutability":"mutable","name":"checkpointId","nameLocation":"2352:12:72","nodeType":"VariableDeclaration","scope":12314,"src":"2344:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12288,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2344:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2325:40:72"},"returnParameters":{"id":12291,"nodeType":"ParameterList","parameters":[],"src":"2375:0:72"},"scope":12411,"src":"2299:250:72","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12330,"nodeType":"Block","src":"2884:51:72","statements":[{"expression":{"baseExpression":{"expression":{"id":12325,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12318,"src":"2901:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12326,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2903:11:72","memberName":"checkpoints","nodeType":"MemberAccess","referencedDeclaration":12179,"src":"2901:13:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":12328,"indexExpression":{"id":12327,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12320,"src":"2915:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2901:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":12324,"id":12329,"nodeType":"Return","src":"2894:34:72"}]},"documentation":{"id":12315,"nodeType":"StructuredDocumentation","src":"2555:222:72","text":"@notice Gets the checkpoint timestamp.\n @param checkpointId The checkpoint identifier.\n @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."},"id":12331,"implemented":true,"kind":"function","modifiers":[],"name":"checkpoint","nameLocation":"2791:10:72","nodeType":"FunctionDefinition","parameters":{"id":12321,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12318,"mutability":"mutable","name":"s","nameLocation":"2817:1:72","nodeType":"VariableDeclaration","scope":12331,"src":"2802:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12317,"nodeType":"UserDefinedTypeName","pathNode":{"id":12316,"name":"Layout","nameLocations":["2802:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"2802:6:72"},"referencedDeclaration":12180,"src":"2802:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12320,"mutability":"mutable","name":"checkpointId","nameLocation":"2828:12:72","nodeType":"VariableDeclaration","scope":12331,"src":"2820:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12319,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2820:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2801:40:72"},"returnParameters":{"id":12324,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12323,"mutability":"mutable","name":"timestamp","nameLocation":"2873:9:72","nodeType":"VariableDeclaration","scope":12331,"src":"2865:17:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12322,"name":"uint256","nodeType":"ElementaryTypeName","src":"2865:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2864:19:72"},"scope":12411,"src":"2782:153:72","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12358,"nodeType":"Block","src":"3300:133:72","statements":[{"assignments":[12343],"declarations":[{"constant":false,"id":12343,"mutability":"mutable","name":"checkpoint_","nameLocation":"3318:11:72","nodeType":"VariableDeclaration","scope":12358,"src":"3310:19:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12342,"name":"uint256","nodeType":"ElementaryTypeName","src":"3310:7:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12348,"initialValue":{"baseExpression":{"expression":{"id":12344,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12335,"src":"3332:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12345,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3334:11:72","memberName":"checkpoints","nodeType":"MemberAccess","referencedDeclaration":12179,"src":"3332:13:72","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"}},"id":12347,"indexExpression":{"id":12346,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12337,"src":"3346:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3332:27:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3310:49:72"},{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":12356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12349,"name":"checkpoint_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12343,"src":"3376:11:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":12350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3391:1:72","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3376:16:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12355,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":12352,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"3396:5:72","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":12353,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3402:9:72","memberName":"timestamp","nodeType":"MemberAccess","src":"3396:15:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":12354,"name":"checkpoint_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12343,"src":"3415:11:72","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3396:30:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3376:50:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":12341,"id":12357,"nodeType":"Return","src":"3369:57:72"}]},"documentation":{"id":12332,"nodeType":"StructuredDocumentation","src":"2941:258:72","text":"@notice Retrieves whether the checkpoint has been reached already.\n @param checkpointId The checkpoint identifier.\n @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."},"id":12359,"implemented":true,"kind":"function","modifiers":[],"name":"checkpointReached","nameLocation":"3213:17:72","nodeType":"FunctionDefinition","parameters":{"id":12338,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12335,"mutability":"mutable","name":"s","nameLocation":"3246:1:72","nodeType":"VariableDeclaration","scope":12359,"src":"3231:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12334,"nodeType":"UserDefinedTypeName","pathNode":{"id":12333,"name":"Layout","nameLocations":["3231:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"3231:6:72"},"referencedDeclaration":12180,"src":"3231:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12337,"mutability":"mutable","name":"checkpointId","nameLocation":"3257:12:72","nodeType":"VariableDeclaration","scope":12359,"src":"3249:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12336,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3249:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3230:40:72"},"returnParameters":{"id":12341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12340,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12359,"src":"3294:4:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12339,"name":"bool","nodeType":"ElementaryTypeName","src":"3294:4:72","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3293:6:72"},"scope":12411,"src":"3204:229:72","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12378,"nodeType":"Block","src":"3788:98:72","statements":[{"condition":{"id":12372,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3802:34:72","subExpression":{"arguments":[{"id":12370,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12365,"src":"3823:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":12368,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12363,"src":"3803:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12369,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3805:17:72","memberName":"checkpointReached","nodeType":"MemberAccess","referencedDeclaration":12359,"src":"3803:19:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$_t_bool_$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view returns (bool)"}},"id":12371,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3803:33:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12377,"nodeType":"IfStatement","src":"3798:81:72","trueBody":{"errorCall":{"arguments":[{"id":12374,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12365,"src":"3866:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12373,"name":"CheckpointNotReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11951,"src":"3845:20:72","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes32_$returns$_t_error_$","typeString":"function (bytes32) pure returns (error)"}},"id":12375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3845:34:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12376,"nodeType":"RevertStatement","src":"3838:41:72"}}]},"documentation":{"id":12360,"nodeType":"StructuredDocumentation","src":"3439:256:72","text":"@notice Ensures that the checkpoint has been reached already.\n @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\n @param checkpointId The checkpoint identifier."},"id":12379,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointReached","nameLocation":"3709:24:72","nodeType":"FunctionDefinition","parameters":{"id":12366,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12363,"mutability":"mutable","name":"s","nameLocation":"3749:1:72","nodeType":"VariableDeclaration","scope":12379,"src":"3734:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12362,"nodeType":"UserDefinedTypeName","pathNode":{"id":12361,"name":"Layout","nameLocations":["3734:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"3734:6:72"},"referencedDeclaration":12180,"src":"3734:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12365,"mutability":"mutable","name":"checkpointId","nameLocation":"3760:12:72","nodeType":"VariableDeclaration","scope":12379,"src":"3752:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12364,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3752:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3733:40:72"},"returnParameters":{"id":12367,"nodeType":"ParameterList","parameters":[],"src":"3788:0:72"},"scope":12411,"src":"3700:186:72","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12397,"nodeType":"Block","src":"4231:94:72","statements":[{"condition":{"arguments":[{"id":12390,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12385,"src":"4265:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":12388,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12383,"src":"4245:1:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":12389,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4247:17:72","memberName":"checkpointReached","nodeType":"MemberAccess","referencedDeclaration":12359,"src":"4245:19:72","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$_t_bool_$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view returns (bool)"}},"id":12391,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4245:33:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12396,"nodeType":"IfStatement","src":"4241:77:72","trueBody":{"errorCall":{"arguments":[{"id":12393,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12385,"src":"4305:12:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12392,"name":"CheckpointReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11956,"src":"4287:17:72","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_bytes32_$returns$_t_error_$","typeString":"function (bytes32) pure returns (error)"}},"id":12394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4287:31:72","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12395,"nodeType":"RevertStatement","src":"4280:38:72"}}]},"documentation":{"id":12380,"nodeType":"StructuredDocumentation","src":"3892:243:72","text":"@notice Ensures that the checkpoint has not been reached yet.\n @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\n @param checkpointId The checkpoint identifier."},"id":12398,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointNotReached","nameLocation":"4149:27:72","nodeType":"FunctionDefinition","parameters":{"id":12386,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12383,"mutability":"mutable","name":"s","nameLocation":"4192:1:72","nodeType":"VariableDeclaration","scope":12398,"src":"4177:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12382,"nodeType":"UserDefinedTypeName","pathNode":{"id":12381,"name":"Layout","nameLocations":["4177:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"4177:6:72"},"referencedDeclaration":12180,"src":"4177:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12385,"mutability":"mutable","name":"checkpointId","nameLocation":"4203:12:72","nodeType":"VariableDeclaration","scope":12398,"src":"4195:20:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12384,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4195:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4176:40:72"},"returnParameters":{"id":12387,"nodeType":"ParameterList","parameters":[],"src":"4231:0:72"},"scope":12411,"src":"4140:185:72","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12409,"nodeType":"Block","src":"4390:115:72","statements":[{"assignments":[12405],"declarations":[{"constant":false,"id":12405,"mutability":"mutable","name":"position","nameLocation":"4408:8:72","nodeType":"VariableDeclaration","scope":12409,"src":"4400:16:72","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12404,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4400:7:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":12407,"initialValue":{"id":12406,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12193,"src":"4419:19:72","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4400:38:72"},{"AST":{"nativeSrc":"4457:42:72","nodeType":"YulBlock","src":"4457:42:72","statements":[{"nativeSrc":"4471:18:72","nodeType":"YulAssignment","src":"4471:18:72","value":{"name":"position","nativeSrc":"4481:8:72","nodeType":"YulIdentifier","src":"4481:8:72"},"variableNames":[{"name":"s.slot","nativeSrc":"4471:6:72","nodeType":"YulIdentifier","src":"4471:6:72"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":12405,"isOffset":false,"isSlot":false,"src":"4481:8:72","valueSize":1},{"declaration":12402,"isOffset":false,"isSlot":true,"src":"4471:6:72","suffix":"slot","valueSize":1}],"id":12408,"nodeType":"InlineAssembly","src":"4448:51:72"}]},"id":12410,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"4340:6:72","nodeType":"FunctionDefinition","parameters":{"id":12399,"nodeType":"ParameterList","parameters":[],"src":"4346:2:72"},"returnParameters":{"id":12403,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12402,"mutability":"mutable","name":"s","nameLocation":"4387:1:72","nodeType":"VariableDeclaration","scope":12410,"src":"4372:16:72","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"},"typeName":{"id":12401,"nodeType":"UserDefinedTypeName","pathNode":{"id":12400,"name":"Layout","nameLocations":["4372:6:72"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"4372:6:72"},"referencedDeclaration":12180,"src":"4372:6:72","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}},"visibility":"internal"}],"src":"4371:18:72"},"scope":12411,"src":"4331:174:72","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":12412,"src":"304:4203:72","usedErrors":[],"usedEvents":[]}],"src":"32:4476:72"},"id":72},"contracts/lifecycle/libraries/PauseStorage.sol":{"ast":{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","exportedSymbols":{"NotPaused":[11964],"Pause":[11978],"PauseStorage":[12598],"Paused":[11961],"ProxyInitialization":[19524],"Unpause":[11981]},"id":12599,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12413,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:73"},{"absolutePath":"contracts/lifecycle/errors/PauseErrors.sol","file":"./../errors/PauseErrors.sol","id":12416,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12599,"sourceUnit":11965,"src":"58:62:73","symbolAliases":[{"foreign":{"id":12414,"name":"Paused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11961,"src":"66:6:73","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":12415,"name":"NotPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11964,"src":"74:9:73","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/events/PauseEvents.sol","file":"./../events/PauseEvents.sol","id":12419,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12599,"sourceUnit":11982,"src":"121:59:73","symbolAliases":[{"foreign":{"id":12417,"name":"Pause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11978,"src":"129:5:73","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":12418,"name":"Unpause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11981,"src":"136:7:73","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../proxy/libraries/ProxyInitialization.sol","id":12421,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":12599,"sourceUnit":19525,"src":"181:84:73","symbolAliases":[{"foreign":{"id":12420,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"189:19:73","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"PauseStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":12598,"linearizedBaseContracts":[12598],"name":"PauseStorage","nameLocation":"275:12:73","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12425,"libraryName":{"id":12422,"name":"PauseStorage","nameLocations":["300:12:73"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"300:12:73"},"nodeType":"UsingForDirective","src":"294:43:73","typeName":{"id":12424,"nodeType":"UserDefinedTypeName","pathNode":{"id":12423,"name":"PauseStorage.Layout","nameLocations":["317:12:73","330:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"317:19:73"},"referencedDeclaration":12428,"src":"317:19:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"canonicalName":"PauseStorage.Layout","id":12428,"members":[{"constant":false,"id":12427,"mutability":"mutable","name":"isPaused","nameLocation":"372:8:73","nodeType":"VariableDeclaration","scope":12428,"src":"367:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12426,"name":"bool","nodeType":"ElementaryTypeName","src":"367:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"name":"Layout","nameLocation":"350:6:73","nodeType":"StructDefinition","scope":12598,"src":"343:44:73","visibility":"public"},{"constant":true,"id":12441,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"419:19:73","nodeType":"VariableDeclaration","scope":12598,"src":"393:119:73","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12429,"name":"bytes32","nodeType":"ElementaryTypeName","src":"393:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12439,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6c6966656379636c652e50617573652e73746f72616765","id":12435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"467:38:73","typeDescriptions":{"typeIdentifier":"t_stringliteral_0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9f","typeString":"literal_string \"animoca.core.lifecycle.Pause.storage\""},"value":"animoca.core.lifecycle.Pause.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9f","typeString":"literal_string \"animoca.core.lifecycle.Pause.storage\""}],"id":12434,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"457:9:73","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"457:49:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"449:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12432,"name":"uint256","nodeType":"ElementaryTypeName","src":"449:7:73","typeDescriptions":{}}},"id":12437,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"449:58:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":12438,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"510:1:73","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"449:62:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"441:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":12430,"name":"bytes32","nodeType":"ElementaryTypeName","src":"441:7:73","typeDescriptions":{}}},"id":12440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"441:71:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":12454,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"544:21:73","nodeType":"VariableDeclaration","scope":12598,"src":"518:119:73","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12442,"name":"bytes32","nodeType":"ElementaryTypeName","src":"518:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12452,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e6c6966656379636c652e50617573652e7068617365","id":12448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"594:36:73","typeDescriptions":{"typeIdentifier":"t_stringliteral_3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0f","typeString":"literal_string \"animoca.core.lifecycle.Pause.phase\""},"value":"animoca.core.lifecycle.Pause.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0f","typeString":"literal_string \"animoca.core.lifecycle.Pause.phase\""}],"id":12447,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"584:9:73","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"584:47:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":12446,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"576:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":12445,"name":"uint256","nodeType":"ElementaryTypeName","src":"576:7:73","typeDescriptions":{}}},"id":12450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"576:56:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":12451,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"635:1:73","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"576:60:73","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12444,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"568:7:73","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":12443,"name":"bytes32","nodeType":"ElementaryTypeName","src":"568:7:73","typeDescriptions":{}}},"id":12453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"568:69:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":12475,"nodeType":"Block","src":"1021:98:73","statements":[{"condition":{"id":12463,"name":"isPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12460,"src":"1035:8:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12474,"nodeType":"IfStatement","src":"1031:82:73","trueBody":{"id":12473,"nodeType":"Block","src":"1045:68:73","statements":[{"expression":{"id":12468,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":12464,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12458,"src":"1059:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12466,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1061:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"1059:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":12467,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1072:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"1059:17:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12469,"nodeType":"ExpressionStatement","src":"1059:17:73"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12470,"name":"Pause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11978,"src":"1095:5:73","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12471,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1095:7:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12472,"nodeType":"EmitStatement","src":"1090:12:73"}]}}]},"documentation":{"id":12455,"nodeType":"StructuredDocumentation","src":"644:305:73","text":"@notice Initializes the storage with an initial pause state (immutable version).\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @dev Emits a {Pause} event if `isPaused` is true.\n @param isPaused The initial pause state."},"id":12476,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"963:15:73","nodeType":"FunctionDefinition","parameters":{"id":12461,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12458,"mutability":"mutable","name":"s","nameLocation":"994:1:73","nodeType":"VariableDeclaration","scope":12476,"src":"979:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12457,"nodeType":"UserDefinedTypeName","pathNode":{"id":12456,"name":"Layout","nameLocations":["979:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"979:6:73"},"referencedDeclaration":12428,"src":"979:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12460,"mutability":"mutable","name":"isPaused","nameLocation":"1002:8:73","nodeType":"VariableDeclaration","scope":12476,"src":"997:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12459,"name":"bool","nodeType":"ElementaryTypeName","src":"997:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"978:33:73"},"returnParameters":{"id":12462,"nodeType":"ParameterList","parameters":[],"src":"1021:0:73"},"scope":12598,"src":"954:165:73","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12498,"nodeType":"Block","src":"1659:108:73","statements":[{"expression":{"arguments":[{"id":12488,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12454,"src":"1698:21:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":12489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1721:1:73","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":12485,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"1669:19:73","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":12487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1689:8:73","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"1669:28:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":12490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1669:54:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12491,"nodeType":"ExpressionStatement","src":"1669:54:73"},{"expression":{"arguments":[{"id":12495,"name":"isPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12482,"src":"1751:8:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":12492,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12480,"src":"1733:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12494,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1735:15:73","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":12476,"src":"1733:17:73","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer,bool)"}},"id":12496,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1733:27:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12497,"nodeType":"ExpressionStatement","src":"1733:27:73"}]},"documentation":{"id":12477,"nodeType":"StructuredDocumentation","src":"1125:468:73","text":"@notice Initializes the storage with an initial pause state (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits a {Pause} event if `isPaused` is true.\n @param isPaused The initial pause state."},"id":12499,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"1607:9:73","nodeType":"FunctionDefinition","parameters":{"id":12483,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12480,"mutability":"mutable","name":"s","nameLocation":"1632:1:73","nodeType":"VariableDeclaration","scope":12499,"src":"1617:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12479,"nodeType":"UserDefinedTypeName","pathNode":{"id":12478,"name":"Layout","nameLocations":["1617:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"1617:6:73"},"referencedDeclaration":12428,"src":"1617:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":12482,"mutability":"mutable","name":"isPaused","nameLocation":"1640:8:73","nodeType":"VariableDeclaration","scope":12499,"src":"1635:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12481,"name":"bool","nodeType":"ElementaryTypeName","src":"1635:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1616:33:73"},"returnParameters":{"id":12484,"nodeType":"ParameterList","parameters":[],"src":"1659:0:73"},"scope":12598,"src":"1598:169:73","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12520,"nodeType":"Block","src":"1950:88:73","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12506,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12503,"src":"1960:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12508,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1962:18:73","memberName":"enforceIsNotPaused","nodeType":"MemberAccess","referencedDeclaration":12585,"src":"1960:20:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":12509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1960:22:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12510,"nodeType":"ExpressionStatement","src":"1960:22:73"},{"expression":{"id":12515,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":12511,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12503,"src":"1992:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12513,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1994:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"1992:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":12514,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2005:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"1992:17:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12516,"nodeType":"ExpressionStatement","src":"1992:17:73"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12517,"name":"Pause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11978,"src":"2024:5:73","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2024:7:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12519,"nodeType":"EmitStatement","src":"2019:12:73"}]},"documentation":{"id":12500,"nodeType":"StructuredDocumentation","src":"1773:130:73","text":"@notice Pauses the contract.\n @dev Reverts with {Paused} if the contract is paused.\n @dev Emits a {Pause} event."},"id":12521,"implemented":true,"kind":"function","modifiers":[],"name":"pause","nameLocation":"1917:5:73","nodeType":"FunctionDefinition","parameters":{"id":12504,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12503,"mutability":"mutable","name":"s","nameLocation":"1938:1:73","nodeType":"VariableDeclaration","scope":12521,"src":"1923:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12502,"nodeType":"UserDefinedTypeName","pathNode":{"id":12501,"name":"Layout","nameLocations":["1923:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"1923:6:73"},"referencedDeclaration":12428,"src":"1923:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"1922:18:73"},"returnParameters":{"id":12505,"nodeType":"ParameterList","parameters":[],"src":"1950:0:73"},"scope":12598,"src":"1908:130:73","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12542,"nodeType":"Block","src":"2235:88:73","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12528,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12525,"src":"2245:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12530,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2247:15:73","memberName":"enforceIsPaused","nodeType":"MemberAccess","referencedDeclaration":12571,"src":"2245:17:73","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":12531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2245:19:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12532,"nodeType":"ExpressionStatement","src":"2245:19:73"},{"expression":{"id":12537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":12533,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12525,"src":"2274:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12535,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2276:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"2274:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"66616c7365","id":12536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2287:5:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"2274:18:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12538,"nodeType":"ExpressionStatement","src":"2274:18:73"},{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12539,"name":"Unpause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11981,"src":"2307:7:73","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":12540,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2307:9:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12541,"nodeType":"EmitStatement","src":"2302:14:73"}]},"documentation":{"id":12522,"nodeType":"StructuredDocumentation","src":"2044:142:73","text":"@notice Unpauses the contract.\n @dev Reverts with {NotPaused} if the contract is not paused.\n @dev Emits an {Unpause} event."},"id":12543,"implemented":true,"kind":"function","modifiers":[],"name":"unpause","nameLocation":"2200:7:73","nodeType":"FunctionDefinition","parameters":{"id":12526,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12525,"mutability":"mutable","name":"s","nameLocation":"2223:1:73","nodeType":"VariableDeclaration","scope":12543,"src":"2208:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12524,"nodeType":"UserDefinedTypeName","pathNode":{"id":12523,"name":"Layout","nameLocations":["2208:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"2208:6:73"},"referencedDeclaration":12428,"src":"2208:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"2207:18:73"},"returnParameters":{"id":12527,"nodeType":"ParameterList","parameters":[],"src":"2235:0:73"},"scope":12598,"src":"2191:132:73","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":12555,"nodeType":"Block","src":"2515:34:73","statements":[{"expression":{"expression":{"id":12552,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12547,"src":"2532:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12553,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2534:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"2532:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":12551,"id":12554,"nodeType":"Return","src":"2525:17:73"}]},"documentation":{"id":12544,"nodeType":"StructuredDocumentation","src":"2329:109:73","text":"@notice Gets the paused state of the contract.\n @return isPaused The paused state of the contract."},"id":12556,"implemented":true,"kind":"function","modifiers":[],"name":"paused","nameLocation":"2452:6:73","nodeType":"FunctionDefinition","parameters":{"id":12548,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12547,"mutability":"mutable","name":"s","nameLocation":"2474:1:73","nodeType":"VariableDeclaration","scope":12556,"src":"2459:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12546,"nodeType":"UserDefinedTypeName","pathNode":{"id":12545,"name":"Layout","nameLocations":["2459:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"2459:6:73"},"referencedDeclaration":12428,"src":"2459:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"2458:18:73"},"returnParameters":{"id":12551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12550,"mutability":"mutable","name":"isPaused","nameLocation":"2505:8:73","nodeType":"VariableDeclaration","scope":12556,"src":"2500:13:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12549,"name":"bool","nodeType":"ElementaryTypeName","src":"2500:4:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2499:15:73"},"scope":12598,"src":"2443:106:73","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12570,"nodeType":"Block","src":"2734:52:73","statements":[{"condition":{"id":12565,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"2748:11:73","subExpression":{"expression":{"id":12563,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12560,"src":"2749:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12564,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2751:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"2749:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12569,"nodeType":"IfStatement","src":"2744:35:73","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12566,"name":"NotPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11964,"src":"2768:9:73","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":12567,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2768:11:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12568,"nodeType":"RevertStatement","src":"2761:18:73"}}]},"documentation":{"id":12557,"nodeType":"StructuredDocumentation","src":"2555:117:73","text":"@notice Ensures that the contract is paused.\n @dev Reverts with {NotPaused} if the contract is not paused."},"id":12571,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsPaused","nameLocation":"2686:15:73","nodeType":"FunctionDefinition","parameters":{"id":12561,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12560,"mutability":"mutable","name":"s","nameLocation":"2717:1:73","nodeType":"VariableDeclaration","scope":12571,"src":"2702:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12559,"nodeType":"UserDefinedTypeName","pathNode":{"id":12558,"name":"Layout","nameLocations":["2702:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"2702:6:73"},"referencedDeclaration":12428,"src":"2702:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"2701:18:73"},"returnParameters":{"id":12562,"nodeType":"ParameterList","parameters":[],"src":"2734:0:73"},"scope":12598,"src":"2677:109:73","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12584,"nodeType":"Block","src":"2971:48:73","statements":[{"condition":{"expression":{"id":12578,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12575,"src":"2985:1:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":12579,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2987:8:73","memberName":"isPaused","nodeType":"MemberAccess","referencedDeclaration":12427,"src":"2985:10:73","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12583,"nodeType":"IfStatement","src":"2981:31:73","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12580,"name":"Paused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11961,"src":"3004:6:73","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":12581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3004:8:73","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12582,"nodeType":"RevertStatement","src":"2997:15:73"}}]},"documentation":{"id":12572,"nodeType":"StructuredDocumentation","src":"2792:114:73","text":"@notice Ensures that the contract is not paused.\n @dev Reverts with {Paused} if the contract is paused."},"id":12585,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsNotPaused","nameLocation":"2920:18:73","nodeType":"FunctionDefinition","parameters":{"id":12576,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12575,"mutability":"mutable","name":"s","nameLocation":"2954:1:73","nodeType":"VariableDeclaration","scope":12585,"src":"2939:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12574,"nodeType":"UserDefinedTypeName","pathNode":{"id":12573,"name":"Layout","nameLocations":["2939:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"2939:6:73"},"referencedDeclaration":12428,"src":"2939:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"2938:18:73"},"returnParameters":{"id":12577,"nodeType":"ParameterList","parameters":[],"src":"2971:0:73"},"scope":12598,"src":"2911:108:73","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":12596,"nodeType":"Block","src":"3084:115:73","statements":[{"assignments":[12592],"declarations":[{"constant":false,"id":12592,"mutability":"mutable","name":"position","nameLocation":"3102:8:73","nodeType":"VariableDeclaration","scope":12596,"src":"3094:16:73","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12591,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3094:7:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":12594,"initialValue":{"id":12593,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12441,"src":"3113:19:73","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3094:38:73"},{"AST":{"nativeSrc":"3151:42:73","nodeType":"YulBlock","src":"3151:42:73","statements":[{"nativeSrc":"3165:18:73","nodeType":"YulAssignment","src":"3165:18:73","value":{"name":"position","nativeSrc":"3175:8:73","nodeType":"YulIdentifier","src":"3175:8:73"},"variableNames":[{"name":"s.slot","nativeSrc":"3165:6:73","nodeType":"YulIdentifier","src":"3165:6:73"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":12592,"isOffset":false,"isSlot":false,"src":"3175:8:73","valueSize":1},{"declaration":12589,"isOffset":false,"isSlot":true,"src":"3165:6:73","suffix":"slot","valueSize":1}],"id":12595,"nodeType":"InlineAssembly","src":"3142:51:73"}]},"id":12597,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"3034:6:73","nodeType":"FunctionDefinition","parameters":{"id":12586,"nodeType":"ParameterList","parameters":[],"src":"3040:2:73"},"returnParameters":{"id":12590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12589,"mutability":"mutable","name":"s","nameLocation":"3081:1:73","nodeType":"VariableDeclaration","scope":12597,"src":"3066:16:73","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"},"typeName":{"id":12588,"nodeType":"UserDefinedTypeName","pathNode":{"id":12587,"name":"Layout","nameLocations":["3066:6:73"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"3066:6:73"},"referencedDeclaration":12428,"src":"3066:6:73","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}},"visibility":"internal"}],"src":"3065:18:73"},"scope":12598,"src":"3025:174:73","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":12599,"src":"267:2934:73","usedErrors":[],"usedEvents":[]}],"src":"32:3170:73"},"id":73},"contracts/metatx/ForwarderRegistry.sol":{"ast":{"absolutePath":"contracts/metatx/ForwarderRegistry.sol","exportedSymbols":{"Address":[1176],"ECDSA":[3223],"ERC2771Calldata":[13415],"ForwarderRegistry":[13080],"IERC1271":[9476],"IERC2771":[13370],"IForwarderRegistry":[13386]},"id":13081,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":12600,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:74"},{"absolutePath":"contracts/cryptography/interfaces/IERC1271.sol","file":"./../cryptography/interfaces/IERC1271.sol","id":12602,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":9477,"src":"57:67:74","symbolAliases":[{"foreign":{"id":12601,"name":"IERC1271","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9476,"src":"65:8:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./interfaces/IForwarderRegistry.sol","id":12604,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":13387,"src":"125:71:74","symbolAliases":[{"foreign":{"id":12603,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"133:18:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IERC2771.sol","file":"./interfaces/IERC2771.sol","id":12606,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":13371,"src":"197:51:74","symbolAliases":[{"foreign":{"id":12605,"name":"IERC2771","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13370,"src":"205:8:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/libraries/ERC2771Calldata.sol","file":"./libraries/ERC2771Calldata.sol","id":12608,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":13416,"src":"249:64:74","symbolAliases":[{"foreign":{"id":12607,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"257:15:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"@openzeppelin/contracts/utils/Address.sol","id":12610,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":1177,"src":"314:66:74","symbolAliases":[{"foreign":{"id":12609,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1176,"src":"322:7:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":12612,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13081,"sourceUnit":3224,"src":"381:75:74","symbolAliases":[{"foreign":{"id":12611,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3223,"src":"389:5:74","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":12614,"name":"IForwarderRegistry","nameLocations":["751:18:74"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"751:18:74"},"id":12615,"nodeType":"InheritanceSpecifier","src":"751:18:74"},{"baseName":{"id":12616,"name":"IERC2771","nameLocations":["771:8:74"],"nodeType":"IdentifierPath","referencedDeclaration":13370,"src":"771:8:74"},"id":12617,"nodeType":"InheritanceSpecifier","src":"771:8:74"}],"canonicalName":"ForwarderRegistry","contractDependencies":[],"contractKind":"contract","documentation":{"id":12613,"nodeType":"StructuredDocumentation","src":"458:263:74","text":"@title Meta-Transactions Forwarder Registry.\n @notice Users can allow specific EIP-2771 forwarders to forward meta-transactions on their behalf, per target contract.\n @dev This contract should be deployed uniquely per network, in a non-upgradeable way."},"fullyImplemented":true,"id":13080,"linearizedBaseContracts":[13080,13370,13386],"name":"ForwarderRegistry","nameLocation":"730:17:74","nodeType":"ContractDefinition","nodes":[{"global":false,"id":12620,"libraryName":{"id":12618,"name":"Address","nameLocations":["792:7:74"],"nodeType":"IdentifierPath","referencedDeclaration":1176,"src":"792:7:74"},"nodeType":"UsingForDirective","src":"786:26:74","typeName":{"id":12619,"name":"address","nodeType":"ElementaryTypeName","src":"804:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":12623,"libraryName":{"id":12621,"name":"ECDSA","nameLocations":["823:5:74"],"nodeType":"IdentifierPath","referencedDeclaration":3223,"src":"823:5:74"},"nodeType":"UsingForDirective","src":"817:24:74","typeName":{"id":12622,"name":"bytes32","nodeType":"ElementaryTypeName","src":"833:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"canonicalName":"ForwarderRegistry.Forwarder","id":12628,"members":[{"constant":false,"id":12625,"mutability":"mutable","name":"nonce","nameLocation":"882:5:74","nodeType":"VariableDeclaration","scope":12628,"src":"874:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"},"typeName":{"id":12624,"name":"uint248","nodeType":"ElementaryTypeName","src":"874:7:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"visibility":"internal"},{"constant":false,"id":12627,"mutability":"mutable","name":"approved","nameLocation":"902:8:74","nodeType":"VariableDeclaration","scope":12628,"src":"897:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12626,"name":"bool","nodeType":"ElementaryTypeName","src":"897:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"name":"Forwarder","nameLocation":"854:9:74","nodeType":"StructDefinition","scope":13080,"src":"847:70:74","visibility":"public"},{"errorSelector":"865e4ca9","id":12636,"name":"ForwarderNotApproved","nameLocation":"929:20:74","nodeType":"ErrorDefinition","parameters":{"id":12635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12630,"mutability":"mutable","name":"sender","nameLocation":"958:6:74","nodeType":"VariableDeclaration","scope":12636,"src":"950:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12629,"name":"address","nodeType":"ElementaryTypeName","src":"950:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12632,"mutability":"mutable","name":"forwarder","nameLocation":"974:9:74","nodeType":"VariableDeclaration","scope":12636,"src":"966:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12631,"name":"address","nodeType":"ElementaryTypeName","src":"966:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12634,"mutability":"mutable","name":"target","nameLocation":"993:6:74","nodeType":"VariableDeclaration","scope":12636,"src":"985:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12633,"name":"address","nodeType":"ElementaryTypeName","src":"985:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"949:51:74"},"src":"923:78:74"},{"errorSelector":"5d52cbe3","id":12638,"name":"InvalidEIP1271Signature","nameLocation":"1012:23:74","nodeType":"ErrorDefinition","parameters":{"id":12637,"nodeType":"ParameterList","parameters":[],"src":"1035:2:74"},"src":"1006:32:74"},{"errorSelector":"a7932e6a","id":12640,"name":"WrongSigner","nameLocation":"1049:11:74","nodeType":"ErrorDefinition","parameters":{"id":12639,"nodeType":"ParameterList","parameters":[],"src":"1060:2:74"},"src":"1043:20:74"},{"constant":true,"id":12643,"mutability":"constant","name":"EIP1271_MAGICVALUE","nameLocation":"1093:18:74","nodeType":"VariableDeclaration","scope":13080,"src":"1069:55:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":12641,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1069:6:74","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"hexValue":"30783136323662613765","id":12642,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1114:10:74","typeDescriptions":{"typeIdentifier":"t_rational_371636862_by_1","typeString":"int_const 371636862"},"value":"0x1626ba7e"},"visibility":"private"},{"constant":true,"id":12648,"mutability":"constant","name":"EIP712_DOMAIN_NAME","nameLocation":"1155:18:74","nodeType":"VariableDeclaration","scope":13080,"src":"1130:76:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12644,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1130:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"hexValue":"466f727761726465725265676973747279","id":12646,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1186:19:74","typeDescriptions":{"typeIdentifier":"t_stringliteral_06a520fda4ca688235391b02e357c6a65eb2a3bb40a69c0199f3f7f9cccee041","typeString":"literal_string \"ForwarderRegistry\""},"value":"ForwarderRegistry"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_06a520fda4ca688235391b02e357c6a65eb2a3bb40a69c0199f3f7f9cccee041","typeString":"literal_string \"ForwarderRegistry\""}],"id":12645,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1176:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12647,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1176:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"private"},{"constant":true,"id":12653,"mutability":"constant","name":"APPROVAL_TYPEHASH","nameLocation":"1237:17:74","nodeType":"VariableDeclaration","scope":13080,"src":"1212:160:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12649,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1212:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"hexValue":"466f72776172646572417070726f76616c28616464726573732073656e6465722c6164647265737320666f727761726465722c61646472657373207461726765742c626f6f6c20617070726f7665642c75696e74323536206e6f6e636529","id":12651,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1275:96:74","typeDescriptions":{"typeIdentifier":"t_stringliteral_1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d284","typeString":"literal_string \"ForwarderApproval(address sender,address forwarder,address target,bool approved,uint256 nonce)\""},"value":"ForwarderApproval(address sender,address forwarder,address target,bool approved,uint256 nonce)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d284","typeString":"literal_string \"ForwarderApproval(address sender,address forwarder,address target,bool approved,uint256 nonce)\""}],"id":12650,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1265:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12652,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1265:107:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"private"},{"constant":false,"id":12662,"mutability":"mutable","name":"_forwarders","nameLocation":"1507:11:74","nodeType":"VariableDeclaration","scope":13080,"src":"1429:89:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder)))"},"typeName":{"id":12661,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":12654,"name":"address","nodeType":"ElementaryTypeName","src":"1437:7:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1429:69:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder)))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":12660,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":12655,"name":"address","nodeType":"ElementaryTypeName","src":"1456:7:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1448:49:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":12659,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":12656,"name":"address","nodeType":"ElementaryTypeName","src":"1475:7:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1467:29:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":12658,"nodeType":"UserDefinedTypeName","pathNode":{"id":12657,"name":"Forwarder","nameLocations":["1486:9:74"],"nodeType":"IdentifierPath","referencedDeclaration":12628,"src":"1486:9:74"},"referencedDeclaration":12628,"src":"1486:9:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"}}}}},"visibility":"private"},{"constant":false,"id":12664,"mutability":"immutable","name":"_DEPLOYMENT_CHAIN_ID","nameLocation":"1551:20:74","nodeType":"VariableDeclaration","scope":13080,"src":"1525:46:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12663,"name":"uint256","nodeType":"ElementaryTypeName","src":"1525:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"constant":false,"id":12666,"mutability":"immutable","name":"_DEPLOYMENT_DOMAIN_SEPARATOR","nameLocation":"1603:28:74","nodeType":"VariableDeclaration","scope":13080,"src":"1577:54:74","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12665,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1577:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"private"},{"anonymous":false,"documentation":{"id":12667,"nodeType":"StructuredDocumentation","src":"1638:452:74","text":"@notice Emitted when a forwarder is approved or disapproved.\n @param sender The account for which `forwarder` is approved or disapproved.\n @param forwarder The account approved or disapproved as forwarder.\n @param target The target contract approved or disapproved as forwarder.\n @param approved True for an approval, false for a disapproval.\n @param nonce The `sender`'s account nonce before the approval change."},"eventSelector":"61036a3baab62925c6646f1eb84438957e2f9b3c52d084e099f955e04788b048","id":12679,"name":"ForwarderApproval","nameLocation":"2101:17:74","nodeType":"EventDefinition","parameters":{"id":12678,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12669,"indexed":true,"mutability":"mutable","name":"sender","nameLocation":"2135:6:74","nodeType":"VariableDeclaration","scope":12679,"src":"2119:22:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12668,"name":"address","nodeType":"ElementaryTypeName","src":"2119:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12671,"indexed":true,"mutability":"mutable","name":"forwarder","nameLocation":"2159:9:74","nodeType":"VariableDeclaration","scope":12679,"src":"2143:25:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12670,"name":"address","nodeType":"ElementaryTypeName","src":"2143:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12673,"indexed":true,"mutability":"mutable","name":"target","nameLocation":"2186:6:74","nodeType":"VariableDeclaration","scope":12679,"src":"2170:22:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12672,"name":"address","nodeType":"ElementaryTypeName","src":"2170:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12675,"indexed":false,"mutability":"mutable","name":"approved","nameLocation":"2199:8:74","nodeType":"VariableDeclaration","scope":12679,"src":"2194:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12674,"name":"bool","nodeType":"ElementaryTypeName","src":"2194:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":12677,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"2217:5:74","nodeType":"VariableDeclaration","scope":12679,"src":"2209:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12676,"name":"uint256","nodeType":"ElementaryTypeName","src":"2209:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2118:105:74"},"src":"2095:129:74"},{"body":{"id":12696,"nodeType":"Block","src":"2244:209:74","statements":[{"assignments":[12683],"declarations":[{"constant":false,"id":12683,"mutability":"mutable","name":"chainId","nameLocation":"2262:7:74","nodeType":"VariableDeclaration","scope":12696,"src":"2254:15:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12682,"name":"uint256","nodeType":"ElementaryTypeName","src":"2254:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12684,"nodeType":"VariableDeclarationStatement","src":"2254:15:74"},{"AST":{"nativeSrc":"2288:44:74","nodeType":"YulBlock","src":"2288:44:74","statements":[{"nativeSrc":"2302:20:74","nodeType":"YulAssignment","src":"2302:20:74","value":{"arguments":[],"functionName":{"name":"chainid","nativeSrc":"2313:7:74","nodeType":"YulIdentifier","src":"2313:7:74"},"nativeSrc":"2313:9:74","nodeType":"YulFunctionCall","src":"2313:9:74"},"variableNames":[{"name":"chainId","nativeSrc":"2302:7:74","nodeType":"YulIdentifier","src":"2302:7:74"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":12683,"isOffset":false,"isSlot":false,"src":"2302:7:74","valueSize":1}],"id":12685,"nodeType":"InlineAssembly","src":"2279:53:74"},{"expression":{"id":12688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12686,"name":"_DEPLOYMENT_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12664,"src":"2341:20:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":12687,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12683,"src":"2364:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2341:30:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":12689,"nodeType":"ExpressionStatement","src":"2341:30:74"},{"expression":{"id":12694,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":12690,"name":"_DEPLOYMENT_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12666,"src":"2381:28:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":12692,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12683,"src":"2438:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12691,"name":"_calculateDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13079,"src":"2412:25:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) view returns (bytes32)"}},"id":12693,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2412:34:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2381:65:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":12695,"nodeType":"ExpressionStatement","src":"2381:65:74"}]},"id":12697,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":12680,"nodeType":"ParameterList","parameters":[],"src":"2241:2:74"},"returnParameters":{"id":12681,"nodeType":"ParameterList","parameters":[],"src":"2244:0:74"},"scope":13080,"src":"2230:223:74","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12730,"nodeType":"Block","src":"2745:201:74","statements":[{"assignments":[12709],"declarations":[{"constant":false,"id":12709,"mutability":"mutable","name":"forwarderData","nameLocation":"2773:13:74","nodeType":"VariableDeclaration","scope":12730,"src":"2755:31:74","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"},"typeName":{"id":12708,"nodeType":"UserDefinedTypeName","pathNode":{"id":12707,"name":"Forwarder","nameLocations":["2755:9:74"],"nodeType":"IdentifierPath","referencedDeclaration":12628,"src":"2755:9:74"},"referencedDeclaration":12628,"src":"2755:9:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"}},"visibility":"internal"}],"id":12718,"initialValue":{"baseExpression":{"baseExpression":{"baseExpression":{"id":12710,"name":"_forwarders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12662,"src":"2789:11:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref)))"}},"id":12713,"indexExpression":{"expression":{"id":12711,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2801:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2805:6:74","memberName":"sender","nodeType":"MemberAccess","src":"2801:10:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2789:23:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref))"}},"id":12715,"indexExpression":{"id":12714,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12700,"src":"2813:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2789:34:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder storage ref)"}},"id":12717,"indexExpression":{"id":12716,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12702,"src":"2824:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2789:42:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage","typeString":"struct ForwarderRegistry.Forwarder storage ref"}},"nodeType":"VariableDeclarationStatement","src":"2755:76:74"},{"expression":{"arguments":[{"id":12720,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12709,"src":"2863:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},{"expression":{"id":12721,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2878:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12722,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2882:6:74","memberName":"sender","nodeType":"MemberAccess","src":"2878:10:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12723,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12700,"src":"2890:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12724,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12702,"src":"2901:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12725,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12704,"src":"2909:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"expression":{"id":12726,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12709,"src":"2919:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},"id":12727,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2933:5:74","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":12625,"src":"2919:19:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint248","typeString":"uint248"}],"id":12719,"name":"_setForwarderApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13056,"src":"2841:21:74","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Forwarder_$12628_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_bool_$_t_uint256_$returns$__$","typeString":"function (struct ForwarderRegistry.Forwarder storage pointer,address,address,address,bool,uint256)"}},"id":12728,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2841:98:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12729,"nodeType":"ExpressionStatement","src":"2841:98:74"}]},"documentation":{"id":12698,"nodeType":"StructuredDocumentation","src":"2459:192:74","text":"@notice Approves or disapproves a forwarder for the sender.\n @dev Emits a {ForwarderApproval} event.\n @param forwarder The address of the forwarder to change the approval of."},"functionSelector":"953135f5","id":12731,"implemented":true,"kind":"function","modifiers":[],"name":"setForwarderApproval","nameLocation":"2665:20:74","nodeType":"FunctionDefinition","parameters":{"id":12705,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12700,"mutability":"mutable","name":"forwarder","nameLocation":"2694:9:74","nodeType":"VariableDeclaration","scope":12731,"src":"2686:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12699,"name":"address","nodeType":"ElementaryTypeName","src":"2686:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12702,"mutability":"mutable","name":"target","nameLocation":"2713:6:74","nodeType":"VariableDeclaration","scope":12731,"src":"2705:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12701,"name":"address","nodeType":"ElementaryTypeName","src":"2705:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12704,"mutability":"mutable","name":"approved","nameLocation":"2726:8:74","nodeType":"VariableDeclaration","scope":12731,"src":"2721:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12703,"name":"bool","nodeType":"ElementaryTypeName","src":"2721:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2685:50:74"},"returnParameters":{"id":12706,"nodeType":"ParameterList","parameters":[],"src":"2745:0:74"},"scope":13080,"src":"2656:290:74","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":12782,"nodeType":"Block","src":"4017:332:74","statements":[{"assignments":[12749],"declarations":[{"constant":false,"id":12749,"mutability":"mutable","name":"forwarderData","nameLocation":"4045:13:74","nodeType":"VariableDeclaration","scope":12782,"src":"4027:31:74","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"},"typeName":{"id":12748,"nodeType":"UserDefinedTypeName","pathNode":{"id":12747,"name":"Forwarder","nameLocations":["4027:9:74"],"nodeType":"IdentifierPath","referencedDeclaration":12628,"src":"4027:9:74"},"referencedDeclaration":12628,"src":"4027:9:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"}},"visibility":"internal"}],"id":12757,"initialValue":{"baseExpression":{"baseExpression":{"baseExpression":{"id":12750,"name":"_forwarders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12662,"src":"4061:11:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref)))"}},"id":12752,"indexExpression":{"id":12751,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12734,"src":"4073:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4061:19:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref))"}},"id":12754,"indexExpression":{"id":12753,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12736,"src":"4081:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4061:30:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder storage ref)"}},"id":12756,"indexExpression":{"id":12755,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12738,"src":"4092:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4061:38:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage","typeString":"struct ForwarderRegistry.Forwarder storage ref"}},"nodeType":"VariableDeclarationStatement","src":"4027:72:74"},{"assignments":[12759],"declarations":[{"constant":false,"id":12759,"mutability":"mutable","name":"nonce","nameLocation":"4117:5:74","nodeType":"VariableDeclaration","scope":12782,"src":"4109:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12758,"name":"uint256","nodeType":"ElementaryTypeName","src":"4109:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12762,"initialValue":{"expression":{"id":12760,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12749,"src":"4125:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},"id":12761,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4139:5:74","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":12625,"src":"4125:19:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"nodeType":"VariableDeclarationStatement","src":"4109:35:74"},{"expression":{"arguments":[{"id":12764,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12734,"src":"4178:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12765,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12736,"src":"4186:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12766,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12738,"src":"4197:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12767,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12740,"src":"4205:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":12768,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12759,"src":"4215:5:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":12769,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12742,"src":"4222:9:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":12770,"name":"isEIP1271Signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12744,"src":"4233:18:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":12763,"name":"_requireValidSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13013,"src":"4155:22:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$_t_address_$_t_bool_$_t_uint256_$_t_bytes_calldata_ptr_$_t_bool_$returns$__$","typeString":"function (address,address,address,bool,uint256,bytes calldata,bool) view"}},"id":12771,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4155:97:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12772,"nodeType":"ExpressionStatement","src":"4155:97:74"},{"expression":{"arguments":[{"id":12774,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12749,"src":"4284:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},{"id":12775,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12734,"src":"4299:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12776,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12736,"src":"4307:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12777,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12738,"src":"4318:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12778,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12740,"src":"4326:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":12779,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12759,"src":"4336:5:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12773,"name":"_setForwarderApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13056,"src":"4262:21:74","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Forwarder_$12628_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_bool_$_t_uint256_$returns$__$","typeString":"function (struct ForwarderRegistry.Forwarder storage pointer,address,address,address,bool,uint256)"}},"id":12780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4262:80:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12781,"nodeType":"ExpressionStatement","src":"4262:80:74"}]},"documentation":{"id":12732,"nodeType":"StructuredDocumentation","src":"2952:852:74","text":"@notice Approves or disapproves a forwarder using a signature.\n @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\n @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\n @dev Emits a {ForwarderApproval} event.\n @param sender The address which signed the approval of the approval.\n @param forwarder The address of the forwarder to change the approval of.\n @param target The target contract to change the approval of.\n @param approved Whether to approve or disapprove the forwarder.\n @param signature Signature by `sender` for approving forwarder.\n @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271."},"functionSelector":"0c695d17","id":12783,"implemented":true,"kind":"function","modifiers":[],"name":"setForwarderApproval","nameLocation":"3818:20:74","nodeType":"FunctionDefinition","parameters":{"id":12745,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12734,"mutability":"mutable","name":"sender","nameLocation":"3856:6:74","nodeType":"VariableDeclaration","scope":12783,"src":"3848:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12733,"name":"address","nodeType":"ElementaryTypeName","src":"3848:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12736,"mutability":"mutable","name":"forwarder","nameLocation":"3880:9:74","nodeType":"VariableDeclaration","scope":12783,"src":"3872:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12735,"name":"address","nodeType":"ElementaryTypeName","src":"3872:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12738,"mutability":"mutable","name":"target","nameLocation":"3907:6:74","nodeType":"VariableDeclaration","scope":12783,"src":"3899:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12737,"name":"address","nodeType":"ElementaryTypeName","src":"3899:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12740,"mutability":"mutable","name":"approved","nameLocation":"3928:8:74","nodeType":"VariableDeclaration","scope":12783,"src":"3923:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12739,"name":"bool","nodeType":"ElementaryTypeName","src":"3923:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":12742,"mutability":"mutable","name":"signature","nameLocation":"3961:9:74","nodeType":"VariableDeclaration","scope":12783,"src":"3946:24:74","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12741,"name":"bytes","nodeType":"ElementaryTypeName","src":"3946:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12744,"mutability":"mutable","name":"isEIP1271Signature","nameLocation":"3985:18:74","nodeType":"VariableDeclaration","scope":12783,"src":"3980:23:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12743,"name":"bool","nodeType":"ElementaryTypeName","src":"3980:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3838:171:74"},"returnParameters":{"id":12746,"nodeType":"ParameterList","parameters":[],"src":"4017:0:74"},"scope":13080,"src":"3809:540:74","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":12827,"nodeType":"Block","src":"4819:262:74","statements":[{"assignments":[12792],"declarations":[{"constant":false,"id":12792,"mutability":"mutable","name":"sender","nameLocation":"4837:6:74","nodeType":"VariableDeclaration","scope":12827,"src":"4829:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12791,"name":"address","nodeType":"ElementaryTypeName","src":"4829:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12796,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12793,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"4846:15:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2771Calldata_$13415_$","typeString":"type(library ERC2771Calldata)"}},"id":12794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4862:9:74","memberName":"msgSender","nodeType":"MemberAccess","referencedDeclaration":13397,"src":"4846:25:74","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_address_$","typeString":"function () pure returns (address)"}},"id":12795,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4846:27:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4829:44:74"},{"condition":{"id":12806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4887:49:74","subExpression":{"expression":{"baseExpression":{"baseExpression":{"baseExpression":{"id":12797,"name":"_forwarders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12662,"src":"4888:11:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref)))"}},"id":12799,"indexExpression":{"id":12798,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12792,"src":"4900:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4888:19:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref))"}},"id":12802,"indexExpression":{"expression":{"id":12800,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4908:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4912:6:74","memberName":"sender","nodeType":"MemberAccess","src":"4908:10:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4888:31:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder storage ref)"}},"id":12804,"indexExpression":{"id":12803,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12786,"src":"4920:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4888:39:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage","typeString":"struct ForwarderRegistry.Forwarder storage ref"}},"id":12805,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4928:8:74","memberName":"approved","nodeType":"MemberAccess","referencedDeclaration":12627,"src":"4888:48:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12814,"nodeType":"IfStatement","src":"4883:110:74","trueBody":{"errorCall":{"arguments":[{"id":12808,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12792,"src":"4966:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":12809,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4974:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4978:6:74","memberName":"sender","nodeType":"MemberAccess","src":"4974:10:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12811,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12786,"src":"4986:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":12807,"name":"ForwarderNotApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12636,"src":"4945:20:74","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address,address) pure returns (error)"}},"id":12812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4945:48:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12813,"nodeType":"RevertStatement","src":"4938:55:74"}},{"expression":{"arguments":[{"arguments":[{"id":12820,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12788,"src":"5049:4:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":12821,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12792,"src":"5055:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":12818,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5032:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12819,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5036:12:74","memberName":"encodePacked","nodeType":"MemberAccess","src":"5032:16:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5032:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":12823,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5064:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5068:5:74","memberName":"value","nodeType":"MemberAccess","src":"5064:9:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12815,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12786,"src":"5003:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":12817,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5010:21:74","memberName":"functionCallWithValue","nodeType":"MemberAccess","referencedDeclaration":1041,"src":"5003:28:74","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$attached_to$_t_address_$","typeString":"function (address,bytes memory,uint256) returns (bytes memory)"}},"id":12825,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5003:71:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":12826,"nodeType":"ExpressionStatement","src":"5003:71:74"}]},"documentation":{"id":12784,"nodeType":"StructuredDocumentation","src":"4355:388:74","text":"@notice Forwards the meta-transaction using EIP-2771.\n @dev Reverts with {ForwarderNotApproved} if the caller has not been previously approved as a forwarder by the sender.\n @param target The destination of the call (that will receive the meta-transaction).\n @param data The content of the call (the `sender` address will be appended to it according to EIP-2771)."},"functionSelector":"6fadcf72","id":12828,"implemented":true,"kind":"function","modifiers":[],"name":"forward","nameLocation":"4757:7:74","nodeType":"FunctionDefinition","parameters":{"id":12789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12786,"mutability":"mutable","name":"target","nameLocation":"4773:6:74","nodeType":"VariableDeclaration","scope":12828,"src":"4765:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12785,"name":"address","nodeType":"ElementaryTypeName","src":"4765:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12788,"mutability":"mutable","name":"data","nameLocation":"4796:4:74","nodeType":"VariableDeclaration","scope":12828,"src":"4781:19:74","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12787,"name":"bytes","nodeType":"ElementaryTypeName","src":"4781:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4764:37:74"},"returnParameters":{"id":12790,"nodeType":"ParameterList","parameters":[],"src":"4819:0:74"},"scope":13080,"src":"4748:333:74","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":12868,"nodeType":"Block","src":"6004:237:74","statements":[{"assignments":[12841],"declarations":[{"constant":false,"id":12841,"mutability":"mutable","name":"sender","nameLocation":"6022:6:74","nodeType":"VariableDeclaration","scope":12868,"src":"6014:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12840,"name":"address","nodeType":"ElementaryTypeName","src":"6014:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":12845,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":12842,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"6031:15:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2771Calldata_$13415_$","typeString":"type(library ERC2771Calldata)"}},"id":12843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6047:9:74","memberName":"msgSender","nodeType":"MemberAccess","referencedDeclaration":13397,"src":"6031:25:74","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_address_$","typeString":"function () pure returns (address)"}},"id":12844,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6031:27:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6014:44:74"},{"expression":{"arguments":[{"id":12847,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12841,"src":"6089:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":12848,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6097:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6101:6:74","memberName":"sender","nodeType":"MemberAccess","src":"6097:10:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12850,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12835,"src":"6109:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"74727565","id":12851,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6117:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},{"id":12852,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12831,"src":"6123:9:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":12853,"name":"isEIP1271Signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12833,"src":"6134:18:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":12846,"name":"setForwarderApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12783,"src":"6068:20:74","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_bool_$_t_bytes_calldata_ptr_$_t_bool_$returns$__$","typeString":"function (address,address,address,bool,bytes calldata,bool)"}},"id":12854,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6068:85:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":12855,"nodeType":"ExpressionStatement","src":"6068:85:74"},{"expression":{"arguments":[{"arguments":[{"id":12861,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12837,"src":"6209:4:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":12862,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12841,"src":"6215:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":12859,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6192:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12860,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6196:12:74","memberName":"encodePacked","nodeType":"MemberAccess","src":"6192:16:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12863,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6192:30:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":12864,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6224:3:74","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":12865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6228:5:74","memberName":"value","nodeType":"MemberAccess","src":"6224:9:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12856,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12835,"src":"6163:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":12858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6170:21:74","memberName":"functionCallWithValue","nodeType":"MemberAccess","referencedDeclaration":1041,"src":"6163:28:74","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$attached_to$_t_address_$","typeString":"function (address,bytes memory,uint256) returns (bytes memory)"}},"id":12866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6163:71:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":12867,"nodeType":"ExpressionStatement","src":"6163:71:74"}]},"documentation":{"id":12829,"nodeType":"StructuredDocumentation","src":"5087:780:74","text":"@notice Approves the forwarder and forwards the meta-transaction using EIP-2771.\n @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\n @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\n @dev Emits a {ForwarderApproval} event.\n @param signature Signature by `sender` for approving the forwarder.\n @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271.\n @param target The destination of the call (that will receive the meta-transaction).\n @param data The content of the call (the `sender` address will be appended to it according to EIP-2771)."},"functionSelector":"9438f7f3","id":12869,"implemented":true,"kind":"function","modifiers":[],"name":"approveAndForward","nameLocation":"5881:17:74","nodeType":"FunctionDefinition","parameters":{"id":12838,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12831,"mutability":"mutable","name":"signature","nameLocation":"5914:9:74","nodeType":"VariableDeclaration","scope":12869,"src":"5899:24:74","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12830,"name":"bytes","nodeType":"ElementaryTypeName","src":"5899:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12833,"mutability":"mutable","name":"isEIP1271Signature","nameLocation":"5930:18:74","nodeType":"VariableDeclaration","scope":12869,"src":"5925:23:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12832,"name":"bool","nodeType":"ElementaryTypeName","src":"5925:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":12835,"mutability":"mutable","name":"target","nameLocation":"5958:6:74","nodeType":"VariableDeclaration","scope":12869,"src":"5950:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12834,"name":"address","nodeType":"ElementaryTypeName","src":"5950:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12837,"mutability":"mutable","name":"data","nameLocation":"5981:4:74","nodeType":"VariableDeclaration","scope":12869,"src":"5966:19:74","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12836,"name":"bytes","nodeType":"ElementaryTypeName","src":"5966:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5898:88:74"},"returnParameters":{"id":12839,"nodeType":"ParameterList","parameters":[],"src":"6004:0:74"},"scope":13080,"src":"5872:369:74","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":12888,"nodeType":"Block","src":"6490:330:74","statements":[{"assignments":[12876],"declarations":[{"constant":false,"id":12876,"mutability":"mutable","name":"chainId","nameLocation":"6508:7:74","nodeType":"VariableDeclaration","scope":12888,"src":"6500:15:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12875,"name":"uint256","nodeType":"ElementaryTypeName","src":"6500:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":12877,"nodeType":"VariableDeclarationStatement","src":"6500:15:74"},{"AST":{"nativeSrc":"6534:44:74","nodeType":"YulBlock","src":"6534:44:74","statements":[{"nativeSrc":"6548:20:74","nodeType":"YulAssignment","src":"6548:20:74","value":{"arguments":[],"functionName":{"name":"chainid","nativeSrc":"6559:7:74","nodeType":"YulIdentifier","src":"6559:7:74"},"nativeSrc":"6559:9:74","nodeType":"YulFunctionCall","src":"6559:9:74"},"variableNames":[{"name":"chainId","nativeSrc":"6548:7:74","nodeType":"YulIdentifier","src":"6548:7:74"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":12876,"isOffset":false,"isSlot":false,"src":"6548:7:74","valueSize":1}],"id":12878,"nodeType":"InlineAssembly","src":"6525:53:74"},{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":12881,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":12879,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12876,"src":"6714:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":12880,"name":"_DEPLOYMENT_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12664,"src":"6725:20:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6714:31:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[{"id":12884,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12876,"src":"6805:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":12883,"name":"_calculateDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13079,"src":"6779:25:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) view returns (bytes32)"}},"id":12885,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6779:34:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":12886,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"6714:99:74","trueExpression":{"id":12882,"name":"_DEPLOYMENT_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12666,"src":"6748:28:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":12874,"id":12887,"nodeType":"Return","src":"6707:106:74"}]},"documentation":{"id":12870,"nodeType":"StructuredDocumentation","src":"6247:111:74","text":"@notice Returns the EIP-712 DOMAIN_SEPARATOR.\n @return domainSeparator The EIP-712 domain separator."},"functionSelector":"3644e515","id":12889,"implemented":true,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"6425:16:74","nodeType":"FunctionDefinition","parameters":{"id":12871,"nodeType":"ParameterList","parameters":[],"src":"6441:2:74"},"returnParameters":{"id":12874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12873,"mutability":"mutable","name":"domainSeparator","nameLocation":"6473:15:74","nodeType":"VariableDeclaration","scope":12889,"src":"6465:23:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":12872,"name":"bytes32","nodeType":"ElementaryTypeName","src":"6465:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"6464:25:74"},"scope":13080,"src":"6416:404:74","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":12910,"nodeType":"Block","src":"7221:68:74","statements":[{"expression":{"expression":{"baseExpression":{"baseExpression":{"baseExpression":{"id":12901,"name":"_forwarders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12662,"src":"7238:11:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref)))"}},"id":12903,"indexExpression":{"id":12902,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12892,"src":"7250:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7238:19:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref))"}},"id":12905,"indexExpression":{"id":12904,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12894,"src":"7258:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7238:30:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder storage ref)"}},"id":12907,"indexExpression":{"id":12906,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12896,"src":"7269:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7238:38:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage","typeString":"struct ForwarderRegistry.Forwarder storage ref"}},"id":12908,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7277:5:74","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":12625,"src":"7238:44:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"functionReturnParameters":12900,"id":12909,"nodeType":"Return","src":"7231:51:74"}]},"documentation":{"id":12890,"nodeType":"StructuredDocumentation","src":"6826:283:74","text":"@notice Gets the current nonce for the sender/forwarder pair.\n @param sender The sender account.\n @param forwarder The forwarder account.\n @param target The target contract.\n @return nonce The current nonce for the `sender`/`forwarder`/`target` tuple."},"functionSelector":"ae3c8c2d","id":12911,"implemented":true,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"7123:8:74","nodeType":"FunctionDefinition","parameters":{"id":12897,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12892,"mutability":"mutable","name":"sender","nameLocation":"7140:6:74","nodeType":"VariableDeclaration","scope":12911,"src":"7132:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12891,"name":"address","nodeType":"ElementaryTypeName","src":"7132:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12894,"mutability":"mutable","name":"forwarder","nameLocation":"7156:9:74","nodeType":"VariableDeclaration","scope":12911,"src":"7148:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12893,"name":"address","nodeType":"ElementaryTypeName","src":"7148:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12896,"mutability":"mutable","name":"target","nameLocation":"7175:6:74","nodeType":"VariableDeclaration","scope":12911,"src":"7167:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12895,"name":"address","nodeType":"ElementaryTypeName","src":"7167:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7131:51:74"},"returnParameters":{"id":12900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12899,"mutability":"mutable","name":"nonce","nameLocation":"7214:5:74","nodeType":"VariableDeclaration","scope":12911,"src":"7206:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12898,"name":"uint256","nodeType":"ElementaryTypeName","src":"7206:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7205:15:74"},"scope":13080,"src":"7114:175:74","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13385],"body":{"id":12932,"nodeType":"Block","src":"7443:71:74","statements":[{"expression":{"expression":{"baseExpression":{"baseExpression":{"baseExpression":{"id":12923,"name":"_forwarders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12662,"src":"7460:11:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$_$","typeString":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref)))"}},"id":12925,"indexExpression":{"id":12924,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12914,"src":"7472:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7460:19:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$_$","typeString":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder storage ref))"}},"id":12927,"indexExpression":{"id":12926,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12916,"src":"7480:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7460:30:74","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_struct$_Forwarder_$12628_storage_$","typeString":"mapping(address => struct ForwarderRegistry.Forwarder storage ref)"}},"id":12929,"indexExpression":{"id":12928,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12918,"src":"7491:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7460:38:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage","typeString":"struct ForwarderRegistry.Forwarder storage ref"}},"id":12930,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7499:8:74","memberName":"approved","nodeType":"MemberAccess","referencedDeclaration":12627,"src":"7460:47:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":12922,"id":12931,"nodeType":"Return","src":"7453:54:74"}]},"documentation":{"id":12912,"nodeType":"StructuredDocumentation","src":"7295:34:74","text":"@inheritdoc IForwarderRegistry"},"functionSelector":"019a2028","id":12933,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForwarder","nameLocation":"7343:19:74","nodeType":"FunctionDefinition","parameters":{"id":12919,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12914,"mutability":"mutable","name":"sender","nameLocation":"7371:6:74","nodeType":"VariableDeclaration","scope":12933,"src":"7363:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12913,"name":"address","nodeType":"ElementaryTypeName","src":"7363:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12916,"mutability":"mutable","name":"forwarder","nameLocation":"7387:9:74","nodeType":"VariableDeclaration","scope":12933,"src":"7379:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12915,"name":"address","nodeType":"ElementaryTypeName","src":"7379:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12918,"mutability":"mutable","name":"target","nameLocation":"7406:6:74","nodeType":"VariableDeclaration","scope":12933,"src":"7398:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12917,"name":"address","nodeType":"ElementaryTypeName","src":"7398:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7362:51:74"},"returnParameters":{"id":12922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12921,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12933,"src":"7437:4:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12920,"name":"bool","nodeType":"ElementaryTypeName","src":"7437:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7436:6:74"},"scope":13080,"src":"7334:180:74","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13369],"body":{"id":12943,"nodeType":"Block","src":"7615:28:74","statements":[{"expression":{"hexValue":"74727565","id":12941,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7632:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":12940,"id":12942,"nodeType":"Return","src":"7625:11:74"}]},"documentation":{"id":12934,"nodeType":"StructuredDocumentation","src":"7520:24:74","text":"@inheritdoc IERC2771"},"functionSelector":"572b6c05","id":12944,"implemented":true,"kind":"function","modifiers":[],"name":"isTrustedForwarder","nameLocation":"7558:18:74","nodeType":"FunctionDefinition","parameters":{"id":12937,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12936,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12944,"src":"7577:7:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12935,"name":"address","nodeType":"ElementaryTypeName","src":"7577:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"7576:9:74"},"returnParameters":{"id":12940,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12939,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":12944,"src":"7609:4:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12938,"name":"bool","nodeType":"ElementaryTypeName","src":"7609:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7608:6:74"},"scope":13080,"src":"7549:94:74","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":13012,"nodeType":"Block","src":"7888:497:74","statements":[{"assignments":[12962],"declarations":[{"constant":false,"id":12962,"mutability":"mutable","name":"data","nameLocation":"7911:4:74","nodeType":"VariableDeclaration","scope":13012,"src":"7898:17:74","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":12961,"name":"bytes","nodeType":"ElementaryTypeName","src":"7898:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":12980,"initialValue":{"arguments":[{"hexValue":"1901","id":12965,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7948:10:74","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"arguments":[],"expression":{"argumentTypes":[],"id":12966,"name":"DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12889,"src":"7972:16:74","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":12967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7972:18:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"id":12971,"name":"APPROVAL_TYPEHASH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12653,"src":"8025:17:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":12972,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12946,"src":"8044:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12973,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12948,"src":"8052:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12974,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12950,"src":"8063:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":12975,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12952,"src":"8071:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":12976,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12954,"src":"8081:5:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":12969,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8014:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12970,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8018:6:74","memberName":"encode","nodeType":"MemberAccess","src":"8014:10:74","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8014:73:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":12968,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8004:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8004:84:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":12963,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"7918:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":12964,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"7922:12:74","memberName":"encodePacked","nodeType":"MemberAccess","src":"7918:16:74","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":12979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7918:180:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"7898:200:74"},{"condition":{"id":12981,"name":"isEIP1271Signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12958,"src":"8112:18:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":13010,"nodeType":"Block","src":"8284:95:74","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":13002,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12956,"src":"8326:9:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[{"id":12999,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12962,"src":"8312:4:74","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":12998,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8302:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":13000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8302:15:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":13001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8318:7:74","memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":2979,"src":"8302:23:74","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$attached_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":13003,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8302:34:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":13004,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12946,"src":"8340:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8302:44:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13009,"nodeType":"IfStatement","src":"8298:70:74","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":13006,"name":"WrongSigner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12640,"src":"8355:11:74","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":13007,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8355:13:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":13008,"nodeType":"RevertStatement","src":"8348:20:74"}}]},"id":13011,"nodeType":"IfStatement","src":"8108:271:74","trueBody":{"id":12997,"nodeType":"Block","src":"8132:146:74","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":12992,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":12987,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12962,"src":"8194:4:74","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":12986,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8184:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":12988,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8184:15:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":12989,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12956,"src":"8201:9:74","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[{"id":12983,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12946,"src":"8159:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":12982,"name":"IERC1271","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9476,"src":"8150:8:74","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1271_$9476_$","typeString":"type(contract IERC1271)"}},"id":12984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8150:16:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1271_$9476","typeString":"contract IERC1271"}},"id":12985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8167:16:74","memberName":"isValidSignature","nodeType":"MemberAccess","referencedDeclaration":9475,"src":"8150:33:74","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (bytes32,bytes memory) view external returns (bytes4)"}},"id":12990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8150:61:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":12991,"name":"EIP1271_MAGICVALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12643,"src":"8215:18:74","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"8150:83:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":12996,"nodeType":"IfStatement","src":"8146:121:74","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":12993,"name":"InvalidEIP1271Signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12638,"src":"8242:23:74","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":12994,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8242:25:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":12995,"nodeType":"RevertStatement","src":"8235:32:74"}}]}}]},"id":13013,"implemented":true,"kind":"function","modifiers":[],"name":"_requireValidSignature","nameLocation":"7658:22:74","nodeType":"FunctionDefinition","parameters":{"id":12959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12946,"mutability":"mutable","name":"sender","nameLocation":"7698:6:74","nodeType":"VariableDeclaration","scope":13013,"src":"7690:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12945,"name":"address","nodeType":"ElementaryTypeName","src":"7690:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12948,"mutability":"mutable","name":"forwarder","nameLocation":"7722:9:74","nodeType":"VariableDeclaration","scope":13013,"src":"7714:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12947,"name":"address","nodeType":"ElementaryTypeName","src":"7714:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12950,"mutability":"mutable","name":"target","nameLocation":"7749:6:74","nodeType":"VariableDeclaration","scope":13013,"src":"7741:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":12949,"name":"address","nodeType":"ElementaryTypeName","src":"7741:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":12952,"mutability":"mutable","name":"approved","nameLocation":"7770:8:74","nodeType":"VariableDeclaration","scope":13013,"src":"7765:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12951,"name":"bool","nodeType":"ElementaryTypeName","src":"7765:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":12954,"mutability":"mutable","name":"nonce","nameLocation":"7796:5:74","nodeType":"VariableDeclaration","scope":13013,"src":"7788:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":12953,"name":"uint256","nodeType":"ElementaryTypeName","src":"7788:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12956,"mutability":"mutable","name":"signature","nameLocation":"7826:9:74","nodeType":"VariableDeclaration","scope":13013,"src":"7811:24:74","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":12955,"name":"bytes","nodeType":"ElementaryTypeName","src":"7811:5:74","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":12958,"mutability":"mutable","name":"isEIP1271Signature","nameLocation":"7850:18:74","nodeType":"VariableDeclaration","scope":13013,"src":"7845:23:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":12957,"name":"bool","nodeType":"ElementaryTypeName","src":"7845:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7680:194:74"},"returnParameters":{"id":12960,"nodeType":"ParameterList","parameters":[],"src":"7888:0:74"},"scope":13080,"src":"7649:736:74","stateMutability":"view","virtual":false,"visibility":"private"},{"body":{"id":13055,"nodeType":"Block","src":"8598:210:74","statements":[{"expression":{"id":13033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":13029,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13016,"src":"8608:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},"id":13031,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"8622:8:74","memberName":"approved","nodeType":"MemberAccess","referencedDeclaration":12627,"src":"8608:22:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13032,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13024,"src":"8633:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"8608:33:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13034,"nodeType":"ExpressionStatement","src":"8608:33:74"},{"id":13046,"nodeType":"UncheckedBlock","src":"8651:75:74","statements":[{"expression":{"id":13044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":13035,"name":"forwarderData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13016,"src":"8675:13:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder storage pointer"}},"id":13037,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"8689:5:74","memberName":"nonce","nodeType":"MemberAccess","referencedDeclaration":12625,"src":"8675:19:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13040,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13026,"src":"8705:5:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":13041,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8713:1:74","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"8705:9:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":13039,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8697:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_uint248_$","typeString":"type(uint248)"},"typeName":{"id":13038,"name":"uint248","nodeType":"ElementaryTypeName","src":"8697:7:74","typeDescriptions":{}}},"id":13043,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8697:18:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"src":"8675:40:74","typeDescriptions":{"typeIdentifier":"t_uint248","typeString":"uint248"}},"id":13045,"nodeType":"ExpressionStatement","src":"8675:40:74"}]},{"eventCall":{"arguments":[{"id":13048,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13018,"src":"8758:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13049,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13020,"src":"8766:9:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13050,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13022,"src":"8777:6:74","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13051,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13024,"src":"8785:8:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":13052,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13026,"src":"8795:5:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":13047,"name":"ForwarderApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12679,"src":"8740:17:74","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_bool_$_t_uint256_$returns$__$","typeString":"function (address,address,address,bool,uint256)"}},"id":13053,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8740:61:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13054,"nodeType":"EmitStatement","src":"8735:66:74"}]},"id":13056,"implemented":true,"kind":"function","modifiers":[],"name":"_setForwarderApproval","nameLocation":"8400:21:74","nodeType":"FunctionDefinition","parameters":{"id":13027,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13016,"mutability":"mutable","name":"forwarderData","nameLocation":"8449:13:74","nodeType":"VariableDeclaration","scope":13056,"src":"8431:31:74","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"},"typeName":{"id":13015,"nodeType":"UserDefinedTypeName","pathNode":{"id":13014,"name":"Forwarder","nameLocations":["8431:9:74"],"nodeType":"IdentifierPath","referencedDeclaration":12628,"src":"8431:9:74"},"referencedDeclaration":12628,"src":"8431:9:74","typeDescriptions":{"typeIdentifier":"t_struct$_Forwarder_$12628_storage_ptr","typeString":"struct ForwarderRegistry.Forwarder"}},"visibility":"internal"},{"constant":false,"id":13018,"mutability":"mutable","name":"sender","nameLocation":"8480:6:74","nodeType":"VariableDeclaration","scope":13056,"src":"8472:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13017,"name":"address","nodeType":"ElementaryTypeName","src":"8472:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13020,"mutability":"mutable","name":"forwarder","nameLocation":"8504:9:74","nodeType":"VariableDeclaration","scope":13056,"src":"8496:17:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13019,"name":"address","nodeType":"ElementaryTypeName","src":"8496:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13022,"mutability":"mutable","name":"target","nameLocation":"8531:6:74","nodeType":"VariableDeclaration","scope":13056,"src":"8523:14:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13021,"name":"address","nodeType":"ElementaryTypeName","src":"8523:7:74","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13024,"mutability":"mutable","name":"approved","nameLocation":"8552:8:74","nodeType":"VariableDeclaration","scope":13056,"src":"8547:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":13023,"name":"bool","nodeType":"ElementaryTypeName","src":"8547:4:74","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":13026,"mutability":"mutable","name":"nonce","nameLocation":"8578:5:74","nodeType":"VariableDeclaration","scope":13056,"src":"8570:13:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13025,"name":"uint256","nodeType":"ElementaryTypeName","src":"8570:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8421:168:74"},"returnParameters":{"id":13028,"nodeType":"ParameterList","parameters":[],"src":"8598:0:74"},"scope":13080,"src":"8391:417:74","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":13078,"nodeType":"Block","src":"8897:311:74","statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429","id":13067,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8995:69:74","typeDescriptions":{"typeIdentifier":"t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866","typeString":"literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""},"value":"EIP712Domain(string name,uint256 chainId,address verifyingContract)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866","typeString":"literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""}],"id":13066,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8985:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":13068,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8985:80:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13069,"name":"EIP712_DOMAIN_NAME","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12648,"src":"9087:18:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13070,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13058,"src":"9127:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":13073,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"9164:4:74","typeDescriptions":{"typeIdentifier":"t_contract$_ForwarderRegistry_$13080","typeString":"contract ForwarderRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ForwarderRegistry_$13080","typeString":"contract ForwarderRegistry"}],"id":13072,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9156:7:74","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13071,"name":"address","nodeType":"ElementaryTypeName","src":"9156:7:74","typeDescriptions":{}}},"id":13074,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9156:13:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13064,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8953:3:74","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":13065,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8957:6:74","memberName":"encode","nodeType":"MemberAccess","src":"8953:10:74","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":13075,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8953:234:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":13063,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"8926:9:74","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":13076,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8926:275:74","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":13062,"id":13077,"nodeType":"Return","src":"8907:294:74"}]},"id":13079,"implemented":true,"kind":"function","modifiers":[],"name":"_calculateDomainSeparator","nameLocation":"8823:25:74","nodeType":"FunctionDefinition","parameters":{"id":13059,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13058,"mutability":"mutable","name":"chainId","nameLocation":"8857:7:74","nodeType":"VariableDeclaration","scope":13079,"src":"8849:15:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":13057,"name":"uint256","nodeType":"ElementaryTypeName","src":"8849:7:74","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8848:17:74"},"returnParameters":{"id":13062,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13061,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13079,"src":"8888:7:74","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13060,"name":"bytes32","nodeType":"ElementaryTypeName","src":"8888:7:74","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"8887:9:74"},"scope":13080,"src":"8814:394:74","stateMutability":"view","virtual":false,"visibility":"private"}],"scope":13081,"src":"721:8489:74","usedErrors":[926,1216,1219,2886,2891,2896,12636,12638,12640],"usedEvents":[12679]}],"src":"32:9179:74"},"id":74},"contracts/metatx/ForwarderRegistryContext.sol":{"ast":{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","exportedSymbols":{"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IERC2771":[13370],"IForwarderRegistry":[13386]},"id":13143,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13082,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:75"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./interfaces/IForwarderRegistry.sol","id":13084,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13143,"sourceUnit":13387,"src":"58:71:75","symbolAliases":[{"foreign":{"id":13083,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"66:18:75","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IERC2771.sol","file":"./interfaces/IERC2771.sol","id":13086,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13143,"sourceUnit":13371,"src":"130:51:75","symbolAliases":[{"foreign":{"id":13085,"name":"IERC2771","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13370,"src":"138:8:75","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./base/ForwarderRegistryContextBase.sol","id":13088,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13143,"sourceUnit":13298,"src":"182:85:75","symbolAliases":[{"foreign":{"id":13087,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"190:28:75","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":13090,"name":"ForwarderRegistryContextBase","nameLocations":["575:28:75"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"575:28:75"},"id":13091,"nodeType":"InheritanceSpecifier","src":"575:28:75"},{"baseName":{"id":13092,"name":"IERC2771","nameLocations":["605:8:75"],"nodeType":"IdentifierPath","referencedDeclaration":13370,"src":"605:8:75"},"id":13093,"nodeType":"InheritanceSpecifier","src":"605:8:75"}],"canonicalName":"ForwarderRegistryContext","contractDependencies":[],"contractKind":"contract","documentation":{"id":13089,"nodeType":"StructuredDocumentation","src":"269:260:75","text":"@title Meta-Transactions Forwarder Registry Context (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\n @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)"},"fullyImplemented":true,"id":13142,"linearizedBaseContracts":[13142,13370,13297],"name":"ForwarderRegistryContext","nameLocation":"547:24:75","nodeType":"ContractDefinition","nodes":[{"body":{"id":13103,"nodeType":"Block","src":"844:2:75","statements":[]},"documentation":{"id":13094,"nodeType":"StructuredDocumentation","src":"620:119:75","text":"@param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions."},"id":13104,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13100,"name":"forwarderRegistry_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13097,"src":"824:18:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13101,"kind":"baseConstructorSpecifier","modifierName":{"id":13099,"name":"ForwarderRegistryContextBase","nameLocations":["795:28:75"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"795:28:75"},"nodeType":"ModifierInvocation","src":"795:48:75"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13098,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13097,"mutability":"mutable","name":"forwarderRegistry_","nameLocation":"775:18:75","nodeType":"VariableDeclaration","scope":13104,"src":"756:37:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13096,"nodeType":"UserDefinedTypeName","pathNode":{"id":13095,"name":"IForwarderRegistry","nameLocations":["756:18:75"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"756:18:75"},"referencedDeclaration":13386,"src":"756:18:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"755:39:75"},"returnParameters":{"id":13102,"nodeType":"ParameterList","parameters":[],"src":"844:0:75"},"scope":13142,"src":"744:102:75","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":13112,"nodeType":"Block","src":"924:43:75","statements":[{"expression":{"id":13110,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"941:19:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"functionReturnParameters":13109,"id":13111,"nodeType":"Return","src":"934:26:75"}]},"functionSelector":"2b4c9f16","id":13113,"implemented":true,"kind":"function","modifiers":[],"name":"forwarderRegistry","nameLocation":"861:17:75","nodeType":"FunctionDefinition","parameters":{"id":13105,"nodeType":"ParameterList","parameters":[],"src":"878:2:75"},"returnParameters":{"id":13109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13108,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13113,"src":"904:18:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13107,"nodeType":"UserDefinedTypeName","pathNode":{"id":13106,"name":"IForwarderRegistry","nameLocations":["904:18:75"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"904:18:75"},"referencedDeclaration":13386,"src":"904:18:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"903:20:75"},"scope":13142,"src":"852:115:75","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13369],"body":{"id":13140,"nodeType":"Block","src":"1086:217:75","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"id":13128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13121,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"1146:19:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13125,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1196:1:75","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13124,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1188:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13123,"name":"address","nodeType":"ElementaryTypeName","src":"1188:7:75","typeDescriptions":{}}},"id":13126,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1188:10:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13122,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"1169:18:75","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IForwarderRegistry_$13386_$","typeString":"type(contract IForwarderRegistry)"}},"id":13127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1169:30:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"1146:53:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13132,"nodeType":"IfStatement","src":"1142:96:75","trueBody":{"id":13131,"nodeType":"Block","src":"1201:37:75","statements":[{"expression":{"hexValue":"66616c7365","id":13129,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1222:5:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":13120,"id":13130,"nodeType":"Return","src":"1215:12:75"}]}},{"expression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13133,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13116,"src":"1255:9:75","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":13136,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"1276:19:75","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}],"id":13135,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1268:7:75","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13134,"name":"address","nodeType":"ElementaryTypeName","src":"1268:7:75","typeDescriptions":{}}},"id":13137,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1268:28:75","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1255:41:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":13120,"id":13139,"nodeType":"Return","src":"1248:48:75"}]},"documentation":{"id":13114,"nodeType":"StructuredDocumentation","src":"973:24:75","text":"@inheritdoc IERC2771"},"functionSelector":"572b6c05","id":13141,"implemented":true,"kind":"function","modifiers":[],"name":"isTrustedForwarder","nameLocation":"1011:18:75","nodeType":"FunctionDefinition","parameters":{"id":13117,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13116,"mutability":"mutable","name":"forwarder","nameLocation":"1038:9:75","nodeType":"VariableDeclaration","scope":13141,"src":"1030:17:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13115,"name":"address","nodeType":"ElementaryTypeName","src":"1030:7:75","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1029:19:75"},"returnParameters":{"id":13120,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13119,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13141,"src":"1080:4:75","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":13118,"name":"bool","nodeType":"ElementaryTypeName","src":"1080:4:75","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1079:6:75"},"scope":13142,"src":"1002:301:75","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":13143,"src":"529:776:75","usedErrors":[],"usedEvents":[]}],"src":"32:1274:75"},"id":75},"contracts/metatx/base/ForwarderRegistryContextBase.sol":{"ast":{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","exportedSymbols":{"ERC2771Calldata":[13415],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":13298,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13144,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:76"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../interfaces/IForwarderRegistry.sol","id":13146,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13298,"sourceUnit":13387,"src":"58:74:76","symbolAliases":[{"foreign":{"id":13145,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"66:18:76","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/libraries/ERC2771Calldata.sol","file":"./../libraries/ERC2771Calldata.sol","id":13148,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13298,"sourceUnit":13416,"src":"133:67:76","symbolAliases":[{"foreign":{"id":13147,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"141:15:76","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"ForwarderRegistryContextBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":13149,"nodeType":"StructuredDocumentation","src":"202:243:76","text":"@title Meta-Transactions Forwarder Registry Context (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)"},"fullyImplemented":true,"id":13297,"linearizedBaseContracts":[13297],"name":"ForwarderRegistryContextBase","nameLocation":"463:28:76","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":13152,"mutability":"immutable","name":"_FORWARDER_REGISTRY","nameLocation":"536:19:76","nodeType":"VariableDeclaration","scope":13297,"src":"498:57:76","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13151,"nodeType":"UserDefinedTypeName","pathNode":{"id":13150,"name":"IForwarderRegistry","nameLocations":["498:18:76"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"498:18:76"},"referencedDeclaration":13386,"src":"498:18:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"},{"body":{"id":13163,"nodeType":"Block","src":"735:56:76","statements":[{"expression":{"id":13161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13159,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"745:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13160,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13156,"src":"767:17:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"745:39:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"id":13162,"nodeType":"ExpressionStatement","src":"745:39:76"}]},"documentation":{"id":13153,"nodeType":"StructuredDocumentation","src":"562:118:76","text":"@param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions."},"id":13164,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13157,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13156,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"716:17:76","nodeType":"VariableDeclaration","scope":13164,"src":"697:36:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13155,"nodeType":"UserDefinedTypeName","pathNode":{"id":13154,"name":"IForwarderRegistry","nameLocations":["697:18:76"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"697:18:76"},"referencedDeclaration":13386,"src":"697:18:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"696:38:76"},"returnParameters":{"id":13158,"nodeType":"ParameterList","parameters":[],"src":"735:0:76"},"scope":13297,"src":"685:106:76","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":13230,"nodeType":"Block","src":"969:855:76","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"id":13177,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13170,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"1029:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13174,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1079:1:76","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13173,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1071:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13172,"name":"address","nodeType":"ElementaryTypeName","src":"1071:7:76","typeDescriptions":{}}},"id":13175,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1071:10:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13171,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"1052:18:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IForwarderRegistry_$13386_$","typeString":"type(contract IForwarderRegistry)"}},"id":13176,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1052:30:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"1029:53:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13182,"nodeType":"IfStatement","src":"1025:101:76","trueBody":{"id":13181,"nodeType":"Block","src":"1084:42:76","statements":[{"expression":{"expression":{"id":13178,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1105:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1109:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1105:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13169,"id":13180,"nodeType":"Return","src":"1098:17:76"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13183,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1327:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1331:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1327:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":13185,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"1341:2:76","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":13186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1344:6:76","memberName":"origin","nodeType":"MemberAccess","src":"1341:9:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1327:23:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13192,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":13188,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1354:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13189,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1358:4:76","memberName":"data","nodeType":"MemberAccess","src":"1354:8:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":13190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1363:6:76","memberName":"length","nodeType":"MemberAccess","src":"1354:15:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3234","id":13191,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1372:2:76","typeDescriptions":{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},"value":"24"},"src":"1354:20:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1327:47:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13198,"nodeType":"IfStatement","src":"1323:95:76","trueBody":{"id":13197,"nodeType":"Block","src":"1376:42:76","statements":[{"expression":{"expression":{"id":13194,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1397:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13195,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1401:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1397:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13169,"id":13196,"nodeType":"Return","src":"1390:17:76"}]}},{"assignments":[13200],"declarations":[{"constant":false,"id":13200,"mutability":"mutable","name":"sender","nameLocation":"1436:6:76","nodeType":"VariableDeclaration","scope":13230,"src":"1428:14:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13199,"name":"address","nodeType":"ElementaryTypeName","src":"1428:7:76","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":13204,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13201,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"1445:15:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2771Calldata_$13415_$","typeString":"type(library ERC2771Calldata)"}},"id":13202,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1461:9:76","memberName":"msgSender","nodeType":"MemberAccess","referencedDeclaration":13397,"src":"1445:25:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_address_$","typeString":"function () pure returns (address)"}},"id":13203,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1445:27:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1428:44:76"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13205,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1630:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13206,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1634:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1630:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":13209,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"1652:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}],"id":13208,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1644:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13207,"name":"address","nodeType":"ElementaryTypeName","src":"1644:7:76","typeDescriptions":{}}},"id":13210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1644:28:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1630:42:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"arguments":[{"id":13214,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"1716:6:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":13215,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1724:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13216,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1728:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1724:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":13219,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1744:4:76","typeDescriptions":{"typeIdentifier":"t_contract$_ForwarderRegistryContextBase_$13297","typeString":"contract ForwarderRegistryContextBase"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ForwarderRegistryContextBase_$13297","typeString":"contract ForwarderRegistryContextBase"}],"id":13218,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1736:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13217,"name":"address","nodeType":"ElementaryTypeName","src":"1736:7:76","typeDescriptions":{}}},"id":13220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1736:13:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13212,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"1676:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"id":13213,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1696:19:76","memberName":"isApprovedForwarder","nodeType":"MemberAccess","referencedDeclaration":13385,"src":"1676:39:76","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (address,address,address) view external returns (bool)"}},"id":13221,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1676:74:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1630:120:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13226,"nodeType":"IfStatement","src":"1626:164:76","trueBody":{"id":13225,"nodeType":"Block","src":"1752:38:76","statements":[{"expression":{"id":13223,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13200,"src":"1773:6:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13169,"id":13224,"nodeType":"Return","src":"1766:13:76"}]}},{"expression":{"expression":{"id":13227,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1807:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1811:6:76","memberName":"sender","nodeType":"MemberAccess","src":"1807:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13169,"id":13229,"nodeType":"Return","src":"1800:17:76"}]},"documentation":{"id":13165,"nodeType":"StructuredDocumentation","src":"797:105:76","text":"@notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context."},"id":13231,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"916:10:76","nodeType":"FunctionDefinition","parameters":{"id":13166,"nodeType":"ParameterList","parameters":[],"src":"926:2:76"},"returnParameters":{"id":13169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13168,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13231,"src":"960:7:76","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13167,"name":"address","nodeType":"ElementaryTypeName","src":"960:7:76","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"959:9:76"},"scope":13297,"src":"907:917:76","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":13295,"nodeType":"Block","src":"2005:872:76","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"id":13244,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13237,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"2065:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2115:1:76","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13240,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2107:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13239,"name":"address","nodeType":"ElementaryTypeName","src":"2107:7:76","typeDescriptions":{}}},"id":13242,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2107:10:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13238,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"2088:18:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IForwarderRegistry_$13386_$","typeString":"type(contract IForwarderRegistry)"}},"id":13243,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2088:30:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"2065:53:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13249,"nodeType":"IfStatement","src":"2061:99:76","trueBody":{"id":13248,"nodeType":"Block","src":"2120:40:76","statements":[{"expression":{"expression":{"id":13245,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2141:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2145:4:76","memberName":"data","nodeType":"MemberAccess","src":"2141:8:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13236,"id":13247,"nodeType":"Return","src":"2134:15:76"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13250,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2361:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2365:6:76","memberName":"sender","nodeType":"MemberAccess","src":"2361:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":13252,"name":"tx","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-26,"src":"2375:2:76","typeDescriptions":{"typeIdentifier":"t_magic_transaction","typeString":"tx"}},"id":13253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2378:6:76","memberName":"origin","nodeType":"MemberAccess","src":"2375:9:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2361:23:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":13255,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2388:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2392:4:76","memberName":"data","nodeType":"MemberAccess","src":"2388:8:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":13257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2397:6:76","memberName":"length","nodeType":"MemberAccess","src":"2388:15:76","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3234","id":13258,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2406:2:76","typeDescriptions":{"typeIdentifier":"t_rational_24_by_1","typeString":"int_const 24"},"value":"24"},"src":"2388:20:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2361:47:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13265,"nodeType":"IfStatement","src":"2357:93:76","trueBody":{"id":13264,"nodeType":"Block","src":"2410:40:76","statements":[{"expression":{"expression":{"id":13261,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2431:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13262,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2435:4:76","memberName":"data","nodeType":"MemberAccess","src":"2431:8:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13236,"id":13263,"nodeType":"Return","src":"2424:15:76"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":13285,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13272,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":13266,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2624:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2628:6:76","memberName":"sender","nodeType":"MemberAccess","src":"2624:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":13270,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"2646:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}],"id":13269,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2638:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13268,"name":"address","nodeType":"ElementaryTypeName","src":"2638:7:76","typeDescriptions":{}}},"id":13271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2638:28:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2624:42:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13275,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"2722:15:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2771Calldata_$13415_$","typeString":"type(library ERC2771Calldata)"}},"id":13276,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2738:9:76","memberName":"msgSender","nodeType":"MemberAccess","referencedDeclaration":13397,"src":"2722:25:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_address_$","typeString":"function () pure returns (address)"}},"id":13277,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2722:27:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"expression":{"id":13278,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2751:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2755:6:76","memberName":"sender","nodeType":"MemberAccess","src":"2751:10:76","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":13282,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2771:4:76","typeDescriptions":{"typeIdentifier":"t_contract$_ForwarderRegistryContextBase_$13297","typeString":"contract ForwarderRegistryContextBase"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ForwarderRegistryContextBase_$13297","typeString":"contract ForwarderRegistryContextBase"}],"id":13281,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2763:7:76","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13280,"name":"address","nodeType":"ElementaryTypeName","src":"2763:7:76","typeDescriptions":{}}},"id":13283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2763:13:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13273,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13152,"src":"2682:19:76","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"id":13274,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2702:19:76","memberName":"isApprovedForwarder","nodeType":"MemberAccess","referencedDeclaration":13385,"src":"2682:39:76","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (address,address,address) view external returns (bool)"}},"id":13284,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2682:95:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2624:153:76","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13291,"nodeType":"IfStatement","src":"2607:238:76","trueBody":{"id":13290,"nodeType":"Block","src":"2788:57:76","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13286,"name":"ERC2771Calldata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13415,"src":"2809:15:76","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2771Calldata_$13415_$","typeString":"type(library ERC2771Calldata)"}},"id":13287,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2825:7:76","memberName":"msgData","nodeType":"MemberAccess","referencedDeclaration":13414,"src":"2809:23:76","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () pure returns (bytes calldata)"}},"id":13288,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2809:25:76","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13236,"id":13289,"nodeType":"Return","src":"2802:32:76"}]}},{"expression":{"expression":{"id":13292,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2862:3:76","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13293,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2866:4:76","memberName":"data","nodeType":"MemberAccess","src":"2862:8:76","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13236,"id":13294,"nodeType":"Return","src":"2855:15:76"}]},"documentation":{"id":13232,"nodeType":"StructuredDocumentation","src":"1830:103:76","text":"@notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context."},"id":13296,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1947:8:76","nodeType":"FunctionDefinition","parameters":{"id":13233,"nodeType":"ParameterList","parameters":[],"src":"1955:2:76"},"returnParameters":{"id":13236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13235,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13296,"src":"1989:14:76","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13234,"name":"bytes","nodeType":"ElementaryTypeName","src":"1989:5:76","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1988:16:76"},"scope":13297,"src":"1938:939:76","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":13298,"src":"445:2434:76","usedErrors":[],"usedEvents":[]}],"src":"32:2848:76"},"id":76},"contracts/metatx/facets/ForwarderRegistryContextFacet.sol":{"ast":{"absolutePath":"contracts/metatx/facets/ForwarderRegistryContextFacet.sol","exportedSymbols":{"ForwarderRegistryContextFacet":[13358],"IERC2771":[13370],"IForwarderRegistry":[13386]},"id":13359,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13299,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:77"},{"absolutePath":"contracts/metatx/interfaces/IERC2771.sol","file":"./../interfaces/IERC2771.sol","id":13301,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13359,"sourceUnit":13371,"src":"57:54:77","symbolAliases":[{"foreign":{"id":13300,"name":"IERC2771","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13370,"src":"65:8:77","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../interfaces/IForwarderRegistry.sol","id":13303,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13359,"sourceUnit":13387,"src":"112:74:77","symbolAliases":[{"foreign":{"id":13302,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"120:18:77","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13305,"name":"IERC2771","nameLocations":["515:8:77"],"nodeType":"IdentifierPath","referencedDeclaration":13370,"src":"515:8:77"},"id":13306,"nodeType":"InheritanceSpecifier","src":"515:8:77"}],"canonicalName":"ForwarderRegistryContextFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":13304,"nodeType":"StructuredDocumentation","src":"188:285:77","text":"@title Meta-Transactions Forwarder Registry Context (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)"},"fullyImplemented":true,"id":13358,"linearizedBaseContracts":[13358,13370],"name":"ForwarderRegistryContextFacet","nameLocation":"482:29:77","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":13309,"mutability":"immutable","name":"_FORWARDER_REGISTRY","nameLocation":"568:19:77","nodeType":"VariableDeclaration","scope":13358,"src":"530:57:77","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13308,"nodeType":"UserDefinedTypeName","pathNode":{"id":13307,"name":"IForwarderRegistry","nameLocations":["530:18:77"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"530:18:77"},"referencedDeclaration":13386,"src":"530:18:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"},{"body":{"id":13319,"nodeType":"Block","src":"645:57:77","statements":[{"expression":{"id":13317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13315,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13309,"src":"655:19:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13316,"name":"forwarderRegistry_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13312,"src":"677:18:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"655:40:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"id":13318,"nodeType":"ExpressionStatement","src":"655:40:77"}]},"id":13320,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13313,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13312,"mutability":"mutable","name":"forwarderRegistry_","nameLocation":"625:18:77","nodeType":"VariableDeclaration","scope":13320,"src":"606:37:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13311,"nodeType":"UserDefinedTypeName","pathNode":{"id":13310,"name":"IForwarderRegistry","nameLocations":["606:18:77"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"606:18:77"},"referencedDeclaration":13386,"src":"606:18:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"605:39:77"},"returnParameters":{"id":13314,"nodeType":"ParameterList","parameters":[],"src":"645:0:77"},"scope":13358,"src":"594:108:77","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13328,"nodeType":"Block","src":"780:43:77","statements":[{"expression":{"id":13326,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13309,"src":"797:19:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"functionReturnParameters":13325,"id":13327,"nodeType":"Return","src":"790:26:77"}]},"functionSelector":"2b4c9f16","id":13329,"implemented":true,"kind":"function","modifiers":[],"name":"forwarderRegistry","nameLocation":"717:17:77","nodeType":"FunctionDefinition","parameters":{"id":13321,"nodeType":"ParameterList","parameters":[],"src":"734:2:77"},"returnParameters":{"id":13325,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13324,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13329,"src":"760:18:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13323,"nodeType":"UserDefinedTypeName","pathNode":{"id":13322,"name":"IForwarderRegistry","nameLocations":["760:18:77"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"760:18:77"},"referencedDeclaration":13386,"src":"760:18:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"759:20:77"},"scope":13358,"src":"708:115:77","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[13369],"body":{"id":13356,"nodeType":"Block","src":"942:217:77","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"id":13344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13337,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13309,"src":"1002:19:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":13341,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1052:1:77","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":13340,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1044:7:77","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13339,"name":"address","nodeType":"ElementaryTypeName","src":"1044:7:77","typeDescriptions":{}}},"id":13342,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1044:10:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":13338,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"1025:18:77","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IForwarderRegistry_$13386_$","typeString":"type(contract IForwarderRegistry)"}},"id":13343,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1025:30:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"src":"1002:53:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":13348,"nodeType":"IfStatement","src":"998:96:77","trueBody":{"id":13347,"nodeType":"Block","src":"1057:37:77","statements":[{"expression":{"hexValue":"66616c7365","id":13345,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1078:5:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":13336,"id":13346,"nodeType":"Return","src":"1071:12:77"}]}},{"expression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13349,"name":"forwarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13332,"src":"1111:9:77","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":13352,"name":"_FORWARDER_REGISTRY","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13309,"src":"1132:19:77","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}],"id":13351,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1124:7:77","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":13350,"name":"address","nodeType":"ElementaryTypeName","src":"1124:7:77","typeDescriptions":{}}},"id":13353,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1124:28:77","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1111:41:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":13336,"id":13355,"nodeType":"Return","src":"1104:48:77"}]},"documentation":{"id":13330,"nodeType":"StructuredDocumentation","src":"829:24:77","text":"@inheritdoc IERC2771"},"functionSelector":"572b6c05","id":13357,"implemented":true,"kind":"function","modifiers":[],"name":"isTrustedForwarder","nameLocation":"867:18:77","nodeType":"FunctionDefinition","parameters":{"id":13333,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13332,"mutability":"mutable","name":"forwarder","nameLocation":"894:9:77","nodeType":"VariableDeclaration","scope":13357,"src":"886:17:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13331,"name":"address","nodeType":"ElementaryTypeName","src":"886:7:77","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"885:19:77"},"returnParameters":{"id":13336,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13335,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13357,"src":"936:4:77","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":13334,"name":"bool","nodeType":"ElementaryTypeName","src":"936:4:77","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"935:6:77"},"scope":13358,"src":"858:301:77","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":13359,"src":"473:688:77","usedErrors":[],"usedEvents":[]}],"src":"32:1130:77"},"id":77},"contracts/metatx/interfaces/IERC2771.sol":{"ast":{"absolutePath":"contracts/metatx/interfaces/IERC2771.sol","exportedSymbols":{"IERC2771":[13370]},"id":13371,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13360,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:78"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC2771","contractDependencies":[],"contractKind":"interface","documentation":{"id":13361,"nodeType":"StructuredDocumentation","src":"58:110:78","text":"@title Secure Protocol for Native Meta Transactions.\n @dev See https://eips.ethereum.org/EIPS/eip-2771"},"fullyImplemented":false,"id":13370,"linearizedBaseContracts":[13370],"name":"IERC2771","nameLocation":"178:8:78","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":13362,"nodeType":"StructuredDocumentation","src":"193:171:78","text":"@notice Checks whether a forwarder is trusted.\n @param forwarder The forwarder to check.\n @return isTrusted True if `forwarder` is trusted, false if not."},"functionSelector":"572b6c05","id":13369,"implemented":false,"kind":"function","modifiers":[],"name":"isTrustedForwarder","nameLocation":"378:18:78","nodeType":"FunctionDefinition","parameters":{"id":13365,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13364,"mutability":"mutable","name":"forwarder","nameLocation":"405:9:78","nodeType":"VariableDeclaration","scope":13369,"src":"397:17:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13363,"name":"address","nodeType":"ElementaryTypeName","src":"397:7:78","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"396:19:78"},"returnParameters":{"id":13368,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13367,"mutability":"mutable","name":"isTrusted","nameLocation":"444:9:78","nodeType":"VariableDeclaration","scope":13369,"src":"439:14:78","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":13366,"name":"bool","nodeType":"ElementaryTypeName","src":"439:4:78","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"438:16:78"},"scope":13370,"src":"369:86:78","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13371,"src":"168:289:78","usedErrors":[],"usedEvents":[]}],"src":"32:426:78"},"id":78},"contracts/metatx/interfaces/IForwarderRegistry.sol":{"ast":{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","exportedSymbols":{"IForwarderRegistry":[13386]},"id":13387,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13372,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:79"},{"abstract":false,"baseContracts":[],"canonicalName":"IForwarderRegistry","contractDependencies":[],"contractKind":"interface","documentation":{"id":13373,"nodeType":"StructuredDocumentation","src":"58:49:79","text":"@title Meta-Transactions Forwarder Registry."},"fullyImplemented":false,"id":13386,"linearizedBaseContracts":[13386],"name":"IForwarderRegistry","nameLocation":"117:18:79","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":13374,"nodeType":"StructuredDocumentation","src":"142:390:79","text":"@notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\n @param sender The sender account.\n @param forwarder The forwarder account.\n @param target The target contract.\n @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise."},"functionSelector":"019a2028","id":13385,"implemented":false,"kind":"function","modifiers":[],"name":"isApprovedForwarder","nameLocation":"546:19:79","nodeType":"FunctionDefinition","parameters":{"id":13381,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13376,"mutability":"mutable","name":"sender","nameLocation":"574:6:79","nodeType":"VariableDeclaration","scope":13385,"src":"566:14:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13375,"name":"address","nodeType":"ElementaryTypeName","src":"566:7:79","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13378,"mutability":"mutable","name":"forwarder","nameLocation":"590:9:79","nodeType":"VariableDeclaration","scope":13385,"src":"582:17:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13377,"name":"address","nodeType":"ElementaryTypeName","src":"582:7:79","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13380,"mutability":"mutable","name":"target","nameLocation":"609:6:79","nodeType":"VariableDeclaration","scope":13385,"src":"601:14:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13379,"name":"address","nodeType":"ElementaryTypeName","src":"601:7:79","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"565:51:79"},"returnParameters":{"id":13384,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13383,"mutability":"mutable","name":"isApproved","nameLocation":"645:10:79","nodeType":"VariableDeclaration","scope":13385,"src":"640:15:79","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":13382,"name":"bool","nodeType":"ElementaryTypeName","src":"640:4:79","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"639:17:79"},"scope":13386,"src":"537:120:79","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13387,"src":"107:552:79","usedErrors":[],"usedEvents":[]}],"src":"32:628:79"},"id":79},"contracts/metatx/libraries/ERC2771Calldata.sol":{"ast":{"absolutePath":"contracts/metatx/libraries/ERC2771Calldata.sol","exportedSymbols":{"ERC2771Calldata":[13415]},"id":13416,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13388,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:80"},{"abstract":false,"baseContracts":[],"canonicalName":"ERC2771Calldata","contractDependencies":[],"contractKind":"library","documentation":{"id":13389,"nodeType":"StructuredDocumentation","src":"58:144:80","text":"@dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\n @dev See https://eips.ethereum.org/EIPS/eip-2771"},"fullyImplemented":true,"id":13415,"linearizedBaseContracts":[13415],"name":"ERC2771Calldata","nameLocation":"210:15:80","nodeType":"ContractDefinition","nodes":[{"body":{"id":13396,"nodeType":"Block","src":"398:105:80","statements":[{"AST":{"nativeSrc":"417:80:80","nodeType":"YulBlock","src":"417:80:80","statements":[{"nativeSrc":"431:56:80","nodeType":"YulAssignment","src":"431:56:80","value":{"arguments":[{"kind":"number","nativeSrc":"445:2:80","nodeType":"YulLiteral","src":"445:2:80","type":"","value":"96"},{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"calldatasize","nativeSrc":"466:12:80","nodeType":"YulIdentifier","src":"466:12:80"},"nativeSrc":"466:14:80","nodeType":"YulFunctionCall","src":"466:14:80"},{"kind":"number","nativeSrc":"482:2:80","nodeType":"YulLiteral","src":"482:2:80","type":"","value":"20"}],"functionName":{"name":"sub","nativeSrc":"462:3:80","nodeType":"YulIdentifier","src":"462:3:80"},"nativeSrc":"462:23:80","nodeType":"YulFunctionCall","src":"462:23:80"}],"functionName":{"name":"calldataload","nativeSrc":"449:12:80","nodeType":"YulIdentifier","src":"449:12:80"},"nativeSrc":"449:37:80","nodeType":"YulFunctionCall","src":"449:37:80"}],"functionName":{"name":"shr","nativeSrc":"441:3:80","nodeType":"YulIdentifier","src":"441:3:80"},"nativeSrc":"441:46:80","nodeType":"YulFunctionCall","src":"441:46:80"},"variableNames":[{"name":"sender","nativeSrc":"431:6:80","nodeType":"YulIdentifier","src":"431:6:80"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":13393,"isOffset":false,"isSlot":false,"src":"431:6:80","valueSize":1}],"id":13395,"nodeType":"InlineAssembly","src":"408:89:80"}]},"documentation":{"id":13390,"nodeType":"StructuredDocumentation","src":"232:101:80","text":"@notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771."},"id":13397,"implemented":true,"kind":"function","modifiers":[],"name":"msgSender","nameLocation":"347:9:80","nodeType":"FunctionDefinition","parameters":{"id":13391,"nodeType":"ParameterList","parameters":[],"src":"356:2:80"},"returnParameters":{"id":13394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13393,"mutability":"mutable","name":"sender","nameLocation":"390:6:80","nodeType":"VariableDeclaration","scope":13397,"src":"382:14:80","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13392,"name":"address","nodeType":"ElementaryTypeName","src":"382:7:80","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"381:16:80"},"scope":13415,"src":"338:165:80","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":13413,"nodeType":"Block","src":"679:89:80","statements":[{"id":13412,"nodeType":"UncheckedBlock","src":"689:73:80","statements":[{"expression":{"baseExpression":{"expression":{"id":13403,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"720:3:80","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"724:4:80","memberName":"data","nodeType":"MemberAccess","src":"720:8:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"endExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":13409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":13405,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"730:3:80","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"734:4:80","memberName":"data","nodeType":"MemberAccess","src":"730:8:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":13407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"739:6:80","memberName":"length","nodeType":"MemberAccess","src":"730:15:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"3230","id":13408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"748:2:80","typeDescriptions":{"typeIdentifier":"t_rational_20_by_1","typeString":"int_const 20"},"value":"20"},"src":"730:20:80","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":13410,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexRangeAccess","src":"720:31:80","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr_slice","typeString":"bytes calldata slice"}},"functionReturnParameters":13402,"id":13411,"nodeType":"Return","src":"713:38:80"}]}]},"documentation":{"id":13398,"nodeType":"StructuredDocumentation","src":"509:102:80","text":"@notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771."},"id":13414,"implemented":true,"kind":"function","modifiers":[],"name":"msgData","nameLocation":"625:7:80","nodeType":"FunctionDefinition","parameters":{"id":13399,"nodeType":"ParameterList","parameters":[],"src":"632:2:80"},"returnParameters":{"id":13402,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13401,"mutability":"mutable","name":"data","nameLocation":"673:4:80","nodeType":"VariableDeclaration","scope":13414,"src":"658:19:80","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13400,"name":"bytes","nodeType":"ElementaryTypeName","src":"658:5:80","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"657:21:80"},"scope":13415,"src":"616:152:80","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":13416,"src":"202:568:80","usedErrors":[],"usedEvents":[]}],"src":"32:739:80"},"id":80},"contracts/mocks/access/AccessControlMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/AccessControlMock.sol","exportedSymbols":{"AccessControl":[7901],"AccessControlMock":[13529],"AccessControlStorage":[8851],"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":13530,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13417,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:81"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":13419,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":13387,"src":"57:84:81","symbolAliases":[{"foreign":{"id":13418,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../access/libraries/AccessControlStorage.sol","id":13421,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":8852,"src":"142:87:81","symbolAliases":[{"foreign":{"id":13420,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"150:20:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":13423,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":7902,"src":"230:63:81","symbolAliases":[{"foreign":{"id":13422,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"238:13:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":13425,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":7935,"src":"294:71:81","symbolAliases":[{"foreign":{"id":13424,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"302:17:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":13427,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":1207,"src":"366:66:81","symbolAliases":[{"foreign":{"id":13426,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"374:7:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":13429,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":13298,"src":"433:98:81","symbolAliases":[{"foreign":{"id":13428,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"441:28:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":13431,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13530,"sourceUnit":13143,"src":"532:85:81","symbolAliases":[{"foreign":{"id":13430,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"540:24:81","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13432,"name":"AccessControl","nameLocations":["649:13:81"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"649:13:81"},"id":13433,"nodeType":"InheritanceSpecifier","src":"649:13:81"},{"baseName":{"id":13434,"name":"ForwarderRegistryContext","nameLocations":["664:24:81"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"664:24:81"},"id":13435,"nodeType":"InheritanceSpecifier","src":"664:24:81"}],"canonicalName":"AccessControlMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13529,"linearizedBaseContracts":[13529,13142,13370,13297,7901,7934,11554,11579,8139,8091,1206,8562,8546],"name":"AccessControlMock","nameLocation":"628:17:81","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13439,"libraryName":{"id":13436,"name":"AccessControlStorage","nameLocations":["701:20:81"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"701:20:81"},"nodeType":"UsingForDirective","src":"695:59:81","typeName":{"id":13438,"nodeType":"UserDefinedTypeName","pathNode":{"id":13437,"name":"AccessControlStorage.Layout","nameLocations":["726:20:81","747:6:81"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"726:27:81"},"referencedDeclaration":8616,"src":"726:27:81","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"3ad554d0","id":13442,"mutability":"constant","name":"TEST_ROLE","nameLocation":"784:9:81","nodeType":"VariableDeclaration","scope":13529,"src":"760:44:81","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13440,"name":"bytes32","nodeType":"ElementaryTypeName","src":"760:7:81","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"746573746572","id":13441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"796:8:81","typeDescriptions":{"typeIdentifier":"t_stringliteral_05a60f2ddefcb64e51f5b916bcf7020cf04802e63920d07f62018446638007e0","typeString":"literal_string \"tester\""},"value":"tester"},"visibility":"public"},{"body":{"id":13455,"nodeType":"Block","src":"935:2:81","statements":[]},"id":13456,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":13448,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"879:3:81","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":13449,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"883:6:81","memberName":"sender","nodeType":"MemberAccess","src":"879:10:81","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":13450,"kind":"baseConstructorSpecifier","modifierName":{"id":13447,"name":"ContractOwnership","nameLocations":["861:17:81"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"861:17:81"},"nodeType":"ModifierInvocation","src":"861:29:81"},{"arguments":[{"id":13452,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13445,"src":"916:17:81","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13453,"kind":"baseConstructorSpecifier","modifierName":{"id":13451,"name":"ForwarderRegistryContext","nameLocations":["891:24:81"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"891:24:81"},"nodeType":"ModifierInvocation","src":"891:43:81"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13446,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13445,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"842:17:81","nodeType":"VariableDeclaration","scope":13456,"src":"823:36:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13444,"nodeType":"UserDefinedTypeName","pathNode":{"id":13443,"name":"IForwarderRegistry","nameLocations":["823:18:81"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"823:18:81"},"referencedDeclaration":13386,"src":"823:18:81","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"822:38:81"},"returnParameters":{"id":13454,"nodeType":"ParameterList","parameters":[],"src":"935:0:81"},"scope":13529,"src":"811:126:81","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13472,"nodeType":"Block","src":"1012:76:81","statements":[{"expression":{"arguments":[{"id":13468,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13458,"src":"1067:4:81","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13469,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13460,"src":"1073:7:81","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13463,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1022:20:81","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":13465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1043:6:81","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1022:27:81","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":13466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1022:29:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":13467,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1052:14:81","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1022:44:81","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":13470,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1022:59:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13471,"nodeType":"ExpressionStatement","src":"1022:59:81"}]},"functionSelector":"db9b206a","id":13473,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasRole","nameLocation":"952:14:81","nodeType":"FunctionDefinition","parameters":{"id":13461,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13458,"mutability":"mutable","name":"role","nameLocation":"975:4:81","nodeType":"VariableDeclaration","scope":13473,"src":"967:12:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13457,"name":"bytes32","nodeType":"ElementaryTypeName","src":"967:7:81","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13460,"mutability":"mutable","name":"account","nameLocation":"989:7:81","nodeType":"VariableDeclaration","scope":13473,"src":"981:15:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13459,"name":"address","nodeType":"ElementaryTypeName","src":"981:7:81","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"966:31:81"},"returnParameters":{"id":13462,"nodeType":"ParameterList","parameters":[],"src":"1012:0:81"},"scope":13529,"src":"943:145:81","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13490,"nodeType":"Block","src":"1201:97:81","statements":[{"expression":{"arguments":[{"id":13485,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13475,"src":"1261:14:81","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13486,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13477,"src":"1277:4:81","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13487,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13479,"src":"1283:7:81","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13482,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1211:20:81","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":13484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1232:28:81","memberName":"enforceHasTargetContractRole","nodeType":"MemberAccess","referencedDeclaration":8838,"src":"1211:49:81","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes32_$_t_address_$returns$__$","typeString":"function (address,bytes32,address) view"}},"id":13488,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1211:80:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13489,"nodeType":"ExpressionStatement","src":"1211:80:81"}]},"functionSelector":"94fc4425","id":13491,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasTargetContractRole","nameLocation":"1103:28:81","nodeType":"FunctionDefinition","parameters":{"id":13480,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13475,"mutability":"mutable","name":"targetContract","nameLocation":"1140:14:81","nodeType":"VariableDeclaration","scope":13491,"src":"1132:22:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13474,"name":"address","nodeType":"ElementaryTypeName","src":"1132:7:81","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13477,"mutability":"mutable","name":"role","nameLocation":"1164:4:81","nodeType":"VariableDeclaration","scope":13491,"src":"1156:12:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13476,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1156:7:81","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13479,"mutability":"mutable","name":"account","nameLocation":"1178:7:81","nodeType":"VariableDeclaration","scope":13491,"src":"1170:15:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13478,"name":"address","nodeType":"ElementaryTypeName","src":"1170:7:81","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1131:55:81"},"returnParameters":{"id":13481,"nodeType":"ParameterList","parameters":[],"src":"1201:0:81"},"scope":13529,"src":"1094:204:81","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13499,"nodeType":"Block","src":"1364:34:81","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13496,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[13528],"referencedDeclaration":13528,"src":"1381:8:81","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13497,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1381:10:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13495,"id":13498,"nodeType":"Return","src":"1374:17:81"}]},"functionSelector":"31e66e1e","id":13500,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1313:9:81","nodeType":"FunctionDefinition","parameters":{"id":13492,"nodeType":"ParameterList","parameters":[],"src":"1322:2:81"},"returnParameters":{"id":13495,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13494,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13500,"src":"1348:14:81","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13493,"name":"bytes","nodeType":"ElementaryTypeName","src":"1348:5:81","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1347:16:81"},"scope":13529,"src":"1304:94:81","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":13513,"nodeType":"Block","src":"1563:65:81","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13509,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1580:28:81","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1609:10:81","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1580:39:81","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":13511,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1580:41:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13508,"id":13512,"nodeType":"Return","src":"1573:48:81"}]},"documentation":{"id":13501,"nodeType":"StructuredDocumentation","src":"1404:44:81","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13514,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1462:10:81","nodeType":"FunctionDefinition","overrides":{"id":13505,"nodeType":"OverrideSpecifier","overrides":[{"id":13503,"name":"Context","nameLocations":["1506:7:81"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1506:7:81"},{"id":13504,"name":"ForwarderRegistryContextBase","nameLocations":["1515:28:81"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1515:28:81"}],"src":"1497:47:81"},"parameters":{"id":13502,"nodeType":"ParameterList","parameters":[],"src":"1472:2:81"},"returnParameters":{"id":13508,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13507,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13514,"src":"1554:7:81","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13506,"name":"address","nodeType":"ElementaryTypeName","src":"1554:7:81","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1553:9:81"},"scope":13529,"src":"1453:175:81","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":13527,"nodeType":"Block","src":"1798:63:81","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13523,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1815:28:81","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1844:8:81","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1815:37:81","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13525,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1815:39:81","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13522,"id":13526,"nodeType":"Return","src":"1808:46:81"}]},"documentation":{"id":13515,"nodeType":"StructuredDocumentation","src":"1634:44:81","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13528,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1692:8:81","nodeType":"FunctionDefinition","overrides":{"id":13519,"nodeType":"OverrideSpecifier","overrides":[{"id":13517,"name":"Context","nameLocations":["1734:7:81"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1734:7:81"},{"id":13518,"name":"ForwarderRegistryContextBase","nameLocations":["1743:28:81"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1743:28:81"}],"src":"1725:47:81"},"parameters":{"id":13516,"nodeType":"ParameterList","parameters":[],"src":"1700:2:81"},"returnParameters":{"id":13522,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13521,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13528,"src":"1782:14:81","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13520,"name":"bytes","nodeType":"ElementaryTypeName","src":"1782:5:81","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1781:16:81"},"scope":13529,"src":"1683:178:81","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":13530,"src":"619:1244:81","usedErrors":[8223,8232,8239,8246,11559],"usedEvents":[8269,8278,8287]}],"src":"32:1832:81"},"id":81},"contracts/mocks/access/ContractOwnershipMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/ContractOwnershipMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ContractOwnershipMock":[13633],"ContractOwnershipStorage":[9109],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":13634,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13531,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:82"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":13533,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":13387,"src":"57:84:82","symbolAliases":[{"foreign":{"id":13532,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":13535,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":9110,"src":"142:95:82","symbolAliases":[{"foreign":{"id":13534,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"150:24:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":13537,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":7935,"src":"238:71:82","symbolAliases":[{"foreign":{"id":13536,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"246:17:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":13539,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":1207,"src":"310:66:82","symbolAliases":[{"foreign":{"id":13538,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"318:7:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":13541,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":13298,"src":"377:98:82","symbolAliases":[{"foreign":{"id":13540,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"385:28:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":13543,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13634,"sourceUnit":13143,"src":"476:85:82","symbolAliases":[{"foreign":{"id":13542,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"484:24:82","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13544,"name":"ContractOwnership","nameLocations":["597:17:82"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"597:17:82"},"id":13545,"nodeType":"InheritanceSpecifier","src":"597:17:82"},{"baseName":{"id":13546,"name":"ForwarderRegistryContext","nameLocations":["616:24:82"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"616:24:82"},"id":13547,"nodeType":"InheritanceSpecifier","src":"616:24:82"}],"canonicalName":"ContractOwnershipMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13633,"linearizedBaseContracts":[13633,13142,13370,13297,7934,11554,11579,8139,1206,8562],"name":"ContractOwnershipMock","nameLocation":"572:21:82","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13551,"libraryName":{"id":13548,"name":"ContractOwnershipStorage","nameLocations":["653:24:82"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"653:24:82"},"nodeType":"UsingForDirective","src":"647:67:82","typeName":{"id":13550,"nodeType":"UserDefinedTypeName","pathNode":{"id":13549,"name":"ContractOwnershipStorage.Layout","nameLocations":["682:24:82","707:6:82"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"682:31:82"},"referencedDeclaration":8882,"src":"682:31:82","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":13565,"nodeType":"Block","src":"890:2:82","statements":[]},"id":13566,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13559,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13553,"src":"832:12:82","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":13560,"kind":"baseConstructorSpecifier","modifierName":{"id":13558,"name":"ContractOwnership","nameLocations":["814:17:82"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"814:17:82"},"nodeType":"ModifierInvocation","src":"814:31:82"},{"arguments":[{"id":13562,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13556,"src":"871:17:82","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13563,"kind":"baseConstructorSpecifier","modifierName":{"id":13561,"name":"ForwarderRegistryContext","nameLocations":["846:24:82"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"846:24:82"},"nodeType":"ModifierInvocation","src":"846:43:82"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13557,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13553,"mutability":"mutable","name":"initialOwner","nameLocation":"749:12:82","nodeType":"VariableDeclaration","scope":13566,"src":"741:20:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13552,"name":"address","nodeType":"ElementaryTypeName","src":"741:7:82","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13556,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"790:17:82","nodeType":"VariableDeclaration","scope":13566,"src":"771:36:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13555,"nodeType":"UserDefinedTypeName","pathNode":{"id":13554,"name":"IForwarderRegistry","nameLocations":["771:18:82"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"771:18:82"},"referencedDeclaration":13386,"src":"771:18:82","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"731:82:82"},"returnParameters":{"id":13564,"nodeType":"ParameterList","parameters":[],"src":"890:0:82"},"scope":13633,"src":"720:172:82","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13579,"nodeType":"Block","src":"961:82:82","statements":[{"expression":{"arguments":[{"id":13576,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13568,"src":"1028:7:82","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13571,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"971:24:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":13573,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"996:6:82","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"971:31:82","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":13574,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"971:33:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":13575,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1005:22:82","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"971:56:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":13577,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"971:65:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13578,"nodeType":"ExpressionStatement","src":"971:65:82"}]},"functionSelector":"97883ae2","id":13580,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"907:22:82","nodeType":"FunctionDefinition","parameters":{"id":13569,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13568,"mutability":"mutable","name":"account","nameLocation":"938:7:82","nodeType":"VariableDeclaration","scope":13580,"src":"930:15:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13567,"name":"address","nodeType":"ElementaryTypeName","src":"930:7:82","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"929:17:82"},"returnParameters":{"id":13570,"nodeType":"ParameterList","parameters":[],"src":"961:0:82"},"scope":13633,"src":"898:145:82","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13594,"nodeType":"Block","src":"1142:95:82","statements":[{"expression":{"arguments":[{"id":13590,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13582,"src":"1206:14:82","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13591,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13584,"src":"1222:7:82","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13587,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1152:24:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":13589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1177:28:82","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9096,"src":"1152:53:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) view"}},"id":13592,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1152:78:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13593,"nodeType":"ExpressionStatement","src":"1152:78:82"}]},"functionSelector":"7e7d9f83","id":13595,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"1058:28:82","nodeType":"FunctionDefinition","parameters":{"id":13585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13582,"mutability":"mutable","name":"targetContract","nameLocation":"1095:14:82","nodeType":"VariableDeclaration","scope":13595,"src":"1087:22:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13581,"name":"address","nodeType":"ElementaryTypeName","src":"1087:7:82","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13584,"mutability":"mutable","name":"account","nameLocation":"1119:7:82","nodeType":"VariableDeclaration","scope":13595,"src":"1111:15:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13583,"name":"address","nodeType":"ElementaryTypeName","src":"1111:7:82","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1086:41:82"},"returnParameters":{"id":13586,"nodeType":"ParameterList","parameters":[],"src":"1142:0:82"},"scope":13633,"src":"1049:188:82","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13603,"nodeType":"Block","src":"1303:34:82","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13600,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[13632],"referencedDeclaration":13632,"src":"1320:8:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13601,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1320:10:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13599,"id":13602,"nodeType":"Return","src":"1313:17:82"}]},"functionSelector":"31e66e1e","id":13604,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1252:9:82","nodeType":"FunctionDefinition","parameters":{"id":13596,"nodeType":"ParameterList","parameters":[],"src":"1261:2:82"},"returnParameters":{"id":13599,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13598,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13604,"src":"1287:14:82","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13597,"name":"bytes","nodeType":"ElementaryTypeName","src":"1287:5:82","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1286:16:82"},"scope":13633,"src":"1243:94:82","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":13617,"nodeType":"Block","src":"1502:65:82","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13613,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1519:28:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1548:10:82","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1519:39:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":13615,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1519:41:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13612,"id":13616,"nodeType":"Return","src":"1512:48:82"}]},"documentation":{"id":13605,"nodeType":"StructuredDocumentation","src":"1343:44:82","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13618,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1401:10:82","nodeType":"FunctionDefinition","overrides":{"id":13609,"nodeType":"OverrideSpecifier","overrides":[{"id":13607,"name":"Context","nameLocations":["1445:7:82"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1445:7:82"},{"id":13608,"name":"ForwarderRegistryContextBase","nameLocations":["1454:28:82"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1454:28:82"}],"src":"1436:47:82"},"parameters":{"id":13606,"nodeType":"ParameterList","parameters":[],"src":"1411:2:82"},"returnParameters":{"id":13612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13611,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13618,"src":"1493:7:82","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13610,"name":"address","nodeType":"ElementaryTypeName","src":"1493:7:82","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1492:9:82"},"scope":13633,"src":"1392:175:82","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":13631,"nodeType":"Block","src":"1737:63:82","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13627,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1754:28:82","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1783:8:82","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1754:37:82","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1754:39:82","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13626,"id":13630,"nodeType":"Return","src":"1747:46:82"}]},"documentation":{"id":13619,"nodeType":"StructuredDocumentation","src":"1573:44:82","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13632,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1631:8:82","nodeType":"FunctionDefinition","overrides":{"id":13623,"nodeType":"OverrideSpecifier","overrides":[{"id":13621,"name":"Context","nameLocations":["1673:7:82"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1673:7:82"},{"id":13622,"name":"ForwarderRegistryContextBase","nameLocations":["1682:28:82"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1682:28:82"}],"src":"1664:47:82"},"parameters":{"id":13620,"nodeType":"ParameterList","parameters":[],"src":"1639:2:82"},"returnParameters":{"id":13626,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13625,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13632,"src":"1721:14:82","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13624,"name":"bytes","nodeType":"ElementaryTypeName","src":"1721:5:82","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1720:16:82"},"scope":13633,"src":"1622:178:82","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":13634,"src":"563:1239:82","usedErrors":[8239,8246,8258,11559],"usedEvents":[8287]}],"src":"32:1771:82"},"id":82},"contracts/mocks/access/SafeContractOwnershipMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/SafeContractOwnershipMock.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"SafeContractOwnership":[7967],"SafeContractOwnershipMock":[13737],"SafeContractOwnershipStorage":[9462]},"id":13738,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13635,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:83"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":13637,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":13387,"src":"57:84:83","symbolAliases":[{"foreign":{"id":13636,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","file":"./../../access/libraries/SafeContractOwnershipStorage.sol","id":13639,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":9463,"src":"142:103:83","symbolAliases":[{"foreign":{"id":13638,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"150:28:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/SafeContractOwnership.sol","file":"./../../access/SafeContractOwnership.sol","id":13641,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":7968,"src":"246:79:83","symbolAliases":[{"foreign":{"id":13640,"name":"SafeContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7967,"src":"254:21:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":13643,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":1207,"src":"326:66:83","symbolAliases":[{"foreign":{"id":13642,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"334:7:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":13645,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":13298,"src":"393:98:83","symbolAliases":[{"foreign":{"id":13644,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"401:28:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":13647,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13738,"sourceUnit":13143,"src":"492:85:83","symbolAliases":[{"foreign":{"id":13646,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"500:24:83","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13648,"name":"SafeContractOwnership","nameLocations":["617:21:83"],"nodeType":"IdentifierPath","referencedDeclaration":7967,"src":"617:21:83"},"id":13649,"nodeType":"InheritanceSpecifier","src":"617:21:83"},{"baseName":{"id":13650,"name":"ForwarderRegistryContext","nameLocations":["640:24:83"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"640:24:83"},"id":13651,"nodeType":"InheritanceSpecifier","src":"640:24:83"}],"canonicalName":"SafeContractOwnershipMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13737,"linearizedBaseContracts":[13737,13142,13370,13297,7967,11554,11579,8214,1206,8588],"name":"SafeContractOwnershipMock","nameLocation":"588:25:83","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13655,"libraryName":{"id":13652,"name":"SafeContractOwnershipStorage","nameLocations":["677:28:83"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"677:28:83"},"nodeType":"UsingForDirective","src":"671:75:83","typeName":{"id":13654,"nodeType":"UserDefinedTypeName","pathNode":{"id":13653,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["710:28:83","739:6:83"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"710:35:83"},"referencedDeclaration":9144,"src":"710:35:83","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"body":{"id":13669,"nodeType":"Block","src":"926:2:83","statements":[]},"id":13670,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13663,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13657,"src":"868:12:83","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":13664,"kind":"baseConstructorSpecifier","modifierName":{"id":13662,"name":"SafeContractOwnership","nameLocations":["846:21:83"],"nodeType":"IdentifierPath","referencedDeclaration":7967,"src":"846:21:83"},"nodeType":"ModifierInvocation","src":"846:35:83"},{"arguments":[{"id":13666,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13660,"src":"907:17:83","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13667,"kind":"baseConstructorSpecifier","modifierName":{"id":13665,"name":"ForwarderRegistryContext","nameLocations":["882:24:83"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"882:24:83"},"nodeType":"ModifierInvocation","src":"882:43:83"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13661,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13657,"mutability":"mutable","name":"initialOwner","nameLocation":"781:12:83","nodeType":"VariableDeclaration","scope":13670,"src":"773:20:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13656,"name":"address","nodeType":"ElementaryTypeName","src":"773:7:83","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13660,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"822:17:83","nodeType":"VariableDeclaration","scope":13670,"src":"803:36:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13659,"nodeType":"UserDefinedTypeName","pathNode":{"id":13658,"name":"IForwarderRegistry","nameLocations":["803:18:83"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"803:18:83"},"referencedDeclaration":13386,"src":"803:18:83","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"763:82:83"},"returnParameters":{"id":13668,"nodeType":"ParameterList","parameters":[],"src":"926:0:83"},"scope":13737,"src":"752:176:83","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13683,"nodeType":"Block","src":"997:86:83","statements":[{"expression":{"arguments":[{"id":13680,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13672,"src":"1068:7:83","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13675,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1007:28:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":13677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1036:6:83","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"1007:35:83","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":13678,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1007:37:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":13679,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1045:22:83","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9429,"src":"1007:60:83","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address) view"}},"id":13681,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1007:69:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13682,"nodeType":"ExpressionStatement","src":"1007:69:83"}]},"functionSelector":"97883ae2","id":13684,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"943:22:83","nodeType":"FunctionDefinition","parameters":{"id":13673,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13672,"mutability":"mutable","name":"account","nameLocation":"974:7:83","nodeType":"VariableDeclaration","scope":13684,"src":"966:15:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13671,"name":"address","nodeType":"ElementaryTypeName","src":"966:7:83","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"965:17:83"},"returnParameters":{"id":13674,"nodeType":"ParameterList","parameters":[],"src":"997:0:83"},"scope":13737,"src":"934:149:83","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13698,"nodeType":"Block","src":"1182:99:83","statements":[{"expression":{"arguments":[{"id":13694,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13686,"src":"1250:14:83","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13695,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13688,"src":"1266:7:83","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13691,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"1192:28:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":13693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1221:28:83","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9449,"src":"1192:57:83","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) view"}},"id":13696,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1192:82:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13697,"nodeType":"ExpressionStatement","src":"1192:82:83"}]},"functionSelector":"7e7d9f83","id":13699,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"1098:28:83","nodeType":"FunctionDefinition","parameters":{"id":13689,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13686,"mutability":"mutable","name":"targetContract","nameLocation":"1135:14:83","nodeType":"VariableDeclaration","scope":13699,"src":"1127:22:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13685,"name":"address","nodeType":"ElementaryTypeName","src":"1127:7:83","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13688,"mutability":"mutable","name":"account","nameLocation":"1159:7:83","nodeType":"VariableDeclaration","scope":13699,"src":"1151:15:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13687,"name":"address","nodeType":"ElementaryTypeName","src":"1151:7:83","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1126:41:83"},"returnParameters":{"id":13690,"nodeType":"ParameterList","parameters":[],"src":"1182:0:83"},"scope":13737,"src":"1089:192:83","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13707,"nodeType":"Block","src":"1347:34:83","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13704,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[13736],"referencedDeclaration":13736,"src":"1364:8:83","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13705,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1364:10:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13703,"id":13706,"nodeType":"Return","src":"1357:17:83"}]},"functionSelector":"31e66e1e","id":13708,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1296:9:83","nodeType":"FunctionDefinition","parameters":{"id":13700,"nodeType":"ParameterList","parameters":[],"src":"1305:2:83"},"returnParameters":{"id":13703,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13702,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13708,"src":"1331:14:83","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13701,"name":"bytes","nodeType":"ElementaryTypeName","src":"1331:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1330:16:83"},"scope":13737,"src":"1287:94:83","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":13721,"nodeType":"Block","src":"1546:65:83","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13717,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1563:28:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1592:10:83","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1563:39:83","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":13719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1563:41:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":13716,"id":13720,"nodeType":"Return","src":"1556:48:83"}]},"documentation":{"id":13709,"nodeType":"StructuredDocumentation","src":"1387:44:83","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13722,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1445:10:83","nodeType":"FunctionDefinition","overrides":{"id":13713,"nodeType":"OverrideSpecifier","overrides":[{"id":13711,"name":"Context","nameLocations":["1489:7:83"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1489:7:83"},{"id":13712,"name":"ForwarderRegistryContextBase","nameLocations":["1498:28:83"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1498:28:83"}],"src":"1480:47:83"},"parameters":{"id":13710,"nodeType":"ParameterList","parameters":[],"src":"1455:2:83"},"returnParameters":{"id":13716,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13715,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13722,"src":"1537:7:83","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13714,"name":"address","nodeType":"ElementaryTypeName","src":"1537:7:83","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1536:9:83"},"scope":13737,"src":"1436:175:83","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":13735,"nodeType":"Block","src":"1781:63:83","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13731,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1798:28:83","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":13732,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1827:8:83","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1798:37:83","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13733,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1798:39:83","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13730,"id":13734,"nodeType":"Return","src":"1791:46:83"}]},"documentation":{"id":13723,"nodeType":"StructuredDocumentation","src":"1617:44:83","text":"@inheritdoc ForwarderRegistryContextBase"},"id":13736,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1675:8:83","nodeType":"FunctionDefinition","overrides":{"id":13727,"nodeType":"OverrideSpecifier","overrides":[{"id":13725,"name":"Context","nameLocations":["1717:7:83"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1717:7:83"},{"id":13726,"name":"ForwarderRegistryContextBase","nameLocations":["1726:28:83"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1726:28:83"}],"src":"1708:47:83"},"parameters":{"id":13724,"nodeType":"ParameterList","parameters":[],"src":"1683:2:83"},"returnParameters":{"id":13730,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13729,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13736,"src":"1765:14:83","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13728,"name":"bytes","nodeType":"ElementaryTypeName","src":"1765:5:83","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1764:16:83"},"scope":13737,"src":"1666:178:83","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":13738,"src":"579:1267:83","usedErrors":[8239,8246,8251,8258,11559],"usedEvents":[8287,8292]}],"src":"32:1815:83"},"id":83},"contracts/mocks/access/facets/AccessControlFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/facets/AccessControlFacetMock.sol","exportedSymbols":{"AccessControlFacet":[8346],"AccessControlFacetMock":[13809],"AccessControlStorage":[8851],"IForwarderRegistry":[13386]},"id":13810,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13739,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:84"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":13741,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13810,"sourceUnit":13387,"src":"57:87:84","symbolAliases":[{"foreign":{"id":13740,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:84","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":13743,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13810,"sourceUnit":8852,"src":"145:90:84","symbolAliases":[{"foreign":{"id":13742,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"153:20:84","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/facets/AccessControlFacet.sol","file":"./../../../access/facets/AccessControlFacet.sol","id":13745,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13810,"sourceUnit":8347,"src":"236:83:84","symbolAliases":[{"foreign":{"id":13744,"name":"AccessControlFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8346,"src":"244:18:84","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13746,"name":"AccessControlFacet","nameLocations":["356:18:84"],"nodeType":"IdentifierPath","referencedDeclaration":8346,"src":"356:18:84"},"id":13747,"nodeType":"InheritanceSpecifier","src":"356:18:84"}],"canonicalName":"AccessControlFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13809,"linearizedBaseContracts":[13809,8346,13297,8091,1206,8546],"name":"AccessControlFacetMock","nameLocation":"330:22:84","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13751,"libraryName":{"id":13748,"name":"AccessControlStorage","nameLocations":["387:20:84"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"387:20:84"},"nodeType":"UsingForDirective","src":"381:59:84","typeName":{"id":13750,"nodeType":"UserDefinedTypeName","pathNode":{"id":13749,"name":"AccessControlStorage.Layout","nameLocations":["412:20:84","433:6:84"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"412:27:84"},"referencedDeclaration":8616,"src":"412:27:84","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"3ad554d0","id":13754,"mutability":"constant","name":"TEST_ROLE","nameLocation":"470:9:84","nodeType":"VariableDeclaration","scope":13809,"src":"446:44:84","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13752,"name":"bytes32","nodeType":"ElementaryTypeName","src":"446:7:84","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"746573746572","id":13753,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"482:8:84","typeDescriptions":{"typeIdentifier":"t_stringliteral_05a60f2ddefcb64e51f5b916bcf7020cf04802e63920d07f62018446638007e0","typeString":"literal_string \"tester\""},"value":"tester"},"visibility":"public"},{"body":{"id":13763,"nodeType":"Block","src":"585:2:84","statements":[]},"id":13764,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13760,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13757,"src":"566:17:84","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13761,"kind":"baseConstructorSpecifier","modifierName":{"id":13759,"name":"AccessControlFacet","nameLocations":["547:18:84"],"nodeType":"IdentifierPath","referencedDeclaration":8346,"src":"547:18:84"},"nodeType":"ModifierInvocation","src":"547:37:84"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13758,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13757,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"528:17:84","nodeType":"VariableDeclaration","scope":13764,"src":"509:36:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13756,"nodeType":"UserDefinedTypeName","pathNode":{"id":13755,"name":"IForwarderRegistry","nameLocations":["509:18:84"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"509:18:84"},"referencedDeclaration":13386,"src":"509:18:84","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"508:38:84"},"returnParameters":{"id":13762,"nodeType":"ParameterList","parameters":[],"src":"585:0:84"},"scope":13809,"src":"497:90:84","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13780,"nodeType":"Block","src":"662:76:84","statements":[{"expression":{"arguments":[{"id":13776,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13766,"src":"717:4:84","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13777,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13768,"src":"723:7:84","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13771,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"672:20:84","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":13773,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"693:6:84","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"672:27:84","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":13774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"672:29:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":13775,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"702:14:84","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"672:44:84","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":13778,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"672:59:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13779,"nodeType":"ExpressionStatement","src":"672:59:84"}]},"functionSelector":"db9b206a","id":13781,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasRole","nameLocation":"602:14:84","nodeType":"FunctionDefinition","parameters":{"id":13769,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13766,"mutability":"mutable","name":"role","nameLocation":"625:4:84","nodeType":"VariableDeclaration","scope":13781,"src":"617:12:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13765,"name":"bytes32","nodeType":"ElementaryTypeName","src":"617:7:84","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13768,"mutability":"mutable","name":"account","nameLocation":"639:7:84","nodeType":"VariableDeclaration","scope":13781,"src":"631:15:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13767,"name":"address","nodeType":"ElementaryTypeName","src":"631:7:84","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"616:31:84"},"returnParameters":{"id":13770,"nodeType":"ParameterList","parameters":[],"src":"662:0:84"},"scope":13809,"src":"593:145:84","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13798,"nodeType":"Block","src":"851:97:84","statements":[{"expression":{"arguments":[{"id":13793,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13783,"src":"911:14:84","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13794,"name":"role","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13785,"src":"927:4:84","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":13795,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13787,"src":"933:7:84","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13790,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"861:20:84","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":13792,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"882:28:84","memberName":"enforceHasTargetContractRole","nodeType":"MemberAccess","referencedDeclaration":8838,"src":"861:49:84","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes32_$_t_address_$returns$__$","typeString":"function (address,bytes32,address) view"}},"id":13796,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"861:80:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13797,"nodeType":"ExpressionStatement","src":"861:80:84"}]},"functionSelector":"94fc4425","id":13799,"implemented":true,"kind":"function","modifiers":[],"name":"enforceHasTargetContractRole","nameLocation":"753:28:84","nodeType":"FunctionDefinition","parameters":{"id":13788,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13783,"mutability":"mutable","name":"targetContract","nameLocation":"790:14:84","nodeType":"VariableDeclaration","scope":13799,"src":"782:22:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13782,"name":"address","nodeType":"ElementaryTypeName","src":"782:7:84","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13785,"mutability":"mutable","name":"role","nameLocation":"814:4:84","nodeType":"VariableDeclaration","scope":13799,"src":"806:12:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13784,"name":"bytes32","nodeType":"ElementaryTypeName","src":"806:7:84","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13787,"mutability":"mutable","name":"account","nameLocation":"828:7:84","nodeType":"VariableDeclaration","scope":13799,"src":"820:15:84","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13786,"name":"address","nodeType":"ElementaryTypeName","src":"820:7:84","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"781:55:84"},"returnParameters":{"id":13789,"nodeType":"ParameterList","parameters":[],"src":"851:0:84"},"scope":13809,"src":"744:204:84","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13807,"nodeType":"Block","src":"1014:34:84","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13804,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[8345],"referencedDeclaration":8345,"src":"1031:8:84","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1031:10:84","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13803,"id":13806,"nodeType":"Return","src":"1024:17:84"}]},"functionSelector":"31e66e1e","id":13808,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"963:9:84","nodeType":"FunctionDefinition","parameters":{"id":13800,"nodeType":"ParameterList","parameters":[],"src":"972:2:84"},"returnParameters":{"id":13803,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13802,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13808,"src":"998:14:84","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13801,"name":"bytes","nodeType":"ElementaryTypeName","src":"998:5:84","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"997:16:84"},"scope":13809,"src":"954:94:84","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13810,"src":"321:729:84","usedErrors":[8223,8232,8239,8246],"usedEvents":[8269,8278]}],"src":"32:1019:84"},"id":84},"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol","exportedSymbols":{"ContractOwnershipFacet":[8436],"ContractOwnershipFacetMock":[13872],"ContractOwnershipStorage":[9109],"IForwarderRegistry":[13386]},"id":13873,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13811,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:85"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":13813,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13873,"sourceUnit":13387,"src":"57:87:85","symbolAliases":[{"foreign":{"id":13812,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:85","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../access/libraries/ContractOwnershipStorage.sol","id":13815,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13873,"sourceUnit":9110,"src":"145:98:85","symbolAliases":[{"foreign":{"id":13814,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"153:24:85","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/facets/ContractOwnershipFacet.sol","file":"./../../../access/facets/ContractOwnershipFacet.sol","id":13817,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13873,"sourceUnit":8437,"src":"244:91:85","symbolAliases":[{"foreign":{"id":13816,"name":"ContractOwnershipFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8436,"src":"252:22:85","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13818,"name":"ContractOwnershipFacet","nameLocations":["376:22:85"],"nodeType":"IdentifierPath","referencedDeclaration":8436,"src":"376:22:85"},"id":13819,"nodeType":"InheritanceSpecifier","src":"376:22:85"}],"canonicalName":"ContractOwnershipFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13872,"linearizedBaseContracts":[13872,8436,13297,8139,1206,8562],"name":"ContractOwnershipFacetMock","nameLocation":"346:26:85","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13823,"libraryName":{"id":13820,"name":"ContractOwnershipStorage","nameLocations":["411:24:85"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"411:24:85"},"nodeType":"UsingForDirective","src":"405:67:85","typeName":{"id":13822,"nodeType":"UserDefinedTypeName","pathNode":{"id":13821,"name":"ContractOwnershipStorage.Layout","nameLocations":["440:24:85","465:6:85"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"440:31:85"},"referencedDeclaration":8882,"src":"440:31:85","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":13832,"nodeType":"Block","src":"570:2:85","statements":[]},"id":13833,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13829,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13826,"src":"551:17:85","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13830,"kind":"baseConstructorSpecifier","modifierName":{"id":13828,"name":"ContractOwnershipFacet","nameLocations":["528:22:85"],"nodeType":"IdentifierPath","referencedDeclaration":8436,"src":"528:22:85"},"nodeType":"ModifierInvocation","src":"528:41:85"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13827,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13826,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"509:17:85","nodeType":"VariableDeclaration","scope":13833,"src":"490:36:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13825,"nodeType":"UserDefinedTypeName","pathNode":{"id":13824,"name":"IForwarderRegistry","nameLocations":["490:18:85"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"490:18:85"},"referencedDeclaration":13386,"src":"490:18:85","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"489:38:85"},"returnParameters":{"id":13831,"nodeType":"ParameterList","parameters":[],"src":"570:0:85"},"scope":13872,"src":"478:94:85","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13846,"nodeType":"Block","src":"641:82:85","statements":[{"expression":{"arguments":[{"id":13843,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13835,"src":"708:7:85","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13838,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"651:24:85","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":13840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"676:6:85","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"651:31:85","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":13841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"651:33:85","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":13842,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"685:22:85","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"651:56:85","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":13844,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"651:65:85","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13845,"nodeType":"ExpressionStatement","src":"651:65:85"}]},"functionSelector":"97883ae2","id":13847,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"587:22:85","nodeType":"FunctionDefinition","parameters":{"id":13836,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13835,"mutability":"mutable","name":"account","nameLocation":"618:7:85","nodeType":"VariableDeclaration","scope":13847,"src":"610:15:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13834,"name":"address","nodeType":"ElementaryTypeName","src":"610:7:85","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"609:17:85"},"returnParameters":{"id":13837,"nodeType":"ParameterList","parameters":[],"src":"641:0:85"},"scope":13872,"src":"578:145:85","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13861,"nodeType":"Block","src":"822:95:85","statements":[{"expression":{"arguments":[{"id":13857,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13849,"src":"886:14:85","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13858,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13851,"src":"902:7:85","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13854,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"832:24:85","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":13856,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"857:28:85","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9096,"src":"832:53:85","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) view"}},"id":13859,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"832:78:85","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13860,"nodeType":"ExpressionStatement","src":"832:78:85"}]},"functionSelector":"7e7d9f83","id":13862,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"738:28:85","nodeType":"FunctionDefinition","parameters":{"id":13852,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13849,"mutability":"mutable","name":"targetContract","nameLocation":"775:14:85","nodeType":"VariableDeclaration","scope":13862,"src":"767:22:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13848,"name":"address","nodeType":"ElementaryTypeName","src":"767:7:85","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13851,"mutability":"mutable","name":"account","nameLocation":"799:7:85","nodeType":"VariableDeclaration","scope":13862,"src":"791:15:85","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13850,"name":"address","nodeType":"ElementaryTypeName","src":"791:7:85","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"766:41:85"},"returnParameters":{"id":13853,"nodeType":"ParameterList","parameters":[],"src":"822:0:85"},"scope":13872,"src":"729:188:85","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13870,"nodeType":"Block","src":"983:34:85","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13867,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[8435],"referencedDeclaration":8435,"src":"1000:8:85","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1000:10:85","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13866,"id":13869,"nodeType":"Return","src":"993:17:85"}]},"functionSelector":"31e66e1e","id":13871,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"932:9:85","nodeType":"FunctionDefinition","parameters":{"id":13863,"nodeType":"ParameterList","parameters":[],"src":"941:2:85"},"returnParameters":{"id":13866,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13865,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13871,"src":"967:14:85","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13864,"name":"bytes","nodeType":"ElementaryTypeName","src":"967:5:85","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"966:16:85"},"scope":13872,"src":"923:94:85","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13873,"src":"337:682:85","usedErrors":[8239,8246,8258,11559,19183,19192],"usedEvents":[8287]}],"src":"32:988:85"},"id":85},"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"SafeContractOwnershipFacet":[8526],"SafeContractOwnershipFacetMock":[13935],"SafeContractOwnershipStorage":[9462]},"id":13936,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13874,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:86"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":13876,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13936,"sourceUnit":13387,"src":"57:87:86","symbolAliases":[{"foreign":{"id":13875,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:86","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/SafeContractOwnershipStorage.sol","file":"./../../../access/libraries/SafeContractOwnershipStorage.sol","id":13878,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13936,"sourceUnit":9463,"src":"145:106:86","symbolAliases":[{"foreign":{"id":13877,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"153:28:86","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/facets/SafeContractOwnershipFacet.sol","file":"./../../../access/facets/SafeContractOwnershipFacet.sol","id":13880,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13936,"sourceUnit":8527,"src":"252:99:86","symbolAliases":[{"foreign":{"id":13879,"name":"SafeContractOwnershipFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8526,"src":"260:26:86","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13881,"name":"SafeContractOwnershipFacet","nameLocations":["396:26:86"],"nodeType":"IdentifierPath","referencedDeclaration":8526,"src":"396:26:86"},"id":13882,"nodeType":"InheritanceSpecifier","src":"396:26:86"}],"canonicalName":"SafeContractOwnershipFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13935,"linearizedBaseContracts":[13935,8526,13297,8214,1206,8588],"name":"SafeContractOwnershipFacetMock","nameLocation":"362:30:86","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13886,"libraryName":{"id":13883,"name":"SafeContractOwnershipStorage","nameLocations":["435:28:86"],"nodeType":"IdentifierPath","referencedDeclaration":9462,"src":"435:28:86"},"nodeType":"UsingForDirective","src":"429:75:86","typeName":{"id":13885,"nodeType":"UserDefinedTypeName","pathNode":{"id":13884,"name":"SafeContractOwnershipStorage.Layout","nameLocations":["468:28:86","497:6:86"],"nodeType":"IdentifierPath","referencedDeclaration":9144,"src":"468:35:86"},"referencedDeclaration":9144,"src":"468:35:86","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout"}}},{"body":{"id":13895,"nodeType":"Block","src":"606:2:86","statements":[]},"id":13896,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":13892,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13889,"src":"587:17:86","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":13893,"kind":"baseConstructorSpecifier","modifierName":{"id":13891,"name":"SafeContractOwnershipFacet","nameLocations":["560:26:86"],"nodeType":"IdentifierPath","referencedDeclaration":8526,"src":"560:26:86"},"nodeType":"ModifierInvocation","src":"560:45:86"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13890,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13889,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"541:17:86","nodeType":"VariableDeclaration","scope":13896,"src":"522:36:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":13888,"nodeType":"UserDefinedTypeName","pathNode":{"id":13887,"name":"IForwarderRegistry","nameLocations":["522:18:86"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"522:18:86"},"referencedDeclaration":13386,"src":"522:18:86","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"521:38:86"},"returnParameters":{"id":13894,"nodeType":"ParameterList","parameters":[],"src":"606:0:86"},"scope":13935,"src":"510:98:86","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":13909,"nodeType":"Block","src":"677:86:86","statements":[{"expression":{"arguments":[{"id":13906,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13898,"src":"748:7:86","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":13901,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"687:28:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":13903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"716:6:86","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9461,"src":"687:35:86","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function () pure returns (struct SafeContractOwnershipStorage.Layout storage pointer)"}},"id":13904,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"687:37:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$9144_storage_ptr","typeString":"struct SafeContractOwnershipStorage.Layout storage pointer"}},"id":13905,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"725:22:86","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9429,"src":"687:60:86","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$9144_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$9144_storage_ptr_$","typeString":"function (struct SafeContractOwnershipStorage.Layout storage pointer,address) view"}},"id":13907,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"687:69:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13908,"nodeType":"ExpressionStatement","src":"687:69:86"}]},"functionSelector":"97883ae2","id":13910,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsContractOwner","nameLocation":"623:22:86","nodeType":"FunctionDefinition","parameters":{"id":13899,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13898,"mutability":"mutable","name":"account","nameLocation":"654:7:86","nodeType":"VariableDeclaration","scope":13910,"src":"646:15:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13897,"name":"address","nodeType":"ElementaryTypeName","src":"646:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"645:17:86"},"returnParameters":{"id":13900,"nodeType":"ParameterList","parameters":[],"src":"677:0:86"},"scope":13935,"src":"614:149:86","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13924,"nodeType":"Block","src":"862:99:86","statements":[{"expression":{"arguments":[{"id":13920,"name":"targetContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13912,"src":"930:14:86","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":13921,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13914,"src":"946:7:86","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":13917,"name":"SafeContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9462,"src":"872:28:86","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SafeContractOwnershipStorage_$9462_$","typeString":"type(library SafeContractOwnershipStorage)"}},"id":13919,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"901:28:86","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9449,"src":"872:57:86","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$","typeString":"function (address,address) view"}},"id":13922,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"872:82:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13923,"nodeType":"ExpressionStatement","src":"872:82:86"}]},"functionSelector":"7e7d9f83","id":13925,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsTargetContractOwner","nameLocation":"778:28:86","nodeType":"FunctionDefinition","parameters":{"id":13915,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13912,"mutability":"mutable","name":"targetContract","nameLocation":"815:14:86","nodeType":"VariableDeclaration","scope":13925,"src":"807:22:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13911,"name":"address","nodeType":"ElementaryTypeName","src":"807:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":13914,"mutability":"mutable","name":"account","nameLocation":"839:7:86","nodeType":"VariableDeclaration","scope":13925,"src":"831:15:86","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13913,"name":"address","nodeType":"ElementaryTypeName","src":"831:7:86","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"806:41:86"},"returnParameters":{"id":13916,"nodeType":"ParameterList","parameters":[],"src":"862:0:86"},"scope":13935,"src":"769:192:86","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":13933,"nodeType":"Block","src":"1027:34:86","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":13930,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[8525],"referencedDeclaration":8525,"src":"1044:8:86","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":13931,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1044:10:86","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":13929,"id":13932,"nodeType":"Return","src":"1037:17:86"}]},"functionSelector":"31e66e1e","id":13934,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"976:9:86","nodeType":"FunctionDefinition","parameters":{"id":13926,"nodeType":"ParameterList","parameters":[],"src":"985:2:86"},"returnParameters":{"id":13929,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13928,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":13934,"src":"1011:14:86","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":13927,"name":"bytes","nodeType":"ElementaryTypeName","src":"1011:5:86","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1010:16:86"},"scope":13935,"src":"967:94:86","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13936,"src":"353:710:86","usedErrors":[8239,8246,8251,8258,11559,19183,19192],"usedEvents":[8287,8292]}],"src":"32:1032:86"},"id":86},"contracts/mocks/cryptography/ERC1654Mock.sol":{"ast":{"absolutePath":"contracts/mocks/cryptography/ERC1654Mock.sol","exportedSymbols":{"ECDSA":[3223],"ERC1271Mock":[13987],"IERC1271":[9476]},"id":13988,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13937,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:87"},{"absolutePath":"contracts/cryptography/interfaces/IERC1271.sol","file":"./../../cryptography/interfaces/IERC1271.sol","id":13939,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13988,"sourceUnit":9477,"src":"57:70:87","symbolAliases":[{"foreign":{"id":13938,"name":"IERC1271","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9476,"src":"65:8:87","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","file":"@openzeppelin/contracts/utils/cryptography/ECDSA.sol","id":13941,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":13988,"sourceUnit":3224,"src":"128:75:87","symbolAliases":[{"foreign":{"id":13940,"name":"ECDSA","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":3223,"src":"136:5:87","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13942,"name":"IERC1271","nameLocations":["229:8:87"],"nodeType":"IdentifierPath","referencedDeclaration":9476,"src":"229:8:87"},"id":13943,"nodeType":"InheritanceSpecifier","src":"229:8:87"}],"canonicalName":"ERC1271Mock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":13987,"linearizedBaseContracts":[13987,9476],"name":"ERC1271Mock","nameLocation":"214:11:87","nodeType":"ContractDefinition","nodes":[{"global":false,"id":13946,"libraryName":{"id":13944,"name":"ECDSA","nameLocations":["250:5:87"],"nodeType":"IdentifierPath","referencedDeclaration":3223,"src":"250:5:87"},"nodeType":"UsingForDirective","src":"244:24:87","typeName":{"id":13945,"name":"bytes32","nodeType":"ElementaryTypeName","src":"260:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}},{"constant":false,"id":13948,"mutability":"immutable","name":"_OWNER","nameLocation":"301:6:87","nodeType":"VariableDeclaration","scope":13987,"src":"274:33:87","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13947,"name":"address","nodeType":"ElementaryTypeName","src":"274:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"body":{"id":13957,"nodeType":"Block","src":"341:31:87","statements":[{"expression":{"id":13955,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":13953,"name":"_OWNER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13948,"src":"351:6:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":13954,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13950,"src":"360:5:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"351:14:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":13956,"nodeType":"ExpressionStatement","src":"351:14:87"}]},"id":13958,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":13951,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13950,"mutability":"mutable","name":"owner","nameLocation":"334:5:87","nodeType":"VariableDeclaration","scope":13958,"src":"326:13:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13949,"name":"address","nodeType":"ElementaryTypeName","src":"326:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"325:15:87"},"returnParameters":{"id":13952,"nodeType":"ParameterList","parameters":[],"src":"341:0:87"},"scope":13987,"src":"314:58:87","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[9475],"body":{"id":13985,"nodeType":"Block","src":"493:178:87","statements":[{"assignments":[13969],"declarations":[{"constant":false,"id":13969,"mutability":"mutable","name":"signer","nameLocation":"511:6:87","nodeType":"VariableDeclaration","scope":13985,"src":"503:14:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":13968,"name":"address","nodeType":"ElementaryTypeName","src":"503:7:87","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":13974,"initialValue":{"arguments":[{"id":13972,"name":"signature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13962,"src":"533:9:87","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":13970,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13960,"src":"520:4:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":13971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"525:7:87","memberName":"recover","nodeType":"MemberAccess","referencedDeclaration":2979,"src":"520:12:87","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$attached_to$_t_bytes32_$","typeString":"function (bytes32,bytes memory) pure returns (address)"}},"id":13973,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"520:23:87","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"503:40:87"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":13977,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":13975,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13969,"src":"557:6:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":13976,"name":"_OWNER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13948,"src":"567:6:87","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"557:16:87","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":13983,"nodeType":"Block","src":"623:42:87","statements":[{"expression":{"hexValue":"30786666666666666666","id":13981,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"644:10:87","typeDescriptions":{"typeIdentifier":"t_rational_4294967295_by_1","typeString":"int_const 4294967295"},"value":"0xffffffff"},"functionReturnParameters":13967,"id":13982,"nodeType":"Return","src":"637:17:87"}]},"id":13984,"nodeType":"IfStatement","src":"553:112:87","trueBody":{"id":13980,"nodeType":"Block","src":"575:42:87","statements":[{"expression":{"hexValue":"30783136323662613765","id":13978,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"596:10:87","typeDescriptions":{"typeIdentifier":"t_rational_371636862_by_1","typeString":"int_const 371636862"},"value":"0x1626ba7e"},"functionReturnParameters":13967,"id":13979,"nodeType":"Return","src":"589:17:87"}]}}]},"functionSelector":"1626ba7e","id":13986,"implemented":true,"kind":"function","modifiers":[],"name":"isValidSignature","nameLocation":"387:16:87","nodeType":"FunctionDefinition","overrides":{"id":13964,"nodeType":"OverrideSpecifier","overrides":[],"src":"456:8:87"},"parameters":{"id":13963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13960,"mutability":"mutable","name":"hash","nameLocation":"412:4:87","nodeType":"VariableDeclaration","scope":13986,"src":"404:12:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":13959,"name":"bytes32","nodeType":"ElementaryTypeName","src":"404:7:87","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":13962,"mutability":"mutable","name":"signature","nameLocation":"431:9:87","nodeType":"VariableDeclaration","scope":13986,"src":"418:22:87","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":13961,"name":"bytes","nodeType":"ElementaryTypeName","src":"418:5:87","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"403:38:87"},"returnParameters":{"id":13967,"nodeType":"ParameterList","parameters":[{"constant":false,"id":13966,"mutability":"mutable","name":"magicValue","nameLocation":"481:10:87","nodeType":"VariableDeclaration","scope":13986,"src":"474:17:87","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":13965,"name":"bytes4","nodeType":"ElementaryTypeName","src":"474:6:87","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"473:19:87"},"scope":13987,"src":"378:293:87","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":13988,"src":"205:468:87","usedErrors":[2886,2891,2896],"usedEvents":[]}],"src":"32:642:87"},"id":87},"contracts/mocks/diamond/DiamondMock.sol":{"ast":{"absolutePath":"contracts/mocks/diamond/DiamondMock.sol","exportedSymbols":{"Diamond":[9533],"DiamondMock":[14098],"DiamondStorage":[11524],"FacetCut":[9555],"FacetCutAction":[9546],"Initialization":[9560]},"id":14099,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":13989,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:88"},{"absolutePath":"contracts/diamond/DiamondCommon.sol","file":"./../../diamond/DiamondCommon.sol","id":13993,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14099,"sourceUnit":9561,"src":"57:91:88","symbolAliases":[{"foreign":{"id":13990,"name":"FacetCutAction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9546,"src":"65:14:88","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":13991,"name":"FacetCut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9555,"src":"81:8:88","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":13992,"name":"Initialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9560,"src":"91:14:88","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/libraries/DiamondStorage.sol","file":"./../../diamond/libraries/DiamondStorage.sol","id":13995,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14099,"sourceUnit":11525,"src":"149:76:88","symbolAliases":[{"foreign":{"id":13994,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"157:14:88","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/diamond/Diamond.sol","file":"./../../diamond/Diamond.sol","id":13997,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14099,"sourceUnit":9534,"src":"226:52:88","symbolAliases":[{"foreign":{"id":13996,"name":"Diamond","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9533,"src":"234:7:88","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":13998,"name":"Diamond","nameLocations":["304:7:88"],"nodeType":"IdentifierPath","referencedDeclaration":9533,"src":"304:7:88"},"id":13999,"nodeType":"InheritanceSpecifier","src":"304:7:88"}],"canonicalName":"DiamondMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14098,"linearizedBaseContracts":[14098,9533],"name":"DiamondMock","nameLocation":"289:11:88","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14003,"libraryName":{"id":14000,"name":"DiamondStorage","nameLocations":["324:14:88"],"nodeType":"IdentifierPath","referencedDeclaration":11524,"src":"324:14:88"},"nodeType":"UsingForDirective","src":"318:47:88","typeName":{"id":14002,"nodeType":"UserDefinedTypeName","pathNode":{"id":14001,"name":"DiamondStorage.Layout","nameLocations":["343:14:88","358:6:88"],"nodeType":"IdentifierPath","referencedDeclaration":10024,"src":"343:21:88"},"referencedDeclaration":10024,"src":"343:21:88","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout"}}},{"anonymous":false,"eventSelector":"722d29b00acdf165bd4f9387f49041b6ff0b811414a43fd05527a13121fd7d34","id":14005,"name":"ImmutableFunctionCalled","nameLocation":"377:23:88","nodeType":"EventDefinition","parameters":{"id":14004,"nodeType":"ParameterList","parameters":[],"src":"400:2:88"},"src":"371:32:88"},{"body":{"id":14089,"nodeType":"Block","src":"525:360:88","statements":[{"assignments":[14024],"declarations":[{"constant":false,"id":14024,"mutability":"mutable","name":"selectors","nameLocation":"551:9:88","nodeType":"VariableDeclaration","scope":14089,"src":"535:25:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[]"},"typeName":{"baseType":{"id":14022,"name":"bytes4","nodeType":"ElementaryTypeName","src":"535:6:88","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":14023,"nodeType":"ArrayTypeName","src":"535:8:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}},"visibility":"internal"}],"id":14030,"initialValue":{"arguments":[{"hexValue":"31","id":14028,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"576:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":14027,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"563:12:88","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes4_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (bytes4[] memory)"},"typeName":{"baseType":{"id":14025,"name":"bytes4","nodeType":"ElementaryTypeName","src":"567:6:88","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":14026,"nodeType":"ArrayTypeName","src":"567:8:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_storage_ptr","typeString":"bytes4[]"}}},"id":14029,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"563:15:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"VariableDeclarationStatement","src":"535:43:88"},{"expression":{"id":14037,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":14031,"name":"selectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14024,"src":"588:9:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":14033,"indexExpression":{"hexValue":"30","id":14032,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"598:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"588:12:88","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"expression":{"id":14034,"name":"DiamondMock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14098,"src":"603:11:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondMock_$14098_$","typeString":"type(contract DiamondMock)"}},"id":14035,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"615:17:88","memberName":"immutableFunction","nodeType":"MemberAccess","referencedDeclaration":14097,"src":"603:29:88","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$__$returns$__$","typeString":"function DiamondMock.immutableFunction()"}},"id":14036,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"633:8:88","memberName":"selector","nodeType":"MemberAccess","src":"603:38:88","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"588:53:88","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"id":14038,"nodeType":"ExpressionStatement","src":"588:53:88"},{"assignments":[14043],"declarations":[{"constant":false,"id":14043,"mutability":"mutable","name":"cut","nameLocation":"669:3:88","nodeType":"VariableDeclaration","scope":14089,"src":"651:21:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":14041,"nodeType":"UserDefinedTypeName","pathNode":{"id":14040,"name":"FacetCut","nameLocations":["651:8:88"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"651:8:88"},"referencedDeclaration":9555,"src":"651:8:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":14042,"nodeType":"ArrayTypeName","src":"651:10:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"}],"id":14050,"initialValue":{"arguments":[{"hexValue":"31","id":14048,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"690:1:88","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"id":14047,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"675:14:88","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct FacetCut memory[] memory)"},"typeName":{"baseType":{"id":14045,"nodeType":"UserDefinedTypeName","pathNode":{"id":14044,"name":"FacetCut","nameLocations":["679:8:88"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"679:8:88"},"referencedDeclaration":9555,"src":"679:8:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":14046,"nodeType":"ArrayTypeName","src":"679:10:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}}},"id":14049,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"675:17:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"651:41:88"},{"expression":{"id":14059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":14051,"name":"cut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14043,"src":"702:3:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"id":14053,"indexExpression":{"hexValue":"30","id":14052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"706:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"702:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":14054,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"709:5:88","memberName":"facet","nodeType":"MemberAccess","referencedDeclaration":9548,"src":"702:12:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":14057,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"725:4:88","typeDescriptions":{"typeIdentifier":"t_contract$_DiamondMock_$14098","typeString":"contract DiamondMock"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_DiamondMock_$14098","typeString":"contract DiamondMock"}],"id":14056,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"717:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14055,"name":"address","nodeType":"ElementaryTypeName","src":"717:7:88","typeDescriptions":{}}},"id":14058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"717:13:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"702:28:88","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14060,"nodeType":"ExpressionStatement","src":"702:28:88"},{"expression":{"id":14067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":14061,"name":"cut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14043,"src":"740:3:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"id":14063,"indexExpression":{"hexValue":"30","id":14062,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"744:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"740:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":14064,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"747:6:88","memberName":"action","nodeType":"MemberAccess","referencedDeclaration":9551,"src":"740:13:88","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":14065,"name":"FacetCutAction","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9546,"src":"756:14:88","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_FacetCutAction_$9546_$","typeString":"type(enum FacetCutAction)"}},"id":14066,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"771:3:88","memberName":"ADD","nodeType":"MemberAccess","referencedDeclaration":9543,"src":"756:18:88","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"src":"740:34:88","typeDescriptions":{"typeIdentifier":"t_enum$_FacetCutAction_$9546","typeString":"enum FacetCutAction"}},"id":14068,"nodeType":"ExpressionStatement","src":"740:34:88"},{"expression":{"id":14074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"baseExpression":{"id":14069,"name":"cut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14043,"src":"784:3:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},"id":14071,"indexExpression":{"hexValue":"30","id":14070,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"788:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"784:6:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_memory_ptr","typeString":"struct FacetCut memory"}},"id":14072,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"791:9:88","memberName":"selectors","nodeType":"MemberAccess","referencedDeclaration":9554,"src":"784:16:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14073,"name":"selectors","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14024,"src":"803:9:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"src":"784:28:88","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes4_$dyn_memory_ptr","typeString":"bytes4[] memory"}},"id":14075,"nodeType":"ExpressionStatement","src":"784:28:88"},{"expression":{"arguments":[{"id":14081,"name":"cut","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14043,"src":"858:3:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},{"arguments":[{"hexValue":"30","id":14084,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"871:1:88","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":14083,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"863:7:88","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":14082,"name":"address","nodeType":"ElementaryTypeName","src":"863:7:88","typeDescriptions":{}}},"id":14085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"863:10:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"hexValue":"","id":14086,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"875:2:88","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14076,"name":"DiamondStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11524,"src":"823:14:88","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_DiamondStorage_$11524_$","typeString":"type(library DiamondStorage)"}},"id":14078,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"838:6:88","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11523,"src":"823:21:88","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function () pure returns (struct DiamondStorage.Layout storage pointer)"}},"id":14079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"823:23:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$10024_storage_ptr","typeString":"struct DiamondStorage.Layout storage pointer"}},"id":14080,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"847:10:88","memberName":"diamondCut","nodeType":"MemberAccess","referencedDeclaration":10140,"src":"823:34:88","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$10024_storage_ptr_$_t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr_$_t_address_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$10024_storage_ptr_$","typeString":"function (struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,address,bytes memory)"}},"id":14087,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"823:55:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14088,"nodeType":"ExpressionStatement","src":"823:55:88"}]},"id":14090,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14016,"name":"cuts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14009,"src":"502:4:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut memory[] memory"}},{"id":14017,"name":"initializations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14013,"src":"508:15:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization memory[] memory"}}],"id":14018,"kind":"baseConstructorSpecifier","modifierName":{"id":14015,"name":"Diamond","nameLocations":["494:7:88"],"nodeType":"IdentifierPath","referencedDeclaration":9533,"src":"494:7:88"},"nodeType":"ModifierInvocation","src":"494:30:88"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14014,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14009,"mutability":"mutable","name":"cuts","nameLocation":"439:4:88","nodeType":"VariableDeclaration","scope":14090,"src":"421:22:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_memory_ptr_$dyn_memory_ptr","typeString":"struct FacetCut[]"},"typeName":{"baseType":{"id":14007,"nodeType":"UserDefinedTypeName","pathNode":{"id":14006,"name":"FacetCut","nameLocations":["421:8:88"],"nodeType":"IdentifierPath","referencedDeclaration":9555,"src":"421:8:88"},"referencedDeclaration":9555,"src":"421:8:88","typeDescriptions":{"typeIdentifier":"t_struct$_FacetCut_$9555_storage_ptr","typeString":"struct FacetCut"}},"id":14008,"nodeType":"ArrayTypeName","src":"421:10:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_FacetCut_$9555_storage_$dyn_storage_ptr","typeString":"struct FacetCut[]"}},"visibility":"internal"},{"constant":false,"id":14013,"mutability":"mutable","name":"initializations","nameLocation":"469:15:88","nodeType":"VariableDeclaration","scope":14090,"src":"445:39:88","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_memory_ptr_$dyn_memory_ptr","typeString":"struct Initialization[]"},"typeName":{"baseType":{"id":14011,"nodeType":"UserDefinedTypeName","pathNode":{"id":14010,"name":"Initialization","nameLocations":["445:14:88"],"nodeType":"IdentifierPath","referencedDeclaration":9560,"src":"445:14:88"},"referencedDeclaration":9560,"src":"445:14:88","typeDescriptions":{"typeIdentifier":"t_struct$_Initialization_$9560_storage_ptr","typeString":"struct Initialization"}},"id":14012,"nodeType":"ArrayTypeName","src":"445:16:88","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Initialization_$9560_storage_$dyn_storage_ptr","typeString":"struct Initialization[]"}},"visibility":"internal"}],"src":"420:65:88"},"returnParameters":{"id":14019,"nodeType":"ParameterList","parameters":[],"src":"525:0:88"},"scope":14098,"src":"409:476:88","stateMutability":"payable","virtual":false,"visibility":"public"},{"body":{"id":14096,"nodeType":"Block","src":"929:47:88","statements":[{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":14093,"name":"ImmutableFunctionCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14005,"src":"944:23:88","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":14094,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"944:25:88","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14095,"nodeType":"EmitStatement","src":"939:30:88"}]},"functionSelector":"ba7fabfd","id":14097,"implemented":true,"kind":"function","modifiers":[],"name":"immutableFunction","nameLocation":"900:17:88","nodeType":"FunctionDefinition","parameters":{"id":14091,"nodeType":"ParameterList","parameters":[],"src":"917:2:88"},"returnParameters":{"id":14092,"nodeType":"ParameterList","parameters":[],"src":"929:0:88"},"scope":14098,"src":"891:85:88","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":14099,"src":"280:698:88","usedErrors":[7883,9567,9572,9579,9584,9589,9594,9601,9604,9609,9614,9621],"usedEvents":[9637,14005]}],"src":"32:947:88"},"id":88},"contracts/mocks/diamond/FacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/diamond/FacetMock.sol","exportedSymbols":{"FacetMock":[14170]},"id":14171,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14100,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:89"},{"abstract":false,"baseContracts":[],"canonicalName":"FacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14170,"linearizedBaseContracts":[14170],"name":"FacetMock","nameLocation":"66:9:89","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"84728df003805e87a3a67d30130f2d8b759b34815dac8d22a3e4fcaf3a4f2d6d","id":14102,"name":"FacetFunctionCalled","nameLocation":"88:19:89","nodeType":"EventDefinition","parameters":{"id":14101,"nodeType":"ParameterList","parameters":[],"src":"107:2:89"},"src":"82:28:89"},{"errorSelector":"96596b5b","id":14104,"name":"RevertedWithMessage","nameLocation":"122:19:89","nodeType":"ErrorDefinition","parameters":{"id":14103,"nodeType":"ParameterList","parameters":[],"src":"141:2:89"},"src":"116:28:89"},{"body":{"id":14110,"nodeType":"Block","src":"182:43:89","statements":[{"eventCall":{"arguments":[],"expression":{"argumentTypes":[],"id":14107,"name":"FacetFunctionCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14102,"src":"197:19:89","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$__$returns$__$","typeString":"function ()"}},"id":14108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"197:21:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14109,"nodeType":"EmitStatement","src":"192:26:89"}]},"functionSelector":"82692679","id":14111,"implemented":true,"kind":"function","modifiers":[],"name":"doSomething","nameLocation":"159:11:89","nodeType":"FunctionDefinition","parameters":{"id":14105,"nodeType":"ParameterList","parameters":[],"src":"170:2:89"},"returnParameters":{"id":14106,"nodeType":"ParameterList","parameters":[],"src":"182:0:89"},"scope":14170,"src":"150:75:89","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":14117,"nodeType":"Block","src":"278:95:89","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14114,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"358:6:89","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$__$returns$__$","typeString":"function () pure"}},"id":14115,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"358:8:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14116,"nodeType":"ExpressionStatement","src":"358:8:89"}]},"functionSelector":"ea18c283","id":14118,"implemented":true,"kind":"function","modifiers":[],"name":"revertsWithoutMessage","nameLocation":"240:21:89","nodeType":"FunctionDefinition","parameters":{"id":14112,"nodeType":"ParameterList","parameters":[],"src":"261:2:89"},"returnParameters":{"id":14113,"nodeType":"ParameterList","parameters":[],"src":"278:0:89"},"scope":14170,"src":"231:142:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14124,"nodeType":"Block","src":"423:45:89","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":14121,"name":"RevertedWithMessage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14104,"src":"440:19:89","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":14122,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"440:21:89","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":14123,"nodeType":"RevertStatement","src":"433:28:89"}]},"functionSelector":"3787b426","id":14125,"implemented":true,"kind":"function","modifiers":[],"name":"revertsWithMessage","nameLocation":"388:18:89","nodeType":"FunctionDefinition","parameters":{"id":14119,"nodeType":"ParameterList","parameters":[],"src":"406:2:89"},"returnParameters":{"id":14120,"nodeType":"ParameterList","parameters":[],"src":"423:0:89"},"scope":14170,"src":"379:89:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14128,"nodeType":"Block","src":"606:2:89","statements":[]},"functionSelector":"0dbe671f","id":14129,"implemented":true,"kind":"function","modifiers":[],"name":"a","nameLocation":"588:1:89","nodeType":"FunctionDefinition","parameters":{"id":14126,"nodeType":"ParameterList","parameters":[],"src":"589:2:89"},"returnParameters":{"id":14127,"nodeType":"ParameterList","parameters":[],"src":"606:0:89"},"scope":14170,"src":"579:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14132,"nodeType":"Block","src":"641:2:89","statements":[]},"functionSelector":"4df7e3d0","id":14133,"implemented":true,"kind":"function","modifiers":[],"name":"b","nameLocation":"623:1:89","nodeType":"FunctionDefinition","parameters":{"id":14130,"nodeType":"ParameterList","parameters":[],"src":"624:2:89"},"returnParameters":{"id":14131,"nodeType":"ParameterList","parameters":[],"src":"641:0:89"},"scope":14170,"src":"614:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14136,"nodeType":"Block","src":"676:2:89","statements":[]},"functionSelector":"c3da42b8","id":14137,"implemented":true,"kind":"function","modifiers":[],"name":"c","nameLocation":"658:1:89","nodeType":"FunctionDefinition","parameters":{"id":14134,"nodeType":"ParameterList","parameters":[],"src":"659:2:89"},"returnParameters":{"id":14135,"nodeType":"ParameterList","parameters":[],"src":"676:0:89"},"scope":14170,"src":"649:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14140,"nodeType":"Block","src":"711:2:89","statements":[]},"functionSelector":"8a054ac2","id":14141,"implemented":true,"kind":"function","modifiers":[],"name":"d","nameLocation":"693:1:89","nodeType":"FunctionDefinition","parameters":{"id":14138,"nodeType":"ParameterList","parameters":[],"src":"694:2:89"},"returnParameters":{"id":14139,"nodeType":"ParameterList","parameters":[],"src":"711:0:89"},"scope":14170,"src":"684:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14144,"nodeType":"Block","src":"746:2:89","statements":[]},"functionSelector":"ffae15ba","id":14145,"implemented":true,"kind":"function","modifiers":[],"name":"e","nameLocation":"728:1:89","nodeType":"FunctionDefinition","parameters":{"id":14142,"nodeType":"ParameterList","parameters":[],"src":"729:2:89"},"returnParameters":{"id":14143,"nodeType":"ParameterList","parameters":[],"src":"746:0:89"},"scope":14170,"src":"719:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14148,"nodeType":"Block","src":"781:2:89","statements":[]},"functionSelector":"26121ff0","id":14149,"implemented":true,"kind":"function","modifiers":[],"name":"f","nameLocation":"763:1:89","nodeType":"FunctionDefinition","parameters":{"id":14146,"nodeType":"ParameterList","parameters":[],"src":"764:2:89"},"returnParameters":{"id":14147,"nodeType":"ParameterList","parameters":[],"src":"781:0:89"},"scope":14170,"src":"754:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14152,"nodeType":"Block","src":"816:2:89","statements":[]},"functionSelector":"e2179b8e","id":14153,"implemented":true,"kind":"function","modifiers":[],"name":"g","nameLocation":"798:1:89","nodeType":"FunctionDefinition","parameters":{"id":14150,"nodeType":"ParameterList","parameters":[],"src":"799:2:89"},"returnParameters":{"id":14151,"nodeType":"ParameterList","parameters":[],"src":"816:0:89"},"scope":14170,"src":"789:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14156,"nodeType":"Block","src":"851:2:89","statements":[]},"functionSelector":"b8c9d365","id":14157,"implemented":true,"kind":"function","modifiers":[],"name":"h","nameLocation":"833:1:89","nodeType":"FunctionDefinition","parameters":{"id":14154,"nodeType":"ParameterList","parameters":[],"src":"834:2:89"},"returnParameters":{"id":14155,"nodeType":"ParameterList","parameters":[],"src":"851:0:89"},"scope":14170,"src":"824:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14160,"nodeType":"Block","src":"886:2:89","statements":[]},"functionSelector":"e5aa3d58","id":14161,"implemented":true,"kind":"function","modifiers":[],"name":"i","nameLocation":"868:1:89","nodeType":"FunctionDefinition","parameters":{"id":14158,"nodeType":"ParameterList","parameters":[],"src":"869:2:89"},"returnParameters":{"id":14159,"nodeType":"ParameterList","parameters":[],"src":"886:0:89"},"scope":14170,"src":"859:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14164,"nodeType":"Block","src":"921:2:89","statements":[]},"functionSelector":"b582ec5f","id":14165,"implemented":true,"kind":"function","modifiers":[],"name":"j","nameLocation":"903:1:89","nodeType":"FunctionDefinition","parameters":{"id":14162,"nodeType":"ParameterList","parameters":[],"src":"904:2:89"},"returnParameters":{"id":14163,"nodeType":"ParameterList","parameters":[],"src":"921:0:89"},"scope":14170,"src":"894:29:89","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":14168,"nodeType":"Block","src":"956:2:89","statements":[]},"functionSelector":"b4f40c61","id":14169,"implemented":true,"kind":"function","modifiers":[],"name":"k","nameLocation":"938:1:89","nodeType":"FunctionDefinition","parameters":{"id":14166,"nodeType":"ParameterList","parameters":[],"src":"939:2:89"},"returnParameters":{"id":14167,"nodeType":"ParameterList","parameters":[],"src":"956:0:89"},"scope":14170,"src":"929:29:89","stateMutability":"pure","virtual":false,"visibility":"external"}],"scope":14171,"src":"57:903:89","usedErrors":[14104],"usedEvents":[14102]}],"src":"32:929:89"},"id":89},"contracts/mocks/introspection/InterfaceDetectionMock.sol":{"ast":{"absolutePath":"contracts/mocks/introspection/InterfaceDetectionMock.sol","exportedSymbols":{"InterfaceDetection":[11554],"InterfaceDetectionMock":[14200],"InterfaceDetectionStorage":[11680]},"id":14201,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14172,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:90"},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":14174,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14201,"sourceUnit":11681,"src":"57:104:90","symbolAliases":[{"foreign":{"id":14173,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"65:25:90","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":14176,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14201,"sourceUnit":11555,"src":"162:80:90","symbolAliases":[{"foreign":{"id":14175,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"170:18:90","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14177,"name":"InterfaceDetection","nameLocations":["279:18:90"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"279:18:90"},"id":14178,"nodeType":"InheritanceSpecifier","src":"279:18:90"}],"canonicalName":"InterfaceDetectionMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14200,"linearizedBaseContracts":[14200,11554,11579],"name":"InterfaceDetectionMock","nameLocation":"253:22:90","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14182,"libraryName":{"id":14179,"name":"InterfaceDetectionStorage","nameLocations":["310:25:90"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"310:25:90"},"nodeType":"UsingForDirective","src":"304:69:90","typeName":{"id":14181,"nodeType":"UserDefinedTypeName","pathNode":{"id":14180,"name":"InterfaceDetectionStorage.Layout","nameLocations":["340:25:90","366:6:90"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"340:32:90"},"referencedDeclaration":11590,"src":"340:32:90","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":14198,"nodeType":"Block","src":"455:97:90","statements":[{"expression":{"arguments":[{"id":14194,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14184,"src":"522:11:90","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":14195,"name":"supported","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14186,"src":"535:9:90","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14189,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"465:25:90","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":14191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"491:6:90","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"465:32:90","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":14192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"465:34:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":14193,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"500:21:90","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"465:56:90","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":14196,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"465:80:90","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14197,"nodeType":"ExpressionStatement","src":"465:80:90"}]},"functionSelector":"7f73528b","id":14199,"implemented":true,"kind":"function","modifiers":[],"name":"setSupportedInterface","nameLocation":"388:21:90","nodeType":"FunctionDefinition","parameters":{"id":14187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14184,"mutability":"mutable","name":"interfaceId","nameLocation":"417:11:90","nodeType":"VariableDeclaration","scope":14199,"src":"410:18:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":14183,"name":"bytes4","nodeType":"ElementaryTypeName","src":"410:6:90","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"constant":false,"id":14186,"mutability":"mutable","name":"supported","nameLocation":"435:9:90","nodeType":"VariableDeclaration","scope":14199,"src":"430:14:90","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":14185,"name":"bool","nodeType":"ElementaryTypeName","src":"430:4:90","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"409:36:90"},"returnParameters":{"id":14188,"nodeType":"ParameterList","parameters":[],"src":"455:0:90"},"scope":14200,"src":"379:173:90","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":14201,"src":"244:310:90","usedErrors":[11559],"usedEvents":[]}],"src":"32:523:90"},"id":90},"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol","exportedSymbols":{"InterfaceDetectionFacet":[11567],"InterfaceDetectionFacetMock":[14230],"InterfaceDetectionStorage":[11680]},"id":14231,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14202,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:91"},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":14204,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14231,"sourceUnit":11681,"src":"57:107:91","symbolAliases":[{"foreign":{"id":14203,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"65:25:91","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/facets/InterfaceDetectionFacet.sol","file":"./../../../introspection/facets/InterfaceDetectionFacet.sol","id":14206,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14231,"sourceUnit":11568,"src":"165:100:91","symbolAliases":[{"foreign":{"id":14205,"name":"InterfaceDetectionFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11567,"src":"173:23:91","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14207,"name":"InterfaceDetectionFacet","nameLocations":["307:23:91"],"nodeType":"IdentifierPath","referencedDeclaration":11567,"src":"307:23:91"},"id":14208,"nodeType":"InheritanceSpecifier","src":"307:23:91"}],"canonicalName":"InterfaceDetectionFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14230,"linearizedBaseContracts":[14230,11567,11554,11579],"name":"InterfaceDetectionFacetMock","nameLocation":"276:27:91","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14212,"libraryName":{"id":14209,"name":"InterfaceDetectionStorage","nameLocations":["343:25:91"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"343:25:91"},"nodeType":"UsingForDirective","src":"337:69:91","typeName":{"id":14211,"nodeType":"UserDefinedTypeName","pathNode":{"id":14210,"name":"InterfaceDetectionStorage.Layout","nameLocations":["373:25:91","399:6:91"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"373:32:91"},"referencedDeclaration":11590,"src":"373:32:91","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":14228,"nodeType":"Block","src":"488:97:91","statements":[{"expression":{"arguments":[{"id":14224,"name":"interfaceId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14214,"src":"555:11:91","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":14225,"name":"supported","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14216,"src":"568:9:91","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14219,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"498:25:91","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":14221,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"524:6:91","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"498:32:91","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":14222,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"498:34:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":14223,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"533:21:91","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"498:56:91","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":14226,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"498:80:91","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14227,"nodeType":"ExpressionStatement","src":"498:80:91"}]},"functionSelector":"7f73528b","id":14229,"implemented":true,"kind":"function","modifiers":[],"name":"setSupportedInterface","nameLocation":"421:21:91","nodeType":"FunctionDefinition","parameters":{"id":14217,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14214,"mutability":"mutable","name":"interfaceId","nameLocation":"450:11:91","nodeType":"VariableDeclaration","scope":14229,"src":"443:18:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":14213,"name":"bytes4","nodeType":"ElementaryTypeName","src":"443:6:91","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"constant":false,"id":14216,"mutability":"mutable","name":"supported","nameLocation":"468:9:91","nodeType":"VariableDeclaration","scope":14229,"src":"463:14:91","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":14215,"name":"bool","nodeType":"ElementaryTypeName","src":"463:4:91","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"442:36:91"},"returnParameters":{"id":14218,"nodeType":"ParameterList","parameters":[],"src":"488:0:91"},"scope":14230,"src":"412:173:91","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":14231,"src":"267:320:91","usedErrors":[11559],"usedEvents":[]}],"src":"32:556:91"},"id":91},"contracts/mocks/lifecycle/CheckpointsMock.sol":{"ast":{"absolutePath":"contracts/mocks/lifecycle/CheckpointsMock.sol","exportedSymbols":{"Checkpoints":[11692],"CheckpointsMock":[14339],"CheckpointsStorage":[12411],"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":14340,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14232,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:92"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14234,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":13387,"src":"57:84:92","symbolAliases":[{"foreign":{"id":14233,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/CheckpointsStorage.sol","file":"./../../lifecycle/libraries/CheckpointsStorage.sol","id":14236,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":12412,"src":"142:86:92","symbolAliases":[{"foreign":{"id":14235,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"150:18:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/Checkpoints.sol","file":"./../../lifecycle/Checkpoints.sol","id":14238,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":11693,"src":"229:62:92","symbolAliases":[{"foreign":{"id":14237,"name":"Checkpoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11692,"src":"237:11:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":14240,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":7935,"src":"292:71:92","symbolAliases":[{"foreign":{"id":14239,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"300:17:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":14242,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":1207,"src":"364:66:92","symbolAliases":[{"foreign":{"id":14241,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"372:7:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":14244,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":13298,"src":"431:98:92","symbolAliases":[{"foreign":{"id":14243,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"439:28:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":14246,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14340,"sourceUnit":13143,"src":"530:85:92","symbolAliases":[{"foreign":{"id":14245,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"538:24:92","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14247,"name":"Checkpoints","nameLocations":["645:11:92"],"nodeType":"IdentifierPath","referencedDeclaration":11692,"src":"645:11:92"},"id":14248,"nodeType":"InheritanceSpecifier","src":"645:11:92"},{"baseName":{"id":14249,"name":"ForwarderRegistryContext","nameLocations":["658:24:92"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"658:24:92"},"id":14250,"nodeType":"InheritanceSpecifier","src":"658:24:92"}],"canonicalName":"CheckpointsMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14339,"linearizedBaseContracts":[14339,13142,13370,13297,11692,7934,11554,11579,8139,11861,1206,8562,12151],"name":"CheckpointsMock","nameLocation":"626:15:92","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14254,"libraryName":{"id":14251,"name":"CheckpointsStorage","nameLocations":["695:18:92"],"nodeType":"IdentifierPath","referencedDeclaration":12411,"src":"695:18:92"},"nodeType":"UsingForDirective","src":"689:55:92","typeName":{"id":14253,"nodeType":"UserDefinedTypeName","pathNode":{"id":14252,"name":"CheckpointsStorage.Layout","nameLocations":["718:18:92","737:6:92"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"718:25:92"},"referencedDeclaration":12180,"src":"718:25:92","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}}},{"constant":true,"functionSelector":"b4c6cf76","id":14257,"mutability":"constant","name":"START_CHECKPOINTID","nameLocation":"774:18:92","nodeType":"VariableDeclaration","scope":14339,"src":"750:52:92","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14255,"name":"bytes32","nodeType":"ElementaryTypeName","src":"750:7:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"5354415254","id":14256,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"795:7:92","typeDescriptions":{"typeIdentifier":"t_stringliteral_be3c26a64d88239991ba164ff2b468dd1f37dd3d8107c4c763966a7a0402c73f","typeString":"literal_string \"START\""},"value":"START"},"visibility":"public"},{"body":{"id":14272,"nodeType":"Block","src":"947:2:92","statements":[]},"id":14273,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":14263,"kind":"baseConstructorSpecifier","modifierName":{"id":14262,"name":"Checkpoints","nameLocations":["859:11:92"],"nodeType":"IdentifierPath","referencedDeclaration":11692,"src":"859:11:92"},"nodeType":"ModifierInvocation","src":"859:13:92"},{"arguments":[{"expression":{"id":14265,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"891:3:92","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14266,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"895:6:92","memberName":"sender","nodeType":"MemberAccess","src":"891:10:92","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14267,"kind":"baseConstructorSpecifier","modifierName":{"id":14264,"name":"ContractOwnership","nameLocations":["873:17:92"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"873:17:92"},"nodeType":"ModifierInvocation","src":"873:29:92"},{"arguments":[{"id":14269,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14260,"src":"928:17:92","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14270,"kind":"baseConstructorSpecifier","modifierName":{"id":14268,"name":"ForwarderRegistryContext","nameLocations":["903:24:92"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"903:24:92"},"nodeType":"ModifierInvocation","src":"903:43:92"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14261,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14260,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"840:17:92","nodeType":"VariableDeclaration","scope":14273,"src":"821:36:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14259,"nodeType":"UserDefinedTypeName","pathNode":{"id":14258,"name":"IForwarderRegistry","nameLocations":["821:18:92"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"821:18:92"},"referencedDeclaration":13386,"src":"821:18:92","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"820:38:92"},"returnParameters":{"id":14271,"nodeType":"ParameterList","parameters":[],"src":"947:0:92"},"scope":14339,"src":"809:140:92","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14286,"nodeType":"Block","src":"1025:83:92","statements":[{"expression":{"arguments":[{"id":14283,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14275,"src":"1088:12:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14278,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"1035:18:92","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":14280,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1054:6:92","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"1035:25:92","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":14281,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1035:27:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":14282,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1063:24:92","memberName":"enforceCheckpointReached","nodeType":"MemberAccess","referencedDeclaration":12379,"src":"1035:52:92","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view"}},"id":14284,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1035:66:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14285,"nodeType":"ExpressionStatement","src":"1035:66:92"}]},"functionSelector":"244c00be","id":14287,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointReached","nameLocation":"964:24:92","nodeType":"FunctionDefinition","parameters":{"id":14276,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14275,"mutability":"mutable","name":"checkpointId","nameLocation":"997:12:92","nodeType":"VariableDeclaration","scope":14287,"src":"989:20:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14274,"name":"bytes32","nodeType":"ElementaryTypeName","src":"989:7:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"988:22:92"},"returnParameters":{"id":14277,"nodeType":"ParameterList","parameters":[],"src":"1025:0:92"},"scope":14339,"src":"955:153:92","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14300,"nodeType":"Block","src":"1187:86:92","statements":[{"expression":{"arguments":[{"id":14297,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14289,"src":"1253:12:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14292,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"1197:18:92","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":14294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1216:6:92","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"1197:25:92","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":14295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1197:27:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":14296,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1225:27:92","memberName":"enforceCheckpointNotReached","nodeType":"MemberAccess","referencedDeclaration":12398,"src":"1197:55:92","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view"}},"id":14298,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1197:69:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14299,"nodeType":"ExpressionStatement","src":"1197:69:92"}]},"functionSelector":"4bddd15c","id":14301,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointNotReached","nameLocation":"1123:27:92","nodeType":"FunctionDefinition","parameters":{"id":14290,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14289,"mutability":"mutable","name":"checkpointId","nameLocation":"1159:12:92","nodeType":"VariableDeclaration","scope":14301,"src":"1151:20:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14288,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1151:7:92","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1150:22:92"},"returnParameters":{"id":14291,"nodeType":"ParameterList","parameters":[],"src":"1187:0:92"},"scope":14339,"src":"1114:159:92","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14309,"nodeType":"Block","src":"1339:34:92","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14306,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[14338],"referencedDeclaration":14338,"src":"1356:8:92","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1356:10:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14305,"id":14308,"nodeType":"Return","src":"1349:17:92"}]},"functionSelector":"31e66e1e","id":14310,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1288:9:92","nodeType":"FunctionDefinition","parameters":{"id":14302,"nodeType":"ParameterList","parameters":[],"src":"1297:2:92"},"returnParameters":{"id":14305,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14304,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14310,"src":"1323:14:92","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14303,"name":"bytes","nodeType":"ElementaryTypeName","src":"1323:5:92","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1322:16:92"},"scope":14339,"src":"1279:94:92","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":14323,"nodeType":"Block","src":"1538:65:92","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14319,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1555:28:92","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1584:10:92","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1555:39:92","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1555:41:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":14318,"id":14322,"nodeType":"Return","src":"1548:48:92"}]},"documentation":{"id":14311,"nodeType":"StructuredDocumentation","src":"1379:44:92","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14324,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1437:10:92","nodeType":"FunctionDefinition","overrides":{"id":14315,"nodeType":"OverrideSpecifier","overrides":[{"id":14313,"name":"Context","nameLocations":["1481:7:92"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1481:7:92"},{"id":14314,"name":"ForwarderRegistryContextBase","nameLocations":["1490:28:92"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1490:28:92"}],"src":"1472:47:92"},"parameters":{"id":14312,"nodeType":"ParameterList","parameters":[],"src":"1447:2:92"},"returnParameters":{"id":14318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14317,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14324,"src":"1529:7:92","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14316,"name":"address","nodeType":"ElementaryTypeName","src":"1529:7:92","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1528:9:92"},"scope":14339,"src":"1428:175:92","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":14337,"nodeType":"Block","src":"1773:63:92","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14333,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1790:28:92","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14334,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1819:8:92","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1790:37:92","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1790:39:92","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14332,"id":14336,"nodeType":"Return","src":"1783:46:92"}]},"documentation":{"id":14325,"nodeType":"StructuredDocumentation","src":"1609:44:92","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14338,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1667:8:92","nodeType":"FunctionDefinition","overrides":{"id":14329,"nodeType":"OverrideSpecifier","overrides":[{"id":14327,"name":"Context","nameLocations":["1709:7:92"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1709:7:92"},{"id":14328,"name":"ForwarderRegistryContextBase","nameLocations":["1718:28:92"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1718:28:92"}],"src":"1700:47:92"},"parameters":{"id":14326,"nodeType":"ParameterList","parameters":[],"src":"1675:2:92"},"returnParameters":{"id":14332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14331,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14338,"src":"1757:14:92","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14330,"name":"bytes","nodeType":"ElementaryTypeName","src":"1757:5:92","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1756:16:92"},"scope":14339,"src":"1658:178:92","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":14340,"src":"617:1221:92","usedErrors":[7886,8246,11559,11946,11951,11956],"usedEvents":[8287,11973]}],"src":"32:1807:92"},"id":92},"contracts/mocks/lifecycle/PauseMock.sol":{"ast":{"absolutePath":"contracts/mocks/lifecycle/PauseMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"Pause":[11725],"PauseMock":[14442],"PauseStorage":[12598]},"id":14443,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14341,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:93"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14343,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":13387,"src":"57:84:93","symbolAliases":[{"foreign":{"id":14342,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./../../lifecycle/libraries/PauseStorage.sol","id":14345,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":12599,"src":"142:74:93","symbolAliases":[{"foreign":{"id":14344,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"150:12:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/Pause.sol","file":"./../../lifecycle/Pause.sol","id":14347,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":11726,"src":"217:50:93","symbolAliases":[{"foreign":{"id":14346,"name":"Pause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11725,"src":"225:5:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":14349,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":7935,"src":"268:71:93","symbolAliases":[{"foreign":{"id":14348,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"276:17:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":14351,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":1207,"src":"340:66:93","symbolAliases":[{"foreign":{"id":14350,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"348:7:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":14353,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":13298,"src":"407:98:93","symbolAliases":[{"foreign":{"id":14352,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"415:28:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":14355,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14443,"sourceUnit":13143,"src":"506:85:93","symbolAliases":[{"foreign":{"id":14354,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"514:24:93","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14356,"name":"Pause","nameLocations":["615:5:93"],"nodeType":"IdentifierPath","referencedDeclaration":11725,"src":"615:5:93"},"id":14357,"nodeType":"InheritanceSpecifier","src":"615:5:93"},{"baseName":{"id":14358,"name":"ForwarderRegistryContext","nameLocations":["622:24:93"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"622:24:93"},"id":14359,"nodeType":"InheritanceSpecifier","src":"622:24:93"}],"canonicalName":"PauseMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14442,"linearizedBaseContracts":[14442,13142,13370,13297,11725,7934,11554,11579,8139,11939,1206,8562,12161],"name":"PauseMock","nameLocation":"602:9:93","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14363,"libraryName":{"id":14360,"name":"PauseStorage","nameLocations":["659:12:93"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"659:12:93"},"nodeType":"UsingForDirective","src":"653:43:93","typeName":{"id":14362,"nodeType":"UserDefinedTypeName","pathNode":{"id":14361,"name":"PauseStorage.Layout","nameLocations":["676:12:93","689:6:93"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"676:19:93"},"referencedDeclaration":12428,"src":"676:19:93","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"body":{"id":14381,"nodeType":"Block","src":"879:2:93","statements":[]},"id":14382,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14371,"name":"isPaused","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14365,"src":"795:8:93","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":14372,"kind":"baseConstructorSpecifier","modifierName":{"id":14370,"name":"Pause","nameLocations":["789:5:93"],"nodeType":"IdentifierPath","referencedDeclaration":11725,"src":"789:5:93"},"nodeType":"ModifierInvocation","src":"789:15:93"},{"arguments":[{"expression":{"id":14374,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"823:3:93","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14375,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"827:6:93","memberName":"sender","nodeType":"MemberAccess","src":"823:10:93","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14376,"kind":"baseConstructorSpecifier","modifierName":{"id":14373,"name":"ContractOwnership","nameLocations":["805:17:93"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"805:17:93"},"nodeType":"ModifierInvocation","src":"805:29:93"},{"arguments":[{"id":14378,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14368,"src":"860:17:93","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14379,"kind":"baseConstructorSpecifier","modifierName":{"id":14377,"name":"ForwarderRegistryContext","nameLocations":["835:24:93"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"835:24:93"},"nodeType":"ModifierInvocation","src":"835:43:93"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14369,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14365,"mutability":"mutable","name":"isPaused","nameLocation":"728:8:93","nodeType":"VariableDeclaration","scope":14382,"src":"723:13:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":14364,"name":"bool","nodeType":"ElementaryTypeName","src":"723:4:93","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":14368,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"765:17:93","nodeType":"VariableDeclaration","scope":14382,"src":"746:36:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14367,"nodeType":"UserDefinedTypeName","pathNode":{"id":14366,"name":"IForwarderRegistry","nameLocations":["746:18:93"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"746:18:93"},"referencedDeclaration":13386,"src":"746:18:93","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"713:75:93"},"returnParameters":{"id":14380,"nodeType":"ParameterList","parameters":[],"src":"879:0:93"},"scope":14442,"src":"702:179:93","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14392,"nodeType":"Block","src":"928:56:93","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14385,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"938:12:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":14387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"951:6:93","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"938:19:93","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":14388,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"938:21:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":14389,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"960:15:93","memberName":"enforceIsPaused","nodeType":"MemberAccess","referencedDeclaration":12571,"src":"938:37:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":14390,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"938:39:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14391,"nodeType":"ExpressionStatement","src":"938:39:93"}]},"functionSelector":"859f7acb","id":14393,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsPaused","nameLocation":"896:15:93","nodeType":"FunctionDefinition","parameters":{"id":14383,"nodeType":"ParameterList","parameters":[],"src":"911:2:93"},"returnParameters":{"id":14384,"nodeType":"ParameterList","parameters":[],"src":"928:0:93"},"scope":14442,"src":"887:97:93","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14403,"nodeType":"Block","src":"1034:59:93","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14396,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"1044:12:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":14398,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1057:6:93","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"1044:19:93","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":14399,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1044:21:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":14400,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1066:18:93","memberName":"enforceIsNotPaused","nodeType":"MemberAccess","referencedDeclaration":12585,"src":"1044:40:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":14401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1044:42:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14402,"nodeType":"ExpressionStatement","src":"1044:42:93"}]},"functionSelector":"8ebd8073","id":14404,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsNotPaused","nameLocation":"999:18:93","nodeType":"FunctionDefinition","parameters":{"id":14394,"nodeType":"ParameterList","parameters":[],"src":"1017:2:93"},"returnParameters":{"id":14395,"nodeType":"ParameterList","parameters":[],"src":"1034:0:93"},"scope":14442,"src":"990:103:93","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14412,"nodeType":"Block","src":"1159:34:93","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14409,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[14441],"referencedDeclaration":14441,"src":"1176:8:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1176:10:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14408,"id":14411,"nodeType":"Return","src":"1169:17:93"}]},"functionSelector":"31e66e1e","id":14413,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1108:9:93","nodeType":"FunctionDefinition","parameters":{"id":14405,"nodeType":"ParameterList","parameters":[],"src":"1117:2:93"},"returnParameters":{"id":14408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14407,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14413,"src":"1143:14:93","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14406,"name":"bytes","nodeType":"ElementaryTypeName","src":"1143:5:93","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1142:16:93"},"scope":14442,"src":"1099:94:93","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":14426,"nodeType":"Block","src":"1358:65:93","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14422,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1375:28:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1404:10:93","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1375:39:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14424,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1375:41:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":14421,"id":14425,"nodeType":"Return","src":"1368:48:93"}]},"documentation":{"id":14414,"nodeType":"StructuredDocumentation","src":"1199:44:93","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14427,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1257:10:93","nodeType":"FunctionDefinition","overrides":{"id":14418,"nodeType":"OverrideSpecifier","overrides":[{"id":14416,"name":"Context","nameLocations":["1301:7:93"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1301:7:93"},{"id":14417,"name":"ForwarderRegistryContextBase","nameLocations":["1310:28:93"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1310:28:93"}],"src":"1292:47:93"},"parameters":{"id":14415,"nodeType":"ParameterList","parameters":[],"src":"1267:2:93"},"returnParameters":{"id":14421,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14420,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14427,"src":"1349:7:93","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14419,"name":"address","nodeType":"ElementaryTypeName","src":"1349:7:93","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1348:9:93"},"scope":14442,"src":"1248:175:93","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":14440,"nodeType":"Block","src":"1593:63:93","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14436,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1610:28:93","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14437,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1639:8:93","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1610:37:93","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1610:39:93","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14435,"id":14439,"nodeType":"Return","src":"1603:46:93"}]},"documentation":{"id":14428,"nodeType":"StructuredDocumentation","src":"1429:44:93","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14441,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1487:8:93","nodeType":"FunctionDefinition","overrides":{"id":14432,"nodeType":"OverrideSpecifier","overrides":[{"id":14430,"name":"Context","nameLocations":["1529:7:93"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1529:7:93"},{"id":14431,"name":"ForwarderRegistryContextBase","nameLocations":["1538:28:93"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1538:28:93"}],"src":"1520:47:93"},"parameters":{"id":14429,"nodeType":"ParameterList","parameters":[],"src":"1495:2:93"},"returnParameters":{"id":14435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14434,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14441,"src":"1577:14:93","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14433,"name":"bytes","nodeType":"ElementaryTypeName","src":"1577:5:93","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1576:16:93"},"scope":14442,"src":"1478:178:93","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":14443,"src":"593:1065:93","usedErrors":[8246,11559,11961,11964],"usedEvents":[8287,11978,11981]}],"src":"32:1627:93"},"id":93},"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol","exportedSymbols":{"CheckpointsFacet":[12041],"CheckpointsFacetMock":[14507],"CheckpointsStorage":[12411],"IForwarderRegistry":[13386]},"id":14508,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14444,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:94"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":14446,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14508,"sourceUnit":13387,"src":"57:87:94","symbolAliases":[{"foreign":{"id":14445,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:94","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/CheckpointsStorage.sol","file":"./../../../lifecycle/libraries/CheckpointsStorage.sol","id":14448,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14508,"sourceUnit":12412,"src":"145:89:94","symbolAliases":[{"foreign":{"id":14447,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"153:18:94","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/facets/CheckpointsFacet.sol","file":"./../../../lifecycle/facets/CheckpointsFacet.sol","id":14450,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14508,"sourceUnit":12042,"src":"235:82:94","symbolAliases":[{"foreign":{"id":14449,"name":"CheckpointsFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12041,"src":"243:16:94","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14451,"name":"CheckpointsFacet","nameLocations":["352:16:94"],"nodeType":"IdentifierPath","referencedDeclaration":12041,"src":"352:16:94"},"id":14452,"nodeType":"InheritanceSpecifier","src":"352:16:94"}],"canonicalName":"CheckpointsFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14507,"linearizedBaseContracts":[14507,12041,13297,11861,1206,12151],"name":"CheckpointsFacetMock","nameLocation":"328:20:94","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14456,"libraryName":{"id":14453,"name":"CheckpointsStorage","nameLocations":["381:18:94"],"nodeType":"IdentifierPath","referencedDeclaration":12411,"src":"381:18:94"},"nodeType":"UsingForDirective","src":"375:55:94","typeName":{"id":14455,"nodeType":"UserDefinedTypeName","pathNode":{"id":14454,"name":"CheckpointsStorage.Layout","nameLocations":["404:18:94","423:6:94"],"nodeType":"IdentifierPath","referencedDeclaration":12180,"src":"404:25:94"},"referencedDeclaration":12180,"src":"404:25:94","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout"}}},{"constant":true,"functionSelector":"b4c6cf76","id":14459,"mutability":"constant","name":"START_CHECKPOINTID","nameLocation":"460:18:94","nodeType":"VariableDeclaration","scope":14507,"src":"436:52:94","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14457,"name":"bytes32","nodeType":"ElementaryTypeName","src":"436:7:94","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"5354415254","id":14458,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"481:7:94","typeDescriptions":{"typeIdentifier":"t_stringliteral_be3c26a64d88239991ba164ff2b468dd1f37dd3d8107c4c763966a7a0402c73f","typeString":"literal_string \"START\""},"value":"START"},"visibility":"public"},{"body":{"id":14468,"nodeType":"Block","src":"581:2:94","statements":[]},"id":14469,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14465,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14462,"src":"562:17:94","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14466,"kind":"baseConstructorSpecifier","modifierName":{"id":14464,"name":"CheckpointsFacet","nameLocations":["545:16:94"],"nodeType":"IdentifierPath","referencedDeclaration":12041,"src":"545:16:94"},"nodeType":"ModifierInvocation","src":"545:35:94"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14462,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"526:17:94","nodeType":"VariableDeclaration","scope":14469,"src":"507:36:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14461,"nodeType":"UserDefinedTypeName","pathNode":{"id":14460,"name":"IForwarderRegistry","nameLocations":["507:18:94"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"507:18:94"},"referencedDeclaration":13386,"src":"507:18:94","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"506:38:94"},"returnParameters":{"id":14467,"nodeType":"ParameterList","parameters":[],"src":"581:0:94"},"scope":14507,"src":"495:88:94","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14482,"nodeType":"Block","src":"659:83:94","statements":[{"expression":{"arguments":[{"id":14479,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14471,"src":"722:12:94","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14474,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"669:18:94","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":14476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"688:6:94","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"669:25:94","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":14477,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"669:27:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":14478,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"697:24:94","memberName":"enforceCheckpointReached","nodeType":"MemberAccess","referencedDeclaration":12379,"src":"669:52:94","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view"}},"id":14480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"669:66:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14481,"nodeType":"ExpressionStatement","src":"669:66:94"}]},"functionSelector":"244c00be","id":14483,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointReached","nameLocation":"598:24:94","nodeType":"FunctionDefinition","parameters":{"id":14472,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14471,"mutability":"mutable","name":"checkpointId","nameLocation":"631:12:94","nodeType":"VariableDeclaration","scope":14483,"src":"623:20:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14470,"name":"bytes32","nodeType":"ElementaryTypeName","src":"623:7:94","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"622:22:94"},"returnParameters":{"id":14473,"nodeType":"ParameterList","parameters":[],"src":"659:0:94"},"scope":14507,"src":"589:153:94","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14496,"nodeType":"Block","src":"821:86:94","statements":[{"expression":{"arguments":[{"id":14493,"name":"checkpointId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14485,"src":"887:12:94","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14488,"name":"CheckpointsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12411,"src":"831:18:94","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CheckpointsStorage_$12411_$","typeString":"type(library CheckpointsStorage)"}},"id":14490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"850:6:94","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12410,"src":"831:25:94","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function () pure returns (struct CheckpointsStorage.Layout storage pointer)"}},"id":14491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"831:27:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12180_storage_ptr","typeString":"struct CheckpointsStorage.Layout storage pointer"}},"id":14492,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"859:27:94","memberName":"enforceCheckpointNotReached","nodeType":"MemberAccess","referencedDeclaration":12398,"src":"831:55:94","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12180_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$12180_storage_ptr_$","typeString":"function (struct CheckpointsStorage.Layout storage pointer,bytes32) view"}},"id":14494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"831:69:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14495,"nodeType":"ExpressionStatement","src":"831:69:94"}]},"functionSelector":"4bddd15c","id":14497,"implemented":true,"kind":"function","modifiers":[],"name":"enforceCheckpointNotReached","nameLocation":"757:27:94","nodeType":"FunctionDefinition","parameters":{"id":14486,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14485,"mutability":"mutable","name":"checkpointId","nameLocation":"793:12:94","nodeType":"VariableDeclaration","scope":14497,"src":"785:20:94","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":14484,"name":"bytes32","nodeType":"ElementaryTypeName","src":"785:7:94","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"784:22:94"},"returnParameters":{"id":14487,"nodeType":"ParameterList","parameters":[],"src":"821:0:94"},"scope":14507,"src":"748:159:94","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14505,"nodeType":"Block","src":"973:34:94","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14502,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[12040],"referencedDeclaration":12040,"src":"990:8:94","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14503,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"990:10:94","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14501,"id":14504,"nodeType":"Return","src":"983:17:94"}]},"functionSelector":"31e66e1e","id":14506,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"922:9:94","nodeType":"FunctionDefinition","parameters":{"id":14498,"nodeType":"ParameterList","parameters":[],"src":"931:2:94"},"returnParameters":{"id":14501,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14500,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14506,"src":"957:14:94","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14499,"name":"bytes","nodeType":"ElementaryTypeName","src":"957:5:94","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"956:16:94"},"scope":14507,"src":"913:94:94","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14508,"src":"319:690:94","usedErrors":[7886,8246,11946,11951,11956],"usedEvents":[11973]}],"src":"32:978:94"},"id":94},"contracts/mocks/lifecycle/facets/PauseFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/lifecycle/facets/PauseFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"PauseFacet":[12131],"PauseFacetMock":[14563],"PauseStorage":[12598]},"id":14564,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14509,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:95"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":14511,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14564,"sourceUnit":13387,"src":"57:87:95","symbolAliases":[{"foreign":{"id":14510,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:95","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./../../../lifecycle/libraries/PauseStorage.sol","id":14513,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14564,"sourceUnit":12599,"src":"145:77:95","symbolAliases":[{"foreign":{"id":14512,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"153:12:95","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/facets/PauseFacet.sol","file":"./../../../lifecycle/facets/PauseFacet.sol","id":14515,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14564,"sourceUnit":12132,"src":"223:70:95","symbolAliases":[{"foreign":{"id":14514,"name":"PauseFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12131,"src":"231:10:95","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14516,"name":"PauseFacet","nameLocations":["322:10:95"],"nodeType":"IdentifierPath","referencedDeclaration":12131,"src":"322:10:95"},"id":14517,"nodeType":"InheritanceSpecifier","src":"322:10:95"}],"canonicalName":"PauseFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14563,"linearizedBaseContracts":[14563,12131,13297,11939,1206,12161],"name":"PauseFacetMock","nameLocation":"304:14:95","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14521,"libraryName":{"id":14518,"name":"PauseStorage","nameLocations":["345:12:95"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"345:12:95"},"nodeType":"UsingForDirective","src":"339:43:95","typeName":{"id":14520,"nodeType":"UserDefinedTypeName","pathNode":{"id":14519,"name":"PauseStorage.Layout","nameLocations":["362:12:95","375:6:95"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"362:19:95"},"referencedDeclaration":12428,"src":"362:19:95","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"body":{"id":14530,"nodeType":"Block","src":"468:2:95","statements":[]},"id":14531,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14527,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14524,"src":"449:17:95","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14528,"kind":"baseConstructorSpecifier","modifierName":{"id":14526,"name":"PauseFacet","nameLocations":["438:10:95"],"nodeType":"IdentifierPath","referencedDeclaration":12131,"src":"438:10:95"},"nodeType":"ModifierInvocation","src":"438:29:95"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14525,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14524,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"419:17:95","nodeType":"VariableDeclaration","scope":14531,"src":"400:36:95","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14523,"nodeType":"UserDefinedTypeName","pathNode":{"id":14522,"name":"IForwarderRegistry","nameLocations":["400:18:95"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"400:18:95"},"referencedDeclaration":13386,"src":"400:18:95","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"399:38:95"},"returnParameters":{"id":14529,"nodeType":"ParameterList","parameters":[],"src":"468:0:95"},"scope":14563,"src":"388:82:95","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14541,"nodeType":"Block","src":"517:56:95","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14534,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"527:12:95","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":14536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"540:6:95","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"527:19:95","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":14537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"527:21:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":14538,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"549:15:95","memberName":"enforceIsPaused","nodeType":"MemberAccess","referencedDeclaration":12571,"src":"527:37:95","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":14539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"527:39:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14540,"nodeType":"ExpressionStatement","src":"527:39:95"}]},"functionSelector":"859f7acb","id":14542,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsPaused","nameLocation":"485:15:95","nodeType":"FunctionDefinition","parameters":{"id":14532,"nodeType":"ParameterList","parameters":[],"src":"500:2:95"},"returnParameters":{"id":14533,"nodeType":"ParameterList","parameters":[],"src":"517:0:95"},"scope":14563,"src":"476:97:95","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14552,"nodeType":"Block","src":"623:59:95","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14545,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"633:12:95","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":14547,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"646:6:95","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"633:19:95","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":14548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"633:21:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":14549,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"655:18:95","memberName":"enforceIsNotPaused","nodeType":"MemberAccess","referencedDeclaration":12585,"src":"633:40:95","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":14550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"633:42:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14551,"nodeType":"ExpressionStatement","src":"633:42:95"}]},"functionSelector":"8ebd8073","id":14553,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsNotPaused","nameLocation":"588:18:95","nodeType":"FunctionDefinition","parameters":{"id":14543,"nodeType":"ParameterList","parameters":[],"src":"606:2:95"},"returnParameters":{"id":14544,"nodeType":"ParameterList","parameters":[],"src":"623:0:95"},"scope":14563,"src":"579:103:95","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14561,"nodeType":"Block","src":"748:34:95","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14558,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[12130],"referencedDeclaration":12130,"src":"765:8:95","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"765:10:95","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14557,"id":14560,"nodeType":"Return","src":"758:17:95"}]},"functionSelector":"31e66e1e","id":14562,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"697:9:95","nodeType":"FunctionDefinition","parameters":{"id":14554,"nodeType":"ParameterList","parameters":[],"src":"706:2:95"},"returnParameters":{"id":14557,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14556,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14562,"src":"732:14:95","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14555,"name":"bytes","nodeType":"ElementaryTypeName","src":"732:5:95","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"731:16:95"},"scope":14563,"src":"688:94:95","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14564,"src":"295:489:95","usedErrors":[8246,11961,11964,19183,19192],"usedEvents":[11978,11981]}],"src":"32:753:95"},"id":95},"contracts/mocks/metatx/ForwarderMock.sol":{"ast":{"absolutePath":"contracts/mocks/metatx/ForwarderMock.sol","exportedSymbols":{"Address":[1176],"ForwarderMock":[14611]},"id":14612,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14565,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:96"},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"@openzeppelin/contracts/utils/Address.sol","id":14567,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14612,"sourceUnit":1177,"src":"57:66:96","symbolAliases":[{"foreign":{"id":14566,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1176,"src":"65:7:96","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ForwarderMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14611,"linearizedBaseContracts":[14611],"name":"ForwarderMock","nameLocation":"134:13:96","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14570,"libraryName":{"id":14568,"name":"Address","nameLocations":["160:7:96"],"nodeType":"IdentifierPath","referencedDeclaration":1176,"src":"160:7:96"},"nodeType":"UsingForDirective","src":"154:26:96","typeName":{"id":14569,"name":"address","nodeType":"ElementaryTypeName","src":"172:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"body":{"id":14586,"nodeType":"Block","src":"384:62:96","statements":[{"expression":{"arguments":[{"id":14581,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14575,"src":"423:4:96","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"expression":{"id":14582,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"429:3:96","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"433:5:96","memberName":"value","nodeType":"MemberAccess","src":"429:9:96","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":14578,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14573,"src":"394:6:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"401:21:96","memberName":"functionCallWithValue","nodeType":"MemberAccess","referencedDeclaration":1041,"src":"394:28:96","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$attached_to$_t_address_$","typeString":"function (address,bytes memory,uint256) returns (bytes memory)"}},"id":14584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"394:45:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":14585,"nodeType":"ExpressionStatement","src":"394:45:96"}]},"documentation":{"id":14571,"nodeType":"StructuredDocumentation","src":"186:115:96","text":"@notice Forward without appending a sender address to the calldata, so that msg.data.length < 24 (non-EIP-2771)"},"functionSelector":"82c662a5","id":14587,"implemented":true,"kind":"function","modifiers":[],"name":"non2771Forward","nameLocation":"315:14:96","nodeType":"FunctionDefinition","parameters":{"id":14576,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14573,"mutability":"mutable","name":"target","nameLocation":"338:6:96","nodeType":"VariableDeclaration","scope":14587,"src":"330:14:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14572,"name":"address","nodeType":"ElementaryTypeName","src":"330:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14575,"mutability":"mutable","name":"data","nameLocation":"361:4:96","nodeType":"VariableDeclaration","scope":14587,"src":"346:19:96","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14574,"name":"bytes","nodeType":"ElementaryTypeName","src":"346:5:96","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"329:37:96"},"returnParameters":{"id":14577,"nodeType":"ParameterList","parameters":[],"src":"384:0:96"},"scope":14611,"src":"306:140:96","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":14609,"nodeType":"Block","src":"632:86:96","statements":[{"expression":{"arguments":[{"arguments":[{"id":14602,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14594,"src":"688:4:96","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":14603,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14590,"src":"694:4:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":14600,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"671:3:96","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"675:12:96","memberName":"encodePacked","nodeType":"MemberAccess","src":"671:16:96","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":14604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"671:28:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"id":14605,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"701:3:96","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"705:5:96","memberName":"value","nodeType":"MemberAccess","src":"701:9:96","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":14597,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14592,"src":"642:6:96","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":14599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"649:21:96","memberName":"functionCallWithValue","nodeType":"MemberAccess","referencedDeclaration":1041,"src":"642:28:96","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$attached_to$_t_address_$","typeString":"function (address,bytes memory,uint256) returns (bytes memory)"}},"id":14607,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"642:69:96","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":14608,"nodeType":"ExpressionStatement","src":"642:69:96"}]},"documentation":{"id":14588,"nodeType":"StructuredDocumentation","src":"452:90:96","text":"@notice Forward while appending a sender address to the calldata (EIP-2771-compatible)"},"functionSelector":"e5166b92","id":14610,"implemented":true,"kind":"function","modifiers":[],"name":"forward","nameLocation":"556:7:96","nodeType":"FunctionDefinition","parameters":{"id":14595,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14590,"mutability":"mutable","name":"from","nameLocation":"572:4:96","nodeType":"VariableDeclaration","scope":14610,"src":"564:12:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14589,"name":"address","nodeType":"ElementaryTypeName","src":"564:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14592,"mutability":"mutable","name":"target","nameLocation":"586:6:96","nodeType":"VariableDeclaration","scope":14610,"src":"578:14:96","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14591,"name":"address","nodeType":"ElementaryTypeName","src":"578:7:96","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14594,"mutability":"mutable","name":"data","nameLocation":"609:4:96","nodeType":"VariableDeclaration","scope":14610,"src":"594:19:96","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14593,"name":"bytes","nodeType":"ElementaryTypeName","src":"594:5:96","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"563:51:96"},"returnParameters":{"id":14596,"nodeType":"ParameterList","parameters":[],"src":"632:0:96"},"scope":14611,"src":"547:171:96","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":14612,"src":"125:595:96","usedErrors":[926,1216,1219],"usedEvents":[]}],"src":"32:689:96"},"id":96},"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol":{"ast":{"absolutePath":"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol","exportedSymbols":{"ForwarderRegistryContext":[13142],"ForwarderRegistryReceiverMock":[14683],"IForwarderRegistry":[13386]},"id":14684,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14613,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:97"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"../../metatx/interfaces/IForwarderRegistry.sol","id":14615,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14684,"sourceUnit":13387,"src":"57:82:97","symbolAliases":[{"foreign":{"id":14614,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:97","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"../../metatx/ForwarderRegistryContext.sol","id":14617,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14684,"sourceUnit":13143,"src":"140:83:97","symbolAliases":[{"foreign":{"id":14616,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"148:24:97","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14618,"name":"ForwarderRegistryContext","nameLocations":["267:24:97"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"267:24:97"},"id":14619,"nodeType":"InheritanceSpecifier","src":"267:24:97"}],"canonicalName":"ForwarderRegistryReceiverMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14683,"linearizedBaseContracts":[14683,13142,13370,13297],"name":"ForwarderRegistryReceiverMock","nameLocation":"234:29:97","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":14623,"mutability":"mutable","name":"_d","nameLocation":"335:2:97","nodeType":"VariableDeclaration","scope":14683,"src":"298:39:97","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":14622,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":14620,"name":"address","nodeType":"ElementaryTypeName","src":"306:7:97","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"298:27:97","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":14621,"name":"uint256","nodeType":"ElementaryTypeName","src":"317:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"body":{"id":14632,"nodeType":"Block","src":"438:2:97","statements":[]},"id":14633,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14629,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14626,"src":"419:17:97","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14630,"kind":"baseConstructorSpecifier","modifierName":{"id":14628,"name":"ForwarderRegistryContext","nameLocations":["394:24:97"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"394:24:97"},"nodeType":"ModifierInvocation","src":"394:43:97"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14627,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14626,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"375:17:97","nodeType":"VariableDeclaration","scope":14633,"src":"356:36:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14625,"nodeType":"UserDefinedTypeName","pathNode":{"id":14624,"name":"IForwarderRegistry","nameLocations":["356:18:97"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"356:18:97"},"referencedDeclaration":13386,"src":"356:18:97","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"355:38:97"},"returnParameters":{"id":14631,"nodeType":"ParameterList","parameters":[],"src":"438:0:97"},"scope":14683,"src":"344:96:97","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14649,"nodeType":"Block","src":"549:88:97","statements":[{"assignments":[14637],"declarations":[{"constant":false,"id":14637,"mutability":"mutable","name":"sender","nameLocation":"567:6:97","nodeType":"VariableDeclaration","scope":14649,"src":"559:14:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14636,"name":"address","nodeType":"ElementaryTypeName","src":"559:7:97","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14640,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":14638,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"576:10:97","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14639,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"576:12:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"559:29:97"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14641,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13296,"src":"598:8:97","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"598:10:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14643,"nodeType":"ExpressionStatement","src":"598:10:97"},{"expression":{"id":14647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"618:12:97","subExpression":{"baseExpression":{"id":14644,"name":"_d","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14623,"src":"620:2:97","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":14646,"indexExpression":{"id":14645,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14637,"src":"623:6:97","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"620:10:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14648,"nodeType":"ExpressionStatement","src":"618:12:97"}]},"functionSelector":"47850b6b","id":14650,"implemented":true,"kind":"function","modifiers":[],"name":"smallDataTest","nameLocation":"524:13:97","nodeType":"FunctionDefinition","parameters":{"id":14634,"nodeType":"ParameterList","parameters":[],"src":"537:2:97"},"returnParameters":{"id":14635,"nodeType":"ParameterList","parameters":[],"src":"549:0:97"},"scope":14683,"src":"515:122:97","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":14669,"nodeType":"Block","src":"677:90:97","statements":[{"assignments":[14656],"declarations":[{"constant":false,"id":14656,"mutability":"mutable","name":"sender","nameLocation":"695:6:97","nodeType":"VariableDeclaration","scope":14669,"src":"687:14:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14655,"name":"address","nodeType":"ElementaryTypeName","src":"687:7:97","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":14659,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":14657,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"704:10:97","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"704:12:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"687:29:97"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14660,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13296,"src":"726:8:97","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"726:10:97","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":14662,"nodeType":"ExpressionStatement","src":"726:10:97"},{"expression":{"id":14667,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":14663,"name":"_d","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14623,"src":"746:2:97","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":14665,"indexExpression":{"id":14664,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14656,"src":"749:6:97","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"746:10:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":14666,"name":"d","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14652,"src":"759:1:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"746:14:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":14668,"nodeType":"ExpressionStatement","src":"746:14:97"}]},"functionSelector":"29e99f07","id":14670,"implemented":true,"kind":"function","modifiers":[],"name":"test","nameLocation":"652:4:97","nodeType":"FunctionDefinition","parameters":{"id":14653,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14652,"mutability":"mutable","name":"d","nameLocation":"665:1:97","nodeType":"VariableDeclaration","scope":14670,"src":"657:9:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14651,"name":"uint256","nodeType":"ElementaryTypeName","src":"657:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"656:11:97"},"returnParameters":{"id":14654,"nodeType":"ParameterList","parameters":[],"src":"677:0:97"},"scope":14683,"src":"643:124:97","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":14681,"nodeType":"Block","src":"835:31:97","statements":[{"expression":{"baseExpression":{"id":14677,"name":"_d","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14623,"src":"852:2:97","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":14679,"indexExpression":{"id":14678,"name":"who","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14672,"src":"855:3:97","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"852:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":14676,"id":14680,"nodeType":"Return","src":"845:14:97"}]},"functionSelector":"38266b22","id":14682,"implemented":true,"kind":"function","modifiers":[],"name":"getData","nameLocation":"782:7:97","nodeType":"FunctionDefinition","parameters":{"id":14673,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14672,"mutability":"mutable","name":"who","nameLocation":"798:3:97","nodeType":"VariableDeclaration","scope":14682,"src":"790:11:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14671,"name":"address","nodeType":"ElementaryTypeName","src":"790:7:97","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"789:13:97"},"returnParameters":{"id":14676,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14675,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14682,"src":"826:7:97","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14674,"name":"uint256","nodeType":"ElementaryTypeName","src":"826:7:97","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"825:9:97"},"scope":14683,"src":"773:93:97","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14684,"src":"225:643:97","usedErrors":[],"usedEvents":[]}],"src":"32:837:97"},"id":97},"contracts/mocks/payment/CumulativeMerkleClaimMock.sol":{"ast":{"absolutePath":"contracts/mocks/payment/CumulativeMerkleClaimMock.sol","exportedSymbols":{"CumulativeMerkleClaim":[18754],"CumulativeMerkleClaimMock":[14720]},"id":14721,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14685,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:98"},{"absolutePath":"contracts/payment/CumulativeMerkleClaim.sol","file":"./../../payment/CumulativeMerkleClaim.sol","id":14687,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14721,"sourceUnit":18755,"src":"57:80:98","symbolAliases":[{"foreign":{"id":14686,"name":"CumulativeMerkleClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18754,"src":"65:21:98","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14688,"name":"CumulativeMerkleClaim","nameLocations":["177:21:98"],"nodeType":"IdentifierPath","referencedDeclaration":18754,"src":"177:21:98"},"id":14689,"nodeType":"InheritanceSpecifier","src":"177:21:98"}],"canonicalName":"CumulativeMerkleClaimMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14720,"linearizedBaseContracts":[14720,18754,11725,7934,11554,11579,8139,11939,1206,8562,12161],"name":"CumulativeMerkleClaimMock","nameLocation":"148:25:98","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"b649c98f58055c520df0dcb5709eff2e931217ff2fb1e21376130d31bbb1c0af","id":14695,"name":"Distributed","nameLocation":"211:11:98","nodeType":"EventDefinition","parameters":{"id":14694,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14691,"indexed":false,"mutability":"mutable","name":"recipient","nameLocation":"231:9:98","nodeType":"VariableDeclaration","scope":14695,"src":"223:17:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14690,"name":"address","nodeType":"ElementaryTypeName","src":"223:7:98","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14693,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"250:6:98","nodeType":"VariableDeclaration","scope":14695,"src":"242:14:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14692,"name":"uint256","nodeType":"ElementaryTypeName","src":"242:7:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"222:35:98"},"src":"205:53:98"},{"baseFunctions":[18753],"body":{"id":14718,"nodeType":"Block","src":"362:111:98","statements":[{"assignments":[14704],"declarations":[{"constant":false,"id":14704,"mutability":"mutable","name":"amount","nameLocation":"380:6:98","nodeType":"VariableDeclaration","scope":14718,"src":"372:14:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":14703,"name":"uint256","nodeType":"ElementaryTypeName","src":"372:7:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":14712,"initialValue":{"arguments":[{"id":14707,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14699,"src":"400:9:98","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":14709,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"412:7:98","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":14708,"name":"uint256","nodeType":"ElementaryTypeName","src":"412:7:98","typeDescriptions":{}}}],"id":14710,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"411:9:98","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":14705,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"389:3:98","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":14706,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"393:6:98","memberName":"decode","nodeType":"MemberAccess","src":"389:10:98","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":14711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"389:32:98","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"372:49:98"},{"eventCall":{"arguments":[{"id":14714,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14697,"src":"448:9:98","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":14715,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14704,"src":"459:6:98","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":14713,"name":"Distributed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14695,"src":"436:11:98","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":14716,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"436:30:98","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14717,"nodeType":"EmitStatement","src":"431:35:98"}]},"id":14719,"implemented":true,"kind":"function","modifiers":[],"name":"_distributePayout","nameLocation":"273:17:98","nodeType":"FunctionDefinition","overrides":{"id":14701,"nodeType":"OverrideSpecifier","overrides":[],"src":"353:8:98"},"parameters":{"id":14700,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14697,"mutability":"mutable","name":"recipient","nameLocation":"299:9:98","nodeType":"VariableDeclaration","scope":14719,"src":"291:17:98","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14696,"name":"address","nodeType":"ElementaryTypeName","src":"291:7:98","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14699,"mutability":"mutable","name":"claimData","nameLocation":"325:9:98","nodeType":"VariableDeclaration","scope":14719,"src":"310:24:98","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14698,"name":"bytes","nodeType":"ElementaryTypeName","src":"310:5:98","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"290:45:98"},"returnParameters":{"id":14702,"nodeType":"ParameterList","parameters":[],"src":"362:0:98"},"scope":14720,"src":"264:209:98","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":14721,"src":"139:336:98","usedErrors":[8246,11559,11961,11964,18611,18620],"usedEvents":[8287,11978,11981,14695,18591,18602]}],"src":"32:444:98"},"id":98},"contracts/mocks/payment/PayoutWalletMock.sol":{"ast":{"absolutePath":"contracts/mocks/payment/PayoutWalletMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"PayoutWallet":[18787],"PayoutWalletMock":[14795]},"id":14796,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14722,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:99"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14724,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":13387,"src":"57:84:99","symbolAliases":[{"foreign":{"id":14723,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/PayoutWallet.sol","file":"./../../payment/PayoutWallet.sol","id":14726,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":18788,"src":"142:62:99","symbolAliases":[{"foreign":{"id":14725,"name":"PayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18787,"src":"150:12:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":14728,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":7935,"src":"205:71:99","symbolAliases":[{"foreign":{"id":14727,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"213:17:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":14730,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":1207,"src":"277:66:99","symbolAliases":[{"foreign":{"id":14729,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"285:7:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":14732,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":13298,"src":"344:98:99","symbolAliases":[{"foreign":{"id":14731,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"352:28:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":14734,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14796,"sourceUnit":13143,"src":"443:85:99","symbolAliases":[{"foreign":{"id":14733,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"451:24:99","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14735,"name":"PayoutWallet","nameLocations":["559:12:99"],"nodeType":"IdentifierPath","referencedDeclaration":18787,"src":"559:12:99"},"id":14736,"nodeType":"InheritanceSpecifier","src":"559:12:99"},{"baseName":{"id":14737,"name":"ForwarderRegistryContext","nameLocations":["573:24:99"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"573:24:99"},"id":14738,"nodeType":"InheritanceSpecifier","src":"573:24:99"}],"canonicalName":"PayoutWalletMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14795,"linearizedBaseContracts":[14795,13142,13370,13297,18787,7934,11554,11579,8139,18848,1206,8562,18960],"name":"PayoutWalletMock","nameLocation":"539:16:99","nodeType":"ContractDefinition","nodes":[{"body":{"id":14756,"nodeType":"Block","src":"821:2:99","statements":[]},"id":14757,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14746,"name":"initialPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14740,"src":"726:19:99","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"id":14747,"kind":"baseConstructorSpecifier","modifierName":{"id":14745,"name":"PayoutWallet","nameLocations":["713:12:99"],"nodeType":"IdentifierPath","referencedDeclaration":18787,"src":"713:12:99"},"nodeType":"ModifierInvocation","src":"713:33:99"},{"arguments":[{"expression":{"id":14749,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"765:3:99","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":14750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"769:6:99","memberName":"sender","nodeType":"MemberAccess","src":"765:10:99","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14751,"kind":"baseConstructorSpecifier","modifierName":{"id":14748,"name":"ContractOwnership","nameLocations":["747:17:99"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"747:17:99"},"nodeType":"ModifierInvocation","src":"747:29:99"},{"arguments":[{"id":14753,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14743,"src":"802:17:99","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14754,"kind":"baseConstructorSpecifier","modifierName":{"id":14752,"name":"ForwarderRegistryContext","nameLocations":["777:24:99"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"777:24:99"},"nodeType":"ModifierInvocation","src":"777:43:99"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14744,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14740,"mutability":"mutable","name":"initialPayoutWallet","nameLocation":"641:19:99","nodeType":"VariableDeclaration","scope":14757,"src":"625:35:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":14739,"name":"address","nodeType":"ElementaryTypeName","src":"625:15:99","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"},{"constant":false,"id":14743,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"689:17:99","nodeType":"VariableDeclaration","scope":14757,"src":"670:36:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14742,"nodeType":"UserDefinedTypeName","pathNode":{"id":14741,"name":"IForwarderRegistry","nameLocations":["670:18:99"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"670:18:99"},"referencedDeclaration":13386,"src":"670:18:99","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"615:97:99"},"returnParameters":{"id":14755,"nodeType":"ParameterList","parameters":[],"src":"821:0:99"},"scope":14795,"src":"604:219:99","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14765,"nodeType":"Block","src":"889:34:99","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14762,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[14794],"referencedDeclaration":14794,"src":"906:8:99","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"906:10:99","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14761,"id":14764,"nodeType":"Return","src":"899:17:99"}]},"functionSelector":"31e66e1e","id":14766,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"838:9:99","nodeType":"FunctionDefinition","parameters":{"id":14758,"nodeType":"ParameterList","parameters":[],"src":"847:2:99"},"returnParameters":{"id":14761,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14760,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14766,"src":"873:14:99","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14759,"name":"bytes","nodeType":"ElementaryTypeName","src":"873:5:99","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"872:16:99"},"scope":14795,"src":"829:94:99","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":14779,"nodeType":"Block","src":"1088:65:99","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14775,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1105:28:99","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1134:10:99","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1105:39:99","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1105:41:99","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":14774,"id":14778,"nodeType":"Return","src":"1098:48:99"}]},"documentation":{"id":14767,"nodeType":"StructuredDocumentation","src":"929:44:99","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14780,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"987:10:99","nodeType":"FunctionDefinition","overrides":{"id":14771,"nodeType":"OverrideSpecifier","overrides":[{"id":14769,"name":"Context","nameLocations":["1031:7:99"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1031:7:99"},{"id":14770,"name":"ForwarderRegistryContextBase","nameLocations":["1040:28:99"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1040:28:99"}],"src":"1022:47:99"},"parameters":{"id":14768,"nodeType":"ParameterList","parameters":[],"src":"997:2:99"},"returnParameters":{"id":14774,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14773,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14780,"src":"1079:7:99","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14772,"name":"address","nodeType":"ElementaryTypeName","src":"1079:7:99","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1078:9:99"},"scope":14795,"src":"978:175:99","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":14793,"nodeType":"Block","src":"1323:63:99","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14789,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1340:28:99","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1369:8:99","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1340:37:99","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14791,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1340:39:99","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14788,"id":14792,"nodeType":"Return","src":"1333:46:99"}]},"documentation":{"id":14781,"nodeType":"StructuredDocumentation","src":"1159:44:99","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14794,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1217:8:99","nodeType":"FunctionDefinition","overrides":{"id":14785,"nodeType":"OverrideSpecifier","overrides":[{"id":14783,"name":"Context","nameLocations":["1259:7:99"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1259:7:99"},{"id":14784,"name":"ForwarderRegistryContextBase","nameLocations":["1268:28:99"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1268:28:99"}],"src":"1250:47:99"},"parameters":{"id":14782,"nodeType":"ParameterList","parameters":[],"src":"1225:2:99"},"returnParameters":{"id":14788,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14787,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14794,"src":"1307:14:99","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14786,"name":"bytes","nodeType":"ElementaryTypeName","src":"1307:5:99","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1306:16:99"},"scope":14795,"src":"1208:178:99","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":14796,"src":"530:858:99","usedErrors":[8246,11559,18853],"usedEvents":[8287,18860]}],"src":"32:1357:99"},"id":99},"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"PayoutWalletFacet":[18950],"PayoutWalletFacetMock":[14823]},"id":14824,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14797,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:100"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":14799,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14824,"sourceUnit":13387,"src":"57:87:100","symbolAliases":[{"foreign":{"id":14798,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:100","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/facets/PayoutWalletFacet.sol","file":"./../../../payment/facets/PayoutWalletFacet.sol","id":14801,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14824,"sourceUnit":18951,"src":"145:82:100","symbolAliases":[{"foreign":{"id":14800,"name":"PayoutWalletFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18950,"src":"153:17:100","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14802,"name":"PayoutWalletFacet","nameLocations":["263:17:100"],"nodeType":"IdentifierPath","referencedDeclaration":18950,"src":"263:17:100"},"id":14803,"nodeType":"InheritanceSpecifier","src":"263:17:100"}],"canonicalName":"PayoutWalletFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14823,"linearizedBaseContracts":[14823,18950,13297,18848,1206,18960],"name":"PayoutWalletFacetMock","nameLocation":"238:21:100","nodeType":"ContractDefinition","nodes":[{"body":{"id":14812,"nodeType":"Block","src":"374:2:100","statements":[]},"id":14813,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14809,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14806,"src":"355:17:100","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14810,"kind":"baseConstructorSpecifier","modifierName":{"id":14808,"name":"PayoutWalletFacet","nameLocations":["337:17:100"],"nodeType":"IdentifierPath","referencedDeclaration":18950,"src":"337:17:100"},"nodeType":"ModifierInvocation","src":"337:36:100"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14807,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14806,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"318:17:100","nodeType":"VariableDeclaration","scope":14813,"src":"299:36:100","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14805,"nodeType":"UserDefinedTypeName","pathNode":{"id":14804,"name":"IForwarderRegistry","nameLocations":["299:18:100"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"299:18:100"},"referencedDeclaration":13386,"src":"299:18:100","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"298:38:100"},"returnParameters":{"id":14811,"nodeType":"ParameterList","parameters":[],"src":"374:0:100"},"scope":14823,"src":"287:89:100","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14821,"nodeType":"Block","src":"442:34:100","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14818,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[18949],"referencedDeclaration":18949,"src":"459:8:100","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"459:10:100","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14817,"id":14820,"nodeType":"Return","src":"452:17:100"}]},"functionSelector":"31e66e1e","id":14822,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"391:9:100","nodeType":"FunctionDefinition","parameters":{"id":14814,"nodeType":"ParameterList","parameters":[],"src":"400:2:100"},"returnParameters":{"id":14817,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14816,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14822,"src":"426:14:100","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14815,"name":"bytes","nodeType":"ElementaryTypeName","src":"426:5:100","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"425:16:100"},"scope":14823,"src":"382:94:100","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14824,"src":"229:249:100","usedErrors":[8246,18853,19183,19192],"usedEvents":[18860]}],"src":"32:447:100"},"id":100},"contracts/mocks/proxy/ProxyAdminMock.sol":{"ast":{"absolutePath":"contracts/mocks/proxy/ProxyAdminMock.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdmin":[19125],"ProxyAdminMock":[14912],"ProxyAdminStorage":[19477]},"id":14913,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14825,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:101"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14827,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":13387,"src":"57:84:101","symbolAliases":[{"foreign":{"id":14826,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":14829,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":19478,"src":"142:80:101","symbolAliases":[{"foreign":{"id":14828,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"150:17:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/ProxyAdmin.sol","file":"./../../proxy/ProxyAdmin.sol","id":14831,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":19126,"src":"223:56:101","symbolAliases":[{"foreign":{"id":14830,"name":"ProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19125,"src":"231:10:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":14833,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":1207,"src":"280:66:101","symbolAliases":[{"foreign":{"id":14832,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"288:7:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":14835,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":13298,"src":"347:98:101","symbolAliases":[{"foreign":{"id":14834,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"355:28:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":14837,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14913,"sourceUnit":13143,"src":"446:85:101","symbolAliases":[{"foreign":{"id":14836,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"454:24:101","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14838,"name":"ProxyAdmin","nameLocations":["560:10:101"],"nodeType":"IdentifierPath","referencedDeclaration":19125,"src":"560:10:101"},"id":14839,"nodeType":"InheritanceSpecifier","src":"560:10:101"},{"baseName":{"id":14840,"name":"ForwarderRegistryContext","nameLocations":["572:24:101"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"572:24:101"},"id":14841,"nodeType":"InheritanceSpecifier","src":"572:24:101"}],"canonicalName":"ProxyAdminMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14912,"linearizedBaseContracts":[14912,13142,13370,13297,19125,19173,1206,19292],"name":"ProxyAdminMock","nameLocation":"542:14:101","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14845,"libraryName":{"id":14842,"name":"ProxyAdminStorage","nameLocations":["609:17:101"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"609:17:101"},"nodeType":"UsingForDirective","src":"603:53:101","typeName":{"id":14844,"nodeType":"UserDefinedTypeName","pathNode":{"id":14843,"name":"ProxyAdminStorage.Layout","nameLocations":["631:17:101","649:6:101"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"631:24:101"},"referencedDeclaration":19308,"src":"631:24:101","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":14859,"nodeType":"Block","src":"789:2:101","statements":[]},"id":14860,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14853,"name":"admin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14847,"src":"738:5:101","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":14854,"kind":"baseConstructorSpecifier","modifierName":{"id":14852,"name":"ProxyAdmin","nameLocations":["727:10:101"],"nodeType":"IdentifierPath","referencedDeclaration":19125,"src":"727:10:101"},"nodeType":"ModifierInvocation","src":"727:17:101"},{"arguments":[{"id":14856,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14850,"src":"770:17:101","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14857,"kind":"baseConstructorSpecifier","modifierName":{"id":14855,"name":"ForwarderRegistryContext","nameLocations":["745:24:101"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"745:24:101"},"nodeType":"ModifierInvocation","src":"745:43:101"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14851,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14847,"mutability":"mutable","name":"admin","nameLocation":"682:5:101","nodeType":"VariableDeclaration","scope":14860,"src":"674:13:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14846,"name":"address","nodeType":"ElementaryTypeName","src":"674:7:101","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":14850,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"708:17:101","nodeType":"VariableDeclaration","scope":14860,"src":"689:36:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14849,"nodeType":"UserDefinedTypeName","pathNode":{"id":14848,"name":"IForwarderRegistry","nameLocations":["689:18:101"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"689:18:101"},"referencedDeclaration":13386,"src":"689:18:101","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"673:53:101"},"returnParameters":{"id":14858,"nodeType":"ParameterList","parameters":[],"src":"789:0:101"},"scope":14912,"src":"662:129:101","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14873,"nodeType":"Block","src":"857:72:101","statements":[{"expression":{"arguments":[{"id":14870,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14862,"src":"914:7:101","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14865,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"867:17:101","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":14867,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"885:6:101","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"867:24:101","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":14868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"867:26:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":14869,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"894:19:101","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"867:46:101","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":14871,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"867:55:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14872,"nodeType":"ExpressionStatement","src":"867:55:101"}]},"functionSelector":"8eafcf67","id":14874,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsProxyAdmin","nameLocation":"806:19:101","nodeType":"FunctionDefinition","parameters":{"id":14863,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14862,"mutability":"mutable","name":"account","nameLocation":"834:7:101","nodeType":"VariableDeclaration","scope":14874,"src":"826:15:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14861,"name":"address","nodeType":"ElementaryTypeName","src":"826:7:101","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"825:17:101"},"returnParameters":{"id":14864,"nodeType":"ParameterList","parameters":[],"src":"857:0:101"},"scope":14912,"src":"797:132:101","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14882,"nodeType":"Block","src":"995:34:101","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14879,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[14911],"referencedDeclaration":14911,"src":"1012:8:101","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1012:10:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14878,"id":14881,"nodeType":"Return","src":"1005:17:101"}]},"functionSelector":"31e66e1e","id":14883,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"944:9:101","nodeType":"FunctionDefinition","parameters":{"id":14875,"nodeType":"ParameterList","parameters":[],"src":"953:2:101"},"returnParameters":{"id":14878,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14877,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14883,"src":"979:14:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14876,"name":"bytes","nodeType":"ElementaryTypeName","src":"979:5:101","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"978:16:101"},"scope":14912,"src":"935:94:101","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":14896,"nodeType":"Block","src":"1194:65:101","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14892,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1211:28:101","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14893,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1240:10:101","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1211:39:101","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":14894,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1211:41:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":14891,"id":14895,"nodeType":"Return","src":"1204:48:101"}]},"documentation":{"id":14884,"nodeType":"StructuredDocumentation","src":"1035:44:101","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14897,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1093:10:101","nodeType":"FunctionDefinition","overrides":{"id":14888,"nodeType":"OverrideSpecifier","overrides":[{"id":14886,"name":"Context","nameLocations":["1137:7:101"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1137:7:101"},{"id":14887,"name":"ForwarderRegistryContextBase","nameLocations":["1146:28:101"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1146:28:101"}],"src":"1128:47:101"},"parameters":{"id":14885,"nodeType":"ParameterList","parameters":[],"src":"1103:2:101"},"returnParameters":{"id":14891,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14890,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14897,"src":"1185:7:101","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14889,"name":"address","nodeType":"ElementaryTypeName","src":"1185:7:101","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1184:9:101"},"scope":14912,"src":"1084:175:101","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":14910,"nodeType":"Block","src":"1429:63:101","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14906,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1446:28:101","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":14907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1475:8:101","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1446:37:101","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14908,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1446:39:101","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14905,"id":14909,"nodeType":"Return","src":"1439:46:101"}]},"documentation":{"id":14898,"nodeType":"StructuredDocumentation","src":"1265:44:101","text":"@inheritdoc ForwarderRegistryContextBase"},"id":14911,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1323:8:101","nodeType":"FunctionDefinition","overrides":{"id":14902,"nodeType":"OverrideSpecifier","overrides":[{"id":14900,"name":"Context","nameLocations":["1365:7:101"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1365:7:101"},{"id":14901,"name":"ForwarderRegistryContextBase","nameLocations":["1374:28:101"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1374:28:101"}],"src":"1356:47:101"},"parameters":{"id":14899,"nodeType":"ParameterList","parameters":[],"src":"1331:2:101"},"returnParameters":{"id":14905,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14904,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14911,"src":"1413:14:101","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14903,"name":"bytes","nodeType":"ElementaryTypeName","src":"1413:5:101","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1412:16:101"},"scope":14912,"src":"1314:178:101","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":14913,"src":"533:961:101","usedErrors":[19178,19183],"usedEvents":[19201]}],"src":"32:1463:101"},"id":101},"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"ProxyAdminFacet":[19276],"ProxyAdminFacetMock":[14960],"ProxyAdminStorage":[19477]},"id":14961,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14914,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:102"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":14916,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14961,"sourceUnit":13387,"src":"57:87:102","symbolAliases":[{"foreign":{"id":14915,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:102","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":14918,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14961,"sourceUnit":19478,"src":"145:83:102","symbolAliases":[{"foreign":{"id":14917,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"153:17:102","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/facets/ProxyAdminFacet.sol","file":"./../../../proxy/facets/ProxyAdminFacet.sol","id":14920,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14961,"sourceUnit":19277,"src":"229:76:102","symbolAliases":[{"foreign":{"id":14919,"name":"ProxyAdminFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19276,"src":"237:15:102","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14921,"name":"ProxyAdminFacet","nameLocations":["339:15:102"],"nodeType":"IdentifierPath","referencedDeclaration":19276,"src":"339:15:102"},"id":14922,"nodeType":"InheritanceSpecifier","src":"339:15:102"}],"canonicalName":"ProxyAdminFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14960,"linearizedBaseContracts":[14960,19276,13297,19173,1206,19292],"name":"ProxyAdminFacetMock","nameLocation":"316:19:102","nodeType":"ContractDefinition","nodes":[{"global":false,"id":14926,"libraryName":{"id":14923,"name":"ProxyAdminStorage","nameLocations":["367:17:102"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"367:17:102"},"nodeType":"UsingForDirective","src":"361:53:102","typeName":{"id":14925,"nodeType":"UserDefinedTypeName","pathNode":{"id":14924,"name":"ProxyAdminStorage.Layout","nameLocations":["389:17:102","407:6:102"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"389:24:102"},"referencedDeclaration":19308,"src":"389:24:102","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":14935,"nodeType":"Block","src":"505:2:102","statements":[]},"id":14936,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14932,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14929,"src":"486:17:102","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14933,"kind":"baseConstructorSpecifier","modifierName":{"id":14931,"name":"ProxyAdminFacet","nameLocations":["470:15:102"],"nodeType":"IdentifierPath","referencedDeclaration":19276,"src":"470:15:102"},"nodeType":"ModifierInvocation","src":"470:34:102"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14930,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14929,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"451:17:102","nodeType":"VariableDeclaration","scope":14936,"src":"432:36:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14928,"nodeType":"UserDefinedTypeName","pathNode":{"id":14927,"name":"IForwarderRegistry","nameLocations":["432:18:102"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"432:18:102"},"referencedDeclaration":13386,"src":"432:18:102","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"431:38:102"},"returnParameters":{"id":14934,"nodeType":"ParameterList","parameters":[],"src":"505:0:102"},"scope":14960,"src":"420:87:102","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14949,"nodeType":"Block","src":"573:72:102","statements":[{"expression":{"arguments":[{"id":14946,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14938,"src":"630:7:102","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":14941,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"583:17:102","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":14943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"601:6:102","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"583:24:102","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":14944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"583:26:102","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":14945,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"610:19:102","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"583:46:102","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":14947,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"583:55:102","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":14948,"nodeType":"ExpressionStatement","src":"583:55:102"}]},"functionSelector":"8eafcf67","id":14950,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsProxyAdmin","nameLocation":"522:19:102","nodeType":"FunctionDefinition","parameters":{"id":14939,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14938,"mutability":"mutable","name":"account","nameLocation":"550:7:102","nodeType":"VariableDeclaration","scope":14950,"src":"542:15:102","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14937,"name":"address","nodeType":"ElementaryTypeName","src":"542:7:102","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"541:17:102"},"returnParameters":{"id":14940,"nodeType":"ParameterList","parameters":[],"src":"573:0:102"},"scope":14960,"src":"513:132:102","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":14958,"nodeType":"Block","src":"711:34:102","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14955,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[19275],"referencedDeclaration":19275,"src":"728:8:102","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14956,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"728:10:102","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14954,"id":14957,"nodeType":"Return","src":"721:17:102"}]},"functionSelector":"31e66e1e","id":14959,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"660:9:102","nodeType":"FunctionDefinition","parameters":{"id":14951,"nodeType":"ParameterList","parameters":[],"src":"669:2:102"},"returnParameters":{"id":14954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14953,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14959,"src":"695:14:102","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14952,"name":"bytes","nodeType":"ElementaryTypeName","src":"695:5:102","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"694:16:102"},"scope":14960,"src":"651:94:102","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14961,"src":"307:440:102","usedErrors":[19178,19183,19192],"usedEvents":[19201]}],"src":"32:716:102"},"id":102},"contracts/mocks/security/SealedExecutorMock.sol":{"ast":{"absolutePath":"contracts/mocks/security/SealedExecutorMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"SealedExecutor":[19649],"SealedExecutorMock":[14988]},"id":14989,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14962,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:103"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14964,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14989,"sourceUnit":13387,"src":"57:84:103","symbolAliases":[{"foreign":{"id":14963,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:103","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/SealedExecutor.sol","file":"./../../security/SealedExecutor.sol","id":14966,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":14989,"sourceUnit":19650,"src":"142:67:103","symbolAliases":[{"foreign":{"id":14965,"name":"SealedExecutor","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19649,"src":"150:14:103","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":14967,"name":"SealedExecutor","nameLocations":["242:14:103"],"nodeType":"IdentifierPath","referencedDeclaration":19649,"src":"242:14:103"},"id":14968,"nodeType":"InheritanceSpecifier","src":"242:14:103"}],"canonicalName":"SealedExecutorMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":14988,"linearizedBaseContracts":[14988,19649,13297,7901,7934,11554,11579,8139,8091,19695,1206,8562,8546,19892],"name":"SealedExecutorMock","nameLocation":"220:18:103","nodeType":"ContractDefinition","nodes":[{"body":{"id":14977,"nodeType":"Block","src":"347:2:103","statements":[]},"id":14978,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":14974,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":14971,"src":"328:17:103","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":14975,"kind":"baseConstructorSpecifier","modifierName":{"id":14973,"name":"SealedExecutor","nameLocations":["313:14:103"],"nodeType":"IdentifierPath","referencedDeclaration":19649,"src":"313:14:103"},"nodeType":"ModifierInvocation","src":"313:33:103"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":14972,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14971,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"294:17:103","nodeType":"VariableDeclaration","scope":14978,"src":"275:36:103","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":14970,"nodeType":"UserDefinedTypeName","pathNode":{"id":14969,"name":"IForwarderRegistry","nameLocations":["275:18:103"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"275:18:103"},"referencedDeclaration":13386,"src":"275:18:103","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"274:38:103"},"returnParameters":{"id":14976,"nodeType":"ParameterList","parameters":[],"src":"347:0:103"},"scope":14988,"src":"263:86:103","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":14986,"nodeType":"Block","src":"415:34:103","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":14983,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[19648],"referencedDeclaration":19648,"src":"432:8:103","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":14984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"432:10:103","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":14982,"id":14985,"nodeType":"Return","src":"425:17:103"}]},"functionSelector":"31e66e1e","id":14987,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"364:9:103","nodeType":"FunctionDefinition","parameters":{"id":14979,"nodeType":"ParameterList","parameters":[],"src":"373:2:103"},"returnParameters":{"id":14982,"nodeType":"ParameterList","parameters":[{"constant":false,"id":14981,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14987,"src":"399:14:103","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":14980,"name":"bytes","nodeType":"ElementaryTypeName","src":"399:5:103","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"398:16:103"},"scope":14988,"src":"355:94:103","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":14989,"src":"211:240:103","usedErrors":[926,1216,1219,8223,8246,11559,19817],"usedEvents":[8269,8278,8287,19826]}],"src":"32:420:103"},"id":103},"contracts/mocks/security/TokenRecoveryMock.sol":{"ast":{"absolutePath":"contracts/mocks/security/TokenRecoveryMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"TokenRecovery":[19661],"TokenRecoveryMock":[15062]},"id":15063,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":14990,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:104"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":14992,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":13387,"src":"57:84:104","symbolAliases":[{"foreign":{"id":14991,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../security/TokenRecovery.sol","id":14994,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":19662,"src":"142:65:104","symbolAliases":[{"foreign":{"id":14993,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"150:13:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":14996,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":7935,"src":"208:71:104","symbolAliases":[{"foreign":{"id":14995,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"216:17:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":14998,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":1207,"src":"280:66:104","symbolAliases":[{"foreign":{"id":14997,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"288:7:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":15000,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":13298,"src":"347:98:104","symbolAliases":[{"foreign":{"id":14999,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"355:28:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":15002,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15063,"sourceUnit":13143,"src":"446:85:104","symbolAliases":[{"foreign":{"id":15001,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"454:24:104","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15003,"name":"TokenRecovery","nameLocations":["563:13:104"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"563:13:104"},"id":15004,"nodeType":"InheritanceSpecifier","src":"563:13:104"},{"baseName":{"id":15005,"name":"ForwarderRegistryContext","nameLocations":["578:24:104"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"578:24:104"},"id":15006,"nodeType":"InheritanceSpecifier","src":"578:24:104"}],"canonicalName":"TokenRecoveryMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15062,"linearizedBaseContracts":[15062,13142,13370,13297,19661,7934,11554,11579,8139,19810,1206,8562,19938],"name":"TokenRecoveryMock","nameLocation":"542:17:104","nodeType":"ContractDefinition","nodes":[{"body":{"id":15019,"nodeType":"Block","src":"733:2:104","statements":[]},"id":15020,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":15012,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"677:3:104","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":15013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"681:6:104","memberName":"sender","nodeType":"MemberAccess","src":"677:10:104","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":15014,"kind":"baseConstructorSpecifier","modifierName":{"id":15011,"name":"ContractOwnership","nameLocations":["659:17:104"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"659:17:104"},"nodeType":"ModifierInvocation","src":"659:29:104"},{"arguments":[{"id":15016,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15009,"src":"714:17:104","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15017,"kind":"baseConstructorSpecifier","modifierName":{"id":15015,"name":"ForwarderRegistryContext","nameLocations":["689:24:104"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"689:24:104"},"nodeType":"ModifierInvocation","src":"689:43:104"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15010,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15009,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"640:17:104","nodeType":"VariableDeclaration","scope":15020,"src":"621:36:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15008,"nodeType":"UserDefinedTypeName","pathNode":{"id":15007,"name":"IForwarderRegistry","nameLocations":["621:18:104"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"621:18:104"},"referencedDeclaration":13386,"src":"621:18:104","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"620:38:104"},"returnParameters":{"id":15018,"nodeType":"ParameterList","parameters":[],"src":"733:0:104"},"scope":15062,"src":"609:126:104","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":15023,"nodeType":"Block","src":"768:2:104","statements":[]},"id":15024,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15021,"nodeType":"ParameterList","parameters":[],"src":"748:2:104"},"returnParameters":{"id":15022,"nodeType":"ParameterList","parameters":[],"src":"768:0:104"},"scope":15062,"src":"741:29:104","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":15032,"nodeType":"Block","src":"836:34:104","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15029,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[15061],"referencedDeclaration":15061,"src":"853:8:104","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"853:10:104","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15028,"id":15031,"nodeType":"Return","src":"846:17:104"}]},"functionSelector":"31e66e1e","id":15033,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"785:9:104","nodeType":"FunctionDefinition","parameters":{"id":15025,"nodeType":"ParameterList","parameters":[],"src":"794:2:104"},"returnParameters":{"id":15028,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15027,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15033,"src":"820:14:104","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15026,"name":"bytes","nodeType":"ElementaryTypeName","src":"820:5:104","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"819:16:104"},"scope":15062,"src":"776:94:104","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":15046,"nodeType":"Block","src":"1035:65:104","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15042,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1052:28:104","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":15043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1081:10:104","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1052:39:104","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":15044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1052:41:104","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":15041,"id":15045,"nodeType":"Return","src":"1045:48:104"}]},"documentation":{"id":15034,"nodeType":"StructuredDocumentation","src":"876:44:104","text":"@inheritdoc ForwarderRegistryContextBase"},"id":15047,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"934:10:104","nodeType":"FunctionDefinition","overrides":{"id":15038,"nodeType":"OverrideSpecifier","overrides":[{"id":15036,"name":"Context","nameLocations":["978:7:104"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"978:7:104"},{"id":15037,"name":"ForwarderRegistryContextBase","nameLocations":["987:28:104"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"987:28:104"}],"src":"969:47:104"},"parameters":{"id":15035,"nodeType":"ParameterList","parameters":[],"src":"944:2:104"},"returnParameters":{"id":15041,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15040,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15047,"src":"1026:7:104","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15039,"name":"address","nodeType":"ElementaryTypeName","src":"1026:7:104","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1025:9:104"},"scope":15062,"src":"925:175:104","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":15060,"nodeType":"Block","src":"1270:63:104","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15056,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1287:28:104","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":15057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1316:8:104","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1287:37:104","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1287:39:104","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15055,"id":15059,"nodeType":"Return","src":"1280:46:104"}]},"documentation":{"id":15048,"nodeType":"StructuredDocumentation","src":"1106:44:104","text":"@inheritdoc ForwarderRegistryContextBase"},"id":15061,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1164:8:104","nodeType":"FunctionDefinition","overrides":{"id":15052,"nodeType":"OverrideSpecifier","overrides":[{"id":15050,"name":"Context","nameLocations":["1206:7:104"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1206:7:104"},{"id":15051,"name":"ForwarderRegistryContextBase","nameLocations":["1215:28:104"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1215:28:104"}],"src":"1197:47:104"},"parameters":{"id":15049,"nodeType":"ParameterList","parameters":[],"src":"1172:2:104"},"returnParameters":{"id":15055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15054,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15061,"src":"1254:14:104","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15053,"name":"bytes","nodeType":"ElementaryTypeName","src":"1254:5:104","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1253:16:104"},"scope":15062,"src":"1155:178:104","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":15063,"src":"533:802:104","usedErrors":[464,1216,1219,7886,8246,11559,20056],"usedEvents":[8287]}],"src":"32:1304:104"},"id":104},"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"TokenRecoveryFacet":[19880],"TokenRecoveryFacetMock":[15094]},"id":15095,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15064,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:105"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15066,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15095,"sourceUnit":13387,"src":"57:87:105","symbolAliases":[{"foreign":{"id":15065,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:105","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/facets/TokenRecoveryFacet.sol","file":"./../../../security/facets/TokenRecoveryFacet.sol","id":15068,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15095,"sourceUnit":19881,"src":"145:85:105","symbolAliases":[{"foreign":{"id":15067,"name":"TokenRecoveryFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19880,"src":"153:18:105","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15069,"name":"TokenRecoveryFacet","nameLocations":["267:18:105"],"nodeType":"IdentifierPath","referencedDeclaration":19880,"src":"267:18:105"},"id":15070,"nodeType":"InheritanceSpecifier","src":"267:18:105"}],"canonicalName":"TokenRecoveryFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15094,"linearizedBaseContracts":[15094,19880,13297,19810,1206,19938],"name":"TokenRecoveryFacetMock","nameLocation":"241:22:105","nodeType":"ContractDefinition","nodes":[{"body":{"id":15079,"nodeType":"Block","src":"380:2:105","statements":[]},"id":15080,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15076,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15073,"src":"361:17:105","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15077,"kind":"baseConstructorSpecifier","modifierName":{"id":15075,"name":"TokenRecoveryFacet","nameLocations":["342:18:105"],"nodeType":"IdentifierPath","referencedDeclaration":19880,"src":"342:18:105"},"nodeType":"ModifierInvocation","src":"342:37:105"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15074,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15073,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"323:17:105","nodeType":"VariableDeclaration","scope":15080,"src":"304:36:105","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15072,"nodeType":"UserDefinedTypeName","pathNode":{"id":15071,"name":"IForwarderRegistry","nameLocations":["304:18:105"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"304:18:105"},"referencedDeclaration":13386,"src":"304:18:105","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"303:38:105"},"returnParameters":{"id":15078,"nodeType":"ParameterList","parameters":[],"src":"380:0:105"},"scope":15094,"src":"292:90:105","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":15083,"nodeType":"Block","src":"415:2:105","statements":[]},"id":15084,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15081,"nodeType":"ParameterList","parameters":[],"src":"395:2:105"},"returnParameters":{"id":15082,"nodeType":"ParameterList","parameters":[],"src":"415:0:105"},"scope":15094,"src":"388:29:105","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":15092,"nodeType":"Block","src":"483:34:105","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15089,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[19879],"referencedDeclaration":19879,"src":"500:8:105","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15090,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"500:10:105","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15088,"id":15091,"nodeType":"Return","src":"493:17:105"}]},"functionSelector":"31e66e1e","id":15093,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"432:9:105","nodeType":"FunctionDefinition","parameters":{"id":15085,"nodeType":"ParameterList","parameters":[],"src":"441:2:105"},"returnParameters":{"id":15088,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15087,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15093,"src":"467:14:105","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15086,"name":"bytes","nodeType":"ElementaryTypeName","src":"467:5:105","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"466:16:105"},"scope":15094,"src":"423:94:105","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":15095,"src":"232:287:105","usedErrors":[464,1216,1219,7886,8246,20056],"usedEvents":[]}],"src":"32:488:105"},"id":105},"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol","exportedSymbols":{"Context":[1206],"ERC1155StakingERC20RewardsLinearPoolMock":[15233],"ERC1155StakingLinearPool":[21774],"IERC1155":[24178],"IERC20":[452],"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPool_ERC20Rewards":[21177]},"id":15234,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15096,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:106"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15098,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":21015,"src":"57:68:106","symbolAliases":[{"foreign":{"id":15097,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol","file":"./../../../staking/linear/stake/ERC1155StakingLinearPool.sol","id":15100,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":21775,"src":"126:102:106","symbolAliases":[{"foreign":{"id":15099,"name":"ERC1155StakingLinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21774,"src":"134:24:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol","file":"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol","id":15102,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":21178,"src":"229:101:106","symbolAliases":[{"foreign":{"id":15101,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"237:23:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":15104,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":1207,"src":"331:66:106","symbolAliases":[{"foreign":{"id":15103,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"339:7:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":15106,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":375,"src":"398:69:106","symbolAliases":[{"foreign":{"id":15105,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"406:6:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","file":"./../../../token/ERC1155/interfaces/IERC1155.sol","id":15108,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":24179,"src":"468:74:106","symbolAliases":[{"foreign":{"id":15107,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"476:8:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15110,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15234,"sourceUnit":13387,"src":"543:87:106","symbolAliases":[{"foreign":{"id":15109,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"551:18:106","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15111,"name":"ERC1155StakingLinearPool","nameLocations":["685:24:106"],"nodeType":"IdentifierPath","referencedDeclaration":21774,"src":"685:24:106"},"id":15112,"nodeType":"InheritanceSpecifier","src":"685:24:106"},{"baseName":{"id":15113,"name":"LinearPool_ERC20Rewards","nameLocations":["711:23:106"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"711:23:106"},"id":15114,"nodeType":"InheritanceSpecifier","src":"711:23:106"}],"canonicalName":"ERC1155StakingERC20RewardsLinearPoolMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15233,"linearizedBaseContracts":[15233,21177,21774,22724,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,24324,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC1155StakingERC20RewardsLinearPoolMock","nameLocation":"641:40:106","nodeType":"ContractDefinition","nodes":[{"body":{"id":15139,"nodeType":"Block","src":"1063:2:106","statements":[]},"id":15140,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15130,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15117,"src":"956:12:106","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},{"id":15131,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15124,"src":"970:21:106","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15132,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15127,"src":"993:17:106","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15133,"kind":"baseConstructorSpecifier","modifierName":{"id":15129,"name":"ERC1155StakingLinearPool","nameLocations":["931:24:106"],"nodeType":"IdentifierPath","referencedDeclaration":21774,"src":"931:24:106"},"nodeType":"ModifierInvocation","src":"931:80:106"},{"arguments":[{"id":15135,"name":"rewardToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15120,"src":"1036:11:106","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":15136,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15122,"src":"1049:12:106","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":15137,"kind":"baseConstructorSpecifier","modifierName":{"id":15134,"name":"LinearPool_ERC20Rewards","nameLocations":["1012:23:106"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1012:23:106"},"nodeType":"ModifierInvocation","src":"1012:50:106"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15128,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15117,"mutability":"mutable","name":"stakingToken","nameLocation":"771:12:106","nodeType":"VariableDeclaration","scope":15140,"src":"762:21:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"},"typeName":{"id":15116,"nodeType":"UserDefinedTypeName","pathNode":{"id":15115,"name":"IERC1155","nameLocations":["762:8:106"],"nodeType":"IdentifierPath","referencedDeclaration":24178,"src":"762:8:106"},"referencedDeclaration":24178,"src":"762:8:106","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"visibility":"internal"},{"constant":false,"id":15120,"mutability":"mutable","name":"rewardToken","nameLocation":"800:11:106","nodeType":"VariableDeclaration","scope":15140,"src":"793:18:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":15119,"nodeType":"UserDefinedTypeName","pathNode":{"id":15118,"name":"IERC20","nameLocations":["793:6:106"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"793:6:106"},"referencedDeclaration":452,"src":"793:6:106","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":15122,"mutability":"mutable","name":"rewardHolder","nameLocation":"829:12:106","nodeType":"VariableDeclaration","scope":15140,"src":"821:20:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15121,"name":"address","nodeType":"ElementaryTypeName","src":"821:7:106","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15124,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"857:21:106","nodeType":"VariableDeclaration","scope":15140,"src":"851:27:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15123,"name":"uint8","nodeType":"ElementaryTypeName","src":"851:5:106","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15127,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"907:17:106","nodeType":"VariableDeclaration","scope":15140,"src":"888:36:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15126,"nodeType":"UserDefinedTypeName","pathNode":{"id":15125,"name":"IForwarderRegistry","nameLocations":["888:18:106"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"888:18:106"},"referencedDeclaration":13386,"src":"888:18:106","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"752:178:106"},"returnParameters":{"id":15138,"nodeType":"ParameterList","parameters":[],"src":"1063:0:106"},"scope":15233,"src":"741:324:106","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20977,21167],"body":{"id":15163,"nodeType":"Block","src":"1293:91:106","statements":[{"expression":{"arguments":[{"id":15158,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15142,"src":"1348:6:106","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15159,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15144,"src":"1356:9:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15160,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15146,"src":"1367:9:106","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15156,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1310:23:106","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15157,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1334:13:106","memberName":"_computeClaim","nodeType":"MemberAccess","referencedDeclaration":21167,"src":"1310:37:106","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (address,uint256,bytes calldata) returns (uint256,uint256)"}},"id":15161,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1310:67:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"functionReturnParameters":15155,"id":15162,"nodeType":"Return","src":"1303:74:106"}]},"id":15164,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"1080:13:106","nodeType":"FunctionDefinition","overrides":{"id":15150,"nodeType":"OverrideSpecifier","overrides":[{"id":15148,"name":"LinearPool","nameLocations":["1211:10:106"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1211:10:106"},{"id":15149,"name":"LinearPool_ERC20Rewards","nameLocations":["1223:23:106"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1223:23:106"}],"src":"1202:45:106"},"parameters":{"id":15147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15142,"mutability":"mutable","name":"staker","nameLocation":"1111:6:106","nodeType":"VariableDeclaration","scope":15164,"src":"1103:14:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15141,"name":"address","nodeType":"ElementaryTypeName","src":"1103:7:106","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15144,"mutability":"mutable","name":"claimable","nameLocation":"1135:9:106","nodeType":"VariableDeclaration","scope":15164,"src":"1127:17:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15143,"name":"uint256","nodeType":"ElementaryTypeName","src":"1127:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15146,"mutability":"mutable","name":"claimData","nameLocation":"1169:9:106","nodeType":"VariableDeclaration","scope":15164,"src":"1154:24:106","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15145,"name":"bytes","nodeType":"ElementaryTypeName","src":"1154:5:106","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1093:91:106"},"returnParameters":{"id":15155,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15152,"mutability":"mutable","name":"claimed","nameLocation":"1265:7:106","nodeType":"VariableDeclaration","scope":15164,"src":"1257:15:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15151,"name":"uint256","nodeType":"ElementaryTypeName","src":"1257:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15154,"mutability":"mutable","name":"unclaimed","nameLocation":"1282:9:106","nodeType":"VariableDeclaration","scope":15164,"src":"1274:17:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15153,"name":"uint256","nodeType":"ElementaryTypeName","src":"1274:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1256:36:106"},"scope":15233,"src":"1071:313:106","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985,21176],"body":{"id":15181,"nodeType":"Block","src":"1514:76:106","statements":[{"expression":{"arguments":[{"id":15177,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15166,"src":"1566:8:106","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15178,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15168,"src":"1576:6:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":15174,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1524:23:106","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15176,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1548:17:106","memberName":"_computeAddReward","nodeType":"MemberAccess","referencedDeclaration":21176,"src":"1524:41:106","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":15179,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1524:59:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15180,"nodeType":"ExpressionStatement","src":"1524:59:106"}]},"id":15182,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1399:17:106","nodeType":"FunctionDefinition","overrides":{"id":15172,"nodeType":"OverrideSpecifier","overrides":[{"id":15170,"name":"LinearPool","nameLocations":["1477:10:106"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1477:10:106"},{"id":15171,"name":"LinearPool_ERC20Rewards","nameLocations":["1489:23:106"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1489:23:106"}],"src":"1468:45:106"},"parameters":{"id":15169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15166,"mutability":"mutable","name":"rewarder","nameLocation":"1425:8:106","nodeType":"VariableDeclaration","scope":15182,"src":"1417:16:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15165,"name":"address","nodeType":"ElementaryTypeName","src":"1417:7:106","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15168,"mutability":"mutable","name":"reward","nameLocation":"1443:6:106","nodeType":"VariableDeclaration","scope":15182,"src":"1435:14:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15167,"name":"uint256","nodeType":"ElementaryTypeName","src":"1435:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1416:34:106"},"returnParameters":{"id":15173,"nodeType":"ParameterList","parameters":[],"src":"1514:0:106"},"scope":15233,"src":"1390:200:106","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[21773],"body":{"id":15194,"nodeType":"Block","src":"1691:30:106","statements":[{"expression":{"id":15192,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15186,"src":"1708:6:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":15191,"id":15193,"nodeType":"Return","src":"1701:13:106"}]},"id":15195,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenValue","nameLocation":"1605:11:106","nodeType":"FunctionDefinition","overrides":{"id":15188,"nodeType":"OverrideSpecifier","overrides":[],"src":"1664:8:106"},"parameters":{"id":15187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15184,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15195,"src":"1617:7:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15183,"name":"uint256","nodeType":"ElementaryTypeName","src":"1617:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15186,"mutability":"mutable","name":"amount","nameLocation":"1634:6:106","nodeType":"VariableDeclaration","scope":15195,"src":"1626:14:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15185,"name":"uint256","nodeType":"ElementaryTypeName","src":"1626:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1616:25:106"},"returnParameters":{"id":15191,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15190,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15195,"src":"1682:7:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15189,"name":"uint256","nodeType":"ElementaryTypeName","src":"1682:7:106","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1681:9:106"},"scope":15233,"src":"1596:125:106","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1188,20999],"body":{"id":15208,"nodeType":"Block","src":"1850:47:106","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15204,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"1867:10:106","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15205,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1878:10:106","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":20999,"src":"1867:21:106","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":15206,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1867:23:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":15203,"id":15207,"nodeType":"Return","src":"1860:30:106"}]},"documentation":{"id":15196,"nodeType":"StructuredDocumentation","src":"1727:26:106","text":"@inheritdoc LinearPool"},"id":15209,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1767:10:106","nodeType":"FunctionDefinition","overrides":{"id":15200,"nodeType":"OverrideSpecifier","overrides":[{"id":15198,"name":"Context","nameLocations":["1811:7:106"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1811:7:106"},{"id":15199,"name":"LinearPool","nameLocations":["1820:10:106"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1820:10:106"}],"src":"1802:29:106"},"parameters":{"id":15197,"nodeType":"ParameterList","parameters":[],"src":"1777:2:106"},"returnParameters":{"id":15203,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15202,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15209,"src":"1841:7:106","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15201,"name":"address","nodeType":"ElementaryTypeName","src":"1841:7:106","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1840:9:106"},"scope":15233,"src":"1758:139:106","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,21013],"body":{"id":15222,"nodeType":"Block","src":"2031:45:106","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15218,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"2048:10:106","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2059:8:106","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":21013,"src":"2048:19:106","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2048:21:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15217,"id":15221,"nodeType":"Return","src":"2041:28:106"}]},"documentation":{"id":15210,"nodeType":"StructuredDocumentation","src":"1903:26:106","text":"@inheritdoc LinearPool"},"id":15223,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1943:8:106","nodeType":"FunctionDefinition","overrides":{"id":15214,"nodeType":"OverrideSpecifier","overrides":[{"id":15212,"name":"Context","nameLocations":["1985:7:106"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1985:7:106"},{"id":15213,"name":"LinearPool","nameLocations":["1994:10:106"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1994:10:106"}],"src":"1976:29:106"},"parameters":{"id":15211,"nodeType":"ParameterList","parameters":[],"src":"1951:2:106"},"returnParameters":{"id":15217,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15216,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15223,"src":"2015:14:106","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15215,"name":"bytes","nodeType":"ElementaryTypeName","src":"2015:5:106","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2014:16:106"},"scope":15233,"src":"1934:142:106","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":15231,"nodeType":"Block","src":"2142:34:106","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15228,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[15223],"referencedDeclaration":15223,"src":"2159:8:106","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2159:10:106","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15227,"id":15230,"nodeType":"Return","src":"2152:17:106"}]},"functionSelector":"31e66e1e","id":15232,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"2091:9:106","nodeType":"FunctionDefinition","parameters":{"id":15224,"nodeType":"ParameterList","parameters":[],"src":"2100:2:106"},"returnParameters":{"id":15227,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15226,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15232,"src":"2126:14:106","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15225,"name":"bytes","nodeType":"ElementaryTypeName","src":"2126:5:106","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2125:16:106"},"scope":15233,"src":"2082:94:106","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":15234,"src":"632:1546:106","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,21205,21215],"usedEvents":[8269,8278,8287,20330,20338,20348,20356,21085]}],"src":"32:2147:106"},"id":106},"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol","exportedSymbols":{"Context":[1206],"ERC20StakingERC20RewardsLinearPoolMock":[15357],"ERC20StakingLinearPool":[22055],"IERC20":[452],"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPool_ERC20Rewards":[21177]},"id":15358,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15235,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:107"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15237,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":21015,"src":"57:68:107","symbolAliases":[{"foreign":{"id":15236,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol","file":"./../../../staking/linear/stake/ERC20StakingLinearPool.sol","id":15239,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":22056,"src":"126:98:107","symbolAliases":[{"foreign":{"id":15238,"name":"ERC20StakingLinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22055,"src":"134:22:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol","file":"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol","id":15241,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":21178,"src":"225:101:107","symbolAliases":[{"foreign":{"id":15240,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"233:23:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":15243,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":1207,"src":"327:66:107","symbolAliases":[{"foreign":{"id":15242,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"335:7:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":15245,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":375,"src":"394:69:107","symbolAliases":[{"foreign":{"id":15244,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"402:6:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15247,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15358,"sourceUnit":13387,"src":"464:87:107","symbolAliases":[{"foreign":{"id":15246,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"472:18:107","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15248,"name":"ERC20StakingLinearPool","nameLocations":["604:22:107"],"nodeType":"IdentifierPath","referencedDeclaration":22055,"src":"604:22:107"},"id":15249,"nodeType":"InheritanceSpecifier","src":"604:22:107"},{"baseName":{"id":15250,"name":"LinearPool_ERC20Rewards","nameLocations":["628:23:107"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"628:23:107"},"id":15251,"nodeType":"InheritanceSpecifier","src":"628:23:107"}],"canonicalName":"ERC20StakingERC20RewardsLinearPoolMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15357,"linearizedBaseContracts":[15357,21177,22055,26279,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,28035,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC20StakingERC20RewardsLinearPoolMock","nameLocation":"562:38:107","nodeType":"ContractDefinition","nodes":[{"body":{"id":15276,"nodeType":"Block","src":"976:2:107","statements":[]},"id":15277,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15267,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15254,"src":"869:12:107","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":15268,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15261,"src":"883:21:107","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15269,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15264,"src":"906:17:107","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15270,"kind":"baseConstructorSpecifier","modifierName":{"id":15266,"name":"ERC20StakingLinearPool","nameLocations":["846:22:107"],"nodeType":"IdentifierPath","referencedDeclaration":22055,"src":"846:22:107"},"nodeType":"ModifierInvocation","src":"846:78:107"},{"arguments":[{"id":15272,"name":"rewardToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15257,"src":"949:11:107","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":15273,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15259,"src":"962:12:107","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":15274,"kind":"baseConstructorSpecifier","modifierName":{"id":15271,"name":"LinearPool_ERC20Rewards","nameLocations":["925:23:107"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"925:23:107"},"nodeType":"ModifierInvocation","src":"925:50:107"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15265,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15254,"mutability":"mutable","name":"stakingToken","nameLocation":"686:12:107","nodeType":"VariableDeclaration","scope":15277,"src":"679:19:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":15253,"nodeType":"UserDefinedTypeName","pathNode":{"id":15252,"name":"IERC20","nameLocations":["679:6:107"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"679:6:107"},"referencedDeclaration":452,"src":"679:6:107","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":15257,"mutability":"mutable","name":"rewardToken","nameLocation":"715:11:107","nodeType":"VariableDeclaration","scope":15277,"src":"708:18:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":15256,"nodeType":"UserDefinedTypeName","pathNode":{"id":15255,"name":"IERC20","nameLocations":["708:6:107"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"708:6:107"},"referencedDeclaration":452,"src":"708:6:107","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":15259,"mutability":"mutable","name":"rewardHolder","nameLocation":"744:12:107","nodeType":"VariableDeclaration","scope":15277,"src":"736:20:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15258,"name":"address","nodeType":"ElementaryTypeName","src":"736:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15261,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"772:21:107","nodeType":"VariableDeclaration","scope":15277,"src":"766:27:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15260,"name":"uint8","nodeType":"ElementaryTypeName","src":"766:5:107","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15264,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"822:17:107","nodeType":"VariableDeclaration","scope":15277,"src":"803:36:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15263,"nodeType":"UserDefinedTypeName","pathNode":{"id":15262,"name":"IForwarderRegistry","nameLocations":["803:18:107"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"803:18:107"},"referencedDeclaration":13386,"src":"803:18:107","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"669:176:107"},"returnParameters":{"id":15275,"nodeType":"ParameterList","parameters":[],"src":"976:0:107"},"scope":15357,"src":"658:320:107","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20977,21167],"body":{"id":15300,"nodeType":"Block","src":"1206:91:107","statements":[{"expression":{"arguments":[{"id":15295,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15279,"src":"1261:6:107","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15296,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15281,"src":"1269:9:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15297,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15283,"src":"1280:9:107","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15293,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1223:23:107","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1247:13:107","memberName":"_computeClaim","nodeType":"MemberAccess","referencedDeclaration":21167,"src":"1223:37:107","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (address,uint256,bytes calldata) returns (uint256,uint256)"}},"id":15298,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1223:67:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"functionReturnParameters":15292,"id":15299,"nodeType":"Return","src":"1216:74:107"}]},"id":15301,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"993:13:107","nodeType":"FunctionDefinition","overrides":{"id":15287,"nodeType":"OverrideSpecifier","overrides":[{"id":15285,"name":"LinearPool","nameLocations":["1124:10:107"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1124:10:107"},{"id":15286,"name":"LinearPool_ERC20Rewards","nameLocations":["1136:23:107"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1136:23:107"}],"src":"1115:45:107"},"parameters":{"id":15284,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15279,"mutability":"mutable","name":"staker","nameLocation":"1024:6:107","nodeType":"VariableDeclaration","scope":15301,"src":"1016:14:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15278,"name":"address","nodeType":"ElementaryTypeName","src":"1016:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15281,"mutability":"mutable","name":"claimable","nameLocation":"1048:9:107","nodeType":"VariableDeclaration","scope":15301,"src":"1040:17:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15280,"name":"uint256","nodeType":"ElementaryTypeName","src":"1040:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15283,"mutability":"mutable","name":"claimData","nameLocation":"1082:9:107","nodeType":"VariableDeclaration","scope":15301,"src":"1067:24:107","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15282,"name":"bytes","nodeType":"ElementaryTypeName","src":"1067:5:107","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1006:91:107"},"returnParameters":{"id":15292,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15289,"mutability":"mutable","name":"claimed","nameLocation":"1178:7:107","nodeType":"VariableDeclaration","scope":15301,"src":"1170:15:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15288,"name":"uint256","nodeType":"ElementaryTypeName","src":"1170:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15291,"mutability":"mutable","name":"unclaimed","nameLocation":"1195:9:107","nodeType":"VariableDeclaration","scope":15301,"src":"1187:17:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15290,"name":"uint256","nodeType":"ElementaryTypeName","src":"1187:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1169:36:107"},"scope":15357,"src":"984:313:107","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985,21176],"body":{"id":15318,"nodeType":"Block","src":"1427:76:107","statements":[{"expression":{"arguments":[{"id":15314,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15303,"src":"1479:8:107","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15315,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15305,"src":"1489:6:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":15311,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1437:23:107","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1461:17:107","memberName":"_computeAddReward","nodeType":"MemberAccess","referencedDeclaration":21176,"src":"1437:41:107","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":15316,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1437:59:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15317,"nodeType":"ExpressionStatement","src":"1437:59:107"}]},"id":15319,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1312:17:107","nodeType":"FunctionDefinition","overrides":{"id":15309,"nodeType":"OverrideSpecifier","overrides":[{"id":15307,"name":"LinearPool","nameLocations":["1390:10:107"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1390:10:107"},{"id":15308,"name":"LinearPool_ERC20Rewards","nameLocations":["1402:23:107"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1402:23:107"}],"src":"1381:45:107"},"parameters":{"id":15306,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15303,"mutability":"mutable","name":"rewarder","nameLocation":"1338:8:107","nodeType":"VariableDeclaration","scope":15319,"src":"1330:16:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15302,"name":"address","nodeType":"ElementaryTypeName","src":"1330:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15305,"mutability":"mutable","name":"reward","nameLocation":"1356:6:107","nodeType":"VariableDeclaration","scope":15319,"src":"1348:14:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15304,"name":"uint256","nodeType":"ElementaryTypeName","src":"1348:7:107","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1329:34:107"},"returnParameters":{"id":15310,"nodeType":"ParameterList","parameters":[],"src":"1427:0:107"},"scope":15357,"src":"1303:200:107","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[1188,20999],"body":{"id":15332,"nodeType":"Block","src":"1632:47:107","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15328,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"1649:10:107","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1660:10:107","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":20999,"src":"1649:21:107","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":15330,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1649:23:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":15327,"id":15331,"nodeType":"Return","src":"1642:30:107"}]},"documentation":{"id":15320,"nodeType":"StructuredDocumentation","src":"1509:26:107","text":"@inheritdoc LinearPool"},"id":15333,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1549:10:107","nodeType":"FunctionDefinition","overrides":{"id":15324,"nodeType":"OverrideSpecifier","overrides":[{"id":15322,"name":"Context","nameLocations":["1593:7:107"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1593:7:107"},{"id":15323,"name":"LinearPool","nameLocations":["1602:10:107"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1602:10:107"}],"src":"1584:29:107"},"parameters":{"id":15321,"nodeType":"ParameterList","parameters":[],"src":"1559:2:107"},"returnParameters":{"id":15327,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15326,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15333,"src":"1623:7:107","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15325,"name":"address","nodeType":"ElementaryTypeName","src":"1623:7:107","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1622:9:107"},"scope":15357,"src":"1540:139:107","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,21013],"body":{"id":15346,"nodeType":"Block","src":"1813:45:107","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15342,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"1830:10:107","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1841:8:107","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":21013,"src":"1830:19:107","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15344,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1830:21:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15341,"id":15345,"nodeType":"Return","src":"1823:28:107"}]},"documentation":{"id":15334,"nodeType":"StructuredDocumentation","src":"1685:26:107","text":"@inheritdoc LinearPool"},"id":15347,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1725:8:107","nodeType":"FunctionDefinition","overrides":{"id":15338,"nodeType":"OverrideSpecifier","overrides":[{"id":15336,"name":"Context","nameLocations":["1767:7:107"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1767:7:107"},{"id":15337,"name":"LinearPool","nameLocations":["1776:10:107"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1776:10:107"}],"src":"1758:29:107"},"parameters":{"id":15335,"nodeType":"ParameterList","parameters":[],"src":"1733:2:107"},"returnParameters":{"id":15341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15340,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15347,"src":"1797:14:107","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15339,"name":"bytes","nodeType":"ElementaryTypeName","src":"1797:5:107","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1796:16:107"},"scope":15357,"src":"1716:142:107","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":15355,"nodeType":"Block","src":"1924:34:107","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15352,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[15347],"referencedDeclaration":15347,"src":"1941:8:107","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15353,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1941:10:107","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15351,"id":15354,"nodeType":"Return","src":"1934:17:107"}]},"functionSelector":"31e66e1e","id":15356,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1873:9:107","nodeType":"FunctionDefinition","parameters":{"id":15348,"nodeType":"ParameterList","parameters":[],"src":"1882:2:107"},"returnParameters":{"id":15351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15350,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15356,"src":"1908:14:107","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15349,"name":"bytes","nodeType":"ElementaryTypeName","src":"1908:5:107","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1907:16:107"},"scope":15357,"src":"1864:94:107","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":15358,"src":"553:1407:107","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,21801,21807],"usedEvents":[8269,8278,8287,20330,20338,20348,20356,21085]}],"src":"32:1929:107"},"id":107},"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol","exportedSymbols":{"Context":[1206],"ERC721StakingERC20RewardsLinearPoolMock":[15494],"ERC721StakingLinearPool":[22552],"IERC20":[452],"IERC721":[33094],"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPool_ERC20Rewards":[21177]},"id":15495,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15359,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:108"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15361,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":21015,"src":"57:68:108","symbolAliases":[{"foreign":{"id":15360,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol","file":"./../../../staking/linear/stake/ERC721StakingLinearPool.sol","id":15363,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":22553,"src":"126:100:108","symbolAliases":[{"foreign":{"id":15362,"name":"ERC721StakingLinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22552,"src":"134:23:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol","file":"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol","id":15365,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":21178,"src":"227:101:108","symbolAliases":[{"foreign":{"id":15364,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"235:23:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":15367,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":1207,"src":"329:66:108","symbolAliases":[{"foreign":{"id":15366,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"337:7:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":15369,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":375,"src":"396:69:108","symbolAliases":[{"foreign":{"id":15368,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"404:6:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../../../token/ERC721/interfaces/IERC721.sol","id":15371,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":33095,"src":"466:71:108","symbolAliases":[{"foreign":{"id":15370,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"474:7:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15373,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15495,"sourceUnit":13387,"src":"538:87:108","symbolAliases":[{"foreign":{"id":15372,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"546:18:108","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15374,"name":"ERC721StakingLinearPool","nameLocations":["679:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":22552,"src":"679:23:108"},"id":15375,"nodeType":"InheritanceSpecifier","src":"679:23:108"},{"baseName":{"id":15376,"name":"LinearPool_ERC20Rewards","nameLocations":["704:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"704:23:108"},"id":15377,"nodeType":"InheritanceSpecifier","src":"704:23:108"}],"canonicalName":"ERC721StakingERC20RewardsLinearPoolMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15494,"linearizedBaseContracts":[15494,21177,22552,30983,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,33217,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC721StakingERC20RewardsLinearPoolMock","nameLocation":"636:39:108","nodeType":"ContractDefinition","nodes":[{"body":{"id":15402,"nodeType":"Block","src":"1054:2:108","statements":[]},"id":15403,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15393,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15380,"src":"947:12:108","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},{"id":15394,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15387,"src":"961:21:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15395,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15390,"src":"984:17:108","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15396,"kind":"baseConstructorSpecifier","modifierName":{"id":15392,"name":"ERC721StakingLinearPool","nameLocations":["923:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":22552,"src":"923:23:108"},"nodeType":"ModifierInvocation","src":"923:79:108"},{"arguments":[{"id":15398,"name":"rewardToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15383,"src":"1027:11:108","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},{"id":15399,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15385,"src":"1040:12:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":15400,"kind":"baseConstructorSpecifier","modifierName":{"id":15397,"name":"LinearPool_ERC20Rewards","nameLocations":["1003:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1003:23:108"},"nodeType":"ModifierInvocation","src":"1003:50:108"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15391,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15380,"mutability":"mutable","name":"stakingToken","nameLocation":"763:12:108","nodeType":"VariableDeclaration","scope":15403,"src":"755:20:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"},"typeName":{"id":15379,"nodeType":"UserDefinedTypeName","pathNode":{"id":15378,"name":"IERC721","nameLocations":["755:7:108"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"755:7:108"},"referencedDeclaration":33094,"src":"755:7:108","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"visibility":"internal"},{"constant":false,"id":15383,"mutability":"mutable","name":"rewardToken","nameLocation":"792:11:108","nodeType":"VariableDeclaration","scope":15403,"src":"785:18:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":15382,"nodeType":"UserDefinedTypeName","pathNode":{"id":15381,"name":"IERC20","nameLocations":["785:6:108"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"785:6:108"},"referencedDeclaration":452,"src":"785:6:108","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":15385,"mutability":"mutable","name":"rewardHolder","nameLocation":"821:12:108","nodeType":"VariableDeclaration","scope":15403,"src":"813:20:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15384,"name":"address","nodeType":"ElementaryTypeName","src":"813:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15387,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"849:21:108","nodeType":"VariableDeclaration","scope":15403,"src":"843:27:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15386,"name":"uint8","nodeType":"ElementaryTypeName","src":"843:5:108","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15390,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"899:17:108","nodeType":"VariableDeclaration","scope":15403,"src":"880:36:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15389,"nodeType":"UserDefinedTypeName","pathNode":{"id":15388,"name":"IForwarderRegistry","nameLocations":["880:18:108"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"880:18:108"},"referencedDeclaration":13386,"src":"880:18:108","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"745:177:108"},"returnParameters":{"id":15401,"nodeType":"ParameterList","parameters":[],"src":"1054:0:108"},"scope":15494,"src":"734:322:108","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20977,21167],"body":{"id":15426,"nodeType":"Block","src":"1284:91:108","statements":[{"expression":{"arguments":[{"id":15421,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15405,"src":"1339:6:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15422,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15407,"src":"1347:9:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15423,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15409,"src":"1358:9:108","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15419,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1301:23:108","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15420,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1325:13:108","memberName":"_computeClaim","nodeType":"MemberAccess","referencedDeclaration":21167,"src":"1301:37:108","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (address,uint256,bytes calldata) returns (uint256,uint256)"}},"id":15424,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1301:67:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"functionReturnParameters":15418,"id":15425,"nodeType":"Return","src":"1294:74:108"}]},"id":15427,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"1071:13:108","nodeType":"FunctionDefinition","overrides":{"id":15413,"nodeType":"OverrideSpecifier","overrides":[{"id":15411,"name":"LinearPool","nameLocations":["1202:10:108"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1202:10:108"},{"id":15412,"name":"LinearPool_ERC20Rewards","nameLocations":["1214:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1214:23:108"}],"src":"1193:45:108"},"parameters":{"id":15410,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15405,"mutability":"mutable","name":"staker","nameLocation":"1102:6:108","nodeType":"VariableDeclaration","scope":15427,"src":"1094:14:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15404,"name":"address","nodeType":"ElementaryTypeName","src":"1094:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15407,"mutability":"mutable","name":"claimable","nameLocation":"1126:9:108","nodeType":"VariableDeclaration","scope":15427,"src":"1118:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15406,"name":"uint256","nodeType":"ElementaryTypeName","src":"1118:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15409,"mutability":"mutable","name":"claimData","nameLocation":"1160:9:108","nodeType":"VariableDeclaration","scope":15427,"src":"1145:24:108","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15408,"name":"bytes","nodeType":"ElementaryTypeName","src":"1145:5:108","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1084:91:108"},"returnParameters":{"id":15418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15415,"mutability":"mutable","name":"claimed","nameLocation":"1256:7:108","nodeType":"VariableDeclaration","scope":15427,"src":"1248:15:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15414,"name":"uint256","nodeType":"ElementaryTypeName","src":"1248:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15417,"mutability":"mutable","name":"unclaimed","nameLocation":"1273:9:108","nodeType":"VariableDeclaration","scope":15427,"src":"1265:17:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15416,"name":"uint256","nodeType":"ElementaryTypeName","src":"1265:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1247:36:108"},"scope":15494,"src":"1062:313:108","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985,21176],"body":{"id":15444,"nodeType":"Block","src":"1505:76:108","statements":[{"expression":{"arguments":[{"id":15440,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15429,"src":"1557:8:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15441,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15431,"src":"1567:6:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":15437,"name":"LinearPool_ERC20Rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21177,"src":"1515:23:108","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_ERC20Rewards_$21177_$","typeString":"type(contract LinearPool_ERC20Rewards)"}},"id":15439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1539:17:108","memberName":"_computeAddReward","nodeType":"MemberAccess","referencedDeclaration":21176,"src":"1515:41:108","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":15442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1515:59:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15443,"nodeType":"ExpressionStatement","src":"1515:59:108"}]},"id":15445,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1390:17:108","nodeType":"FunctionDefinition","overrides":{"id":15435,"nodeType":"OverrideSpecifier","overrides":[{"id":15433,"name":"LinearPool","nameLocations":["1468:10:108"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1468:10:108"},{"id":15434,"name":"LinearPool_ERC20Rewards","nameLocations":["1480:23:108"],"nodeType":"IdentifierPath","referencedDeclaration":21177,"src":"1480:23:108"}],"src":"1459:45:108"},"parameters":{"id":15432,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15429,"mutability":"mutable","name":"rewarder","nameLocation":"1416:8:108","nodeType":"VariableDeclaration","scope":15445,"src":"1408:16:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15428,"name":"address","nodeType":"ElementaryTypeName","src":"1408:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15431,"mutability":"mutable","name":"reward","nameLocation":"1434:6:108","nodeType":"VariableDeclaration","scope":15445,"src":"1426:14:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15430,"name":"uint256","nodeType":"ElementaryTypeName","src":"1426:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1407:34:108"},"returnParameters":{"id":15436,"nodeType":"ParameterList","parameters":[],"src":"1505:0:108"},"scope":15494,"src":"1381:200:108","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[22551],"body":{"id":15455,"nodeType":"Block","src":"1666:25:108","statements":[{"expression":{"hexValue":"31","id":15453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1683:1:108","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"functionReturnParameters":15452,"id":15454,"nodeType":"Return","src":"1676:8:108"}]},"id":15456,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenValue","nameLocation":"1596:11:108","nodeType":"FunctionDefinition","overrides":{"id":15449,"nodeType":"OverrideSpecifier","overrides":[],"src":"1639:8:108"},"parameters":{"id":15448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15447,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15456,"src":"1608:7:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15446,"name":"uint256","nodeType":"ElementaryTypeName","src":"1608:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1607:9:108"},"returnParameters":{"id":15452,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15451,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15456,"src":"1657:7:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15450,"name":"uint256","nodeType":"ElementaryTypeName","src":"1657:7:108","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1656:9:108"},"scope":15494,"src":"1587:104:108","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1188,20999],"body":{"id":15469,"nodeType":"Block","src":"1820:47:108","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15465,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"1837:10:108","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1848:10:108","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":20999,"src":"1837:21:108","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":15467,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1837:23:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":15464,"id":15468,"nodeType":"Return","src":"1830:30:108"}]},"documentation":{"id":15457,"nodeType":"StructuredDocumentation","src":"1697:26:108","text":"@inheritdoc LinearPool"},"id":15470,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1737:10:108","nodeType":"FunctionDefinition","overrides":{"id":15461,"nodeType":"OverrideSpecifier","overrides":[{"id":15459,"name":"Context","nameLocations":["1781:7:108"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1781:7:108"},{"id":15460,"name":"LinearPool","nameLocations":["1790:10:108"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1790:10:108"}],"src":"1772:29:108"},"parameters":{"id":15458,"nodeType":"ParameterList","parameters":[],"src":"1747:2:108"},"returnParameters":{"id":15464,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15463,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15470,"src":"1811:7:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15462,"name":"address","nodeType":"ElementaryTypeName","src":"1811:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1810:9:108"},"scope":15494,"src":"1728:139:108","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,21013],"body":{"id":15483,"nodeType":"Block","src":"2001:45:108","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":15479,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"2018:10:108","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_LinearPool_$21014_$","typeString":"type(contract LinearPool)"}},"id":15480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2029:8:108","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":21013,"src":"2018:19:108","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15481,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2018:21:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15478,"id":15482,"nodeType":"Return","src":"2011:28:108"}]},"documentation":{"id":15471,"nodeType":"StructuredDocumentation","src":"1873:26:108","text":"@inheritdoc LinearPool"},"id":15484,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1913:8:108","nodeType":"FunctionDefinition","overrides":{"id":15475,"nodeType":"OverrideSpecifier","overrides":[{"id":15473,"name":"Context","nameLocations":["1955:7:108"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1955:7:108"},{"id":15474,"name":"LinearPool","nameLocations":["1964:10:108"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1964:10:108"}],"src":"1946:29:108"},"parameters":{"id":15472,"nodeType":"ParameterList","parameters":[],"src":"1921:2:108"},"returnParameters":{"id":15478,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15477,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15484,"src":"1985:14:108","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15476,"name":"bytes","nodeType":"ElementaryTypeName","src":"1985:5:108","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1984:16:108"},"scope":15494,"src":"1904:142:108","stateMutability":"view","virtual":true,"visibility":"internal"},{"body":{"id":15492,"nodeType":"Block","src":"2112:34:108","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15489,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[15484],"referencedDeclaration":15484,"src":"2129:8:108","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2129:10:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15488,"id":15491,"nodeType":"Return","src":"2122:17:108"}]},"functionSelector":"31e66e1e","id":15493,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"2061:9:108","nodeType":"FunctionDefinition","parameters":{"id":15485,"nodeType":"ParameterList","parameters":[],"src":"2070:2:108"},"returnParameters":{"id":15488,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15487,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15493,"src":"2096:14:108","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15486,"name":"bytes","nodeType":"ElementaryTypeName","src":"2096:5:108","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2095:16:108"},"scope":15494,"src":"2052:94:108","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":15495,"src":"627:1521:108","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,22081,22089,22093],"usedEvents":[8269,8278,8287,20330,20338,20348,20356,21085]}],"src":"32:2117:108"},"id":108},"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPoolClaimRemainderMock":[15598]},"id":15599,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15496,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:109"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15498,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15599,"sourceUnit":21015,"src":"57:68:109","symbolAliases":[{"foreign":{"id":15497,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:109","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15500,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15599,"sourceUnit":13387,"src":"126:87:109","symbolAliases":[{"foreign":{"id":15499,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"134:18:109","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15501,"name":"LinearPool","nameLocations":["256:10:109"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"256:10:109"},"id":15502,"nodeType":"InheritanceSpecifier","src":"256:10:109"}],"canonicalName":"LinearPoolClaimRemainderMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15598,"linearizedBaseContracts":[15598,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,8139,19810,8091,1206,8562,19938,8546,21056],"name":"LinearPoolClaimRemainderMock","nameLocation":"224:28:109","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"c89d0455cf80fe01219eedc81237f5394410c015c96b0c4d0f8bf92363c905d3","id":15508,"name":"ClaimTransferred","nameLocation":"279:16:109","nodeType":"EventDefinition","parameters":{"id":15507,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15504,"indexed":false,"mutability":"mutable","name":"totalReward","nameLocation":"304:11:109","nodeType":"VariableDeclaration","scope":15508,"src":"296:19:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15503,"name":"uint256","nodeType":"ElementaryTypeName","src":"296:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15506,"indexed":false,"mutability":"mutable","name":"transferredReward","nameLocation":"325:17:109","nodeType":"VariableDeclaration","scope":15508,"src":"317:25:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15505,"name":"uint256","nodeType":"ElementaryTypeName","src":"317:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"295:48:109"},"src":"273:71:109"},{"body":{"id":15520,"nodeType":"Block","src":"482:2:109","statements":[]},"id":15521,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15516,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15510,"src":"440:21:109","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15517,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15513,"src":"463:17:109","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15518,"kind":"baseConstructorSpecifier","modifierName":{"id":15515,"name":"LinearPool","nameLocations":["429:10:109"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"429:10:109"},"nodeType":"ModifierInvocation","src":"429:52:109"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15514,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15510,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"368:21:109","nodeType":"VariableDeclaration","scope":15521,"src":"362:27:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15509,"name":"uint8","nodeType":"ElementaryTypeName","src":"362:5:109","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15513,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"410:17:109","nodeType":"VariableDeclaration","scope":15521,"src":"391:36:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15512,"nodeType":"UserDefinedTypeName","pathNode":{"id":15511,"name":"IForwarderRegistry","nameLocations":["391:18:109"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"391:18:109"},"referencedDeclaration":13386,"src":"391:18:109","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"361:67:109"},"returnParameters":{"id":15519,"nodeType":"ParameterList","parameters":[],"src":"482:0:109"},"scope":15598,"src":"350:134:109","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":15541,"nodeType":"Block","src":"602:63:109","statements":[{"expression":{"id":15539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15531,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15529,"src":"612:11:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15534,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15525,"src":"637:9:109","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15536,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"649:7:109","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15535,"name":"uint256","nodeType":"ElementaryTypeName","src":"649:7:109","typeDescriptions":{}}}],"id":15537,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"648:9:109","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15532,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"626:3:109","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15533,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"630:6:109","memberName":"decode","nodeType":"MemberAccess","src":"626:10:109","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15538,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"626:32:109","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"612:46:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15540,"nodeType":"ExpressionStatement","src":"612:46:109"}]},"id":15542,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"499:13:109","nodeType":"FunctionDefinition","overrides":{"id":15527,"nodeType":"OverrideSpecifier","overrides":[],"src":"563:8:109"},"parameters":{"id":15526,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15523,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15542,"src":"513:7:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15522,"name":"address","nodeType":"ElementaryTypeName","src":"513:7:109","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15525,"mutability":"mutable","name":"stakeData","nameLocation":"535:9:109","nodeType":"VariableDeclaration","scope":15542,"src":"522:22:109","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15524,"name":"bytes","nodeType":"ElementaryTypeName","src":"522:5:109","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"512:33:109"},"returnParameters":{"id":15530,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15529,"mutability":"mutable","name":"stakePoints","nameLocation":"589:11:109","nodeType":"VariableDeclaration","scope":15542,"src":"581:19:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15528,"name":"uint256","nodeType":"ElementaryTypeName","src":"581:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"580:21:109"},"scope":15598,"src":"490:175:109","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":15562,"nodeType":"Block","src":"789:66:109","statements":[{"expression":{"id":15560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15552,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15550,"src":"799:11:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15555,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15546,"src":"824:12:109","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"839:7:109","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15556,"name":"uint256","nodeType":"ElementaryTypeName","src":"839:7:109","typeDescriptions":{}}}],"id":15558,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"838:9:109","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15553,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"813:3:109","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15554,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"817:6:109","memberName":"decode","nodeType":"MemberAccess","src":"813:10:109","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"813:35:109","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"799:49:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15561,"nodeType":"ExpressionStatement","src":"799:49:109"}]},"id":15563,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"680:16:109","nodeType":"FunctionDefinition","overrides":{"id":15548,"nodeType":"OverrideSpecifier","overrides":[],"src":"750:8:109"},"parameters":{"id":15547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15544,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15563,"src":"697:7:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15543,"name":"address","nodeType":"ElementaryTypeName","src":"697:7:109","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15546,"mutability":"mutable","name":"withdrawData","nameLocation":"719:12:109","nodeType":"VariableDeclaration","scope":15563,"src":"706:25:109","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15545,"name":"bytes","nodeType":"ElementaryTypeName","src":"706:5:109","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"696:36:109"},"returnParameters":{"id":15551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15550,"mutability":"mutable","name":"stakePoints","nameLocation":"776:11:109","nodeType":"VariableDeclaration","scope":15563,"src":"768:19:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15549,"name":"uint256","nodeType":"ElementaryTypeName","src":"768:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"767:21:109"},"scope":15598,"src":"671:184:109","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20977],"body":{"id":15587,"nodeType":"Block","src":"999:63:109","statements":[{"expression":{"id":15581,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15577,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15573,"src":"1009:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":15580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":15578,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15567,"src":"1019:9:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":15579,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1031:1:109","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1019:13:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1009:23:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15582,"nodeType":"ExpressionStatement","src":"1009:23:109"},{"expression":{"id":15585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15583,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15575,"src":"1042:9:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":15584,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1054:1:109","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1042:13:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15586,"nodeType":"ExpressionStatement","src":"1042:13:109"}]},"id":15588,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"870:13:109","nodeType":"FunctionDefinition","overrides":{"id":15571,"nodeType":"OverrideSpecifier","overrides":[],"src":"945:8:109"},"parameters":{"id":15570,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15565,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15588,"src":"884:7:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15564,"name":"address","nodeType":"ElementaryTypeName","src":"884:7:109","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15567,"mutability":"mutable","name":"claimable","nameLocation":"901:9:109","nodeType":"VariableDeclaration","scope":15588,"src":"893:17:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15566,"name":"uint256","nodeType":"ElementaryTypeName","src":"893:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15569,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15588,"src":"912:14:109","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15568,"name":"bytes","nodeType":"ElementaryTypeName","src":"912:5:109","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"883:44:109"},"returnParameters":{"id":15576,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15573,"mutability":"mutable","name":"claimed","nameLocation":"971:7:109","nodeType":"VariableDeclaration","scope":15588,"src":"963:15:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15572,"name":"uint256","nodeType":"ElementaryTypeName","src":"963:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15575,"mutability":"mutable","name":"unclaimed","nameLocation":"988:9:109","nodeType":"VariableDeclaration","scope":15588,"src":"980:17:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15574,"name":"uint256","nodeType":"ElementaryTypeName","src":"980:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"962:36:109"},"scope":15598,"src":"861:201:109","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985],"body":{"id":15596,"nodeType":"Block","src":"1155:2:109","statements":[]},"id":15597,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1077:17:109","nodeType":"FunctionDefinition","overrides":{"id":15594,"nodeType":"OverrideSpecifier","overrides":[],"src":"1146:8:109"},"parameters":{"id":15593,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15590,"mutability":"mutable","name":"rewarder","nameLocation":"1103:8:109","nodeType":"VariableDeclaration","scope":15597,"src":"1095:16:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15589,"name":"address","nodeType":"ElementaryTypeName","src":"1095:7:109","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15592,"mutability":"mutable","name":"reward","nameLocation":"1121:6:109","nodeType":"VariableDeclaration","scope":15597,"src":"1113:14:109","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15591,"name":"uint256","nodeType":"ElementaryTypeName","src":"1113:7:109","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1094:34:109"},"returnParameters":{"id":15595,"nodeType":"ParameterList","parameters":[],"src":"1155:0:109"},"scope":15598,"src":"1068:89:109","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":15599,"src":"215:944:109","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390],"usedEvents":[8269,8278,8287,15508,20330,20338,20348,20356]}],"src":"32:1128:109"},"id":109},"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPoolInvalidClaimSumMock":[15700]},"id":15701,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15600,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:110"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15602,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15701,"sourceUnit":21015,"src":"57:68:110","symbolAliases":[{"foreign":{"id":15601,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:110","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15604,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15701,"sourceUnit":13387,"src":"126:87:110","symbolAliases":[{"foreign":{"id":15603,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"134:18:110","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15605,"name":"LinearPool","nameLocations":["257:10:110"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"257:10:110"},"id":15606,"nodeType":"InheritanceSpecifier","src":"257:10:110"}],"canonicalName":"LinearPoolInvalidClaimSumMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15700,"linearizedBaseContracts":[15700,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,8139,19810,8091,1206,8562,19938,8546,21056],"name":"LinearPoolInvalidClaimSumMock","nameLocation":"224:29:110","nodeType":"ContractDefinition","nodes":[{"anonymous":false,"eventSelector":"c89d0455cf80fe01219eedc81237f5394410c015c96b0c4d0f8bf92363c905d3","id":15612,"name":"ClaimTransferred","nameLocation":"280:16:110","nodeType":"EventDefinition","parameters":{"id":15611,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15608,"indexed":false,"mutability":"mutable","name":"totalReward","nameLocation":"305:11:110","nodeType":"VariableDeclaration","scope":15612,"src":"297:19:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15607,"name":"uint256","nodeType":"ElementaryTypeName","src":"297:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15610,"indexed":false,"mutability":"mutable","name":"transferredReward","nameLocation":"326:17:110","nodeType":"VariableDeclaration","scope":15612,"src":"318:25:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15609,"name":"uint256","nodeType":"ElementaryTypeName","src":"318:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"296:48:110"},"src":"274:71:110"},{"body":{"id":15624,"nodeType":"Block","src":"483:2:110","statements":[]},"id":15625,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15620,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15614,"src":"441:21:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15621,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15617,"src":"464:17:110","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15622,"kind":"baseConstructorSpecifier","modifierName":{"id":15619,"name":"LinearPool","nameLocations":["430:10:110"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"430:10:110"},"nodeType":"ModifierInvocation","src":"430:52:110"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15618,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15614,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"369:21:110","nodeType":"VariableDeclaration","scope":15625,"src":"363:27:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15613,"name":"uint8","nodeType":"ElementaryTypeName","src":"363:5:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15617,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"411:17:110","nodeType":"VariableDeclaration","scope":15625,"src":"392:36:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15616,"nodeType":"UserDefinedTypeName","pathNode":{"id":15615,"name":"IForwarderRegistry","nameLocations":["392:18:110"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"392:18:110"},"referencedDeclaration":13386,"src":"392:18:110","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"362:67:110"},"returnParameters":{"id":15623,"nodeType":"ParameterList","parameters":[],"src":"483:0:110"},"scope":15700,"src":"351:134:110","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":15645,"nodeType":"Block","src":"603:63:110","statements":[{"expression":{"id":15643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15635,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15633,"src":"613:11:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15638,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15629,"src":"638:9:110","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15640,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"650:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15639,"name":"uint256","nodeType":"ElementaryTypeName","src":"650:7:110","typeDescriptions":{}}}],"id":15641,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"649:9:110","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15636,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"627:3:110","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15637,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"631:6:110","memberName":"decode","nodeType":"MemberAccess","src":"627:10:110","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"627:32:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"613:46:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15644,"nodeType":"ExpressionStatement","src":"613:46:110"}]},"id":15646,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"500:13:110","nodeType":"FunctionDefinition","overrides":{"id":15631,"nodeType":"OverrideSpecifier","overrides":[],"src":"564:8:110"},"parameters":{"id":15630,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15627,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15646,"src":"514:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15626,"name":"address","nodeType":"ElementaryTypeName","src":"514:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15629,"mutability":"mutable","name":"stakeData","nameLocation":"536:9:110","nodeType":"VariableDeclaration","scope":15646,"src":"523:22:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15628,"name":"bytes","nodeType":"ElementaryTypeName","src":"523:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"513:33:110"},"returnParameters":{"id":15634,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15633,"mutability":"mutable","name":"stakePoints","nameLocation":"590:11:110","nodeType":"VariableDeclaration","scope":15646,"src":"582:19:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15632,"name":"uint256","nodeType":"ElementaryTypeName","src":"582:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"581:21:110"},"scope":15700,"src":"491:175:110","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":15666,"nodeType":"Block","src":"790:66:110","statements":[{"expression":{"id":15664,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15656,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15654,"src":"800:11:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15659,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15650,"src":"825:12:110","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15661,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"840:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15660,"name":"uint256","nodeType":"ElementaryTypeName","src":"840:7:110","typeDescriptions":{}}}],"id":15662,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"839:9:110","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15657,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"814:3:110","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"818:6:110","memberName":"decode","nodeType":"MemberAccess","src":"814:10:110","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"814:35:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"800:49:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15665,"nodeType":"ExpressionStatement","src":"800:49:110"}]},"id":15667,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"681:16:110","nodeType":"FunctionDefinition","overrides":{"id":15652,"nodeType":"OverrideSpecifier","overrides":[],"src":"751:8:110"},"parameters":{"id":15651,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15648,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15667,"src":"698:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15647,"name":"address","nodeType":"ElementaryTypeName","src":"698:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15650,"mutability":"mutable","name":"withdrawData","nameLocation":"720:12:110","nodeType":"VariableDeclaration","scope":15667,"src":"707:25:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15649,"name":"bytes","nodeType":"ElementaryTypeName","src":"707:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"697:36:110"},"returnParameters":{"id":15655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15654,"mutability":"mutable","name":"stakePoints","nameLocation":"777:11:110","nodeType":"VariableDeclaration","scope":15667,"src":"769:19:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15653,"name":"uint256","nodeType":"ElementaryTypeName","src":"769:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"768:21:110"},"scope":15700,"src":"672:184:110","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20977],"body":{"id":15689,"nodeType":"Block","src":"1000:59:110","statements":[{"expression":{"id":15683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15681,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15677,"src":"1010:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":15682,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15671,"src":"1020:9:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1010:19:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15684,"nodeType":"ExpressionStatement","src":"1010:19:110"},{"expression":{"id":15687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15685,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15679,"src":"1039:9:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":15686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1051:1:110","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1039:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15688,"nodeType":"ExpressionStatement","src":"1039:13:110"}]},"id":15690,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"871:13:110","nodeType":"FunctionDefinition","overrides":{"id":15675,"nodeType":"OverrideSpecifier","overrides":[],"src":"946:8:110"},"parameters":{"id":15674,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15669,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15690,"src":"885:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15668,"name":"address","nodeType":"ElementaryTypeName","src":"885:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15671,"mutability":"mutable","name":"claimable","nameLocation":"902:9:110","nodeType":"VariableDeclaration","scope":15690,"src":"894:17:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15670,"name":"uint256","nodeType":"ElementaryTypeName","src":"894:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15673,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15690,"src":"913:14:110","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15672,"name":"bytes","nodeType":"ElementaryTypeName","src":"913:5:110","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"884:44:110"},"returnParameters":{"id":15680,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15677,"mutability":"mutable","name":"claimed","nameLocation":"972:7:110","nodeType":"VariableDeclaration","scope":15690,"src":"964:15:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15676,"name":"uint256","nodeType":"ElementaryTypeName","src":"964:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15679,"mutability":"mutable","name":"unclaimed","nameLocation":"989:9:110","nodeType":"VariableDeclaration","scope":15690,"src":"981:17:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15678,"name":"uint256","nodeType":"ElementaryTypeName","src":"981:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"963:36:110"},"scope":15700,"src":"862:197:110","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985],"body":{"id":15698,"nodeType":"Block","src":"1152:2:110","statements":[]},"id":15699,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1074:17:110","nodeType":"FunctionDefinition","overrides":{"id":15696,"nodeType":"OverrideSpecifier","overrides":[],"src":"1143:8:110"},"parameters":{"id":15695,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15692,"mutability":"mutable","name":"rewarder","nameLocation":"1100:8:110","nodeType":"VariableDeclaration","scope":15699,"src":"1092:16:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15691,"name":"address","nodeType":"ElementaryTypeName","src":"1092:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15694,"mutability":"mutable","name":"reward","nameLocation":"1118:6:110","nodeType":"VariableDeclaration","scope":15699,"src":"1110:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15693,"name":"uint256","nodeType":"ElementaryTypeName","src":"1110:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1091:34:110"},"returnParameters":{"id":15697,"nodeType":"ParameterList","parameters":[],"src":"1152:0:110"},"scope":15700,"src":"1065:89:110","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":15701,"src":"215:941:110","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390],"usedEvents":[8269,8278,8287,15612,20330,20338,20348,20356]}],"src":"32:1125:110"},"id":110},"contracts/mocks/staking/linear/LinearPoolMock.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/LinearPoolMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"LinearPool":[21014],"LinearPoolMock":[15882],"LinearPoolReentrancyAttacker":[15971]},"id":15883,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15702,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:111"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../../../staking/linear/LinearPool.sol","id":15704,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15883,"sourceUnit":21015,"src":"57:68:111","symbolAliases":[{"foreign":{"id":15703,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:111","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol","file":"./LinearPoolReentrancyAttacker.sol","id":15706,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15883,"sourceUnit":15972,"src":"126:80:111","symbolAliases":[{"foreign":{"id":15705,"name":"LinearPoolReentrancyAttacker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15971,"src":"134:28:111","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":15708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15883,"sourceUnit":13387,"src":"207:87:111","symbolAliases":[{"foreign":{"id":15707,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"215:18:111","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15709,"name":"LinearPool","nameLocations":["323:10:111"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"323:10:111"},"id":15710,"nodeType":"InheritanceSpecifier","src":"323:10:111"}],"canonicalName":"LinearPoolMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15882,"linearizedBaseContracts":[15882,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,8139,19810,8091,1206,8562,19938,8546,21056],"name":"LinearPoolMock","nameLocation":"305:14:111","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"52880f35","id":15713,"mutability":"immutable","name":"REENTRANCY_ATTACKER","nameLocation":"386:19:111","nodeType":"VariableDeclaration","scope":15882,"src":"340:65:111","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"},"typeName":{"id":15712,"nodeType":"UserDefinedTypeName","pathNode":{"id":15711,"name":"LinearPoolReentrancyAttacker","nameLocations":["340:28:111"],"nodeType":"IdentifierPath","referencedDeclaration":15971,"src":"340:28:111"},"referencedDeclaration":15971,"src":"340:28:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"visibility":"public"},{"anonymous":false,"eventSelector":"8939976db42d3930b780581daf935c63f4b2b954a86929d714db0ac546958b7f","id":15719,"name":"ComputeStakeCalled","nameLocation":"418:18:111","nodeType":"EventDefinition","parameters":{"id":15718,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15715,"indexed":false,"mutability":"mutable","name":"staker","nameLocation":"445:6:111","nodeType":"VariableDeclaration","scope":15719,"src":"437:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15714,"name":"address","nodeType":"ElementaryTypeName","src":"437:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15717,"indexed":false,"mutability":"mutable","name":"stakeData","nameLocation":"459:9:111","nodeType":"VariableDeclaration","scope":15719,"src":"453:15:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15716,"name":"bytes","nodeType":"ElementaryTypeName","src":"453:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"436:33:111"},"src":"412:58:111"},{"anonymous":false,"eventSelector":"36a2ea31c4d4156a140674bc8c3400a4e5c09f48aeb6fcee2b3d04962eeebc20","id":15725,"name":"ComputeWithdrawCalled","nameLocation":"481:21:111","nodeType":"EventDefinition","parameters":{"id":15724,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15721,"indexed":false,"mutability":"mutable","name":"staker","nameLocation":"511:6:111","nodeType":"VariableDeclaration","scope":15725,"src":"503:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15720,"name":"address","nodeType":"ElementaryTypeName","src":"503:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15723,"indexed":false,"mutability":"mutable","name":"withdrawData","nameLocation":"525:12:111","nodeType":"VariableDeclaration","scope":15725,"src":"519:18:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15722,"name":"bytes","nodeType":"ElementaryTypeName","src":"519:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"502:36:111"},"src":"475:64:111"},{"anonymous":false,"eventSelector":"9a3288933ffcc8b186ccc9c2882353ccd8904216bf0bedbc6cefb5fc16ab09ed","id":15733,"name":"ComputeClaimCalled","nameLocation":"550:18:111","nodeType":"EventDefinition","parameters":{"id":15732,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15727,"indexed":false,"mutability":"mutable","name":"staker","nameLocation":"577:6:111","nodeType":"VariableDeclaration","scope":15733,"src":"569:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15726,"name":"address","nodeType":"ElementaryTypeName","src":"569:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15729,"indexed":false,"mutability":"mutable","name":"claimable","nameLocation":"593:9:111","nodeType":"VariableDeclaration","scope":15733,"src":"585:17:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15728,"name":"uint256","nodeType":"ElementaryTypeName","src":"585:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15731,"indexed":false,"mutability":"mutable","name":"claimData","nameLocation":"610:9:111","nodeType":"VariableDeclaration","scope":15733,"src":"604:15:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15730,"name":"bytes","nodeType":"ElementaryTypeName","src":"604:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"568:52:111"},"src":"544:77:111"},{"anonymous":false,"eventSelector":"5ec3e451d22b879ea6838eff0b038773ea3bfcf4bb51a4c4e2f168333f489b90","id":15739,"name":"ComputeAddRewardCalled","nameLocation":"632:22:111","nodeType":"EventDefinition","parameters":{"id":15738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15735,"indexed":false,"mutability":"mutable","name":"rewarder","nameLocation":"663:8:111","nodeType":"VariableDeclaration","scope":15739,"src":"655:16:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15734,"name":"address","nodeType":"ElementaryTypeName","src":"655:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15737,"indexed":false,"mutability":"mutable","name":"reward","nameLocation":"681:6:111","nodeType":"VariableDeclaration","scope":15739,"src":"673:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15736,"name":"uint256","nodeType":"ElementaryTypeName","src":"673:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"654:34:111"},"src":"626:63:111"},{"body":{"id":15758,"nodeType":"Block","src":"906:57:111","statements":[{"expression":{"id":15756,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15754,"name":"REENTRANCY_ATTACKER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15713,"src":"916:19:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":15755,"name":"reentrancyAttacker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15742,"src":"938:18:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"src":"916:40:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"id":15757,"nodeType":"ExpressionStatement","src":"916:40:111"}]},"id":15759,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":15750,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15744,"src":"864:21:111","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":15751,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15747,"src":"887:17:111","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":15752,"kind":"baseConstructorSpecifier","modifierName":{"id":15749,"name":"LinearPool","nameLocations":["853:10:111"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"853:10:111"},"nodeType":"ModifierInvocation","src":"853:52:111"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":15748,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15742,"mutability":"mutable","name":"reentrancyAttacker","nameLocation":"745:18:111","nodeType":"VariableDeclaration","scope":15759,"src":"716:47:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"},"typeName":{"id":15741,"nodeType":"UserDefinedTypeName","pathNode":{"id":15740,"name":"LinearPoolReentrancyAttacker","nameLocations":["716:28:111"],"nodeType":"IdentifierPath","referencedDeclaration":15971,"src":"716:28:111"},"referencedDeclaration":15971,"src":"716:28:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"visibility":"internal"},{"constant":false,"id":15744,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"779:21:111","nodeType":"VariableDeclaration","scope":15759,"src":"773:27:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":15743,"name":"uint8","nodeType":"ElementaryTypeName","src":"773:5:111","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":15747,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"829:17:111","nodeType":"VariableDeclaration","scope":15759,"src":"810:36:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":15746,"nodeType":"UserDefinedTypeName","pathNode":{"id":15745,"name":"IForwarderRegistry","nameLocations":["810:18:111"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"810:18:111"},"referencedDeclaration":13386,"src":"810:18:111","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"706:146:111"},"returnParameters":{"id":15753,"nodeType":"ParameterList","parameters":[],"src":"906:0:111"},"scope":15882,"src":"695:268:111","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":15790,"nodeType":"Block","src":"1088:161:111","statements":[{"expression":{"id":15777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15769,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15767,"src":"1098:11:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15772,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15763,"src":"1123:9:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15774,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1135:7:111","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15773,"name":"uint256","nodeType":"ElementaryTypeName","src":"1135:7:111","typeDescriptions":{}}}],"id":15775,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1134:9:111","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15770,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1112:3:111","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15771,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1116:6:111","memberName":"decode","nodeType":"MemberAccess","src":"1112:10:111","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15776,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1112:32:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1098:46:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15778,"nodeType":"ExpressionStatement","src":"1098:46:111"},{"expression":{"arguments":[{"id":15782,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15763,"src":"1180:9:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":15779,"name":"REENTRANCY_ATTACKER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15713,"src":"1154:19:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"id":15781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1174:5:111","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":15924,"src":"1154:25:111","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":15783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1154:36:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15784,"nodeType":"ExpressionStatement","src":"1154:36:111"},{"eventCall":{"arguments":[{"id":15786,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15761,"src":"1224:6:111","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15787,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15763,"src":"1232:9:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":15785,"name":"ComputeStakeCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15719,"src":"1205:18:111","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":15788,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1205:37:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15789,"nodeType":"EmitStatement","src":"1200:42:111"}]},"id":15791,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"978:13:111","nodeType":"FunctionDefinition","overrides":{"id":15765,"nodeType":"OverrideSpecifier","overrides":[],"src":"1049:8:111"},"parameters":{"id":15764,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15761,"mutability":"mutable","name":"staker","nameLocation":"1000:6:111","nodeType":"VariableDeclaration","scope":15791,"src":"992:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15760,"name":"address","nodeType":"ElementaryTypeName","src":"992:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15763,"mutability":"mutable","name":"stakeData","nameLocation":"1021:9:111","nodeType":"VariableDeclaration","scope":15791,"src":"1008:22:111","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15762,"name":"bytes","nodeType":"ElementaryTypeName","src":"1008:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"991:40:111"},"returnParameters":{"id":15768,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15767,"mutability":"mutable","name":"stakePoints","nameLocation":"1075:11:111","nodeType":"VariableDeclaration","scope":15791,"src":"1067:19:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15766,"name":"uint256","nodeType":"ElementaryTypeName","src":"1067:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1066:21:111"},"scope":15882,"src":"969:280:111","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":15822,"nodeType":"Block","src":"1380:176:111","statements":[{"expression":{"id":15809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15801,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15799,"src":"1390:11:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15804,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15795,"src":"1415:12:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":15806,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1430:7:111","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":15805,"name":"uint256","nodeType":"ElementaryTypeName","src":"1430:7:111","typeDescriptions":{}}}],"id":15807,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"1429:9:111","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":15802,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1404:3:111","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":15803,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1408:6:111","memberName":"decode","nodeType":"MemberAccess","src":"1404:10:111","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":15808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1404:35:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1390:49:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15810,"nodeType":"ExpressionStatement","src":"1390:49:111"},{"expression":{"arguments":[{"id":15814,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15795,"src":"1478:12:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":15811,"name":"REENTRANCY_ATTACKER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15713,"src":"1449:19:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"id":15813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1469:8:111","memberName":"withdraw","nodeType":"MemberAccess","referencedDeclaration":15947,"src":"1449:28:111","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":15815,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1449:42:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15816,"nodeType":"ExpressionStatement","src":"1449:42:111"},{"eventCall":{"arguments":[{"id":15818,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15793,"src":"1528:6:111","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15819,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15795,"src":"1536:12:111","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":15817,"name":"ComputeWithdrawCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15725,"src":"1506:21:111","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":15820,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1506:43:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15821,"nodeType":"EmitStatement","src":"1501:48:111"}]},"id":15823,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"1264:16:111","nodeType":"FunctionDefinition","overrides":{"id":15797,"nodeType":"OverrideSpecifier","overrides":[],"src":"1341:8:111"},"parameters":{"id":15796,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15793,"mutability":"mutable","name":"staker","nameLocation":"1289:6:111","nodeType":"VariableDeclaration","scope":15823,"src":"1281:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15792,"name":"address","nodeType":"ElementaryTypeName","src":"1281:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15795,"mutability":"mutable","name":"withdrawData","nameLocation":"1310:12:111","nodeType":"VariableDeclaration","scope":15823,"src":"1297:25:111","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15794,"name":"bytes","nodeType":"ElementaryTypeName","src":"1297:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1280:43:111"},"returnParameters":{"id":15800,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15799,"mutability":"mutable","name":"stakePoints","nameLocation":"1367:11:111","nodeType":"VariableDeclaration","scope":15823,"src":"1359:19:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15798,"name":"uint256","nodeType":"ElementaryTypeName","src":"1359:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1358:21:111"},"scope":15882,"src":"1255:301:111","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20977],"body":{"id":15857,"nodeType":"Block","src":"1747:168:111","statements":[{"expression":{"id":15839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15837,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15833,"src":"1757:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":15838,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15827,"src":"1767:9:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1757:19:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15840,"nodeType":"ExpressionStatement","src":"1757:19:111"},{"expression":{"id":15843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15841,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15835,"src":"1786:9:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":15842,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1798:1:111","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1786:13:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":15844,"nodeType":"ExpressionStatement","src":"1786:13:111"},{"expression":{"arguments":[{"id":15848,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15829,"src":"1835:9:111","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15845,"name":"REENTRANCY_ATTACKER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15713,"src":"1809:19:111","typeDescriptions":{"typeIdentifier":"t_contract$_LinearPoolReentrancyAttacker_$15971","typeString":"contract LinearPoolReentrancyAttacker"}},"id":15847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1829:5:111","memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":15970,"src":"1809:25:111","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":15849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1809:36:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15850,"nodeType":"ExpressionStatement","src":"1809:36:111"},{"eventCall":{"arguments":[{"id":15852,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15825,"src":"1879:6:111","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15853,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15827,"src":"1887:9:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":15854,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15829,"src":"1898:9:111","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":15851,"name":"ComputeClaimCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15733,"src":"1860:18:111","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,uint256,bytes memory)"}},"id":15855,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1860:48:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15856,"nodeType":"EmitStatement","src":"1855:53:111"}]},"id":15858,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"1571:13:111","nodeType":"FunctionDefinition","overrides":{"id":15831,"nodeType":"OverrideSpecifier","overrides":[],"src":"1693:8:111"},"parameters":{"id":15830,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15825,"mutability":"mutable","name":"staker","nameLocation":"1602:6:111","nodeType":"VariableDeclaration","scope":15858,"src":"1594:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15824,"name":"address","nodeType":"ElementaryTypeName","src":"1594:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15827,"mutability":"mutable","name":"claimable","nameLocation":"1626:9:111","nodeType":"VariableDeclaration","scope":15858,"src":"1618:17:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15826,"name":"uint256","nodeType":"ElementaryTypeName","src":"1618:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15829,"mutability":"mutable","name":"claimData","nameLocation":"1660:9:111","nodeType":"VariableDeclaration","scope":15858,"src":"1645:24:111","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15828,"name":"bytes","nodeType":"ElementaryTypeName","src":"1645:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1584:91:111"},"returnParameters":{"id":15836,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15833,"mutability":"mutable","name":"claimed","nameLocation":"1719:7:111","nodeType":"VariableDeclaration","scope":15858,"src":"1711:15:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15832,"name":"uint256","nodeType":"ElementaryTypeName","src":"1711:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15835,"mutability":"mutable","name":"unclaimed","nameLocation":"1736:9:111","nodeType":"VariableDeclaration","scope":15858,"src":"1728:17:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15834,"name":"uint256","nodeType":"ElementaryTypeName","src":"1728:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1710:36:111"},"scope":15882,"src":"1562:353:111","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20985],"body":{"id":15871,"nodeType":"Block","src":"2008:62:111","statements":[{"eventCall":{"arguments":[{"id":15867,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15860,"src":"2046:8:111","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":15868,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15862,"src":"2056:6:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":15866,"name":"ComputeAddRewardCalled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15739,"src":"2023:22:111","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":15869,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2023:40:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15870,"nodeType":"EmitStatement","src":"2018:45:111"}]},"id":15872,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"1930:17:111","nodeType":"FunctionDefinition","overrides":{"id":15864,"nodeType":"OverrideSpecifier","overrides":[],"src":"1999:8:111"},"parameters":{"id":15863,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15860,"mutability":"mutable","name":"rewarder","nameLocation":"1956:8:111","nodeType":"VariableDeclaration","scope":15872,"src":"1948:16:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15859,"name":"address","nodeType":"ElementaryTypeName","src":"1948:7:111","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15862,"mutability":"mutable","name":"reward","nameLocation":"1974:6:111","nodeType":"VariableDeclaration","scope":15872,"src":"1966:14:111","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15861,"name":"uint256","nodeType":"ElementaryTypeName","src":"1966:7:111","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1947:34:111"},"returnParameters":{"id":15865,"nodeType":"ParameterList","parameters":[],"src":"2008:0:111"},"scope":15882,"src":"1921:149:111","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":15880,"nodeType":"Block","src":"2136:34:111","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":15877,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[21013],"referencedDeclaration":21013,"src":"2153:8:111","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":15878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2153:10:111","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":15876,"id":15879,"nodeType":"Return","src":"2146:17:111"}]},"functionSelector":"31e66e1e","id":15881,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"2085:9:111","nodeType":"FunctionDefinition","parameters":{"id":15873,"nodeType":"ParameterList","parameters":[],"src":"2094:2:111"},"returnParameters":{"id":15876,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15875,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":15881,"src":"2120:14:111","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15874,"name":"bytes","nodeType":"ElementaryTypeName","src":"2120:5:111","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2119:16:111"},"scope":15882,"src":"2076:94:111","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":15883,"src":"296:1876:111","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390],"usedEvents":[8269,8278,8287,15719,15725,15733,15739,20330,20338,20348,20356]}],"src":"32:2141:111"},"id":111},"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol":{"ast":{"absolutePath":"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol","exportedSymbols":{"ILinearPool":[21056],"LinearPoolReentrancyAttacker":[15971]},"id":15972,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15884,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:112"},{"absolutePath":"contracts/staking/linear/interfaces/ILinearPool.sol","file":"./../../../staking/linear/interfaces/ILinearPool.sol","id":15886,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":15972,"sourceUnit":21057,"src":"57:81:112","symbolAliases":[{"foreign":{"id":15885,"name":"ILinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21056,"src":"65:11:112","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"LinearPoolReentrancyAttacker","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":15971,"linearizedBaseContracts":[15971],"name":"LinearPoolReentrancyAttacker","nameLocation":"149:28:112","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"d4b83992","id":15889,"mutability":"mutable","name":"target","nameLocation":"203:6:112","nodeType":"VariableDeclaration","scope":15971,"src":"184:25:112","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"},"typeName":{"id":15888,"nodeType":"UserDefinedTypeName","pathNode":{"id":15887,"name":"ILinearPool","nameLocations":["184:11:112"],"nodeType":"IdentifierPath","referencedDeclaration":21056,"src":"184:11:112"},"referencedDeclaration":21056,"src":"184:11:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"visibility":"public"},{"body":{"id":15900,"nodeType":"Block","src":"267:52:112","statements":[{"expression":{"id":15898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":15894,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"277:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":15896,"name":"targetAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15891,"src":"298:13:112","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":15895,"name":"ILinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21056,"src":"286:11:112","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ILinearPool_$21056_$","typeString":"type(contract ILinearPool)"}},"id":15897,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"286:26:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"src":"277:35:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"id":15899,"nodeType":"ExpressionStatement","src":"277:35:112"}]},"functionSelector":"776d1a01","id":15901,"implemented":true,"kind":"function","modifiers":[],"name":"setTarget","nameLocation":"225:9:112","nodeType":"FunctionDefinition","parameters":{"id":15892,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15891,"mutability":"mutable","name":"targetAddress","nameLocation":"243:13:112","nodeType":"VariableDeclaration","scope":15901,"src":"235:21:112","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15890,"name":"address","nodeType":"ElementaryTypeName","src":"235:7:112","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"234:23:112"},"returnParameters":{"id":15893,"nodeType":"ParameterList","parameters":[],"src":"267:0:112"},"scope":15971,"src":"216:103:112","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":15923,"nodeType":"Block","src":"375:99:112","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":15914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":15908,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"397:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}],"id":15907,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"389:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15906,"name":"address","nodeType":"ElementaryTypeName","src":"389:7:112","typeDescriptions":{}}},"id":15909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"389:15:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":15912,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"416:1:112","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":15911,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"408:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15910,"name":"address","nodeType":"ElementaryTypeName","src":"408:7:112","typeDescriptions":{}}},"id":15913,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"408:10:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"389:29:112","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15922,"nodeType":"IfStatement","src":"385:83:112","trueBody":{"id":15921,"nodeType":"Block","src":"420:48:112","statements":[{"expression":{"arguments":[{"id":15918,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15903,"src":"447:9:112","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15915,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"434:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"id":15917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"441:5:112","memberName":"stake","nodeType":"MemberAccess","referencedDeclaration":21038,"src":"434:12:112","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) payable external"}},"id":15919,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"434:23:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15920,"nodeType":"ExpressionStatement","src":"434:23:112"}]}}]},"functionSelector":"2d1e0c02","id":15924,"implemented":true,"kind":"function","modifiers":[],"name":"stake","nameLocation":"334:5:112","nodeType":"FunctionDefinition","parameters":{"id":15904,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15903,"mutability":"mutable","name":"stakeData","nameLocation":"355:9:112","nodeType":"VariableDeclaration","scope":15924,"src":"340:24:112","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15902,"name":"bytes","nodeType":"ElementaryTypeName","src":"340:5:112","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"339:26:112"},"returnParameters":{"id":15905,"nodeType":"ParameterList","parameters":[],"src":"375:0:112"},"scope":15971,"src":"325:149:112","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":15946,"nodeType":"Block","src":"536:105:112","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":15937,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":15931,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"558:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}],"id":15930,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"550:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15929,"name":"address","nodeType":"ElementaryTypeName","src":"550:7:112","typeDescriptions":{}}},"id":15932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"550:15:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":15935,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"577:1:112","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":15934,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"569:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15933,"name":"address","nodeType":"ElementaryTypeName","src":"569:7:112","typeDescriptions":{}}},"id":15936,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"569:10:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"550:29:112","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15945,"nodeType":"IfStatement","src":"546:89:112","trueBody":{"id":15944,"nodeType":"Block","src":"581:54:112","statements":[{"expression":{"arguments":[{"id":15941,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15926,"src":"611:12:112","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15938,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"595:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"id":15940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"602:8:112","memberName":"withdraw","nodeType":"MemberAccess","referencedDeclaration":21043,"src":"595:15:112","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":15942,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"595:29:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15943,"nodeType":"ExpressionStatement","src":"595:29:112"}]}}]},"functionSelector":"0968f264","id":15947,"implemented":true,"kind":"function","modifiers":[],"name":"withdraw","nameLocation":"489:8:112","nodeType":"FunctionDefinition","parameters":{"id":15927,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15926,"mutability":"mutable","name":"withdrawData","nameLocation":"513:12:112","nodeType":"VariableDeclaration","scope":15947,"src":"498:27:112","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15925,"name":"bytes","nodeType":"ElementaryTypeName","src":"498:5:112","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"497:29:112"},"returnParameters":{"id":15928,"nodeType":"ParameterList","parameters":[],"src":"536:0:112"},"scope":15971,"src":"480:161:112","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":15969,"nodeType":"Block","src":"697:99:112","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":15960,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":15954,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"719:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}],"id":15953,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"711:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15952,"name":"address","nodeType":"ElementaryTypeName","src":"711:7:112","typeDescriptions":{}}},"id":15955,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"711:15:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":15958,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"738:1:112","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":15957,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"730:7:112","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":15956,"name":"address","nodeType":"ElementaryTypeName","src":"730:7:112","typeDescriptions":{}}},"id":15959,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"730:10:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"711:29:112","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":15968,"nodeType":"IfStatement","src":"707:83:112","trueBody":{"id":15967,"nodeType":"Block","src":"742:48:112","statements":[{"expression":{"arguments":[{"id":15964,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15949,"src":"769:9:112","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":15961,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15889,"src":"756:6:112","typeDescriptions":{"typeIdentifier":"t_contract$_ILinearPool_$21056","typeString":"contract ILinearPool"}},"id":15963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"763:5:112","memberName":"claim","nodeType":"MemberAccess","referencedDeclaration":21048,"src":"756:12:112","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) external"}},"id":15965,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"756:23:112","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":15966,"nodeType":"ExpressionStatement","src":"756:23:112"}]}}]},"functionSelector":"c63ff8dd","id":15970,"implemented":true,"kind":"function","modifiers":[],"name":"claim","nameLocation":"656:5:112","nodeType":"FunctionDefinition","parameters":{"id":15950,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15949,"mutability":"mutable","name":"claimData","nameLocation":"677:9:112","nodeType":"VariableDeclaration","scope":15970,"src":"662:24:112","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":15948,"name":"bytes","nodeType":"ElementaryTypeName","src":"662:5:112","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"661:26:112"},"returnParameters":{"id":15951,"nodeType":"ParameterList","parameters":[],"src":"697:0:112"},"scope":15971,"src":"647:149:112","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":15972,"src":"140:658:112","usedErrors":[],"usedEvents":[]}],"src":"32:767:112"},"id":112},"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol","exportedSymbols":{"ERC1155Storage":[25484],"ERC1155TokenReceiver":[22724],"ERC1155TokenReceiverMock":[16119],"IERC1155TokenReceiver":[24324]},"id":16120,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":15973,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:113"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol","file":"./../../../token/ERC1155/interfaces/IERC1155TokenReceiver.sol","id":15975,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16120,"sourceUnit":24325,"src":"57:100:113","symbolAliases":[{"foreign":{"id":15974,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"65:21:113","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../../../token/ERC1155/libraries/ERC1155Storage.sol","id":15977,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16120,"sourceUnit":25485,"src":"158:85:113","symbolAliases":[{"foreign":{"id":15976,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"166:14:113","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155TokenReceiver.sol","file":"./../../../token/ERC1155/ERC1155TokenReceiver.sol","id":15979,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16120,"sourceUnit":22725,"src":"244:87:113","symbolAliases":[{"foreign":{"id":15978,"name":"ERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22724,"src":"252:20:113","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":15981,"name":"ERC1155TokenReceiver","nameLocations":["403:20:113"],"nodeType":"IdentifierPath","referencedDeclaration":22724,"src":"403:20:113"},"id":15982,"nodeType":"InheritanceSpecifier","src":"403:20:113"}],"canonicalName":"ERC1155TokenReceiverMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":15980,"nodeType":"StructuredDocumentation","src":"333:33:113","text":"@title ERC1155 Receiver Mock"},"fullyImplemented":true,"id":16119,"linearizedBaseContracts":[16119,22724,11554,11579,24324],"name":"ERC1155TokenReceiverMock","nameLocation":"375:24:113","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":15984,"mutability":"immutable","name":"ACCEPT_1155","nameLocation":"454:11:113","nodeType":"VariableDeclaration","scope":16119,"src":"430:35:113","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":15983,"name":"bool","nodeType":"ElementaryTypeName","src":"430:4:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":15986,"mutability":"immutable","name":"_TOKEN_ADDRESS_1155","nameLocation":"498:19:113","nodeType":"VariableDeclaration","scope":16119,"src":"471:46:113","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15985,"name":"address","nodeType":"ElementaryTypeName","src":"471:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"anonymous":false,"eventSelector":"01109c91bca177ae1324bc2fc89be4b2573d2e59ad0cc75b1f3d3aa807814d36","id":15998,"name":"ERC1155Received","nameLocation":"530:15:113","nodeType":"EventDefinition","parameters":{"id":15997,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15988,"indexed":false,"mutability":"mutable","name":"operator","nameLocation":"554:8:113","nodeType":"VariableDeclaration","scope":15998,"src":"546:16:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15987,"name":"address","nodeType":"ElementaryTypeName","src":"546:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15990,"indexed":false,"mutability":"mutable","name":"from","nameLocation":"572:4:113","nodeType":"VariableDeclaration","scope":15998,"src":"564:12:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15989,"name":"address","nodeType":"ElementaryTypeName","src":"564:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":15992,"indexed":false,"mutability":"mutable","name":"id","nameLocation":"586:2:113","nodeType":"VariableDeclaration","scope":15998,"src":"578:10:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15991,"name":"uint256","nodeType":"ElementaryTypeName","src":"578:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15994,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"598:5:113","nodeType":"VariableDeclaration","scope":15998,"src":"590:13:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":15993,"name":"uint256","nodeType":"ElementaryTypeName","src":"590:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":15996,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"611:4:113","nodeType":"VariableDeclaration","scope":15998,"src":"605:10:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":15995,"name":"bytes","nodeType":"ElementaryTypeName","src":"605:5:113","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"545:71:113"},"src":"524:93:113"},{"anonymous":false,"eventSelector":"2360e6b28d144bcde27ca99baa660f822a59e919f243c01dfaec5a55986df5f5","id":16012,"name":"ERC1155BatchReceived","nameLocation":"628:20:113","nodeType":"EventDefinition","parameters":{"id":16011,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16000,"indexed":false,"mutability":"mutable","name":"operator","nameLocation":"657:8:113","nodeType":"VariableDeclaration","scope":16012,"src":"649:16:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":15999,"name":"address","nodeType":"ElementaryTypeName","src":"649:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16002,"indexed":false,"mutability":"mutable","name":"from","nameLocation":"675:4:113","nodeType":"VariableDeclaration","scope":16012,"src":"667:12:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16001,"name":"address","nodeType":"ElementaryTypeName","src":"667:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16005,"indexed":false,"mutability":"mutable","name":"ids","nameLocation":"691:3:113","nodeType":"VariableDeclaration","scope":16012,"src":"681:13:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16003,"name":"uint256","nodeType":"ElementaryTypeName","src":"681:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16004,"nodeType":"ArrayTypeName","src":"681:9:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":16008,"indexed":false,"mutability":"mutable","name":"values","nameLocation":"706:6:113","nodeType":"VariableDeclaration","scope":16012,"src":"696:16:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16006,"name":"uint256","nodeType":"ElementaryTypeName","src":"696:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16007,"nodeType":"ArrayTypeName","src":"696:9:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":16010,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"720:4:113","nodeType":"VariableDeclaration","scope":16012,"src":"714:10:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16009,"name":"bytes","nodeType":"ElementaryTypeName","src":"714:5:113","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"648:77:113"},"src":"622:104:113"},{"errorSelector":"a0f3feea","id":16014,"name":"WrongToken","nameLocation":"738:10:113","nodeType":"ErrorDefinition","parameters":{"id":16013,"nodeType":"ParameterList","parameters":[],"src":"748:2:113"},"src":"732:19:113"},{"body":{"id":16029,"nodeType":"Block","src":"808:85:113","statements":[{"expression":{"id":16023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":16021,"name":"ACCEPT_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15984,"src":"818:11:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16022,"name":"accept1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16016,"src":"832:10:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"818:24:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16024,"nodeType":"ExpressionStatement","src":"818:24:113"},{"expression":{"id":16027,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":16025,"name":"_TOKEN_ADDRESS_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15986,"src":"852:19:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16026,"name":"tokenAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16018,"src":"874:12:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"852:34:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":16028,"nodeType":"ExpressionStatement","src":"852:34:113"}]},"id":16030,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16019,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16016,"mutability":"mutable","name":"accept1155","nameLocation":"774:10:113","nodeType":"VariableDeclaration","scope":16030,"src":"769:15:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16015,"name":"bool","nodeType":"ElementaryTypeName","src":"769:4:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16018,"mutability":"mutable","name":"tokenAddress","nameLocation":"794:12:113","nodeType":"VariableDeclaration","scope":16030,"src":"786:20:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16017,"name":"address","nodeType":"ElementaryTypeName","src":"786:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"768:39:113"},"returnParameters":{"id":16020,"nodeType":"ParameterList","parameters":[],"src":"808:0:113"},"scope":16119,"src":"757:136:113","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[24305],"body":{"id":16072,"nodeType":"Block","src":"1337:279:113","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":16050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":16047,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1351:3:113","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":16048,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1355:6:113","memberName":"sender","nodeType":"MemberAccess","src":"1351:10:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":16049,"name":"_TOKEN_ADDRESS_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15986,"src":"1365:19:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1351:33:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16054,"nodeType":"IfStatement","src":"1347:58:113","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":16051,"name":"WrongToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16014,"src":"1393:10:113","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":16052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1393:12:113","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":16053,"nodeType":"RevertStatement","src":"1386:19:113"}},{"condition":{"id":16055,"name":"ACCEPT_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15984,"src":"1419:11:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":16070,"nodeType":"Block","src":"1575:35:113","statements":[{"expression":{"hexValue":"307830","id":16068,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1596:3:113","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"},"functionReturnParameters":16046,"id":16069,"nodeType":"Return","src":"1589:10:113"}]},"id":16071,"nodeType":"IfStatement","src":"1415:195:113","trueBody":{"id":16067,"nodeType":"Block","src":"1432:137:113","statements":[{"eventCall":{"arguments":[{"id":16057,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16033,"src":"1467:8:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16058,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16035,"src":"1477:4:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16059,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16037,"src":"1483:2:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16060,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16039,"src":"1487:5:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16061,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16041,"src":"1494:4:113","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16056,"name":"ERC1155Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15998,"src":"1451:15:113","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,uint256,bytes memory)"}},"id":16062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1451:48:113","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16063,"nodeType":"EmitStatement","src":"1446:53:113"},{"expression":{"expression":{"id":16064,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1520:14:113","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":16065,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1535:23:113","memberName":"ERC1155_SINGLE_RECEIVED","nodeType":"MemberAccess","referencedDeclaration":24401,"src":"1520:38:113","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":16046,"id":16066,"nodeType":"Return","src":"1513:45:113"}]}}]},"documentation":{"id":16031,"nodeType":"StructuredDocumentation","src":"1029:111:113","text":"@inheritdoc IERC1155TokenReceiver\n @dev reverts if the sender is not the supported ERC1155 contract."},"functionSelector":"f23a6e61","id":16073,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1154:17:113","nodeType":"FunctionDefinition","overrides":{"id":16043,"nodeType":"OverrideSpecifier","overrides":[],"src":"1311:8:113"},"parameters":{"id":16042,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16033,"mutability":"mutable","name":"operator","nameLocation":"1189:8:113","nodeType":"VariableDeclaration","scope":16073,"src":"1181:16:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16032,"name":"address","nodeType":"ElementaryTypeName","src":"1181:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16035,"mutability":"mutable","name":"from","nameLocation":"1215:4:113","nodeType":"VariableDeclaration","scope":16073,"src":"1207:12:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16034,"name":"address","nodeType":"ElementaryTypeName","src":"1207:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16037,"mutability":"mutable","name":"id","nameLocation":"1237:2:113","nodeType":"VariableDeclaration","scope":16073,"src":"1229:10:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16036,"name":"uint256","nodeType":"ElementaryTypeName","src":"1229:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16039,"mutability":"mutable","name":"value","nameLocation":"1257:5:113","nodeType":"VariableDeclaration","scope":16073,"src":"1249:13:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16038,"name":"uint256","nodeType":"ElementaryTypeName","src":"1249:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16041,"mutability":"mutable","name":"data","nameLocation":"1285:4:113","nodeType":"VariableDeclaration","scope":16073,"src":"1272:17:113","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16040,"name":"bytes","nodeType":"ElementaryTypeName","src":"1272:5:113","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1171:124:113"},"returnParameters":{"id":16046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16045,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16073,"src":"1329:6:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":16044,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1329:6:113","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1328:8:113"},"scope":16119,"src":"1145:471:113","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[24323],"body":{"id":16117,"nodeType":"Block","src":"1959:285:113","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":16095,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":16092,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1973:3:113","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":16093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1977:6:113","memberName":"sender","nodeType":"MemberAccess","src":"1973:10:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":16094,"name":"_TOKEN_ADDRESS_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15986,"src":"1987:19:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1973:33:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16099,"nodeType":"IfStatement","src":"1969:58:113","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":16096,"name":"WrongToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16014,"src":"2015:10:113","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":16097,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2015:12:113","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":16098,"nodeType":"RevertStatement","src":"2008:19:113"}},{"condition":{"id":16100,"name":"ACCEPT_1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15984,"src":"2041:11:113","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":16115,"nodeType":"Block","src":"2203:35:113","statements":[{"expression":{"hexValue":"307830","id":16113,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2224:3:113","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"},"functionReturnParameters":16091,"id":16114,"nodeType":"Return","src":"2217:10:113"}]},"id":16116,"nodeType":"IfStatement","src":"2037:201:113","trueBody":{"id":16112,"nodeType":"Block","src":"2054:143:113","statements":[{"eventCall":{"arguments":[{"id":16102,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16076,"src":"2094:8:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16103,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16078,"src":"2104:4:113","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16104,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16081,"src":"2110:3:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":16105,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16084,"src":"2115:6:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":16106,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16086,"src":"2123:4:113","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16101,"name":"ERC1155BatchReceived","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16012,"src":"2073:20:113","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256[] memory,uint256[] memory,bytes memory)"}},"id":16107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2073:55:113","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16108,"nodeType":"EmitStatement","src":"2068:60:113"},{"expression":{"expression":{"id":16109,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2149:14:113","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":16110,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2164:22:113","memberName":"ERC1155_BATCH_RECEIVED","nodeType":"MemberAccess","referencedDeclaration":24406,"src":"2149:37:113","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":16091,"id":16111,"nodeType":"Return","src":"2142:44:113"}]}}]},"documentation":{"id":16074,"nodeType":"StructuredDocumentation","src":"1622:111:113","text":"@inheritdoc IERC1155TokenReceiver\n @dev reverts if the sender is not the supported ERC1155 contract."},"functionSelector":"bc197c81","id":16118,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"1747:22:113","nodeType":"FunctionDefinition","overrides":{"id":16088,"nodeType":"OverrideSpecifier","overrides":[],"src":"1933:8:113"},"parameters":{"id":16087,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16076,"mutability":"mutable","name":"operator","nameLocation":"1787:8:113","nodeType":"VariableDeclaration","scope":16118,"src":"1779:16:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16075,"name":"address","nodeType":"ElementaryTypeName","src":"1779:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16078,"mutability":"mutable","name":"from","nameLocation":"1813:4:113","nodeType":"VariableDeclaration","scope":16118,"src":"1805:12:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16077,"name":"address","nodeType":"ElementaryTypeName","src":"1805:7:113","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16081,"mutability":"mutable","name":"ids","nameLocation":"1846:3:113","nodeType":"VariableDeclaration","scope":16118,"src":"1827:22:113","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16079,"name":"uint256","nodeType":"ElementaryTypeName","src":"1827:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16080,"nodeType":"ArrayTypeName","src":"1827:9:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":16084,"mutability":"mutable","name":"values","nameLocation":"1878:6:113","nodeType":"VariableDeclaration","scope":16118,"src":"1859:25:113","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16082,"name":"uint256","nodeType":"ElementaryTypeName","src":"1859:7:113","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16083,"nodeType":"ArrayTypeName","src":"1859:9:113","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":16086,"mutability":"mutable","name":"data","nameLocation":"1907:4:113","nodeType":"VariableDeclaration","scope":16118,"src":"1894:17:113","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16085,"name":"bytes","nodeType":"ElementaryTypeName","src":"1894:5:113","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1769:148:113"},"returnParameters":{"id":16091,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16090,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16118,"src":"1951:6:113","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":16089,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1951:6:113","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1950:8:113"},"scope":16119,"src":"1738:506:113","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":16120,"src":"366:1880:113","usedErrors":[11559,16014],"usedEvents":[15998,16012]}],"src":"32:2215:113"},"id":113},"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC1155":[22576],"ERC1155Mintable":[22689],"ERC1155WithoutOperatorFiltererMock":[16193],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":16194,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16121,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:114"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":16123,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":13387,"src":"57:87:114","symbolAliases":[{"foreign":{"id":16122,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155.sol","file":"./../../../token/ERC1155/ERC1155.sol","id":16125,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":22577,"src":"145:61:114","symbolAliases":[{"foreign":{"id":16124,"name":"ERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22576,"src":"153:7:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Mintable.sol","file":"./../../../token/ERC1155/ERC1155Mintable.sol","id":16127,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":22690,"src":"207:77:114","symbolAliases":[{"foreign":{"id":16126,"name":"ERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22689,"src":"215:15:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":16129,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":7935,"src":"285:74:114","symbolAliases":[{"foreign":{"id":16128,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"293:17:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":16131,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":1207,"src":"360:66:114","symbolAliases":[{"foreign":{"id":16130,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"368:7:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":16133,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":13298,"src":"427:101:114","symbolAliases":[{"foreign":{"id":16132,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"435:28:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":16135,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16194,"sourceUnit":13143,"src":"529:88:114","symbolAliases":[{"foreign":{"id":16134,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"537:24:114","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16136,"name":"ERC1155","nameLocations":["666:7:114"],"nodeType":"IdentifierPath","referencedDeclaration":22576,"src":"666:7:114"},"id":16137,"nodeType":"InheritanceSpecifier","src":"666:7:114"},{"baseName":{"id":16138,"name":"ERC1155Mintable","nameLocations":["675:15:114"],"nodeType":"IdentifierPath","referencedDeclaration":22689,"src":"675:15:114"},"id":16139,"nodeType":"InheritanceSpecifier","src":"675:15:114"},{"baseName":{"id":16140,"name":"ForwarderRegistryContext","nameLocations":["692:24:114"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"692:24:114"},"id":16141,"nodeType":"InheritanceSpecifier","src":"692:24:114"}],"canonicalName":"ERC1155WithoutOperatorFiltererMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16193,"linearizedBaseContracts":[16193,13142,13370,13297,22689,7901,7934,22576,11554,11579,8139,8091,23308,22929,1206,8562,8546,24286,24178],"name":"ERC1155WithoutOperatorFiltererMock","nameLocation":"628:34:114","nodeType":"ContractDefinition","nodes":[{"body":{"id":16154,"nodeType":"Block","src":"847:2:114","statements":[]},"id":16155,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":16147,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"791:3:114","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":16148,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"795:6:114","memberName":"sender","nodeType":"MemberAccess","src":"791:10:114","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":16149,"kind":"baseConstructorSpecifier","modifierName":{"id":16146,"name":"ContractOwnership","nameLocations":["773:17:114"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"773:17:114"},"nodeType":"ModifierInvocation","src":"773:29:114"},{"arguments":[{"id":16151,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16144,"src":"828:17:114","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16152,"kind":"baseConstructorSpecifier","modifierName":{"id":16150,"name":"ForwarderRegistryContext","nameLocations":["803:24:114"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"803:24:114"},"nodeType":"ModifierInvocation","src":"803:43:114"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16145,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16144,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"754:17:114","nodeType":"VariableDeclaration","scope":16155,"src":"735:36:114","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16143,"nodeType":"UserDefinedTypeName","pathNode":{"id":16142,"name":"IForwarderRegistry","nameLocations":["735:18:114"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"735:18:114"},"referencedDeclaration":13386,"src":"735:18:114","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"734:38:114"},"returnParameters":{"id":16153,"nodeType":"ParameterList","parameters":[],"src":"847:0:114"},"scope":16193,"src":"723:126:114","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16163,"nodeType":"Block","src":"915:34:114","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16160,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[16192],"referencedDeclaration":16192,"src":"932:8:114","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16161,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"932:10:114","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16159,"id":16162,"nodeType":"Return","src":"925:17:114"}]},"functionSelector":"31e66e1e","id":16164,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"864:9:114","nodeType":"FunctionDefinition","parameters":{"id":16156,"nodeType":"ParameterList","parameters":[],"src":"873:2:114"},"returnParameters":{"id":16159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16158,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16164,"src":"899:14:114","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16157,"name":"bytes","nodeType":"ElementaryTypeName","src":"899:5:114","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"898:16:114"},"scope":16193,"src":"855:94:114","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":16177,"nodeType":"Block","src":"1114:65:114","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16173,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1131:28:114","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":16174,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1160:10:114","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1131:39:114","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":16175,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1131:41:114","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":16172,"id":16176,"nodeType":"Return","src":"1124:48:114"}]},"documentation":{"id":16165,"nodeType":"StructuredDocumentation","src":"955:44:114","text":"@inheritdoc ForwarderRegistryContextBase"},"id":16178,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1013:10:114","nodeType":"FunctionDefinition","overrides":{"id":16169,"nodeType":"OverrideSpecifier","overrides":[{"id":16167,"name":"Context","nameLocations":["1057:7:114"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1057:7:114"},{"id":16168,"name":"ForwarderRegistryContextBase","nameLocations":["1066:28:114"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1066:28:114"}],"src":"1048:47:114"},"parameters":{"id":16166,"nodeType":"ParameterList","parameters":[],"src":"1023:2:114"},"returnParameters":{"id":16172,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16171,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16178,"src":"1105:7:114","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16170,"name":"address","nodeType":"ElementaryTypeName","src":"1105:7:114","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1104:9:114"},"scope":16193,"src":"1004:175:114","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":16191,"nodeType":"Block","src":"1349:63:114","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16187,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1366:28:114","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":16188,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1395:8:114","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1366:37:114","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16189,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1366:39:114","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16186,"id":16190,"nodeType":"Return","src":"1359:46:114"}]},"documentation":{"id":16179,"nodeType":"StructuredDocumentation","src":"1185:44:114","text":"@inheritdoc ForwarderRegistryContextBase"},"id":16192,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1243:8:114","nodeType":"FunctionDefinition","overrides":{"id":16183,"nodeType":"OverrideSpecifier","overrides":[{"id":16181,"name":"Context","nameLocations":["1285:7:114"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1285:7:114"},{"id":16182,"name":"ForwarderRegistryContextBase","nameLocations":["1294:28:114"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1294:28:114"}],"src":"1276:47:114"},"parameters":{"id":16180,"nodeType":"ParameterList","parameters":[],"src":"1251:2:114"},"returnParameters":{"id":16186,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16185,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16192,"src":"1333:14:114","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16184,"name":"bytes","nodeType":"ElementaryTypeName","src":"1333:5:114","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1332:16:114"},"scope":16193,"src":"1234:178:114","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":16194,"src":"619:795:114","usedErrors":[7886,8223,8246,11559,23516,23519,23526,23537,23548,23557,23568,23571,23576],"usedEvents":[8269,8278,8287,23591,23606,23615]}],"src":"32:1383:114"},"id":114},"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol","exportedSymbols":{"ERC1155BurnableFacet":[23703],"ERC1155BurnableFacetMock":[16222],"IForwarderRegistry":[13386]},"id":16223,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16195,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:115"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16197,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16223,"sourceUnit":13387,"src":"57:90:115","symbolAliases":[{"foreign":{"id":16196,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:115","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol","file":"./../../../../token/ERC1155/facets/ERC1155BurnableFacet.sol","id":16199,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16223,"sourceUnit":23704,"src":"148:97:115","symbolAliases":[{"foreign":{"id":16198,"name":"ERC1155BurnableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23703,"src":"156:20:115","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16201,"name":"ERC1155BurnableFacet","nameLocations":["320:20:115"],"nodeType":"IdentifierPath","referencedDeclaration":23703,"src":"320:20:115"},"id":16202,"nodeType":"InheritanceSpecifier","src":"320:20:115"}],"canonicalName":"ERC1155BurnableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16200,"nodeType":"StructuredDocumentation","src":"247:36:115","text":"@title ERC1155BurnableFacetMock"},"fullyImplemented":true,"id":16222,"linearizedBaseContracts":[16222,23703,13297,22995,1206,24204],"name":"ERC1155BurnableFacetMock","nameLocation":"292:24:115","nodeType":"ContractDefinition","nodes":[{"body":{"id":16211,"nodeType":"Block","src":"437:2:115","statements":[]},"id":16212,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16208,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16205,"src":"418:17:115","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16209,"kind":"baseConstructorSpecifier","modifierName":{"id":16207,"name":"ERC1155BurnableFacet","nameLocations":["397:20:115"],"nodeType":"IdentifierPath","referencedDeclaration":23703,"src":"397:20:115"},"nodeType":"ModifierInvocation","src":"397:39:115"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16206,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16205,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"378:17:115","nodeType":"VariableDeclaration","scope":16212,"src":"359:36:115","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16204,"nodeType":"UserDefinedTypeName","pathNode":{"id":16203,"name":"IForwarderRegistry","nameLocations":["359:18:115"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"359:18:115"},"referencedDeclaration":13386,"src":"359:18:115","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"358:38:115"},"returnParameters":{"id":16210,"nodeType":"ParameterList","parameters":[],"src":"437:0:115"},"scope":16222,"src":"347:92:115","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16220,"nodeType":"Block","src":"505:34:115","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16217,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[23702],"referencedDeclaration":23702,"src":"522:8:115","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16218,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"522:10:115","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16216,"id":16219,"nodeType":"Return","src":"515:17:115"}]},"functionSelector":"31e66e1e","id":16221,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"454:9:115","nodeType":"FunctionDefinition","parameters":{"id":16213,"nodeType":"ParameterList","parameters":[],"src":"463:2:115"},"returnParameters":{"id":16216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16215,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16221,"src":"489:14:115","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16214,"name":"bytes","nodeType":"ElementaryTypeName","src":"489:5:115","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"488:16:115"},"scope":16222,"src":"445:94:115","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16223,"src":"283:258:115","usedErrors":[7886,11559,19183,23526,23537],"usedEvents":[23591,23606]}],"src":"32:510:115"},"id":115},"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol","exportedSymbols":{"ERC1155DeliverableFacet":[23784],"ERC1155DeliverableFacetMock":[16251],"IForwarderRegistry":[13386]},"id":16252,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16224,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:116"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16226,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16252,"sourceUnit":13387,"src":"57:90:116","symbolAliases":[{"foreign":{"id":16225,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:116","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol","file":"./../../../../token/ERC1155/facets/ERC1155DeliverableFacet.sol","id":16228,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16252,"sourceUnit":23785,"src":"148:103:116","symbolAliases":[{"foreign":{"id":16227,"name":"ERC1155DeliverableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23784,"src":"156:23:116","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16230,"name":"ERC1155DeliverableFacet","nameLocations":["332:23:116"],"nodeType":"IdentifierPath","referencedDeclaration":23784,"src":"332:23:116"},"id":16231,"nodeType":"InheritanceSpecifier","src":"332:23:116"}],"canonicalName":"ERC1155DeliverableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16229,"nodeType":"StructuredDocumentation","src":"253:39:116","text":"@title ERC1155DeliverableFacetMock"},"fullyImplemented":true,"id":16251,"linearizedBaseContracts":[16251,23784,13297,23064,1206,24223],"name":"ERC1155DeliverableFacetMock","nameLocation":"301:27:116","nodeType":"ContractDefinition","nodes":[{"body":{"id":16240,"nodeType":"Block","src":"455:2:116","statements":[]},"id":16241,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16237,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16234,"src":"436:17:116","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16238,"kind":"baseConstructorSpecifier","modifierName":{"id":16236,"name":"ERC1155DeliverableFacet","nameLocations":["412:23:116"],"nodeType":"IdentifierPath","referencedDeclaration":23784,"src":"412:23:116"},"nodeType":"ModifierInvocation","src":"412:42:116"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16235,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16234,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"393:17:116","nodeType":"VariableDeclaration","scope":16241,"src":"374:36:116","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16233,"nodeType":"UserDefinedTypeName","pathNode":{"id":16232,"name":"IForwarderRegistry","nameLocations":["374:18:116"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"374:18:116"},"referencedDeclaration":13386,"src":"374:18:116","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"373:38:116"},"returnParameters":{"id":16239,"nodeType":"ParameterList","parameters":[],"src":"455:0:116"},"scope":16251,"src":"362:95:116","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16249,"nodeType":"Block","src":"523:34:116","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16246,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[23783],"referencedDeclaration":23783,"src":"540:8:116","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16247,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"540:10:116","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16245,"id":16248,"nodeType":"Return","src":"533:17:116"}]},"functionSelector":"31e66e1e","id":16250,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"472:9:116","nodeType":"FunctionDefinition","parameters":{"id":16242,"nodeType":"ParameterList","parameters":[],"src":"481:2:116"},"returnParameters":{"id":16245,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16244,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16250,"src":"507:14:116","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16243,"name":"bytes","nodeType":"ElementaryTypeName","src":"507:5:116","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"506:16:116"},"scope":16251,"src":"463:94:116","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16252,"src":"292:267:116","usedErrors":[7886,8223,11559,19183,23548,23557,23576],"usedEvents":[23591]}],"src":"32:528:116"},"id":116},"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol","exportedSymbols":{"ERC1155Facet":[23865],"ERC1155FacetMock":[16280],"IForwarderRegistry":[13386]},"id":16281,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16253,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:117"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16255,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16281,"sourceUnit":13387,"src":"57:90:117","symbolAliases":[{"foreign":{"id":16254,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:117","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155Facet.sol","file":"./../../../../token/ERC1155/facets/ERC1155Facet.sol","id":16257,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16281,"sourceUnit":23866,"src":"148:81:117","symbolAliases":[{"foreign":{"id":16256,"name":"ERC1155Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23865,"src":"156:12:117","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16259,"name":"ERC1155Facet","nameLocations":["288:12:117"],"nodeType":"IdentifierPath","referencedDeclaration":23865,"src":"288:12:117"},"id":16260,"nodeType":"InheritanceSpecifier","src":"288:12:117"}],"canonicalName":"ERC1155FacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16258,"nodeType":"StructuredDocumentation","src":"231:28:117","text":"@title ERC1155FacetMock"},"fullyImplemented":true,"id":16280,"linearizedBaseContracts":[16280,23865,13297,22929,1206,24178],"name":"ERC1155FacetMock","nameLocation":"268:16:117","nodeType":"ContractDefinition","nodes":[{"body":{"id":16269,"nodeType":"Block","src":"389:2:117","statements":[]},"id":16270,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16266,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16263,"src":"370:17:117","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16267,"kind":"baseConstructorSpecifier","modifierName":{"id":16265,"name":"ERC1155Facet","nameLocations":["357:12:117"],"nodeType":"IdentifierPath","referencedDeclaration":23865,"src":"357:12:117"},"nodeType":"ModifierInvocation","src":"357:31:117"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16264,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16263,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"338:17:117","nodeType":"VariableDeclaration","scope":16270,"src":"319:36:117","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16262,"nodeType":"UserDefinedTypeName","pathNode":{"id":16261,"name":"IForwarderRegistry","nameLocations":["319:18:117"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"319:18:117"},"referencedDeclaration":13386,"src":"319:18:117","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"318:38:117"},"returnParameters":{"id":16268,"nodeType":"ParameterList","parameters":[],"src":"389:0:117"},"scope":16280,"src":"307:84:117","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16278,"nodeType":"Block","src":"457:34:117","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16275,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[23864],"referencedDeclaration":23864,"src":"474:8:117","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16276,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:117","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16274,"id":16277,"nodeType":"Return","src":"467:17:117"}]},"functionSelector":"31e66e1e","id":16279,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:117","nodeType":"FunctionDefinition","parameters":{"id":16271,"nodeType":"ParameterList","parameters":[],"src":"415:2:117"},"returnParameters":{"id":16274,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16273,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16279,"src":"441:14:117","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16272,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:117","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:117"},"scope":16280,"src":"397:94:117","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16281,"src":"259:234:117","usedErrors":[7886,11559,19183,23516,23519,23526,23537,23548,23557,23568,23571],"usedEvents":[23591,23606,23615]}],"src":"32:462:117"},"id":117},"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol","exportedSymbols":{"ERC1155MetadataFacet":[23941],"ERC1155MetadataFacetMock":[16309],"IForwarderRegistry":[13386]},"id":16310,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16282,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:118"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16284,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16310,"sourceUnit":13387,"src":"57:90:118","symbolAliases":[{"foreign":{"id":16283,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:118","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol","file":"./../../../../token/ERC1155/facets/ERC1155MetadataFacet.sol","id":16286,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16310,"sourceUnit":23942,"src":"148:97:118","symbolAliases":[{"foreign":{"id":16285,"name":"ERC1155MetadataFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23941,"src":"156:20:118","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16288,"name":"ERC1155MetadataFacet","nameLocations":["320:20:118"],"nodeType":"IdentifierPath","referencedDeclaration":23941,"src":"320:20:118"},"id":16289,"nodeType":"InheritanceSpecifier","src":"320:20:118"}],"canonicalName":"ERC1155MetadataFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16287,"nodeType":"StructuredDocumentation","src":"247:36:118","text":"@title ERC1155MetadataFacetMock"},"fullyImplemented":true,"id":16309,"linearizedBaseContracts":[16309,23941,13297,23201,24244,24256,36683],"name":"ERC1155MetadataFacetMock","nameLocation":"292:24:118","nodeType":"ContractDefinition","nodes":[{"body":{"id":16298,"nodeType":"Block","src":"437:2:118","statements":[]},"id":16299,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16295,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16292,"src":"418:17:118","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16296,"kind":"baseConstructorSpecifier","modifierName":{"id":16294,"name":"ERC1155MetadataFacet","nameLocations":["397:20:118"],"nodeType":"IdentifierPath","referencedDeclaration":23941,"src":"397:20:118"},"nodeType":"ModifierInvocation","src":"397:39:118"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16293,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16292,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"378:17:118","nodeType":"VariableDeclaration","scope":16299,"src":"359:36:118","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16291,"nodeType":"UserDefinedTypeName","pathNode":{"id":16290,"name":"IForwarderRegistry","nameLocations":["359:18:118"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"359:18:118"},"referencedDeclaration":13386,"src":"359:18:118","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"358:38:118"},"returnParameters":{"id":16297,"nodeType":"ParameterList","parameters":[],"src":"437:0:118"},"scope":16309,"src":"347:92:118","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16307,"nodeType":"Block","src":"505:34:118","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16304,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13296,"src":"522:8:118","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16305,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"522:10:118","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16303,"id":16306,"nodeType":"Return","src":"515:17:118"}]},"functionSelector":"31e66e1e","id":16308,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"454:9:118","nodeType":"FunctionDefinition","parameters":{"id":16300,"nodeType":"ParameterList","parameters":[],"src":"463:2:118"},"returnParameters":{"id":16303,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16302,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16308,"src":"489:14:118","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16301,"name":"bytes","nodeType":"ElementaryTypeName","src":"489:5:118","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"488:16:118"},"scope":16309,"src":"445:94:118","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16310,"src":"283:258:118","usedErrors":[7886,11559,19183,19192,36690],"usedEvents":[23622]}],"src":"32:510:118"},"id":118},"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol","exportedSymbols":{"ERC1155MintableFacet":[24022],"ERC1155MintableFacetMock":[16338],"IForwarderRegistry":[13386]},"id":16339,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16311,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:119"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16313,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16339,"sourceUnit":13387,"src":"57:90:119","symbolAliases":[{"foreign":{"id":16312,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:119","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol","file":"./../../../../token/ERC1155/facets/ERC1155MintableFacet.sol","id":16315,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16339,"sourceUnit":24023,"src":"148:97:119","symbolAliases":[{"foreign":{"id":16314,"name":"ERC1155MintableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24022,"src":"156:20:119","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16317,"name":"ERC1155MintableFacet","nameLocations":["320:20:119"],"nodeType":"IdentifierPath","referencedDeclaration":24022,"src":"320:20:119"},"id":16318,"nodeType":"InheritanceSpecifier","src":"320:20:119"}],"canonicalName":"ERC1155MintableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16316,"nodeType":"StructuredDocumentation","src":"247:36:119","text":"@title ERC1155MintableFacetMock"},"fullyImplemented":true,"id":16338,"linearizedBaseContracts":[16338,24022,13297,23308,1206,24286],"name":"ERC1155MintableFacetMock","nameLocation":"292:24:119","nodeType":"ContractDefinition","nodes":[{"body":{"id":16327,"nodeType":"Block","src":"437:2:119","statements":[]},"id":16328,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16324,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16321,"src":"418:17:119","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16325,"kind":"baseConstructorSpecifier","modifierName":{"id":16323,"name":"ERC1155MintableFacet","nameLocations":["397:20:119"],"nodeType":"IdentifierPath","referencedDeclaration":24022,"src":"397:20:119"},"nodeType":"ModifierInvocation","src":"397:39:119"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16322,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16321,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"378:17:119","nodeType":"VariableDeclaration","scope":16328,"src":"359:36:119","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16320,"nodeType":"UserDefinedTypeName","pathNode":{"id":16319,"name":"IForwarderRegistry","nameLocations":["359:18:119"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"359:18:119"},"referencedDeclaration":13386,"src":"359:18:119","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"358:38:119"},"returnParameters":{"id":16326,"nodeType":"ParameterList","parameters":[],"src":"437:0:119"},"scope":16338,"src":"347:92:119","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16336,"nodeType":"Block","src":"505:34:119","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16333,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[24021],"referencedDeclaration":24021,"src":"522:8:119","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"522:10:119","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16332,"id":16335,"nodeType":"Return","src":"515:17:119"}]},"functionSelector":"31e66e1e","id":16337,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"454:9:119","nodeType":"FunctionDefinition","parameters":{"id":16329,"nodeType":"ParameterList","parameters":[],"src":"463:2:119"},"returnParameters":{"id":16332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16331,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16337,"src":"489:14:119","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16330,"name":"bytes","nodeType":"ElementaryTypeName","src":"489:5:119","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"488:16:119"},"scope":16338,"src":"445:94:119","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16339,"src":"283:258:119","usedErrors":[7886,8223,11559,19183,23548,23557,23568,23576],"usedEvents":[23591,23606]}],"src":"32:510:119"},"id":119},"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol","exportedSymbols":{"ERC1155WithOperatorFiltererFacet":[24103],"ERC1155WithOperatorFiltererFacetMock":[16367],"IForwarderRegistry":[13386]},"id":16368,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16340,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:120"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16342,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16368,"sourceUnit":13387,"src":"57:90:120","symbolAliases":[{"foreign":{"id":16341,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:120","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol","file":"./../../../../token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol","id":16344,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16368,"sourceUnit":24104,"src":"148:121:120","symbolAliases":[{"foreign":{"id":16343,"name":"ERC1155WithOperatorFiltererFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24103,"src":"156:32:120","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16346,"name":"ERC1155WithOperatorFiltererFacet","nameLocations":["348:32:120"],"nodeType":"IdentifierPath","referencedDeclaration":24103,"src":"348:32:120"},"id":16347,"nodeType":"InheritanceSpecifier","src":"348:32:120"}],"canonicalName":"ERC1155WithOperatorFiltererFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16345,"nodeType":"StructuredDocumentation","src":"271:28:120","text":"@title ERC1155FacetMock"},"fullyImplemented":true,"id":16367,"linearizedBaseContracts":[16367,24103,13297,23509,1206,24178],"name":"ERC1155WithOperatorFiltererFacetMock","nameLocation":"308:36:120","nodeType":"ContractDefinition","nodes":[{"body":{"id":16356,"nodeType":"Block","src":"489:2:120","statements":[]},"id":16357,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16353,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16350,"src":"470:17:120","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16354,"kind":"baseConstructorSpecifier","modifierName":{"id":16352,"name":"ERC1155WithOperatorFiltererFacet","nameLocations":["437:32:120"],"nodeType":"IdentifierPath","referencedDeclaration":24103,"src":"437:32:120"},"nodeType":"ModifierInvocation","src":"437:51:120"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16350,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"418:17:120","nodeType":"VariableDeclaration","scope":16357,"src":"399:36:120","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16349,"nodeType":"UserDefinedTypeName","pathNode":{"id":16348,"name":"IForwarderRegistry","nameLocations":["399:18:120"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"399:18:120"},"referencedDeclaration":13386,"src":"399:18:120","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"398:38:120"},"returnParameters":{"id":16355,"nodeType":"ParameterList","parameters":[],"src":"489:0:120"},"scope":16367,"src":"387:104:120","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16365,"nodeType":"Block","src":"557:34:120","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16362,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[24102],"referencedDeclaration":24102,"src":"574:8:120","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"574:10:120","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16361,"id":16364,"nodeType":"Return","src":"567:17:120"}]},"functionSelector":"31e66e1e","id":16366,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"506:9:120","nodeType":"FunctionDefinition","parameters":{"id":16358,"nodeType":"ParameterList","parameters":[],"src":"515:2:120"},"returnParameters":{"id":16361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16360,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16366,"src":"541:14:120","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16359,"name":"bytes","nodeType":"ElementaryTypeName","src":"541:5:120","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"540:16:120"},"scope":16367,"src":"497:94:120","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16368,"src":"299:294:120","usedErrors":[7886,11559,19183,23516,23519,23526,23537,23548,23557,23568,23571,37090],"usedEvents":[23591,23606,23615]}],"src":"32:562:120"},"id":120},"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol","exportedSymbols":{"ERC1155FullBurn":[25694],"ERC1155FullBurnMock":[16414],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704]},"id":16415,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16369,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:121"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16371,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16415,"sourceUnit":13387,"src":"57:90:121","symbolAliases":[{"foreign":{"id":16370,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:121","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":16373,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16415,"sourceUnit":37475,"src":"148:107:121","symbolAliases":[{"foreign":{"id":16372,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"156:23:121","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol","id":16375,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16415,"sourceUnit":36705,"src":"256:106:121","symbolAliases":[{"foreign":{"id":16374,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"264:22:121","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/preset/ERC1155FullBurn.sol","file":"./../../../../token/ERC1155/preset/ERC1155FullBurn.sol","id":16377,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16415,"sourceUnit":25695,"src":"363:87:121","symbolAliases":[{"foreign":{"id":16376,"name":"ERC1155FullBurn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25694,"src":"371:15:121","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16379,"name":"ERC1155FullBurn","nameLocations":["515:15:121"],"nodeType":"IdentifierPath","referencedDeclaration":25694,"src":"515:15:121"},"id":16380,"nodeType":"InheritanceSpecifier","src":"515:15:121"}],"canonicalName":"ERC1155FullBurnMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16378,"nodeType":"StructuredDocumentation","src":"452:31:121","text":"@title ERC1155FullBurnMock"},"fullyImplemented":true,"id":16414,"linearizedBaseContracts":[16414,25694,13142,13370,13297,19661,36915,22596,22995,22620,22689,7901,22665,23201,24244,24256,36683,22771,7934,11554,11579,8139,19810,37012,37280,8091,23064,23308,37073,23509,1206,8562,19938,24204,8546,24223,24286,24178],"name":"ERC1155FullBurnMock","nameLocation":"492:19:121","nodeType":"ContractDefinition","nodes":[{"body":{"id":16403,"nodeType":"Block","src":"859:2:121","statements":[]},"id":16404,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16396,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16382,"src":"782:9:121","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16397,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16384,"src":"793:11:121","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16398,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16387,"src":"806:16:121","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},{"id":16399,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16390,"src":"824:14:121","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},{"id":16400,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16393,"src":"840:17:121","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16401,"kind":"baseConstructorSpecifier","modifierName":{"id":16395,"name":"ERC1155FullBurn","nameLocations":["766:15:121"],"nodeType":"IdentifierPath","referencedDeclaration":25694,"src":"766:15:121"},"nodeType":"ModifierInvocation","src":"766:92:121"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16382,"mutability":"mutable","name":"tokenName","nameLocation":"572:9:121","nodeType":"VariableDeclaration","scope":16404,"src":"558:23:121","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16381,"name":"string","nodeType":"ElementaryTypeName","src":"558:6:121","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16384,"mutability":"mutable","name":"tokenSymbol","nameLocation":"605:11:121","nodeType":"VariableDeclaration","scope":16404,"src":"591:25:121","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16383,"name":"string","nodeType":"ElementaryTypeName","src":"591:6:121","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16387,"mutability":"mutable","name":"metadataResolver","nameLocation":"649:16:121","nodeType":"VariableDeclaration","scope":16404,"src":"626:39:121","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":16386,"nodeType":"UserDefinedTypeName","pathNode":{"id":16385,"name":"ITokenMetadataResolver","nameLocations":["626:22:121"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"626:22:121"},"referencedDeclaration":36704,"src":"626:22:121","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":16390,"mutability":"mutable","name":"filterRegistry","nameLocation":"699:14:121","nodeType":"VariableDeclaration","scope":16404,"src":"675:38:121","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":16389,"nodeType":"UserDefinedTypeName","pathNode":{"id":16388,"name":"IOperatorFilterRegistry","nameLocations":["675:23:121"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"675:23:121"},"referencedDeclaration":37474,"src":"675:23:121","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":16393,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"742:17:121","nodeType":"VariableDeclaration","scope":16404,"src":"723:36:121","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16392,"nodeType":"UserDefinedTypeName","pathNode":{"id":16391,"name":"IForwarderRegistry","nameLocations":["723:18:121"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"723:18:121"},"referencedDeclaration":13386,"src":"723:18:121","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"548:217:121"},"returnParameters":{"id":16402,"nodeType":"ParameterList","parameters":[],"src":"859:0:121"},"scope":16414,"src":"537:324:121","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16412,"nodeType":"Block","src":"927:34:121","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16409,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[25693],"referencedDeclaration":25693,"src":"944:8:121","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16410,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"944:10:121","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16408,"id":16411,"nodeType":"Return","src":"937:17:121"}]},"functionSelector":"31e66e1e","id":16413,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"876:9:121","nodeType":"FunctionDefinition","parameters":{"id":16405,"nodeType":"ParameterList","parameters":[],"src":"885:2:121"},"returnParameters":{"id":16408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16407,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16413,"src":"911:14:121","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16406,"name":"bytes","nodeType":"ElementaryTypeName","src":"911:5:121","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"910:16:121"},"scope":16414,"src":"867:94:121","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16415,"src":"483:480:121","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:932:121"},"id":121},"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol","exportedSymbols":{"ERC1155Full":[25587],"ERC1155FullMock":[16461],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704]},"id":16462,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16416,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:122"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16418,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16462,"sourceUnit":13387,"src":"57:90:122","symbolAliases":[{"foreign":{"id":16417,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:122","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":16420,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16462,"sourceUnit":37475,"src":"148:107:122","symbolAliases":[{"foreign":{"id":16419,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"156:23:122","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol","id":16422,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16462,"sourceUnit":36705,"src":"256:106:122","symbolAliases":[{"foreign":{"id":16421,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"264:22:122","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/preset/ERC1155Full.sol","file":"./../../../../token/ERC1155/preset/ERC1155Full.sol","id":16424,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16462,"sourceUnit":25588,"src":"363:79:122","symbolAliases":[{"foreign":{"id":16423,"name":"ERC1155Full","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25587,"src":"371:11:122","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16426,"name":"ERC1155Full","nameLocations":["499:11:122"],"nodeType":"IdentifierPath","referencedDeclaration":25587,"src":"499:11:122"},"id":16427,"nodeType":"InheritanceSpecifier","src":"499:11:122"}],"canonicalName":"ERC1155FullMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16425,"nodeType":"StructuredDocumentation","src":"444:27:122","text":"@title ERC1155FullMock"},"fullyImplemented":true,"id":16461,"linearizedBaseContracts":[16461,25587,13142,13370,13297,19661,36915,22620,22689,7901,22665,23201,24244,24256,36683,22771,7934,11554,11579,8139,19810,37012,37280,8091,23064,23308,37073,23509,1206,8562,19938,8546,24223,24286,24178],"name":"ERC1155FullMock","nameLocation":"480:15:122","nodeType":"ContractDefinition","nodes":[{"body":{"id":16450,"nodeType":"Block","src":"835:2:122","statements":[]},"id":16451,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16443,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16429,"src":"758:9:122","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16444,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16431,"src":"769:11:122","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16445,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16434,"src":"782:16:122","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},{"id":16446,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16437,"src":"800:14:122","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},{"id":16447,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16440,"src":"816:17:122","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16448,"kind":"baseConstructorSpecifier","modifierName":{"id":16442,"name":"ERC1155Full","nameLocations":["746:11:122"],"nodeType":"IdentifierPath","referencedDeclaration":25587,"src":"746:11:122"},"nodeType":"ModifierInvocation","src":"746:88:122"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16441,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16429,"mutability":"mutable","name":"tokenName","nameLocation":"552:9:122","nodeType":"VariableDeclaration","scope":16451,"src":"538:23:122","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16428,"name":"string","nodeType":"ElementaryTypeName","src":"538:6:122","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16431,"mutability":"mutable","name":"tokenSymbol","nameLocation":"585:11:122","nodeType":"VariableDeclaration","scope":16451,"src":"571:25:122","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16430,"name":"string","nodeType":"ElementaryTypeName","src":"571:6:122","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16434,"mutability":"mutable","name":"metadataResolver","nameLocation":"629:16:122","nodeType":"VariableDeclaration","scope":16451,"src":"606:39:122","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":16433,"nodeType":"UserDefinedTypeName","pathNode":{"id":16432,"name":"ITokenMetadataResolver","nameLocations":["606:22:122"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"606:22:122"},"referencedDeclaration":36704,"src":"606:22:122","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":16437,"mutability":"mutable","name":"filterRegistry","nameLocation":"679:14:122","nodeType":"VariableDeclaration","scope":16451,"src":"655:38:122","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":16436,"nodeType":"UserDefinedTypeName","pathNode":{"id":16435,"name":"IOperatorFilterRegistry","nameLocations":["655:23:122"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"655:23:122"},"referencedDeclaration":37474,"src":"655:23:122","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":16440,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"722:17:122","nodeType":"VariableDeclaration","scope":16451,"src":"703:36:122","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16439,"nodeType":"UserDefinedTypeName","pathNode":{"id":16438,"name":"IForwarderRegistry","nameLocations":["703:18:122"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"703:18:122"},"referencedDeclaration":13386,"src":"703:18:122","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"528:217:122"},"returnParameters":{"id":16449,"nodeType":"ParameterList","parameters":[],"src":"835:0:122"},"scope":16461,"src":"517:320:122","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16459,"nodeType":"Block","src":"903:34:122","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16456,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[25586],"referencedDeclaration":25586,"src":"920:8:122","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16457,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"920:10:122","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16455,"id":16458,"nodeType":"Return","src":"913:17:122"}]},"functionSelector":"31e66e1e","id":16460,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"852:9:122","nodeType":"FunctionDefinition","parameters":{"id":16452,"nodeType":"ParameterList","parameters":[],"src":"861:2:122"},"returnParameters":{"id":16455,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16454,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16460,"src":"887:14:122","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16453,"name":"bytes","nodeType":"ElementaryTypeName","src":"887:5:122","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"886:16:122"},"scope":16461,"src":"843:94:122","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16462,"src":"471:468:122","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:908:122"},"id":122},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol","exportedSymbols":{"ERC1155FullBurnProxied":[25886],"ERC1155FullBurnProxiedMock":[16489],"IForwarderRegistry":[13386]},"id":16490,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16463,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:123"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":16465,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16490,"sourceUnit":13387,"src":"57:93:123","symbolAliases":[{"foreign":{"id":16464,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:123","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol","file":"./../../../../../token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol","id":16467,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16490,"sourceUnit":25887,"src":"151:112:123","symbolAliases":[{"foreign":{"id":16466,"name":"ERC1155FullBurnProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25886,"src":"159:22:123","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16468,"name":"ERC1155FullBurnProxied","nameLocations":["304:22:123"],"nodeType":"IdentifierPath","referencedDeclaration":25886,"src":"304:22:123"},"id":16469,"nodeType":"InheritanceSpecifier","src":"304:22:123"}],"canonicalName":"ERC1155FullBurnProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16489,"linearizedBaseContracts":[16489,25886,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,22995,23064,23308,23201,24244,24256,36683,23509,1206,19938,8546,8562,24204,24223,24286,24178],"name":"ERC1155FullBurnProxiedMock","nameLocation":"274:26:123","nodeType":"ContractDefinition","nodes":[{"body":{"id":16478,"nodeType":"Block","src":"425:2:123","statements":[]},"id":16479,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16475,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16472,"src":"406:17:123","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16476,"kind":"baseConstructorSpecifier","modifierName":{"id":16474,"name":"ERC1155FullBurnProxied","nameLocations":["383:22:123"],"nodeType":"IdentifierPath","referencedDeclaration":25886,"src":"383:22:123"},"nodeType":"ModifierInvocation","src":"383:41:123"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16473,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16472,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"364:17:123","nodeType":"VariableDeclaration","scope":16479,"src":"345:36:123","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16471,"nodeType":"UserDefinedTypeName","pathNode":{"id":16470,"name":"IForwarderRegistry","nameLocations":["345:18:123"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"345:18:123"},"referencedDeclaration":13386,"src":"345:18:123","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"344:38:123"},"returnParameters":{"id":16477,"nodeType":"ParameterList","parameters":[],"src":"425:0:123"},"scope":16489,"src":"333:94:123","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16487,"nodeType":"Block","src":"493:34:123","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16484,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[25885],"referencedDeclaration":25885,"src":"510:8:123","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"510:10:123","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16483,"id":16486,"nodeType":"Return","src":"503:17:123"}]},"functionSelector":"31e66e1e","id":16488,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"442:9:123","nodeType":"FunctionDefinition","parameters":{"id":16480,"nodeType":"ParameterList","parameters":[],"src":"451:2:123"},"returnParameters":{"id":16483,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16482,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16488,"src":"477:14:123","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16481,"name":"bytes","nodeType":"ElementaryTypeName","src":"477:5:123","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"476:16:123"},"scope":16489,"src":"433:94:123","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16490,"src":"265:264:123","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:498:123"},"id":123},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol","exportedSymbols":{"ERC1155FullProxied":[26069],"ERC1155FullProxiedMock":[16517],"IForwarderRegistry":[13386]},"id":16518,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16491,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:124"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":16493,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16518,"sourceUnit":13387,"src":"57:93:124","symbolAliases":[{"foreign":{"id":16492,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:124","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol","file":"./../../../../../token/ERC1155/preset/proxied/ERC1155FullProxied.sol","id":16495,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16518,"sourceUnit":26070,"src":"151:104:124","symbolAliases":[{"foreign":{"id":16494,"name":"ERC1155FullProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26069,"src":"159:18:124","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16496,"name":"ERC1155FullProxied","nameLocations":["292:18:124"],"nodeType":"IdentifierPath","referencedDeclaration":26069,"src":"292:18:124"},"id":16497,"nodeType":"InheritanceSpecifier","src":"292:18:124"}],"canonicalName":"ERC1155FullProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16517,"linearizedBaseContracts":[16517,26069,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,23064,23308,23201,24244,24256,36683,23509,1206,19938,8546,8562,24223,24286,24178],"name":"ERC1155FullProxiedMock","nameLocation":"266:22:124","nodeType":"ContractDefinition","nodes":[{"body":{"id":16506,"nodeType":"Block","src":"405:2:124","statements":[]},"id":16507,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16503,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16500,"src":"386:17:124","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16504,"kind":"baseConstructorSpecifier","modifierName":{"id":16502,"name":"ERC1155FullProxied","nameLocations":["367:18:124"],"nodeType":"IdentifierPath","referencedDeclaration":26069,"src":"367:18:124"},"nodeType":"ModifierInvocation","src":"367:37:124"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16501,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16500,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"348:17:124","nodeType":"VariableDeclaration","scope":16507,"src":"329:36:124","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16499,"nodeType":"UserDefinedTypeName","pathNode":{"id":16498,"name":"IForwarderRegistry","nameLocations":["329:18:124"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"329:18:124"},"referencedDeclaration":13386,"src":"329:18:124","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"328:38:124"},"returnParameters":{"id":16505,"nodeType":"ParameterList","parameters":[],"src":"405:0:124"},"scope":16517,"src":"317:90:124","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16515,"nodeType":"Block","src":"473:34:124","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16512,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[26068],"referencedDeclaration":26068,"src":"490:8:124","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"490:10:124","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16511,"id":16514,"nodeType":"Return","src":"483:17:124"}]},"functionSelector":"31e66e1e","id":16516,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"422:9:124","nodeType":"FunctionDefinition","parameters":{"id":16508,"nodeType":"ParameterList","parameters":[],"src":"431:2:124"},"returnParameters":{"id":16511,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16510,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16516,"src":"457:14:124","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16509,"name":"bytes","nodeType":"ElementaryTypeName","src":"457:5:124","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"456:16:124"},"scope":16517,"src":"413:94:124","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16518,"src":"257:252:124","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:478:124"},"id":124},"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC1155Base":[22929],"ERC1155MintableBase":[23308],"ERC1155Storage":[25484],"ERC1155WithoutOperatorFiltererProxiedMock":[16634],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":16635,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16519,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:125"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16521,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":13387,"src":"57:90:125","symbolAliases":[{"foreign":{"id":16520,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../../../../token/ERC1155/libraries/ERC1155Storage.sol","id":16523,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":25485,"src":"148:88:125","symbolAliases":[{"foreign":{"id":16522,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"156:14:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":16525,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":9110,"src":"237:101:125","symbolAliases":[{"foreign":{"id":16524,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"245:24:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../../introspection/libraries/InterfaceDetectionStorage.sol","id":16527,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":11681,"src":"339:110:125","symbolAliases":[{"foreign":{"id":16526,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"347:25:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155Base.sol","file":"./../../../../token/ERC1155/base/ERC1155Base.sol","id":16529,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":22930,"src":"450:77:125","symbolAliases":[{"foreign":{"id":16528,"name":"ERC1155Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22929,"src":"458:11:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","file":"./../../../../token/ERC1155/base/ERC1155MintableBase.sol","id":16531,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":23309,"src":"528:93:125","symbolAliases":[{"foreign":{"id":16530,"name":"ERC1155MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23308,"src":"536:19:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":16533,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":8140,"src":"622:90:125","symbolAliases":[{"foreign":{"id":16532,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"630:21:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":16535,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":8092,"src":"713:82:125","symbolAliases":[{"foreign":{"id":16534,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"721:17:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":16537,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":11555,"src":"796:86:125","symbolAliases":[{"foreign":{"id":16536,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"804:18:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":16539,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":1207,"src":"883:66:125","symbolAliases":[{"foreign":{"id":16538,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"891:7:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":16541,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":13298,"src":"950:104:125","symbolAliases":[{"foreign":{"id":16540,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"958:28:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":16543,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16635,"sourceUnit":13143,"src":"1055:91:125","symbolAliases":[{"foreign":{"id":16542,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1063:24:125","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16544,"name":"ERC1155Base","nameLocations":["1206:11:125"],"nodeType":"IdentifierPath","referencedDeclaration":22929,"src":"1206:11:125"},"id":16545,"nodeType":"InheritanceSpecifier","src":"1206:11:125"},{"baseName":{"id":16546,"name":"ERC1155MintableBase","nameLocations":["1223:19:125"],"nodeType":"IdentifierPath","referencedDeclaration":23308,"src":"1223:19:125"},"id":16547,"nodeType":"InheritanceSpecifier","src":"1223:19:125"},{"baseName":{"id":16548,"name":"ContractOwnershipBase","nameLocations":["1248:21:125"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"1248:21:125"},"id":16549,"nodeType":"InheritanceSpecifier","src":"1248:21:125"},{"baseName":{"id":16550,"name":"AccessControlBase","nameLocations":["1275:17:125"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"1275:17:125"},"id":16551,"nodeType":"InheritanceSpecifier","src":"1275:17:125"},{"baseName":{"id":16552,"name":"InterfaceDetection","nameLocations":["1298:18:125"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"1298:18:125"},"id":16553,"nodeType":"InheritanceSpecifier","src":"1298:18:125"},{"baseName":{"id":16554,"name":"ForwarderRegistryContext","nameLocations":["1322:24:125"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1322:24:125"},"id":16555,"nodeType":"InheritanceSpecifier","src":"1322:24:125"}],"canonicalName":"ERC1155WithoutOperatorFiltererProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16634,"linearizedBaseContracts":[16634,13142,13370,13297,11554,11579,8091,8139,23308,22929,1206,8546,8562,24286,24178],"name":"ERC1155WithoutOperatorFiltererProxiedMock","nameLocation":"1157:41:125","nodeType":"ContractDefinition","nodes":[{"global":false,"id":16559,"libraryName":{"id":16556,"name":"ContractOwnershipStorage","nameLocations":["1359:24:125"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"1359:24:125"},"nodeType":"UsingForDirective","src":"1353:67:125","typeName":{"id":16558,"nodeType":"UserDefinedTypeName","pathNode":{"id":16557,"name":"ContractOwnershipStorage.Layout","nameLocations":["1388:24:125","1413:6:125"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"1388:31:125"},"referencedDeclaration":8882,"src":"1388:31:125","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":16563,"libraryName":{"id":16560,"name":"InterfaceDetectionStorage","nameLocations":["1431:25:125"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1431:25:125"},"nodeType":"UsingForDirective","src":"1425:69:125","typeName":{"id":16562,"nodeType":"UserDefinedTypeName","pathNode":{"id":16561,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1461:25:125","1487:6:125"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1461:32:125"},"referencedDeclaration":11590,"src":"1461:32:125","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":16572,"nodeType":"Block","src":"1594:2:125","statements":[]},"id":16573,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16569,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16566,"src":"1575:17:125","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16570,"kind":"baseConstructorSpecifier","modifierName":{"id":16568,"name":"ForwarderRegistryContext","nameLocations":["1550:24:125"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1550:24:125"},"nodeType":"ModifierInvocation","src":"1550:43:125"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16566,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1531:17:125","nodeType":"VariableDeclaration","scope":16573,"src":"1512:36:125","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16565,"nodeType":"UserDefinedTypeName","pathNode":{"id":16564,"name":"IForwarderRegistry","nameLocations":["1512:18:125"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1512:18:125"},"referencedDeclaration":13386,"src":"1512:18:125","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1511:38:125"},"returnParameters":{"id":16571,"nodeType":"ParameterList","parameters":[],"src":"1594:0:125"},"scope":16634,"src":"1500:96:125","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16595,"nodeType":"Block","src":"1627:151:125","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":16581,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[16619],"referencedDeclaration":16619,"src":"1681:10:125","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":16582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1681:12:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16576,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1637:24:125","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":16578,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1662:6:125","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1637:31:125","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":16579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1637:33:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":16580,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1671:9:125","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"1637:43:125","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":16583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1637:57:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16584,"nodeType":"ExpressionStatement","src":"1637:57:125"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16585,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1704:14:125","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":16587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1719:4:125","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"1704:19:125","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":16588,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1704:21:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16589,"nodeType":"ExpressionStatement","src":"1704:21:125"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16590,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1735:14:125","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":16592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1750:19:125","memberName":"initERC1155Mintable","nodeType":"MemberAccess","referencedDeclaration":24457,"src":"1735:34:125","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":16593,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1735:36:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16594,"nodeType":"ExpressionStatement","src":"1735:36:125"}]},"functionSelector":"e1c7392a","id":16596,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"1611:4:125","nodeType":"FunctionDefinition","parameters":{"id":16574,"nodeType":"ParameterList","parameters":[],"src":"1615:2:125"},"returnParameters":{"id":16575,"nodeType":"ParameterList","parameters":[],"src":"1627:0:125"},"scope":16634,"src":"1602:176:125","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":16604,"nodeType":"Block","src":"1844:34:125","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16601,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[16633],"referencedDeclaration":16633,"src":"1861:8:125","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16602,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1861:10:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16600,"id":16603,"nodeType":"Return","src":"1854:17:125"}]},"functionSelector":"31e66e1e","id":16605,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1793:9:125","nodeType":"FunctionDefinition","parameters":{"id":16597,"nodeType":"ParameterList","parameters":[],"src":"1802:2:125"},"returnParameters":{"id":16600,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16599,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16605,"src":"1828:14:125","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16598,"name":"bytes","nodeType":"ElementaryTypeName","src":"1828:5:125","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1827:16:125"},"scope":16634,"src":"1784:94:125","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":16618,"nodeType":"Block","src":"2043:65:125","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16614,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2060:28:125","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":16615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2089:10:125","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2060:39:125","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":16616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2060:41:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":16613,"id":16617,"nodeType":"Return","src":"2053:48:125"}]},"documentation":{"id":16606,"nodeType":"StructuredDocumentation","src":"1884:44:125","text":"@inheritdoc ForwarderRegistryContextBase"},"id":16619,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1942:10:125","nodeType":"FunctionDefinition","overrides":{"id":16610,"nodeType":"OverrideSpecifier","overrides":[{"id":16608,"name":"Context","nameLocations":["1986:7:125"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1986:7:125"},{"id":16609,"name":"ForwarderRegistryContextBase","nameLocations":["1995:28:125"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1995:28:125"}],"src":"1977:47:125"},"parameters":{"id":16607,"nodeType":"ParameterList","parameters":[],"src":"1952:2:125"},"returnParameters":{"id":16613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16612,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16619,"src":"2034:7:125","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16611,"name":"address","nodeType":"ElementaryTypeName","src":"2034:7:125","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2033:9:125"},"scope":16634,"src":"1933:175:125","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":16632,"nodeType":"Block","src":"2278:63:125","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16628,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2295:28:125","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":16629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2324:8:125","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2295:37:125","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2295:39:125","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16627,"id":16631,"nodeType":"Return","src":"2288:46:125"}]},"documentation":{"id":16620,"nodeType":"StructuredDocumentation","src":"2114:44:125","text":"@inheritdoc ForwarderRegistryContextBase"},"id":16633,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2172:8:125","nodeType":"FunctionDefinition","overrides":{"id":16624,"nodeType":"OverrideSpecifier","overrides":[{"id":16622,"name":"Context","nameLocations":["2214:7:125"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2214:7:125"},{"id":16623,"name":"ForwarderRegistryContextBase","nameLocations":["2223:28:125"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2223:28:125"}],"src":"2205:47:125"},"parameters":{"id":16621,"nodeType":"ParameterList","parameters":[],"src":"2180:2:125"},"returnParameters":{"id":16627,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16626,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16633,"src":"2262:14:125","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16625,"name":"bytes","nodeType":"ElementaryTypeName","src":"2262:5:125","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2261:16:125"},"scope":16634,"src":"2163:178:125","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":16635,"src":"1148:1195:125","usedErrors":[7886,8223,8246,11559,19192,23516,23519,23526,23537,23548,23557,23568,23571,23576],"usedEvents":[8269,8278,8287,23591,23606,23615]}],"src":"32:2312:125"},"id":125},"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol","exportedSymbols":{"ERC20Receiver":[26279],"ERC20ReceiverMock":[16718],"ERC20Storage":[30139],"IERC20Receiver":[28035]},"id":16719,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16636,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:126"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Receiver.sol","file":"./../../../token/ERC20/interfaces/IERC20Receiver.sol","id":16638,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16719,"sourceUnit":28036,"src":"57:84:126","symbolAliases":[{"foreign":{"id":16637,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"65:14:126","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../../../token/ERC20/libraries/ERC20Storage.sol","id":16640,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16719,"sourceUnit":30140,"src":"142:79:126","symbolAliases":[{"foreign":{"id":16639,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"150:12:126","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Receiver.sol","file":"./../../../token/ERC20/ERC20Receiver.sol","id":16642,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16719,"sourceUnit":26280,"src":"222:71:126","symbolAliases":[{"foreign":{"id":16641,"name":"ERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26279,"src":"230:13:126","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16644,"name":"ERC20Receiver","nameLocations":["357:13:126"],"nodeType":"IdentifierPath","referencedDeclaration":26279,"src":"357:13:126"},"id":16645,"nodeType":"InheritanceSpecifier","src":"357:13:126"}],"canonicalName":"ERC20ReceiverMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":16643,"nodeType":"StructuredDocumentation","src":"295:32:126","text":"@title ERC20 Receiver Mock."},"fullyImplemented":true,"id":16718,"linearizedBaseContracts":[16718,26279,11554,11579,28035],"name":"ERC20ReceiverMock","nameLocation":"336:17:126","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":16647,"mutability":"immutable","name":"_ACCCEPT","nameLocation":"401:8:126","nodeType":"VariableDeclaration","scope":16718,"src":"377:32:126","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16646,"name":"bool","nodeType":"ElementaryTypeName","src":"377:4:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16649,"mutability":"immutable","name":"_TOKEN_ADDRESS","nameLocation":"442:14:126","nodeType":"VariableDeclaration","scope":16718,"src":"415:41:126","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16648,"name":"address","nodeType":"ElementaryTypeName","src":"415:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"anonymous":false,"eventSelector":"af27e222a631278dbe6529e0dbf9fca686cfc255d167f9f68192a8e30ba6fa62","id":16659,"name":"ERC20Received","nameLocation":"469:13:126","nodeType":"EventDefinition","parameters":{"id":16658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16651,"indexed":false,"mutability":"mutable","name":"sender","nameLocation":"491:6:126","nodeType":"VariableDeclaration","scope":16659,"src":"483:14:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16650,"name":"address","nodeType":"ElementaryTypeName","src":"483:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16653,"indexed":false,"mutability":"mutable","name":"from","nameLocation":"507:4:126","nodeType":"VariableDeclaration","scope":16659,"src":"499:12:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16652,"name":"address","nodeType":"ElementaryTypeName","src":"499:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16655,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"521:5:126","nodeType":"VariableDeclaration","scope":16659,"src":"513:13:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16654,"name":"uint256","nodeType":"ElementaryTypeName","src":"513:7:126","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16657,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"534:4:126","nodeType":"VariableDeclaration","scope":16659,"src":"528:10:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16656,"name":"bytes","nodeType":"ElementaryTypeName","src":"528:5:126","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"482:57:126"},"src":"463:77:126"},{"errorSelector":"a0f3feea","id":16661,"name":"WrongToken","nameLocation":"552:10:126","nodeType":"ErrorDefinition","parameters":{"id":16660,"nodeType":"ParameterList","parameters":[],"src":"562:2:126"},"src":"546:19:126"},{"body":{"id":16676,"nodeType":"Block","src":"618:73:126","statements":[{"expression":{"id":16670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":16668,"name":"_ACCCEPT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16647,"src":"628:8:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16669,"name":"accept","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16663,"src":"639:6:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"628:17:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16671,"nodeType":"ExpressionStatement","src":"628:17:126"},{"expression":{"id":16674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":16672,"name":"_TOKEN_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16649,"src":"655:14:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":16673,"name":"tokenAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16665,"src":"672:12:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"655:29:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":16675,"nodeType":"ExpressionStatement","src":"655:29:126"}]},"id":16677,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16663,"mutability":"mutable","name":"accept","nameLocation":"588:6:126","nodeType":"VariableDeclaration","scope":16677,"src":"583:11:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16662,"name":"bool","nodeType":"ElementaryTypeName","src":"583:4:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":16665,"mutability":"mutable","name":"tokenAddress","nameLocation":"604:12:126","nodeType":"VariableDeclaration","scope":16677,"src":"596:20:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16664,"name":"address","nodeType":"ElementaryTypeName","src":"596:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"582:35:126"},"returnParameters":{"id":16667,"nodeType":"ParameterList","parameters":[],"src":"618:0:126"},"scope":16718,"src":"571:120:126","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[28034],"body":{"id":16716,"nodeType":"Block","src":"991:252:126","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":16695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":16692,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1005:3:126","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":16693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1009:6:126","memberName":"sender","nodeType":"MemberAccess","src":"1005:10:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":16694,"name":"_TOKEN_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16649,"src":"1019:14:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1005:28:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16699,"nodeType":"IfStatement","src":"1001:53:126","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":16696,"name":"WrongToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16661,"src":"1042:10:126","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":16697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1042:12:126","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":16698,"nodeType":"RevertStatement","src":"1035:19:126"}},{"condition":{"id":16700,"name":"_ACCCEPT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16647,"src":"1068:8:126","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":16714,"nodeType":"Block","src":"1202:35:126","statements":[{"expression":{"hexValue":"307830","id":16712,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1223:3:126","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"},"functionReturnParameters":16691,"id":16713,"nodeType":"Return","src":"1216:10:126"}]},"id":16715,"nodeType":"IfStatement","src":"1064:173:126","trueBody":{"id":16711,"nodeType":"Block","src":"1078:118:126","statements":[{"eventCall":{"arguments":[{"id":16702,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16680,"src":"1111:6:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16703,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16682,"src":"1119:4:126","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16704,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16684,"src":"1125:5:126","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16705,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16686,"src":"1132:4:126","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":16701,"name":"ERC20Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16659,"src":"1097:13:126","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":16706,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1097:40:126","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16707,"nodeType":"EmitStatement","src":"1092:45:126"},{"expression":{"expression":{"id":16708,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1158:12:126","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":16709,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1171:14:126","memberName":"ERC20_RECEIVED","nodeType":"MemberAccess","referencedDeclaration":28709,"src":"1158:27:126","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":16691,"id":16710,"nodeType":"Return","src":"1151:34:126"}]}}]},"documentation":{"id":16678,"nodeType":"StructuredDocumentation","src":"826:30:126","text":"@inheritdoc IERC20Receiver"},"functionSelector":"4fc35859","id":16717,"implemented":true,"kind":"function","modifiers":[],"name":"onERC20Received","nameLocation":"870:15:126","nodeType":"FunctionDefinition","overrides":{"id":16688,"nodeType":"OverrideSpecifier","overrides":[],"src":"965:8:126"},"parameters":{"id":16687,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16680,"mutability":"mutable","name":"sender","nameLocation":"894:6:126","nodeType":"VariableDeclaration","scope":16717,"src":"886:14:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16679,"name":"address","nodeType":"ElementaryTypeName","src":"886:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16682,"mutability":"mutable","name":"from","nameLocation":"910:4:126","nodeType":"VariableDeclaration","scope":16717,"src":"902:12:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16681,"name":"address","nodeType":"ElementaryTypeName","src":"902:7:126","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16684,"mutability":"mutable","name":"value","nameLocation":"924:5:126","nodeType":"VariableDeclaration","scope":16717,"src":"916:13:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16683,"name":"uint256","nodeType":"ElementaryTypeName","src":"916:7:126","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16686,"mutability":"mutable","name":"data","nameLocation":"944:4:126","nodeType":"VariableDeclaration","scope":16717,"src":"931:17:126","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":16685,"name":"bytes","nodeType":"ElementaryTypeName","src":"931:5:126","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"885:64:126"},"returnParameters":{"id":16691,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16690,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16717,"src":"983:6:126","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":16689,"name":"bytes4","nodeType":"ElementaryTypeName","src":"983:6:126","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"982:8:126"},"scope":16718,"src":"861:382:126","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":16719,"src":"327:918:126","usedErrors":[11559,16661],"usedEvents":[16659]}],"src":"32:1214:126"},"id":126},"contracts/mocks/token/ERC20/ERC677Mock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/ERC677Mock.sol","exportedSymbols":{"Address":[38035],"ERC20FixedSupply":[30257],"ERC20Storage":[30139],"ERC677Mock":[16814],"IERC677":[28080],"IERC677Receiver":[28095],"IForwarderRegistry":[13386]},"id":16815,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16720,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:127"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":16722,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":13387,"src":"57:87:127","symbolAliases":[{"foreign":{"id":16721,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC677.sol","file":"./../../../token/ERC20/interfaces/IERC677.sol","id":16724,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":28081,"src":"145:70:127","symbolAliases":[{"foreign":{"id":16723,"name":"IERC677","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28080,"src":"153:7:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC677Receiver.sol","file":"./../../../token/ERC20/interfaces/IERC677Receiver.sol","id":16726,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":28096,"src":"216:86:127","symbolAliases":[{"foreign":{"id":16725,"name":"IERC677Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28095,"src":"224:15:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../../../token/ERC20/libraries/ERC20Storage.sol","id":16728,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":30140,"src":"303:79:127","symbolAliases":[{"foreign":{"id":16727,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"311:12:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../../utils/libraries/Address.sol","id":16730,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":38036,"src":"383:63:127","symbolAliases":[{"foreign":{"id":16729,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"391:7:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/preset/ERC20FixedSupply.sol","file":"./../../../token/ERC20/preset/ERC20FixedSupply.sol","id":16732,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16815,"sourceUnit":30258,"src":"447:84:127","symbolAliases":[{"foreign":{"id":16731,"name":"ERC20FixedSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30257,"src":"455:16:127","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16733,"name":"ERC20FixedSupply","nameLocations":["556:16:127"],"nodeType":"IdentifierPath","referencedDeclaration":30257,"src":"556:16:127"},"id":16734,"nodeType":"InheritanceSpecifier","src":"556:16:127"},{"baseName":{"id":16735,"name":"IERC677","nameLocations":["574:7:127"],"nodeType":"IdentifierPath","referencedDeclaration":28080,"src":"574:7:127"},"id":16736,"nodeType":"InheritanceSpecifier","src":"574:7:127"}],"canonicalName":"ERC677Mock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16814,"linearizedBaseContracts":[16814,28080,30257,13142,13370,13297,19661,26113,26565,26299,27006,26244,26931,26196,7934,26168,26707,27949,26093,11554,11579,8139,19810,26768,26492,1206,8562,19938,27893,28065,28017,27959,27863,27839],"name":"ERC677Mock","nameLocation":"542:10:127","nodeType":"ContractDefinition","nodes":[{"global":false,"id":16740,"libraryName":{"id":16737,"name":"ERC20Storage","nameLocations":["594:12:127"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"594:12:127"},"nodeType":"UsingForDirective","src":"588:43:127","typeName":{"id":16739,"nodeType":"UserDefinedTypeName","pathNode":{"id":16738,"name":"ERC20Storage.Layout","nameLocations":["611:12:127","624:6:127"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"611:19:127"},"referencedDeclaration":28678,"src":"611:19:127","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":16743,"libraryName":{"id":16741,"name":"Address","nameLocations":["642:7:127"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"642:7:127"},"nodeType":"UsingForDirective","src":"636:26:127","typeName":{"id":16742,"name":"address","nodeType":"ElementaryTypeName","src":"654:7:127","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"body":{"id":16769,"nodeType":"Block","src":"998:2:127","statements":[]},"id":16770,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16761,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16745,"src":"918:9:127","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16762,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16747,"src":"929:11:127","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":16763,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16749,"src":"942:13:127","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":16764,"name":"holders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16752,"src":"957:7:127","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},{"id":16765,"name":"allocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16755,"src":"966:11:127","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":16766,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16758,"src":"979:17:127","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16767,"kind":"baseConstructorSpecifier","modifierName":{"id":16760,"name":"ERC20FixedSupply","nameLocations":["901:16:127"],"nodeType":"IdentifierPath","referencedDeclaration":30257,"src":"901:16:127"},"nodeType":"ModifierInvocation","src":"901:96:127"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16759,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16745,"mutability":"mutable","name":"tokenName","nameLocation":"703:9:127","nodeType":"VariableDeclaration","scope":16770,"src":"689:23:127","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16744,"name":"string","nodeType":"ElementaryTypeName","src":"689:6:127","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16747,"mutability":"mutable","name":"tokenSymbol","nameLocation":"736:11:127","nodeType":"VariableDeclaration","scope":16770,"src":"722:25:127","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":16746,"name":"string","nodeType":"ElementaryTypeName","src":"722:6:127","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":16749,"mutability":"mutable","name":"tokenDecimals","nameLocation":"763:13:127","nodeType":"VariableDeclaration","scope":16770,"src":"757:19:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":16748,"name":"uint8","nodeType":"ElementaryTypeName","src":"757:5:127","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":16752,"mutability":"mutable","name":"holders","nameLocation":"803:7:127","nodeType":"VariableDeclaration","scope":16770,"src":"786:24:127","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":16750,"name":"address","nodeType":"ElementaryTypeName","src":"786:7:127","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":16751,"nodeType":"ArrayTypeName","src":"786:9:127","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":16755,"mutability":"mutable","name":"allocations","nameLocation":"837:11:127","nodeType":"VariableDeclaration","scope":16770,"src":"820:28:127","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":16753,"name":"uint256","nodeType":"ElementaryTypeName","src":"820:7:127","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":16754,"nodeType":"ArrayTypeName","src":"820:9:127","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":16758,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"877:17:127","nodeType":"VariableDeclaration","scope":16770,"src":"858:36:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16757,"nodeType":"UserDefinedTypeName","pathNode":{"id":16756,"name":"IForwarderRegistry","nameLocations":["858:18:127"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"858:18:127"},"referencedDeclaration":13386,"src":"858:18:127","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"679:221:127"},"returnParameters":{"id":16768,"nodeType":"ParameterList","parameters":[],"src":"998:0:127"},"scope":16814,"src":"668:332:127","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[28079],"body":{"id":16812,"nodeType":"Block","src":"1118:242:127","statements":[{"assignments":[16782],"declarations":[{"constant":false,"id":16782,"mutability":"mutable","name":"sender","nameLocation":"1136:6:127","nodeType":"VariableDeclaration","scope":16812,"src":"1128:14:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16781,"name":"address","nodeType":"ElementaryTypeName","src":"1128:7:127","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":16785,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":16783,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[30242],"referencedDeclaration":30242,"src":"1145:10:127","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":16784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1145:12:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1128:29:127"},{"expression":{"arguments":[{"id":16791,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16782,"src":"1198:6:127","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16792,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16772,"src":"1206:8:127","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16793,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16774,"src":"1216:6:127","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16786,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1167:12:127","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":16788,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1180:6:127","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1167:19:127","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":16789,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1167:21:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":16790,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1189:8:127","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":29123,"src":"1167:30:127","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":16794,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1167:56:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":16795,"nodeType":"ExpressionStatement","src":"1167:56:127"},{"condition":{"id":16799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1237:23:127","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":16796,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16772,"src":"1238:8:127","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":16797,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1247:11:127","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"1238:20:127","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":16798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1238:22:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":16802,"nodeType":"IfStatement","src":"1233:40:127","trueBody":{"expression":{"hexValue":"74727565","id":16800,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1269:4:127","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":16780,"id":16801,"nodeType":"Return","src":"1262:11:127"}},{"expression":{"arguments":[{"id":16807,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16782,"src":"1332:6:127","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":16808,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16774,"src":"1340:6:127","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":16809,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16776,"src":"1348:4:127","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[{"id":16804,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16772,"src":"1306:8:127","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":16803,"name":"IERC677Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28095,"src":"1290:15:127","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC677Receiver_$28095_$","typeString":"type(contract IERC677Receiver)"}},"id":16805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1290:25:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC677Receiver_$28095","typeString":"contract IERC677Receiver"}},"id":16806,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1316:15:127","memberName":"onTokenTransfer","nodeType":"MemberAccess","referencedDeclaration":28094,"src":"1290:41:127","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory) external returns (bool)"}},"id":16810,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1290:63:127","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":16780,"id":16811,"nodeType":"Return","src":"1283:70:127"}]},"functionSelector":"4000aea0","id":16813,"implemented":true,"kind":"function","modifiers":[],"name":"transferAndCall","nameLocation":"1015:15:127","nodeType":"FunctionDefinition","parameters":{"id":16777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16772,"mutability":"mutable","name":"receiver","nameLocation":"1039:8:127","nodeType":"VariableDeclaration","scope":16813,"src":"1031:16:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":16771,"name":"address","nodeType":"ElementaryTypeName","src":"1031:7:127","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":16774,"mutability":"mutable","name":"amount","nameLocation":"1057:6:127","nodeType":"VariableDeclaration","scope":16813,"src":"1049:14:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":16773,"name":"uint256","nodeType":"ElementaryTypeName","src":"1049:7:127","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":16776,"mutability":"mutable","name":"data","nameLocation":"1080:4:127","nodeType":"VariableDeclaration","scope":16813,"src":"1065:19:127","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16775,"name":"bytes","nodeType":"ElementaryTypeName","src":"1065:5:127","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1030:55:127"},"returnParameters":{"id":16780,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16779,"mutability":"mutable","name":"success","nameLocation":"1109:7:127","nodeType":"VariableDeclaration","scope":16813,"src":"1104:12:127","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":16778,"name":"bool","nodeType":"ElementaryTypeName","src":"1104:4:127","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1103:14:127"},"scope":16814,"src":"1006:354:127","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":16815,"src":"533:829:127","usedErrors":[464,1216,1219,7886,8246,11559,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8287,27102,27111]}],"src":"32:1331:127"},"id":127},"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol","exportedSymbols":{"ERC20BatchTransfersFacet":[27192],"ERC20BatchTransfersFacetMock":[16842],"IForwarderRegistry":[13386]},"id":16843,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16816,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:128"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16818,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16843,"sourceUnit":13387,"src":"57:90:128","symbolAliases":[{"foreign":{"id":16817,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:128","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol","file":"./../../../../token/ERC20/facets/ERC20BatchTransfersFacet.sol","id":16820,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16843,"sourceUnit":27193,"src":"148:103:128","symbolAliases":[{"foreign":{"id":16819,"name":"ERC20BatchTransfersFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27192,"src":"156:24:128","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16821,"name":"ERC20BatchTransfersFacet","nameLocations":["294:24:128"],"nodeType":"IdentifierPath","referencedDeclaration":27192,"src":"294:24:128"},"id":16822,"nodeType":"InheritanceSpecifier","src":"294:24:128"}],"canonicalName":"ERC20BatchTransfersFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16842,"linearizedBaseContracts":[16842,27192,13297,26565,1206,27893],"name":"ERC20BatchTransfersFacetMock","nameLocation":"262:28:128","nodeType":"ContractDefinition","nodes":[{"body":{"id":16831,"nodeType":"Block","src":"419:2:128","statements":[]},"id":16832,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16828,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16825,"src":"400:17:128","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16829,"kind":"baseConstructorSpecifier","modifierName":{"id":16827,"name":"ERC20BatchTransfersFacet","nameLocations":["375:24:128"],"nodeType":"IdentifierPath","referencedDeclaration":27192,"src":"375:24:128"},"nodeType":"ModifierInvocation","src":"375:43:128"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16826,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16825,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"356:17:128","nodeType":"VariableDeclaration","scope":16832,"src":"337:36:128","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16824,"nodeType":"UserDefinedTypeName","pathNode":{"id":16823,"name":"IForwarderRegistry","nameLocations":["337:18:128"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"337:18:128"},"referencedDeclaration":13386,"src":"337:18:128","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"336:38:128"},"returnParameters":{"id":16830,"nodeType":"ParameterList","parameters":[],"src":"419:0:128"},"scope":16842,"src":"325:96:128","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16840,"nodeType":"Block","src":"487:34:128","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16837,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27191],"referencedDeclaration":27191,"src":"504:8:128","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16838,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"504:10:128","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16836,"id":16839,"nodeType":"Return","src":"497:17:128"}]},"functionSelector":"31e66e1e","id":16841,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"436:9:128","nodeType":"FunctionDefinition","parameters":{"id":16833,"nodeType":"ParameterList","parameters":[],"src":"445:2:128"},"returnParameters":{"id":16836,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16835,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16841,"src":"471:14:128","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16834,"name":"bytes","nodeType":"ElementaryTypeName","src":"471:5:128","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"470:16:128"},"scope":16842,"src":"427:94:128","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16843,"src":"253:270:128","usedErrors":[7886,11559,19183,27024,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:492:128"},"id":128},"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol","exportedSymbols":{"ERC20BurnableFacet":[27273],"ERC20BurnableFacetMock":[16870],"IForwarderRegistry":[13386]},"id":16871,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16844,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:129"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16846,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16871,"sourceUnit":13387,"src":"57:90:129","symbolAliases":[{"foreign":{"id":16845,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:129","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20BurnableFacet.sol","file":"./../../../../token/ERC20/facets/ERC20BurnableFacet.sol","id":16848,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16871,"sourceUnit":27274,"src":"148:91:129","symbolAliases":[{"foreign":{"id":16847,"name":"ERC20BurnableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27273,"src":"156:18:129","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16849,"name":"ERC20BurnableFacet","nameLocations":["276:18:129"],"nodeType":"IdentifierPath","referencedDeclaration":27273,"src":"276:18:129"},"id":16850,"nodeType":"InheritanceSpecifier","src":"276:18:129"}],"canonicalName":"ERC20BurnableFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16870,"linearizedBaseContracts":[16870,27273,13297,26654,1206,27927],"name":"ERC20BurnableFacetMock","nameLocation":"250:22:129","nodeType":"ContractDefinition","nodes":[{"body":{"id":16859,"nodeType":"Block","src":"389:2:129","statements":[]},"id":16860,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16856,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16853,"src":"370:17:129","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16857,"kind":"baseConstructorSpecifier","modifierName":{"id":16855,"name":"ERC20BurnableFacet","nameLocations":["351:18:129"],"nodeType":"IdentifierPath","referencedDeclaration":27273,"src":"351:18:129"},"nodeType":"ModifierInvocation","src":"351:37:129"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16854,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16853,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"332:17:129","nodeType":"VariableDeclaration","scope":16860,"src":"313:36:129","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16852,"nodeType":"UserDefinedTypeName","pathNode":{"id":16851,"name":"IForwarderRegistry","nameLocations":["313:18:129"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"313:18:129"},"referencedDeclaration":13386,"src":"313:18:129","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"312:38:129"},"returnParameters":{"id":16858,"nodeType":"ParameterList","parameters":[],"src":"389:0:129"},"scope":16870,"src":"301:90:129","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16868,"nodeType":"Block","src":"457:34:129","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16865,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27272],"referencedDeclaration":27272,"src":"474:8:129","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:129","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16864,"id":16867,"nodeType":"Return","src":"467:17:129"}]},"functionSelector":"31e66e1e","id":16869,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:129","nodeType":"FunctionDefinition","parameters":{"id":16861,"nodeType":"ParameterList","parameters":[],"src":"415:2:129"},"returnParameters":{"id":16864,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16863,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16869,"src":"441:14:129","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16862,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:129","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:129"},"scope":16870,"src":"397:94:129","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16871,"src":"241:252:129","usedErrors":[7886,11559,19183,27031,27042,27056],"usedEvents":[27102,27111]}],"src":"32:462:129"},"id":129},"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol","exportedSymbols":{"ERC20DetailedFacet":[27339],"ERC20DetailedFacetMock":[16898],"IForwarderRegistry":[13386]},"id":16899,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16872,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:130"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16874,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16899,"sourceUnit":13387,"src":"57:90:130","symbolAliases":[{"foreign":{"id":16873,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20DetailedFacet.sol","file":"./../../../../token/ERC20/facets/ERC20DetailedFacet.sol","id":16876,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16899,"sourceUnit":27340,"src":"148:91:130","symbolAliases":[{"foreign":{"id":16875,"name":"ERC20DetailedFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27339,"src":"156:18:130","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16877,"name":"ERC20DetailedFacet","nameLocations":["276:18:130"],"nodeType":"IdentifierPath","referencedDeclaration":27339,"src":"276:18:130"},"id":16878,"nodeType":"InheritanceSpecifier","src":"276:18:130"}],"canonicalName":"ERC20DetailedFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16898,"linearizedBaseContracts":[16898,27339,13297,26707,27949],"name":"ERC20DetailedFacetMock","nameLocation":"250:22:130","nodeType":"ContractDefinition","nodes":[{"body":{"id":16887,"nodeType":"Block","src":"389:2:130","statements":[]},"id":16888,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16884,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16881,"src":"370:17:130","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16885,"kind":"baseConstructorSpecifier","modifierName":{"id":16883,"name":"ERC20DetailedFacet","nameLocations":["351:18:130"],"nodeType":"IdentifierPath","referencedDeclaration":27339,"src":"351:18:130"},"nodeType":"ModifierInvocation","src":"351:37:130"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16882,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16881,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"332:17:130","nodeType":"VariableDeclaration","scope":16888,"src":"313:36:130","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16880,"nodeType":"UserDefinedTypeName","pathNode":{"id":16879,"name":"IForwarderRegistry","nameLocations":["313:18:130"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"313:18:130"},"referencedDeclaration":13386,"src":"313:18:130","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"312:38:130"},"returnParameters":{"id":16886,"nodeType":"ParameterList","parameters":[],"src":"389:0:130"},"scope":16898,"src":"301:90:130","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16896,"nodeType":"Block","src":"457:34:130","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16893,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13296,"src":"474:8:130","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16894,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:130","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16892,"id":16895,"nodeType":"Return","src":"467:17:130"}]},"functionSelector":"31e66e1e","id":16897,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:130","nodeType":"FunctionDefinition","parameters":{"id":16889,"nodeType":"ParameterList","parameters":[],"src":"415:2:130"},"returnParameters":{"id":16892,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16891,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16897,"src":"441:14:130","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16890,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:130","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:130"},"scope":16898,"src":"397:94:130","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16899,"src":"241:252:130","usedErrors":[11559,19183,19192],"usedEvents":[]}],"src":"32:462:130"},"id":130},"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol","exportedSymbols":{"ERC20Facet":[27451],"ERC20FacetMock":[16926],"IForwarderRegistry":[13386]},"id":16927,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16900,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:131"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16902,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16927,"sourceUnit":13387,"src":"57:90:131","symbolAliases":[{"foreign":{"id":16901,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20Facet.sol","file":"./../../../../token/ERC20/facets/ERC20Facet.sol","id":16904,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16927,"sourceUnit":27452,"src":"148:75:131","symbolAliases":[{"foreign":{"id":16903,"name":"ERC20Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27451,"src":"156:10:131","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16905,"name":"ERC20Facet","nameLocations":["252:10:131"],"nodeType":"IdentifierPath","referencedDeclaration":27451,"src":"252:10:131"},"id":16906,"nodeType":"InheritanceSpecifier","src":"252:10:131"}],"canonicalName":"ERC20FacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16926,"linearizedBaseContracts":[16926,27451,13297,26492,1206,27863,27839],"name":"ERC20FacetMock","nameLocation":"234:14:131","nodeType":"ContractDefinition","nodes":[{"body":{"id":16915,"nodeType":"Block","src":"349:2:131","statements":[]},"id":16916,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16912,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16909,"src":"330:17:131","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16913,"kind":"baseConstructorSpecifier","modifierName":{"id":16911,"name":"ERC20Facet","nameLocations":["319:10:131"],"nodeType":"IdentifierPath","referencedDeclaration":27451,"src":"319:10:131"},"nodeType":"ModifierInvocation","src":"319:29:131"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16909,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"300:17:131","nodeType":"VariableDeclaration","scope":16916,"src":"281:36:131","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16908,"nodeType":"UserDefinedTypeName","pathNode":{"id":16907,"name":"IForwarderRegistry","nameLocations":["281:18:131"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"281:18:131"},"referencedDeclaration":13386,"src":"281:18:131","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"280:38:131"},"returnParameters":{"id":16914,"nodeType":"ParameterList","parameters":[],"src":"349:0:131"},"scope":16926,"src":"269:82:131","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16924,"nodeType":"Block","src":"417:34:131","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16921,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27450],"referencedDeclaration":27450,"src":"434:8:131","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16922,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"434:10:131","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16920,"id":16923,"nodeType":"Return","src":"427:17:131"}]},"functionSelector":"31e66e1e","id":16925,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"366:9:131","nodeType":"FunctionDefinition","parameters":{"id":16917,"nodeType":"ParameterList","parameters":[],"src":"375:2:131"},"returnParameters":{"id":16920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16919,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16925,"src":"401:14:131","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16918,"name":"bytes","nodeType":"ElementaryTypeName","src":"401:5:131","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"400:16:131"},"scope":16926,"src":"357:94:131","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16927,"src":"225:228:131","usedErrors":[7886,11559,19183,19192,27019,27031,27042,27047,27056,27061,27064,27071],"usedEvents":[27102,27111]}],"src":"32:422:131"},"id":131},"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol","exportedSymbols":{"ERC20MetadataFacet":[27532],"ERC20MetadataFacetMock":[16954],"IForwarderRegistry":[13386]},"id":16955,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16928,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:132"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16930,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16955,"sourceUnit":13387,"src":"57:90:132","symbolAliases":[{"foreign":{"id":16929,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20MetadataFacet.sol","file":"./../../../../token/ERC20/facets/ERC20MetadataFacet.sol","id":16932,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16955,"sourceUnit":27533,"src":"148:91:132","symbolAliases":[{"foreign":{"id":16931,"name":"ERC20MetadataFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27532,"src":"156:18:132","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16933,"name":"ERC20MetadataFacet","nameLocations":["276:18:132"],"nodeType":"IdentifierPath","referencedDeclaration":27532,"src":"276:18:132"},"id":16934,"nodeType":"InheritanceSpecifier","src":"276:18:132"}],"canonicalName":"ERC20MetadataFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16954,"linearizedBaseContracts":[16954,27532,13297,26768,1206,27959],"name":"ERC20MetadataFacetMock","nameLocation":"250:22:132","nodeType":"ContractDefinition","nodes":[{"body":{"id":16943,"nodeType":"Block","src":"389:2:132","statements":[]},"id":16944,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16940,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16937,"src":"370:17:132","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16941,"kind":"baseConstructorSpecifier","modifierName":{"id":16939,"name":"ERC20MetadataFacet","nameLocations":["351:18:132"],"nodeType":"IdentifierPath","referencedDeclaration":27532,"src":"351:18:132"},"nodeType":"ModifierInvocation","src":"351:37:132"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16938,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16937,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"332:17:132","nodeType":"VariableDeclaration","scope":16944,"src":"313:36:132","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16936,"nodeType":"UserDefinedTypeName","pathNode":{"id":16935,"name":"IForwarderRegistry","nameLocations":["313:18:132"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"313:18:132"},"referencedDeclaration":13386,"src":"313:18:132","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"312:38:132"},"returnParameters":{"id":16942,"nodeType":"ParameterList","parameters":[],"src":"389:0:132"},"scope":16954,"src":"301:90:132","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16952,"nodeType":"Block","src":"457:34:132","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16949,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27531],"referencedDeclaration":27531,"src":"474:8:132","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:132","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16948,"id":16951,"nodeType":"Return","src":"467:17:132"}]},"functionSelector":"31e66e1e","id":16953,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:132","nodeType":"FunctionDefinition","parameters":{"id":16945,"nodeType":"ParameterList","parameters":[],"src":"415:2:132"},"returnParameters":{"id":16948,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16947,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16953,"src":"441:14:132","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16946,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:132","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:132"},"scope":16954,"src":"397:94:132","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16955,"src":"241:252:132","usedErrors":[8246,11559,19183],"usedEvents":[]}],"src":"32:462:132"},"id":132},"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol","exportedSymbols":{"ERC20MintableFacet":[27613],"ERC20MintableFacetMock":[16982],"IForwarderRegistry":[13386]},"id":16983,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16956,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:133"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16958,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16983,"sourceUnit":13387,"src":"57:90:133","symbolAliases":[{"foreign":{"id":16957,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20MintableFacet.sol","file":"./../../../../token/ERC20/facets/ERC20MintableFacet.sol","id":16960,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":16983,"sourceUnit":27614,"src":"148:91:133","symbolAliases":[{"foreign":{"id":16959,"name":"ERC20MintableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27613,"src":"156:18:133","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16961,"name":"ERC20MintableFacet","nameLocations":["276:18:133"],"nodeType":"IdentifierPath","referencedDeclaration":27613,"src":"276:18:133"},"id":16962,"nodeType":"InheritanceSpecifier","src":"276:18:133"}],"canonicalName":"ERC20MintableFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":16982,"linearizedBaseContracts":[16982,27613,13297,26853,1206,27981],"name":"ERC20MintableFacetMock","nameLocation":"250:22:133","nodeType":"ContractDefinition","nodes":[{"body":{"id":16971,"nodeType":"Block","src":"389:2:133","statements":[]},"id":16972,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16968,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16965,"src":"370:17:133","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16969,"kind":"baseConstructorSpecifier","modifierName":{"id":16967,"name":"ERC20MintableFacet","nameLocations":["351:18:133"],"nodeType":"IdentifierPath","referencedDeclaration":27613,"src":"351:18:133"},"nodeType":"ModifierInvocation","src":"351:37:133"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16966,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16965,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"332:17:133","nodeType":"VariableDeclaration","scope":16972,"src":"313:36:133","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16964,"nodeType":"UserDefinedTypeName","pathNode":{"id":16963,"name":"IForwarderRegistry","nameLocations":["313:18:133"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"313:18:133"},"referencedDeclaration":13386,"src":"313:18:133","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"312:38:133"},"returnParameters":{"id":16970,"nodeType":"ParameterList","parameters":[],"src":"389:0:133"},"scope":16982,"src":"301:90:133","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":16980,"nodeType":"Block","src":"457:34:133","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":16977,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27612],"referencedDeclaration":27612,"src":"474:8:133","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":16978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:133","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":16976,"id":16979,"nodeType":"Return","src":"467:17:133"}]},"functionSelector":"31e66e1e","id":16981,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:133","nodeType":"FunctionDefinition","parameters":{"id":16973,"nodeType":"ParameterList","parameters":[],"src":"415:2:133"},"returnParameters":{"id":16976,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16975,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":16981,"src":"441:14:133","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":16974,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:133","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:133"},"scope":16982,"src":"397:94:133","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":16983,"src":"241:252:133","usedErrors":[7886,8223,11559,19183,27061,27064,27071],"usedEvents":[27102]}],"src":"32:462:133"},"id":133},"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol","exportedSymbols":{"ERC20PermitFacet":[27698],"ERC20PermitFacetMock":[17010],"IForwarderRegistry":[13386]},"id":17011,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":16984,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:134"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":16986,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17011,"sourceUnit":13387,"src":"57:90:134","symbolAliases":[{"foreign":{"id":16985,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20PermitFacet.sol","file":"./../../../../token/ERC20/facets/ERC20PermitFacet.sol","id":16988,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17011,"sourceUnit":27699,"src":"148:87:134","symbolAliases":[{"foreign":{"id":16987,"name":"ERC20PermitFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27698,"src":"156:16:134","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":16989,"name":"ERC20PermitFacet","nameLocations":["270:16:134"],"nodeType":"IdentifierPath","referencedDeclaration":27698,"src":"270:16:134"},"id":16990,"nodeType":"InheritanceSpecifier","src":"270:16:134"}],"canonicalName":"ERC20PermitFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17010,"linearizedBaseContracts":[17010,27698,13297,26931,1206,28017],"name":"ERC20PermitFacetMock","nameLocation":"246:20:134","nodeType":"ContractDefinition","nodes":[{"body":{"id":16999,"nodeType":"Block","src":"379:2:134","statements":[]},"id":17000,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":16996,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":16993,"src":"360:17:134","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":16997,"kind":"baseConstructorSpecifier","modifierName":{"id":16995,"name":"ERC20PermitFacet","nameLocations":["343:16:134"],"nodeType":"IdentifierPath","referencedDeclaration":27698,"src":"343:16:134"},"nodeType":"ModifierInvocation","src":"343:35:134"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":16994,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16993,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"324:17:134","nodeType":"VariableDeclaration","scope":17000,"src":"305:36:134","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":16992,"nodeType":"UserDefinedTypeName","pathNode":{"id":16991,"name":"IForwarderRegistry","nameLocations":["305:18:134"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"305:18:134"},"referencedDeclaration":13386,"src":"305:18:134","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"304:38:134"},"returnParameters":{"id":16998,"nodeType":"ParameterList","parameters":[],"src":"379:0:134"},"scope":17010,"src":"293:88:134","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17008,"nodeType":"Block","src":"447:34:134","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17005,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27697],"referencedDeclaration":27697,"src":"464:8:134","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"464:10:134","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17004,"id":17007,"nodeType":"Return","src":"457:17:134"}]},"functionSelector":"31e66e1e","id":17009,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"396:9:134","nodeType":"FunctionDefinition","parameters":{"id":17001,"nodeType":"ParameterList","parameters":[],"src":"405:2:134"},"returnParameters":{"id":17004,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17003,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17009,"src":"431:14:134","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17002,"name":"bytes","nodeType":"ElementaryTypeName","src":"431:5:134","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"430:16:134"},"scope":17010,"src":"387:94:134","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17011,"src":"237:246:134","usedErrors":[11559,19183,27031,27076,27081,27084],"usedEvents":[27111]}],"src":"32:452:134"},"id":134},"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol","exportedSymbols":{"ERC20SafeTransfersFacet":[27779],"ERC20SafeTransfersFacetMock":[17038],"IForwarderRegistry":[13386]},"id":17039,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17012,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:135"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17014,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17039,"sourceUnit":13387,"src":"57:90:135","symbolAliases":[{"foreign":{"id":17013,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol","file":"./../../../../token/ERC20/facets/ERC20SafeTransfersFacet.sol","id":17016,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17039,"sourceUnit":27780,"src":"148:101:135","symbolAliases":[{"foreign":{"id":17015,"name":"ERC20SafeTransfersFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27779,"src":"156:23:135","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17017,"name":"ERC20SafeTransfersFacet","nameLocations":["291:23:135"],"nodeType":"IdentifierPath","referencedDeclaration":27779,"src":"291:23:135"},"id":17018,"nodeType":"InheritanceSpecifier","src":"291:23:135"}],"canonicalName":"ERC20SafeTransfersFacetMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17038,"linearizedBaseContracts":[17038,27779,13297,27006,1206,28065],"name":"ERC20SafeTransfersFacetMock","nameLocation":"260:27:135","nodeType":"ContractDefinition","nodes":[{"body":{"id":17027,"nodeType":"Block","src":"414:2:135","statements":[]},"id":17028,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17024,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17021,"src":"395:17:135","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17025,"kind":"baseConstructorSpecifier","modifierName":{"id":17023,"name":"ERC20SafeTransfersFacet","nameLocations":["371:23:135"],"nodeType":"IdentifierPath","referencedDeclaration":27779,"src":"371:23:135"},"nodeType":"ModifierInvocation","src":"371:42:135"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17022,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17021,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"352:17:135","nodeType":"VariableDeclaration","scope":17028,"src":"333:36:135","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17020,"nodeType":"UserDefinedTypeName","pathNode":{"id":17019,"name":"IForwarderRegistry","nameLocations":["333:18:135"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"333:18:135"},"referencedDeclaration":13386,"src":"333:18:135","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"332:38:135"},"returnParameters":{"id":17026,"nodeType":"ParameterList","parameters":[],"src":"414:0:135"},"scope":17038,"src":"321:95:135","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17036,"nodeType":"Block","src":"482:34:135","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17033,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[27778],"referencedDeclaration":27778,"src":"499:8:135","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17034,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"499:10:135","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17032,"id":17035,"nodeType":"Return","src":"492:17:135"}]},"functionSelector":"31e66e1e","id":17037,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"431:9:135","nodeType":"FunctionDefinition","parameters":{"id":17029,"nodeType":"ParameterList","parameters":[],"src":"440:2:135"},"returnParameters":{"id":17032,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17031,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17037,"src":"466:14:135","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17030,"name":"bytes","nodeType":"ElementaryTypeName","src":"466:5:135","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"465:16:135"},"scope":17038,"src":"422:94:135","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17039,"src":"251:267:135","usedErrors":[11559,19183,27031,27042,27047,27056,27091],"usedEvents":[27102,27111]}],"src":"32:487:135"},"id":135},"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol","exportedSymbols":{"ERC20FixedSupply":[30257],"ERC20FixedSupplyMock":[17083],"IForwarderRegistry":[13386]},"id":17084,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17040,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:136"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17042,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17084,"sourceUnit":13387,"src":"57:90:136","symbolAliases":[{"foreign":{"id":17041,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:136","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/preset/ERC20FixedSupply.sol","file":"./../../../../token/ERC20/preset/ERC20FixedSupply.sol","id":17044,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17084,"sourceUnit":30258,"src":"148:87:136","symbolAliases":[{"foreign":{"id":17043,"name":"ERC20FixedSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30257,"src":"156:16:136","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17045,"name":"ERC20FixedSupply","nameLocations":["270:16:136"],"nodeType":"IdentifierPath","referencedDeclaration":30257,"src":"270:16:136"},"id":17046,"nodeType":"InheritanceSpecifier","src":"270:16:136"}],"canonicalName":"ERC20FixedSupplyMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17083,"linearizedBaseContracts":[17083,30257,13142,13370,13297,19661,26113,26565,26299,27006,26244,26931,26196,7934,26168,26707,27949,26093,11554,11579,8139,19810,26768,26492,1206,8562,19938,27893,28065,28017,27959,27863,27839],"name":"ERC20FixedSupplyMock","nameLocation":"246:20:136","nodeType":"ContractDefinition","nodes":[{"body":{"id":17072,"nodeType":"Block","src":"623:2:136","statements":[]},"id":17073,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17064,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17048,"src":"543:9:136","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17065,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17050,"src":"554:11:136","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17066,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17052,"src":"567:13:136","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":17067,"name":"holders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17055,"src":"582:7:136","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},{"id":17068,"name":"allocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17058,"src":"591:11:136","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":17069,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17061,"src":"604:17:136","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17070,"kind":"baseConstructorSpecifier","modifierName":{"id":17063,"name":"ERC20FixedSupply","nameLocations":["526:16:136"],"nodeType":"IdentifierPath","referencedDeclaration":30257,"src":"526:16:136"},"nodeType":"ModifierInvocation","src":"526:96:136"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17062,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17048,"mutability":"mutable","name":"tokenName","nameLocation":"328:9:136","nodeType":"VariableDeclaration","scope":17073,"src":"314:23:136","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17047,"name":"string","nodeType":"ElementaryTypeName","src":"314:6:136","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17050,"mutability":"mutable","name":"tokenSymbol","nameLocation":"361:11:136","nodeType":"VariableDeclaration","scope":17073,"src":"347:25:136","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17049,"name":"string","nodeType":"ElementaryTypeName","src":"347:6:136","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17052,"mutability":"mutable","name":"tokenDecimals","nameLocation":"388:13:136","nodeType":"VariableDeclaration","scope":17073,"src":"382:19:136","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":17051,"name":"uint8","nodeType":"ElementaryTypeName","src":"382:5:136","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":17055,"mutability":"mutable","name":"holders","nameLocation":"428:7:136","nodeType":"VariableDeclaration","scope":17073,"src":"411:24:136","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":17053,"name":"address","nodeType":"ElementaryTypeName","src":"411:7:136","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":17054,"nodeType":"ArrayTypeName","src":"411:9:136","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":17058,"mutability":"mutable","name":"allocations","nameLocation":"462:11:136","nodeType":"VariableDeclaration","scope":17073,"src":"445:28:136","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":17056,"name":"uint256","nodeType":"ElementaryTypeName","src":"445:7:136","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":17057,"nodeType":"ArrayTypeName","src":"445:9:136","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":17061,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"502:17:136","nodeType":"VariableDeclaration","scope":17073,"src":"483:36:136","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17060,"nodeType":"UserDefinedTypeName","pathNode":{"id":17059,"name":"IForwarderRegistry","nameLocations":["483:18:136"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"483:18:136"},"referencedDeclaration":13386,"src":"483:18:136","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"304:221:136"},"returnParameters":{"id":17071,"nodeType":"ParameterList","parameters":[],"src":"623:0:136"},"scope":17083,"src":"293:332:136","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17081,"nodeType":"Block","src":"691:34:136","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17078,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[30256],"referencedDeclaration":30256,"src":"708:8:136","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"708:10:136","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17077,"id":17080,"nodeType":"Return","src":"701:17:136"}]},"functionSelector":"31e66e1e","id":17082,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"640:9:136","nodeType":"FunctionDefinition","parameters":{"id":17074,"nodeType":"ParameterList","parameters":[],"src":"649:2:136"},"returnParameters":{"id":17077,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17076,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17082,"src":"675:14:136","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17075,"name":"bytes","nodeType":"ElementaryTypeName","src":"675:5:136","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"674:16:136"},"scope":17083,"src":"631:94:136","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17084,"src":"237:490:136","usedErrors":[464,1216,1219,7886,8246,11559,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8287,27102,27111]}],"src":"32:696:136"},"id":136},"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol","exportedSymbols":{"ERC20MintBurn":[30362],"ERC20MintBurnMock":[17120],"IForwarderRegistry":[13386]},"id":17121,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17085,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:137"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17087,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17121,"sourceUnit":13387,"src":"57:90:137","symbolAliases":[{"foreign":{"id":17086,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:137","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/preset/ERC20MintBurn.sol","file":"./../../../../token/ERC20/preset/ERC20MintBurn.sol","id":17089,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17121,"sourceUnit":30363,"src":"148:81:137","symbolAliases":[{"foreign":{"id":17088,"name":"ERC20MintBurn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30362,"src":"156:13:137","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17090,"name":"ERC20MintBurn","nameLocations":["261:13:137"],"nodeType":"IdentifierPath","referencedDeclaration":30362,"src":"261:13:137"},"id":17091,"nodeType":"InheritanceSpecifier","src":"261:13:137"}],"canonicalName":"ERC20MintBurnMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17120,"linearizedBaseContracts":[17120,30362,13142,13370,13297,19661,26133,26654,26220,7901,26113,26565,26299,27006,26244,26931,26196,7934,26168,26707,27949,26093,11554,11579,8139,19810,8091,26853,26768,26492,1206,8562,19938,27927,8546,27981,27893,28065,28017,27959,27863,27839],"name":"ERC20MintBurnMock","nameLocation":"240:17:137","nodeType":"ContractDefinition","nodes":[{"body":{"id":17109,"nodeType":"Block","src":"514:2:137","statements":[]},"id":17110,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17103,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17093,"src":"456:9:137","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17104,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17095,"src":"467:11:137","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17105,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17097,"src":"480:13:137","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":17106,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17100,"src":"495:17:137","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17107,"kind":"baseConstructorSpecifier","modifierName":{"id":17102,"name":"ERC20MintBurn","nameLocations":["442:13:137"],"nodeType":"IdentifierPath","referencedDeclaration":30362,"src":"442:13:137"},"nodeType":"ModifierInvocation","src":"442:71:137"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17093,"mutability":"mutable","name":"tokenName","nameLocation":"316:9:137","nodeType":"VariableDeclaration","scope":17110,"src":"302:23:137","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17092,"name":"string","nodeType":"ElementaryTypeName","src":"302:6:137","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17095,"mutability":"mutable","name":"tokenSymbol","nameLocation":"349:11:137","nodeType":"VariableDeclaration","scope":17110,"src":"335:25:137","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17094,"name":"string","nodeType":"ElementaryTypeName","src":"335:6:137","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17097,"mutability":"mutable","name":"tokenDecimals","nameLocation":"376:13:137","nodeType":"VariableDeclaration","scope":17110,"src":"370:19:137","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":17096,"name":"uint8","nodeType":"ElementaryTypeName","src":"370:5:137","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":17100,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"418:17:137","nodeType":"VariableDeclaration","scope":17110,"src":"399:36:137","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17099,"nodeType":"UserDefinedTypeName","pathNode":{"id":17098,"name":"IForwarderRegistry","nameLocations":["399:18:137"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"399:18:137"},"referencedDeclaration":13386,"src":"399:18:137","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"292:149:137"},"returnParameters":{"id":17108,"nodeType":"ParameterList","parameters":[],"src":"514:0:137"},"scope":17120,"src":"281:235:137","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17118,"nodeType":"Block","src":"582:34:137","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17115,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[30361],"referencedDeclaration":30361,"src":"599:8:137","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"599:10:137","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17114,"id":17117,"nodeType":"Return","src":"592:17:137"}]},"functionSelector":"31e66e1e","id":17119,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"531:9:137","nodeType":"FunctionDefinition","parameters":{"id":17111,"nodeType":"ParameterList","parameters":[],"src":"540:2:137"},"returnParameters":{"id":17114,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17113,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17119,"src":"566:14:137","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17112,"name":"bytes","nodeType":"ElementaryTypeName","src":"566:5:137","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"565:16:137"},"scope":17120,"src":"522:94:137","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17121,"src":"231:387:137","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8269,8278,8287,27102,27111]}],"src":"32:587:137"},"id":137},"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol","exportedSymbols":{"ERC20FixedSupplyProxied":[30541],"ERC20FixedSupplyProxiedMock":[17148],"IForwarderRegistry":[13386]},"id":17149,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17122,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:138"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":17124,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17149,"sourceUnit":13387,"src":"57:93:138","symbolAliases":[{"foreign":{"id":17123,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:138","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol","file":"./../../../../../token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol","id":17126,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17149,"sourceUnit":30542,"src":"151:112:138","symbolAliases":[{"foreign":{"id":17125,"name":"ERC20FixedSupplyProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30541,"src":"159:23:138","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17127,"name":"ERC20FixedSupplyProxied","nameLocations":["305:23:138"],"nodeType":"IdentifierPath","referencedDeclaration":30541,"src":"305:23:138"},"id":17128,"nodeType":"InheritanceSpecifier","src":"305:23:138"}],"canonicalName":"ERC20FixedSupplyProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17148,"linearizedBaseContracts":[17148,30541,13142,13370,13297,8139,19810,11554,11579,26565,27006,26931,26768,26707,27949,26492,1206,8562,19938,27893,28065,28017,27959,27863,27839],"name":"ERC20FixedSupplyProxiedMock","nameLocation":"274:27:138","nodeType":"ContractDefinition","nodes":[{"body":{"id":17137,"nodeType":"Block","src":"428:2:138","statements":[]},"id":17138,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17134,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17131,"src":"409:17:138","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17135,"kind":"baseConstructorSpecifier","modifierName":{"id":17133,"name":"ERC20FixedSupplyProxied","nameLocations":["385:23:138"],"nodeType":"IdentifierPath","referencedDeclaration":30541,"src":"385:23:138"},"nodeType":"ModifierInvocation","src":"385:42:138"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17132,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17131,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"366:17:138","nodeType":"VariableDeclaration","scope":17138,"src":"347:36:138","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17130,"nodeType":"UserDefinedTypeName","pathNode":{"id":17129,"name":"IForwarderRegistry","nameLocations":["347:18:138"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"347:18:138"},"referencedDeclaration":13386,"src":"347:18:138","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"346:38:138"},"returnParameters":{"id":17136,"nodeType":"ParameterList","parameters":[],"src":"428:0:138"},"scope":17148,"src":"335:95:138","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17146,"nodeType":"Block","src":"496:34:138","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17143,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[30540],"referencedDeclaration":30540,"src":"513:8:138","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17144,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"513:10:138","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17142,"id":17145,"nodeType":"Return","src":"506:17:138"}]},"functionSelector":"31e66e1e","id":17147,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"445:9:138","nodeType":"FunctionDefinition","parameters":{"id":17139,"nodeType":"ParameterList","parameters":[],"src":"454:2:138"},"returnParameters":{"id":17142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17141,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17147,"src":"480:14:138","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17140,"name":"bytes","nodeType":"ElementaryTypeName","src":"480:5:138","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"479:16:138"},"scope":17148,"src":"436:94:138","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17149,"src":"265:267:138","usedErrors":[464,1216,1219,7886,8246,11559,19192,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8287,27102,27111]}],"src":"32:501:138"},"id":138},"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol","exportedSymbols":{"ERC20MintBurnProxied":[30723],"ERC20MintBurnProxiedMock":[17176],"IForwarderRegistry":[13386]},"id":17177,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17150,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:139"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":17152,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17177,"sourceUnit":13387,"src":"57:93:139","symbolAliases":[{"foreign":{"id":17151,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:139","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol","file":"./../../../../../token/ERC20/preset/proxied/ERC20MintBurnProxied.sol","id":17154,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17177,"sourceUnit":30724,"src":"151:106:139","symbolAliases":[{"foreign":{"id":17153,"name":"ERC20MintBurnProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30723,"src":"159:20:139","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17155,"name":"ERC20MintBurnProxied","nameLocations":["296:20:139"],"nodeType":"IdentifierPath","referencedDeclaration":30723,"src":"296:20:139"},"id":17156,"nodeType":"InheritanceSpecifier","src":"296:20:139"}],"canonicalName":"ERC20MintBurnProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17176,"linearizedBaseContracts":[17176,30723,13142,13370,13297,8139,19810,11554,11579,8091,26654,26853,26565,27006,26768,26931,26707,27949,26492,1206,8562,19938,8546,27927,27981,27893,28065,27959,28017,27863,27839],"name":"ERC20MintBurnProxiedMock","nameLocation":"268:24:139","nodeType":"ContractDefinition","nodes":[{"body":{"id":17165,"nodeType":"Block","src":"413:2:139","statements":[]},"id":17166,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17162,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17159,"src":"394:17:139","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17163,"kind":"baseConstructorSpecifier","modifierName":{"id":17161,"name":"ERC20MintBurnProxied","nameLocations":["373:20:139"],"nodeType":"IdentifierPath","referencedDeclaration":30723,"src":"373:20:139"},"nodeType":"ModifierInvocation","src":"373:39:139"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17160,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17159,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"354:17:139","nodeType":"VariableDeclaration","scope":17166,"src":"335:36:139","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17158,"nodeType":"UserDefinedTypeName","pathNode":{"id":17157,"name":"IForwarderRegistry","nameLocations":["335:18:139"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"335:18:139"},"referencedDeclaration":13386,"src":"335:18:139","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"334:38:139"},"returnParameters":{"id":17164,"nodeType":"ParameterList","parameters":[],"src":"413:0:139"},"scope":17176,"src":"323:92:139","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17174,"nodeType":"Block","src":"481:34:139","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17171,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[30722],"referencedDeclaration":30722,"src":"498:8:139","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17172,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"498:10:139","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17170,"id":17173,"nodeType":"Return","src":"491:17:139"}]},"functionSelector":"31e66e1e","id":17175,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"430:9:139","nodeType":"FunctionDefinition","parameters":{"id":17167,"nodeType":"ParameterList","parameters":[],"src":"439:2:139"},"returnParameters":{"id":17170,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17169,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17175,"src":"465:14:139","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17168,"name":"bytes","nodeType":"ElementaryTypeName","src":"465:5:139","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"464:16:139"},"scope":17176,"src":"421:94:139","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17177,"src":"259:258:139","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8269,8278,8287,27102,27111]}],"src":"32:486:139"},"id":139},"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol","exportedSymbols":{"ERC721Receiver":[30983],"ERC721ReceiverMock":[17262],"ERC721Storage":[34972],"IERC721Receiver":[33217]},"id":17263,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17178,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:140"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Receiver.sol","file":"./../../../token/ERC721/interfaces/IERC721Receiver.sol","id":17180,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17263,"sourceUnit":33218,"src":"57:87:140","symbolAliases":[{"foreign":{"id":17179,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"65:15:140","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../../../token/ERC721/libraries/ERC721Storage.sol","id":17182,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17263,"sourceUnit":34973,"src":"145:82:140","symbolAliases":[{"foreign":{"id":17181,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:140","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Receiver.sol","file":"./../../../token/ERC721/ERC721Receiver.sol","id":17184,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17263,"sourceUnit":30984,"src":"228:74:140","symbolAliases":[{"foreign":{"id":17183,"name":"ERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30983,"src":"236:14:140","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17186,"name":"ERC721Receiver","nameLocations":["367:14:140"],"nodeType":"IdentifierPath","referencedDeclaration":30983,"src":"367:14:140"},"id":17187,"nodeType":"InheritanceSpecifier","src":"367:14:140"}],"canonicalName":"ERC721ReceiverMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17185,"nodeType":"StructuredDocumentation","src":"304:32:140","text":"@title ERC721 Receiver Mock"},"fullyImplemented":true,"id":17262,"linearizedBaseContracts":[17262,30983,11554,11579,33217],"name":"ERC721ReceiverMock","nameLocation":"345:18:140","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":17189,"mutability":"immutable","name":"_ACCEPT_721","nameLocation":"412:11:140","nodeType":"VariableDeclaration","scope":17262,"src":"388:35:140","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17188,"name":"bool","nodeType":"ElementaryTypeName","src":"388:4:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":17191,"mutability":"immutable","name":"_TOKEN_ADDRESS_721","nameLocation":"456:18:140","nodeType":"VariableDeclaration","scope":17262,"src":"429:45:140","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17190,"name":"address","nodeType":"ElementaryTypeName","src":"429:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"anonymous":false,"eventSelector":"a05d90f300156ad1b545bc5d8197024456f21d22a708f5af04dd293e3d605251","id":17201,"name":"ERC721Received","nameLocation":"487:14:140","nodeType":"EventDefinition","parameters":{"id":17200,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17193,"indexed":false,"mutability":"mutable","name":"operator","nameLocation":"510:8:140","nodeType":"VariableDeclaration","scope":17201,"src":"502:16:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17192,"name":"address","nodeType":"ElementaryTypeName","src":"502:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17195,"indexed":false,"mutability":"mutable","name":"from","nameLocation":"528:4:140","nodeType":"VariableDeclaration","scope":17201,"src":"520:12:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17194,"name":"address","nodeType":"ElementaryTypeName","src":"520:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17197,"indexed":false,"mutability":"mutable","name":"tokenId","nameLocation":"542:7:140","nodeType":"VariableDeclaration","scope":17201,"src":"534:15:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17196,"name":"uint256","nodeType":"ElementaryTypeName","src":"534:7:140","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17199,"indexed":false,"mutability":"mutable","name":"data","nameLocation":"557:4:140","nodeType":"VariableDeclaration","scope":17201,"src":"551:10:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17198,"name":"bytes","nodeType":"ElementaryTypeName","src":"551:5:140","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"501:61:140"},"src":"481:82:140"},{"errorSelector":"a0f3feea","id":17203,"name":"WrongToken","nameLocation":"575:10:140","nodeType":"ErrorDefinition","parameters":{"id":17202,"nodeType":"ParameterList","parameters":[],"src":"585:2:140"},"src":"569:19:140"},{"body":{"id":17220,"nodeType":"Block","src":"661:83:140","statements":[{"expression":{"id":17214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17212,"name":"_ACCEPT_721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17189,"src":"671:11:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":17213,"name":"accept721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17205,"src":"685:9:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"671:23:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17215,"nodeType":"ExpressionStatement","src":"671:23:140"},{"expression":{"id":17218,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17216,"name":"_TOKEN_ADDRESS_721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17191,"src":"704:18:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":17217,"name":"tokenAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17207,"src":"725:12:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"704:33:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":17219,"nodeType":"ExpressionStatement","src":"704:33:140"}]},"id":17221,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[],"id":17210,"kind":"baseConstructorSpecifier","modifierName":{"id":17209,"name":"ERC721Receiver","nameLocations":["644:14:140"],"nodeType":"IdentifierPath","referencedDeclaration":30983,"src":"644:14:140"},"nodeType":"ModifierInvocation","src":"644:16:140"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17208,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17205,"mutability":"mutable","name":"accept721","nameLocation":"611:9:140","nodeType":"VariableDeclaration","scope":17221,"src":"606:14:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17204,"name":"bool","nodeType":"ElementaryTypeName","src":"606:4:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":17207,"mutability":"mutable","name":"tokenAddress","nameLocation":"630:12:140","nodeType":"VariableDeclaration","scope":17221,"src":"622:20:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17206,"name":"address","nodeType":"ElementaryTypeName","src":"622:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"605:38:140"},"returnParameters":{"id":17211,"nodeType":"ParameterList","parameters":[],"src":"661:0:140"},"scope":17262,"src":"594:150:140","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[33216],"body":{"id":17260,"nodeType":"Block","src":"1123:266:140","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":17239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":17236,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1137:3:140","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":17237,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1141:6:140","memberName":"sender","nodeType":"MemberAccess","src":"1137:10:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":17238,"name":"_TOKEN_ADDRESS_721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17191,"src":"1151:18:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1137:32:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17243,"nodeType":"IfStatement","src":"1133:57:140","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":17240,"name":"WrongToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17203,"src":"1178:10:140","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":17241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1178:12:140","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":17242,"nodeType":"RevertStatement","src":"1171:19:140"}},{"condition":{"id":17244,"name":"_ACCEPT_721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17189,"src":"1204:11:140","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":17258,"nodeType":"Block","src":"1348:35:140","statements":[{"expression":{"hexValue":"307830","id":17256,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1369:3:140","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"},"functionReturnParameters":17235,"id":17257,"nodeType":"Return","src":"1362:10:140"}]},"id":17259,"nodeType":"IfStatement","src":"1200:183:140","trueBody":{"id":17255,"nodeType":"Block","src":"1217:125:140","statements":[{"eventCall":{"arguments":[{"id":17246,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17224,"src":"1251:8:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":17247,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17226,"src":"1261:4:140","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":17248,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17228,"src":"1267:7:140","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":17249,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17230,"src":"1276:4:140","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":17245,"name":"ERC721Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17201,"src":"1236:14:140","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,bytes memory)"}},"id":17250,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1236:45:140","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17251,"nodeType":"EmitStatement","src":"1231:50:140"},{"expression":{"expression":{"id":17252,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1302:13:140","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":17253,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1316:15:140","memberName":"ERC721_RECEIVED","nodeType":"MemberAccess","referencedDeclaration":33306,"src":"1302:29:140","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":17235,"id":17254,"nodeType":"Return","src":"1295:36:140"}]}}]},"documentation":{"id":17222,"nodeType":"StructuredDocumentation","src":"879:104:140","text":"@inheritdoc IERC721Receiver\n @dev reverts if the sender is not the supported ERC721 contract."},"functionSelector":"150b7a02","id":17261,"implemented":true,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"997:16:140","nodeType":"FunctionDefinition","overrides":{"id":17232,"nodeType":"OverrideSpecifier","overrides":[],"src":"1097:8:140"},"parameters":{"id":17231,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17224,"mutability":"mutable","name":"operator","nameLocation":"1022:8:140","nodeType":"VariableDeclaration","scope":17261,"src":"1014:16:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17223,"name":"address","nodeType":"ElementaryTypeName","src":"1014:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17226,"mutability":"mutable","name":"from","nameLocation":"1040:4:140","nodeType":"VariableDeclaration","scope":17261,"src":"1032:12:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17225,"name":"address","nodeType":"ElementaryTypeName","src":"1032:7:140","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":17228,"mutability":"mutable","name":"tokenId","nameLocation":"1054:7:140","nodeType":"VariableDeclaration","scope":17261,"src":"1046:15:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":17227,"name":"uint256","nodeType":"ElementaryTypeName","src":"1046:7:140","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":17230,"mutability":"mutable","name":"data","nameLocation":"1076:4:140","nodeType":"VariableDeclaration","scope":17261,"src":"1063:17:140","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":17229,"name":"bytes","nodeType":"ElementaryTypeName","src":"1063:5:140","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1013:68:140"},"returnParameters":{"id":17235,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17234,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17261,"src":"1115:6:140","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":17233,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1115:6:140","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1114:8:140"},"scope":17262,"src":"988:401:140","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":17263,"src":"336:1055:140","usedErrors":[11559,17203],"usedEvents":[17201]}],"src":"32:1360:140"},"id":140},"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC721":[30747],"ERC721BatchTransfer":[30767],"ERC721Mintable":[30924],"ERC721WithoutOperatorFiltererMock":[17340],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386]},"id":17341,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17264,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:141"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":17266,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":13387,"src":"57:87:141","symbolAliases":[{"foreign":{"id":17265,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721.sol","file":"./../../../token/ERC721/ERC721.sol","id":17268,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":30748,"src":"145:58:141","symbolAliases":[{"foreign":{"id":17267,"name":"ERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30747,"src":"153:6:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721BatchTransfer.sol","file":"./../../../token/ERC721/ERC721BatchTransfer.sol","id":17270,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":30768,"src":"204:84:141","symbolAliases":[{"foreign":{"id":17269,"name":"ERC721BatchTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30767,"src":"212:19:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Mintable.sol","file":"./../../../token/ERC721/ERC721Mintable.sol","id":17272,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":30925,"src":"289:74:141","symbolAliases":[{"foreign":{"id":17271,"name":"ERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30924,"src":"297:14:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":17274,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":7935,"src":"364:74:141","symbolAliases":[{"foreign":{"id":17273,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"372:17:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":17276,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":1207,"src":"439:66:141","symbolAliases":[{"foreign":{"id":17275,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"447:7:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":17278,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":13298,"src":"506:101:141","symbolAliases":[{"foreign":{"id":17277,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"514:28:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":17280,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17341,"sourceUnit":13143,"src":"608:88:141","symbolAliases":[{"foreign":{"id":17279,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"616:24:141","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17281,"name":"ERC721","nameLocations":["744:6:141"],"nodeType":"IdentifierPath","referencedDeclaration":30747,"src":"744:6:141"},"id":17282,"nodeType":"InheritanceSpecifier","src":"744:6:141"},{"baseName":{"id":17283,"name":"ERC721BatchTransfer","nameLocations":["752:19:141"],"nodeType":"IdentifierPath","referencedDeclaration":30767,"src":"752:19:141"},"id":17284,"nodeType":"InheritanceSpecifier","src":"752:19:141"},{"baseName":{"id":17285,"name":"ERC721Mintable","nameLocations":["773:14:141"],"nodeType":"IdentifierPath","referencedDeclaration":30924,"src":"773:14:141"},"id":17286,"nodeType":"InheritanceSpecifier","src":"773:14:141"},{"baseName":{"id":17287,"name":"ForwarderRegistryContext","nameLocations":["789:24:141"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"789:24:141"},"id":17288,"nodeType":"InheritanceSpecifier","src":"789:24:141"}],"canonicalName":"ERC721WithoutOperatorFiltererMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17340,"linearizedBaseContracts":[17340,13142,13370,13297,30924,7901,7934,30767,31269,30747,11554,11579,8139,8091,31700,31227,1206,8562,8546,33199,33109,33094],"name":"ERC721WithoutOperatorFiltererMock","nameLocation":"707:33:141","nodeType":"ContractDefinition","nodes":[{"body":{"id":17301,"nodeType":"Block","src":"944:2:141","statements":[]},"id":17302,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":17294,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"888:3:141","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":17295,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"892:6:141","memberName":"sender","nodeType":"MemberAccess","src":"888:10:141","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":17296,"kind":"baseConstructorSpecifier","modifierName":{"id":17293,"name":"ContractOwnership","nameLocations":["870:17:141"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"870:17:141"},"nodeType":"ModifierInvocation","src":"870:29:141"},{"arguments":[{"id":17298,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17291,"src":"925:17:141","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17299,"kind":"baseConstructorSpecifier","modifierName":{"id":17297,"name":"ForwarderRegistryContext","nameLocations":["900:24:141"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"900:24:141"},"nodeType":"ModifierInvocation","src":"900:43:141"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17292,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17291,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"851:17:141","nodeType":"VariableDeclaration","scope":17302,"src":"832:36:141","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17290,"nodeType":"UserDefinedTypeName","pathNode":{"id":17289,"name":"IForwarderRegistry","nameLocations":["832:18:141"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"832:18:141"},"referencedDeclaration":13386,"src":"832:18:141","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"831:38:141"},"returnParameters":{"id":17300,"nodeType":"ParameterList","parameters":[],"src":"944:0:141"},"scope":17340,"src":"820:126:141","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17310,"nodeType":"Block","src":"1012:34:141","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17307,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[17339],"referencedDeclaration":17339,"src":"1029:8:141","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1029:10:141","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17306,"id":17309,"nodeType":"Return","src":"1022:17:141"}]},"functionSelector":"31e66e1e","id":17311,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"961:9:141","nodeType":"FunctionDefinition","parameters":{"id":17303,"nodeType":"ParameterList","parameters":[],"src":"970:2:141"},"returnParameters":{"id":17306,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17305,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17311,"src":"996:14:141","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17304,"name":"bytes","nodeType":"ElementaryTypeName","src":"996:5:141","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"995:16:141"},"scope":17340,"src":"952:94:141","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":17324,"nodeType":"Block","src":"1211:65:141","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17320,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1228:28:141","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":17321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1257:10:141","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1228:39:141","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":17322,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1228:41:141","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":17319,"id":17323,"nodeType":"Return","src":"1221:48:141"}]},"documentation":{"id":17312,"nodeType":"StructuredDocumentation","src":"1052:44:141","text":"@inheritdoc ForwarderRegistryContextBase"},"id":17325,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1110:10:141","nodeType":"FunctionDefinition","overrides":{"id":17316,"nodeType":"OverrideSpecifier","overrides":[{"id":17314,"name":"Context","nameLocations":["1154:7:141"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1154:7:141"},{"id":17315,"name":"ForwarderRegistryContextBase","nameLocations":["1163:28:141"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1163:28:141"}],"src":"1145:47:141"},"parameters":{"id":17313,"nodeType":"ParameterList","parameters":[],"src":"1120:2:141"},"returnParameters":{"id":17319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17318,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17325,"src":"1202:7:141","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17317,"name":"address","nodeType":"ElementaryTypeName","src":"1202:7:141","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1201:9:141"},"scope":17340,"src":"1101:175:141","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":17338,"nodeType":"Block","src":"1446:63:141","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17334,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1463:28:141","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":17335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1492:8:141","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1463:37:141","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1463:39:141","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17333,"id":17337,"nodeType":"Return","src":"1456:46:141"}]},"documentation":{"id":17326,"nodeType":"StructuredDocumentation","src":"1282:44:141","text":"@inheritdoc ForwarderRegistryContextBase"},"id":17339,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1340:8:141","nodeType":"FunctionDefinition","overrides":{"id":17330,"nodeType":"OverrideSpecifier","overrides":[{"id":17328,"name":"Context","nameLocations":["1382:7:141"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1382:7:141"},{"id":17329,"name":"ForwarderRegistryContextBase","nameLocations":["1391:28:141"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1391:28:141"}],"src":"1373:47:141"},"parameters":{"id":17327,"nodeType":"ParameterList","parameters":[],"src":"1348:2:141"},"returnParameters":{"id":17333,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17332,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17339,"src":"1430:14:141","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17331,"name":"bytes","nodeType":"ElementaryTypeName","src":"1430:5:141","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1429:16:141"},"scope":17340,"src":"1331:178:141","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":17341,"src":"698:813:141","usedErrors":[8223,8246,11559,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:1480:141"},"id":141},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol","exportedSymbols":{"ERC721BatchTransferFacet":[32284],"ERC721BatchTransferFacetMock":[17369],"IForwarderRegistry":[13386]},"id":17370,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17342,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:142"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17344,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17370,"sourceUnit":13387,"src":"57:90:142","symbolAliases":[{"foreign":{"id":17343,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:142","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol","file":"./../../../../token/ERC721/facets/ERC721BatchTransferFacet.sol","id":17346,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17370,"sourceUnit":32285,"src":"148:104:142","symbolAliases":[{"foreign":{"id":17345,"name":"ERC721BatchTransferFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32284,"src":"156:24:142","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17348,"name":"ERC721BatchTransferFacet","nameLocations":["335:24:142"],"nodeType":"IdentifierPath","referencedDeclaration":32284,"src":"335:24:142"},"id":17349,"nodeType":"InheritanceSpecifier","src":"335:24:142"}],"canonicalName":"ERC721BatchTransferFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17347,"nodeType":"StructuredDocumentation","src":"254:40:142","text":"@title ERC721BatchTransferFacetMock"},"fullyImplemented":true,"id":17369,"linearizedBaseContracts":[17369,32284,13297,31269,1206,33109],"name":"ERC721BatchTransferFacetMock","nameLocation":"303:28:142","nodeType":"ContractDefinition","nodes":[{"body":{"id":17358,"nodeType":"Block","src":"460:2:142","statements":[]},"id":17359,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17355,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17352,"src":"441:17:142","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17356,"kind":"baseConstructorSpecifier","modifierName":{"id":17354,"name":"ERC721BatchTransferFacet","nameLocations":["416:24:142"],"nodeType":"IdentifierPath","referencedDeclaration":32284,"src":"416:24:142"},"nodeType":"ModifierInvocation","src":"416:43:142"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17352,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"397:17:142","nodeType":"VariableDeclaration","scope":17359,"src":"378:36:142","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17351,"nodeType":"UserDefinedTypeName","pathNode":{"id":17350,"name":"IForwarderRegistry","nameLocations":["378:18:142"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"378:18:142"},"referencedDeclaration":13386,"src":"378:18:142","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"377:38:142"},"returnParameters":{"id":17357,"nodeType":"ParameterList","parameters":[],"src":"460:0:142"},"scope":17369,"src":"366:96:142","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17367,"nodeType":"Block","src":"528:34:142","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17364,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32283],"referencedDeclaration":32283,"src":"545:8:142","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17365,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"545:10:142","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17363,"id":17366,"nodeType":"Return","src":"538:17:142"}]},"functionSelector":"31e66e1e","id":17368,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"477:9:142","nodeType":"FunctionDefinition","parameters":{"id":17360,"nodeType":"ParameterList","parameters":[],"src":"486:2:142"},"returnParameters":{"id":17363,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17362,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17368,"src":"512:14:142","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17361,"name":"bytes","nodeType":"ElementaryTypeName","src":"512:5:142","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"511:16:142"},"scope":17369,"src":"468:94:142","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17370,"src":"294:270:142","usedErrors":[11559,19183,32126,32131,32140,32147],"usedEvents":[32185]}],"src":"32:533:142"},"id":142},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol","exportedSymbols":{"ERC721BatchTransferWithOperatorFiltererFacet":[32365],"ERC721BatchTransferWithOperatorFiltererFacetMock":[17398],"IForwarderRegistry":[13386]},"id":17399,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17371,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:143"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17373,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17399,"sourceUnit":13387,"src":"57:90:143","symbolAliases":[{"foreign":{"id":17372,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:143","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol","file":"./../../../../token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol","id":17375,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17399,"sourceUnit":32366,"src":"148:144:143","symbolAliases":[{"foreign":{"id":17374,"name":"ERC721BatchTransferWithOperatorFiltererFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32365,"src":"156:44:143","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17377,"name":"ERC721BatchTransferWithOperatorFiltererFacet","nameLocations":["395:44:143"],"nodeType":"IdentifierPath","referencedDeclaration":32365,"src":"395:44:143"},"id":17378,"nodeType":"InheritanceSpecifier","src":"395:44:143"}],"canonicalName":"ERC721BatchTransferWithOperatorFiltererFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17376,"nodeType":"StructuredDocumentation","src":"294:40:143","text":"@title ERC721BatchTransferFacetMock"},"fullyImplemented":true,"id":17398,"linearizedBaseContracts":[17398,32365,13297,31330,1206,33109],"name":"ERC721BatchTransferWithOperatorFiltererFacetMock","nameLocation":"343:48:143","nodeType":"ContractDefinition","nodes":[{"body":{"id":17387,"nodeType":"Block","src":"560:2:143","statements":[]},"id":17388,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17384,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17381,"src":"541:17:143","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17385,"kind":"baseConstructorSpecifier","modifierName":{"id":17383,"name":"ERC721BatchTransferWithOperatorFiltererFacet","nameLocations":["496:44:143"],"nodeType":"IdentifierPath","referencedDeclaration":32365,"src":"496:44:143"},"nodeType":"ModifierInvocation","src":"496:63:143"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17381,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"477:17:143","nodeType":"VariableDeclaration","scope":17388,"src":"458:36:143","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17380,"nodeType":"UserDefinedTypeName","pathNode":{"id":17379,"name":"IForwarderRegistry","nameLocations":["458:18:143"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"458:18:143"},"referencedDeclaration":13386,"src":"458:18:143","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"457:38:143"},"returnParameters":{"id":17386,"nodeType":"ParameterList","parameters":[],"src":"560:0:143"},"scope":17398,"src":"446:116:143","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17396,"nodeType":"Block","src":"628:34:143","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17393,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32364],"referencedDeclaration":32364,"src":"645:8:143","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"645:10:143","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17392,"id":17395,"nodeType":"Return","src":"638:17:143"}]},"functionSelector":"31e66e1e","id":17397,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"577:9:143","nodeType":"FunctionDefinition","parameters":{"id":17389,"nodeType":"ParameterList","parameters":[],"src":"586:2:143"},"returnParameters":{"id":17392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17391,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17397,"src":"612:14:143","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17390,"name":"bytes","nodeType":"ElementaryTypeName","src":"612:5:143","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"611:16:143"},"scope":17398,"src":"568:94:143","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17399,"src":"334:330:143","usedErrors":[11559,19183,32126,32131,32140,32147,37090],"usedEvents":[32185]}],"src":"32:633:143"},"id":143},"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol","exportedSymbols":{"ERC721BurnableFacet":[32446],"ERC721BurnableFacetMock":[17427],"IForwarderRegistry":[13386]},"id":17428,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17400,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:144"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17402,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17428,"sourceUnit":13387,"src":"57:90:144","symbolAliases":[{"foreign":{"id":17401,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:144","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721BurnableFacet.sol","file":"./../../../../token/ERC721/facets/ERC721BurnableFacet.sol","id":17404,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17428,"sourceUnit":32447,"src":"148:94:144","symbolAliases":[{"foreign":{"id":17403,"name":"ERC721BurnableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32446,"src":"156:19:144","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17406,"name":"ERC721BurnableFacet","nameLocations":["315:19:144"],"nodeType":"IdentifierPath","referencedDeclaration":32446,"src":"315:19:144"},"id":17407,"nodeType":"InheritanceSpecifier","src":"315:19:144"}],"canonicalName":"ERC721BurnableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17405,"nodeType":"StructuredDocumentation","src":"244:35:144","text":"@title ERC721BurnableFacetMock"},"fullyImplemented":true,"id":17427,"linearizedBaseContracts":[17427,32446,13297,31389,1206,33130],"name":"ERC721BurnableFacetMock","nameLocation":"288:23:144","nodeType":"ContractDefinition","nodes":[{"body":{"id":17416,"nodeType":"Block","src":"430:2:144","statements":[]},"id":17417,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17413,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17410,"src":"411:17:144","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17414,"kind":"baseConstructorSpecifier","modifierName":{"id":17412,"name":"ERC721BurnableFacet","nameLocations":["391:19:144"],"nodeType":"IdentifierPath","referencedDeclaration":32446,"src":"391:19:144"},"nodeType":"ModifierInvocation","src":"391:38:144"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17411,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17410,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"372:17:144","nodeType":"VariableDeclaration","scope":17417,"src":"353:36:144","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17409,"nodeType":"UserDefinedTypeName","pathNode":{"id":17408,"name":"IForwarderRegistry","nameLocations":["353:18:144"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"353:18:144"},"referencedDeclaration":13386,"src":"353:18:144","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"352:38:144"},"returnParameters":{"id":17415,"nodeType":"ParameterList","parameters":[],"src":"430:0:144"},"scope":17427,"src":"341:91:144","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17425,"nodeType":"Block","src":"498:34:144","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17422,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32445],"referencedDeclaration":32445,"src":"515:8:144","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17423,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"515:10:144","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17421,"id":17424,"nodeType":"Return","src":"508:17:144"}]},"functionSelector":"31e66e1e","id":17426,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"447:9:144","nodeType":"FunctionDefinition","parameters":{"id":17418,"nodeType":"ParameterList","parameters":[],"src":"456:2:144"},"returnParameters":{"id":17421,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17420,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17426,"src":"482:14:144","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17419,"name":"bytes","nodeType":"ElementaryTypeName","src":"482:5:144","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"481:16:144"},"scope":17427,"src":"438:94:144","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17428,"src":"279:255:144","usedErrors":[11559,19183,32131,32140,32147],"usedEvents":[32185]}],"src":"32:503:144"},"id":144},"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol","exportedSymbols":{"ERC721DeliverableFacet":[32527],"ERC721DeliverableFacetMock":[17456],"IForwarderRegistry":[13386]},"id":17457,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17429,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:145"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17431,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17457,"sourceUnit":13387,"src":"57:90:145","symbolAliases":[{"foreign":{"id":17430,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:145","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol","file":"./../../../../token/ERC721/facets/ERC721DeliverableFacet.sol","id":17433,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17457,"sourceUnit":32528,"src":"148:100:145","symbolAliases":[{"foreign":{"id":17432,"name":"ERC721DeliverableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32527,"src":"156:22:145","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17435,"name":"ERC721DeliverableFacet","nameLocations":["327:22:145"],"nodeType":"IdentifierPath","referencedDeclaration":32527,"src":"327:22:145"},"id":17436,"nodeType":"InheritanceSpecifier","src":"327:22:145"}],"canonicalName":"ERC721DeliverableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17434,"nodeType":"StructuredDocumentation","src":"250:38:145","text":"@title ERC721DeliverableFacetMock"},"fullyImplemented":true,"id":17456,"linearizedBaseContracts":[17456,32527,13297,31446,1206,33144],"name":"ERC721DeliverableFacetMock","nameLocation":"297:26:145","nodeType":"ContractDefinition","nodes":[{"body":{"id":17445,"nodeType":"Block","src":"448:2:145","statements":[]},"id":17446,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17442,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17439,"src":"429:17:145","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17443,"kind":"baseConstructorSpecifier","modifierName":{"id":17441,"name":"ERC721DeliverableFacet","nameLocations":["406:22:145"],"nodeType":"IdentifierPath","referencedDeclaration":32527,"src":"406:22:145"},"nodeType":"ModifierInvocation","src":"406:41:145"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17440,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17439,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"387:17:145","nodeType":"VariableDeclaration","scope":17446,"src":"368:36:145","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17438,"nodeType":"UserDefinedTypeName","pathNode":{"id":17437,"name":"IForwarderRegistry","nameLocations":["368:18:145"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"368:18:145"},"referencedDeclaration":13386,"src":"368:18:145","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"367:38:145"},"returnParameters":{"id":17444,"nodeType":"ParameterList","parameters":[],"src":"448:0:145"},"scope":17456,"src":"356:94:145","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17454,"nodeType":"Block","src":"516:34:145","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17451,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32526],"referencedDeclaration":32526,"src":"533:8:145","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"533:10:145","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17450,"id":17453,"nodeType":"Return","src":"526:17:145"}]},"functionSelector":"31e66e1e","id":17455,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"465:9:145","nodeType":"FunctionDefinition","parameters":{"id":17447,"nodeType":"ParameterList","parameters":[],"src":"474:2:145"},"returnParameters":{"id":17450,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17449,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17455,"src":"500:14:145","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17448,"name":"bytes","nodeType":"ElementaryTypeName","src":"500:5:145","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"499:16:145"},"scope":17456,"src":"456:94:145","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17457,"src":"288:264:145","usedErrors":[7886,8223,11559,19183,32162,32167],"usedEvents":[32185]}],"src":"32:521:145"},"id":145},"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol","exportedSymbols":{"ERC721DeliverableOnceFacet":[32608],"ERC721DeliverableOnceFacetMock":[17485],"IForwarderRegistry":[13386]},"id":17486,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17458,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:146"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17460,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17486,"sourceUnit":13387,"src":"57:90:146","symbolAliases":[{"foreign":{"id":17459,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:146","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol","file":"./../../../../token/ERC721/facets/ERC721DeliverableOnceFacet.sol","id":17462,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17486,"sourceUnit":32609,"src":"148:108:146","symbolAliases":[{"foreign":{"id":17461,"name":"ERC721DeliverableOnceFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32608,"src":"156:26:146","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17464,"name":"ERC721DeliverableOnceFacet","nameLocations":["343:26:146"],"nodeType":"IdentifierPath","referencedDeclaration":32608,"src":"343:26:146"},"id":17465,"nodeType":"InheritanceSpecifier","src":"343:26:146"}],"canonicalName":"ERC721DeliverableOnceFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17463,"nodeType":"StructuredDocumentation","src":"258:42:146","text":"@title ERC721DeliverableOnceFacetMock"},"fullyImplemented":true,"id":17485,"linearizedBaseContracts":[17485,32608,13297,31503,1206,33144],"name":"ERC721DeliverableOnceFacetMock","nameLocation":"309:30:146","nodeType":"ContractDefinition","nodes":[{"body":{"id":17474,"nodeType":"Block","src":"472:2:146","statements":[]},"id":17475,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17471,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17468,"src":"453:17:146","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17472,"kind":"baseConstructorSpecifier","modifierName":{"id":17470,"name":"ERC721DeliverableOnceFacet","nameLocations":["426:26:146"],"nodeType":"IdentifierPath","referencedDeclaration":32608,"src":"426:26:146"},"nodeType":"ModifierInvocation","src":"426:45:146"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17468,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"407:17:146","nodeType":"VariableDeclaration","scope":17475,"src":"388:36:146","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17467,"nodeType":"UserDefinedTypeName","pathNode":{"id":17466,"name":"IForwarderRegistry","nameLocations":["388:18:146"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"388:18:146"},"referencedDeclaration":13386,"src":"388:18:146","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"387:38:146"},"returnParameters":{"id":17473,"nodeType":"ParameterList","parameters":[],"src":"472:0:146"},"scope":17485,"src":"376:98:146","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17483,"nodeType":"Block","src":"540:34:146","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17480,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32607],"referencedDeclaration":32607,"src":"557:8:146","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17481,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"557:10:146","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17479,"id":17482,"nodeType":"Return","src":"550:17:146"}]},"functionSelector":"31e66e1e","id":17484,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"489:9:146","nodeType":"FunctionDefinition","parameters":{"id":17476,"nodeType":"ParameterList","parameters":[],"src":"498:2:146"},"returnParameters":{"id":17479,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17478,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17484,"src":"524:14:146","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17477,"name":"bytes","nodeType":"ElementaryTypeName","src":"524:5:146","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"523:16:146"},"scope":17485,"src":"480:94:146","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17486,"src":"300:276:146","usedErrors":[7886,8223,11559,19183,32162,32167,32174],"usedEvents":[32185]}],"src":"32:545:146"},"id":146},"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol","exportedSymbols":{"ERC721Facet":[32689],"ERC721FacetMock":[17514],"IForwarderRegistry":[13386]},"id":17515,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17487,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:147"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17489,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17515,"sourceUnit":13387,"src":"57:90:147","symbolAliases":[{"foreign":{"id":17488,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721Facet.sol","file":"./../../../../token/ERC721/facets/ERC721Facet.sol","id":17491,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17515,"sourceUnit":32690,"src":"148:78:147","symbolAliases":[{"foreign":{"id":17490,"name":"ERC721Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32689,"src":"156:11:147","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17493,"name":"ERC721Facet","nameLocations":["283:11:147"],"nodeType":"IdentifierPath","referencedDeclaration":32689,"src":"283:11:147"},"id":17494,"nodeType":"InheritanceSpecifier","src":"283:11:147"}],"canonicalName":"ERC721FacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17492,"nodeType":"StructuredDocumentation","src":"228:27:147","text":"@title ERC721FacetMock"},"fullyImplemented":true,"id":17514,"linearizedBaseContracts":[17514,32689,13297,31227,1206,33094],"name":"ERC721FacetMock","nameLocation":"264:15:147","nodeType":"ContractDefinition","nodes":[{"body":{"id":17503,"nodeType":"Block","src":"382:2:147","statements":[]},"id":17504,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17500,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17497,"src":"363:17:147","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17501,"kind":"baseConstructorSpecifier","modifierName":{"id":17499,"name":"ERC721Facet","nameLocations":["351:11:147"],"nodeType":"IdentifierPath","referencedDeclaration":32689,"src":"351:11:147"},"nodeType":"ModifierInvocation","src":"351:30:147"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17498,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17497,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"332:17:147","nodeType":"VariableDeclaration","scope":17504,"src":"313:36:147","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17496,"nodeType":"UserDefinedTypeName","pathNode":{"id":17495,"name":"IForwarderRegistry","nameLocations":["313:18:147"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"313:18:147"},"referencedDeclaration":13386,"src":"313:18:147","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"312:38:147"},"returnParameters":{"id":17502,"nodeType":"ParameterList","parameters":[],"src":"382:0:147"},"scope":17514,"src":"301:83:147","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17512,"nodeType":"Block","src":"450:34:147","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17509,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32688],"referencedDeclaration":32688,"src":"467:8:147","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17510,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"467:10:147","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17508,"id":17511,"nodeType":"Return","src":"460:17:147"}]},"functionSelector":"31e66e1e","id":17513,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"399:9:147","nodeType":"FunctionDefinition","parameters":{"id":17505,"nodeType":"ParameterList","parameters":[],"src":"408:2:147"},"returnParameters":{"id":17508,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17507,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17513,"src":"434:14:147","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17506,"name":"bytes","nodeType":"ElementaryTypeName","src":"434:5:147","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"433:16:147"},"scope":17514,"src":"390:94:147","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17515,"src":"255:231:147","usedErrors":[11559,19183,32109,32114,32123,32126,32131,32140,32147,32154,32157],"usedEvents":[32185,32194,32203]}],"src":"32:455:147"},"id":147},"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol","exportedSymbols":{"ERC721MetadataFacet":[32765],"ERC721MetadataFacetMock":[17543],"IForwarderRegistry":[13386]},"id":17544,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17516,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:148"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17518,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17544,"sourceUnit":13387,"src":"57:90:148","symbolAliases":[{"foreign":{"id":17517,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721MetadataFacet.sol","file":"./../../../../token/ERC721/facets/ERC721MetadataFacet.sol","id":17520,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17544,"sourceUnit":32766,"src":"148:94:148","symbolAliases":[{"foreign":{"id":17519,"name":"ERC721MetadataFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32765,"src":"156:19:148","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17522,"name":"ERC721MetadataFacet","nameLocations":["315:19:148"],"nodeType":"IdentifierPath","referencedDeclaration":32765,"src":"315:19:148"},"id":17523,"nodeType":"InheritanceSpecifier","src":"315:19:148"}],"canonicalName":"ERC721MetadataFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17521,"nodeType":"StructuredDocumentation","src":"244:35:148","text":"@title ERC721MetadataFacetMock"},"fullyImplemented":true,"id":17543,"linearizedBaseContracts":[17543,32765,13297,31583,33168,36683],"name":"ERC721MetadataFacetMock","nameLocation":"288:23:148","nodeType":"ContractDefinition","nodes":[{"body":{"id":17532,"nodeType":"Block","src":"430:2:148","statements":[]},"id":17533,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17529,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17526,"src":"411:17:148","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17530,"kind":"baseConstructorSpecifier","modifierName":{"id":17528,"name":"ERC721MetadataFacet","nameLocations":["391:19:148"],"nodeType":"IdentifierPath","referencedDeclaration":32765,"src":"391:19:148"},"nodeType":"ModifierInvocation","src":"391:38:148"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17527,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17526,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"372:17:148","nodeType":"VariableDeclaration","scope":17533,"src":"353:36:148","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17525,"nodeType":"UserDefinedTypeName","pathNode":{"id":17524,"name":"IForwarderRegistry","nameLocations":["353:18:148"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"353:18:148"},"referencedDeclaration":13386,"src":"353:18:148","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"352:38:148"},"returnParameters":{"id":17531,"nodeType":"ParameterList","parameters":[],"src":"430:0:148"},"scope":17543,"src":"341:91:148","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17541,"nodeType":"Block","src":"498:34:148","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17538,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13296,"src":"515:8:148","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"515:10:148","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17537,"id":17540,"nodeType":"Return","src":"508:17:148"}]},"functionSelector":"31e66e1e","id":17542,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"447:9:148","nodeType":"FunctionDefinition","parameters":{"id":17534,"nodeType":"ParameterList","parameters":[],"src":"456:2:148"},"returnParameters":{"id":17537,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17536,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17542,"src":"482:14:148","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17535,"name":"bytes","nodeType":"ElementaryTypeName","src":"482:5:148","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"481:16:148"},"scope":17543,"src":"438:94:148","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17544,"src":"279:255:148","usedErrors":[11559,19183,19192,32131],"usedEvents":[]}],"src":"32:503:148"},"id":148},"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol","exportedSymbols":{"ERC721MintableFacet":[32846],"ERC721MintableFacetMock":[17572],"IForwarderRegistry":[13386]},"id":17573,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17545,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:149"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17547,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17573,"sourceUnit":13387,"src":"57:90:149","symbolAliases":[{"foreign":{"id":17546,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721MintableFacet.sol","file":"./../../../../token/ERC721/facets/ERC721MintableFacet.sol","id":17549,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17573,"sourceUnit":32847,"src":"148:94:149","symbolAliases":[{"foreign":{"id":17548,"name":"ERC721MintableFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32846,"src":"156:19:149","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17551,"name":"ERC721MintableFacet","nameLocations":["315:19:149"],"nodeType":"IdentifierPath","referencedDeclaration":32846,"src":"315:19:149"},"id":17552,"nodeType":"InheritanceSpecifier","src":"315:19:149"}],"canonicalName":"ERC721MintableFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17550,"nodeType":"StructuredDocumentation","src":"244:35:149","text":"@title ERC721MintableFacetMock"},"fullyImplemented":true,"id":17572,"linearizedBaseContracts":[17572,32846,13297,31700,1206,33199],"name":"ERC721MintableFacetMock","nameLocation":"288:23:149","nodeType":"ContractDefinition","nodes":[{"body":{"id":17561,"nodeType":"Block","src":"430:2:149","statements":[]},"id":17562,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17558,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17555,"src":"411:17:149","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17559,"kind":"baseConstructorSpecifier","modifierName":{"id":17557,"name":"ERC721MintableFacet","nameLocations":["391:19:149"],"nodeType":"IdentifierPath","referencedDeclaration":32846,"src":"391:19:149"},"nodeType":"ModifierInvocation","src":"391:38:149"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17556,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17555,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"372:17:149","nodeType":"VariableDeclaration","scope":17562,"src":"353:36:149","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17554,"nodeType":"UserDefinedTypeName","pathNode":{"id":17553,"name":"IForwarderRegistry","nameLocations":["353:18:149"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"353:18:149"},"referencedDeclaration":13386,"src":"353:18:149","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"352:38:149"},"returnParameters":{"id":17560,"nodeType":"ParameterList","parameters":[],"src":"430:0:149"},"scope":17572,"src":"341:91:149","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17570,"nodeType":"Block","src":"498:34:149","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17567,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32845],"referencedDeclaration":32845,"src":"515:8:149","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17568,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"515:10:149","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17566,"id":17569,"nodeType":"Return","src":"508:17:149"}]},"functionSelector":"31e66e1e","id":17571,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"447:9:149","nodeType":"FunctionDefinition","parameters":{"id":17563,"nodeType":"ParameterList","parameters":[],"src":"456:2:149"},"returnParameters":{"id":17566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17565,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17571,"src":"482:14:149","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17564,"name":"bytes","nodeType":"ElementaryTypeName","src":"482:5:149","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"481:16:149"},"scope":17572,"src":"438:94:149","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17573,"src":"279:255:149","usedErrors":[8223,11559,19183,32154,32162,32167],"usedEvents":[32185]}],"src":"32:503:149"},"id":149},"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol","exportedSymbols":{"ERC721MintableOnceFacet":[32927],"ERC721MintableOnceFacetMock":[17601],"IForwarderRegistry":[13386]},"id":17602,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17574,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:150"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17576,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17602,"sourceUnit":13387,"src":"57:90:150","symbolAliases":[{"foreign":{"id":17575,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol","file":"./../../../../token/ERC721/facets/ERC721MintableOnceFacet.sol","id":17578,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17602,"sourceUnit":32928,"src":"148:102:150","symbolAliases":[{"foreign":{"id":17577,"name":"ERC721MintableOnceFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32927,"src":"156:23:150","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17580,"name":"ERC721MintableOnceFacet","nameLocations":["331:23:150"],"nodeType":"IdentifierPath","referencedDeclaration":32927,"src":"331:23:150"},"id":17581,"nodeType":"InheritanceSpecifier","src":"331:23:150"}],"canonicalName":"ERC721MintableOnceFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17579,"nodeType":"StructuredDocumentation","src":"252:39:150","text":"@title ERC721MintableOnceFacetMock"},"fullyImplemented":true,"id":17601,"linearizedBaseContracts":[17601,32927,13297,31833,1206,33199],"name":"ERC721MintableOnceFacetMock","nameLocation":"300:27:150","nodeType":"ContractDefinition","nodes":[{"body":{"id":17590,"nodeType":"Block","src":"454:2:150","statements":[]},"id":17591,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17587,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17584,"src":"435:17:150","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17588,"kind":"baseConstructorSpecifier","modifierName":{"id":17586,"name":"ERC721MintableOnceFacet","nameLocations":["411:23:150"],"nodeType":"IdentifierPath","referencedDeclaration":32927,"src":"411:23:150"},"nodeType":"ModifierInvocation","src":"411:42:150"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17584,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"392:17:150","nodeType":"VariableDeclaration","scope":17591,"src":"373:36:150","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17583,"nodeType":"UserDefinedTypeName","pathNode":{"id":17582,"name":"IForwarderRegistry","nameLocations":["373:18:150"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"373:18:150"},"referencedDeclaration":13386,"src":"373:18:150","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"372:38:150"},"returnParameters":{"id":17589,"nodeType":"ParameterList","parameters":[],"src":"454:0:150"},"scope":17601,"src":"361:95:150","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17599,"nodeType":"Block","src":"522:34:150","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17596,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[32926],"referencedDeclaration":32926,"src":"539:8:150","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17597,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"539:10:150","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17595,"id":17598,"nodeType":"Return","src":"532:17:150"}]},"functionSelector":"31e66e1e","id":17600,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"471:9:150","nodeType":"FunctionDefinition","parameters":{"id":17592,"nodeType":"ParameterList","parameters":[],"src":"480:2:150"},"returnParameters":{"id":17595,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17594,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17600,"src":"506:14:150","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17593,"name":"bytes","nodeType":"ElementaryTypeName","src":"506:5:150","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"505:16:150"},"scope":17601,"src":"462:94:150","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17602,"src":"291:267:150","usedErrors":[8223,11559,19183,32154,32162,32167,32174],"usedEvents":[32185]}],"src":"32:527:150"},"id":150},"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol","exportedSymbols":{"ERC721WithOperatorFiltererFacet":[33008],"ERC721WithOperatorFiltererFacetMock":[17630],"IForwarderRegistry":[13386]},"id":17631,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17603,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:151"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17605,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17631,"sourceUnit":13387,"src":"57:90:151","symbolAliases":[{"foreign":{"id":17604,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:151","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol","file":"./../../../../token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol","id":17607,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17631,"sourceUnit":33009,"src":"148:118:151","symbolAliases":[{"foreign":{"id":17606,"name":"ERC721WithOperatorFiltererFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33008,"src":"156:31:151","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17609,"name":"ERC721WithOperatorFiltererFacet","nameLocations":["343:31:151"],"nodeType":"IdentifierPath","referencedDeclaration":33008,"src":"343:31:151"},"id":17610,"nodeType":"InheritanceSpecifier","src":"343:31:151"}],"canonicalName":"ERC721WithOperatorFiltererFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17608,"nodeType":"StructuredDocumentation","src":"268:27:151","text":"@title ERC721FacetMock"},"fullyImplemented":true,"id":17630,"linearizedBaseContracts":[17630,33008,13297,32102,1206,33094],"name":"ERC721WithOperatorFiltererFacetMock","nameLocation":"304:35:151","nodeType":"ContractDefinition","nodes":[{"body":{"id":17619,"nodeType":"Block","src":"482:2:151","statements":[]},"id":17620,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17616,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17613,"src":"463:17:151","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17617,"kind":"baseConstructorSpecifier","modifierName":{"id":17615,"name":"ERC721WithOperatorFiltererFacet","nameLocations":["431:31:151"],"nodeType":"IdentifierPath","referencedDeclaration":33008,"src":"431:31:151"},"nodeType":"ModifierInvocation","src":"431:50:151"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17614,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17613,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"412:17:151","nodeType":"VariableDeclaration","scope":17620,"src":"393:36:151","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17612,"nodeType":"UserDefinedTypeName","pathNode":{"id":17611,"name":"IForwarderRegistry","nameLocations":["393:18:151"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"393:18:151"},"referencedDeclaration":13386,"src":"393:18:151","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"392:38:151"},"returnParameters":{"id":17618,"nodeType":"ParameterList","parameters":[],"src":"482:0:151"},"scope":17630,"src":"381:103:151","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17628,"nodeType":"Block","src":"550:34:151","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17625,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[33007],"referencedDeclaration":33007,"src":"567:8:151","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"567:10:151","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17624,"id":17627,"nodeType":"Return","src":"560:17:151"}]},"functionSelector":"31e66e1e","id":17629,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"499:9:151","nodeType":"FunctionDefinition","parameters":{"id":17621,"nodeType":"ParameterList","parameters":[],"src":"508:2:151"},"returnParameters":{"id":17624,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17623,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17629,"src":"534:14:151","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17622,"name":"bytes","nodeType":"ElementaryTypeName","src":"534:5:151","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"533:16:151"},"scope":17630,"src":"490:94:151","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17631,"src":"295:291:151","usedErrors":[11559,19183,32109,32114,32123,32126,32131,32140,32147,32154,32157,37090],"usedEvents":[32185,32194,32203]}],"src":"32:555:151"},"id":151},"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol","exportedSymbols":{"ERC721FullBurn":[35190],"ERC721FullBurnMock":[17677],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704]},"id":17678,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17632,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:152"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17634,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17678,"sourceUnit":13387,"src":"57:90:152","symbolAliases":[{"foreign":{"id":17633,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:152","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":17636,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17678,"sourceUnit":37475,"src":"148:107:152","symbolAliases":[{"foreign":{"id":17635,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"156:23:152","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol","id":17638,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17678,"sourceUnit":36705,"src":"256:106:152","symbolAliases":[{"foreign":{"id":17637,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"264:22:152","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/ERC721FullBurn.sol","file":"./../../../../token/ERC721/preset/ERC721FullBurn.sol","id":17640,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17678,"sourceUnit":35191,"src":"363:84:152","symbolAliases":[{"foreign":{"id":17639,"name":"ERC721FullBurn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35190,"src":"371:14:152","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17642,"name":"ERC721FullBurn","nameLocations":["510:14:152"],"nodeType":"IdentifierPath","referencedDeclaration":35190,"src":"510:14:152"},"id":17643,"nodeType":"InheritanceSpecifier","src":"510:14:152"}],"canonicalName":"ERC721FullBurnMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17641,"nodeType":"StructuredDocumentation","src":"449:30:152","text":"@title ERC721FullBurnMock"},"fullyImplemented":true,"id":17677,"linearizedBaseContracts":[17677,35190,13142,13370,13297,19661,36915,30807,31389,30831,30924,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31446,31700,37073,32102,1206,8562,19938,33130,8546,33144,33199,33109,33094],"name":"ERC721FullBurnMock","nameLocation":"488:18:152","nodeType":"ContractDefinition","nodes":[{"body":{"id":17666,"nodeType":"Block","src":"852:2:152","statements":[]},"id":17667,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17659,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17645,"src":"775:9:152","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17660,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17647,"src":"786:11:152","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17661,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17650,"src":"799:16:152","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},{"id":17662,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17653,"src":"817:14:152","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},{"id":17663,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17656,"src":"833:17:152","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17664,"kind":"baseConstructorSpecifier","modifierName":{"id":17658,"name":"ERC721FullBurn","nameLocations":["760:14:152"],"nodeType":"IdentifierPath","referencedDeclaration":35190,"src":"760:14:152"},"nodeType":"ModifierInvocation","src":"760:91:152"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17657,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17645,"mutability":"mutable","name":"tokenName","nameLocation":"566:9:152","nodeType":"VariableDeclaration","scope":17667,"src":"552:23:152","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17644,"name":"string","nodeType":"ElementaryTypeName","src":"552:6:152","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17647,"mutability":"mutable","name":"tokenSymbol","nameLocation":"599:11:152","nodeType":"VariableDeclaration","scope":17667,"src":"585:25:152","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17646,"name":"string","nodeType":"ElementaryTypeName","src":"585:6:152","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17650,"mutability":"mutable","name":"metadataResolver","nameLocation":"643:16:152","nodeType":"VariableDeclaration","scope":17667,"src":"620:39:152","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":17649,"nodeType":"UserDefinedTypeName","pathNode":{"id":17648,"name":"ITokenMetadataResolver","nameLocations":["620:22:152"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"620:22:152"},"referencedDeclaration":36704,"src":"620:22:152","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":17653,"mutability":"mutable","name":"filterRegistry","nameLocation":"693:14:152","nodeType":"VariableDeclaration","scope":17667,"src":"669:38:152","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":17652,"nodeType":"UserDefinedTypeName","pathNode":{"id":17651,"name":"IOperatorFilterRegistry","nameLocations":["669:23:152"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"669:23:152"},"referencedDeclaration":37474,"src":"669:23:152","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":17656,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"736:17:152","nodeType":"VariableDeclaration","scope":17667,"src":"717:36:152","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17655,"nodeType":"UserDefinedTypeName","pathNode":{"id":17654,"name":"IForwarderRegistry","nameLocations":["717:18:152"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"717:18:152"},"referencedDeclaration":13386,"src":"717:18:152","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"542:217:152"},"returnParameters":{"id":17665,"nodeType":"ParameterList","parameters":[],"src":"852:0:152"},"scope":17677,"src":"531:323:152","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17675,"nodeType":"Block","src":"920:34:152","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17672,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35189],"referencedDeclaration":35189,"src":"937:8:152","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17673,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"937:10:152","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17671,"id":17674,"nodeType":"Return","src":"930:17:152"}]},"functionSelector":"31e66e1e","id":17676,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"869:9:152","nodeType":"FunctionDefinition","parameters":{"id":17668,"nodeType":"ParameterList","parameters":[],"src":"878:2:152"},"returnParameters":{"id":17671,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17670,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17676,"src":"904:14:152","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17669,"name":"bytes","nodeType":"ElementaryTypeName","src":"904:5:152","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"903:16:152"},"scope":17677,"src":"860:94:152","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17678,"src":"479:477:152","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:925:152"},"id":152},"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol","exportedSymbols":{"ERC721FullMintOnceBurn":[35301],"ERC721FullMintOnceBurnMock":[17724],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704]},"id":17725,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17679,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:153"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17681,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17725,"sourceUnit":13387,"src":"57:90:153","symbolAliases":[{"foreign":{"id":17680,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:153","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":17683,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17725,"sourceUnit":37475,"src":"148:107:153","symbolAliases":[{"foreign":{"id":17682,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"156:23:153","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol","id":17685,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17725,"sourceUnit":36705,"src":"256:106:153","symbolAliases":[{"foreign":{"id":17684,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"264:22:153","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol","file":"./../../../../token/ERC721/preset/ERC721FullMintOnceBurn.sol","id":17687,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17725,"sourceUnit":35302,"src":"363:100:153","symbolAliases":[{"foreign":{"id":17686,"name":"ERC721FullMintOnceBurn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35301,"src":"371:22:153","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17689,"name":"ERC721FullMintOnceBurn","nameLocations":["534:22:153"],"nodeType":"IdentifierPath","referencedDeclaration":35301,"src":"534:22:153"},"id":17690,"nodeType":"InheritanceSpecifier","src":"534:22:153"}],"canonicalName":"ERC721FullMintOnceBurnMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17688,"nodeType":"StructuredDocumentation","src":"465:30:153","text":"@title ERC721FullBurnMock"},"fullyImplemented":true,"id":17724,"linearizedBaseContracts":[17724,35301,13142,13370,13297,19661,36915,30807,31389,30855,30948,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31503,31833,37073,32102,1206,8562,19938,33130,8546,33144,33199,33109,33094],"name":"ERC721FullMintOnceBurnMock","nameLocation":"504:26:153","nodeType":"ContractDefinition","nodes":[{"body":{"id":17713,"nodeType":"Block","src":"892:2:153","statements":[]},"id":17714,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17706,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17692,"src":"815:9:153","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17707,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17694,"src":"826:11:153","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17708,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17697,"src":"839:16:153","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},{"id":17709,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17700,"src":"857:14:153","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},{"id":17710,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17703,"src":"873:17:153","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17711,"kind":"baseConstructorSpecifier","modifierName":{"id":17705,"name":"ERC721FullMintOnceBurn","nameLocations":["792:22:153"],"nodeType":"IdentifierPath","referencedDeclaration":35301,"src":"792:22:153"},"nodeType":"ModifierInvocation","src":"792:99:153"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17704,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17692,"mutability":"mutable","name":"tokenName","nameLocation":"598:9:153","nodeType":"VariableDeclaration","scope":17714,"src":"584:23:153","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17691,"name":"string","nodeType":"ElementaryTypeName","src":"584:6:153","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17694,"mutability":"mutable","name":"tokenSymbol","nameLocation":"631:11:153","nodeType":"VariableDeclaration","scope":17714,"src":"617:25:153","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17693,"name":"string","nodeType":"ElementaryTypeName","src":"617:6:153","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17697,"mutability":"mutable","name":"metadataResolver","nameLocation":"675:16:153","nodeType":"VariableDeclaration","scope":17714,"src":"652:39:153","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":17696,"nodeType":"UserDefinedTypeName","pathNode":{"id":17695,"name":"ITokenMetadataResolver","nameLocations":["652:22:153"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"652:22:153"},"referencedDeclaration":36704,"src":"652:22:153","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":17700,"mutability":"mutable","name":"filterRegistry","nameLocation":"725:14:153","nodeType":"VariableDeclaration","scope":17714,"src":"701:38:153","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":17699,"nodeType":"UserDefinedTypeName","pathNode":{"id":17698,"name":"IOperatorFilterRegistry","nameLocations":["701:23:153"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"701:23:153"},"referencedDeclaration":37474,"src":"701:23:153","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":17703,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"768:17:153","nodeType":"VariableDeclaration","scope":17714,"src":"749:36:153","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17702,"nodeType":"UserDefinedTypeName","pathNode":{"id":17701,"name":"IForwarderRegistry","nameLocations":["749:18:153"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"749:18:153"},"referencedDeclaration":13386,"src":"749:18:153","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"574:217:153"},"returnParameters":{"id":17712,"nodeType":"ParameterList","parameters":[],"src":"892:0:153"},"scope":17724,"src":"563:331:153","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17722,"nodeType":"Block","src":"960:34:153","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17719,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35300],"referencedDeclaration":35300,"src":"977:8:153","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"977:10:153","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17718,"id":17721,"nodeType":"Return","src":"970:17:153"}]},"functionSelector":"31e66e1e","id":17723,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"909:9:153","nodeType":"FunctionDefinition","parameters":{"id":17715,"nodeType":"ParameterList","parameters":[],"src":"918:2:153"},"returnParameters":{"id":17718,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17717,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17723,"src":"944:14:153","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17716,"name":"bytes","nodeType":"ElementaryTypeName","src":"944:5:153","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"943:16:153"},"scope":17724,"src":"900:94:153","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17725,"src":"495:501:153","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,32174,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:965:153"},"id":153},"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol","exportedSymbols":{"ERC721Full":[35079],"ERC721FullMock":[17771],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704]},"id":17772,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17726,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:154"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17728,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17772,"sourceUnit":13387,"src":"57:90:154","symbolAliases":[{"foreign":{"id":17727,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:154","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":17730,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17772,"sourceUnit":37475,"src":"148:107:154","symbolAliases":[{"foreign":{"id":17729,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"156:23:154","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol","id":17732,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17772,"sourceUnit":36705,"src":"256:106:154","symbolAliases":[{"foreign":{"id":17731,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"264:22:154","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/ERC721Full.sol","file":"./../../../../token/ERC721/preset/ERC721Full.sol","id":17734,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17772,"sourceUnit":35080,"src":"363:76:154","symbolAliases":[{"foreign":{"id":17733,"name":"ERC721Full","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35079,"src":"371:10:154","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17736,"name":"ERC721Full","nameLocations":["494:10:154"],"nodeType":"IdentifierPath","referencedDeclaration":35079,"src":"494:10:154"},"id":17737,"nodeType":"InheritanceSpecifier","src":"494:10:154"}],"canonicalName":"ERC721FullMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":17735,"nodeType":"StructuredDocumentation","src":"441:26:154","text":"@title ERC721FullMock"},"fullyImplemented":true,"id":17771,"linearizedBaseContracts":[17771,35079,13142,13370,13297,19661,36915,30831,30924,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31446,31700,37073,32102,1206,8562,19938,8546,33144,33199,33109,33094],"name":"ERC721FullMock","nameLocation":"476:14:154","nodeType":"ContractDefinition","nodes":[{"body":{"id":17760,"nodeType":"Block","src":"828:2:154","statements":[]},"id":17761,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17753,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17739,"src":"751:9:154","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17754,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17741,"src":"762:11:154","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":17755,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17744,"src":"775:16:154","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},{"id":17756,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17747,"src":"793:14:154","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},{"id":17757,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17750,"src":"809:17:154","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17758,"kind":"baseConstructorSpecifier","modifierName":{"id":17752,"name":"ERC721Full","nameLocations":["740:10:154"],"nodeType":"IdentifierPath","referencedDeclaration":35079,"src":"740:10:154"},"nodeType":"ModifierInvocation","src":"740:87:154"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17751,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17739,"mutability":"mutable","name":"tokenName","nameLocation":"546:9:154","nodeType":"VariableDeclaration","scope":17761,"src":"532:23:154","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17738,"name":"string","nodeType":"ElementaryTypeName","src":"532:6:154","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17741,"mutability":"mutable","name":"tokenSymbol","nameLocation":"579:11:154","nodeType":"VariableDeclaration","scope":17761,"src":"565:25:154","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":17740,"name":"string","nodeType":"ElementaryTypeName","src":"565:6:154","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":17744,"mutability":"mutable","name":"metadataResolver","nameLocation":"623:16:154","nodeType":"VariableDeclaration","scope":17761,"src":"600:39:154","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":17743,"nodeType":"UserDefinedTypeName","pathNode":{"id":17742,"name":"ITokenMetadataResolver","nameLocations":["600:22:154"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"600:22:154"},"referencedDeclaration":36704,"src":"600:22:154","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":17747,"mutability":"mutable","name":"filterRegistry","nameLocation":"673:14:154","nodeType":"VariableDeclaration","scope":17761,"src":"649:38:154","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":17746,"nodeType":"UserDefinedTypeName","pathNode":{"id":17745,"name":"IOperatorFilterRegistry","nameLocations":["649:23:154"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"649:23:154"},"referencedDeclaration":37474,"src":"649:23:154","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":17750,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"716:17:154","nodeType":"VariableDeclaration","scope":17761,"src":"697:36:154","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17749,"nodeType":"UserDefinedTypeName","pathNode":{"id":17748,"name":"IForwarderRegistry","nameLocations":["697:18:154"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"697:18:154"},"referencedDeclaration":13386,"src":"697:18:154","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"522:217:154"},"returnParameters":{"id":17759,"nodeType":"ParameterList","parameters":[],"src":"828:0:154"},"scope":17771,"src":"511:319:154","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17769,"nodeType":"Block","src":"896:34:154","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17766,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35078],"referencedDeclaration":35078,"src":"913:8:154","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"913:10:154","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17765,"id":17768,"nodeType":"Return","src":"906:17:154"}]},"functionSelector":"31e66e1e","id":17770,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"845:9:154","nodeType":"FunctionDefinition","parameters":{"id":17762,"nodeType":"ParameterList","parameters":[],"src":"854:2:154"},"returnParameters":{"id":17765,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17764,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17770,"src":"880:14:154","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17763,"name":"bytes","nodeType":"ElementaryTypeName","src":"880:5:154","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"879:16:154"},"scope":17771,"src":"836:94:154","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17772,"src":"467:465:154","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:901:154"},"id":154},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol","exportedSymbols":{"ERC721FullBurnProxied":[35502],"ERC721FullBurnProxiedMock":[17799],"IForwarderRegistry":[13386]},"id":17800,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17773,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:155"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":17775,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17800,"sourceUnit":13387,"src":"57:93:155","symbolAliases":[{"foreign":{"id":17774,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:155","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol","file":"./../../../../../token/ERC721/preset/proxied/ERC721FullBurnProxied.sol","id":17777,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17800,"sourceUnit":35503,"src":"151:109:155","symbolAliases":[{"foreign":{"id":17776,"name":"ERC721FullBurnProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35502,"src":"159:21:155","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17778,"name":"ERC721FullBurnProxied","nameLocations":["300:21:155"],"nodeType":"IdentifierPath","referencedDeclaration":35502,"src":"300:21:155"},"id":17779,"nodeType":"InheritanceSpecifier","src":"300:21:155"}],"canonicalName":"ERC721FullBurnProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17799,"linearizedBaseContracts":[17799,35502,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31389,31446,31700,31583,33168,36683,31330,32102,1206,19938,8546,8562,33130,33144,33199,33109,33094],"name":"ERC721FullBurnProxiedMock","nameLocation":"271:25:155","nodeType":"ContractDefinition","nodes":[{"body":{"id":17788,"nodeType":"Block","src":"419:2:155","statements":[]},"id":17789,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17785,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17782,"src":"400:17:155","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17786,"kind":"baseConstructorSpecifier","modifierName":{"id":17784,"name":"ERC721FullBurnProxied","nameLocations":["378:21:155"],"nodeType":"IdentifierPath","referencedDeclaration":35502,"src":"378:21:155"},"nodeType":"ModifierInvocation","src":"378:40:155"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17783,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17782,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"359:17:155","nodeType":"VariableDeclaration","scope":17789,"src":"340:36:155","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17781,"nodeType":"UserDefinedTypeName","pathNode":{"id":17780,"name":"IForwarderRegistry","nameLocations":["340:18:155"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"340:18:155"},"referencedDeclaration":13386,"src":"340:18:155","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"339:38:155"},"returnParameters":{"id":17787,"nodeType":"ParameterList","parameters":[],"src":"419:0:155"},"scope":17799,"src":"328:93:155","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17797,"nodeType":"Block","src":"487:34:155","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17794,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35501],"referencedDeclaration":35501,"src":"504:8:155","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17795,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"504:10:155","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17793,"id":17796,"nodeType":"Return","src":"497:17:155"}]},"functionSelector":"31e66e1e","id":17798,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"436:9:155","nodeType":"FunctionDefinition","parameters":{"id":17790,"nodeType":"ParameterList","parameters":[],"src":"445:2:155"},"returnParameters":{"id":17793,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17792,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17798,"src":"471:14:155","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17791,"name":"bytes","nodeType":"ElementaryTypeName","src":"471:5:155","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"470:16:155"},"scope":17799,"src":"427:94:155","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17800,"src":"262:261:155","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:492:155"},"id":155},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol","exportedSymbols":{"ERC721FullMintOnceBurnProxied":[35703],"ERC721FullMintOnceBurnProxiedMock":[17827],"IForwarderRegistry":[13386]},"id":17828,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17801,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:156"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":17803,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17828,"sourceUnit":13387,"src":"57:93:156","symbolAliases":[{"foreign":{"id":17802,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:156","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol","file":"./../../../../../token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol","id":17805,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17828,"sourceUnit":35704,"src":"151:125:156","symbolAliases":[{"foreign":{"id":17804,"name":"ERC721FullMintOnceBurnProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35703,"src":"159:29:156","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17806,"name":"ERC721FullMintOnceBurnProxied","nameLocations":["324:29:156"],"nodeType":"IdentifierPath","referencedDeclaration":35703,"src":"324:29:156"},"id":17807,"nodeType":"InheritanceSpecifier","src":"324:29:156"}],"canonicalName":"ERC721FullMintOnceBurnProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17827,"linearizedBaseContracts":[17827,35703,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31389,31503,31833,31583,33168,36683,31330,32102,1206,19938,8546,8562,33130,33144,33199,33109,33094],"name":"ERC721FullMintOnceBurnProxiedMock","nameLocation":"287:33:156","nodeType":"ContractDefinition","nodes":[{"body":{"id":17816,"nodeType":"Block","src":"459:2:156","statements":[]},"id":17817,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17813,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17810,"src":"440:17:156","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17814,"kind":"baseConstructorSpecifier","modifierName":{"id":17812,"name":"ERC721FullMintOnceBurnProxied","nameLocations":["410:29:156"],"nodeType":"IdentifierPath","referencedDeclaration":35703,"src":"410:29:156"},"nodeType":"ModifierInvocation","src":"410:48:156"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17811,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17810,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"391:17:156","nodeType":"VariableDeclaration","scope":17817,"src":"372:36:156","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17809,"nodeType":"UserDefinedTypeName","pathNode":{"id":17808,"name":"IForwarderRegistry","nameLocations":["372:18:156"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"372:18:156"},"referencedDeclaration":13386,"src":"372:18:156","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"371:38:156"},"returnParameters":{"id":17815,"nodeType":"ParameterList","parameters":[],"src":"459:0:156"},"scope":17827,"src":"360:101:156","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17825,"nodeType":"Block","src":"527:34:156","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17822,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35702],"referencedDeclaration":35702,"src":"544:8:156","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17823,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"544:10:156","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17821,"id":17824,"nodeType":"Return","src":"537:17:156"}]},"functionSelector":"31e66e1e","id":17826,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"476:9:156","nodeType":"FunctionDefinition","parameters":{"id":17818,"nodeType":"ParameterList","parameters":[],"src":"485:2:156"},"returnParameters":{"id":17821,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17820,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17826,"src":"511:14:156","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17819,"name":"bytes","nodeType":"ElementaryTypeName","src":"511:5:156","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"510:16:156"},"scope":17827,"src":"467:94:156","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17828,"src":"278:285:156","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,32174,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:532:156"},"id":156},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol","exportedSymbols":{"ERC721FullProxied":[35895],"ERC721FullProxiedMock":[17855],"IForwarderRegistry":[13386]},"id":17856,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17829,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:157"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../../metatx/interfaces/IForwarderRegistry.sol","id":17831,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17856,"sourceUnit":13387,"src":"57:93:157","symbolAliases":[{"foreign":{"id":17830,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:157","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol","file":"./../../../../../token/ERC721/preset/proxied/ERC721FullProxied.sol","id":17833,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17856,"sourceUnit":35896,"src":"151:101:157","symbolAliases":[{"foreign":{"id":17832,"name":"ERC721FullProxied","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35895,"src":"159:17:157","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17834,"name":"ERC721FullProxied","nameLocations":["288:17:157"],"nodeType":"IdentifierPath","referencedDeclaration":35895,"src":"288:17:157"},"id":17835,"nodeType":"InheritanceSpecifier","src":"288:17:157"}],"canonicalName":"ERC721FullProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17855,"linearizedBaseContracts":[17855,35895,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31446,31700,31583,33168,36683,31330,32102,1206,19938,8546,8562,33144,33199,33109,33094],"name":"ERC721FullProxiedMock","nameLocation":"263:21:157","nodeType":"ContractDefinition","nodes":[{"body":{"id":17844,"nodeType":"Block","src":"399:2:157","statements":[]},"id":17845,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17841,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17838,"src":"380:17:157","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17842,"kind":"baseConstructorSpecifier","modifierName":{"id":17840,"name":"ERC721FullProxied","nameLocations":["362:17:157"],"nodeType":"IdentifierPath","referencedDeclaration":35895,"src":"362:17:157"},"nodeType":"ModifierInvocation","src":"362:36:157"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17838,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"343:17:157","nodeType":"VariableDeclaration","scope":17845,"src":"324:36:157","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17837,"nodeType":"UserDefinedTypeName","pathNode":{"id":17836,"name":"IForwarderRegistry","nameLocations":["324:18:157"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"324:18:157"},"referencedDeclaration":13386,"src":"324:18:157","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"323:38:157"},"returnParameters":{"id":17843,"nodeType":"ParameterList","parameters":[],"src":"399:0:157"},"scope":17855,"src":"312:89:157","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17853,"nodeType":"Block","src":"467:34:157","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17850,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[35894],"referencedDeclaration":35894,"src":"484:8:157","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17851,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"484:10:157","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17849,"id":17852,"nodeType":"Return","src":"477:17:157"}]},"functionSelector":"31e66e1e","id":17854,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"416:9:157","nodeType":"FunctionDefinition","parameters":{"id":17846,"nodeType":"ParameterList","parameters":[],"src":"425:2:157"},"returnParameters":{"id":17849,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17848,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17854,"src":"451:14:157","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17847,"name":"bytes","nodeType":"ElementaryTypeName","src":"451:5:157","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"450:16:157"},"scope":17855,"src":"407:94:157","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":17856,"src":"254:249:157","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:472:157"},"id":157},"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC721Base":[31227],"ERC721BatchTransferBase":[31269],"ERC721MintableBase":[31700],"ERC721Storage":[34972],"ERC721WithoutOperatorFiltererProxiedMock":[17981],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":17982,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17857,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:158"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":17859,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":13387,"src":"57:90:158","symbolAliases":[{"foreign":{"id":17858,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../../../../token/ERC721/libraries/ERC721Storage.sol","id":17861,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":34973,"src":"148:85:158","symbolAliases":[{"foreign":{"id":17860,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"156:13:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":17863,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":9110,"src":"234:101:158","symbolAliases":[{"foreign":{"id":17862,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"242:24:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../../introspection/libraries/InterfaceDetectionStorage.sol","id":17865,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":11681,"src":"336:110:158","symbolAliases":[{"foreign":{"id":17864,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"344:25:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721Base.sol","file":"./../../../../token/ERC721/base/ERC721Base.sol","id":17867,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":31228,"src":"447:74:158","symbolAliases":[{"foreign":{"id":17866,"name":"ERC721Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31227,"src":"455:10:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferBase.sol","file":"./../../../../token/ERC721/base/ERC721BatchTransferBase.sol","id":17869,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":31270,"src":"522:100:158","symbolAliases":[{"foreign":{"id":17868,"name":"ERC721BatchTransferBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31269,"src":"530:23:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","file":"./../../../../token/ERC721/base/ERC721MintableBase.sol","id":17871,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":31701,"src":"623:90:158","symbolAliases":[{"foreign":{"id":17870,"name":"ERC721MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31700,"src":"631:18:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":17873,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":8140,"src":"714:90:158","symbolAliases":[{"foreign":{"id":17872,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"722:21:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":17875,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":8092,"src":"805:82:158","symbolAliases":[{"foreign":{"id":17874,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"813:17:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":17877,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":11555,"src":"888:86:158","symbolAliases":[{"foreign":{"id":17876,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"896:18:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":17879,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":1207,"src":"975:66:158","symbolAliases":[{"foreign":{"id":17878,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"983:7:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":17881,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":13298,"src":"1042:104:158","symbolAliases":[{"foreign":{"id":17880,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1050:28:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":17883,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":17982,"sourceUnit":13143,"src":"1147:91:158","symbolAliases":[{"foreign":{"id":17882,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1155:24:158","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17884,"name":"ERC721Base","nameLocations":["1297:10:158"],"nodeType":"IdentifierPath","referencedDeclaration":31227,"src":"1297:10:158"},"id":17885,"nodeType":"InheritanceSpecifier","src":"1297:10:158"},{"baseName":{"id":17886,"name":"ERC721BatchTransferBase","nameLocations":["1313:23:158"],"nodeType":"IdentifierPath","referencedDeclaration":31269,"src":"1313:23:158"},"id":17887,"nodeType":"InheritanceSpecifier","src":"1313:23:158"},{"baseName":{"id":17888,"name":"ERC721MintableBase","nameLocations":["1342:18:158"],"nodeType":"IdentifierPath","referencedDeclaration":31700,"src":"1342:18:158"},"id":17889,"nodeType":"InheritanceSpecifier","src":"1342:18:158"},{"baseName":{"id":17890,"name":"ContractOwnershipBase","nameLocations":["1366:21:158"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"1366:21:158"},"id":17891,"nodeType":"InheritanceSpecifier","src":"1366:21:158"},{"baseName":{"id":17892,"name":"AccessControlBase","nameLocations":["1393:17:158"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"1393:17:158"},"id":17893,"nodeType":"InheritanceSpecifier","src":"1393:17:158"},{"baseName":{"id":17894,"name":"InterfaceDetection","nameLocations":["1416:18:158"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"1416:18:158"},"id":17895,"nodeType":"InheritanceSpecifier","src":"1416:18:158"},{"baseName":{"id":17896,"name":"ForwarderRegistryContext","nameLocations":["1440:24:158"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1440:24:158"},"id":17897,"nodeType":"InheritanceSpecifier","src":"1440:24:158"}],"canonicalName":"ERC721WithoutOperatorFiltererProxiedMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":17981,"linearizedBaseContracts":[17981,13142,13370,13297,11554,11579,8091,8139,31700,31269,31227,1206,8546,8562,33199,33109,33094],"name":"ERC721WithoutOperatorFiltererProxiedMock","nameLocation":"1249:40:158","nodeType":"ContractDefinition","nodes":[{"global":false,"id":17901,"libraryName":{"id":17898,"name":"ContractOwnershipStorage","nameLocations":["1477:24:158"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"1477:24:158"},"nodeType":"UsingForDirective","src":"1471:67:158","typeName":{"id":17900,"nodeType":"UserDefinedTypeName","pathNode":{"id":17899,"name":"ContractOwnershipStorage.Layout","nameLocations":["1506:24:158","1531:6:158"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"1506:31:158"},"referencedDeclaration":8882,"src":"1506:31:158","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":17905,"libraryName":{"id":17902,"name":"InterfaceDetectionStorage","nameLocations":["1549:25:158"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1549:25:158"},"nodeType":"UsingForDirective","src":"1543:69:158","typeName":{"id":17904,"nodeType":"UserDefinedTypeName","pathNode":{"id":17903,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1579:25:158","1605:6:158"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1579:32:158"},"referencedDeclaration":11590,"src":"1579:32:158","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":17914,"nodeType":"Block","src":"1712:2:158","statements":[]},"id":17915,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":17911,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17908,"src":"1693:17:158","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":17912,"kind":"baseConstructorSpecifier","modifierName":{"id":17910,"name":"ForwarderRegistryContext","nameLocations":["1668:24:158"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1668:24:158"},"nodeType":"ModifierInvocation","src":"1668:43:158"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17909,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17908,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1649:17:158","nodeType":"VariableDeclaration","scope":17915,"src":"1630:36:158","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":17907,"nodeType":"UserDefinedTypeName","pathNode":{"id":17906,"name":"IForwarderRegistry","nameLocations":["1630:18:158"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1630:18:158"},"referencedDeclaration":13386,"src":"1630:18:158","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1629:38:158"},"returnParameters":{"id":17913,"nodeType":"ParameterList","parameters":[],"src":"1712:0:158"},"scope":17981,"src":"1618:96:158","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":17942,"nodeType":"Block","src":"1745:197:158","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":17923,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[17966],"referencedDeclaration":17966,"src":"1799:10:158","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":17924,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1799:12:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17918,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1755:24:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":17920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1780:6:158","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1755:31:158","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":17921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1755:33:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":17922,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1789:9:158","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"1755:43:158","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":17925,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1755:57:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17926,"nodeType":"ExpressionStatement","src":"1755:57:158"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17927,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1822:13:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":17929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1836:4:158","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"1822:18:158","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":17930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1822:20:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17931,"nodeType":"ExpressionStatement","src":"1822:20:158"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17932,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1852:13:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":17934,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1866:23:158","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"1852:37:158","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":17935,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1852:39:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17936,"nodeType":"ExpressionStatement","src":"1852:39:158"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17937,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1901:13:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":17939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1915:18:158","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"1901:32:158","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":17940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1901:34:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":17941,"nodeType":"ExpressionStatement","src":"1901:34:158"}]},"functionSelector":"e1c7392a","id":17943,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"1729:4:158","nodeType":"FunctionDefinition","parameters":{"id":17916,"nodeType":"ParameterList","parameters":[],"src":"1733:2:158"},"returnParameters":{"id":17917,"nodeType":"ParameterList","parameters":[],"src":"1745:0:158"},"scope":17981,"src":"1720:222:158","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":17951,"nodeType":"Block","src":"2008:34:158","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":17948,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[17980],"referencedDeclaration":17980,"src":"2025:8:158","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17949,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2025:10:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17947,"id":17950,"nodeType":"Return","src":"2018:17:158"}]},"functionSelector":"31e66e1e","id":17952,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"1957:9:158","nodeType":"FunctionDefinition","parameters":{"id":17944,"nodeType":"ParameterList","parameters":[],"src":"1966:2:158"},"returnParameters":{"id":17947,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17946,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17952,"src":"1992:14:158","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17945,"name":"bytes","nodeType":"ElementaryTypeName","src":"1992:5:158","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1991:16:158"},"scope":17981,"src":"1948:94:158","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":17965,"nodeType":"Block","src":"2207:65:158","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17961,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2224:28:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":17962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2253:10:158","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2224:39:158","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":17963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2224:41:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":17960,"id":17964,"nodeType":"Return","src":"2217:48:158"}]},"documentation":{"id":17953,"nodeType":"StructuredDocumentation","src":"2048:44:158","text":"@inheritdoc ForwarderRegistryContextBase"},"id":17966,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"2106:10:158","nodeType":"FunctionDefinition","overrides":{"id":17957,"nodeType":"OverrideSpecifier","overrides":[{"id":17955,"name":"Context","nameLocations":["2150:7:158"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2150:7:158"},{"id":17956,"name":"ForwarderRegistryContextBase","nameLocations":["2159:28:158"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2159:28:158"}],"src":"2141:47:158"},"parameters":{"id":17954,"nodeType":"ParameterList","parameters":[],"src":"2116:2:158"},"returnParameters":{"id":17960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17959,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17966,"src":"2198:7:158","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17958,"name":"address","nodeType":"ElementaryTypeName","src":"2198:7:158","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2197:9:158"},"scope":17981,"src":"2097:175:158","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":17979,"nodeType":"Block","src":"2442:63:158","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":17975,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2459:28:158","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":17976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2488:8:158","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2459:37:158","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":17977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2459:39:158","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":17974,"id":17978,"nodeType":"Return","src":"2452:46:158"}]},"documentation":{"id":17967,"nodeType":"StructuredDocumentation","src":"2278:44:158","text":"@inheritdoc ForwarderRegistryContextBase"},"id":17980,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2336:8:158","nodeType":"FunctionDefinition","overrides":{"id":17971,"nodeType":"OverrideSpecifier","overrides":[{"id":17969,"name":"Context","nameLocations":["2378:7:158"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2378:7:158"},{"id":17970,"name":"ForwarderRegistryContextBase","nameLocations":["2387:28:158"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2387:28:158"}],"src":"2369:47:158"},"parameters":{"id":17968,"nodeType":"ParameterList","parameters":[],"src":"2344:2:158"},"returnParameters":{"id":17974,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17973,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":17980,"src":"2426:14:158","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":17972,"name":"bytes","nodeType":"ElementaryTypeName","src":"2426:5:158","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2425:16:158"},"scope":17981,"src":"2327:178:158","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":17982,"src":"1240:1267:158","usedErrors":[8223,8246,11559,19192,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:2476:158"},"id":158},"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol","exportedSymbols":{"IOperatorFilterRegistry":[37474],"OperatorFilterRegistryMock":[18217]},"id":18218,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":17983,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:159"},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../token/royalty/interfaces/IOperatorFilterRegistry.sol","id":17985,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18218,"sourceUnit":37475,"src":"57:104:159","symbolAliases":[{"foreign":{"id":17984,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"65:23:159","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":17986,"name":"IOperatorFilterRegistry","nameLocations":["202:23:159"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"202:23:159"},"id":17987,"nodeType":"InheritanceSpecifier","src":"202:23:159"}],"canonicalName":"OperatorFilterRegistryMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":18217,"linearizedBaseContracts":[18217,37474],"name":"OperatorFilterRegistryMock","nameLocation":"172:26:159","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"695cfe3a","id":17989,"mutability":"mutable","name":"operatorAllowed","nameLocation":"244:15:159","nodeType":"VariableDeclaration","scope":18217,"src":"232:27:159","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17988,"name":"bool","nodeType":"ElementaryTypeName","src":"232:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"public"},{"body":{"id":17998,"nodeType":"Block","src":"292:42:159","statements":[{"expression":{"id":17996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":17994,"name":"operatorAllowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17989,"src":"302:15:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":17995,"name":"allowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17991,"src":"320:7:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"302:25:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":17997,"nodeType":"ExpressionStatement","src":"302:25:159"}]},"id":17999,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":17992,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17991,"mutability":"mutable","name":"allowed","nameLocation":"283:7:159","nodeType":"VariableDeclaration","scope":17999,"src":"278:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":17990,"name":"bool","nodeType":"ElementaryTypeName","src":"278:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"277:14:159"},"returnParameters":{"id":17993,"nodeType":"ParameterList","parameters":[],"src":"292:0:159"},"scope":18217,"src":"266:68:159","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[37291],"body":{"id":18010,"nodeType":"Block","src":"414:39:159","statements":[{"expression":{"id":18008,"name":"operatorAllowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":17989,"src":"431:15:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":18007,"id":18009,"nodeType":"Return","src":"424:22:159"}]},"functionSelector":"c6171134","id":18011,"implemented":true,"kind":"function","modifiers":[],"name":"isOperatorAllowed","nameLocation":"349:17:159","nodeType":"FunctionDefinition","parameters":{"id":18004,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18001,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18011,"src":"367:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18000,"name":"address","nodeType":"ElementaryTypeName","src":"367:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18003,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18011,"src":"376:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18002,"name":"address","nodeType":"ElementaryTypeName","src":"376:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"366:18:159"},"returnParameters":{"id":18007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18006,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18011,"src":"408:4:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18005,"name":"bool","nodeType":"ElementaryTypeName","src":"408:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"407:6:159"},"scope":18217,"src":"340:113:159","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[37296],"body":{"id":18016,"nodeType":"Block","src":"506:2:159","statements":[]},"functionSelector":"4420e486","id":18017,"implemented":true,"kind":"function","modifiers":[],"name":"register","nameLocation":"468:8:159","nodeType":"FunctionDefinition","parameters":{"id":18014,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18013,"mutability":"mutable","name":"registrant","nameLocation":"485:10:159","nodeType":"VariableDeclaration","scope":18017,"src":"477:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18012,"name":"address","nodeType":"ElementaryTypeName","src":"477:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"476:20:159"},"returnParameters":{"id":18015,"nodeType":"ParameterList","parameters":[],"src":"506:0:159"},"scope":18217,"src":"459:49:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37303],"body":{"id":18024,"nodeType":"Block","src":"595:2:159","statements":[]},"functionSelector":"7d3e3dbe","id":18025,"implemented":true,"kind":"function","modifiers":[],"name":"registerAndSubscribe","nameLocation":"523:20:159","nodeType":"FunctionDefinition","parameters":{"id":18022,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18019,"mutability":"mutable","name":"registrant","nameLocation":"552:10:159","nodeType":"VariableDeclaration","scope":18025,"src":"544:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18018,"name":"address","nodeType":"ElementaryTypeName","src":"544:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18021,"mutability":"mutable","name":"subscription","nameLocation":"572:12:159","nodeType":"VariableDeclaration","scope":18025,"src":"564:20:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18020,"name":"address","nodeType":"ElementaryTypeName","src":"564:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"543:42:159"},"returnParameters":{"id":18023,"nodeType":"ParameterList","parameters":[],"src":"595:0:159"},"scope":18217,"src":"514:83:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37310],"body":{"id":18032,"nodeType":"Block","src":"690:2:159","statements":[]},"functionSelector":"a0af2903","id":18033,"implemented":true,"kind":"function","modifiers":[],"name":"registerAndCopyEntries","nameLocation":"612:22:159","nodeType":"FunctionDefinition","parameters":{"id":18030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18027,"mutability":"mutable","name":"registrant","nameLocation":"643:10:159","nodeType":"VariableDeclaration","scope":18033,"src":"635:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18026,"name":"address","nodeType":"ElementaryTypeName","src":"635:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18029,"mutability":"mutable","name":"registrantToCopy","nameLocation":"663:16:159","nodeType":"VariableDeclaration","scope":18033,"src":"655:24:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18028,"name":"address","nodeType":"ElementaryTypeName","src":"655:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"634:46:159"},"returnParameters":{"id":18031,"nodeType":"ParameterList","parameters":[],"src":"690:0:159"},"scope":18217,"src":"603:89:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37315],"body":{"id":18038,"nodeType":"Block","src":"741:2:159","statements":[]},"functionSelector":"2ec2c246","id":18039,"implemented":true,"kind":"function","modifiers":[],"name":"unregister","nameLocation":"707:10:159","nodeType":"FunctionDefinition","parameters":{"id":18036,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18035,"mutability":"mutable","name":"addr","nameLocation":"726:4:159","nodeType":"VariableDeclaration","scope":18039,"src":"718:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18034,"name":"address","nodeType":"ElementaryTypeName","src":"718:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"717:14:159"},"returnParameters":{"id":18037,"nodeType":"ParameterList","parameters":[],"src":"741:0:159"},"scope":18217,"src":"698:45:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37324],"body":{"id":18048,"nodeType":"Block","src":"835:2:159","statements":[]},"functionSelector":"a2f367ab","id":18049,"implemented":true,"kind":"function","modifiers":[],"name":"updateOperator","nameLocation":"758:14:159","nodeType":"FunctionDefinition","parameters":{"id":18046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18041,"mutability":"mutable","name":"registrant","nameLocation":"781:10:159","nodeType":"VariableDeclaration","scope":18049,"src":"773:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18040,"name":"address","nodeType":"ElementaryTypeName","src":"773:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18043,"mutability":"mutable","name":"operator","nameLocation":"801:8:159","nodeType":"VariableDeclaration","scope":18049,"src":"793:16:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18042,"name":"address","nodeType":"ElementaryTypeName","src":"793:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18045,"mutability":"mutable","name":"filtered","nameLocation":"816:8:159","nodeType":"VariableDeclaration","scope":18049,"src":"811:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18044,"name":"bool","nodeType":"ElementaryTypeName","src":"811:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"772:53:159"},"returnParameters":{"id":18047,"nodeType":"ParameterList","parameters":[],"src":"835:0:159"},"scope":18217,"src":"749:88:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37334],"body":{"id":18059,"nodeType":"Block","src":"942:2:159","statements":[]},"functionSelector":"a14584c1","id":18060,"implemented":true,"kind":"function","modifiers":[],"name":"updateOperators","nameLocation":"852:15:159","nodeType":"FunctionDefinition","parameters":{"id":18057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18051,"mutability":"mutable","name":"registrant","nameLocation":"876:10:159","nodeType":"VariableDeclaration","scope":18060,"src":"868:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18050,"name":"address","nodeType":"ElementaryTypeName","src":"868:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18054,"mutability":"mutable","name":"operators","nameLocation":"907:9:159","nodeType":"VariableDeclaration","scope":18060,"src":"888:28:159","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":18052,"name":"address","nodeType":"ElementaryTypeName","src":"888:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18053,"nodeType":"ArrayTypeName","src":"888:9:159","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":18056,"mutability":"mutable","name":"filtered","nameLocation":"923:8:159","nodeType":"VariableDeclaration","scope":18060,"src":"918:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18055,"name":"bool","nodeType":"ElementaryTypeName","src":"918:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"867:65:159"},"returnParameters":{"id":18058,"nodeType":"ParameterList","parameters":[],"src":"942:0:159"},"scope":18217,"src":"843:101:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37343],"body":{"id":18069,"nodeType":"Block","src":"1036:2:159","statements":[]},"functionSelector":"712fc00b","id":18070,"implemented":true,"kind":"function","modifiers":[],"name":"updateCodeHash","nameLocation":"959:14:159","nodeType":"FunctionDefinition","parameters":{"id":18067,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18062,"mutability":"mutable","name":"registrant","nameLocation":"982:10:159","nodeType":"VariableDeclaration","scope":18070,"src":"974:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18061,"name":"address","nodeType":"ElementaryTypeName","src":"974:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18064,"mutability":"mutable","name":"codehash","nameLocation":"1002:8:159","nodeType":"VariableDeclaration","scope":18070,"src":"994:16:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18063,"name":"bytes32","nodeType":"ElementaryTypeName","src":"994:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":18066,"mutability":"mutable","name":"filtered","nameLocation":"1017:8:159","nodeType":"VariableDeclaration","scope":18070,"src":"1012:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18065,"name":"bool","nodeType":"ElementaryTypeName","src":"1012:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"973:53:159"},"returnParameters":{"id":18068,"nodeType":"ParameterList","parameters":[],"src":"1036:0:159"},"scope":18217,"src":"950:88:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37353],"body":{"id":18080,"nodeType":"Block","src":"1145:2:159","statements":[]},"functionSelector":"063298b6","id":18081,"implemented":true,"kind":"function","modifiers":[],"name":"updateCodeHashes","nameLocation":"1053:16:159","nodeType":"FunctionDefinition","parameters":{"id":18078,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18072,"mutability":"mutable","name":"registrant","nameLocation":"1078:10:159","nodeType":"VariableDeclaration","scope":18081,"src":"1070:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18071,"name":"address","nodeType":"ElementaryTypeName","src":"1070:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18075,"mutability":"mutable","name":"codeHashes","nameLocation":"1109:10:159","nodeType":"VariableDeclaration","scope":18081,"src":"1090:29:159","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":18073,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1090:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18074,"nodeType":"ArrayTypeName","src":"1090:9:159","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":18077,"mutability":"mutable","name":"filtered","nameLocation":"1126:8:159","nodeType":"VariableDeclaration","scope":18081,"src":"1121:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18076,"name":"bool","nodeType":"ElementaryTypeName","src":"1121:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1069:66:159"},"returnParameters":{"id":18079,"nodeType":"ParameterList","parameters":[],"src":"1145:0:159"},"scope":18217,"src":"1044:103:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37360],"body":{"id":18088,"nodeType":"Block","src":"1232:2:159","statements":[]},"functionSelector":"b314d414","id":18089,"implemented":true,"kind":"function","modifiers":[],"name":"subscribe","nameLocation":"1162:9:159","nodeType":"FunctionDefinition","parameters":{"id":18086,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18083,"mutability":"mutable","name":"registrant","nameLocation":"1180:10:159","nodeType":"VariableDeclaration","scope":18089,"src":"1172:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18082,"name":"address","nodeType":"ElementaryTypeName","src":"1172:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18085,"mutability":"mutable","name":"registrantToSubscribe","nameLocation":"1200:21:159","nodeType":"VariableDeclaration","scope":18089,"src":"1192:29:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18084,"name":"address","nodeType":"ElementaryTypeName","src":"1192:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1171:51:159"},"returnParameters":{"id":18087,"nodeType":"ParameterList","parameters":[],"src":"1232:0:159"},"scope":18217,"src":"1153:81:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37367],"body":{"id":18096,"nodeType":"Block","src":"1316:2:159","statements":[]},"functionSelector":"34a0dc10","id":18097,"implemented":true,"kind":"function","modifiers":[],"name":"unsubscribe","nameLocation":"1249:11:159","nodeType":"FunctionDefinition","parameters":{"id":18094,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18091,"mutability":"mutable","name":"registrant","nameLocation":"1269:10:159","nodeType":"VariableDeclaration","scope":18097,"src":"1261:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18090,"name":"address","nodeType":"ElementaryTypeName","src":"1261:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18093,"mutability":"mutable","name":"copyExistingEntries","nameLocation":"1286:19:159","nodeType":"VariableDeclaration","scope":18097,"src":"1281:24:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18092,"name":"bool","nodeType":"ElementaryTypeName","src":"1281:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1260:46:159"},"returnParameters":{"id":18095,"nodeType":"ParameterList","parameters":[],"src":"1316:0:159"},"scope":18217,"src":"1240:78:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37374],"body":{"id":18104,"nodeType":"Block","src":"1400:2:159","statements":[]},"functionSelector":"3c5030bb","id":18105,"implemented":true,"kind":"function","modifiers":[],"name":"subscriptionOf","nameLocation":"1333:14:159","nodeType":"FunctionDefinition","parameters":{"id":18100,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18099,"mutability":"mutable","name":"addr","nameLocation":"1356:4:159","nodeType":"VariableDeclaration","scope":18105,"src":"1348:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18098,"name":"address","nodeType":"ElementaryTypeName","src":"1348:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1347:14:159"},"returnParameters":{"id":18103,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18102,"mutability":"mutable","name":"registrant","nameLocation":"1388:10:159","nodeType":"VariableDeclaration","scope":18105,"src":"1380:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18101,"name":"address","nodeType":"ElementaryTypeName","src":"1380:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1379:20:159"},"scope":18217,"src":"1324:78:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37382],"body":{"id":18113,"nodeType":"Block","src":"1485:2:159","statements":[]},"functionSelector":"5745ae28","id":18114,"implemented":true,"kind":"function","modifiers":[],"name":"subscribers","nameLocation":"1417:11:159","nodeType":"FunctionDefinition","parameters":{"id":18108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18107,"mutability":"mutable","name":"registrant","nameLocation":"1437:10:159","nodeType":"VariableDeclaration","scope":18114,"src":"1429:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18106,"name":"address","nodeType":"ElementaryTypeName","src":"1429:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1428:20:159"},"returnParameters":{"id":18112,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18111,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18114,"src":"1467:16:159","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":18109,"name":"address","nodeType":"ElementaryTypeName","src":"1467:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18110,"nodeType":"ArrayTypeName","src":"1467:9:159","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"1466:18:159"},"scope":18217,"src":"1408:79:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37391],"body":{"id":18123,"nodeType":"Block","src":"1577:2:159","statements":[]},"functionSelector":"55940e51","id":18124,"implemented":true,"kind":"function","modifiers":[],"name":"subscriberAt","nameLocation":"1502:12:159","nodeType":"FunctionDefinition","parameters":{"id":18119,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18116,"mutability":"mutable","name":"registrant","nameLocation":"1523:10:159","nodeType":"VariableDeclaration","scope":18124,"src":"1515:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18115,"name":"address","nodeType":"ElementaryTypeName","src":"1515:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18118,"mutability":"mutable","name":"index","nameLocation":"1543:5:159","nodeType":"VariableDeclaration","scope":18124,"src":"1535:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18117,"name":"uint256","nodeType":"ElementaryTypeName","src":"1535:7:159","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1514:35:159"},"returnParameters":{"id":18122,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18121,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18124,"src":"1568:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18120,"name":"address","nodeType":"ElementaryTypeName","src":"1568:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1567:9:159"},"scope":18217,"src":"1493:86:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37398],"body":{"id":18131,"nodeType":"Block","src":"1663:2:159","statements":[]},"functionSelector":"1e06b4b4","id":18132,"implemented":true,"kind":"function","modifiers":[],"name":"copyEntriesOf","nameLocation":"1594:13:159","nodeType":"FunctionDefinition","parameters":{"id":18129,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18126,"mutability":"mutable","name":"registrant","nameLocation":"1616:10:159","nodeType":"VariableDeclaration","scope":18132,"src":"1608:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18125,"name":"address","nodeType":"ElementaryTypeName","src":"1608:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18128,"mutability":"mutable","name":"registrantToCopy","nameLocation":"1636:16:159","nodeType":"VariableDeclaration","scope":18132,"src":"1628:24:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18127,"name":"address","nodeType":"ElementaryTypeName","src":"1628:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1607:46:159"},"returnParameters":{"id":18130,"nodeType":"ParameterList","parameters":[],"src":"1663:0:159"},"scope":18217,"src":"1585:80:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37407],"body":{"id":18141,"nodeType":"Block","src":"1761:2:159","statements":[]},"functionSelector":"e4aecb54","id":18142,"implemented":true,"kind":"function","modifiers":[],"name":"isOperatorFiltered","nameLocation":"1680:18:159","nodeType":"FunctionDefinition","parameters":{"id":18137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18134,"mutability":"mutable","name":"registrant","nameLocation":"1707:10:159","nodeType":"VariableDeclaration","scope":18142,"src":"1699:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18133,"name":"address","nodeType":"ElementaryTypeName","src":"1699:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18136,"mutability":"mutable","name":"operator","nameLocation":"1727:8:159","nodeType":"VariableDeclaration","scope":18142,"src":"1719:16:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18135,"name":"address","nodeType":"ElementaryTypeName","src":"1719:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1698:38:159"},"returnParameters":{"id":18140,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18139,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18142,"src":"1755:4:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18138,"name":"bool","nodeType":"ElementaryTypeName","src":"1755:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1754:6:159"},"scope":18217,"src":"1671:92:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37416],"body":{"id":18151,"nodeType":"Block","src":"1869:2:159","statements":[]},"functionSelector":"5eae3173","id":18152,"implemented":true,"kind":"function","modifiers":[],"name":"isCodeHashOfFiltered","nameLocation":"1778:20:159","nodeType":"FunctionDefinition","parameters":{"id":18147,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18144,"mutability":"mutable","name":"registrant","nameLocation":"1807:10:159","nodeType":"VariableDeclaration","scope":18152,"src":"1799:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18143,"name":"address","nodeType":"ElementaryTypeName","src":"1799:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18146,"mutability":"mutable","name":"operatorWithCode","nameLocation":"1827:16:159","nodeType":"VariableDeclaration","scope":18152,"src":"1819:24:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18145,"name":"address","nodeType":"ElementaryTypeName","src":"1819:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1798:46:159"},"returnParameters":{"id":18150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18149,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18152,"src":"1863:4:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18148,"name":"bool","nodeType":"ElementaryTypeName","src":"1863:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1862:6:159"},"scope":18217,"src":"1769:102:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37425],"body":{"id":18161,"nodeType":"Block","src":"1967:2:159","statements":[]},"functionSelector":"6af0c315","id":18162,"implemented":true,"kind":"function","modifiers":[],"name":"isCodeHashFiltered","nameLocation":"1886:18:159","nodeType":"FunctionDefinition","parameters":{"id":18157,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18154,"mutability":"mutable","name":"registrant","nameLocation":"1913:10:159","nodeType":"VariableDeclaration","scope":18162,"src":"1905:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18153,"name":"address","nodeType":"ElementaryTypeName","src":"1905:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18156,"mutability":"mutable","name":"codeHash","nameLocation":"1933:8:159","nodeType":"VariableDeclaration","scope":18162,"src":"1925:16:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18155,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1925:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1904:38:159"},"returnParameters":{"id":18160,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18159,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18162,"src":"1961:4:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18158,"name":"bool","nodeType":"ElementaryTypeName","src":"1961:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1960:6:159"},"scope":18217,"src":"1877:92:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37433],"body":{"id":18170,"nodeType":"Block","src":"2052:2:159","statements":[]},"functionSelector":"c4308805","id":18171,"implemented":true,"kind":"function","modifiers":[],"name":"filteredOperators","nameLocation":"1984:17:159","nodeType":"FunctionDefinition","parameters":{"id":18165,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18164,"mutability":"mutable","name":"addr","nameLocation":"2010:4:159","nodeType":"VariableDeclaration","scope":18171,"src":"2002:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18163,"name":"address","nodeType":"ElementaryTypeName","src":"2002:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2001:14:159"},"returnParameters":{"id":18169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18168,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18171,"src":"2034:16:159","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":18166,"name":"address","nodeType":"ElementaryTypeName","src":"2034:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18167,"nodeType":"ArrayTypeName","src":"2034:9:159","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"2033:18:159"},"scope":18217,"src":"1975:79:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37441],"body":{"id":18179,"nodeType":"Block","src":"2138:2:159","statements":[]},"functionSelector":"22fa2762","id":18180,"implemented":true,"kind":"function","modifiers":[],"name":"filteredCodeHashes","nameLocation":"2069:18:159","nodeType":"FunctionDefinition","parameters":{"id":18174,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18173,"mutability":"mutable","name":"addr","nameLocation":"2096:4:159","nodeType":"VariableDeclaration","scope":18180,"src":"2088:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18172,"name":"address","nodeType":"ElementaryTypeName","src":"2088:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2087:14:159"},"returnParameters":{"id":18178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18177,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18180,"src":"2120:16:159","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":18175,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2120:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18176,"nodeType":"ArrayTypeName","src":"2120:9:159","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"2119:18:159"},"scope":18217,"src":"2060:80:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37450],"body":{"id":18189,"nodeType":"Block","src":"2236:2:159","statements":[]},"functionSelector":"3f1cc5fa","id":18190,"implemented":true,"kind":"function","modifiers":[],"name":"filteredOperatorAt","nameLocation":"2155:18:159","nodeType":"FunctionDefinition","parameters":{"id":18185,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18182,"mutability":"mutable","name":"registrant","nameLocation":"2182:10:159","nodeType":"VariableDeclaration","scope":18190,"src":"2174:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18181,"name":"address","nodeType":"ElementaryTypeName","src":"2174:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18184,"mutability":"mutable","name":"index","nameLocation":"2202:5:159","nodeType":"VariableDeclaration","scope":18190,"src":"2194:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18183,"name":"uint256","nodeType":"ElementaryTypeName","src":"2194:7:159","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2173:35:159"},"returnParameters":{"id":18188,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18187,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18190,"src":"2227:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18186,"name":"address","nodeType":"ElementaryTypeName","src":"2227:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2226:9:159"},"scope":18217,"src":"2146:92:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37459],"body":{"id":18199,"nodeType":"Block","src":"2334:2:159","statements":[]},"functionSelector":"a6529eb5","id":18200,"implemented":true,"kind":"function","modifiers":[],"name":"filteredCodeHashAt","nameLocation":"2253:18:159","nodeType":"FunctionDefinition","parameters":{"id":18195,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18192,"mutability":"mutable","name":"registrant","nameLocation":"2280:10:159","nodeType":"VariableDeclaration","scope":18200,"src":"2272:18:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18191,"name":"address","nodeType":"ElementaryTypeName","src":"2272:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18194,"mutability":"mutable","name":"index","nameLocation":"2300:5:159","nodeType":"VariableDeclaration","scope":18200,"src":"2292:13:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18193,"name":"uint256","nodeType":"ElementaryTypeName","src":"2292:7:159","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2271:35:159"},"returnParameters":{"id":18198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18197,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18200,"src":"2325:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18196,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2325:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2324:9:159"},"scope":18217,"src":"2244:92:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37466],"body":{"id":18207,"nodeType":"Block","src":"2402:2:159","statements":[]},"functionSelector":"c3c5a547","id":18208,"implemented":true,"kind":"function","modifiers":[],"name":"isRegistered","nameLocation":"2351:12:159","nodeType":"FunctionDefinition","parameters":{"id":18203,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18202,"mutability":"mutable","name":"addr","nameLocation":"2372:4:159","nodeType":"VariableDeclaration","scope":18208,"src":"2364:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18201,"name":"address","nodeType":"ElementaryTypeName","src":"2364:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2363:14:159"},"returnParameters":{"id":18206,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18205,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18208,"src":"2396:4:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18204,"name":"bool","nodeType":"ElementaryTypeName","src":"2396:4:159","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2395:6:159"},"scope":18217,"src":"2342:62:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[37473],"body":{"id":18215,"nodeType":"Block","src":"2471:2:159","statements":[]},"functionSelector":"bbd652c7","id":18216,"implemented":true,"kind":"function","modifiers":[],"name":"codeHashOf","nameLocation":"2419:10:159","nodeType":"FunctionDefinition","parameters":{"id":18211,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18210,"mutability":"mutable","name":"addr","nameLocation":"2438:4:159","nodeType":"VariableDeclaration","scope":18216,"src":"2430:12:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18209,"name":"address","nodeType":"ElementaryTypeName","src":"2430:7:159","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2429:14:159"},"returnParameters":{"id":18214,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18213,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18216,"src":"2462:7:159","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18212,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2462:7:159","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2461:9:159"},"scope":18217,"src":"2410:63:159","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":18218,"src":"163:2312:159","usedErrors":[],"usedEvents":[]}],"src":"32:2444:159"},"id":159},"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol","exportedSymbols":{"ERC2981Facet":[37171],"ERC2981FacetMock":[18246],"IForwarderRegistry":[13386]},"id":18247,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18219,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:160"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":18221,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18247,"sourceUnit":13387,"src":"57:90:160","symbolAliases":[{"foreign":{"id":18220,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:160","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/facets/ERC2981Facet.sol","file":"./../../../../token/royalty/facets/ERC2981Facet.sol","id":18223,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18247,"sourceUnit":37172,"src":"148:81:160","symbolAliases":[{"foreign":{"id":18222,"name":"ERC2981Facet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37171,"src":"156:12:160","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":18225,"name":"ERC2981Facet","nameLocations":["288:12:160"],"nodeType":"IdentifierPath","referencedDeclaration":37171,"src":"288:12:160"},"id":18226,"nodeType":"InheritanceSpecifier","src":"288:12:160"}],"canonicalName":"ERC2981FacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":18224,"nodeType":"StructuredDocumentation","src":"231:28:160","text":"@title ERC2981FacetMock"},"fullyImplemented":true,"id":18246,"linearizedBaseContracts":[18246,37171,13297,37012,37280,1206],"name":"ERC2981FacetMock","nameLocation":"268:16:160","nodeType":"ContractDefinition","nodes":[{"body":{"id":18235,"nodeType":"Block","src":"389:2:160","statements":[]},"id":18236,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":18232,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18229,"src":"370:17:160","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":18233,"kind":"baseConstructorSpecifier","modifierName":{"id":18231,"name":"ERC2981Facet","nameLocations":["357:12:160"],"nodeType":"IdentifierPath","referencedDeclaration":37171,"src":"357:12:160"},"nodeType":"ModifierInvocation","src":"357:31:160"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18230,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18229,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"338:17:160","nodeType":"VariableDeclaration","scope":18236,"src":"319:36:160","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":18228,"nodeType":"UserDefinedTypeName","pathNode":{"id":18227,"name":"IForwarderRegistry","nameLocations":["319:18:160"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"319:18:160"},"referencedDeclaration":13386,"src":"319:18:160","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"318:38:160"},"returnParameters":{"id":18234,"nodeType":"ParameterList","parameters":[],"src":"389:0:160"},"scope":18246,"src":"307:84:160","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18244,"nodeType":"Block","src":"457:34:160","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":18241,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[37170],"referencedDeclaration":37170,"src":"474:8:160","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":18242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"474:10:160","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":18240,"id":18243,"nodeType":"Return","src":"467:17:160"}]},"functionSelector":"31e66e1e","id":18245,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"406:9:160","nodeType":"FunctionDefinition","parameters":{"id":18237,"nodeType":"ParameterList","parameters":[],"src":"415:2:160"},"returnParameters":{"id":18240,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18239,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18245,"src":"441:14:160","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18238,"name":"bytes","nodeType":"ElementaryTypeName","src":"441:5:160","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"440:16:160"},"scope":18246,"src":"397:94:160","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":18247,"src":"259:234:160","usedErrors":[8246,11559,19183,37080,37083],"usedEvents":[]}],"src":"32:462:160"},"id":160},"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol":{"ast":{"absolutePath":"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol","exportedSymbols":{"IForwarderRegistry":[13386],"OperatorFiltererFacet":[37264],"OperatorFiltererFacetMock":[18275]},"id":18276,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18248,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:161"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":18250,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18276,"sourceUnit":13387,"src":"57:90:161","symbolAliases":[{"foreign":{"id":18249,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:161","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/facets/OperatorFiltererFacet.sol","file":"./../../../../token/royalty/facets/OperatorFiltererFacet.sol","id":18252,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18276,"sourceUnit":37265,"src":"148:99:161","symbolAliases":[{"foreign":{"id":18251,"name":"OperatorFiltererFacet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37264,"src":"156:21:161","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":18254,"name":"OperatorFiltererFacet","nameLocations":["324:21:161"],"nodeType":"IdentifierPath","referencedDeclaration":37264,"src":"324:21:161"},"id":18255,"nodeType":"InheritanceSpecifier","src":"324:21:161"}],"canonicalName":"OperatorFiltererFacetMock","contractDependencies":[],"contractKind":"contract","documentation":{"id":18253,"nodeType":"StructuredDocumentation","src":"249:37:161","text":"@title OperatorFiltererFacetMock"},"fullyImplemented":true,"id":18275,"linearizedBaseContracts":[18275,37264,13297,37073,1206],"name":"OperatorFiltererFacetMock","nameLocation":"295:25:161","nodeType":"ContractDefinition","nodes":[{"body":{"id":18264,"nodeType":"Block","src":"443:2:161","statements":[]},"id":18265,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":18261,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18258,"src":"424:17:161","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":18262,"kind":"baseConstructorSpecifier","modifierName":{"id":18260,"name":"OperatorFiltererFacet","nameLocations":["402:21:161"],"nodeType":"IdentifierPath","referencedDeclaration":37264,"src":"402:21:161"},"nodeType":"ModifierInvocation","src":"402:40:161"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18259,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18258,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"383:17:161","nodeType":"VariableDeclaration","scope":18265,"src":"364:36:161","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":18257,"nodeType":"UserDefinedTypeName","pathNode":{"id":18256,"name":"IForwarderRegistry","nameLocations":["364:18:161"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"364:18:161"},"referencedDeclaration":13386,"src":"364:18:161","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"363:38:161"},"returnParameters":{"id":18263,"nodeType":"ParameterList","parameters":[],"src":"443:0:161"},"scope":18275,"src":"352:93:161","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18273,"nodeType":"Block","src":"511:34:161","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":18270,"name":"_msgData","nodeType":"Identifier","overloadedDeclarations":[37263],"referencedDeclaration":37263,"src":"528:8:161","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":18271,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"528:10:161","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":18269,"id":18272,"nodeType":"Return","src":"521:17:161"}]},"functionSelector":"31e66e1e","id":18274,"implemented":true,"kind":"function","modifiers":[],"name":"__msgData","nameLocation":"460:9:161","nodeType":"FunctionDefinition","parameters":{"id":18266,"nodeType":"ParameterList","parameters":[],"src":"469:2:161"},"returnParameters":{"id":18269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18268,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18274,"src":"495:14:161","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18267,"name":"bytes","nodeType":"ElementaryTypeName","src":"495:5:161","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"494:16:161"},"scope":18275,"src":"451:94:161","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":18276,"src":"286:261:161","usedErrors":[8246,19183,19192],"usedEvents":[]}],"src":"32:516:161"},"id":161},"contracts/mocks/utils/Bytes32Mock.sol":{"ast":{"absolutePath":"contracts/mocks/utils/Bytes32Mock.sol","exportedSymbols":{"Bytes32":[38193],"Bytes32Mock":[18306]},"id":18307,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18277,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:162"},{"absolutePath":"contracts/utils/libraries/Bytes32.sol","file":"./../../utils/libraries/Bytes32.sol","id":18279,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18307,"sourceUnit":38194,"src":"57:60:162","symbolAliases":[{"foreign":{"id":18278,"name":"Bytes32","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38193,"src":"65:7:162","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"Bytes32Mock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":18306,"linearizedBaseContracts":[18306],"name":"Bytes32Mock","nameLocation":"128:11:162","nodeType":"ContractDefinition","nodes":[{"body":{"id":18291,"nodeType":"Block","src":"223:53:162","statements":[{"expression":{"arguments":[{"id":18288,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18281,"src":"263:5:162","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":18286,"name":"Bytes32","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38193,"src":"240:7:162","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Bytes32_$38193_$","typeString":"type(library Bytes32)"}},"id":18287,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"248:14:162","memberName":"toBase32String","nodeType":"MemberAccess","referencedDeclaration":38115,"src":"240:22:162","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_string_memory_ptr_$","typeString":"function (bytes32) pure returns (string memory)"}},"id":18289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"240:29:162","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":18285,"id":18290,"nodeType":"Return","src":"233:36:162"}]},"functionSelector":"dea65fa1","id":18292,"implemented":true,"kind":"function","modifiers":[],"name":"toBase32String","nameLocation":"155:14:162","nodeType":"FunctionDefinition","parameters":{"id":18282,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18281,"mutability":"mutable","name":"value","nameLocation":"178:5:162","nodeType":"VariableDeclaration","scope":18292,"src":"170:13:162","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18280,"name":"bytes32","nodeType":"ElementaryTypeName","src":"170:7:162","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"169:15:162"},"returnParameters":{"id":18285,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18284,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18292,"src":"208:13:162","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":18283,"name":"string","nodeType":"ElementaryTypeName","src":"208:6:162","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"207:15:162"},"scope":18306,"src":"146:130:162","stateMutability":"pure","virtual":false,"visibility":"external"},{"body":{"id":18304,"nodeType":"Block","src":"358:52:162","statements":[{"expression":{"arguments":[{"id":18301,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18294,"src":"397:5:162","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":18299,"name":"Bytes32","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38193,"src":"375:7:162","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Bytes32_$38193_$","typeString":"type(library Bytes32)"}},"id":18300,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"383:13:162","memberName":"toASCIIString","nodeType":"MemberAccess","referencedDeclaration":38192,"src":"375:21:162","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_string_memory_ptr_$","typeString":"function (bytes32) pure returns (string memory)"}},"id":18302,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"375:28:162","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":18298,"id":18303,"nodeType":"Return","src":"368:35:162"}]},"functionSelector":"84e7ad21","id":18305,"implemented":true,"kind":"function","modifiers":[],"name":"toASCIIString","nameLocation":"291:13:162","nodeType":"FunctionDefinition","parameters":{"id":18295,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18294,"mutability":"mutable","name":"value","nameLocation":"313:5:162","nodeType":"VariableDeclaration","scope":18305,"src":"305:13:162","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18293,"name":"bytes32","nodeType":"ElementaryTypeName","src":"305:7:162","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"304:15:162"},"returnParameters":{"id":18298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18297,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18305,"src":"343:13:162","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":18296,"name":"string","nodeType":"ElementaryTypeName","src":"343:6:162","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"342:15:162"},"scope":18306,"src":"282:128:162","stateMutability":"pure","virtual":false,"visibility":"external"}],"scope":18307,"src":"119:293:162","usedErrors":[],"usedEvents":[]}],"src":"32:381:162"},"id":162},"contracts/mocks/utils/MultiStaticCallMock.sol":{"ast":{"absolutePath":"contracts/mocks/utils/MultiStaticCallMock.sol","exportedSymbols":{"MultiStaticCall":[38015],"MultiStaticCallMock":[18386]},"id":18387,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18308,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:163"},{"absolutePath":"contracts/utils/MultiStaticCall.sol","file":"./../../utils/MultiStaticCall.sol","id":18310,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18387,"sourceUnit":38016,"src":"57:66:163","symbolAliases":[{"foreign":{"id":18309,"name":"MultiStaticCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38015,"src":"65:15:163","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":18311,"name":"MultiStaticCall","nameLocations":["157:15:163"],"nodeType":"IdentifierPath","referencedDeclaration":38015,"src":"157:15:163"},"id":18312,"nodeType":"InheritanceSpecifier","src":"157:15:163"}],"canonicalName":"MultiStaticCallMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":18386,"linearizedBaseContracts":[18386,38015],"name":"MultiStaticCallMock","nameLocation":"134:19:163","nodeType":"ContractDefinition","nodes":[{"errorSelector":"4a5033eb","id":18314,"name":"Reverted","nameLocation":"185:8:163","nodeType":"ErrorDefinition","parameters":{"id":18313,"nodeType":"ParameterList","parameters":[],"src":"193:2:163"},"src":"179:17:163"},{"body":{"id":18324,"nodeType":"Block","src":"270:43:163","statements":[{"expression":{"id":18322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18319,"name":"blockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18317,"src":"280:11:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":18320,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"294:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":18321,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"300:6:163","memberName":"number","nodeType":"MemberAccess","src":"294:12:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"280:26:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18323,"nodeType":"ExpressionStatement","src":"280:26:163"}]},"functionSelector":"42cbb15c","id":18325,"implemented":true,"kind":"function","modifiers":[],"name":"getBlockNumber","nameLocation":"211:14:163","nodeType":"FunctionDefinition","parameters":{"id":18315,"nodeType":"ParameterList","parameters":[],"src":"225:2:163"},"returnParameters":{"id":18318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18317,"mutability":"mutable","name":"blockNumber","nameLocation":"257:11:163","nodeType":"VariableDeclaration","scope":18325,"src":"249:19:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18316,"name":"uint256","nodeType":"ElementaryTypeName","src":"249:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"248:21:163"},"scope":18386,"src":"202:111:163","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18335,"nodeType":"Block","src":"393:42:163","statements":[{"expression":{"id":18333,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18330,"name":"coinbase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18328,"src":"403:8:163","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":18331,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"414:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":18332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"420:8:163","memberName":"coinbase","nodeType":"MemberAccess","src":"414:14:163","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"src":"403:25:163","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18334,"nodeType":"ExpressionStatement","src":"403:25:163"}]},"functionSelector":"a8b0574e","id":18336,"implemented":true,"kind":"function","modifiers":[],"name":"getCurrentBlockCoinbase","nameLocation":"328:23:163","nodeType":"FunctionDefinition","parameters":{"id":18326,"nodeType":"ParameterList","parameters":[],"src":"351:2:163"},"returnParameters":{"id":18329,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18328,"mutability":"mutable","name":"coinbase","nameLocation":"383:8:163","nodeType":"VariableDeclaration","scope":18336,"src":"375:16:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18327,"name":"address","nodeType":"ElementaryTypeName","src":"375:7:163","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"374:18:163"},"scope":18386,"src":"319:116:163","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18346,"nodeType":"Block","src":"515:42:163","statements":[{"expression":{"id":18344,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18341,"name":"gaslimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18339,"src":"525:8:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":18342,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"536:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":18343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"542:8:163","memberName":"gaslimit","nodeType":"MemberAccess","src":"536:14:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"525:25:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18345,"nodeType":"ExpressionStatement","src":"525:25:163"}]},"functionSelector":"86d516e8","id":18347,"implemented":true,"kind":"function","modifiers":[],"name":"getCurrentBlockGasLimit","nameLocation":"450:23:163","nodeType":"FunctionDefinition","parameters":{"id":18337,"nodeType":"ParameterList","parameters":[],"src":"473:2:163"},"returnParameters":{"id":18340,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18339,"mutability":"mutable","name":"gaslimit","nameLocation":"505:8:163","nodeType":"VariableDeclaration","scope":18347,"src":"497:16:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18338,"name":"uint256","nodeType":"ElementaryTypeName","src":"497:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"496:18:163"},"scope":18386,"src":"441:116:163","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18357,"nodeType":"Block","src":"639:44:163","statements":[{"expression":{"id":18355,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18352,"name":"timestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18350,"src":"649:9:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":18353,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"661:5:163","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":18354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"667:9:163","memberName":"timestamp","nodeType":"MemberAccess","src":"661:15:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"649:27:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18356,"nodeType":"ExpressionStatement","src":"649:27:163"}]},"functionSelector":"0f28c97d","id":18358,"implemented":true,"kind":"function","modifiers":[],"name":"getCurrentBlockTimestamp","nameLocation":"572:24:163","nodeType":"FunctionDefinition","parameters":{"id":18348,"nodeType":"ParameterList","parameters":[],"src":"596:2:163"},"returnParameters":{"id":18351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18350,"mutability":"mutable","name":"timestamp","nameLocation":"628:9:163","nodeType":"VariableDeclaration","scope":18358,"src":"620:17:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18349,"name":"uint256","nodeType":"ElementaryTypeName","src":"620:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"619:19:163"},"scope":18386,"src":"563:120:163","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18370,"nodeType":"Block","src":"764:39:163","statements":[{"expression":{"id":18368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18365,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18363,"src":"774:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":18366,"name":"addr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18360,"src":"784:4:163","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":18367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"789:7:163","memberName":"balance","nodeType":"MemberAccess","src":"784:12:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"774:22:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18369,"nodeType":"ExpressionStatement","src":"774:22:163"}]},"functionSelector":"4d2301cc","id":18371,"implemented":true,"kind":"function","modifiers":[],"name":"getEthBalance","nameLocation":"698:13:163","nodeType":"FunctionDefinition","parameters":{"id":18361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18360,"mutability":"mutable","name":"addr","nameLocation":"720:4:163","nodeType":"VariableDeclaration","scope":18371,"src":"712:12:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18359,"name":"address","nodeType":"ElementaryTypeName","src":"712:7:163","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"711:14:163"},"returnParameters":{"id":18364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18363,"mutability":"mutable","name":"balance","nameLocation":"755:7:163","nodeType":"VariableDeclaration","scope":18371,"src":"747:15:163","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18362,"name":"uint256","nodeType":"ElementaryTypeName","src":"747:7:163","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"746:17:163"},"scope":18386,"src":"689:114:163","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":18377,"nodeType":"Block","src":"846:34:163","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":18374,"name":"Reverted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18314,"src":"863:8:163","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":18375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"863:10:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":18376,"nodeType":"RevertStatement","src":"856:17:163"}]},"functionSelector":"ce0d89f4","id":18378,"implemented":true,"kind":"function","modifiers":[],"name":"revertingCall","nameLocation":"818:13:163","nodeType":"FunctionDefinition","parameters":{"id":18372,"nodeType":"ParameterList","parameters":[],"src":"831:2:163"},"returnParameters":{"id":18373,"nodeType":"ParameterList","parameters":[],"src":"846:0:163"},"scope":18386,"src":"809:71:163","stateMutability":"pure","virtual":false,"visibility":"public"},{"body":{"id":18384,"nodeType":"Block","src":"937:95:163","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":18381,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"1017:6:163","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$__$returns$__$","typeString":"function () pure"}},"id":18382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1017:8:163","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18383,"nodeType":"ExpressionStatement","src":"1017:8:163"}]},"functionSelector":"b62c5318","id":18385,"implemented":true,"kind":"function","modifiers":[],"name":"revertingCallWithoutMessage","nameLocation":"895:27:163","nodeType":"FunctionDefinition","parameters":{"id":18379,"nodeType":"ParameterList","parameters":[],"src":"922:2:163"},"returnParameters":{"id":18380,"nodeType":"ParameterList","parameters":[],"src":"937:0:163"},"scope":18386,"src":"886:146:163","stateMutability":"pure","virtual":false,"visibility":"public"}],"scope":18387,"src":"125:909:163","usedErrors":[18314,37890],"usedEvents":[]}],"src":"32:1003:163"},"id":163},"contracts/mocks/vrf/VRFV2WrapperMock.sol":{"ast":{"absolutePath":"contracts/mocks/vrf/VRFV2WrapperMock.sol","exportedSymbols":{"IERC677Receiver":[28095],"VRFConsumerBaseV2":[152],"VRFV2WrapperInterface":[284],"VRFV2WrapperMock":[18551]},"id":18552,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18388,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:164"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC677Receiver.sol","file":"./../../token/ERC20/interfaces/IERC677Receiver.sol","id":18390,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18552,"sourceUnit":28096,"src":"57:83:164","symbolAliases":[{"foreign":{"id":18389,"name":"IERC677Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28095,"src":"65:15:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","file":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","id":18392,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18552,"sourceUnit":285,"src":"141:109:164","symbolAliases":[{"foreign":{"id":18391,"name":"VRFV2WrapperInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"149:21:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol","file":"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol","id":18394,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18552,"sourceUnit":153,"src":"251:90:164","symbolAliases":[{"foreign":{"id":18393,"name":"VRFConsumerBaseV2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":152,"src":"259:17:164","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":18395,"name":"IERC677Receiver","nameLocations":["372:15:164"],"nodeType":"IdentifierPath","referencedDeclaration":28095,"src":"372:15:164"},"id":18396,"nodeType":"InheritanceSpecifier","src":"372:15:164"},{"baseName":{"id":18397,"name":"VRFV2WrapperInterface","nameLocations":["389:21:164"],"nodeType":"IdentifierPath","referencedDeclaration":284,"src":"389:21:164"},"id":18398,"nodeType":"InheritanceSpecifier","src":"389:21:164"}],"canonicalName":"VRFV2WrapperMock","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":18551,"linearizedBaseContracts":[18551,284,28095],"name":"VRFV2WrapperMock","nameLocation":"352:16:164","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[265],"constant":false,"functionSelector":"fc2a88c3","id":18400,"mutability":"mutable","name":"lastRequestId","nameLocation":"432:13:164","nodeType":"VariableDeclaration","scope":18551,"src":"417:28:164","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18399,"name":"uint256","nodeType":"ElementaryTypeName","src":"417:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"4651ed3d","id":18405,"mutability":"mutable","name":"consumers","nameLocation":"497:9:164","nodeType":"VariableDeclaration","scope":18551,"src":"452:54:164","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_contract$_VRFConsumerBaseV2_$152_$","typeString":"mapping(uint256 => contract VRFConsumerBaseV2)"},"typeName":{"id":18404,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":18401,"name":"uint256","nodeType":"ElementaryTypeName","src":"460:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"452:37:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_contract$_VRFConsumerBaseV2_$152_$","typeString":"mapping(uint256 => contract VRFConsumerBaseV2)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":18403,"nodeType":"UserDefinedTypeName","pathNode":{"id":18402,"name":"VRFConsumerBaseV2","nameLocations":["471:17:164"],"nodeType":"IdentifierPath","referencedDeclaration":152,"src":"471:17:164"},"referencedDeclaration":152,"src":"471:17:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}}},"visibility":"public"},{"constant":false,"functionSelector":"265fe575","id":18409,"mutability":"mutable","name":"numWords","nameLocation":"546:8:164","nodeType":"VariableDeclaration","scope":18551,"src":"512:42:164","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint32_$","typeString":"mapping(uint256 => uint32)"},"typeName":{"id":18408,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":18406,"name":"uint256","nodeType":"ElementaryTypeName","src":"520:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"512:26:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint32_$","typeString":"mapping(uint256 => uint32)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":18407,"name":"uint32","nodeType":"ElementaryTypeName","src":"531:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}},"visibility":"public"},{"baseFunctions":[273],"body":{"id":18418,"nodeType":"Block","src":"632:27:164","statements":[{"expression":{"hexValue":"313030","id":18416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"649:3:164","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"value":"100"},"functionReturnParameters":18415,"id":18417,"nodeType":"Return","src":"642:10:164"}]},"functionSelector":"4306d354","id":18419,"implemented":true,"kind":"function","modifiers":[],"name":"calculateRequestPrice","nameLocation":"570:21:164","nodeType":"FunctionDefinition","parameters":{"id":18412,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18411,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18419,"src":"592:6:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":18410,"name":"uint32","nodeType":"ElementaryTypeName","src":"592:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"src":"591:8:164"},"returnParameters":{"id":18415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18414,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18419,"src":"623:7:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18413,"name":"uint256","nodeType":"ElementaryTypeName","src":"623:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"622:9:164"},"scope":18551,"src":"561:98:164","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[283],"body":{"id":18430,"nodeType":"Block","src":"744:27:164","statements":[{"expression":{"hexValue":"313030","id":18428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"761:3:164","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"value":"100"},"functionReturnParameters":18427,"id":18429,"nodeType":"Return","src":"754:10:164"}]},"functionSelector":"7fb5d19d","id":18431,"implemented":true,"kind":"function","modifiers":[],"name":"estimateRequestPrice","nameLocation":"674:20:164","nodeType":"FunctionDefinition","parameters":{"id":18424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18421,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18431,"src":"695:6:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":18420,"name":"uint32","nodeType":"ElementaryTypeName","src":"695:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":18423,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18431,"src":"703:7:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18422,"name":"uint256","nodeType":"ElementaryTypeName","src":"703:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"694:17:164"},"returnParameters":{"id":18427,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18426,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18431,"src":"735:7:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18425,"name":"uint256","nodeType":"ElementaryTypeName","src":"735:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"734:9:164"},"scope":18551,"src":"665:106:164","stateMutability":"pure","virtual":false,"visibility":"external"},{"baseFunctions":[28094],"body":{"id":18482,"nodeType":"Block","src":"870:278:164","statements":[{"assignments":[null,null,18443],"declarations":[null,null,{"constant":false,"id":18443,"mutability":"mutable","name":"nWords","nameLocation":"892:6:164","nodeType":"VariableDeclaration","scope":18482,"src":"885:13:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":18442,"name":"uint32","nodeType":"ElementaryTypeName","src":"885:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"id":18455,"initialValue":{"arguments":[{"id":18446,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18437,"src":"913:4:164","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"id":18448,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"920:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":18447,"name":"uint32","nodeType":"ElementaryTypeName","src":"920:6:164","typeDescriptions":{}}},{"id":18450,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"928:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint16_$","typeString":"type(uint16)"},"typeName":{"id":18449,"name":"uint16","nodeType":"ElementaryTypeName","src":"928:6:164","typeDescriptions":{}}},{"id":18452,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"936:6:164","typeDescriptions":{"typeIdentifier":"t_type$_t_uint32_$","typeString":"type(uint32)"},"typeName":{"id":18451,"name":"uint32","nodeType":"ElementaryTypeName","src":"936:6:164","typeDescriptions":{}}}],"id":18453,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"919:24:164","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_uint32_$_$_t_type$_t_uint16_$_$_t_type$_t_uint32_$_$","typeString":"tuple(type(uint32),type(uint16),type(uint32))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_tuple$_t_type$_t_uint32_$_$_t_type$_t_uint16_$_$_t_type$_t_uint32_$_$","typeString":"tuple(type(uint32),type(uint16),type(uint32))"}],"expression":{"id":18444,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"902:3:164","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18445,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"906:6:164","memberName":"decode","nodeType":"MemberAccess","src":"902:10:164","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":18454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"902:42:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint32_$_t_uint16_$_t_uint32_$","typeString":"tuple(uint32,uint16,uint32)"}},"nodeType":"VariableDeclarationStatement","src":"880:64:164"},{"assignments":[18457],"declarations":[{"constant":false,"id":18457,"mutability":"mutable","name":"requestId","nameLocation":"962:9:164","nodeType":"VariableDeclaration","scope":18482,"src":"954:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18456,"name":"uint256","nodeType":"ElementaryTypeName","src":"954:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18461,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18458,"name":"lastRequestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18400,"src":"974:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":18459,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"990:1:164","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"974:17:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"954:37:164"},{"expression":{"id":18468,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18462,"name":"consumers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18405,"src":"1001:9:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_contract$_VRFConsumerBaseV2_$152_$","typeString":"mapping(uint256 => contract VRFConsumerBaseV2)"}},"id":18464,"indexExpression":{"id":18463,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18457,"src":"1011:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1001:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":18466,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18433,"src":"1042:4:164","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":18465,"name":"VRFConsumerBaseV2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":152,"src":"1024:17:164","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_VRFConsumerBaseV2_$152_$","typeString":"type(contract VRFConsumerBaseV2)"}},"id":18467,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1024:23:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"src":"1001:46:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"id":18469,"nodeType":"ExpressionStatement","src":"1001:46:164"},{"expression":{"id":18474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18470,"name":"numWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18409,"src":"1057:8:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint32_$","typeString":"mapping(uint256 => uint32)"}},"id":18472,"indexExpression":{"id":18471,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18457,"src":"1066:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1057:19:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18473,"name":"nWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18443,"src":"1079:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"1057:28:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"id":18475,"nodeType":"ExpressionStatement","src":"1057:28:164"},{"expression":{"id":18478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18476,"name":"lastRequestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18400,"src":"1095:13:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18477,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18457,"src":"1111:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1095:25:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18479,"nodeType":"ExpressionStatement","src":"1095:25:164"},{"expression":{"hexValue":"74727565","id":18480,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1137:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":18441,"id":18481,"nodeType":"Return","src":"1130:11:164"}]},"functionSelector":"a4c0ed36","id":18483,"implemented":true,"kind":"function","modifiers":[],"name":"onTokenTransfer","nameLocation":"786:15:164","nodeType":"FunctionDefinition","parameters":{"id":18438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18433,"mutability":"mutable","name":"from","nameLocation":"810:4:164","nodeType":"VariableDeclaration","scope":18483,"src":"802:12:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18432,"name":"address","nodeType":"ElementaryTypeName","src":"802:7:164","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18435,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18483,"src":"816:7:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18434,"name":"uint256","nodeType":"ElementaryTypeName","src":"816:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":18437,"mutability":"mutable","name":"data","nameLocation":"840:4:164","nodeType":"VariableDeclaration","scope":18483,"src":"825:19:164","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18436,"name":"bytes","nodeType":"ElementaryTypeName","src":"825:5:164","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"801:44:164"},"returnParameters":{"id":18441,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18440,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18483,"src":"864:4:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":18439,"name":"bool","nodeType":"ElementaryTypeName","src":"864:4:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"863:6:164"},"scope":18551,"src":"777:371:164","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18530,"nodeType":"Block","src":"1216:277:164","statements":[{"assignments":[18489],"declarations":[{"constant":false,"id":18489,"mutability":"mutable","name":"nWords","nameLocation":"1233:6:164","nodeType":"VariableDeclaration","scope":18530,"src":"1226:13:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":18488,"name":"uint32","nodeType":"ElementaryTypeName","src":"1226:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"}],"id":18493,"initialValue":{"baseExpression":{"id":18490,"name":"numWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18409,"src":"1242:8:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint32_$","typeString":"mapping(uint256 => uint32)"}},"id":18492,"indexExpression":{"id":18491,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18485,"src":"1251:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1242:19:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"VariableDeclarationStatement","src":"1226:35:164"},{"assignments":[18498],"declarations":[{"constant":false,"id":18498,"mutability":"mutable","name":"randomWords","nameLocation":"1288:11:164","nodeType":"VariableDeclaration","scope":18530,"src":"1271:28:164","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":18496,"name":"uint256","nodeType":"ElementaryTypeName","src":"1271:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18497,"nodeType":"ArrayTypeName","src":"1271:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":18504,"initialValue":{"arguments":[{"id":18502,"name":"nWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18489,"src":"1316:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"id":18501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1302:13:164","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[] memory)"},"typeName":{"baseType":{"id":18499,"name":"uint256","nodeType":"ElementaryTypeName","src":"1306:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18500,"nodeType":"ArrayTypeName","src":"1306:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"id":18503,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1302:21:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"nodeType":"VariableDeclarationStatement","src":"1271:52:164"},{"body":{"id":18520,"nodeType":"Block","src":"1366:45:164","statements":[{"expression":{"id":18518,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18514,"name":"randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18498,"src":"1380:11:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":18516,"indexExpression":{"id":18515,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18506,"src":"1392:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1380:14:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"313233","id":18517,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1397:3:164","typeDescriptions":{"typeIdentifier":"t_rational_123_by_1","typeString":"int_const 123"},"value":"123"},"src":"1380:20:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18519,"nodeType":"ExpressionStatement","src":"1380:20:164"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":18508,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18506,"src":"1349:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":18509,"name":"nWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18489,"src":"1353:6:164","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"1349:10:164","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18521,"initializationExpression":{"assignments":[18506],"declarations":[{"constant":false,"id":18506,"mutability":"mutable","name":"i","nameLocation":"1346:1:164","nodeType":"VariableDeclaration","scope":18521,"src":"1338:9:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18505,"name":"uint256","nodeType":"ElementaryTypeName","src":"1338:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18507,"nodeType":"VariableDeclarationStatement","src":"1338:9:164"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":18512,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"1361:3:164","subExpression":{"id":18511,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18506,"src":"1363:1:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18513,"nodeType":"ExpressionStatement","src":"1361:3:164"},"nodeType":"ForStatement","src":"1333:78:164"},{"expression":{"arguments":[{"id":18526,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18485,"src":"1463:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":18527,"name":"randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18498,"src":"1474:11:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"expression":{"baseExpression":{"id":18522,"name":"consumers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18405,"src":"1420:9:164","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_contract$_VRFConsumerBaseV2_$152_$","typeString":"mapping(uint256 => contract VRFConsumerBaseV2)"}},"id":18524,"indexExpression":{"id":18523,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18485,"src":"1430:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1420:20:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"id":18525,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1441:21:164","memberName":"rawFulfillRandomWords","nodeType":"MemberAccess","referencedDeclaration":151,"src":"1420:42:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (uint256,uint256[] memory) external"}},"id":18528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1420:66:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18529,"nodeType":"ExpressionStatement","src":"1420:66:164"}]},"functionSelector":"17537c7e","id":18531,"implemented":true,"kind":"function","modifiers":[],"name":"fulfillRandomnessRequest","nameLocation":"1163:24:164","nodeType":"FunctionDefinition","parameters":{"id":18486,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18485,"mutability":"mutable","name":"requestId","nameLocation":"1196:9:164","nodeType":"VariableDeclaration","scope":18531,"src":"1188:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18484,"name":"uint256","nodeType":"ElementaryTypeName","src":"1188:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1187:19:164"},"returnParameters":{"id":18487,"nodeType":"ParameterList","parameters":[],"src":"1216:0:164"},"scope":18551,"src":"1154:339:164","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":18549,"nodeType":"Block","src":"1613:71:164","statements":[{"expression":{"arguments":[{"id":18545,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18536,"src":"1654:9:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":18546,"name":"randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18539,"src":"1665:11:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"expression":{"id":18542,"name":"consumer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18534,"src":"1623:8:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"id":18544,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1632:21:164","memberName":"rawFulfillRandomWords","nodeType":"MemberAccess","referencedDeclaration":151,"src":"1623:30:164","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (uint256,uint256[] memory) external"}},"id":18547,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1623:54:164","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18548,"nodeType":"ExpressionStatement","src":"1623:54:164"}]},"functionSelector":"e6689c51","id":18550,"implemented":true,"kind":"function","modifiers":[],"name":"fulfillRandomWords","nameLocation":"1508:18:164","nodeType":"FunctionDefinition","parameters":{"id":18540,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18534,"mutability":"mutable","name":"consumer","nameLocation":"1545:8:164","nodeType":"VariableDeclaration","scope":18550,"src":"1527:26:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"},"typeName":{"id":18533,"nodeType":"UserDefinedTypeName","pathNode":{"id":18532,"name":"VRFConsumerBaseV2","nameLocations":["1527:17:164"],"nodeType":"IdentifierPath","referencedDeclaration":152,"src":"1527:17:164"},"referencedDeclaration":152,"src":"1527:17:164","typeDescriptions":{"typeIdentifier":"t_contract$_VRFConsumerBaseV2_$152","typeString":"contract VRFConsumerBaseV2"}},"visibility":"internal"},{"constant":false,"id":18536,"mutability":"mutable","name":"requestId","nameLocation":"1563:9:164","nodeType":"VariableDeclaration","scope":18550,"src":"1555:17:164","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18535,"name":"uint256","nodeType":"ElementaryTypeName","src":"1555:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":18539,"mutability":"mutable","name":"randomWords","nameLocation":"1591:11:164","nodeType":"VariableDeclaration","scope":18550,"src":"1574:28:164","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":18537,"name":"uint256","nodeType":"ElementaryTypeName","src":"1574:7:164","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18538,"nodeType":"ArrayTypeName","src":"1574:9:164","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1526:77:164"},"returnParameters":{"id":18541,"nodeType":"ParameterList","parameters":[],"src":"1613:0:164"},"scope":18551,"src":"1499:185:164","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":18552,"src":"343:1343:164","usedErrors":[],"usedEvents":[]}],"src":"32:1655:164"},"id":164},"contracts/payment/CumulativeMerkleClaim.sol":{"ast":{"absolutePath":"contracts/payment/CumulativeMerkleClaim.sol","exportedSymbols":{"ContractOwnership":[7934],"ContractOwnershipStorage":[9109],"CumulativeMerkleClaim":[18754],"MerkleProof":[4336],"Pause":[11725],"PauseStorage":[12598]},"id":18755,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18553,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:165"},{"absolutePath":"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","file":"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","id":18555,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18755,"sourceUnit":4337,"src":"58:87:165","symbolAliases":[{"foreign":{"id":18554,"name":"MerkleProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4336,"src":"66:11:165","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../access/libraries/ContractOwnershipStorage.sol","id":18557,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18755,"sourceUnit":9110,"src":"146:92:165","symbolAliases":[{"foreign":{"id":18556,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"154:24:165","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/libraries/PauseStorage.sol","file":"./../lifecycle/libraries/PauseStorage.sol","id":18559,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18755,"sourceUnit":12599,"src":"239:71:165","symbolAliases":[{"foreign":{"id":18558,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"247:12:165","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../access/ContractOwnership.sol","id":18561,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18755,"sourceUnit":7935,"src":"311:68:165","symbolAliases":[{"foreign":{"id":18560,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"319:17:165","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/lifecycle/Pause.sol","file":"./../lifecycle/Pause.sol","id":18563,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18755,"sourceUnit":11726,"src":"380:47:165","symbolAliases":[{"foreign":{"id":18562,"name":"Pause","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11725,"src":"388:5:165","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":18565,"name":"Pause","nameLocations":["1151:5:165"],"nodeType":"IdentifierPath","referencedDeclaration":11725,"src":"1151:5:165"},"id":18566,"nodeType":"InheritanceSpecifier","src":"1151:5:165"}],"canonicalName":"CumulativeMerkleClaim","contractDependencies":[],"contractKind":"contract","documentation":{"id":18564,"nodeType":"StructuredDocumentation","src":"429:679:165","text":"@title CumulativeMerkleClaim\n @notice This contract is designed for claiming payouts which will cumulate over time.\n @notice A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).\n @notice Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the current\n @notice unclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.\n @notice A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees."},"fullyImplemented":false,"id":18754,"linearizedBaseContracts":[18754,11725,7934,11554,11579,8139,11939,1206,8562,12161],"name":"CumulativeMerkleClaim","nameLocation":"1126:21:165","nodeType":"ContractDefinition","nodes":[{"global":false,"id":18570,"libraryName":{"id":18567,"name":"MerkleProof","nameLocations":["1169:11:165"],"nodeType":"IdentifierPath","referencedDeclaration":4336,"src":"1169:11:165"},"nodeType":"UsingForDirective","src":"1163:32:165","typeName":{"baseType":{"id":18568,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1185:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18569,"nodeType":"ArrayTypeName","src":"1185:9:165","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}}},{"global":false,"id":18574,"libraryName":{"id":18571,"name":"ContractOwnershipStorage","nameLocations":["1206:24:165"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"1206:24:165"},"nodeType":"UsingForDirective","src":"1200:67:165","typeName":{"id":18573,"nodeType":"UserDefinedTypeName","pathNode":{"id":18572,"name":"ContractOwnershipStorage.Layout","nameLocations":["1235:24:165","1260:6:165"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"1235:31:165"},"referencedDeclaration":8882,"src":"1235:31:165","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":18578,"libraryName":{"id":18575,"name":"PauseStorage","nameLocations":["1278:12:165"],"nodeType":"IdentifierPath","referencedDeclaration":12598,"src":"1278:12:165"},"nodeType":"UsingForDirective","src":"1272:43:165","typeName":{"id":18577,"nodeType":"UserDefinedTypeName","pathNode":{"id":18576,"name":"PauseStorage.Layout","nameLocations":["1295:12:165","1308:6:165"],"nodeType":"IdentifierPath","referencedDeclaration":12428,"src":"1295:19:165"},"referencedDeclaration":12428,"src":"1295:19:165","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout"}}},{"constant":false,"functionSelector":"ebf0c717","id":18580,"mutability":"mutable","name":"root","nameLocation":"1336:4:165","nodeType":"VariableDeclaration","scope":18754,"src":"1321:19:165","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18579,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1321:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"constant":false,"functionSelector":"affed0e0","id":18582,"mutability":"mutable","name":"nonce","nameLocation":"1361:5:165","nodeType":"VariableDeclaration","scope":18754,"src":"1346:20:165","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18581,"name":"uint256","nodeType":"ElementaryTypeName","src":"1346:7:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"cc3c0f06","id":18586,"mutability":"mutable","name":"claimed","nameLocation":"1405:7:165","nodeType":"VariableDeclaration","scope":18754,"src":"1373:39:165","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"typeName":{"id":18585,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":18583,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1381:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"1373:24:165","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":18584,"name":"bool","nodeType":"ElementaryTypeName","src":"1392:4:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"anonymous":false,"documentation":{"id":18587,"nodeType":"StructuredDocumentation","src":"1419:91:165","text":"@notice Emitted when a new merkle root is set.\n @param root The new merkle root."},"eventSelector":"42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b","id":18591,"name":"MerkleRootSet","nameLocation":"1521:13:165","nodeType":"EventDefinition","parameters":{"id":18590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18589,"indexed":false,"mutability":"mutable","name":"root","nameLocation":"1543:4:165","nodeType":"VariableDeclaration","scope":18591,"src":"1535:12:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18588,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1535:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1534:14:165"},"src":"1515:34:165"},{"anonymous":false,"documentation":{"id":18592,"nodeType":"StructuredDocumentation","src":"1555:285:165","text":"@notice Emitted when a payout is claimed.\n @param root The merkle root on which the claim was made.\n @param recipient The recipient of the claim.\n @param claimData The encoded claim data for the claim.\n @param nonce The nonce as when the claim was made."},"eventSelector":"6a4408e44c908d501056e1ef88baf30a72467f3a181544a67a30cb14c8e80598","id":18602,"name":"PayoutClaimed","nameLocation":"1851:13:165","nodeType":"EventDefinition","parameters":{"id":18601,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18594,"indexed":true,"mutability":"mutable","name":"root","nameLocation":"1881:4:165","nodeType":"VariableDeclaration","scope":18602,"src":"1865:20:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18593,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1865:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":18596,"indexed":true,"mutability":"mutable","name":"recipient","nameLocation":"1903:9:165","nodeType":"VariableDeclaration","scope":18602,"src":"1887:25:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18595,"name":"address","nodeType":"ElementaryTypeName","src":"1887:7:165","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18598,"indexed":false,"mutability":"mutable","name":"claimData","nameLocation":"1920:9:165","nodeType":"VariableDeclaration","scope":18602,"src":"1914:15:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18597,"name":"bytes","nodeType":"ElementaryTypeName","src":"1914:5:165","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18600,"indexed":false,"mutability":"mutable","name":"nonce","nameLocation":"1939:5:165","nodeType":"VariableDeclaration","scope":18602,"src":"1931:13:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18599,"name":"uint256","nodeType":"ElementaryTypeName","src":"1931:7:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1864:81:165"},"src":"1845:101:165"},{"documentation":{"id":18603,"nodeType":"StructuredDocumentation","src":"1952:244:165","text":"@notice Thrown when trying to claim the same leaf more than once.\n @param recipient The recipient of the claim.\n @param claimData The encoded claim data for the claim.\n @param nonce The nonce as when the claim was made."},"errorSelector":"7fbf2547","id":18611,"name":"AlreadyClaimed","nameLocation":"2207:14:165","nodeType":"ErrorDefinition","parameters":{"id":18610,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18605,"mutability":"mutable","name":"recipient","nameLocation":"2230:9:165","nodeType":"VariableDeclaration","scope":18611,"src":"2222:17:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18604,"name":"address","nodeType":"ElementaryTypeName","src":"2222:7:165","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18607,"mutability":"mutable","name":"claimData","nameLocation":"2247:9:165","nodeType":"VariableDeclaration","scope":18611,"src":"2241:15:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18606,"name":"bytes","nodeType":"ElementaryTypeName","src":"2241:5:165","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18609,"mutability":"mutable","name":"nonce","nameLocation":"2266:5:165","nodeType":"VariableDeclaration","scope":18611,"src":"2258:13:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18608,"name":"uint256","nodeType":"ElementaryTypeName","src":"2258:7:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2221:51:165"},"src":"2201:72:165"},{"documentation":{"id":18612,"nodeType":"StructuredDocumentation","src":"2279:226:165","text":"@notice Thrown when a proof cannot be verified.\n @param recipient The recipient of the claim.\n @param claimData The encoded claim data for the claim.\n @param nonce The nonce as when the claim was made."},"errorSelector":"91ebfb31","id":18620,"name":"InvalidProof","nameLocation":"2516:12:165","nodeType":"ErrorDefinition","parameters":{"id":18619,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18614,"mutability":"mutable","name":"recipient","nameLocation":"2537:9:165","nodeType":"VariableDeclaration","scope":18620,"src":"2529:17:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18613,"name":"address","nodeType":"ElementaryTypeName","src":"2529:7:165","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18616,"mutability":"mutable","name":"claimData","nameLocation":"2554:9:165","nodeType":"VariableDeclaration","scope":18620,"src":"2548:15:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":18615,"name":"bytes","nodeType":"ElementaryTypeName","src":"2548:5:165","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18618,"mutability":"mutable","name":"nonce","nameLocation":"2573:5:165","nodeType":"VariableDeclaration","scope":18620,"src":"2565:13:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18617,"name":"uint256","nodeType":"ElementaryTypeName","src":"2565:7:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2528:51:165"},"src":"2510:70:165"},{"body":{"id":18630,"nodeType":"Block","src":"2642:2:165","statements":[]},"id":18631,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"hexValue":"74727565","id":18623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2606:4:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"id":18624,"kind":"baseConstructorSpecifier","modifierName":{"id":18622,"name":"Pause","nameLocations":["2600:5:165"],"nodeType":"IdentifierPath","referencedDeclaration":11725,"src":"2600:5:165"},"nodeType":"ModifierInvocation","src":"2600:11:165"},{"arguments":[{"expression":{"id":18626,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2630:3:165","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":18627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2634:6:165","memberName":"sender","nodeType":"MemberAccess","src":"2630:10:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":18628,"kind":"baseConstructorSpecifier","modifierName":{"id":18625,"name":"ContractOwnership","nameLocations":["2612:17:165"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"2612:17:165"},"nodeType":"ModifierInvocation","src":"2612:29:165"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18621,"nodeType":"ParameterList","parameters":[],"src":"2597:2:165"},"returnParameters":{"id":18629,"nodeType":"ParameterList","parameters":[],"src":"2642:0:165"},"scope":18754,"src":"2586:58:165","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":18665,"nodeType":"Block","src":"3079:246:165","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":18642,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"3146:10:165","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":18643,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3146:12:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18637,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"3089:24:165","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":18639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3114:6:165","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"3089:31:165","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":18640,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3089:33:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":18641,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3123:22:165","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"3089:56:165","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":18644,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3089:70:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18645,"nodeType":"ExpressionStatement","src":"3089:70:165"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18646,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"3169:12:165","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":18648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3182:6:165","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"3169:19:165","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":18649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3169:21:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":18650,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3191:7:165","memberName":"unpause","nodeType":"MemberAccess","referencedDeclaration":12543,"src":"3169:29:165","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer)"}},"id":18651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3169:31:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18652,"nodeType":"ExpressionStatement","src":"3169:31:165"},{"expression":{"id":18655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":18653,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18580,"src":"3210:4:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":18654,"name":"merkleRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18634,"src":"3217:10:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3210:17:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18656,"nodeType":"ExpressionStatement","src":"3210:17:165"},{"id":18660,"nodeType":"UncheckedBlock","src":"3237:42:165","statements":[{"expression":{"id":18658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3261:7:165","subExpression":{"id":18657,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18582,"src":"3263:5:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":18659,"nodeType":"ExpressionStatement","src":"3261:7:165"}]},{"eventCall":{"arguments":[{"id":18662,"name":"merkleRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18634,"src":"3307:10:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":18661,"name":"MerkleRootSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18591,"src":"3293:13:165","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$returns$__$","typeString":"function (bytes32)"}},"id":18663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3293:25:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18664,"nodeType":"EmitStatement","src":"3288:30:165"}]},"documentation":{"id":18632,"nodeType":"StructuredDocumentation","src":"2650:374:165","text":"@notice Sets the merkle root for a new claiming period and unpauses the contract.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {NotPaused} if the contract is not paused.\n @dev Emits an {Unpaused} event.\n @dev Emits a {MerkleRootSet} event.\n @param merkleRoot The merkle root to set."},"functionSelector":"7cb64759","id":18666,"implemented":true,"kind":"function","modifiers":[],"name":"setMerkleRoot","nameLocation":"3038:13:165","nodeType":"FunctionDefinition","parameters":{"id":18635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18634,"mutability":"mutable","name":"merkleRoot","nameLocation":"3060:10:165","nodeType":"VariableDeclaration","scope":18666,"src":"3052:18:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18633,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3052:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3051:20:165"},"returnParameters":{"id":18636,"nodeType":"ParameterList","parameters":[],"src":"3079:0:165"},"scope":18754,"src":"3029:296:165","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18744,"nodeType":"Block","src":"3994:579:165","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18677,"name":"PauseStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":12598,"src":"4004:12:165","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PauseStorage_$12598_$","typeString":"type(library PauseStorage)"}},"id":18679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4017:6:165","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":12597,"src":"4004:19:165","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function () pure returns (struct PauseStorage.Layout storage pointer)"}},"id":18680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4004:21:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$12428_storage_ptr","typeString":"struct PauseStorage.Layout storage pointer"}},"id":18681,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4026:18:165","memberName":"enforceIsNotPaused","nodeType":"MemberAccess","referencedDeclaration":12585,"src":"4004:40:165","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$12428_storage_ptr_$returns$__$attached_to$_t_struct$_Layout_$12428_storage_ptr_$","typeString":"function (struct PauseStorage.Layout storage pointer) view"}},"id":18682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4004:42:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18683,"nodeType":"ExpressionStatement","src":"4004:42:165"},{"assignments":[18685],"declarations":[{"constant":false,"id":18685,"mutability":"mutable","name":"currentNonce","nameLocation":"4065:12:165","nodeType":"VariableDeclaration","scope":18744,"src":"4057:20:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18684,"name":"uint256","nodeType":"ElementaryTypeName","src":"4057:7:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":18687,"initialValue":{"id":18686,"name":"nonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18582,"src":"4080:5:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4057:28:165"},{"assignments":[18689],"declarations":[{"constant":false,"id":18689,"mutability":"mutable","name":"currentRoot","nameLocation":"4103:11:165","nodeType":"VariableDeclaration","scope":18744,"src":"4095:19:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18688,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4095:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":18691,"initialValue":{"id":18690,"name":"root","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18580,"src":"4117:4:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4095:26:165"},{"assignments":[18693],"declarations":[{"constant":false,"id":18693,"mutability":"mutable","name":"leaf","nameLocation":"4139:4:165","nodeType":"VariableDeclaration","scope":18744,"src":"4131:12:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18692,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4131:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":18702,"initialValue":{"arguments":[{"arguments":[{"id":18697,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18669,"src":"4173:9:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18698,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18671,"src":"4184:9:165","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":18699,"name":"currentNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18685,"src":"4195:12:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":18695,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4156:3:165","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":18696,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4160:12:165","memberName":"encodePacked","nodeType":"MemberAccess","src":"4156:16:165","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":18700,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4156:52:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":18694,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4146:9:165","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18701,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4146:63:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4131:78:165"},{"condition":{"baseExpression":{"id":18703,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18586,"src":"4224:7:165","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":18705,"indexExpression":{"id":18704,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18693,"src":"4232:4:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4224:13:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18712,"nodeType":"IfStatement","src":"4220:76:165","trueBody":{"errorCall":{"arguments":[{"id":18707,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18669,"src":"4261:9:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18708,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18671,"src":"4272:9:165","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":18709,"name":"currentNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18685,"src":"4283:12:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18706,"name":"AlreadyClaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18611,"src":"4246:14:165","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_error_$","typeString":"function (address,bytes memory,uint256) pure returns (error)"}},"id":18710,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4246:50:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":18711,"nodeType":"RevertStatement","src":"4239:57:165"}},{"condition":{"id":18718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4310:40:165","subExpression":{"arguments":[{"id":18715,"name":"currentRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18689,"src":"4332:11:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":18716,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18693,"src":"4345:4:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":18713,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18674,"src":"4311:5:165","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[] calldata"}},"id":18714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4317:14:165","memberName":"verifyCalldata","nodeType":"MemberAccess","referencedDeclaration":3436,"src":"4311:20:165","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_bytes32_$dyn_calldata_ptr_$_t_bytes32_$_t_bytes32_$returns$_t_bool_$attached_to$_t_array$_t_bytes32_$dyn_calldata_ptr_$","typeString":"function (bytes32[] calldata,bytes32,bytes32) pure returns (bool)"}},"id":18717,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4311:39:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18725,"nodeType":"IfStatement","src":"4306:101:165","trueBody":{"errorCall":{"arguments":[{"id":18720,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18669,"src":"4372:9:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18721,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18671,"src":"4383:9:165","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":18722,"name":"currentNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18685,"src":"4394:12:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18719,"name":"InvalidProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18620,"src":"4359:12:165","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_error_$","typeString":"function (address,bytes memory,uint256) pure returns (error)"}},"id":18723,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4359:48:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":18724,"nodeType":"RevertStatement","src":"4352:55:165"}},{"expression":{"id":18730,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":18726,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18586,"src":"4418:7:165","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":18728,"indexExpression":{"id":18727,"name":"leaf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18693,"src":"4426:4:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4418:13:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":18729,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4434:4:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"4418:20:165","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":18731,"nodeType":"ExpressionStatement","src":"4418:20:165"},{"eventCall":{"arguments":[{"id":18733,"name":"currentRoot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18689,"src":"4468:11:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":18734,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18669,"src":"4481:9:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18735,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18671,"src":"4492:9:165","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":18736,"name":"currentNonce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18685,"src":"4503:12:165","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18732,"name":"PayoutClaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18602,"src":"4454:13:165","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (bytes32,address,bytes memory,uint256)"}},"id":18737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4454:62:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18738,"nodeType":"EmitStatement","src":"4449:67:165"},{"expression":{"arguments":[{"id":18740,"name":"recipient","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18669,"src":"4545:9:165","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":18741,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18671,"src":"4556:9:165","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":18739,"name":"_distributePayout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18753,"src":"4527:17:165","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function (address,bytes calldata)"}},"id":18742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4527:39:165","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18743,"nodeType":"ExpressionStatement","src":"4527:39:165"}]},"documentation":{"id":18667,"nodeType":"StructuredDocumentation","src":"3331:557:165","text":"@notice Executes the payout for a given user (anyone can call this function).\n @dev Reverts with {Paused} if the contract is paused.\n @dev Reverts with {AlreadyClaimed} if this specific payout has already been claimed.\n @dev Reverts with {InvalidProof} if the merkle proof cannot be verified.\n @dev Emits a {PayoutClaimed} event.\n @param recipient Address of the user to claim the payout\n @param claimData Encoded claim data for `recipient`\n @param proof Merkle proof of the user based on the merkle root"},"functionSelector":"edcdebcc","id":18745,"implemented":true,"kind":"function","modifiers":[],"name":"claimPayout","nameLocation":"3902:11:165","nodeType":"FunctionDefinition","parameters":{"id":18675,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18669,"mutability":"mutable","name":"recipient","nameLocation":"3922:9:165","nodeType":"VariableDeclaration","scope":18745,"src":"3914:17:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18668,"name":"address","nodeType":"ElementaryTypeName","src":"3914:7:165","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18671,"mutability":"mutable","name":"claimData","nameLocation":"3948:9:165","nodeType":"VariableDeclaration","scope":18745,"src":"3933:24:165","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18670,"name":"bytes","nodeType":"ElementaryTypeName","src":"3933:5:165","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":18674,"mutability":"mutable","name":"proof","nameLocation":"3978:5:165","nodeType":"VariableDeclaration","scope":18745,"src":"3959:24:165","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":18672,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3959:7:165","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":18673,"nodeType":"ArrayTypeName","src":"3959:9:165","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"3913:71:165"},"returnParameters":{"id":18676,"nodeType":"ParameterList","parameters":[],"src":"3994:0:165"},"scope":18754,"src":"3893:680:165","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":18746,"nodeType":"StructuredDocumentation","src":"4579:345:165","text":"@notice Distributes the payout to the recipient.\n @dev This virtual function must be implemented by inheriting contracts.\n @param recipient Address of the user to claim the payout\n @param claimData Encoded claim data for `recipient`. The encoding is specific to the inheriting contract, for example a quantity of tokens."},"id":18753,"implemented":false,"kind":"function","modifiers":[],"name":"_distributePayout","nameLocation":"4938:17:165","nodeType":"FunctionDefinition","parameters":{"id":18751,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18748,"mutability":"mutable","name":"recipient","nameLocation":"4964:9:165","nodeType":"VariableDeclaration","scope":18753,"src":"4956:17:165","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18747,"name":"address","nodeType":"ElementaryTypeName","src":"4956:7:165","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":18750,"mutability":"mutable","name":"claimData","nameLocation":"4990:9:165","nodeType":"VariableDeclaration","scope":18753,"src":"4975:24:165","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18749,"name":"bytes","nodeType":"ElementaryTypeName","src":"4975:5:165","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4955:45:165"},"returnParameters":{"id":18752,"nodeType":"ParameterList","parameters":[],"src":"5017:0:165"},"scope":18754,"src":"4929:89:165","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":18755,"src":"1108:3912:165","usedErrors":[8246,11559,11961,11964,18611,18620],"usedEvents":[8287,11978,11981,18591,18602]}],"src":"32:4989:165"},"id":165},"contracts/payment/PayoutWallet.sol":{"ast":{"absolutePath":"contracts/payment/PayoutWallet.sol","exportedSymbols":{"ContractOwnership":[7934],"PayoutWallet":[18787],"PayoutWalletBase":[18848],"PayoutWalletStorage":[19096]},"id":18788,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18756,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:166"},{"absolutePath":"contracts/payment/libraries/PayoutWalletStorage.sol","file":"./libraries/PayoutWalletStorage.sol","id":18758,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18788,"sourceUnit":19097,"src":"58:72:166","symbolAliases":[{"foreign":{"id":18757,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"66:19:166","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/base/PayoutWalletBase.sol","file":"./base/PayoutWalletBase.sol","id":18760,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18788,"sourceUnit":18849,"src":"131:61:166","symbolAliases":[{"foreign":{"id":18759,"name":"PayoutWalletBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18848,"src":"139:16:166","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"../access/ContractOwnership.sol","id":18762,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18788,"sourceUnit":7935,"src":"193:66:166","symbolAliases":[{"foreign":{"id":18761,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"201:17:166","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":18764,"name":"PayoutWalletBase","nameLocations":["440:16:166"],"nodeType":"IdentifierPath","referencedDeclaration":18848,"src":"440:16:166"},"id":18765,"nodeType":"InheritanceSpecifier","src":"440:16:166"},{"baseName":{"id":18766,"name":"ContractOwnership","nameLocations":["458:17:166"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"458:17:166"},"id":18767,"nodeType":"InheritanceSpecifier","src":"458:17:166"}],"canonicalName":"PayoutWallet","contractDependencies":[],"contractKind":"contract","documentation":{"id":18763,"nodeType":"StructuredDocumentation","src":"261:145:166","text":"@title Payout wallet (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":18787,"linearizedBaseContracts":[18787,7934,11554,11579,8139,18848,1206,8562,18960],"name":"PayoutWallet","nameLocation":"424:12:166","nodeType":"ContractDefinition","nodes":[{"global":false,"id":18771,"libraryName":{"id":18768,"name":"PayoutWalletStorage","nameLocations":["488:19:166"],"nodeType":"IdentifierPath","referencedDeclaration":19096,"src":"488:19:166"},"nodeType":"UsingForDirective","src":"482:57:166","typeName":{"id":18770,"nodeType":"UserDefinedTypeName","pathNode":{"id":18769,"name":"PayoutWalletStorage.Layout","nameLocations":["512:19:166","532:6:166"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"512:26:166"},"referencedDeclaration":18975,"src":"512:26:166","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}}},{"body":{"id":18785,"nodeType":"Block","src":"871:82:166","statements":[{"expression":{"arguments":[{"id":18782,"name":"initialPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18774,"src":"926:19:166","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18777,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"881:19:166","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PayoutWalletStorage_$19096_$","typeString":"type(library PayoutWalletStorage)"}},"id":18779,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"901:6:166","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19095,"src":"881:26:166","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function () pure returns (struct PayoutWalletStorage.Layout storage pointer)"}},"id":18780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"881:28:166","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":18781,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"910:15:166","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":19017,"src":"881:44:166","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$18975_storage_ptr_$_t_address_payable_$returns$__$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer,address payable)"}},"id":18783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"881:65:166","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18784,"nodeType":"ExpressionStatement","src":"881:65:166"}]},"documentation":{"id":18772,"nodeType":"StructuredDocumentation","src":"545:272:166","text":"@notice Initializes the storage with an initial payout wallet.\n @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param initialPayoutWallet The initial payout wallet."},"id":18786,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18775,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18774,"mutability":"mutable","name":"initialPayoutWallet","nameLocation":"850:19:166","nodeType":"VariableDeclaration","scope":18786,"src":"834:35:166","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18773,"name":"address","nodeType":"ElementaryTypeName","src":"834:15:166","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"833:37:166"},"returnParameters":{"id":18776,"nodeType":"ParameterList","parameters":[],"src":"871:0:166"},"scope":18787,"src":"822:131:166","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":18788,"src":"406:549:166","usedErrors":[8246,11559,18853],"usedEvents":[8287,18860]}],"src":"32:924:166"},"id":166},"contracts/payment/base/PayoutWalletBase.sol":{"ast":{"absolutePath":"contracts/payment/base/PayoutWalletBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"IPayoutWallet":[18960],"PayoutWalletBase":[18848],"PayoutWalletStorage":[19096]},"id":18849,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18789,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:167"},{"absolutePath":"contracts/payment/interfaces/IPayoutWallet.sol","file":"./../interfaces/IPayoutWallet.sol","id":18791,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18849,"sourceUnit":18961,"src":"58:64:167","symbolAliases":[{"foreign":{"id":18790,"name":"IPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18960,"src":"66:13:167","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":18793,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18849,"sourceUnit":9110,"src":"123:95:167","symbolAliases":[{"foreign":{"id":18792,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"131:24:167","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/libraries/PayoutWalletStorage.sol","file":"./../libraries/PayoutWalletStorage.sol","id":18795,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18849,"sourceUnit":19097,"src":"219:75:167","symbolAliases":[{"foreign":{"id":18794,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"227:19:167","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":18797,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18849,"sourceUnit":1207,"src":"295:66:167","symbolAliases":[{"foreign":{"id":18796,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"303:7:167","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":18799,"name":"IPayoutWallet","nameLocations":["605:13:167"],"nodeType":"IdentifierPath","referencedDeclaration":18960,"src":"605:13:167"},"id":18800,"nodeType":"InheritanceSpecifier","src":"605:13:167"},{"baseName":{"id":18801,"name":"Context","nameLocations":["620:7:167"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"620:7:167"},"id":18802,"nodeType":"InheritanceSpecifier","src":"620:7:167"}],"canonicalName":"PayoutWalletBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":18798,"nodeType":"StructuredDocumentation","src":"363:204:167","text":"@title Payout wallet (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":18848,"linearizedBaseContracts":[18848,1206,18960],"name":"PayoutWalletBase","nameLocation":"585:16:167","nodeType":"ContractDefinition","nodes":[{"global":false,"id":18806,"libraryName":{"id":18803,"name":"ContractOwnershipStorage","nameLocations":["640:24:167"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"640:24:167"},"nodeType":"UsingForDirective","src":"634:67:167","typeName":{"id":18805,"nodeType":"UserDefinedTypeName","pathNode":{"id":18804,"name":"ContractOwnershipStorage.Layout","nameLocations":["669:24:167","694:6:167"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"669:31:167"},"referencedDeclaration":8882,"src":"669:31:167","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":18810,"libraryName":{"id":18807,"name":"PayoutWalletStorage","nameLocations":["712:19:167"],"nodeType":"IdentifierPath","referencedDeclaration":19096,"src":"712:19:167"},"nodeType":"UsingForDirective","src":"706:57:167","typeName":{"id":18809,"nodeType":"UserDefinedTypeName","pathNode":{"id":18808,"name":"PayoutWalletStorage.Layout","nameLocations":["736:19:167","756:6:167"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"736:26:167"},"referencedDeclaration":18975,"src":"736:26:167","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}}},{"body":{"id":18833,"nodeType":"Block","src":"1160:158:167","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":18821,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1227:10:167","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":18822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1227:12:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18816,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1170:24:167","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":18818,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1195:6:167","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1170:31:167","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":18819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1170:33:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":18820,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1204:22:167","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1170:56:167","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":18823,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1170:70:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18824,"nodeType":"ExpressionStatement","src":"1170:70:167"},{"expression":{"arguments":[{"id":18830,"name":"newPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18813,"src":"1295:15:167","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18825,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"1250:19:167","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PayoutWalletStorage_$19096_$","typeString":"type(library PayoutWalletStorage)"}},"id":18827,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1270:6:167","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19095,"src":"1250:26:167","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function () pure returns (struct PayoutWalletStorage.Layout storage pointer)"}},"id":18828,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1250:28:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":18829,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1279:15:167","memberName":"setPayoutWallet","nodeType":"MemberAccess","referencedDeclaration":19070,"src":"1250:44:167","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$18975_storage_ptr_$_t_address_payable_$returns$__$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer,address payable)"}},"id":18831,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1250:61:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18832,"nodeType":"ExpressionStatement","src":"1250:61:167"}]},"documentation":{"id":18811,"nodeType":"StructuredDocumentation","src":"769:311:167","text":"@notice Sets the payout wallet.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param newPayoutWallet The payout wallet."},"functionSelector":"6b8f9c43","id":18834,"implemented":true,"kind":"function","modifiers":[],"name":"setPayoutWallet","nameLocation":"1094:15:167","nodeType":"FunctionDefinition","parameters":{"id":18814,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18813,"mutability":"mutable","name":"newPayoutWallet","nameLocation":"1126:15:167","nodeType":"VariableDeclaration","scope":18834,"src":"1110:31:167","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18812,"name":"address","nodeType":"ElementaryTypeName","src":"1110:15:167","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1109:33:167"},"returnParameters":{"id":18815,"nodeType":"ParameterList","parameters":[],"src":"1160:0:167"},"scope":18848,"src":"1085:233:167","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[18959],"body":{"id":18846,"nodeType":"Block","src":"1485:67:167","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18840,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"1502:19:167","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PayoutWalletStorage_$19096_$","typeString":"type(library PayoutWalletStorage)"}},"id":18841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1522:6:167","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19095,"src":"1502:26:167","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function () pure returns (struct PayoutWalletStorage.Layout storage pointer)"}},"id":18842,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1502:28:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":18843,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1531:12:167","memberName":"payoutWallet","nodeType":"MemberAccess","referencedDeclaration":19083,"src":"1502:41:167","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$18975_storage_ptr_$returns$_t_address_payable_$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer) view returns (address payable)"}},"id":18844,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1502:43:167","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"functionReturnParameters":18839,"id":18845,"nodeType":"Return","src":"1495:50:167"}]},"documentation":{"id":18835,"nodeType":"StructuredDocumentation","src":"1324:77:167","text":"@notice Gets the payout wallet.\n @return wallet The payout wallet."},"functionSelector":"8488bb4e","id":18847,"implemented":true,"kind":"function","modifiers":[],"name":"payoutWallet","nameLocation":"1415:12:167","nodeType":"FunctionDefinition","parameters":{"id":18836,"nodeType":"ParameterList","parameters":[],"src":"1427:2:167"},"returnParameters":{"id":18839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18838,"mutability":"mutable","name":"wallet","nameLocation":"1477:6:167","nodeType":"VariableDeclaration","scope":18847,"src":"1461:22:167","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18837,"name":"address","nodeType":"ElementaryTypeName","src":"1461:15:167","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1460:24:167"},"scope":18848,"src":"1406:146:167","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":18849,"src":"567:987:167","usedErrors":[8246,18853],"usedEvents":[18860]}],"src":"32:1523:167"},"id":167},"contracts/payment/errors/PayoutWalletErrors.sol":{"ast":{"absolutePath":"contracts/payment/errors/PayoutWalletErrors.sol","exportedSymbols":{"ZeroAddressPayoutWallet":[18853]},"id":18854,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18850,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:168"},{"documentation":{"id":18851,"nodeType":"StructuredDocumentation","src":"58:71:168","text":"@notice Thrown when setting the zero address as the payout wallet."},"errorSelector":"40b539cf","id":18853,"name":"ZeroAddressPayoutWallet","nameLocation":"135:23:168","nodeType":"ErrorDefinition","parameters":{"id":18852,"nodeType":"ParameterList","parameters":[],"src":"158:2:168"},"src":"129:32:168"}],"src":"32:130:168"},"id":168},"contracts/payment/events/PayoutWalletEvents.sol":{"ast":{"absolutePath":"contracts/payment/events/PayoutWalletEvents.sol","exportedSymbols":{"PayoutWalletSet":[18860]},"id":18861,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18855,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:169"},{"anonymous":false,"documentation":{"id":18856,"nodeType":"StructuredDocumentation","src":"58:115:169","text":"@notice Emitted when the payout wallet address changes.\n @param payoutWallet the new payout wallet address."},"eventSelector":"dd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855","id":18860,"name":"PayoutWalletSet","nameLocation":"179:15:169","nodeType":"EventDefinition","parameters":{"id":18859,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18858,"indexed":false,"mutability":"mutable","name":"payoutWallet","nameLocation":"203:12:169","nodeType":"VariableDeclaration","scope":18860,"src":"195:20:169","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18857,"name":"address","nodeType":"ElementaryTypeName","src":"195:7:169","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"194:22:169"},"src":"173:44:169"}],"src":"32:186:169"},"id":169},"contracts/payment/facets/PayoutWalletFacet.sol":{"ast":{"absolutePath":"contracts/payment/facets/PayoutWalletFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"PayoutWalletBase":[18848],"PayoutWalletFacet":[18950],"PayoutWalletStorage":[19096],"ProxyAdminStorage":[19477]},"id":18951,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18862,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:170"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":18864,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":13387,"src":"57:84:170","symbolAliases":[{"foreign":{"id":18863,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/libraries/PayoutWalletStorage.sol","file":"./../libraries/PayoutWalletStorage.sol","id":18866,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":19097,"src":"142:75:170","symbolAliases":[{"foreign":{"id":18865,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"150:19:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../proxy/libraries/ProxyAdminStorage.sol","id":18868,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":19478,"src":"218:80:170","symbolAliases":[{"foreign":{"id":18867,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"226:17:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/base/PayoutWalletBase.sol","file":"./../base/PayoutWalletBase.sol","id":18870,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":18849,"src":"299:64:170","symbolAliases":[{"foreign":{"id":18869,"name":"PayoutWalletBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18848,"src":"307:16:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":18872,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":1207,"src":"364:66:170","symbolAliases":[{"foreign":{"id":18871,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"372:7:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":18874,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":18951,"sourceUnit":13298,"src":"431:98:170","symbolAliases":[{"foreign":{"id":18873,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"439:28:170","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":18876,"name":"PayoutWalletBase","nameLocations":["816:16:170"],"nodeType":"IdentifierPath","referencedDeclaration":18848,"src":"816:16:170"},"id":18877,"nodeType":"InheritanceSpecifier","src":"816:16:170"},{"baseName":{"id":18878,"name":"ForwarderRegistryContextBase","nameLocations":["834:28:170"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"834:28:170"},"id":18879,"nodeType":"InheritanceSpecifier","src":"834:28:170"}],"canonicalName":"PayoutWalletFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":18875,"nodeType":"StructuredDocumentation","src":"531:255:170","text":"@title Payout wallet (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}."},"fullyImplemented":true,"id":18950,"linearizedBaseContracts":[18950,13297,18848,1206,18960],"name":"PayoutWalletFacet","nameLocation":"795:17:170","nodeType":"ContractDefinition","nodes":[{"global":false,"id":18883,"libraryName":{"id":18880,"name":"ProxyAdminStorage","nameLocations":["875:17:170"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"875:17:170"},"nodeType":"UsingForDirective","src":"869:53:170","typeName":{"id":18882,"nodeType":"UserDefinedTypeName","pathNode":{"id":18881,"name":"ProxyAdminStorage.Layout","nameLocations":["897:17:170","915:6:170"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"897:24:170"},"referencedDeclaration":19308,"src":"897:24:170","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":18887,"libraryName":{"id":18884,"name":"PayoutWalletStorage","nameLocations":["933:19:170"],"nodeType":"IdentifierPath","referencedDeclaration":19096,"src":"933:19:170"},"nodeType":"UsingForDirective","src":"927:57:170","typeName":{"id":18886,"nodeType":"UserDefinedTypeName","pathNode":{"id":18885,"name":"PayoutWalletStorage.Layout","nameLocations":["957:19:170","977:6:170"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"957:26:170"},"referencedDeclaration":18975,"src":"957:26:170","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}}},{"body":{"id":18896,"nodeType":"Block","src":"1088:2:170","statements":[]},"id":18897,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":18893,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18890,"src":"1069:17:170","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":18894,"kind":"baseConstructorSpecifier","modifierName":{"id":18892,"name":"ForwarderRegistryContextBase","nameLocations":["1040:28:170"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1040:28:170"},"nodeType":"ModifierInvocation","src":"1040:47:170"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":18891,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18890,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1021:17:170","nodeType":"VariableDeclaration","scope":18897,"src":"1002:36:170","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":18889,"nodeType":"UserDefinedTypeName","pathNode":{"id":18888,"name":"IForwarderRegistry","nameLocations":["1002:18:170"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1002:18:170"},"referencedDeclaration":13386,"src":"1002:18:170","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1001:38:170"},"returnParameters":{"id":18895,"nodeType":"ParameterList","parameters":[],"src":"1088:0:170"},"scope":18950,"src":"990:100:170","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":18920,"nodeType":"Block","src":"1712:146:170","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":18908,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[18935],"referencedDeclaration":18935,"src":"1769:10:170","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":18909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1769:12:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18903,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1722:17:170","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":18905,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1740:6:170","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1722:24:170","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":18906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1722:26:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":18907,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1749:19:170","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1722:46:170","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":18910,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1722:60:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18911,"nodeType":"ExpressionStatement","src":"1722:60:170"},{"expression":{"arguments":[{"id":18917,"name":"initialPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18900,"src":"1831:19:170","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18912,"name":"PayoutWalletStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19096,"src":"1792:19:170","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_PayoutWalletStorage_$19096_$","typeString":"type(library PayoutWalletStorage)"}},"id":18914,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1812:6:170","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19095,"src":"1792:26:170","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function () pure returns (struct PayoutWalletStorage.Layout storage pointer)"}},"id":18915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1792:28:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":18916,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1821:9:170","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":19040,"src":"1792:38:170","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$18975_storage_ptr_$_t_address_payable_$returns$__$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer,address payable)"}},"id":18918,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1792:59:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":18919,"nodeType":"ExpressionStatement","src":"1792:59:170"}]},"documentation":{"id":18898,"nodeType":"StructuredDocumentation","src":"1096:532:170","text":"@notice Initializes the storage with an initial payout wallet.\n @notice Sets the proxy initialization phase to `1`.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param initialPayoutWallet The initial payout wallet."},"functionSelector":"a556589a","id":18921,"implemented":true,"kind":"function","modifiers":[],"name":"initPayoutWalletStorage","nameLocation":"1642:23:170","nodeType":"FunctionDefinition","parameters":{"id":18901,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18900,"mutability":"mutable","name":"initialPayoutWallet","nameLocation":"1682:19:170","nodeType":"VariableDeclaration","scope":18921,"src":"1666:35:170","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18899,"name":"address","nodeType":"ElementaryTypeName","src":"1666:15:170","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1665:37:170"},"returnParameters":{"id":18902,"nodeType":"ParameterList","parameters":[],"src":"1712:0:170"},"scope":18950,"src":"1633:225:170","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":18934,"nodeType":"Block","src":"2023:65:170","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18930,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2040:28:170","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":18931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2069:10:170","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2040:39:170","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":18932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2040:41:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":18929,"id":18933,"nodeType":"Return","src":"2033:48:170"}]},"documentation":{"id":18922,"nodeType":"StructuredDocumentation","src":"1864:44:170","text":"@inheritdoc ForwarderRegistryContextBase"},"id":18935,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1922:10:170","nodeType":"FunctionDefinition","overrides":{"id":18926,"nodeType":"OverrideSpecifier","overrides":[{"id":18924,"name":"Context","nameLocations":["1966:7:170"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1966:7:170"},{"id":18925,"name":"ForwarderRegistryContextBase","nameLocations":["1975:28:170"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1975:28:170"}],"src":"1957:47:170"},"parameters":{"id":18923,"nodeType":"ParameterList","parameters":[],"src":"1932:2:170"},"returnParameters":{"id":18929,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18928,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18935,"src":"2014:7:170","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18927,"name":"address","nodeType":"ElementaryTypeName","src":"2014:7:170","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2013:9:170"},"scope":18950,"src":"1913:175:170","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":18948,"nodeType":"Block","src":"2258:63:170","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":18944,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2275:28:170","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":18945,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2304:8:170","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2275:37:170","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":18946,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2275:39:170","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":18943,"id":18947,"nodeType":"Return","src":"2268:46:170"}]},"documentation":{"id":18936,"nodeType":"StructuredDocumentation","src":"2094:44:170","text":"@inheritdoc ForwarderRegistryContextBase"},"id":18949,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2152:8:170","nodeType":"FunctionDefinition","overrides":{"id":18940,"nodeType":"OverrideSpecifier","overrides":[{"id":18938,"name":"Context","nameLocations":["2194:7:170"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2194:7:170"},{"id":18939,"name":"ForwarderRegistryContextBase","nameLocations":["2203:28:170"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2203:28:170"}],"src":"2185:47:170"},"parameters":{"id":18937,"nodeType":"ParameterList","parameters":[],"src":"2160:2:170"},"returnParameters":{"id":18943,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18942,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":18949,"src":"2242:14:170","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":18941,"name":"bytes","nodeType":"ElementaryTypeName","src":"2242:5:170","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2241:16:170"},"scope":18950,"src":"2143:178:170","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":18951,"src":"786:1537:170","usedErrors":[8246,18853,19183,19192],"usedEvents":[18860]}],"src":"32:2292:170"},"id":170},"contracts/payment/interfaces/IPayoutWallet.sol":{"ast":{"absolutePath":"contracts/payment/interfaces/IPayoutWallet.sol","exportedSymbols":{"IPayoutWallet":[18960]},"id":18961,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18952,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:171"},{"abstract":false,"baseContracts":[],"canonicalName":"IPayoutWallet","contractDependencies":[],"contractKind":"interface","documentation":{"id":18953,"nodeType":"StructuredDocumentation","src":"58:37:171","text":"@title Payout wallet (functions)"},"fullyImplemented":false,"id":18960,"linearizedBaseContracts":[18960],"name":"IPayoutWallet","nameLocation":"105:13:171","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":18954,"nodeType":"StructuredDocumentation","src":"125:77:171","text":"@notice Gets the payout wallet.\n @return wallet The payout wallet."},"functionSelector":"8488bb4e","id":18959,"implemented":false,"kind":"function","modifiers":[],"name":"payoutWallet","nameLocation":"216:12:171","nodeType":"FunctionDefinition","parameters":{"id":18955,"nodeType":"ParameterList","parameters":[],"src":"228:2:171"},"returnParameters":{"id":18958,"nodeType":"ParameterList","parameters":[{"constant":false,"id":18957,"mutability":"mutable","name":"wallet","nameLocation":"270:6:171","nodeType":"VariableDeclaration","scope":18959,"src":"254:22:171","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18956,"name":"address","nodeType":"ElementaryTypeName","src":"254:15:171","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"253:24:171"},"scope":18960,"src":"207:71:171","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":18961,"src":"95:185:171","usedErrors":[],"usedEvents":[]}],"src":"32:249:171"},"id":171},"contracts/payment/libraries/PayoutWalletStorage.sol":{"ast":{"absolutePath":"contracts/payment/libraries/PayoutWalletStorage.sol","exportedSymbols":{"PayoutWalletSet":[18860],"PayoutWalletStorage":[19096],"ProxyInitialization":[19524],"ZeroAddressPayoutWallet":[18853]},"id":19097,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":18962,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:172"},{"absolutePath":"contracts/payment/errors/PayoutWalletErrors.sol","file":"./../errors/PayoutWalletErrors.sol","id":18964,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19097,"sourceUnit":18854,"src":"58:75:172","symbolAliases":[{"foreign":{"id":18963,"name":"ZeroAddressPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18853,"src":"66:23:172","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/payment/events/PayoutWalletEvents.sol","file":"./../events/PayoutWalletEvents.sol","id":18966,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19097,"sourceUnit":18861,"src":"134:67:172","symbolAliases":[{"foreign":{"id":18965,"name":"PayoutWalletSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18860,"src":"142:15:172","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../proxy/libraries/ProxyInitialization.sol","id":18968,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19097,"sourceUnit":19525,"src":"202:84:172","symbolAliases":[{"foreign":{"id":18967,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"210:19:172","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"PayoutWalletStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":19096,"linearizedBaseContracts":[19096],"name":"PayoutWalletStorage","nameLocation":"296:19:172","nodeType":"ContractDefinition","nodes":[{"global":false,"id":18972,"libraryName":{"id":18969,"name":"PayoutWalletStorage","nameLocations":["328:19:172"],"nodeType":"IdentifierPath","referencedDeclaration":19096,"src":"328:19:172"},"nodeType":"UsingForDirective","src":"322:57:172","typeName":{"id":18971,"nodeType":"UserDefinedTypeName","pathNode":{"id":18970,"name":"PayoutWalletStorage.Layout","nameLocations":["352:19:172","372:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"352:26:172"},"referencedDeclaration":18975,"src":"352:26:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}}},{"canonicalName":"PayoutWalletStorage.Layout","id":18975,"members":[{"constant":false,"id":18974,"mutability":"mutable","name":"wallet","nameLocation":"425:6:172","nodeType":"VariableDeclaration","scope":18975,"src":"409:22:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":18973,"name":"address","nodeType":"ElementaryTypeName","src":"409:15:172","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"name":"Layout","nameLocation":"392:6:172","nodeType":"StructDefinition","scope":19096,"src":"385:53:172","visibility":"public"},{"constant":true,"id":18988,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"470:19:172","nodeType":"VariableDeclaration","scope":19096,"src":"444:124:172","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18976,"name":"bytes32","nodeType":"ElementaryTypeName","src":"444:7:172","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18986,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e7061796d656e742e5061796f757457616c6c65742e73746f72616765","id":18982,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"518:43:172","typeDescriptions":{"typeIdentifier":"t_stringliteral_4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ae","typeString":"literal_string \"animoca.core.payment.PayoutWallet.storage\""},"value":"animoca.core.payment.PayoutWallet.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ae","typeString":"literal_string \"animoca.core.payment.PayoutWallet.storage\""}],"id":18981,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"508:9:172","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18983,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"508:54:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":18980,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"500:7:172","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18979,"name":"uint256","nodeType":"ElementaryTypeName","src":"500:7:172","typeDescriptions":{}}},"id":18984,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"500:63:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":18985,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"566:1:172","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"500:67:172","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18978,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"492:7:172","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":18977,"name":"bytes32","nodeType":"ElementaryTypeName","src":"492:7:172","typeDescriptions":{}}},"id":18987,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"492:76:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":19001,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"600:21:172","nodeType":"VariableDeclaration","scope":19096,"src":"574:124:172","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":18989,"name":"bytes32","nodeType":"ElementaryTypeName","src":"574:7:172","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":18999,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e7061796d656e742e5061796f757457616c6c65742e7068617365","id":18995,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"650:41:172","typeDescriptions":{"typeIdentifier":"t_stringliteral_03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19e","typeString":"literal_string \"animoca.core.payment.PayoutWallet.phase\""},"value":"animoca.core.payment.PayoutWallet.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19e","typeString":"literal_string \"animoca.core.payment.PayoutWallet.phase\""}],"id":18994,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"640:9:172","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":18996,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"640:52:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":18993,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"632:7:172","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":18992,"name":"uint256","nodeType":"ElementaryTypeName","src":"632:7:172","typeDescriptions":{}}},"id":18997,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"632:61:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":18998,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"696:1:172","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"632:65:172","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":18991,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"624:7:172","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":18990,"name":"bytes32","nodeType":"ElementaryTypeName","src":"624:7:172","typeDescriptions":{}}},"id":19000,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"624:74:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":19016,"nodeType":"Block","src":"1205:55:172","statements":[{"expression":{"arguments":[{"id":19013,"name":"initialPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19007,"src":"1233:19:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"id":19010,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19005,"src":"1215:1:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":19012,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1217:15:172","memberName":"setPayoutWallet","nodeType":"MemberAccess","referencedDeclaration":19070,"src":"1215:17:172","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$18975_storage_ptr_$_t_address_payable_$returns$__$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer,address payable)"}},"id":19014,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1215:38:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19015,"nodeType":"ExpressionStatement","src":"1215:38:172"}]},"documentation":{"id":19002,"nodeType":"StructuredDocumentation","src":"705:406:172","text":"@notice Initializes the storage with an initial payout wallet (immutable version).\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param initialPayoutWallet The initial payout wallet."},"id":19017,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1125:15:172","nodeType":"FunctionDefinition","parameters":{"id":19008,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19005,"mutability":"mutable","name":"s","nameLocation":"1156:1:172","nodeType":"VariableDeclaration","scope":19017,"src":"1141:16:172","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"},"typeName":{"id":19004,"nodeType":"UserDefinedTypeName","pathNode":{"id":19003,"name":"Layout","nameLocations":["1141:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"1141:6:172"},"referencedDeclaration":18975,"src":"1141:6:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19007,"mutability":"mutable","name":"initialPayoutWallet","nameLocation":"1175:19:172","nodeType":"VariableDeclaration","scope":19017,"src":"1159:35:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":19006,"name":"address","nodeType":"ElementaryTypeName","src":"1159:15:172","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1140:55:172"},"returnParameters":{"id":19009,"nodeType":"ParameterList","parameters":[],"src":"1205:0:172"},"scope":19096,"src":"1116:144:172","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19039,"nodeType":"Block","src":"1923:119:172","statements":[{"expression":{"arguments":[{"id":19029,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19001,"src":"1962:21:172","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":19030,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1985:1:172","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":19026,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"1933:19:172","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":19028,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1953:8:172","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"1933:28:172","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":19031,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1933:54:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19032,"nodeType":"ExpressionStatement","src":"1933:54:172"},{"expression":{"arguments":[{"id":19036,"name":"initialPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19023,"src":"2015:19:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"expression":{"id":19033,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19021,"src":"1997:1:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":19035,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1999:15:172","memberName":"setPayoutWallet","nodeType":"MemberAccess","referencedDeclaration":19070,"src":"1997:17:172","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$18975_storage_ptr_$_t_address_payable_$returns$__$attached_to$_t_struct$_Layout_$18975_storage_ptr_$","typeString":"function (struct PayoutWalletStorage.Layout storage pointer,address payable)"}},"id":19037,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1997:38:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19038,"nodeType":"ExpressionStatement","src":"1997:38:172"}]},"documentation":{"id":19018,"nodeType":"StructuredDocumentation","src":"1266:569:172","text":"@notice Initializes the storage with an initial payout wallet (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param initialPayoutWallet The initial payout wallet."},"id":19040,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"1849:9:172","nodeType":"FunctionDefinition","parameters":{"id":19024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19021,"mutability":"mutable","name":"s","nameLocation":"1874:1:172","nodeType":"VariableDeclaration","scope":19040,"src":"1859:16:172","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"},"typeName":{"id":19020,"nodeType":"UserDefinedTypeName","pathNode":{"id":19019,"name":"Layout","nameLocations":["1859:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"1859:6:172"},"referencedDeclaration":18975,"src":"1859:6:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19023,"mutability":"mutable","name":"initialPayoutWallet","nameLocation":"1893:19:172","nodeType":"VariableDeclaration","scope":19040,"src":"1877:35:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":19022,"name":"address","nodeType":"ElementaryTypeName","src":"1877:15:172","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"1858:55:172"},"returnParameters":{"id":19025,"nodeType":"ParameterList","parameters":[],"src":"1923:0:172"},"scope":19096,"src":"1840:202:172","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19069,"nodeType":"Block","src":"2363:167:172","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19054,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19049,"name":"newPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19046,"src":"2377:15:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":19052,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2404:1:172","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19051,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2396:7:172","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19050,"name":"address","nodeType":"ElementaryTypeName","src":"2396:7:172","typeDescriptions":{}}},"id":19053,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2396:10:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2377:29:172","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19058,"nodeType":"IfStatement","src":"2373:67:172","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":19055,"name":"ZeroAddressPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18853,"src":"2415:23:172","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":19056,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2415:25:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19057,"nodeType":"RevertStatement","src":"2408:32:172"}},{"expression":{"id":19063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":19059,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19044,"src":"2450:1:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":19061,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2452:6:172","memberName":"wallet","nodeType":"MemberAccess","referencedDeclaration":18974,"src":"2450:8:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19062,"name":"newPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19046,"src":"2461:15:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"src":"2450:26:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":19064,"nodeType":"ExpressionStatement","src":"2450:26:172"},{"eventCall":{"arguments":[{"id":19066,"name":"newPayoutWallet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19046,"src":"2507:15:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":19065,"name":"PayoutWalletSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18860,"src":"2491:15:172","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":19067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2491:32:172","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19068,"nodeType":"EmitStatement","src":"2486:37:172"}]},"documentation":{"id":19041,"nodeType":"StructuredDocumentation","src":"2048:225:172","text":"@notice Sets the payout wallet.\n @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\n @dev Emits a {PayoutWalletSet} event.\n @param newPayoutWallet The payout wallet."},"id":19070,"implemented":true,"kind":"function","modifiers":[],"name":"setPayoutWallet","nameLocation":"2287:15:172","nodeType":"FunctionDefinition","parameters":{"id":19047,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19044,"mutability":"mutable","name":"s","nameLocation":"2318:1:172","nodeType":"VariableDeclaration","scope":19070,"src":"2303:16:172","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"},"typeName":{"id":19043,"nodeType":"UserDefinedTypeName","pathNode":{"id":19042,"name":"Layout","nameLocations":["2303:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"2303:6:172"},"referencedDeclaration":18975,"src":"2303:6:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19046,"mutability":"mutable","name":"newPayoutWallet","nameLocation":"2337:15:172","nodeType":"VariableDeclaration","scope":19070,"src":"2321:31:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":19045,"name":"address","nodeType":"ElementaryTypeName","src":"2321:15:172","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"2302:51:172"},"returnParameters":{"id":19048,"nodeType":"ParameterList","parameters":[],"src":"2363:0:172"},"scope":19096,"src":"2278:252:172","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19082,"nodeType":"Block","src":"2698:32:172","statements":[{"expression":{"expression":{"id":19079,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19074,"src":"2715:1:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout storage pointer"}},"id":19080,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2717:6:172","memberName":"wallet","nodeType":"MemberAccess","referencedDeclaration":18974,"src":"2715:8:172","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"functionReturnParameters":19078,"id":19081,"nodeType":"Return","src":"2708:15:172"}]},"documentation":{"id":19071,"nodeType":"StructuredDocumentation","src":"2536:77:172","text":"@notice Gets the payout wallet.\n @return wallet The payout wallet."},"id":19083,"implemented":true,"kind":"function","modifiers":[],"name":"payoutWallet","nameLocation":"2627:12:172","nodeType":"FunctionDefinition","parameters":{"id":19075,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19074,"mutability":"mutable","name":"s","nameLocation":"2655:1:172","nodeType":"VariableDeclaration","scope":19083,"src":"2640:16:172","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"},"typeName":{"id":19073,"nodeType":"UserDefinedTypeName","pathNode":{"id":19072,"name":"Layout","nameLocations":["2640:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"2640:6:172"},"referencedDeclaration":18975,"src":"2640:6:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}},"visibility":"internal"}],"src":"2639:18:172"},"returnParameters":{"id":19078,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19077,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19083,"src":"2681:15:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"},"typeName":{"id":19076,"name":"address","nodeType":"ElementaryTypeName","src":"2681:15:172","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"visibility":"internal"}],"src":"2680:17:172"},"scope":19096,"src":"2618:112:172","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":19094,"nodeType":"Block","src":"2795:115:172","statements":[{"assignments":[19090],"declarations":[{"constant":false,"id":19090,"mutability":"mutable","name":"position","nameLocation":"2813:8:172","nodeType":"VariableDeclaration","scope":19094,"src":"2805:16:172","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19089,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2805:7:172","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":19092,"initialValue":{"id":19091,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18988,"src":"2824:19:172","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2805:38:172"},{"AST":{"nativeSrc":"2862:42:172","nodeType":"YulBlock","src":"2862:42:172","statements":[{"nativeSrc":"2876:18:172","nodeType":"YulAssignment","src":"2876:18:172","value":{"name":"position","nativeSrc":"2886:8:172","nodeType":"YulIdentifier","src":"2886:8:172"},"variableNames":[{"name":"s.slot","nativeSrc":"2876:6:172","nodeType":"YulIdentifier","src":"2876:6:172"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":19090,"isOffset":false,"isSlot":false,"src":"2886:8:172","valueSize":1},{"declaration":19087,"isOffset":false,"isSlot":true,"src":"2876:6:172","suffix":"slot","valueSize":1}],"id":19093,"nodeType":"InlineAssembly","src":"2853:51:172"}]},"id":19095,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"2745:6:172","nodeType":"FunctionDefinition","parameters":{"id":19084,"nodeType":"ParameterList","parameters":[],"src":"2751:2:172"},"returnParameters":{"id":19088,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19087,"mutability":"mutable","name":"s","nameLocation":"2792:1:172","nodeType":"VariableDeclaration","scope":19095,"src":"2777:16:172","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"},"typeName":{"id":19086,"nodeType":"UserDefinedTypeName","pathNode":{"id":19085,"name":"Layout","nameLocations":["2777:6:172"],"nodeType":"IdentifierPath","referencedDeclaration":18975,"src":"2777:6:172"},"referencedDeclaration":18975,"src":"2777:6:172","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$18975_storage_ptr","typeString":"struct PayoutWalletStorage.Layout"}},"visibility":"internal"}],"src":"2776:18:172"},"scope":19096,"src":"2736:174:172","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":19097,"src":"288:2624:172","usedErrors":[],"usedEvents":[]}],"src":"32:2881:172"},"id":172},"contracts/proxy/ProxyAdmin.sol":{"ast":{"absolutePath":"contracts/proxy/ProxyAdmin.sol","exportedSymbols":{"ProxyAdmin":[19125],"ProxyAdminBase":[19173],"ProxyAdminStorage":[19477]},"id":19126,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19098,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:173"},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./libraries/ProxyAdminStorage.sol","id":19100,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19126,"sourceUnit":19478,"src":"58:68:173","symbolAliases":[{"foreign":{"id":19099,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"66:17:173","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/base/ProxyAdminBase.sol","file":"./base/ProxyAdminBase.sol","id":19102,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19126,"sourceUnit":19174,"src":"127:57:173","symbolAliases":[{"foreign":{"id":19101,"name":"ProxyAdminBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19173,"src":"135:14:173","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":19104,"name":"ProxyAdminBase","nameLocations":["454:14:173"],"nodeType":"IdentifierPath","referencedDeclaration":19173,"src":"454:14:173"},"id":19105,"nodeType":"InheritanceSpecifier","src":"454:14:173"}],"canonicalName":"ProxyAdmin","contractDependencies":[],"contractKind":"contract","documentation":{"id":19103,"nodeType":"StructuredDocumentation","src":"186:236:173","text":"@title ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).\n @dev See https://eips.ethereum.org/EIPS/eip-1967\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":19125,"linearizedBaseContracts":[19125,19173,1206,19292],"name":"ProxyAdmin","nameLocation":"440:10:173","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19109,"libraryName":{"id":19106,"name":"ProxyAdminStorage","nameLocations":["481:17:173"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"481:17:173"},"nodeType":"UsingForDirective","src":"475:53:173","typeName":{"id":19108,"nodeType":"UserDefinedTypeName","pathNode":{"id":19107,"name":"ProxyAdminStorage.Layout","nameLocations":["503:17:173","521:6:173"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"503:24:173"},"referencedDeclaration":19308,"src":"503:24:173","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":19123,"nodeType":"Block","src":"772:73:173","statements":[{"expression":{"arguments":[{"id":19120,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19112,"src":"825:12:173","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19115,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"782:17:173","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":19117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"800:6:173","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"782:24:173","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":19118,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"782:26:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19119,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"809:15:173","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":19368,"src":"782:42:173","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address)"}},"id":19121,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"782:56:173","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19122,"nodeType":"ExpressionStatement","src":"782:56:173"}]},"documentation":{"id":19110,"nodeType":"StructuredDocumentation","src":"534:199:173","text":"@notice Initializes the storage with an initial admin.\n @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\n @param initialAdmin The initial payout wallet."},"id":19124,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19112,"mutability":"mutable","name":"initialAdmin","nameLocation":"758:12:173","nodeType":"VariableDeclaration","scope":19124,"src":"750:20:173","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19111,"name":"address","nodeType":"ElementaryTypeName","src":"750:7:173","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"749:22:173"},"returnParameters":{"id":19114,"nodeType":"ParameterList","parameters":[],"src":"772:0:173"},"scope":19125,"src":"738:107:173","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":19126,"src":"422:425:173","usedErrors":[19178,19183],"usedEvents":[19201]}],"src":"32:816:173"},"id":173},"contracts/proxy/base/ProxyAdminBase.sol":{"ast":{"absolutePath":"contracts/proxy/base/ProxyAdminBase.sol","exportedSymbols":{"Context":[1206],"IProxyAdmin":[19292],"ProxyAdminBase":[19173],"ProxyAdminStorage":[19477]},"id":19174,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19127,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:174"},{"absolutePath":"contracts/proxy/interfaces/IProxyAdmin.sol","file":"./../interfaces/IProxyAdmin.sol","id":19129,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19174,"sourceUnit":19293,"src":"58:60:174","symbolAliases":[{"foreign":{"id":19128,"name":"IProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19292,"src":"66:11:174","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../libraries/ProxyAdminStorage.sol","id":19131,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19174,"sourceUnit":19478,"src":"119:71:174","symbolAliases":[{"foreign":{"id":19130,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"127:17:174","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19133,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19174,"sourceUnit":1207,"src":"191:66:174","symbolAliases":[{"foreign":{"id":19132,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"199:7:174","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":19135,"name":"IProxyAdmin","nameLocations":["514:11:174"],"nodeType":"IdentifierPath","referencedDeclaration":19292,"src":"514:11:174"},"id":19136,"nodeType":"InheritanceSpecifier","src":"514:11:174"},{"baseName":{"id":19137,"name":"Context","nameLocations":["527:7:174"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"527:7:174"},"id":19138,"nodeType":"InheritanceSpecifier","src":"527:7:174"}],"canonicalName":"ProxyAdminBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":19134,"nodeType":"StructuredDocumentation","src":"259:219:174","text":"@title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\n @dev See https://eips.ethereum.org/EIPS/eip-1967\n @dev This contract is to be used via inheritance in a proxied implementation."},"fullyImplemented":true,"id":19173,"linearizedBaseContracts":[19173,1206,19292],"name":"ProxyAdminBase","nameLocation":"496:14:174","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19142,"libraryName":{"id":19139,"name":"ProxyAdminStorage","nameLocations":["547:17:174"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"547:17:174"},"nodeType":"UsingForDirective","src":"541:53:174","typeName":{"id":19141,"nodeType":"UserDefinedTypeName","pathNode":{"id":19140,"name":"ProxyAdminStorage.Layout","nameLocations":["569:17:174","587:6:174"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"569:24:174"},"referencedDeclaration":19308,"src":"569:24:174","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"baseFunctions":[19285],"body":{"id":19158,"nodeType":"Block","src":"924:84:174","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":19153,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"978:10:174","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"978:12:174","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":19155,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19145,"src":"992:8:174","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19148,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"934:17:174","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":19150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"952:6:174","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"934:24:174","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":19151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"934:26:174","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19152,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"961:16:174","memberName":"changeProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19432,"src":"934:43:174","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address,address)"}},"id":19156,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"934:67:174","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19157,"nodeType":"ExpressionStatement","src":"934:67:174"}]},"documentation":{"id":19143,"nodeType":"StructuredDocumentation","src":"600:258:174","text":"@notice Sets a new proxy admin.\n @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\n @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n @param newAdmin The new proxy admin."},"functionSelector":"9f712f2f","id":19159,"implemented":true,"kind":"function","modifiers":[],"name":"changeProxyAdmin","nameLocation":"872:16:174","nodeType":"FunctionDefinition","parameters":{"id":19146,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19145,"mutability":"mutable","name":"newAdmin","nameLocation":"897:8:174","nodeType":"VariableDeclaration","scope":19159,"src":"889:16:174","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19144,"name":"address","nodeType":"ElementaryTypeName","src":"889:7:174","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"888:18:174"},"returnParameters":{"id":19147,"nodeType":"ParameterList","parameters":[],"src":"924:0:174"},"scope":19173,"src":"863:145:174","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[19291],"body":{"id":19171,"nodeType":"Block","src":"1159:63:174","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19165,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1176:17:174","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":19166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1194:6:174","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1176:24:174","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":19167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1176:26:174","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19168,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1203:10:174","memberName":"proxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19445,"src":"1176:37:174","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$returns$_t_address_$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer) view returns (address)"}},"id":19169,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1176:39:174","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19164,"id":19170,"nodeType":"Return","src":"1169:46:174"}]},"documentation":{"id":19160,"nodeType":"StructuredDocumentation","src":"1014:72:174","text":"@notice Gets the proxy admin.\n @return admin The proxy admin."},"functionSelector":"3e47158c","id":19172,"implemented":true,"kind":"function","modifiers":[],"name":"proxyAdmin","nameLocation":"1100:10:174","nodeType":"FunctionDefinition","parameters":{"id":19161,"nodeType":"ParameterList","parameters":[],"src":"1110:2:174"},"returnParameters":{"id":19164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19163,"mutability":"mutable","name":"admin","nameLocation":"1152:5:174","nodeType":"VariableDeclaration","scope":19172,"src":"1144:13:174","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19162,"name":"address","nodeType":"ElementaryTypeName","src":"1144:7:174","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1143:15:174"},"scope":19173,"src":"1091:131:174","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":19174,"src":"478:746:174","usedErrors":[19183],"usedEvents":[19201]}],"src":"32:1193:174"},"id":174},"contracts/proxy/errors/ProxyAdminErrors.sol":{"ast":{"absolutePath":"contracts/proxy/errors/ProxyAdminErrors.sol","exportedSymbols":{"NoInitialProxyAdmin":[19178],"NotProxyAdmin":[19183]},"id":19184,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19175,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:175"},{"documentation":{"id":19176,"nodeType":"StructuredDocumentation","src":"58:54:175","text":"@notice Thrown when the initial admin is not set."},"errorSelector":"bf919560","id":19178,"name":"NoInitialProxyAdmin","nameLocation":"118:19:175","nodeType":"ErrorDefinition","parameters":{"id":19177,"nodeType":"ParameterList","parameters":[],"src":"137:2:175"},"src":"112:28:175"},{"documentation":{"id":19179,"nodeType":"StructuredDocumentation","src":"142:127:175","text":"@notice Thrown when an account is not the proxy admin but is required to.\n @param account The account that was checked."},"errorSelector":"673a31a1","id":19183,"name":"NotProxyAdmin","nameLocation":"275:13:175","nodeType":"ErrorDefinition","parameters":{"id":19182,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19181,"mutability":"mutable","name":"account","nameLocation":"297:7:175","nodeType":"VariableDeclaration","scope":19183,"src":"289:15:175","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19180,"name":"address","nodeType":"ElementaryTypeName","src":"289:7:175","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"288:17:175"},"src":"269:37:175"}],"src":"32:275:175"},"id":175},"contracts/proxy/errors/ProxyInitializationErrors.sol":{"ast":{"absolutePath":"contracts/proxy/errors/ProxyInitializationErrors.sol","exportedSymbols":{"InitializationPhaseAlreadyReached":[19192]},"id":19193,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19185,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:176"},{"documentation":{"id":19186,"nodeType":"StructuredDocumentation","src":"58:179:176","text":"@notice Emitted when trying to set a phase value that has already been reached.\n @param currentPhase The current phase.\n @param newPhase The new phase trying to be set."},"errorSelector":"bf0c18ec","id":19192,"name":"InitializationPhaseAlreadyReached","nameLocation":"243:33:176","nodeType":"ErrorDefinition","parameters":{"id":19191,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19188,"mutability":"mutable","name":"currentPhase","nameLocation":"285:12:176","nodeType":"VariableDeclaration","scope":19192,"src":"277:20:176","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19187,"name":"uint256","nodeType":"ElementaryTypeName","src":"277:7:176","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19190,"mutability":"mutable","name":"newPhase","nameLocation":"307:8:176","nodeType":"VariableDeclaration","scope":19192,"src":"299:16:176","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19189,"name":"uint256","nodeType":"ElementaryTypeName","src":"299:7:176","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"276:40:176"},"src":"237:80:176"}],"src":"32:286:176"},"id":176},"contracts/proxy/events/ProxyAdminEvents.sol":{"ast":{"absolutePath":"contracts/proxy/events/ProxyAdminEvents.sol","exportedSymbols":{"AdminChanged":[19201]},"id":19202,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19194,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:177"},{"anonymous":false,"documentation":{"id":19195,"nodeType":"StructuredDocumentation","src":"58:130:177","text":"@notice Emitted when the proxy admin changes.\n @param previousAdmin the previous admin.\n @param newAdmin the new admin."},"eventSelector":"7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f","id":19201,"name":"AdminChanged","nameLocation":"194:12:177","nodeType":"EventDefinition","parameters":{"id":19200,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19197,"indexed":false,"mutability":"mutable","name":"previousAdmin","nameLocation":"215:13:177","nodeType":"VariableDeclaration","scope":19201,"src":"207:21:177","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19196,"name":"address","nodeType":"ElementaryTypeName","src":"207:7:177","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19199,"indexed":false,"mutability":"mutable","name":"newAdmin","nameLocation":"238:8:177","nodeType":"VariableDeclaration","scope":19201,"src":"230:16:177","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19198,"name":"address","nodeType":"ElementaryTypeName","src":"230:7:177","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"206:41:177"},"src":"188:60:177"}],"src":"32:217:177"},"id":177},"contracts/proxy/facets/ProxyAdminFacet.sol":{"ast":{"absolutePath":"contracts/proxy/facets/ProxyAdminFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminBase":[19173],"ProxyAdminFacet":[19276],"ProxyAdminStorage":[19477]},"id":19277,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19203,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:178"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":19205,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19277,"sourceUnit":13387,"src":"57:84:178","symbolAliases":[{"foreign":{"id":19204,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:178","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../libraries/ProxyAdminStorage.sol","id":19207,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19277,"sourceUnit":19478,"src":"142:71:178","symbolAliases":[{"foreign":{"id":19206,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"150:17:178","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/base/ProxyAdminBase.sol","file":"./../base/ProxyAdminBase.sol","id":19209,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19277,"sourceUnit":19174,"src":"214:60:178","symbolAliases":[{"foreign":{"id":19208,"name":"ProxyAdminBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19173,"src":"222:14:178","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19211,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19277,"sourceUnit":1207,"src":"275:66:178","symbolAliases":[{"foreign":{"id":19210,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"283:7:178","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":19213,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19277,"sourceUnit":13298,"src":"342:98:178","symbolAliases":[{"foreign":{"id":19212,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"350:28:178","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19215,"name":"ProxyAdminBase","nameLocations":["731:14:178"],"nodeType":"IdentifierPath","referencedDeclaration":19173,"src":"731:14:178"},"id":19216,"nodeType":"InheritanceSpecifier","src":"731:14:178"},{"baseName":{"id":19217,"name":"ForwarderRegistryContextBase","nameLocations":["747:28:178"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"747:28:178"},"id":19218,"nodeType":"InheritanceSpecifier","src":"747:28:178"}],"canonicalName":"ProxyAdminFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":19214,"nodeType":"StructuredDocumentation","src":"442:261:178","text":"@title ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).\n @dev See https://eips.ethereum.org/EIPS/eip-1967\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535)."},"fullyImplemented":true,"id":19276,"linearizedBaseContracts":[19276,13297,19173,1206,19292],"name":"ProxyAdminFacet","nameLocation":"712:15:178","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19222,"libraryName":{"id":19219,"name":"ProxyAdminStorage","nameLocations":["788:17:178"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"788:17:178"},"nodeType":"UsingForDirective","src":"782:53:178","typeName":{"id":19221,"nodeType":"UserDefinedTypeName","pathNode":{"id":19220,"name":"ProxyAdminStorage.Layout","nameLocations":["810:17:178","828:6:178"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"810:24:178"},"referencedDeclaration":19308,"src":"810:24:178","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":19231,"nodeType":"Block","src":"939:2:178","statements":[]},"id":19232,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19228,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19225,"src":"920:17:178","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":19229,"kind":"baseConstructorSpecifier","modifierName":{"id":19227,"name":"ForwarderRegistryContextBase","nameLocations":["891:28:178"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"891:28:178"},"nodeType":"ModifierInvocation","src":"891:47:178"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19226,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19225,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"872:17:178","nodeType":"VariableDeclaration","scope":19232,"src":"853:36:178","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":19224,"nodeType":"UserDefinedTypeName","pathNode":{"id":19223,"name":"IForwarderRegistry","nameLocations":["853:18:178"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"853:18:178"},"referencedDeclaration":13386,"src":"853:18:178","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"852:38:178"},"returnParameters":{"id":19230,"nodeType":"ParameterList","parameters":[],"src":"939:0:178"},"scope":19276,"src":"841:100:178","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19246,"nodeType":"Block","src":"1393:67:178","statements":[{"expression":{"arguments":[{"id":19243,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19235,"src":"1440:12:178","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19238,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1403:17:178","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":19240,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1421:6:178","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1403:24:178","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":19241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1403:26:178","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19242,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1430:9:178","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":19391,"src":"1403:36:178","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address)"}},"id":19244,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1403:50:178","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19245,"nodeType":"ExpressionStatement","src":"1403:50:178"}]},"documentation":{"id":19233,"nodeType":"StructuredDocumentation","src":"947:379:178","text":"@notice Initializes the storage with an initial admin.\n @notice Sets the proxy initialization phase to `1`.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\n @param initialAdmin The initial payout wallet."},"functionSelector":"4d350622","id":19247,"implemented":true,"kind":"function","modifiers":[],"name":"initProxyAdminStorage","nameLocation":"1340:21:178","nodeType":"FunctionDefinition","parameters":{"id":19236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19235,"mutability":"mutable","name":"initialAdmin","nameLocation":"1370:12:178","nodeType":"VariableDeclaration","scope":19247,"src":"1362:20:178","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19234,"name":"address","nodeType":"ElementaryTypeName","src":"1362:7:178","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1361:22:178"},"returnParameters":{"id":19237,"nodeType":"ParameterList","parameters":[],"src":"1393:0:178"},"scope":19276,"src":"1331:129:178","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":19260,"nodeType":"Block","src":"1625:65:178","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19256,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1642:28:178","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1671:10:178","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1642:39:178","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1642:41:178","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19255,"id":19259,"nodeType":"Return","src":"1635:48:178"}]},"documentation":{"id":19248,"nodeType":"StructuredDocumentation","src":"1466:44:178","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19261,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1524:10:178","nodeType":"FunctionDefinition","overrides":{"id":19252,"nodeType":"OverrideSpecifier","overrides":[{"id":19250,"name":"Context","nameLocations":["1568:7:178"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1568:7:178"},{"id":19251,"name":"ForwarderRegistryContextBase","nameLocations":["1577:28:178"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1577:28:178"}],"src":"1559:47:178"},"parameters":{"id":19249,"nodeType":"ParameterList","parameters":[],"src":"1534:2:178"},"returnParameters":{"id":19255,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19254,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19261,"src":"1616:7:178","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19253,"name":"address","nodeType":"ElementaryTypeName","src":"1616:7:178","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1615:9:178"},"scope":19276,"src":"1515:175:178","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":19274,"nodeType":"Block","src":"1860:63:178","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19270,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1877:28:178","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19271,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1906:8:178","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1877:37:178","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":19272,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1877:39:178","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":19269,"id":19273,"nodeType":"Return","src":"1870:46:178"}]},"documentation":{"id":19262,"nodeType":"StructuredDocumentation","src":"1696:44:178","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19275,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1754:8:178","nodeType":"FunctionDefinition","overrides":{"id":19266,"nodeType":"OverrideSpecifier","overrides":[{"id":19264,"name":"Context","nameLocations":["1796:7:178"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1796:7:178"},{"id":19265,"name":"ForwarderRegistryContextBase","nameLocations":["1805:28:178"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1805:28:178"}],"src":"1787:47:178"},"parameters":{"id":19263,"nodeType":"ParameterList","parameters":[],"src":"1762:2:178"},"returnParameters":{"id":19269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19268,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19275,"src":"1844:14:178","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":19267,"name":"bytes","nodeType":"ElementaryTypeName","src":"1844:5:178","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1843:16:178"},"scope":19276,"src":"1745:178:178","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":19277,"src":"703:1222:178","usedErrors":[19178,19183,19192],"usedEvents":[19201]}],"src":"32:1894:178"},"id":178},"contracts/proxy/interfaces/IProxyAdmin.sol":{"ast":{"absolutePath":"contracts/proxy/interfaces/IProxyAdmin.sol","exportedSymbols":{"IProxyAdmin":[19292]},"id":19293,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19278,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:179"},{"abstract":false,"baseContracts":[],"canonicalName":"IProxyAdmin","contractDependencies":[],"contractKind":"interface","documentation":{"id":19279,"nodeType":"StructuredDocumentation","src":"58:129:179","text":"@title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\n @dev See https://eips.ethereum.org/EIPS/eip-1967"},"fullyImplemented":false,"id":19292,"linearizedBaseContracts":[19292],"name":"IProxyAdmin","nameLocation":"197:11:179","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":19280,"nodeType":"StructuredDocumentation","src":"215:260:179","text":"@notice Sets a new proxy admin.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n @param newAdmin The new proxy admin."},"functionSelector":"9f712f2f","id":19285,"implemented":false,"kind":"function","modifiers":[],"name":"changeProxyAdmin","nameLocation":"489:16:179","nodeType":"FunctionDefinition","parameters":{"id":19283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19282,"mutability":"mutable","name":"newAdmin","nameLocation":"514:8:179","nodeType":"VariableDeclaration","scope":19285,"src":"506:16:179","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19281,"name":"address","nodeType":"ElementaryTypeName","src":"506:7:179","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"505:18:179"},"returnParameters":{"id":19284,"nodeType":"ParameterList","parameters":[],"src":"532:0:179"},"scope":19292,"src":"480:53:179","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":19286,"nodeType":"StructuredDocumentation","src":"539:71:179","text":"@notice Gets the proxy admin.\n @return admin The proxy admin"},"functionSelector":"3e47158c","id":19291,"implemented":false,"kind":"function","modifiers":[],"name":"proxyAdmin","nameLocation":"624:10:179","nodeType":"FunctionDefinition","parameters":{"id":19287,"nodeType":"ParameterList","parameters":[],"src":"634:2:179"},"returnParameters":{"id":19290,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19289,"mutability":"mutable","name":"admin","nameLocation":"668:5:179","nodeType":"VariableDeclaration","scope":19291,"src":"660:13:179","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19288,"name":"address","nodeType":"ElementaryTypeName","src":"660:7:179","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"659:15:179"},"scope":19292,"src":"615:60:179","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":19293,"src":"187:490:179","usedErrors":[],"usedEvents":[]}],"src":"32:646:179"},"id":179},"contracts/proxy/libraries/ProxyAdminStorage.sol":{"ast":{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","exportedSymbols":{"AdminChanged":[19201],"NoInitialProxyAdmin":[19178],"NotProxyAdmin":[19183],"ProxyAdminStorage":[19477],"ProxyInitialization":[19524]},"id":19478,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19294,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:180"},{"absolutePath":"contracts/proxy/errors/ProxyAdminErrors.sol","file":"./../errors/ProxyAdminErrors.sol","id":19297,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19478,"sourceUnit":19184,"src":"58:84:180","symbolAliases":[{"foreign":{"id":19295,"name":"NoInitialProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19178,"src":"66:19:180","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":19296,"name":"NotProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19183,"src":"87:13:180","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/events/ProxyAdminEvents.sol","file":"./../events/ProxyAdminEvents.sol","id":19299,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19478,"sourceUnit":19202,"src":"143:62:180","symbolAliases":[{"foreign":{"id":19298,"name":"AdminChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19201,"src":"151:12:180","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./ProxyInitialization.sol","id":19301,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19478,"sourceUnit":19525,"src":"206:62:180","symbolAliases":[{"foreign":{"id":19300,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"214:19:180","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ProxyAdminStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":19477,"linearizedBaseContracts":[19477],"name":"ProxyAdminStorage","nameLocation":"278:17:180","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19305,"libraryName":{"id":19302,"name":"ProxyAdminStorage","nameLocations":["308:17:180"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"308:17:180"},"nodeType":"UsingForDirective","src":"302:53:180","typeName":{"id":19304,"nodeType":"UserDefinedTypeName","pathNode":{"id":19303,"name":"ProxyAdminStorage.Layout","nameLocations":["330:17:180","348:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"330:24:180"},"referencedDeclaration":19308,"src":"330:24:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"canonicalName":"ProxyAdminStorage.Layout","id":19308,"members":[{"constant":false,"id":19307,"mutability":"mutable","name":"admin","nameLocation":"393:5:180","nodeType":"VariableDeclaration","scope":19308,"src":"385:13:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19306,"name":"address","nodeType":"ElementaryTypeName","src":"385:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"name":"Layout","nameLocation":"368:6:180","nodeType":"StructDefinition","scope":19477,"src":"361:44:180","visibility":"public"},{"constant":true,"id":19321,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"562:19:180","nodeType":"VariableDeclaration","scope":19477,"src":"536:102:180","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19309,"name":"bytes32","nodeType":"ElementaryTypeName","src":"536:7:180","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"656970313936372e70726f78792e61646d696e","id":19315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"610:21:180","typeDescriptions":{"typeIdentifier":"t_stringliteral_b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104","typeString":"literal_string \"eip1967.proxy.admin\""},"value":"eip1967.proxy.admin"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104","typeString":"literal_string \"eip1967.proxy.admin\""}],"id":19314,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"600:9:180","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"600:32:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":19313,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"592:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":19312,"name":"uint256","nodeType":"ElementaryTypeName","src":"592:7:180","typeDescriptions":{}}},"id":19317,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"592:41:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":19318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"636:1:180","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"592:45:180","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19311,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"584:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19310,"name":"bytes32","nodeType":"ElementaryTypeName","src":"584:7:180","typeDescriptions":{}}},"id":19320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"584:54:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":19334,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"670:21:180","nodeType":"VariableDeclaration","scope":19477,"src":"644:110:180","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19322,"name":"bytes32","nodeType":"ElementaryTypeName","src":"644:7:180","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19332,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"656970313936372e70726f78792e61646d696e2e7068617365","id":19328,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"720:27:180","typeDescriptions":{"typeIdentifier":"t_stringliteral_c4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f7298","typeString":"literal_string \"eip1967.proxy.admin.phase\""},"value":"eip1967.proxy.admin.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f7298","typeString":"literal_string \"eip1967.proxy.admin.phase\""}],"id":19327,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"710:9:180","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19329,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"710:38:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":19326,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"702:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":19325,"name":"uint256","nodeType":"ElementaryTypeName","src":"702:7:180","typeDescriptions":{}}},"id":19330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"702:47:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":19331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"752:1:180","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"702:51:180","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19324,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"694:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19323,"name":"bytes32","nodeType":"ElementaryTypeName","src":"694:7:180","typeDescriptions":{}}},"id":19333,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"694:60:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":19367,"nodeType":"Block","src":"1213:162:180","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19348,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19343,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19340,"src":"1227:12:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":19346,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1251:1:180","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19345,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1243:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19344,"name":"address","nodeType":"ElementaryTypeName","src":"1243:7:180","typeDescriptions":{}}},"id":19347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1243:10:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1227:26:180","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19352,"nodeType":"IfStatement","src":"1223:60:180","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":19349,"name":"NoInitialProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19178,"src":"1262:19:180","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":19350,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1262:21:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19351,"nodeType":"RevertStatement","src":"1255:28:180"}},{"expression":{"id":19357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":19353,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19338,"src":"1293:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19355,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1295:5:180","memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":19307,"src":"1293:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19356,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19340,"src":"1303:12:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1293:22:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19358,"nodeType":"ExpressionStatement","src":"1293:22:180"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":19362,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1351:1:180","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":19361,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1343:7:180","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":19360,"name":"address","nodeType":"ElementaryTypeName","src":"1343:7:180","typeDescriptions":{}}},"id":19363,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1343:10:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":19364,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19340,"src":"1355:12:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":19359,"name":"AdminChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19201,"src":"1330:12:180","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":19365,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1330:38:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19366,"nodeType":"EmitStatement","src":"1325:43:180"}]},"documentation":{"id":19335,"nodeType":"StructuredDocumentation","src":"761:373:180","text":"@notice Initializes the storage with an initial admin (immutable version).\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\n @dev Emits an {AdminChanged} event.\n @param initialAdmin The initial payout wallet."},"id":19368,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1148:15:180","nodeType":"FunctionDefinition","parameters":{"id":19341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19338,"mutability":"mutable","name":"s","nameLocation":"1179:1:180","nodeType":"VariableDeclaration","scope":19368,"src":"1164:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19337,"nodeType":"UserDefinedTypeName","pathNode":{"id":19336,"name":"Layout","nameLocations":["1164:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1164:6:180"},"referencedDeclaration":19308,"src":"1164:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19340,"mutability":"mutable","name":"initialAdmin","nameLocation":"1190:12:180","nodeType":"VariableDeclaration","scope":19368,"src":"1182:20:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19339,"name":"address","nodeType":"ElementaryTypeName","src":"1182:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1163:40:180"},"returnParameters":{"id":19342,"nodeType":"ParameterList","parameters":[],"src":"1213:0:180"},"scope":19477,"src":"1139:236:180","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19390,"nodeType":"Block","src":"1990:112:180","statements":[{"expression":{"arguments":[{"id":19380,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19334,"src":"2029:21:180","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":19381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2052:1:180","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":19377,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2000:19:180","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":19379,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2020:8:180","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2000:28:180","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":19382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2000:54:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19383,"nodeType":"ExpressionStatement","src":"2000:54:180"},{"expression":{"arguments":[{"id":19387,"name":"initialAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19374,"src":"2082:12:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":19384,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19372,"src":"2064:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19386,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2066:15:180","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":19368,"src":"2064:17:180","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address)"}},"id":19388,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2064:31:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19389,"nodeType":"ExpressionStatement","src":"2064:31:180"}]},"documentation":{"id":19369,"nodeType":"StructuredDocumentation","src":"1381:536:180","text":"@notice Initializes the storage with an initial admin (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\n @dev Emits an {AdminChanged} event.\n @param initialAdmin The initial payout wallet."},"id":19391,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"1931:9:180","nodeType":"FunctionDefinition","parameters":{"id":19375,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19372,"mutability":"mutable","name":"s","nameLocation":"1956:1:180","nodeType":"VariableDeclaration","scope":19391,"src":"1941:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19371,"nodeType":"UserDefinedTypeName","pathNode":{"id":19370,"name":"Layout","nameLocations":["1941:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1941:6:180"},"referencedDeclaration":19308,"src":"1941:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19374,"mutability":"mutable","name":"initialAdmin","nameLocation":"1967:12:180","nodeType":"VariableDeclaration","scope":19391,"src":"1959:20:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19373,"name":"address","nodeType":"ElementaryTypeName","src":"1959:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1940:40:180"},"returnParameters":{"id":19376,"nodeType":"ParameterList","parameters":[],"src":"1990:0:180"},"scope":19477,"src":"1922:180:180","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19431,"nodeType":"Block","src":"2458:254:180","statements":[{"assignments":[19403],"declarations":[{"constant":false,"id":19403,"mutability":"mutable","name":"previousAdmin","nameLocation":"2476:13:180","nodeType":"VariableDeclaration","scope":19431,"src":"2468:21:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19402,"name":"address","nodeType":"ElementaryTypeName","src":"2468:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19406,"initialValue":{"expression":{"id":19404,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19395,"src":"2492:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19405,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2494:5:180","memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":19307,"src":"2492:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2468:31:180"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19407,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"2513:6:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":19408,"name":"previousAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19403,"src":"2523:13:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2513:23:180","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19414,"nodeType":"IfStatement","src":"2509:57:180","trueBody":{"errorCall":{"arguments":[{"id":19411,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19397,"src":"2559:6:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19410,"name":"NotProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19183,"src":"2545:13:180","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":19412,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2545:21:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19413,"nodeType":"RevertStatement","src":"2538:28:180"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19415,"name":"previousAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19403,"src":"2580:13:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":19416,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19399,"src":"2597:8:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2580:25:180","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19430,"nodeType":"IfStatement","src":"2576:130:180","trueBody":{"id":19429,"nodeType":"Block","src":"2607:99:180","statements":[{"expression":{"id":19422,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":19418,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19395,"src":"2621:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19420,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2623:5:180","memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":19307,"src":"2621:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19421,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19399,"src":"2631:8:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2621:18:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19423,"nodeType":"ExpressionStatement","src":"2621:18:180"},{"eventCall":{"arguments":[{"id":19425,"name":"previousAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19403,"src":"2671:13:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":19426,"name":"newAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19399,"src":"2686:8:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":19424,"name":"AdminChanged","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19201,"src":"2658:12:180","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":19427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2658:37:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19428,"nodeType":"EmitStatement","src":"2653:42:180"}]}}]},"documentation":{"id":19392,"nodeType":"StructuredDocumentation","src":"2108:258:180","text":"@notice Sets a new proxy admin.\n @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\n @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\n @param newAdmin The new proxy admin."},"id":19432,"implemented":true,"kind":"function","modifiers":[],"name":"changeProxyAdmin","nameLocation":"2380:16:180","nodeType":"FunctionDefinition","parameters":{"id":19400,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19395,"mutability":"mutable","name":"s","nameLocation":"2412:1:180","nodeType":"VariableDeclaration","scope":19432,"src":"2397:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19394,"nodeType":"UserDefinedTypeName","pathNode":{"id":19393,"name":"Layout","nameLocations":["2397:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"2397:6:180"},"referencedDeclaration":19308,"src":"2397:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19397,"mutability":"mutable","name":"sender","nameLocation":"2423:6:180","nodeType":"VariableDeclaration","scope":19432,"src":"2415:14:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19396,"name":"address","nodeType":"ElementaryTypeName","src":"2415:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19399,"mutability":"mutable","name":"newAdmin","nameLocation":"2439:8:180","nodeType":"VariableDeclaration","scope":19432,"src":"2431:16:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19398,"name":"address","nodeType":"ElementaryTypeName","src":"2431:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2396:52:180"},"returnParameters":{"id":19401,"nodeType":"ParameterList","parameters":[],"src":"2458:0:180"},"scope":19477,"src":"2371:341:180","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":19444,"nodeType":"Block","src":"2870:31:180","statements":[{"expression":{"expression":{"id":19441,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19436,"src":"2887:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19442,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2889:5:180","memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":19307,"src":"2887:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19440,"id":19443,"nodeType":"Return","src":"2880:14:180"}]},"documentation":{"id":19433,"nodeType":"StructuredDocumentation","src":"2718:71:180","text":"@notice Gets the proxy admin.\n @return admin The proxy admin"},"id":19445,"implemented":true,"kind":"function","modifiers":[],"name":"proxyAdmin","nameLocation":"2803:10:180","nodeType":"FunctionDefinition","parameters":{"id":19437,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19436,"mutability":"mutable","name":"s","nameLocation":"2829:1:180","nodeType":"VariableDeclaration","scope":19445,"src":"2814:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19435,"nodeType":"UserDefinedTypeName","pathNode":{"id":19434,"name":"Layout","nameLocations":["2814:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"2814:6:180"},"referencedDeclaration":19308,"src":"2814:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"}],"src":"2813:18:180"},"returnParameters":{"id":19440,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19439,"mutability":"mutable","name":"admin","nameLocation":"2863:5:180","nodeType":"VariableDeclaration","scope":19445,"src":"2855:13:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19438,"name":"address","nodeType":"ElementaryTypeName","src":"2855:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2854:15:180"},"scope":19477,"src":"2794:107:180","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":19463,"nodeType":"Block","src":"3160:70:180","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":19457,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19454,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19451,"src":"3174:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":19455,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19449,"src":"3185:1:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":19456,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3187:5:180","memberName":"admin","nodeType":"MemberAccess","referencedDeclaration":19307,"src":"3185:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3174:18:180","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19462,"nodeType":"IfStatement","src":"3170:53:180","trueBody":{"errorCall":{"arguments":[{"id":19459,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19451,"src":"3215:7:180","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":19458,"name":"NotProxyAdmin","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19183,"src":"3201:13:180","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":19460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3201:22:180","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19461,"nodeType":"RevertStatement","src":"3194:29:180"}}]},"documentation":{"id":19446,"nodeType":"StructuredDocumentation","src":"2907:170:180","text":"@notice Ensures that an account is the proxy admin.\n @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\n @param account The account."},"id":19464,"implemented":true,"kind":"function","modifiers":[],"name":"enforceIsProxyAdmin","nameLocation":"3091:19:180","nodeType":"FunctionDefinition","parameters":{"id":19452,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19449,"mutability":"mutable","name":"s","nameLocation":"3126:1:180","nodeType":"VariableDeclaration","scope":19464,"src":"3111:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19448,"nodeType":"UserDefinedTypeName","pathNode":{"id":19447,"name":"Layout","nameLocations":["3111:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"3111:6:180"},"referencedDeclaration":19308,"src":"3111:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19451,"mutability":"mutable","name":"account","nameLocation":"3137:7:180","nodeType":"VariableDeclaration","scope":19464,"src":"3129:15:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19450,"name":"address","nodeType":"ElementaryTypeName","src":"3129:7:180","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3110:35:180"},"returnParameters":{"id":19453,"nodeType":"ParameterList","parameters":[],"src":"3160:0:180"},"scope":19477,"src":"3082:148:180","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":19475,"nodeType":"Block","src":"3295:115:180","statements":[{"assignments":[19471],"declarations":[{"constant":false,"id":19471,"mutability":"mutable","name":"position","nameLocation":"3313:8:180","nodeType":"VariableDeclaration","scope":19475,"src":"3305:16:180","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19470,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3305:7:180","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":19473,"initialValue":{"id":19472,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19321,"src":"3324:19:180","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3305:38:180"},{"AST":{"nativeSrc":"3362:42:180","nodeType":"YulBlock","src":"3362:42:180","statements":[{"nativeSrc":"3376:18:180","nodeType":"YulAssignment","src":"3376:18:180","value":{"name":"position","nativeSrc":"3386:8:180","nodeType":"YulIdentifier","src":"3386:8:180"},"variableNames":[{"name":"s.slot","nativeSrc":"3376:6:180","nodeType":"YulIdentifier","src":"3376:6:180"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":19471,"isOffset":false,"isSlot":false,"src":"3386:8:180","valueSize":1},{"declaration":19468,"isOffset":false,"isSlot":true,"src":"3376:6:180","suffix":"slot","valueSize":1}],"id":19474,"nodeType":"InlineAssembly","src":"3353:51:180"}]},"id":19476,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"3245:6:180","nodeType":"FunctionDefinition","parameters":{"id":19465,"nodeType":"ParameterList","parameters":[],"src":"3251:2:180"},"returnParameters":{"id":19469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19468,"mutability":"mutable","name":"s","nameLocation":"3292:1:180","nodeType":"VariableDeclaration","scope":19476,"src":"3277:16:180","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"},"typeName":{"id":19467,"nodeType":"UserDefinedTypeName","pathNode":{"id":19466,"name":"Layout","nameLocations":["3277:6:180"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"3277:6:180"},"referencedDeclaration":19308,"src":"3277:6:180","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}},"visibility":"internal"}],"src":"3276:18:180"},"scope":19477,"src":"3236:174:180","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":19478,"src":"270:3142:180","usedErrors":[],"usedEvents":[]}],"src":"32:3381:180"},"id":180},"contracts/proxy/libraries/ProxyInitialization.sol":{"ast":{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","exportedSymbols":{"InitializationPhaseAlreadyReached":[19192],"ProxyInitialization":[19524],"StorageSlot":[1473]},"id":19525,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19479,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:181"},{"absolutePath":"contracts/proxy/errors/ProxyInitializationErrors.sol","file":"./../errors/ProxyInitializationErrors.sol","id":19481,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19525,"sourceUnit":19193,"src":"58:92:181","symbolAliases":[{"foreign":{"id":19480,"name":"InitializationPhaseAlreadyReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19192,"src":"66:33:181","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/StorageSlot.sol","file":"@openzeppelin/contracts/utils/StorageSlot.sol","id":19483,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19525,"sourceUnit":1474,"src":"151:74:181","symbolAliases":[{"foreign":{"id":19482,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1473,"src":"159:11:181","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ProxyInitialization","contractDependencies":[],"contractKind":"library","documentation":{"id":19484,"nodeType":"StructuredDocumentation","src":"227:92:181","text":"@notice Multiple calls protection for storage-modifying proxy initialization functions."},"fullyImplemented":true,"id":19524,"linearizedBaseContracts":[19524],"name":"ProxyInitialization","nameLocation":"327:19:181","nodeType":"ContractDefinition","nodes":[{"body":{"id":19522,"nodeType":"Block","src":"735:294:181","statements":[{"assignments":[19496],"declarations":[{"constant":false,"id":19496,"mutability":"mutable","name":"currentVersion","nameLocation":"777:14:181","nodeType":"VariableDeclaration","scope":19522,"src":"745:46:181","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"},"typeName":{"id":19495,"nodeType":"UserDefinedTypeName","pathNode":{"id":19494,"name":"StorageSlot.Uint256Slot","nameLocations":["745:11:181","757:11:181"],"nodeType":"IdentifierPath","referencedDeclaration":1364,"src":"745:23:181"},"referencedDeclaration":1364,"src":"745:23:181","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot"}},"visibility":"internal"}],"id":19501,"initialValue":{"arguments":[{"id":19499,"name":"storageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19487,"src":"821:11:181","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":19497,"name":"StorageSlot","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1473,"src":"794:11:181","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageSlot_$1473_$","typeString":"type(library StorageSlot)"}},"id":19498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"806:14:181","memberName":"getUint256Slot","nodeType":"MemberAccess","referencedDeclaration":1417,"src":"794:26:181","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes32_$returns$_t_struct$_Uint256Slot_$1364_storage_ptr_$","typeString":"function (bytes32) pure returns (struct StorageSlot.Uint256Slot storage pointer)"}},"id":19500,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"794:39:181","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"745:88:181"},{"assignments":[19503],"declarations":[{"constant":false,"id":19503,"mutability":"mutable","name":"currentPhase","nameLocation":"851:12:181","nodeType":"VariableDeclaration","scope":19522,"src":"843:20:181","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19502,"name":"uint256","nodeType":"ElementaryTypeName","src":"843:7:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":19506,"initialValue":{"expression":{"id":19504,"name":"currentVersion","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19496,"src":"866:14:181","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot storage pointer"}},"id":19505,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"881:5:181","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1363,"src":"866:20:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"843:43:181"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":19507,"name":"currentPhase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19503,"src":"900:12:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":19508,"name":"phase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19489,"src":"916:5:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"900:21:181","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19515,"nodeType":"IfStatement","src":"896:88:181","trueBody":{"errorCall":{"arguments":[{"id":19511,"name":"currentPhase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19503,"src":"964:12:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":19512,"name":"phase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19489,"src":"978:5:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19510,"name":"InitializationPhaseAlreadyReached","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19192,"src":"930:33:181","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":19513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"930:54:181","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19514,"nodeType":"RevertStatement","src":"923:61:181"}},{"expression":{"id":19520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":19516,"name":"currentVersion","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19496,"src":"994:14:181","typeDescriptions":{"typeIdentifier":"t_struct$_Uint256Slot_$1364_storage_ptr","typeString":"struct StorageSlot.Uint256Slot storage pointer"}},"id":19518,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1009:5:181","memberName":"value","nodeType":"MemberAccess","referencedDeclaration":1363,"src":"994:20:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":19519,"name":"phase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19489,"src":"1017:5:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"994:28:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19521,"nodeType":"ExpressionStatement","src":"994:28:181"}]},"documentation":{"id":19485,"nodeType":"StructuredDocumentation","src":"353:314:181","text":"@notice Sets the initialization phase during a storage-modifying proxy initialization function.\n @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\n @param storageSlot the storage slot where `phase` is stored.\n @param phase the initialization phase."},"id":19523,"implemented":true,"kind":"function","modifiers":[],"name":"setPhase","nameLocation":"681:8:181","nodeType":"FunctionDefinition","parameters":{"id":19490,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19487,"mutability":"mutable","name":"storageSlot","nameLocation":"698:11:181","nodeType":"VariableDeclaration","scope":19523,"src":"690:19:181","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19486,"name":"bytes32","nodeType":"ElementaryTypeName","src":"690:7:181","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":19489,"mutability":"mutable","name":"phase","nameLocation":"719:5:181","nodeType":"VariableDeclaration","scope":19523,"src":"711:13:181","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19488,"name":"uint256","nodeType":"ElementaryTypeName","src":"711:7:181","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"689:36:181"},"returnParameters":{"id":19491,"nodeType":"ParameterList","parameters":[],"src":"735:0:181"},"scope":19524,"src":"672:357:181","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":19525,"src":"319:712:181","usedErrors":[],"usedEvents":[]}],"src":"32:1000:181"},"id":181},"contracts/security/SealedExecutor.sol":{"ast":{"absolutePath":"contracts/security/SealedExecutor.sol","exportedSymbols":{"AccessControl":[7901],"AccessControlStorage":[8851],"Address":[1176],"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"SealedExecutor":[19649],"SealsBase":[19695],"SealsStorage":[20030]},"id":19650,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19526,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:182"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../metatx/interfaces/IForwarderRegistry.sol","id":19528,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":13387,"src":"57:81:182","symbolAliases":[{"foreign":{"id":19527,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../access/libraries/AccessControlStorage.sol","id":19530,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":8852,"src":"139:84:182","symbolAliases":[{"foreign":{"id":19529,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"147:20:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/libraries/SealsStorage.sol","file":"./libraries/SealsStorage.sol","id":19532,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":20031,"src":"224:58:182","symbolAliases":[{"foreign":{"id":19531,"name":"SealsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20030,"src":"232:12:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"@openzeppelin/contracts/utils/Address.sol","id":19534,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":1177,"src":"283:66:182","symbolAliases":[{"foreign":{"id":19533,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1176,"src":"291:7:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19536,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":1207,"src":"350:66:182","symbolAliases":[{"foreign":{"id":19535,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"358:7:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/SealsBase.sol","file":"./base/SealsBase.sol","id":19538,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":19696,"src":"417:47:182","symbolAliases":[{"foreign":{"id":19537,"name":"SealsBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19695,"src":"425:9:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../access/ContractOwnership.sol","id":19540,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":7935,"src":"465:68:182","symbolAliases":[{"foreign":{"id":19539,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"473:17:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../access/AccessControl.sol","id":19542,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":7902,"src":"534:60:182","symbolAliases":[{"foreign":{"id":19541,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"542:13:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../metatx/base/ForwarderRegistryContextBase.sol","id":19544,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19650,"sourceUnit":13298,"src":"595:95:182","symbolAliases":[{"foreign":{"id":19543,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"603:28:182","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19546,"name":"SealsBase","nameLocations":["1184:9:182"],"nodeType":"IdentifierPath","referencedDeclaration":19695,"src":"1184:9:182"},"id":19547,"nodeType":"InheritanceSpecifier","src":"1184:9:182"},{"baseName":{"id":19548,"name":"AccessControl","nameLocations":["1195:13:182"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"1195:13:182"},"id":19549,"nodeType":"InheritanceSpecifier","src":"1195:13:182"},{"baseName":{"id":19550,"name":"ForwarderRegistryContextBase","nameLocations":["1210:28:182"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1210:28:182"},"id":19551,"nodeType":"InheritanceSpecifier","src":"1210:28:182"}],"canonicalName":"SealedExecutor","contractDependencies":[],"contractKind":"contract","documentation":{"id":19545,"nodeType":"StructuredDocumentation","src":"692:465:182","text":"@title Sealead executions via calls on target contracts.\n @notice Enables contract calls to be performed uniquely thanks to a seal identifier.\n @notice Multiple executions can happen for example due to automation bugs in a backend or in a script.\n @notice Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,\n @notice such as a constant defined in a script or in a unique database field."},"fullyImplemented":true,"id":19649,"linearizedBaseContracts":[19649,13297,7901,7934,11554,11579,8139,8091,19695,1206,8562,8546,19892],"name":"SealedExecutor","nameLocation":"1166:14:182","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19555,"libraryName":{"id":19552,"name":"SealsStorage","nameLocations":["1251:12:182"],"nodeType":"IdentifierPath","referencedDeclaration":20030,"src":"1251:12:182"},"nodeType":"UsingForDirective","src":"1245:43:182","typeName":{"id":19554,"nodeType":"UserDefinedTypeName","pathNode":{"id":19553,"name":"SealsStorage.Layout","nameLocations":["1268:12:182","1281:6:182"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"1268:19:182"},"referencedDeclaration":19953,"src":"1268:19:182","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}}},{"global":false,"id":19559,"libraryName":{"id":19556,"name":"AccessControlStorage","nameLocations":["1299:20:182"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"1299:20:182"},"nodeType":"UsingForDirective","src":"1293:59:182","typeName":{"id":19558,"nodeType":"UserDefinedTypeName","pathNode":{"id":19557,"name":"AccessControlStorage.Layout","nameLocations":["1324:20:182","1345:6:182"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"1324:27:182"},"referencedDeclaration":8616,"src":"1324:27:182","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"global":false,"id":19562,"libraryName":{"id":19560,"name":"Address","nameLocations":["1363:7:182"],"nodeType":"IdentifierPath","referencedDeclaration":1176,"src":"1363:7:182"},"nodeType":"UsingForDirective","src":"1357:26:182","typeName":{"id":19561,"name":"address","nodeType":"ElementaryTypeName","src":"1375:7:182","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"constant":true,"functionSelector":"526c9811","id":19565,"mutability":"constant","name":"SEALER_ROLE","nameLocation":"1413:11:182","nodeType":"VariableDeclaration","scope":19649,"src":"1389:46:182","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19563,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1389:7:182","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"7365616c6572","id":19564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1427:8:182","typeDescriptions":{"typeIdentifier":"t_stringliteral_681d530bdcdfe03ec16b15b3cdfe76fdb5fc168edb26ac9b20102e5d150abee2","typeString":"literal_string \"sealer\""},"value":"sealer"},"visibility":"public"},{"body":{"id":19578,"nodeType":"Block","src":"1570:2:182","statements":[]},"id":19579,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19571,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19568,"src":"1521:17:182","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":19572,"kind":"baseConstructorSpecifier","modifierName":{"id":19570,"name":"ForwarderRegistryContextBase","nameLocations":["1492:28:182"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1492:28:182"},"nodeType":"ModifierInvocation","src":"1492:47:182"},{"arguments":[{"expression":{"id":19574,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1558:3:182","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":19575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1562:6:182","memberName":"sender","nodeType":"MemberAccess","src":"1558:10:182","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":19576,"kind":"baseConstructorSpecifier","modifierName":{"id":19573,"name":"ContractOwnership","nameLocations":["1540:17:182"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1540:17:182"},"nodeType":"ModifierInvocation","src":"1540:29:182"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19569,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19568,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1473:17:182","nodeType":"VariableDeclaration","scope":19579,"src":"1454:36:182","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":19567,"nodeType":"UserDefinedTypeName","pathNode":{"id":19566,"name":"IForwarderRegistry","nameLocations":["1454:18:182"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1454:18:182"},"referencedDeclaration":13386,"src":"1454:18:182","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1453:38:182"},"returnParameters":{"id":19577,"nodeType":"ParameterList","parameters":[],"src":"1570:0:182"},"scope":19649,"src":"1442:130:182","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":19619,"nodeType":"Block","src":"2175:219:182","statements":[{"assignments":[19592],"declarations":[{"constant":false,"id":19592,"mutability":"mutable","name":"sealer","nameLocation":"2193:6:182","nodeType":"VariableDeclaration","scope":19619,"src":"2185:14:182","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19591,"name":"address","nodeType":"ElementaryTypeName","src":"2185:7:182","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":19595,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":19593,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[19634],"referencedDeclaration":19634,"src":"2202:10:182","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19594,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2202:12:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2185:29:182"},{"expression":{"arguments":[{"id":19601,"name":"SEALER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19565,"src":"2269:11:182","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":19602,"name":"sealer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19592,"src":"2282:6:182","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19596,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"2224:20:182","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":19598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2245:6:182","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"2224:27:182","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":19599,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2224:29:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":19600,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2254:14:182","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"2224:44:182","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":19603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2224:65:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19604,"nodeType":"ExpressionStatement","src":"2224:65:182"},{"expression":{"arguments":[{"id":19610,"name":"sealer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19592,"src":"2326:6:182","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":19611,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19586,"src":"2334:6:182","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19605,"name":"SealsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20030,"src":"2299:12:182","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SealsStorage_$20030_$","typeString":"type(library SealsStorage)"}},"id":19607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2312:6:182","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":20029,"src":"2299:19:182","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19953_storage_ptr_$","typeString":"function () pure returns (struct SealsStorage.Layout storage pointer)"}},"id":19608,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2299:21:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout storage pointer"}},"id":19609,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2321:4:182","memberName":"seal","nodeType":"MemberAccess","referencedDeclaration":20000,"src":"2299:26:182","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$19953_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$19953_storage_ptr_$","typeString":"function (struct SealsStorage.Layout storage pointer,address,uint256)"}},"id":19612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2299:42:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19613,"nodeType":"ExpressionStatement","src":"2299:42:182"},{"expression":{"arguments":[{"id":19616,"name":"callData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19584,"src":"2378:8:182","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":19614,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19582,"src":"2358:6:182","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2365:12:182","memberName":"functionCall","nodeType":"MemberAccess","referencedDeclaration":991,"src":"2358:19:182","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$attached_to$_t_address_$","typeString":"function (address,bytes memory) returns (bytes memory)"}},"id":19617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2358:29:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"functionReturnParameters":19590,"id":19618,"nodeType":"Return","src":"2351:36:182"}]},"documentation":{"id":19580,"nodeType":"StructuredDocumentation","src":"1578:472:182","text":"@notice Calls a contract function uniquely for a given seal identifier.\n @dev Reverts with {NotRoleHolder} if the sender does not have the sealer role.\n @dev Reverts with {AlreadySealed} if the sealId has already been used.\n @dev Emits a {Sealed} event.\n @param target The target contract.\n @param callData The encoded function call.\n @param sealId The seal identifier.\n @param returnData The data returned by the call."},"functionSelector":"0b476f99","id":19620,"implemented":true,"kind":"function","modifiers":[],"name":"sealedCall","nameLocation":"2064:10:182","nodeType":"FunctionDefinition","parameters":{"id":19587,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19582,"mutability":"mutable","name":"target","nameLocation":"2083:6:182","nodeType":"VariableDeclaration","scope":19620,"src":"2075:14:182","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19581,"name":"address","nodeType":"ElementaryTypeName","src":"2075:7:182","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19584,"mutability":"mutable","name":"callData","nameLocation":"2106:8:182","nodeType":"VariableDeclaration","scope":19620,"src":"2091:23:182","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":19583,"name":"bytes","nodeType":"ElementaryTypeName","src":"2091:5:182","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":19586,"mutability":"mutable","name":"sealId","nameLocation":"2124:6:182","nodeType":"VariableDeclaration","scope":19620,"src":"2116:14:182","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19585,"name":"uint256","nodeType":"ElementaryTypeName","src":"2116:7:182","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2074:57:182"},"returnParameters":{"id":19590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19589,"mutability":"mutable","name":"returnData","nameLocation":"2163:10:182","nodeType":"VariableDeclaration","scope":19620,"src":"2150:23:182","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":19588,"name":"bytes","nodeType":"ElementaryTypeName","src":"2150:5:182","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2149:25:182"},"scope":19649,"src":"2055:339:182","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":19633,"nodeType":"Block","src":"2559:65:182","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19629,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2576:28:182","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2605:10:182","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2576:39:182","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2576:41:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19628,"id":19632,"nodeType":"Return","src":"2569:48:182"}]},"documentation":{"id":19621,"nodeType":"StructuredDocumentation","src":"2400:44:182","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19634,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"2458:10:182","nodeType":"FunctionDefinition","overrides":{"id":19625,"nodeType":"OverrideSpecifier","overrides":[{"id":19623,"name":"Context","nameLocations":["2502:7:182"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2502:7:182"},{"id":19624,"name":"ForwarderRegistryContextBase","nameLocations":["2511:28:182"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2511:28:182"}],"src":"2493:47:182"},"parameters":{"id":19622,"nodeType":"ParameterList","parameters":[],"src":"2468:2:182"},"returnParameters":{"id":19628,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19627,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19634,"src":"2550:7:182","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19626,"name":"address","nodeType":"ElementaryTypeName","src":"2550:7:182","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2549:9:182"},"scope":19649,"src":"2449:175:182","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":19647,"nodeType":"Block","src":"2794:63:182","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19643,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2811:28:182","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19644,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2840:8:182","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2811:37:182","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":19645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2811:39:182","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":19642,"id":19646,"nodeType":"Return","src":"2804:46:182"}]},"documentation":{"id":19635,"nodeType":"StructuredDocumentation","src":"2630:44:182","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19648,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2688:8:182","nodeType":"FunctionDefinition","overrides":{"id":19639,"nodeType":"OverrideSpecifier","overrides":[{"id":19637,"name":"Context","nameLocations":["2730:7:182"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2730:7:182"},{"id":19638,"name":"ForwarderRegistryContextBase","nameLocations":["2739:28:182"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2739:28:182"}],"src":"2721:47:182"},"parameters":{"id":19636,"nodeType":"ParameterList","parameters":[],"src":"2696:2:182"},"returnParameters":{"id":19642,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19641,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19648,"src":"2778:14:182","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":19640,"name":"bytes","nodeType":"ElementaryTypeName","src":"2778:5:182","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2777:16:182"},"scope":19649,"src":"2679:178:182","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":19650,"src":"1157:1702:182","usedErrors":[926,1216,1219,8223,8246,11559,19817],"usedEvents":[8269,8278,8287,19826]}],"src":"32:2828:182"},"id":182},"contracts/security/TokenRecovery.sol":{"ast":{"absolutePath":"contracts/security/TokenRecovery.sol","exportedSymbols":{"ContractOwnership":[7934],"TokenRecovery":[19661],"TokenRecoveryBase":[19810]},"id":19662,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19651,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:183"},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./base/TokenRecoveryBase.sol","id":19653,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19662,"sourceUnit":19811,"src":"58:63:183","symbolAliases":[{"foreign":{"id":19652,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"66:17:183","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../access/ContractOwnership.sol","id":19655,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19662,"sourceUnit":7935,"src":"122:68:183","symbolAliases":[{"foreign":{"id":19654,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"130:17:183","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":19657,"name":"TokenRecoveryBase","nameLocations":["440:17:183"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"440:17:183"},"id":19658,"nodeType":"InheritanceSpecifier","src":"440:17:183"},{"baseName":{"id":19659,"name":"ContractOwnership","nameLocations":["459:17:183"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"459:17:183"},"id":19660,"nodeType":"InheritanceSpecifier","src":"459:17:183"}],"canonicalName":"TokenRecovery","contractDependencies":[],"contractKind":"contract","documentation":{"id":19656,"nodeType":"StructuredDocumentation","src":"192:213:183","text":"@title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":19661,"linearizedBaseContracts":[19661,7934,11554,11579,8139,19810,1206,8562,19938],"name":"TokenRecovery","nameLocation":"423:13:183","nodeType":"ContractDefinition","nodes":[],"scope":19662,"src":"405:74:183","usedErrors":[464,1216,1219,7886,8246,11559,20056],"usedEvents":[8287]}],"src":"32:448:183"},"id":183},"contracts/security/base/SealsBase.sol":{"ast":{"absolutePath":"contracts/security/base/SealsBase.sol","exportedSymbols":{"Context":[1206],"ISeals":[19892],"SealsBase":[19695],"SealsStorage":[20030]},"id":19696,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19663,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:184"},{"absolutePath":"contracts/security/interfaces/ISeals.sol","file":"./../interfaces/ISeals.sol","id":19665,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19696,"sourceUnit":19893,"src":"58:50:184","symbolAliases":[{"foreign":{"id":19664,"name":"ISeals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19892,"src":"66:6:184","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/libraries/SealsStorage.sol","file":"./../libraries/SealsStorage.sol","id":19667,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19696,"sourceUnit":20031,"src":"109:61:184","symbolAliases":[{"foreign":{"id":19666,"name":"SealsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20030,"src":"117:12:184","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19669,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19696,"sourceUnit":1207,"src":"171:66:184","symbolAliases":[{"foreign":{"id":19668,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"179:7:184","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":19671,"name":"ISeals","nameLocations":["339:6:184"],"nodeType":"IdentifierPath","referencedDeclaration":19892,"src":"339:6:184"},"id":19672,"nodeType":"InheritanceSpecifier","src":"339:6:184"},{"baseName":{"id":19673,"name":"Context","nameLocations":["347:7:184"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"347:7:184"},"id":19674,"nodeType":"InheritanceSpecifier","src":"347:7:184"}],"canonicalName":"SealsBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":19670,"nodeType":"StructuredDocumentation","src":"239:69:184","text":"@title Uniquely identified seals management (proxiable version)."},"fullyImplemented":true,"id":19695,"linearizedBaseContracts":[19695,1206,19892],"name":"SealsBase","nameLocation":"326:9:184","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19678,"libraryName":{"id":19675,"name":"SealsStorage","nameLocations":["367:12:184"],"nodeType":"IdentifierPath","referencedDeclaration":20030,"src":"367:12:184"},"nodeType":"UsingForDirective","src":"361:43:184","typeName":{"id":19677,"nodeType":"UserDefinedTypeName","pathNode":{"id":19676,"name":"SealsStorage.Layout","nameLocations":["384:12:184","397:6:184"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"384:19:184"},"referencedDeclaration":19953,"src":"384:19:184","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}}},{"baseFunctions":[19891],"body":{"id":19693,"nodeType":"Block","src":"662:62:184","statements":[{"expression":{"arguments":[{"id":19690,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19681,"src":"710:6:184","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19686,"name":"SealsStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20030,"src":"679:12:184","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_SealsStorage_$20030_$","typeString":"type(library SealsStorage)"}},"id":19687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"692:6:184","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":20029,"src":"679:19:184","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19953_storage_ptr_$","typeString":"function () pure returns (struct SealsStorage.Layout storage pointer)"}},"id":19688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"679:21:184","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout storage pointer"}},"id":19689,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"701:8:184","memberName":"isSealed","nodeType":"MemberAccess","referencedDeclaration":20017,"src":"679:30:184","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19953_storage_ptr_$_t_uint256_$returns$_t_bool_$attached_to$_t_struct$_Layout_$19953_storage_ptr_$","typeString":"function (struct SealsStorage.Layout storage pointer,uint256) view returns (bool)"}},"id":19691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"679:38:184","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":19685,"id":19692,"nodeType":"Return","src":"672:45:184"}]},"documentation":{"id":19679,"nodeType":"StructuredDocumentation","src":"410:166:184","text":"@notice Retrieves whether a seal has been used already.\n @param sealId the seal identifier.\n @return wasSealed Whether a seal has been used already."},"functionSelector":"2c1758c1","id":19694,"implemented":true,"kind":"function","modifiers":[],"name":"isSealed","nameLocation":"590:8:184","nodeType":"FunctionDefinition","parameters":{"id":19682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19681,"mutability":"mutable","name":"sealId","nameLocation":"607:6:184","nodeType":"VariableDeclaration","scope":19694,"src":"599:14:184","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19680,"name":"uint256","nodeType":"ElementaryTypeName","src":"599:7:184","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"598:16:184"},"returnParameters":{"id":19685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19684,"mutability":"mutable","name":"wasSealed","nameLocation":"651:9:184","nodeType":"VariableDeclaration","scope":19694,"src":"646:14:184","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":19683,"name":"bool","nodeType":"ElementaryTypeName","src":"646:4:184","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"645:16:184"},"scope":19695,"src":"581:143:184","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":19696,"src":"308:418:184","usedErrors":[],"usedEvents":[]}],"src":"32:695:184"},"id":184},"contracts/security/base/TokenRecoveryBase.sol":{"ast":{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"IERC20":[452],"IERC721":[33094],"ITokenRecovery":[19938],"TokenRecoveryBase":[19810],"TokenRecoveryLibrary":[20246]},"id":19811,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19697,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:185"},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":19699,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":375,"src":"58:69:185","symbolAliases":[{"foreign":{"id":19698,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"66:6:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../../token/ERC721/interfaces/IERC721.sol","id":19701,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":33095,"src":"128:68:185","symbolAliases":[{"foreign":{"id":19700,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"136:7:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/interfaces/ITokenRecovery.sol","file":"./../interfaces/ITokenRecovery.sol","id":19703,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":19939,"src":"197:66:185","symbolAliases":[{"foreign":{"id":19702,"name":"ITokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19938,"src":"205:14:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":19705,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":9110,"src":"264:95:185","symbolAliases":[{"foreign":{"id":19704,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"272:24:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/libraries/TokenRecoveryLibrary.sol","file":"./../libraries/TokenRecoveryLibrary.sol","id":19707,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":20247,"src":"360:77:185","symbolAliases":[{"foreign":{"id":19706,"name":"TokenRecoveryLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20246,"src":"368:20:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19709,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19811,"sourceUnit":1207,"src":"438:66:185","symbolAliases":[{"foreign":{"id":19708,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"446:7:185","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":19711,"name":"ITokenRecovery","nameLocations":["817:14:185"],"nodeType":"IdentifierPath","referencedDeclaration":19938,"src":"817:14:185"},"id":19712,"nodeType":"InheritanceSpecifier","src":"817:14:185"},{"baseName":{"id":19713,"name":"Context","nameLocations":["833:7:185"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"833:7:185"},"id":19714,"nodeType":"InheritanceSpecifier","src":"833:7:185"}],"canonicalName":"TokenRecoveryBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":19710,"nodeType":"StructuredDocumentation","src":"506:272:185","text":"@title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":19810,"linearizedBaseContracts":[19810,1206,19938],"name":"TokenRecoveryBase","nameLocation":"796:17:185","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19718,"libraryName":{"id":19715,"name":"ContractOwnershipStorage","nameLocations":["853:24:185"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"853:24:185"},"nodeType":"UsingForDirective","src":"847:67:185","typeName":{"id":19717,"nodeType":"UserDefinedTypeName","pathNode":{"id":19716,"name":"ContractOwnershipStorage.Layout","nameLocations":["882:24:185","907:6:185"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"882:31:185"},"referencedDeclaration":8882,"src":"882:31:185","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"baseFunctions":[19909],"body":{"id":19744,"nodeType":"Block","src":"1319:147:185","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":19733,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1386:10:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19734,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1386:12:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19728,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1329:24:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":19730,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1354:6:185","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1329:31:185","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":19731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1329:33:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":19732,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1363:22:185","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1329:56:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":19735,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1329:70:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19736,"nodeType":"ExpressionStatement","src":"1329:70:185"},{"expression":{"arguments":[{"id":19740,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19722,"src":"1441:8:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[] calldata"}},{"id":19741,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19725,"src":"1451:7:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":19737,"name":"TokenRecoveryLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20246,"src":"1409:20:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenRecoveryLibrary_$20246_$","typeString":"type(library TokenRecoveryLibrary)"}},"id":19739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1430:10:185","memberName":"recoverETH","nodeType":"MemberAccess","referencedDeclaration":20100,"src":"1409:31:185","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_payable_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$","typeString":"function (address payable[] calldata,uint256[] calldata)"}},"id":19742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1409:50:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19743,"nodeType":"ExpressionStatement","src":"1409:50:185"}]},"documentation":{"id":19719,"nodeType":"StructuredDocumentation","src":"920:294:185","text":"@inheritdoc ITokenRecovery\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\n @dev Reverts if one of the ETH transfers fails for any reason."},"functionSelector":"f7ba94bd","id":19745,"implemented":true,"kind":"function","modifiers":[],"name":"recoverETH","nameLocation":"1228:10:185","nodeType":"FunctionDefinition","parameters":{"id":19726,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19722,"mutability":"mutable","name":"accounts","nameLocation":"1266:8:185","nodeType":"VariableDeclaration","scope":19745,"src":"1239:35:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[]"},"typeName":{"baseType":{"id":19720,"name":"address","nodeType":"ElementaryTypeName","src":"1239:15:185","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":19721,"nodeType":"ArrayTypeName","src":"1239:17:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_storage_ptr","typeString":"address payable[]"}},"visibility":"internal"},{"constant":false,"id":19725,"mutability":"mutable","name":"amounts","nameLocation":"1295:7:185","nodeType":"VariableDeclaration","scope":19745,"src":"1276:26:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19723,"name":"uint256","nodeType":"ElementaryTypeName","src":"1276:7:185","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19724,"nodeType":"ArrayTypeName","src":"1276:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1238:65:185"},"returnParameters":{"id":19727,"nodeType":"ParameterList","parameters":[],"src":"1319:0:185"},"scope":19810,"src":"1219:247:185","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[19923],"body":{"id":19776,"nodeType":"Block","src":"1907:158:185","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":19764,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1974:10:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19765,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1974:12:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19759,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1917:24:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":19761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1942:6:185","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1917:31:185","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":19762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1917:33:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":19763,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1951:22:185","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1917:56:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":19766,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1917:70:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19767,"nodeType":"ExpressionStatement","src":"1917:70:185"},{"expression":{"arguments":[{"id":19771,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19749,"src":"2032:8:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":19772,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19753,"src":"2042:6:185","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},{"id":19773,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19756,"src":"2050:7:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":19768,"name":"TokenRecoveryLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20246,"src":"1997:20:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenRecoveryLibrary_$20246_$","typeString":"type(library TokenRecoveryLibrary)"}},"id":19770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2018:13:185","memberName":"recoverERC20s","nodeType":"MemberAccess","referencedDeclaration":20156,"src":"1997:34:185","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$","typeString":"function (address[] calldata,contract IERC20[] calldata,uint256[] calldata)"}},"id":19774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1997:61:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19775,"nodeType":"ExpressionStatement","src":"1997:61:185"}]},"documentation":{"id":19746,"nodeType":"StructuredDocumentation","src":"1472:309:185","text":"@inheritdoc ITokenRecovery\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\n @dev Reverts if one of the ERC20 transfers fails for any reason."},"functionSelector":"73c8a958","id":19777,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC20s","nameLocation":"1795:13:185","nodeType":"FunctionDefinition","parameters":{"id":19757,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19749,"mutability":"mutable","name":"accounts","nameLocation":"1828:8:185","nodeType":"VariableDeclaration","scope":19777,"src":"1809:27:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":19747,"name":"address","nodeType":"ElementaryTypeName","src":"1809:7:185","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19748,"nodeType":"ArrayTypeName","src":"1809:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":19753,"mutability":"mutable","name":"tokens","nameLocation":"1856:6:185","nodeType":"VariableDeclaration","scope":19777,"src":"1838:24:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[]"},"typeName":{"baseType":{"id":19751,"nodeType":"UserDefinedTypeName","pathNode":{"id":19750,"name":"IERC20","nameLocations":["1838:6:185"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1838:6:185"},"referencedDeclaration":452,"src":"1838:6:185","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":19752,"nodeType":"ArrayTypeName","src":"1838:8:185","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_storage_ptr","typeString":"contract IERC20[]"}},"visibility":"internal"},{"constant":false,"id":19756,"mutability":"mutable","name":"amounts","nameLocation":"1883:7:185","nodeType":"VariableDeclaration","scope":19777,"src":"1864:26:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19754,"name":"uint256","nodeType":"ElementaryTypeName","src":"1864:7:185","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19755,"nodeType":"ArrayTypeName","src":"1864:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1808:83:185"},"returnParameters":{"id":19758,"nodeType":"ParameterList","parameters":[],"src":"1907:0:185"},"scope":19810,"src":"1786:279:185","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[19937],"body":{"id":19808,"nodeType":"Block","src":"2516:163:185","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":19796,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2583:10:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19797,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2583:12:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19791,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2526:24:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":19793,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2551:6:185","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2526:31:185","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":19794,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2526:33:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":19795,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2560:22:185","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"2526:56:185","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":19798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2526:70:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19799,"nodeType":"ExpressionStatement","src":"2526:70:185"},{"expression":{"arguments":[{"id":19803,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19781,"src":"2642:8:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":19804,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19785,"src":"2652:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},{"id":19805,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19788,"src":"2663:8:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":19800,"name":"TokenRecoveryLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20246,"src":"2606:20:185","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenRecoveryLibrary_$20246_$","typeString":"type(library TokenRecoveryLibrary)"}},"id":19802,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2627:14:185","memberName":"recoverERC721s","nodeType":"MemberAccess","referencedDeclaration":20245,"src":"2606:35:185","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$","typeString":"function (address[] calldata,contract IERC721[] calldata,uint256[] calldata)"}},"id":19806,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2606:66:185","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19807,"nodeType":"ExpressionStatement","src":"2606:66:185"}]},"documentation":{"id":19778,"nodeType":"StructuredDocumentation","src":"2071:313:185","text":"@inheritdoc ITokenRecovery\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\n @dev Reverts if one of the ERC721 transfers fails for any reason."},"functionSelector":"c3666c36","id":19809,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC721s","nameLocation":"2398:14:185","nodeType":"FunctionDefinition","parameters":{"id":19789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19781,"mutability":"mutable","name":"accounts","nameLocation":"2432:8:185","nodeType":"VariableDeclaration","scope":19809,"src":"2413:27:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":19779,"name":"address","nodeType":"ElementaryTypeName","src":"2413:7:185","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19780,"nodeType":"ArrayTypeName","src":"2413:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":19785,"mutability":"mutable","name":"contracts","nameLocation":"2461:9:185","nodeType":"VariableDeclaration","scope":19809,"src":"2442:28:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[]"},"typeName":{"baseType":{"id":19783,"nodeType":"UserDefinedTypeName","pathNode":{"id":19782,"name":"IERC721","nameLocations":["2442:7:185"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"2442:7:185"},"referencedDeclaration":33094,"src":"2442:7:185","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":19784,"nodeType":"ArrayTypeName","src":"2442:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_storage_ptr","typeString":"contract IERC721[]"}},"visibility":"internal"},{"constant":false,"id":19788,"mutability":"mutable","name":"tokenIds","nameLocation":"2491:8:185","nodeType":"VariableDeclaration","scope":19809,"src":"2472:27:185","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19786,"name":"uint256","nodeType":"ElementaryTypeName","src":"2472:7:185","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19787,"nodeType":"ArrayTypeName","src":"2472:9:185","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2412:88:185"},"returnParameters":{"id":19790,"nodeType":"ParameterList","parameters":[],"src":"2516:0:185"},"scope":19810,"src":"2389:290:185","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":19811,"src":"778:1903:185","usedErrors":[464,1216,1219,7886,8246,20056],"usedEvents":[]}],"src":"32:2650:185"},"id":185},"contracts/security/errors/SealsErrors.sol":{"ast":{"absolutePath":"contracts/security/errors/SealsErrors.sol","exportedSymbols":{"AlreadySealed":[19817]},"id":19818,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19812,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:186"},{"documentation":{"id":19813,"nodeType":"StructuredDocumentation","src":"58:116:186","text":"@notice Thrown when trying to seal a sealId which has already been used.\n @param sealId The seal identifier."},"errorSelector":"6e02cd6d","id":19817,"name":"AlreadySealed","nameLocation":"180:13:186","nodeType":"ErrorDefinition","parameters":{"id":19816,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19815,"mutability":"mutable","name":"sealId","nameLocation":"202:6:186","nodeType":"VariableDeclaration","scope":19817,"src":"194:14:186","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19814,"name":"uint256","nodeType":"ElementaryTypeName","src":"194:7:186","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"193:16:186"},"src":"174:36:186"}],"src":"32:179:186"},"id":186},"contracts/security/events/SealsEvents.sol":{"ast":{"absolutePath":"contracts/security/events/SealsEvents.sol","exportedSymbols":{"Sealed":[19826]},"id":19827,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19819,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:187"},{"anonymous":false,"documentation":{"id":19820,"nodeType":"StructuredDocumentation","src":"58:118:187","text":"@notice Emitted when a seal is used.\n @param sealId the seal identifier.\n @param sealer the sealer address."},"eventSelector":"4ede4a0b55ef0b366eeda846c0db70204e9f7205524b8c5f653085ca572b2577","id":19826,"name":"Sealed","nameLocation":"182:6:187","nodeType":"EventDefinition","parameters":{"id":19825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19822,"indexed":false,"mutability":"mutable","name":"sealId","nameLocation":"197:6:187","nodeType":"VariableDeclaration","scope":19826,"src":"189:14:187","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19821,"name":"uint256","nodeType":"ElementaryTypeName","src":"189:7:187","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":19824,"indexed":false,"mutability":"mutable","name":"sealer","nameLocation":"213:6:187","nodeType":"VariableDeclaration","scope":19826,"src":"205:14:187","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19823,"name":"address","nodeType":"ElementaryTypeName","src":"205:7:187","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"188:32:187"},"src":"176:45:187"}],"src":"32:190:187"},"id":187},"contracts/security/facets/TokenRecoveryFacet.sol":{"ast":{"absolutePath":"contracts/security/facets/TokenRecoveryFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"TokenRecoveryBase":[19810],"TokenRecoveryFacet":[19880]},"id":19881,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19828,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:188"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":19830,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19881,"sourceUnit":13387,"src":"57:84:188","symbolAliases":[{"foreign":{"id":19829,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:188","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../base/TokenRecoveryBase.sol","id":19832,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19881,"sourceUnit":19811,"src":"142:66:188","symbolAliases":[{"foreign":{"id":19831,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"150:17:188","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":19834,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19881,"sourceUnit":1207,"src":"209:66:188","symbolAliases":[{"foreign":{"id":19833,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"217:7:188","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":19836,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19881,"sourceUnit":13298,"src":"276:98:188","symbolAliases":[{"foreign":{"id":19835,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"284:28:188","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":19838,"name":"TokenRecoveryBase","nameLocations":["708:17:188"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"708:17:188"},"id":19839,"nodeType":"InheritanceSpecifier","src":"708:17:188"},{"baseName":{"id":19840,"name":"ForwarderRegistryContextBase","nameLocations":["727:28:188"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"727:28:188"},"id":19841,"nodeType":"InheritanceSpecifier","src":"727:28:188"}],"canonicalName":"TokenRecoveryFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":19837,"nodeType":"StructuredDocumentation","src":"376:301:188","text":"@title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ContractOwnershipFacet}."},"fullyImplemented":true,"id":19880,"linearizedBaseContracts":[19880,13297,19810,1206,19938],"name":"TokenRecoveryFacet","nameLocation":"686:18:188","nodeType":"ContractDefinition","nodes":[{"body":{"id":19850,"nodeType":"Block","src":"860:2:188","statements":[]},"id":19851,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":19847,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19844,"src":"841:17:188","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":19848,"kind":"baseConstructorSpecifier","modifierName":{"id":19846,"name":"ForwarderRegistryContextBase","nameLocations":["812:28:188"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"812:28:188"},"nodeType":"ModifierInvocation","src":"812:47:188"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":19845,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19844,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"793:17:188","nodeType":"VariableDeclaration","scope":19851,"src":"774:36:188","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":19843,"nodeType":"UserDefinedTypeName","pathNode":{"id":19842,"name":"IForwarderRegistry","nameLocations":["774:18:188"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"774:18:188"},"referencedDeclaration":13386,"src":"774:18:188","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"773:38:188"},"returnParameters":{"id":19849,"nodeType":"ParameterList","parameters":[],"src":"860:0:188"},"scope":19880,"src":"762:100:188","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":19864,"nodeType":"Block","src":"1027:65:188","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19860,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1044:28:188","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1073:10:188","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1044:39:188","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":19862,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1044:41:188","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":19859,"id":19863,"nodeType":"Return","src":"1037:48:188"}]},"documentation":{"id":19852,"nodeType":"StructuredDocumentation","src":"868:44:188","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19865,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"926:10:188","nodeType":"FunctionDefinition","overrides":{"id":19856,"nodeType":"OverrideSpecifier","overrides":[{"id":19854,"name":"Context","nameLocations":["970:7:188"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"970:7:188"},{"id":19855,"name":"ForwarderRegistryContextBase","nameLocations":["979:28:188"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"979:28:188"}],"src":"961:47:188"},"parameters":{"id":19853,"nodeType":"ParameterList","parameters":[],"src":"936:2:188"},"returnParameters":{"id":19859,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19858,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19865,"src":"1018:7:188","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19857,"name":"address","nodeType":"ElementaryTypeName","src":"1018:7:188","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1017:9:188"},"scope":19880,"src":"917:175:188","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":19878,"nodeType":"Block","src":"1262:63:188","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":19874,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1279:28:188","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":19875,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1308:8:188","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1279:37:188","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":19876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1279:39:188","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":19873,"id":19877,"nodeType":"Return","src":"1272:46:188"}]},"documentation":{"id":19866,"nodeType":"StructuredDocumentation","src":"1098:44:188","text":"@inheritdoc ForwarderRegistryContextBase"},"id":19879,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1156:8:188","nodeType":"FunctionDefinition","overrides":{"id":19870,"nodeType":"OverrideSpecifier","overrides":[{"id":19868,"name":"Context","nameLocations":["1198:7:188"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1198:7:188"},{"id":19869,"name":"ForwarderRegistryContextBase","nameLocations":["1207:28:188"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1207:28:188"}],"src":"1189:47:188"},"parameters":{"id":19867,"nodeType":"ParameterList","parameters":[],"src":"1164:2:188"},"returnParameters":{"id":19873,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19872,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":19879,"src":"1246:14:188","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":19871,"name":"bytes","nodeType":"ElementaryTypeName","src":"1246:5:188","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1245:16:188"},"scope":19880,"src":"1147:178:188","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":19881,"src":"677:650:188","usedErrors":[464,1216,1219,7886,8246,20056],"usedEvents":[]}],"src":"32:1296:188"},"id":188},"contracts/security/interfaces/ISeals.sol":{"ast":{"absolutePath":"contracts/security/interfaces/ISeals.sol","exportedSymbols":{"ISeals":[19892]},"id":19893,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19882,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:189"},{"abstract":false,"baseContracts":[],"canonicalName":"ISeals","contractDependencies":[],"contractKind":"interface","documentation":{"id":19883,"nodeType":"StructuredDocumentation","src":"58:49:189","text":"@title Uniquely identified seals management."},"fullyImplemented":false,"id":19892,"linearizedBaseContracts":[19892],"name":"ISeals","nameLocation":"117:6:189","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":19884,"nodeType":"StructuredDocumentation","src":"130:166:189","text":"@notice Retrieves whether a seal has been used already.\n @param sealId the seal identifier.\n @return wasSealed Whether a seal has been used already."},"functionSelector":"2c1758c1","id":19891,"implemented":false,"kind":"function","modifiers":[],"name":"isSealed","nameLocation":"310:8:189","nodeType":"FunctionDefinition","parameters":{"id":19887,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19886,"mutability":"mutable","name":"sealId","nameLocation":"327:6:189","nodeType":"VariableDeclaration","scope":19891,"src":"319:14:189","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19885,"name":"uint256","nodeType":"ElementaryTypeName","src":"319:7:189","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"318:16:189"},"returnParameters":{"id":19890,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19889,"mutability":"mutable","name":"wasSealed","nameLocation":"363:9:189","nodeType":"VariableDeclaration","scope":19891,"src":"358:14:189","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":19888,"name":"bool","nodeType":"ElementaryTypeName","src":"358:4:189","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"357:16:189"},"scope":19892,"src":"301:73:189","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":19893,"src":"107:269:189","usedErrors":[],"usedEvents":[]}],"src":"32:345:189"},"id":189},"contracts/security/interfaces/ITokenRecovery.sol":{"ast":{"absolutePath":"contracts/security/interfaces/ITokenRecovery.sol","exportedSymbols":{"IERC20":[452],"IERC721":[33094],"ITokenRecovery":[19938]},"id":19939,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19894,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:190"},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":19896,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19939,"sourceUnit":375,"src":"58:69:190","symbolAliases":[{"foreign":{"id":19895,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"66:6:190","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../../token/ERC721/interfaces/IERC721.sol","id":19898,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":19939,"sourceUnit":33095,"src":"128:68:190","symbolAliases":[{"foreign":{"id":19897,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"136:7:190","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ITokenRecovery","contractDependencies":[],"contractKind":"interface","documentation":{"id":19899,"nodeType":"StructuredDocumentation","src":"198:49:190","text":"@title Uniquely identified seals management."},"fullyImplemented":false,"id":19938,"linearizedBaseContracts":[19938],"name":"ITokenRecovery","nameLocation":"257:14:190","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":19900,"nodeType":"StructuredDocumentation","src":"278:626:190","text":"@notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\n @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\n  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\n  so that the extraction is limited to only amounts sent accidentally.\n @param accounts the list of accounts to transfer the tokens to.\n @param amounts the list of token amounts to transfer."},"functionSelector":"f7ba94bd","id":19909,"implemented":false,"kind":"function","modifiers":[],"name":"recoverETH","nameLocation":"918:10:190","nodeType":"FunctionDefinition","parameters":{"id":19907,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19903,"mutability":"mutable","name":"accounts","nameLocation":"956:8:190","nodeType":"VariableDeclaration","scope":19909,"src":"929:35:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[]"},"typeName":{"baseType":{"id":19901,"name":"address","nodeType":"ElementaryTypeName","src":"929:15:190","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":19902,"nodeType":"ArrayTypeName","src":"929:17:190","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_storage_ptr","typeString":"address payable[]"}},"visibility":"internal"},{"constant":false,"id":19906,"mutability":"mutable","name":"amounts","nameLocation":"985:7:190","nodeType":"VariableDeclaration","scope":19909,"src":"966:26:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19904,"name":"uint256","nodeType":"ElementaryTypeName","src":"966:7:190","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19905,"nodeType":"ArrayTypeName","src":"966:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"928:65:190"},"returnParameters":{"id":19908,"nodeType":"ParameterList","parameters":[],"src":"1002:0:190"},"scope":19938,"src":"909:94:190","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":19910,"nodeType":"StructuredDocumentation","src":"1009:479:190","text":"@notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\n  so that the extraction is limited to only amounts sent accidentally.\n @param accounts the list of accounts to transfer the tokens to.\n @param tokens the list of ERC20 token addresses.\n @param amounts the list of token amounts to transfer."},"functionSelector":"73c8a958","id":19923,"implemented":false,"kind":"function","modifiers":[],"name":"recoverERC20s","nameLocation":"1502:13:190","nodeType":"FunctionDefinition","parameters":{"id":19921,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19913,"mutability":"mutable","name":"accounts","nameLocation":"1535:8:190","nodeType":"VariableDeclaration","scope":19923,"src":"1516:27:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":19911,"name":"address","nodeType":"ElementaryTypeName","src":"1516:7:190","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19912,"nodeType":"ArrayTypeName","src":"1516:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":19917,"mutability":"mutable","name":"tokens","nameLocation":"1563:6:190","nodeType":"VariableDeclaration","scope":19923,"src":"1545:24:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[]"},"typeName":{"baseType":{"id":19915,"nodeType":"UserDefinedTypeName","pathNode":{"id":19914,"name":"IERC20","nameLocations":["1545:6:190"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1545:6:190"},"referencedDeclaration":452,"src":"1545:6:190","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":19916,"nodeType":"ArrayTypeName","src":"1545:8:190","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_storage_ptr","typeString":"contract IERC20[]"}},"visibility":"internal"},{"constant":false,"id":19920,"mutability":"mutable","name":"amounts","nameLocation":"1590:7:190","nodeType":"VariableDeclaration","scope":19923,"src":"1571:26:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19918,"name":"uint256","nodeType":"ElementaryTypeName","src":"1571:7:190","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19919,"nodeType":"ArrayTypeName","src":"1571:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1515:83:190"},"returnParameters":{"id":19922,"nodeType":"ParameterList","parameters":[],"src":"1607:0:190"},"scope":19938,"src":"1493:115:190","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":19924,"nodeType":"StructuredDocumentation","src":"1614:484:190","text":"@notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\n  so that the extraction is limited to only tokens sent accidentally.\n @param accounts the list of accounts to transfer the tokens to.\n @param contracts the list of ERC721 contract addresses.\n @param tokenIds the list of token ids to transfer."},"functionSelector":"c3666c36","id":19937,"implemented":false,"kind":"function","modifiers":[],"name":"recoverERC721s","nameLocation":"2112:14:190","nodeType":"FunctionDefinition","parameters":{"id":19935,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19927,"mutability":"mutable","name":"accounts","nameLocation":"2146:8:190","nodeType":"VariableDeclaration","scope":19937,"src":"2127:27:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":19925,"name":"address","nodeType":"ElementaryTypeName","src":"2127:7:190","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":19926,"nodeType":"ArrayTypeName","src":"2127:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":19931,"mutability":"mutable","name":"contracts","nameLocation":"2175:9:190","nodeType":"VariableDeclaration","scope":19937,"src":"2156:28:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[]"},"typeName":{"baseType":{"id":19929,"nodeType":"UserDefinedTypeName","pathNode":{"id":19928,"name":"IERC721","nameLocations":["2156:7:190"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"2156:7:190"},"referencedDeclaration":33094,"src":"2156:7:190","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":19930,"nodeType":"ArrayTypeName","src":"2156:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_storage_ptr","typeString":"contract IERC721[]"}},"visibility":"internal"},{"constant":false,"id":19934,"mutability":"mutable","name":"tokenIds","nameLocation":"2205:8:190","nodeType":"VariableDeclaration","scope":19937,"src":"2186:27:190","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":19932,"name":"uint256","nodeType":"ElementaryTypeName","src":"2186:7:190","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":19933,"nodeType":"ArrayTypeName","src":"2186:9:190","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2126:88:190"},"returnParameters":{"id":19936,"nodeType":"ParameterList","parameters":[],"src":"2223:0:190"},"scope":19938,"src":"2103:121:190","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":19939,"src":"247:1979:190","usedErrors":[],"usedEvents":[]}],"src":"32:2195:190"},"id":190},"contracts/security/libraries/SealsStorage.sol":{"ast":{"absolutePath":"contracts/security/libraries/SealsStorage.sol","exportedSymbols":{"AlreadySealed":[19817],"Sealed":[19826],"SealsStorage":[20030]},"id":20031,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":19940,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:191"},{"absolutePath":"contracts/security/errors/SealsErrors.sol","file":"./../errors/SealsErrors.sol","id":19942,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20031,"sourceUnit":19818,"src":"58:58:191","symbolAliases":[{"foreign":{"id":19941,"name":"AlreadySealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19817,"src":"66:13:191","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/events/SealsEvents.sol","file":"./../events/SealsEvents.sol","id":19944,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20031,"sourceUnit":19827,"src":"117:51:191","symbolAliases":[{"foreign":{"id":19943,"name":"Sealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19826,"src":"125:6:191","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"SealsStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":20030,"linearizedBaseContracts":[20030],"name":"SealsStorage","nameLocation":"178:12:191","nodeType":"ContractDefinition","nodes":[{"global":false,"id":19948,"libraryName":{"id":19945,"name":"SealsStorage","nameLocations":["203:12:191"],"nodeType":"IdentifierPath","referencedDeclaration":20030,"src":"203:12:191"},"nodeType":"UsingForDirective","src":"197:43:191","typeName":{"id":19947,"nodeType":"UserDefinedTypeName","pathNode":{"id":19946,"name":"SealsStorage.Layout","nameLocations":["220:12:191","233:6:191"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"220:19:191"},"referencedDeclaration":19953,"src":"220:19:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}}},{"canonicalName":"SealsStorage.Layout","id":19953,"members":[{"constant":false,"id":19952,"mutability":"mutable","name":"seals","nameLocation":"295:5:191","nodeType":"VariableDeclaration","scope":19953,"src":"270:30:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"},"typeName":{"id":19951,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":19949,"name":"uint256","nodeType":"ElementaryTypeName","src":"278:7:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"270:24:191","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":19950,"name":"bool","nodeType":"ElementaryTypeName","src":"289:4:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"internal"}],"name":"Layout","nameLocation":"253:6:191","nodeType":"StructDefinition","scope":20030,"src":"246:61:191","visibility":"public"},{"constant":true,"id":19966,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"339:19:191","nodeType":"VariableDeclaration","scope":20030,"src":"313:118:191","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":19954,"name":"bytes32","nodeType":"ElementaryTypeName","src":"313:7:191","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":19964,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e73656375726974792e5365616c732e73746f72616765","id":19960,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"387:37:191","typeDescriptions":{"typeIdentifier":"t_stringliteral_2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567c","typeString":"literal_string \"animoca.core.security.Seals.storage\""},"value":"animoca.core.security.Seals.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567c","typeString":"literal_string \"animoca.core.security.Seals.storage\""}],"id":19959,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"377:9:191","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":19961,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"377:48:191","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":19958,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"369:7:191","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":19957,"name":"uint256","nodeType":"ElementaryTypeName","src":"369:7:191","typeDescriptions":{}}},"id":19962,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"369:57:191","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":19963,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"429:1:191","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"369:61:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19956,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"361:7:191","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":19955,"name":"bytes32","nodeType":"ElementaryTypeName","src":"361:7:191","typeDescriptions":{}}},"id":19965,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"361:70:191","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":19999,"nodeType":"Block","src":"763:135:191","statements":[{"condition":{"baseExpression":{"expression":{"id":19977,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19970,"src":"777:1:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout storage pointer"}},"id":19978,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"779:5:191","memberName":"seals","nodeType":"MemberAccess","referencedDeclaration":19952,"src":"777:7:191","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":19980,"indexExpression":{"id":19979,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19974,"src":"785:6:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"777:15:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19985,"nodeType":"IfStatement","src":"773:49:191","trueBody":{"errorCall":{"arguments":[{"id":19982,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19974,"src":"815:6:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":19981,"name":"AlreadySealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19817,"src":"801:13:191","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":19983,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"801:21:191","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":19984,"nodeType":"RevertStatement","src":"794:28:191"}},{"expression":{"id":19992,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":19986,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19970,"src":"832:1:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout storage pointer"}},"id":19989,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"834:5:191","memberName":"seals","nodeType":"MemberAccess","referencedDeclaration":19952,"src":"832:7:191","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":19990,"indexExpression":{"id":19988,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19974,"src":"840:6:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"832:15:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":19991,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"850:4:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"832:22:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":19993,"nodeType":"ExpressionStatement","src":"832:22:191"},{"eventCall":{"arguments":[{"id":19995,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19974,"src":"876:6:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":19996,"name":"sealer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19972,"src":"884:6:191","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":19994,"name":"Sealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19826,"src":"869:6:191","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_address_$returns$__$","typeString":"function (uint256,address)"}},"id":19997,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"869:22:191","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":19998,"nodeType":"EmitStatement","src":"864:27:191"}]},"documentation":{"id":19967,"nodeType":"StructuredDocumentation","src":"438:247:191","text":"@notice Registers a unique seal identifier.\n @dev Reverts with {AlreadySealed} if the sealId has already been used.\n @dev Emits a {Sealed} event.\n @param sealer The sealer address\n @param sealId The seal identifier."},"id":20000,"implemented":true,"kind":"function","modifiers":[],"name":"seal","nameLocation":"699:4:191","nodeType":"FunctionDefinition","parameters":{"id":19975,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19970,"mutability":"mutable","name":"s","nameLocation":"719:1:191","nodeType":"VariableDeclaration","scope":20000,"src":"704:16:191","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"},"typeName":{"id":19969,"nodeType":"UserDefinedTypeName","pathNode":{"id":19968,"name":"Layout","nameLocations":["704:6:191"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"704:6:191"},"referencedDeclaration":19953,"src":"704:6:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":19972,"mutability":"mutable","name":"sealer","nameLocation":"730:6:191","nodeType":"VariableDeclaration","scope":20000,"src":"722:14:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":19971,"name":"address","nodeType":"ElementaryTypeName","src":"722:7:191","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":19974,"mutability":"mutable","name":"sealId","nameLocation":"746:6:191","nodeType":"VariableDeclaration","scope":20000,"src":"738:14:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":19973,"name":"uint256","nodeType":"ElementaryTypeName","src":"738:7:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"703:50:191"},"returnParameters":{"id":19976,"nodeType":"ParameterList","parameters":[],"src":"763:0:191"},"scope":20030,"src":"690:208:191","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20016,"nodeType":"Block","src":"1156:39:191","statements":[{"expression":{"baseExpression":{"expression":{"id":20011,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20004,"src":"1173:1:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout storage pointer"}},"id":20012,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1175:5:191","memberName":"seals","nodeType":"MemberAccess","referencedDeclaration":19952,"src":"1173:7:191","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_bool_$","typeString":"mapping(uint256 => bool)"}},"id":20014,"indexExpression":{"id":20013,"name":"sealId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20006,"src":"1181:6:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1173:15:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":20010,"id":20015,"nodeType":"Return","src":"1166:22:191"}]},"documentation":{"id":20001,"nodeType":"StructuredDocumentation","src":"904:166:191","text":"@notice Retrieves whether a seal has been used already.\n @param sealId the seal identifier.\n @return wasSealed Whether a seal has been used already."},"id":20017,"implemented":true,"kind":"function","modifiers":[],"name":"isSealed","nameLocation":"1084:8:191","nodeType":"FunctionDefinition","parameters":{"id":20007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20004,"mutability":"mutable","name":"s","nameLocation":"1108:1:191","nodeType":"VariableDeclaration","scope":20017,"src":"1093:16:191","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"},"typeName":{"id":20003,"nodeType":"UserDefinedTypeName","pathNode":{"id":20002,"name":"Layout","nameLocations":["1093:6:191"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"1093:6:191"},"referencedDeclaration":19953,"src":"1093:6:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":20006,"mutability":"mutable","name":"sealId","nameLocation":"1119:6:191","nodeType":"VariableDeclaration","scope":20017,"src":"1111:14:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20005,"name":"uint256","nodeType":"ElementaryTypeName","src":"1111:7:191","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1092:34:191"},"returnParameters":{"id":20010,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20009,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20017,"src":"1150:4:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20008,"name":"bool","nodeType":"ElementaryTypeName","src":"1150:4:191","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1149:6:191"},"scope":20030,"src":"1075:120:191","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":20028,"nodeType":"Block","src":"1260:115:191","statements":[{"assignments":[20024],"declarations":[{"constant":false,"id":20024,"mutability":"mutable","name":"position","nameLocation":"1278:8:191","nodeType":"VariableDeclaration","scope":20028,"src":"1270:16:191","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":20023,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1270:7:191","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":20026,"initialValue":{"id":20025,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19966,"src":"1289:19:191","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1270:38:191"},{"AST":{"nativeSrc":"1327:42:191","nodeType":"YulBlock","src":"1327:42:191","statements":[{"nativeSrc":"1341:18:191","nodeType":"YulAssignment","src":"1341:18:191","value":{"name":"position","nativeSrc":"1351:8:191","nodeType":"YulIdentifier","src":"1351:8:191"},"variableNames":[{"name":"s.slot","nativeSrc":"1341:6:191","nodeType":"YulIdentifier","src":"1341:6:191"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":20024,"isOffset":false,"isSlot":false,"src":"1351:8:191","valueSize":1},{"declaration":20021,"isOffset":false,"isSlot":true,"src":"1341:6:191","suffix":"slot","valueSize":1}],"id":20027,"nodeType":"InlineAssembly","src":"1318:51:191"}]},"id":20029,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"1210:6:191","nodeType":"FunctionDefinition","parameters":{"id":20018,"nodeType":"ParameterList","parameters":[],"src":"1216:2:191"},"returnParameters":{"id":20022,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20021,"mutability":"mutable","name":"s","nameLocation":"1257:1:191","nodeType":"VariableDeclaration","scope":20029,"src":"1242:16:191","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"},"typeName":{"id":20020,"nodeType":"UserDefinedTypeName","pathNode":{"id":20019,"name":"Layout","nameLocations":["1242:6:191"],"nodeType":"IdentifierPath","referencedDeclaration":19953,"src":"1242:6:191"},"referencedDeclaration":19953,"src":"1242:6:191","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19953_storage_ptr","typeString":"struct SealsStorage.Layout"}},"visibility":"internal"}],"src":"1241:18:191"},"scope":20030,"src":"1201:174:191","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":20031,"src":"170:1207:191","usedErrors":[],"usedEvents":[]}],"src":"32:1346:191"},"id":191},"contracts/security/libraries/TokenRecoveryLibrary.sol":{"ast":{"absolutePath":"contracts/security/libraries/TokenRecoveryLibrary.sol","exportedSymbols":{"Address":[1176],"IERC165":[11579],"IERC20":[452],"IERC721":[33094],"InconsistentArrayLengths":[7886],"SafeERC20":[916],"TokenRecoveryLibrary":[20246]},"id":20247,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":20032,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:192"},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../CommonErrors.sol","id":20034,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":7890,"src":"58:66:192","symbolAliases":[{"foreign":{"id":20033,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"66:24:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/interfaces/IERC20.sol","file":"@openzeppelin/contracts/interfaces/IERC20.sol","id":20036,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":375,"src":"125:69:192","symbolAliases":[{"foreign":{"id":20035,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"133:6:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../../token/ERC721/interfaces/IERC721.sol","id":20038,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":33095,"src":"195:68:192","symbolAliases":[{"foreign":{"id":20037,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"203:7:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/interfaces/IERC165.sol","file":"./../../introspection/interfaces/IERC165.sol","id":20040,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":11580,"src":"264:69:192","symbolAliases":[{"foreign":{"id":20039,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11579,"src":"272:7:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":20042,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":917,"src":"334:82:192","symbolAliases":[{"foreign":{"id":20041,"name":"SafeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":916,"src":"342:9:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Address.sol","file":"@openzeppelin/contracts/utils/Address.sol","id":20044,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":20247,"sourceUnit":1177,"src":"417:66:192","symbolAliases":[{"foreign":{"id":20043,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1176,"src":"425:7:192","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"TokenRecoveryLibrary","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":20246,"linearizedBaseContracts":[20246],"name":"TokenRecoveryLibrary","nameLocation":"493:20:192","nodeType":"ContractDefinition","nodes":[{"global":false,"id":20048,"libraryName":{"id":20045,"name":"SafeERC20","nameLocations":["526:9:192"],"nodeType":"IdentifierPath","referencedDeclaration":916,"src":"526:9:192"},"nodeType":"UsingForDirective","src":"520:27:192","typeName":{"id":20047,"nodeType":"UserDefinedTypeName","pathNode":{"id":20046,"name":"IERC20","nameLocations":["540:6:192"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"540:6:192"},"referencedDeclaration":452,"src":"540:6:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}},{"global":false,"id":20051,"libraryName":{"id":20049,"name":"Address","nameLocations":["558:7:192"],"nodeType":"IdentifierPath","referencedDeclaration":1176,"src":"558:7:192"},"nodeType":"UsingForDirective","src":"552:34:192","typeName":{"id":20050,"name":"address","nodeType":"ElementaryTypeName","src":"570:15:192","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}},{"documentation":{"id":20052,"nodeType":"StructuredDocumentation","src":"592:142:192","text":"@notice Thrown when trying to recover a token of the wrong contract type.\n @param tokenContract The token contract being recovered."},"errorSelector":"986b9f1f","id":20056,"name":"IncorrectTokenContractType","nameLocation":"745:26:192","nodeType":"ErrorDefinition","parameters":{"id":20055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20054,"mutability":"mutable","name":"tokenContract","nameLocation":"780:13:192","nodeType":"VariableDeclaration","scope":20056,"src":"772:21:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20053,"name":"address","nodeType":"ElementaryTypeName","src":"772:7:192","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"771:23:192"},"src":"739:56:192"},{"body":{"id":20099,"nodeType":"Block","src":"1704:222:192","statements":[{"assignments":[20067],"declarations":[{"constant":false,"id":20067,"mutability":"mutable","name":"length","nameLocation":"1722:6:192","nodeType":"VariableDeclaration","scope":20099,"src":"1714:14:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20066,"name":"uint256","nodeType":"ElementaryTypeName","src":"1714:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20070,"initialValue":{"expression":{"id":20068,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20060,"src":"1731:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[] calldata"}},"id":20069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1740:6:192","memberName":"length","nodeType":"MemberAccess","src":"1731:15:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1714:32:192"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20071,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20067,"src":"1760:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":20072,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20063,"src":"1770:7:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20073,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1778:6:192","memberName":"length","nodeType":"MemberAccess","src":"1770:14:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1760:24:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20078,"nodeType":"IfStatement","src":"1756:63:192","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":20075,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"1793:24:192","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20076,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1793:26:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":20077,"nodeType":"RevertStatement","src":"1786:33:192"}},{"body":{"id":20097,"nodeType":"Block","src":"1862:58:192","statements":[{"expression":{"arguments":[{"baseExpression":{"id":20092,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20063,"src":"1898:7:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20094,"indexExpression":{"id":20093,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20080,"src":"1906:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1898:10:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"baseExpression":{"id":20088,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20060,"src":"1876:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[] calldata"}},"id":20090,"indexExpression":{"id":20089,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20080,"src":"1885:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1876:11:192","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":20091,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1888:9:192","memberName":"sendValue","nodeType":"MemberAccess","referencedDeclaration":974,"src":"1876:21:192","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_payable_$_t_uint256_$returns$__$attached_to$_t_address_payable_$","typeString":"function (address payable,uint256)"}},"id":20095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1876:33:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20096,"nodeType":"ExpressionStatement","src":"1876:33:192"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20082,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20080,"src":"1845:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":20083,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20067,"src":"1849:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1845:10:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20098,"initializationExpression":{"assignments":[20080],"declarations":[{"constant":false,"id":20080,"mutability":"mutable","name":"i","nameLocation":"1842:1:192","nodeType":"VariableDeclaration","scope":20098,"src":"1834:9:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20079,"name":"uint256","nodeType":"ElementaryTypeName","src":"1834:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20081,"nodeType":"VariableDeclarationStatement","src":"1834:9:192"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":20086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"1857:3:192","subExpression":{"id":20085,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20080,"src":"1859:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20087,"nodeType":"ExpressionStatement","src":"1857:3:192"},"nodeType":"ForStatement","src":"1829:91:192"}]},"documentation":{"id":20057,"nodeType":"StructuredDocumentation","src":"801:804:192","text":"@notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\n @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\n  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\n  so that the extraction is limited to only amounts sent accidentally.\n @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\n @dev Reverts if one of the ETH transfers fails for any reason.\n @param accounts the list of accounts to transfer the tokens to.\n @param amounts the list of token amounts to transfer."},"id":20100,"implemented":true,"kind":"function","modifiers":[],"name":"recoverETH","nameLocation":"1619:10:192","nodeType":"FunctionDefinition","parameters":{"id":20064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20060,"mutability":"mutable","name":"accounts","nameLocation":"1657:8:192","nodeType":"VariableDeclaration","scope":20100,"src":"1630:35:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_calldata_ptr","typeString":"address payable[]"},"typeName":{"baseType":{"id":20058,"name":"address","nodeType":"ElementaryTypeName","src":"1630:15:192","stateMutability":"payable","typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}},"id":20059,"nodeType":"ArrayTypeName","src":"1630:17:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_payable_$dyn_storage_ptr","typeString":"address payable[]"}},"visibility":"internal"},{"constant":false,"id":20063,"mutability":"mutable","name":"amounts","nameLocation":"1686:7:192","nodeType":"VariableDeclaration","scope":20100,"src":"1667:26:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":20061,"name":"uint256","nodeType":"ElementaryTypeName","src":"1667:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20062,"nodeType":"ArrayTypeName","src":"1667:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1629:65:192"},"returnParameters":{"id":20065,"nodeType":"ParameterList","parameters":[],"src":"1704:0:192"},"scope":20246,"src":"1610:316:192","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20155,"nodeType":"Block","src":"2724:263:192","statements":[{"assignments":[20115],"declarations":[{"constant":false,"id":20115,"mutability":"mutable","name":"length","nameLocation":"2742:6:192","nodeType":"VariableDeclaration","scope":20155,"src":"2734:14:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20114,"name":"uint256","nodeType":"ElementaryTypeName","src":"2734:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20118,"initialValue":{"expression":{"id":20116,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20104,"src":"2751:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":20117,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2760:6:192","memberName":"length","nodeType":"MemberAccess","src":"2751:15:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2734:32:192"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":20127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20119,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20115,"src":"2780:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":20120,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20108,"src":"2790:6:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},"id":20121,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2797:6:192","memberName":"length","nodeType":"MemberAccess","src":"2790:13:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2780:23:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20126,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20123,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20115,"src":"2807:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":20124,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20111,"src":"2817:7:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20125,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2825:6:192","memberName":"length","nodeType":"MemberAccess","src":"2817:14:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2807:24:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2780:51:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20131,"nodeType":"IfStatement","src":"2776:90:192","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":20128,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"2840:24:192","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2840:26:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":20130,"nodeType":"RevertStatement","src":"2833:33:192"}},{"body":{"id":20153,"nodeType":"Block","src":"2909:72:192","statements":[{"expression":{"arguments":[{"baseExpression":{"id":20145,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20104,"src":"2946:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":20147,"indexExpression":{"id":20146,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20133,"src":"2955:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2946:11:192","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":20148,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20111,"src":"2959:7:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20150,"indexExpression":{"id":20149,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20133,"src":"2967:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2959:10:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"baseExpression":{"id":20141,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20108,"src":"2923:6:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},"id":20143,"indexExpression":{"id":20142,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20133,"src":"2930:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2923:9:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":20144,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2933:12:192","memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":497,"src":"2923:22:192","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IERC20_$452_$","typeString":"function (contract IERC20,address,uint256)"}},"id":20151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2923:47:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20152,"nodeType":"ExpressionStatement","src":"2923:47:192"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20137,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20135,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20133,"src":"2892:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":20136,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20115,"src":"2896:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2892:10:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20154,"initializationExpression":{"assignments":[20133],"declarations":[{"constant":false,"id":20133,"mutability":"mutable","name":"i","nameLocation":"2889:1:192","nodeType":"VariableDeclaration","scope":20154,"src":"2881:9:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20132,"name":"uint256","nodeType":"ElementaryTypeName","src":"2881:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20134,"nodeType":"VariableDeclarationStatement","src":"2881:9:192"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":20139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"2904:3:192","subExpression":{"id":20138,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20133,"src":"2906:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20140,"nodeType":"ExpressionStatement","src":"2904:3:192"},"nodeType":"ForStatement","src":"2876:105:192"}]},"documentation":{"id":20101,"nodeType":"StructuredDocumentation","src":"1932:672:192","text":"@notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\n  so that the extraction is limited to only amounts sent accidentally.\n @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\n @dev Reverts if one of the ERC20 transfers fails for any reason.\n @param accounts the list of accounts to transfer the tokens to.\n @param tokens the list of ERC20 token addresses.\n @param amounts the list of token amounts to transfer."},"id":20156,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC20s","nameLocation":"2618:13:192","nodeType":"FunctionDefinition","parameters":{"id":20112,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20104,"mutability":"mutable","name":"accounts","nameLocation":"2651:8:192","nodeType":"VariableDeclaration","scope":20156,"src":"2632:27:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":20102,"name":"address","nodeType":"ElementaryTypeName","src":"2632:7:192","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":20103,"nodeType":"ArrayTypeName","src":"2632:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":20108,"mutability":"mutable","name":"tokens","nameLocation":"2679:6:192","nodeType":"VariableDeclaration","scope":20156,"src":"2661:24:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[]"},"typeName":{"baseType":{"id":20106,"nodeType":"UserDefinedTypeName","pathNode":{"id":20105,"name":"IERC20","nameLocations":["2661:6:192"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"2661:6:192"},"referencedDeclaration":452,"src":"2661:6:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":20107,"nodeType":"ArrayTypeName","src":"2661:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_storage_ptr","typeString":"contract IERC20[]"}},"visibility":"internal"},{"constant":false,"id":20111,"mutability":"mutable","name":"amounts","nameLocation":"2706:7:192","nodeType":"VariableDeclaration","scope":20156,"src":"2687:26:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":20109,"name":"uint256","nodeType":"ElementaryTypeName","src":"2687:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20110,"nodeType":"ArrayTypeName","src":"2687:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2631:83:192"},"returnParameters":{"id":20113,"nodeType":"ParameterList","parameters":[],"src":"2724:0:192"},"scope":20246,"src":"2609:378:192","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20244,"nodeType":"Block","src":"3800:526:192","statements":[{"assignments":[20171],"declarations":[{"constant":false,"id":20171,"mutability":"mutable","name":"length","nameLocation":"3818:6:192","nodeType":"VariableDeclaration","scope":20244,"src":"3810:14:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20170,"name":"uint256","nodeType":"ElementaryTypeName","src":"3810:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20174,"initialValue":{"expression":{"id":20172,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20160,"src":"3827:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":20173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3836:6:192","memberName":"length","nodeType":"MemberAccess","src":"3827:15:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3810:32:192"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":20183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20178,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20175,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20171,"src":"3856:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":20176,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20164,"src":"3866:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},"id":20177,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3876:6:192","memberName":"length","nodeType":"MemberAccess","src":"3866:16:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3856:26:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20179,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20171,"src":"3886:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":20180,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20167,"src":"3896:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3905:6:192","memberName":"length","nodeType":"MemberAccess","src":"3896:15:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3886:25:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3856:55:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20187,"nodeType":"IfStatement","src":"3852:94:192","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":20184,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"3920:24:192","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3920:26:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":20186,"nodeType":"RevertStatement","src":"3913:33:192"}},{"body":{"id":20242,"nodeType":"Block","src":"3989:331:192","statements":[{"assignments":[20199],"declarations":[{"constant":false,"id":20199,"mutability":"mutable","name":"tokenContract","nameLocation":"4011:13:192","nodeType":"VariableDeclaration","scope":20242,"src":"4003:21:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"},"typeName":{"id":20198,"nodeType":"UserDefinedTypeName","pathNode":{"id":20197,"name":"IERC721","nameLocations":["4003:7:192"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"4003:7:192"},"referencedDeclaration":33094,"src":"4003:7:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"visibility":"internal"}],"id":20203,"initialValue":{"baseExpression":{"id":20200,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20164,"src":"4027:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},"id":20202,"indexExpression":{"id":20201,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"4037:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4027:12:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"nodeType":"VariableDeclarationStatement","src":"4003:36:192"},{"condition":{"id":20216,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4057:77:192","subExpression":{"arguments":[{"expression":{"arguments":[{"id":20212,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"4113:7:192","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721_$33094_$","typeString":"type(contract IERC721)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721_$33094_$","typeString":"type(contract IERC721)"}],"id":20211,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"4108:4:192","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":20213,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4108:13:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721_$33094","typeString":"type(contract IERC721)"}},"id":20214,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4122:11:192","memberName":"interfaceId","nodeType":"MemberAccess","src":"4108:25:192","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"}],"expression":{"arguments":[{"arguments":[{"id":20207,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20199,"src":"4074:13:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}],"id":20206,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4066:7:192","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20205,"name":"address","nodeType":"ElementaryTypeName","src":"4066:7:192","typeDescriptions":{}}},"id":20208,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4066:22:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20204,"name":"IERC165","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11579,"src":"4058:7:192","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC165_$11579_$","typeString":"type(contract IERC165)"}},"id":20209,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4058:31:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC165_$11579","typeString":"contract IERC165"}},"id":20210,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4090:17:192","memberName":"supportsInterface","nodeType":"MemberAccess","referencedDeclaration":11578,"src":"4058:49:192","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes4_$returns$_t_bool_$","typeString":"function (bytes4) view external returns (bool)"}},"id":20215,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4058:76:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20225,"nodeType":"IfStatement","src":"4053:173:192","trueBody":{"id":20224,"nodeType":"Block","src":"4136:90:192","statements":[{"errorCall":{"arguments":[{"arguments":[{"id":20220,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20199,"src":"4196:13:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}],"id":20219,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4188:7:192","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20218,"name":"address","nodeType":"ElementaryTypeName","src":"4188:7:192","typeDescriptions":{}}},"id":20221,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4188:22:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20217,"name":"IncorrectTokenContractType","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20056,"src":"4161:26:192","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":20222,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4161:50:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":20223,"nodeType":"RevertStatement","src":"4154:57:192"}]}},{"expression":{"arguments":[{"arguments":[{"id":20232,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4277:4:192","typeDescriptions":{"typeIdentifier":"t_contract$_TokenRecoveryLibrary_$20246","typeString":"library TokenRecoveryLibrary"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenRecoveryLibrary_$20246","typeString":"library TokenRecoveryLibrary"}],"id":20231,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4269:7:192","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20230,"name":"address","nodeType":"ElementaryTypeName","src":"4269:7:192","typeDescriptions":{}}},"id":20233,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4269:13:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":20234,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20160,"src":"4284:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":20236,"indexExpression":{"id":20235,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"4293:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4284:11:192","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":20237,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20167,"src":"4297:8:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":20239,"indexExpression":{"id":20238,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"4306:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4297:11:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"baseExpression":{"id":20226,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20164,"src":"4239:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},"id":20228,"indexExpression":{"id":20227,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"4249:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4239:12:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":20229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4252:16:192","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33047,"src":"4239:29:192","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":20240,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4239:70:192","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20241,"nodeType":"ExpressionStatement","src":"4239:70:192"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20193,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20191,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"3972:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":20192,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20171,"src":"3976:6:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3972:10:192","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20243,"initializationExpression":{"assignments":[20189],"declarations":[{"constant":false,"id":20189,"mutability":"mutable","name":"i","nameLocation":"3969:1:192","nodeType":"VariableDeclaration","scope":20243,"src":"3961:9:192","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20188,"name":"uint256","nodeType":"ElementaryTypeName","src":"3961:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20190,"nodeType":"VariableDeclarationStatement","src":"3961:9:192"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":20195,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3984:3:192","subExpression":{"id":20194,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20189,"src":"3986:1:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20196,"nodeType":"ExpressionStatement","src":"3984:3:192"},"nodeType":"ForStatement","src":"3956:364:192"}]},"documentation":{"id":20157,"nodeType":"StructuredDocumentation","src":"2993:681:192","text":"@notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\n @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\n  so that the extraction is limited to only tokens sent accidentally.\n @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\n @dev Reverts if one of the ERC721 transfers fails for any reason.\n @param accounts the list of accounts to transfer the tokens to.\n @param contracts the list of ERC721 contract addresses.\n @param tokenIds the list of token ids to transfer."},"id":20245,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC721s","nameLocation":"3688:14:192","nodeType":"FunctionDefinition","parameters":{"id":20168,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20160,"mutability":"mutable","name":"accounts","nameLocation":"3722:8:192","nodeType":"VariableDeclaration","scope":20245,"src":"3703:27:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":20158,"name":"address","nodeType":"ElementaryTypeName","src":"3703:7:192","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":20159,"nodeType":"ArrayTypeName","src":"3703:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":20164,"mutability":"mutable","name":"contracts","nameLocation":"3751:9:192","nodeType":"VariableDeclaration","scope":20245,"src":"3732:28:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[]"},"typeName":{"baseType":{"id":20162,"nodeType":"UserDefinedTypeName","pathNode":{"id":20161,"name":"IERC721","nameLocations":["3732:7:192"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"3732:7:192"},"referencedDeclaration":33094,"src":"3732:7:192","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":20163,"nodeType":"ArrayTypeName","src":"3732:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_storage_ptr","typeString":"contract IERC721[]"}},"visibility":"internal"},{"constant":false,"id":20167,"mutability":"mutable","name":"tokenIds","nameLocation":"3781:8:192","nodeType":"VariableDeclaration","scope":20245,"src":"3762:27:192","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":20165,"name":"uint256","nodeType":"ElementaryTypeName","src":"3762:7:192","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20166,"nodeType":"ArrayTypeName","src":"3762:9:192","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3702:88:192"},"returnParameters":{"id":20169,"nodeType":"ParameterList","parameters":[],"src":"3800:0:192"},"scope":20246,"src":"3679:647:192","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":20247,"src":"485:3843:192","usedErrors":[20056],"usedEvents":[]}],"src":"32:4297:192"},"id":192},"contracts/staking/linear/LinearPool.sol":{"ast":{"absolutePath":"contracts/staking/linear/LinearPool.sol","exportedSymbols":{"AccessControl":[7901],"AccessControlStorage":[8851],"Context":[1206],"ContractOwnership":[7934],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IERC20":[452],"IForwarderRegistry":[13386],"ILinearPool":[21056],"LinearPool":[21014],"Math":[5969],"ReentrancyGuard":[1349],"SafeERC20":[916],"TokenRecovery":[19661]},"id":21015,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":20248,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:193"},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":20250,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":7935,"src":"57:71:193","symbolAliases":[{"foreign":{"id":20249,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"65:17:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":20252,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":7902,"src":"129:63:193","symbolAliases":[{"foreign":{"id":20251,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"137:13:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/ReentrancyGuard.sol","file":"@openzeppelin/contracts/utils/ReentrancyGuard.sol","id":20254,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":1350,"src":"193:82:193","symbolAliases":[{"foreign":{"id":20253,"name":"ReentrancyGuard","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1349,"src":"201:15:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../security/TokenRecovery.sol","id":20256,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":19662,"src":"276:65:193","symbolAliases":[{"foreign":{"id":20255,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"284:13:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":20258,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":1207,"src":"342:66:193","symbolAliases":[{"foreign":{"id":20257,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"350:7:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../metatx/base/ForwarderRegistryContextBase.sol","id":20260,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":13298,"src":"409:98:193","symbolAliases":[{"foreign":{"id":20259,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"417:28:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../metatx/ForwarderRegistryContext.sol","id":20262,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":13143,"src":"508:85:193","symbolAliases":[{"foreign":{"id":20261,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"516:24:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../access/libraries/AccessControlStorage.sol","id":20264,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":8852,"src":"594:87:193","symbolAliases":[{"foreign":{"id":20263,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"602:20:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":20267,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":917,"src":"682:90:193","symbolAliases":[{"foreign":{"id":20265,"name":"SafeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":916,"src":"690:9:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":20266,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"701:6:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/math/Math.sol","file":"@openzeppelin/contracts/utils/math/Math.sol","id":20269,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":5970,"src":"773:65:193","symbolAliases":[{"foreign":{"id":20268,"name":"Math","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5969,"src":"781:4:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/staking/linear/interfaces/ILinearPool.sol","file":"./interfaces/ILinearPool.sol","id":20271,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":21057,"src":"839:57:193","symbolAliases":[{"foreign":{"id":20270,"name":"ILinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21056,"src":"847:11:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../metatx/interfaces/IForwarderRegistry.sol","id":20273,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21015,"sourceUnit":13387,"src":"897:84:193","symbolAliases":[{"foreign":{"id":20272,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"905:18:193","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":20275,"name":"ILinearPool","nameLocations":["1698:11:193"],"nodeType":"IdentifierPath","referencedDeclaration":21056,"src":"1698:11:193"},"id":20276,"nodeType":"InheritanceSpecifier","src":"1698:11:193"},{"baseName":{"id":20277,"name":"AccessControl","nameLocations":["1711:13:193"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"1711:13:193"},"id":20278,"nodeType":"InheritanceSpecifier","src":"1711:13:193"},{"baseName":{"id":20279,"name":"ReentrancyGuard","nameLocations":["1726:15:193"],"nodeType":"IdentifierPath","referencedDeclaration":1349,"src":"1726:15:193"},"id":20280,"nodeType":"InheritanceSpecifier","src":"1726:15:193"},{"baseName":{"id":20281,"name":"TokenRecovery","nameLocations":["1743:13:193"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1743:13:193"},"id":20282,"nodeType":"InheritanceSpecifier","src":"1743:13:193"},{"baseName":{"id":20283,"name":"ForwarderRegistryContext","nameLocations":["1758:24:193"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1758:24:193"},"id":20284,"nodeType":"InheritanceSpecifier","src":"1758:24:193"}],"canonicalName":"LinearPool","contractDependencies":[],"contractKind":"contract","documentation":{"id":20274,"nodeType":"StructuredDocumentation","src":"1074:592:193","text":"@title Linear rewards distribution staking pool.\n @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\n @notice Stakes, whether fungible or non-fungible, map to an amount of \"stake points\", then used to compute the user rewards share.\n @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\n @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract."},"fullyImplemented":false,"id":21014,"linearizedBaseContracts":[21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,8139,19810,8091,1206,8562,19938,8546,21056],"name":"LinearPool","nameLocation":"1684:10:193","nodeType":"ContractDefinition","nodes":[{"global":false,"id":20288,"libraryName":{"id":20285,"name":"AccessControlStorage","nameLocations":["1795:20:193"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"1795:20:193"},"nodeType":"UsingForDirective","src":"1789:59:193","typeName":{"id":20287,"nodeType":"UserDefinedTypeName","pathNode":{"id":20286,"name":"AccessControlStorage.Layout","nameLocations":["1820:20:193","1841:6:193"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"1820:27:193"},"referencedDeclaration":8616,"src":"1820:27:193","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"global":false,"id":20292,"libraryName":{"id":20289,"name":"SafeERC20","nameLocations":["1859:9:193"],"nodeType":"IdentifierPath","referencedDeclaration":916,"src":"1859:9:193"},"nodeType":"UsingForDirective","src":"1853:27:193","typeName":{"id":20291,"nodeType":"UserDefinedTypeName","pathNode":{"id":20290,"name":"IERC20","nameLocations":["1873:6:193"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1873:6:193"},"referencedDeclaration":452,"src":"1873:6:193","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}},{"global":false,"id":20295,"libraryName":{"id":20293,"name":"Math","nameLocations":["1891:4:193"],"nodeType":"IdentifierPath","referencedDeclaration":5969,"src":"1891:4:193"},"nodeType":"UsingForDirective","src":"1885:23:193","typeName":{"id":20294,"name":"uint256","nodeType":"ElementaryTypeName","src":"1900:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},{"constant":true,"functionSelector":"8580cf76","id":20298,"mutability":"constant","name":"REWARDER_ROLE","nameLocation":"1938:13:193","nodeType":"VariableDeclaration","scope":21014,"src":"1914:50:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":20296,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1914:7:193","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"7265776172646572","id":20297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1954:10:193","typeDescriptions":{"typeIdentifier":"t_stringliteral_09d4f938153b9874445ae24b09d3d71e7e819f700e6d9b5515a8ddfdd0cb3d7f","typeString":"literal_string \"rewarder\""},"value":"rewarder"},"visibility":"public"},{"constant":false,"functionSelector":"ef4cadc5","id":20300,"mutability":"immutable","name":"SCALING_FACTOR","nameLocation":"1996:14:193","nodeType":"VariableDeclaration","scope":21014,"src":"1971:39:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20299,"name":"uint256","nodeType":"ElementaryTypeName","src":"1971:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"817b1cd2","id":20302,"mutability":"mutable","name":"totalStaked","nameLocation":"2032:11:193","nodeType":"VariableDeclaration","scope":21014,"src":"2017:26:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20301,"name":"uint256","nodeType":"ElementaryTypeName","src":"2017:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"d0b06f5d","id":20304,"mutability":"mutable","name":"lastUpdated","nameLocation":"2064:11:193","nodeType":"VariableDeclaration","scope":21014,"src":"2049:26:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20303,"name":"uint256","nodeType":"ElementaryTypeName","src":"2049:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"7b0a47ee","id":20306,"mutability":"mutable","name":"rewardRate","nameLocation":"2096:10:193","nodeType":"VariableDeclaration","scope":21014,"src":"2081:25:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20305,"name":"uint256","nodeType":"ElementaryTypeName","src":"2081:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"9d696e36","id":20308,"mutability":"mutable","name":"rewardPerStakePointStored","nameLocation":"2127:25:193","nodeType":"VariableDeclaration","scope":21014,"src":"2112:40:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20307,"name":"uint256","nodeType":"ElementaryTypeName","src":"2112:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"efa90b54","id":20310,"mutability":"mutable","name":"distributionEnd","nameLocation":"2173:15:193","nodeType":"VariableDeclaration","scope":21014,"src":"2158:30:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20309,"name":"uint256","nodeType":"ElementaryTypeName","src":"2158:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"constant":false,"functionSelector":"98807d84","id":20314,"mutability":"mutable","name":"staked","nameLocation":"2249:6:193","nodeType":"VariableDeclaration","scope":21014,"src":"2195:60:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":20313,"keyName":"staker","keyNameLocation":"2211:6:193","keyType":{"id":20311,"name":"address","nodeType":"ElementaryTypeName","src":"2203:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2195:46:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"stakePoints","valueNameLocation":"2229:11:193","valueType":{"id":20312,"name":"uint256","nodeType":"ElementaryTypeName","src":"2221:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"0700037d","id":20318,"mutability":"mutable","name":"rewards","nameLocation":"2310:7:193","nodeType":"VariableDeclaration","scope":21014,"src":"2261:56:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":20317,"keyName":"staker","keyNameLocation":"2277:6:193","keyType":{"id":20315,"name":"address","nodeType":"ElementaryTypeName","src":"2269:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2261:41:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"reward","valueNameLocation":"2295:6:193","valueType":{"id":20316,"name":"uint256","nodeType":"ElementaryTypeName","src":"2287:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"c5c8f770","id":20322,"mutability":"mutable","name":"rewardPerStakePointPaid","nameLocation":"2370:23:193","nodeType":"VariableDeclaration","scope":21014,"src":"2323:70:193","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":20321,"keyName":"staker","keyNameLocation":"2339:6:193","keyType":{"id":20319,"name":"address","nodeType":"ElementaryTypeName","src":"2331:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"2323:39:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"paid","valueNameLocation":"2357:4:193","valueType":{"id":20320,"name":"uint256","nodeType":"ElementaryTypeName","src":"2349:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"anonymous":false,"eventSelector":"f4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e","id":20330,"name":"Staked","nameLocation":"2406:6:193","nodeType":"EventDefinition","parameters":{"id":20329,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20324,"indexed":true,"mutability":"mutable","name":"staker","nameLocation":"2429:6:193","nodeType":"VariableDeclaration","scope":20330,"src":"2413:22:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20323,"name":"address","nodeType":"ElementaryTypeName","src":"2413:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20326,"indexed":false,"mutability":"mutable","name":"stakeData","nameLocation":"2443:9:193","nodeType":"VariableDeclaration","scope":20330,"src":"2437:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20325,"name":"bytes","nodeType":"ElementaryTypeName","src":"2437:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20328,"indexed":false,"mutability":"mutable","name":"stakePoints","nameLocation":"2462:11:193","nodeType":"VariableDeclaration","scope":20330,"src":"2454:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20327,"name":"uint256","nodeType":"ElementaryTypeName","src":"2454:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2412:62:193"},"src":"2400:75:193"},{"anonymous":false,"eventSelector":"aae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e","id":20338,"name":"Withdrawn","nameLocation":"2486:9:193","nodeType":"EventDefinition","parameters":{"id":20337,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20332,"indexed":true,"mutability":"mutable","name":"staker","nameLocation":"2512:6:193","nodeType":"VariableDeclaration","scope":20338,"src":"2496:22:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20331,"name":"address","nodeType":"ElementaryTypeName","src":"2496:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20334,"indexed":false,"mutability":"mutable","name":"withdrawData","nameLocation":"2526:12:193","nodeType":"VariableDeclaration","scope":20338,"src":"2520:18:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20333,"name":"bytes","nodeType":"ElementaryTypeName","src":"2520:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20336,"indexed":false,"mutability":"mutable","name":"stakePoints","nameLocation":"2548:11:193","nodeType":"VariableDeclaration","scope":20338,"src":"2540:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20335,"name":"uint256","nodeType":"ElementaryTypeName","src":"2540:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2495:65:193"},"src":"2480:81:193"},{"anonymous":false,"eventSelector":"019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca","id":20348,"name":"Claimed","nameLocation":"2572:7:193","nodeType":"EventDefinition","parameters":{"id":20347,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20340,"indexed":true,"mutability":"mutable","name":"staker","nameLocation":"2596:6:193","nodeType":"VariableDeclaration","scope":20348,"src":"2580:22:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20339,"name":"address","nodeType":"ElementaryTypeName","src":"2580:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20342,"indexed":false,"mutability":"mutable","name":"claimData","nameLocation":"2610:9:193","nodeType":"VariableDeclaration","scope":20348,"src":"2604:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20341,"name":"bytes","nodeType":"ElementaryTypeName","src":"2604:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":20344,"indexed":false,"mutability":"mutable","name":"claimed","nameLocation":"2629:7:193","nodeType":"VariableDeclaration","scope":20348,"src":"2621:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20343,"name":"uint256","nodeType":"ElementaryTypeName","src":"2621:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20346,"indexed":false,"mutability":"mutable","name":"unclaimed","nameLocation":"2646:9:193","nodeType":"VariableDeclaration","scope":20348,"src":"2638:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20345,"name":"uint256","nodeType":"ElementaryTypeName","src":"2638:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2579:77:193"},"src":"2566:91:193"},{"anonymous":false,"eventSelector":"6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474","id":20356,"name":"RewardAdded","nameLocation":"2668:11:193","nodeType":"EventDefinition","parameters":{"id":20355,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20350,"indexed":true,"mutability":"mutable","name":"rewarder","nameLocation":"2696:8:193","nodeType":"VariableDeclaration","scope":20356,"src":"2680:24:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20349,"name":"address","nodeType":"ElementaryTypeName","src":"2680:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20352,"indexed":false,"mutability":"mutable","name":"reward","nameLocation":"2714:6:193","nodeType":"VariableDeclaration","scope":20356,"src":"2706:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20351,"name":"uint256","nodeType":"ElementaryTypeName","src":"2706:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20354,"indexed":false,"mutability":"mutable","name":"duration","nameLocation":"2730:8:193","nodeType":"VariableDeclaration","scope":20356,"src":"2722:16:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20353,"name":"uint256","nodeType":"ElementaryTypeName","src":"2722:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2679:60:193"},"src":"2662:78:193"},{"errorSelector":"a54ad6c5","id":20358,"name":"ScalingFactorOutOfBounds","nameLocation":"2752:24:193","nodeType":"ErrorDefinition","parameters":{"id":20357,"nodeType":"ParameterList","parameters":[],"src":"2776:2:193"},"src":"2746:33:193"},{"errorSelector":"040ef8ec","id":20360,"name":"InvalidStakeAmount","nameLocation":"2790:18:193","nodeType":"ErrorDefinition","parameters":{"id":20359,"nodeType":"ParameterList","parameters":[],"src":"2808:2:193"},"src":"2784:27:193"},{"errorSelector":"db73cdf0","id":20362,"name":"InvalidWithdrawAmount","nameLocation":"2822:21:193","nodeType":"ErrorDefinition","parameters":{"id":20361,"nodeType":"ParameterList","parameters":[],"src":"2843:2:193"},"src":"2816:30:193"},{"errorSelector":"2b6a7758","id":20370,"name":"NotEnoughStake","nameLocation":"2857:14:193","nodeType":"ErrorDefinition","parameters":{"id":20369,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20364,"mutability":"mutable","name":"staker","nameLocation":"2880:6:193","nodeType":"VariableDeclaration","scope":20370,"src":"2872:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20363,"name":"address","nodeType":"ElementaryTypeName","src":"2872:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20366,"mutability":"mutable","name":"stake","nameLocation":"2896:5:193","nodeType":"VariableDeclaration","scope":20370,"src":"2888:13:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20365,"name":"uint256","nodeType":"ElementaryTypeName","src":"2888:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20368,"mutability":"mutable","name":"withdraw","nameLocation":"2911:8:193","nodeType":"VariableDeclaration","scope":20370,"src":"2903:16:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20367,"name":"uint256","nodeType":"ElementaryTypeName","src":"2903:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2871:49:193"},"src":"2851:70:193"},{"errorSelector":"2367721e","id":20378,"name":"InvalidClaimSum","nameLocation":"2932:15:193","nodeType":"ErrorDefinition","parameters":{"id":20377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20372,"mutability":"mutable","name":"claimable","nameLocation":"2956:9:193","nodeType":"VariableDeclaration","scope":20378,"src":"2948:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20371,"name":"uint256","nodeType":"ElementaryTypeName","src":"2948:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20374,"mutability":"mutable","name":"claimed","nameLocation":"2975:7:193","nodeType":"VariableDeclaration","scope":20378,"src":"2967:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20373,"name":"uint256","nodeType":"ElementaryTypeName","src":"2967:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20376,"mutability":"mutable","name":"unclaimed","nameLocation":"2992:9:193","nodeType":"VariableDeclaration","scope":20378,"src":"2984:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20375,"name":"uint256","nodeType":"ElementaryTypeName","src":"2984:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2947:55:193"},"src":"2926:77:193"},{"errorSelector":"38539865","id":20380,"name":"InvalidRewardAmount","nameLocation":"3014:19:193","nodeType":"ErrorDefinition","parameters":{"id":20379,"nodeType":"ParameterList","parameters":[],"src":"3033:2:193"},"src":"3008:28:193"},{"errorSelector":"76166401","id":20382,"name":"InvalidDuration","nameLocation":"3047:15:193","nodeType":"ErrorDefinition","parameters":{"id":20381,"nodeType":"ParameterList","parameters":[],"src":"3062:2:193"},"src":"3041:24:193"},{"errorSelector":"19e2447d","id":20388,"name":"RewardDilution","nameLocation":"3076:14:193","nodeType":"ErrorDefinition","parameters":{"id":20387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20384,"mutability":"mutable","name":"currentRewardRate","nameLocation":"3099:17:193","nodeType":"VariableDeclaration","scope":20388,"src":"3091:25:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20383,"name":"uint256","nodeType":"ElementaryTypeName","src":"3091:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20386,"mutability":"mutable","name":"newRewardRate","nameLocation":"3126:13:193","nodeType":"VariableDeclaration","scope":20388,"src":"3118:21:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20385,"name":"uint256","nodeType":"ElementaryTypeName","src":"3118:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3090:50:193"},"src":"3070:71:193"},{"errorSelector":"50082065","id":20390,"name":"RewardOverflow","nameLocation":"3152:14:193","nodeType":"ErrorDefinition","parameters":{"id":20389,"nodeType":"ParameterList","parameters":[],"src":"3166:2:193"},"src":"3146:23:193"},{"body":{"id":20420,"nodeType":"Block","src":"4138:134:193","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint8","typeString":"uint8"},"id":20409,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20407,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20393,"src":"4156:21:193","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"3737","id":20408,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4180:2:193","typeDescriptions":{"typeIdentifier":"t_rational_77_by_1","typeString":"int_const 77"},"value":"77"},"src":"4156:26:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20410,"name":"ScalingFactorOutOfBounds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20358,"src":"4184:24:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20411,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4184:26:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20406,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4148:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20412,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4148:63:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20413,"nodeType":"ExpressionStatement","src":"4148:63:193"},{"expression":{"id":20418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20414,"name":"SCALING_FACTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20300,"src":"4221:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"hexValue":"3130","id":20415,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4238:2:193","typeDescriptions":{"typeIdentifier":"t_rational_10_by_1","typeString":"int_const 10"},"value":"10"},"nodeType":"BinaryOperation","operator":"**","rightExpression":{"id":20416,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20393,"src":"4244:21:193","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"4238:27:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4221:44:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20419,"nodeType":"ExpressionStatement","src":"4221:44:193"}]},"documentation":{"id":20391,"nodeType":"StructuredDocumentation","src":"3175:783:193","text":"@param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\n @param forwarderRegistry The address of the forwarder registry contract.\n @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\n @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\n      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\n      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\n      the higher the precision loss can be if the scaling factor is too low."},"id":20421,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":20399,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4082:3:193","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":20400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4086:6:193","memberName":"sender","nodeType":"MemberAccess","src":"4082:10:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":20401,"kind":"baseConstructorSpecifier","modifierName":{"id":20398,"name":"ContractOwnership","nameLocations":["4064:17:193"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"4064:17:193"},"nodeType":"ModifierInvocation","src":"4064:29:193"},{"arguments":[{"id":20403,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20396,"src":"4119:17:193","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":20404,"kind":"baseConstructorSpecifier","modifierName":{"id":20402,"name":"ForwarderRegistryContext","nameLocations":["4094:24:193"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"4094:24:193"},"nodeType":"ModifierInvocation","src":"4094:43:193"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":20397,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20393,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"3990:21:193","nodeType":"VariableDeclaration","scope":20421,"src":"3984:27:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":20392,"name":"uint8","nodeType":"ElementaryTypeName","src":"3984:5:193","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":20396,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"4040:17:193","nodeType":"VariableDeclaration","scope":20421,"src":"4021:36:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":20395,"nodeType":"UserDefinedTypeName","pathNode":{"id":20394,"name":"IForwarderRegistry","nameLocations":["4021:18:193"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"4021:18:193"},"referencedDeclaration":13386,"src":"4021:18:193","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"3974:89:193"},"returnParameters":{"id":20405,"nodeType":"ParameterList","parameters":[],"src":"4138:0:193"},"scope":21014,"src":"3963:309:193","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":20468,"nodeType":"Block","src":"4327:439:193","statements":[{"expression":{"id":20429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20426,"name":"rewardPerStakePointStored","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20308,"src":"4337:25:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":20427,"name":"rewardPerStakePoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20521,"src":"4365:19:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":20428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4365:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4337:49:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20430,"nodeType":"ExpressionStatement","src":"4337:49:193"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":20438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20434,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20431,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4400:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4406:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"4400:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":20433,"name":"distributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20310,"src":"4419:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4400:34:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20437,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20435,"name":"totalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20302,"src":"4438:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4453:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4438:16:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4400:54:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20445,"nodeType":"IfStatement","src":"4396:195:193","trueBody":{"id":20444,"nodeType":"Block","src":"4456:135:193","statements":[{"expression":{"id":20442,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20439,"name":"lastUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20304,"src":"4540:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":20440,"name":"lastTimeRewardApplicable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20489,"src":"4554:24:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":20441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4554:26:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4540:40:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20443,"nodeType":"ExpressionStatement","src":"4540:40:193"}]}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":20451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20446,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20423,"src":"4604:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":20449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4623:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":20448,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4615:7:193","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20447,"name":"address","nodeType":"ElementaryTypeName","src":"4615:7:193","typeDescriptions":{}}},"id":20450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4615:10:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4604:21:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20467,"nodeType":"IfStatement","src":"4600:160:193","trueBody":{"id":20466,"nodeType":"Block","src":"4627:133:193","statements":[{"expression":{"id":20458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":20452,"name":"rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20318,"src":"4641:7:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20454,"indexExpression":{"id":20453,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20423,"src":"4649:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4641:16:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":20456,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20423,"src":"4667:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20455,"name":"earned","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20547,"src":"4660:6:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":20457,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4660:15:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4641:34:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20459,"nodeType":"ExpressionStatement","src":"4641:34:193"},{"expression":{"id":20464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":20460,"name":"rewardPerStakePointPaid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20322,"src":"4689:23:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20462,"indexExpression":{"id":20461,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20423,"src":"4713:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4689:32:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20463,"name":"rewardPerStakePointStored","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20308,"src":"4724:25:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4689:60:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20465,"nodeType":"ExpressionStatement","src":"4689:60:193"}]}}]},"id":20469,"implemented":true,"kind":"function","modifiers":[],"name":"_updateReward","nameLocation":"4287:13:193","nodeType":"FunctionDefinition","parameters":{"id":20424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20423,"mutability":"mutable","name":"account","nameLocation":"4309:7:193","nodeType":"VariableDeclaration","scope":20469,"src":"4301:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20422,"name":"address","nodeType":"ElementaryTypeName","src":"4301:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4300:17:193"},"returnParameters":{"id":20425,"nodeType":"ParameterList","parameters":[],"src":"4327:0:193"},"scope":21014,"src":"4278:488:193","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[21021],"body":{"id":20488,"nodeType":"Block","src":"4985:165:193","statements":[{"assignments":[20476],"declarations":[{"constant":false,"id":20476,"mutability":"mutable","name":"currentDistributionEnd","nameLocation":"5003:22:193","nodeType":"VariableDeclaration","scope":20488,"src":"4995:30:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20475,"name":"uint256","nodeType":"ElementaryTypeName","src":"4995:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20478,"initialValue":{"id":20477,"name":"distributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20310,"src":"5028:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4995:48:193"},{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20479,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5060:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5066:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"5060:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":20481,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20476,"src":"5078:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5060:40:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"id":20485,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20476,"src":"5121:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"5060:83:193","trueExpression":{"expression":{"id":20483,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5103:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5109:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"5103:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20474,"id":20487,"nodeType":"Return","src":"5053:90:193"}]},"documentation":{"id":20470,"nodeType":"StructuredDocumentation","src":"4772:142:193","text":"@notice Returns the last time rewards are applicable.\n @return The minimum of the current block timestamp and the distribution end."},"functionSelector":"80faa57d","id":20489,"implemented":true,"kind":"function","modifiers":[],"name":"lastTimeRewardApplicable","nameLocation":"4928:24:193","nodeType":"FunctionDefinition","parameters":{"id":20471,"nodeType":"ParameterList","parameters":[],"src":"4952:2:193"},"returnParameters":{"id":20474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20473,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20489,"src":"4976:7:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20472,"name":"uint256","nodeType":"ElementaryTypeName","src":"4976:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4975:9:193"},"scope":21014,"src":"4919:231:193","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[21026],"body":{"id":20520,"nodeType":"Block","src":"5368:277:193","statements":[{"assignments":[20496],"declarations":[{"constant":false,"id":20496,"mutability":"mutable","name":"currentTotalStaked","nameLocation":"5386:18:193","nodeType":"VariableDeclaration","scope":20520,"src":"5378:26:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20495,"name":"uint256","nodeType":"ElementaryTypeName","src":"5378:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20498,"initialValue":{"id":20497,"name":"totalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20302,"src":"5407:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5378:40:193"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20499,"name":"currentTotalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20496,"src":"5432:18:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":20500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5454:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5432:23:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20505,"nodeType":"IfStatement","src":"5428:86:193","trueBody":{"id":20504,"nodeType":"Block","src":"5457:57:193","statements":[{"expression":{"id":20502,"name":"rewardPerStakePointStored","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20308,"src":"5478:25:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20494,"id":20503,"nodeType":"Return","src":"5471:32:193"}]}},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20518,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20506,"name":"rewardPerStakePointStored","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20308,"src":"5530:25:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20516,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":20507,"name":"lastTimeRewardApplicable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20489,"src":"5561:24:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":20508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5561:26:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":20509,"name":"lastUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20304,"src":"5590:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5561:40:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20511,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5560:42:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":20512,"name":"rewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20306,"src":"5605:10:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5560:55:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20514,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5559:57:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":20515,"name":"currentTotalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20496,"src":"5619:18:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5559:78:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20517,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5558:80:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5530:108:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20494,"id":20519,"nodeType":"Return","src":"5523:115:193"}]},"documentation":{"id":20490,"nodeType":"StructuredDocumentation","src":"5156:146:193","text":"@notice Returns the current reward per stake point.\n @return The sum of the last stored value and the new rewards since the last update"},"functionSelector":"2c9d0b80","id":20521,"implemented":true,"kind":"function","modifiers":[],"name":"rewardPerStakePoint","nameLocation":"5316:19:193","nodeType":"FunctionDefinition","parameters":{"id":20491,"nodeType":"ParameterList","parameters":[],"src":"5335:2:193"},"returnParameters":{"id":20494,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20493,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20521,"src":"5359:7:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20492,"name":"uint256","nodeType":"ElementaryTypeName","src":"5359:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5358:9:193"},"scope":21014,"src":"5307:338:193","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[21033],"body":{"id":20546,"nodeType":"Block","src":"5992:121:193","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20544,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":20529,"name":"staked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20314,"src":"6010:6:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20531,"indexExpression":{"id":20530,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20524,"src":"6017:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6010:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":20532,"name":"rewardPerStakePoint","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20521,"src":"6029:19:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_uint256_$","typeString":"function () view returns (uint256)"}},"id":20533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6029:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"baseExpression":{"id":20534,"name":"rewardPerStakePointPaid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20322,"src":"6053:23:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20536,"indexExpression":{"id":20535,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20524,"src":"6077:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6053:32:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6029:56:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20538,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6028:58:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6010:76:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20540,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"6009:78:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"baseExpression":{"id":20541,"name":"rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20318,"src":"6090:7:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20543,"indexExpression":{"id":20542,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20524,"src":"6098:7:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6090:16:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6009:97:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":20528,"id":20545,"nodeType":"Return","src":"6002:104:193"}]},"documentation":{"id":20522,"nodeType":"StructuredDocumentation","src":"5651:273:193","text":"@notice Returns the amount of rewards earned by the account.\n @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\n @param account The address of the account to check."},"functionSelector":"008cc262","id":20547,"implemented":true,"kind":"function","modifiers":[],"name":"earned","nameLocation":"5938:6:193","nodeType":"FunctionDefinition","parameters":{"id":20525,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20524,"mutability":"mutable","name":"account","nameLocation":"5953:7:193","nodeType":"VariableDeclaration","scope":20547,"src":"5945:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20523,"name":"address","nodeType":"ElementaryTypeName","src":"5945:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5944:17:193"},"returnParameters":{"id":20528,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20527,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20547,"src":"5983:7:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20526,"name":"uint256","nodeType":"ElementaryTypeName","src":"5983:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5982:9:193"},"scope":21014,"src":"5929:184:193","stateMutability":"view","virtual":false,"visibility":"public"},{"baseFunctions":[21038],"body":{"id":20559,"nodeType":"Block","src":"6704:48:193","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":20554,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"6721:10:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":20555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6721:12:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20556,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20550,"src":"6735:9:193","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":20553,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"6714:6:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":20557,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6714:31:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20558,"nodeType":"ExpressionStatement","src":"6714:31:193"}]},"documentation":{"id":20548,"nodeType":"StructuredDocumentation","src":"6119:516:193","text":"@notice Stakes to the pool.\n @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\n @dev Emits a {Staked} event with the staker address, stakeData and stake points.\n @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\n @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts)."},"functionSelector":"2d1e0c02","id":20560,"implemented":true,"kind":"function","modifiers":[],"name":"stake","nameLocation":"6649:5:193","nodeType":"FunctionDefinition","parameters":{"id":20551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20550,"mutability":"mutable","name":"stakeData","nameLocation":"6670:9:193","nodeType":"VariableDeclaration","scope":20560,"src":"6655:24:193","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20549,"name":"bytes","nodeType":"ElementaryTypeName","src":"6655:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6654:26:193"},"returnParameters":{"id":20552,"nodeType":"ParameterList","parameters":[],"src":"6704:0:193"},"scope":21014,"src":"6640:112:193","stateMutability":"payable","virtual":true,"visibility":"public"},{"body":{"id":20605,"nodeType":"Block","src":"7537:287:193","statements":[{"expression":{"arguments":[{"id":20571,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20563,"src":"7561:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20570,"name":"_updateReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20469,"src":"7547:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":20572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7547:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20573,"nodeType":"ExpressionStatement","src":"7547:21:193"},{"assignments":[20575],"declarations":[{"constant":false,"id":20575,"mutability":"mutable","name":"stakePoints","nameLocation":"7586:11:193","nodeType":"VariableDeclaration","scope":20605,"src":"7578:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20574,"name":"uint256","nodeType":"ElementaryTypeName","src":"7578:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20580,"initialValue":{"arguments":[{"id":20577,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20563,"src":"7614:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20578,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20565,"src":"7622:9:193","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":20576,"name":"_computeStake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20953,"src":"7600:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (address,bytes memory) returns (uint256)"}},"id":20579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7600:32:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7578:54:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20584,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20582,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20575,"src":"7650:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20583,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7665:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7650:16:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20585,"name":"InvalidStakeAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20360,"src":"7668:18:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20586,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7668:20:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20581,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"7642:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20587,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7642:47:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20588,"nodeType":"ExpressionStatement","src":"7642:47:193"},{"expression":{"id":20591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20589,"name":"totalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20302,"src":"7699:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":20590,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20575,"src":"7714:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7699:26:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20592,"nodeType":"ExpressionStatement","src":"7699:26:193"},{"expression":{"id":20597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":20593,"name":"staked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20314,"src":"7735:6:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20595,"indexExpression":{"id":20594,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20563,"src":"7742:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7735:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":20596,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20575,"src":"7753:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7735:29:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20598,"nodeType":"ExpressionStatement","src":"7735:29:193"},{"eventCall":{"arguments":[{"id":20600,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20563,"src":"7786:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20601,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20565,"src":"7794:9:193","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":20602,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20575,"src":"7805:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20599,"name":"Staked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20330,"src":"7779:6:193","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (address,bytes memory,uint256)"}},"id":20603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7779:38:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20604,"nodeType":"EmitStatement","src":"7774:43:193"}]},"documentation":{"id":20561,"nodeType":"StructuredDocumentation","src":"6758:688:193","text":"@notice Stakes to the pool.\n NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\n @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\n @dev Emits a {Staked} event with the staker address, stakeData and stake points.\n @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\n @param staker The address of the staker.\n @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts)."},"id":20606,"implemented":true,"kind":"function","modifiers":[{"id":20568,"kind":"modifierInvocation","modifierName":{"id":20567,"name":"nonReentrant","nameLocations":["7524:12:193"],"nodeType":"IdentifierPath","referencedDeclaration":1313,"src":"7524:12:193"},"nodeType":"ModifierInvocation","src":"7524:12:193"}],"name":"_stake","nameLocation":"7460:6:193","nodeType":"FunctionDefinition","parameters":{"id":20566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20563,"mutability":"mutable","name":"staker","nameLocation":"7475:6:193","nodeType":"VariableDeclaration","scope":20606,"src":"7467:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20562,"name":"address","nodeType":"ElementaryTypeName","src":"7467:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20565,"mutability":"mutable","name":"stakeData","nameLocation":"7496:9:193","nodeType":"VariableDeclaration","scope":20606,"src":"7483:22:193","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20564,"name":"bytes","nodeType":"ElementaryTypeName","src":"7483:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"7466:40:193"},"returnParameters":{"id":20569,"nodeType":"ParameterList","parameters":[],"src":"7537:0:193"},"scope":21014,"src":"7451:373:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[21043],"body":{"id":20618,"nodeType":"Block","src":"8546:54:193","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":20613,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"8566:10:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":20614,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8566:12:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20615,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20609,"src":"8580:12:193","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":20612,"name":"_withdraw","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20685,"src":"8556:9:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":20616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8556:37:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20617,"nodeType":"ExpressionStatement","src":"8556:37:193"}]},"documentation":{"id":20607,"nodeType":"StructuredDocumentation","src":"7830:649:193","text":"@notice Withdraws from the pool.\n @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\n @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\n @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\n @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\n @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts)."},"functionSelector":"0968f264","id":20619,"implemented":true,"kind":"function","modifiers":[],"name":"withdraw","nameLocation":"8493:8:193","nodeType":"FunctionDefinition","parameters":{"id":20610,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20609,"mutability":"mutable","name":"withdrawData","nameLocation":"8517:12:193","nodeType":"VariableDeclaration","scope":20619,"src":"8502:27:193","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20608,"name":"bytes","nodeType":"ElementaryTypeName","src":"8502:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8501:29:193"},"returnParameters":{"id":20611,"nodeType":"ParameterList","parameters":[],"src":"8546:0:193"},"scope":21014,"src":"8484:116:193","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":20684,"nodeType":"Block","src":"9401:539:193","statements":[{"expression":{"arguments":[{"id":20630,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9425:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20629,"name":"_updateReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20469,"src":"9411:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":20631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9411:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20632,"nodeType":"ExpressionStatement","src":"9411:21:193"},{"assignments":[20634],"declarations":[{"constant":false,"id":20634,"mutability":"mutable","name":"stakePoints","nameLocation":"9450:11:193","nodeType":"VariableDeclaration","scope":20684,"src":"9442:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20633,"name":"uint256","nodeType":"ElementaryTypeName","src":"9442:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20639,"initialValue":{"arguments":[{"id":20636,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9481:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20637,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20624,"src":"9489:12:193","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":20635,"name":"_computeWithdraw","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20963,"src":"9464:16:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_uint256_$","typeString":"function (address,bytes memory) returns (uint256)"}},"id":20638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9464:38:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9442:60:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20641,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9520:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20642,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9535:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9520:16:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20644,"name":"InvalidWithdrawAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20362,"src":"9538:21:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9538:23:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20640,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9512:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9512:50:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20647,"nodeType":"ExpressionStatement","src":"9512:50:193"},{"assignments":[20649],"declarations":[{"constant":false,"id":20649,"mutability":"mutable","name":"currentStaked","nameLocation":"9580:13:193","nodeType":"VariableDeclaration","scope":20684,"src":"9572:21:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20648,"name":"uint256","nodeType":"ElementaryTypeName","src":"9572:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20653,"initialValue":{"baseExpression":{"id":20650,"name":"staked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20314,"src":"9596:6:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20652,"indexExpression":{"id":20651,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9603:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9596:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9572:38:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20655,"name":"currentStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20649,"src":"9628:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":20656,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9645:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9628:28:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":20659,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9673:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20660,"name":"currentStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20649,"src":"9681:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20661,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9696:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20658,"name":"NotEnoughStake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20370,"src":"9658:14:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":20662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9658:50:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20654,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9620:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9620:89:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20664,"nodeType":"ExpressionStatement","src":"9620:89:193"},{"id":20677,"nodeType":"UncheckedBlock","src":"9719:156:193","statements":[{"expression":{"id":20671,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":20665,"name":"staked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20314,"src":"9780:6:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20667,"indexExpression":{"id":20666,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9787:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9780:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20668,"name":"currentStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20649,"src":"9797:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":20669,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9813:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9797:27:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9780:44:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20672,"nodeType":"ExpressionStatement","src":"9780:44:193"},{"expression":{"id":20675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20673,"name":"totalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20302,"src":"9838:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":20674,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9853:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9838:26:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20676,"nodeType":"ExpressionStatement","src":"9838:26:193"}]},{"eventCall":{"arguments":[{"id":20679,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20622,"src":"9899:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20680,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20624,"src":"9907:12:193","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":20681,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20634,"src":"9921:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20678,"name":"Withdrawn","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20338,"src":"9889:9:193","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (address,bytes memory,uint256)"}},"id":20682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9889:44:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20683,"nodeType":"EmitStatement","src":"9884:49:193"}]},"documentation":{"id":20620,"nodeType":"StructuredDocumentation","src":"8606:698:193","text":"@notice Withdraws from the pool.\n @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\n @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\n @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\n @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\n @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\n @param staker The address of the staker.\n @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts)."},"id":20685,"implemented":true,"kind":"function","modifiers":[{"id":20627,"kind":"modifierInvocation","modifierName":{"id":20626,"name":"nonReentrant","nameLocations":["9388:12:193"],"nodeType":"IdentifierPath","referencedDeclaration":1313,"src":"9388:12:193"},"nodeType":"ModifierInvocation","src":"9388:12:193"}],"name":"_withdraw","nameLocation":"9318:9:193","nodeType":"FunctionDefinition","parameters":{"id":20625,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20622,"mutability":"mutable","name":"staker","nameLocation":"9336:6:193","nodeType":"VariableDeclaration","scope":20685,"src":"9328:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20621,"name":"address","nodeType":"ElementaryTypeName","src":"9328:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20624,"mutability":"mutable","name":"withdrawData","nameLocation":"9357:12:193","nodeType":"VariableDeclaration","scope":20685,"src":"9344:25:193","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20623,"name":"bytes","nodeType":"ElementaryTypeName","src":"9344:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9327:43:193"},"returnParameters":{"id":20628,"nodeType":"ParameterList","parameters":[],"src":"9401:0:193"},"scope":21014,"src":"9309:631:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[21048],"body":{"id":20765,"nodeType":"Block","src":"10272:593:193","statements":[{"assignments":[20694],"declarations":[{"constant":false,"id":20694,"mutability":"mutable","name":"staker","nameLocation":"10290:6:193","nodeType":"VariableDeclaration","scope":20765,"src":"10282:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20693,"name":"address","nodeType":"ElementaryTypeName","src":"10282:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":20697,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":20695,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"10299:10:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":20696,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10299:12:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"10282:29:193"},{"expression":{"arguments":[{"id":20699,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20694,"src":"10335:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20698,"name":"_updateReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20469,"src":"10321:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":20700,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10321:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20701,"nodeType":"ExpressionStatement","src":"10321:21:193"},{"assignments":[20703],"declarations":[{"constant":false,"id":20703,"mutability":"mutable","name":"reward","nameLocation":"10360:6:193","nodeType":"VariableDeclaration","scope":20765,"src":"10352:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20702,"name":"uint256","nodeType":"ElementaryTypeName","src":"10352:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20707,"initialValue":{"arguments":[{"id":20705,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20694,"src":"10376:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20704,"name":"earned","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20547,"src":"10369:6:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view returns (uint256)"}},"id":20706,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10369:14:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10352:31:193"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20708,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20703,"src":"10397:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20709,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10407:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"10397:11:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":20764,"nodeType":"IfStatement","src":"10393:466:193","trueBody":{"id":20763,"nodeType":"Block","src":"10410:449:193","statements":[{"assignments":[20712],"declarations":[{"constant":false,"id":20712,"mutability":"mutable","name":"claimable","nameLocation":"10432:9:193","nodeType":"VariableDeclaration","scope":20763,"src":"10424:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20711,"name":"uint256","nodeType":"ElementaryTypeName","src":"10424:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20716,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20713,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20703,"src":"10444:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":20714,"name":"SCALING_FACTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20300,"src":"10453:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10444:23:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10424:43:193"},{"assignments":[20718],"declarations":[{"constant":false,"id":20718,"mutability":"mutable","name":"dust","nameLocation":"10489:4:193","nodeType":"VariableDeclaration","scope":20763,"src":"10481:12:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20717,"name":"uint256","nodeType":"ElementaryTypeName","src":"10481:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20722,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20721,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20719,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20703,"src":"10496:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"id":20720,"name":"SCALING_FACTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20300,"src":"10505:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10496:23:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10481:38:193"},{"assignments":[20724,20726],"declarations":[{"constant":false,"id":20724,"mutability":"mutable","name":"claimed","nameLocation":"10542:7:193","nodeType":"VariableDeclaration","scope":20763,"src":"10534:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20723,"name":"uint256","nodeType":"ElementaryTypeName","src":"10534:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20726,"mutability":"mutable","name":"unclaimed","nameLocation":"10559:9:193","nodeType":"VariableDeclaration","scope":20763,"src":"10551:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20725,"name":"uint256","nodeType":"ElementaryTypeName","src":"10551:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20732,"initialValue":{"arguments":[{"id":20728,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20694,"src":"10586:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20729,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20712,"src":"10594:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20730,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20688,"src":"10605:9:193","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":20727,"name":"_computeClaim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20977,"src":"10572:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$","typeString":"function (address,uint256,bytes calldata) returns (uint256,uint256)"}},"id":20731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10572:43:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_uint256_$_t_uint256_$","typeString":"tuple(uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"10533:82:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20736,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20734,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20724,"src":"10637:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":20735,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20726,"src":"10647:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10637:19:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":20737,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20712,"src":"10660:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10637:32:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":20740,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20712,"src":"10687:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20741,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20724,"src":"10698:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20742,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20726,"src":"10707:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20739,"name":"InvalidClaimSum","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20378,"src":"10671:15:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256,uint256) pure returns (error)"}},"id":20743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10671:46:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20733,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"10629:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20744,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10629:89:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20745,"nodeType":"ExpressionStatement","src":"10629:89:193"},{"expression":{"id":20754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":20746,"name":"rewards","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20318,"src":"10732:7:193","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":20748,"indexExpression":{"id":20747,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20694,"src":"10740:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10732:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20753,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20749,"name":"dust","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20718,"src":"10750:4:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20750,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20726,"src":"10757:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":20751,"name":"SCALING_FACTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20300,"src":"10769:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10757:26:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10750:33:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10732:51:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20755,"nodeType":"ExpressionStatement","src":"10732:51:193"},{"eventCall":{"arguments":[{"id":20757,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20694,"src":"10810:6:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20758,"name":"claimData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20688,"src":"10818:9:193","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"id":20759,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20724,"src":"10829:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20760,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20726,"src":"10838:9:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20756,"name":"Claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20348,"src":"10802:7:193","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,bytes memory,uint256,uint256)"}},"id":20761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10802:46:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20762,"nodeType":"EmitStatement","src":"10797:51:193"}]}}]},"documentation":{"id":20686,"nodeType":"StructuredDocumentation","src":"9946:252:193","text":"@notice Claims the rewards for the sender.\n @dev Emits a {Claimed} event with the staker address, claimData and reward.\n @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts)."},"functionSelector":"c63ff8dd","id":20766,"implemented":true,"kind":"function","modifiers":[{"id":20691,"kind":"modifierInvocation","modifierName":{"id":20690,"name":"nonReentrant","nameLocations":["10259:12:193"],"nodeType":"IdentifierPath","referencedDeclaration":1313,"src":"10259:12:193"},"nodeType":"ModifierInvocation","src":"10259:12:193"}],"name":"claim","nameLocation":"10212:5:193","nodeType":"FunctionDefinition","parameters":{"id":20689,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20688,"mutability":"mutable","name":"claimData","nameLocation":"10233:9:193","nodeType":"VariableDeclaration","scope":20766,"src":"10218:24:193","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20687,"name":"bytes","nodeType":"ElementaryTypeName","src":"10218:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"10217:26:193"},"returnParameters":{"id":20692,"nodeType":"ParameterList","parameters":[],"src":"10272:0:193"},"scope":21014,"src":"10203:662:193","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[21055],"body":{"id":20942,"nodeType":"Block","src":"12033:1975:193","statements":[{"assignments":[20775],"declarations":[{"constant":false,"id":20775,"mutability":"mutable","name":"rewarder","nameLocation":"12051:8:193","nodeType":"VariableDeclaration","scope":20942,"src":"12043:16:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20774,"name":"address","nodeType":"ElementaryTypeName","src":"12043:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":20778,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":20776,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"12062:10:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":20777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12062:12:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"12043:31:193"},{"expression":{"arguments":[{"id":20784,"name":"REWARDER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20298,"src":"12129:13:193","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":20785,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20775,"src":"12144:8:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":20779,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"12084:20:193","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":20781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12105:6:193","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"12084:27:193","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":20782,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12084:29:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":20783,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12114:14:193","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"12084:44:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":20786,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12084:69:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20787,"nodeType":"ExpressionStatement","src":"12084:69:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20791,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20789,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20769,"src":"12172:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20790,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12182:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"12172:11:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20792,"name":"InvalidRewardAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20380,"src":"12185:19:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20793,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12185:21:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20788,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"12164:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20794,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12164:43:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20795,"nodeType":"ExpressionStatement","src":"12164:43:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20799,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20797,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"12225:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":20798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12237:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"12225:13:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20800,"name":"InvalidDuration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20382,"src":"12240:15:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20801,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12240:17:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20796,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"12217:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20802,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12217:41:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20803,"nodeType":"ExpressionStatement","src":"12217:41:193"},{"assignments":[20805,20807],"declarations":[{"constant":false,"id":20805,"mutability":"mutable","name":"success","nameLocation":"12275:7:193","nodeType":"VariableDeclaration","scope":20942,"src":"12270:12:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":20804,"name":"bool","nodeType":"ElementaryTypeName","src":"12270:4:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":20807,"mutability":"mutable","name":"totalReward","nameLocation":"12292:11:193","nodeType":"VariableDeclaration","scope":20942,"src":"12284:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20806,"name":"uint256","nodeType":"ElementaryTypeName","src":"12284:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20812,"initialValue":{"arguments":[{"id":20810,"name":"SCALING_FACTOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20300,"src":"12321:14:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20808,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20769,"src":"12307:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12314:6:193","memberName":"tryMul","nodeType":"MemberAccess","referencedDeclaration":4488,"src":"12307:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$attached_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (bool,uint256)"}},"id":20811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12307:29:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"12269:67:193"},{"expression":{"arguments":[{"id":20814,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20805,"src":"12354:7:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20815,"name":"RewardOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20390,"src":"12363:14:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12363:16:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20813,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"12346:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20817,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12346:34:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20818,"nodeType":"ExpressionStatement","src":"12346:34:193"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":20822,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12413:1:193","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":20821,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12405:7:193","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":20820,"name":"address","nodeType":"ElementaryTypeName","src":"12405:7:193","typeDescriptions":{}}},"id":20823,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12405:10:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":20819,"name":"_updateReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20469,"src":"12391:13:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":20824,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12391:25:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20825,"nodeType":"ExpressionStatement","src":"12391:25:193"},{"assignments":[20827],"declarations":[{"constant":false,"id":20827,"mutability":"mutable","name":"currentDistributionEnd","nameLocation":"12435:22:193","nodeType":"VariableDeclaration","scope":20942,"src":"12427:30:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20826,"name":"uint256","nodeType":"ElementaryTypeName","src":"12427:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20829,"initialValue":{"id":20828,"name":"distributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20310,"src":"12460:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12427:48:193"},{"assignments":[20831],"declarations":[{"constant":false,"id":20831,"mutability":"mutable","name":"newDisrtibutionEnd","nameLocation":"12493:18:193","nodeType":"VariableDeclaration","scope":20942,"src":"12485:26:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20830,"name":"uint256","nodeType":"ElementaryTypeName","src":"12485:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20836,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20832,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"12514:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20833,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12520:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"12514:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":20834,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"12532:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12514:26:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12485:55:193"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":20837,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"12555:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20838,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12561:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"12555:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":20839,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20827,"src":"12574:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12555:41:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":20924,"nodeType":"Block","src":"12753:1109:193","statements":[{"assignments":[20853],"declarations":[{"constant":false,"id":20853,"mutability":"mutable","name":"currentRewardRate","nameLocation":"12775:17:193","nodeType":"VariableDeclaration","scope":20924,"src":"12767:25:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20852,"name":"uint256","nodeType":"ElementaryTypeName","src":"12767:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20855,"initialValue":{"id":20854,"name":"rewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20306,"src":"12795:10:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12767:38:193"},{"assignments":[20857],"declarations":[{"constant":false,"id":20857,"mutability":"mutable","name":"remainingReward","nameLocation":"12827:15:193","nodeType":"VariableDeclaration","scope":20924,"src":"12819:23:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20856,"name":"uint256","nodeType":"ElementaryTypeName","src":"12819:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20865,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20864,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20858,"name":"currentRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20853,"src":"12845:17:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20862,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20859,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20827,"src":"12866:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"id":20860,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"12891:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12897:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"12891:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12866:40:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20863,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"12865:42:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12845:62:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12819:88:193"},{"expression":{"id":20873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"components":[{"id":20866,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20805,"src":"12922:7:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":20867,"name":"totalReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20807,"src":"12931:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":20868,"isConstant":false,"isInlineArray":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"TupleExpression","src":"12921:22:193","typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":20871,"name":"remainingReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20857,"src":"12965:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":20869,"name":"totalReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20807,"src":"12946:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12958:6:193","memberName":"tryAdd","nodeType":"MemberAccess","referencedDeclaration":4423,"src":"12946:18:193","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$attached_to$_t_uint256_$","typeString":"function (uint256,uint256) pure returns (bool,uint256)"}},"id":20872,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12946:35:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"src":"12921:60:193","typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20874,"nodeType":"ExpressionStatement","src":"12921:60:193"},{"expression":{"arguments":[{"id":20876,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20805,"src":"13003:7:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":20877,"name":"RewardOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20390,"src":"13012:14:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":20878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13012:16:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20875,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"12995:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20879,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12995:34:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20880,"nodeType":"ExpressionStatement","src":"12995:34:193"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20883,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20881,"name":"newDisrtibutionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20831,"src":"13048:18:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":20882,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20827,"src":"13070:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13048:44:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":20922,"nodeType":"Block","src":"13400:452:193","statements":[{"assignments":[20899],"declarations":[{"constant":false,"id":20899,"mutability":"mutable","name":"newRewardRate","nameLocation":"13590:13:193","nodeType":"VariableDeclaration","scope":20922,"src":"13582:21:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20898,"name":"uint256","nodeType":"ElementaryTypeName","src":"13582:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":20903,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20902,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20900,"name":"totalReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20807,"src":"13606:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":20901,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"13620:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13606:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13582:46:193"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20905,"name":"newRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20899,"src":"13654:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":20906,"name":"currentRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20853,"src":"13671:17:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13654:34:193","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":20909,"name":"currentRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20853,"src":"13705:17:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20910,"name":"newRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20899,"src":"13724:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20908,"name":"RewardDilution","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20388,"src":"13690:14:193","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":20911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13690:48:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":20904,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"13646:7:193","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":20912,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13646:93:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20913,"nodeType":"ExpressionStatement","src":"13646:93:193"},{"expression":{"id":20916,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20914,"name":"rewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20306,"src":"13757:10:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20915,"name":"newRewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20899,"src":"13770:13:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13757:26:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20917,"nodeType":"ExpressionStatement","src":"13757:26:193"},{"expression":{"id":20920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20918,"name":"distributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20310,"src":"13801:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20919,"name":"newDisrtibutionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20831,"src":"13819:18:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13801:36:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20921,"nodeType":"ExpressionStatement","src":"13801:36:193"}]},"id":20923,"nodeType":"IfStatement","src":"13044:808:193","trueBody":{"id":20897,"nodeType":"Block","src":"13094:300:193","statements":[{"expression":{"id":20889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20884,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"13275:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20888,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20885,"name":"currentDistributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20827,"src":"13286:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"expression":{"id":20886,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"13311:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20887,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13317:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"13311:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13286:40:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13275:51:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20890,"nodeType":"ExpressionStatement","src":"13275:51:193"},{"expression":{"id":20895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20891,"name":"rewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20306,"src":"13344:10:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20892,"name":"totalReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20807,"src":"13357:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":20893,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"13371:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13357:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13344:35:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20896,"nodeType":"ExpressionStatement","src":"13344:35:193"}]}}]},"id":20925,"nodeType":"IfStatement","src":"12551:1311:193","trueBody":{"id":20851,"nodeType":"Block","src":"12598:149:193","statements":[{"expression":{"id":20845,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20841,"name":"rewardRate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20306,"src":"12651:10:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":20844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":20842,"name":"totalReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20807,"src":"12664:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":20843,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"12678:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12664:22:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12651:35:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20846,"nodeType":"ExpressionStatement","src":"12651:35:193"},{"expression":{"id":20849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20847,"name":"distributionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20310,"src":"12700:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":20848,"name":"newDisrtibutionEnd","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20831,"src":"12718:18:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12700:36:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20850,"nodeType":"ExpressionStatement","src":"12700:36:193"}]}},{"expression":{"id":20929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":20926,"name":"lastUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20304,"src":"13871:11:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":20927,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"13885:5:193","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":20928,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13891:9:193","memberName":"timestamp","nodeType":"MemberAccess","src":"13885:15:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13871:29:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":20930,"nodeType":"ExpressionStatement","src":"13871:29:193"},{"expression":{"arguments":[{"id":20932,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20775,"src":"13929:8:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20933,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20769,"src":"13939:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20931,"name":"_computeAddReward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20985,"src":"13911:17:193","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":20934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13911:35:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20935,"nodeType":"ExpressionStatement","src":"13911:35:193"},{"eventCall":{"arguments":[{"id":20937,"name":"rewarder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20775,"src":"13974:8:193","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":20938,"name":"reward","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20769,"src":"13984:6:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":20939,"name":"duration","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20771,"src":"13992:8:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":20936,"name":"RewardAdded","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20356,"src":"13962:11:193","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,uint256,uint256)"}},"id":20940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13962:39:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":20941,"nodeType":"EmitStatement","src":"13957:44:193"}]},"documentation":{"id":20767,"nodeType":"StructuredDocumentation","src":"10871:1081:193","text":"@notice Adds rewards to the pool.\n @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\n @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\n @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\n @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\n @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\n @dev Reverts with {InvalidDuration} if the duration is 0.\n @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\n @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\n @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\n @param reward The amount of rewards to be added.\n @param duration The duration of the rewards distribution."},"functionSelector":"75c93bb9","id":20943,"implemented":true,"kind":"function","modifiers":[],"name":"addReward","nameLocation":"11966:9:193","nodeType":"FunctionDefinition","parameters":{"id":20772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20769,"mutability":"mutable","name":"reward","nameLocation":"11984:6:193","nodeType":"VariableDeclaration","scope":20943,"src":"11976:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20768,"name":"uint256","nodeType":"ElementaryTypeName","src":"11976:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20771,"mutability":"mutable","name":"duration","nameLocation":"12000:8:193","nodeType":"VariableDeclaration","scope":20943,"src":"11992:16:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20770,"name":"uint256","nodeType":"ElementaryTypeName","src":"11992:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11975:34:193"},"returnParameters":{"id":20773,"nodeType":"ParameterList","parameters":[],"src":"12033:0:193"},"scope":21014,"src":"11957:2051:193","stateMutability":"payable","virtual":true,"visibility":"public"},{"documentation":{"id":20944,"nodeType":"StructuredDocumentation","src":"14014:462:193","text":"@notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\n @notice Computes the amount of stake points for the sender based on the stakeData.\n @param sender The address of the sender.\n @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\n @return stakePoints The amount of stake points computed from the stakeData."},"id":20953,"implemented":false,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"14490:13:193","nodeType":"FunctionDefinition","parameters":{"id":20949,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20946,"mutability":"mutable","name":"sender","nameLocation":"14512:6:193","nodeType":"VariableDeclaration","scope":20953,"src":"14504:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20945,"name":"address","nodeType":"ElementaryTypeName","src":"14504:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20948,"mutability":"mutable","name":"stakeData","nameLocation":"14533:9:193","nodeType":"VariableDeclaration","scope":20953,"src":"14520:22:193","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20947,"name":"bytes","nodeType":"ElementaryTypeName","src":"14520:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"14503:40:193"},"returnParameters":{"id":20952,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20951,"mutability":"mutable","name":"stakePoints","nameLocation":"14578:11:193","nodeType":"VariableDeclaration","scope":20953,"src":"14570:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20950,"name":"uint256","nodeType":"ElementaryTypeName","src":"14570:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"14569:21:193"},"scope":21014,"src":"14481:110:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"documentation":{"id":20954,"nodeType":"StructuredDocumentation","src":"14597:481:193","text":"@notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\n @notice Computes the amount of stake points for the sender based on the withdrawData.\n @param sender The address of the sender.\n @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\n @return stakePoints The amount of stake points computed from the withdrawData."},"id":20963,"implemented":false,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"15092:16:193","nodeType":"FunctionDefinition","parameters":{"id":20959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20956,"mutability":"mutable","name":"sender","nameLocation":"15117:6:193","nodeType":"VariableDeclaration","scope":20963,"src":"15109:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20955,"name":"address","nodeType":"ElementaryTypeName","src":"15109:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20958,"mutability":"mutable","name":"withdrawData","nameLocation":"15138:12:193","nodeType":"VariableDeclaration","scope":20963,"src":"15125:25:193","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":20957,"name":"bytes","nodeType":"ElementaryTypeName","src":"15125:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"15108:43:193"},"returnParameters":{"id":20962,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20961,"mutability":"mutable","name":"stakePoints","nameLocation":"15186:11:193","nodeType":"VariableDeclaration","scope":20963,"src":"15178:19:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20960,"name":"uint256","nodeType":"ElementaryTypeName","src":"15178:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15177:21:193"},"scope":21014,"src":"15083:116:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"documentation":{"id":20964,"nodeType":"StructuredDocumentation","src":"15205:461:193","text":"@notice Performs a claim, for examples by transferring reward tokens to the sender.\n @param sender The address of the sender.\n @param claimable The amount of rewards which can be claimed.\n @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\n @return claimed The amount of rewards that was claimed.\n @return unclaimed The amount of rewards that was not claimed."},"id":20977,"implemented":false,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"15680:13:193","nodeType":"FunctionDefinition","parameters":{"id":20971,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20966,"mutability":"mutable","name":"sender","nameLocation":"15702:6:193","nodeType":"VariableDeclaration","scope":20977,"src":"15694:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20965,"name":"address","nodeType":"ElementaryTypeName","src":"15694:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20968,"mutability":"mutable","name":"claimable","nameLocation":"15718:9:193","nodeType":"VariableDeclaration","scope":20977,"src":"15710:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20967,"name":"uint256","nodeType":"ElementaryTypeName","src":"15710:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20970,"mutability":"mutable","name":"claimData","nameLocation":"15744:9:193","nodeType":"VariableDeclaration","scope":20977,"src":"15729:24:193","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20969,"name":"bytes","nodeType":"ElementaryTypeName","src":"15729:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"15693:61:193"},"returnParameters":{"id":20976,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20973,"mutability":"mutable","name":"claimed","nameLocation":"15789:7:193","nodeType":"VariableDeclaration","scope":20977,"src":"15781:15:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20972,"name":"uint256","nodeType":"ElementaryTypeName","src":"15781:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":20975,"mutability":"mutable","name":"unclaimed","nameLocation":"15806:9:193","nodeType":"VariableDeclaration","scope":20977,"src":"15798:17:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20974,"name":"uint256","nodeType":"ElementaryTypeName","src":"15798:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15780:36:193"},"scope":21014,"src":"15671:146:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"documentation":{"id":20978,"nodeType":"StructuredDocumentation","src":"15823:220:193","text":"@notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\n @param sender The address of the sender.\n @param reward The amount of rewards to be added."},"id":20985,"implemented":false,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"16057:17:193","nodeType":"FunctionDefinition","parameters":{"id":20983,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20980,"mutability":"mutable","name":"sender","nameLocation":"16083:6:193","nodeType":"VariableDeclaration","scope":20985,"src":"16075:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20979,"name":"address","nodeType":"ElementaryTypeName","src":"16075:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":20982,"mutability":"mutable","name":"reward","nameLocation":"16099:6:193","nodeType":"VariableDeclaration","scope":20985,"src":"16091:14:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":20981,"name":"uint256","nodeType":"ElementaryTypeName","src":"16091:7:193","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"16074:32:193"},"returnParameters":{"id":20984,"nodeType":"ParameterList","parameters":[],"src":"16123:0:193"},"scope":21014,"src":"16048:76:193","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[1188,13231],"body":{"id":20998,"nodeType":"Block","src":"16289:65:193","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":20994,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"16306:28:193","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":20995,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16335:10:193","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"16306:39:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":20996,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16306:41:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":20993,"id":20997,"nodeType":"Return","src":"16299:48:193"}]},"documentation":{"id":20986,"nodeType":"StructuredDocumentation","src":"16130:44:193","text":"@inheritdoc ForwarderRegistryContextBase"},"id":20999,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"16188:10:193","nodeType":"FunctionDefinition","overrides":{"id":20990,"nodeType":"OverrideSpecifier","overrides":[{"id":20988,"name":"Context","nameLocations":["16232:7:193"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"16232:7:193"},{"id":20989,"name":"ForwarderRegistryContextBase","nameLocations":["16241:28:193"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"16241:28:193"}],"src":"16223:47:193"},"parameters":{"id":20987,"nodeType":"ParameterList","parameters":[],"src":"16198:2:193"},"returnParameters":{"id":20993,"nodeType":"ParameterList","parameters":[{"constant":false,"id":20992,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":20999,"src":"16280:7:193","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20991,"name":"address","nodeType":"ElementaryTypeName","src":"16280:7:193","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"16279:9:193"},"scope":21014,"src":"16179:175:193","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":21012,"nodeType":"Block","src":"16524:63:193","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":21008,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"16541:28:193","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":21009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16570:8:193","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"16541:37:193","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":21010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16541:39:193","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":21007,"id":21011,"nodeType":"Return","src":"16534:46:193"}]},"documentation":{"id":21000,"nodeType":"StructuredDocumentation","src":"16360:44:193","text":"@inheritdoc ForwarderRegistryContextBase"},"id":21013,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"16418:8:193","nodeType":"FunctionDefinition","overrides":{"id":21004,"nodeType":"OverrideSpecifier","overrides":[{"id":21002,"name":"Context","nameLocations":["16460:7:193"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"16460:7:193"},{"id":21003,"name":"ForwarderRegistryContextBase","nameLocations":["16469:28:193"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"16469:28:193"}],"src":"16451:47:193"},"parameters":{"id":21001,"nodeType":"ParameterList","parameters":[],"src":"16426:2:193"},"returnParameters":{"id":21007,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21006,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21013,"src":"16508:14:193","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21005,"name":"bytes","nodeType":"ElementaryTypeName","src":"16508:5:193","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"16507:16:193"},"scope":21014,"src":"16409:178:193","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":21015,"src":"1666:14923:193","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390],"usedEvents":[8269,8278,8287,20330,20338,20348,20356]}],"src":"32:16558:193"},"id":193},"contracts/staking/linear/interfaces/ILinearPool.sol":{"ast":{"absolutePath":"contracts/staking/linear/interfaces/ILinearPool.sol","exportedSymbols":{"ILinearPool":[21056]},"id":21057,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":21016,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:194"},{"abstract":false,"baseContracts":[],"canonicalName":"ILinearPool","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":21056,"linearizedBaseContracts":[21056],"name":"ILinearPool","nameLocation":"67:11:194","nodeType":"ContractDefinition","nodes":[{"functionSelector":"80faa57d","id":21021,"implemented":false,"kind":"function","modifiers":[],"name":"lastTimeRewardApplicable","nameLocation":"94:24:194","nodeType":"FunctionDefinition","parameters":{"id":21017,"nodeType":"ParameterList","parameters":[],"src":"118:2:194"},"returnParameters":{"id":21020,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21019,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21021,"src":"144:7:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21018,"name":"uint256","nodeType":"ElementaryTypeName","src":"144:7:194","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"143:9:194"},"scope":21056,"src":"85:68:194","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"2c9d0b80","id":21026,"implemented":false,"kind":"function","modifiers":[],"name":"rewardPerStakePoint","nameLocation":"168:19:194","nodeType":"FunctionDefinition","parameters":{"id":21022,"nodeType":"ParameterList","parameters":[],"src":"187:2:194"},"returnParameters":{"id":21025,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21024,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21026,"src":"213:7:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21023,"name":"uint256","nodeType":"ElementaryTypeName","src":"213:7:194","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"212:9:194"},"scope":21056,"src":"159:63:194","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"008cc262","id":21033,"implemented":false,"kind":"function","modifiers":[],"name":"earned","nameLocation":"237:6:194","nodeType":"FunctionDefinition","parameters":{"id":21029,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21028,"mutability":"mutable","name":"account","nameLocation":"252:7:194","nodeType":"VariableDeclaration","scope":21033,"src":"244:15:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21027,"name":"address","nodeType":"ElementaryTypeName","src":"244:7:194","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"243:17:194"},"returnParameters":{"id":21032,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21031,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21033,"src":"284:7:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21030,"name":"uint256","nodeType":"ElementaryTypeName","src":"284:7:194","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"283:9:194"},"scope":21056,"src":"228:65:194","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"2d1e0c02","id":21038,"implemented":false,"kind":"function","modifiers":[],"name":"stake","nameLocation":"308:5:194","nodeType":"FunctionDefinition","parameters":{"id":21036,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21035,"mutability":"mutable","name":"stakeData","nameLocation":"329:9:194","nodeType":"VariableDeclaration","scope":21038,"src":"314:24:194","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21034,"name":"bytes","nodeType":"ElementaryTypeName","src":"314:5:194","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"313:26:194"},"returnParameters":{"id":21037,"nodeType":"ParameterList","parameters":[],"src":"356:0:194"},"scope":21056,"src":"299:58:194","stateMutability":"payable","virtual":false,"visibility":"external"},{"functionSelector":"0968f264","id":21043,"implemented":false,"kind":"function","modifiers":[],"name":"withdraw","nameLocation":"372:8:194","nodeType":"FunctionDefinition","parameters":{"id":21041,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21040,"mutability":"mutable","name":"withdrawData","nameLocation":"396:12:194","nodeType":"VariableDeclaration","scope":21043,"src":"381:27:194","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21039,"name":"bytes","nodeType":"ElementaryTypeName","src":"381:5:194","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"380:29:194"},"returnParameters":{"id":21042,"nodeType":"ParameterList","parameters":[],"src":"418:0:194"},"scope":21056,"src":"363:56:194","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"c63ff8dd","id":21048,"implemented":false,"kind":"function","modifiers":[],"name":"claim","nameLocation":"434:5:194","nodeType":"FunctionDefinition","parameters":{"id":21046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21045,"mutability":"mutable","name":"claimData","nameLocation":"455:9:194","nodeType":"VariableDeclaration","scope":21048,"src":"440:24:194","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21044,"name":"bytes","nodeType":"ElementaryTypeName","src":"440:5:194","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"439:26:194"},"returnParameters":{"id":21047,"nodeType":"ParameterList","parameters":[],"src":"474:0:194"},"scope":21056,"src":"425:50:194","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"75c93bb9","id":21055,"implemented":false,"kind":"function","modifiers":[],"name":"addReward","nameLocation":"490:9:194","nodeType":"FunctionDefinition","parameters":{"id":21053,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21050,"mutability":"mutable","name":"reward","nameLocation":"508:6:194","nodeType":"VariableDeclaration","scope":21055,"src":"500:14:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21049,"name":"uint256","nodeType":"ElementaryTypeName","src":"500:7:194","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21052,"mutability":"mutable","name":"duration","nameLocation":"524:8:194","nodeType":"VariableDeclaration","scope":21055,"src":"516:16:194","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21051,"name":"uint256","nodeType":"ElementaryTypeName","src":"516:7:194","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"499:34:194"},"returnParameters":{"id":21054,"nodeType":"ParameterList","parameters":[],"src":"550:0:194"},"scope":21056,"src":"481:70:194","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":21057,"src":"57:496:194","usedErrors":[],"usedEvents":[]}],"src":"32:522:194"},"id":194},"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol":{"ast":{"absolutePath":"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol","exportedSymbols":{"ContractOwnership":[7934],"ContractOwnershipStorage":[9109],"IERC20":[452],"LinearPool_ERC20Rewards":[21177],"SafeERC20":[916]},"id":21178,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":21058,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:195"},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":21060,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21178,"sourceUnit":7935,"src":"57:74:195","symbolAliases":[{"foreign":{"id":21059,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"65:17:195","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../access/libraries/ContractOwnershipStorage.sol","id":21062,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21178,"sourceUnit":9110,"src":"132:98:195","symbolAliases":[{"foreign":{"id":21061,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"140:24:195","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":21065,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21178,"sourceUnit":917,"src":"231:90:195","symbolAliases":[{"foreign":{"id":21063,"name":"SafeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":916,"src":"239:9:195","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":21064,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"250:6:195","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":21067,"name":"ContractOwnership","nameLocations":["525:17:195"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"525:17:195"},"id":21068,"nodeType":"InheritanceSpecifier","src":"525:17:195"}],"canonicalName":"LinearPool_ERC20Rewards","contractDependencies":[],"contractKind":"contract","documentation":{"id":21066,"nodeType":"StructuredDocumentation","src":"323:105:195","text":"@title LinearPool_ERC20Rewards\n @notice A linear pool that allows for ERC20 rewards distribution."},"fullyImplemented":true,"id":21177,"linearizedBaseContracts":[21177,7934,11554,11579,8139,1206,8562],"name":"LinearPool_ERC20Rewards","nameLocation":"498:23:195","nodeType":"ContractDefinition","nodes":[{"global":false,"id":21072,"libraryName":{"id":21069,"name":"SafeERC20","nameLocations":["555:9:195"],"nodeType":"IdentifierPath","referencedDeclaration":916,"src":"555:9:195"},"nodeType":"UsingForDirective","src":"549:27:195","typeName":{"id":21071,"nodeType":"UserDefinedTypeName","pathNode":{"id":21070,"name":"IERC20","nameLocations":["569:6:195"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"569:6:195"},"referencedDeclaration":452,"src":"569:6:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}},{"global":false,"id":21076,"libraryName":{"id":21073,"name":"ContractOwnershipStorage","nameLocations":["587:24:195"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"587:24:195"},"nodeType":"UsingForDirective","src":"581:67:195","typeName":{"id":21075,"nodeType":"UserDefinedTypeName","pathNode":{"id":21074,"name":"ContractOwnershipStorage.Layout","nameLocations":["616:24:195","641:6:195"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"616:31:195"},"referencedDeclaration":8882,"src":"616:31:195","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"constant":false,"functionSelector":"99248ea7","id":21079,"mutability":"immutable","name":"REWARD_TOKEN","nameLocation":"678:12:195","nodeType":"VariableDeclaration","scope":21177,"src":"654:36:195","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":21078,"nodeType":"UserDefinedTypeName","pathNode":{"id":21077,"name":"IERC20","nameLocations":["654:6:195"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"654:6:195"},"referencedDeclaration":452,"src":"654:6:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"public"},{"constant":false,"functionSelector":"569c93d2","id":21081,"mutability":"mutable","name":"rewardHolder","nameLocation":"712:12:195","nodeType":"VariableDeclaration","scope":21177,"src":"697:27:195","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21080,"name":"address","nodeType":"ElementaryTypeName","src":"697:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"anonymous":false,"eventSelector":"92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d29","id":21085,"name":"RewardHolderSet","nameLocation":"737:15:195","nodeType":"EventDefinition","parameters":{"id":21084,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21083,"indexed":true,"mutability":"mutable","name":"rewardHolder","nameLocation":"769:12:195","nodeType":"VariableDeclaration","scope":21085,"src":"753:28:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21082,"name":"address","nodeType":"ElementaryTypeName","src":"753:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"752:30:195"},"src":"731:52:195"},{"body":{"id":21106,"nodeType":"Block","src":"1055:126:195","statements":[{"expression":{"id":21096,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21094,"name":"REWARD_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21079,"src":"1065:12:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21095,"name":"rewardToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21089,"src":"1080:11:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"src":"1065:26:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21097,"nodeType":"ExpressionStatement","src":"1065:26:195"},{"expression":{"id":21100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21098,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21081,"src":"1101:12:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21099,"name":"rewardHolder_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21091,"src":"1116:13:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1101:28:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":21101,"nodeType":"ExpressionStatement","src":"1101:28:195"},{"eventCall":{"arguments":[{"id":21103,"name":"rewardHolder_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21091,"src":"1160:13:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":21102,"name":"RewardHolderSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21085,"src":"1144:15:195","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":21104,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1144:30:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21105,"nodeType":"EmitStatement","src":"1139:35:195"}]},"documentation":{"id":21086,"nodeType":"StructuredDocumentation","src":"789:206:195","text":"@dev Emits a {RewardHolderSet} event with the initial reward holder address.\n @param rewardToken The ERC20 token used for rewards.\n @param rewardHolder_ The address that holds the rewards."},"id":21107,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":21092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21089,"mutability":"mutable","name":"rewardToken","nameLocation":"1019:11:195","nodeType":"VariableDeclaration","scope":21107,"src":"1012:18:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":21088,"nodeType":"UserDefinedTypeName","pathNode":{"id":21087,"name":"IERC20","nameLocations":["1012:6:195"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"1012:6:195"},"referencedDeclaration":452,"src":"1012:6:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":21091,"mutability":"mutable","name":"rewardHolder_","nameLocation":"1040:13:195","nodeType":"VariableDeclaration","scope":21107,"src":"1032:21:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21090,"name":"address","nodeType":"ElementaryTypeName","src":"1032:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1011:43:195"},"returnParameters":{"id":21093,"nodeType":"ParameterList","parameters":[],"src":"1055:0:195"},"scope":21177,"src":"1000:181:195","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":21135,"nodeType":"Block","src":"1527:233:195","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":21118,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1594:10:195","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":21119,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1594:12:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":21113,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1537:24:195","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":21115,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1562:6:195","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1537:31:195","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":21116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1537:33:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":21117,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1571:22:195","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1537:56:195","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":21120,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1537:70:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21121,"nodeType":"ExpressionStatement","src":"1537:70:195"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21124,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21122,"name":"rewardHolder_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21110,"src":"1621:13:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":21123,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21081,"src":"1638:12:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1621:29:195","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21134,"nodeType":"IfStatement","src":"1617:137:195","trueBody":{"id":21133,"nodeType":"Block","src":"1652:102:195","statements":[{"expression":{"id":21127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21125,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21081,"src":"1666:12:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21126,"name":"rewardHolder_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21110,"src":"1681:13:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1666:28:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":21128,"nodeType":"ExpressionStatement","src":"1666:28:195"},{"eventCall":{"arguments":[{"id":21130,"name":"rewardHolder_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21110,"src":"1729:13:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":21129,"name":"RewardHolderSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21085,"src":"1713:15:195","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":21131,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1713:30:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21132,"nodeType":"EmitStatement","src":"1708:35:195"}]}}]},"documentation":{"id":21108,"nodeType":"StructuredDocumentation","src":"1187:278:195","text":"@notice Sets the reward holder address.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\n @param rewardHolder_ The address of the reward holder."},"functionSelector":"6806cc93","id":21136,"implemented":true,"kind":"function","modifiers":[],"name":"setRewardHolder","nameLocation":"1479:15:195","nodeType":"FunctionDefinition","parameters":{"id":21111,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21110,"mutability":"mutable","name":"rewardHolder_","nameLocation":"1503:13:195","nodeType":"VariableDeclaration","scope":21136,"src":"1495:21:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21109,"name":"address","nodeType":"ElementaryTypeName","src":"1495:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1494:23:195"},"returnParameters":{"id":21112,"nodeType":"ParameterList","parameters":[],"src":"1527:0:195"},"scope":21177,"src":"1470:290:195","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":21166,"nodeType":"Block","src":"2304:131:195","statements":[{"expression":{"id":21152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21150,"name":"claimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21146,"src":"2314:7:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21151,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21141,"src":"2324:9:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2314:19:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21153,"nodeType":"ExpressionStatement","src":"2314:19:195"},{"expression":{"id":21156,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21154,"name":"unclaimed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21148,"src":"2343:9:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":21155,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2355:1:195","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2343:13:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21157,"nodeType":"ExpressionStatement","src":"2343:13:195"},{"expression":{"arguments":[{"id":21161,"name":"rewardHolder","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21081,"src":"2396:12:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21162,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21139,"src":"2410:6:195","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21163,"name":"claimable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21141,"src":"2418:9:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":21158,"name":"REWARD_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21079,"src":"2366:12:195","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2379:16:195","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":524,"src":"2366:29:195","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IERC20_$452_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":21164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2366:62:195","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21165,"nodeType":"ExpressionStatement","src":"2366:62:195"}]},"documentation":{"id":21137,"nodeType":"StructuredDocumentation","src":"1766:397:195","text":"@notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\n @param staker The address of the staker.\n @param claimable The amount of REWARD_TOKEN to be transferred.\n @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\n @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0."},"id":21167,"implemented":true,"kind":"function","modifiers":[],"name":"_computeClaim","nameLocation":"2177:13:195","nodeType":"FunctionDefinition","parameters":{"id":21144,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21139,"mutability":"mutable","name":"staker","nameLocation":"2199:6:195","nodeType":"VariableDeclaration","scope":21167,"src":"2191:14:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21138,"name":"address","nodeType":"ElementaryTypeName","src":"2191:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21141,"mutability":"mutable","name":"claimable","nameLocation":"2215:9:195","nodeType":"VariableDeclaration","scope":21167,"src":"2207:17:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21140,"name":"uint256","nodeType":"ElementaryTypeName","src":"2207:7:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21143,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21167,"src":"2226:14:195","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21142,"name":"bytes","nodeType":"ElementaryTypeName","src":"2226:5:195","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2190:51:195"},"returnParameters":{"id":21149,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21146,"mutability":"mutable","name":"claimed","nameLocation":"2276:7:195","nodeType":"VariableDeclaration","scope":21167,"src":"2268:15:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21145,"name":"uint256","nodeType":"ElementaryTypeName","src":"2268:7:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21148,"mutability":"mutable","name":"unclaimed","nameLocation":"2293:9:195","nodeType":"VariableDeclaration","scope":21167,"src":"2285:17:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21147,"name":"uint256","nodeType":"ElementaryTypeName","src":"2285:7:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2267:36:195"},"scope":21177,"src":"2168:267:195","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":21175,"nodeType":"Block","src":"2655:2:195","statements":[]},"documentation":{"id":21168,"nodeType":"StructuredDocumentation","src":"2441:147:195","text":"@notice Computes the reward for a staker.\n @dev This function is empty since the rewards do not need to be transferred to this contract."},"id":21176,"implemented":true,"kind":"function","modifiers":[],"name":"_computeAddReward","nameLocation":"2602:17:195","nodeType":"FunctionDefinition","parameters":{"id":21173,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21170,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21176,"src":"2620:7:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21169,"name":"address","nodeType":"ElementaryTypeName","src":"2620:7:195","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21172,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21176,"src":"2629:7:195","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21171,"name":"uint256","nodeType":"ElementaryTypeName","src":"2629:7:195","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2619:18:195"},"returnParameters":{"id":21174,"nodeType":"ParameterList","parameters":[],"src":"2655:0:195"},"scope":21177,"src":"2593:64:195","stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"scope":21178,"src":"480:2179:195","usedErrors":[8246,11559],"usedEvents":[8287,21085]}],"src":"32:2628:195"},"id":195},"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol":{"ast":{"absolutePath":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol","exportedSymbols":{"ERC1155StakingLinearPool":[21774],"ERC1155TokenReceiver":[22724],"IERC1155":[24178],"IForwarderRegistry":[13386],"InconsistentArrayLengths":[7886],"LinearPool":[21014]},"id":21775,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":21179,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:196"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../LinearPool.sol","id":21181,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21775,"sourceUnit":21015,"src":"57:47:196","symbolAliases":[{"foreign":{"id":21180,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:196","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155TokenReceiver.sol","file":"./../../../token/ERC1155/ERC1155TokenReceiver.sol","id":21183,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21775,"sourceUnit":22725,"src":"105:87:196","symbolAliases":[{"foreign":{"id":21182,"name":"ERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22724,"src":"113:20:196","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","file":"./../../../token/ERC1155/interfaces/IERC1155.sol","id":21185,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21775,"sourceUnit":24179,"src":"193:74:196","symbolAliases":[{"foreign":{"id":21184,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"201:8:196","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":21187,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21775,"sourceUnit":13387,"src":"268:87:196","symbolAliases":[{"foreign":{"id":21186,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"276:18:196","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../../CommonErrors.sol","id":21189,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":21775,"sourceUnit":7890,"src":"356:69:196","symbolAliases":[{"foreign":{"id":21188,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"364:24:196","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":21191,"name":"LinearPool","nameLocations":["574:10:196"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"574:10:196"},"id":21192,"nodeType":"InheritanceSpecifier","src":"574:10:196"},{"baseName":{"id":21193,"name":"ERC1155TokenReceiver","nameLocations":["586:20:196"],"nodeType":"IdentifierPath","referencedDeclaration":22724,"src":"586:20:196"},"id":21194,"nodeType":"InheritanceSpecifier","src":"586:20:196"}],"canonicalName":"ERC1155StakingLinearPool","contractDependencies":[],"contractKind":"contract","documentation":{"id":21190,"nodeType":"StructuredDocumentation","src":"427:101:196","text":"@title ERC1155StakingLinearPool\n @notice A linear pool that allows staking of ERC1155 tokens."},"fullyImplemented":false,"id":21774,"linearizedBaseContracts":[21774,22724,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,24324,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC1155StakingLinearPool","nameLocation":"546:24:196","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"0479d644","id":21197,"mutability":"immutable","name":"STAKING_TOKEN","nameLocation":"639:13:196","nodeType":"VariableDeclaration","scope":21774,"src":"613:39:196","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"},"typeName":{"id":21196,"nodeType":"UserDefinedTypeName","pathNode":{"id":21195,"name":"IERC1155","nameLocations":["613:8:196"],"nodeType":"IdentifierPath","referencedDeclaration":24178,"src":"613:8:196"},"referencedDeclaration":24178,"src":"613:8:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"visibility":"public"},{"constant":false,"functionSelector":"cbf1304d","id":21203,"mutability":"mutable","name":"balances","nameLocation":"731:8:196","nodeType":"VariableDeclaration","scope":21774,"src":"659:80:196","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"},"typeName":{"id":21202,"keyName":"staker","keyNameLocation":"675:6:196","keyType":{"id":21198,"name":"address","nodeType":"ElementaryTypeName","src":"667:7:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"659:64:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":21201,"keyName":"id","keyNameLocation":"701:2:196","keyType":{"id":21199,"name":"uint256","nodeType":"ElementaryTypeName","src":"693:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"685:37:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"},"valueName":"amount","valueNameLocation":"715:6:196","valueType":{"id":21200,"name":"uint256","nodeType":"ElementaryTypeName","src":"707:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"errorSelector":"c1ab6dc1","id":21205,"name":"InvalidToken","nameLocation":"752:12:196","nodeType":"ErrorDefinition","parameters":{"id":21204,"nodeType":"ParameterList","parameters":[],"src":"764:2:196"},"src":"746:21:196"},{"errorSelector":"86301c82","id":21215,"name":"NotEnoughBalance","nameLocation":"778:16:196","nodeType":"ErrorDefinition","parameters":{"id":21214,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21207,"mutability":"mutable","name":"staker","nameLocation":"803:6:196","nodeType":"VariableDeclaration","scope":21215,"src":"795:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21206,"name":"address","nodeType":"ElementaryTypeName","src":"795:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21209,"mutability":"mutable","name":"id","nameLocation":"819:2:196","nodeType":"VariableDeclaration","scope":21215,"src":"811:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21208,"name":"uint256","nodeType":"ElementaryTypeName","src":"811:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21211,"mutability":"mutable","name":"amount","nameLocation":"831:6:196","nodeType":"VariableDeclaration","scope":21215,"src":"823:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21210,"name":"uint256","nodeType":"ElementaryTypeName","src":"823:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21213,"mutability":"mutable","name":"balance","nameLocation":"847:7:196","nodeType":"VariableDeclaration","scope":21215,"src":"839:15:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21212,"name":"uint256","nodeType":"ElementaryTypeName","src":"839:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"794:61:196"},"src":"772:84:196"},{"body":{"id":21234,"nodeType":"Block","src":"1047:45:196","statements":[{"expression":{"id":21232,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21230,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"1057:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21231,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21218,"src":"1073:12:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"src":"1057:28:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"id":21233,"nodeType":"ExpressionStatement","src":"1057:28:196"}]},"id":21235,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":21226,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21220,"src":"1005:21:196","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":21227,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21223,"src":"1028:17:196","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":21228,"kind":"baseConstructorSpecifier","modifierName":{"id":21225,"name":"LinearPool","nameLocations":["994:10:196"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"994:10:196"},"nodeType":"ModifierInvocation","src":"994:52:196"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":21224,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21218,"mutability":"mutable","name":"stakingToken","nameLocation":"892:12:196","nodeType":"VariableDeclaration","scope":21235,"src":"883:21:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"},"typeName":{"id":21217,"nodeType":"UserDefinedTypeName","pathNode":{"id":21216,"name":"IERC1155","nameLocations":["883:8:196"],"nodeType":"IdentifierPath","referencedDeclaration":24178,"src":"883:8:196"},"referencedDeclaration":24178,"src":"883:8:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"visibility":"internal"},{"constant":false,"id":21220,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"920:21:196","nodeType":"VariableDeclaration","scope":21235,"src":"914:27:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":21219,"name":"uint8","nodeType":"ElementaryTypeName","src":"914:5:196","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":21223,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"970:17:196","nodeType":"VariableDeclaration","scope":21235,"src":"951:36:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":21222,"nodeType":"UserDefinedTypeName","pathNode":{"id":21221,"name":"IForwarderRegistry","nameLocations":["951:18:196"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"951:18:196"},"referencedDeclaration":13386,"src":"951:18:196","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"873:120:196"},"returnParameters":{"id":21229,"nodeType":"ParameterList","parameters":[],"src":"1047:0:196"},"scope":21774,"src":"862:230:196","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[24305],"body":{"id":21297,"nodeType":"Block","src":"1793:345:196","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21252,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21238,"src":"1807:8:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":21255,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1827:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21254,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1819:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21253,"name":"address","nodeType":"ElementaryTypeName","src":"1819:7:196","typeDescriptions":{}}},"id":21256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1819:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1807:25:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21292,"nodeType":"IfStatement","src":"1803:281:196","trueBody":{"id":21291,"nodeType":"Block","src":"1834:250:196","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":21258,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1852:3:196","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":21259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1856:6:196","memberName":"sender","nodeType":"MemberAccess","src":"1852:10:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":21262,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"1874:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}],"id":21261,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1866:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21260,"name":"address","nodeType":"ElementaryTypeName","src":"1866:7:196","typeDescriptions":{}}},"id":21263,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1866:22:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1852:36:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21268,"nodeType":"IfStatement","src":"1848:63:196","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":21265,"name":"InvalidToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21205,"src":"1897:12:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":21266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1897:14:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":21267,"nodeType":"RevertStatement","src":"1890:21:196"}},{"assignments":[21270],"declarations":[{"constant":false,"id":21270,"mutability":"mutable","name":"requiresTransfer","nameLocation":"1930:16:196","nodeType":"VariableDeclaration","scope":21291,"src":"1925:21:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21269,"name":"bool","nodeType":"ElementaryTypeName","src":"1925:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21272,"initialValue":{"hexValue":"66616c7365","id":21271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1949:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"1925:29:196"},{"assignments":[21274],"declarations":[{"constant":false,"id":21274,"mutability":"mutable","name":"batch","nameLocation":"1973:5:196","nodeType":"VariableDeclaration","scope":21291,"src":"1968:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21273,"name":"bool","nodeType":"ElementaryTypeName","src":"1968:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21276,"initialValue":{"hexValue":"66616c7365","id":21275,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1981:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"1968:18:196"},{"expression":{"arguments":[{"id":21278,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21240,"src":"2007:4:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21281,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21270,"src":"2024:16:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":21284,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21274,"src":"2053:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":21285,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21242,"src":"2060:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21286,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21244,"src":"2064:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":21282,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2042:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21283,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2046:6:196","memberName":"encode","nodeType":"MemberAccess","src":"2042:10:196","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21287,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2042:29:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":21279,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2013:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21280,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2017:6:196","memberName":"encode","nodeType":"MemberAccess","src":"2013:10:196","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21288,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2013:59:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":21277,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"2000:6:196","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":21289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2000:73:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21290,"nodeType":"ExpressionStatement","src":"2000:73:196"}]}},{"expression":{"expression":{"expression":{"id":21293,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2100:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}},"id":21294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2105:17:196","memberName":"onERC1155Received","nodeType":"MemberAccess","referencedDeclaration":21298,"src":"2100:22:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,uint256,bytes memory) external returns (bytes4)"}},"id":21295,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2123:8:196","memberName":"selector","nodeType":"MemberAccess","src":"2100:31:196","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":21251,"id":21296,"nodeType":"Return","src":"2093:38:196"}]},"documentation":{"id":21236,"nodeType":"StructuredDocumentation","src":"1098:498:196","text":"@notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\n @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\n @param operator The address of the operator.\n @param from The address of the sender.\n @param id The id of the token received.\n @param amount The amount of tokens received.\n @return bytes4 The function selector of the callback."},"functionSelector":"f23a6e61","id":21298,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1610:17:196","nodeType":"FunctionDefinition","overrides":{"id":21248,"nodeType":"OverrideSpecifier","overrides":[],"src":"1767:8:196"},"parameters":{"id":21247,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21238,"mutability":"mutable","name":"operator","nameLocation":"1645:8:196","nodeType":"VariableDeclaration","scope":21298,"src":"1637:16:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21237,"name":"address","nodeType":"ElementaryTypeName","src":"1637:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21240,"mutability":"mutable","name":"from","nameLocation":"1671:4:196","nodeType":"VariableDeclaration","scope":21298,"src":"1663:12:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21239,"name":"address","nodeType":"ElementaryTypeName","src":"1663:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21242,"mutability":"mutable","name":"id","nameLocation":"1693:2:196","nodeType":"VariableDeclaration","scope":21298,"src":"1685:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21241,"name":"uint256","nodeType":"ElementaryTypeName","src":"1685:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21244,"mutability":"mutable","name":"amount","nameLocation":"1713:6:196","nodeType":"VariableDeclaration","scope":21298,"src":"1705:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21243,"name":"uint256","nodeType":"ElementaryTypeName","src":"1705:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21246,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21298,"src":"1729:14:196","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21245,"name":"bytes","nodeType":"ElementaryTypeName","src":"1729:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1627:122:196"},"returnParameters":{"id":21251,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21250,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21298,"src":"1785:6:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":21249,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1785:6:196","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1784:8:196"},"scope":21774,"src":"1601:537:196","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24323],"body":{"id":21362,"nodeType":"Block","src":"2873:351:196","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21322,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21317,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21301,"src":"2887:8:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":21320,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2907:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2899:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21318,"name":"address","nodeType":"ElementaryTypeName","src":"2899:7:196","typeDescriptions":{}}},"id":21321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2899:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2887:25:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21357,"nodeType":"IfStatement","src":"2883:282:196","trueBody":{"id":21356,"nodeType":"Block","src":"2914:251:196","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":21323,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2932:3:196","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":21324,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2936:6:196","memberName":"sender","nodeType":"MemberAccess","src":"2932:10:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":21327,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"2954:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}],"id":21326,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2946:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21325,"name":"address","nodeType":"ElementaryTypeName","src":"2946:7:196","typeDescriptions":{}}},"id":21328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2946:22:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2932:36:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21333,"nodeType":"IfStatement","src":"2928:63:196","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":21330,"name":"InvalidToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21205,"src":"2977:12:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":21331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2977:14:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":21332,"nodeType":"RevertStatement","src":"2970:21:196"}},{"assignments":[21335],"declarations":[{"constant":false,"id":21335,"mutability":"mutable","name":"requiresTransfer","nameLocation":"3010:16:196","nodeType":"VariableDeclaration","scope":21356,"src":"3005:21:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21334,"name":"bool","nodeType":"ElementaryTypeName","src":"3005:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21337,"initialValue":{"hexValue":"66616c7365","id":21336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3029:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"3005:29:196"},{"assignments":[21339],"declarations":[{"constant":false,"id":21339,"mutability":"mutable","name":"batch","nameLocation":"3053:5:196","nodeType":"VariableDeclaration","scope":21356,"src":"3048:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21338,"name":"bool","nodeType":"ElementaryTypeName","src":"3048:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21341,"initialValue":{"hexValue":"74727565","id":21340,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3061:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"nodeType":"VariableDeclarationStatement","src":"3048:17:196"},{"expression":{"arguments":[{"id":21343,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21303,"src":"3086:4:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21346,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21335,"src":"3103:16:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":21349,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21339,"src":"3132:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":21350,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21306,"src":"3139:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":21351,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21309,"src":"3144:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":21347,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3121:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21348,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3125:6:196","memberName":"encode","nodeType":"MemberAccess","src":"3121:10:196","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3121:31:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":21344,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3092:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21345,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3096:6:196","memberName":"encode","nodeType":"MemberAccess","src":"3092:10:196","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21353,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3092:61:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":21342,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"3079:6:196","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":21354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3079:75:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21355,"nodeType":"ExpressionStatement","src":"3079:75:196"}]}},{"expression":{"expression":{"expression":{"id":21358,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3181:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}},"id":21359,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3186:22:196","memberName":"onERC1155BatchReceived","nodeType":"MemberAccess","referencedDeclaration":21363,"src":"3181:27:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256[] memory,uint256[] memory,bytes memory) external returns (bytes4)"}},"id":21360,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3209:8:196","memberName":"selector","nodeType":"MemberAccess","src":"3181:36:196","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":21316,"id":21361,"nodeType":"Return","src":"3174:43:196"}]},"documentation":{"id":21299,"nodeType":"StructuredDocumentation","src":"2144:503:196","text":"@notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\n @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\n @param operator The address of the operator.\n @param from The address of the sender.\n @param ids The ids of the tokens received.\n @param amounts The amounts of tokens received.\n @return bytes4 The function selector of the callback."},"functionSelector":"bc197c81","id":21363,"implemented":true,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"2661:22:196","nodeType":"FunctionDefinition","overrides":{"id":21313,"nodeType":"OverrideSpecifier","overrides":[],"src":"2847:8:196"},"parameters":{"id":21312,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21301,"mutability":"mutable","name":"operator","nameLocation":"2701:8:196","nodeType":"VariableDeclaration","scope":21363,"src":"2693:16:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21300,"name":"address","nodeType":"ElementaryTypeName","src":"2693:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21303,"mutability":"mutable","name":"from","nameLocation":"2727:4:196","nodeType":"VariableDeclaration","scope":21363,"src":"2719:12:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21302,"name":"address","nodeType":"ElementaryTypeName","src":"2719:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21306,"mutability":"mutable","name":"ids","nameLocation":"2760:3:196","nodeType":"VariableDeclaration","scope":21363,"src":"2741:22:196","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21304,"name":"uint256","nodeType":"ElementaryTypeName","src":"2741:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21305,"nodeType":"ArrayTypeName","src":"2741:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":21309,"mutability":"mutable","name":"amounts","nameLocation":"2792:7:196","nodeType":"VariableDeclaration","scope":21363,"src":"2773:26:196","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21307,"name":"uint256","nodeType":"ElementaryTypeName","src":"2773:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21308,"nodeType":"ArrayTypeName","src":"2773:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":21311,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21363,"src":"2809:14:196","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21310,"name":"bytes","nodeType":"ElementaryTypeName","src":"2809:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2683:146:196"},"returnParameters":{"id":21316,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21315,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21363,"src":"2865:6:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":21314,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2865:6:196","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2864:8:196"},"scope":21774,"src":"2652:572:196","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[20560],"body":{"id":21384,"nodeType":"Block","src":"3567:116:196","statements":[{"assignments":[21371],"declarations":[{"constant":false,"id":21371,"mutability":"mutable","name":"requiresTransfer","nameLocation":"3582:16:196","nodeType":"VariableDeclaration","scope":21384,"src":"3577:21:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21370,"name":"bool","nodeType":"ElementaryTypeName","src":"3577:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21373,"initialValue":{"hexValue":"74727565","id":21372,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3601:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"nodeType":"VariableDeclarationStatement","src":"3577:28:196"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":21375,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"3622:10:196","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":21376,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3622:12:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21379,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21371,"src":"3647:16:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":21380,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21366,"src":"3665:9:196","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":21377,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3636:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21378,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3640:6:196","memberName":"encode","nodeType":"MemberAccess","src":"3636:10:196","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21381,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3636:39:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":21374,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"3615:6:196","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":21382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3615:61:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21383,"nodeType":"ExpressionStatement","src":"3615:61:196"}]},"documentation":{"id":21364,"nodeType":"StructuredDocumentation","src":"3230:259:196","text":"@inheritdoc LinearPool\n @param stakeData The data to be used for staking, encoded as\n   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true."},"functionSelector":"2d1e0c02","id":21385,"implemented":true,"kind":"function","modifiers":[],"name":"stake","nameLocation":"3503:5:196","nodeType":"FunctionDefinition","overrides":{"id":21368,"nodeType":"OverrideSpecifier","overrides":[],"src":"3558:8:196"},"parameters":{"id":21367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21366,"mutability":"mutable","name":"stakeData","nameLocation":"3524:9:196","nodeType":"VariableDeclaration","scope":21385,"src":"3509:24:196","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21365,"name":"bytes","nodeType":"ElementaryTypeName","src":"3509:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3508:26:196"},"returnParameters":{"id":21369,"nodeType":"ParameterList","parameters":[],"src":"3567:0:196"},"scope":21774,"src":"3494:189:196","stateMutability":"payable","virtual":true,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":21561,"nodeType":"Block","src":"4245:1132:196","statements":[{"assignments":[21397,21399],"declarations":[{"constant":false,"id":21397,"mutability":"mutable","name":"requiresTransfer","nameLocation":"4261:16:196","nodeType":"VariableDeclaration","scope":21561,"src":"4256:21:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21396,"name":"bool","nodeType":"ElementaryTypeName","src":"4256:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":21399,"mutability":"mutable","name":"data","nameLocation":"4292:4:196","nodeType":"VariableDeclaration","scope":21561,"src":"4279:17:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21398,"name":"bytes","nodeType":"ElementaryTypeName","src":"4279:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":21409,"initialValue":{"arguments":[{"id":21402,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21390,"src":"4311:9:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21404,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4323:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21403,"name":"bool","nodeType":"ElementaryTypeName","src":"4323:4:196","typeDescriptions":{}}},{"id":21406,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4329:5:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":21405,"name":"bytes","nodeType":"ElementaryTypeName","src":"4329:5:196","typeDescriptions":{}}}],"id":21407,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4322:13:196","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}],"expression":{"id":21400,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4300:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21401,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4304:6:196","memberName":"decode","nodeType":"MemberAccess","src":"4300:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4300:36:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"4255:81:196"},{"assignments":[21411],"declarations":[{"constant":false,"id":21411,"mutability":"mutable","name":"batch","nameLocation":"4351:5:196","nodeType":"VariableDeclaration","scope":21561,"src":"4346:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21410,"name":"bool","nodeType":"ElementaryTypeName","src":"4346:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21419,"initialValue":{"arguments":[{"id":21414,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21399,"src":"4370:4:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21416,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4377:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21415,"name":"bool","nodeType":"ElementaryTypeName","src":"4377:4:196","typeDescriptions":{}}}],"id":21417,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4376:6:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}],"expression":{"id":21412,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4359:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21413,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4363:6:196","memberName":"decode","nodeType":"MemberAccess","src":"4359:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21418,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4359:24:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"4346:37:196"},{"condition":{"id":21420,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21411,"src":"4397:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":21559,"nodeType":"Block","src":"5039:332:196","statements":[{"assignments":[null,21513,21515],"declarations":[null,{"constant":false,"id":21513,"mutability":"mutable","name":"id","nameLocation":"5064:2:196","nodeType":"VariableDeclaration","scope":21559,"src":"5056:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21512,"name":"uint256","nodeType":"ElementaryTypeName","src":"5056:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21515,"mutability":"mutable","name":"amount","nameLocation":"5076:6:196","nodeType":"VariableDeclaration","scope":21559,"src":"5068:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21514,"name":"uint256","nodeType":"ElementaryTypeName","src":"5068:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21527,"initialValue":{"arguments":[{"id":21518,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21399,"src":"5097:4:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21520,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5104:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21519,"name":"bool","nodeType":"ElementaryTypeName","src":"5104:4:196","typeDescriptions":{}}},{"id":21522,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5110:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21521,"name":"uint256","nodeType":"ElementaryTypeName","src":"5110:7:196","typeDescriptions":{}}},{"id":21524,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5119:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21523,"name":"uint256","nodeType":"ElementaryTypeName","src":"5119:7:196","typeDescriptions":{}}}],"id":21525,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"5103:24:196","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256),type(uint256))"}],"expression":{"id":21516,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5086:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21517,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5090:6:196","memberName":"decode","nodeType":"MemberAccess","src":"5086:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21526,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5086:42:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$_t_uint256_$","typeString":"tuple(bool,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"5053:75:196"},{"expression":{"id":21534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":21528,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"5142:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21531,"indexExpression":{"id":21529,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21388,"src":"5151:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5142:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21532,"indexExpression":{"id":21530,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21513,"src":"5159:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5142:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":21533,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21515,"src":"5166:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5142:30:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21535,"nodeType":"ExpressionStatement","src":"5142:30:196"},{"expression":{"id":21541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21536,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21394,"src":"5186:11:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":21538,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21513,"src":"5212:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21539,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21515,"src":"5216:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21537,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21773,"src":"5200:11:196","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) view returns (uint256)"}},"id":21540,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5200:23:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5186:37:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21542,"nodeType":"ExpressionStatement","src":"5186:37:196"},{"condition":{"id":21543,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21397,"src":"5241:16:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21558,"nodeType":"IfStatement","src":"5237:124:196","trueBody":{"id":21557,"nodeType":"Block","src":"5259:102:196","statements":[{"expression":{"arguments":[{"id":21547,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21388,"src":"5308:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21550,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5324:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21549,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5316:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21548,"name":"address","nodeType":"ElementaryTypeName","src":"5316:7:196","typeDescriptions":{}}},"id":21551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5316:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21552,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21513,"src":"5331:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21553,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21515,"src":"5335:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"","id":21554,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5343:2:196","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":21544,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"5277:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"id":21546,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5291:16:196","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24120,"src":"5277:30:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,uint256,bytes memory) external"}},"id":21555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5277:69:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21556,"nodeType":"ExpressionStatement","src":"5277:69:196"}]}}]},"id":21560,"nodeType":"IfStatement","src":"4393:978:196","trueBody":{"id":21511,"nodeType":"Block","src":"4404:629:196","statements":[{"assignments":[null,21425,21428],"declarations":[null,{"constant":false,"id":21425,"mutability":"mutable","name":"ids","nameLocation":"4438:3:196","nodeType":"VariableDeclaration","scope":21511,"src":"4421:20:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21423,"name":"uint256","nodeType":"ElementaryTypeName","src":"4421:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21424,"nodeType":"ArrayTypeName","src":"4421:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":21428,"mutability":"mutable","name":"amounts","nameLocation":"4460:7:196","nodeType":"VariableDeclaration","scope":21511,"src":"4443:24:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21426,"name":"uint256","nodeType":"ElementaryTypeName","src":"4443:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21427,"nodeType":"ArrayTypeName","src":"4443:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":21442,"initialValue":{"arguments":[{"id":21431,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21399,"src":"4482:4:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4489:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21432,"name":"bool","nodeType":"ElementaryTypeName","src":"4489:4:196","typeDescriptions":{}}},{"baseExpression":{"id":21435,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4495:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21434,"name":"uint256","nodeType":"ElementaryTypeName","src":"4495:7:196","typeDescriptions":{}}},"id":21436,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"4495:9:196","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}},{"baseExpression":{"id":21438,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4506:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21437,"name":"uint256","nodeType":"ElementaryTypeName","src":"4506:7:196","typeDescriptions":{}}},"id":21439,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"4506:9:196","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}}],"id":21440,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4488:28:196","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory),type(uint256[] memory))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory),type(uint256[] memory))"}],"expression":{"id":21429,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4471:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21430,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4475:6:196","memberName":"decode","nodeType":"MemberAccess","src":"4471:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4471:46:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"tuple(bool,uint256[] memory,uint256[] memory)"}},"nodeType":"VariableDeclarationStatement","src":"4418:99:196"},{"assignments":[21444],"declarations":[{"constant":false,"id":21444,"mutability":"mutable","name":"count","nameLocation":"4539:5:196","nodeType":"VariableDeclaration","scope":21511,"src":"4531:13:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21443,"name":"uint256","nodeType":"ElementaryTypeName","src":"4531:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21447,"initialValue":{"expression":{"id":21445,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21425,"src":"4547:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4551:6:196","memberName":"length","nodeType":"MemberAccess","src":"4547:10:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4531:26:196"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21452,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21449,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21444,"src":"4579:5:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":21450,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21428,"src":"4588:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4596:6:196","memberName":"length","nodeType":"MemberAccess","src":"4588:14:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4579:23:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":21453,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"4604:24:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":21454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4604:26:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":21448,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4571:7:196","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":21455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4571:60:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21456,"nodeType":"ExpressionStatement","src":"4571:60:196"},{"body":{"id":21493,"nodeType":"Block","src":"4678:201:196","statements":[{"assignments":[21467],"declarations":[{"constant":false,"id":21467,"mutability":"mutable","name":"id","nameLocation":"4704:2:196","nodeType":"VariableDeclaration","scope":21493,"src":"4696:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21466,"name":"uint256","nodeType":"ElementaryTypeName","src":"4696:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21471,"initialValue":{"baseExpression":{"id":21468,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21425,"src":"4709:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21470,"indexExpression":{"id":21469,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21458,"src":"4713:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4709:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4696:19:196"},{"assignments":[21473],"declarations":[{"constant":false,"id":21473,"mutability":"mutable","name":"amount","nameLocation":"4741:6:196","nodeType":"VariableDeclaration","scope":21493,"src":"4733:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21472,"name":"uint256","nodeType":"ElementaryTypeName","src":"4733:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21477,"initialValue":{"baseExpression":{"id":21474,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21428,"src":"4750:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21476,"indexExpression":{"id":21475,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21458,"src":"4758:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4750:10:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4733:27:196"},{"expression":{"id":21484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":21478,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"4778:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21481,"indexExpression":{"id":21479,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21388,"src":"4787:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4778:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21482,"indexExpression":{"id":21480,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21467,"src":"4795:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4778:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":21483,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21473,"src":"4802:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4778:30:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21485,"nodeType":"ExpressionStatement","src":"4778:30:196"},{"expression":{"id":21491,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21486,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21394,"src":"4826:11:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":21488,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21467,"src":"4853:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21489,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21473,"src":"4857:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21487,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21773,"src":"4841:11:196","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) view returns (uint256)"}},"id":21490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4841:23:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4826:38:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21492,"nodeType":"ExpressionStatement","src":"4826:38:196"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21462,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21460,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21458,"src":"4661:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":21461,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21444,"src":"4666:5:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4661:10:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21494,"initializationExpression":{"assignments":[21458],"declarations":[{"constant":false,"id":21458,"mutability":"mutable","name":"i","nameLocation":"4658:1:196","nodeType":"VariableDeclaration","scope":21494,"src":"4650:9:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21457,"name":"uint256","nodeType":"ElementaryTypeName","src":"4650:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21459,"nodeType":"VariableDeclarationStatement","src":"4650:9:196"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":21464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"4673:3:196","subExpression":{"id":21463,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21458,"src":"4675:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21465,"nodeType":"ExpressionStatement","src":"4673:3:196"},"nodeType":"ForStatement","src":"4645:234:196"},{"condition":{"id":21495,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21397,"src":"4896:16:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21510,"nodeType":"IfStatement","src":"4892:131:196","trueBody":{"id":21509,"nodeType":"Block","src":"4914:109:196","statements":[{"expression":{"arguments":[{"id":21499,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21388,"src":"4968:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21502,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4984:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21501,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4976:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21500,"name":"address","nodeType":"ElementaryTypeName","src":"4976:7:196","typeDescriptions":{}}},"id":21503,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4976:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21504,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21425,"src":"4991:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":21505,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21428,"src":"4996:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"hexValue":"","id":21506,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5005:2:196","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":21496,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"4932:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"id":21498,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4946:21:196","memberName":"safeBatchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24136,"src":"4932:35:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256[] memory,uint256[] memory,bytes memory) external"}},"id":21507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4932:76:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21508,"nodeType":"ExpressionStatement","src":"4932:76:196"}]}}]}}]},"documentation":{"id":21386,"nodeType":"StructuredDocumentation","src":"3689:432:196","text":"@inheritdoc LinearPool\n @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\n @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\n   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true."},"id":21562,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"4135:13:196","nodeType":"FunctionDefinition","overrides":{"id":21392,"nodeType":"OverrideSpecifier","overrides":[],"src":"4206:8:196"},"parameters":{"id":21391,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21388,"mutability":"mutable","name":"staker","nameLocation":"4157:6:196","nodeType":"VariableDeclaration","scope":21562,"src":"4149:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21387,"name":"address","nodeType":"ElementaryTypeName","src":"4149:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21390,"mutability":"mutable","name":"stakeData","nameLocation":"4178:9:196","nodeType":"VariableDeclaration","scope":21562,"src":"4165:22:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21389,"name":"bytes","nodeType":"ElementaryTypeName","src":"4165:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4148:40:196"},"returnParameters":{"id":21395,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21394,"mutability":"mutable","name":"stakePoints","nameLocation":"4232:11:196","nodeType":"VariableDeclaration","scope":21562,"src":"4224:19:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21393,"name":"uint256","nodeType":"ElementaryTypeName","src":"4224:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4223:21:196"},"scope":21774,"src":"4126:1251:196","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":21762,"nodeType":"Block","src":"6009:1261:196","statements":[{"assignments":[21574],"declarations":[{"constant":false,"id":21574,"mutability":"mutable","name":"batch","nameLocation":"6024:5:196","nodeType":"VariableDeclaration","scope":21762,"src":"6019:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21573,"name":"bool","nodeType":"ElementaryTypeName","src":"6019:4:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21582,"initialValue":{"arguments":[{"id":21577,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21567,"src":"6043:12:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21579,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6058:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21578,"name":"bool","nodeType":"ElementaryTypeName","src":"6058:4:196","typeDescriptions":{}}}],"id":21580,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6057:6:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}],"expression":{"id":21575,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6032:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21576,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6036:6:196","memberName":"decode","nodeType":"MemberAccess","src":"6032:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6032:32:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"6019:45:196"},{"condition":{"id":21583,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21574,"src":"6078:5:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":21760,"nodeType":"Block","src":"6830:434:196","statements":[{"assignments":[null,21695,21697],"declarations":[null,{"constant":false,"id":21695,"mutability":"mutable","name":"id","nameLocation":"6855:2:196","nodeType":"VariableDeclaration","scope":21760,"src":"6847:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21694,"name":"uint256","nodeType":"ElementaryTypeName","src":"6847:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21697,"mutability":"mutable","name":"amount","nameLocation":"6867:6:196","nodeType":"VariableDeclaration","scope":21760,"src":"6859:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21696,"name":"uint256","nodeType":"ElementaryTypeName","src":"6859:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21709,"initialValue":{"arguments":[{"id":21700,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21567,"src":"6888:12:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21702,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6903:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21701,"name":"bool","nodeType":"ElementaryTypeName","src":"6903:4:196","typeDescriptions":{}}},{"id":21704,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6909:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21703,"name":"uint256","nodeType":"ElementaryTypeName","src":"6909:7:196","typeDescriptions":{}}},{"id":21706,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6918:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21705,"name":"uint256","nodeType":"ElementaryTypeName","src":"6918:7:196","typeDescriptions":{}}}],"id":21707,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6902:24:196","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256),type(uint256))"}],"expression":{"id":21698,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6877:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21699,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6881:6:196","memberName":"decode","nodeType":"MemberAccess","src":"6877:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21708,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6877:50:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$_t_uint256_$","typeString":"tuple(bool,uint256,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"6844:83:196"},{"assignments":[21711],"declarations":[{"constant":false,"id":21711,"mutability":"mutable","name":"balance","nameLocation":"6949:7:196","nodeType":"VariableDeclaration","scope":21760,"src":"6941:15:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21710,"name":"uint256","nodeType":"ElementaryTypeName","src":"6941:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21717,"initialValue":{"baseExpression":{"baseExpression":{"id":21712,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"6959:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21714,"indexExpression":{"id":21713,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"6968:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6959:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21716,"indexExpression":{"id":21715,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21695,"src":"6976:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6959:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6941:38:196"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21721,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21719,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21711,"src":"7001:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":21720,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21697,"src":"7012:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7001:17:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":21723,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"7037:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21724,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21695,"src":"7045:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21725,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21697,"src":"7049:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21726,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21711,"src":"7057:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21722,"name":"NotEnoughBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21215,"src":"7020:16:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":21727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7020:45:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":21718,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"6993:7:196","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":21728,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6993:73:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21729,"nodeType":"ExpressionStatement","src":"6993:73:196"},{"expression":{"id":21738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":21730,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"7080:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21733,"indexExpression":{"id":21731,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"7089:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7080:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21734,"indexExpression":{"id":21732,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21695,"src":"7097:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7080:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21737,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21735,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21711,"src":"7103:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":21736,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21697,"src":"7113:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7103:16:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7080:39:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21739,"nodeType":"ExpressionStatement","src":"7080:39:196"},{"expression":{"id":21745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21740,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21571,"src":"7133:11:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":21742,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21695,"src":"7159:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21743,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21697,"src":"7163:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21741,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21773,"src":"7147:11:196","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) view returns (uint256)"}},"id":21744,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7147:23:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7133:37:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21746,"nodeType":"ExpressionStatement","src":"7133:37:196"},{"expression":{"arguments":[{"arguments":[{"id":21752,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"7223:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21751,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7215:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21750,"name":"address","nodeType":"ElementaryTypeName","src":"7215:7:196","typeDescriptions":{}}},"id":21753,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7215:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21754,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"7230:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21755,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21695,"src":"7238:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21756,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21697,"src":"7242:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"","id":21757,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7250:2:196","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":21747,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"7184:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"id":21749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7198:16:196","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24120,"src":"7184:30:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256,uint256,bytes memory) external"}},"id":21758,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7184:69:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21759,"nodeType":"ExpressionStatement","src":"7184:69:196"}]},"id":21761,"nodeType":"IfStatement","src":"6074:1190:196","trueBody":{"id":21693,"nodeType":"Block","src":"6085:739:196","statements":[{"assignments":[null,21588,21591],"declarations":[null,{"constant":false,"id":21588,"mutability":"mutable","name":"ids","nameLocation":"6119:3:196","nodeType":"VariableDeclaration","scope":21693,"src":"6102:20:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21586,"name":"uint256","nodeType":"ElementaryTypeName","src":"6102:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21587,"nodeType":"ArrayTypeName","src":"6102:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":21591,"mutability":"mutable","name":"amounts","nameLocation":"6141:7:196","nodeType":"VariableDeclaration","scope":21693,"src":"6124:24:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21589,"name":"uint256","nodeType":"ElementaryTypeName","src":"6124:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21590,"nodeType":"ArrayTypeName","src":"6124:9:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":21605,"initialValue":{"arguments":[{"id":21594,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21567,"src":"6163:12:196","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21596,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6178:4:196","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21595,"name":"bool","nodeType":"ElementaryTypeName","src":"6178:4:196","typeDescriptions":{}}},{"baseExpression":{"id":21598,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6184:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21597,"name":"uint256","nodeType":"ElementaryTypeName","src":"6184:7:196","typeDescriptions":{}}},"id":21599,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"6184:9:196","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}},{"baseExpression":{"id":21601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6195:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21600,"name":"uint256","nodeType":"ElementaryTypeName","src":"6195:7:196","typeDescriptions":{}}},"id":21602,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"6195:9:196","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}}],"id":21603,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"6177:28:196","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory),type(uint256[] memory))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory),type(uint256[] memory))"}],"expression":{"id":21592,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"6152:3:196","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21593,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6156:6:196","memberName":"decode","nodeType":"MemberAccess","src":"6152:10:196","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6152:54:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"tuple(bool,uint256[] memory,uint256[] memory)"}},"nodeType":"VariableDeclarationStatement","src":"6099:107:196"},{"assignments":[21607],"declarations":[{"constant":false,"id":21607,"mutability":"mutable","name":"count","nameLocation":"6228:5:196","nodeType":"VariableDeclaration","scope":21693,"src":"6220:13:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21606,"name":"uint256","nodeType":"ElementaryTypeName","src":"6220:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21610,"initialValue":{"expression":{"id":21608,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21588,"src":"6236:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21609,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6240:6:196","memberName":"length","nodeType":"MemberAccess","src":"6236:10:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6220:26:196"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21612,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21607,"src":"6268:5:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":21613,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21591,"src":"6277:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6285:6:196","memberName":"length","nodeType":"MemberAccess","src":"6277:14:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6268:23:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[],"expression":{"argumentTypes":[],"id":21616,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"6293:24:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":21617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6293:26:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":21611,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"6260:7:196","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":21618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6260:60:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21619,"nodeType":"ExpressionStatement","src":"6260:60:196"},{"body":{"id":21678,"nodeType":"Block","src":"6367:357:196","statements":[{"assignments":[21630],"declarations":[{"constant":false,"id":21630,"mutability":"mutable","name":"id","nameLocation":"6393:2:196","nodeType":"VariableDeclaration","scope":21678,"src":"6385:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21629,"name":"uint256","nodeType":"ElementaryTypeName","src":"6385:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21634,"initialValue":{"baseExpression":{"id":21631,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21588,"src":"6398:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21633,"indexExpression":{"id":21632,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21621,"src":"6402:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6398:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6385:19:196"},{"assignments":[21636],"declarations":[{"constant":false,"id":21636,"mutability":"mutable","name":"amount","nameLocation":"6430:6:196","nodeType":"VariableDeclaration","scope":21678,"src":"6422:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21635,"name":"uint256","nodeType":"ElementaryTypeName","src":"6422:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21640,"initialValue":{"baseExpression":{"id":21637,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21591,"src":"6439:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":21639,"indexExpression":{"id":21638,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21621,"src":"6447:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6439:10:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6422:27:196"},{"assignments":[21642],"declarations":[{"constant":false,"id":21642,"mutability":"mutable","name":"balance","nameLocation":"6475:7:196","nodeType":"VariableDeclaration","scope":21678,"src":"6467:15:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21641,"name":"uint256","nodeType":"ElementaryTypeName","src":"6467:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21648,"initialValue":{"baseExpression":{"baseExpression":{"id":21643,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"6485:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21645,"indexExpression":{"id":21644,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"6494:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6485:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21647,"indexExpression":{"id":21646,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21630,"src":"6502:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6485:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6467:38:196"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21650,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21642,"src":"6531:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":21651,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21636,"src":"6542:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6531:17:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":21654,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"6567:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21655,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21630,"src":"6575:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21656,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21636,"src":"6579:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21657,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21642,"src":"6587:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21653,"name":"NotEnoughBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21215,"src":"6550:16:196","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":21658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6550:45:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":21649,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"6523:7:196","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":21659,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6523:73:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21660,"nodeType":"ExpressionStatement","src":"6523:73:196"},{"expression":{"id":21669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":21661,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21203,"src":"6614:8:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_uint256_$_$","typeString":"mapping(address => mapping(uint256 => uint256))"}},"id":21664,"indexExpression":{"id":21662,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"6623:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6614:16:196","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":21665,"indexExpression":{"id":21663,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21630,"src":"6631:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6614:20:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21668,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21666,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21642,"src":"6637:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":21667,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21636,"src":"6647:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6637:16:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6614:39:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21670,"nodeType":"ExpressionStatement","src":"6614:39:196"},{"expression":{"id":21676,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21671,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21571,"src":"6671:11:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":21673,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21630,"src":"6698:2:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":21674,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21636,"src":"6702:6:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":21672,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21773,"src":"6686:11:196","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256,uint256) view returns (uint256)"}},"id":21675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6686:23:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6671:38:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21677,"nodeType":"ExpressionStatement","src":"6671:38:196"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21623,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21621,"src":"6350:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":21624,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21607,"src":"6355:5:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6350:10:196","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21679,"initializationExpression":{"assignments":[21621],"declarations":[{"constant":false,"id":21621,"mutability":"mutable","name":"i","nameLocation":"6347:1:196","nodeType":"VariableDeclaration","scope":21679,"src":"6339:9:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21620,"name":"uint256","nodeType":"ElementaryTypeName","src":"6339:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21622,"nodeType":"VariableDeclarationStatement","src":"6339:9:196"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":21627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"6362:3:196","subExpression":{"id":21626,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21621,"src":"6364:1:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21628,"nodeType":"ExpressionStatement","src":"6362:3:196"},"nodeType":"ForStatement","src":"6334:390:196"},{"expression":{"arguments":[{"arguments":[{"id":21685,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"6781:4:196","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155StakingLinearPool_$21774","typeString":"contract ERC1155StakingLinearPool"}],"id":21684,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6773:7:196","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21683,"name":"address","nodeType":"ElementaryTypeName","src":"6773:7:196","typeDescriptions":{}}},"id":21686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6773:13:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21687,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21565,"src":"6788:6:196","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21688,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21588,"src":"6796:3:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":21689,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21591,"src":"6801:7:196","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"hexValue":"","id":21690,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6810:2:196","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"expression":{"id":21680,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21197,"src":"6737:13:196","typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155_$24178","typeString":"contract IERC1155"}},"id":21682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6751:21:196","memberName":"safeBatchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24136,"src":"6737:35:196","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,uint256[] memory,uint256[] memory,bytes memory) external"}},"id":21691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6737:76:196","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21692,"nodeType":"ExpressionStatement","src":"6737:76:196"}]}}]},"documentation":{"id":21563,"nodeType":"StructuredDocumentation","src":"5383:496:196","text":"@inheritdoc LinearPool\n @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\n @dev Reverts with {NotEnoughBalance} if the staker does not have enough balance for the given id and amount.\n @param withdrawData The data to be used for withdrawing, encoded as\n   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\n   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true."},"id":21763,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"5893:16:196","nodeType":"FunctionDefinition","overrides":{"id":21569,"nodeType":"OverrideSpecifier","overrides":[],"src":"5970:8:196"},"parameters":{"id":21568,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21565,"mutability":"mutable","name":"staker","nameLocation":"5918:6:196","nodeType":"VariableDeclaration","scope":21763,"src":"5910:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21564,"name":"address","nodeType":"ElementaryTypeName","src":"5910:7:196","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21567,"mutability":"mutable","name":"withdrawData","nameLocation":"5939:12:196","nodeType":"VariableDeclaration","scope":21763,"src":"5926:25:196","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21566,"name":"bytes","nodeType":"ElementaryTypeName","src":"5926:5:196","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5909:43:196"},"returnParameters":{"id":21572,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21571,"mutability":"mutable","name":"stakePoints","nameLocation":"5996:11:196","nodeType":"VariableDeclaration","scope":21763,"src":"5988:19:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21570,"name":"uint256","nodeType":"ElementaryTypeName","src":"5988:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5987:21:196"},"scope":21774,"src":"5884:1386:196","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"documentation":{"id":21764,"nodeType":"StructuredDocumentation","src":"7276:245:196","text":"@notice Computes the stake points for a given token id and amount.\n @param id The id of the token.\n @param amount The amount of the token.\n @return stakePoints The computed stake points for the given token id and amount."},"id":21773,"implemented":false,"kind":"function","modifiers":[],"name":"_tokenValue","nameLocation":"7535:11:196","nodeType":"FunctionDefinition","parameters":{"id":21769,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21766,"mutability":"mutable","name":"id","nameLocation":"7555:2:196","nodeType":"VariableDeclaration","scope":21773,"src":"7547:10:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21765,"name":"uint256","nodeType":"ElementaryTypeName","src":"7547:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21768,"mutability":"mutable","name":"amount","nameLocation":"7567:6:196","nodeType":"VariableDeclaration","scope":21773,"src":"7559:14:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21767,"name":"uint256","nodeType":"ElementaryTypeName","src":"7559:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7546:28:196"},"returnParameters":{"id":21772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21771,"mutability":"mutable","name":"stakePoints","nameLocation":"7614:11:196","nodeType":"VariableDeclaration","scope":21773,"src":"7606:19:196","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21770,"name":"uint256","nodeType":"ElementaryTypeName","src":"7606:7:196","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7605:21:196"},"scope":21774,"src":"7526:101:196","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":21775,"src":"528:7101:196","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,21205,21215],"usedEvents":[8269,8278,8287,20330,20338,20348,20356]}],"src":"32:7598:196"},"id":196},"contracts/staking/linear/stake/ERC20StakingLinearPool.sol":{"ast":{"absolutePath":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol","exportedSymbols":{"ERC20Receiver":[26279],"ERC20StakingLinearPool":[22055],"IERC20":[452],"IForwarderRegistry":[13386],"LinearPool":[21014],"SafeERC20":[916],"TokenRecoveryBase":[19810]},"id":22056,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":21776,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:197"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../LinearPool.sol","id":21778,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22056,"sourceUnit":21015,"src":"57:47:197","symbolAliases":[{"foreign":{"id":21777,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Receiver.sol","file":"./../../../token/ERC20/ERC20Receiver.sol","id":21780,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22056,"sourceUnit":26280,"src":"105:71:197","symbolAliases":[{"foreign":{"id":21779,"name":"ERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26279,"src":"113:13:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../security/base/TokenRecoveryBase.sol","id":21782,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22056,"sourceUnit":19811,"src":"177:81:197","symbolAliases":[{"foreign":{"id":21781,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"185:17:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","file":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","id":21785,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22056,"sourceUnit":917,"src":"259:90:197","symbolAliases":[{"foreign":{"id":21783,"name":"SafeERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":916,"src":"267:9:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":21784,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"278:6:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":21787,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22056,"sourceUnit":13387,"src":"350:87:197","symbolAliases":[{"foreign":{"id":21786,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"358:18:197","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":21789,"name":"LinearPool","nameLocations":["675:10:197"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"675:10:197"},"id":21790,"nodeType":"InheritanceSpecifier","src":"675:10:197"},{"baseName":{"id":21791,"name":"ERC20Receiver","nameLocations":["687:13:197"],"nodeType":"IdentifierPath","referencedDeclaration":26279,"src":"687:13:197"},"id":21792,"nodeType":"InheritanceSpecifier","src":"687:13:197"}],"canonicalName":"ERC20StakingLinearPool","contractDependencies":[],"contractKind":"contract","documentation":{"id":21788,"nodeType":"StructuredDocumentation","src":"439:192:197","text":"@title ERC20StakingLinearPool\n @notice A linear pool that allows staking of ERC20 tokens.\n @notice WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens."},"fullyImplemented":false,"id":22055,"linearizedBaseContracts":[22055,26279,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,28035,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC20StakingLinearPool","nameLocation":"649:22:197","nodeType":"ContractDefinition","nodes":[{"global":false,"id":21796,"libraryName":{"id":21793,"name":"SafeERC20","nameLocations":["713:9:197"],"nodeType":"IdentifierPath","referencedDeclaration":916,"src":"713:9:197"},"nodeType":"UsingForDirective","src":"707:27:197","typeName":{"id":21795,"nodeType":"UserDefinedTypeName","pathNode":{"id":21794,"name":"IERC20","nameLocations":["727:6:197"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"727:6:197"},"referencedDeclaration":452,"src":"727:6:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}},{"constant":false,"functionSelector":"0479d644","id":21799,"mutability":"immutable","name":"STAKING_TOKEN","nameLocation":"764:13:197","nodeType":"VariableDeclaration","scope":22055,"src":"740:37:197","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":21798,"nodeType":"UserDefinedTypeName","pathNode":{"id":21797,"name":"IERC20","nameLocations":["740:6:197"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"740:6:197"},"referencedDeclaration":452,"src":"740:6:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"public"},{"errorSelector":"c1ab6dc1","id":21801,"name":"InvalidToken","nameLocation":"790:12:197","nodeType":"ErrorDefinition","parameters":{"id":21800,"nodeType":"ParameterList","parameters":[],"src":"802:2:197"},"src":"784:21:197"},{"errorSelector":"15c38d3e","id":21807,"name":"InvalidRecoveryAmount","nameLocation":"816:21:197","nodeType":"ErrorDefinition","parameters":{"id":21806,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21803,"mutability":"mutable","name":"requested","nameLocation":"846:9:197","nodeType":"VariableDeclaration","scope":21807,"src":"838:17:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21802,"name":"uint256","nodeType":"ElementaryTypeName","src":"838:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21805,"mutability":"mutable","name":"recoverable","nameLocation":"865:11:197","nodeType":"VariableDeclaration","scope":21807,"src":"857:19:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21804,"name":"uint256","nodeType":"ElementaryTypeName","src":"857:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"837:40:197"},"src":"810:68:197"},{"body":{"id":21826,"nodeType":"Block","src":"1067:45:197","statements":[{"expression":{"id":21824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21822,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"1077:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":21823,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21810,"src":"1093:12:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"src":"1077:28:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21825,"nodeType":"ExpressionStatement","src":"1077:28:197"}]},"id":21827,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":21818,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21812,"src":"1025:21:197","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":21819,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21815,"src":"1048:17:197","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":21820,"kind":"baseConstructorSpecifier","modifierName":{"id":21817,"name":"LinearPool","nameLocations":["1014:10:197"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"1014:10:197"},"nodeType":"ModifierInvocation","src":"1014:52:197"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":21816,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21810,"mutability":"mutable","name":"stakingToken","nameLocation":"912:12:197","nodeType":"VariableDeclaration","scope":21827,"src":"905:19:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"typeName":{"id":21809,"nodeType":"UserDefinedTypeName","pathNode":{"id":21808,"name":"IERC20","nameLocations":["905:6:197"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"905:6:197"},"referencedDeclaration":452,"src":"905:6:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"visibility":"internal"},{"constant":false,"id":21812,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"940:21:197","nodeType":"VariableDeclaration","scope":21827,"src":"934:27:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":21811,"name":"uint8","nodeType":"ElementaryTypeName","src":"934:5:197","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":21815,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"990:17:197","nodeType":"VariableDeclaration","scope":21827,"src":"971:36:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":21814,"nodeType":"UserDefinedTypeName","pathNode":{"id":21813,"name":"IForwarderRegistry","nameLocations":["971:18:197"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"971:18:197"},"referencedDeclaration":13386,"src":"971:18:197","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"895:118:197"},"returnParameters":{"id":21821,"nodeType":"ParameterList","parameters":[],"src":"1067:0:197"},"scope":22055,"src":"884:228:197","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[28034],"body":{"id":21873,"nodeType":"Block","src":"1594:236:197","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":21848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":21842,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1608:3:197","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":21843,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1612:6:197","memberName":"sender","nodeType":"MemberAccess","src":"1608:10:197","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":21846,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"1630:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}],"id":21845,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1622:7:197","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21844,"name":"address","nodeType":"ElementaryTypeName","src":"1622:7:197","typeDescriptions":{}}},"id":21847,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1622:22:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1608:36:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21852,"nodeType":"IfStatement","src":"1604:63:197","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":21849,"name":"InvalidToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21801,"src":"1653:12:197","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":21850,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1653:14:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":21851,"nodeType":"RevertStatement","src":"1646:21:197"}},{"assignments":[21854],"declarations":[{"constant":false,"id":21854,"mutability":"mutable","name":"requiresTransfer","nameLocation":"1682:16:197","nodeType":"VariableDeclaration","scope":21873,"src":"1677:21:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21853,"name":"bool","nodeType":"ElementaryTypeName","src":"1677:4:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21856,"initialValue":{"hexValue":"66616c7365","id":21855,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1701:5:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"1677:29:197"},{"expression":{"arguments":[{"id":21858,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21832,"src":"1723:4:197","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21861,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21854,"src":"1740:16:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":21864,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21834,"src":"1769:5:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":21862,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1758:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21863,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1762:6:197","memberName":"encode","nodeType":"MemberAccess","src":"1758:10:197","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1758:17:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":21859,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1729:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21860,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1733:6:197","memberName":"encode","nodeType":"MemberAccess","src":"1729:10:197","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21866,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1729:47:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":21857,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"1716:6:197","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":21867,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1716:61:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21868,"nodeType":"ExpressionStatement","src":"1716:61:197"},{"expression":{"expression":{"expression":{"id":21869,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1794:4:197","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20StakingLinearPool_$22055","typeString":"contract ERC20StakingLinearPool"}},"id":21870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1799:15:197","memberName":"onERC20Received","nodeType":"MemberAccess","referencedDeclaration":21874,"src":"1794:20:197","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,bytes memory) external returns (bytes4)"}},"id":21871,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1815:8:197","memberName":"selector","nodeType":"MemberAccess","src":"1794:29:197","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":21841,"id":21872,"nodeType":"Return","src":"1787:36:197"}]},"documentation":{"id":21828,"nodeType":"StructuredDocumentation","src":"1118:349:197","text":"@notice Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\n @dev Reverts  with {InvalidToken} if the sender is not the staking token.\n @param from The address of the sender.\n @param value The amount of tokens received.\n @return bytes4 The function selector of the callback."},"functionSelector":"4fc35859","id":21874,"implemented":true,"kind":"function","modifiers":[],"name":"onERC20Received","nameLocation":"1481:15:197","nodeType":"FunctionDefinition","overrides":{"id":21838,"nodeType":"OverrideSpecifier","overrides":[],"src":"1568:8:197"},"parameters":{"id":21837,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21830,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21874,"src":"1497:7:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21829,"name":"address","nodeType":"ElementaryTypeName","src":"1497:7:197","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21832,"mutability":"mutable","name":"from","nameLocation":"1514:4:197","nodeType":"VariableDeclaration","scope":21874,"src":"1506:12:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21831,"name":"address","nodeType":"ElementaryTypeName","src":"1506:7:197","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21834,"mutability":"mutable","name":"value","nameLocation":"1528:5:197","nodeType":"VariableDeclaration","scope":21874,"src":"1520:13:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21833,"name":"uint256","nodeType":"ElementaryTypeName","src":"1520:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":21836,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21874,"src":"1535:14:197","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21835,"name":"bytes","nodeType":"ElementaryTypeName","src":"1535:5:197","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1496:54:197"},"returnParameters":{"id":21841,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21840,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":21874,"src":"1586:6:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":21839,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1586:6:197","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1585:8:197"},"scope":22055,"src":"1472:358:197","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[20560],"body":{"id":21895,"nodeType":"Block","src":"2025:116:197","statements":[{"assignments":[21882],"declarations":[{"constant":false,"id":21882,"mutability":"mutable","name":"requiresTransfer","nameLocation":"2040:16:197","nodeType":"VariableDeclaration","scope":21895,"src":"2035:21:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21881,"name":"bool","nodeType":"ElementaryTypeName","src":"2035:4:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":21884,"initialValue":{"hexValue":"74727565","id":21883,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2059:4:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"nodeType":"VariableDeclarationStatement","src":"2035:28:197"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":21886,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"2080:10:197","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":21887,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2080:12:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21890,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21882,"src":"2105:16:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":21891,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21877,"src":"2123:9:197","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":21888,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2094:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21889,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2098:6:197","memberName":"encode","nodeType":"MemberAccess","src":"2094:10:197","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":21892,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2094:39:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":21885,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"2073:6:197","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":21893,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2073:61:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21894,"nodeType":"ExpressionStatement","src":"2073:61:197"}]},"documentation":{"id":21875,"nodeType":"StructuredDocumentation","src":"1836:111:197","text":"@inheritdoc LinearPool\n @param stakeData The data to be used for staking, encoded as (uint256 value)"},"functionSelector":"2d1e0c02","id":21896,"implemented":true,"kind":"function","modifiers":[],"name":"stake","nameLocation":"1961:5:197","nodeType":"FunctionDefinition","overrides":{"id":21879,"nodeType":"OverrideSpecifier","overrides":[],"src":"2016:8:197"},"parameters":{"id":21878,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21877,"mutability":"mutable","name":"stakeData","nameLocation":"1982:9:197","nodeType":"VariableDeclaration","scope":21896,"src":"1967:24:197","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":21876,"name":"bytes","nodeType":"ElementaryTypeName","src":"1967:5:197","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1966:26:197"},"returnParameters":{"id":21880,"nodeType":"ParameterList","parameters":[],"src":"2025:0:197"},"scope":22055,"src":"1952:189:197","stateMutability":"payable","virtual":true,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":21945,"nodeType":"Block","src":"2433:271:197","statements":[{"assignments":[21908,21910],"declarations":[{"constant":false,"id":21908,"mutability":"mutable","name":"requiresTransfer","nameLocation":"2449:16:197","nodeType":"VariableDeclaration","scope":21945,"src":"2444:21:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":21907,"name":"bool","nodeType":"ElementaryTypeName","src":"2444:4:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":21910,"mutability":"mutable","name":"data","nameLocation":"2480:4:197","nodeType":"VariableDeclaration","scope":21945,"src":"2467:17:197","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21909,"name":"bytes","nodeType":"ElementaryTypeName","src":"2467:5:197","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":21920,"initialValue":{"arguments":[{"id":21913,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21901,"src":"2499:9:197","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21915,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2511:4:197","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":21914,"name":"bool","nodeType":"ElementaryTypeName","src":"2511:4:197","typeDescriptions":{}}},{"id":21917,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2517:5:197","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":21916,"name":"bytes","nodeType":"ElementaryTypeName","src":"2517:5:197","typeDescriptions":{}}}],"id":21918,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2510:13:197","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}],"expression":{"id":21911,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2488:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21912,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2492:6:197","memberName":"decode","nodeType":"MemberAccess","src":"2488:10:197","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21919,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2488:36:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"2443:81:197"},{"expression":{"id":21929,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21921,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21905,"src":"2534:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":21924,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21910,"src":"2559:4:197","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21926,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2566:7:197","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21925,"name":"uint256","nodeType":"ElementaryTypeName","src":"2566:7:197","typeDescriptions":{}}}],"id":21927,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2565:9:197","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":21922,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2548:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21923,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2552:6:197","memberName":"decode","nodeType":"MemberAccess","src":"2548:10:197","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21928,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2548:27:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2534:41:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21930,"nodeType":"ExpressionStatement","src":"2534:41:197"},{"condition":{"id":21931,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21908,"src":"2589:16:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":21944,"nodeType":"IfStatement","src":"2585:113:197","trueBody":{"id":21943,"nodeType":"Block","src":"2607:91:197","statements":[{"expression":{"arguments":[{"id":21935,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21899,"src":"2652:6:197","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":21938,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2668:4:197","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20StakingLinearPool_$22055","typeString":"contract ERC20StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC20StakingLinearPool_$22055","typeString":"contract ERC20StakingLinearPool"}],"id":21937,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2660:7:197","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":21936,"name":"address","nodeType":"ElementaryTypeName","src":"2660:7:197","typeDescriptions":{}}},"id":21939,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2660:13:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21940,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21905,"src":"2675:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":21932,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"2621:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21934,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2635:16:197","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":524,"src":"2621:30:197","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IERC20_$452_$","typeString":"function (contract IERC20,address,address,uint256)"}},"id":21941,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2621:66:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21942,"nodeType":"ExpressionStatement","src":"2621:66:197"}]}}]},"documentation":{"id":21897,"nodeType":"StructuredDocumentation","src":"2147:162:197","text":"@inheritdoc LinearPool\n @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes data) where data is (uint256 value)."},"id":21946,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"2323:13:197","nodeType":"FunctionDefinition","overrides":{"id":21903,"nodeType":"OverrideSpecifier","overrides":[],"src":"2394:8:197"},"parameters":{"id":21902,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21899,"mutability":"mutable","name":"staker","nameLocation":"2345:6:197","nodeType":"VariableDeclaration","scope":21946,"src":"2337:14:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21898,"name":"address","nodeType":"ElementaryTypeName","src":"2337:7:197","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21901,"mutability":"mutable","name":"stakeData","nameLocation":"2366:9:197","nodeType":"VariableDeclaration","scope":21946,"src":"2353:22:197","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21900,"name":"bytes","nodeType":"ElementaryTypeName","src":"2353:5:197","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2336:40:197"},"returnParameters":{"id":21906,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21905,"mutability":"mutable","name":"stakePoints","nameLocation":"2420:11:197","nodeType":"VariableDeclaration","scope":21946,"src":"2412:19:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21904,"name":"uint256","nodeType":"ElementaryTypeName","src":"2412:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2411:21:197"},"scope":22055,"src":"2314:390:197","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":21974,"nodeType":"Block","src":"2958:123:197","statements":[{"expression":{"id":21965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":21957,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21955,"src":"2968:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":21960,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21951,"src":"2993:12:197","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":21962,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3008:7:197","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":21961,"name":"uint256","nodeType":"ElementaryTypeName","src":"3008:7:197","typeDescriptions":{}}}],"id":21963,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3007:9:197","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"expression":{"id":21958,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2982:3:197","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":21959,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2986:6:197","memberName":"decode","nodeType":"MemberAccess","src":"2982:10:197","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":21964,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2982:35:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2968:49:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21966,"nodeType":"ExpressionStatement","src":"2968:49:197"},{"expression":{"arguments":[{"id":21970,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21949,"src":"3054:6:197","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":21971,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21955,"src":"3062:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":21967,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"3027:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3041:12:197","memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":497,"src":"3027:26:197","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_contract$_IERC20_$452_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IERC20_$452_$","typeString":"function (contract IERC20,address,uint256)"}},"id":21972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3027:47:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":21973,"nodeType":"ExpressionStatement","src":"3027:47:197"}]},"documentation":{"id":21947,"nodeType":"StructuredDocumentation","src":"2710:118:197","text":"@inheritdoc LinearPool\n @param withdrawData The data to be used for withdrawing, encoded as (uint256 value)"},"id":21975,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"2842:16:197","nodeType":"FunctionDefinition","overrides":{"id":21953,"nodeType":"OverrideSpecifier","overrides":[],"src":"2919:8:197"},"parameters":{"id":21952,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21949,"mutability":"mutable","name":"staker","nameLocation":"2867:6:197","nodeType":"VariableDeclaration","scope":21975,"src":"2859:14:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":21948,"name":"address","nodeType":"ElementaryTypeName","src":"2859:7:197","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21951,"mutability":"mutable","name":"withdrawData","nameLocation":"2888:12:197","nodeType":"VariableDeclaration","scope":21975,"src":"2875:25:197","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":21950,"name":"bytes","nodeType":"ElementaryTypeName","src":"2875:5:197","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2858:43:197"},"returnParameters":{"id":21956,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21955,"mutability":"mutable","name":"stakePoints","nameLocation":"2945:11:197","nodeType":"VariableDeclaration","scope":21975,"src":"2937:19:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21954,"name":"uint256","nodeType":"ElementaryTypeName","src":"2937:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2936:21:197"},"scope":22055,"src":"2833:248:197","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[19777],"body":{"id":22053,"nodeType":"Block","src":"3383:591:197","statements":[{"assignments":[21991],"declarations":[{"constant":false,"id":21991,"mutability":"mutable","name":"stakingTokenRecoveryAmount","nameLocation":"3401:26:197","nodeType":"VariableDeclaration","scope":22053,"src":"3393:34:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21990,"name":"uint256","nodeType":"ElementaryTypeName","src":"3393:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21992,"nodeType":"VariableDeclarationStatement","src":"3393:34:197"},{"body":{"id":22016,"nodeType":"Block","src":"3477:129:197","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"},"id":22007,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":22003,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21983,"src":"3495:6:197","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},"id":22005,"indexExpression":{"id":22004,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21994,"src":"3502:1:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3495:9:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":22006,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"3508:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"src":"3495:26:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22015,"nodeType":"IfStatement","src":"3491:105:197","trueBody":{"id":22014,"nodeType":"Block","src":"3523:73:197","statements":[{"expression":{"id":22012,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22008,"name":"stakingTokenRecoveryAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21991,"src":"3541:26:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"baseExpression":{"id":22009,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21986,"src":"3571:7:197","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":22011,"indexExpression":{"id":22010,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21994,"src":"3579:1:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3571:10:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3541:40:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22013,"nodeType":"ExpressionStatement","src":"3541:40:197"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":21999,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":21996,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21994,"src":"3453:1:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":21997,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21983,"src":"3457:6:197","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},"id":21998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3464:6:197","memberName":"length","nodeType":"MemberAccess","src":"3457:13:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3453:17:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22017,"initializationExpression":{"assignments":[21994],"declarations":[{"constant":false,"id":21994,"mutability":"mutable","name":"i","nameLocation":"3450:1:197","nodeType":"VariableDeclaration","scope":22017,"src":"3442:9:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21993,"name":"uint256","nodeType":"ElementaryTypeName","src":"3442:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":21995,"nodeType":"VariableDeclarationStatement","src":"3442:9:197"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":22001,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3472:3:197","subExpression":{"id":22000,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21994,"src":"3474:1:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22002,"nodeType":"ExpressionStatement","src":"3472:3:197"},"nodeType":"ForStatement","src":"3437:169:197"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22020,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22018,"name":"stakingTokenRecoveryAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21991,"src":"3619:26:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":22019,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3649:1:197","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3619:31:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22044,"nodeType":"IfStatement","src":"3615:297:197","trueBody":{"id":22043,"nodeType":"Block","src":"3652:260:197","statements":[{"assignments":[22022],"declarations":[{"constant":false,"id":22022,"mutability":"mutable","name":"recoverable","nameLocation":"3674:11:197","nodeType":"VariableDeclaration","scope":22043,"src":"3666:19:197","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22021,"name":"uint256","nodeType":"ElementaryTypeName","src":"3666:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22032,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"id":22027,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3720:4:197","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20StakingLinearPool_$22055","typeString":"contract ERC20StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC20StakingLinearPool_$22055","typeString":"contract ERC20StakingLinearPool"}],"id":22026,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3712:7:197","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22025,"name":"address","nodeType":"ElementaryTypeName","src":"3712:7:197","typeDescriptions":{}}},"id":22028,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3712:13:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":22023,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21799,"src":"3688:13:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":22024,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3702:9:197","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":409,"src":"3688:23:197","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint256_$","typeString":"function (address) view external returns (uint256)"}},"id":22029,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3688:38:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":22030,"name":"totalStaked","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20302,"src":"3729:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3688:52:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3666:74:197"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22033,"name":"stakingTokenRecoveryAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21991,"src":"3758:26:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":22034,"name":"recoverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22022,"src":"3787:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3758:40:197","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22042,"nodeType":"IfStatement","src":"3754:148:197","trueBody":{"id":22041,"nodeType":"Block","src":"3800:102:197","statements":[{"errorCall":{"arguments":[{"id":22037,"name":"stakingTokenRecoveryAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21991,"src":"3847:26:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22038,"name":"recoverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22022,"src":"3875:11:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22036,"name":"InvalidRecoveryAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21807,"src":"3825:21:197","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":22039,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3825:62:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":22040,"nodeType":"RevertStatement","src":"3818:69:197"}]}}]}},{"expression":{"arguments":[{"id":22048,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21979,"src":"3941:8:197","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":22049,"name":"tokens","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21983,"src":"3951:6:197","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"}},{"id":22050,"name":"amounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21986,"src":"3959:7:197","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":22045,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"3921:5:197","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_ERC20StakingLinearPool_$22055_$","typeString":"type(contract super ERC20StakingLinearPool)"}},"id":22047,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3927:13:197","memberName":"recoverERC20s","nodeType":"MemberAccess","referencedDeclaration":19777,"src":"3921:19:197","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$","typeString":"function (address[] calldata,contract IERC20[] calldata,uint256[] calldata)"}},"id":22051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3921:46:197","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22052,"nodeType":"ExpressionStatement","src":"3921:46:197"}]},"documentation":{"id":21976,"nodeType":"StructuredDocumentation","src":"3087:161:197","text":"@inheritdoc TokenRecoveryBase\n @dev Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable."},"functionSelector":"73c8a958","id":22054,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC20s","nameLocation":"3262:13:197","nodeType":"FunctionDefinition","overrides":{"id":21988,"nodeType":"OverrideSpecifier","overrides":[],"src":"3374:8:197"},"parameters":{"id":21987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":21979,"mutability":"mutable","name":"accounts","nameLocation":"3295:8:197","nodeType":"VariableDeclaration","scope":22054,"src":"3276:27:197","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":21977,"name":"address","nodeType":"ElementaryTypeName","src":"3276:7:197","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":21978,"nodeType":"ArrayTypeName","src":"3276:9:197","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":21983,"mutability":"mutable","name":"tokens","nameLocation":"3323:6:197","nodeType":"VariableDeclaration","scope":22054,"src":"3305:24:197","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_calldata_ptr","typeString":"contract IERC20[]"},"typeName":{"baseType":{"id":21981,"nodeType":"UserDefinedTypeName","pathNode":{"id":21980,"name":"IERC20","nameLocations":["3305:6:197"],"nodeType":"IdentifierPath","referencedDeclaration":452,"src":"3305:6:197"},"referencedDeclaration":452,"src":"3305:6:197","typeDescriptions":{"typeIdentifier":"t_contract$_IERC20_$452","typeString":"contract IERC20"}},"id":21982,"nodeType":"ArrayTypeName","src":"3305:8:197","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC20_$452_$dyn_storage_ptr","typeString":"contract IERC20[]"}},"visibility":"internal"},{"constant":false,"id":21986,"mutability":"mutable","name":"amounts","nameLocation":"3350:7:197","nodeType":"VariableDeclaration","scope":22054,"src":"3331:26:197","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":21984,"name":"uint256","nodeType":"ElementaryTypeName","src":"3331:7:197","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":21985,"nodeType":"ArrayTypeName","src":"3331:9:197","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3275:83:197"},"returnParameters":{"id":21989,"nodeType":"ParameterList","parameters":[],"src":"3383:0:197"},"scope":22055,"src":"3253:721:197","stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"scope":22056,"src":"631:3345:197","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,21801,21807],"usedEvents":[8269,8278,8287,20330,20338,20348,20356]}],"src":"32:3945:197"},"id":197},"contracts/staking/linear/stake/ERC721StakingLinearPool.sol":{"ast":{"absolutePath":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol","exportedSymbols":{"ERC721Receiver":[30983],"ERC721StakingLinearPool":[22552],"IERC721":[33094],"IForwarderRegistry":[13386],"LinearPool":[21014],"TokenRecoveryBase":[19810]},"id":22553,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22057,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:198"},{"absolutePath":"contracts/staking/linear/LinearPool.sol","file":"./../LinearPool.sol","id":22059,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22553,"sourceUnit":21015,"src":"57:47:198","symbolAliases":[{"foreign":{"id":22058,"name":"LinearPool","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21014,"src":"65:10:198","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Receiver.sol","file":"./../../../token/ERC721/ERC721Receiver.sol","id":22061,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22553,"sourceUnit":30984,"src":"105:74:198","symbolAliases":[{"foreign":{"id":22060,"name":"ERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30983,"src":"113:14:198","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../security/base/TokenRecoveryBase.sol","id":22063,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22553,"sourceUnit":19811,"src":"180:81:198","symbolAliases":[{"foreign":{"id":22062,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"188:17:198","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../../../token/ERC721/interfaces/IERC721.sol","id":22065,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22553,"sourceUnit":33095,"src":"262:71:198","symbolAliases":[{"foreign":{"id":22064,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"270:7:198","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":22067,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22553,"sourceUnit":13387,"src":"334:87:198","symbolAliases":[{"foreign":{"id":22066,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"342:18:198","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22069,"name":"LinearPool","nameLocations":["567:10:198"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"567:10:198"},"id":22070,"nodeType":"InheritanceSpecifier","src":"567:10:198"},{"baseName":{"id":22071,"name":"ERC721Receiver","nameLocations":["579:14:198"],"nodeType":"IdentifierPath","referencedDeclaration":30983,"src":"579:14:198"},"id":22072,"nodeType":"InheritanceSpecifier","src":"579:14:198"}],"canonicalName":"ERC721StakingLinearPool","contractDependencies":[],"contractKind":"contract","documentation":{"id":22068,"nodeType":"StructuredDocumentation","src":"423:99:198","text":"@title ERC721StakingLinearPool\n @notice A linear pool that allows staking of ERC721 tokens."},"fullyImplemented":false,"id":22552,"linearizedBaseContracts":[22552,30983,21014,13142,13370,13297,19661,1349,7901,7934,11554,11579,33217,8139,19810,8091,1206,8562,19938,8546,21056],"name":"ERC721StakingLinearPool","nameLocation":"540:23:198","nodeType":"ContractDefinition","nodes":[{"constant":false,"functionSelector":"0479d644","id":22075,"mutability":"immutable","name":"STAKING_TOKEN","nameLocation":"625:13:198","nodeType":"VariableDeclaration","scope":22552,"src":"600:38:198","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"},"typeName":{"id":22074,"nodeType":"UserDefinedTypeName","pathNode":{"id":22073,"name":"IERC721","nameLocations":["600:7:198"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"600:7:198"},"referencedDeclaration":33094,"src":"600:7:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"visibility":"public"},{"constant":false,"functionSelector":"f8a14f46","id":22079,"mutability":"mutable","name":"tokenOwners","nameLocation":"694:11:198","nodeType":"VariableDeclaration","scope":22552,"src":"645:60:198","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"typeName":{"id":22078,"keyName":"tokenId","keyNameLocation":"661:7:198","keyType":{"id":22076,"name":"uint256","nodeType":"ElementaryTypeName","src":"653:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"645:41:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"valueName":"owner","valueNameLocation":"680:5:198","valueType":{"id":22077,"name":"address","nodeType":"ElementaryTypeName","src":"672:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"public"},{"errorSelector":"c1ab6dc1","id":22081,"name":"InvalidToken","nameLocation":"718:12:198","nodeType":"ErrorDefinition","parameters":{"id":22080,"nodeType":"ParameterList","parameters":[],"src":"730:2:198"},"src":"712:21:198"},{"errorSelector":"964ebadd","id":22089,"name":"NotTheTokenOwner","nameLocation":"744:16:198","nodeType":"ErrorDefinition","parameters":{"id":22088,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22083,"mutability":"mutable","name":"staker","nameLocation":"769:6:198","nodeType":"VariableDeclaration","scope":22089,"src":"761:14:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22082,"name":"address","nodeType":"ElementaryTypeName","src":"761:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22085,"mutability":"mutable","name":"tokenId","nameLocation":"785:7:198","nodeType":"VariableDeclaration","scope":22089,"src":"777:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22084,"name":"uint256","nodeType":"ElementaryTypeName","src":"777:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":22087,"mutability":"mutable","name":"owner","nameLocation":"802:5:198","nodeType":"VariableDeclaration","scope":22089,"src":"794:13:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22086,"name":"address","nodeType":"ElementaryTypeName","src":"794:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"760:48:198"},"src":"738:71:198"},{"errorSelector":"38c4e116","id":22093,"name":"InvalidRecoveryToken","nameLocation":"820:20:198","nodeType":"ErrorDefinition","parameters":{"id":22092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22091,"mutability":"mutable","name":"tokenId","nameLocation":"849:7:198","nodeType":"VariableDeclaration","scope":22093,"src":"841:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22090,"name":"uint256","nodeType":"ElementaryTypeName","src":"841:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"840:17:198"},"src":"814:44:198"},{"body":{"id":22112,"nodeType":"Block","src":"1048:45:198","statements":[{"expression":{"id":22110,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22108,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"1058:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":22109,"name":"stakingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22096,"src":"1074:12:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"src":"1058:28:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22111,"nodeType":"ExpressionStatement","src":"1058:28:198"}]},"id":22113,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":22104,"name":"scalingFactorDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22098,"src":"1006:21:198","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":22105,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22101,"src":"1029:17:198","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":22106,"kind":"baseConstructorSpecifier","modifierName":{"id":22103,"name":"LinearPool","nameLocations":["995:10:198"],"nodeType":"IdentifierPath","referencedDeclaration":21014,"src":"995:10:198"},"nodeType":"ModifierInvocation","src":"995:52:198"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22102,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22096,"mutability":"mutable","name":"stakingToken","nameLocation":"893:12:198","nodeType":"VariableDeclaration","scope":22113,"src":"885:20:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"},"typeName":{"id":22095,"nodeType":"UserDefinedTypeName","pathNode":{"id":22094,"name":"IERC721","nameLocations":["885:7:198"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"885:7:198"},"referencedDeclaration":33094,"src":"885:7:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"visibility":"internal"},{"constant":false,"id":22098,"mutability":"mutable","name":"scalingFactorDecimals","nameLocation":"921:21:198","nodeType":"VariableDeclaration","scope":22113,"src":"915:27:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":22097,"name":"uint8","nodeType":"ElementaryTypeName","src":"915:5:198","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":22101,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"971:17:198","nodeType":"VariableDeclaration","scope":22113,"src":"952:36:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":22100,"nodeType":"UserDefinedTypeName","pathNode":{"id":22099,"name":"IForwarderRegistry","nameLocations":["952:18:198"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"952:18:198"},"referencedDeclaration":13386,"src":"952:18:198","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"875:119:198"},"returnParameters":{"id":22107,"nodeType":"ParameterList","parameters":[],"src":"1048:0:198"},"scope":22552,"src":"864:229:198","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"baseFunctions":[33216],"body":{"id":22164,"nodeType":"Block","src":"1575:274:198","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":22134,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":22128,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1589:3:198","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":22129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1593:6:198","memberName":"sender","nodeType":"MemberAccess","src":"1589:10:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"id":22132,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"1611:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}],"id":22131,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1603:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22130,"name":"address","nodeType":"ElementaryTypeName","src":"1603:7:198","typeDescriptions":{}}},"id":22133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1603:22:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1589:36:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22138,"nodeType":"IfStatement","src":"1585:63:198","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":22135,"name":"InvalidToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22081,"src":"1634:12:198","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":22136,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1634:14:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":22137,"nodeType":"RevertStatement","src":"1627:21:198"}},{"assignments":[22140],"declarations":[{"constant":false,"id":22140,"mutability":"mutable","name":"requiresTransfer","nameLocation":"1663:16:198","nodeType":"VariableDeclaration","scope":22164,"src":"1658:21:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22139,"name":"bool","nodeType":"ElementaryTypeName","src":"1658:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":22142,"initialValue":{"hexValue":"66616c7365","id":22141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1682:5:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"1658:29:198"},{"assignments":[22144],"declarations":[{"constant":false,"id":22144,"mutability":"mutable","name":"batch","nameLocation":"1702:5:198","nodeType":"VariableDeclaration","scope":22164,"src":"1697:10:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22143,"name":"bool","nodeType":"ElementaryTypeName","src":"1697:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":22146,"initialValue":{"hexValue":"66616c7365","id":22145,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1710:5:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"nodeType":"VariableDeclarationStatement","src":"1697:18:198"},{"expression":{"arguments":[{"id":22148,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22118,"src":"1732:4:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":22151,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22140,"src":"1749:16:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":22154,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22144,"src":"1778:5:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":22155,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22120,"src":"1785:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":22152,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1767:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22153,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1771:6:198","memberName":"encode","nodeType":"MemberAccess","src":"1767:10:198","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":22156,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1767:26:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":22149,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1738:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22150,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1742:6:198","memberName":"encode","nodeType":"MemberAccess","src":"1738:10:198","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":22157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1738:56:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":22147,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"1725:6:198","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":22158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1725:70:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22159,"nodeType":"ExpressionStatement","src":"1725:70:198"},{"expression":{"expression":{"expression":{"id":22160,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1812:4:198","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}},"id":22161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1817:16:198","memberName":"onERC721Received","nodeType":"MemberAccess","referencedDeclaration":22165,"src":"1812:21:198","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,bytes memory) external returns (bytes4)"}},"id":22162,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1834:8:198","memberName":"selector","nodeType":"MemberAccess","src":"1812:30:198","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"functionReturnParameters":22127,"id":22163,"nodeType":"Return","src":"1805:37:198"}]},"documentation":{"id":22114,"nodeType":"StructuredDocumentation","src":"1099:346:198","text":"@notice Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\n @param from The address of the sender.\n @param tokenId The ID of the token received.\n @return bytes4 The function selector of the callback.\n @dev Reverts with {InvalidToken} if the sender is not the staking token."},"functionSelector":"150b7a02","id":22165,"implemented":true,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"1459:16:198","nodeType":"FunctionDefinition","overrides":{"id":22124,"nodeType":"OverrideSpecifier","overrides":[],"src":"1549:8:198"},"parameters":{"id":22123,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22116,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":22165,"src":"1476:7:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22115,"name":"address","nodeType":"ElementaryTypeName","src":"1476:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22118,"mutability":"mutable","name":"from","nameLocation":"1493:4:198","nodeType":"VariableDeclaration","scope":22165,"src":"1485:12:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22117,"name":"address","nodeType":"ElementaryTypeName","src":"1485:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22120,"mutability":"mutable","name":"tokenId","nameLocation":"1507:7:198","nodeType":"VariableDeclaration","scope":22165,"src":"1499:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22119,"name":"uint256","nodeType":"ElementaryTypeName","src":"1499:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":22122,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":22165,"src":"1516:14:198","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":22121,"name":"bytes","nodeType":"ElementaryTypeName","src":"1516:5:198","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1475:56:198"},"returnParameters":{"id":22127,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22126,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":22165,"src":"1567:6:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":22125,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1567:6:198","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1566:8:198"},"scope":22552,"src":"1450:399:198","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[20560],"body":{"id":22186,"nodeType":"Block","src":"2157:116:198","statements":[{"assignments":[22173],"declarations":[{"constant":false,"id":22173,"mutability":"mutable","name":"requiresTransfer","nameLocation":"2172:16:198","nodeType":"VariableDeclaration","scope":22186,"src":"2167:21:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22172,"name":"bool","nodeType":"ElementaryTypeName","src":"2167:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":22175,"initialValue":{"hexValue":"74727565","id":22174,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2191:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"nodeType":"VariableDeclarationStatement","src":"2167:28:198"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22177,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[20999],"referencedDeclaration":20999,"src":"2212:10:198","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22178,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2212:12:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":22181,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22173,"src":"2237:16:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":22182,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22168,"src":"2255:9:198","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":22179,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2226:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22180,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2230:6:198","memberName":"encode","nodeType":"MemberAccess","src":"2226:10:198","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":22183,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2226:39:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":22176,"name":"_stake","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":20606,"src":"2205:6:198","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,bytes memory)"}},"id":22184,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2205:61:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22185,"nodeType":"ExpressionStatement","src":"2205:61:198"}]},"documentation":{"id":22166,"nodeType":"StructuredDocumentation","src":"1855:224:198","text":"@inheritdoc LinearPool\n @param stakeData The data to be used for staking, encoded as\n   (bool batch, uint256 tokenId) where batch is false, or\n   (bool batch, uint256[] tokenIds) where batch is true."},"functionSelector":"2d1e0c02","id":22187,"implemented":true,"kind":"function","modifiers":[],"name":"stake","nameLocation":"2093:5:198","nodeType":"FunctionDefinition","overrides":{"id":22170,"nodeType":"OverrideSpecifier","overrides":[],"src":"2148:8:198"},"parameters":{"id":22169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22168,"mutability":"mutable","name":"stakeData","nameLocation":"2114:9:198","nodeType":"VariableDeclaration","scope":22187,"src":"2099:24:198","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":22167,"name":"bytes","nodeType":"ElementaryTypeName","src":"2099:5:198","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2098:26:198"},"returnParameters":{"id":22171,"nodeType":"ParameterList","parameters":[],"src":"2157:0:198"},"scope":22552,"src":"2084:189:198","stateMutability":"payable","virtual":true,"visibility":"public"},{"baseFunctions":[20953],"body":{"id":22325,"nodeType":"Block","src":"2687:944:198","statements":[{"assignments":[22199,22201],"declarations":[{"constant":false,"id":22199,"mutability":"mutable","name":"requiresTransfer","nameLocation":"2703:16:198","nodeType":"VariableDeclaration","scope":22325,"src":"2698:21:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22198,"name":"bool","nodeType":"ElementaryTypeName","src":"2698:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":22201,"mutability":"mutable","name":"data","nameLocation":"2734:4:198","nodeType":"VariableDeclaration","scope":22325,"src":"2721:17:198","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":22200,"name":"bytes","nodeType":"ElementaryTypeName","src":"2721:5:198","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":22211,"initialValue":{"arguments":[{"id":22204,"name":"stakeData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22192,"src":"2753:9:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22206,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2765:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22205,"name":"bool","nodeType":"ElementaryTypeName","src":"2765:4:198","typeDescriptions":{}}},{"id":22208,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2771:5:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":22207,"name":"bytes","nodeType":"ElementaryTypeName","src":"2771:5:198","typeDescriptions":{}}}],"id":22209,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2764:13:198","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$","typeString":"tuple(type(bool),type(bytes storage pointer))"}],"expression":{"id":22202,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2742:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22203,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2746:6:198","memberName":"decode","nodeType":"MemberAccess","src":"2742:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2742:36:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"2697:81:198"},{"assignments":[22213],"declarations":[{"constant":false,"id":22213,"mutability":"mutable","name":"batch","nameLocation":"2793:5:198","nodeType":"VariableDeclaration","scope":22325,"src":"2788:10:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22212,"name":"bool","nodeType":"ElementaryTypeName","src":"2788:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":22221,"initialValue":{"arguments":[{"id":22216,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22201,"src":"2812:4:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22218,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2819:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22217,"name":"bool","nodeType":"ElementaryTypeName","src":"2819:4:198","typeDescriptions":{}}}],"id":22219,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2818:6:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}],"expression":{"id":22214,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2801:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22215,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2805:6:198","memberName":"decode","nodeType":"MemberAccess","src":"2801:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2801:24:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"2788:37:198"},{"condition":{"id":22222,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22213,"src":"2839:5:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":22323,"nodeType":"Block","src":"3328:297:198","statements":[{"assignments":[null,22286],"declarations":[null,{"constant":false,"id":22286,"mutability":"mutable","name":"tokenId","nameLocation":"3353:7:198","nodeType":"VariableDeclaration","scope":22323,"src":"3345:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22285,"name":"uint256","nodeType":"ElementaryTypeName","src":"3345:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22296,"initialValue":{"arguments":[{"id":22289,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22201,"src":"3375:4:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3382:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22290,"name":"bool","nodeType":"ElementaryTypeName","src":"3382:4:198","typeDescriptions":{}}},{"id":22293,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3388:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":22292,"name":"uint256","nodeType":"ElementaryTypeName","src":"3388:7:198","typeDescriptions":{}}}],"id":22294,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3381:15:198","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256))"}],"expression":{"id":22287,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3364:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22288,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3368:6:198","memberName":"decode","nodeType":"MemberAccess","src":"3364:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3364:33:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"3342:55:198"},{"expression":{"id":22301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":22297,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"3411:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22299,"indexExpression":{"id":22298,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22286,"src":"3423:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3411:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":22300,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22190,"src":"3434:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3411:29:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":22302,"nodeType":"ExpressionStatement","src":"3411:29:198"},{"expression":{"id":22307,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22303,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22196,"src":"3454:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":22305,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22286,"src":"3480:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22304,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22551,"src":"3468:11:198","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":22306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3468:20:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3454:34:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22308,"nodeType":"ExpressionStatement","src":"3454:34:198"},{"condition":{"id":22309,"name":"requiresTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22199,"src":"3506:16:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22322,"nodeType":"IfStatement","src":"3502:113:198","trueBody":{"id":22321,"nodeType":"Block","src":"3524:91:198","statements":[{"expression":{"arguments":[{"id":22313,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22190,"src":"3569:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":22316,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3585:4:198","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}],"id":22315,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3577:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22314,"name":"address","nodeType":"ElementaryTypeName","src":"3577:7:198","typeDescriptions":{}}},"id":22317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3577:13:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22318,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22286,"src":"3592:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":22310,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"3542:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22312,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3556:12:198","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33037,"src":"3542:26:198","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":22319,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3542:58:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22320,"nodeType":"ExpressionStatement","src":"3542:58:198"}]}}]},"id":22324,"nodeType":"IfStatement","src":"2835:790:198","trueBody":{"id":22284,"nodeType":"Block","src":"2846:476:198","statements":[{"assignments":[null,22227],"declarations":[null,{"constant":false,"id":22227,"mutability":"mutable","name":"tokenIds","nameLocation":"2880:8:198","nodeType":"VariableDeclaration","scope":22284,"src":"2863:25:198","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22225,"name":"uint256","nodeType":"ElementaryTypeName","src":"2863:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22226,"nodeType":"ArrayTypeName","src":"2863:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":22238,"initialValue":{"arguments":[{"id":22230,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22201,"src":"2903:4:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22232,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2910:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22231,"name":"bool","nodeType":"ElementaryTypeName","src":"2910:4:198","typeDescriptions":{}}},{"baseExpression":{"id":22234,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2916:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":22233,"name":"uint256","nodeType":"ElementaryTypeName","src":"2916:7:198","typeDescriptions":{}}},"id":22235,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"2916:9:198","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}}],"id":22236,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"2909:17:198","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory))"}],"expression":{"id":22228,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2892:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22229,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2896:6:198","memberName":"decode","nodeType":"MemberAccess","src":"2892:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22237,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2892:35:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"tuple(bool,uint256[] memory)"}},"nodeType":"VariableDeclarationStatement","src":"2860:67:198"},{"assignments":[22240],"declarations":[{"constant":false,"id":22240,"mutability":"mutable","name":"count","nameLocation":"2949:5:198","nodeType":"VariableDeclaration","scope":22284,"src":"2941:13:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22239,"name":"uint256","nodeType":"ElementaryTypeName","src":"2941:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22243,"initialValue":{"expression":{"id":22241,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22227,"src":"2957:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":22242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2966:6:198","memberName":"length","nodeType":"MemberAccess","src":"2957:15:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"2941:31:198"},{"body":{"id":22282,"nodeType":"Block","src":"3019:293:198","statements":[{"assignments":[22254],"declarations":[{"constant":false,"id":22254,"mutability":"mutable","name":"tokenId","nameLocation":"3045:7:198","nodeType":"VariableDeclaration","scope":22282,"src":"3037:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22253,"name":"uint256","nodeType":"ElementaryTypeName","src":"3037:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22258,"initialValue":{"baseExpression":{"id":22255,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22227,"src":"3055:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":22257,"indexExpression":{"id":22256,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22245,"src":"3064:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3055:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3037:29:198"},{"expression":{"id":22263,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":22259,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"3084:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22261,"indexExpression":{"id":22260,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22254,"src":"3096:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3084:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":22262,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22190,"src":"3107:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3084:29:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":22264,"nodeType":"ExpressionStatement","src":"3084:29:198"},{"expression":{"id":22269,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22265,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22196,"src":"3131:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":22267,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22254,"src":"3158:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22266,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22551,"src":"3146:11:198","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":22268,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3146:20:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3131:35:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22270,"nodeType":"ExpressionStatement","src":"3131:35:198"},{"expression":{"arguments":[{"id":22274,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22190,"src":"3266:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":22277,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3282:4:198","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}],"id":22276,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3274:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22275,"name":"address","nodeType":"ElementaryTypeName","src":"3274:7:198","typeDescriptions":{}}},"id":22278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3274:13:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22279,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22254,"src":"3289:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":22271,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"3239:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3253:12:198","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33037,"src":"3239:26:198","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":22280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3239:58:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22281,"nodeType":"ExpressionStatement","src":"3239:58:198"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22247,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22245,"src":"3002:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":22248,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22240,"src":"3007:5:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3002:10:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22283,"initializationExpression":{"assignments":[22245],"declarations":[{"constant":false,"id":22245,"mutability":"mutable","name":"i","nameLocation":"2999:1:198","nodeType":"VariableDeclaration","scope":22283,"src":"2991:9:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22244,"name":"uint256","nodeType":"ElementaryTypeName","src":"2991:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22246,"nodeType":"VariableDeclarationStatement","src":"2991:9:198"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":22251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"3014:3:198","subExpression":{"id":22250,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22245,"src":"3016:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22252,"nodeType":"ExpressionStatement","src":"3014:3:198"},"nodeType":"ForStatement","src":"2986:326:198"}]}}]},"documentation":{"id":22188,"nodeType":"StructuredDocumentation","src":"2279:284:198","text":"@inheritdoc LinearPool\n @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\n   (bool batch, uint256 tokenId) where batch is false, or\n   (bool batch, uint256[] tokenIds) where batch is true."},"id":22326,"implemented":true,"kind":"function","modifiers":[],"name":"_computeStake","nameLocation":"2577:13:198","nodeType":"FunctionDefinition","overrides":{"id":22194,"nodeType":"OverrideSpecifier","overrides":[],"src":"2648:8:198"},"parameters":{"id":22193,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22190,"mutability":"mutable","name":"staker","nameLocation":"2599:6:198","nodeType":"VariableDeclaration","scope":22326,"src":"2591:14:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22189,"name":"address","nodeType":"ElementaryTypeName","src":"2591:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22192,"mutability":"mutable","name":"stakeData","nameLocation":"2620:9:198","nodeType":"VariableDeclaration","scope":22326,"src":"2607:22:198","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":22191,"name":"bytes","nodeType":"ElementaryTypeName","src":"2607:5:198","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2590:40:198"},"returnParameters":{"id":22197,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22196,"mutability":"mutable","name":"stakePoints","nameLocation":"2674:11:198","nodeType":"VariableDeclaration","scope":22326,"src":"2666:19:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22195,"name":"uint256","nodeType":"ElementaryTypeName","src":"2666:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2665:21:198"},"scope":22552,"src":"2568:1063:198","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[20963],"body":{"id":22479,"nodeType":"Block","src":"3998:1062:198","statements":[{"assignments":[22338],"declarations":[{"constant":false,"id":22338,"mutability":"mutable","name":"batch","nameLocation":"4013:5:198","nodeType":"VariableDeclaration","scope":22479,"src":"4008:10:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22337,"name":"bool","nodeType":"ElementaryTypeName","src":"4008:4:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":22346,"initialValue":{"arguments":[{"id":22341,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22331,"src":"4032:12:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22343,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4047:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22342,"name":"bool","nodeType":"ElementaryTypeName","src":"4047:4:198","typeDescriptions":{}}}],"id":22344,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4046:6:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"}],"expression":{"id":22339,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4021:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22340,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4025:6:198","memberName":"decode","nodeType":"MemberAccess","src":"4021:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22345,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4021:32:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"4008:45:198"},{"condition":{"id":22347,"name":"batch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22338,"src":"4067:5:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":22477,"nodeType":"Block","src":"4660:394:198","statements":[{"assignments":[null,22427],"declarations":[null,{"constant":false,"id":22427,"mutability":"mutable","name":"tokenId","nameLocation":"4685:7:198","nodeType":"VariableDeclaration","scope":22477,"src":"4677:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22426,"name":"uint256","nodeType":"ElementaryTypeName","src":"4677:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22437,"initialValue":{"arguments":[{"id":22430,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22331,"src":"4707:12:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22432,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4722:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22431,"name":"bool","nodeType":"ElementaryTypeName","src":"4722:4:198","typeDescriptions":{}}},{"id":22434,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4728:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":22433,"name":"uint256","nodeType":"ElementaryTypeName","src":"4728:7:198","typeDescriptions":{}}}],"id":22435,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4721:15:198","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$","typeString":"tuple(type(bool),type(uint256))"}],"expression":{"id":22428,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4696:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22429,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4700:6:198","memberName":"decode","nodeType":"MemberAccess","src":"4696:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22436,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4696:41:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_uint256_$","typeString":"tuple(bool,uint256)"}},"nodeType":"VariableDeclarationStatement","src":"4674:63:198"},{"assignments":[22439],"declarations":[{"constant":false,"id":22439,"mutability":"mutable","name":"tokenOwner","nameLocation":"4759:10:198","nodeType":"VariableDeclaration","scope":22477,"src":"4751:18:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22438,"name":"address","nodeType":"ElementaryTypeName","src":"4751:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":22443,"initialValue":{"baseExpression":{"id":22440,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"4772:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22442,"indexExpression":{"id":22441,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22427,"src":"4784:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4772:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4751:41:198"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":22447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22445,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"4814:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":22446,"name":"tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22439,"src":"4824:10:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4814:20:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":22449,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"4853:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22450,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22427,"src":"4861:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22451,"name":"tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22439,"src":"4870:10:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":22448,"name":"NotTheTokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22089,"src":"4836:16:198","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_address_$returns$_t_error_$","typeString":"function (address,uint256,address) pure returns (error)"}},"id":22452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4836:45:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":22444,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4806:7:198","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":22453,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4806:76:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22454,"nodeType":"ExpressionStatement","src":"4806:76:198"},{"expression":{"id":22458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"4896:27:198","subExpression":{"baseExpression":{"id":22455,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"4903:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22457,"indexExpression":{"id":22456,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22427,"src":"4915:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4903:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22459,"nodeType":"ExpressionStatement","src":"4896:27:198"},{"expression":{"id":22464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22460,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22335,"src":"4937:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":22462,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22427,"src":"4963:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22461,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22551,"src":"4951:11:198","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":22463,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4951:20:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4937:34:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22465,"nodeType":"ExpressionStatement","src":"4937:34:198"},{"expression":{"arguments":[{"arguments":[{"id":22471,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5020:4:198","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}],"id":22470,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5012:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22469,"name":"address","nodeType":"ElementaryTypeName","src":"5012:7:198","typeDescriptions":{}}},"id":22472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5012:13:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22473,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"5027:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22474,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22427,"src":"5035:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":22466,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"4985:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22468,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4999:12:198","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33037,"src":"4985:26:198","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":22475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4985:58:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22476,"nodeType":"ExpressionStatement","src":"4985:58:198"}]},"id":22478,"nodeType":"IfStatement","src":"4063:991:198","trueBody":{"id":22425,"nodeType":"Block","src":"4074:580:198","statements":[{"assignments":[null,22352],"declarations":[null,{"constant":false,"id":22352,"mutability":"mutable","name":"tokenIds","nameLocation":"4108:8:198","nodeType":"VariableDeclaration","scope":22425,"src":"4091:25:198","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22350,"name":"uint256","nodeType":"ElementaryTypeName","src":"4091:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22351,"nodeType":"ArrayTypeName","src":"4091:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":22363,"initialValue":{"arguments":[{"id":22355,"name":"withdrawData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22331,"src":"4131:12:198","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":22357,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4146:4:198","typeDescriptions":{"typeIdentifier":"t_type$_t_bool_$","typeString":"type(bool)"},"typeName":{"id":22356,"name":"bool","nodeType":"ElementaryTypeName","src":"4146:4:198","typeDescriptions":{}}},{"baseExpression":{"id":22359,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4152:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":22358,"name":"uint256","nodeType":"ElementaryTypeName","src":"4152:7:198","typeDescriptions":{}}},"id":22360,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"IndexAccess","src":"4152:9:198","typeDescriptions":{"typeIdentifier":"t_type$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"type(uint256[] memory)"}}],"id":22361,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4145:17:198","typeDescriptions":{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory))"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_tuple$_t_type$_t_bool_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$","typeString":"tuple(type(bool),type(uint256[] memory))"}],"expression":{"id":22353,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4120:3:198","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":22354,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4124:6:198","memberName":"decode","nodeType":"MemberAccess","src":"4120:10:198","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":22362,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4120:43:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"tuple(bool,uint256[] memory)"}},"nodeType":"VariableDeclarationStatement","src":"4088:75:198"},{"assignments":[22365],"declarations":[{"constant":false,"id":22365,"mutability":"mutable","name":"count","nameLocation":"4185:5:198","nodeType":"VariableDeclaration","scope":22425,"src":"4177:13:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22364,"name":"uint256","nodeType":"ElementaryTypeName","src":"4177:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22368,"initialValue":{"expression":{"id":22366,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22352,"src":"4193:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":22367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4202:6:198","memberName":"length","nodeType":"MemberAccess","src":"4193:15:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4177:31:198"},{"body":{"id":22423,"nodeType":"Block","src":"4255:389:198","statements":[{"assignments":[22379],"declarations":[{"constant":false,"id":22379,"mutability":"mutable","name":"tokenId","nameLocation":"4281:7:198","nodeType":"VariableDeclaration","scope":22423,"src":"4273:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22378,"name":"uint256","nodeType":"ElementaryTypeName","src":"4273:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22383,"initialValue":{"baseExpression":{"id":22380,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22352,"src":"4291:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":22382,"indexExpression":{"id":22381,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22370,"src":"4300:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4291:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4273:29:198"},{"assignments":[22385],"declarations":[{"constant":false,"id":22385,"mutability":"mutable","name":"tokenOwner","nameLocation":"4328:10:198","nodeType":"VariableDeclaration","scope":22423,"src":"4320:18:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22384,"name":"address","nodeType":"ElementaryTypeName","src":"4320:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":22389,"initialValue":{"baseExpression":{"id":22386,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"4341:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22388,"indexExpression":{"id":22387,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22379,"src":"4353:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4341:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4320:41:198"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":22393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22391,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"4387:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":22392,"name":"tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22385,"src":"4397:10:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4387:20:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":22395,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"4426:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22396,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22379,"src":"4434:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22397,"name":"tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22385,"src":"4443:10:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"id":22394,"name":"NotTheTokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22089,"src":"4409:16:198","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_address_$returns$_t_error_$","typeString":"function (address,uint256,address) pure returns (error)"}},"id":22398,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4409:45:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":22390,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4379:7:198","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":22399,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4379:76:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22400,"nodeType":"ExpressionStatement","src":"4379:76:198"},{"expression":{"id":22404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"4473:27:198","subExpression":{"baseExpression":{"id":22401,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"4480:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22403,"indexExpression":{"id":22402,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22379,"src":"4492:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4480:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22405,"nodeType":"ExpressionStatement","src":"4473:27:198"},{"expression":{"id":22410,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":22406,"name":"stakePoints","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22335,"src":"4518:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"arguments":[{"id":22408,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22379,"src":"4545:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22407,"name":"_tokenValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22551,"src":"4533:11:198","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) view returns (uint256)"}},"id":22409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4533:20:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4518:35:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22411,"nodeType":"ExpressionStatement","src":"4518:35:198"},{"expression":{"arguments":[{"arguments":[{"id":22417,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4606:4:198","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC721StakingLinearPool_$22552","typeString":"contract ERC721StakingLinearPool"}],"id":22416,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4598:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22415,"name":"address","nodeType":"ElementaryTypeName","src":"4598:7:198","typeDescriptions":{}}},"id":22418,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4598:13:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22419,"name":"staker","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22329,"src":"4613:6:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22420,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22379,"src":"4621:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":22412,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"4571:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22414,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4585:12:198","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33037,"src":"4571:26:198","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256) external"}},"id":22421,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4571:58:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22422,"nodeType":"ExpressionStatement","src":"4571:58:198"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22374,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22372,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22370,"src":"4238:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":22373,"name":"count","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22365,"src":"4243:5:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4238:10:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22424,"initializationExpression":{"assignments":[22370],"declarations":[{"constant":false,"id":22370,"mutability":"mutable","name":"i","nameLocation":"4235:1:198","nodeType":"VariableDeclaration","scope":22424,"src":"4227:9:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22369,"name":"uint256","nodeType":"ElementaryTypeName","src":"4227:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22371,"nodeType":"VariableDeclarationStatement","src":"4227:9:198"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":22376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"4250:3:198","subExpression":{"id":22375,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22370,"src":"4252:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22377,"nodeType":"ExpressionStatement","src":"4250:3:198"},"nodeType":"ForStatement","src":"4222:422:198"}]}}]},"documentation":{"id":22327,"nodeType":"StructuredDocumentation","src":"3637:231:198","text":"@inheritdoc LinearPool\n @param withdrawData The data to be used for withdrawing, encoded as\n   (bool batch, uint256 tokenId) where batch is false, or\n   (bool batch, uint256[] tokenIds) where batch is true."},"id":22480,"implemented":true,"kind":"function","modifiers":[],"name":"_computeWithdraw","nameLocation":"3882:16:198","nodeType":"FunctionDefinition","overrides":{"id":22333,"nodeType":"OverrideSpecifier","overrides":[],"src":"3959:8:198"},"parameters":{"id":22332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22329,"mutability":"mutable","name":"staker","nameLocation":"3907:6:198","nodeType":"VariableDeclaration","scope":22480,"src":"3899:14:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22328,"name":"address","nodeType":"ElementaryTypeName","src":"3899:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22331,"mutability":"mutable","name":"withdrawData","nameLocation":"3928:12:198","nodeType":"VariableDeclaration","scope":22480,"src":"3915:25:198","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":22330,"name":"bytes","nodeType":"ElementaryTypeName","src":"3915:5:198","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3898:43:198"},"returnParameters":{"id":22336,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22335,"mutability":"mutable","name":"stakePoints","nameLocation":"3985:11:198","nodeType":"VariableDeclaration","scope":22480,"src":"3977:19:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22334,"name":"uint256","nodeType":"ElementaryTypeName","src":"3977:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3976:21:198"},"scope":22552,"src":"3873:1187:198","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"baseFunctions":[19809],"body":{"id":22542,"nodeType":"Block","src":"5370:334:198","statements":[{"body":{"id":22532,"nodeType":"Block","src":"5424:213:198","statements":[{"condition":{"commonType":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"},"id":22509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":22505,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22488,"src":"5442:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},"id":22507,"indexExpression":{"id":22506,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22496,"src":"5452:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5442:12:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":22508,"name":"STAKING_TOKEN","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22075,"src":"5458:13:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"src":"5442:29:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22531,"nodeType":"IfStatement","src":"5438:189:198","trueBody":{"id":22530,"nodeType":"Block","src":"5473:154:198","statements":[{"assignments":[22511],"declarations":[{"constant":false,"id":22511,"mutability":"mutable","name":"tokenId","nameLocation":"5499:7:198","nodeType":"VariableDeclaration","scope":22530,"src":"5491:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22510,"name":"uint256","nodeType":"ElementaryTypeName","src":"5491:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22515,"initialValue":{"baseExpression":{"id":22512,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22491,"src":"5509:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":22514,"indexExpression":{"id":22513,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22496,"src":"5518:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5509:11:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5491:29:198"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":22524,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":22517,"name":"tokenOwners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22079,"src":"5546:11:198","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":22519,"indexExpression":{"id":22518,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22511,"src":"5558:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5546:20:198","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":22522,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5578:1:198","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":22521,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5570:7:198","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":22520,"name":"address","nodeType":"ElementaryTypeName","src":"5570:7:198","typeDescriptions":{}}},"id":22523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5570:10:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5546:34:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"arguments":[{"id":22526,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22511,"src":"5603:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":22525,"name":"InvalidRecoveryToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22093,"src":"5582:20:198","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":22527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5582:29:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_error","typeString":"error"}],"id":22516,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"5538:7:198","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_error_$returns$__$","typeString":"function (bool,error) pure"}},"id":22528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5538:74:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22529,"nodeType":"ExpressionStatement","src":"5538:74:198"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":22501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":22498,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22496,"src":"5396:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":22499,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22488,"src":"5401:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},"id":22500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5411:6:198","memberName":"length","nodeType":"MemberAccess","src":"5401:16:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5396:21:198","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":22533,"initializationExpression":{"assignments":[22496],"declarations":[{"constant":false,"id":22496,"mutability":"mutable","name":"i","nameLocation":"5393:1:198","nodeType":"VariableDeclaration","scope":22533,"src":"5385:9:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22495,"name":"uint256","nodeType":"ElementaryTypeName","src":"5385:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":22497,"nodeType":"VariableDeclarationStatement","src":"5385:9:198"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":22503,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"5419:3:198","subExpression":{"id":22502,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22496,"src":"5421:1:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22504,"nodeType":"ExpressionStatement","src":"5419:3:198"},"nodeType":"ForStatement","src":"5380:257:198"},{"expression":{"arguments":[{"id":22537,"name":"accounts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22484,"src":"5667:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":22538,"name":"contracts","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22488,"src":"5677:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"}},{"id":22539,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22491,"src":"5688:8:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":22534,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"5646:5:198","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_ERC721StakingLinearPool_$22552_$","typeString":"type(contract super ERC721StakingLinearPool)"}},"id":22536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5652:14:198","memberName":"recoverERC721s","nodeType":"MemberAccess","referencedDeclaration":19809,"src":"5646:20:198","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$","typeString":"function (address[] calldata,contract IERC721[] calldata,uint256[] calldata)"}},"id":22540,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5646:51:198","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22541,"nodeType":"ExpressionStatement","src":"5646:51:198"}]},"documentation":{"id":22481,"nodeType":"StructuredDocumentation","src":"5066:163:198","text":"@inheritdoc TokenRecoveryBase\n @dev Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract."},"functionSelector":"c3666c36","id":22543,"implemented":true,"kind":"function","modifiers":[],"name":"recoverERC721s","nameLocation":"5243:14:198","nodeType":"FunctionDefinition","overrides":{"id":22493,"nodeType":"OverrideSpecifier","overrides":[],"src":"5361:8:198"},"parameters":{"id":22492,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22484,"mutability":"mutable","name":"accounts","nameLocation":"5277:8:198","nodeType":"VariableDeclaration","scope":22543,"src":"5258:27:198","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":22482,"name":"address","nodeType":"ElementaryTypeName","src":"5258:7:198","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":22483,"nodeType":"ArrayTypeName","src":"5258:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":22488,"mutability":"mutable","name":"contracts","nameLocation":"5306:9:198","nodeType":"VariableDeclaration","scope":22543,"src":"5287:28:198","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_calldata_ptr","typeString":"contract IERC721[]"},"typeName":{"baseType":{"id":22486,"nodeType":"UserDefinedTypeName","pathNode":{"id":22485,"name":"IERC721","nameLocations":["5287:7:198"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"5287:7:198"},"referencedDeclaration":33094,"src":"5287:7:198","typeDescriptions":{"typeIdentifier":"t_contract$_IERC721_$33094","typeString":"contract IERC721"}},"id":22487,"nodeType":"ArrayTypeName","src":"5287:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_contract$_IERC721_$33094_$dyn_storage_ptr","typeString":"contract IERC721[]"}},"visibility":"internal"},{"constant":false,"id":22491,"mutability":"mutable","name":"tokenIds","nameLocation":"5336:8:198","nodeType":"VariableDeclaration","scope":22543,"src":"5317:27:198","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22489,"name":"uint256","nodeType":"ElementaryTypeName","src":"5317:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22490,"nodeType":"ArrayTypeName","src":"5317:9:198","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"5257:88:198"},"returnParameters":{"id":22494,"nodeType":"ParameterList","parameters":[],"src":"5370:0:198"},"scope":22552,"src":"5234:470:198","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"documentation":{"id":22544,"nodeType":"StructuredDocumentation","src":"5710:163:198","text":"@notice Computes the stake points for a given token ID.\n @param tokenId The ID of the token.\n @return stakePoints The stake points for the token."},"id":22551,"implemented":false,"kind":"function","modifiers":[],"name":"_tokenValue","nameLocation":"5887:11:198","nodeType":"FunctionDefinition","parameters":{"id":22547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22546,"mutability":"mutable","name":"tokenId","nameLocation":"5907:7:198","nodeType":"VariableDeclaration","scope":22551,"src":"5899:15:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22545,"name":"uint256","nodeType":"ElementaryTypeName","src":"5899:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5898:17:198"},"returnParameters":{"id":22550,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22549,"mutability":"mutable","name":"stakePoints","nameLocation":"5955:11:198","nodeType":"VariableDeclaration","scope":22551,"src":"5947:19:198","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22548,"name":"uint256","nodeType":"ElementaryTypeName","src":"5947:7:198","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5946:21:198"},"scope":22552,"src":"5878:90:198","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":22553,"src":"522:5448:198","usedErrors":[464,1216,1219,1294,7886,8223,8246,11559,20056,20358,20360,20362,20370,20378,20380,20382,20388,20390,22081,22089,22093],"usedEvents":[8269,8278,8287,20330,20338,20348,20356]}],"src":"32:5939:198"},"id":198},"contracts/token/ERC1155/ERC1155.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155.sol","exportedSymbols":{"ERC1155":[22576],"ERC1155Base":[22929],"ERC1155Storage":[25484],"InterfaceDetection":[11554]},"id":22577,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22554,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:199"},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22556,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22577,"sourceUnit":25485,"src":"58:62:199","symbolAliases":[{"foreign":{"id":22555,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"66:14:199","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155Base.sol","file":"./base/ERC1155Base.sol","id":22558,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22577,"sourceUnit":22930,"src":"121:51:199","symbolAliases":[{"foreign":{"id":22557,"name":"ERC1155Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22929,"src":"129:11:199","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":22560,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22577,"sourceUnit":11555,"src":"173:80:199","symbolAliases":[{"foreign":{"id":22559,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"181:18:199","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22562,"name":"ERC1155Base","nameLocations":["444:11:199"],"nodeType":"IdentifierPath","referencedDeclaration":22929,"src":"444:11:199"},"id":22563,"nodeType":"InheritanceSpecifier","src":"444:11:199"},{"baseName":{"id":22564,"name":"InterfaceDetection","nameLocations":["457:18:199"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"457:18:199"},"id":22565,"nodeType":"InheritanceSpecifier","src":"457:18:199"}],"canonicalName":"ERC1155","contractDependencies":[],"contractKind":"contract","documentation":{"id":22561,"nodeType":"StructuredDocumentation","src":"255:160:199","text":"@title ERC1155 Multi Token Standard (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22576,"linearizedBaseContracts":[22576,11554,11579,22929,1206,24178],"name":"ERC1155","nameLocation":"433:7:199","nodeType":"ContractDefinition","nodes":[{"body":{"id":22574,"nodeType":"Block","src":"573:38:199","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22569,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"583:14:199","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"598:4:199","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"583:19:199","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"583:21:199","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22573,"nodeType":"ExpressionStatement","src":"583:21:199"}]},"documentation":{"id":22566,"nodeType":"StructuredDocumentation","src":"482:72:199","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155."},"id":22575,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22567,"nodeType":"ParameterList","parameters":[],"src":"570:2:199"},"returnParameters":{"id":22568,"nodeType":"ParameterList","parameters":[],"src":"573:0:199"},"scope":22576,"src":"559:52:199","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22577,"src":"415:198:199","usedErrors":[7886,11559,23516,23519,23526,23537,23548,23557,23568,23571],"usedEvents":[23591,23606,23615]}],"src":"32:582:199"},"id":199},"contracts/token/ERC1155/ERC1155Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155Burnable.sol","exportedSymbols":{"ERC1155Burnable":[22596],"ERC1155BurnableBase":[22995],"ERC1155Storage":[25484]},"id":22597,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22578,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:200"},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22580,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22597,"sourceUnit":25485,"src":"58:62:200","symbolAliases":[{"foreign":{"id":22579,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"66:14:200","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155BurnableBase.sol","file":"./base/ERC1155BurnableBase.sol","id":22582,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22597,"sourceUnit":22996,"src":"121:67:200","symbolAliases":[{"foreign":{"id":22581,"name":"ERC1155BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22995,"src":"129:19:200","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22584,"name":"ERC1155BurnableBase","nameLocations":["417:19:200"],"nodeType":"IdentifierPath","referencedDeclaration":22995,"src":"417:19:200"},"id":22585,"nodeType":"InheritanceSpecifier","src":"417:19:200"}],"canonicalName":"ERC1155Burnable","contractDependencies":[],"contractKind":"contract","documentation":{"id":22583,"nodeType":"StructuredDocumentation","src":"190:190:200","text":"@title ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22596,"linearizedBaseContracts":[22596,22995,1206,24204],"name":"ERC1155Burnable","nameLocation":"398:15:200","nodeType":"ContractDefinition","nodes":[{"body":{"id":22594,"nodeType":"Block","src":"542:53:200","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22589,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"552:14:200","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"567:19:200","memberName":"initERC1155Burnable","nodeType":"MemberAccess","referencedDeclaration":24491,"src":"552:34:200","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22592,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"552:36:200","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22593,"nodeType":"ExpressionStatement","src":"552:36:200"}]},"documentation":{"id":22586,"nodeType":"StructuredDocumentation","src":"443:80:200","text":"@notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable"},"id":22595,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22587,"nodeType":"ParameterList","parameters":[],"src":"539:2:200"},"returnParameters":{"id":22588,"nodeType":"ParameterList","parameters":[],"src":"542:0:200"},"scope":22596,"src":"528:67:200","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22597,"src":"380:217:200","usedErrors":[7886,11559,23526,23537],"usedEvents":[23591,23606]}],"src":"32:566:200"},"id":200},"contracts/token/ERC1155/ERC1155Deliverable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155Deliverable.sol","exportedSymbols":{"AccessControl":[7901],"ERC1155Deliverable":[22620],"ERC1155DeliverableBase":[23064],"ERC1155Storage":[25484]},"id":22621,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22598,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:201"},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22600,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22621,"sourceUnit":25485,"src":"58:62:201","symbolAliases":[{"foreign":{"id":22599,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"66:14:201","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol","file":"./base/ERC1155DeliverableBase.sol","id":22602,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22621,"sourceUnit":23065,"src":"121:73:201","symbolAliases":[{"foreign":{"id":22601,"name":"ERC1155DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23064,"src":"129:22:201","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":22604,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22621,"sourceUnit":7902,"src":"195:63:201","symbolAliases":[{"foreign":{"id":22603,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"203:13:201","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22606,"name":"ERC1155DeliverableBase","nameLocations":["493:22:201"],"nodeType":"IdentifierPath","referencedDeclaration":23064,"src":"493:22:201"},"id":22607,"nodeType":"InheritanceSpecifier","src":"493:22:201"},{"baseName":{"id":22608,"name":"AccessControl","nameLocations":["517:13:201"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"517:13:201"},"id":22609,"nodeType":"InheritanceSpecifier","src":"517:13:201"}],"canonicalName":"ERC1155Deliverable","contractDependencies":[],"contractKind":"contract","documentation":{"id":22605,"nodeType":"StructuredDocumentation","src":"260:193:201","text":"@title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22620,"linearizedBaseContracts":[22620,7901,7934,11554,11579,8139,8091,23064,1206,8562,8546,24223],"name":"ERC1155Deliverable","nameLocation":"471:18:201","nodeType":"ContractDefinition","nodes":[{"body":{"id":22618,"nodeType":"Block","src":"639:56:201","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22613,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"649:14:201","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"664:22:201","memberName":"initERC1155Deliverable","nodeType":"MemberAccess","referencedDeclaration":24474,"src":"649:37:201","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"649:39:201","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22617,"nodeType":"ExpressionStatement","src":"649:39:201"}]},"documentation":{"id":22610,"nodeType":"StructuredDocumentation","src":"537:83:201","text":"@notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable"},"id":22619,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22611,"nodeType":"ParameterList","parameters":[],"src":"636:2:201"},"returnParameters":{"id":22612,"nodeType":"ParameterList","parameters":[],"src":"639:0:201"},"scope":22620,"src":"625:70:201","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22621,"src":"453:244:201","usedErrors":[7886,8223,8246,11559,23548,23557,23576],"usedEvents":[8269,8278,8287,23591]}],"src":"32:666:201"},"id":201},"contracts/token/ERC1155/ERC1155Metadata.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155Metadata.sol","exportedSymbols":{"ERC1155Metadata":[22665],"ERC1155MetadataBase":[23201],"ERC1155Storage":[25484],"ITokenMetadataResolver":[36704],"TokenMetadataStorage":[36891]},"id":22666,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22622,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:202"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../metadata/interfaces/ITokenMetadataResolver.sol","id":22624,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22666,"sourceUnit":36705,"src":"58:91:202","symbolAliases":[{"foreign":{"id":22623,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"66:22:202","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../metadata/libraries/TokenMetadataStorage.sol","id":22626,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22666,"sourceUnit":36892,"src":"150:86:202","symbolAliases":[{"foreign":{"id":22625,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"158:20:202","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22628,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22666,"sourceUnit":25485,"src":"237:62:202","symbolAliases":[{"foreign":{"id":22627,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"245:14:202","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MetadataBase.sol","file":"./base/ERC1155MetadataBase.sol","id":22630,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22666,"sourceUnit":23202,"src":"300:67:202","symbolAliases":[{"foreign":{"id":22629,"name":"ERC1155MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23201,"src":"308:19:202","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22632,"name":"ERC1155MetadataBase","nameLocations":["690:19:202"],"nodeType":"IdentifierPath","referencedDeclaration":23201,"src":"690:19:202"},"id":22633,"nodeType":"InheritanceSpecifier","src":"690:19:202"}],"canonicalName":"ERC1155Metadata","contractDependencies":[],"contractKind":"contract","documentation":{"id":22631,"nodeType":"StructuredDocumentation","src":"369:284:202","text":"@title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22665,"linearizedBaseContracts":[22665,23201,24244,24256,36683],"name":"ERC1155Metadata","nameLocation":"671:15:202","nodeType":"ContractDefinition","nodes":[{"global":false,"id":22637,"libraryName":{"id":22634,"name":"TokenMetadataStorage","nameLocations":["722:20:202"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"722:20:202"},"nodeType":"UsingForDirective","src":"716:59:202","typeName":{"id":22636,"nodeType":"UserDefinedTypeName","pathNode":{"id":22635,"name":"TokenMetadataStorage.Layout","nameLocations":["747:20:202","768:6:202"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"747:27:202"},"referencedDeclaration":36718,"src":"747:27:202","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"body":{"id":22663,"nodeType":"Block","src":"1133:143:202","statements":[{"expression":{"arguments":[{"id":22653,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22640,"src":"1189:4:202","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":22654,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22642,"src":"1195:6:202","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":22655,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22645,"src":"1203:16:202","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22648,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1143:20:202","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":22650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1164:6:202","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1143:27:202","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":22651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1143:29:202","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":22652,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1173:15:202","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":36777,"src":"1143:45:202","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string memory,string memory,contract ITokenMetadataResolver)"}},"id":22656,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1143:77:202","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22657,"nodeType":"ExpressionStatement","src":"1143:77:202"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22658,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1230:14:202","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1245:22:202","memberName":"initERC1155MetadataURI","nodeType":"MemberAccess","referencedDeclaration":24440,"src":"1230:37:202","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1230:39:202","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22662,"nodeType":"ExpressionStatement","src":"1230:39:202"}]},"documentation":{"id":22638,"nodeType":"StructuredDocumentation","src":"781:252:202","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\n @param name The name of the token.\n @param symbol The symbol of the token.\n @param metadataResolver The address of the metadata resolver contract."},"id":22664,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22646,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22640,"mutability":"mutable","name":"name","nameLocation":"1064:4:202","nodeType":"VariableDeclaration","scope":22664,"src":"1050:18:202","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":22639,"name":"string","nodeType":"ElementaryTypeName","src":"1050:6:202","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":22642,"mutability":"mutable","name":"symbol","nameLocation":"1084:6:202","nodeType":"VariableDeclaration","scope":22664,"src":"1070:20:202","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":22641,"name":"string","nodeType":"ElementaryTypeName","src":"1070:6:202","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":22645,"mutability":"mutable","name":"metadataResolver","nameLocation":"1115:16:202","nodeType":"VariableDeclaration","scope":22664,"src":"1092:39:202","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":22644,"nodeType":"UserDefinedTypeName","pathNode":{"id":22643,"name":"ITokenMetadataResolver","nameLocations":["1092:22:202"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1092:22:202"},"referencedDeclaration":36704,"src":"1092:22:202","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1049:83:202"},"returnParameters":{"id":22647,"nodeType":"ParameterList","parameters":[],"src":"1133:0:202"},"scope":22665,"src":"1038:238:202","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22666,"src":"653:625:202","usedErrors":[7886,11559,36690],"usedEvents":[23622]}],"src":"32:1247:202"},"id":202},"contracts/token/ERC1155/ERC1155Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155Mintable.sol","exportedSymbols":{"AccessControl":[7901],"ERC1155Mintable":[22689],"ERC1155MintableBase":[23308],"ERC1155Storage":[25484]},"id":22690,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22667,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:203"},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22669,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22690,"sourceUnit":25485,"src":"58:62:203","symbolAliases":[{"foreign":{"id":22668,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"66:14:203","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","file":"./base/ERC1155MintableBase.sol","id":22671,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22690,"sourceUnit":23309,"src":"121:67:203","symbolAliases":[{"foreign":{"id":22670,"name":"ERC1155MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23308,"src":"129:19:203","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":22673,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22690,"sourceUnit":7902,"src":"189:63:203","symbolAliases":[{"foreign":{"id":22672,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"197:13:203","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22675,"name":"ERC1155MintableBase","nameLocations":["481:19:203"],"nodeType":"IdentifierPath","referencedDeclaration":23308,"src":"481:19:203"},"id":22676,"nodeType":"InheritanceSpecifier","src":"481:19:203"},{"baseName":{"id":22677,"name":"AccessControl","nameLocations":["502:13:203"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"502:13:203"},"id":22678,"nodeType":"InheritanceSpecifier","src":"502:13:203"}],"canonicalName":"ERC1155Mintable","contractDependencies":[],"contractKind":"contract","documentation":{"id":22674,"nodeType":"StructuredDocumentation","src":"254:190:203","text":"@title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22689,"linearizedBaseContracts":[22689,7901,7934,11554,11579,8139,8091,23308,1206,8562,8546,24286],"name":"ERC1155Mintable","nameLocation":"462:15:203","nodeType":"ContractDefinition","nodes":[{"body":{"id":22687,"nodeType":"Block","src":"621:53:203","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22682,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"631:14:203","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"646:19:203","memberName":"initERC1155Mintable","nodeType":"MemberAccess","referencedDeclaration":24457,"src":"631:34:203","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"631:36:203","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22686,"nodeType":"ExpressionStatement","src":"631:36:203"}]},"documentation":{"id":22679,"nodeType":"StructuredDocumentation","src":"522:80:203","text":"@notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable"},"id":22688,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22680,"nodeType":"ParameterList","parameters":[],"src":"618:2:203"},"returnParameters":{"id":22681,"nodeType":"ParameterList","parameters":[],"src":"621:0:203"},"scope":22689,"src":"607:67:203","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22690,"src":"444:232:203","usedErrors":[7886,8223,8246,11559,23548,23557,23568,23576],"usedEvents":[8269,8278,8287,23591,23606]}],"src":"32:645:203"},"id":203},"contracts/token/ERC1155/ERC1155TokenReceiver.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155TokenReceiver.sol","exportedSymbols":{"ERC1155TokenReceiver":[22724],"IERC1155TokenReceiver":[24324],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":22725,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22691,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:204"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol","file":"./interfaces/IERC1155TokenReceiver.sol","id":22693,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22725,"sourceUnit":24325,"src":"58:77:204","symbolAliases":[{"foreign":{"id":22692,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"66:21:204","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":22695,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22725,"sourceUnit":11681,"src":"136:104:204","symbolAliases":[{"foreign":{"id":22694,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"144:25:204","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":22697,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22725,"sourceUnit":11555,"src":"241:80:204","symbolAliases":[{"foreign":{"id":22696,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"249:18:204","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22699,"name":"IERC1155TokenReceiver","nameLocations":["541:21:204"],"nodeType":"IdentifierPath","referencedDeclaration":24324,"src":"541:21:204"},"id":22700,"nodeType":"InheritanceSpecifier","src":"541:21:204"},{"baseName":{"id":22701,"name":"InterfaceDetection","nameLocations":["564:18:204"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"564:18:204"},"id":22702,"nodeType":"InheritanceSpecifier","src":"564:18:204"}],"canonicalName":"ERC1155TokenReceiver","contractDependencies":[],"contractKind":"contract","documentation":{"id":22698,"nodeType":"StructuredDocumentation","src":"323:176:204","text":"@title ERC1155 Multi Token Standard, Token Receiver (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":false,"id":22724,"linearizedBaseContracts":[22724,11554,11579,24324],"name":"ERC1155TokenReceiver","nameLocation":"517:20:204","nodeType":"ContractDefinition","nodes":[{"global":false,"id":22706,"libraryName":{"id":22703,"name":"InterfaceDetectionStorage","nameLocations":["595:25:204"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"595:25:204"},"nodeType":"UsingForDirective","src":"589:69:204","typeName":{"id":22705,"nodeType":"UserDefinedTypeName","pathNode":{"id":22704,"name":"InterfaceDetectionStorage.Layout","nameLocations":["625:25:204","651:6:204"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"625:32:204"},"referencedDeclaration":11590,"src":"625:32:204","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":22722,"nodeType":"Block","src":"770:120:204","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":22716,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"842:21:204","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}],"id":22715,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"837:4:204","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":22717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"837:27:204","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155TokenReceiver_$24324","typeString":"type(contract IERC1155TokenReceiver)"}},"id":22718,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"865:11:204","memberName":"interfaceId","nodeType":"MemberAccess","src":"837:39:204","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":22719,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"878:4:204","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22710,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"780:25:204","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":22712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"806:6:204","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"780:32:204","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":22713,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"780:34:204","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":22714,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"815:21:204","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"780:56:204","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":22720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"780:103:204","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22721,"nodeType":"ExpressionStatement","src":"780:103:204"}]},"documentation":{"id":22707,"nodeType":"StructuredDocumentation","src":"664:87:204","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver."},"id":22723,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22708,"nodeType":"ParameterList","parameters":[],"src":"767:2:204"},"returnParameters":{"id":22709,"nodeType":"ParameterList","parameters":[],"src":"770:0:204"},"scope":22724,"src":"756:134:204","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22725,"src":"499:393:204","usedErrors":[11559],"usedEvents":[]}],"src":"32:861:204"},"id":204},"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol","exportedSymbols":{"ContractOwnership":[7934],"ERC1155Storage":[25484],"ERC1155WithOperatorFilterer":[22771],"ERC1155WithOperatorFiltererBase":[23509],"IOperatorFilterRegistry":[37474],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870]},"id":22772,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22726,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:205"},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../royalty/interfaces/IOperatorFilterRegistry.sol","id":22728,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":37475,"src":"58:92:205","symbolAliases":[{"foreign":{"id":22727,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"66:23:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./libraries/ERC1155Storage.sol","id":22730,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":25485,"src":"151:62:205","symbolAliases":[{"foreign":{"id":22729,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"159:14:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../royalty/libraries/OperatorFiltererStorage.sol","id":22732,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":37871,"src":"214:91:205","symbolAliases":[{"foreign":{"id":22731,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"222:23:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol","file":"./base/ERC1155WithOperatorFiltererBase.sol","id":22734,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":23510,"src":"306:91:205","symbolAliases":[{"foreign":{"id":22733,"name":"ERC1155WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23509,"src":"314:31:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../royalty/base/OperatorFiltererBase.sol","id":22736,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":37074,"src":"398:80:205","symbolAliases":[{"foreign":{"id":22735,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"406:20:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":22738,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22772,"sourceUnit":7935,"src":"479:71:205","symbolAliases":[{"foreign":{"id":22737,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"487:17:205","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22740,"name":"ERC1155WithOperatorFiltererBase","nameLocations":["784:31:205"],"nodeType":"IdentifierPath","referencedDeclaration":23509,"src":"784:31:205"},"id":22741,"nodeType":"InheritanceSpecifier","src":"784:31:205"},{"baseName":{"id":22742,"name":"OperatorFiltererBase","nameLocations":["817:20:205"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"817:20:205"},"id":22743,"nodeType":"InheritanceSpecifier","src":"817:20:205"},{"baseName":{"id":22744,"name":"ContractOwnership","nameLocations":["839:17:205"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"839:17:205"},"id":22745,"nodeType":"InheritanceSpecifier","src":"839:17:205"}],"canonicalName":"ERC1155WithOperatorFilterer","contractDependencies":[],"contractKind":"contract","documentation":{"id":22739,"nodeType":"StructuredDocumentation","src":"552:183:205","text":"@title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":22771,"linearizedBaseContracts":[22771,7934,11554,11579,8139,37073,23509,1206,8562,24178],"name":"ERC1155WithOperatorFilterer","nameLocation":"753:27:205","nodeType":"ContractDefinition","nodes":[{"global":false,"id":22749,"libraryName":{"id":22746,"name":"OperatorFiltererStorage","nameLocations":["869:23:205"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"869:23:205"},"nodeType":"UsingForDirective","src":"863:65:205","typeName":{"id":22748,"nodeType":"UserDefinedTypeName","pathNode":{"id":22747,"name":"OperatorFiltererStorage.Layout","nameLocations":["897:23:205","921:6:205"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"897:30:205"},"referencedDeclaration":37673,"src":"897:30:205","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":22769,"nodeType":"Block","src":"1294:120:205","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22756,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1304:14:205","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1319:4:205","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"1304:19:205","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":22759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1304:21:205","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22760,"nodeType":"ExpressionStatement","src":"1304:21:205"},{"expression":{"arguments":[{"id":22766,"name":"operatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22753,"src":"1384:22:205","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22761,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1335:23:205","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":22763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1359:6:205","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1335:30:205","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":22764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1335:32:205","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":22765,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1368:15:205","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":37716,"src":"1335:48:205","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":22767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1335:72:205","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22768,"nodeType":"ExpressionStatement","src":"1335:72:205"}]},"documentation":{"id":22750,"nodeType":"StructuredDocumentation","src":"934:295:205","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155.\n @notice Sets the address that the contract will make OperatorFilter checks against.\n @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed."},"id":22770,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":22754,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22753,"mutability":"mutable","name":"operatorFilterRegistry","nameLocation":"1270:22:205","nodeType":"VariableDeclaration","scope":22770,"src":"1246:46:205","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":22752,"nodeType":"UserDefinedTypeName","pathNode":{"id":22751,"name":"IOperatorFilterRegistry","nameLocations":["1246:23:205"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1246:23:205"},"referencedDeclaration":37474,"src":"1246:23:205","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1245:48:205"},"returnParameters":{"id":22755,"nodeType":"ParameterList","parameters":[],"src":"1294:0:205"},"scope":22771,"src":"1234:180:205","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":22772,"src":"735:681:205","usedErrors":[7886,8246,11559,23516,23519,23526,23537,23548,23557,23568,23571,37090],"usedEvents":[8287,23591,23606,23615]}],"src":"32:1385:205"},"id":205},"contracts/token/ERC1155/base/ERC1155Base.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155Base.sol","exportedSymbols":{"Context":[1206],"ERC1155Base":[22929],"ERC1155Storage":[25484],"IERC1155":[24178]},"id":22930,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22773,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:206"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","file":"./../interfaces/IERC1155.sol","id":22775,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22930,"sourceUnit":24179,"src":"58:54:206","symbolAliases":[{"foreign":{"id":22774,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"66:8:206","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":22777,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22930,"sourceUnit":25485,"src":"113:65:206","symbolAliases":[{"foreign":{"id":22776,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"121:14:206","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":22779,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22930,"sourceUnit":1207,"src":"179:66:206","symbolAliases":[{"foreign":{"id":22778,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"187:7:206","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22781,"name":"IERC1155","nameLocations":["500:8:206"],"nodeType":"IdentifierPath","referencedDeclaration":24178,"src":"500:8:206"},"id":22782,"nodeType":"InheritanceSpecifier","src":"500:8:206"},{"baseName":{"id":22783,"name":"Context","nameLocations":["510:7:206"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"510:7:206"},"id":22784,"nodeType":"InheritanceSpecifier","src":"510:7:206"}],"canonicalName":"ERC1155Base","contractDependencies":[],"contractKind":"contract","documentation":{"id":22780,"nodeType":"StructuredDocumentation","src":"247:220:206","text":"@title ERC1155 Multi Token Standard (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":22929,"linearizedBaseContracts":[22929,1206,24178],"name":"ERC1155Base","nameLocation":"485:11:206","nodeType":"ContractDefinition","nodes":[{"global":false,"id":22788,"libraryName":{"id":22785,"name":"ERC1155Storage","nameLocations":["530:14:206"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"530:14:206"},"nodeType":"UsingForDirective","src":"524:47:206","typeName":{"id":22787,"nodeType":"UserDefinedTypeName","pathNode":{"id":22786,"name":"ERC1155Storage.Layout","nameLocations":["549:14:206","564:6:206"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"549:21:206"},"referencedDeclaration":24383,"src":"549:21:206","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"baseFunctions":[24120],"body":{"id":22816,"nodeType":"Block","src":"723:98:206","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22807,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"774:10:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"774:12:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22809,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22791,"src":"788:4:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22810,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22793,"src":"794:2:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22811,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22795,"src":"798:2:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22812,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22797,"src":"802:5:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22813,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22799,"src":"809:4:206","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22802,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"733:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"748:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"733:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"733:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22806,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"757:16:206","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24563,"src":"733:40:206","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,address,uint256,uint256,bytes calldata)"}},"id":22814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"733:81:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22815,"nodeType":"ExpressionStatement","src":"733:81:206"}]},"documentation":{"id":22789,"nodeType":"StructuredDocumentation","src":"577:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"f242432a","id":22817,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"615:16:206","nodeType":"FunctionDefinition","parameters":{"id":22800,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22791,"mutability":"mutable","name":"from","nameLocation":"640:4:206","nodeType":"VariableDeclaration","scope":22817,"src":"632:12:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22790,"name":"address","nodeType":"ElementaryTypeName","src":"632:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22793,"mutability":"mutable","name":"to","nameLocation":"654:2:206","nodeType":"VariableDeclaration","scope":22817,"src":"646:10:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22792,"name":"address","nodeType":"ElementaryTypeName","src":"646:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22795,"mutability":"mutable","name":"id","nameLocation":"666:2:206","nodeType":"VariableDeclaration","scope":22817,"src":"658:10:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22794,"name":"uint256","nodeType":"ElementaryTypeName","src":"658:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":22797,"mutability":"mutable","name":"value","nameLocation":"678:5:206","nodeType":"VariableDeclaration","scope":22817,"src":"670:13:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22796,"name":"uint256","nodeType":"ElementaryTypeName","src":"670:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":22799,"mutability":"mutable","name":"data","nameLocation":"700:4:206","nodeType":"VariableDeclaration","scope":22817,"src":"685:19:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":22798,"name":"bytes","nodeType":"ElementaryTypeName","src":"685:5:206","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"631:74:206"},"returnParameters":{"id":22801,"nodeType":"ParameterList","parameters":[],"src":"723:0:206"},"scope":22929,"src":"606:215:206","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24136],"body":{"id":22847,"nodeType":"Block","src":"1048:105:206","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22838,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1104:10:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22839,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1104:12:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22840,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22820,"src":"1118:4:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22841,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22822,"src":"1124:2:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22842,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22825,"src":"1128:3:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":22843,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22828,"src":"1133:6:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":22844,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22830,"src":"1141:4:206","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22833,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1058:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1073:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1058:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22836,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1058:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22837,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1082:21:206","memberName":"safeBatchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24665,"src":"1058:45:206","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,address,uint256[] calldata,uint256[] calldata,bytes calldata)"}},"id":22845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1058:88:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22846,"nodeType":"ExpressionStatement","src":"1058:88:206"}]},"documentation":{"id":22818,"nodeType":"StructuredDocumentation","src":"827:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"2eb2c2d6","id":22848,"implemented":true,"kind":"function","modifiers":[],"name":"safeBatchTransferFrom","nameLocation":"865:21:206","nodeType":"FunctionDefinition","parameters":{"id":22831,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22820,"mutability":"mutable","name":"from","nameLocation":"904:4:206","nodeType":"VariableDeclaration","scope":22848,"src":"896:12:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22819,"name":"address","nodeType":"ElementaryTypeName","src":"896:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22822,"mutability":"mutable","name":"to","nameLocation":"926:2:206","nodeType":"VariableDeclaration","scope":22848,"src":"918:10:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22821,"name":"address","nodeType":"ElementaryTypeName","src":"918:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22825,"mutability":"mutable","name":"ids","nameLocation":"957:3:206","nodeType":"VariableDeclaration","scope":22848,"src":"938:22:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22823,"name":"uint256","nodeType":"ElementaryTypeName","src":"938:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22824,"nodeType":"ArrayTypeName","src":"938:9:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":22828,"mutability":"mutable","name":"values","nameLocation":"989:6:206","nodeType":"VariableDeclaration","scope":22848,"src":"970:25:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22826,"name":"uint256","nodeType":"ElementaryTypeName","src":"970:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22827,"nodeType":"ArrayTypeName","src":"970:9:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":22830,"mutability":"mutable","name":"data","nameLocation":"1020:4:206","nodeType":"VariableDeclaration","scope":22848,"src":"1005:19:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":22829,"name":"bytes","nodeType":"ElementaryTypeName","src":"1005:5:206","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"886:144:206"},"returnParameters":{"id":22832,"nodeType":"ParameterList","parameters":[],"src":"1048:0:206"},"scope":22929,"src":"856:297:206","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24144],"body":{"id":22867,"nodeType":"Block","src":"1265:92:206","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22861,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1317:10:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22862,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1317:12:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22863,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22851,"src":"1331:8:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22864,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22853,"src":"1341:8:206","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22856,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1275:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22858,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1290:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1275:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22859,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1275:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22860,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1299:17:206","memberName":"setApprovalForAll","nodeType":"MemberAccess","referencedDeclaration":25047,"src":"1275:41:206","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,bool)"}},"id":22865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1275:75:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22866,"nodeType":"ExpressionStatement","src":"1275:75:206"}]},"documentation":{"id":22849,"nodeType":"StructuredDocumentation","src":"1159:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"a22cb465","id":22868,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"1197:17:206","nodeType":"FunctionDefinition","parameters":{"id":22854,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22851,"mutability":"mutable","name":"operator","nameLocation":"1223:8:206","nodeType":"VariableDeclaration","scope":22868,"src":"1215:16:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22850,"name":"address","nodeType":"ElementaryTypeName","src":"1215:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22853,"mutability":"mutable","name":"approved","nameLocation":"1238:8:206","nodeType":"VariableDeclaration","scope":22868,"src":"1233:13:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22852,"name":"bool","nodeType":"ElementaryTypeName","src":"1233:4:206","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1214:33:206"},"returnParameters":{"id":22855,"nodeType":"ParameterList","parameters":[],"src":"1265:0:206"},"scope":22929,"src":"1188:169:206","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24154],"body":{"id":22886,"nodeType":"Block","src":"1503:81:206","statements":[{"expression":{"arguments":[{"id":22882,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22871,"src":"1561:5:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22883,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22873,"src":"1568:8:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22878,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1520:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22879,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1535:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1520:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1520:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22881,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1544:16:206","memberName":"isApprovedForAll","nodeType":"MemberAccess","referencedDeclaration":25068,"src":"1520:40:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":22884,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1520:57:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":22877,"id":22885,"nodeType":"Return","src":"1513:64:206"}]},"documentation":{"id":22869,"nodeType":"StructuredDocumentation","src":"1363:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"e985e9c5","id":22887,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"1401:16:206","nodeType":"FunctionDefinition","parameters":{"id":22874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22871,"mutability":"mutable","name":"owner","nameLocation":"1426:5:206","nodeType":"VariableDeclaration","scope":22887,"src":"1418:13:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22870,"name":"address","nodeType":"ElementaryTypeName","src":"1418:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22873,"mutability":"mutable","name":"operator","nameLocation":"1441:8:206","nodeType":"VariableDeclaration","scope":22887,"src":"1433:16:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22872,"name":"address","nodeType":"ElementaryTypeName","src":"1433:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1417:33:206"},"returnParameters":{"id":22877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22876,"mutability":"mutable","name":"approvedForAll","nameLocation":"1487:14:206","nodeType":"VariableDeclaration","scope":22887,"src":"1482:19:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":22875,"name":"bool","nodeType":"ElementaryTypeName","src":"1482:4:206","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1481:21:206"},"scope":22929,"src":"1392:192:206","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[24164],"body":{"id":22905,"nodeType":"Block","src":"1713:68:206","statements":[{"expression":{"arguments":[{"id":22901,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22890,"src":"1764:5:206","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22902,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22892,"src":"1771:2:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22897,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1730:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1745:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1730:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22899,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1730:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22900,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1754:9:206","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":25099,"src":"1730:33:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256) view returns (uint256)"}},"id":22903,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1730:44:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":22896,"id":22904,"nodeType":"Return","src":"1723:51:206"}]},"documentation":{"id":22888,"nodeType":"StructuredDocumentation","src":"1590:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"00fdd58e","id":22906,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1628:9:206","nodeType":"FunctionDefinition","parameters":{"id":22893,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22890,"mutability":"mutable","name":"owner","nameLocation":"1646:5:206","nodeType":"VariableDeclaration","scope":22906,"src":"1638:13:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22889,"name":"address","nodeType":"ElementaryTypeName","src":"1638:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22892,"mutability":"mutable","name":"id","nameLocation":"1661:2:206","nodeType":"VariableDeclaration","scope":22906,"src":"1653:10:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22891,"name":"uint256","nodeType":"ElementaryTypeName","src":"1653:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1637:27:206"},"returnParameters":{"id":22896,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22895,"mutability":"mutable","name":"balance","nameLocation":"1704:7:206","nodeType":"VariableDeclaration","scope":22906,"src":"1696:15:206","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22894,"name":"uint256","nodeType":"ElementaryTypeName","src":"1696:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1695:17:206"},"scope":22929,"src":"1619:162:206","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[24177],"body":{"id":22927,"nodeType":"Block","src":"1949:75:206","statements":[{"expression":{"arguments":[{"id":22923,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22910,"src":"2005:6:206","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":22924,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22913,"src":"2013:3:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22919,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1966:14:206","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1981:6:206","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1966:21:206","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1966:23:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22922,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1990:14:206","memberName":"balanceOfBatch","nodeType":"MemberAccess","referencedDeclaration":25163,"src":"1966:38:206","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address[] calldata,uint256[] calldata) view returns (uint256[] memory)"}},"id":22925,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1966:51:206","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"functionReturnParameters":22918,"id":22926,"nodeType":"Return","src":"1959:58:206"}]},"documentation":{"id":22907,"nodeType":"StructuredDocumentation","src":"1787:24:206","text":"@inheritdoc IERC1155"},"functionSelector":"4e1273f4","id":22928,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOfBatch","nameLocation":"1825:14:206","nodeType":"FunctionDefinition","parameters":{"id":22914,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22910,"mutability":"mutable","name":"owners","nameLocation":"1859:6:206","nodeType":"VariableDeclaration","scope":22928,"src":"1840:25:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":22908,"name":"address","nodeType":"ElementaryTypeName","src":"1840:7:206","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":22909,"nodeType":"ArrayTypeName","src":"1840:9:206","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":22913,"mutability":"mutable","name":"ids","nameLocation":"1886:3:206","nodeType":"VariableDeclaration","scope":22928,"src":"1867:22:206","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22911,"name":"uint256","nodeType":"ElementaryTypeName","src":"1867:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22912,"nodeType":"ArrayTypeName","src":"1867:9:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1839:51:206"},"returnParameters":{"id":22918,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22917,"mutability":"mutable","name":"balances","nameLocation":"1939:8:206","nodeType":"VariableDeclaration","scope":22928,"src":"1922:25:206","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22915,"name":"uint256","nodeType":"ElementaryTypeName","src":"1922:7:206","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22916,"nodeType":"ArrayTypeName","src":"1922:9:206","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1921:27:206"},"scope":22929,"src":"1816:208:206","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":22930,"src":"467:1559:206","usedErrors":[7886,23516,23519,23526,23537,23548,23557,23568,23571],"usedEvents":[23591,23606,23615]}],"src":"32:1995:206"},"id":206},"contracts/token/ERC1155/base/ERC1155BurnableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155BurnableBase.sol","exportedSymbols":{"Context":[1206],"ERC1155BurnableBase":[22995],"ERC1155Storage":[25484],"IERC1155Burnable":[24204]},"id":22996,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22931,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:207"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol","file":"./../interfaces/IERC1155Burnable.sol","id":22933,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22996,"sourceUnit":24205,"src":"58:70:207","symbolAliases":[{"foreign":{"id":22932,"name":"IERC1155Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24204,"src":"66:16:207","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":22935,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22996,"sourceUnit":25485,"src":"129:65:207","symbolAliases":[{"foreign":{"id":22934,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"137:14:207","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":22937,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":22996,"sourceUnit":1207,"src":"195:66:207","symbolAliases":[{"foreign":{"id":22936,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"203:7:207","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":22939,"name":"IERC1155Burnable","nameLocations":["547:16:207"],"nodeType":"IdentifierPath","referencedDeclaration":24204,"src":"547:16:207"},"id":22940,"nodeType":"InheritanceSpecifier","src":"547:16:207"},{"baseName":{"id":22941,"name":"Context","nameLocations":["565:7:207"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"565:7:207"},"id":22942,"nodeType":"InheritanceSpecifier","src":"565:7:207"}],"canonicalName":"ERC1155BurnableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":22938,"nodeType":"StructuredDocumentation","src":"263:243:207","text":"@title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC1155 (Multi Token Standard)."},"fullyImplemented":true,"id":22995,"linearizedBaseContracts":[22995,1206,24204],"name":"ERC1155BurnableBase","nameLocation":"524:19:207","nodeType":"ContractDefinition","nodes":[{"global":false,"id":22946,"libraryName":{"id":22943,"name":"ERC1155Storage","nameLocations":["585:14:207"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"585:14:207"},"nodeType":"UsingForDirective","src":"579:47:207","typeName":{"id":22945,"nodeType":"UserDefinedTypeName","pathNode":{"id":22944,"name":"ERC1155Storage.Layout","nameLocations":["604:14:207","619:6:207"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"604:21:207"},"referencedDeclaration":24383,"src":"604:21:207","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"baseFunctions":[24191],"body":{"id":22968,"nodeType":"Block","src":"745:80:207","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22961,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"788:10:207","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22962,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"788:12:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22963,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22949,"src":"802:4:207","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22964,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22951,"src":"808:2:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":22965,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22953,"src":"812:5:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22956,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"755:14:207","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22958,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"770:6:207","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"755:21:207","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22959,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"755:23:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22960,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"779:8:207","memberName":"burnFrom","nodeType":"MemberAccess","referencedDeclaration":24933,"src":"755:32:207","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256)"}},"id":22966,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"755:63:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22967,"nodeType":"ExpressionStatement","src":"755:63:207"}]},"documentation":{"id":22947,"nodeType":"StructuredDocumentation","src":"632:32:207","text":"@inheritdoc IERC1155Burnable"},"functionSelector":"124d91e5","id":22969,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"678:8:207","nodeType":"FunctionDefinition","parameters":{"id":22954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22949,"mutability":"mutable","name":"from","nameLocation":"695:4:207","nodeType":"VariableDeclaration","scope":22969,"src":"687:12:207","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22948,"name":"address","nodeType":"ElementaryTypeName","src":"687:7:207","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22951,"mutability":"mutable","name":"id","nameLocation":"709:2:207","nodeType":"VariableDeclaration","scope":22969,"src":"701:10:207","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22950,"name":"uint256","nodeType":"ElementaryTypeName","src":"701:7:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":22953,"mutability":"mutable","name":"value","nameLocation":"721:5:207","nodeType":"VariableDeclaration","scope":22969,"src":"713:13:207","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":22952,"name":"uint256","nodeType":"ElementaryTypeName","src":"713:7:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"686:41:207"},"returnParameters":{"id":22955,"nodeType":"ParameterList","parameters":[],"src":"745:0:207"},"scope":22995,"src":"669:156:207","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24203],"body":{"id":22993,"nodeType":"Block","src":"973:87:207","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":22986,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1021:10:207","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":22987,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1021:12:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22988,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22972,"src":"1035:4:207","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":22989,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22975,"src":"1041:3:207","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":22990,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22978,"src":"1046:6:207","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":22981,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"983:14:207","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":22983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"998:6:207","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"983:21:207","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":22984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"983:23:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":22985,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1007:13:207","memberName":"batchBurnFrom","nodeType":"MemberAccess","referencedDeclaration":25009,"src":"983:37:207","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256[] calldata,uint256[] calldata)"}},"id":22991,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"983:70:207","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":22992,"nodeType":"ExpressionStatement","src":"983:70:207"}]},"documentation":{"id":22970,"nodeType":"StructuredDocumentation","src":"831:32:207","text":"@inheritdoc IERC1155Burnable"},"functionSelector":"80534934","id":22994,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"877:13:207","nodeType":"FunctionDefinition","parameters":{"id":22979,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22972,"mutability":"mutable","name":"from","nameLocation":"899:4:207","nodeType":"VariableDeclaration","scope":22994,"src":"891:12:207","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":22971,"name":"address","nodeType":"ElementaryTypeName","src":"891:7:207","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":22975,"mutability":"mutable","name":"ids","nameLocation":"924:3:207","nodeType":"VariableDeclaration","scope":22994,"src":"905:22:207","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22973,"name":"uint256","nodeType":"ElementaryTypeName","src":"905:7:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22974,"nodeType":"ArrayTypeName","src":"905:9:207","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":22978,"mutability":"mutable","name":"values","nameLocation":"948:6:207","nodeType":"VariableDeclaration","scope":22994,"src":"929:25:207","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":22976,"name":"uint256","nodeType":"ElementaryTypeName","src":"929:7:207","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":22977,"nodeType":"ArrayTypeName","src":"929:9:207","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"890:65:207"},"returnParameters":{"id":22980,"nodeType":"ParameterList","parameters":[],"src":"973:0:207"},"scope":22995,"src":"868:192:207","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":22996,"src":"506:556:207","usedErrors":[7886,23526,23537],"usedEvents":[23591,23606]}],"src":"32:1031:207"},"id":207},"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC1155DeliverableBase":[23064],"ERC1155Storage":[25484],"IERC1155Deliverable":[24223]},"id":23065,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":22997,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:208"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol","file":"./../interfaces/IERC1155Deliverable.sol","id":22999,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23065,"sourceUnit":24224,"src":"58:76:208","symbolAliases":[{"foreign":{"id":22998,"name":"IERC1155Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24223,"src":"66:19:208","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23001,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23065,"sourceUnit":25485,"src":"135:65:208","symbolAliases":[{"foreign":{"id":23000,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"143:14:208","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":23003,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23065,"sourceUnit":8852,"src":"201:90:208","symbolAliases":[{"foreign":{"id":23002,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"209:20:208","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23005,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23065,"sourceUnit":1207,"src":"292:66:208","symbolAliases":[{"foreign":{"id":23004,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"300:7:208","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":23007,"name":"IERC1155Deliverable","nameLocations":["703:19:208"],"nodeType":"IdentifierPath","referencedDeclaration":24223,"src":"703:19:208"},"id":23008,"nodeType":"InheritanceSpecifier","src":"703:19:208"},{"baseName":{"id":23009,"name":"Context","nameLocations":["724:7:208"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"724:7:208"},"id":23010,"nodeType":"InheritanceSpecifier","src":"724:7:208"}],"canonicalName":"ERC1155DeliverableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":23006,"nodeType":"StructuredDocumentation","src":"360:299:208","text":"@title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC1155 (Multi Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":23064,"linearizedBaseContracts":[23064,1206,24223],"name":"ERC1155DeliverableBase","nameLocation":"677:22:208","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23014,"libraryName":{"id":23011,"name":"ERC1155Storage","nameLocations":["744:14:208"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"744:14:208"},"nodeType":"UsingForDirective","src":"738:47:208","typeName":{"id":23013,"nodeType":"UserDefinedTypeName","pathNode":{"id":23012,"name":"ERC1155Storage.Layout","nameLocations":["763:14:208","778:6:208"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"763:21:208"},"referencedDeclaration":24383,"src":"763:21:208","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"global":false,"id":23018,"libraryName":{"id":23015,"name":"AccessControlStorage","nameLocations":["796:20:208"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"796:20:208"},"nodeType":"UsingForDirective","src":"790:59:208","typeName":{"id":23017,"nodeType":"UserDefinedTypeName","pathNode":{"id":23016,"name":"AccessControlStorage.Layout","nameLocations":["821:20:208","842:6:208"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"821:27:208"},"referencedDeclaration":8616,"src":"821:27:208","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"id":23021,"mutability":"constant","name":"_MINTER_ROLE","nameLocation":"959:12:208","nodeType":"VariableDeclaration","scope":23064,"src":"934:48:208","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":23019,"name":"bytes32","nodeType":"ElementaryTypeName","src":"934:7:208","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":23020,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"974:8:208","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"private"},{"baseFunctions":[24222],"body":{"id":23062,"nodeType":"Block","src":"1259:206:208","statements":[{"assignments":[23037],"declarations":[{"constant":false,"id":23037,"mutability":"mutable","name":"sender","nameLocation":"1277:6:208","nodeType":"VariableDeclaration","scope":23062,"src":"1269:14:208","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23036,"name":"address","nodeType":"ElementaryTypeName","src":"1269:7:208","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":23040,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":23038,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1286:10:208","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23039,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1286:12:208","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1269:29:208"},{"expression":{"arguments":[{"id":23046,"name":"_MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23021,"src":"1353:12:208","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":23047,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23037,"src":"1367:6:208","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23041,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1308:20:208","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":23043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1329:6:208","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1308:27:208","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":23044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1308:29:208","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":23045,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1338:14:208","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1308:44:208","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":23048,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1308:66:208","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23049,"nodeType":"ExpressionStatement","src":"1308:66:208"},{"expression":{"arguments":[{"id":23055,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23037,"src":"1420:6:208","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23056,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23025,"src":"1428:10:208","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":23057,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23028,"src":"1440:3:208","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23058,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23031,"src":"1445:6:208","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23059,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23033,"src":"1453:4:208","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23050,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1384:14:208","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23052,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1399:6:208","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1384:21:208","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23053,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1384:23:208","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23054,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1408:11:208","memberName":"safeDeliver","nodeType":"MemberAccess","referencedDeclaration":24887,"src":"1384:35:208","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address[] memory,uint256[] memory,uint256[] memory,bytes memory)"}},"id":23060,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1384:74:208","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23061,"nodeType":"ExpressionStatement","src":"1384:74:208"}]},"documentation":{"id":23022,"nodeType":"StructuredDocumentation","src":"989:124:208","text":"@inheritdoc IERC1155Deliverable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"e8ab9ccc","id":23063,"implemented":true,"kind":"function","modifiers":[],"name":"safeDeliver","nameLocation":"1127:11:208","nodeType":"FunctionDefinition","parameters":{"id":23034,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23025,"mutability":"mutable","name":"recipients","nameLocation":"1158:10:208","nodeType":"VariableDeclaration","scope":23063,"src":"1139:29:208","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":23023,"name":"address","nodeType":"ElementaryTypeName","src":"1139:7:208","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":23024,"nodeType":"ArrayTypeName","src":"1139:9:208","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":23028,"mutability":"mutable","name":"ids","nameLocation":"1189:3:208","nodeType":"VariableDeclaration","scope":23063,"src":"1170:22:208","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23026,"name":"uint256","nodeType":"ElementaryTypeName","src":"1170:7:208","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23027,"nodeType":"ArrayTypeName","src":"1170:9:208","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23031,"mutability":"mutable","name":"values","nameLocation":"1213:6:208","nodeType":"VariableDeclaration","scope":23063,"src":"1194:25:208","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23029,"name":"uint256","nodeType":"ElementaryTypeName","src":"1194:7:208","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23030,"nodeType":"ArrayTypeName","src":"1194:9:208","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23033,"mutability":"mutable","name":"data","nameLocation":"1236:4:208","nodeType":"VariableDeclaration","scope":23063,"src":"1221:19:208","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23032,"name":"bytes","nodeType":"ElementaryTypeName","src":"1221:5:208","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1138:103:208"},"returnParameters":{"id":23035,"nodeType":"ParameterList","parameters":[],"src":"1259:0:208"},"scope":23064,"src":"1118:347:208","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":23065,"src":"659:808:208","usedErrors":[7886,8223,23548,23557,23576],"usedEvents":[23591]}],"src":"32:1436:208"},"id":208},"contracts/token/ERC1155/base/ERC1155MetadataBase.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155MetadataBase.sol","exportedSymbols":{"ERC1155MetadataBase":[23201],"IERC1155MetadataSetter":[24244],"IERC1155MetadataURI":[24256],"InconsistentArrayLengths":[7886],"NotMetadataResolver":[36690],"TokenMetadataBase":[36683],"TokenMetadataStorage":[36891],"URI":[23622]},"id":23202,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23066,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:209"},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../../CommonErrors.sol","id":23068,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":7890,"src":"58:69:209","symbolAliases":[{"foreign":{"id":23067,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"66:24:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/errors/TokenMetadataErrors.sol","file":"./../../metadata/errors/TokenMetadataErrors.sol","id":23070,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":36691,"src":"128:84:209","symbolAliases":[{"foreign":{"id":23069,"name":"NotMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36690,"src":"136:19:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/events/ERC1155Events.sol","file":"./../events/ERC1155Events.sol","id":23072,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":23623,"src":"213:50:209","symbolAliases":[{"foreign":{"id":23071,"name":"URI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23622,"src":"221:3:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol","file":"./../interfaces/IERC1155MetadataURI.sol","id":23074,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":24257,"src":"264:76:209","symbolAliases":[{"foreign":{"id":23073,"name":"IERC1155MetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24256,"src":"272:19:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol","file":"./../interfaces/IERC1155MetadataSetter.sol","id":23076,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":24245,"src":"341:82:209","symbolAliases":[{"foreign":{"id":23075,"name":"IERC1155MetadataSetter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24244,"src":"349:22:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../metadata/libraries/TokenMetadataStorage.sol","id":23078,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":36892,"src":"424:89:209","symbolAliases":[{"foreign":{"id":23077,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"432:20:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/base/TokenMetadataBase.sol","file":"./../../metadata/base/TokenMetadataBase.sol","id":23080,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23202,"sourceUnit":36684,"src":"514:78:209","symbolAliases":[{"foreign":{"id":23079,"name":"TokenMetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36683,"src":"522:17:209","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":23082,"name":"TokenMetadataBase","nameLocations":["972:17:209"],"nodeType":"IdentifierPath","referencedDeclaration":36683,"src":"972:17:209"},"id":23083,"nodeType":"InheritanceSpecifier","src":"972:17:209"},{"baseName":{"id":23084,"name":"IERC1155MetadataURI","nameLocations":["991:19:209"],"nodeType":"IdentifierPath","referencedDeclaration":24256,"src":"991:19:209"},"id":23085,"nodeType":"InheritanceSpecifier","src":"991:19:209"},{"baseName":{"id":23086,"name":"IERC1155MetadataSetter","nameLocations":["1012:22:209"],"nodeType":"IdentifierPath","referencedDeclaration":24244,"src":"1012:22:209"},"id":23087,"nodeType":"InheritanceSpecifier","src":"1012:22:209"}],"canonicalName":"ERC1155MetadataBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":23081,"nodeType":"StructuredDocumentation","src":"594:337:209","text":"@title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC1155 (Multi Token Standard)."},"fullyImplemented":true,"id":23201,"linearizedBaseContracts":[23201,24244,24256,36683],"name":"ERC1155MetadataBase","nameLocation":"949:19:209","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23091,"libraryName":{"id":23088,"name":"TokenMetadataStorage","nameLocations":["1047:20:209"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"1047:20:209"},"nodeType":"UsingForDirective","src":"1041:59:209","typeName":{"id":23090,"nodeType":"UserDefinedTypeName","pathNode":{"id":23089,"name":"TokenMetadataStorage.Layout","nameLocations":["1072:20:209","1093:6:209"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"1072:27:209"},"referencedDeclaration":36718,"src":"1072:27:209","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"baseFunctions":[24255],"body":{"id":23110,"nodeType":"Block","src":"1234:94:209","statements":[{"expression":{"arguments":[{"arguments":[{"id":23105,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1306:4:209","typeDescriptions":{"typeIdentifier":"t_contract$_ERC1155MetadataBase_$23201","typeString":"contract ERC1155MetadataBase"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC1155MetadataBase_$23201","typeString":"contract ERC1155MetadataBase"}],"id":23104,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1298:7:209","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":23103,"name":"address","nodeType":"ElementaryTypeName","src":"1298:7:209","typeDescriptions":{}}},"id":23106,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1298:13:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23107,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23094,"src":"1313:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23099,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1251:20:209","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":23100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1272:6:209","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1251:27:209","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":23101,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1251:29:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":23102,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1281:16:209","memberName":"tokenMetadataURI","nodeType":"MemberAccess","referencedDeclaration":36878,"src":"1251:46:209","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$_t_address_$_t_uint256_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,address,uint256) view returns (string memory)"}},"id":23108,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1251:70:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":23098,"id":23109,"nodeType":"Return","src":"1244:77:209"}]},"documentation":{"id":23092,"nodeType":"StructuredDocumentation","src":"1106:35:209","text":"@inheritdoc IERC1155MetadataURI"},"functionSelector":"0e89341c","id":23111,"implemented":true,"kind":"function","modifiers":[],"name":"uri","nameLocation":"1155:3:209","nodeType":"FunctionDefinition","parameters":{"id":23095,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23094,"mutability":"mutable","name":"tokenId","nameLocation":"1167:7:209","nodeType":"VariableDeclaration","scope":23111,"src":"1159:15:209","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23093,"name":"uint256","nodeType":"ElementaryTypeName","src":"1159:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1158:17:209"},"returnParameters":{"id":23098,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23097,"mutability":"mutable","name":"metadataURI","nameLocation":"1221:11:209","nodeType":"VariableDeclaration","scope":23111,"src":"1207:25:209","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":23096,"name":"string","nodeType":"ElementaryTypeName","src":"1207:6:209","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1206:27:209"},"scope":23201,"src":"1146:182:209","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[24233],"body":{"id":23141,"nodeType":"Block","src":"1702:169:209","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":23129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":23119,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1716:3:209","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":23120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1720:6:209","memberName":"sender","nodeType":"MemberAccess","src":"1716:10:209","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23123,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1738:20:209","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":23124,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1759:6:209","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1738:27:209","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":23125,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1738:29:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":23126,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1768:16:209","memberName":"metadataResolver","nodeType":"MemberAccess","referencedDeclaration":36857,"src":"1738:46:209","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$returns$_t_contract$_ITokenMetadataResolver_$36704_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer) view returns (contract ITokenMetadataResolver)"}},"id":23127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1738:48:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"id":23122,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1730:7:209","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":23121,"name":"address","nodeType":"ElementaryTypeName","src":"1730:7:209","typeDescriptions":{}}},"id":23128,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1730:57:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1716:71:209","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":23135,"nodeType":"IfStatement","src":"1712:115:209","trueBody":{"errorCall":{"arguments":[{"expression":{"id":23131,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1816:3:209","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":23132,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1820:6:209","memberName":"sender","nodeType":"MemberAccess","src":"1816:10:209","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":23130,"name":"NotMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36690,"src":"1796:19:209","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":23133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1796:31:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":23134,"nodeType":"RevertStatement","src":"1789:38:209"}},{"eventCall":{"arguments":[{"id":23137,"name":"tokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23116,"src":"1846:8:209","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":23138,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23114,"src":"1856:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":23136,"name":"URI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23622,"src":"1842:3:209","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256)"}},"id":23139,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1842:22:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23140,"nodeType":"EmitStatement","src":"1837:27:209"}]},"documentation":{"id":23112,"nodeType":"StructuredDocumentation","src":"1334:282:209","text":"@notice Emits the URI event when a token metadata URI is set by the metadata resolver.\n @dev Reverts if the caller is not the metadata resolver.\n @dev Emits a {URI} event.\n @param tokenId The token identifier.\n @param tokenURI The token metadata URI."},"functionSelector":"162094c4","id":23142,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"1630:11:209","nodeType":"FunctionDefinition","parameters":{"id":23117,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23114,"mutability":"mutable","name":"tokenId","nameLocation":"1650:7:209","nodeType":"VariableDeclaration","scope":23142,"src":"1642:15:209","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23113,"name":"uint256","nodeType":"ElementaryTypeName","src":"1642:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23116,"mutability":"mutable","name":"tokenURI","nameLocation":"1675:8:209","nodeType":"VariableDeclaration","scope":23142,"src":"1659:24:209","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":23115,"name":"string","nodeType":"ElementaryTypeName","src":"1659:6:209","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1641:43:209"},"returnParameters":{"id":23118,"nodeType":"ParameterList","parameters":[],"src":"1702:0:209"},"scope":23201,"src":"1621:250:209","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24243],"body":{"id":23199,"nodeType":"Block","src":"2366:328:209","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":23156,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":23152,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23146,"src":"2380:8:209","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":23153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2389:6:209","memberName":"length","nodeType":"MemberAccess","src":"2380:15:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":23154,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23149,"src":"2399:9:209","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}},"id":23155,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2409:6:209","memberName":"length","nodeType":"MemberAccess","src":"2399:16:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2380:35:209","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":23160,"nodeType":"IfStatement","src":"2376:74:209","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":23157,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"2424:24:209","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":23158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2424:26:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":23159,"nodeType":"RevertStatement","src":"2417:33:209"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":23171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":23161,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2464:3:209","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":23162,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2468:6:209","memberName":"sender","nodeType":"MemberAccess","src":"2464:10:209","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23165,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"2486:20:209","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":23166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2507:6:209","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"2486:27:209","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":23167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2486:29:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":23168,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2516:16:209","memberName":"metadataResolver","nodeType":"MemberAccess","referencedDeclaration":36857,"src":"2486:46:209","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$returns$_t_contract$_ITokenMetadataResolver_$36704_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer) view returns (contract ITokenMetadataResolver)"}},"id":23169,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2486:48:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"id":23164,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2478:7:209","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":23163,"name":"address","nodeType":"ElementaryTypeName","src":"2478:7:209","typeDescriptions":{}}},"id":23170,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2478:57:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2464:71:209","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":23177,"nodeType":"IfStatement","src":"2460:115:209","trueBody":{"errorCall":{"arguments":[{"expression":{"id":23173,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2564:3:209","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":23174,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2568:6:209","memberName":"sender","nodeType":"MemberAccess","src":"2564:10:209","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":23172,"name":"NotMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36690,"src":"2544:19:209","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":23175,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2544:31:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":23176,"nodeType":"RevertStatement","src":"2537:38:209"}},{"body":{"id":23197,"nodeType":"Block","src":"2628:60:209","statements":[{"eventCall":{"arguments":[{"baseExpression":{"id":23189,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23149,"src":"2651:9:209","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}},"id":23191,"indexExpression":{"id":23190,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23179,"src":"2661:1:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2651:12:209","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"baseExpression":{"id":23192,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23146,"src":"2665:8:209","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":23194,"indexExpression":{"id":23193,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23179,"src":"2674:1:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2665:11:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":23188,"name":"URI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23622,"src":"2647:3:209","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256)"}},"id":23195,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2647:30:209","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23196,"nodeType":"EmitStatement","src":"2642:35:209"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":23184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":23181,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23179,"src":"2602:1:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":23182,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23146,"src":"2606:8:209","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":23183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2615:6:209","memberName":"length","nodeType":"MemberAccess","src":"2606:15:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2602:19:209","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":23198,"initializationExpression":{"assignments":[23179],"declarations":[{"constant":false,"id":23179,"mutability":"mutable","name":"i","nameLocation":"2599:1:209","nodeType":"VariableDeclaration","scope":23198,"src":"2591:9:209","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23178,"name":"uint256","nodeType":"ElementaryTypeName","src":"2591:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":23180,"nodeType":"VariableDeclarationStatement","src":"2591:9:209"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":23186,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"2623:3:209","subExpression":{"id":23185,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23179,"src":"2625:1:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23187,"nodeType":"ExpressionStatement","src":"2623:3:209"},"nodeType":"ForStatement","src":"2586:102:209"}]},"documentation":{"id":23143,"nodeType":"StructuredDocumentation","src":"1877:383:209","text":"@notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\n @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\n @dev Reverts if the caller is not the metadata resolver.\n @dev Emits a {URI} event for each token.\n @param tokenIds The token identifiers.\n @param tokenURIs The token metadata URIs."},"functionSelector":"6706467b","id":23200,"implemented":true,"kind":"function","modifiers":[],"name":"batchSetTokenURI","nameLocation":"2274:16:209","nodeType":"FunctionDefinition","parameters":{"id":23150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23146,"mutability":"mutable","name":"tokenIds","nameLocation":"2310:8:209","nodeType":"VariableDeclaration","scope":23200,"src":"2291:27:209","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23144,"name":"uint256","nodeType":"ElementaryTypeName","src":"2291:7:209","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23145,"nodeType":"ArrayTypeName","src":"2291:9:209","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23149,"mutability":"mutable","name":"tokenURIs","nameLocation":"2338:9:209","nodeType":"VariableDeclaration","scope":23200,"src":"2320:27:209","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":23147,"name":"string","nodeType":"ElementaryTypeName","src":"2320:6:209","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":23148,"nodeType":"ArrayTypeName","src":"2320:8:209","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"2290:58:209"},"returnParameters":{"id":23151,"nodeType":"ParameterList","parameters":[],"src":"2366:0:209"},"scope":23201,"src":"2265:429:209","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":23202,"src":"931:1765:209","usedErrors":[7886,36690],"usedEvents":[23622]}],"src":"32:2665:209"},"id":209},"contracts/token/ERC1155/base/ERC1155MintableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC1155MintableBase":[23308],"ERC1155Storage":[25484],"IERC1155Mintable":[24286]},"id":23309,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23203,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:210"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol","file":"./../interfaces/IERC1155Mintable.sol","id":23205,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23309,"sourceUnit":24287,"src":"58:70:210","symbolAliases":[{"foreign":{"id":23204,"name":"IERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24286,"src":"66:16:210","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23207,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23309,"sourceUnit":25485,"src":"129:65:210","symbolAliases":[{"foreign":{"id":23206,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"137:14:210","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":23209,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23309,"sourceUnit":8852,"src":"195:90:210","symbolAliases":[{"foreign":{"id":23208,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"203:20:210","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23211,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23309,"sourceUnit":1207,"src":"286:66:210","symbolAliases":[{"foreign":{"id":23210,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"294:7:210","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":23213,"name":"IERC1155Mintable","nameLocations":["691:16:210"],"nodeType":"IdentifierPath","referencedDeclaration":24286,"src":"691:16:210"},"id":23214,"nodeType":"InheritanceSpecifier","src":"691:16:210"},{"baseName":{"id":23215,"name":"Context","nameLocations":["709:7:210"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"709:7:210"},"id":23216,"nodeType":"InheritanceSpecifier","src":"709:7:210"}],"canonicalName":"ERC1155MintableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":23212,"nodeType":"StructuredDocumentation","src":"354:296:210","text":"@title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC1155 (Multi Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":23308,"linearizedBaseContracts":[23308,1206,24286],"name":"ERC1155MintableBase","nameLocation":"668:19:210","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23220,"libraryName":{"id":23217,"name":"ERC1155Storage","nameLocations":["729:14:210"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"729:14:210"},"nodeType":"UsingForDirective","src":"723:47:210","typeName":{"id":23219,"nodeType":"UserDefinedTypeName","pathNode":{"id":23218,"name":"ERC1155Storage.Layout","nameLocations":["748:14:210","763:6:210"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"748:21:210"},"referencedDeclaration":24383,"src":"748:21:210","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"global":false,"id":23224,"libraryName":{"id":23221,"name":"AccessControlStorage","nameLocations":["781:20:210"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"781:20:210"},"nodeType":"UsingForDirective","src":"775:59:210","typeName":{"id":23223,"nodeType":"UserDefinedTypeName","pathNode":{"id":23222,"name":"AccessControlStorage.Layout","nameLocations":["806:20:210","827:6:210"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"806:27:210"},"referencedDeclaration":8616,"src":"806:27:210","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"d5391393","id":23227,"mutability":"constant","name":"MINTER_ROLE","nameLocation":"864:11:210","nodeType":"VariableDeclaration","scope":23308,"src":"840:46:210","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":23225,"name":"bytes32","nodeType":"ElementaryTypeName","src":"840:7:210","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":23226,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"878:8:210","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"public"},{"baseFunctions":[24271],"body":{"id":23265,"nodeType":"Block","src":"1114:192:210","statements":[{"assignments":[23240],"declarations":[{"constant":false,"id":23240,"mutability":"mutable","name":"sender","nameLocation":"1132:6:210","nodeType":"VariableDeclaration","scope":23265,"src":"1124:14:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23239,"name":"address","nodeType":"ElementaryTypeName","src":"1124:7:210","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":23243,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":23241,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1141:10:210","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1141:12:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1124:29:210"},{"expression":{"arguments":[{"id":23249,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23227,"src":"1208:11:210","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":23250,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23240,"src":"1221:6:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23244,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1163:20:210","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":23246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1184:6:210","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1163:27:210","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":23247,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1163:29:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":23248,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1193:14:210","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1163:44:210","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":23251,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1163:65:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23252,"nodeType":"ExpressionStatement","src":"1163:65:210"},{"expression":{"arguments":[{"id":23258,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23240,"src":"1271:6:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23259,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23230,"src":"1279:2:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23260,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23232,"src":"1283:2:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":23261,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23234,"src":"1287:5:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":23262,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23236,"src":"1294:4:210","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23253,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1238:14:210","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23255,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1253:6:210","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1238:21:210","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1238:23:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23257,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1262:8:210","memberName":"safeMint","nodeType":"MemberAccess","referencedDeclaration":24728,"src":"1238:32:210","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256,bytes memory)"}},"id":23263,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1238:61:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23264,"nodeType":"ExpressionStatement","src":"1238:61:210"}]},"documentation":{"id":23228,"nodeType":"StructuredDocumentation","src":"893:121:210","text":"@inheritdoc IERC1155Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"5cfa9297","id":23266,"implemented":true,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"1028:8:210","nodeType":"FunctionDefinition","parameters":{"id":23237,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23230,"mutability":"mutable","name":"to","nameLocation":"1045:2:210","nodeType":"VariableDeclaration","scope":23266,"src":"1037:10:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23229,"name":"address","nodeType":"ElementaryTypeName","src":"1037:7:210","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23232,"mutability":"mutable","name":"id","nameLocation":"1057:2:210","nodeType":"VariableDeclaration","scope":23266,"src":"1049:10:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23231,"name":"uint256","nodeType":"ElementaryTypeName","src":"1049:7:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23234,"mutability":"mutable","name":"value","nameLocation":"1069:5:210","nodeType":"VariableDeclaration","scope":23266,"src":"1061:13:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23233,"name":"uint256","nodeType":"ElementaryTypeName","src":"1061:7:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23236,"mutability":"mutable","name":"data","nameLocation":"1091:4:210","nodeType":"VariableDeclaration","scope":23266,"src":"1076:19:210","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23235,"name":"bytes","nodeType":"ElementaryTypeName","src":"1076:5:210","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1036:60:210"},"returnParameters":{"id":23238,"nodeType":"ParameterList","parameters":[],"src":"1114:0:210"},"scope":23308,"src":"1019:287:210","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24285],"body":{"id":23306,"nodeType":"Block","src":"1562:199:210","statements":[{"assignments":[23281],"declarations":[{"constant":false,"id":23281,"mutability":"mutable","name":"sender","nameLocation":"1580:6:210","nodeType":"VariableDeclaration","scope":23306,"src":"1572:14:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23280,"name":"address","nodeType":"ElementaryTypeName","src":"1572:7:210","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":23284,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":23282,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1589:10:210","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1589:12:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1572:29:210"},{"expression":{"arguments":[{"id":23290,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23227,"src":"1656:11:210","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":23291,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23281,"src":"1669:6:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23285,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1611:20:210","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":23287,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1632:6:210","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1611:27:210","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":23288,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:29:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":23289,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1641:14:210","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1611:44:210","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":23292,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1611:65:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23293,"nodeType":"ExpressionStatement","src":"1611:65:210"},{"expression":{"arguments":[{"id":23299,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23281,"src":"1724:6:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23300,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23269,"src":"1732:2:210","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23301,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23272,"src":"1736:3:210","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23302,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23275,"src":"1741:6:210","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23303,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23277,"src":"1749:4:210","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23294,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1686:14:210","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1701:6:210","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1686:21:210","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23297,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1686:23:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23298,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1710:13:210","memberName":"safeBatchMint","nodeType":"MemberAccess","referencedDeclaration":24821,"src":"1686:37:210","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256[] memory,uint256[] memory,bytes memory)"}},"id":23304,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1686:68:210","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23305,"nodeType":"ExpressionStatement","src":"1686:68:210"}]},"documentation":{"id":23267,"nodeType":"StructuredDocumentation","src":"1312:121:210","text":"@inheritdoc IERC1155Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"0d6a5bbb","id":23307,"implemented":true,"kind":"function","modifiers":[],"name":"safeBatchMint","nameLocation":"1447:13:210","nodeType":"FunctionDefinition","parameters":{"id":23278,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23269,"mutability":"mutable","name":"to","nameLocation":"1469:2:210","nodeType":"VariableDeclaration","scope":23307,"src":"1461:10:210","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23268,"name":"address","nodeType":"ElementaryTypeName","src":"1461:7:210","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23272,"mutability":"mutable","name":"ids","nameLocation":"1492:3:210","nodeType":"VariableDeclaration","scope":23307,"src":"1473:22:210","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23270,"name":"uint256","nodeType":"ElementaryTypeName","src":"1473:7:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23271,"nodeType":"ArrayTypeName","src":"1473:9:210","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23275,"mutability":"mutable","name":"values","nameLocation":"1516:6:210","nodeType":"VariableDeclaration","scope":23307,"src":"1497:25:210","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23273,"name":"uint256","nodeType":"ElementaryTypeName","src":"1497:7:210","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23274,"nodeType":"ArrayTypeName","src":"1497:9:210","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23277,"mutability":"mutable","name":"data","nameLocation":"1539:4:210","nodeType":"VariableDeclaration","scope":23307,"src":"1524:19:210","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23276,"name":"bytes","nodeType":"ElementaryTypeName","src":"1524:5:210","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1460:84:210"},"returnParameters":{"id":23279,"nodeType":"ParameterList","parameters":[],"src":"1562:0:210"},"scope":23308,"src":"1438:323:210","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":23309,"src":"650:1113:210","usedErrors":[7886,8223,23548,23557,23568,23576],"usedEvents":[23591,23606]}],"src":"32:1732:210"},"id":210},"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol","exportedSymbols":{"Context":[1206],"ERC1155Storage":[25484],"ERC1155WithOperatorFiltererBase":[23509],"IERC1155":[24178],"OperatorFiltererStorage":[37870]},"id":23510,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23310,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:211"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","file":"./../interfaces/IERC1155.sol","id":23312,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23510,"sourceUnit":24179,"src":"58:54:211","symbolAliases":[{"foreign":{"id":23311,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"66:8:211","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23314,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23510,"sourceUnit":25485,"src":"113:65:211","symbolAliases":[{"foreign":{"id":23313,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"121:14:211","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../royalty/libraries/OperatorFiltererStorage.sol","id":23316,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23510,"sourceUnit":37871,"src":"179:94:211","symbolAliases":[{"foreign":{"id":23315,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"187:23:211","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23318,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23510,"sourceUnit":1207,"src":"274:66:211","symbolAliases":[{"foreign":{"id":23317,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"282:7:211","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":23320,"name":"IERC1155","nameLocations":["638:8:211"],"nodeType":"IdentifierPath","referencedDeclaration":24178,"src":"638:8:211"},"id":23321,"nodeType":"InheritanceSpecifier","src":"638:8:211"},{"baseName":{"id":23322,"name":"Context","nameLocations":["648:7:211"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"648:7:211"},"id":23323,"nodeType":"InheritanceSpecifier","src":"648:7:211"}],"canonicalName":"ERC1155WithOperatorFiltererBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":23319,"nodeType":"StructuredDocumentation","src":"342:243:211","text":"@title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":23509,"linearizedBaseContracts":[23509,1206,24178],"name":"ERC1155WithOperatorFiltererBase","nameLocation":"603:31:211","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23327,"libraryName":{"id":23324,"name":"ERC1155Storage","nameLocations":["668:14:211"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"668:14:211"},"nodeType":"UsingForDirective","src":"662:47:211","typeName":{"id":23326,"nodeType":"UserDefinedTypeName","pathNode":{"id":23325,"name":"ERC1155Storage.Layout","nameLocations":["687:14:211","702:6:211"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"687:21:211"},"referencedDeclaration":24383,"src":"687:21:211","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"global":false,"id":23331,"libraryName":{"id":23328,"name":"OperatorFiltererStorage","nameLocations":["720:23:211"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"720:23:211"},"nodeType":"UsingForDirective","src":"714:65:211","typeName":{"id":23330,"nodeType":"UserDefinedTypeName","pathNode":{"id":23329,"name":"OperatorFiltererStorage.Layout","nameLocations":["748:23:211","772:6:211"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"748:30:211"},"referencedDeclaration":37673,"src":"748:30:211","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"baseFunctions":[24120],"body":{"id":23372,"nodeType":"Block","src":"1051:221:211","statements":[{"assignments":[23346],"declarations":[{"constant":false,"id":23346,"mutability":"mutable","name":"sender","nameLocation":"1069:6:211","nodeType":"VariableDeclaration","scope":23372,"src":"1061:14:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23345,"name":"address","nodeType":"ElementaryTypeName","src":"1061:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":23349,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":23347,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1078:10:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1078:12:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1061:29:211"},{"expression":{"arguments":[{"id":23355,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23346,"src":"1167:6:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23356,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23334,"src":"1175:4:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23350,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1100:23:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":23352,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1124:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1100:30:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":23353,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1100:32:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":23354,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1133:33:211","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"1100:66:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":23357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1100:80:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23358,"nodeType":"ExpressionStatement","src":"1100:80:211"},{"expression":{"arguments":[{"id":23364,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23346,"src":"1231:6:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23365,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23334,"src":"1239:4:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23366,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23336,"src":"1245:2:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23367,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23338,"src":"1249:2:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":23368,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23340,"src":"1253:5:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":23369,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23342,"src":"1260:4:211","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23359,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1190:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23361,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1205:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1190:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23362,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1190:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23363,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1214:16:211","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24563,"src":"1190:40:211","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,address,uint256,uint256,bytes calldata)"}},"id":23370,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1190:75:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23371,"nodeType":"ExpressionStatement","src":"1190:75:211"}]},"documentation":{"id":23332,"nodeType":"StructuredDocumentation","src":"785:144:211","text":"@inheritdoc IERC1155\n @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"f242432a","id":23373,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"943:16:211","nodeType":"FunctionDefinition","parameters":{"id":23343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23334,"mutability":"mutable","name":"from","nameLocation":"968:4:211","nodeType":"VariableDeclaration","scope":23373,"src":"960:12:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23333,"name":"address","nodeType":"ElementaryTypeName","src":"960:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23336,"mutability":"mutable","name":"to","nameLocation":"982:2:211","nodeType":"VariableDeclaration","scope":23373,"src":"974:10:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23335,"name":"address","nodeType":"ElementaryTypeName","src":"974:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23338,"mutability":"mutable","name":"id","nameLocation":"994:2:211","nodeType":"VariableDeclaration","scope":23373,"src":"986:10:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23337,"name":"uint256","nodeType":"ElementaryTypeName","src":"986:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23340,"mutability":"mutable","name":"value","nameLocation":"1006:5:211","nodeType":"VariableDeclaration","scope":23373,"src":"998:13:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23339,"name":"uint256","nodeType":"ElementaryTypeName","src":"998:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23342,"mutability":"mutable","name":"data","nameLocation":"1028:4:211","nodeType":"VariableDeclaration","scope":23373,"src":"1013:19:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23341,"name":"bytes","nodeType":"ElementaryTypeName","src":"1013:5:211","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"959:74:211"},"returnParameters":{"id":23344,"nodeType":"ParameterList","parameters":[],"src":"1051:0:211"},"scope":23509,"src":"934:338:211","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24136],"body":{"id":23416,"nodeType":"Block","src":"1619:228:211","statements":[{"assignments":[23390],"declarations":[{"constant":false,"id":23390,"mutability":"mutable","name":"sender","nameLocation":"1637:6:211","nodeType":"VariableDeclaration","scope":23416,"src":"1629:14:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23389,"name":"address","nodeType":"ElementaryTypeName","src":"1629:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":23393,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":23391,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1646:10:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1646:12:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1629:29:211"},{"expression":{"arguments":[{"id":23399,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23390,"src":"1735:6:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23400,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23376,"src":"1743:4:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23394,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1668:23:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":23396,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1692:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1668:30:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":23397,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1668:32:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":23398,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1701:33:211","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"1668:66:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":23401,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1668:80:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23402,"nodeType":"ExpressionStatement","src":"1668:80:211"},{"expression":{"arguments":[{"id":23408,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23390,"src":"1804:6:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23409,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23376,"src":"1812:4:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23410,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23378,"src":"1818:2:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23411,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23381,"src":"1822:3:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23412,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23384,"src":"1827:6:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":23413,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23386,"src":"1835:4:211","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23403,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1758:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1773:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"1758:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23406,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1758:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23407,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1782:21:211","memberName":"safeBatchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":24665,"src":"1758:45:211","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,address,uint256[] calldata,uint256[] calldata,bytes calldata)"}},"id":23414,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1758:82:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23415,"nodeType":"ExpressionStatement","src":"1758:82:211"}]},"documentation":{"id":23374,"nodeType":"StructuredDocumentation","src":"1278:144:211","text":"@inheritdoc IERC1155\n @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"2eb2c2d6","id":23417,"implemented":true,"kind":"function","modifiers":[],"name":"safeBatchTransferFrom","nameLocation":"1436:21:211","nodeType":"FunctionDefinition","parameters":{"id":23387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23376,"mutability":"mutable","name":"from","nameLocation":"1475:4:211","nodeType":"VariableDeclaration","scope":23417,"src":"1467:12:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23375,"name":"address","nodeType":"ElementaryTypeName","src":"1467:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23378,"mutability":"mutable","name":"to","nameLocation":"1497:2:211","nodeType":"VariableDeclaration","scope":23417,"src":"1489:10:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23377,"name":"address","nodeType":"ElementaryTypeName","src":"1489:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23381,"mutability":"mutable","name":"ids","nameLocation":"1528:3:211","nodeType":"VariableDeclaration","scope":23417,"src":"1509:22:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23379,"name":"uint256","nodeType":"ElementaryTypeName","src":"1509:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23380,"nodeType":"ArrayTypeName","src":"1509:9:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23384,"mutability":"mutable","name":"values","nameLocation":"1560:6:211","nodeType":"VariableDeclaration","scope":23417,"src":"1541:25:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23382,"name":"uint256","nodeType":"ElementaryTypeName","src":"1541:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23383,"nodeType":"ArrayTypeName","src":"1541:9:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23386,"mutability":"mutable","name":"data","nameLocation":"1591:4:211","nodeType":"VariableDeclaration","scope":23417,"src":"1576:19:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23385,"name":"bytes","nodeType":"ElementaryTypeName","src":"1576:5:211","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1457:144:211"},"returnParameters":{"id":23388,"nodeType":"ParameterList","parameters":[],"src":"1619:0:211"},"scope":23509,"src":"1427:420:211","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24144],"body":{"id":23447,"nodeType":"Block","src":"2061:216:211","statements":[{"condition":{"id":23425,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23422,"src":"2075:8:211","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":23435,"nodeType":"IfStatement","src":"2071:115:211","trueBody":{"id":23434,"nodeType":"Block","src":"2085:101:211","statements":[{"expression":{"arguments":[{"id":23431,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23420,"src":"2166:8:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23426,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"2099:23:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":23428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2123:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"2099:30:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":23429,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2099:32:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":23430,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2132:33:211","memberName":"requireAllowedOperatorForApproval","nodeType":"MemberAccess","referencedDeclaration":37794,"src":"2099:66:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address) view"}},"id":23432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2099:76:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23433,"nodeType":"ExpressionStatement","src":"2099:76:211"}]}},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23441,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2237:10:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2237:12:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23443,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23420,"src":"2251:8:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23444,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23422,"src":"2261:8:211","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23436,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2195:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2210:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"2195:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23439,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2195:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23440,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2219:17:211","memberName":"setApprovalForAll","nodeType":"MemberAccess","referencedDeclaration":25047,"src":"2195:41:211","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,bool)"}},"id":23445,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2195:75:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23446,"nodeType":"ExpressionStatement","src":"2195:75:211"}]},"documentation":{"id":23418,"nodeType":"StructuredDocumentation","src":"1853:126:211","text":"@inheritdoc IERC1155\n @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry."},"functionSelector":"a22cb465","id":23448,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"1993:17:211","nodeType":"FunctionDefinition","parameters":{"id":23423,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23420,"mutability":"mutable","name":"operator","nameLocation":"2019:8:211","nodeType":"VariableDeclaration","scope":23448,"src":"2011:16:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23419,"name":"address","nodeType":"ElementaryTypeName","src":"2011:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23422,"mutability":"mutable","name":"approved","nameLocation":"2034:8:211","nodeType":"VariableDeclaration","scope":23448,"src":"2029:13:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":23421,"name":"bool","nodeType":"ElementaryTypeName","src":"2029:4:211","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2010:33:211"},"returnParameters":{"id":23424,"nodeType":"ParameterList","parameters":[],"src":"2061:0:211"},"scope":23509,"src":"1984:293:211","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[24154],"body":{"id":23466,"nodeType":"Block","src":"2423:81:211","statements":[{"expression":{"arguments":[{"id":23462,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23451,"src":"2481:5:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23463,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23453,"src":"2488:8:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23458,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2440:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2455:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"2440:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2440:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23461,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2464:16:211","memberName":"isApprovedForAll","nodeType":"MemberAccess","referencedDeclaration":25068,"src":"2440:40:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":23464,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2440:57:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":23457,"id":23465,"nodeType":"Return","src":"2433:64:211"}]},"documentation":{"id":23449,"nodeType":"StructuredDocumentation","src":"2283:24:211","text":"@inheritdoc IERC1155"},"functionSelector":"e985e9c5","id":23467,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"2321:16:211","nodeType":"FunctionDefinition","parameters":{"id":23454,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23451,"mutability":"mutable","name":"owner","nameLocation":"2346:5:211","nodeType":"VariableDeclaration","scope":23467,"src":"2338:13:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23450,"name":"address","nodeType":"ElementaryTypeName","src":"2338:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23453,"mutability":"mutable","name":"operator","nameLocation":"2361:8:211","nodeType":"VariableDeclaration","scope":23467,"src":"2353:16:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23452,"name":"address","nodeType":"ElementaryTypeName","src":"2353:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2337:33:211"},"returnParameters":{"id":23457,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23456,"mutability":"mutable","name":"approvedForAll","nameLocation":"2407:14:211","nodeType":"VariableDeclaration","scope":23467,"src":"2402:19:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":23455,"name":"bool","nodeType":"ElementaryTypeName","src":"2402:4:211","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2401:21:211"},"scope":23509,"src":"2312:192:211","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[24164],"body":{"id":23485,"nodeType":"Block","src":"2633:68:211","statements":[{"expression":{"arguments":[{"id":23481,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23470,"src":"2684:5:211","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":23482,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23472,"src":"2691:2:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23477,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2650:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2665:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"2650:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23479,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2650:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23480,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2674:9:211","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":25099,"src":"2650:33:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256) view returns (uint256)"}},"id":23483,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2650:44:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":23476,"id":23484,"nodeType":"Return","src":"2643:51:211"}]},"documentation":{"id":23468,"nodeType":"StructuredDocumentation","src":"2510:24:211","text":"@inheritdoc IERC1155"},"functionSelector":"00fdd58e","id":23486,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2548:9:211","nodeType":"FunctionDefinition","parameters":{"id":23473,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23470,"mutability":"mutable","name":"owner","nameLocation":"2566:5:211","nodeType":"VariableDeclaration","scope":23486,"src":"2558:13:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23469,"name":"address","nodeType":"ElementaryTypeName","src":"2558:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23472,"mutability":"mutable","name":"id","nameLocation":"2581:2:211","nodeType":"VariableDeclaration","scope":23486,"src":"2573:10:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23471,"name":"uint256","nodeType":"ElementaryTypeName","src":"2573:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2557:27:211"},"returnParameters":{"id":23476,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23475,"mutability":"mutable","name":"balance","nameLocation":"2624:7:211","nodeType":"VariableDeclaration","scope":23486,"src":"2616:15:211","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23474,"name":"uint256","nodeType":"ElementaryTypeName","src":"2616:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2615:17:211"},"scope":23509,"src":"2539:162:211","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[24177],"body":{"id":23507,"nodeType":"Block","src":"2869:75:211","statements":[{"expression":{"arguments":[{"id":23503,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23490,"src":"2925:6:211","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":23504,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23493,"src":"2933:3:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23499,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2886:14:211","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23500,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2901:6:211","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":25175,"src":"2886:21:211","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function () pure returns (struct ERC1155Storage.Layout storage pointer)"}},"id":23501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2886:23:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":23502,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2910:14:211","memberName":"balanceOfBatch","nodeType":"MemberAccess","referencedDeclaration":25163,"src":"2886:38:211","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address[] calldata,uint256[] calldata) view returns (uint256[] memory)"}},"id":23505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2886:51:211","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"functionReturnParameters":23498,"id":23506,"nodeType":"Return","src":"2879:58:211"}]},"documentation":{"id":23487,"nodeType":"StructuredDocumentation","src":"2707:24:211","text":"@inheritdoc IERC1155"},"functionSelector":"4e1273f4","id":23508,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOfBatch","nameLocation":"2745:14:211","nodeType":"FunctionDefinition","parameters":{"id":23494,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23490,"mutability":"mutable","name":"owners","nameLocation":"2779:6:211","nodeType":"VariableDeclaration","scope":23508,"src":"2760:25:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":23488,"name":"address","nodeType":"ElementaryTypeName","src":"2760:7:211","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":23489,"nodeType":"ArrayTypeName","src":"2760:9:211","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":23493,"mutability":"mutable","name":"ids","nameLocation":"2806:3:211","nodeType":"VariableDeclaration","scope":23508,"src":"2787:22:211","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23491,"name":"uint256","nodeType":"ElementaryTypeName","src":"2787:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23492,"nodeType":"ArrayTypeName","src":"2787:9:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2759:51:211"},"returnParameters":{"id":23498,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23497,"mutability":"mutable","name":"balances","nameLocation":"2859:8:211","nodeType":"VariableDeclaration","scope":23508,"src":"2842:25:211","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23495,"name":"uint256","nodeType":"ElementaryTypeName","src":"2842:7:211","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23496,"nodeType":"ArrayTypeName","src":"2842:9:211","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2841:27:211"},"scope":23509,"src":"2736:208:211","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":23510,"src":"585:2361:211","usedErrors":[7886,23516,23519,23526,23537,23548,23557,23568,23571,37090],"usedEvents":[23591,23606,23615]}],"src":"32:2915:211"},"id":211},"contracts/token/ERC1155/errors/ERC1155Errors.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/errors/ERC1155Errors.sol","exportedSymbols":{"ERC1155BalanceOfAddressZero":[23571],"ERC1155BalanceOverflow":[23548],"ERC1155InsufficientBalance":[23537],"ERC1155NonApproved":[23526],"ERC1155SafeBatchTransferRejected":[23568],"ERC1155SafeTransferRejected":[23557],"ERC1155SelfApprovalForAll":[23516],"ERC1155TransferToAddressZero":[23519]},"id":23572,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23511,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:212"},{"documentation":{"id":23512,"nodeType":"StructuredDocumentation","src":"58:120:212","text":"@notice Thrown when trying to approveForAll oneself.\n @param account The account trying to approveForAll itself."},"errorSelector":"fb0fdf61","id":23516,"name":"ERC1155SelfApprovalForAll","nameLocation":"184:25:212","nodeType":"ErrorDefinition","parameters":{"id":23515,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23514,"mutability":"mutable","name":"account","nameLocation":"218:7:212","nodeType":"VariableDeclaration","scope":23516,"src":"210:15:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23513,"name":"address","nodeType":"ElementaryTypeName","src":"210:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"209:17:212"},"src":"178:49:212"},{"documentation":{"id":23517,"nodeType":"StructuredDocumentation","src":"229:65:212","text":"@notice Thrown when transferring tokens to the zero address."},"errorSelector":"b5e89015","id":23519,"name":"ERC1155TransferToAddressZero","nameLocation":"300:28:212","nodeType":"ErrorDefinition","parameters":{"id":23518,"nodeType":"ParameterList","parameters":[],"src":"328:2:212"},"src":"294:37:212"},{"documentation":{"id":23520,"nodeType":"StructuredDocumentation","src":"333:168:212","text":"@notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\n @param sender The sender.\n @param owner The owner."},"errorSelector":"05bbb9c4","id":23526,"name":"ERC1155NonApproved","nameLocation":"507:18:212","nodeType":"ErrorDefinition","parameters":{"id":23525,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23522,"mutability":"mutable","name":"sender","nameLocation":"534:6:212","nodeType":"VariableDeclaration","scope":23526,"src":"526:14:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23521,"name":"address","nodeType":"ElementaryTypeName","src":"526:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23524,"mutability":"mutable","name":"owner","nameLocation":"550:5:212","nodeType":"VariableDeclaration","scope":23526,"src":"542:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23523,"name":"address","nodeType":"ElementaryTypeName","src":"542:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"525:31:212"},"src":"501:56:212"},{"documentation":{"id":23527,"nodeType":"StructuredDocumentation","src":"559:246:212","text":"@notice Thrown when transferring an amount of tokens greater than the current balance.\n @param owner The owner.\n @param id The token identifier.\n @param balance The current balance.\n @param value The amount of tokens to transfer."},"errorSelector":"03dee4c5","id":23537,"name":"ERC1155InsufficientBalance","nameLocation":"811:26:212","nodeType":"ErrorDefinition","parameters":{"id":23536,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23529,"mutability":"mutable","name":"owner","nameLocation":"846:5:212","nodeType":"VariableDeclaration","scope":23537,"src":"838:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23528,"name":"address","nodeType":"ElementaryTypeName","src":"838:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23531,"mutability":"mutable","name":"id","nameLocation":"861:2:212","nodeType":"VariableDeclaration","scope":23537,"src":"853:10:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23530,"name":"uint256","nodeType":"ElementaryTypeName","src":"853:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23533,"mutability":"mutable","name":"balance","nameLocation":"873:7:212","nodeType":"VariableDeclaration","scope":23537,"src":"865:15:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23532,"name":"uint256","nodeType":"ElementaryTypeName","src":"865:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23535,"mutability":"mutable","name":"value","nameLocation":"890:5:212","nodeType":"VariableDeclaration","scope":23537,"src":"882:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23534,"name":"uint256","nodeType":"ElementaryTypeName","src":"882:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"837:59:212"},"src":"805:92:212"},{"documentation":{"id":23538,"nodeType":"StructuredDocumentation","src":"899:276:212","text":"@notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\n @param recipient The recipient.\n @param id The token identifier.\n @param balance The current balance.\n @param value The amount of tokens to transfer."},"errorSelector":"42fb00bc","id":23548,"name":"ERC1155BalanceOverflow","nameLocation":"1181:22:212","nodeType":"ErrorDefinition","parameters":{"id":23547,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23540,"mutability":"mutable","name":"recipient","nameLocation":"1212:9:212","nodeType":"VariableDeclaration","scope":23548,"src":"1204:17:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23539,"name":"address","nodeType":"ElementaryTypeName","src":"1204:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23542,"mutability":"mutable","name":"id","nameLocation":"1231:2:212","nodeType":"VariableDeclaration","scope":23548,"src":"1223:10:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23541,"name":"uint256","nodeType":"ElementaryTypeName","src":"1223:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23544,"mutability":"mutable","name":"balance","nameLocation":"1243:7:212","nodeType":"VariableDeclaration","scope":23548,"src":"1235:15:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23543,"name":"uint256","nodeType":"ElementaryTypeName","src":"1235:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23546,"mutability":"mutable","name":"value","nameLocation":"1260:5:212","nodeType":"VariableDeclaration","scope":23548,"src":"1252:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23545,"name":"uint256","nodeType":"ElementaryTypeName","src":"1252:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1203:63:212"},"src":"1175:92:212"},{"documentation":{"id":23549,"nodeType":"StructuredDocumentation","src":"1269:211:212","text":"@notice Thrown when a safe transfer is rejected by the recipient contract.\n @param recipient The recipient contract.\n @param id The token identifier.\n @param value The amount of tokens to transfer."},"errorSelector":"40f39d38","id":23557,"name":"ERC1155SafeTransferRejected","nameLocation":"1486:27:212","nodeType":"ErrorDefinition","parameters":{"id":23556,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23551,"mutability":"mutable","name":"recipient","nameLocation":"1522:9:212","nodeType":"VariableDeclaration","scope":23557,"src":"1514:17:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23550,"name":"address","nodeType":"ElementaryTypeName","src":"1514:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23553,"mutability":"mutable","name":"id","nameLocation":"1541:2:212","nodeType":"VariableDeclaration","scope":23557,"src":"1533:10:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23552,"name":"uint256","nodeType":"ElementaryTypeName","src":"1533:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23555,"mutability":"mutable","name":"value","nameLocation":"1553:5:212","nodeType":"VariableDeclaration","scope":23557,"src":"1545:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23554,"name":"uint256","nodeType":"ElementaryTypeName","src":"1545:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1513:46:212"},"src":"1480:80:212"},{"documentation":{"id":23558,"nodeType":"StructuredDocumentation","src":"1562:221:212","text":"@notice Thrown when a safe batch transfer is rejected by the recipient contract.\n @param recipient The recipient contract.\n @param ids The token identifiers.\n @param values The amounts of tokens to transfer."},"errorSelector":"c287817e","id":23568,"name":"ERC1155SafeBatchTransferRejected","nameLocation":"1789:32:212","nodeType":"ErrorDefinition","parameters":{"id":23567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23560,"mutability":"mutable","name":"recipient","nameLocation":"1830:9:212","nodeType":"VariableDeclaration","scope":23568,"src":"1822:17:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23559,"name":"address","nodeType":"ElementaryTypeName","src":"1822:7:212","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23563,"mutability":"mutable","name":"ids","nameLocation":"1851:3:212","nodeType":"VariableDeclaration","scope":23568,"src":"1841:13:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23561,"name":"uint256","nodeType":"ElementaryTypeName","src":"1841:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23562,"nodeType":"ArrayTypeName","src":"1841:9:212","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23566,"mutability":"mutable","name":"values","nameLocation":"1866:6:212","nodeType":"VariableDeclaration","scope":23568,"src":"1856:16:212","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23564,"name":"uint256","nodeType":"ElementaryTypeName","src":"1856:7:212","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23565,"nodeType":"ArrayTypeName","src":"1856:9:212","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1821:52:212"},"src":"1783:91:212"},{"documentation":{"id":23569,"nodeType":"StructuredDocumentation","src":"1876:66:212","text":"@notice Thrown when querying the balance of the zero address."},"errorSelector":"ca2434a5","id":23571,"name":"ERC1155BalanceOfAddressZero","nameLocation":"1948:27:212","nodeType":"ErrorDefinition","parameters":{"id":23570,"nodeType":"ParameterList","parameters":[],"src":"1975:2:212"},"src":"1942:36:212"}],"src":"32:1947:212"},"id":212},"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol","exportedSymbols":{"ERC1155MintToAddressZero":[23576]},"id":23577,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23573,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:213"},{"documentation":{"id":23574,"nodeType":"StructuredDocumentation","src":"58:60:213","text":"@notice Thrown when minting tokens to the zero address."},"errorSelector":"021149bd","id":23576,"name":"ERC1155MintToAddressZero","nameLocation":"124:24:213","nodeType":"ErrorDefinition","parameters":{"id":23575,"nodeType":"ParameterList","parameters":[],"src":"148:2:213"},"src":"118:33:213"}],"src":"32:120:213"},"id":213},"contracts/token/ERC1155/events/ERC1155Events.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/events/ERC1155Events.sol","exportedSymbols":{"ApprovalForAll":[23615],"TransferBatch":[23606],"TransferSingle":[23591],"URI":[23622]},"id":23623,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23578,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:214"},{"anonymous":false,"documentation":{"id":23579,"nodeType":"StructuredDocumentation","src":"58:266:214","text":"@notice Emitted when some token is transferred.\n @param operator The initiator of the transfer.\n @param from The previous token owner.\n @param to The new token owner.\n @param id The transferred token identifier.\n @param value The amount of token."},"eventSelector":"c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62","id":23591,"name":"TransferSingle","nameLocation":"330:14:214","nodeType":"EventDefinition","parameters":{"id":23590,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23581,"indexed":true,"mutability":"mutable","name":"operator","nameLocation":"361:8:214","nodeType":"VariableDeclaration","scope":23591,"src":"345:24:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23580,"name":"address","nodeType":"ElementaryTypeName","src":"345:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23583,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"387:4:214","nodeType":"VariableDeclaration","scope":23591,"src":"371:20:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23582,"name":"address","nodeType":"ElementaryTypeName","src":"371:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23585,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"409:2:214","nodeType":"VariableDeclaration","scope":23591,"src":"393:18:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23584,"name":"address","nodeType":"ElementaryTypeName","src":"393:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23587,"indexed":false,"mutability":"mutable","name":"id","nameLocation":"421:2:214","nodeType":"VariableDeclaration","scope":23591,"src":"413:10:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23586,"name":"uint256","nodeType":"ElementaryTypeName","src":"413:7:214","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":23589,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"433:5:214","nodeType":"VariableDeclaration","scope":23591,"src":"425:13:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23588,"name":"uint256","nodeType":"ElementaryTypeName","src":"425:7:214","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"344:95:214"},"src":"324:116:214"},{"anonymous":false,"documentation":{"id":23592,"nodeType":"StructuredDocumentation","src":"442:281:214","text":"@notice Emitted when a batch of tokens is transferred.\n @param operator The initiator of the transfer.\n @param from The previous tokens owner.\n @param to The new tokens owner.\n @param ids The transferred tokens identifiers.\n @param values The amounts of tokens."},"eventSelector":"4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb","id":23606,"name":"TransferBatch","nameLocation":"729:13:214","nodeType":"EventDefinition","parameters":{"id":23605,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23594,"indexed":true,"mutability":"mutable","name":"operator","nameLocation":"759:8:214","nodeType":"VariableDeclaration","scope":23606,"src":"743:24:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23593,"name":"address","nodeType":"ElementaryTypeName","src":"743:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23596,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"785:4:214","nodeType":"VariableDeclaration","scope":23606,"src":"769:20:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23595,"name":"address","nodeType":"ElementaryTypeName","src":"769:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23598,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"807:2:214","nodeType":"VariableDeclaration","scope":23606,"src":"791:18:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23597,"name":"address","nodeType":"ElementaryTypeName","src":"791:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23601,"indexed":false,"mutability":"mutable","name":"ids","nameLocation":"821:3:214","nodeType":"VariableDeclaration","scope":23606,"src":"811:13:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23599,"name":"uint256","nodeType":"ElementaryTypeName","src":"811:7:214","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23600,"nodeType":"ArrayTypeName","src":"811:9:214","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":23604,"indexed":false,"mutability":"mutable","name":"values","nameLocation":"836:6:214","nodeType":"VariableDeclaration","scope":23606,"src":"826:16:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":23602,"name":"uint256","nodeType":"ElementaryTypeName","src":"826:7:214","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":23603,"nodeType":"ArrayTypeName","src":"826:9:214","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"742:101:214"},"src":"723:121:214"},{"anonymous":false,"documentation":{"id":23607,"nodeType":"StructuredDocumentation","src":"846:222:214","text":"@notice Emitted when an approval for all tokens is set or unset.\n @param owner The tokens owner.\n @param operator The approved address.\n @param approved True when then approval is set, false when it is unset."},"eventSelector":"17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31","id":23615,"name":"ApprovalForAll","nameLocation":"1074:14:214","nodeType":"EventDefinition","parameters":{"id":23614,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23609,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"1105:5:214","nodeType":"VariableDeclaration","scope":23615,"src":"1089:21:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23608,"name":"address","nodeType":"ElementaryTypeName","src":"1089:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23611,"indexed":true,"mutability":"mutable","name":"operator","nameLocation":"1128:8:214","nodeType":"VariableDeclaration","scope":23615,"src":"1112:24:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23610,"name":"address","nodeType":"ElementaryTypeName","src":"1112:7:214","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":23613,"indexed":false,"mutability":"mutable","name":"approved","nameLocation":"1143:8:214","nodeType":"VariableDeclaration","scope":23615,"src":"1138:13:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":23612,"name":"bool","nodeType":"ElementaryTypeName","src":"1138:4:214","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1088:64:214"},"src":"1068:85:214"},{"anonymous":false,"documentation":{"id":23616,"nodeType":"StructuredDocumentation","src":"1155:139:214","text":"@notice Emitted when a token metadata URI is set updated.\n @param value The token metadata URI.\n @param id The token identifier."},"eventSelector":"6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b","id":23622,"name":"URI","nameLocation":"1300:3:214","nodeType":"EventDefinition","parameters":{"id":23621,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23618,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"1311:5:214","nodeType":"VariableDeclaration","scope":23622,"src":"1304:12:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":23617,"name":"string","nodeType":"ElementaryTypeName","src":"1304:6:214","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":23620,"indexed":true,"mutability":"mutable","name":"id","nameLocation":"1334:2:214","nodeType":"VariableDeclaration","scope":23622,"src":"1318:18:214","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":23619,"name":"uint256","nodeType":"ElementaryTypeName","src":"1318:7:214","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1303:34:214"},"src":"1294:44:214"}],"src":"32:1307:214"},"id":214},"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol","exportedSymbols":{"Context":[1206],"ERC1155BurnableBase":[22995],"ERC1155BurnableFacet":[23703],"ERC1155Storage":[25484],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":23704,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23624,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:215"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":23626,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":13387,"src":"57:87:215","symbolAliases":[{"foreign":{"id":23625,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23628,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":25485,"src":"145:65:215","symbolAliases":[{"foreign":{"id":23627,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"153:14:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":23630,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":19478,"src":"211:83:215","symbolAliases":[{"foreign":{"id":23629,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155BurnableBase.sol","file":"./../base/ERC1155BurnableBase.sol","id":23632,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":22996,"src":"295:70:215","symbolAliases":[{"foreign":{"id":23631,"name":"ERC1155BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22995,"src":"303:19:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23634,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":1207,"src":"366:66:215","symbolAliases":[{"foreign":{"id":23633,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"374:7:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":23636,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23704,"sourceUnit":13298,"src":"433:101:215","symbolAliases":[{"foreign":{"id":23635,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"441:28:215","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":23638,"name":"ERC1155BurnableBase","nameLocations":["871:19:215"],"nodeType":"IdentifierPath","referencedDeclaration":22995,"src":"871:19:215"},"id":23639,"nodeType":"InheritanceSpecifier","src":"871:19:215"},{"baseName":{"id":23640,"name":"ForwarderRegistryContextBase","nameLocations":["892:28:215"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"892:28:215"},"id":23641,"nodeType":"InheritanceSpecifier","src":"892:28:215"}],"canonicalName":"ERC1155BurnableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":23637,"nodeType":"StructuredDocumentation","src":"536:302:215","text":"@title ERC1155 Multi Token Standard, optional extension: Burnable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":23703,"linearizedBaseContracts":[23703,13297,22995,1206,24204],"name":"ERC1155BurnableFacet","nameLocation":"847:20:215","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23645,"libraryName":{"id":23642,"name":"ProxyAdminStorage","nameLocations":["933:17:215"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"933:17:215"},"nodeType":"UsingForDirective","src":"927:53:215","typeName":{"id":23644,"nodeType":"UserDefinedTypeName","pathNode":{"id":23643,"name":"ProxyAdminStorage.Layout","nameLocations":["955:17:215","973:6:215"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"955:24:215"},"referencedDeclaration":19308,"src":"955:24:215","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":23654,"nodeType":"Block","src":"1084:2:215","statements":[]},"id":23655,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":23651,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23648,"src":"1065:17:215","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":23652,"kind":"baseConstructorSpecifier","modifierName":{"id":23650,"name":"ForwarderRegistryContextBase","nameLocations":["1036:28:215"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1036:28:215"},"nodeType":"ModifierInvocation","src":"1036:47:215"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":23649,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23648,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1017:17:215","nodeType":"VariableDeclaration","scope":23655,"src":"998:36:215","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":23647,"nodeType":"UserDefinedTypeName","pathNode":{"id":23646,"name":"IForwarderRegistry","nameLocations":["998:18:215"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"998:18:215"},"referencedDeclaration":13386,"src":"998:18:215","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"997:38:215"},"returnParameters":{"id":23653,"nodeType":"ParameterList","parameters":[],"src":"1084:0:215"},"scope":23703,"src":"986:100:215","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":23673,"nodeType":"Block","src":"1304:123:215","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23664,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[23688],"referencedDeclaration":23688,"src":"1361:10:215","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23665,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1361:12:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23659,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1314:17:215","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":23661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1332:6:215","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1314:24:215","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":23662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1314:26:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":23663,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1341:19:215","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1314:46:215","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":23666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1314:60:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23667,"nodeType":"ExpressionStatement","src":"1314:60:215"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23668,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1384:14:215","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1399:19:215","memberName":"initERC1155Burnable","nodeType":"MemberAccess","referencedDeclaration":24491,"src":"1384:34:215","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":23671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1384:36:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23672,"nodeType":"ExpressionStatement","src":"1384:36:215"}]},"documentation":{"id":23656,"nodeType":"StructuredDocumentation","src":"1092:160:215","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155Burnable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"641ff7d9","id":23674,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155BurnableStorage","nameLocation":"1266:26:215","nodeType":"FunctionDefinition","parameters":{"id":23657,"nodeType":"ParameterList","parameters":[],"src":"1292:2:215"},"returnParameters":{"id":23658,"nodeType":"ParameterList","parameters":[],"src":"1304:0:215"},"scope":23703,"src":"1257:170:215","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":23687,"nodeType":"Block","src":"1592:65:215","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23683,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1609:28:215","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1638:10:215","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1609:39:215","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1609:41:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":23682,"id":23686,"nodeType":"Return","src":"1602:48:215"}]},"documentation":{"id":23675,"nodeType":"StructuredDocumentation","src":"1433:44:215","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23688,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1491:10:215","nodeType":"FunctionDefinition","overrides":{"id":23679,"nodeType":"OverrideSpecifier","overrides":[{"id":23677,"name":"Context","nameLocations":["1535:7:215"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1535:7:215"},{"id":23678,"name":"ForwarderRegistryContextBase","nameLocations":["1544:28:215"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1544:28:215"}],"src":"1526:47:215"},"parameters":{"id":23676,"nodeType":"ParameterList","parameters":[],"src":"1501:2:215"},"returnParameters":{"id":23682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23681,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23688,"src":"1583:7:215","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23680,"name":"address","nodeType":"ElementaryTypeName","src":"1583:7:215","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1582:9:215"},"scope":23703,"src":"1482:175:215","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":23701,"nodeType":"Block","src":"1827:63:215","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23697,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1844:28:215","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1873:8:215","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1844:37:215","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":23699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1844:39:215","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":23696,"id":23700,"nodeType":"Return","src":"1837:46:215"}]},"documentation":{"id":23689,"nodeType":"StructuredDocumentation","src":"1663:44:215","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23702,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1721:8:215","nodeType":"FunctionDefinition","overrides":{"id":23693,"nodeType":"OverrideSpecifier","overrides":[{"id":23691,"name":"Context","nameLocations":["1763:7:215"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1763:7:215"},{"id":23692,"name":"ForwarderRegistryContextBase","nameLocations":["1772:28:215"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1772:28:215"}],"src":"1754:47:215"},"parameters":{"id":23690,"nodeType":"ParameterList","parameters":[],"src":"1729:2:215"},"returnParameters":{"id":23696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23695,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23702,"src":"1811:14:215","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23694,"name":"bytes","nodeType":"ElementaryTypeName","src":"1811:5:215","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1810:16:215"},"scope":23703,"src":"1712:178:215","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":23704,"src":"838:1054:215","usedErrors":[7886,11559,19183,23526,23537],"usedEvents":[23591,23606]}],"src":"32:1861:215"},"id":215},"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol","exportedSymbols":{"Context":[1206],"ERC1155DeliverableBase":[23064],"ERC1155DeliverableFacet":[23784],"ERC1155Storage":[25484],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":23785,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23705,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:216"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":23707,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":13387,"src":"57:87:216","symbolAliases":[{"foreign":{"id":23706,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23709,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":25485,"src":"145:65:216","symbolAliases":[{"foreign":{"id":23708,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"153:14:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":23711,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":19478,"src":"211:83:216","symbolAliases":[{"foreign":{"id":23710,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol","file":"./../base/ERC1155DeliverableBase.sol","id":23713,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":23065,"src":"295:76:216","symbolAliases":[{"foreign":{"id":23712,"name":"ERC1155DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23064,"src":"303:22:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23715,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":1207,"src":"372:66:216","symbolAliases":[{"foreign":{"id":23714,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"380:7:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":23717,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23785,"sourceUnit":13298,"src":"439:101:216","symbolAliases":[{"foreign":{"id":23716,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"447:28:216","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":23719,"name":"ERC1155DeliverableBase","nameLocations":["883:22:216"],"nodeType":"IdentifierPath","referencedDeclaration":23064,"src":"883:22:216"},"id":23720,"nodeType":"InheritanceSpecifier","src":"883:22:216"},{"baseName":{"id":23721,"name":"ForwarderRegistryContextBase","nameLocations":["907:28:216"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"907:28:216"},"id":23722,"nodeType":"InheritanceSpecifier","src":"907:28:216"}],"canonicalName":"ERC1155DeliverableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":23718,"nodeType":"StructuredDocumentation","src":"542:305:216","text":"@title ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":23784,"linearizedBaseContracts":[23784,13297,23064,1206,24223],"name":"ERC1155DeliverableFacet","nameLocation":"856:23:216","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23726,"libraryName":{"id":23723,"name":"ProxyAdminStorage","nameLocations":["948:17:216"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"948:17:216"},"nodeType":"UsingForDirective","src":"942:53:216","typeName":{"id":23725,"nodeType":"UserDefinedTypeName","pathNode":{"id":23724,"name":"ProxyAdminStorage.Layout","nameLocations":["970:17:216","988:6:216"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"970:24:216"},"referencedDeclaration":19308,"src":"970:24:216","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":23735,"nodeType":"Block","src":"1099:2:216","statements":[]},"id":23736,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":23732,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23729,"src":"1080:17:216","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":23733,"kind":"baseConstructorSpecifier","modifierName":{"id":23731,"name":"ForwarderRegistryContextBase","nameLocations":["1051:28:216"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1051:28:216"},"nodeType":"ModifierInvocation","src":"1051:47:216"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":23730,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23729,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1032:17:216","nodeType":"VariableDeclaration","scope":23736,"src":"1013:36:216","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":23728,"nodeType":"UserDefinedTypeName","pathNode":{"id":23727,"name":"IForwarderRegistry","nameLocations":["1013:18:216"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1013:18:216"},"referencedDeclaration":13386,"src":"1013:18:216","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1012:38:216"},"returnParameters":{"id":23734,"nodeType":"ParameterList","parameters":[],"src":"1099:0:216"},"scope":23784,"src":"1001:100:216","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":23754,"nodeType":"Block","src":"1325:126:216","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23745,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[23769],"referencedDeclaration":23769,"src":"1382:10:216","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1382:12:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23740,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1335:17:216","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":23742,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1353:6:216","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1335:24:216","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":23743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1335:26:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":23744,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1362:19:216","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1335:46:216","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":23747,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1335:60:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23748,"nodeType":"ExpressionStatement","src":"1335:60:216"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23749,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1405:14:216","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1420:22:216","memberName":"initERC1155Deliverable","nodeType":"MemberAccess","referencedDeclaration":24474,"src":"1405:37:216","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":23752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1405:39:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23753,"nodeType":"ExpressionStatement","src":"1405:39:216"}]},"documentation":{"id":23737,"nodeType":"StructuredDocumentation","src":"1107:163:216","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"ba92ca2a","id":23755,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155DeliverableStorage","nameLocation":"1284:29:216","nodeType":"FunctionDefinition","parameters":{"id":23738,"nodeType":"ParameterList","parameters":[],"src":"1313:2:216"},"returnParameters":{"id":23739,"nodeType":"ParameterList","parameters":[],"src":"1325:0:216"},"scope":23784,"src":"1275:176:216","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":23768,"nodeType":"Block","src":"1616:65:216","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23764,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1633:28:216","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1662:10:216","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1633:39:216","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23766,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1633:41:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":23763,"id":23767,"nodeType":"Return","src":"1626:48:216"}]},"documentation":{"id":23756,"nodeType":"StructuredDocumentation","src":"1457:44:216","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23769,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1515:10:216","nodeType":"FunctionDefinition","overrides":{"id":23760,"nodeType":"OverrideSpecifier","overrides":[{"id":23758,"name":"Context","nameLocations":["1559:7:216"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1559:7:216"},{"id":23759,"name":"ForwarderRegistryContextBase","nameLocations":["1568:28:216"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1568:28:216"}],"src":"1550:47:216"},"parameters":{"id":23757,"nodeType":"ParameterList","parameters":[],"src":"1525:2:216"},"returnParameters":{"id":23763,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23762,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23769,"src":"1607:7:216","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23761,"name":"address","nodeType":"ElementaryTypeName","src":"1607:7:216","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1606:9:216"},"scope":23784,"src":"1506:175:216","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":23782,"nodeType":"Block","src":"1851:63:216","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23778,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1868:28:216","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23779,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1897:8:216","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1868:37:216","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":23780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1868:39:216","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":23777,"id":23781,"nodeType":"Return","src":"1861:46:216"}]},"documentation":{"id":23770,"nodeType":"StructuredDocumentation","src":"1687:44:216","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23783,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1745:8:216","nodeType":"FunctionDefinition","overrides":{"id":23774,"nodeType":"OverrideSpecifier","overrides":[{"id":23772,"name":"Context","nameLocations":["1787:7:216"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1787:7:216"},{"id":23773,"name":"ForwarderRegistryContextBase","nameLocations":["1796:28:216"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1796:28:216"}],"src":"1778:47:216"},"parameters":{"id":23771,"nodeType":"ParameterList","parameters":[],"src":"1753:2:216"},"returnParameters":{"id":23777,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23776,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23783,"src":"1835:14:216","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23775,"name":"bytes","nodeType":"ElementaryTypeName","src":"1835:5:216","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1834:16:216"},"scope":23784,"src":"1736:178:216","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":23785,"src":"847:1069:216","usedErrors":[7886,8223,11559,19183,23548,23557,23576],"usedEvents":[23591]}],"src":"32:1885:216"},"id":216},"contracts/token/ERC1155/facets/ERC1155Facet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155Facet.sol","exportedSymbols":{"Context":[1206],"ERC1155Base":[22929],"ERC1155Facet":[23865],"ERC1155Storage":[25484],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":23866,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23786,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:217"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":23788,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":13387,"src":"57:87:217","symbolAliases":[{"foreign":{"id":23787,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23790,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":25485,"src":"145:65:217","symbolAliases":[{"foreign":{"id":23789,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"153:14:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":23792,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":19478,"src":"211:83:217","symbolAliases":[{"foreign":{"id":23791,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155Base.sol","file":"./../base/ERC1155Base.sol","id":23794,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":22930,"src":"295:54:217","symbolAliases":[{"foreign":{"id":23793,"name":"ERC1155Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22929,"src":"303:11:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23796,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":1207,"src":"350:66:217","symbolAliases":[{"foreign":{"id":23795,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"358:7:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":23798,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23866,"sourceUnit":13298,"src":"417:101:217","symbolAliases":[{"foreign":{"id":23797,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"425:28:217","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":23800,"name":"ERC1155Base","nameLocations":["817:11:217"],"nodeType":"IdentifierPath","referencedDeclaration":22929,"src":"817:11:217"},"id":23801,"nodeType":"InheritanceSpecifier","src":"817:11:217"},{"baseName":{"id":23802,"name":"ForwarderRegistryContextBase","nameLocations":["830:28:217"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"830:28:217"},"id":23803,"nodeType":"InheritanceSpecifier","src":"830:28:217"}],"canonicalName":"ERC1155Facet","contractDependencies":[],"contractKind":"contract","documentation":{"id":23799,"nodeType":"StructuredDocumentation","src":"520:272:217","text":"@title ERC1155 Multi Token Standard (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":23865,"linearizedBaseContracts":[23865,13297,22929,1206,24178],"name":"ERC1155Facet","nameLocation":"801:12:217","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23807,"libraryName":{"id":23804,"name":"ProxyAdminStorage","nameLocations":["871:17:217"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"871:17:217"},"nodeType":"UsingForDirective","src":"865:53:217","typeName":{"id":23806,"nodeType":"UserDefinedTypeName","pathNode":{"id":23805,"name":"ProxyAdminStorage.Layout","nameLocations":["893:17:217","911:6:217"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"893:24:217"},"referencedDeclaration":19308,"src":"893:24:217","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":23816,"nodeType":"Block","src":"1022:2:217","statements":[]},"id":23817,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":23813,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23810,"src":"1003:17:217","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":23814,"kind":"baseConstructorSpecifier","modifierName":{"id":23812,"name":"ForwarderRegistryContextBase","nameLocations":["974:28:217"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"974:28:217"},"nodeType":"ModifierInvocation","src":"974:47:217"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":23811,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23810,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"955:17:217","nodeType":"VariableDeclaration","scope":23817,"src":"936:36:217","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":23809,"nodeType":"UserDefinedTypeName","pathNode":{"id":23808,"name":"IForwarderRegistry","nameLocations":["936:18:217"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"936:18:217"},"referencedDeclaration":13386,"src":"936:18:217","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"935:38:217"},"returnParameters":{"id":23815,"nodeType":"ParameterList","parameters":[],"src":"1022:0:217"},"scope":23865,"src":"924:100:217","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":23835,"nodeType":"Block","src":"1226:108:217","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23826,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[23850],"referencedDeclaration":23850,"src":"1283:10:217","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23827,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1283:12:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23821,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1236:17:217","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":23823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1254:6:217","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1236:24:217","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":23824,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1236:26:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":23825,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1263:19:217","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1236:46:217","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":23828,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1236:60:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23829,"nodeType":"ExpressionStatement","src":"1236:60:217"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23830,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1306:14:217","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23832,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1321:4:217","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"1306:19:217","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":23833,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1306:21:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23834,"nodeType":"ExpressionStatement","src":"1306:21:217"}]},"documentation":{"id":23818,"nodeType":"StructuredDocumentation","src":"1030:152:217","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"c34106c8","id":23836,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155Storage","nameLocation":"1196:18:217","nodeType":"FunctionDefinition","parameters":{"id":23819,"nodeType":"ParameterList","parameters":[],"src":"1214:2:217"},"returnParameters":{"id":23820,"nodeType":"ParameterList","parameters":[],"src":"1226:0:217"},"scope":23865,"src":"1187:147:217","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":23849,"nodeType":"Block","src":"1499:65:217","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23845,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1516:28:217","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1545:10:217","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1516:39:217","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23847,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1516:41:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":23844,"id":23848,"nodeType":"Return","src":"1509:48:217"}]},"documentation":{"id":23837,"nodeType":"StructuredDocumentation","src":"1340:44:217","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23850,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1398:10:217","nodeType":"FunctionDefinition","overrides":{"id":23841,"nodeType":"OverrideSpecifier","overrides":[{"id":23839,"name":"Context","nameLocations":["1442:7:217"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1442:7:217"},{"id":23840,"name":"ForwarderRegistryContextBase","nameLocations":["1451:28:217"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1451:28:217"}],"src":"1433:47:217"},"parameters":{"id":23838,"nodeType":"ParameterList","parameters":[],"src":"1408:2:217"},"returnParameters":{"id":23844,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23843,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23850,"src":"1490:7:217","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23842,"name":"address","nodeType":"ElementaryTypeName","src":"1490:7:217","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1489:9:217"},"scope":23865,"src":"1389:175:217","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":23863,"nodeType":"Block","src":"1734:63:217","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23859,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1751:28:217","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":23860,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1780:8:217","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1751:37:217","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":23861,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1751:39:217","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":23858,"id":23862,"nodeType":"Return","src":"1744:46:217"}]},"documentation":{"id":23851,"nodeType":"StructuredDocumentation","src":"1570:44:217","text":"@inheritdoc ForwarderRegistryContextBase"},"id":23864,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1628:8:217","nodeType":"FunctionDefinition","overrides":{"id":23855,"nodeType":"OverrideSpecifier","overrides":[{"id":23853,"name":"Context","nameLocations":["1670:7:217"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1670:7:217"},{"id":23854,"name":"ForwarderRegistryContextBase","nameLocations":["1679:28:217"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1679:28:217"}],"src":"1661:47:217"},"parameters":{"id":23852,"nodeType":"ParameterList","parameters":[],"src":"1636:2:217"},"returnParameters":{"id":23858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23857,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":23864,"src":"1718:14:217","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":23856,"name":"bytes","nodeType":"ElementaryTypeName","src":"1718:5:217","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1717:16:217"},"scope":23865,"src":"1619:178:217","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":23866,"src":"792:1007:217","usedErrors":[7886,11559,19183,23516,23519,23526,23537,23548,23557,23568,23571],"usedEvents":[23591,23606,23615]}],"src":"32:1768:217"},"id":217},"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol","exportedSymbols":{"ERC1155MetadataBase":[23201],"ERC1155MetadataFacet":[23941],"ERC1155Storage":[25484],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ITokenMetadataResolver":[36704],"ProxyAdminStorage":[19477],"TokenMetadataStorage":[36891]},"id":23942,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23867,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:218"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":23869,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":13387,"src":"57:87:218","symbolAliases":[{"foreign":{"id":23868,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":23871,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":36705,"src":"145:94:218","symbolAliases":[{"foreign":{"id":23870,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":23873,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":19478,"src":"240:83:218","symbolAliases":[{"foreign":{"id":23872,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"248:17:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../metadata/libraries/TokenMetadataStorage.sol","id":23875,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":36892,"src":"324:89:218","symbolAliases":[{"foreign":{"id":23874,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"332:20:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23877,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":25485,"src":"414:65:218","symbolAliases":[{"foreign":{"id":23876,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"422:14:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MetadataBase.sol","file":"./../base/ERC1155MetadataBase.sol","id":23879,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":23202,"src":"480:70:218","symbolAliases":[{"foreign":{"id":23878,"name":"ERC1155MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23201,"src":"488:19:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":23881,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":23942,"sourceUnit":13298,"src":"551:101:218","symbolAliases":[{"foreign":{"id":23880,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"559:28:218","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":23883,"name":"ERC1155MetadataBase","nameLocations":["1082:19:218"],"nodeType":"IdentifierPath","referencedDeclaration":23201,"src":"1082:19:218"},"id":23884,"nodeType":"InheritanceSpecifier","src":"1082:19:218"},{"baseName":{"id":23885,"name":"ForwarderRegistryContextBase","nameLocations":["1103:28:218"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1103:28:218"},"id":23886,"nodeType":"InheritanceSpecifier","src":"1103:28:218"}],"canonicalName":"ERC1155MetadataFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":23882,"nodeType":"StructuredDocumentation","src":"654:395:218","text":"@title ERC1155 Multi Token Standard, optional extension: Metadata (facet version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":23941,"linearizedBaseContracts":[23941,13297,23201,24244,24256,36683],"name":"ERC1155MetadataFacet","nameLocation":"1058:20:218","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23890,"libraryName":{"id":23887,"name":"ProxyAdminStorage","nameLocations":["1144:17:218"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1144:17:218"},"nodeType":"UsingForDirective","src":"1138:53:218","typeName":{"id":23889,"nodeType":"UserDefinedTypeName","pathNode":{"id":23888,"name":"ProxyAdminStorage.Layout","nameLocations":["1166:17:218","1184:6:218"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1166:24:218"},"referencedDeclaration":19308,"src":"1166:24:218","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":23894,"libraryName":{"id":23891,"name":"TokenMetadataStorage","nameLocations":["1202:20:218"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"1202:20:218"},"nodeType":"UsingForDirective","src":"1196:59:218","typeName":{"id":23893,"nodeType":"UserDefinedTypeName","pathNode":{"id":23892,"name":"TokenMetadataStorage.Layout","nameLocations":["1227:20:218","1248:6:218"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"1227:27:218"},"referencedDeclaration":36718,"src":"1227:27:218","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"body":{"id":23903,"nodeType":"Block","src":"1359:2:218","statements":[]},"id":23904,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":23900,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23897,"src":"1340:17:218","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":23901,"kind":"baseConstructorSpecifier","modifierName":{"id":23899,"name":"ForwarderRegistryContextBase","nameLocations":["1311:28:218"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1311:28:218"},"nodeType":"ModifierInvocation","src":"1311:47:218"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":23898,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23897,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1292:17:218","nodeType":"VariableDeclaration","scope":23904,"src":"1273:36:218","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":23896,"nodeType":"UserDefinedTypeName","pathNode":{"id":23895,"name":"IForwarderRegistry","nameLocations":["1273:18:218"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1273:18:218"},"referencedDeclaration":13386,"src":"1273:18:218","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1272:38:218"},"returnParameters":{"id":23902,"nodeType":"ParameterList","parameters":[],"src":"1359:0:218"},"scope":23941,"src":"1261:100:218","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":23939,"nodeType":"Block","src":"2084:207:218","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23920,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"2141:10:218","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23921,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2141:12:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23915,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"2094:17:218","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":23917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2112:6:218","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"2094:24:218","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":23918,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2094:26:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":23919,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2121:19:218","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"2094:46:218","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":23922,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2094:60:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23923,"nodeType":"ExpressionStatement","src":"2094:60:218"},{"expression":{"arguments":[{"id":23929,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23907,"src":"2204:4:218","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":23930,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23909,"src":"2210:6:218","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":23931,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23912,"src":"2218:16:218","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23924,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"2164:20:218","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":23926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2185:6:218","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"2164:27:218","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":23927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2164:29:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":23928,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2194:9:218","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"2164:39:218","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":23932,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2164:71:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23933,"nodeType":"ExpressionStatement","src":"2164:71:218"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23934,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2245:14:218","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23936,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2260:22:218","memberName":"initERC1155MetadataURI","nodeType":"MemberAccess","referencedDeclaration":24440,"src":"2245:37:218","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":23937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2245:39:218","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23938,"nodeType":"ExpressionStatement","src":"2245:39:218"}]},"documentation":{"id":23905,"nodeType":"StructuredDocumentation","src":"1367:580:218","text":"@notice Initializes the storage with the contract metadata.\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param name The name of the token.\n @param symbol The symbol of the token.\n @param metadataResolver The address of the metadata resolver contract."},"functionSelector":"345c14ad","id":23940,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155MetadataStorage","nameLocation":"1961:26:218","nodeType":"FunctionDefinition","parameters":{"id":23913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23907,"mutability":"mutable","name":"name","nameLocation":"2004:4:218","nodeType":"VariableDeclaration","scope":23940,"src":"1988:20:218","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":23906,"name":"string","nodeType":"ElementaryTypeName","src":"1988:6:218","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":23909,"mutability":"mutable","name":"symbol","nameLocation":"2026:6:218","nodeType":"VariableDeclaration","scope":23940,"src":"2010:22:218","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":23908,"name":"string","nodeType":"ElementaryTypeName","src":"2010:6:218","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":23912,"mutability":"mutable","name":"metadataResolver","nameLocation":"2057:16:218","nodeType":"VariableDeclaration","scope":23940,"src":"2034:39:218","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":23911,"nodeType":"UserDefinedTypeName","pathNode":{"id":23910,"name":"ITokenMetadataResolver","nameLocations":["2034:22:218"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2034:22:218"},"referencedDeclaration":36704,"src":"2034:22:218","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1987:87:218"},"returnParameters":{"id":23914,"nodeType":"ParameterList","parameters":[],"src":"2084:0:218"},"scope":23941,"src":"1952:339:218","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":23942,"src":"1049:1244:218","usedErrors":[7886,11559,19183,19192,36690],"usedEvents":[23622]}],"src":"32:2262:218"},"id":218},"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol","exportedSymbols":{"Context":[1206],"ERC1155MintableBase":[23308],"ERC1155MintableFacet":[24022],"ERC1155Storage":[25484],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":24023,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":23943,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:219"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":23945,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":13387,"src":"57:87:219","symbolAliases":[{"foreign":{"id":23944,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":23947,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":25485,"src":"145:65:219","symbolAliases":[{"foreign":{"id":23946,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"153:14:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":23949,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":19478,"src":"211:83:219","symbolAliases":[{"foreign":{"id":23948,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","file":"./../base/ERC1155MintableBase.sol","id":23951,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":23309,"src":"295:70:219","symbolAliases":[{"foreign":{"id":23950,"name":"ERC1155MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23308,"src":"303:19:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":23953,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":1207,"src":"366:66:219","symbolAliases":[{"foreign":{"id":23952,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"374:7:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":23955,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24023,"sourceUnit":13298,"src":"433:101:219","symbolAliases":[{"foreign":{"id":23954,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"441:28:219","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":23957,"name":"ERC1155MintableBase","nameLocations":["871:19:219"],"nodeType":"IdentifierPath","referencedDeclaration":23308,"src":"871:19:219"},"id":23958,"nodeType":"InheritanceSpecifier","src":"871:19:219"},{"baseName":{"id":23959,"name":"ForwarderRegistryContextBase","nameLocations":["892:28:219"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"892:28:219"},"id":23960,"nodeType":"InheritanceSpecifier","src":"892:28:219"}],"canonicalName":"ERC1155MintableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":23956,"nodeType":"StructuredDocumentation","src":"536:302:219","text":"@title ERC1155 Multi Token Standard, optional extension: Mintable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":24022,"linearizedBaseContracts":[24022,13297,23308,1206,24286],"name":"ERC1155MintableFacet","nameLocation":"847:20:219","nodeType":"ContractDefinition","nodes":[{"global":false,"id":23964,"libraryName":{"id":23961,"name":"ProxyAdminStorage","nameLocations":["933:17:219"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"933:17:219"},"nodeType":"UsingForDirective","src":"927:53:219","typeName":{"id":23963,"nodeType":"UserDefinedTypeName","pathNode":{"id":23962,"name":"ProxyAdminStorage.Layout","nameLocations":["955:17:219","973:6:219"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"955:24:219"},"referencedDeclaration":19308,"src":"955:24:219","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":23973,"nodeType":"Block","src":"1084:2:219","statements":[]},"id":23974,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":23970,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23967,"src":"1065:17:219","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":23971,"kind":"baseConstructorSpecifier","modifierName":{"id":23969,"name":"ForwarderRegistryContextBase","nameLocations":["1036:28:219"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1036:28:219"},"nodeType":"ModifierInvocation","src":"1036:47:219"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":23968,"nodeType":"ParameterList","parameters":[{"constant":false,"id":23967,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1017:17:219","nodeType":"VariableDeclaration","scope":23974,"src":"998:36:219","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":23966,"nodeType":"UserDefinedTypeName","pathNode":{"id":23965,"name":"IForwarderRegistry","nameLocations":["998:18:219"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"998:18:219"},"referencedDeclaration":13386,"src":"998:18:219","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"997:38:219"},"returnParameters":{"id":23972,"nodeType":"ParameterList","parameters":[],"src":"1084:0:219"},"scope":24022,"src":"986:100:219","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":23992,"nodeType":"Block","src":"1304:123:219","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":23983,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[24007],"referencedDeclaration":24007,"src":"1361:10:219","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":23984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1361:12:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23978,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1314:17:219","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":23980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1332:6:219","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1314:24:219","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":23981,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1314:26:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":23982,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1341:19:219","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1314:46:219","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":23985,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1314:60:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23986,"nodeType":"ExpressionStatement","src":"1314:60:219"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":23987,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1384:14:219","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":23989,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1399:19:219","memberName":"initERC1155Mintable","nodeType":"MemberAccess","referencedDeclaration":24457,"src":"1384:34:219","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":23990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1384:36:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":23991,"nodeType":"ExpressionStatement","src":"1384:36:219"}]},"documentation":{"id":23975,"nodeType":"StructuredDocumentation","src":"1092:160:219","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155Mintable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"89511ecd","id":23993,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155MintableStorage","nameLocation":"1266:26:219","nodeType":"FunctionDefinition","parameters":{"id":23976,"nodeType":"ParameterList","parameters":[],"src":"1292:2:219"},"returnParameters":{"id":23977,"nodeType":"ParameterList","parameters":[],"src":"1304:0:219"},"scope":24022,"src":"1257:170:219","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":24006,"nodeType":"Block","src":"1592:65:219","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24002,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1609:28:219","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":24003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1638:10:219","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1609:39:219","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":24004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1609:41:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":24001,"id":24005,"nodeType":"Return","src":"1602:48:219"}]},"documentation":{"id":23994,"nodeType":"StructuredDocumentation","src":"1433:44:219","text":"@inheritdoc ForwarderRegistryContextBase"},"id":24007,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1491:10:219","nodeType":"FunctionDefinition","overrides":{"id":23998,"nodeType":"OverrideSpecifier","overrides":[{"id":23996,"name":"Context","nameLocations":["1535:7:219"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1535:7:219"},{"id":23997,"name":"ForwarderRegistryContextBase","nameLocations":["1544:28:219"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1544:28:219"}],"src":"1526:47:219"},"parameters":{"id":23995,"nodeType":"ParameterList","parameters":[],"src":"1501:2:219"},"returnParameters":{"id":24001,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24000,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":24007,"src":"1583:7:219","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23999,"name":"address","nodeType":"ElementaryTypeName","src":"1583:7:219","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1582:9:219"},"scope":24022,"src":"1482:175:219","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":24020,"nodeType":"Block","src":"1827:63:219","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24016,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1844:28:219","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":24017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1873:8:219","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1844:37:219","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":24018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1844:39:219","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":24015,"id":24019,"nodeType":"Return","src":"1837:46:219"}]},"documentation":{"id":24008,"nodeType":"StructuredDocumentation","src":"1663:44:219","text":"@inheritdoc ForwarderRegistryContextBase"},"id":24021,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1721:8:219","nodeType":"FunctionDefinition","overrides":{"id":24012,"nodeType":"OverrideSpecifier","overrides":[{"id":24010,"name":"Context","nameLocations":["1763:7:219"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1763:7:219"},{"id":24011,"name":"ForwarderRegistryContextBase","nameLocations":["1772:28:219"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1772:28:219"}],"src":"1754:47:219"},"parameters":{"id":24009,"nodeType":"ParameterList","parameters":[],"src":"1729:2:219"},"returnParameters":{"id":24015,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24014,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":24021,"src":"1811:14:219","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24013,"name":"bytes","nodeType":"ElementaryTypeName","src":"1811:5:219","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1810:16:219"},"scope":24022,"src":"1712:178:219","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":24023,"src":"838:1054:219","usedErrors":[7886,8223,11559,19183,23548,23557,23568,23576],"usedEvents":[23591,23606]}],"src":"32:1861:219"},"id":219},"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol","exportedSymbols":{"Context":[1206],"ERC1155Storage":[25484],"ERC1155WithOperatorFiltererBase":[23509],"ERC1155WithOperatorFiltererFacet":[24103],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":24104,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24024,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:220"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":24026,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":13387,"src":"57:87:220","symbolAliases":[{"foreign":{"id":24025,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../libraries/ERC1155Storage.sol","id":24028,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":25485,"src":"145:65:220","symbolAliases":[{"foreign":{"id":24027,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"153:14:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":24030,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":19478,"src":"211:83:220","symbolAliases":[{"foreign":{"id":24029,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol","file":"./../base/ERC1155WithOperatorFiltererBase.sol","id":24032,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":23510,"src":"295:94:220","symbolAliases":[{"foreign":{"id":24031,"name":"ERC1155WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23509,"src":"303:31:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":24034,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":1207,"src":"390:66:220","symbolAliases":[{"foreign":{"id":24033,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"398:7:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":24036,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":24104,"sourceUnit":13298,"src":"457:101:220","symbolAliases":[{"foreign":{"id":24035,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"465:28:220","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":24038,"name":"ERC1155WithOperatorFiltererBase","nameLocations":["924:31:220"],"nodeType":"IdentifierPath","referencedDeclaration":23509,"src":"924:31:220"},"id":24039,"nodeType":"InheritanceSpecifier","src":"924:31:220"},{"baseName":{"id":24040,"name":"ForwarderRegistryContextBase","nameLocations":["957:28:220"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"957:28:220"},"id":24041,"nodeType":"InheritanceSpecifier","src":"957:28:220"}],"canonicalName":"ERC1155WithOperatorFiltererFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":24037,"nodeType":"StructuredDocumentation","src":"560:319:220","text":"@title ERC1155 Multi Token Standard with Operator Filterer (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}."},"fullyImplemented":true,"id":24103,"linearizedBaseContracts":[24103,13297,23509,1206,24178],"name":"ERC1155WithOperatorFiltererFacet","nameLocation":"888:32:220","nodeType":"ContractDefinition","nodes":[{"global":false,"id":24045,"libraryName":{"id":24042,"name":"ProxyAdminStorage","nameLocations":["998:17:220"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"998:17:220"},"nodeType":"UsingForDirective","src":"992:53:220","typeName":{"id":24044,"nodeType":"UserDefinedTypeName","pathNode":{"id":24043,"name":"ProxyAdminStorage.Layout","nameLocations":["1020:17:220","1038:6:220"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1020:24:220"},"referencedDeclaration":19308,"src":"1020:24:220","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":24054,"nodeType":"Block","src":"1149:2:220","statements":[]},"id":24055,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":24051,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24048,"src":"1130:17:220","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":24052,"kind":"baseConstructorSpecifier","modifierName":{"id":24050,"name":"ForwarderRegistryContextBase","nameLocations":["1101:28:220"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1101:28:220"},"nodeType":"ModifierInvocation","src":"1101:47:220"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":24049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24048,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1082:17:220","nodeType":"VariableDeclaration","scope":24055,"src":"1063:36:220","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":24047,"nodeType":"UserDefinedTypeName","pathNode":{"id":24046,"name":"IForwarderRegistry","nameLocations":["1063:18:220"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1063:18:220"},"referencedDeclaration":13386,"src":"1063:18:220","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1062:38:220"},"returnParameters":{"id":24053,"nodeType":"ParameterList","parameters":[],"src":"1149:0:220"},"scope":24103,"src":"1051:100:220","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":24073,"nodeType":"Block","src":"1353:108:220","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":24064,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[24088],"referencedDeclaration":24088,"src":"1410:10:220","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":24065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1410:12:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24059,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1363:17:220","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":24061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1381:6:220","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1363:24:220","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":24062,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1363:26:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":24063,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1390:19:220","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1363:46:220","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":24066,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1363:60:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24067,"nodeType":"ExpressionStatement","src":"1363:60:220"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24068,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"1433:14:220","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":24070,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1448:4:220","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"1433:19:220","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":24071,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1433:21:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24072,"nodeType":"ExpressionStatement","src":"1433:21:220"}]},"documentation":{"id":24056,"nodeType":"StructuredDocumentation","src":"1157:152:220","text":"@notice Marks the following ERC165 interfaces as supported: ERC1155.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"c34106c8","id":24074,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155Storage","nameLocation":"1323:18:220","nodeType":"FunctionDefinition","parameters":{"id":24057,"nodeType":"ParameterList","parameters":[],"src":"1341:2:220"},"returnParameters":{"id":24058,"nodeType":"ParameterList","parameters":[],"src":"1353:0:220"},"scope":24103,"src":"1314:147:220","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":24087,"nodeType":"Block","src":"1626:65:220","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24083,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1643:28:220","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":24084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1672:10:220","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1643:39:220","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":24085,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1643:41:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":24082,"id":24086,"nodeType":"Return","src":"1636:48:220"}]},"documentation":{"id":24075,"nodeType":"StructuredDocumentation","src":"1467:44:220","text":"@inheritdoc ForwarderRegistryContextBase"},"id":24088,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1525:10:220","nodeType":"FunctionDefinition","overrides":{"id":24079,"nodeType":"OverrideSpecifier","overrides":[{"id":24077,"name":"Context","nameLocations":["1569:7:220"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1569:7:220"},{"id":24078,"name":"ForwarderRegistryContextBase","nameLocations":["1578:28:220"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1578:28:220"}],"src":"1560:47:220"},"parameters":{"id":24076,"nodeType":"ParameterList","parameters":[],"src":"1535:2:220"},"returnParameters":{"id":24082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24081,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":24088,"src":"1617:7:220","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24080,"name":"address","nodeType":"ElementaryTypeName","src":"1617:7:220","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1616:9:220"},"scope":24103,"src":"1516:175:220","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":24101,"nodeType":"Block","src":"1861:63:220","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24097,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1878:28:220","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":24098,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1907:8:220","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1878:37:220","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":24099,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1878:39:220","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":24096,"id":24100,"nodeType":"Return","src":"1871:46:220"}]},"documentation":{"id":24089,"nodeType":"StructuredDocumentation","src":"1697:44:220","text":"@inheritdoc ForwarderRegistryContextBase"},"id":24102,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1755:8:220","nodeType":"FunctionDefinition","overrides":{"id":24093,"nodeType":"OverrideSpecifier","overrides":[{"id":24091,"name":"Context","nameLocations":["1797:7:220"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1797:7:220"},{"id":24092,"name":"ForwarderRegistryContextBase","nameLocations":["1806:28:220"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1806:28:220"}],"src":"1788:47:220"},"parameters":{"id":24090,"nodeType":"ParameterList","parameters":[],"src":"1763:2:220"},"returnParameters":{"id":24096,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24095,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":24102,"src":"1845:14:220","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24094,"name":"bytes","nodeType":"ElementaryTypeName","src":"1845:5:220","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1844:16:220"},"scope":24103,"src":"1746:178:220","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":24104,"src":"879:1047:220","usedErrors":[7886,11559,19183,23516,23519,23526,23537,23548,23557,23568,23571,37090],"usedEvents":[23591,23606,23615]}],"src":"32:1895:220"},"id":220},"contracts/token/ERC1155/interfaces/IERC1155.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","exportedSymbols":{"IERC1155":[24178]},"id":24179,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24105,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:221"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155","contractDependencies":[],"contractKind":"interface","documentation":{"id":24106,"nodeType":"StructuredDocumentation","src":"58:195:221","text":"@title ERC1155 Multi Token Standard, basic interface (functions).\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26."},"fullyImplemented":false,"id":24178,"linearizedBaseContracts":[24178],"name":"IERC1155","nameLocation":"263:8:221","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24107,"nodeType":"StructuredDocumentation","src":"278:689:221","text":"@notice Safely transfers some token.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if the sender is not `from` and has not been approved by `from`.\n @dev Reverts if `from` has an insufficient balance of `id`.\n @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits a {TransferSingle} event.\n @param from Current token owner.\n @param to Address of the new token owner.\n @param id Identifier of the token to transfer.\n @param value Amount of token to transfer.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"f242432a","id":24120,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"981:16:221","nodeType":"FunctionDefinition","parameters":{"id":24118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24109,"mutability":"mutable","name":"from","nameLocation":"1006:4:221","nodeType":"VariableDeclaration","scope":24120,"src":"998:12:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24108,"name":"address","nodeType":"ElementaryTypeName","src":"998:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24111,"mutability":"mutable","name":"to","nameLocation":"1020:2:221","nodeType":"VariableDeclaration","scope":24120,"src":"1012:10:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24110,"name":"address","nodeType":"ElementaryTypeName","src":"1012:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24113,"mutability":"mutable","name":"id","nameLocation":"1032:2:221","nodeType":"VariableDeclaration","scope":24120,"src":"1024:10:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24112,"name":"uint256","nodeType":"ElementaryTypeName","src":"1024:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24115,"mutability":"mutable","name":"value","nameLocation":"1044:5:221","nodeType":"VariableDeclaration","scope":24120,"src":"1036:13:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24114,"name":"uint256","nodeType":"ElementaryTypeName","src":"1036:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24117,"mutability":"mutable","name":"data","nameLocation":"1066:4:221","nodeType":"VariableDeclaration","scope":24120,"src":"1051:19:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24116,"name":"bytes","nodeType":"ElementaryTypeName","src":"1051:5:221","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"997:74:221"},"returnParameters":{"id":24119,"nodeType":"ParameterList","parameters":[],"src":"1080:0:221"},"scope":24178,"src":"972:109:221","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24121,"nodeType":"StructuredDocumentation","src":"1087:784:221","text":"@notice Safely transfers a batch of tokens.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `ids` and `values` have different lengths.\n @dev Reverts if the sender is not `from` and has not been approved by `from`.\n @dev Reverts if `from` has an insufficient balance for any of `ids`.\n @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\n @dev Emits a {TransferBatch} event.\n @param from Current tokens owner.\n @param to Address of the new tokens owner.\n @param ids Identifiers of the tokens to transfer.\n @param values Amounts of tokens to transfer.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"2eb2c2d6","id":24136,"implemented":false,"kind":"function","modifiers":[],"name":"safeBatchTransferFrom","nameLocation":"1885:21:221","nodeType":"FunctionDefinition","parameters":{"id":24134,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24123,"mutability":"mutable","name":"from","nameLocation":"1915:4:221","nodeType":"VariableDeclaration","scope":24136,"src":"1907:12:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24122,"name":"address","nodeType":"ElementaryTypeName","src":"1907:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24125,"mutability":"mutable","name":"to","nameLocation":"1929:2:221","nodeType":"VariableDeclaration","scope":24136,"src":"1921:10:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24124,"name":"address","nodeType":"ElementaryTypeName","src":"1921:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24128,"mutability":"mutable","name":"ids","nameLocation":"1952:3:221","nodeType":"VariableDeclaration","scope":24136,"src":"1933:22:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24126,"name":"uint256","nodeType":"ElementaryTypeName","src":"1933:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24127,"nodeType":"ArrayTypeName","src":"1933:9:221","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24131,"mutability":"mutable","name":"values","nameLocation":"1976:6:221","nodeType":"VariableDeclaration","scope":24136,"src":"1957:25:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24129,"name":"uint256","nodeType":"ElementaryTypeName","src":"1957:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24130,"nodeType":"ArrayTypeName","src":"1957:9:221","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24133,"mutability":"mutable","name":"data","nameLocation":"1999:4:221","nodeType":"VariableDeclaration","scope":24136,"src":"1984:19:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24132,"name":"bytes","nodeType":"ElementaryTypeName","src":"1984:5:221","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1906:98:221"},"returnParameters":{"id":24135,"nodeType":"ParameterList","parameters":[],"src":"2013:0:221"},"scope":24178,"src":"1876:138:221","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24137,"nodeType":"StructuredDocumentation","src":"2020:234:221","text":"@notice Enables or disables an operator's approval.\n @dev Emits an {ApprovalForAll} event.\n @param operator Address of the operator.\n @param approved True to approve the operator, false to revoke its approval."},"functionSelector":"a22cb465","id":24144,"implemented":false,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"2268:17:221","nodeType":"FunctionDefinition","parameters":{"id":24142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24139,"mutability":"mutable","name":"operator","nameLocation":"2294:8:221","nodeType":"VariableDeclaration","scope":24144,"src":"2286:16:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24138,"name":"address","nodeType":"ElementaryTypeName","src":"2286:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24141,"mutability":"mutable","name":"approved","nameLocation":"2309:8:221","nodeType":"VariableDeclaration","scope":24144,"src":"2304:13:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":24140,"name":"bool","nodeType":"ElementaryTypeName","src":"2304:4:221","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2285:33:221"},"returnParameters":{"id":24143,"nodeType":"ParameterList","parameters":[],"src":"2327:0:221"},"scope":24178,"src":"2259:69:221","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24145,"nodeType":"StructuredDocumentation","src":"2334:254:221","text":"@notice Retrieves the approval status of an operator for a given owner.\n @param owner Address of the authorisation giver.\n @param operator Address of the operator.\n @return approved True if the operator is approved, false if not."},"functionSelector":"e985e9c5","id":24154,"implemented":false,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"2602:16:221","nodeType":"FunctionDefinition","parameters":{"id":24150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24147,"mutability":"mutable","name":"owner","nameLocation":"2627:5:221","nodeType":"VariableDeclaration","scope":24154,"src":"2619:13:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24146,"name":"address","nodeType":"ElementaryTypeName","src":"2619:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24149,"mutability":"mutable","name":"operator","nameLocation":"2642:8:221","nodeType":"VariableDeclaration","scope":24154,"src":"2634:16:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24148,"name":"address","nodeType":"ElementaryTypeName","src":"2634:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2618:33:221"},"returnParameters":{"id":24153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24152,"mutability":"mutable","name":"approved","nameLocation":"2680:8:221","nodeType":"VariableDeclaration","scope":24154,"src":"2675:13:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":24151,"name":"bool","nodeType":"ElementaryTypeName","src":"2675:4:221","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2674:15:221"},"scope":24178,"src":"2593:97:221","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":24155,"nodeType":"StructuredDocumentation","src":"2696:259:221","text":"@notice Retrieves the balance of `id` owned by account `owner`.\n @param owner The account to retrieve the balance of.\n @param id The identifier to retrieve the balance of.\n @return balance The balance of `id` owned by account `owner`."},"functionSelector":"00fdd58e","id":24164,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2969:9:221","nodeType":"FunctionDefinition","parameters":{"id":24160,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24157,"mutability":"mutable","name":"owner","nameLocation":"2987:5:221","nodeType":"VariableDeclaration","scope":24164,"src":"2979:13:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24156,"name":"address","nodeType":"ElementaryTypeName","src":"2979:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24159,"mutability":"mutable","name":"id","nameLocation":"3002:2:221","nodeType":"VariableDeclaration","scope":24164,"src":"2994:10:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24158,"name":"uint256","nodeType":"ElementaryTypeName","src":"2994:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2978:27:221"},"returnParameters":{"id":24163,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24162,"mutability":"mutable","name":"balance","nameLocation":"3037:7:221","nodeType":"VariableDeclaration","scope":24164,"src":"3029:15:221","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24161,"name":"uint256","nodeType":"ElementaryTypeName","src":"3029:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3028:17:221"},"scope":24178,"src":"2960:86:221","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":24165,"nodeType":"StructuredDocumentation","src":"3052:333:221","text":"@notice Retrieves the balances of `ids` owned by accounts `owners`.\n @dev Reverts if `owners` and `ids` have different lengths.\n @param owners The addresses of the token holders\n @param ids The identifiers to retrieve the balance of.\n @return balances The balances of `ids` owned by accounts `owners`."},"functionSelector":"4e1273f4","id":24177,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOfBatch","nameLocation":"3399:14:221","nodeType":"FunctionDefinition","parameters":{"id":24172,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24168,"mutability":"mutable","name":"owners","nameLocation":"3433:6:221","nodeType":"VariableDeclaration","scope":24177,"src":"3414:25:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":24166,"name":"address","nodeType":"ElementaryTypeName","src":"3414:7:221","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24167,"nodeType":"ArrayTypeName","src":"3414:9:221","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":24171,"mutability":"mutable","name":"ids","nameLocation":"3460:3:221","nodeType":"VariableDeclaration","scope":24177,"src":"3441:22:221","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24169,"name":"uint256","nodeType":"ElementaryTypeName","src":"3441:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24170,"nodeType":"ArrayTypeName","src":"3441:9:221","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3413:51:221"},"returnParameters":{"id":24176,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24175,"mutability":"mutable","name":"balances","nameLocation":"3505:8:221","nodeType":"VariableDeclaration","scope":24177,"src":"3488:25:221","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24173,"name":"uint256","nodeType":"ElementaryTypeName","src":"3488:7:221","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24174,"nodeType":"ArrayTypeName","src":"3488:9:221","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"3487:27:221"},"scope":24178,"src":"3390:125:221","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":24179,"src":"253:3264:221","usedErrors":[],"usedEvents":[]}],"src":"32:3486:221"},"id":221},"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol","exportedSymbols":{"IERC1155Burnable":[24204]},"id":24205,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24180,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"33:24:222"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155Burnable","contractDependencies":[],"contractKind":"interface","documentation":{"id":24181,"nodeType":"StructuredDocumentation","src":"59:196:222","text":"@title ERC1155 Multi Token Standard, optional extension: Burnable.\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1."},"fullyImplemented":false,"id":24204,"linearizedBaseContracts":[24204],"name":"IERC1155Burnable","nameLocation":"265:16:222","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24182,"nodeType":"StructuredDocumentation","src":"288:391:222","text":"@notice Burns some token.\n @dev Reverts if the sender is not `from` and has not been approved by `from`.\n @dev Reverts if `from` has an insufficient balance of `id`.\n @dev Emits an {IERC1155-TransferSingle} event.\n @param from Address of the current token owner.\n @param id Identifier of the token to burn.\n @param value Amount of token to burn."},"functionSelector":"124d91e5","id":24191,"implemented":false,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"693:8:222","nodeType":"FunctionDefinition","parameters":{"id":24189,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24184,"mutability":"mutable","name":"from","nameLocation":"710:4:222","nodeType":"VariableDeclaration","scope":24191,"src":"702:12:222","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24183,"name":"address","nodeType":"ElementaryTypeName","src":"702:7:222","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24186,"mutability":"mutable","name":"id","nameLocation":"724:2:222","nodeType":"VariableDeclaration","scope":24191,"src":"716:10:222","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24185,"name":"uint256","nodeType":"ElementaryTypeName","src":"716:7:222","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24188,"mutability":"mutable","name":"value","nameLocation":"736:5:222","nodeType":"VariableDeclaration","scope":24191,"src":"728:13:222","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24187,"name":"uint256","nodeType":"ElementaryTypeName","src":"728:7:222","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"701:41:222"},"returnParameters":{"id":24190,"nodeType":"ParameterList","parameters":[],"src":"751:0:222"},"scope":24204,"src":"684:68:222","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24192,"nodeType":"StructuredDocumentation","src":"758:478:222","text":"@notice Burns multiple tokens.\n @dev Reverts if `ids` and `values` have different lengths.\n @dev Reverts if the sender is not `from` and has not been approved by `from`.\n @dev Reverts if `from` has an insufficient balance for any of `ids`.\n @dev Emits an {IERC1155-TransferBatch} event.\n @param from Address of the current tokens owner.\n @param ids Identifiers of the tokens to burn.\n @param values Amounts of tokens to burn."},"functionSelector":"80534934","id":24203,"implemented":false,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"1250:13:222","nodeType":"FunctionDefinition","parameters":{"id":24201,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24194,"mutability":"mutable","name":"from","nameLocation":"1272:4:222","nodeType":"VariableDeclaration","scope":24203,"src":"1264:12:222","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24193,"name":"address","nodeType":"ElementaryTypeName","src":"1264:7:222","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24197,"mutability":"mutable","name":"ids","nameLocation":"1297:3:222","nodeType":"VariableDeclaration","scope":24203,"src":"1278:22:222","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24195,"name":"uint256","nodeType":"ElementaryTypeName","src":"1278:7:222","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24196,"nodeType":"ArrayTypeName","src":"1278:9:222","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24200,"mutability":"mutable","name":"values","nameLocation":"1321:6:222","nodeType":"VariableDeclaration","scope":24203,"src":"1302:25:222","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24198,"name":"uint256","nodeType":"ElementaryTypeName","src":"1302:7:222","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24199,"nodeType":"ArrayTypeName","src":"1302:9:222","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1263:65:222"},"returnParameters":{"id":24202,"nodeType":"ParameterList","parameters":[],"src":"1337:0:222"},"scope":24204,"src":"1241:97:222","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":24205,"src":"255:1085:222","usedErrors":[],"usedEvents":[]}],"src":"33:1308:222"},"id":222},"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol","exportedSymbols":{"IERC1155Deliverable":[24223]},"id":24224,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24206,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:223"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155Deliverable","contractDependencies":[],"contractKind":"interface","documentation":{"id":24207,"nodeType":"StructuredDocumentation","src":"58:199:223","text":"@title ERC1155 Multi Token Standard, optional extension: Deliverable.\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc."},"fullyImplemented":false,"id":24223,"linearizedBaseContracts":[24223],"name":"IERC1155Deliverable","nameLocation":"267:19:223","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24208,"nodeType":"StructuredDocumentation","src":"293:743:223","text":"@notice Safely mints tokens to multiple recipients.\n @dev Reverts if `recipients`, `ids` and `values` have different lengths.\n @dev Reverts if one of `recipients` is the zero address.\n @dev Reverts if one of `recipients` balance overflows.\n @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\n @param recipients Addresses of the new tokens owners.\n @param ids Identifiers of the tokens to mint.\n @param values Amounts of tokens to mint.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"e8ab9ccc","id":24222,"implemented":false,"kind":"function","modifiers":[],"name":"safeDeliver","nameLocation":"1050:11:223","nodeType":"FunctionDefinition","parameters":{"id":24220,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24211,"mutability":"mutable","name":"recipients","nameLocation":"1081:10:223","nodeType":"VariableDeclaration","scope":24222,"src":"1062:29:223","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":24209,"name":"address","nodeType":"ElementaryTypeName","src":"1062:7:223","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24210,"nodeType":"ArrayTypeName","src":"1062:9:223","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":24214,"mutability":"mutable","name":"ids","nameLocation":"1112:3:223","nodeType":"VariableDeclaration","scope":24222,"src":"1093:22:223","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24212,"name":"uint256","nodeType":"ElementaryTypeName","src":"1093:7:223","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24213,"nodeType":"ArrayTypeName","src":"1093:9:223","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24217,"mutability":"mutable","name":"values","nameLocation":"1136:6:223","nodeType":"VariableDeclaration","scope":24222,"src":"1117:25:223","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24215,"name":"uint256","nodeType":"ElementaryTypeName","src":"1117:7:223","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24216,"nodeType":"ArrayTypeName","src":"1117:9:223","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24219,"mutability":"mutable","name":"data","nameLocation":"1159:4:223","nodeType":"VariableDeclaration","scope":24222,"src":"1144:19:223","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24218,"name":"bytes","nodeType":"ElementaryTypeName","src":"1144:5:223","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1061:103:223"},"returnParameters":{"id":24221,"nodeType":"ParameterList","parameters":[],"src":"1173:0:223"},"scope":24223,"src":"1041:133:223","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":24224,"src":"257:919:223","usedErrors":[],"usedEvents":[]}],"src":"32:1145:223"},"id":223},"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol","exportedSymbols":{"IERC1155MetadataSetter":[24244]},"id":24245,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24225,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:224"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155MetadataSetter","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":24244,"linearizedBaseContracts":[24244],"name":"IERC1155MetadataSetter","nameLocation":"68:22:224","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24226,"nodeType":"StructuredDocumentation","src":"97:173:224","text":"@notice Sets the metadata URI for a token.\n @dev Emits a {URI} event.\n @param tokenId The token identifier.\n @param tokenURI The token metadata URI."},"functionSelector":"162094c4","id":24233,"implemented":false,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"284:11:224","nodeType":"FunctionDefinition","parameters":{"id":24231,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24228,"mutability":"mutable","name":"tokenId","nameLocation":"304:7:224","nodeType":"VariableDeclaration","scope":24233,"src":"296:15:224","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24227,"name":"uint256","nodeType":"ElementaryTypeName","src":"296:7:224","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24230,"mutability":"mutable","name":"tokenURI","nameLocation":"329:8:224","nodeType":"VariableDeclaration","scope":24233,"src":"313:24:224","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":24229,"name":"string","nodeType":"ElementaryTypeName","src":"313:6:224","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"295:43:224"},"returnParameters":{"id":24232,"nodeType":"ParameterList","parameters":[],"src":"347:0:224"},"scope":24244,"src":"275:73:224","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24234,"nodeType":"StructuredDocumentation","src":"354:299:224","text":"@notice Sets the metadata URIs for a batch of tokens.\n @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\n @dev Emits a {URI} event for each token.\n @param tokenIds The token identifiers.\n @param tokenURIs The token metadata URIs."},"functionSelector":"6706467b","id":24243,"implemented":false,"kind":"function","modifiers":[],"name":"batchSetTokenURI","nameLocation":"667:16:224","nodeType":"FunctionDefinition","parameters":{"id":24241,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24237,"mutability":"mutable","name":"tokenIds","nameLocation":"703:8:224","nodeType":"VariableDeclaration","scope":24243,"src":"684:27:224","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24235,"name":"uint256","nodeType":"ElementaryTypeName","src":"684:7:224","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24236,"nodeType":"ArrayTypeName","src":"684:9:224","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24240,"mutability":"mutable","name":"tokenURIs","nameLocation":"731:9:224","nodeType":"VariableDeclaration","scope":24243,"src":"713:27:224","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":24238,"name":"string","nodeType":"ElementaryTypeName","src":"713:6:224","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":24239,"nodeType":"ArrayTypeName","src":"713:8:224","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"683:58:224"},"returnParameters":{"id":24242,"nodeType":"ParameterList","parameters":[],"src":"750:0:224"},"scope":24244,"src":"658:93:224","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":24245,"src":"58:695:224","usedErrors":[],"usedEvents":[]}],"src":"32:722:224"},"id":224},"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol","exportedSymbols":{"IERC1155MetadataURI":[24256]},"id":24257,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24246,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:225"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155MetadataURI","contractDependencies":[],"contractKind":"interface","documentation":{"id":24247,"nodeType":"StructuredDocumentation","src":"58:200:225","text":"@title ERC1155 Multi Token Standard, optional extension: Metadata URI.\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0x0e89341c."},"fullyImplemented":false,"id":24256,"linearizedBaseContracts":[24256],"name":"IERC1155MetadataURI","nameLocation":"268:19:225","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24248,"nodeType":"StructuredDocumentation","src":"294:645:225","text":"@notice Retrieves the URI for a given token.\n @dev URIs are defined in RFC 3986.\n @dev The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".\n @dev The uri function SHOULD be used to retrieve values if no event was emitted.\n @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\n @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\n  an implementation to return a valid string even if the token does not exist.\n @return metadataURI The URI associated to the token."},"functionSelector":"0e89341c","id":24255,"implemented":false,"kind":"function","modifiers":[],"name":"uri","nameLocation":"953:3:225","nodeType":"FunctionDefinition","parameters":{"id":24251,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24250,"mutability":"mutable","name":"id","nameLocation":"965:2:225","nodeType":"VariableDeclaration","scope":24255,"src":"957:10:225","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24249,"name":"uint256","nodeType":"ElementaryTypeName","src":"957:7:225","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"956:12:225"},"returnParameters":{"id":24254,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24253,"mutability":"mutable","name":"metadataURI","nameLocation":"1006:11:225","nodeType":"VariableDeclaration","scope":24255,"src":"992:25:225","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":24252,"name":"string","nodeType":"ElementaryTypeName","src":"992:6:225","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"991:27:225"},"scope":24256,"src":"944:75:225","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":24257,"src":"258:763:225","usedErrors":[],"usedEvents":[]}],"src":"32:990:225"},"id":225},"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol","exportedSymbols":{"IERC1155Mintable":[24286]},"id":24287,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24258,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"33:24:226"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155Mintable","contractDependencies":[],"contractKind":"interface","documentation":{"id":24259,"nodeType":"StructuredDocumentation","src":"59:196:226","text":"@title ERC1155 Multi Token Standard, optional extension: Mintable.\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0x5190c92c."},"fullyImplemented":false,"id":24286,"linearizedBaseContracts":[24286],"name":"IERC1155Mintable","nameLocation":"265:16:226","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24260,"nodeType":"StructuredDocumentation","src":"288:550:226","text":"@notice Safely mints some token.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `to`'s balance of `id` overflows.\n @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits an {IERC1155-TransferSingle} event.\n @param to Address of the new token owner.\n @param id Identifier of the token to mint.\n @param value Amount of token to mint.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"5cfa9297","id":24271,"implemented":false,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"852:8:226","nodeType":"FunctionDefinition","parameters":{"id":24269,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24262,"mutability":"mutable","name":"to","nameLocation":"869:2:226","nodeType":"VariableDeclaration","scope":24271,"src":"861:10:226","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24261,"name":"address","nodeType":"ElementaryTypeName","src":"861:7:226","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24264,"mutability":"mutable","name":"id","nameLocation":"881:2:226","nodeType":"VariableDeclaration","scope":24271,"src":"873:10:226","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24263,"name":"uint256","nodeType":"ElementaryTypeName","src":"873:7:226","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24266,"mutability":"mutable","name":"value","nameLocation":"893:5:226","nodeType":"VariableDeclaration","scope":24271,"src":"885:13:226","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24265,"name":"uint256","nodeType":"ElementaryTypeName","src":"885:7:226","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24268,"mutability":"mutable","name":"data","nameLocation":"915:4:226","nodeType":"VariableDeclaration","scope":24271,"src":"900:19:226","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24267,"name":"bytes","nodeType":"ElementaryTypeName","src":"900:5:226","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"860:60:226"},"returnParameters":{"id":24270,"nodeType":"ParameterList","parameters":[],"src":"929:0:226"},"scope":24286,"src":"843:87:226","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24272,"nodeType":"StructuredDocumentation","src":"936:644:226","text":"@notice Safely mints a batch of tokens.\n @dev Reverts if `ids` and `values` have different lengths.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `to`'s balance overflows for one of `ids`.\n @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\n @dev Emits an {IERC1155-TransferBatch} event.\n @param to Address of the new tokens owner.\n @param ids Identifiers of the tokens to mint.\n @param values Amounts of tokens to mint.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"0d6a5bbb","id":24285,"implemented":false,"kind":"function","modifiers":[],"name":"safeBatchMint","nameLocation":"1594:13:226","nodeType":"FunctionDefinition","parameters":{"id":24283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24274,"mutability":"mutable","name":"to","nameLocation":"1616:2:226","nodeType":"VariableDeclaration","scope":24285,"src":"1608:10:226","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24273,"name":"address","nodeType":"ElementaryTypeName","src":"1608:7:226","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24277,"mutability":"mutable","name":"ids","nameLocation":"1639:3:226","nodeType":"VariableDeclaration","scope":24285,"src":"1620:22:226","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24275,"name":"uint256","nodeType":"ElementaryTypeName","src":"1620:7:226","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24276,"nodeType":"ArrayTypeName","src":"1620:9:226","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24280,"mutability":"mutable","name":"values","nameLocation":"1663:6:226","nodeType":"VariableDeclaration","scope":24285,"src":"1644:25:226","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24278,"name":"uint256","nodeType":"ElementaryTypeName","src":"1644:7:226","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24279,"nodeType":"ArrayTypeName","src":"1644:9:226","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24282,"mutability":"mutable","name":"data","nameLocation":"1686:4:226","nodeType":"VariableDeclaration","scope":24285,"src":"1671:19:226","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24281,"name":"bytes","nodeType":"ElementaryTypeName","src":"1671:5:226","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1607:84:226"},"returnParameters":{"id":24284,"nodeType":"ParameterList","parameters":[],"src":"1700:0:226"},"scope":24286,"src":"1585:116:226","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":24287,"src":"255:1448:226","usedErrors":[],"usedEvents":[]}],"src":"33:1671:226"},"id":226},"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol","exportedSymbols":{"IERC1155TokenReceiver":[24324]},"id":24325,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24288,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:227"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC1155TokenReceiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":24289,"nodeType":"StructuredDocumentation","src":"58:284:227","text":"@title ERC1155 Multi Token Standard, Tokens Receiver.\n @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\n @dev See https://eips.ethereum.org/EIPS/eip-1155\n @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0."},"fullyImplemented":false,"id":24324,"linearizedBaseContracts":[24324],"name":"IERC1155TokenReceiver","nameLocation":"352:21:227","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":24290,"nodeType":"StructuredDocumentation","src":"380:914:227","text":"@notice Handles the receipt of a single ERC1155 token type.\n @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\n @dev Return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (`0xf23a6e61`) to accept the transfer.\n @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it."},"functionSelector":"f23a6e61","id":24305,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155Received","nameLocation":"1308:17:227","nodeType":"FunctionDefinition","parameters":{"id":24301,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24292,"mutability":"mutable","name":"operator","nameLocation":"1334:8:227","nodeType":"VariableDeclaration","scope":24305,"src":"1326:16:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24291,"name":"address","nodeType":"ElementaryTypeName","src":"1326:7:227","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24294,"mutability":"mutable","name":"from","nameLocation":"1352:4:227","nodeType":"VariableDeclaration","scope":24305,"src":"1344:12:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24293,"name":"address","nodeType":"ElementaryTypeName","src":"1344:7:227","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24296,"mutability":"mutable","name":"id","nameLocation":"1366:2:227","nodeType":"VariableDeclaration","scope":24305,"src":"1358:10:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24295,"name":"uint256","nodeType":"ElementaryTypeName","src":"1358:7:227","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24298,"mutability":"mutable","name":"value","nameLocation":"1378:5:227","nodeType":"VariableDeclaration","scope":24305,"src":"1370:13:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24297,"name":"uint256","nodeType":"ElementaryTypeName","src":"1370:7:227","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24300,"mutability":"mutable","name":"data","nameLocation":"1400:4:227","nodeType":"VariableDeclaration","scope":24305,"src":"1385:19:227","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24299,"name":"bytes","nodeType":"ElementaryTypeName","src":"1385:5:227","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1325:80:227"},"returnParameters":{"id":24304,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24303,"mutability":"mutable","name":"magicValue","nameLocation":"1431:10:227","nodeType":"VariableDeclaration","scope":24305,"src":"1424:17:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":24302,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1424:6:227","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1423:19:227"},"scope":24324,"src":"1299:144:227","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":24306,"nodeType":"StructuredDocumentation","src":"1449:1062:227","text":"@notice Handles the receipt of multiple ERC1155 token types.\n @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\n @dev Return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (`0xbc197c81`) to accept the transfer.\n @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it."},"functionSelector":"bc197c81","id":24323,"implemented":false,"kind":"function","modifiers":[],"name":"onERC1155BatchReceived","nameLocation":"2525:22:227","nodeType":"FunctionDefinition","parameters":{"id":24319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24308,"mutability":"mutable","name":"operator","nameLocation":"2565:8:227","nodeType":"VariableDeclaration","scope":24323,"src":"2557:16:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24307,"name":"address","nodeType":"ElementaryTypeName","src":"2557:7:227","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24310,"mutability":"mutable","name":"from","nameLocation":"2591:4:227","nodeType":"VariableDeclaration","scope":24323,"src":"2583:12:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24309,"name":"address","nodeType":"ElementaryTypeName","src":"2583:7:227","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24313,"mutability":"mutable","name":"ids","nameLocation":"2624:3:227","nodeType":"VariableDeclaration","scope":24323,"src":"2605:22:227","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24311,"name":"uint256","nodeType":"ElementaryTypeName","src":"2605:7:227","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24312,"nodeType":"ArrayTypeName","src":"2605:9:227","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24316,"mutability":"mutable","name":"values","nameLocation":"2656:6:227","nodeType":"VariableDeclaration","scope":24323,"src":"2637:25:227","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24314,"name":"uint256","nodeType":"ElementaryTypeName","src":"2637:7:227","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24315,"nodeType":"ArrayTypeName","src":"2637:9:227","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24318,"mutability":"mutable","name":"data","nameLocation":"2687:4:227","nodeType":"VariableDeclaration","scope":24323,"src":"2672:19:227","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24317,"name":"bytes","nodeType":"ElementaryTypeName","src":"2672:5:227","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2547:150:227"},"returnParameters":{"id":24322,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24321,"mutability":"mutable","name":"magicValue","nameLocation":"2723:10:227","nodeType":"VariableDeclaration","scope":24323,"src":"2716:17:227","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":24320,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2716:6:227","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"2715:19:227"},"scope":24324,"src":"2516:219:227","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":24325,"src":"342:2395:227","usedErrors":[],"usedEvents":[]}],"src":"32:2706:227"},"id":227},"contracts/token/ERC1155/libraries/ERC1155Storage.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","exportedSymbols":{"Address":[38035],"ApprovalForAll":[23615],"ERC1155BalanceOfAddressZero":[23571],"ERC1155BalanceOverflow":[23548],"ERC1155InsufficientBalance":[23537],"ERC1155MintToAddressZero":[23576],"ERC1155NonApproved":[23526],"ERC1155SafeBatchTransferRejected":[23568],"ERC1155SafeTransferRejected":[23557],"ERC1155SelfApprovalForAll":[23516],"ERC1155Storage":[25484],"ERC1155TransferToAddressZero":[23519],"IERC1155":[24178],"IERC1155Burnable":[24204],"IERC1155Deliverable":[24223],"IERC1155MetadataURI":[24256],"IERC1155Mintable":[24286],"IERC1155TokenReceiver":[24324],"InconsistentArrayLengths":[7886],"InterfaceDetectionStorage":[11680],"TransferBatch":[23606],"TransferSingle":[23591]},"id":25485,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":24326,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:228"},{"absolutePath":"contracts/token/ERC1155/errors/ERC1155Errors.sol","file":"./../errors/ERC1155Errors.sol","id":24335,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":23572,"src":"103:300:228","symbolAliases":[{"foreign":{"id":24327,"name":"ERC1155SelfApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23516,"src":"116:25:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24328,"name":"ERC1155TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23519,"src":"147:28:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24329,"name":"ERC1155NonApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23526,"src":"181:18:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24330,"name":"ERC1155InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23537,"src":"205:26:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24331,"name":"ERC1155BalanceOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23548,"src":"237:22:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24332,"name":"ERC1155SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23557,"src":"265:27:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24333,"name":"ERC1155SafeBatchTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23568,"src":"298:32:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24334,"name":"ERC1155BalanceOfAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23571,"src":"336:27:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol","file":"./../errors/ERC1155MintableErrors.sol","id":24337,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":23577,"src":"404:79:228","symbolAliases":[{"foreign":{"id":24336,"name":"ERC1155MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23576,"src":"412:24:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../../CommonErrors.sol","id":24339,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":7890,"src":"484:69:228","symbolAliases":[{"foreign":{"id":24338,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"492:24:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/events/ERC1155Events.sol","file":"./../events/ERC1155Events.sol","id":24343,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":23623,"src":"554:92:228","symbolAliases":[{"foreign":{"id":24340,"name":"TransferSingle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23591,"src":"562:14:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24341,"name":"TransferBatch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23606,"src":"578:13:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":24342,"name":"ApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23615,"src":"593:14:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155.sol","file":"./../interfaces/IERC1155.sol","id":24345,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24179,"src":"647:54:228","symbolAliases":[{"foreign":{"id":24344,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"655:8:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol","file":"./../interfaces/IERC1155MetadataURI.sol","id":24347,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24257,"src":"702:76:228","symbolAliases":[{"foreign":{"id":24346,"name":"IERC1155MetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24256,"src":"710:19:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol","file":"./../interfaces/IERC1155Mintable.sol","id":24349,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24287,"src":"779:70:228","symbolAliases":[{"foreign":{"id":24348,"name":"IERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24286,"src":"787:16:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol","file":"./../interfaces/IERC1155Deliverable.sol","id":24351,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24224,"src":"850:76:228","symbolAliases":[{"foreign":{"id":24350,"name":"IERC1155Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24223,"src":"858:19:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol","file":"./../interfaces/IERC1155Burnable.sol","id":24353,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24205,"src":"927:70:228","symbolAliases":[{"foreign":{"id":24352,"name":"IERC1155Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24204,"src":"935:16:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol","file":"./../interfaces/IERC1155TokenReceiver.sol","id":24355,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":24325,"src":"998:80:228","symbolAliases":[{"foreign":{"id":24354,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"1006:21:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../../utils/libraries/Address.sol","id":24357,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":38036,"src":"1079:63:228","symbolAliases":[{"foreign":{"id":24356,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"1087:7:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":24359,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25485,"sourceUnit":11681,"src":"1143:107:228","symbolAliases":[{"foreign":{"id":24358,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1151:25:228","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC1155Storage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":25484,"linearizedBaseContracts":[25484],"name":"ERC1155Storage","nameLocation":"1260:14:228","nodeType":"ContractDefinition","nodes":[{"global":false,"id":24362,"libraryName":{"id":24360,"name":"Address","nameLocations":["1287:7:228"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"1287:7:228"},"nodeType":"UsingForDirective","src":"1281:26:228","typeName":{"id":24361,"name":"address","nodeType":"ElementaryTypeName","src":"1299:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":24366,"libraryName":{"id":24363,"name":"ERC1155Storage","nameLocations":["1318:14:228"],"nodeType":"IdentifierPath","referencedDeclaration":25484,"src":"1318:14:228"},"nodeType":"UsingForDirective","src":"1312:47:228","typeName":{"id":24365,"nodeType":"UserDefinedTypeName","pathNode":{"id":24364,"name":"ERC1155Storage.Layout","nameLocations":["1337:14:228","1352:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"1337:21:228"},"referencedDeclaration":24383,"src":"1337:21:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}}},{"global":false,"id":24370,"libraryName":{"id":24367,"name":"InterfaceDetectionStorage","nameLocations":["1370:25:228"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1370:25:228"},"nodeType":"UsingForDirective","src":"1364:69:228","typeName":{"id":24369,"nodeType":"UserDefinedTypeName","pathNode":{"id":24368,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1400:25:228","1426:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1400:32:228"},"referencedDeclaration":11590,"src":"1400:32:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ERC1155Storage.Layout","id":24383,"members":[{"constant":false,"id":24376,"mutability":"mutable","name":"balances","nameLocation":"1511:8:228","nodeType":"VariableDeclaration","scope":24383,"src":"1463:56:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"},"typeName":{"id":24375,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":24371,"name":"uint256","nodeType":"ElementaryTypeName","src":"1471:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1463:47:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":24374,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":24372,"name":"address","nodeType":"ElementaryTypeName","src":"1490:7:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1482:27:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":24373,"name":"uint256","nodeType":"ElementaryTypeName","src":"1501:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"internal"},{"constant":false,"id":24382,"mutability":"mutable","name":"operators","nameLocation":"1574:9:228","nodeType":"VariableDeclaration","scope":24383,"src":"1529:54:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"},"typeName":{"id":24381,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":24377,"name":"address","nodeType":"ElementaryTypeName","src":"1537:7:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1529:44:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":24380,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":24378,"name":"address","nodeType":"ElementaryTypeName","src":"1556:7:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1548:24:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":24379,"name":"bool","nodeType":"ElementaryTypeName","src":"1567:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}}},"visibility":"internal"}],"name":"Layout","nameLocation":"1446:6:228","nodeType":"StructDefinition","scope":25484,"src":"1439:151:228","visibility":"public"},{"constant":true,"id":24396,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"1622:19:228","nodeType":"VariableDeclaration","scope":25484,"src":"1596:120:228","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":24384,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1596:7:228","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24394,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e455243313135352e455243313135352e73746f72616765","id":24390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1670:39:228","typeDescriptions":{"typeIdentifier":"t_stringliteral_5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8613","typeString":"literal_string \"animoca.token.ERC1155.ERC1155.storage\""},"value":"animoca.token.ERC1155.ERC1155.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8613","typeString":"literal_string \"animoca.token.ERC1155.ERC1155.storage\""}],"id":24389,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1660:9:228","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":24391,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1660:50:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":24388,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1652:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":24387,"name":"uint256","nodeType":"ElementaryTypeName","src":"1652:7:228","typeDescriptions":{}}},"id":24392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1652:59:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":24393,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1714:1:228","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1652:63:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24386,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1644:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":24385,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1644:7:228","typeDescriptions":{}}},"id":24395,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1644:72:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":24401,"mutability":"constant","name":"ERC1155_SINGLE_RECEIVED","nameLocation":"1748:23:228","nodeType":"VariableDeclaration","scope":25484,"src":"1723:99:228","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":24397,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1723:6:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"expression":{"expression":{"id":24398,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"1774:21:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}},"id":24399,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1796:17:228","memberName":"onERC1155Received","nodeType":"MemberAccess","referencedDeclaration":24305,"src":"1774:39:228","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155TokenReceiver.onERC1155Received(address,address,uint256,uint256,bytes calldata) returns (bytes4)"}},"id":24400,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1814:8:228","memberName":"selector","nodeType":"MemberAccess","src":"1774:48:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"constant":true,"id":24406,"mutability":"constant","name":"ERC1155_BATCH_RECEIVED","nameLocation":"1853:22:228","nodeType":"VariableDeclaration","scope":25484,"src":"1828:103:228","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":24402,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1828:6:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"expression":{"expression":{"id":24403,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"1878:21:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}},"id":24404,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1900:22:228","memberName":"onERC1155BatchReceived","nodeType":"MemberAccess","referencedDeclaration":24323,"src":"1878:44:228","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC1155TokenReceiver.onERC1155BatchReceived(address,address,uint256[] calldata,uint256[] calldata,bytes calldata) returns (bytes4)"}},"id":24405,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1923:8:228","memberName":"selector","nodeType":"MemberAccess","src":"1878:53:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"body":{"id":24422,"nodeType":"Block","src":"2042:107:228","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":24416,"name":"IERC1155","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24178,"src":"2114:8:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155_$24178_$","typeString":"type(contract IERC1155)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155_$24178_$","typeString":"type(contract IERC1155)"}],"id":24415,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2109:4:228","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":24417,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2109:14:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155_$24178","typeString":"type(contract IERC1155)"}},"id":24418,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2124:11:228","memberName":"interfaceId","nodeType":"MemberAccess","src":"2109:26:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":24419,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2137:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24410,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2052:25:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":24412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2078:6:228","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2052:32:228","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":24413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2052:34:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":24414,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2087:21:228","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2052:56:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":24420,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2052:90:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24421,"nodeType":"ExpressionStatement","src":"2052:90:228"}]},"documentation":{"id":24407,"nodeType":"StructuredDocumentation","src":"1938:74:228","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155."},"id":24423,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2026:4:228","nodeType":"FunctionDefinition","parameters":{"id":24408,"nodeType":"ParameterList","parameters":[],"src":"2030:2:228"},"returnParameters":{"id":24409,"nodeType":"ParameterList","parameters":[],"src":"2042:0:228"},"scope":25484,"src":"2017:132:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24439,"nodeType":"Block","src":"2288:118:228","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":24433,"name":"IERC1155MetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24256,"src":"2360:19:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155MetadataURI_$24256_$","typeString":"type(contract IERC1155MetadataURI)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155MetadataURI_$24256_$","typeString":"type(contract IERC1155MetadataURI)"}],"id":24432,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2355:4:228","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":24434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2355:25:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155MetadataURI_$24256","typeString":"type(contract IERC1155MetadataURI)"}},"id":24435,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2381:11:228","memberName":"interfaceId","nodeType":"MemberAccess","src":"2355:37:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":24436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2394:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24427,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2298:25:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":24429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2324:6:228","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2298:32:228","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":24430,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2298:34:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":24431,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2333:21:228","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2298:56:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":24437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2298:101:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24438,"nodeType":"ExpressionStatement","src":"2298:101:228"}]},"documentation":{"id":24424,"nodeType":"StructuredDocumentation","src":"2155:85:228","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI."},"id":24440,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155MetadataURI","nameLocation":"2254:22:228","nodeType":"FunctionDefinition","parameters":{"id":24425,"nodeType":"ParameterList","parameters":[],"src":"2276:2:228"},"returnParameters":{"id":24426,"nodeType":"ParameterList","parameters":[],"src":"2288:0:228"},"scope":25484,"src":"2245:161:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24456,"nodeType":"Block","src":"2539:115:228","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":24450,"name":"IERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24286,"src":"2611:16:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Mintable_$24286_$","typeString":"type(contract IERC1155Mintable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155Mintable_$24286_$","typeString":"type(contract IERC1155Mintable)"}],"id":24449,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2606:4:228","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":24451,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2606:22:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155Mintable_$24286","typeString":"type(contract IERC1155Mintable)"}},"id":24452,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2629:11:228","memberName":"interfaceId","nodeType":"MemberAccess","src":"2606:34:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":24453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2642:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24444,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2549:25:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":24446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2575:6:228","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2549:32:228","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":24447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2549:34:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":24448,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2584:21:228","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2549:56:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":24454,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2549:98:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24455,"nodeType":"ExpressionStatement","src":"2549:98:228"}]},"documentation":{"id":24441,"nodeType":"StructuredDocumentation","src":"2412:82:228","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable."},"id":24457,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155Mintable","nameLocation":"2508:19:228","nodeType":"FunctionDefinition","parameters":{"id":24442,"nodeType":"ParameterList","parameters":[],"src":"2527:2:228"},"returnParameters":{"id":24443,"nodeType":"ParameterList","parameters":[],"src":"2539:0:228"},"scope":25484,"src":"2499:155:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24473,"nodeType":"Block","src":"2793:118:228","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":24467,"name":"IERC1155Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24223,"src":"2865:19:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Deliverable_$24223_$","typeString":"type(contract IERC1155Deliverable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155Deliverable_$24223_$","typeString":"type(contract IERC1155Deliverable)"}],"id":24466,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2860:4:228","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":24468,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2860:25:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155Deliverable_$24223","typeString":"type(contract IERC1155Deliverable)"}},"id":24469,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2886:11:228","memberName":"interfaceId","nodeType":"MemberAccess","src":"2860:37:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":24470,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2899:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24461,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2803:25:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":24463,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2829:6:228","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2803:32:228","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":24464,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2803:34:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":24465,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2838:21:228","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2803:56:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":24471,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2803:101:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24472,"nodeType":"ExpressionStatement","src":"2803:101:228"}]},"documentation":{"id":24458,"nodeType":"StructuredDocumentation","src":"2660:85:228","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable."},"id":24474,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155Deliverable","nameLocation":"2759:22:228","nodeType":"FunctionDefinition","parameters":{"id":24459,"nodeType":"ParameterList","parameters":[],"src":"2781:2:228"},"returnParameters":{"id":24460,"nodeType":"ParameterList","parameters":[],"src":"2793:0:228"},"scope":25484,"src":"2750:161:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24490,"nodeType":"Block","src":"3044:115:228","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":24484,"name":"IERC1155Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24204,"src":"3116:16:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155Burnable_$24204_$","typeString":"type(contract IERC1155Burnable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC1155Burnable_$24204_$","typeString":"type(contract IERC1155Burnable)"}],"id":24483,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3111:4:228","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":24485,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3111:22:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC1155Burnable_$24204","typeString":"type(contract IERC1155Burnable)"}},"id":24486,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3134:11:228","memberName":"interfaceId","nodeType":"MemberAccess","src":"3111:34:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":24487,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3147:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24478,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3054:25:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":24480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3080:6:228","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3054:32:228","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":24481,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3054:34:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":24482,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3089:21:228","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3054:56:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":24488,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3054:98:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24489,"nodeType":"ExpressionStatement","src":"3054:98:228"}]},"documentation":{"id":24475,"nodeType":"StructuredDocumentation","src":"2917:82:228","text":"@notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable."},"id":24491,"implemented":true,"kind":"function","modifiers":[],"name":"initERC1155Burnable","nameLocation":"3013:19:228","nodeType":"FunctionDefinition","parameters":{"id":24476,"nodeType":"ParameterList","parameters":[],"src":"3032:2:228"},"returnParameters":{"id":24477,"nodeType":"ParameterList","parameters":[],"src":"3044:0:228"},"scope":25484,"src":"3004:155:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24562,"nodeType":"Block","src":"4522:384:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":24515,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24510,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24501,"src":"4536:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":24513,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4550:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24512,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4542:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24511,"name":"address","nodeType":"ElementaryTypeName","src":"4542:7:228","typeDescriptions":{}}},"id":24514,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4542:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4536:16:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24519,"nodeType":"IfStatement","src":"4532:59:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24516,"name":"ERC1155TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23519,"src":"4561:28:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24517,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4561:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24518,"nodeType":"RevertStatement","src":"4554:37:228"}},{"condition":{"id":24525,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4605:31:228","subExpression":{"arguments":[{"id":24521,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24495,"src":"4620:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24522,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24499,"src":"4623:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24523,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24497,"src":"4629:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24520,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25201,"src":"4606:13:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":24524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4606:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24531,"nodeType":"IfStatement","src":"4601:76:228","trueBody":{"errorCall":{"arguments":[{"id":24527,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24497,"src":"4664:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24528,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24499,"src":"4672:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24526,"name":"ERC1155NonApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23526,"src":"4645:18:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":24529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4645:32:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24530,"nodeType":"RevertStatement","src":"4638:39:228"}},{"expression":{"arguments":[{"id":24533,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24495,"src":"4703:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24534,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24499,"src":"4706:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24535,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24501,"src":"4712:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24536,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24503,"src":"4716:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24537,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24505,"src":"4720:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24532,"name":"_transferToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25299,"src":"4688:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256)"}},"id":24538,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4688:38:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24539,"nodeType":"ExpressionStatement","src":"4688:38:228"},{"eventCall":{"arguments":[{"id":24541,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24497,"src":"4757:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24542,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24499,"src":"4765:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24543,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24501,"src":"4771:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24544,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24503,"src":"4775:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24545,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24505,"src":"4779:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24540,"name":"TransferSingle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23591,"src":"4742:14:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,address,address,uint256,uint256)"}},"id":24546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4742:43:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24547,"nodeType":"EmitStatement","src":"4737:48:228"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24548,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24501,"src":"4800:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24549,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4803:11:228","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"4800:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":24550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4800:16:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24561,"nodeType":"IfStatement","src":"4796:104:228","trueBody":{"id":24560,"nodeType":"Block","src":"4818:82:228","statements":[{"expression":{"arguments":[{"id":24552,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24497,"src":"4855:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24553,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24499,"src":"4863:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24554,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24501,"src":"4869:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24555,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24503,"src":"4873:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24556,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24505,"src":"4877:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24557,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24507,"src":"4884:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":24551,"name":"_callOnERC1155Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25445,"src":"4832:22:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,uint256,bytes memory)"}},"id":24558,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4832:57:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24559,"nodeType":"ExpressionStatement","src":"4832:57:228"}]}}]},"documentation":{"id":24492,"nodeType":"StructuredDocumentation","src":"3165:1209:228","text":"@notice Safely transfers some token by a sender.\n @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\n @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\n @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\n  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits a {TransferSingle} event.\n @param sender The message sender.\n @param from Current token owner.\n @param to Address of the new token owner.\n @param id Identifier of the token to transfer.\n @param value Amount of token to transfer.\n @param data Optional data to send along to a receiver contract."},"id":24563,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"4388:16:228","nodeType":"FunctionDefinition","parameters":{"id":24508,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24495,"mutability":"mutable","name":"s","nameLocation":"4420:1:228","nodeType":"VariableDeclaration","scope":24563,"src":"4405:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24494,"nodeType":"UserDefinedTypeName","pathNode":{"id":24493,"name":"Layout","nameLocations":["4405:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"4405:6:228"},"referencedDeclaration":24383,"src":"4405:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24497,"mutability":"mutable","name":"sender","nameLocation":"4431:6:228","nodeType":"VariableDeclaration","scope":24563,"src":"4423:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24496,"name":"address","nodeType":"ElementaryTypeName","src":"4423:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24499,"mutability":"mutable","name":"from","nameLocation":"4447:4:228","nodeType":"VariableDeclaration","scope":24563,"src":"4439:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24498,"name":"address","nodeType":"ElementaryTypeName","src":"4439:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24501,"mutability":"mutable","name":"to","nameLocation":"4461:2:228","nodeType":"VariableDeclaration","scope":24563,"src":"4453:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24500,"name":"address","nodeType":"ElementaryTypeName","src":"4453:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24503,"mutability":"mutable","name":"id","nameLocation":"4473:2:228","nodeType":"VariableDeclaration","scope":24563,"src":"4465:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24502,"name":"uint256","nodeType":"ElementaryTypeName","src":"4465:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24505,"mutability":"mutable","name":"value","nameLocation":"4485:5:228","nodeType":"VariableDeclaration","scope":24563,"src":"4477:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24504,"name":"uint256","nodeType":"ElementaryTypeName","src":"4477:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24507,"mutability":"mutable","name":"data","nameLocation":"4507:4:228","nodeType":"VariableDeclaration","scope":24563,"src":"4492:19:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24506,"name":"bytes","nodeType":"ElementaryTypeName","src":"4492:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4404:108:228"},"returnParameters":{"id":24509,"nodeType":"ParameterList","parameters":[],"src":"4522:0:228"},"scope":25484,"src":"4379:527:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24664,"nodeType":"Block","src":"6509:567:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":24589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24584,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24573,"src":"6523:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":24587,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6537:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24586,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6529:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24585,"name":"address","nodeType":"ElementaryTypeName","src":"6529:7:228","typeDescriptions":{}}},"id":24588,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6529:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6523:16:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24593,"nodeType":"IfStatement","src":"6519:59:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24590,"name":"ERC1155TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23519,"src":"6548:28:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24591,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6548:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24592,"nodeType":"RevertStatement","src":"6541:37:228"}},{"assignments":[24595],"declarations":[{"constant":false,"id":24595,"mutability":"mutable","name":"length","nameLocation":"6596:6:228","nodeType":"VariableDeclaration","scope":24664,"src":"6588:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24594,"name":"uint256","nodeType":"ElementaryTypeName","src":"6588:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24598,"initialValue":{"expression":{"id":24596,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24576,"src":"6605:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24597,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6609:6:228","memberName":"length","nodeType":"MemberAccess","src":"6605:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6588:27:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24602,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24599,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24595,"src":"6629:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":24600,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24579,"src":"6639:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6646:6:228","memberName":"length","nodeType":"MemberAccess","src":"6639:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6629:23:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24606,"nodeType":"IfStatement","src":"6625:62:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24603,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"6661:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6661:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24605,"nodeType":"RevertStatement","src":"6654:33:228"}},{"condition":{"id":24612,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"6702:31:228","subExpression":{"arguments":[{"id":24608,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24567,"src":"6717:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24609,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24571,"src":"6720:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24610,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24569,"src":"6726:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24607,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25201,"src":"6703:13:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":24611,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6703:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24618,"nodeType":"IfStatement","src":"6698:76:228","trueBody":{"errorCall":{"arguments":[{"id":24614,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24569,"src":"6761:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24615,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24571,"src":"6769:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24613,"name":"ERC1155NonApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23526,"src":"6742:18:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":24616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6742:32:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24617,"nodeType":"RevertStatement","src":"6735:39:228"}},{"body":{"id":24640,"nodeType":"Block","src":"6818:71:228","statements":[{"expression":{"arguments":[{"id":24629,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24567,"src":"6847:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24630,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24571,"src":"6850:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24631,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24573,"src":"6856:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":24632,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24576,"src":"6860:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24634,"indexExpression":{"id":24633,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24620,"src":"6864:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6860:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":24635,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24579,"src":"6868:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24637,"indexExpression":{"id":24636,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24620,"src":"6875:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6868:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24628,"name":"_transferToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25299,"src":"6832:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256)"}},"id":24638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6832:46:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24639,"nodeType":"ExpressionStatement","src":"6832:46:228"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24622,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24620,"src":"6801:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":24623,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24595,"src":"6805:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6801:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24641,"initializationExpression":{"assignments":[24620],"declarations":[{"constant":false,"id":24620,"mutability":"mutable","name":"i","nameLocation":"6798:1:228","nodeType":"VariableDeclaration","scope":24641,"src":"6790:9:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24619,"name":"uint256","nodeType":"ElementaryTypeName","src":"6790:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24621,"nodeType":"VariableDeclarationStatement","src":"6790:9:228"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":24626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"6813:3:228","subExpression":{"id":24625,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24620,"src":"6815:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24627,"nodeType":"ExpressionStatement","src":"6813:3:228"},"nodeType":"ForStatement","src":"6785:104:228"},{"eventCall":{"arguments":[{"id":24643,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24569,"src":"6918:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24644,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24571,"src":"6926:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24645,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24573,"src":"6932:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24646,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24576,"src":"6936:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":24647,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24579,"src":"6941:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"id":24642,"name":"TransferBatch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23606,"src":"6904:13:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256[] memory,uint256[] memory)"}},"id":24648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6904:44:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24649,"nodeType":"EmitStatement","src":"6899:49:228"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24650,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24573,"src":"6963:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24651,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6966:11:228","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"6963:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":24652,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6963:16:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24663,"nodeType":"IfStatement","src":"6959:111:228","trueBody":{"id":24662,"nodeType":"Block","src":"6981:89:228","statements":[{"expression":{"arguments":[{"id":24654,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24569,"src":"7023:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24655,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24571,"src":"7031:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24656,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24573,"src":"7037:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24657,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24576,"src":"7041:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":24658,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24579,"src":"7046:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":24659,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24581,"src":"7054:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":24653,"name":"_callOnERC1155BatchReceived","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25483,"src":"6995:27:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256[] memory,uint256[] memory,bytes memory)"}},"id":24660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6995:64:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24661,"nodeType":"ExpressionStatement","src":"6995:64:228"}]}}]},"documentation":{"id":24564,"nodeType":"StructuredDocumentation","src":"4912:1358:228","text":"@notice Safely transfers a batch of tokens by a sender.\n @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\n @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\n @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\n  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\n @dev Emits a {TransferBatch} event.\n @param sender The message sender.\n @param from Current tokens owner.\n @param to Address of the new tokens owner.\n @param ids Identifiers of the tokens to transfer.\n @param values Amounts of tokens to transfer.\n @param data Optional data to send along to a receiver contract."},"id":24665,"implemented":true,"kind":"function","modifiers":[],"name":"safeBatchTransferFrom","nameLocation":"6284:21:228","nodeType":"FunctionDefinition","parameters":{"id":24582,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24567,"mutability":"mutable","name":"s","nameLocation":"6330:1:228","nodeType":"VariableDeclaration","scope":24665,"src":"6315:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24566,"nodeType":"UserDefinedTypeName","pathNode":{"id":24565,"name":"Layout","nameLocations":["6315:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"6315:6:228"},"referencedDeclaration":24383,"src":"6315:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24569,"mutability":"mutable","name":"sender","nameLocation":"6349:6:228","nodeType":"VariableDeclaration","scope":24665,"src":"6341:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24568,"name":"address","nodeType":"ElementaryTypeName","src":"6341:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24571,"mutability":"mutable","name":"from","nameLocation":"6373:4:228","nodeType":"VariableDeclaration","scope":24665,"src":"6365:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24570,"name":"address","nodeType":"ElementaryTypeName","src":"6365:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24573,"mutability":"mutable","name":"to","nameLocation":"6395:2:228","nodeType":"VariableDeclaration","scope":24665,"src":"6387:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24572,"name":"address","nodeType":"ElementaryTypeName","src":"6387:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24576,"mutability":"mutable","name":"ids","nameLocation":"6426:3:228","nodeType":"VariableDeclaration","scope":24665,"src":"6407:22:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24574,"name":"uint256","nodeType":"ElementaryTypeName","src":"6407:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24575,"nodeType":"ArrayTypeName","src":"6407:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24579,"mutability":"mutable","name":"values","nameLocation":"6458:6:228","nodeType":"VariableDeclaration","scope":24665,"src":"6439:25:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24577,"name":"uint256","nodeType":"ElementaryTypeName","src":"6439:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24578,"nodeType":"ArrayTypeName","src":"6439:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24581,"mutability":"mutable","name":"data","nameLocation":"6489:4:228","nodeType":"VariableDeclaration","scope":24665,"src":"6474:19:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":24580,"name":"bytes","nodeType":"ElementaryTypeName","src":"6474:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"6305:194:228"},"returnParameters":{"id":24583,"nodeType":"ParameterList","parameters":[],"src":"6509:0:228"},"scope":25484,"src":"6275:801:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24727,"nodeType":"Block","src":"8138:296:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":24687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24682,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24673,"src":"8152:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":24685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8166:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24684,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8158:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24683,"name":"address","nodeType":"ElementaryTypeName","src":"8158:7:228","typeDescriptions":{}}},"id":24686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8158:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8152:16:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24691,"nodeType":"IfStatement","src":"8148:55:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24688,"name":"ERC1155MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23576,"src":"8177:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24689,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8177:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24690,"nodeType":"RevertStatement","src":"8170:33:228"}},{"expression":{"arguments":[{"id":24693,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24669,"src":"8225:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24694,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24673,"src":"8228:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24695,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24675,"src":"8232:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24696,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24677,"src":"8236:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24692,"name":"_mintToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25354,"src":"8214:10:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)"}},"id":24697,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8214:28:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24698,"nodeType":"ExpressionStatement","src":"8214:28:228"},{"eventCall":{"arguments":[{"id":24700,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24671,"src":"8273:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":24703,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8289:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24702,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8281:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24701,"name":"address","nodeType":"ElementaryTypeName","src":"8281:7:228","typeDescriptions":{}}},"id":24704,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8281:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24705,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24673,"src":"8293:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24706,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24675,"src":"8297:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24707,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24677,"src":"8301:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24699,"name":"TransferSingle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23591,"src":"8258:14:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,address,address,uint256,uint256)"}},"id":24708,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8258:49:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24709,"nodeType":"EmitStatement","src":"8253:54:228"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24710,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24673,"src":"8322:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24711,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8325:11:228","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"8322:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":24712,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8322:16:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24726,"nodeType":"IfStatement","src":"8318:110:228","trueBody":{"id":24725,"nodeType":"Block","src":"8340:88:228","statements":[{"expression":{"arguments":[{"id":24714,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24671,"src":"8377:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":24717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8393:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24716,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8385:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24715,"name":"address","nodeType":"ElementaryTypeName","src":"8385:7:228","typeDescriptions":{}}},"id":24718,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8385:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24719,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24673,"src":"8397:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24720,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24675,"src":"8401:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24721,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24677,"src":"8405:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24722,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24679,"src":"8412:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":24713,"name":"_callOnERC1155Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25445,"src":"8354:22:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,uint256,bytes memory)"}},"id":24723,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8354:63:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24724,"nodeType":"ExpressionStatement","src":"8354:63:228"}]}}]},"documentation":{"id":24666,"nodeType":"StructuredDocumentation","src":"7082:932:228","text":"@notice Safely mints some token by a sender.\n @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\n @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\n  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits a {TransferSingle} event.\n @param sender The message sender.\n @param to Address of the new token owner.\n @param id Identifier of the token to mint.\n @param value Amount of token to mint.\n @param data Optional data to send along to a receiver contract."},"id":24728,"implemented":true,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"8028:8:228","nodeType":"FunctionDefinition","parameters":{"id":24680,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24669,"mutability":"mutable","name":"s","nameLocation":"8052:1:228","nodeType":"VariableDeclaration","scope":24728,"src":"8037:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24668,"nodeType":"UserDefinedTypeName","pathNode":{"id":24667,"name":"Layout","nameLocations":["8037:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"8037:6:228"},"referencedDeclaration":24383,"src":"8037:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24671,"mutability":"mutable","name":"sender","nameLocation":"8063:6:228","nodeType":"VariableDeclaration","scope":24728,"src":"8055:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24670,"name":"address","nodeType":"ElementaryTypeName","src":"8055:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24673,"mutability":"mutable","name":"to","nameLocation":"8079:2:228","nodeType":"VariableDeclaration","scope":24728,"src":"8071:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24672,"name":"address","nodeType":"ElementaryTypeName","src":"8071:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24675,"mutability":"mutable","name":"id","nameLocation":"8091:2:228","nodeType":"VariableDeclaration","scope":24728,"src":"8083:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24674,"name":"uint256","nodeType":"ElementaryTypeName","src":"8083:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24677,"mutability":"mutable","name":"value","nameLocation":"8103:5:228","nodeType":"VariableDeclaration","scope":24728,"src":"8095:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24676,"name":"uint256","nodeType":"ElementaryTypeName","src":"8095:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24679,"mutability":"mutable","name":"data","nameLocation":"8123:4:228","nodeType":"VariableDeclaration","scope":24728,"src":"8110:17:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":24678,"name":"bytes","nodeType":"ElementaryTypeName","src":"8110:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"8036:92:228"},"returnParameters":{"id":24681,"nodeType":"ParameterList","parameters":[],"src":"8138:0:228"},"scope":25484,"src":"8019:415:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24820,"nodeType":"Block","src":"9661:478:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":24752,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24747,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24736,"src":"9675:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":24750,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9689:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24749,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9681:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24748,"name":"address","nodeType":"ElementaryTypeName","src":"9681:7:228","typeDescriptions":{}}},"id":24751,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9681:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9675:16:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24756,"nodeType":"IfStatement","src":"9671:55:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24753,"name":"ERC1155MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23576,"src":"9700:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24754,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9700:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24755,"nodeType":"RevertStatement","src":"9693:33:228"}},{"assignments":[24758],"declarations":[{"constant":false,"id":24758,"mutability":"mutable","name":"length","nameLocation":"9744:6:228","nodeType":"VariableDeclaration","scope":24820,"src":"9736:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24757,"name":"uint256","nodeType":"ElementaryTypeName","src":"9736:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24761,"initialValue":{"expression":{"id":24759,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24739,"src":"9753:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9757:6:228","memberName":"length","nodeType":"MemberAccess","src":"9753:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9736:27:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24765,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24762,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24758,"src":"9777:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":24763,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24742,"src":"9787:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24764,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9794:6:228","memberName":"length","nodeType":"MemberAccess","src":"9787:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9777:23:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24769,"nodeType":"IfStatement","src":"9773:62:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24766,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"9809:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9809:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24768,"nodeType":"RevertStatement","src":"9802:33:228"}},{"body":{"id":24790,"nodeType":"Block","src":"9879:61:228","statements":[{"expression":{"arguments":[{"id":24780,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24732,"src":"9904:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24781,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24736,"src":"9907:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":24782,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24739,"src":"9911:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24784,"indexExpression":{"id":24783,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24771,"src":"9915:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9911:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":24785,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24742,"src":"9919:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24787,"indexExpression":{"id":24786,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24771,"src":"9926:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9919:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24779,"name":"_mintToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25354,"src":"9893:10:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)"}},"id":24788,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9893:36:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24789,"nodeType":"ExpressionStatement","src":"9893:36:228"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24775,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24773,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24771,"src":"9862:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":24774,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24758,"src":"9866:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9862:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24791,"initializationExpression":{"assignments":[24771],"declarations":[{"constant":false,"id":24771,"mutability":"mutable","name":"i","nameLocation":"9859:1:228","nodeType":"VariableDeclaration","scope":24791,"src":"9851:9:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24770,"name":"uint256","nodeType":"ElementaryTypeName","src":"9851:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24772,"nodeType":"VariableDeclarationStatement","src":"9851:9:228"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":24777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"9874:3:228","subExpression":{"id":24776,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24771,"src":"9876:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24778,"nodeType":"ExpressionStatement","src":"9874:3:228"},"nodeType":"ForStatement","src":"9846:94:228"},{"eventCall":{"arguments":[{"id":24793,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24734,"src":"9969:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":24796,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9985:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24795,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9977:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24794,"name":"address","nodeType":"ElementaryTypeName","src":"9977:7:228","typeDescriptions":{}}},"id":24797,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9977:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24798,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24736,"src":"9989:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24799,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24739,"src":"9993:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":24800,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24742,"src":"9998:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"id":24792,"name":"TransferBatch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23606,"src":"9955:13:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256[] memory,uint256[] memory)"}},"id":24801,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9955:50:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24802,"nodeType":"EmitStatement","src":"9950:55:228"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":24803,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24736,"src":"10020:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10023:11:228","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"10020:14:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":24805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10020:16:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24819,"nodeType":"IfStatement","src":"10016:117:228","trueBody":{"id":24818,"nodeType":"Block","src":"10038:95:228","statements":[{"expression":{"arguments":[{"id":24807,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24734,"src":"10080:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":24810,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10096:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24809,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10088:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24808,"name":"address","nodeType":"ElementaryTypeName","src":"10088:7:228","typeDescriptions":{}}},"id":24811,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10088:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24812,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24736,"src":"10100:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24813,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24739,"src":"10104:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":24814,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24742,"src":"10109:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":24815,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24744,"src":"10117:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":24806,"name":"_callOnERC1155BatchReceived","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25483,"src":"10052:27:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256[] memory,uint256[] memory,bytes memory)"}},"id":24816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10052:70:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24817,"nodeType":"ExpressionStatement","src":"10052:70:228"}]}}]},"documentation":{"id":24729,"nodeType":"StructuredDocumentation","src":"8440:1072:228","text":"@notice Safely mints a batch of tokens by a sender.\n @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\n @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\n  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\n @dev Emits a {TransferBatch} event.\n @param sender The message sender.\n @param to Address of the new tokens owner.\n @param ids Identifiers of the tokens to mint.\n @param values Amounts of tokens to mint.\n @param data Optional data to send along to a receiver contract."},"id":24821,"implemented":true,"kind":"function","modifiers":[],"name":"safeBatchMint","nameLocation":"9526:13:228","nodeType":"FunctionDefinition","parameters":{"id":24745,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24732,"mutability":"mutable","name":"s","nameLocation":"9555:1:228","nodeType":"VariableDeclaration","scope":24821,"src":"9540:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24731,"nodeType":"UserDefinedTypeName","pathNode":{"id":24730,"name":"Layout","nameLocations":["9540:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"9540:6:228"},"referencedDeclaration":24383,"src":"9540:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24734,"mutability":"mutable","name":"sender","nameLocation":"9566:6:228","nodeType":"VariableDeclaration","scope":24821,"src":"9558:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24733,"name":"address","nodeType":"ElementaryTypeName","src":"9558:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24736,"mutability":"mutable","name":"to","nameLocation":"9582:2:228","nodeType":"VariableDeclaration","scope":24821,"src":"9574:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24735,"name":"address","nodeType":"ElementaryTypeName","src":"9574:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24739,"mutability":"mutable","name":"ids","nameLocation":"9603:3:228","nodeType":"VariableDeclaration","scope":24821,"src":"9586:20:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24737,"name":"uint256","nodeType":"ElementaryTypeName","src":"9586:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24738,"nodeType":"ArrayTypeName","src":"9586:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24742,"mutability":"mutable","name":"values","nameLocation":"9625:6:228","nodeType":"VariableDeclaration","scope":24821,"src":"9608:23:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24740,"name":"uint256","nodeType":"ElementaryTypeName","src":"9608:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24741,"nodeType":"ArrayTypeName","src":"9608:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24744,"mutability":"mutable","name":"data","nameLocation":"9646:4:228","nodeType":"VariableDeclaration","scope":24821,"src":"9633:17:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":24743,"name":"bytes","nodeType":"ElementaryTypeName","src":"9633:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"9539:112:228"},"returnParameters":{"id":24746,"nodeType":"ParameterList","parameters":[],"src":"9661:0:228"},"scope":25484,"src":"9517:622:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24886,"nodeType":"Block","src":"11562:272:228","statements":[{"assignments":[24842],"declarations":[{"constant":false,"id":24842,"mutability":"mutable","name":"length","nameLocation":"11580:6:228","nodeType":"VariableDeclaration","scope":24886,"src":"11572:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24841,"name":"uint256","nodeType":"ElementaryTypeName","src":"11572:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24845,"initialValue":{"expression":{"id":24843,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24830,"src":"11589:10:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":24844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11600:6:228","memberName":"length","nodeType":"MemberAccess","src":"11589:17:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11572:34:228"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":24854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24846,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24842,"src":"11620:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":24847,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24833,"src":"11630:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24848,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11634:6:228","memberName":"length","nodeType":"MemberAccess","src":"11630:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11620:20:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24850,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24842,"src":"11644:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":24851,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24836,"src":"11654:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24852,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11661:6:228","memberName":"length","nodeType":"MemberAccess","src":"11654:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11644:23:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11620:47:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24858,"nodeType":"IfStatement","src":"11616:86:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24855,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"11676:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11676:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24857,"nodeType":"RevertStatement","src":"11669:33:228"}},{"body":{"id":24884,"nodeType":"Block","src":"11745:83:228","statements":[{"expression":{"arguments":[{"id":24871,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24827,"src":"11770:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":24872,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24830,"src":"11778:10:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":24874,"indexExpression":{"id":24873,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24860,"src":"11789:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11778:13:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":24875,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24833,"src":"11793:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24877,"indexExpression":{"id":24876,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24860,"src":"11797:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11793:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":24878,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24836,"src":"11801:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":24880,"indexExpression":{"id":24879,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24860,"src":"11808:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11801:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24881,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24838,"src":"11812:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":24868,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24825,"src":"11759:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":24870,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11761:8:228","memberName":"safeMint","nodeType":"MemberAccess","referencedDeclaration":24728,"src":"11759:10:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256,bytes memory)"}},"id":24882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11759:58:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24883,"nodeType":"ExpressionStatement","src":"11759:58:228"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24864,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24862,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24860,"src":"11728:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":24863,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24842,"src":"11732:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11728:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24885,"initializationExpression":{"assignments":[24860],"declarations":[{"constant":false,"id":24860,"mutability":"mutable","name":"i","nameLocation":"11725:1:228","nodeType":"VariableDeclaration","scope":24885,"src":"11717:9:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24859,"name":"uint256","nodeType":"ElementaryTypeName","src":"11717:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24861,"nodeType":"VariableDeclarationStatement","src":"11717:9:228"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":24866,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"11740:3:228","subExpression":{"id":24865,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24860,"src":"11742:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24867,"nodeType":"ExpressionStatement","src":"11740:3:228"},"nodeType":"ForStatement","src":"11712:116:228"}]},"documentation":{"id":24822,"nodeType":"StructuredDocumentation","src":"10145:1199:228","text":"@notice Safely mints tokens to multiple recipients by a sender.\n @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\n @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\n @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\n  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\n @dev Emits a {TransferSingle} event from the zero address for each transfer.\n @param sender The message sender.\n @param recipients Addresses of the new tokens owners.\n @param ids Identifiers of the tokens to mint.\n @param values Amounts of tokens to mint.\n @param data Optional data to send along to a receiver contract."},"id":24887,"implemented":true,"kind":"function","modifiers":[],"name":"safeDeliver","nameLocation":"11358:11:228","nodeType":"FunctionDefinition","parameters":{"id":24839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24825,"mutability":"mutable","name":"s","nameLocation":"11394:1:228","nodeType":"VariableDeclaration","scope":24887,"src":"11379:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24824,"nodeType":"UserDefinedTypeName","pathNode":{"id":24823,"name":"Layout","nameLocations":["11379:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"11379:6:228"},"referencedDeclaration":24383,"src":"11379:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24827,"mutability":"mutable","name":"sender","nameLocation":"11413:6:228","nodeType":"VariableDeclaration","scope":24887,"src":"11405:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24826,"name":"address","nodeType":"ElementaryTypeName","src":"11405:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24830,"mutability":"mutable","name":"recipients","nameLocation":"11446:10:228","nodeType":"VariableDeclaration","scope":24887,"src":"11429:27:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":24828,"name":"address","nodeType":"ElementaryTypeName","src":"11429:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":24829,"nodeType":"ArrayTypeName","src":"11429:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":24833,"mutability":"mutable","name":"ids","nameLocation":"11483:3:228","nodeType":"VariableDeclaration","scope":24887,"src":"11466:20:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24831,"name":"uint256","nodeType":"ElementaryTypeName","src":"11466:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24832,"nodeType":"ArrayTypeName","src":"11466:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24836,"mutability":"mutable","name":"values","nameLocation":"11513:6:228","nodeType":"VariableDeclaration","scope":24887,"src":"11496:23:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24834,"name":"uint256","nodeType":"ElementaryTypeName","src":"11496:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24835,"nodeType":"ArrayTypeName","src":"11496:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24838,"mutability":"mutable","name":"data","nameLocation":"11542:4:228","nodeType":"VariableDeclaration","scope":24887,"src":"11529:17:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":24837,"name":"bytes","nodeType":"ElementaryTypeName","src":"11529:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"11369:183:228"},"returnParameters":{"id":24840,"nodeType":"ParameterList","parameters":[],"src":"11562:0:228"},"scope":25484,"src":"11349:485:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":24932,"nodeType":"Block","src":"12440:199:228","statements":[{"condition":{"id":24907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"12454:31:228","subExpression":{"arguments":[{"id":24903,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24891,"src":"12469:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24904,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24895,"src":"12472:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24905,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24893,"src":"12478:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24902,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25201,"src":"12455:13:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":24906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12455:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24913,"nodeType":"IfStatement","src":"12450:76:228","trueBody":{"errorCall":{"arguments":[{"id":24909,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24893,"src":"12513:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24910,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24895,"src":"12521:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24908,"name":"ERC1155NonApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23526,"src":"12494:18:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":24911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12494:32:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24912,"nodeType":"RevertStatement","src":"12487:39:228"}},{"expression":{"arguments":[{"id":24915,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24891,"src":"12547:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24916,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24895,"src":"12550:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24917,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24897,"src":"12556:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24918,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24899,"src":"12560:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24914,"name":"_burnToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25409,"src":"12536:10:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)"}},"id":24919,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12536:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24920,"nodeType":"ExpressionStatement","src":"12536:30:228"},{"eventCall":{"arguments":[{"id":24922,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24893,"src":"12596:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24923,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24895,"src":"12604:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":24926,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12618:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":24925,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12610:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":24924,"name":"address","nodeType":"ElementaryTypeName","src":"12610:7:228","typeDescriptions":{}}},"id":24927,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12610:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24928,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24897,"src":"12622:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":24929,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24899,"src":"12626:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24921,"name":"TransferSingle","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23591,"src":"12581:14:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,address,address,uint256,uint256)"}},"id":24930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12581:51:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24931,"nodeType":"EmitStatement","src":"12576:56:228"}]},"documentation":{"id":24888,"nodeType":"StructuredDocumentation","src":"11840:493:228","text":"@notice Burns some token by a sender.\n @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\n @dev Emits a {TransferSingle} event.\n @param sender The message sender.\n @param from Address of the current token owner.\n @param id Identifier of the token to burn.\n @param value Amount of token to burn."},"id":24933,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"12347:8:228","nodeType":"FunctionDefinition","parameters":{"id":24900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24891,"mutability":"mutable","name":"s","nameLocation":"12371:1:228","nodeType":"VariableDeclaration","scope":24933,"src":"12356:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24890,"nodeType":"UserDefinedTypeName","pathNode":{"id":24889,"name":"Layout","nameLocations":["12356:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"12356:6:228"},"referencedDeclaration":24383,"src":"12356:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24893,"mutability":"mutable","name":"sender","nameLocation":"12382:6:228","nodeType":"VariableDeclaration","scope":24933,"src":"12374:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24892,"name":"address","nodeType":"ElementaryTypeName","src":"12374:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24895,"mutability":"mutable","name":"from","nameLocation":"12398:4:228","nodeType":"VariableDeclaration","scope":24933,"src":"12390:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24894,"name":"address","nodeType":"ElementaryTypeName","src":"12390:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24897,"mutability":"mutable","name":"id","nameLocation":"12412:2:228","nodeType":"VariableDeclaration","scope":24933,"src":"12404:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24896,"name":"uint256","nodeType":"ElementaryTypeName","src":"12404:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":24899,"mutability":"mutable","name":"value","nameLocation":"12424:5:228","nodeType":"VariableDeclaration","scope":24933,"src":"12416:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24898,"name":"uint256","nodeType":"ElementaryTypeName","src":"12416:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12355:75:228"},"returnParameters":{"id":24901,"nodeType":"ParameterList","parameters":[],"src":"12440:0:228"},"scope":25484,"src":"12338:301:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":25008,"nodeType":"Block","src":"13403:376:228","statements":[{"assignments":[24951],"declarations":[{"constant":false,"id":24951,"mutability":"mutable","name":"length","nameLocation":"13421:6:228","nodeType":"VariableDeclaration","scope":25008,"src":"13413:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24950,"name":"uint256","nodeType":"ElementaryTypeName","src":"13413:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24954,"initialValue":{"expression":{"id":24952,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24944,"src":"13430:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13434:6:228","memberName":"length","nodeType":"MemberAccess","src":"13430:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"13413:27:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24958,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24955,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24951,"src":"13454:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":24956,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24947,"src":"13464:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24957,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"13471:6:228","memberName":"length","nodeType":"MemberAccess","src":"13464:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13454:23:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24962,"nodeType":"IfStatement","src":"13450:62:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":24959,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"13486:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":24960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13486:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24961,"nodeType":"RevertStatement","src":"13479:33:228"}},{"condition":{"id":24968,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"13526:31:228","subExpression":{"arguments":[{"id":24964,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24937,"src":"13541:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24965,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24941,"src":"13544:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24966,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24939,"src":"13550:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24963,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25201,"src":"13527:13:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":24967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13527:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24974,"nodeType":"IfStatement","src":"13522:76:228","trueBody":{"errorCall":{"arguments":[{"id":24970,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24939,"src":"13585:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24971,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24941,"src":"13593:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":24969,"name":"ERC1155NonApproved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23526,"src":"13566:18:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$","typeString":"function (address,address) pure returns (error)"}},"id":24972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13566:32:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":24973,"nodeType":"RevertStatement","src":"13559:39:228"}},{"body":{"id":24995,"nodeType":"Block","src":"13642:63:228","statements":[{"expression":{"arguments":[{"id":24985,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24937,"src":"13667:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},{"id":24986,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24941,"src":"13670:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":24987,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24944,"src":"13676:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24989,"indexExpression":{"id":24988,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24976,"src":"13680:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13676:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":24990,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24947,"src":"13684:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":24992,"indexExpression":{"id":24991,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24976,"src":"13691:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"13684:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":24984,"name":"_burnToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25409,"src":"13656:10:228","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)"}},"id":24993,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13656:38:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":24994,"nodeType":"ExpressionStatement","src":"13656:38:228"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":24980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24978,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24976,"src":"13625:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":24979,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24951,"src":"13629:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13625:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":24996,"initializationExpression":{"assignments":[24976],"declarations":[{"constant":false,"id":24976,"mutability":"mutable","name":"i","nameLocation":"13622:1:228","nodeType":"VariableDeclaration","scope":24996,"src":"13614:9:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":24975,"name":"uint256","nodeType":"ElementaryTypeName","src":"13614:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":24977,"nodeType":"VariableDeclarationStatement","src":"13614:9:228"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":24982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"13637:3:228","subExpression":{"id":24981,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24976,"src":"13639:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24983,"nodeType":"ExpressionStatement","src":"13637:3:228"},"nodeType":"ForStatement","src":"13609:96:228"},{"eventCall":{"arguments":[{"id":24998,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24939,"src":"13734:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":24999,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24941,"src":"13742:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":25002,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13756:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":25001,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13748:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":25000,"name":"address","nodeType":"ElementaryTypeName","src":"13748:7:228","typeDescriptions":{}}},"id":25003,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13748:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25004,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24944,"src":"13760:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":25005,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24947,"src":"13765:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"id":24997,"name":"TransferBatch","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23606,"src":"13720:13:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256[] memory,uint256[] memory)"}},"id":25006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13720:52:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25007,"nodeType":"EmitStatement","src":"13715:57:228"}]},"documentation":{"id":24934,"nodeType":"StructuredDocumentation","src":"12645:622:228","text":"@notice Burns multiple tokens by a sender.\n @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\n @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\n @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\n @dev Emits an {IERC1155-TransferBatch} event.\n @param sender The message sender.\n @param from Address of the current tokens owner.\n @param ids Identifiers of the tokens to burn.\n @param values Amounts of tokens to burn."},"id":25009,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"13281:13:228","nodeType":"FunctionDefinition","parameters":{"id":24948,"nodeType":"ParameterList","parameters":[{"constant":false,"id":24937,"mutability":"mutable","name":"s","nameLocation":"13310:1:228","nodeType":"VariableDeclaration","scope":25009,"src":"13295:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":24936,"nodeType":"UserDefinedTypeName","pathNode":{"id":24935,"name":"Layout","nameLocations":["13295:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"13295:6:228"},"referencedDeclaration":24383,"src":"13295:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":24939,"mutability":"mutable","name":"sender","nameLocation":"13321:6:228","nodeType":"VariableDeclaration","scope":25009,"src":"13313:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24938,"name":"address","nodeType":"ElementaryTypeName","src":"13313:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24941,"mutability":"mutable","name":"from","nameLocation":"13337:4:228","nodeType":"VariableDeclaration","scope":25009,"src":"13329:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":24940,"name":"address","nodeType":"ElementaryTypeName","src":"13329:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":24944,"mutability":"mutable","name":"ids","nameLocation":"13362:3:228","nodeType":"VariableDeclaration","scope":25009,"src":"13343:22:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24942,"name":"uint256","nodeType":"ElementaryTypeName","src":"13343:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24943,"nodeType":"ArrayTypeName","src":"13343:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":24947,"mutability":"mutable","name":"values","nameLocation":"13386:6:228","nodeType":"VariableDeclaration","scope":25009,"src":"13367:25:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":24945,"name":"uint256","nodeType":"ElementaryTypeName","src":"13367:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":24946,"nodeType":"ArrayTypeName","src":"13367:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"13294:99:228"},"returnParameters":{"id":24949,"nodeType":"ParameterList","parameters":[],"src":"13403:0:228"},"scope":25484,"src":"13272:507:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":25046,"nodeType":"Block","src":"14262:188:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":25024,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25022,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25017,"src":"14276:8:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":25023,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25015,"src":"14288:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14276:18:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25029,"nodeType":"IfStatement","src":"14272:64:228","trueBody":{"errorCall":{"arguments":[{"id":25026,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25015,"src":"14329:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":25025,"name":"ERC1155SelfApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23516,"src":"14303:25:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":25027,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14303:33:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25028,"nodeType":"RevertStatement","src":"14296:40:228"}},{"expression":{"id":25038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":25030,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25013,"src":"14346:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25034,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14348:9:228","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":24382,"src":"14346:11:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":25035,"indexExpression":{"id":25032,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25015,"src":"14358:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14346:19:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":25036,"indexExpression":{"id":25033,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25017,"src":"14366:8:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"14346:29:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":25037,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25019,"src":"14378:8:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"14346:40:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25039,"nodeType":"ExpressionStatement","src":"14346:40:228"},{"eventCall":{"arguments":[{"id":25041,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25015,"src":"14416:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25042,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25017,"src":"14424:8:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25043,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25019,"src":"14434:8:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":25040,"name":"ApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23615,"src":"14401:14:228","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$returns$__$","typeString":"function (address,address,bool)"}},"id":25044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14401:42:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25045,"nodeType":"EmitStatement","src":"14396:47:228"}]},"documentation":{"id":25010,"nodeType":"StructuredDocumentation","src":"13785:369:228","text":"@notice Enables or disables an operator's approval by a sender.\n @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\n @dev Emits an {ApprovalForAll} event.\n @param sender The message sender.\n @param operator Address of the operator.\n @param approved True to approve the operator, false to revoke its approval."},"id":25047,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"14168:17:228","nodeType":"FunctionDefinition","parameters":{"id":25020,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25013,"mutability":"mutable","name":"s","nameLocation":"14201:1:228","nodeType":"VariableDeclaration","scope":25047,"src":"14186:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25012,"nodeType":"UserDefinedTypeName","pathNode":{"id":25011,"name":"Layout","nameLocations":["14186:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"14186:6:228"},"referencedDeclaration":24383,"src":"14186:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25015,"mutability":"mutable","name":"sender","nameLocation":"14212:6:228","nodeType":"VariableDeclaration","scope":25047,"src":"14204:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25014,"name":"address","nodeType":"ElementaryTypeName","src":"14204:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25017,"mutability":"mutable","name":"operator","nameLocation":"14228:8:228","nodeType":"VariableDeclaration","scope":25047,"src":"14220:16:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25016,"name":"address","nodeType":"ElementaryTypeName","src":"14220:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25019,"mutability":"mutable","name":"approved","nameLocation":"14243:8:228","nodeType":"VariableDeclaration","scope":25047,"src":"14238:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":25018,"name":"bool","nodeType":"ElementaryTypeName","src":"14238:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"14185:67:228"},"returnParameters":{"id":25021,"nodeType":"ParameterList","parameters":[],"src":"14262:0:228"},"scope":25484,"src":"14159:291:228","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":25067,"nodeType":"Block","src":"14830:52:228","statements":[{"expression":{"baseExpression":{"baseExpression":{"expression":{"id":25060,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25051,"src":"14847:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25061,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14849:9:228","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":24382,"src":"14847:11:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":25063,"indexExpression":{"id":25062,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25053,"src":"14859:5:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14847:18:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":25065,"indexExpression":{"id":25064,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25055,"src":"14866:8:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14847:28:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":25059,"id":25066,"nodeType":"Return","src":"14840:35:228"}]},"documentation":{"id":25048,"nodeType":"StructuredDocumentation","src":"14456:254:228","text":"@notice Retrieves the approval status of an operator for a given owner.\n @param owner Address of the authorisation giver.\n @param operator Address of the operator.\n @return approved True if the operator is approved, false if not."},"id":25068,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"14724:16:228","nodeType":"FunctionDefinition","parameters":{"id":25056,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25051,"mutability":"mutable","name":"s","nameLocation":"14756:1:228","nodeType":"VariableDeclaration","scope":25068,"src":"14741:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25050,"nodeType":"UserDefinedTypeName","pathNode":{"id":25049,"name":"Layout","nameLocations":["14741:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"14741:6:228"},"referencedDeclaration":24383,"src":"14741:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25053,"mutability":"mutable","name":"owner","nameLocation":"14767:5:228","nodeType":"VariableDeclaration","scope":25068,"src":"14759:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25052,"name":"address","nodeType":"ElementaryTypeName","src":"14759:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25055,"mutability":"mutable","name":"operator","nameLocation":"14782:8:228","nodeType":"VariableDeclaration","scope":25068,"src":"14774:16:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25054,"name":"address","nodeType":"ElementaryTypeName","src":"14774:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"14740:51:228"},"returnParameters":{"id":25059,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25058,"mutability":"mutable","name":"approved","nameLocation":"14820:8:228","nodeType":"VariableDeclaration","scope":25068,"src":"14815:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":25057,"name":"bool","nodeType":"ElementaryTypeName","src":"14815:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"14814:15:228"},"scope":25484,"src":"14715:167:228","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":25098,"nodeType":"Block","src":"15344:116:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":25086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25081,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25074,"src":"15358:5:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":25084,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15375:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":25083,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15367:7:228","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":25082,"name":"address","nodeType":"ElementaryTypeName","src":"15367:7:228","typeDescriptions":{}}},"id":25085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15367:10:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15358:19:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25090,"nodeType":"IfStatement","src":"15354:61:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":25087,"name":"ERC1155BalanceOfAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23571,"src":"15386:27:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":25088,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15386:29:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25089,"nodeType":"RevertStatement","src":"15379:36:228"}},{"expression":{"baseExpression":{"baseExpression":{"expression":{"id":25091,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25072,"src":"15432:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25092,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15434:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"15432:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25094,"indexExpression":{"id":25093,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25076,"src":"15443:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15432:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25096,"indexExpression":{"id":25095,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25074,"src":"15447:5:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"15432:21:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":25080,"id":25097,"nodeType":"Return","src":"15425:28:228"}]},"documentation":{"id":25069,"nodeType":"StructuredDocumentation","src":"14888:347:228","text":"@notice Retrieves the balance of `id` owned by account `owner`.\n @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\n @param owner The account to retrieve the balance of.\n @param id The identifier to retrieve the balance of.\n @return balance The balance of `id` owned by account `owner`."},"id":25099,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"15249:9:228","nodeType":"FunctionDefinition","parameters":{"id":25077,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25072,"mutability":"mutable","name":"s","nameLocation":"15274:1:228","nodeType":"VariableDeclaration","scope":25099,"src":"15259:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25071,"nodeType":"UserDefinedTypeName","pathNode":{"id":25070,"name":"Layout","nameLocations":["15259:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"15259:6:228"},"referencedDeclaration":24383,"src":"15259:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25074,"mutability":"mutable","name":"owner","nameLocation":"15285:5:228","nodeType":"VariableDeclaration","scope":25099,"src":"15277:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25073,"name":"address","nodeType":"ElementaryTypeName","src":"15277:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25076,"mutability":"mutable","name":"id","nameLocation":"15300:2:228","nodeType":"VariableDeclaration","scope":25099,"src":"15292:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25075,"name":"uint256","nodeType":"ElementaryTypeName","src":"15292:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15258:45:228"},"returnParameters":{"id":25080,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25079,"mutability":"mutable","name":"balance","nameLocation":"15335:7:228","nodeType":"VariableDeclaration","scope":25099,"src":"15327:15:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25078,"name":"uint256","nodeType":"ElementaryTypeName","src":"15327:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"15326:17:228"},"scope":25484,"src":"15240:220:228","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":25162,"nodeType":"Block","src":"16075:278:228","statements":[{"assignments":[25116],"declarations":[{"constant":false,"id":25116,"mutability":"mutable","name":"length","nameLocation":"16093:6:228","nodeType":"VariableDeclaration","scope":25162,"src":"16085:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25115,"name":"uint256","nodeType":"ElementaryTypeName","src":"16085:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25119,"initialValue":{"expression":{"id":25117,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25106,"src":"16102:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":25118,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16109:6:228","memberName":"length","nodeType":"MemberAccess","src":"16102:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"16085:30:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25120,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25116,"src":"16129:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":25121,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25109,"src":"16139:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":25122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16143:6:228","memberName":"length","nodeType":"MemberAccess","src":"16139:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16129:20:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25127,"nodeType":"IfStatement","src":"16125:59:228","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":25124,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"16158:24:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":25125,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16158:26:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25126,"nodeType":"RevertStatement","src":"16151:33:228"}},{"expression":{"id":25135,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":25128,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25113,"src":"16195:8:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":25132,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25106,"src":"16220:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":25133,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16227:6:228","memberName":"length","nodeType":"MemberAccess","src":"16220:13:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25131,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"16206:13:228","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[] memory)"},"typeName":{"baseType":{"id":25129,"name":"uint256","nodeType":"ElementaryTypeName","src":"16210:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25130,"nodeType":"ArrayTypeName","src":"16210:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"id":25134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16206:28:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"src":"16195:39:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":25136,"nodeType":"ExpressionStatement","src":"16195:39:228"},{"body":{"id":25160,"nodeType":"Block","src":"16278:69:228","statements":[{"expression":{"id":25158,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":25146,"name":"balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25113,"src":"16292:8:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":25148,"indexExpression":{"id":25147,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25138,"src":"16301:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"16292:11:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":25151,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25106,"src":"16318:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":25153,"indexExpression":{"id":25152,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25138,"src":"16325:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16318:9:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":25154,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25109,"src":"16329:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":25156,"indexExpression":{"id":25155,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25138,"src":"16333:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16329:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":25149,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25103,"src":"16306:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25150,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16308:9:228","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":25099,"src":"16306:11:228","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$24383_storage_ptr_$_t_address_$_t_uint256_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$24383_storage_ptr_$","typeString":"function (struct ERC1155Storage.Layout storage pointer,address,uint256) view returns (uint256)"}},"id":25157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16306:30:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16292:44:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25159,"nodeType":"ExpressionStatement","src":"16292:44:228"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25142,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25140,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25138,"src":"16261:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":25141,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25116,"src":"16265:6:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16261:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25161,"initializationExpression":{"assignments":[25138],"declarations":[{"constant":false,"id":25138,"mutability":"mutable","name":"i","nameLocation":"16258:1:228","nodeType":"VariableDeclaration","scope":25161,"src":"16250:9:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25137,"name":"uint256","nodeType":"ElementaryTypeName","src":"16250:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25139,"nodeType":"VariableDeclarationStatement","src":"16250:9:228"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":25144,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"16273:3:228","subExpression":{"id":25143,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25138,"src":"16275:1:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25145,"nodeType":"ExpressionStatement","src":"16273:3:228"},"nodeType":"ForStatement","src":"16245:102:228"}]},"documentation":{"id":25100,"nodeType":"StructuredDocumentation","src":"15466:461:228","text":"@notice Retrieves the balances of `ids` owned by accounts `owners`.\n @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\n @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\n @param owners The addresses of the token holders\n @param ids The identifiers to retrieve the balance of.\n @return balances The balances of `ids` owned by accounts `owners`."},"id":25163,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOfBatch","nameLocation":"15941:14:228","nodeType":"FunctionDefinition","parameters":{"id":25110,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25103,"mutability":"mutable","name":"s","nameLocation":"15971:1:228","nodeType":"VariableDeclaration","scope":25163,"src":"15956:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25102,"nodeType":"UserDefinedTypeName","pathNode":{"id":25101,"name":"Layout","nameLocations":["15956:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"15956:6:228"},"referencedDeclaration":24383,"src":"15956:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25106,"mutability":"mutable","name":"owners","nameLocation":"15993:6:228","nodeType":"VariableDeclaration","scope":25163,"src":"15974:25:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":25104,"name":"address","nodeType":"ElementaryTypeName","src":"15974:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":25105,"nodeType":"ArrayTypeName","src":"15974:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":25109,"mutability":"mutable","name":"ids","nameLocation":"16020:3:228","nodeType":"VariableDeclaration","scope":25163,"src":"16001:22:228","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":25107,"name":"uint256","nodeType":"ElementaryTypeName","src":"16001:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25108,"nodeType":"ArrayTypeName","src":"16001:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"15955:69:228"},"returnParameters":{"id":25114,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25113,"mutability":"mutable","name":"balances","nameLocation":"16065:8:228","nodeType":"VariableDeclaration","scope":25163,"src":"16048:25:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":25111,"name":"uint256","nodeType":"ElementaryTypeName","src":"16048:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25112,"nodeType":"ArrayTypeName","src":"16048:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"16047:27:228"},"scope":25484,"src":"15932:421:228","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":25174,"nodeType":"Block","src":"16418:115:228","statements":[{"assignments":[25170],"declarations":[{"constant":false,"id":25170,"mutability":"mutable","name":"position","nameLocation":"16436:8:228","nodeType":"VariableDeclaration","scope":25174,"src":"16428:16:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":25169,"name":"bytes32","nodeType":"ElementaryTypeName","src":"16428:7:228","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":25172,"initialValue":{"id":25171,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24396,"src":"16447:19:228","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"16428:38:228"},{"AST":{"nativeSrc":"16485:42:228","nodeType":"YulBlock","src":"16485:42:228","statements":[{"nativeSrc":"16499:18:228","nodeType":"YulAssignment","src":"16499:18:228","value":{"name":"position","nativeSrc":"16509:8:228","nodeType":"YulIdentifier","src":"16509:8:228"},"variableNames":[{"name":"s.slot","nativeSrc":"16499:6:228","nodeType":"YulIdentifier","src":"16499:6:228"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":25170,"isOffset":false,"isSlot":false,"src":"16509:8:228","valueSize":1},{"declaration":25167,"isOffset":false,"isSlot":true,"src":"16499:6:228","suffix":"slot","valueSize":1}],"id":25173,"nodeType":"InlineAssembly","src":"16476:51:228"}]},"id":25175,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"16368:6:228","nodeType":"FunctionDefinition","parameters":{"id":25164,"nodeType":"ParameterList","parameters":[],"src":"16374:2:228"},"returnParameters":{"id":25168,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25167,"mutability":"mutable","name":"s","nameLocation":"16415:1:228","nodeType":"VariableDeclaration","scope":25175,"src":"16400:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25166,"nodeType":"UserDefinedTypeName","pathNode":{"id":25165,"name":"Layout","nameLocations":["16400:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"16400:6:228"},"referencedDeclaration":24383,"src":"16400:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"}],"src":"16399:18:228"},"scope":25484,"src":"16359:174:228","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":25200,"nodeType":"Block","src":"16958:73:228","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":25198,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":25190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25188,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25181,"src":"16976:5:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":25189,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25183,"src":"16985:7:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16976:16:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":25191,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"16975:18:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"baseExpression":{"baseExpression":{"expression":{"id":25192,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25179,"src":"16997:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25193,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16999:9:228","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":24382,"src":"16997:11:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":25195,"indexExpression":{"id":25194,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25181,"src":"17009:5:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16997:18:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":25197,"indexExpression":{"id":25196,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25183,"src":"17016:7:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16997:27:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"16975:49:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":25187,"id":25199,"nodeType":"Return","src":"16968:56:228"}]},"documentation":{"id":25176,"nodeType":"StructuredDocumentation","src":"16539:302:228","text":"@notice Returns whether an account is authorised to make a transfer on behalf of an owner.\n @param owner The token owner.\n @param account The account to check the operatability of.\n @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise."},"id":25201,"implemented":true,"kind":"function","modifiers":[],"name":"_isOperatable","nameLocation":"16855:13:228","nodeType":"FunctionDefinition","parameters":{"id":25184,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25179,"mutability":"mutable","name":"s","nameLocation":"16884:1:228","nodeType":"VariableDeclaration","scope":25201,"src":"16869:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25178,"nodeType":"UserDefinedTypeName","pathNode":{"id":25177,"name":"Layout","nameLocations":["16869:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"16869:6:228"},"referencedDeclaration":24383,"src":"16869:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25181,"mutability":"mutable","name":"owner","nameLocation":"16895:5:228","nodeType":"VariableDeclaration","scope":25201,"src":"16887:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25180,"name":"address","nodeType":"ElementaryTypeName","src":"16887:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25183,"mutability":"mutable","name":"account","nameLocation":"16910:7:228","nodeType":"VariableDeclaration","scope":25201,"src":"16902:15:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25182,"name":"address","nodeType":"ElementaryTypeName","src":"16902:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"16868:50:228"},"returnParameters":{"id":25187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25186,"mutability":"mutable","name":"operatable","nameLocation":"16946:10:228","nodeType":"VariableDeclaration","scope":25201,"src":"16941:15:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":25185,"name":"bool","nodeType":"ElementaryTypeName","src":"16941:4:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"16940:17:228"},"scope":25484,"src":"16846:185:228","stateMutability":"view","virtual":false,"visibility":"private"},{"body":{"id":25298,"nodeType":"Block","src":"17140:712:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25217,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25215,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25212,"src":"17154:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":25216,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17163:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"17154:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25297,"nodeType":"IfStatement","src":"17150:696:228","trueBody":{"id":25296,"nodeType":"Block","src":"17166:680:228","statements":[{"assignments":[25219],"declarations":[{"constant":false,"id":25219,"mutability":"mutable","name":"fromBalance","nameLocation":"17188:11:228","nodeType":"VariableDeclaration","scope":25296,"src":"17180:19:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25218,"name":"uint256","nodeType":"ElementaryTypeName","src":"17180:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25226,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":25220,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25204,"src":"17202:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25221,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17204:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"17202:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25223,"indexExpression":{"id":25222,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17213:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17202:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25225,"indexExpression":{"id":25224,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25206,"src":"17217:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17202:20:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17180:42:228"},{"id":25295,"nodeType":"UncheckedBlock","src":"17236:600:228","statements":[{"assignments":[25228],"declarations":[{"constant":false,"id":25228,"mutability":"mutable","name":"newFromBalance","nameLocation":"17272:14:228","nodeType":"VariableDeclaration","scope":25295,"src":"17264:22:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25227,"name":"uint256","nodeType":"ElementaryTypeName","src":"17264:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25232,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25229,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25219,"src":"17289:11:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":25230,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25212,"src":"17303:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17289:19:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17264:44:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25233,"name":"newFromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25228,"src":"17330:14:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":25234,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25219,"src":"17348:11:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17330:29:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25243,"nodeType":"IfStatement","src":"17326:98:228","trueBody":{"errorCall":{"arguments":[{"id":25237,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25206,"src":"17395:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25238,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17401:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25239,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25219,"src":"17405:11:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25240,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25212,"src":"17418:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25236,"name":"ERC1155InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23537,"src":"17368:26:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":25241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17368:56:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25242,"nodeType":"RevertStatement","src":"17361:63:228"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":25246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25244,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25206,"src":"17446:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":25245,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25208,"src":"17454:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"17446:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25294,"nodeType":"IfStatement","src":"17442:380:228","trueBody":{"id":25293,"nodeType":"Block","src":"17458:364:228","statements":[{"assignments":[25248],"declarations":[{"constant":false,"id":25248,"mutability":"mutable","name":"toBalance","nameLocation":"17488:9:228","nodeType":"VariableDeclaration","scope":25293,"src":"17480:17:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25247,"name":"uint256","nodeType":"ElementaryTypeName","src":"17480:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25255,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":25249,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25204,"src":"17500:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25250,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17502:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"17500:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25252,"indexExpression":{"id":25251,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17511:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17500:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25254,"indexExpression":{"id":25253,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25208,"src":"17515:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17500:18:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17480:38:228"},{"assignments":[25257],"declarations":[{"constant":false,"id":25257,"mutability":"mutable","name":"newToBalance","nameLocation":"17548:12:228","nodeType":"VariableDeclaration","scope":25293,"src":"17540:20:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25256,"name":"uint256","nodeType":"ElementaryTypeName","src":"17540:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25261,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25258,"name":"toBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25248,"src":"17563:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":25259,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25212,"src":"17575:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17563:17:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17540:40:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25262,"name":"newToBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25257,"src":"17606:12:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":25263,"name":"toBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25248,"src":"17622:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17606:25:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25272,"nodeType":"IfStatement","src":"17602:86:228","trueBody":{"errorCall":{"arguments":[{"id":25266,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25208,"src":"17663:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25267,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17667:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25268,"name":"toBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25248,"src":"17671:9:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25269,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25212,"src":"17682:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25265,"name":"ERC1155BalanceOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23548,"src":"17640:22:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":25270,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17640:48:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25271,"nodeType":"RevertStatement","src":"17633:55:228"}},{"expression":{"id":25281,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":25273,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25204,"src":"17711:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25277,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17713:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"17711:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25278,"indexExpression":{"id":25275,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17722:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17711:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25279,"indexExpression":{"id":25276,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25206,"src":"17726:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17711:20:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":25280,"name":"newFromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25228,"src":"17734:14:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17711:37:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25282,"nodeType":"ExpressionStatement","src":"17711:37:228"},{"expression":{"id":25291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":25283,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25204,"src":"17770:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25287,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17772:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"17770:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25288,"indexExpression":{"id":25285,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25210,"src":"17781:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17770:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25289,"indexExpression":{"id":25286,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25208,"src":"17785:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"17770:18:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":25290,"name":"newToBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25257,"src":"17791:12:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17770:33:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25292,"nodeType":"ExpressionStatement","src":"17770:33:228"}]}}]}]}}]},"id":25299,"implemented":true,"kind":"function","modifiers":[],"name":"_transferToken","nameLocation":"17046:14:228","nodeType":"FunctionDefinition","parameters":{"id":25213,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25204,"mutability":"mutable","name":"s","nameLocation":"17076:1:228","nodeType":"VariableDeclaration","scope":25299,"src":"17061:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25203,"nodeType":"UserDefinedTypeName","pathNode":{"id":25202,"name":"Layout","nameLocations":["17061:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"17061:6:228"},"referencedDeclaration":24383,"src":"17061:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25206,"mutability":"mutable","name":"from","nameLocation":"17087:4:228","nodeType":"VariableDeclaration","scope":25299,"src":"17079:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25205,"name":"address","nodeType":"ElementaryTypeName","src":"17079:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25208,"mutability":"mutable","name":"to","nameLocation":"17101:2:228","nodeType":"VariableDeclaration","scope":25299,"src":"17093:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25207,"name":"address","nodeType":"ElementaryTypeName","src":"17093:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25210,"mutability":"mutable","name":"id","nameLocation":"17113:2:228","nodeType":"VariableDeclaration","scope":25299,"src":"17105:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25209,"name":"uint256","nodeType":"ElementaryTypeName","src":"17105:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":25212,"mutability":"mutable","name":"value","nameLocation":"17125:5:228","nodeType":"VariableDeclaration","scope":25299,"src":"17117:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25211,"name":"uint256","nodeType":"ElementaryTypeName","src":"17117:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17060:71:228"},"returnParameters":{"id":25214,"nodeType":"ParameterList","parameters":[],"src":"17140:0:228"},"scope":25484,"src":"17037:815:228","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":25353,"nodeType":"Block","src":"17943:336:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25313,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25311,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25308,"src":"17957:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":25312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"17966:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"17957:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25352,"nodeType":"IfStatement","src":"17953:320:228","trueBody":{"id":25351,"nodeType":"Block","src":"17969:304:228","statements":[{"id":25350,"nodeType":"UncheckedBlock","src":"17983:280:228","statements":[{"assignments":[25315],"declarations":[{"constant":false,"id":25315,"mutability":"mutable","name":"balance","nameLocation":"18019:7:228","nodeType":"VariableDeclaration","scope":25350,"src":"18011:15:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25314,"name":"uint256","nodeType":"ElementaryTypeName","src":"18011:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25322,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":25316,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25302,"src":"18029:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25317,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18031:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"18029:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25319,"indexExpression":{"id":25318,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25306,"src":"18040:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18029:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25321,"indexExpression":{"id":25320,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25304,"src":"18044:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18029:18:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18011:36:228"},{"assignments":[25324],"declarations":[{"constant":false,"id":25324,"mutability":"mutable","name":"newBalance","nameLocation":"18073:10:228","nodeType":"VariableDeclaration","scope":25350,"src":"18065:18:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25323,"name":"uint256","nodeType":"ElementaryTypeName","src":"18065:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25328,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25327,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25325,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25315,"src":"18086:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":25326,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25308,"src":"18096:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18086:15:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18065:36:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25331,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25329,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25324,"src":"18123:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":25330,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25315,"src":"18137:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18123:21:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25339,"nodeType":"IfStatement","src":"18119:80:228","trueBody":{"errorCall":{"arguments":[{"id":25333,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25304,"src":"18176:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25334,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25306,"src":"18180:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25335,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25315,"src":"18184:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25336,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25308,"src":"18193:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25332,"name":"ERC1155BalanceOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23548,"src":"18153:22:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":25337,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18153:46:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25338,"nodeType":"RevertStatement","src":"18146:53:228"}},{"expression":{"id":25348,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":25340,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25302,"src":"18217:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25344,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18219:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"18217:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25345,"indexExpression":{"id":25342,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25306,"src":"18228:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18217:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25346,"indexExpression":{"id":25343,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25304,"src":"18232:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18217:18:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":25347,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25324,"src":"18238:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18217:31:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25349,"nodeType":"ExpressionStatement","src":"18217:31:228"}]}]}}]},"id":25354,"implemented":true,"kind":"function","modifiers":[],"name":"_mintToken","nameLocation":"17867:10:228","nodeType":"FunctionDefinition","parameters":{"id":25309,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25302,"mutability":"mutable","name":"s","nameLocation":"17893:1:228","nodeType":"VariableDeclaration","scope":25354,"src":"17878:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25301,"nodeType":"UserDefinedTypeName","pathNode":{"id":25300,"name":"Layout","nameLocations":["17878:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"17878:6:228"},"referencedDeclaration":24383,"src":"17878:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25304,"mutability":"mutable","name":"to","nameLocation":"17904:2:228","nodeType":"VariableDeclaration","scope":25354,"src":"17896:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25303,"name":"address","nodeType":"ElementaryTypeName","src":"17896:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25306,"mutability":"mutable","name":"id","nameLocation":"17916:2:228","nodeType":"VariableDeclaration","scope":25354,"src":"17908:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25305,"name":"uint256","nodeType":"ElementaryTypeName","src":"17908:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":25308,"mutability":"mutable","name":"value","nameLocation":"17928:5:228","nodeType":"VariableDeclaration","scope":25354,"src":"17920:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25307,"name":"uint256","nodeType":"ElementaryTypeName","src":"17920:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"17877:57:228"},"returnParameters":{"id":25310,"nodeType":"ParameterList","parameters":[],"src":"17943:0:228"},"scope":25484,"src":"17858:421:228","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":25408,"nodeType":"Block","src":"18372:342:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25366,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25363,"src":"18386:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":25367,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18395:1:228","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"18386:10:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25407,"nodeType":"IfStatement","src":"18382:326:228","trueBody":{"id":25406,"nodeType":"Block","src":"18398:310:228","statements":[{"assignments":[25370],"declarations":[{"constant":false,"id":25370,"mutability":"mutable","name":"balance","nameLocation":"18420:7:228","nodeType":"VariableDeclaration","scope":25406,"src":"18412:15:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25369,"name":"uint256","nodeType":"ElementaryTypeName","src":"18412:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25377,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":25371,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25357,"src":"18430:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25372,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18432:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"18430:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25374,"indexExpression":{"id":25373,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25361,"src":"18441:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18430:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25376,"indexExpression":{"id":25375,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25359,"src":"18445:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18430:20:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18412:38:228"},{"id":25405,"nodeType":"UncheckedBlock","src":"18464:234:228","statements":[{"assignments":[25379],"declarations":[{"constant":false,"id":25379,"mutability":"mutable","name":"newBalance","nameLocation":"18500:10:228","nodeType":"VariableDeclaration","scope":25405,"src":"18492:18:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25378,"name":"uint256","nodeType":"ElementaryTypeName","src":"18492:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":25383,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25380,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25370,"src":"18513:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":25381,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25363,"src":"18523:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18513:15:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18492:36:228"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":25386,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":25384,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25379,"src":"18550:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":25385,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25370,"src":"18564:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18550:21:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25394,"nodeType":"IfStatement","src":"18546:86:228","trueBody":{"errorCall":{"arguments":[{"id":25388,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25359,"src":"18607:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25389,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25361,"src":"18613:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25390,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25370,"src":"18617:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25391,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25363,"src":"18626:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25387,"name":"ERC1155InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23537,"src":"18580:26:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256,uint256) pure returns (error)"}},"id":25392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18580:52:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25393,"nodeType":"RevertStatement","src":"18573:59:228"}},{"expression":{"id":25403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":25395,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25357,"src":"18650:1:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout storage pointer"}},"id":25399,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18652:8:228","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":24376,"src":"18650:10:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(uint256 => mapping(address => uint256))"}},"id":25400,"indexExpression":{"id":25397,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25361,"src":"18661:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18650:14:228","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":25401,"indexExpression":{"id":25398,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25359,"src":"18665:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18650:20:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":25402,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25379,"src":"18673:10:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18650:33:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25404,"nodeType":"ExpressionStatement","src":"18650:33:228"}]}]}}]},"id":25409,"implemented":true,"kind":"function","modifiers":[],"name":"_burnToken","nameLocation":"18294:10:228","nodeType":"FunctionDefinition","parameters":{"id":25364,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25357,"mutability":"mutable","name":"s","nameLocation":"18320:1:228","nodeType":"VariableDeclaration","scope":25409,"src":"18305:16:228","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"},"typeName":{"id":25356,"nodeType":"UserDefinedTypeName","pathNode":{"id":25355,"name":"Layout","nameLocations":["18305:6:228"],"nodeType":"IdentifierPath","referencedDeclaration":24383,"src":"18305:6:228"},"referencedDeclaration":24383,"src":"18305:6:228","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$24383_storage_ptr","typeString":"struct ERC1155Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":25359,"mutability":"mutable","name":"from","nameLocation":"18331:4:228","nodeType":"VariableDeclaration","scope":25409,"src":"18323:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25358,"name":"address","nodeType":"ElementaryTypeName","src":"18323:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25361,"mutability":"mutable","name":"id","nameLocation":"18345:2:228","nodeType":"VariableDeclaration","scope":25409,"src":"18337:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25360,"name":"uint256","nodeType":"ElementaryTypeName","src":"18337:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":25363,"mutability":"mutable","name":"value","nameLocation":"18357:5:228","nodeType":"VariableDeclaration","scope":25409,"src":"18349:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25362,"name":"uint256","nodeType":"ElementaryTypeName","src":"18349:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18304:59:228"},"returnParameters":{"id":25365,"nodeType":"ParameterList","parameters":[],"src":"18372:0:228"},"scope":25484,"src":"18285:429:228","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":25444,"nodeType":"Block","src":"19342:185:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":25436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":25429,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25412,"src":"19400:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25430,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25414,"src":"19408:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25431,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25418,"src":"19414:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25432,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25420,"src":"19418:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25433,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25422,"src":"19425:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":25426,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25416,"src":"19378:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":25425,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"19356:21:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}},"id":25427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19356:25:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155TokenReceiver_$24324","typeString":"contract IERC1155TokenReceiver"}},"id":25428,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"19382:17:228","memberName":"onERC1155Received","nodeType":"MemberAccess","referencedDeclaration":24305,"src":"19356:43:228","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,uint256,bytes memory) external returns (bytes4)"}},"id":25434,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19356:74:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":25435,"name":"ERC1155_SINGLE_RECEIVED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24401,"src":"19434:23:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"19356:101:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25443,"nodeType":"IfStatement","src":"19352:168:228","trueBody":{"errorCall":{"arguments":[{"id":25438,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25416,"src":"19506:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25439,"name":"id","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25418,"src":"19510:2:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":25440,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25420,"src":"19514:5:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":25437,"name":"ERC1155SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23557,"src":"19478:27:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":25441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19478:42:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25442,"nodeType":"RevertStatement","src":"19471:49:228"}}]},"documentation":{"id":25410,"nodeType":"StructuredDocumentation","src":"18720:489:228","text":"@notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\n @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n @param sender The message sender.\n @param from Previous token owner.\n @param to New token owner.\n @param id Identifier of the token transferred.\n @param value Value transferred.\n @param data Optional data to send along with the receiver contract call."},"id":25445,"implemented":true,"kind":"function","modifiers":[],"name":"_callOnERC1155Received","nameLocation":"19223:22:228","nodeType":"FunctionDefinition","parameters":{"id":25423,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25412,"mutability":"mutable","name":"sender","nameLocation":"19254:6:228","nodeType":"VariableDeclaration","scope":25445,"src":"19246:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25411,"name":"address","nodeType":"ElementaryTypeName","src":"19246:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25414,"mutability":"mutable","name":"from","nameLocation":"19270:4:228","nodeType":"VariableDeclaration","scope":25445,"src":"19262:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25413,"name":"address","nodeType":"ElementaryTypeName","src":"19262:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25416,"mutability":"mutable","name":"to","nameLocation":"19284:2:228","nodeType":"VariableDeclaration","scope":25445,"src":"19276:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25415,"name":"address","nodeType":"ElementaryTypeName","src":"19276:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25418,"mutability":"mutable","name":"id","nameLocation":"19296:2:228","nodeType":"VariableDeclaration","scope":25445,"src":"19288:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25417,"name":"uint256","nodeType":"ElementaryTypeName","src":"19288:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":25420,"mutability":"mutable","name":"value","nameLocation":"19308:5:228","nodeType":"VariableDeclaration","scope":25445,"src":"19300:13:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":25419,"name":"uint256","nodeType":"ElementaryTypeName","src":"19300:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":25422,"mutability":"mutable","name":"data","nameLocation":"19328:4:228","nodeType":"VariableDeclaration","scope":25445,"src":"19315:17:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":25421,"name":"bytes","nodeType":"ElementaryTypeName","src":"19315:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"19245:88:228"},"returnParameters":{"id":25424,"nodeType":"ParameterList","parameters":[],"src":"19342:0:228"},"scope":25484,"src":"19214:313:228","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":25482,"nodeType":"Block","src":"20249:198:228","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":25474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":25467,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25448,"src":"20312:6:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25468,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25450,"src":"20320:4:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25469,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25455,"src":"20326:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":25470,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25458,"src":"20331:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":25471,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25460,"src":"20339:4:228","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":25464,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25452,"src":"20285:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":25463,"name":"IERC1155TokenReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24324,"src":"20263:21:228","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155TokenReceiver_$24324_$","typeString":"type(contract IERC1155TokenReceiver)"}},"id":25465,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20263:25:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155TokenReceiver_$24324","typeString":"contract IERC1155TokenReceiver"}},"id":25466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"20289:22:228","memberName":"onERC1155BatchReceived","nodeType":"MemberAccess","referencedDeclaration":24323,"src":"20263:48:228","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256[] memory,uint256[] memory,bytes memory) external returns (bytes4)"}},"id":25472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20263:81:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":25473,"name":"ERC1155_BATCH_RECEIVED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24406,"src":"20348:22:228","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"20263:107:228","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":25481,"nodeType":"IfStatement","src":"20259:181:228","trueBody":{"errorCall":{"arguments":[{"id":25476,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25452,"src":"20424:2:228","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":25477,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25455,"src":"20428:3:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":25478,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25458,"src":"20433:6:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"id":25475,"name":"ERC1155SafeBatchTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23568,"src":"20391:32:228","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$_t_error_$","typeString":"function (address,uint256[] memory,uint256[] memory) pure returns (error)"}},"id":25479,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20391:49:228","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":25480,"nodeType":"RevertStatement","src":"20384:56:228"}}]},"documentation":{"id":25446,"nodeType":"StructuredDocumentation","src":"19533:504:228","text":"@notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\n @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\n @param sender The message sender.\n @param from Previous token owner.\n @param to New token owner.\n @param ids Identifiers of the tokens transferred.\n @param values Values transferred.\n @param data Optional data to send along with the receiver contract call."},"id":25483,"implemented":true,"kind":"function","modifiers":[],"name":"_callOnERC1155BatchReceived","nameLocation":"20051:27:228","nodeType":"FunctionDefinition","parameters":{"id":25461,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25448,"mutability":"mutable","name":"sender","nameLocation":"20096:6:228","nodeType":"VariableDeclaration","scope":25483,"src":"20088:14:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25447,"name":"address","nodeType":"ElementaryTypeName","src":"20088:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25450,"mutability":"mutable","name":"from","nameLocation":"20120:4:228","nodeType":"VariableDeclaration","scope":25483,"src":"20112:12:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25449,"name":"address","nodeType":"ElementaryTypeName","src":"20112:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25452,"mutability":"mutable","name":"to","nameLocation":"20142:2:228","nodeType":"VariableDeclaration","scope":25483,"src":"20134:10:228","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25451,"name":"address","nodeType":"ElementaryTypeName","src":"20134:7:228","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":25455,"mutability":"mutable","name":"ids","nameLocation":"20171:3:228","nodeType":"VariableDeclaration","scope":25483,"src":"20154:20:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":25453,"name":"uint256","nodeType":"ElementaryTypeName","src":"20154:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25454,"nodeType":"ArrayTypeName","src":"20154:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":25458,"mutability":"mutable","name":"values","nameLocation":"20201:6:228","nodeType":"VariableDeclaration","scope":25483,"src":"20184:23:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":25456,"name":"uint256","nodeType":"ElementaryTypeName","src":"20184:7:228","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":25457,"nodeType":"ArrayTypeName","src":"20184:9:228","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":25460,"mutability":"mutable","name":"data","nameLocation":"20230:4:228","nodeType":"VariableDeclaration","scope":25483,"src":"20217:17:228","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":25459,"name":"bytes","nodeType":"ElementaryTypeName","src":"20217:5:228","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"20078:162:228"},"returnParameters":{"id":25462,"nodeType":"ParameterList","parameters":[],"src":"20249:0:228"},"scope":25484,"src":"20042:405:228","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":25485,"src":"1252:19197:228","usedErrors":[],"usedEvents":[]}],"src":"32:20418:228"},"id":228},"contracts/token/ERC1155/preset/ERC1155Full.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/preset/ERC1155Full.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC1155Deliverable":[22620],"ERC1155Full":[25587],"ERC1155Metadata":[22665],"ERC1155Mintable":[22689],"ERC1155WithOperatorFilterer":[22771],"ERC2981":[36915],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"TokenRecovery":[19661]},"id":25588,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":25486,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:229"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":25488,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":13387,"src":"57:87:229","symbolAliases":[{"foreign":{"id":25487,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":25490,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":36705,"src":"145:94:229","symbolAliases":[{"foreign":{"id":25489,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../royalty/interfaces/IOperatorFilterRegistry.sol","id":25492,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":37475,"src":"240:95:229","symbolAliases":[{"foreign":{"id":25491,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"248:23:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol","file":"./../ERC1155WithOperatorFilterer.sol","id":25494,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":22772,"src":"336:81:229","symbolAliases":[{"foreign":{"id":25493,"name":"ERC1155WithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22771,"src":"344:27:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Metadata.sol","file":"./../ERC1155Metadata.sol","id":25496,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":22666,"src":"418:57:229","symbolAliases":[{"foreign":{"id":25495,"name":"ERC1155Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22665,"src":"426:15:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Mintable.sol","file":"./../ERC1155Mintable.sol","id":25498,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":22690,"src":"476:57:229","symbolAliases":[{"foreign":{"id":25497,"name":"ERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22689,"src":"484:15:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Deliverable.sol","file":"./../ERC1155Deliverable.sol","id":25500,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":22621,"src":"534:63:229","symbolAliases":[{"foreign":{"id":25499,"name":"ERC1155Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22620,"src":"542:18:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/ERC2981.sol","file":"./../../royalty/ERC2981.sol","id":25502,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":36916,"src":"598:52:229","symbolAliases":[{"foreign":{"id":25501,"name":"ERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36915,"src":"606:7:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":25504,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":7935,"src":"651:74:229","symbolAliases":[{"foreign":{"id":25503,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"659:17:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":25506,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":19662,"src":"726:68:229","symbolAliases":[{"foreign":{"id":25505,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"734:13:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":25508,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":1207,"src":"795:66:229","symbolAliases":[{"foreign":{"id":25507,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"803:7:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":25510,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":13298,"src":"862:101:229","symbolAliases":[{"foreign":{"id":25509,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"870:28:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":25512,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25588,"sourceUnit":13143,"src":"964:88:229","symbolAliases":[{"foreign":{"id":25511,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"972:24:229","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":25513,"name":"ERC1155WithOperatorFilterer","nameLocations":["1082:27:229"],"nodeType":"IdentifierPath","referencedDeclaration":22771,"src":"1082:27:229"},"id":25514,"nodeType":"InheritanceSpecifier","src":"1082:27:229"},{"baseName":{"id":25515,"name":"ERC1155Metadata","nameLocations":["1115:15:229"],"nodeType":"IdentifierPath","referencedDeclaration":22665,"src":"1115:15:229"},"id":25516,"nodeType":"InheritanceSpecifier","src":"1115:15:229"},{"baseName":{"id":25517,"name":"ERC1155Mintable","nameLocations":["1136:15:229"],"nodeType":"IdentifierPath","referencedDeclaration":22689,"src":"1136:15:229"},"id":25518,"nodeType":"InheritanceSpecifier","src":"1136:15:229"},{"baseName":{"id":25519,"name":"ERC1155Deliverable","nameLocations":["1157:18:229"],"nodeType":"IdentifierPath","referencedDeclaration":22620,"src":"1157:18:229"},"id":25520,"nodeType":"InheritanceSpecifier","src":"1157:18:229"},{"baseName":{"id":25521,"name":"ERC2981","nameLocations":["1181:7:229"],"nodeType":"IdentifierPath","referencedDeclaration":36915,"src":"1181:7:229"},"id":25522,"nodeType":"InheritanceSpecifier","src":"1181:7:229"},{"baseName":{"id":25523,"name":"TokenRecovery","nameLocations":["1194:13:229"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1194:13:229"},"id":25524,"nodeType":"InheritanceSpecifier","src":"1194:13:229"},{"baseName":{"id":25525,"name":"ForwarderRegistryContext","nameLocations":["1213:24:229"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1213:24:229"},"id":25526,"nodeType":"InheritanceSpecifier","src":"1213:24:229"}],"canonicalName":"ERC1155Full","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":25587,"linearizedBaseContracts":[25587,13142,13370,13297,19661,36915,22620,22689,7901,22665,23201,24244,24256,36683,22771,7934,11554,11579,8139,19810,37012,37280,8091,23064,23308,37073,23509,1206,8562,19938,8546,24223,24286,24178],"name":"ERC1155Full","nameLocation":"1063:11:229","nodeType":"ContractDefinition","nodes":[{"body":{"id":25557,"nodeType":"Block","src":"1685:2:229","statements":[]},"id":25558,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":25542,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1499:3:229","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":25543,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1503:6:229","memberName":"sender","nodeType":"MemberAccess","src":"1499:10:229","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":25544,"kind":"baseConstructorSpecifier","modifierName":{"id":25541,"name":"ContractOwnership","nameLocations":["1481:17:229"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1481:17:229"},"nodeType":"ModifierInvocation","src":"1481:29:229"},{"arguments":[{"id":25546,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25528,"src":"1535:9:229","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":25547,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25530,"src":"1546:11:229","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":25548,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25533,"src":"1559:16:229","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"id":25549,"kind":"baseConstructorSpecifier","modifierName":{"id":25545,"name":"ERC1155Metadata","nameLocations":["1519:15:229"],"nodeType":"IdentifierPath","referencedDeclaration":22665,"src":"1519:15:229"},"nodeType":"ModifierInvocation","src":"1519:57:229"},{"arguments":[{"id":25551,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25536,"src":"1613:14:229","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"id":25552,"kind":"baseConstructorSpecifier","modifierName":{"id":25550,"name":"ERC1155WithOperatorFilterer","nameLocations":["1585:27:229"],"nodeType":"IdentifierPath","referencedDeclaration":22771,"src":"1585:27:229"},"nodeType":"ModifierInvocation","src":"1585:43:229"},{"arguments":[{"id":25554,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25539,"src":"1662:17:229","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":25555,"kind":"baseConstructorSpecifier","modifierName":{"id":25553,"name":"ForwarderRegistryContext","nameLocations":["1637:24:229"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1637:24:229"},"nodeType":"ModifierInvocation","src":"1637:43:229"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":25540,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25528,"mutability":"mutable","name":"tokenName","nameLocation":"1279:9:229","nodeType":"VariableDeclaration","scope":25558,"src":"1265:23:229","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":25527,"name":"string","nodeType":"ElementaryTypeName","src":"1265:6:229","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25530,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1312:11:229","nodeType":"VariableDeclaration","scope":25558,"src":"1298:25:229","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":25529,"name":"string","nodeType":"ElementaryTypeName","src":"1298:6:229","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25533,"mutability":"mutable","name":"metadataResolver","nameLocation":"1356:16:229","nodeType":"VariableDeclaration","scope":25558,"src":"1333:39:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":25532,"nodeType":"UserDefinedTypeName","pathNode":{"id":25531,"name":"ITokenMetadataResolver","nameLocations":["1333:22:229"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1333:22:229"},"referencedDeclaration":36704,"src":"1333:22:229","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":25536,"mutability":"mutable","name":"filterRegistry","nameLocation":"1406:14:229","nodeType":"VariableDeclaration","scope":25558,"src":"1382:38:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":25535,"nodeType":"UserDefinedTypeName","pathNode":{"id":25534,"name":"IOperatorFilterRegistry","nameLocations":["1382:23:229"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1382:23:229"},"referencedDeclaration":37474,"src":"1382:23:229","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":25539,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1449:17:229","nodeType":"VariableDeclaration","scope":25558,"src":"1430:36:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":25538,"nodeType":"UserDefinedTypeName","pathNode":{"id":25537,"name":"IForwarderRegistry","nameLocations":["1430:18:229"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1430:18:229"},"referencedDeclaration":13386,"src":"1430:18:229","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1255:217:229"},"returnParameters":{"id":25556,"nodeType":"ParameterList","parameters":[],"src":"1685:0:229"},"scope":25587,"src":"1244:443:229","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":25571,"nodeType":"Block","src":"1852:65:229","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25567,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1869:28:229","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1898:10:229","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1869:39:229","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":25569,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1869:41:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":25566,"id":25570,"nodeType":"Return","src":"1862:48:229"}]},"documentation":{"id":25559,"nodeType":"StructuredDocumentation","src":"1693:44:229","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25572,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1751:10:229","nodeType":"FunctionDefinition","overrides":{"id":25563,"nodeType":"OverrideSpecifier","overrides":[{"id":25561,"name":"Context","nameLocations":["1795:7:229"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1795:7:229"},{"id":25562,"name":"ForwarderRegistryContextBase","nameLocations":["1804:28:229"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1804:28:229"}],"src":"1786:47:229"},"parameters":{"id":25560,"nodeType":"ParameterList","parameters":[],"src":"1761:2:229"},"returnParameters":{"id":25566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25565,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25572,"src":"1843:7:229","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25564,"name":"address","nodeType":"ElementaryTypeName","src":"1843:7:229","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1842:9:229"},"scope":25587,"src":"1742:175:229","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":25585,"nodeType":"Block","src":"2087:63:229","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25581,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2104:28:229","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25582,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2133:8:229","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2104:37:229","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":25583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2104:39:229","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":25580,"id":25584,"nodeType":"Return","src":"2097:46:229"}]},"documentation":{"id":25573,"nodeType":"StructuredDocumentation","src":"1923:44:229","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25586,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1981:8:229","nodeType":"FunctionDefinition","overrides":{"id":25577,"nodeType":"OverrideSpecifier","overrides":[{"id":25575,"name":"Context","nameLocations":["2023:7:229"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2023:7:229"},{"id":25576,"name":"ForwarderRegistryContextBase","nameLocations":["2032:28:229"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2032:28:229"}],"src":"2014:47:229"},"parameters":{"id":25574,"nodeType":"ParameterList","parameters":[],"src":"1989:2:229"},"returnParameters":{"id":25580,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25579,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25586,"src":"2071:14:229","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":25578,"name":"bytes","nodeType":"ElementaryTypeName","src":"2071:5:229","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2070:16:229"},"scope":25587,"src":"1972:178:229","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":25588,"src":"1054:1098:229","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:2121:229"},"id":229},"contracts/token/ERC1155/preset/ERC1155FullBurn.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/preset/ERC1155FullBurn.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC1155Burnable":[22596],"ERC1155Deliverable":[22620],"ERC1155FullBurn":[25694],"ERC1155Metadata":[22665],"ERC1155Mintable":[22689],"ERC1155WithOperatorFilterer":[22771],"ERC2981":[36915],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"TokenRecovery":[19661]},"id":25695,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":25589,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:230"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":25591,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":13387,"src":"57:87:230","symbolAliases":[{"foreign":{"id":25590,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":25593,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":36705,"src":"145:94:230","symbolAliases":[{"foreign":{"id":25592,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../royalty/interfaces/IOperatorFilterRegistry.sol","id":25595,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":37475,"src":"240:95:230","symbolAliases":[{"foreign":{"id":25594,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"248:23:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol","file":"./../ERC1155WithOperatorFilterer.sol","id":25597,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":22772,"src":"336:81:230","symbolAliases":[{"foreign":{"id":25596,"name":"ERC1155WithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22771,"src":"344:27:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Metadata.sol","file":"./../ERC1155Metadata.sol","id":25599,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":22666,"src":"418:57:230","symbolAliases":[{"foreign":{"id":25598,"name":"ERC1155Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22665,"src":"426:15:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Mintable.sol","file":"./../ERC1155Mintable.sol","id":25601,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":22690,"src":"476:57:230","symbolAliases":[{"foreign":{"id":25600,"name":"ERC1155Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22689,"src":"484:15:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Deliverable.sol","file":"./../ERC1155Deliverable.sol","id":25603,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":22621,"src":"534:63:230","symbolAliases":[{"foreign":{"id":25602,"name":"ERC1155Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22620,"src":"542:18:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/ERC1155Burnable.sol","file":"./../ERC1155Burnable.sol","id":25605,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":22597,"src":"598:57:230","symbolAliases":[{"foreign":{"id":25604,"name":"ERC1155Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22596,"src":"606:15:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/ERC2981.sol","file":"./../../royalty/ERC2981.sol","id":25607,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":36916,"src":"656:52:230","symbolAliases":[{"foreign":{"id":25606,"name":"ERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36915,"src":"664:7:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":25609,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":7935,"src":"709:74:230","symbolAliases":[{"foreign":{"id":25608,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"717:17:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":25611,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":19662,"src":"784:68:230","symbolAliases":[{"foreign":{"id":25610,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"792:13:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":25613,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":1207,"src":"853:66:230","symbolAliases":[{"foreign":{"id":25612,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"861:7:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":25615,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":13298,"src":"920:101:230","symbolAliases":[{"foreign":{"id":25614,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"928:28:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":25617,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25695,"sourceUnit":13143,"src":"1022:88:230","symbolAliases":[{"foreign":{"id":25616,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1030:24:230","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":25618,"name":"ERC1155WithOperatorFilterer","nameLocations":["1144:27:230"],"nodeType":"IdentifierPath","referencedDeclaration":22771,"src":"1144:27:230"},"id":25619,"nodeType":"InheritanceSpecifier","src":"1144:27:230"},{"baseName":{"id":25620,"name":"ERC1155Metadata","nameLocations":["1177:15:230"],"nodeType":"IdentifierPath","referencedDeclaration":22665,"src":"1177:15:230"},"id":25621,"nodeType":"InheritanceSpecifier","src":"1177:15:230"},{"baseName":{"id":25622,"name":"ERC1155Mintable","nameLocations":["1198:15:230"],"nodeType":"IdentifierPath","referencedDeclaration":22689,"src":"1198:15:230"},"id":25623,"nodeType":"InheritanceSpecifier","src":"1198:15:230"},{"baseName":{"id":25624,"name":"ERC1155Deliverable","nameLocations":["1219:18:230"],"nodeType":"IdentifierPath","referencedDeclaration":22620,"src":"1219:18:230"},"id":25625,"nodeType":"InheritanceSpecifier","src":"1219:18:230"},{"baseName":{"id":25626,"name":"ERC1155Burnable","nameLocations":["1243:15:230"],"nodeType":"IdentifierPath","referencedDeclaration":22596,"src":"1243:15:230"},"id":25627,"nodeType":"InheritanceSpecifier","src":"1243:15:230"},{"baseName":{"id":25628,"name":"ERC2981","nameLocations":["1264:7:230"],"nodeType":"IdentifierPath","referencedDeclaration":36915,"src":"1264:7:230"},"id":25629,"nodeType":"InheritanceSpecifier","src":"1264:7:230"},{"baseName":{"id":25630,"name":"TokenRecovery","nameLocations":["1277:13:230"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1277:13:230"},"id":25631,"nodeType":"InheritanceSpecifier","src":"1277:13:230"},{"baseName":{"id":25632,"name":"ForwarderRegistryContext","nameLocations":["1296:24:230"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1296:24:230"},"id":25633,"nodeType":"InheritanceSpecifier","src":"1296:24:230"}],"canonicalName":"ERC1155FullBurn","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":25694,"linearizedBaseContracts":[25694,13142,13370,13297,19661,36915,22596,22995,22620,22689,7901,22665,23201,24244,24256,36683,22771,7934,11554,11579,8139,19810,37012,37280,8091,23064,23308,37073,23509,1206,8562,19938,24204,8546,24223,24286,24178],"name":"ERC1155FullBurn","nameLocation":"1121:15:230","nodeType":"ContractDefinition","nodes":[{"body":{"id":25664,"nodeType":"Block","src":"1768:2:230","statements":[]},"id":25665,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":25649,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1582:3:230","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":25650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1586:6:230","memberName":"sender","nodeType":"MemberAccess","src":"1582:10:230","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":25651,"kind":"baseConstructorSpecifier","modifierName":{"id":25648,"name":"ContractOwnership","nameLocations":["1564:17:230"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1564:17:230"},"nodeType":"ModifierInvocation","src":"1564:29:230"},{"arguments":[{"id":25653,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25635,"src":"1618:9:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":25654,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25637,"src":"1629:11:230","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":25655,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25640,"src":"1642:16:230","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"id":25656,"kind":"baseConstructorSpecifier","modifierName":{"id":25652,"name":"ERC1155Metadata","nameLocations":["1602:15:230"],"nodeType":"IdentifierPath","referencedDeclaration":22665,"src":"1602:15:230"},"nodeType":"ModifierInvocation","src":"1602:57:230"},{"arguments":[{"id":25658,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25643,"src":"1696:14:230","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"id":25659,"kind":"baseConstructorSpecifier","modifierName":{"id":25657,"name":"ERC1155WithOperatorFilterer","nameLocations":["1668:27:230"],"nodeType":"IdentifierPath","referencedDeclaration":22771,"src":"1668:27:230"},"nodeType":"ModifierInvocation","src":"1668:43:230"},{"arguments":[{"id":25661,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25646,"src":"1745:17:230","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":25662,"kind":"baseConstructorSpecifier","modifierName":{"id":25660,"name":"ForwarderRegistryContext","nameLocations":["1720:24:230"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1720:24:230"},"nodeType":"ModifierInvocation","src":"1720:43:230"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":25647,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25635,"mutability":"mutable","name":"tokenName","nameLocation":"1362:9:230","nodeType":"VariableDeclaration","scope":25665,"src":"1348:23:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":25634,"name":"string","nodeType":"ElementaryTypeName","src":"1348:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25637,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1395:11:230","nodeType":"VariableDeclaration","scope":25665,"src":"1381:25:230","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":25636,"name":"string","nodeType":"ElementaryTypeName","src":"1381:6:230","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25640,"mutability":"mutable","name":"metadataResolver","nameLocation":"1439:16:230","nodeType":"VariableDeclaration","scope":25665,"src":"1416:39:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":25639,"nodeType":"UserDefinedTypeName","pathNode":{"id":25638,"name":"ITokenMetadataResolver","nameLocations":["1416:22:230"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1416:22:230"},"referencedDeclaration":36704,"src":"1416:22:230","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":25643,"mutability":"mutable","name":"filterRegistry","nameLocation":"1489:14:230","nodeType":"VariableDeclaration","scope":25665,"src":"1465:38:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":25642,"nodeType":"UserDefinedTypeName","pathNode":{"id":25641,"name":"IOperatorFilterRegistry","nameLocations":["1465:23:230"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1465:23:230"},"referencedDeclaration":37474,"src":"1465:23:230","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":25646,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1532:17:230","nodeType":"VariableDeclaration","scope":25665,"src":"1513:36:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":25645,"nodeType":"UserDefinedTypeName","pathNode":{"id":25644,"name":"IForwarderRegistry","nameLocations":["1513:18:230"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1513:18:230"},"referencedDeclaration":13386,"src":"1513:18:230","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1338:217:230"},"returnParameters":{"id":25663,"nodeType":"ParameterList","parameters":[],"src":"1768:0:230"},"scope":25694,"src":"1327:443:230","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":25678,"nodeType":"Block","src":"1935:65:230","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25674,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1952:28:230","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1981:10:230","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1952:39:230","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":25676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1952:41:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":25673,"id":25677,"nodeType":"Return","src":"1945:48:230"}]},"documentation":{"id":25666,"nodeType":"StructuredDocumentation","src":"1776:44:230","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25679,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1834:10:230","nodeType":"FunctionDefinition","overrides":{"id":25670,"nodeType":"OverrideSpecifier","overrides":[{"id":25668,"name":"Context","nameLocations":["1878:7:230"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1878:7:230"},{"id":25669,"name":"ForwarderRegistryContextBase","nameLocations":["1887:28:230"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1887:28:230"}],"src":"1869:47:230"},"parameters":{"id":25667,"nodeType":"ParameterList","parameters":[],"src":"1844:2:230"},"returnParameters":{"id":25673,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25672,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25679,"src":"1926:7:230","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25671,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:230","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1925:9:230"},"scope":25694,"src":"1825:175:230","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":25692,"nodeType":"Block","src":"2170:63:230","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25688,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2187:28:230","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25689,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2216:8:230","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2187:37:230","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":25690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2187:39:230","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":25687,"id":25691,"nodeType":"Return","src":"2180:46:230"}]},"documentation":{"id":25680,"nodeType":"StructuredDocumentation","src":"2006:44:230","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25693,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2064:8:230","nodeType":"FunctionDefinition","overrides":{"id":25684,"nodeType":"OverrideSpecifier","overrides":[{"id":25682,"name":"Context","nameLocations":["2106:7:230"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2106:7:230"},{"id":25683,"name":"ForwarderRegistryContextBase","nameLocations":["2115:28:230"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2115:28:230"}],"src":"2097:47:230"},"parameters":{"id":25681,"nodeType":"ParameterList","parameters":[],"src":"2072:2:230"},"returnParameters":{"id":25687,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25686,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25693,"src":"2154:14:230","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":25685,"name":"bytes","nodeType":"ElementaryTypeName","src":"2154:5:230","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2153:16:230"},"scope":25694,"src":"2055:178:230","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":25695,"src":"1112:1123:230","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:2204:230"},"id":230},"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC1155BurnableBase":[22995],"ERC1155DeliverableBase":[23064],"ERC1155FullBurnProxied":[25886],"ERC1155MetadataBase":[23201],"ERC1155MintableBase":[23308],"ERC1155Storage":[25484],"ERC1155WithOperatorFiltererBase":[23509],"ERC2981Base":[37012],"ERC2981Storage":[37657],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"InterfaceDetection":[11554],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870],"TokenMetadataStorage":[36891],"TokenRecoveryBase":[19810]},"id":25887,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":25696,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:231"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":25698,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":13387,"src":"57:90:231","symbolAliases":[{"foreign":{"id":25697,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../metadata/interfaces/ITokenMetadataResolver.sol","id":25700,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":36705,"src":"148:97:231","symbolAliases":[{"foreign":{"id":25699,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"156:22:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../royalty/interfaces/IOperatorFilterRegistry.sol","id":25702,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":37475,"src":"246:98:231","symbolAliases":[{"foreign":{"id":25701,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"254:23:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../../libraries/ERC1155Storage.sol","id":25704,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":25485,"src":"345:68:231","symbolAliases":[{"foreign":{"id":25703,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"353:14:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../../../royalty/libraries/ERC2981Storage.sol","id":25706,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":37658,"src":"414:79:231","symbolAliases":[{"foreign":{"id":25705,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"422:14:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../../metadata/libraries/TokenMetadataStorage.sol","id":25708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":36892,"src":"494:92:231","symbolAliases":[{"foreign":{"id":25707,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"502:20:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../../royalty/libraries/OperatorFiltererStorage.sol","id":25710,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":37871,"src":"587:97:231","symbolAliases":[{"foreign":{"id":25709,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"595:23:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":25712,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":9110,"src":"685:101:231","symbolAliases":[{"foreign":{"id":25711,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"693:24:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol","file":"./../../base/ERC1155WithOperatorFiltererBase.sol","id":25714,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":23510,"src":"787:97:231","symbolAliases":[{"foreign":{"id":25713,"name":"ERC1155WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23509,"src":"795:31:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MetadataBase.sol","file":"./../../base/ERC1155MetadataBase.sol","id":25716,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":23202,"src":"885:73:231","symbolAliases":[{"foreign":{"id":25715,"name":"ERC1155MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23201,"src":"893:19:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","file":"./../../base/ERC1155MintableBase.sol","id":25718,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":23309,"src":"959:73:231","symbolAliases":[{"foreign":{"id":25717,"name":"ERC1155MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23308,"src":"967:19:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol","file":"./../../base/ERC1155DeliverableBase.sol","id":25720,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":23065,"src":"1033:79:231","symbolAliases":[{"foreign":{"id":25719,"name":"ERC1155DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23064,"src":"1041:22:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155BurnableBase.sol","file":"./../../base/ERC1155BurnableBase.sol","id":25722,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":22996,"src":"1113:73:231","symbolAliases":[{"foreign":{"id":25721,"name":"ERC1155BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":22995,"src":"1121:19:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../../../royalty/base/ERC2981Base.sol","id":25724,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":37013,"src":"1187:68:231","symbolAliases":[{"foreign":{"id":25723,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"1195:11:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../../../royalty/base/OperatorFiltererBase.sol","id":25726,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":37074,"src":"1256:86:231","symbolAliases":[{"foreign":{"id":25725,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"1264:20:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":25728,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":8140,"src":"1343:90:231","symbolAliases":[{"foreign":{"id":25727,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1351:21:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":25730,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":8092,"src":"1434:82:231","symbolAliases":[{"foreign":{"id":25729,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1442:17:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":25732,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":19811,"src":"1517:84:231","symbolAliases":[{"foreign":{"id":25731,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1525:17:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":25734,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":11555,"src":"1602:86:231","symbolAliases":[{"foreign":{"id":25733,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1610:18:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":25736,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":1207,"src":"1689:66:231","symbolAliases":[{"foreign":{"id":25735,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1697:7:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":25738,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":13298,"src":"1756:104:231","symbolAliases":[{"foreign":{"id":25737,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1764:28:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":25740,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":25887,"sourceUnit":13143,"src":"1861:91:231","symbolAliases":[{"foreign":{"id":25739,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1869:24:231","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":25741,"name":"ERC1155WithOperatorFiltererBase","nameLocations":["1993:31:231"],"nodeType":"IdentifierPath","referencedDeclaration":23509,"src":"1993:31:231"},"id":25742,"nodeType":"InheritanceSpecifier","src":"1993:31:231"},{"baseName":{"id":25743,"name":"ERC1155MetadataBase","nameLocations":["2030:19:231"],"nodeType":"IdentifierPath","referencedDeclaration":23201,"src":"2030:19:231"},"id":25744,"nodeType":"InheritanceSpecifier","src":"2030:19:231"},{"baseName":{"id":25745,"name":"ERC1155MintableBase","nameLocations":["2055:19:231"],"nodeType":"IdentifierPath","referencedDeclaration":23308,"src":"2055:19:231"},"id":25746,"nodeType":"InheritanceSpecifier","src":"2055:19:231"},{"baseName":{"id":25747,"name":"ERC1155DeliverableBase","nameLocations":["2080:22:231"],"nodeType":"IdentifierPath","referencedDeclaration":23064,"src":"2080:22:231"},"id":25748,"nodeType":"InheritanceSpecifier","src":"2080:22:231"},{"baseName":{"id":25749,"name":"ERC1155BurnableBase","nameLocations":["2108:19:231"],"nodeType":"IdentifierPath","referencedDeclaration":22995,"src":"2108:19:231"},"id":25750,"nodeType":"InheritanceSpecifier","src":"2108:19:231"},{"baseName":{"id":25751,"name":"ERC2981Base","nameLocations":["2133:11:231"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"2133:11:231"},"id":25752,"nodeType":"InheritanceSpecifier","src":"2133:11:231"},{"baseName":{"id":25753,"name":"OperatorFiltererBase","nameLocations":["2150:20:231"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"2150:20:231"},"id":25754,"nodeType":"InheritanceSpecifier","src":"2150:20:231"},{"baseName":{"id":25755,"name":"ContractOwnershipBase","nameLocations":["2176:21:231"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2176:21:231"},"id":25756,"nodeType":"InheritanceSpecifier","src":"2176:21:231"},{"baseName":{"id":25757,"name":"AccessControlBase","nameLocations":["2203:17:231"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2203:17:231"},"id":25758,"nodeType":"InheritanceSpecifier","src":"2203:17:231"},{"baseName":{"id":25759,"name":"TokenRecoveryBase","nameLocations":["2226:17:231"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2226:17:231"},"id":25760,"nodeType":"InheritanceSpecifier","src":"2226:17:231"},{"baseName":{"id":25761,"name":"InterfaceDetection","nameLocations":["2249:18:231"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2249:18:231"},"id":25762,"nodeType":"InheritanceSpecifier","src":"2249:18:231"},{"baseName":{"id":25763,"name":"ForwarderRegistryContext","nameLocations":["2273:24:231"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2273:24:231"},"id":25764,"nodeType":"InheritanceSpecifier","src":"2273:24:231"}],"canonicalName":"ERC1155FullBurnProxied","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":25886,"linearizedBaseContracts":[25886,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,22995,23064,23308,23201,24244,24256,36683,23509,1206,19938,8546,8562,24204,24223,24286,24178],"name":"ERC1155FullBurnProxied","nameLocation":"1963:22:231","nodeType":"ContractDefinition","nodes":[{"global":false,"id":25768,"libraryName":{"id":25765,"name":"ContractOwnershipStorage","nameLocations":["2310:24:231"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2310:24:231"},"nodeType":"UsingForDirective","src":"2304:67:231","typeName":{"id":25767,"nodeType":"UserDefinedTypeName","pathNode":{"id":25766,"name":"ContractOwnershipStorage.Layout","nameLocations":["2339:24:231","2364:6:231"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2339:31:231"},"referencedDeclaration":8882,"src":"2339:31:231","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":25772,"libraryName":{"id":25769,"name":"TokenMetadataStorage","nameLocations":["2382:20:231"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"2382:20:231"},"nodeType":"UsingForDirective","src":"2376:59:231","typeName":{"id":25771,"nodeType":"UserDefinedTypeName","pathNode":{"id":25770,"name":"TokenMetadataStorage.Layout","nameLocations":["2407:20:231","2428:6:231"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2407:27:231"},"referencedDeclaration":36718,"src":"2407:27:231","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"global":false,"id":25776,"libraryName":{"id":25773,"name":"OperatorFiltererStorage","nameLocations":["2446:23:231"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"2446:23:231"},"nodeType":"UsingForDirective","src":"2440:65:231","typeName":{"id":25775,"nodeType":"UserDefinedTypeName","pathNode":{"id":25774,"name":"OperatorFiltererStorage.Layout","nameLocations":["2474:23:231","2498:6:231"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2474:30:231"},"referencedDeclaration":37673,"src":"2474:30:231","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":25785,"nodeType":"Block","src":"2605:2:231","statements":[]},"id":25786,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":25782,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25779,"src":"2586:17:231","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":25783,"kind":"baseConstructorSpecifier","modifierName":{"id":25781,"name":"ForwarderRegistryContext","nameLocations":["2561:24:231"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2561:24:231"},"nodeType":"ModifierInvocation","src":"2561:43:231"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":25780,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25779,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2542:17:231","nodeType":"VariableDeclaration","scope":25786,"src":"2523:36:231","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":25778,"nodeType":"UserDefinedTypeName","pathNode":{"id":25777,"name":"IForwarderRegistry","nameLocations":["2523:18:231"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2523:18:231"},"referencedDeclaration":13386,"src":"2523:18:231","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2522:38:231"},"returnParameters":{"id":25784,"nodeType":"ParameterList","parameters":[],"src":"2605:0:231"},"scope":25886,"src":"2511:96:231","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":25856,"nodeType":"Block","src":"2811:485:231","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":25804,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[25871],"referencedDeclaration":25871,"src":"2865:10:231","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":25805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2865:12:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25799,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2821:24:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":25801,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2846:6:231","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2821:31:231","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":25802,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2821:33:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":25803,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2855:9:231","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2821:43:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":25806,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2821:57:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25807,"nodeType":"ExpressionStatement","src":"2821:57:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25808,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2888:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2903:4:231","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"2888:19:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2888:21:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25812,"nodeType":"ExpressionStatement","src":"2888:21:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25813,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2919:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25815,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2934:22:231","memberName":"initERC1155MetadataURI","nodeType":"MemberAccess","referencedDeclaration":24440,"src":"2919:37:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25816,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2919:39:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25817,"nodeType":"ExpressionStatement","src":"2919:39:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25818,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2968:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2983:19:231","memberName":"initERC1155Mintable","nodeType":"MemberAccess","referencedDeclaration":24457,"src":"2968:34:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25821,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2968:36:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25822,"nodeType":"ExpressionStatement","src":"2968:36:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25823,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"3014:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25825,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3029:22:231","memberName":"initERC1155Deliverable","nodeType":"MemberAccess","referencedDeclaration":24474,"src":"3014:37:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3014:39:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25827,"nodeType":"ExpressionStatement","src":"3014:39:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25828,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"3063:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3078:19:231","memberName":"initERC1155Burnable","nodeType":"MemberAccess","referencedDeclaration":24491,"src":"3063:34:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25831,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3063:36:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25832,"nodeType":"ExpressionStatement","src":"3063:36:231"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25833,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"3109:14:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":25835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3124:4:231","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"3109:19:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25836,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3109:21:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25837,"nodeType":"ExpressionStatement","src":"3109:21:231"},{"expression":{"arguments":[{"id":25843,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25788,"src":"3180:9:231","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":25844,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25790,"src":"3191:11:231","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":25845,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25793,"src":"3204:16:231","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25838,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"3140:20:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":25840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3161:6:231","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"3140:27:231","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":25841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3140:29:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":25842,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3170:9:231","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"3140:39:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":25846,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3140:81:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25847,"nodeType":"ExpressionStatement","src":"3140:81:231"},{"expression":{"arguments":[{"id":25853,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25796,"src":"3274:14:231","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25848,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"3231:23:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":25850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3255:6:231","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"3231:30:231","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":25851,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3231:32:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":25852,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3264:9:231","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"3231:42:231","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":25854,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3231:58:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25855,"nodeType":"ExpressionStatement","src":"3231:58:231"}]},"functionSelector":"0e07f854","id":25857,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2622:4:231","nodeType":"FunctionDefinition","parameters":{"id":25797,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25788,"mutability":"mutable","name":"tokenName","nameLocation":"2652:9:231","nodeType":"VariableDeclaration","scope":25857,"src":"2636:25:231","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":25787,"name":"string","nodeType":"ElementaryTypeName","src":"2636:6:231","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25790,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2687:11:231","nodeType":"VariableDeclaration","scope":25857,"src":"2671:27:231","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":25789,"name":"string","nodeType":"ElementaryTypeName","src":"2671:6:231","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25793,"mutability":"mutable","name":"metadataResolver","nameLocation":"2731:16:231","nodeType":"VariableDeclaration","scope":25857,"src":"2708:39:231","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":25792,"nodeType":"UserDefinedTypeName","pathNode":{"id":25791,"name":"ITokenMetadataResolver","nameLocations":["2708:22:231"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2708:22:231"},"referencedDeclaration":36704,"src":"2708:22:231","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":25796,"mutability":"mutable","name":"filterRegistry","nameLocation":"2781:14:231","nodeType":"VariableDeclaration","scope":25857,"src":"2757:38:231","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":25795,"nodeType":"UserDefinedTypeName","pathNode":{"id":25794,"name":"IOperatorFilterRegistry","nameLocations":["2757:23:231"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2757:23:231"},"referencedDeclaration":37474,"src":"2757:23:231","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2626:175:231"},"returnParameters":{"id":25798,"nodeType":"ParameterList","parameters":[],"src":"2811:0:231"},"scope":25886,"src":"2613:683:231","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":25870,"nodeType":"Block","src":"3461:65:231","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25866,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3478:28:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25867,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3507:10:231","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3478:39:231","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":25868,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3478:41:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":25865,"id":25869,"nodeType":"Return","src":"3471:48:231"}]},"documentation":{"id":25858,"nodeType":"StructuredDocumentation","src":"3302:44:231","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25871,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3360:10:231","nodeType":"FunctionDefinition","overrides":{"id":25862,"nodeType":"OverrideSpecifier","overrides":[{"id":25860,"name":"Context","nameLocations":["3404:7:231"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3404:7:231"},{"id":25861,"name":"ForwarderRegistryContextBase","nameLocations":["3413:28:231"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3413:28:231"}],"src":"3395:47:231"},"parameters":{"id":25859,"nodeType":"ParameterList","parameters":[],"src":"3370:2:231"},"returnParameters":{"id":25865,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25864,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25871,"src":"3452:7:231","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":25863,"name":"address","nodeType":"ElementaryTypeName","src":"3452:7:231","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3451:9:231"},"scope":25886,"src":"3351:175:231","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":25884,"nodeType":"Block","src":"3696:63:231","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25880,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3713:28:231","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":25881,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3742:8:231","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3713:37:231","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":25882,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3713:39:231","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":25879,"id":25883,"nodeType":"Return","src":"3706:46:231"}]},"documentation":{"id":25872,"nodeType":"StructuredDocumentation","src":"3532:44:231","text":"@inheritdoc ForwarderRegistryContextBase"},"id":25885,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3590:8:231","nodeType":"FunctionDefinition","overrides":{"id":25876,"nodeType":"OverrideSpecifier","overrides":[{"id":25874,"name":"Context","nameLocations":["3632:7:231"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3632:7:231"},{"id":25875,"name":"ForwarderRegistryContextBase","nameLocations":["3641:28:231"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3641:28:231"}],"src":"3623:47:231"},"parameters":{"id":25873,"nodeType":"ParameterList","parameters":[],"src":"3598:2:231"},"returnParameters":{"id":25879,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25878,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":25885,"src":"3680:14:231","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":25877,"name":"bytes","nodeType":"ElementaryTypeName","src":"3680:5:231","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3679:16:231"},"scope":25886,"src":"3581:178:231","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":25887,"src":"1954:1807:231","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:3730:231"},"id":231},"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC1155DeliverableBase":[23064],"ERC1155FullProxied":[26069],"ERC1155MetadataBase":[23201],"ERC1155MintableBase":[23308],"ERC1155Storage":[25484],"ERC1155WithOperatorFiltererBase":[23509],"ERC2981Base":[37012],"ERC2981Storage":[37657],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"InterfaceDetection":[11554],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870],"TokenMetadataStorage":[36891],"TokenRecoveryBase":[19810]},"id":26070,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":25888,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:232"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":25890,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":13387,"src":"57:90:232","symbolAliases":[{"foreign":{"id":25889,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../metadata/interfaces/ITokenMetadataResolver.sol","id":25892,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":36705,"src":"148:97:232","symbolAliases":[{"foreign":{"id":25891,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"156:22:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../royalty/interfaces/IOperatorFilterRegistry.sol","id":25894,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":37475,"src":"246:98:232","symbolAliases":[{"foreign":{"id":25893,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"254:23:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/libraries/ERC1155Storage.sol","file":"./../../libraries/ERC1155Storage.sol","id":25896,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":25485,"src":"345:68:232","symbolAliases":[{"foreign":{"id":25895,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"353:14:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../../../royalty/libraries/ERC2981Storage.sol","id":25898,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":37658,"src":"414:79:232","symbolAliases":[{"foreign":{"id":25897,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"422:14:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../../metadata/libraries/TokenMetadataStorage.sol","id":25900,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":36892,"src":"494:92:232","symbolAliases":[{"foreign":{"id":25899,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"502:20:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../../royalty/libraries/OperatorFiltererStorage.sol","id":25902,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":37871,"src":"587:97:232","symbolAliases":[{"foreign":{"id":25901,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"595:23:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":25904,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":9110,"src":"685:101:232","symbolAliases":[{"foreign":{"id":25903,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"693:24:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol","file":"./../../base/ERC1155WithOperatorFiltererBase.sol","id":25906,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":23510,"src":"787:97:232","symbolAliases":[{"foreign":{"id":25905,"name":"ERC1155WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23509,"src":"795:31:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MetadataBase.sol","file":"./../../base/ERC1155MetadataBase.sol","id":25908,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":23202,"src":"885:73:232","symbolAliases":[{"foreign":{"id":25907,"name":"ERC1155MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23201,"src":"893:19:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155MintableBase.sol","file":"./../../base/ERC1155MintableBase.sol","id":25910,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":23309,"src":"959:73:232","symbolAliases":[{"foreign":{"id":25909,"name":"ERC1155MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23308,"src":"967:19:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol","file":"./../../base/ERC1155DeliverableBase.sol","id":25912,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":23065,"src":"1033:79:232","symbolAliases":[{"foreign":{"id":25911,"name":"ERC1155DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":23064,"src":"1041:22:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../../../royalty/base/ERC2981Base.sol","id":25914,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":37013,"src":"1113:68:232","symbolAliases":[{"foreign":{"id":25913,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"1121:11:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../../../royalty/base/OperatorFiltererBase.sol","id":25916,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":37074,"src":"1182:86:232","symbolAliases":[{"foreign":{"id":25915,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"1190:20:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":25918,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":8140,"src":"1269:90:232","symbolAliases":[{"foreign":{"id":25917,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1277:21:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":25920,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":8092,"src":"1360:82:232","symbolAliases":[{"foreign":{"id":25919,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1368:17:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":25922,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":19811,"src":"1443:84:232","symbolAliases":[{"foreign":{"id":25921,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1451:17:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":25924,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":11555,"src":"1528:86:232","symbolAliases":[{"foreign":{"id":25923,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1536:18:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":25926,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":1207,"src":"1615:66:232","symbolAliases":[{"foreign":{"id":25925,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1623:7:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":25928,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":13298,"src":"1682:104:232","symbolAliases":[{"foreign":{"id":25927,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1690:28:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":25930,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26070,"sourceUnit":13143,"src":"1787:91:232","symbolAliases":[{"foreign":{"id":25929,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1795:24:232","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":25931,"name":"ERC1155WithOperatorFiltererBase","nameLocations":["1915:31:232"],"nodeType":"IdentifierPath","referencedDeclaration":23509,"src":"1915:31:232"},"id":25932,"nodeType":"InheritanceSpecifier","src":"1915:31:232"},{"baseName":{"id":25933,"name":"ERC1155MetadataBase","nameLocations":["1952:19:232"],"nodeType":"IdentifierPath","referencedDeclaration":23201,"src":"1952:19:232"},"id":25934,"nodeType":"InheritanceSpecifier","src":"1952:19:232"},{"baseName":{"id":25935,"name":"ERC1155MintableBase","nameLocations":["1977:19:232"],"nodeType":"IdentifierPath","referencedDeclaration":23308,"src":"1977:19:232"},"id":25936,"nodeType":"InheritanceSpecifier","src":"1977:19:232"},{"baseName":{"id":25937,"name":"ERC1155DeliverableBase","nameLocations":["2002:22:232"],"nodeType":"IdentifierPath","referencedDeclaration":23064,"src":"2002:22:232"},"id":25938,"nodeType":"InheritanceSpecifier","src":"2002:22:232"},{"baseName":{"id":25939,"name":"ERC2981Base","nameLocations":["2030:11:232"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"2030:11:232"},"id":25940,"nodeType":"InheritanceSpecifier","src":"2030:11:232"},{"baseName":{"id":25941,"name":"OperatorFiltererBase","nameLocations":["2047:20:232"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"2047:20:232"},"id":25942,"nodeType":"InheritanceSpecifier","src":"2047:20:232"},{"baseName":{"id":25943,"name":"ContractOwnershipBase","nameLocations":["2073:21:232"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2073:21:232"},"id":25944,"nodeType":"InheritanceSpecifier","src":"2073:21:232"},{"baseName":{"id":25945,"name":"AccessControlBase","nameLocations":["2100:17:232"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2100:17:232"},"id":25946,"nodeType":"InheritanceSpecifier","src":"2100:17:232"},{"baseName":{"id":25947,"name":"TokenRecoveryBase","nameLocations":["2123:17:232"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2123:17:232"},"id":25948,"nodeType":"InheritanceSpecifier","src":"2123:17:232"},{"baseName":{"id":25949,"name":"InterfaceDetection","nameLocations":["2146:18:232"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2146:18:232"},"id":25950,"nodeType":"InheritanceSpecifier","src":"2146:18:232"},{"baseName":{"id":25951,"name":"ForwarderRegistryContext","nameLocations":["2170:24:232"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2170:24:232"},"id":25952,"nodeType":"InheritanceSpecifier","src":"2170:24:232"}],"canonicalName":"ERC1155FullProxied","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":26069,"linearizedBaseContracts":[26069,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,23064,23308,23201,24244,24256,36683,23509,1206,19938,8546,8562,24223,24286,24178],"name":"ERC1155FullProxied","nameLocation":"1889:18:232","nodeType":"ContractDefinition","nodes":[{"global":false,"id":25956,"libraryName":{"id":25953,"name":"TokenMetadataStorage","nameLocations":["2207:20:232"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"2207:20:232"},"nodeType":"UsingForDirective","src":"2201:59:232","typeName":{"id":25955,"nodeType":"UserDefinedTypeName","pathNode":{"id":25954,"name":"TokenMetadataStorage.Layout","nameLocations":["2232:20:232","2253:6:232"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2232:27:232"},"referencedDeclaration":36718,"src":"2232:27:232","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"global":false,"id":25960,"libraryName":{"id":25957,"name":"OperatorFiltererStorage","nameLocations":["2271:23:232"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"2271:23:232"},"nodeType":"UsingForDirective","src":"2265:65:232","typeName":{"id":25959,"nodeType":"UserDefinedTypeName","pathNode":{"id":25958,"name":"OperatorFiltererStorage.Layout","nameLocations":["2299:23:232","2323:6:232"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2299:30:232"},"referencedDeclaration":37673,"src":"2299:30:232","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"global":false,"id":25964,"libraryName":{"id":25961,"name":"ContractOwnershipStorage","nameLocations":["2341:24:232"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2341:24:232"},"nodeType":"UsingForDirective","src":"2335:67:232","typeName":{"id":25963,"nodeType":"UserDefinedTypeName","pathNode":{"id":25962,"name":"ContractOwnershipStorage.Layout","nameLocations":["2370:24:232","2395:6:232"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2370:31:232"},"referencedDeclaration":8882,"src":"2370:31:232","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":25973,"nodeType":"Block","src":"2502:2:232","statements":[]},"id":25974,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":25970,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25967,"src":"2483:17:232","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":25971,"kind":"baseConstructorSpecifier","modifierName":{"id":25969,"name":"ForwarderRegistryContext","nameLocations":["2458:24:232"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2458:24:232"},"nodeType":"ModifierInvocation","src":"2458:43:232"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":25968,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25967,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2439:17:232","nodeType":"VariableDeclaration","scope":25974,"src":"2420:36:232","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":25966,"nodeType":"UserDefinedTypeName","pathNode":{"id":25965,"name":"IForwarderRegistry","nameLocations":["2420:18:232"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2420:18:232"},"referencedDeclaration":13386,"src":"2420:18:232","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2419:38:232"},"returnParameters":{"id":25972,"nodeType":"ParameterList","parameters":[],"src":"2502:0:232"},"scope":26069,"src":"2408:96:232","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":26039,"nodeType":"Block","src":"2708:439:232","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":25992,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[26054],"referencedDeclaration":26054,"src":"2762:10:232","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":25993,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2762:12:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25987,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2718:24:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":25989,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2743:6:232","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2718:31:232","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":25990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2718:33:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":25991,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2752:9:232","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2718:43:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":25994,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2718:57:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":25995,"nodeType":"ExpressionStatement","src":"2718:57:232"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":25996,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2785:14:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":25998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2800:4:232","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":24423,"src":"2785:19:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":25999,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2785:21:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26000,"nodeType":"ExpressionStatement","src":"2785:21:232"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26001,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2816:14:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":26003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2831:22:232","memberName":"initERC1155MetadataURI","nodeType":"MemberAccess","referencedDeclaration":24440,"src":"2816:37:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2816:39:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26005,"nodeType":"ExpressionStatement","src":"2816:39:232"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26006,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2865:14:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":26008,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2880:19:232","memberName":"initERC1155Mintable","nodeType":"MemberAccess","referencedDeclaration":24457,"src":"2865:34:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26009,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2865:36:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26010,"nodeType":"ExpressionStatement","src":"2865:36:232"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26011,"name":"ERC1155Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25484,"src":"2911:14:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC1155Storage_$25484_$","typeString":"type(library ERC1155Storage)"}},"id":26013,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2926:22:232","memberName":"initERC1155Deliverable","nodeType":"MemberAccess","referencedDeclaration":24474,"src":"2911:37:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26014,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2911:39:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26015,"nodeType":"ExpressionStatement","src":"2911:39:232"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26016,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"2960:14:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":26018,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2975:4:232","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"2960:19:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26019,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2960:21:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26020,"nodeType":"ExpressionStatement","src":"2960:21:232"},{"expression":{"arguments":[{"id":26026,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25976,"src":"3031:9:232","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":26027,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25978,"src":"3042:11:232","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":26028,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25981,"src":"3055:16:232","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26021,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"2991:20:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":26023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3012:6:232","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"2991:27:232","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":26024,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2991:29:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":26025,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3021:9:232","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"2991:39:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":26029,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2991:81:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26030,"nodeType":"ExpressionStatement","src":"2991:81:232"},{"expression":{"arguments":[{"id":26036,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":25984,"src":"3125:14:232","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26031,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"3082:23:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":26033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3106:6:232","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"3082:30:232","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":26034,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3082:32:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":26035,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3115:9:232","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"3082:42:232","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":26037,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3082:58:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26038,"nodeType":"ExpressionStatement","src":"3082:58:232"}]},"functionSelector":"0e07f854","id":26040,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2519:4:232","nodeType":"FunctionDefinition","parameters":{"id":25985,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25976,"mutability":"mutable","name":"tokenName","nameLocation":"2549:9:232","nodeType":"VariableDeclaration","scope":26040,"src":"2533:25:232","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":25975,"name":"string","nodeType":"ElementaryTypeName","src":"2533:6:232","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25978,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2584:11:232","nodeType":"VariableDeclaration","scope":26040,"src":"2568:27:232","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":25977,"name":"string","nodeType":"ElementaryTypeName","src":"2568:6:232","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":25981,"mutability":"mutable","name":"metadataResolver","nameLocation":"2628:16:232","nodeType":"VariableDeclaration","scope":26040,"src":"2605:39:232","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":25980,"nodeType":"UserDefinedTypeName","pathNode":{"id":25979,"name":"ITokenMetadataResolver","nameLocations":["2605:22:232"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2605:22:232"},"referencedDeclaration":36704,"src":"2605:22:232","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":25984,"mutability":"mutable","name":"filterRegistry","nameLocation":"2678:14:232","nodeType":"VariableDeclaration","scope":26040,"src":"2654:38:232","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":25983,"nodeType":"UserDefinedTypeName","pathNode":{"id":25982,"name":"IOperatorFilterRegistry","nameLocations":["2654:23:232"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2654:23:232"},"referencedDeclaration":37474,"src":"2654:23:232","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2523:175:232"},"returnParameters":{"id":25986,"nodeType":"ParameterList","parameters":[],"src":"2708:0:232"},"scope":26069,"src":"2510:637:232","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":26053,"nodeType":"Block","src":"3312:65:232","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26049,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3329:28:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":26050,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3358:10:232","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3329:39:232","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3329:41:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":26048,"id":26052,"nodeType":"Return","src":"3322:48:232"}]},"documentation":{"id":26041,"nodeType":"StructuredDocumentation","src":"3153:44:232","text":"@inheritdoc ForwarderRegistryContextBase"},"id":26054,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3211:10:232","nodeType":"FunctionDefinition","overrides":{"id":26045,"nodeType":"OverrideSpecifier","overrides":[{"id":26043,"name":"Context","nameLocations":["3255:7:232"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3255:7:232"},{"id":26044,"name":"ForwarderRegistryContextBase","nameLocations":["3264:28:232"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3264:28:232"}],"src":"3246:47:232"},"parameters":{"id":26042,"nodeType":"ParameterList","parameters":[],"src":"3221:2:232"},"returnParameters":{"id":26048,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26047,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26054,"src":"3303:7:232","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26046,"name":"address","nodeType":"ElementaryTypeName","src":"3303:7:232","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3302:9:232"},"scope":26069,"src":"3202:175:232","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":26067,"nodeType":"Block","src":"3547:63:232","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26063,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3564:28:232","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":26064,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3593:8:232","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3564:37:232","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":26065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3564:39:232","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":26062,"id":26066,"nodeType":"Return","src":"3557:46:232"}]},"documentation":{"id":26055,"nodeType":"StructuredDocumentation","src":"3383:44:232","text":"@inheritdoc ForwarderRegistryContextBase"},"id":26068,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3441:8:232","nodeType":"FunctionDefinition","overrides":{"id":26059,"nodeType":"OverrideSpecifier","overrides":[{"id":26057,"name":"Context","nameLocations":["3483:7:232"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3483:7:232"},{"id":26058,"name":"ForwarderRegistryContextBase","nameLocations":["3492:28:232"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3492:28:232"}],"src":"3474:47:232"},"parameters":{"id":26056,"nodeType":"ParameterList","parameters":[],"src":"3449:2:232"},"returnParameters":{"id":26062,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26061,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26068,"src":"3531:14:232","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":26060,"name":"bytes","nodeType":"ElementaryTypeName","src":"3531:5:232","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3530:16:232"},"scope":26069,"src":"3432:178:232","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":26070,"src":"1880:1732:232","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,23516,23519,23526,23537,23548,23557,23568,23571,23576,36690,37080,37083,37090],"usedEvents":[8269,8278,8287,23591,23606,23615,23622]}],"src":"32:3581:232"},"id":232},"contracts/token/ERC20/ERC20.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20.sol","exportedSymbols":{"ERC20":[26093],"ERC20Base":[26492],"ERC20Storage":[30139],"InterfaceDetection":[11554]},"id":26094,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26071,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:233"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./libraries/ERC20Storage.sol","id":26073,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26094,"sourceUnit":30140,"src":"58:58:233","symbolAliases":[{"foreign":{"id":26072,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"66:12:233","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20Base.sol","file":"./base/ERC20Base.sol","id":26075,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26094,"sourceUnit":26493,"src":"117:47:233","symbolAliases":[{"foreign":{"id":26074,"name":"ERC20Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26492,"src":"125:9:233","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":26077,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26094,"sourceUnit":11555,"src":"165:80:233","symbolAliases":[{"foreign":{"id":26076,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"173:18:233","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26079,"name":"ERC20Base","nameLocations":["435:9:233"],"nodeType":"IdentifierPath","referencedDeclaration":26492,"src":"435:9:233"},"id":26080,"nodeType":"InheritanceSpecifier","src":"435:9:233"},{"baseName":{"id":26081,"name":"InterfaceDetection","nameLocations":["446:18:233"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"446:18:233"},"id":26082,"nodeType":"InheritanceSpecifier","src":"446:18:233"}],"canonicalName":"ERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":26078,"nodeType":"StructuredDocumentation","src":"247:161:233","text":"@title ERC20 Fungible Token Standard (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26093,"linearizedBaseContracts":[26093,11554,11579,26492,1206,27863,27839],"name":"ERC20","nameLocation":"426:5:233","nodeType":"ContractDefinition","nodes":[{"body":{"id":26091,"nodeType":"Block","src":"578:36:233","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26086,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"588:12:233","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26088,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"601:4:233","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28743,"src":"588:17:233","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26089,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"588:19:233","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26090,"nodeType":"ExpressionStatement","src":"588:19:233"}]},"documentation":{"id":26083,"nodeType":"StructuredDocumentation","src":"471:88:233","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"id":26092,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26084,"nodeType":"ParameterList","parameters":[],"src":"575:2:233"},"returnParameters":{"id":26085,"nodeType":"ParameterList","parameters":[],"src":"578:0:233"},"scope":26093,"src":"564:50:233","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26094,"src":"408:208:233","usedErrors":[11559,27019,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:585:233"},"id":233},"contracts/token/ERC20/ERC20BatchTransfers.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20BatchTransfers.sol","exportedSymbols":{"ERC20BatchTransfers":[26113],"ERC20BatchTransfersBase":[26565],"ERC20Storage":[30139]},"id":26114,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26095,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:234"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./libraries/ERC20Storage.sol","id":26097,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26114,"sourceUnit":30140,"src":"58:58:234","symbolAliases":[{"foreign":{"id":26096,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"66:12:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol","file":"./base/ERC20BatchTransfersBase.sol","id":26099,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26114,"sourceUnit":26566,"src":"117:75:234","symbolAliases":[{"foreign":{"id":26098,"name":"ERC20BatchTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26565,"src":"125:23:234","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26101,"name":"ERC20BatchTransfersBase","nameLocations":["433:23:234"],"nodeType":"IdentifierPath","referencedDeclaration":26565,"src":"433:23:234"},"id":26102,"nodeType":"InheritanceSpecifier","src":"433:23:234"}],"canonicalName":"ERC20BatchTransfers","contractDependencies":[],"contractKind":"contract","documentation":{"id":26100,"nodeType":"StructuredDocumentation","src":"194:198:234","text":"@title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26113,"linearizedBaseContracts":[26113,26565,1206,27893],"name":"ERC20BatchTransfers","nameLocation":"410:19:234","nodeType":"ContractDefinition","nodes":[{"body":{"id":26111,"nodeType":"Block","src":"568:55:234","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26106,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"578:12:234","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26108,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"591:23:234","memberName":"initERC20BatchTransfers","nodeType":"MemberAccess","referencedDeclaration":28788,"src":"578:36:234","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26109,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"578:38:234","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26110,"nodeType":"ExpressionStatement","src":"578:38:234"}]},"documentation":{"id":26103,"nodeType":"StructuredDocumentation","src":"463:86:234","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."},"id":26112,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26104,"nodeType":"ParameterList","parameters":[],"src":"565:2:234"},"returnParameters":{"id":26105,"nodeType":"ParameterList","parameters":[],"src":"568:0:234"},"scope":26113,"src":"554:69:234","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26114,"src":"392:233:234","usedErrors":[7886,11559,27024,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:594:234"},"id":234},"contracts/token/ERC20/ERC20Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Burnable.sol","exportedSymbols":{"ERC20Burnable":[26133],"ERC20BurnableBase":[26654],"ERC20Storage":[30139]},"id":26134,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26115,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:235"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./libraries/ERC20Storage.sol","id":26117,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26134,"sourceUnit":30140,"src":"58:58:235","symbolAliases":[{"foreign":{"id":26116,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"66:12:235","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BurnableBase.sol","file":"./base/ERC20BurnableBase.sol","id":26119,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26134,"sourceUnit":26655,"src":"117:63:235","symbolAliases":[{"foreign":{"id":26118,"name":"ERC20BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26654,"src":"125:17:235","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26121,"name":"ERC20BurnableBase","nameLocations":["408:17:235"],"nodeType":"IdentifierPath","referencedDeclaration":26654,"src":"408:17:235"},"id":26122,"nodeType":"InheritanceSpecifier","src":"408:17:235"}],"canonicalName":"ERC20Burnable","contractDependencies":[],"contractKind":"contract","documentation":{"id":26120,"nodeType":"StructuredDocumentation","src":"182:191:235","text":"@title ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26133,"linearizedBaseContracts":[26133,26654,1206,27927],"name":"ERC20Burnable","nameLocation":"391:13:235","nodeType":"ContractDefinition","nodes":[{"body":{"id":26131,"nodeType":"Block","src":"531:49:235","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26126,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"541:12:235","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"554:17:235","memberName":"initERC20Burnable","nodeType":"MemberAccess","referencedDeclaration":28839,"src":"541:30:235","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"541:32:235","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26130,"nodeType":"ExpressionStatement","src":"541:32:235"}]},"documentation":{"id":26123,"nodeType":"StructuredDocumentation","src":"432:80:235","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Burnable."},"id":26132,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26124,"nodeType":"ParameterList","parameters":[],"src":"528:2:235"},"returnParameters":{"id":26125,"nodeType":"ParameterList","parameters":[],"src":"531:0:235"},"scope":26133,"src":"517:63:235","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26134,"src":"373:209:235","usedErrors":[7886,11559,27031,27042,27056],"usedEvents":[27102,27111]}],"src":"32:551:235"},"id":235},"contracts/token/ERC20/ERC20Detailed.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Detailed.sol","exportedSymbols":{"ERC20Detailed":[26168],"ERC20DetailedBase":[26707],"ERC20DetailedStorage":[28291]},"id":26169,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26135,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:236"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./libraries/ERC20DetailedStorage.sol","id":26137,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26169,"sourceUnit":28292,"src":"58:74:236","symbolAliases":[{"foreign":{"id":26136,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"66:20:236","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20DetailedBase.sol","file":"./base/ERC20DetailedBase.sol","id":26139,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26169,"sourceUnit":26708,"src":"133:63:236","symbolAliases":[{"foreign":{"id":26138,"name":"ERC20DetailedBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26707,"src":"141:17:236","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26141,"name":"ERC20DetailedBase","nameLocations":["424:17:236"],"nodeType":"IdentifierPath","referencedDeclaration":26707,"src":"424:17:236"},"id":26142,"nodeType":"InheritanceSpecifier","src":"424:17:236"}],"canonicalName":"ERC20Detailed","contractDependencies":[],"contractKind":"contract","documentation":{"id":26140,"nodeType":"StructuredDocumentation","src":"198:191:236","text":"@title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26168,"linearizedBaseContracts":[26168,26707,27949],"name":"ERC20Detailed","nameLocation":"407:13:236","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26146,"libraryName":{"id":26143,"name":"ERC20DetailedStorage","nameLocations":["454:20:236"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"454:20:236"},"nodeType":"UsingForDirective","src":"448:59:236","typeName":{"id":26145,"nodeType":"UserDefinedTypeName","pathNode":{"id":26144,"name":"ERC20DetailedStorage.Layout","nameLocations":["479:20:236","500:6:236"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"479:27:236"},"referencedDeclaration":28118,"src":"479:27:236","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"body":{"id":26166,"nodeType":"Block","src":"882:101:236","statements":[{"expression":{"arguments":[{"id":26161,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26149,"src":"938:9:236","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":26162,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26151,"src":"949:11:236","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":26163,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26153,"src":"962:13:236","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26156,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"892:20:236","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":26158,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"913:6:236","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"892:27:236","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":26159,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"892:29:236","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":26160,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"922:15:236","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":28188,"src":"892:45:236","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28118_storage_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$returns$__$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer,string memory,string memory,uint8)"}},"id":26164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"892:84:236","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26165,"nodeType":"ExpressionStatement","src":"892:84:236"}]},"documentation":{"id":26147,"nodeType":"StructuredDocumentation","src":"513:279:236","text":"@notice Initializes the storage with the token details.\n @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenDecimals The token decimals."},"id":26167,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26149,"mutability":"mutable","name":"tokenName","nameLocation":"823:9:236","nodeType":"VariableDeclaration","scope":26167,"src":"809:23:236","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":26148,"name":"string","nodeType":"ElementaryTypeName","src":"809:6:236","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":26151,"mutability":"mutable","name":"tokenSymbol","nameLocation":"848:11:236","nodeType":"VariableDeclaration","scope":26167,"src":"834:25:236","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":26150,"name":"string","nodeType":"ElementaryTypeName","src":"834:6:236","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":26153,"mutability":"mutable","name":"tokenDecimals","nameLocation":"867:13:236","nodeType":"VariableDeclaration","scope":26167,"src":"861:19:236","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":26152,"name":"uint8","nodeType":"ElementaryTypeName","src":"861:5:236","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"808:73:236"},"returnParameters":{"id":26155,"nodeType":"ParameterList","parameters":[],"src":"882:0:236"},"scope":26168,"src":"797:186:236","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26169,"src":"389:596:236","usedErrors":[11559],"usedEvents":[]}],"src":"32:954:236"},"id":236},"contracts/token/ERC20/ERC20Metadata.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Metadata.sol","exportedSymbols":{"ContractOwnership":[7934],"ERC20Metadata":[26196],"ERC20MetadataBase":[26768],"ERC20MetadataStorage":[28380]},"id":26197,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26170,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:237"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","file":"./libraries/ERC20MetadataStorage.sol","id":26172,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26197,"sourceUnit":28381,"src":"58:74:237","symbolAliases":[{"foreign":{"id":26171,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"66:20:237","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MetadataBase.sol","file":"./base/ERC20MetadataBase.sol","id":26174,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26197,"sourceUnit":26769,"src":"133:63:237","symbolAliases":[{"foreign":{"id":26173,"name":"ERC20MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26768,"src":"141:17:237","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":26176,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26197,"sourceUnit":7935,"src":"197:71:237","symbolAliases":[{"foreign":{"id":26175,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"205:17:237","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26178,"name":"ERC20MetadataBase","nameLocations":["496:17:237"],"nodeType":"IdentifierPath","referencedDeclaration":26768,"src":"496:17:237"},"id":26179,"nodeType":"InheritanceSpecifier","src":"496:17:237"},{"baseName":{"id":26180,"name":"ContractOwnership","nameLocations":["515:17:237"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"515:17:237"},"id":26181,"nodeType":"InheritanceSpecifier","src":"515:17:237"}],"canonicalName":"ERC20Metadata","contractDependencies":[],"contractKind":"contract","documentation":{"id":26177,"nodeType":"StructuredDocumentation","src":"270:191:237","text":"@title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26196,"linearizedBaseContracts":[26196,7934,11554,11579,8139,26768,1206,8562,27959],"name":"ERC20Metadata","nameLocation":"479:13:237","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26185,"libraryName":{"id":26182,"name":"ERC20MetadataStorage","nameLocations":["545:20:237"],"nodeType":"IdentifierPath","referencedDeclaration":28380,"src":"545:20:237"},"nodeType":"UsingForDirective","src":"539:59:237","typeName":{"id":26184,"nodeType":"UserDefinedTypeName","pathNode":{"id":26183,"name":"ERC20MetadataStorage.Layout","nameLocations":["570:20:237","591:6:237"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"570:27:237"},"referencedDeclaration":28308,"src":"570:27:237","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}}},{"body":{"id":26194,"nodeType":"Block","src":"703:44:237","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26189,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"713:20:237","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":26191,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"734:4:237","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28338,"src":"713:25:237","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26192,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"713:27:237","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26193,"nodeType":"ExpressionStatement","src":"713:27:237"}]},"documentation":{"id":26186,"nodeType":"StructuredDocumentation","src":"604:80:237","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"id":26195,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26187,"nodeType":"ParameterList","parameters":[],"src":"700:2:237"},"returnParameters":{"id":26188,"nodeType":"ParameterList","parameters":[],"src":"703:0:237"},"scope":26196,"src":"689:58:237","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26197,"src":"461:288:237","usedErrors":[8246,11559],"usedEvents":[8287]}],"src":"32:718:237"},"id":237},"contracts/token/ERC20/ERC20Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Mintable.sol","exportedSymbols":{"AccessControl":[7901],"ERC20Mintable":[26220],"ERC20MintableBase":[26853],"ERC20Storage":[30139]},"id":26221,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26198,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:238"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./libraries/ERC20Storage.sol","id":26200,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26221,"sourceUnit":30140,"src":"58:58:238","symbolAliases":[{"foreign":{"id":26199,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"66:12:238","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MintableBase.sol","file":"./base/ERC20MintableBase.sol","id":26202,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26221,"sourceUnit":26854,"src":"117:63:238","symbolAliases":[{"foreign":{"id":26201,"name":"ERC20MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26853,"src":"125:17:238","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":26204,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26221,"sourceUnit":7902,"src":"181:63:238","symbolAliases":[{"foreign":{"id":26203,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"189:13:238","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26206,"name":"ERC20MintableBase","nameLocations":["472:17:238"],"nodeType":"IdentifierPath","referencedDeclaration":26853,"src":"472:17:238"},"id":26207,"nodeType":"InheritanceSpecifier","src":"472:17:238"},{"baseName":{"id":26208,"name":"AccessControl","nameLocations":["491:13:238"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"491:13:238"},"id":26209,"nodeType":"InheritanceSpecifier","src":"491:13:238"}],"canonicalName":"ERC20Mintable","contractDependencies":[],"contractKind":"contract","documentation":{"id":26205,"nodeType":"StructuredDocumentation","src":"246:191:238","text":"@title ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26220,"linearizedBaseContracts":[26220,7901,7934,11554,11579,8139,8091,26853,1206,8562,8546,27981],"name":"ERC20Mintable","nameLocation":"455:13:238","nodeType":"ContractDefinition","nodes":[{"body":{"id":26218,"nodeType":"Block","src":"610:49:238","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26213,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"620:12:238","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26215,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"633:17:238","memberName":"initERC20Mintable","nodeType":"MemberAccess","referencedDeclaration":28822,"src":"620:30:238","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"620:32:238","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26217,"nodeType":"ExpressionStatement","src":"620:32:238"}]},"documentation":{"id":26210,"nodeType":"StructuredDocumentation","src":"511:80:238","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Mintable."},"id":26219,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26211,"nodeType":"ParameterList","parameters":[],"src":"607:2:238"},"returnParameters":{"id":26212,"nodeType":"ParameterList","parameters":[],"src":"610:0:238"},"scope":26220,"src":"596:63:238","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26221,"src":"437:224:238","usedErrors":[7886,8223,8246,11559,27061,27064,27071],"usedEvents":[8269,8278,8287,27102]}],"src":"32:630:238"},"id":238},"contracts/token/ERC20/ERC20Permit.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Permit.sol","exportedSymbols":{"ERC20Permit":[26244],"ERC20PermitBase":[26931],"ERC20PermitStorage":[28612]},"id":26245,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26222,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:239"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","file":"./libraries/ERC20PermitStorage.sol","id":26224,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26245,"sourceUnit":28613,"src":"58:70:239","symbolAliases":[{"foreign":{"id":26223,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"66:18:239","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20PermitBase.sol","file":"./base/ERC20PermitBase.sol","id":26226,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26245,"sourceUnit":26932,"src":"129:59:239","symbolAliases":[{"foreign":{"id":26225,"name":"ERC20PermitBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26931,"src":"137:15:239","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26228,"name":"ERC20PermitBase","nameLocations":["465:15:239"],"nodeType":"IdentifierPath","referencedDeclaration":26931,"src":"465:15:239"},"id":26229,"nodeType":"InheritanceSpecifier","src":"465:15:239"}],"canonicalName":"ERC20Permit","contractDependencies":[],"contractKind":"contract","documentation":{"id":26227,"nodeType":"StructuredDocumentation","src":"190:242:239","text":"@title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\n @dev Note: This contract requires ERC20Detailed."},"fullyImplemented":true,"id":26244,"linearizedBaseContracts":[26244,26931,1206,28017],"name":"ERC20Permit","nameLocation":"450:11:239","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26233,"libraryName":{"id":26230,"name":"ERC20PermitStorage","nameLocations":["493:18:239"],"nodeType":"IdentifierPath","referencedDeclaration":28612,"src":"493:18:239"},"nodeType":"UsingForDirective","src":"487:55:239","typeName":{"id":26232,"nodeType":"UserDefinedTypeName","pathNode":{"id":26231,"name":"ERC20PermitStorage.Layout","nameLocations":["516:18:239","535:6:239"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"516:25:239"},"referencedDeclaration":28411,"src":"516:25:239","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}}},{"body":{"id":26242,"nodeType":"Block","src":"645:42:239","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26237,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"655:18:239","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":26239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"674:4:239","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28446,"src":"655:23:239","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26240,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"655:25:239","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26241,"nodeType":"ExpressionStatement","src":"655:25:239"}]},"documentation":{"id":26234,"nodeType":"StructuredDocumentation","src":"548:78:239","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Permit."},"id":26243,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26235,"nodeType":"ParameterList","parameters":[],"src":"642:2:239"},"returnParameters":{"id":26236,"nodeType":"ParameterList","parameters":[],"src":"645:0:239"},"scope":26244,"src":"631:56:239","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26245,"src":"432:257:239","usedErrors":[11559,27031,27076,27081,27084],"usedEvents":[27111]}],"src":"32:658:239"},"id":239},"contracts/token/ERC20/ERC20Receiver.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20Receiver.sol","exportedSymbols":{"ERC20Receiver":[26279],"IERC20Receiver":[28035],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":26280,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26246,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:240"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Receiver.sol","file":"./interfaces/IERC20Receiver.sol","id":26248,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26280,"sourceUnit":28036,"src":"58:63:240","symbolAliases":[{"foreign":{"id":26247,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"66:14:240","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"../../introspection/libraries/InterfaceDetectionStorage.sol","id":26250,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26280,"sourceUnit":11681,"src":"122:102:240","symbolAliases":[{"foreign":{"id":26249,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"130:25:240","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"../../introspection/InterfaceDetection.sol","id":26252,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26280,"sourceUnit":11555,"src":"225:78:240","symbolAliases":[{"foreign":{"id":26251,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"233:18:240","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26254,"name":"IERC20Receiver","nameLocations":["511:14:240"],"nodeType":"IdentifierPath","referencedDeclaration":28035,"src":"511:14:240"},"id":26255,"nodeType":"InheritanceSpecifier","src":"511:14:240"},{"baseName":{"id":26256,"name":"InterfaceDetection","nameLocations":["527:18:240"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"527:18:240"},"id":26257,"nodeType":"InheritanceSpecifier","src":"527:18:240"}],"canonicalName":"ERC20Receiver","contractDependencies":[],"contractKind":"contract","documentation":{"id":26253,"nodeType":"StructuredDocumentation","src":"305:171:240","text":"@title ERC20 Fungible Token Standard, Receiver (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":false,"id":26279,"linearizedBaseContracts":[26279,11554,11579,28035],"name":"ERC20Receiver","nameLocation":"494:13:240","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26261,"libraryName":{"id":26258,"name":"InterfaceDetectionStorage","nameLocations":["558:25:240"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"558:25:240"},"nodeType":"UsingForDirective","src":"552:69:240","typeName":{"id":26260,"nodeType":"UserDefinedTypeName","pathNode":{"id":26259,"name":"InterfaceDetectionStorage.Layout","nameLocations":["588:25:240","614:6:240"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"588:32:240"},"referencedDeclaration":11590,"src":"588:32:240","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":26277,"nodeType":"Block","src":"726:113:240","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":26271,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"798:14:240","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Receiver_$28035_$","typeString":"type(contract IERC20Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Receiver_$28035_$","typeString":"type(contract IERC20Receiver)"}],"id":26270,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"793:4:240","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":26272,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"793:20:240","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Receiver_$28035","typeString":"type(contract IERC20Receiver)"}},"id":26273,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"814:11:240","memberName":"interfaceId","nodeType":"MemberAccess","src":"793:32:240","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":26274,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"827:4:240","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26265,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"736:25:240","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":26267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"762:6:240","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"736:32:240","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":26268,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"736:34:240","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":26269,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"771:21:240","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"736:56:240","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":26275,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"736:96:240","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26276,"nodeType":"ExpressionStatement","src":"736:96:240"}]},"documentation":{"id":26262,"nodeType":"StructuredDocumentation","src":"627:80:240","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Receiver."},"id":26278,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26263,"nodeType":"ParameterList","parameters":[],"src":"723:2:240"},"returnParameters":{"id":26264,"nodeType":"ParameterList","parameters":[],"src":"726:0:240"},"scope":26279,"src":"712:127:240","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26280,"src":"476:365:240","usedErrors":[11559],"usedEvents":[]}],"src":"32:810:240"},"id":240},"contracts/token/ERC20/ERC20SafeTransfers.sol":{"ast":{"absolutePath":"contracts/token/ERC20/ERC20SafeTransfers.sol","exportedSymbols":{"ERC20SafeTransfers":[26299],"ERC20SafeTransfersBase":[27006],"ERC20Storage":[30139]},"id":26300,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26281,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:241"},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./libraries/ERC20Storage.sol","id":26283,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26300,"sourceUnit":30140,"src":"58:58:241","symbolAliases":[{"foreign":{"id":26282,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"66:12:241","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol","file":"./base/ERC20SafeTransfersBase.sol","id":26285,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26300,"sourceUnit":27007,"src":"117:73:241","symbolAliases":[{"foreign":{"id":26284,"name":"ERC20SafeTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27006,"src":"125:22:241","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26287,"name":"ERC20SafeTransfersBase","nameLocations":["429:22:241"],"nodeType":"IdentifierPath","referencedDeclaration":27006,"src":"429:22:241"},"id":26288,"nodeType":"InheritanceSpecifier","src":"429:22:241"}],"canonicalName":"ERC20SafeTransfers","contractDependencies":[],"contractKind":"contract","documentation":{"id":26286,"nodeType":"StructuredDocumentation","src":"192:197:241","text":"@title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":26299,"linearizedBaseContracts":[26299,27006,1206,28065],"name":"ERC20SafeTransfers","nameLocation":"407:18:241","nodeType":"ContractDefinition","nodes":[{"body":{"id":26297,"nodeType":"Block","src":"562:54:241","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26292,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"572:12:241","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"585:22:241","memberName":"initERC20SafeTransfers","nodeType":"MemberAccess","referencedDeclaration":28805,"src":"572:35:241","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":26295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"572:37:241","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26296,"nodeType":"ExpressionStatement","src":"572:37:241"}]},"documentation":{"id":26289,"nodeType":"StructuredDocumentation","src":"458:85:241","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers."},"id":26298,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":26290,"nodeType":"ParameterList","parameters":[],"src":"559:2:241"},"returnParameters":{"id":26291,"nodeType":"ParameterList","parameters":[],"src":"562:0:241"},"scope":26299,"src":"548:68:241","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":26300,"src":"389:229:241","usedErrors":[11559,27031,27042,27047,27056,27091],"usedEvents":[27102,27111]}],"src":"32:587:241"},"id":241},"contracts/token/ERC20/base/ERC20Base.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20Base.sol","exportedSymbols":{"Context":[1206],"ERC20Base":[26492],"ERC20Storage":[30139],"IERC20":[27839],"IERC20Allowance":[27863]},"id":26493,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26301,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:242"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20.sol","file":"./../interfaces/IERC20.sol","id":26303,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26493,"sourceUnit":27840,"src":"58:50:242","symbolAliases":[{"foreign":{"id":26302,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27839,"src":"66:6:242","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Allowance.sol","file":"./../interfaces/IERC20Allowance.sol","id":26305,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26493,"sourceUnit":27864,"src":"109:68:242","symbolAliases":[{"foreign":{"id":26304,"name":"IERC20Allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27863,"src":"117:15:242","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":26307,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26493,"sourceUnit":30140,"src":"178:61:242","symbolAliases":[{"foreign":{"id":26306,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"186:12:242","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26309,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26493,"sourceUnit":1207,"src":"240:66:242","symbolAliases":[{"foreign":{"id":26308,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"248:7:242","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26311,"name":"IERC20","nameLocations":["560:6:242"],"nodeType":"IdentifierPath","referencedDeclaration":27839,"src":"560:6:242"},"id":26312,"nodeType":"InheritanceSpecifier","src":"560:6:242"},{"baseName":{"id":26313,"name":"IERC20Allowance","nameLocations":["568:15:242"],"nodeType":"IdentifierPath","referencedDeclaration":27863,"src":"568:15:242"},"id":26314,"nodeType":"InheritanceSpecifier","src":"568:15:242"},{"baseName":{"id":26315,"name":"Context","nameLocations":["585:7:242"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"585:7:242"},"id":26316,"nodeType":"InheritanceSpecifier","src":"585:7:242"}],"canonicalName":"ERC20Base","contractDependencies":[],"contractKind":"contract","documentation":{"id":26310,"nodeType":"StructuredDocumentation","src":"308:221:242","text":"@title ERC20 Fungible Token Standard (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":26492,"linearizedBaseContracts":[26492,1206,27863,27839],"name":"ERC20Base","nameLocation":"547:9:242","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26320,"libraryName":{"id":26317,"name":"ERC20Storage","nameLocations":["605:12:242"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"605:12:242"},"nodeType":"UsingForDirective","src":"599:43:242","typeName":{"id":26319,"nodeType":"UserDefinedTypeName","pathNode":{"id":26318,"name":"ERC20Storage.Layout","nameLocations":["622:12:242","635:6:242"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"622:19:242"},"referencedDeclaration":28678,"src":"622:19:242","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"baseFunctions":[27792],"body":{"id":26343,"nodeType":"Block","src":"763:97:242","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26335,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"803:10:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26336,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"803:12:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26337,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26323,"src":"817:7:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26338,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26325,"src":"826:5:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26330,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"773:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"786:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"773:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26333,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"773:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26334,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"795:7:242","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":28880,"src":"773:29:242","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":26339,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"773:59:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26340,"nodeType":"ExpressionStatement","src":"773:59:242"},{"expression":{"hexValue":"74727565","id":26341,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"849:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26329,"id":26342,"nodeType":"Return","src":"842:11:242"}]},"documentation":{"id":26321,"nodeType":"StructuredDocumentation","src":"648:22:242","text":"@inheritdoc IERC20"},"functionSelector":"095ea7b3","id":26344,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"684:7:242","nodeType":"FunctionDefinition","parameters":{"id":26326,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26323,"mutability":"mutable","name":"spender","nameLocation":"700:7:242","nodeType":"VariableDeclaration","scope":26344,"src":"692:15:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26322,"name":"address","nodeType":"ElementaryTypeName","src":"692:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26325,"mutability":"mutable","name":"value","nameLocation":"717:5:242","nodeType":"VariableDeclaration","scope":26344,"src":"709:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26324,"name":"uint256","nodeType":"ElementaryTypeName","src":"709:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"691:32:242"},"returnParameters":{"id":26329,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26328,"mutability":"mutable","name":"result","nameLocation":"755:6:242","nodeType":"VariableDeclaration","scope":26344,"src":"750:11:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26327,"name":"bool","nodeType":"ElementaryTypeName","src":"750:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"749:13:242"},"scope":26492,"src":"675:185:242","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27802],"body":{"id":26367,"nodeType":"Block","src":"977:93:242","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26359,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1018:10:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26360,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1018:12:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26361,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26347,"src":"1032:2:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26362,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26349,"src":"1036:5:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26354,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"987:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1000:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"987:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26357,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"987:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26358,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1009:8:242","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":29123,"src":"987:30:242","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":26363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"987:55:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26364,"nodeType":"ExpressionStatement","src":"987:55:242"},{"expression":{"hexValue":"74727565","id":26365,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1059:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26353,"id":26366,"nodeType":"Return","src":"1052:11:242"}]},"documentation":{"id":26345,"nodeType":"StructuredDocumentation","src":"866:22:242","text":"@inheritdoc IERC20"},"functionSelector":"a9059cbb","id":26368,"implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"902:8:242","nodeType":"FunctionDefinition","parameters":{"id":26350,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26347,"mutability":"mutable","name":"to","nameLocation":"919:2:242","nodeType":"VariableDeclaration","scope":26368,"src":"911:10:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26346,"name":"address","nodeType":"ElementaryTypeName","src":"911:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26349,"mutability":"mutable","name":"value","nameLocation":"931:5:242","nodeType":"VariableDeclaration","scope":26368,"src":"923:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26348,"name":"uint256","nodeType":"ElementaryTypeName","src":"923:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"910:27:242"},"returnParameters":{"id":26353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26352,"mutability":"mutable","name":"result","nameLocation":"969:6:242","nodeType":"VariableDeclaration","scope":26368,"src":"964:11:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26351,"name":"bool","nodeType":"ElementaryTypeName","src":"964:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"963:13:242"},"scope":26492,"src":"893:177:242","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27814],"body":{"id":26394,"nodeType":"Block","src":"1205:103:242","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26385,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1250:10:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1250:12:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26387,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26371,"src":"1264:4:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26388,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26373,"src":"1270:2:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26389,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26375,"src":"1274:5:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26380,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1215:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1228:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1215:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26383,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1215:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26384,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1237:12:242","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":29160,"src":"1215:34:242","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,address,uint256)"}},"id":26390,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1215:65:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26391,"nodeType":"ExpressionStatement","src":"1215:65:242"},{"expression":{"hexValue":"74727565","id":26392,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1297:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26379,"id":26393,"nodeType":"Return","src":"1290:11:242"}]},"documentation":{"id":26369,"nodeType":"StructuredDocumentation","src":"1076:22:242","text":"@inheritdoc IERC20"},"functionSelector":"23b872dd","id":26395,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"1112:12:242","nodeType":"FunctionDefinition","parameters":{"id":26376,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26371,"mutability":"mutable","name":"from","nameLocation":"1133:4:242","nodeType":"VariableDeclaration","scope":26395,"src":"1125:12:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26370,"name":"address","nodeType":"ElementaryTypeName","src":"1125:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26373,"mutability":"mutable","name":"to","nameLocation":"1147:2:242","nodeType":"VariableDeclaration","scope":26395,"src":"1139:10:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26372,"name":"address","nodeType":"ElementaryTypeName","src":"1139:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26375,"mutability":"mutable","name":"value","nameLocation":"1159:5:242","nodeType":"VariableDeclaration","scope":26395,"src":"1151:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26374,"name":"uint256","nodeType":"ElementaryTypeName","src":"1151:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1124:41:242"},"returnParameters":{"id":26379,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26378,"mutability":"mutable","name":"result","nameLocation":"1197:6:242","nodeType":"VariableDeclaration","scope":26395,"src":"1192:11:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26377,"name":"bool","nodeType":"ElementaryTypeName","src":"1192:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1191:13:242"},"scope":26492,"src":"1103:205:242","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27852],"body":{"id":26418,"nodeType":"Block","src":"1453:112:242","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26410,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1503:10:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26411,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1503:12:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26412,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26398,"src":"1517:7:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26413,"name":"addedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26400,"src":"1526:10:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26405,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1463:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1476:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1463:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1463:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26409,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1485:17:242","memberName":"increaseAllowance","nodeType":"MemberAccess","referencedDeclaration":28957,"src":"1463:39:242","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":26414,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1463:74:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26415,"nodeType":"ExpressionStatement","src":"1463:74:242"},{"expression":{"hexValue":"74727565","id":26416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1554:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26404,"id":26417,"nodeType":"Return","src":"1547:11:242"}]},"documentation":{"id":26396,"nodeType":"StructuredDocumentation","src":"1314:31:242","text":"@inheritdoc IERC20Allowance"},"functionSelector":"39509351","id":26419,"implemented":true,"kind":"function","modifiers":[],"name":"increaseAllowance","nameLocation":"1359:17:242","nodeType":"FunctionDefinition","parameters":{"id":26401,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26398,"mutability":"mutable","name":"spender","nameLocation":"1385:7:242","nodeType":"VariableDeclaration","scope":26419,"src":"1377:15:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26397,"name":"address","nodeType":"ElementaryTypeName","src":"1377:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26400,"mutability":"mutable","name":"addedValue","nameLocation":"1402:10:242","nodeType":"VariableDeclaration","scope":26419,"src":"1394:18:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26399,"name":"uint256","nodeType":"ElementaryTypeName","src":"1394:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1376:37:242"},"returnParameters":{"id":26404,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26403,"mutability":"mutable","name":"result","nameLocation":"1445:6:242","nodeType":"VariableDeclaration","scope":26419,"src":"1440:11:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26402,"name":"bool","nodeType":"ElementaryTypeName","src":"1440:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1439:13:242"},"scope":26492,"src":"1350:215:242","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27862],"body":{"id":26442,"nodeType":"Block","src":"1715:117:242","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26434,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1765:10:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26435,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1765:12:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26436,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26422,"src":"1779:7:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26437,"name":"subtractedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26424,"src":"1788:15:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26429,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1725:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1738:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1725:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1725:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26433,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1747:17:242","memberName":"decreaseAllowance","nodeType":"MemberAccess","referencedDeclaration":29042,"src":"1725:39:242","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":26438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1725:79:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26439,"nodeType":"ExpressionStatement","src":"1725:79:242"},{"expression":{"hexValue":"74727565","id":26440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1821:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26428,"id":26441,"nodeType":"Return","src":"1814:11:242"}]},"documentation":{"id":26420,"nodeType":"StructuredDocumentation","src":"1571:31:242","text":"@inheritdoc IERC20Allowance"},"functionSelector":"a457c2d7","id":26443,"implemented":true,"kind":"function","modifiers":[],"name":"decreaseAllowance","nameLocation":"1616:17:242","nodeType":"FunctionDefinition","parameters":{"id":26425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26422,"mutability":"mutable","name":"spender","nameLocation":"1642:7:242","nodeType":"VariableDeclaration","scope":26443,"src":"1634:15:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26421,"name":"address","nodeType":"ElementaryTypeName","src":"1634:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26424,"mutability":"mutable","name":"subtractedValue","nameLocation":"1659:15:242","nodeType":"VariableDeclaration","scope":26443,"src":"1651:23:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26423,"name":"uint256","nodeType":"ElementaryTypeName","src":"1651:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1633:42:242"},"returnParameters":{"id":26428,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26427,"mutability":"mutable","name":"result","nameLocation":"1707:6:242","nodeType":"VariableDeclaration","scope":26443,"src":"1702:11:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26426,"name":"bool","nodeType":"ElementaryTypeName","src":"1702:4:242","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1701:13:242"},"scope":26492,"src":"1607:225:242","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27820],"body":{"id":26455,"nodeType":"Block","src":"1935:59:242","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26449,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1952:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26450,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1965:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1952:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26451,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1952:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26452,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1974:11:242","memberName":"totalSupply","nodeType":"MemberAccess","referencedDeclaration":30057,"src":"1952:33:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28678_storage_ptr_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer) view returns (uint256)"}},"id":26453,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1952:35:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":26448,"id":26454,"nodeType":"Return","src":"1945:42:242"}]},"documentation":{"id":26444,"nodeType":"StructuredDocumentation","src":"1838:22:242","text":"@inheritdoc IERC20"},"functionSelector":"18160ddd","id":26456,"implemented":true,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"1874:11:242","nodeType":"FunctionDefinition","parameters":{"id":26445,"nodeType":"ParameterList","parameters":[],"src":"1885:2:242"},"returnParameters":{"id":26448,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26447,"mutability":"mutable","name":"supply","nameLocation":"1927:6:242","nodeType":"VariableDeclaration","scope":26456,"src":"1919:14:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26446,"name":"uint256","nodeType":"ElementaryTypeName","src":"1919:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1918:16:242"},"scope":26492,"src":"1865:129:242","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[27828],"body":{"id":26471,"nodeType":"Block","src":"2109:62:242","statements":[{"expression":{"arguments":[{"id":26468,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26459,"src":"2158:5:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26464,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2126:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26465,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2139:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"2126:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2126:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26467,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2148:9:242","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":30074,"src":"2126:31:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address) view returns (uint256)"}},"id":26469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2126:38:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":26463,"id":26470,"nodeType":"Return","src":"2119:45:242"}]},"documentation":{"id":26457,"nodeType":"StructuredDocumentation","src":"2000:22:242","text":"@inheritdoc IERC20"},"functionSelector":"70a08231","id":26472,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2036:9:242","nodeType":"FunctionDefinition","parameters":{"id":26460,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26459,"mutability":"mutable","name":"owner","nameLocation":"2054:5:242","nodeType":"VariableDeclaration","scope":26472,"src":"2046:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26458,"name":"address","nodeType":"ElementaryTypeName","src":"2046:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2045:15:242"},"returnParameters":{"id":26463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26462,"mutability":"mutable","name":"balance","nameLocation":"2100:7:242","nodeType":"VariableDeclaration","scope":26472,"src":"2092:15:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26461,"name":"uint256","nodeType":"ElementaryTypeName","src":"2092:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2091:17:242"},"scope":26492,"src":"2027:144:242","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[27838],"body":{"id":26490,"nodeType":"Block","src":"2299:71:242","statements":[{"expression":{"arguments":[{"id":26486,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26475,"src":"2348:5:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26487,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26477,"src":"2355:7:242","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26482,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2316:12:242","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2329:6:242","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"2316:19:242","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2316:21:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26485,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2338:9:242","memberName":"allowance","nodeType":"MemberAccess","referencedDeclaration":30095,"src":"2316:31:242","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address) view returns (uint256)"}},"id":26488,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2316:47:242","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":26481,"id":26489,"nodeType":"Return","src":"2309:54:242"}]},"documentation":{"id":26473,"nodeType":"StructuredDocumentation","src":"2177:22:242","text":"@inheritdoc IERC20"},"functionSelector":"dd62ed3e","id":26491,"implemented":true,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"2213:9:242","nodeType":"FunctionDefinition","parameters":{"id":26478,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26475,"mutability":"mutable","name":"owner","nameLocation":"2231:5:242","nodeType":"VariableDeclaration","scope":26491,"src":"2223:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26474,"name":"address","nodeType":"ElementaryTypeName","src":"2223:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26477,"mutability":"mutable","name":"spender","nameLocation":"2246:7:242","nodeType":"VariableDeclaration","scope":26491,"src":"2238:15:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26476,"name":"address","nodeType":"ElementaryTypeName","src":"2238:7:242","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2222:32:242"},"returnParameters":{"id":26481,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26480,"mutability":"mutable","name":"value","nameLocation":"2292:5:242","nodeType":"VariableDeclaration","scope":26491,"src":"2284:13:242","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26479,"name":"uint256","nodeType":"ElementaryTypeName","src":"2284:7:242","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2283:15:242"},"scope":26492,"src":"2204:166:242","stateMutability":"view","virtual":true,"visibility":"public"}],"scope":26493,"src":"529:1843:242","usedErrors":[27019,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:2341:242"},"id":242},"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol","exportedSymbols":{"Context":[1206],"ERC20BatchTransfersBase":[26565],"ERC20Storage":[30139],"IERC20BatchTransfers":[27893]},"id":26566,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26494,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:243"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol","file":"./../interfaces/IERC20BatchTransfers.sol","id":26496,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26566,"sourceUnit":27894,"src":"58:78:243","symbolAliases":[{"foreign":{"id":26495,"name":"IERC20BatchTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27893,"src":"66:20:243","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":26498,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26566,"sourceUnit":30140,"src":"137:61:243","symbolAliases":[{"foreign":{"id":26497,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"145:12:243","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26500,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26566,"sourceUnit":1207,"src":"199:66:243","symbolAliases":[{"foreign":{"id":26499,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"207:7:243","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26502,"name":"IERC20BatchTransfers","nameLocations":["564:20:243"],"nodeType":"IdentifierPath","referencedDeclaration":27893,"src":"564:20:243"},"id":26503,"nodeType":"InheritanceSpecifier","src":"564:20:243"},{"baseName":{"id":26504,"name":"Context","nameLocations":["586:7:243"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"586:7:243"},"id":26505,"nodeType":"InheritanceSpecifier","src":"586:7:243"}],"canonicalName":"ERC20BatchTransfersBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26501,"nodeType":"StructuredDocumentation","src":"267:252:243","text":"@title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard)."},"fullyImplemented":true,"id":26565,"linearizedBaseContracts":[26565,1206,27893],"name":"ERC20BatchTransfersBase","nameLocation":"537:23:243","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26509,"libraryName":{"id":26506,"name":"ERC20Storage","nameLocations":["606:12:243"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"606:12:243"},"nodeType":"UsingForDirective","src":"600:43:243","typeName":{"id":26508,"nodeType":"UserDefinedTypeName","pathNode":{"id":26507,"name":"ERC20Storage.Layout","nameLocations":["623:12:243","636:6:243"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"623:19:243"},"referencedDeclaration":28678,"src":"623:19:243","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"baseFunctions":[27878],"body":{"id":26534,"nodeType":"Block","src":"803:107:243","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26526,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"849:10:243","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"849:12:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26528,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26513,"src":"863:10:243","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":26529,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26516,"src":"875:6:243","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26521,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"813:12:243","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"826:6:243","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"813:19:243","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"813:21:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26525,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"835:13:243","memberName":"batchTransfer","nodeType":"MemberAccess","referencedDeclaration":29334,"src":"813:35:243","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address[] calldata,uint256[] calldata)"}},"id":26530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"813:69:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26531,"nodeType":"ExpressionStatement","src":"813:69:243"},{"expression":{"hexValue":"74727565","id":26532,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"899:4:243","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26520,"id":26533,"nodeType":"Return","src":"892:11:243"}]},"documentation":{"id":26510,"nodeType":"StructuredDocumentation","src":"649:36:243","text":"@inheritdoc IERC20BatchTransfers"},"functionSelector":"88d695b2","id":26535,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransfer","nameLocation":"699:13:243","nodeType":"FunctionDefinition","parameters":{"id":26517,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26513,"mutability":"mutable","name":"recipients","nameLocation":"732:10:243","nodeType":"VariableDeclaration","scope":26535,"src":"713:29:243","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":26511,"name":"address","nodeType":"ElementaryTypeName","src":"713:7:243","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":26512,"nodeType":"ArrayTypeName","src":"713:9:243","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":26516,"mutability":"mutable","name":"values","nameLocation":"763:6:243","nodeType":"VariableDeclaration","scope":26535,"src":"744:25:243","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":26514,"name":"uint256","nodeType":"ElementaryTypeName","src":"744:7:243","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":26515,"nodeType":"ArrayTypeName","src":"744:9:243","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"712:58:243"},"returnParameters":{"id":26520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26519,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26535,"src":"797:4:243","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26518,"name":"bool","nodeType":"ElementaryTypeName","src":"797:4:243","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"796:6:243"},"scope":26565,"src":"690:220:243","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27892],"body":{"id":26563,"nodeType":"Block","src":"1088:117:243","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26554,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1138:10:243","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1138:12:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26556,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26538,"src":"1152:4:243","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26557,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26541,"src":"1158:10:243","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":26558,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26544,"src":"1170:6:243","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26549,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1098:12:243","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26551,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1111:6:243","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1098:19:243","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26552,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1098:21:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26553,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1120:17:243","memberName":"batchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":29523,"src":"1098:39:243","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,address[] calldata,uint256[] calldata)"}},"id":26559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1098:79:243","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26560,"nodeType":"ExpressionStatement","src":"1098:79:243"},{"expression":{"hexValue":"74727565","id":26561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1194:4:243","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26548,"id":26562,"nodeType":"Return","src":"1187:11:243"}]},"documentation":{"id":26536,"nodeType":"StructuredDocumentation","src":"916:36:243","text":"@inheritdoc IERC20BatchTransfers"},"functionSelector":"4885b254","id":26564,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"966:17:243","nodeType":"FunctionDefinition","parameters":{"id":26545,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26538,"mutability":"mutable","name":"from","nameLocation":"992:4:243","nodeType":"VariableDeclaration","scope":26564,"src":"984:12:243","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26537,"name":"address","nodeType":"ElementaryTypeName","src":"984:7:243","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26541,"mutability":"mutable","name":"recipients","nameLocation":"1017:10:243","nodeType":"VariableDeclaration","scope":26564,"src":"998:29:243","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":26539,"name":"address","nodeType":"ElementaryTypeName","src":"998:7:243","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":26540,"nodeType":"ArrayTypeName","src":"998:9:243","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":26544,"mutability":"mutable","name":"values","nameLocation":"1048:6:243","nodeType":"VariableDeclaration","scope":26564,"src":"1029:25:243","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":26542,"name":"uint256","nodeType":"ElementaryTypeName","src":"1029:7:243","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":26543,"nodeType":"ArrayTypeName","src":"1029:9:243","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"983:72:243"},"returnParameters":{"id":26548,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26547,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26564,"src":"1082:4:243","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26546,"name":"bool","nodeType":"ElementaryTypeName","src":"1082:4:243","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1081:6:243"},"scope":26565,"src":"957:248:243","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":26566,"src":"519:688:243","usedErrors":[7886,27024,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:1176:243"},"id":243},"contracts/token/ERC20/base/ERC20BurnableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20BurnableBase.sol","exportedSymbols":{"Context":[1206],"ERC20BurnableBase":[26654],"ERC20Storage":[30139],"IERC20Burnable":[27927]},"id":26655,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26567,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:244"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Burnable.sol","file":"./../interfaces/IERC20Burnable.sol","id":26569,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26655,"sourceUnit":27928,"src":"58:66:244","symbolAliases":[{"foreign":{"id":26568,"name":"IERC20Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27927,"src":"66:14:244","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":26571,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26655,"sourceUnit":30140,"src":"125:61:244","symbolAliases":[{"foreign":{"id":26570,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"133:12:244","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26573,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26655,"sourceUnit":1207,"src":"187:66:244","symbolAliases":[{"foreign":{"id":26572,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"195:7:244","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26575,"name":"IERC20Burnable","nameLocations":["539:14:244"],"nodeType":"IdentifierPath","referencedDeclaration":27927,"src":"539:14:244"},"id":26576,"nodeType":"InheritanceSpecifier","src":"539:14:244"},{"baseName":{"id":26577,"name":"Context","nameLocations":["555:7:244"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"555:7:244"},"id":26578,"nodeType":"InheritanceSpecifier","src":"555:7:244"}],"canonicalName":"ERC20BurnableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26574,"nodeType":"StructuredDocumentation","src":"255:245:244","text":"@title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard)."},"fullyImplemented":true,"id":26654,"linearizedBaseContracts":[26654,1206,27927],"name":"ERC20BurnableBase","nameLocation":"518:17:244","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26582,"libraryName":{"id":26579,"name":"ERC20Storage","nameLocations":["575:12:244"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"575:12:244"},"nodeType":"UsingForDirective","src":"569:43:244","typeName":{"id":26581,"nodeType":"UserDefinedTypeName","pathNode":{"id":26580,"name":"ERC20Storage.Layout","nameLocations":["592:12:244","605:6:244"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"592:19:244"},"referencedDeclaration":28678,"src":"592:19:244","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"baseFunctions":[27904],"body":{"id":26602,"nodeType":"Block","src":"714:85:244","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26595,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"751:10:244","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"751:12:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26597,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26585,"src":"765:5:244","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26590,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"724:12:244","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"737:6:244","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"724:19:244","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26593,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"724:21:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26594,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"746:4:244","memberName":"burn","nodeType":"MemberAccess","referencedDeclaration":29875,"src":"724:26:244","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,uint256)"}},"id":26598,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"724:47:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26599,"nodeType":"ExpressionStatement","src":"724:47:244"},{"expression":{"hexValue":"74727565","id":26600,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"788:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26589,"id":26601,"nodeType":"Return","src":"781:11:244"}]},"documentation":{"id":26583,"nodeType":"StructuredDocumentation","src":"618:30:244","text":"@inheritdoc IERC20Burnable"},"functionSelector":"42966c68","id":26603,"implemented":true,"kind":"function","modifiers":[],"name":"burn","nameLocation":"662:4:244","nodeType":"FunctionDefinition","parameters":{"id":26586,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26585,"mutability":"mutable","name":"value","nameLocation":"675:5:244","nodeType":"VariableDeclaration","scope":26603,"src":"667:13:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26584,"name":"uint256","nodeType":"ElementaryTypeName","src":"667:7:244","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"666:15:244"},"returnParameters":{"id":26589,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26588,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26603,"src":"708:4:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26587,"name":"bool","nodeType":"ElementaryTypeName","src":"708:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"707:6:244"},"scope":26654,"src":"653:146:244","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27914],"body":{"id":26626,"nodeType":"Block","src":"919:95:244","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26618,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"960:10:244","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"960:12:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26620,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26606,"src":"974:4:244","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26621,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26608,"src":"980:5:244","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26613,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"929:12:244","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"942:6:244","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"929:19:244","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26616,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"929:21:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26617,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"951:8:244","memberName":"burnFrom","nodeType":"MemberAccess","referencedDeclaration":29909,"src":"929:30:244","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":26622,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"929:57:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26623,"nodeType":"ExpressionStatement","src":"929:57:244"},{"expression":{"hexValue":"74727565","id":26624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1003:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26612,"id":26625,"nodeType":"Return","src":"996:11:244"}]},"documentation":{"id":26604,"nodeType":"StructuredDocumentation","src":"805:30:244","text":"@inheritdoc IERC20Burnable"},"functionSelector":"79cc6790","id":26627,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"849:8:244","nodeType":"FunctionDefinition","parameters":{"id":26609,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26606,"mutability":"mutable","name":"from","nameLocation":"866:4:244","nodeType":"VariableDeclaration","scope":26627,"src":"858:12:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26605,"name":"address","nodeType":"ElementaryTypeName","src":"858:7:244","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26608,"mutability":"mutable","name":"value","nameLocation":"880:5:244","nodeType":"VariableDeclaration","scope":26627,"src":"872:13:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26607,"name":"uint256","nodeType":"ElementaryTypeName","src":"872:7:244","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"857:29:244"},"returnParameters":{"id":26612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26611,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26627,"src":"913:4:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26610,"name":"bool","nodeType":"ElementaryTypeName","src":"913:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"912:6:244"},"scope":26654,"src":"840:174:244","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27926],"body":{"id":26652,"nodeType":"Block","src":"1164:103:244","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26644,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1210:10:244","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1210:12:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26646,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26631,"src":"1224:6:244","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":26647,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26634,"src":"1232:6:244","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26639,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1174:12:244","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26641,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1187:6:244","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1174:19:244","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1174:21:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26643,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1196:13:244","memberName":"batchBurnFrom","nodeType":"MemberAccess","referencedDeclaration":30044,"src":"1174:35:244","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_array$_t_address_$dyn_calldata_ptr_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address[] calldata,uint256[] calldata)"}},"id":26648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1174:65:244","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26649,"nodeType":"ExpressionStatement","src":"1174:65:244"},{"expression":{"hexValue":"74727565","id":26650,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1256:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26638,"id":26651,"nodeType":"Return","src":"1249:11:244"}]},"documentation":{"id":26628,"nodeType":"StructuredDocumentation","src":"1020:30:244","text":"@inheritdoc IERC20Burnable"},"functionSelector":"1b9a7529","id":26653,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"1064:13:244","nodeType":"FunctionDefinition","parameters":{"id":26635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26631,"mutability":"mutable","name":"owners","nameLocation":"1097:6:244","nodeType":"VariableDeclaration","scope":26653,"src":"1078:25:244","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":26629,"name":"address","nodeType":"ElementaryTypeName","src":"1078:7:244","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":26630,"nodeType":"ArrayTypeName","src":"1078:9:244","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":26634,"mutability":"mutable","name":"values","nameLocation":"1124:6:244","nodeType":"VariableDeclaration","scope":26653,"src":"1105:25:244","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":26632,"name":"uint256","nodeType":"ElementaryTypeName","src":"1105:7:244","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":26633,"nodeType":"ArrayTypeName","src":"1105:9:244","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1077:54:244"},"returnParameters":{"id":26638,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26637,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26653,"src":"1158:4:244","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26636,"name":"bool","nodeType":"ElementaryTypeName","src":"1158:4:244","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1157:6:244"},"scope":26654,"src":"1055:212:244","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":26655,"src":"500:769:244","usedErrors":[7886,27031,27042,27056],"usedEvents":[27102,27111]}],"src":"32:1238:244"},"id":244},"contracts/token/ERC20/base/ERC20DetailedBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20DetailedBase.sol","exportedSymbols":{"ERC20DetailedBase":[26707],"ERC20DetailedStorage":[28291],"IERC20Detailed":[27949]},"id":26708,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26656,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:245"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Detailed.sol","file":"./../interfaces/IERC20Detailed.sol","id":26658,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26708,"sourceUnit":27950,"src":"58:66:245","symbolAliases":[{"foreign":{"id":26657,"name":"IERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27949,"src":"66:14:245","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./../libraries/ERC20DetailedStorage.sol","id":26660,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26708,"sourceUnit":28292,"src":"125:77:245","symbolAliases":[{"foreign":{"id":26659,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"133:20:245","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26662,"name":"IERC20Detailed","nameLocations":["488:14:245"],"nodeType":"IdentifierPath","referencedDeclaration":27949,"src":"488:14:245"},"id":26663,"nodeType":"InheritanceSpecifier","src":"488:14:245"}],"canonicalName":"ERC20DetailedBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26661,"nodeType":"StructuredDocumentation","src":"204:245:245","text":"@title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard)."},"fullyImplemented":true,"id":26707,"linearizedBaseContracts":[26707,27949],"name":"ERC20DetailedBase","nameLocation":"467:17:245","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26667,"libraryName":{"id":26664,"name":"ERC20DetailedStorage","nameLocations":["515:20:245"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"515:20:245"},"nodeType":"UsingForDirective","src":"509:59:245","typeName":{"id":26666,"nodeType":"UserDefinedTypeName","pathNode":{"id":26665,"name":"ERC20DetailedStorage.Layout","nameLocations":["540:20:245","561:6:245"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"540:27:245"},"referencedDeclaration":28118,"src":"540:27:245","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"baseFunctions":[27936],"body":{"id":26679,"nodeType":"Block","src":"671:60:245","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26673,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"688:20:245","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":26674,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"709:6:245","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"688:27:245","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":26675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"688:29:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":26676,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"718:4:245","memberName":"name","nodeType":"MemberAccess","referencedDeclaration":28252,"src":"688:34:245","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28118_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer) view returns (string memory)"}},"id":26677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"688:36:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":26672,"id":26678,"nodeType":"Return","src":"681:43:245"}]},"documentation":{"id":26668,"nodeType":"StructuredDocumentation","src":"574:30:245","text":"@inheritdoc IERC20Detailed"},"functionSelector":"06fdde03","id":26680,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"618:4:245","nodeType":"FunctionDefinition","parameters":{"id":26669,"nodeType":"ParameterList","parameters":[],"src":"622:2:245"},"returnParameters":{"id":26672,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26671,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26680,"src":"656:13:245","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":26670,"name":"string","nodeType":"ElementaryTypeName","src":"656:6:245","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"655:15:245"},"scope":26707,"src":"609:122:245","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[27942],"body":{"id":26692,"nodeType":"Block","src":"836:62:245","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26686,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"853:20:245","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":26687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"874:6:245","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"853:27:245","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":26688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"853:29:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":26689,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"883:6:245","memberName":"symbol","nodeType":"MemberAccess","referencedDeclaration":28265,"src":"853:36:245","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28118_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer) view returns (string memory)"}},"id":26690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"853:38:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":26685,"id":26691,"nodeType":"Return","src":"846:45:245"}]},"documentation":{"id":26681,"nodeType":"StructuredDocumentation","src":"737:30:245","text":"@inheritdoc IERC20Detailed"},"functionSelector":"95d89b41","id":26693,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"781:6:245","nodeType":"FunctionDefinition","parameters":{"id":26682,"nodeType":"ParameterList","parameters":[],"src":"787:2:245"},"returnParameters":{"id":26685,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26684,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26693,"src":"821:13:245","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":26683,"name":"string","nodeType":"ElementaryTypeName","src":"821:6:245","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"820:15:245"},"scope":26707,"src":"772:126:245","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[27948],"body":{"id":26705,"nodeType":"Block","src":"997:64:245","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26699,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"1014:20:245","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":26700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1035:6:245","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"1014:27:245","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":26701,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1014:29:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":26702,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1044:8:245","memberName":"decimals","nodeType":"MemberAccess","referencedDeclaration":28278,"src":"1014:38:245","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28118_storage_ptr_$returns$_t_uint8_$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer) view returns (uint8)"}},"id":26703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1014:40:245","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":26698,"id":26704,"nodeType":"Return","src":"1007:47:245"}]},"documentation":{"id":26694,"nodeType":"StructuredDocumentation","src":"904:30:245","text":"@inheritdoc IERC20Detailed"},"functionSelector":"313ce567","id":26706,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"948:8:245","nodeType":"FunctionDefinition","parameters":{"id":26695,"nodeType":"ParameterList","parameters":[],"src":"956:2:245"},"returnParameters":{"id":26698,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26697,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26706,"src":"990:5:245","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":26696,"name":"uint8","nodeType":"ElementaryTypeName","src":"990:5:245","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"989:7:245"},"scope":26707,"src":"939:122:245","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":26708,"src":"449:614:245","usedErrors":[],"usedEvents":[]}],"src":"32:1032:245"},"id":245},"contracts/token/ERC20/base/ERC20MetadataBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20MetadataBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"ERC20MetadataBase":[26768],"ERC20MetadataStorage":[28380],"IERC20Metadata":[27959]},"id":26769,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26709,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:246"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Metadata.sol","file":"./../interfaces/IERC20Metadata.sol","id":26711,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26769,"sourceUnit":27960,"src":"58:66:246","symbolAliases":[{"foreign":{"id":26710,"name":"IERC20Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27959,"src":"66:14:246","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","file":"./../libraries/ERC20MetadataStorage.sol","id":26713,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26769,"sourceUnit":28381,"src":"125:77:246","symbolAliases":[{"foreign":{"id":26712,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"133:20:246","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../access/libraries/ContractOwnershipStorage.sol","id":26715,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26769,"sourceUnit":9110,"src":"203:98:246","symbolAliases":[{"foreign":{"id":26714,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"211:24:246","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26717,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26769,"sourceUnit":1207,"src":"302:66:246","symbolAliases":[{"foreign":{"id":26716,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"310:7:246","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26719,"name":"IERC20Metadata","nameLocations":["730:14:246"],"nodeType":"IdentifierPath","referencedDeclaration":27959,"src":"730:14:246"},"id":26720,"nodeType":"InheritanceSpecifier","src":"730:14:246"},{"baseName":{"id":26721,"name":"Context","nameLocations":["746:7:246"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"746:7:246"},"id":26722,"nodeType":"InheritanceSpecifier","src":"746:7:246"}],"canonicalName":"ERC20MetadataBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26718,"nodeType":"StructuredDocumentation","src":"370:321:246","text":"@title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard).\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":26768,"linearizedBaseContracts":[26768,1206,27959],"name":"ERC20MetadataBase","nameLocation":"709:17:246","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26726,"libraryName":{"id":26723,"name":"ERC20MetadataStorage","nameLocations":["766:20:246"],"nodeType":"IdentifierPath","referencedDeclaration":28380,"src":"766:20:246"},"nodeType":"UsingForDirective","src":"760:59:246","typeName":{"id":26725,"nodeType":"UserDefinedTypeName","pathNode":{"id":26724,"name":"ERC20MetadataStorage.Layout","nameLocations":["791:20:246","812:6:246"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"791:27:246"},"referencedDeclaration":28308,"src":"791:27:246","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}}},{"global":false,"id":26730,"libraryName":{"id":26727,"name":"ContractOwnershipStorage","nameLocations":["830:24:246"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"830:24:246"},"nodeType":"UsingForDirective","src":"824:67:246","typeName":{"id":26729,"nodeType":"UserDefinedTypeName","pathNode":{"id":26728,"name":"ContractOwnershipStorage.Layout","nameLocations":["859:24:246","884:6:246"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"859:31:246"},"referencedDeclaration":8882,"src":"859:31:246","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":26753,"nodeType":"Block","src":"1112:143:246","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26741,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1179:10:246","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1179:12:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26736,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1122:24:246","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":26738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1147:6:246","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1122:31:246","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":26739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1122:33:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":26740,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1156:22:246","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1122:56:246","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":26743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1122:70:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26744,"nodeType":"ExpressionStatement","src":"1122:70:246"},{"expression":{"arguments":[{"id":26750,"name":"uri","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26733,"src":"1244:3:246","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26745,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"1202:20:246","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":26747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1223:6:246","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28379,"src":"1202:27:246","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28308_storage_ptr_$","typeString":"function () pure returns (struct ERC20MetadataStorage.Layout storage pointer)"}},"id":26748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1202:29:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout storage pointer"}},"id":26749,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1232:11:246","memberName":"setTokenURI","nodeType":"MemberAccess","referencedDeclaration":28354,"src":"1202:41:246","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28308_storage_ptr_$_t_string_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28308_storage_ptr_$","typeString":"function (struct ERC20MetadataStorage.Layout storage pointer,string calldata)"}},"id":26751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1202:46:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26752,"nodeType":"ExpressionStatement","src":"1202:46:246"}]},"documentation":{"id":26731,"nodeType":"StructuredDocumentation","src":"897:151:246","text":"@notice Sets the token URI.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @param uri The token URI."},"functionSelector":"e0df5b6f","id":26754,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"1062:11:246","nodeType":"FunctionDefinition","parameters":{"id":26734,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26733,"mutability":"mutable","name":"uri","nameLocation":"1090:3:246","nodeType":"VariableDeclaration","scope":26754,"src":"1074:19:246","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":26732,"name":"string","nodeType":"ElementaryTypeName","src":"1074:6:246","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1073:21:246"},"returnParameters":{"id":26735,"nodeType":"ParameterList","parameters":[],"src":"1112:0:246"},"scope":26768,"src":"1053:202:246","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27958],"body":{"id":26766,"nodeType":"Block","src":"1362:64:246","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26760,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"1379:20:246","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":26761,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1400:6:246","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28379,"src":"1379:27:246","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28308_storage_ptr_$","typeString":"function () pure returns (struct ERC20MetadataStorage.Layout storage pointer)"}},"id":26762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1379:29:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout storage pointer"}},"id":26763,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1409:8:246","memberName":"tokenURI","nodeType":"MemberAccess","referencedDeclaration":28367,"src":"1379:38:246","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28308_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$28308_storage_ptr_$","typeString":"function (struct ERC20MetadataStorage.Layout storage pointer) view returns (string memory)"}},"id":26764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1379:40:246","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":26759,"id":26765,"nodeType":"Return","src":"1372:47:246"}]},"documentation":{"id":26755,"nodeType":"StructuredDocumentation","src":"1261:30:246","text":"@inheritdoc IERC20Metadata"},"functionSelector":"3c130d90","id":26767,"implemented":true,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"1305:8:246","nodeType":"FunctionDefinition","parameters":{"id":26756,"nodeType":"ParameterList","parameters":[],"src":"1313:2:246"},"returnParameters":{"id":26759,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26758,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26767,"src":"1347:13:246","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":26757,"name":"string","nodeType":"ElementaryTypeName","src":"1347:6:246","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1346:15:246"},"scope":26768,"src":"1296:130:246","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":26769,"src":"691:737:246","usedErrors":[8246],"usedEvents":[]}],"src":"32:1397:246"},"id":246},"contracts/token/ERC20/base/ERC20MintableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20MintableBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC20MintableBase":[26853],"ERC20Storage":[30139],"IERC20Mintable":[27981]},"id":26854,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26770,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:247"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Mintable.sol","file":"./../interfaces/IERC20Mintable.sol","id":26772,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26854,"sourceUnit":27982,"src":"58:66:247","symbolAliases":[{"foreign":{"id":26771,"name":"IERC20Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27981,"src":"66:14:247","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":26774,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26854,"sourceUnit":30140,"src":"125:61:247","symbolAliases":[{"foreign":{"id":26773,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"133:12:247","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":26776,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26854,"sourceUnit":8852,"src":"187:90:247","symbolAliases":[{"foreign":{"id":26775,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"195:20:247","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26778,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26854,"sourceUnit":1207,"src":"278:66:247","symbolAliases":[{"foreign":{"id":26777,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"286:7:247","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26780,"name":"IERC20Mintable","nameLocations":["683:14:247"],"nodeType":"IdentifierPath","referencedDeclaration":27981,"src":"683:14:247"},"id":26781,"nodeType":"InheritanceSpecifier","src":"683:14:247"},{"baseName":{"id":26782,"name":"Context","nameLocations":["699:7:247"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"699:7:247"},"id":26783,"nodeType":"InheritanceSpecifier","src":"699:7:247"}],"canonicalName":"ERC20MintableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26779,"nodeType":"StructuredDocumentation","src":"346:298:247","text":"@title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":26853,"linearizedBaseContracts":[26853,1206,27981],"name":"ERC20MintableBase","nameLocation":"662:17:247","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26787,"libraryName":{"id":26784,"name":"ERC20Storage","nameLocations":["719:12:247"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"719:12:247"},"nodeType":"UsingForDirective","src":"713:43:247","typeName":{"id":26786,"nodeType":"UserDefinedTypeName","pathNode":{"id":26785,"name":"ERC20Storage.Layout","nameLocations":["736:12:247","749:6:247"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"736:19:247"},"referencedDeclaration":28678,"src":"736:19:247","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":26791,"libraryName":{"id":26788,"name":"AccessControlStorage","nameLocations":["767:20:247"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"767:20:247"},"nodeType":"UsingForDirective","src":"761:59:247","typeName":{"id":26790,"nodeType":"UserDefinedTypeName","pathNode":{"id":26789,"name":"AccessControlStorage.Layout","nameLocations":["792:20:247","813:6:247"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"792:27:247"},"referencedDeclaration":8616,"src":"792:27:247","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"d5391393","id":26794,"mutability":"constant","name":"MINTER_ROLE","nameLocation":"850:11:247","nodeType":"VariableDeclaration","scope":26853,"src":"826:46:247","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":26792,"name":"bytes32","nodeType":"ElementaryTypeName","src":"826:7:247","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":26793,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"864:8:247","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"public"},{"baseFunctions":[27970],"body":{"id":26821,"nodeType":"Block","src":"1061:135:247","statements":[{"expression":{"arguments":[{"id":26807,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26794,"src":"1116:11:247","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":26808,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1129:10:247","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1129:12:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26802,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1071:20:247","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":26804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1092:6:247","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1071:27:247","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":26805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1071:29:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":26806,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1101:14:247","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1071:44:247","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":26810,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1071:71:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26811,"nodeType":"ExpressionStatement","src":"1071:71:247"},{"expression":{"arguments":[{"id":26817,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26797,"src":"1179:2:247","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26818,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26799,"src":"1183:5:247","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26812,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1152:12:247","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1165:6:247","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1152:19:247","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26815,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1152:21:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26816,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1174:4:247","memberName":"mint","nodeType":"MemberAccess","referencedDeclaration":29671,"src":"1152:26:247","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,uint256)"}},"id":26819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1152:37:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26820,"nodeType":"ExpressionStatement","src":"1152:37:247"}]},"documentation":{"id":26795,"nodeType":"StructuredDocumentation","src":"879:119:247","text":"@inheritdoc IERC20Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"40c10f19","id":26822,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"1012:4:247","nodeType":"FunctionDefinition","parameters":{"id":26800,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26797,"mutability":"mutable","name":"to","nameLocation":"1025:2:247","nodeType":"VariableDeclaration","scope":26822,"src":"1017:10:247","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26796,"name":"address","nodeType":"ElementaryTypeName","src":"1017:7:247","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26799,"mutability":"mutable","name":"value","nameLocation":"1037:5:247","nodeType":"VariableDeclaration","scope":26822,"src":"1029:13:247","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26798,"name":"uint256","nodeType":"ElementaryTypeName","src":"1029:7:247","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1016:27:247"},"returnParameters":{"id":26801,"nodeType":"ParameterList","parameters":[],"src":"1061:0:247"},"scope":26853,"src":"1003:193:247","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[27980],"body":{"id":26851,"nodeType":"Block","src":"1420:149:247","statements":[{"expression":{"arguments":[{"id":26837,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26794,"src":"1475:11:247","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":26838,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1488:10:247","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26839,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1488:12:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26832,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1430:20:247","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":26834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1451:6:247","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1430:27:247","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":26835,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1430:29:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":26836,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1460:14:247","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1430:44:247","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":26840,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1430:71:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26841,"nodeType":"ExpressionStatement","src":"1430:71:247"},{"expression":{"arguments":[{"id":26847,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26826,"src":"1543:10:247","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":26848,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26829,"src":"1555:6:247","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26842,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1511:12:247","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1524:6:247","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1511:19:247","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1511:21:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26846,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1533:9:247","memberName":"batchMint","nodeType":"MemberAccess","referencedDeclaration":29811,"src":"1511:31:247","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":26849,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1511:51:247","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26850,"nodeType":"ExpressionStatement","src":"1511:51:247"}]},"documentation":{"id":26823,"nodeType":"StructuredDocumentation","src":"1202:119:247","text":"@inheritdoc IERC20Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"68573107","id":26852,"implemented":true,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"1335:9:247","nodeType":"FunctionDefinition","parameters":{"id":26830,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26826,"mutability":"mutable","name":"recipients","nameLocation":"1364:10:247","nodeType":"VariableDeclaration","scope":26852,"src":"1345:29:247","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":26824,"name":"address","nodeType":"ElementaryTypeName","src":"1345:7:247","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":26825,"nodeType":"ArrayTypeName","src":"1345:9:247","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":26829,"mutability":"mutable","name":"values","nameLocation":"1395:6:247","nodeType":"VariableDeclaration","scope":26852,"src":"1376:25:247","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":26827,"name":"uint256","nodeType":"ElementaryTypeName","src":"1376:7:247","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":26828,"nodeType":"ArrayTypeName","src":"1376:9:247","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1344:58:247"},"returnParameters":{"id":26831,"nodeType":"ParameterList","parameters":[],"src":"1420:0:247"},"scope":26853,"src":"1326:243:247","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":26854,"src":"644:927:247","usedErrors":[7886,8223,27061,27064,27071],"usedEvents":[27102]}],"src":"32:1540:247"},"id":247},"contracts/token/ERC20/base/ERC20PermitBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20PermitBase.sol","exportedSymbols":{"Context":[1206],"ERC20PermitBase":[26931],"ERC20PermitStorage":[28612],"IERC20Permit":[28017]},"id":26932,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26855,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:248"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Permit.sol","file":"./../interfaces/IERC20Permit.sol","id":26857,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26932,"sourceUnit":28018,"src":"58:62:248","symbolAliases":[{"foreign":{"id":26856,"name":"IERC20Permit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28017,"src":"66:12:248","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","file":"./../libraries/ERC20PermitStorage.sol","id":26859,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26932,"sourceUnit":28613,"src":"121:73:248","symbolAliases":[{"foreign":{"id":26858,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"129:18:248","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26861,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":26932,"sourceUnit":1207,"src":"195:66:248","symbolAliases":[{"foreign":{"id":26860,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"203:7:248","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26863,"name":"IERC20Permit","nameLocations":["596:12:248"],"nodeType":"IdentifierPath","referencedDeclaration":28017,"src":"596:12:248"},"id":26864,"nodeType":"InheritanceSpecifier","src":"596:12:248"},{"baseName":{"id":26865,"name":"Context","nameLocations":["610:7:248"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"610:7:248"},"id":26866,"nodeType":"InheritanceSpecifier","src":"610:7:248"}],"canonicalName":"ERC20PermitBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26862,"nodeType":"StructuredDocumentation","src":"263:296:248","text":"@title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard).\n @dev Note: This contract requires ERC20Detailed."},"fullyImplemented":true,"id":26931,"linearizedBaseContracts":[26931,1206,28017],"name":"ERC20PermitBase","nameLocation":"577:15:248","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26870,"libraryName":{"id":26867,"name":"ERC20PermitStorage","nameLocations":["630:18:248"],"nodeType":"IdentifierPath","referencedDeclaration":28612,"src":"630:18:248"},"nodeType":"UsingForDirective","src":"624:55:248","typeName":{"id":26869,"nodeType":"UserDefinedTypeName","pathNode":{"id":26868,"name":"ERC20PermitStorage.Layout","nameLocations":["653:18:248","672:6:248"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"653:25:248"},"referencedDeclaration":28411,"src":"653:25:248","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}}},{"baseFunctions":[28002],"body":{"id":26902,"nodeType":"Block","src":"839:93:248","statements":[{"expression":{"arguments":[{"id":26893,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26873,"src":"884:5:248","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26894,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26875,"src":"891:7:248","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26895,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26877,"src":"900:5:248","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":26896,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26879,"src":"907:8:248","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":26897,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26881,"src":"917:1:248","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":26898,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26883,"src":"920:1:248","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":26899,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26885,"src":"923:1:248","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26888,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"849:18:248","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":26890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"868:6:248","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28611,"src":"849:25:248","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28411_storage_ptr_$","typeString":"function () pure returns (struct ERC20PermitStorage.Layout storage pointer)"}},"id":26891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"849:27:248","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout storage pointer"}},"id":26892,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"877:6:248","memberName":"permit","nodeType":"MemberAccess","referencedDeclaration":28544,"src":"849:34:248","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28411_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$attached_to$_t_struct$_Layout_$28411_storage_ptr_$","typeString":"function (struct ERC20PermitStorage.Layout storage pointer,address,address,uint256,uint256,uint8,bytes32,bytes32)"}},"id":26900,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"849:76:248","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26901,"nodeType":"ExpressionStatement","src":"849:76:248"}]},"documentation":{"id":26871,"nodeType":"StructuredDocumentation","src":"685:28:248","text":"@inheritdoc IERC20Permit"},"functionSelector":"d505accf","id":26903,"implemented":true,"kind":"function","modifiers":[],"name":"permit","nameLocation":"727:6:248","nodeType":"FunctionDefinition","parameters":{"id":26886,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26873,"mutability":"mutable","name":"owner","nameLocation":"742:5:248","nodeType":"VariableDeclaration","scope":26903,"src":"734:13:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26872,"name":"address","nodeType":"ElementaryTypeName","src":"734:7:248","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26875,"mutability":"mutable","name":"spender","nameLocation":"757:7:248","nodeType":"VariableDeclaration","scope":26903,"src":"749:15:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26874,"name":"address","nodeType":"ElementaryTypeName","src":"749:7:248","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26877,"mutability":"mutable","name":"value","nameLocation":"774:5:248","nodeType":"VariableDeclaration","scope":26903,"src":"766:13:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26876,"name":"uint256","nodeType":"ElementaryTypeName","src":"766:7:248","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":26879,"mutability":"mutable","name":"deadline","nameLocation":"789:8:248","nodeType":"VariableDeclaration","scope":26903,"src":"781:16:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26878,"name":"uint256","nodeType":"ElementaryTypeName","src":"781:7:248","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":26881,"mutability":"mutable","name":"v","nameLocation":"805:1:248","nodeType":"VariableDeclaration","scope":26903,"src":"799:7:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":26880,"name":"uint8","nodeType":"ElementaryTypeName","src":"799:5:248","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":26883,"mutability":"mutable","name":"r","nameLocation":"816:1:248","nodeType":"VariableDeclaration","scope":26903,"src":"808:9:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":26882,"name":"bytes32","nodeType":"ElementaryTypeName","src":"808:7:248","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":26885,"mutability":"mutable","name":"s","nameLocation":"827:1:248","nodeType":"VariableDeclaration","scope":26903,"src":"819:9:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":26884,"name":"bytes32","nodeType":"ElementaryTypeName","src":"819:7:248","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"733:96:248"},"returnParameters":{"id":26887,"nodeType":"ParameterList","parameters":[],"src":"839:0:248"},"scope":26931,"src":"718:214:248","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[28010],"body":{"id":26918,"nodeType":"Block","src":"1042:65:248","statements":[{"expression":{"arguments":[{"id":26915,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26906,"src":"1094:5:248","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26911,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"1059:18:248","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":26912,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1078:6:248","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28611,"src":"1059:25:248","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28411_storage_ptr_$","typeString":"function () pure returns (struct ERC20PermitStorage.Layout storage pointer)"}},"id":26913,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1059:27:248","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout storage pointer"}},"id":26914,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1087:6:248","memberName":"nonces","nodeType":"MemberAccess","referencedDeclaration":28561,"src":"1059:34:248","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28411_storage_ptr_$_t_address_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$28411_storage_ptr_$","typeString":"function (struct ERC20PermitStorage.Layout storage pointer,address) view returns (uint256)"}},"id":26916,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1059:41:248","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":26910,"id":26917,"nodeType":"Return","src":"1052:48:248"}]},"documentation":{"id":26904,"nodeType":"StructuredDocumentation","src":"938:28:248","text":"@inheritdoc IERC20Permit"},"functionSelector":"7ecebe00","id":26919,"implemented":true,"kind":"function","modifiers":[],"name":"nonces","nameLocation":"980:6:248","nodeType":"FunctionDefinition","parameters":{"id":26907,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26906,"mutability":"mutable","name":"owner","nameLocation":"995:5:248","nodeType":"VariableDeclaration","scope":26919,"src":"987:13:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26905,"name":"address","nodeType":"ElementaryTypeName","src":"987:7:248","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"986:15:248"},"returnParameters":{"id":26910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26909,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26919,"src":"1033:7:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26908,"name":"uint256","nodeType":"ElementaryTypeName","src":"1033:7:248","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1032:9:248"},"scope":26931,"src":"971:136:248","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[28016],"body":{"id":26929,"nodeType":"Block","src":"1267:61:248","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26925,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"1284:18:248","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":26926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1303:16:248","memberName":"DOMAIN_SEPARATOR","nodeType":"MemberAccess","referencedDeclaration":28599,"src":"1284:35:248","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":26927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1284:37:248","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":26924,"id":26928,"nodeType":"Return","src":"1277:44:248"}]},"documentation":{"id":26920,"nodeType":"StructuredDocumentation","src":"1113:28:248","text":"@inheritdoc IERC20Permit"},"functionSelector":"3644e515","id":26930,"implemented":true,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"1208:16:248","nodeType":"FunctionDefinition","parameters":{"id":26921,"nodeType":"ParameterList","parameters":[],"src":"1224:2:248"},"returnParameters":{"id":26924,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26923,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26930,"src":"1258:7:248","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":26922,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1258:7:248","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1257:9:248"},"scope":26931,"src":"1199:129:248","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":26932,"src":"559:771:248","usedErrors":[27031,27076,27081,27084],"usedEvents":[27111]}],"src":"32:1299:248"},"id":248},"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol":{"ast":{"absolutePath":"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol","exportedSymbols":{"Context":[1206],"ERC20SafeTransfersBase":[27006],"ERC20Storage":[30139],"IERC20SafeTransfers":[28065]},"id":27007,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":26933,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:249"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol","file":"./../interfaces/IERC20SafeTransfers.sol","id":26935,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27007,"sourceUnit":28066,"src":"58:76:249","symbolAliases":[{"foreign":{"id":26934,"name":"IERC20SafeTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28065,"src":"66:19:249","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":26937,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27007,"sourceUnit":30140,"src":"135:61:249","symbolAliases":[{"foreign":{"id":26936,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"143:12:249","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":26939,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27007,"sourceUnit":1207,"src":"197:66:249","symbolAliases":[{"foreign":{"id":26938,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"205:7:249","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":26941,"name":"IERC20SafeTransfers","nameLocations":["560:19:249"],"nodeType":"IdentifierPath","referencedDeclaration":28065,"src":"560:19:249"},"id":26942,"nodeType":"InheritanceSpecifier","src":"560:19:249"},{"baseName":{"id":26943,"name":"Context","nameLocations":["581:7:249"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"581:7:249"},"id":26944,"nodeType":"InheritanceSpecifier","src":"581:7:249"}],"canonicalName":"ERC20SafeTransfersBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":26940,"nodeType":"StructuredDocumentation","src":"265:251:249","text":"@title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC20 (Fungible Token Standard)."},"fullyImplemented":true,"id":27006,"linearizedBaseContracts":[27006,1206,28065],"name":"ERC20SafeTransfersBase","nameLocation":"534:22:249","nodeType":"ContractDefinition","nodes":[{"global":false,"id":26948,"libraryName":{"id":26945,"name":"ERC20Storage","nameLocations":["601:12:249"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"601:12:249"},"nodeType":"UsingForDirective","src":"595:43:249","typeName":{"id":26947,"nodeType":"UserDefinedTypeName","pathNode":{"id":26946,"name":"ERC20Storage.Layout","nameLocations":["618:12:249","631:6:249"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"618:19:249"},"referencedDeclaration":28678,"src":"618:19:249","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"baseFunctions":[28050],"body":{"id":26974,"nodeType":"Block","src":"786:103:249","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26965,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"831:10:249","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26966,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"831:12:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26967,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26951,"src":"845:2:249","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26968,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26953,"src":"849:5:249","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":26969,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26955,"src":"856:4:249","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26960,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"796:12:249","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26962,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"809:6:249","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"796:19:249","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"796:21:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26964,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"818:12:249","memberName":"safeTransfer","nodeType":"MemberAccess","referencedDeclaration":29560,"src":"796:34:249","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256,bytes calldata)"}},"id":26970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"796:65:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":26971,"nodeType":"ExpressionStatement","src":"796:65:249"},{"expression":{"hexValue":"74727565","id":26972,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"878:4:249","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26959,"id":26973,"nodeType":"Return","src":"871:11:249"}]},"documentation":{"id":26949,"nodeType":"StructuredDocumentation","src":"644:35:249","text":"@inheritdoc IERC20SafeTransfers"},"functionSelector":"eb795549","id":26975,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransfer","nameLocation":"693:12:249","nodeType":"FunctionDefinition","parameters":{"id":26956,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26951,"mutability":"mutable","name":"to","nameLocation":"714:2:249","nodeType":"VariableDeclaration","scope":26975,"src":"706:10:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26950,"name":"address","nodeType":"ElementaryTypeName","src":"706:7:249","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26953,"mutability":"mutable","name":"value","nameLocation":"726:5:249","nodeType":"VariableDeclaration","scope":26975,"src":"718:13:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26952,"name":"uint256","nodeType":"ElementaryTypeName","src":"718:7:249","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":26955,"mutability":"mutable","name":"data","nameLocation":"748:4:249","nodeType":"VariableDeclaration","scope":26975,"src":"733:19:249","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":26954,"name":"bytes","nodeType":"ElementaryTypeName","src":"733:5:249","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"705:48:249"},"returnParameters":{"id":26959,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26958,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":26975,"src":"780:4:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26957,"name":"bool","nodeType":"ElementaryTypeName","src":"780:4:249","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"779:6:249"},"scope":27006,"src":"684:205:249","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[28064],"body":{"id":27004,"nodeType":"Block","src":"1055:113:249","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":26994,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1104:10:249","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":26995,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1104:12:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26996,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26978,"src":"1118:4:249","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26997,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26980,"src":"1124:2:249","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":26998,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26982,"src":"1128:5:249","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":26999,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26984,"src":"1135:4:249","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":26989,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1065:12:249","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":26991,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1078:6:249","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1065:19:249","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":26992,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1065:21:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":26993,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1087:16:249","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":29600,"src":"1065:38:249","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,address,uint256,bytes calldata)"}},"id":27000,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1065:75:249","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27001,"nodeType":"ExpressionStatement","src":"1065:75:249"},{"expression":{"hexValue":"74727565","id":27002,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1157:4:249","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":26988,"id":27003,"nodeType":"Return","src":"1150:11:249"}]},"documentation":{"id":26976,"nodeType":"StructuredDocumentation","src":"895:35:249","text":"@inheritdoc IERC20SafeTransfers"},"functionSelector":"b88d4fde","id":27005,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"944:16:249","nodeType":"FunctionDefinition","parameters":{"id":26985,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26978,"mutability":"mutable","name":"from","nameLocation":"969:4:249","nodeType":"VariableDeclaration","scope":27005,"src":"961:12:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26977,"name":"address","nodeType":"ElementaryTypeName","src":"961:7:249","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26980,"mutability":"mutable","name":"to","nameLocation":"983:2:249","nodeType":"VariableDeclaration","scope":27005,"src":"975:10:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26979,"name":"address","nodeType":"ElementaryTypeName","src":"975:7:249","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":26982,"mutability":"mutable","name":"value","nameLocation":"995:5:249","nodeType":"VariableDeclaration","scope":27005,"src":"987:13:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":26981,"name":"uint256","nodeType":"ElementaryTypeName","src":"987:7:249","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":26984,"mutability":"mutable","name":"data","nameLocation":"1017:4:249","nodeType":"VariableDeclaration","scope":27005,"src":"1002:19:249","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":26983,"name":"bytes","nodeType":"ElementaryTypeName","src":"1002:5:249","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"960:62:249"},"returnParameters":{"id":26988,"nodeType":"ParameterList","parameters":[{"constant":false,"id":26987,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27005,"src":"1049:4:249","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":26986,"name":"bool","nodeType":"ElementaryTypeName","src":"1049:4:249","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1048:6:249"},"scope":27006,"src":"935:233:249","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":27007,"src":"516:654:249","usedErrors":[27031,27042,27047,27056,27091],"usedEvents":[27102,27111]}],"src":"32:1139:249"},"id":249},"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol","exportedSymbols":{"ERC20AllowanceOverflow":[27019]},"id":27020,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27008,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:250"},{"documentation":{"id":27009,"nodeType":"StructuredDocumentation","src":"58:245:250","text":"@notice Thrown when the allowance increase creates an overflow.\n @param owner The owner of the tokens.\n @param spender The spender of the tokens.\n @param allowance The current allowance.\n @param increment The allowance increase."},"errorSelector":"93bc2ff1","id":27019,"name":"ERC20AllowanceOverflow","nameLocation":"309:22:250","nodeType":"ErrorDefinition","parameters":{"id":27018,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27011,"mutability":"mutable","name":"owner","nameLocation":"340:5:250","nodeType":"VariableDeclaration","scope":27019,"src":"332:13:250","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27010,"name":"address","nodeType":"ElementaryTypeName","src":"332:7:250","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27013,"mutability":"mutable","name":"spender","nameLocation":"355:7:250","nodeType":"VariableDeclaration","scope":27019,"src":"347:15:250","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27012,"name":"address","nodeType":"ElementaryTypeName","src":"347:7:250","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27015,"mutability":"mutable","name":"allowance","nameLocation":"372:9:250","nodeType":"VariableDeclaration","scope":27019,"src":"364:17:250","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27014,"name":"uint256","nodeType":"ElementaryTypeName","src":"364:7:250","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27017,"mutability":"mutable","name":"increment","nameLocation":"391:9:250","nodeType":"VariableDeclaration","scope":27019,"src":"383:17:250","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27016,"name":"uint256","nodeType":"ElementaryTypeName","src":"383:7:250","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"331:70:250"},"src":"303:99:250"}],"src":"32:371:250"},"id":250},"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol","exportedSymbols":{"ERC20BatchTransferValuesOverflow":[27024]},"id":27025,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27021,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:251"},{"documentation":{"id":27022,"nodeType":"StructuredDocumentation","src":"58:88:251","text":"@notice Thrown when the `values` array sum overflows on a batch transfer operation."},"errorSelector":"dedd8341","id":27024,"name":"ERC20BatchTransferValuesOverflow","nameLocation":"152:32:251","nodeType":"ErrorDefinition","parameters":{"id":27023,"nodeType":"ParameterList","parameters":[],"src":"184:2:251"},"src":"146:41:251"}],"src":"32:156:251"},"id":251},"contracts/token/ERC20/errors/ERC20Errors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20Errors.sol","exportedSymbols":{"ERC20ApprovalToAddressZero":[27031],"ERC20InsufficientAllowance":[27042],"ERC20InsufficientBalance":[27056],"ERC20TransferToAddressZero":[27047]},"id":27057,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27026,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:252"},{"documentation":{"id":27027,"nodeType":"StructuredDocumentation","src":"58:112:252","text":"@notice Thrown when setting an allowance to the the zero address.\n @param owner The owner of the tokens."},"errorSelector":"f7e1ac0f","id":27031,"name":"ERC20ApprovalToAddressZero","nameLocation":"176:26:252","nodeType":"ErrorDefinition","parameters":{"id":27030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27029,"mutability":"mutable","name":"owner","nameLocation":"211:5:252","nodeType":"VariableDeclaration","scope":27031,"src":"203:13:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27028,"name":"address","nodeType":"ElementaryTypeName","src":"203:7:252","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"202:15:252"},"src":"170:48:252"},{"documentation":{"id":27032,"nodeType":"StructuredDocumentation","src":"220:257:252","text":"@notice Thrown when the allowance decreases below the current alowance set.\n @param owner The owner of the tokens.\n @param spender The spender of the tokens.\n @param allowance The current allowance.\n @param decrement The allowance decrease."},"errorSelector":"137ad6ab","id":27042,"name":"ERC20InsufficientAllowance","nameLocation":"483:26:252","nodeType":"ErrorDefinition","parameters":{"id":27041,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27034,"mutability":"mutable","name":"owner","nameLocation":"518:5:252","nodeType":"VariableDeclaration","scope":27042,"src":"510:13:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27033,"name":"address","nodeType":"ElementaryTypeName","src":"510:7:252","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27036,"mutability":"mutable","name":"spender","nameLocation":"533:7:252","nodeType":"VariableDeclaration","scope":27042,"src":"525:15:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27035,"name":"address","nodeType":"ElementaryTypeName","src":"525:7:252","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27038,"mutability":"mutable","name":"allowance","nameLocation":"550:9:252","nodeType":"VariableDeclaration","scope":27042,"src":"542:17:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27037,"name":"uint256","nodeType":"ElementaryTypeName","src":"542:7:252","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27040,"mutability":"mutable","name":"decrement","nameLocation":"569:9:252","nodeType":"VariableDeclaration","scope":27042,"src":"561:17:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27039,"name":"uint256","nodeType":"ElementaryTypeName","src":"561:7:252","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"509:70:252"},"src":"477:103:252"},{"documentation":{"id":27043,"nodeType":"StructuredDocumentation","src":"582:133:252","text":"@notice Thrown when transferring tokens to the zero address.\n @param owner The account from which the tokens are transferred."},"errorSelector":"754f425b","id":27047,"name":"ERC20TransferToAddressZero","nameLocation":"721:26:252","nodeType":"ErrorDefinition","parameters":{"id":27046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27045,"mutability":"mutable","name":"owner","nameLocation":"756:5:252","nodeType":"VariableDeclaration","scope":27047,"src":"748:13:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27044,"name":"address","nodeType":"ElementaryTypeName","src":"748:7:252","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"747:15:252"},"src":"715:48:252"},{"documentation":{"id":27048,"nodeType":"StructuredDocumentation","src":"765:230:252","text":"@notice Thrown when transferring an amount of tokens greater than the current balance.\n @param owner The owner of the tokens.\n @param balance The current balance.\n @param value The amount of tokens being transferred."},"errorSelector":"e450d38c","id":27056,"name":"ERC20InsufficientBalance","nameLocation":"1001:24:252","nodeType":"ErrorDefinition","parameters":{"id":27055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27050,"mutability":"mutable","name":"owner","nameLocation":"1034:5:252","nodeType":"VariableDeclaration","scope":27056,"src":"1026:13:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27049,"name":"address","nodeType":"ElementaryTypeName","src":"1026:7:252","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27052,"mutability":"mutable","name":"balance","nameLocation":"1049:7:252","nodeType":"VariableDeclaration","scope":27056,"src":"1041:15:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27051,"name":"uint256","nodeType":"ElementaryTypeName","src":"1041:7:252","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27054,"mutability":"mutable","name":"value","nameLocation":"1066:5:252","nodeType":"VariableDeclaration","scope":27056,"src":"1058:13:252","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27053,"name":"uint256","nodeType":"ElementaryTypeName","src":"1058:7:252","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1025:47:252"},"src":"995:78:252"}],"src":"32:1042:252"},"id":252},"contracts/token/ERC20/errors/ERC20MintableErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20MintableErrors.sol","exportedSymbols":{"ERC20BatchMintValuesOverflow":[27064],"ERC20MintToAddressZero":[27061],"ERC20TotalSupplyOverflow":[27071]},"id":27072,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27058,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:253"},{"documentation":{"id":27059,"nodeType":"StructuredDocumentation","src":"58:64:253","text":"@notice Thrown when the minting tokens to the zero address."},"errorSelector":"92fd9c8f","id":27061,"name":"ERC20MintToAddressZero","nameLocation":"128:22:253","nodeType":"ErrorDefinition","parameters":{"id":27060,"nodeType":"ParameterList","parameters":[],"src":"150:2:253"},"src":"122:31:253"},{"documentation":{"id":27062,"nodeType":"StructuredDocumentation","src":"155:84:253","text":"@notice Thrown when the `values` array sum overflows on a batch mint operation."},"errorSelector":"5542ae7c","id":27064,"name":"ERC20BatchMintValuesOverflow","nameLocation":"245:28:253","nodeType":"ErrorDefinition","parameters":{"id":27063,"nodeType":"ParameterList","parameters":[],"src":"273:2:253"},"src":"239:37:253"},{"documentation":{"id":27065,"nodeType":"StructuredDocumentation","src":"278:155:253","text":"@notice Thrown when the minting tokens overflows the supply.\n @param supply The current supply.\n @param value The amount of tokens being minted."},"errorSelector":"0366a5f6","id":27071,"name":"ERC20TotalSupplyOverflow","nameLocation":"439:24:253","nodeType":"ErrorDefinition","parameters":{"id":27070,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27067,"mutability":"mutable","name":"supply","nameLocation":"472:6:253","nodeType":"VariableDeclaration","scope":27071,"src":"464:14:253","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27066,"name":"uint256","nodeType":"ElementaryTypeName","src":"464:7:253","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27069,"mutability":"mutable","name":"value","nameLocation":"488:5:253","nodeType":"VariableDeclaration","scope":27071,"src":"480:13:253","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27068,"name":"uint256","nodeType":"ElementaryTypeName","src":"480:7:253","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"463:31:253"},"src":"433:62:253"}],"src":"32:464:253"},"id":253},"contracts/token/ERC20/errors/ERC20PermitErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20PermitErrors.sol","exportedSymbols":{"ERC20PermitExpired":[27081],"ERC20PermitFromAddressZero":[27076],"ERC20PermitInvalidSignature":[27084]},"id":27085,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27073,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:254"},{"documentation":{"id":27074,"nodeType":"StructuredDocumentation","src":"58:61:254","text":"@notice Thrown when the permit is from the zero address."},"errorSelector":"a9746976","id":27076,"name":"ERC20PermitFromAddressZero","nameLocation":"125:26:254","nodeType":"ErrorDefinition","parameters":{"id":27075,"nodeType":"ParameterList","parameters":[],"src":"151:2:254"},"src":"119:35:254"},{"documentation":{"id":27077,"nodeType":"StructuredDocumentation","src":"156:88:254","text":"@notice Thrown when the permit is expired.\n @param deadline The permit deadline."},"errorSelector":"ea2b6f58","id":27081,"name":"ERC20PermitExpired","nameLocation":"250:18:254","nodeType":"ErrorDefinition","parameters":{"id":27080,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27079,"mutability":"mutable","name":"deadline","nameLocation":"277:8:254","nodeType":"VariableDeclaration","scope":27081,"src":"269:16:254","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27078,"name":"uint256","nodeType":"ElementaryTypeName","src":"269:7:254","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"268:18:254"},"src":"244:43:254"},{"documentation":{"id":27082,"nodeType":"StructuredDocumentation","src":"289:65:254","text":"@notice Thrown when the permit signature cannot be verified."},"errorSelector":"822a64c8","id":27084,"name":"ERC20PermitInvalidSignature","nameLocation":"360:27:254","nodeType":"ErrorDefinition","parameters":{"id":27083,"nodeType":"ParameterList","parameters":[],"src":"387:2:254"},"src":"354:36:254"}],"src":"32:359:254"},"id":254},"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol","exportedSymbols":{"ERC20SafeTransferRejected":[27091]},"id":27092,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27086,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:255"},{"documentation":{"id":27087,"nodeType":"StructuredDocumentation","src":"58:124:255","text":"@notice Thrown when a safe transfer is rejected by the recipient contract.\n @param recipient The recipient contract."},"errorSelector":"6d449736","id":27091,"name":"ERC20SafeTransferRejected","nameLocation":"188:25:255","nodeType":"ErrorDefinition","parameters":{"id":27090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27089,"mutability":"mutable","name":"recipient","nameLocation":"222:9:255","nodeType":"VariableDeclaration","scope":27091,"src":"214:17:255","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27088,"name":"address","nodeType":"ElementaryTypeName","src":"214:7:255","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"213:19:255"},"src":"182:51:255"}],"src":"32:202:255"},"id":255},"contracts/token/ERC20/events/ERC20Events.sol":{"ast":{"absolutePath":"contracts/token/ERC20/events/ERC20Events.sol","exportedSymbols":{"Approval":[27111],"Transfer":[27102]},"id":27112,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27093,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:256"},{"anonymous":false,"documentation":{"id":27094,"nodeType":"StructuredDocumentation","src":"58:288:256","text":"@notice Emitted when tokens are transferred, including zero value transfers.\n @param from The account where the transferred tokens are withdrawn from.\n @param to The account where the transferred tokens are deposited to.\n @param value The amount of tokens being transferred."},"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","id":27102,"name":"Transfer","nameLocation":"352:8:256","nodeType":"EventDefinition","parameters":{"id":27101,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27096,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"377:4:256","nodeType":"VariableDeclaration","scope":27102,"src":"361:20:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27095,"name":"address","nodeType":"ElementaryTypeName","src":"361:7:256","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27098,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"399:2:256","nodeType":"VariableDeclaration","scope":27102,"src":"383:18:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27097,"name":"address","nodeType":"ElementaryTypeName","src":"383:7:256","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27100,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"411:5:256","nodeType":"VariableDeclaration","scope":27102,"src":"403:13:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27099,"name":"uint256","nodeType":"ElementaryTypeName","src":"403:7:256","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"360:57:256"},"src":"346:72:256"},{"anonymous":false,"documentation":{"id":27103,"nodeType":"StructuredDocumentation","src":"420:235:256","text":"@notice Emitted when an approval is set.\n @param owner The account granting an allowance to `spender`.\n @param spender The account being granted an allowance from `owner`.\n @param value The allowance amount being granted."},"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","id":27111,"name":"Approval","nameLocation":"661:8:256","nodeType":"EventDefinition","parameters":{"id":27110,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27105,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"686:5:256","nodeType":"VariableDeclaration","scope":27111,"src":"670:21:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27104,"name":"address","nodeType":"ElementaryTypeName","src":"670:7:256","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27107,"indexed":true,"mutability":"mutable","name":"spender","nameLocation":"709:7:256","nodeType":"VariableDeclaration","scope":27111,"src":"693:23:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27106,"name":"address","nodeType":"ElementaryTypeName","src":"693:7:256","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27109,"indexed":false,"mutability":"mutable","name":"value","nameLocation":"726:5:256","nodeType":"VariableDeclaration","scope":27111,"src":"718:13:256","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27108,"name":"uint256","nodeType":"ElementaryTypeName","src":"718:7:256","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"669:63:256"},"src":"655:78:256"}],"src":"32:702:256"},"id":256},"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol","exportedSymbols":{"Context":[1206],"ERC20BatchTransfersBase":[26565],"ERC20BatchTransfersFacet":[27192],"ERC20Storage":[30139],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27193,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27113,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:257"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27115,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":13387,"src":"57:87:257","symbolAliases":[{"foreign":{"id":27114,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":27117,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":30140,"src":"145:61:257","symbolAliases":[{"foreign":{"id":27116,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27119,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":19478,"src":"207:83:257","symbolAliases":[{"foreign":{"id":27118,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"215:17:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol","file":"./../base/ERC20BatchTransfersBase.sol","id":27121,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":26566,"src":"291:78:257","symbolAliases":[{"foreign":{"id":27120,"name":"ERC20BatchTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26565,"src":"299:23:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27123,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":1207,"src":"370:66:257","symbolAliases":[{"foreign":{"id":27122,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"378:7:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27125,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27193,"sourceUnit":13298,"src":"437:101:257","symbolAliases":[{"foreign":{"id":27124,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"445:28:257","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27127,"name":"ERC20BatchTransfersBase","nameLocations":["886:23:257"],"nodeType":"IdentifierPath","referencedDeclaration":26565,"src":"886:23:257"},"id":27128,"nodeType":"InheritanceSpecifier","src":"886:23:257"},{"baseName":{"id":27129,"name":"ForwarderRegistryContextBase","nameLocations":["911:28:257"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"911:28:257"},"id":27130,"nodeType":"InheritanceSpecifier","src":"911:28:257"}],"canonicalName":"ERC20BatchTransfersFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27126,"nodeType":"StructuredDocumentation","src":"540:309:257","text":"@title ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27192,"linearizedBaseContracts":[27192,13297,26565,1206,27893],"name":"ERC20BatchTransfersFacet","nameLocation":"858:24:257","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27134,"libraryName":{"id":27131,"name":"ProxyAdminStorage","nameLocations":["952:17:257"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"952:17:257"},"nodeType":"UsingForDirective","src":"946:53:257","typeName":{"id":27133,"nodeType":"UserDefinedTypeName","pathNode":{"id":27132,"name":"ProxyAdminStorage.Layout","nameLocations":["974:17:257","992:6:257"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"974:24:257"},"referencedDeclaration":19308,"src":"974:24:257","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27143,"nodeType":"Block","src":"1103:2:257","statements":[]},"id":27144,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27140,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27137,"src":"1084:17:257","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27141,"kind":"baseConstructorSpecifier","modifierName":{"id":27139,"name":"ForwarderRegistryContextBase","nameLocations":["1055:28:257"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1055:28:257"},"nodeType":"ModifierInvocation","src":"1055:47:257"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27138,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27137,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1036:17:257","nodeType":"VariableDeclaration","scope":27144,"src":"1017:36:257","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27136,"nodeType":"UserDefinedTypeName","pathNode":{"id":27135,"name":"IForwarderRegistry","nameLocations":["1017:18:257"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1017:18:257"},"referencedDeclaration":13386,"src":"1017:18:257","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1016:38:257"},"returnParameters":{"id":27142,"nodeType":"ParameterList","parameters":[],"src":"1103:0:257"},"scope":27192,"src":"1005:100:257","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27162,"nodeType":"Block","src":"1333:125:257","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27153,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27177],"referencedDeclaration":27177,"src":"1390:10:257","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27154,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1390:12:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27148,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1343:17:257","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27150,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1361:6:257","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1343:24:257","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1343:26:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27152,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1370:19:257","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1343:46:257","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27155,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1343:60:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27156,"nodeType":"ExpressionStatement","src":"1343:60:257"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27157,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1413:12:257","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1426:23:257","memberName":"initERC20BatchTransfers","nodeType":"MemberAccess","referencedDeclaration":28788,"src":"1413:36:257","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27160,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1413:38:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27161,"nodeType":"ExpressionStatement","src":"1413:38:257"}]},"documentation":{"id":27145,"nodeType":"StructuredDocumentation","src":"1111:166:257","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"c30f1be1","id":27163,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20BatchTransfersStorage","nameLocation":"1291:30:257","nodeType":"FunctionDefinition","parameters":{"id":27146,"nodeType":"ParameterList","parameters":[],"src":"1321:2:257"},"returnParameters":{"id":27147,"nodeType":"ParameterList","parameters":[],"src":"1333:0:257"},"scope":27192,"src":"1282:176:257","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27176,"nodeType":"Block","src":"1623:65:257","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27172,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1640:28:257","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1669:10:257","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1640:39:257","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27174,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1640:41:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27171,"id":27175,"nodeType":"Return","src":"1633:48:257"}]},"documentation":{"id":27164,"nodeType":"StructuredDocumentation","src":"1464:44:257","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27177,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1522:10:257","nodeType":"FunctionDefinition","overrides":{"id":27168,"nodeType":"OverrideSpecifier","overrides":[{"id":27166,"name":"Context","nameLocations":["1566:7:257"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1566:7:257"},{"id":27167,"name":"ForwarderRegistryContextBase","nameLocations":["1575:28:257"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1575:28:257"}],"src":"1557:47:257"},"parameters":{"id":27165,"nodeType":"ParameterList","parameters":[],"src":"1532:2:257"},"returnParameters":{"id":27171,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27170,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27177,"src":"1614:7:257","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27169,"name":"address","nodeType":"ElementaryTypeName","src":"1614:7:257","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1613:9:257"},"scope":27192,"src":"1513:175:257","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27190,"nodeType":"Block","src":"1858:63:257","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27186,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1875:28:257","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1904:8:257","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1875:37:257","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1875:39:257","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27185,"id":27189,"nodeType":"Return","src":"1868:46:257"}]},"documentation":{"id":27178,"nodeType":"StructuredDocumentation","src":"1694:44:257","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27191,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1752:8:257","nodeType":"FunctionDefinition","overrides":{"id":27182,"nodeType":"OverrideSpecifier","overrides":[{"id":27180,"name":"Context","nameLocations":["1794:7:257"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1794:7:257"},{"id":27181,"name":"ForwarderRegistryContextBase","nameLocations":["1803:28:257"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1803:28:257"}],"src":"1785:47:257"},"parameters":{"id":27179,"nodeType":"ParameterList","parameters":[],"src":"1760:2:257"},"returnParameters":{"id":27185,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27184,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27191,"src":"1842:14:257","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27183,"name":"bytes","nodeType":"ElementaryTypeName","src":"1842:5:257","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1841:16:257"},"scope":27192,"src":"1743:178:257","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27193,"src":"849:1074:257","usedErrors":[7886,11559,19183,27024,27031,27042,27047,27056],"usedEvents":[27102,27111]}],"src":"32:1892:257"},"id":257},"contracts/token/ERC20/facets/ERC20BurnableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20BurnableFacet.sol","exportedSymbols":{"Context":[1206],"ERC20BurnableBase":[26654],"ERC20BurnableFacet":[27273],"ERC20Storage":[30139],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27274,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27194,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:258"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27196,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":13387,"src":"57:87:258","symbolAliases":[{"foreign":{"id":27195,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":27198,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":30140,"src":"145:61:258","symbolAliases":[{"foreign":{"id":27197,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27200,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":19478,"src":"207:83:258","symbolAliases":[{"foreign":{"id":27199,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"215:17:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BurnableBase.sol","file":"./../base/ERC20BurnableBase.sol","id":27202,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":26655,"src":"291:66:258","symbolAliases":[{"foreign":{"id":27201,"name":"ERC20BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26654,"src":"299:17:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27204,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":1207,"src":"358:66:258","symbolAliases":[{"foreign":{"id":27203,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"366:7:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27206,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27274,"sourceUnit":13298,"src":"425:101:258","symbolAliases":[{"foreign":{"id":27205,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"433:28:258","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27208,"name":"ERC20BurnableBase","nameLocations":["861:17:258"],"nodeType":"IdentifierPath","referencedDeclaration":26654,"src":"861:17:258"},"id":27209,"nodeType":"InheritanceSpecifier","src":"861:17:258"},{"baseName":{"id":27210,"name":"ForwarderRegistryContextBase","nameLocations":["880:28:258"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"880:28:258"},"id":27211,"nodeType":"InheritanceSpecifier","src":"880:28:258"}],"canonicalName":"ERC20BurnableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27207,"nodeType":"StructuredDocumentation","src":"528:302:258","text":"@title ERC20 Fungible Token Standard, optional extension: Burnable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27273,"linearizedBaseContracts":[27273,13297,26654,1206,27927],"name":"ERC20BurnableFacet","nameLocation":"839:18:258","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27215,"libraryName":{"id":27212,"name":"ProxyAdminStorage","nameLocations":["921:17:258"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"921:17:258"},"nodeType":"UsingForDirective","src":"915:53:258","typeName":{"id":27214,"nodeType":"UserDefinedTypeName","pathNode":{"id":27213,"name":"ProxyAdminStorage.Layout","nameLocations":["943:17:258","961:6:258"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"943:24:258"},"referencedDeclaration":19308,"src":"943:24:258","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27224,"nodeType":"Block","src":"1072:2:258","statements":[]},"id":27225,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27221,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27218,"src":"1053:17:258","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27222,"kind":"baseConstructorSpecifier","modifierName":{"id":27220,"name":"ForwarderRegistryContextBase","nameLocations":["1024:28:258"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1024:28:258"},"nodeType":"ModifierInvocation","src":"1024:47:258"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27218,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1005:17:258","nodeType":"VariableDeclaration","scope":27225,"src":"986:36:258","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27217,"nodeType":"UserDefinedTypeName","pathNode":{"id":27216,"name":"IForwarderRegistry","nameLocations":["986:18:258"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"986:18:258"},"referencedDeclaration":13386,"src":"986:18:258","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"985:38:258"},"returnParameters":{"id":27223,"nodeType":"ParameterList","parameters":[],"src":"1072:0:258"},"scope":27273,"src":"974:100:258","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27243,"nodeType":"Block","src":"1290:119:258","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27234,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27258],"referencedDeclaration":27258,"src":"1347:10:258","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27235,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1347:12:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27229,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1300:17:258","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27231,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1318:6:258","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1300:24:258","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1300:26:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27233,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1327:19:258","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1300:46:258","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1300:60:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27237,"nodeType":"ExpressionStatement","src":"1300:60:258"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27238,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1370:12:258","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27240,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1383:17:258","memberName":"initERC20Burnable","nodeType":"MemberAccess","referencedDeclaration":28839,"src":"1370:30:258","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1370:32:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27242,"nodeType":"ExpressionStatement","src":"1370:32:258"}]},"documentation":{"id":27226,"nodeType":"StructuredDocumentation","src":"1080:160:258","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"751ec2d3","id":27244,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20BurnableStorage","nameLocation":"1254:24:258","nodeType":"FunctionDefinition","parameters":{"id":27227,"nodeType":"ParameterList","parameters":[],"src":"1278:2:258"},"returnParameters":{"id":27228,"nodeType":"ParameterList","parameters":[],"src":"1290:0:258"},"scope":27273,"src":"1245:164:258","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27257,"nodeType":"Block","src":"1574:65:258","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27253,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1591:28:258","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27254,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1620:10:258","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1591:39:258","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1591:41:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27252,"id":27256,"nodeType":"Return","src":"1584:48:258"}]},"documentation":{"id":27245,"nodeType":"StructuredDocumentation","src":"1415:44:258","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27258,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1473:10:258","nodeType":"FunctionDefinition","overrides":{"id":27249,"nodeType":"OverrideSpecifier","overrides":[{"id":27247,"name":"Context","nameLocations":["1517:7:258"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1517:7:258"},{"id":27248,"name":"ForwarderRegistryContextBase","nameLocations":["1526:28:258"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1526:28:258"}],"src":"1508:47:258"},"parameters":{"id":27246,"nodeType":"ParameterList","parameters":[],"src":"1483:2:258"},"returnParameters":{"id":27252,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27251,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27258,"src":"1565:7:258","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27250,"name":"address","nodeType":"ElementaryTypeName","src":"1565:7:258","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1564:9:258"},"scope":27273,"src":"1464:175:258","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27271,"nodeType":"Block","src":"1809:63:258","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27267,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1826:28:258","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27268,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1855:8:258","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1826:37:258","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27269,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1826:39:258","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27266,"id":27270,"nodeType":"Return","src":"1819:46:258"}]},"documentation":{"id":27259,"nodeType":"StructuredDocumentation","src":"1645:44:258","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27272,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1703:8:258","nodeType":"FunctionDefinition","overrides":{"id":27263,"nodeType":"OverrideSpecifier","overrides":[{"id":27261,"name":"Context","nameLocations":["1745:7:258"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1745:7:258"},{"id":27262,"name":"ForwarderRegistryContextBase","nameLocations":["1754:28:258"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1754:28:258"}],"src":"1736:47:258"},"parameters":{"id":27260,"nodeType":"ParameterList","parameters":[],"src":"1711:2:258"},"returnParameters":{"id":27266,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27265,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27272,"src":"1793:14:258","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27264,"name":"bytes","nodeType":"ElementaryTypeName","src":"1793:5:258","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1792:16:258"},"scope":27273,"src":"1694:178:258","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27274,"src":"830:1044:258","usedErrors":[7886,11559,19183,27031,27042,27056],"usedEvents":[27102,27111]}],"src":"32:1843:258"},"id":258},"contracts/token/ERC20/facets/ERC20DetailedFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20DetailedFacet.sol","exportedSymbols":{"ERC20DetailedBase":[26707],"ERC20DetailedFacet":[27339],"ERC20DetailedStorage":[28291],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27340,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27275,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:259"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27277,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27340,"sourceUnit":13387,"src":"57:87:259","symbolAliases":[{"foreign":{"id":27276,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:259","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./../libraries/ERC20DetailedStorage.sol","id":27279,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27340,"sourceUnit":28292,"src":"145:77:259","symbolAliases":[{"foreign":{"id":27278,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"153:20:259","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27281,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27340,"sourceUnit":19478,"src":"223:83:259","symbolAliases":[{"foreign":{"id":27280,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"231:17:259","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20DetailedBase.sol","file":"./../base/ERC20DetailedBase.sol","id":27283,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27340,"sourceUnit":26708,"src":"307:66:259","symbolAliases":[{"foreign":{"id":27282,"name":"ERC20DetailedBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26707,"src":"315:17:259","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27285,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27340,"sourceUnit":13298,"src":"374:101:259","symbolAliases":[{"foreign":{"id":27284,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"382:28:259","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27287,"name":"ERC20DetailedBase","nameLocations":["810:17:259"],"nodeType":"IdentifierPath","referencedDeclaration":26707,"src":"810:17:259"},"id":27288,"nodeType":"InheritanceSpecifier","src":"810:17:259"},{"baseName":{"id":27289,"name":"ForwarderRegistryContextBase","nameLocations":["829:28:259"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"829:28:259"},"id":27290,"nodeType":"InheritanceSpecifier","src":"829:28:259"}],"canonicalName":"ERC20DetailedFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27286,"nodeType":"StructuredDocumentation","src":"477:302:259","text":"@title ERC20 Fungible Token Standard, optional extension: Detailed (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27339,"linearizedBaseContracts":[27339,13297,26707,27949],"name":"ERC20DetailedFacet","nameLocation":"788:18:259","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27294,"libraryName":{"id":27291,"name":"ERC20DetailedStorage","nameLocations":["870:20:259"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"870:20:259"},"nodeType":"UsingForDirective","src":"864:59:259","typeName":{"id":27293,"nodeType":"UserDefinedTypeName","pathNode":{"id":27292,"name":"ERC20DetailedStorage.Layout","nameLocations":["895:20:259","916:6:259"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"895:27:259"},"referencedDeclaration":28118,"src":"895:27:259","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"global":false,"id":27298,"libraryName":{"id":27295,"name":"ProxyAdminStorage","nameLocations":["934:17:259"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"934:17:259"},"nodeType":"UsingForDirective","src":"928:53:259","typeName":{"id":27297,"nodeType":"UserDefinedTypeName","pathNode":{"id":27296,"name":"ProxyAdminStorage.Layout","nameLocations":["956:17:259","974:6:259"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"956:24:259"},"referencedDeclaration":19308,"src":"956:24:259","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27307,"nodeType":"Block","src":"1085:2:259","statements":[]},"id":27308,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27304,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27301,"src":"1066:17:259","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27305,"kind":"baseConstructorSpecifier","modifierName":{"id":27303,"name":"ForwarderRegistryContextBase","nameLocations":["1037:28:259"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1037:28:259"},"nodeType":"ModifierInvocation","src":"1037:47:259"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27302,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27301,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1018:17:259","nodeType":"VariableDeclaration","scope":27308,"src":"999:36:259","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27300,"nodeType":"UserDefinedTypeName","pathNode":{"id":27299,"name":"IForwarderRegistry","nameLocations":["999:18:259"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"999:18:259"},"referencedDeclaration":13386,"src":"999:18:259","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"998:38:259"},"returnParameters":{"id":27306,"nodeType":"ParameterList","parameters":[],"src":"1085:0:259"},"scope":27339,"src":"987:100:259","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27337,"nodeType":"Block","src":"1757:165:259","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27323,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"1814:10:259","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1814:12:259","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27318,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1767:17:259","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1785:6:259","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1767:24:259","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1767:26:259","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27322,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1794:19:259","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1767:46:259","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1767:60:259","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27326,"nodeType":"ExpressionStatement","src":"1767:60:259"},{"expression":{"arguments":[{"id":27332,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27311,"src":"1877:9:259","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":27333,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27313,"src":"1888:11:259","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":27334,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27315,"src":"1901:13:259","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27327,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"1837:20:259","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":27329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1858:6:259","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"1837:27:259","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":27330,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1837:29:259","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":27331,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1867:9:259","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":28239,"src":"1837:39:259","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28118_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_uint8_$returns$__$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer,string calldata,string calldata,uint8)"}},"id":27335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1837:78:259","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27336,"nodeType":"ExpressionStatement","src":"1837:78:259"}]},"documentation":{"id":27309,"nodeType":"StructuredDocumentation","src":"1093:539:259","text":"@notice Initializes the storage with the token details.\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenDecimals The token decimals."},"functionSelector":"ef961279","id":27338,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20DetailedStorage","nameLocation":"1646:24:259","nodeType":"FunctionDefinition","parameters":{"id":27316,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27311,"mutability":"mutable","name":"tokenName","nameLocation":"1687:9:259","nodeType":"VariableDeclaration","scope":27338,"src":"1671:25:259","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":27310,"name":"string","nodeType":"ElementaryTypeName","src":"1671:6:259","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":27313,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1714:11:259","nodeType":"VariableDeclaration","scope":27338,"src":"1698:27:259","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":27312,"name":"string","nodeType":"ElementaryTypeName","src":"1698:6:259","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":27315,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1733:13:259","nodeType":"VariableDeclaration","scope":27338,"src":"1727:19:259","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":27314,"name":"uint8","nodeType":"ElementaryTypeName","src":"1727:5:259","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1670:77:259"},"returnParameters":{"id":27317,"nodeType":"ParameterList","parameters":[],"src":"1757:0:259"},"scope":27339,"src":"1637:285:259","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":27340,"src":"779:1145:259","usedErrors":[11559,19183,19192],"usedEvents":[]}],"src":"32:1893:259"},"id":259},"contracts/token/ERC20/facets/ERC20Facet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20Facet.sol","exportedSymbols":{"Context":[1206],"ERC20Base":[26492],"ERC20Facet":[27451],"ERC20Storage":[30139],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27452,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27341,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:260"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27343,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":13387,"src":"57:87:260","symbolAliases":[{"foreign":{"id":27342,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":27345,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":30140,"src":"145:61:260","symbolAliases":[{"foreign":{"id":27344,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27347,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":19478,"src":"207:83:260","symbolAliases":[{"foreign":{"id":27346,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"215:17:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20Base.sol","file":"./../base/ERC20Base.sol","id":27349,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":26493,"src":"291:50:260","symbolAliases":[{"foreign":{"id":27348,"name":"ERC20Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26492,"src":"299:9:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27351,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":1207,"src":"342:66:260","symbolAliases":[{"foreign":{"id":27350,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"350:7:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27353,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27452,"sourceUnit":13298,"src":"409:101:260","symbolAliases":[{"foreign":{"id":27352,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"417:28:260","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27355,"name":"ERC20Base","nameLocations":["807:9:260"],"nodeType":"IdentifierPath","referencedDeclaration":26492,"src":"807:9:260"},"id":27356,"nodeType":"InheritanceSpecifier","src":"807:9:260"},{"baseName":{"id":27357,"name":"ForwarderRegistryContextBase","nameLocations":["818:28:260"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"818:28:260"},"id":27358,"nodeType":"InheritanceSpecifier","src":"818:28:260"}],"canonicalName":"ERC20Facet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27354,"nodeType":"StructuredDocumentation","src":"512:272:260","text":"@title ERC20 Fungible Token Standard (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27451,"linearizedBaseContracts":[27451,13297,26492,1206,27863,27839],"name":"ERC20Facet","nameLocation":"793:10:260","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27362,"libraryName":{"id":27359,"name":"ERC20Storage","nameLocations":["859:12:260"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"859:12:260"},"nodeType":"UsingForDirective","src":"853:43:260","typeName":{"id":27361,"nodeType":"UserDefinedTypeName","pathNode":{"id":27360,"name":"ERC20Storage.Layout","nameLocations":["876:12:260","889:6:260"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"876:19:260"},"referencedDeclaration":28678,"src":"876:19:260","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":27366,"libraryName":{"id":27363,"name":"ProxyAdminStorage","nameLocations":["907:17:260"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"907:17:260"},"nodeType":"UsingForDirective","src":"901:53:260","typeName":{"id":27365,"nodeType":"UserDefinedTypeName","pathNode":{"id":27364,"name":"ProxyAdminStorage.Layout","nameLocations":["929:17:260","947:6:260"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"929:24:260"},"referencedDeclaration":19308,"src":"929:24:260","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27375,"nodeType":"Block","src":"1058:2:260","statements":[]},"id":27376,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27372,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27369,"src":"1039:17:260","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27373,"kind":"baseConstructorSpecifier","modifierName":{"id":27371,"name":"ForwarderRegistryContextBase","nameLocations":["1010:28:260"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1010:28:260"},"nodeType":"ModifierInvocation","src":"1010:47:260"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27370,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27369,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"991:17:260","nodeType":"VariableDeclaration","scope":27376,"src":"972:36:260","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27368,"nodeType":"UserDefinedTypeName","pathNode":{"id":27367,"name":"IForwarderRegistry","nameLocations":["972:18:260"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"972:18:260"},"referencedDeclaration":13386,"src":"972:18:260","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"971:38:260"},"returnParameters":{"id":27374,"nodeType":"ParameterList","parameters":[],"src":"1058:0:260"},"scope":27451,"src":"960:100:260","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27394,"nodeType":"Block","src":"1276:106:260","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27385,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27436],"referencedDeclaration":27436,"src":"1333:10:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27386,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1333:12:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27380,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1286:17:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1304:6:260","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1286:24:260","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27383,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1286:26:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27384,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1313:19:260","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1286:46:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27387,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1286:60:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27388,"nodeType":"ExpressionStatement","src":"1286:60:260"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27389,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1356:12:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27391,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1369:4:260","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28743,"src":"1356:17:260","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27392,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1356:19:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27393,"nodeType":"ExpressionStatement","src":"1356:19:260"}]},"documentation":{"id":27377,"nodeType":"StructuredDocumentation","src":"1066:168:260","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"fb33f608","id":27395,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20Storage","nameLocation":"1248:16:260","nodeType":"FunctionDefinition","parameters":{"id":27378,"nodeType":"ParameterList","parameters":[],"src":"1264:2:260"},"returnParameters":{"id":27379,"nodeType":"ParameterList","parameters":[],"src":"1276:0:260"},"scope":27451,"src":"1239:143:260","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":27421,"nodeType":"Block","src":"1685:155:260","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27410,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27436],"referencedDeclaration":27436,"src":"1742:10:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27411,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1742:12:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27405,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1695:17:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27407,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1713:6:260","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1695:24:260","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1695:26:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27409,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1722:19:260","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1695:46:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27412,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1695:60:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27413,"nodeType":"ExpressionStatement","src":"1695:60:260"},{"expression":{"arguments":[{"id":27417,"name":"initialHolders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27399,"src":"1798:14:260","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":27418,"name":"initialAllocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27402,"src":"1814:18:260","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"id":27414,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1765:12:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27416,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1778:19:260","memberName":"initWithAllocations","nodeType":"MemberAccess","referencedDeclaration":28771,"src":"1765:32:260","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$","typeString":"function (address[] memory,uint256[] memory)"}},"id":27419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1765:68:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27420,"nodeType":"ExpressionStatement","src":"1765:68:260"}]},"documentation":{"id":27396,"nodeType":"StructuredDocumentation","src":"1388:168:260","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"c8342b1d","id":27422,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20StorageWithAllocations","nameLocation":"1570:31:260","nodeType":"FunctionDefinition","parameters":{"id":27403,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27399,"mutability":"mutable","name":"initialHolders","nameLocation":"1621:14:260","nodeType":"VariableDeclaration","scope":27422,"src":"1602:33:260","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":27397,"name":"address","nodeType":"ElementaryTypeName","src":"1602:7:260","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":27398,"nodeType":"ArrayTypeName","src":"1602:9:260","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":27402,"mutability":"mutable","name":"initialAllocations","nameLocation":"1656:18:260","nodeType":"VariableDeclaration","scope":27422,"src":"1637:37:260","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":27400,"name":"uint256","nodeType":"ElementaryTypeName","src":"1637:7:260","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":27401,"nodeType":"ArrayTypeName","src":"1637:9:260","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1601:74:260"},"returnParameters":{"id":27404,"nodeType":"ParameterList","parameters":[],"src":"1685:0:260"},"scope":27451,"src":"1561:279:260","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27435,"nodeType":"Block","src":"2005:65:260","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27431,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2022:28:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2051:10:260","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2022:39:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2022:41:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27430,"id":27434,"nodeType":"Return","src":"2015:48:260"}]},"documentation":{"id":27423,"nodeType":"StructuredDocumentation","src":"1846:44:260","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27436,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1904:10:260","nodeType":"FunctionDefinition","overrides":{"id":27427,"nodeType":"OverrideSpecifier","overrides":[{"id":27425,"name":"Context","nameLocations":["1948:7:260"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1948:7:260"},{"id":27426,"name":"ForwarderRegistryContextBase","nameLocations":["1957:28:260"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1957:28:260"}],"src":"1939:47:260"},"parameters":{"id":27424,"nodeType":"ParameterList","parameters":[],"src":"1914:2:260"},"returnParameters":{"id":27430,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27429,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27436,"src":"1996:7:260","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27428,"name":"address","nodeType":"ElementaryTypeName","src":"1996:7:260","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1995:9:260"},"scope":27451,"src":"1895:175:260","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27449,"nodeType":"Block","src":"2240:63:260","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27445,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2257:28:260","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2286:8:260","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2257:37:260","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2257:39:260","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27444,"id":27448,"nodeType":"Return","src":"2250:46:260"}]},"documentation":{"id":27437,"nodeType":"StructuredDocumentation","src":"2076:44:260","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27450,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2134:8:260","nodeType":"FunctionDefinition","overrides":{"id":27441,"nodeType":"OverrideSpecifier","overrides":[{"id":27439,"name":"Context","nameLocations":["2176:7:260"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2176:7:260"},{"id":27440,"name":"ForwarderRegistryContextBase","nameLocations":["2185:28:260"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2185:28:260"}],"src":"2167:47:260"},"parameters":{"id":27438,"nodeType":"ParameterList","parameters":[],"src":"2142:2:260"},"returnParameters":{"id":27444,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27443,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27450,"src":"2224:14:260","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27442,"name":"bytes","nodeType":"ElementaryTypeName","src":"2224:5:260","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2223:16:260"},"scope":27451,"src":"2125:178:260","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27452,"src":"784:1521:260","usedErrors":[7886,11559,19183,19192,27019,27031,27042,27047,27056,27061,27064,27071],"usedEvents":[27102,27111]}],"src":"32:2274:260"},"id":260},"contracts/token/ERC20/facets/ERC20MetadataFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20MetadataFacet.sol","exportedSymbols":{"Context":[1206],"ERC20MetadataBase":[26768],"ERC20MetadataFacet":[27532],"ERC20MetadataStorage":[28380],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27533,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27453,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:261"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27455,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":13387,"src":"57:87:261","symbolAliases":[{"foreign":{"id":27454,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","file":"./../libraries/ERC20MetadataStorage.sol","id":27457,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":28381,"src":"145:77:261","symbolAliases":[{"foreign":{"id":27456,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"153:20:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27459,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":19478,"src":"223:83:261","symbolAliases":[{"foreign":{"id":27458,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"231:17:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MetadataBase.sol","file":"./../base/ERC20MetadataBase.sol","id":27461,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":26769,"src":"307:66:261","symbolAliases":[{"foreign":{"id":27460,"name":"ERC20MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26768,"src":"315:17:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27463,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":1207,"src":"374:66:261","symbolAliases":[{"foreign":{"id":27462,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"382:7:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27465,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27533,"sourceUnit":13298,"src":"441:101:261","symbolAliases":[{"foreign":{"id":27464,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"449:28:261","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27467,"name":"ERC20MetadataBase","nameLocations":["903:17:261"],"nodeType":"IdentifierPath","referencedDeclaration":26768,"src":"903:17:261"},"id":27468,"nodeType":"InheritanceSpecifier","src":"903:17:261"},{"baseName":{"id":27469,"name":"ForwarderRegistryContextBase","nameLocations":["922:28:261"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"922:28:261"},"id":27470,"nodeType":"InheritanceSpecifier","src":"922:28:261"}],"canonicalName":"ERC20MetadataFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27466,"nodeType":"StructuredDocumentation","src":"544:328:261","text":"@title ERC20 Fungible Token Standard, optional extension: Metadata (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27532,"linearizedBaseContracts":[27532,13297,26768,1206,27959],"name":"ERC20MetadataFacet","nameLocation":"881:18:261","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27474,"libraryName":{"id":27471,"name":"ProxyAdminStorage","nameLocations":["963:17:261"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"963:17:261"},"nodeType":"UsingForDirective","src":"957:53:261","typeName":{"id":27473,"nodeType":"UserDefinedTypeName","pathNode":{"id":27472,"name":"ProxyAdminStorage.Layout","nameLocations":["985:17:261","1003:6:261"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"985:24:261"},"referencedDeclaration":19308,"src":"985:24:261","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27483,"nodeType":"Block","src":"1114:2:261","statements":[]},"id":27484,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27480,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27477,"src":"1095:17:261","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27481,"kind":"baseConstructorSpecifier","modifierName":{"id":27479,"name":"ForwarderRegistryContextBase","nameLocations":["1066:28:261"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1066:28:261"},"nodeType":"ModifierInvocation","src":"1066:47:261"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27478,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27477,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1047:17:261","nodeType":"VariableDeclaration","scope":27484,"src":"1028:36:261","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27476,"nodeType":"UserDefinedTypeName","pathNode":{"id":27475,"name":"IForwarderRegistry","nameLocations":["1028:18:261"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1028:18:261"},"referencedDeclaration":13386,"src":"1028:18:261","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1027:38:261"},"returnParameters":{"id":27482,"nodeType":"ParameterList","parameters":[],"src":"1114:0:261"},"scope":27532,"src":"1016:100:261","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27502,"nodeType":"Block","src":"1252:114:261","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27493,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27517],"referencedDeclaration":27517,"src":"1309:10:261","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27494,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1309:12:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27488,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1262:17:261","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27490,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1280:6:261","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1262:24:261","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1262:26:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27492,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1289:19:261","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1262:46:261","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1262:60:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27496,"nodeType":"ExpressionStatement","src":"1262:60:261"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27497,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"1332:20:261","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":27499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1353:4:261","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28338,"src":"1332:25:261","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27500,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1332:27:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27501,"nodeType":"ExpressionStatement","src":"1332:27:261"}]},"documentation":{"id":27485,"nodeType":"StructuredDocumentation","src":"1122:80:261","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"functionSelector":"529eec47","id":27503,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20MetadataStorage","nameLocation":"1216:24:261","nodeType":"FunctionDefinition","parameters":{"id":27486,"nodeType":"ParameterList","parameters":[],"src":"1240:2:261"},"returnParameters":{"id":27487,"nodeType":"ParameterList","parameters":[],"src":"1252:0:261"},"scope":27532,"src":"1207:159:261","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27516,"nodeType":"Block","src":"1531:65:261","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27512,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1548:28:261","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1577:10:261","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1548:39:261","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27514,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1548:41:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27511,"id":27515,"nodeType":"Return","src":"1541:48:261"}]},"documentation":{"id":27504,"nodeType":"StructuredDocumentation","src":"1372:44:261","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27517,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1430:10:261","nodeType":"FunctionDefinition","overrides":{"id":27508,"nodeType":"OverrideSpecifier","overrides":[{"id":27506,"name":"Context","nameLocations":["1474:7:261"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1474:7:261"},{"id":27507,"name":"ForwarderRegistryContextBase","nameLocations":["1483:28:261"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1483:28:261"}],"src":"1465:47:261"},"parameters":{"id":27505,"nodeType":"ParameterList","parameters":[],"src":"1440:2:261"},"returnParameters":{"id":27511,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27510,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27517,"src":"1522:7:261","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27509,"name":"address","nodeType":"ElementaryTypeName","src":"1522:7:261","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1521:9:261"},"scope":27532,"src":"1421:175:261","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27530,"nodeType":"Block","src":"1766:63:261","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27526,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1783:28:261","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1812:8:261","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1783:37:261","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27528,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1783:39:261","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27525,"id":27529,"nodeType":"Return","src":"1776:46:261"}]},"documentation":{"id":27518,"nodeType":"StructuredDocumentation","src":"1602:44:261","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27531,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1660:8:261","nodeType":"FunctionDefinition","overrides":{"id":27522,"nodeType":"OverrideSpecifier","overrides":[{"id":27520,"name":"Context","nameLocations":["1702:7:261"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1702:7:261"},{"id":27521,"name":"ForwarderRegistryContextBase","nameLocations":["1711:28:261"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1711:28:261"}],"src":"1693:47:261"},"parameters":{"id":27519,"nodeType":"ParameterList","parameters":[],"src":"1668:2:261"},"returnParameters":{"id":27525,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27524,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27531,"src":"1750:14:261","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27523,"name":"bytes","nodeType":"ElementaryTypeName","src":"1750:5:261","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1749:16:261"},"scope":27532,"src":"1651:178:261","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27533,"src":"872:959:261","usedErrors":[8246,11559,19183],"usedEvents":[]}],"src":"32:1800:261"},"id":261},"contracts/token/ERC20/facets/ERC20MintableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20MintableFacet.sol","exportedSymbols":{"Context":[1206],"ERC20MintableBase":[26853],"ERC20MintableFacet":[27613],"ERC20Storage":[30139],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27614,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27534,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:262"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27536,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":13387,"src":"57:87:262","symbolAliases":[{"foreign":{"id":27535,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":27538,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":30140,"src":"145:61:262","symbolAliases":[{"foreign":{"id":27537,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27540,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":19478,"src":"207:83:262","symbolAliases":[{"foreign":{"id":27539,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"215:17:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MintableBase.sol","file":"./../base/ERC20MintableBase.sol","id":27542,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":26854,"src":"291:66:262","symbolAliases":[{"foreign":{"id":27541,"name":"ERC20MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26853,"src":"299:17:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27544,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":1207,"src":"358:66:262","symbolAliases":[{"foreign":{"id":27543,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"366:7:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27546,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27614,"sourceUnit":13298,"src":"425:101:262","symbolAliases":[{"foreign":{"id":27545,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"433:28:262","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27548,"name":"ERC20MintableBase","nameLocations":["909:17:262"],"nodeType":"IdentifierPath","referencedDeclaration":26853,"src":"909:17:262"},"id":27549,"nodeType":"InheritanceSpecifier","src":"909:17:262"},{"baseName":{"id":27550,"name":"ForwarderRegistryContextBase","nameLocations":["928:28:262"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"928:28:262"},"id":27551,"nodeType":"InheritanceSpecifier","src":"928:28:262"}],"canonicalName":"ERC20MintableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27547,"nodeType":"StructuredDocumentation","src":"528:350:262","text":"@title ERC20 Fungible Token Standard, optional extension: Mintable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}."},"fullyImplemented":true,"id":27613,"linearizedBaseContracts":[27613,13297,26853,1206,27981],"name":"ERC20MintableFacet","nameLocation":"887:18:262","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27555,"libraryName":{"id":27552,"name":"ProxyAdminStorage","nameLocations":["969:17:262"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"969:17:262"},"nodeType":"UsingForDirective","src":"963:53:262","typeName":{"id":27554,"nodeType":"UserDefinedTypeName","pathNode":{"id":27553,"name":"ProxyAdminStorage.Layout","nameLocations":["991:17:262","1009:6:262"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"991:24:262"},"referencedDeclaration":19308,"src":"991:24:262","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27564,"nodeType":"Block","src":"1120:2:262","statements":[]},"id":27565,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27561,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27558,"src":"1101:17:262","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27562,"kind":"baseConstructorSpecifier","modifierName":{"id":27560,"name":"ForwarderRegistryContextBase","nameLocations":["1072:28:262"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1072:28:262"},"nodeType":"ModifierInvocation","src":"1072:47:262"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27559,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27558,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1053:17:262","nodeType":"VariableDeclaration","scope":27565,"src":"1034:36:262","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27557,"nodeType":"UserDefinedTypeName","pathNode":{"id":27556,"name":"IForwarderRegistry","nameLocations":["1034:18:262"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1034:18:262"},"referencedDeclaration":13386,"src":"1034:18:262","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1033:38:262"},"returnParameters":{"id":27563,"nodeType":"ParameterList","parameters":[],"src":"1120:0:262"},"scope":27613,"src":"1022:100:262","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27583,"nodeType":"Block","src":"1338:119:262","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27574,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27598],"referencedDeclaration":27598,"src":"1395:10:262","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27575,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1395:12:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27569,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1348:17:262","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1366:6:262","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1348:24:262","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1348:26:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27573,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1375:19:262","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1348:46:262","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27576,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1348:60:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27577,"nodeType":"ExpressionStatement","src":"1348:60:262"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27578,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1418:12:262","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27580,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1431:17:262","memberName":"initERC20Mintable","nodeType":"MemberAccess","referencedDeclaration":28822,"src":"1418:30:262","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27581,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1418:32:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27582,"nodeType":"ExpressionStatement","src":"1418:32:262"}]},"documentation":{"id":27566,"nodeType":"StructuredDocumentation","src":"1128:160:262","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"11e60a3e","id":27584,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20MintableStorage","nameLocation":"1302:24:262","nodeType":"FunctionDefinition","parameters":{"id":27567,"nodeType":"ParameterList","parameters":[],"src":"1326:2:262"},"returnParameters":{"id":27568,"nodeType":"ParameterList","parameters":[],"src":"1338:0:262"},"scope":27613,"src":"1293:164:262","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27597,"nodeType":"Block","src":"1622:65:262","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27593,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1639:28:262","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1668:10:262","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1639:39:262","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27595,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1639:41:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27592,"id":27596,"nodeType":"Return","src":"1632:48:262"}]},"documentation":{"id":27585,"nodeType":"StructuredDocumentation","src":"1463:44:262","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27598,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1521:10:262","nodeType":"FunctionDefinition","overrides":{"id":27589,"nodeType":"OverrideSpecifier","overrides":[{"id":27587,"name":"Context","nameLocations":["1565:7:262"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1565:7:262"},{"id":27588,"name":"ForwarderRegistryContextBase","nameLocations":["1574:28:262"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1574:28:262"}],"src":"1556:47:262"},"parameters":{"id":27586,"nodeType":"ParameterList","parameters":[],"src":"1531:2:262"},"returnParameters":{"id":27592,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27591,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27598,"src":"1613:7:262","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27590,"name":"address","nodeType":"ElementaryTypeName","src":"1613:7:262","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1612:9:262"},"scope":27613,"src":"1512:175:262","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27611,"nodeType":"Block","src":"1857:63:262","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27607,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1874:28:262","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27608,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1903:8:262","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1874:37:262","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27609,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1874:39:262","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27606,"id":27610,"nodeType":"Return","src":"1867:46:262"}]},"documentation":{"id":27599,"nodeType":"StructuredDocumentation","src":"1693:44:262","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27612,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1751:8:262","nodeType":"FunctionDefinition","overrides":{"id":27603,"nodeType":"OverrideSpecifier","overrides":[{"id":27601,"name":"Context","nameLocations":["1793:7:262"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1793:7:262"},{"id":27602,"name":"ForwarderRegistryContextBase","nameLocations":["1802:28:262"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1802:28:262"}],"src":"1784:47:262"},"parameters":{"id":27600,"nodeType":"ParameterList","parameters":[],"src":"1759:2:262"},"returnParameters":{"id":27606,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27605,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27612,"src":"1841:14:262","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27604,"name":"bytes","nodeType":"ElementaryTypeName","src":"1841:5:262","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1840:16:262"},"scope":27613,"src":"1742:178:262","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27614,"src":"878:1044:262","usedErrors":[7886,8223,11559,19183,27061,27064,27071],"usedEvents":[27102]}],"src":"32:1891:262"},"id":262},"contracts/token/ERC20/facets/ERC20PermitFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20PermitFacet.sol","exportedSymbols":{"Context":[1206],"ERC20PermitBase":[26931],"ERC20PermitFacet":[27698],"ERC20PermitStorage":[28612],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27699,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27615,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:263"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27617,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":13387,"src":"57:87:263","symbolAliases":[{"foreign":{"id":27616,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","file":"./../libraries/ERC20PermitStorage.sol","id":27619,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":28613,"src":"145:73:263","symbolAliases":[{"foreign":{"id":27618,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"153:18:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27621,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":19478,"src":"219:83:263","symbolAliases":[{"foreign":{"id":27620,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"227:17:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20PermitBase.sol","file":"./../base/ERC20PermitBase.sol","id":27623,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":26932,"src":"303:62:263","symbolAliases":[{"foreign":{"id":27622,"name":"ERC20PermitBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26931,"src":"311:15:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27625,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":1207,"src":"366:66:263","symbolAliases":[{"foreign":{"id":27624,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"374:7:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27627,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27699,"sourceUnit":13298,"src":"433:101:263","symbolAliases":[{"foreign":{"id":27626,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"441:28:263","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27629,"name":"ERC20PermitBase","nameLocations":["887:15:263"],"nodeType":"IdentifierPath","referencedDeclaration":26931,"src":"887:15:263"},"id":27630,"nodeType":"InheritanceSpecifier","src":"887:15:263"},{"baseName":{"id":27631,"name":"ForwarderRegistryContextBase","nameLocations":["904:28:263"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"904:28:263"},"id":27632,"nodeType":"InheritanceSpecifier","src":"904:28:263"}],"canonicalName":"ERC20PermitFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27628,"nodeType":"StructuredDocumentation","src":"536:322:263","text":"@title ERC20 Fungible Token Standard, optional extension: Permit (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}."},"fullyImplemented":true,"id":27698,"linearizedBaseContracts":[27698,13297,26931,1206,28017],"name":"ERC20PermitFacet","nameLocation":"867:16:263","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27636,"libraryName":{"id":27633,"name":"ERC20PermitStorage","nameLocations":["945:18:263"],"nodeType":"IdentifierPath","referencedDeclaration":28612,"src":"945:18:263"},"nodeType":"UsingForDirective","src":"939:55:263","typeName":{"id":27635,"nodeType":"UserDefinedTypeName","pathNode":{"id":27634,"name":"ERC20PermitStorage.Layout","nameLocations":["968:18:263","987:6:263"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"968:25:263"},"referencedDeclaration":28411,"src":"968:25:263","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}}},{"global":false,"id":27640,"libraryName":{"id":27637,"name":"ProxyAdminStorage","nameLocations":["1005:17:263"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1005:17:263"},"nodeType":"UsingForDirective","src":"999:53:263","typeName":{"id":27639,"nodeType":"UserDefinedTypeName","pathNode":{"id":27638,"name":"ProxyAdminStorage.Layout","nameLocations":["1027:17:263","1045:6:263"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1027:24:263"},"referencedDeclaration":19308,"src":"1027:24:263","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27649,"nodeType":"Block","src":"1156:2:263","statements":[]},"id":27650,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27646,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27643,"src":"1137:17:263","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27647,"kind":"baseConstructorSpecifier","modifierName":{"id":27645,"name":"ForwarderRegistryContextBase","nameLocations":["1108:28:263"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1108:28:263"},"nodeType":"ModifierInvocation","src":"1108:47:263"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27644,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27643,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1089:17:263","nodeType":"VariableDeclaration","scope":27650,"src":"1070:36:263","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27642,"nodeType":"UserDefinedTypeName","pathNode":{"id":27641,"name":"IForwarderRegistry","nameLocations":["1070:18:263"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1070:18:263"},"referencedDeclaration":13386,"src":"1070:18:263","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1069:38:263"},"returnParameters":{"id":27648,"nodeType":"ParameterList","parameters":[],"src":"1156:0:263"},"scope":27698,"src":"1058:100:263","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27668,"nodeType":"Block","src":"1370:112:263","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27659,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27683],"referencedDeclaration":27683,"src":"1427:10:263","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1427:12:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27654,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1380:17:263","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1398:6:263","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1380:24:263","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27657,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1380:26:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27658,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1407:19:263","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1380:46:263","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1380:60:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27662,"nodeType":"ExpressionStatement","src":"1380:60:263"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27663,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"1450:18:263","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":27665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1469:4:263","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28446,"src":"1450:23:263","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1450:25:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27667,"nodeType":"ExpressionStatement","src":"1450:25:263"}]},"documentation":{"id":27651,"nodeType":"StructuredDocumentation","src":"1164:158:263","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"1de5d844","id":27669,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20PermitStorage","nameLocation":"1336:22:263","nodeType":"FunctionDefinition","parameters":{"id":27652,"nodeType":"ParameterList","parameters":[],"src":"1358:2:263"},"returnParameters":{"id":27653,"nodeType":"ParameterList","parameters":[],"src":"1370:0:263"},"scope":27698,"src":"1327:155:263","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27682,"nodeType":"Block","src":"1647:65:263","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27678,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1664:28:263","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27679,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1693:10:263","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1664:39:263","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27680,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1664:41:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27677,"id":27681,"nodeType":"Return","src":"1657:48:263"}]},"documentation":{"id":27670,"nodeType":"StructuredDocumentation","src":"1488:44:263","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27683,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1546:10:263","nodeType":"FunctionDefinition","overrides":{"id":27674,"nodeType":"OverrideSpecifier","overrides":[{"id":27672,"name":"Context","nameLocations":["1590:7:263"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1590:7:263"},{"id":27673,"name":"ForwarderRegistryContextBase","nameLocations":["1599:28:263"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1599:28:263"}],"src":"1581:47:263"},"parameters":{"id":27671,"nodeType":"ParameterList","parameters":[],"src":"1556:2:263"},"returnParameters":{"id":27677,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27676,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27683,"src":"1638:7:263","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27675,"name":"address","nodeType":"ElementaryTypeName","src":"1638:7:263","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1637:9:263"},"scope":27698,"src":"1537:175:263","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27696,"nodeType":"Block","src":"1882:63:263","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27692,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1899:28:263","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27693,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1928:8:263","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1899:37:263","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27694,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1899:39:263","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27691,"id":27695,"nodeType":"Return","src":"1892:46:263"}]},"documentation":{"id":27684,"nodeType":"StructuredDocumentation","src":"1718:44:263","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27697,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1776:8:263","nodeType":"FunctionDefinition","overrides":{"id":27688,"nodeType":"OverrideSpecifier","overrides":[{"id":27686,"name":"Context","nameLocations":["1818:7:263"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1818:7:263"},{"id":27687,"name":"ForwarderRegistryContextBase","nameLocations":["1827:28:263"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1827:28:263"}],"src":"1809:47:263"},"parameters":{"id":27685,"nodeType":"ParameterList","parameters":[],"src":"1784:2:263"},"returnParameters":{"id":27691,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27690,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27697,"src":"1866:14:263","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27689,"name":"bytes","nodeType":"ElementaryTypeName","src":"1866:5:263","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1865:16:263"},"scope":27698,"src":"1767:178:263","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27699,"src":"858:1089:263","usedErrors":[11559,19183,27031,27076,27081,27084],"usedEvents":[27111]}],"src":"32:1916:263"},"id":263},"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol","exportedSymbols":{"Context":[1206],"ERC20SafeTransfersBase":[27006],"ERC20SafeTransfersFacet":[27779],"ERC20Storage":[30139],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":27780,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27700,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:264"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":27702,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":13387,"src":"57:87:264","symbolAliases":[{"foreign":{"id":27701,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../libraries/ERC20Storage.sol","id":27704,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":30140,"src":"145:61:264","symbolAliases":[{"foreign":{"id":27703,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":27706,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":19478,"src":"207:83:264","symbolAliases":[{"foreign":{"id":27705,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"215:17:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol","file":"./../base/ERC20SafeTransfersBase.sol","id":27708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":27007,"src":"291:76:264","symbolAliases":[{"foreign":{"id":27707,"name":"ERC20SafeTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27006,"src":"299:22:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":27710,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":1207,"src":"368:66:264","symbolAliases":[{"foreign":{"id":27709,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"376:7:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":27712,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":27780,"sourceUnit":13298,"src":"435:101:264","symbolAliases":[{"foreign":{"id":27711,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"443:28:264","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":27714,"name":"ERC20SafeTransfersBase","nameLocations":["882:22:264"],"nodeType":"IdentifierPath","referencedDeclaration":27006,"src":"882:22:264"},"id":27715,"nodeType":"InheritanceSpecifier","src":"882:22:264"},{"baseName":{"id":27716,"name":"ForwarderRegistryContextBase","nameLocations":["906:28:264"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"906:28:264"},"id":27717,"nodeType":"InheritanceSpecifier","src":"906:28:264"}],"canonicalName":"ERC20SafeTransfersFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":27713,"nodeType":"StructuredDocumentation","src":"538:308:264","text":"@title ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":27779,"linearizedBaseContracts":[27779,13297,27006,1206,28065],"name":"ERC20SafeTransfersFacet","nameLocation":"855:23:264","nodeType":"ContractDefinition","nodes":[{"global":false,"id":27721,"libraryName":{"id":27718,"name":"ProxyAdminStorage","nameLocations":["947:17:264"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"947:17:264"},"nodeType":"UsingForDirective","src":"941:53:264","typeName":{"id":27720,"nodeType":"UserDefinedTypeName","pathNode":{"id":27719,"name":"ProxyAdminStorage.Layout","nameLocations":["969:17:264","987:6:264"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"969:24:264"},"referencedDeclaration":19308,"src":"969:24:264","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":27730,"nodeType":"Block","src":"1098:2:264","statements":[]},"id":27731,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":27727,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27724,"src":"1079:17:264","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":27728,"kind":"baseConstructorSpecifier","modifierName":{"id":27726,"name":"ForwarderRegistryContextBase","nameLocations":["1050:28:264"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1050:28:264"},"nodeType":"ModifierInvocation","src":"1050:47:264"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":27725,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27724,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1031:17:264","nodeType":"VariableDeclaration","scope":27731,"src":"1012:36:264","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":27723,"nodeType":"UserDefinedTypeName","pathNode":{"id":27722,"name":"IForwarderRegistry","nameLocations":["1012:18:264"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1012:18:264"},"referencedDeclaration":13386,"src":"1012:18:264","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1011:38:264"},"returnParameters":{"id":27729,"nodeType":"ParameterList","parameters":[],"src":"1098:0:264"},"scope":27779,"src":"1000:100:264","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":27749,"nodeType":"Block","src":"1327:124:264","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":27740,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[27764],"referencedDeclaration":27764,"src":"1384:10:264","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27741,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1384:12:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27735,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1337:17:264","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":27737,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1355:6:264","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1337:24:264","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":27738,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1337:26:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":27739,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1364:19:264","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1337:46:264","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":27742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1337:60:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27743,"nodeType":"ExpressionStatement","src":"1337:60:264"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27744,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1407:12:264","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":27746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1420:22:264","memberName":"initERC20SafeTransfers","nodeType":"MemberAccess","referencedDeclaration":28805,"src":"1407:35:264","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":27747,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1407:37:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":27748,"nodeType":"ExpressionStatement","src":"1407:37:264"}]},"documentation":{"id":27732,"nodeType":"StructuredDocumentation","src":"1106:166:264","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"d294f8eb","id":27750,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20SafeTransfersStorage","nameLocation":"1286:29:264","nodeType":"FunctionDefinition","parameters":{"id":27733,"nodeType":"ParameterList","parameters":[],"src":"1315:2:264"},"returnParameters":{"id":27734,"nodeType":"ParameterList","parameters":[],"src":"1327:0:264"},"scope":27779,"src":"1277:174:264","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":27763,"nodeType":"Block","src":"1616:65:264","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27759,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1633:28:264","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1662:10:264","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1633:39:264","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":27761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1633:41:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":27758,"id":27762,"nodeType":"Return","src":"1626:48:264"}]},"documentation":{"id":27751,"nodeType":"StructuredDocumentation","src":"1457:44:264","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27764,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1515:10:264","nodeType":"FunctionDefinition","overrides":{"id":27755,"nodeType":"OverrideSpecifier","overrides":[{"id":27753,"name":"Context","nameLocations":["1559:7:264"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1559:7:264"},{"id":27754,"name":"ForwarderRegistryContextBase","nameLocations":["1568:28:264"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1568:28:264"}],"src":"1550:47:264"},"parameters":{"id":27752,"nodeType":"ParameterList","parameters":[],"src":"1525:2:264"},"returnParameters":{"id":27758,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27757,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27764,"src":"1607:7:264","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27756,"name":"address","nodeType":"ElementaryTypeName","src":"1607:7:264","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1606:9:264"},"scope":27779,"src":"1506:175:264","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":27777,"nodeType":"Block","src":"1851:63:264","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":27773,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1868:28:264","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":27774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1897:8:264","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1868:37:264","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":27775,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1868:39:264","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":27772,"id":27776,"nodeType":"Return","src":"1861:46:264"}]},"documentation":{"id":27765,"nodeType":"StructuredDocumentation","src":"1687:44:264","text":"@inheritdoc ForwarderRegistryContextBase"},"id":27778,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1745:8:264","nodeType":"FunctionDefinition","overrides":{"id":27769,"nodeType":"OverrideSpecifier","overrides":[{"id":27767,"name":"Context","nameLocations":["1787:7:264"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1787:7:264"},{"id":27768,"name":"ForwarderRegistryContextBase","nameLocations":["1796:28:264"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1796:28:264"}],"src":"1778:47:264"},"parameters":{"id":27766,"nodeType":"ParameterList","parameters":[],"src":"1753:2:264"},"returnParameters":{"id":27772,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27771,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":27778,"src":"1835:14:264","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":27770,"name":"bytes","nodeType":"ElementaryTypeName","src":"1835:5:264","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1834:16:264"},"scope":27779,"src":"1736:178:264","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":27780,"src":"846:1070:264","usedErrors":[11559,19183,27031,27042,27047,27056,27091],"usedEvents":[27102,27111]}],"src":"32:1885:264"},"id":264},"contracts/token/ERC20/interfaces/IERC20.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20.sol","exportedSymbols":{"IERC20":[27839]},"id":27840,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27781,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:265"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20","contractDependencies":[],"contractKind":"interface","documentation":{"id":27782,"nodeType":"StructuredDocumentation","src":"58:185:265","text":"@title ERC20 Token Standard, basic interface (functions).\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: The ERC-165 identifier for this interface is 0x36372b07."},"fullyImplemented":false,"id":27839,"linearizedBaseContracts":[27839],"name":"IERC20","nameLocation":"253:6:265","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27783,"nodeType":"StructuredDocumentation","src":"266:759:265","text":"@notice Sets the allowance to an account from the sender.\n @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\n  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\n  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n @dev Reverts if `spender` is the zero address.\n @dev Emits an {Approval} event.\n @param spender The account being granted the allowance by the message caller.\n @param value The allowance amount to grant.\n @return result Whether the operation succeeded."},"functionSelector":"095ea7b3","id":27792,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"1039:7:265","nodeType":"FunctionDefinition","parameters":{"id":27788,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27785,"mutability":"mutable","name":"spender","nameLocation":"1055:7:265","nodeType":"VariableDeclaration","scope":27792,"src":"1047:15:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27784,"name":"address","nodeType":"ElementaryTypeName","src":"1047:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27787,"mutability":"mutable","name":"value","nameLocation":"1072:5:265","nodeType":"VariableDeclaration","scope":27792,"src":"1064:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27786,"name":"uint256","nodeType":"ElementaryTypeName","src":"1064:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1046:32:265"},"returnParameters":{"id":27791,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27790,"mutability":"mutable","name":"result","nameLocation":"1102:6:265","nodeType":"VariableDeclaration","scope":27792,"src":"1097:11:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27789,"name":"bool","nodeType":"ElementaryTypeName","src":"1097:4:265","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1096:13:265"},"scope":27839,"src":"1030:80:265","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27793,"nodeType":"StructuredDocumentation","src":"1116:408:265","text":"@notice Transfers an amount of tokens to a recipient from the sender.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if the sender does not have at least `value` of balance.\n @dev Emits a {Transfer} event.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @return result Whether the operation succeeded."},"functionSelector":"a9059cbb","id":27802,"implemented":false,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"1538:8:265","nodeType":"FunctionDefinition","parameters":{"id":27798,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27795,"mutability":"mutable","name":"to","nameLocation":"1555:2:265","nodeType":"VariableDeclaration","scope":27802,"src":"1547:10:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27794,"name":"address","nodeType":"ElementaryTypeName","src":"1547:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27797,"mutability":"mutable","name":"value","nameLocation":"1567:5:265","nodeType":"VariableDeclaration","scope":27802,"src":"1559:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27796,"name":"uint256","nodeType":"ElementaryTypeName","src":"1559:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1546:27:265"},"returnParameters":{"id":27801,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27800,"mutability":"mutable","name":"result","nameLocation":"1597:6:265","nodeType":"VariableDeclaration","scope":27802,"src":"1592:11:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27799,"name":"bool","nodeType":"ElementaryTypeName","src":"1592:4:265","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1591:13:265"},"scope":27839,"src":"1529:76:265","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27803,"nodeType":"StructuredDocumentation","src":"1611:682:265","text":"@notice Transfers an amount of tokens to a recipient from a specified address.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `from` does not have at least `value` of balance.\n @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n @dev Emits a {Transfer} event.\n @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\n @param from The account which owns the tokens to transfer.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @return result Whether the operation succeeded."},"functionSelector":"23b872dd","id":27814,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"2307:12:265","nodeType":"FunctionDefinition","parameters":{"id":27810,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27805,"mutability":"mutable","name":"from","nameLocation":"2328:4:265","nodeType":"VariableDeclaration","scope":27814,"src":"2320:12:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27804,"name":"address","nodeType":"ElementaryTypeName","src":"2320:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27807,"mutability":"mutable","name":"to","nameLocation":"2342:2:265","nodeType":"VariableDeclaration","scope":27814,"src":"2334:10:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27806,"name":"address","nodeType":"ElementaryTypeName","src":"2334:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27809,"mutability":"mutable","name":"value","nameLocation":"2354:5:265","nodeType":"VariableDeclaration","scope":27814,"src":"2346:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27808,"name":"uint256","nodeType":"ElementaryTypeName","src":"2346:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2319:41:265"},"returnParameters":{"id":27813,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27812,"mutability":"mutable","name":"result","nameLocation":"2384:6:265","nodeType":"VariableDeclaration","scope":27814,"src":"2379:11:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27811,"name":"bool","nodeType":"ElementaryTypeName","src":"2379:4:265","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2378:13:265"},"scope":27839,"src":"2298:94:265","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27815,"nodeType":"StructuredDocumentation","src":"2398:87:265","text":"@notice Gets the total token supply.\n @return supply The total token supply."},"functionSelector":"18160ddd","id":27820,"implemented":false,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"2499:11:265","nodeType":"FunctionDefinition","parameters":{"id":27816,"nodeType":"ParameterList","parameters":[],"src":"2510:2:265"},"returnParameters":{"id":27819,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27818,"mutability":"mutable","name":"supply","nameLocation":"2544:6:265","nodeType":"VariableDeclaration","scope":27820,"src":"2536:14:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27817,"name":"uint256","nodeType":"ElementaryTypeName","src":"2536:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2535:16:265"},"scope":27839,"src":"2490:62:265","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":27821,"nodeType":"StructuredDocumentation","src":"2558:146:265","text":"@notice Gets an account balance.\n @param owner The account whose balance will be returned.\n @return balance The account balance."},"functionSelector":"70a08231","id":27828,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"2718:9:265","nodeType":"FunctionDefinition","parameters":{"id":27824,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27823,"mutability":"mutable","name":"owner","nameLocation":"2736:5:265","nodeType":"VariableDeclaration","scope":27828,"src":"2728:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27822,"name":"address","nodeType":"ElementaryTypeName","src":"2728:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2727:15:265"},"returnParameters":{"id":27827,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27826,"mutability":"mutable","name":"balance","nameLocation":"2774:7:265","nodeType":"VariableDeclaration","scope":27828,"src":"2766:15:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27825,"name":"uint256","nodeType":"ElementaryTypeName","src":"2766:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2765:17:265"},"scope":27839,"src":"2709:74:265","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":27829,"nodeType":"StructuredDocumentation","src":"2789:330:265","text":"@notice Gets the amount that an account is allowed to spend on behalf of another.\n @param owner The account that has granted an allowance to `spender`.\n @param spender The account that was granted an allowance by `owner`.\n @return value The amount which `spender` is allowed to spend on behalf of `owner`."},"functionSelector":"dd62ed3e","id":27838,"implemented":false,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"3133:9:265","nodeType":"FunctionDefinition","parameters":{"id":27834,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27831,"mutability":"mutable","name":"owner","nameLocation":"3151:5:265","nodeType":"VariableDeclaration","scope":27838,"src":"3143:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27830,"name":"address","nodeType":"ElementaryTypeName","src":"3143:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27833,"mutability":"mutable","name":"spender","nameLocation":"3166:7:265","nodeType":"VariableDeclaration","scope":27838,"src":"3158:15:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27832,"name":"address","nodeType":"ElementaryTypeName","src":"3158:7:265","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3142:32:265"},"returnParameters":{"id":27837,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27836,"mutability":"mutable","name":"value","nameLocation":"3206:5:265","nodeType":"VariableDeclaration","scope":27838,"src":"3198:13:265","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27835,"name":"uint256","nodeType":"ElementaryTypeName","src":"3198:7:265","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3197:15:265"},"scope":27839,"src":"3124:89:265","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":27840,"src":"243:2972:265","usedErrors":[],"usedEvents":[]}],"src":"32:3184:265"},"id":265},"contracts/token/ERC20/interfaces/IERC20Allowance.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Allowance.sol","exportedSymbols":{"IERC20Allowance":[27863]},"id":27864,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27841,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:266"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Allowance","contractDependencies":[],"contractKind":"interface","documentation":{"id":27842,"nodeType":"StructuredDocumentation","src":"58:187:266","text":"@title ERC20 Token Standard, optional extension: Allowance.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0x9d075186."},"fullyImplemented":false,"id":27863,"linearizedBaseContracts":[27863],"name":"IERC20Allowance","nameLocation":"255:15:266","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27843,"nodeType":"StructuredDocumentation","src":"277:598:266","text":"@notice Increases the allowance granted to an account by the sender.\n @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\n @dev Reverts if `spender` is the zero address.\n @dev Reverts if `spender`'s allowance by the sender overflows.\n @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\n @param spender The account whose allowance is being increased.\n @param value The allowance amount increase.\n @return result Whether the operation succeeded."},"functionSelector":"39509351","id":27852,"implemented":false,"kind":"function","modifiers":[],"name":"increaseAllowance","nameLocation":"889:17:266","nodeType":"FunctionDefinition","parameters":{"id":27848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27845,"mutability":"mutable","name":"spender","nameLocation":"915:7:266","nodeType":"VariableDeclaration","scope":27852,"src":"907:15:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27844,"name":"address","nodeType":"ElementaryTypeName","src":"907:7:266","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27847,"mutability":"mutable","name":"value","nameLocation":"932:5:266","nodeType":"VariableDeclaration","scope":27852,"src":"924:13:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27846,"name":"uint256","nodeType":"ElementaryTypeName","src":"924:7:266","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"906:32:266"},"returnParameters":{"id":27851,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27850,"mutability":"mutable","name":"result","nameLocation":"962:6:266","nodeType":"VariableDeclaration","scope":27852,"src":"957:11:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27849,"name":"bool","nodeType":"ElementaryTypeName","src":"957:4:266","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"956:13:266"},"scope":27863,"src":"880:90:266","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27853,"nodeType":"StructuredDocumentation","src":"976:620:266","text":"@notice Decreases the allowance granted to an account by the sender.\n @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\n @dev Reverts if `spender` is the zero address.\n @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\n @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\n @param spender The account whose allowance is being decreased.\n @param value The allowance amount decrease.\n @return result Whether the operation succeeded."},"functionSelector":"a457c2d7","id":27862,"implemented":false,"kind":"function","modifiers":[],"name":"decreaseAllowance","nameLocation":"1610:17:266","nodeType":"FunctionDefinition","parameters":{"id":27858,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27855,"mutability":"mutable","name":"spender","nameLocation":"1636:7:266","nodeType":"VariableDeclaration","scope":27862,"src":"1628:15:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27854,"name":"address","nodeType":"ElementaryTypeName","src":"1628:7:266","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27857,"mutability":"mutable","name":"value","nameLocation":"1653:5:266","nodeType":"VariableDeclaration","scope":27862,"src":"1645:13:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27856,"name":"uint256","nodeType":"ElementaryTypeName","src":"1645:7:266","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1627:32:266"},"returnParameters":{"id":27861,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27860,"mutability":"mutable","name":"result","nameLocation":"1683:6:266","nodeType":"VariableDeclaration","scope":27862,"src":"1678:11:266","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27859,"name":"bool","nodeType":"ElementaryTypeName","src":"1678:4:266","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1677:13:266"},"scope":27863,"src":"1601:90:266","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":27864,"src":"245:1448:266","usedErrors":[],"usedEvents":[]}],"src":"32:1662:266"},"id":266},"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol","exportedSymbols":{"IERC20BatchTransfers":[27893]},"id":27894,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27865,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:267"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20BatchTransfers","contractDependencies":[],"contractKind":"interface","documentation":{"id":27866,"nodeType":"StructuredDocumentation","src":"58:193:267","text":"@title ERC20 Token Standard, optional extension: Batch Transfers.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0xc05327e6."},"fullyImplemented":false,"id":27893,"linearizedBaseContracts":[27893],"name":"IERC20BatchTransfers","nameLocation":"261:20:267","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27867,"nodeType":"StructuredDocumentation","src":"288:595:267","text":"@notice Transfers multiple amounts of tokens to multiple recipients from the sender.\n @dev Reverts if `recipients` and `values` have different lengths.\n @dev Reverts if one of `recipients` is the zero address.\n @dev Reverts if the sender does not have at least `sum(values)` of balance.\n @dev Emits an {IERC20-Transfer} event for each transfer.\n @param recipients The list of accounts to transfer the tokens to.\n @param values The list of amounts of tokens to transfer to each of `recipients`.\n @return result Whether the operation succeeded."},"functionSelector":"88d695b2","id":27878,"implemented":false,"kind":"function","modifiers":[],"name":"batchTransfer","nameLocation":"897:13:267","nodeType":"FunctionDefinition","parameters":{"id":27874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27870,"mutability":"mutable","name":"recipients","nameLocation":"930:10:267","nodeType":"VariableDeclaration","scope":27878,"src":"911:29:267","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":27868,"name":"address","nodeType":"ElementaryTypeName","src":"911:7:267","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":27869,"nodeType":"ArrayTypeName","src":"911:9:267","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":27873,"mutability":"mutable","name":"values","nameLocation":"961:6:267","nodeType":"VariableDeclaration","scope":27878,"src":"942:25:267","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":27871,"name":"uint256","nodeType":"ElementaryTypeName","src":"942:7:267","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":27872,"nodeType":"ArrayTypeName","src":"942:9:267","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"910:58:267"},"returnParameters":{"id":27877,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27876,"mutability":"mutable","name":"result","nameLocation":"992:6:267","nodeType":"VariableDeclaration","scope":27878,"src":"987:11:267","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27875,"name":"bool","nodeType":"ElementaryTypeName","src":"987:4:267","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"986:13:267"},"scope":27893,"src":"888:112:267","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27879,"nodeType":"StructuredDocumentation","src":"1006:888:267","text":"@notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\n @dev Reverts if `recipients` and `values` have different lengths.\n @dev Reverts if one of `recipients` is the zero address.\n @dev Reverts if `from` does not have at least `sum(values)` of balance.\n @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\n @dev Emits an {IERC20-Transfer} event for each transfer.\n @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\n @param from The account which owns the tokens to be transferred.\n @param recipients The list of accounts to transfer the tokens to.\n @param values The list of amounts of tokens to transfer to each of `recipients`.\n @return result Whether the operation succeeded."},"functionSelector":"4885b254","id":27892,"implemented":false,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"1908:17:267","nodeType":"FunctionDefinition","parameters":{"id":27888,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27881,"mutability":"mutable","name":"from","nameLocation":"1934:4:267","nodeType":"VariableDeclaration","scope":27892,"src":"1926:12:267","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27880,"name":"address","nodeType":"ElementaryTypeName","src":"1926:7:267","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27884,"mutability":"mutable","name":"recipients","nameLocation":"1959:10:267","nodeType":"VariableDeclaration","scope":27892,"src":"1940:29:267","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":27882,"name":"address","nodeType":"ElementaryTypeName","src":"1940:7:267","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":27883,"nodeType":"ArrayTypeName","src":"1940:9:267","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":27887,"mutability":"mutable","name":"values","nameLocation":"1990:6:267","nodeType":"VariableDeclaration","scope":27892,"src":"1971:25:267","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":27885,"name":"uint256","nodeType":"ElementaryTypeName","src":"1971:7:267","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":27886,"nodeType":"ArrayTypeName","src":"1971:9:267","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1925:72:267"},"returnParameters":{"id":27891,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27890,"mutability":"mutable","name":"result","nameLocation":"2021:6:267","nodeType":"VariableDeclaration","scope":27892,"src":"2016:11:267","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27889,"name":"bool","nodeType":"ElementaryTypeName","src":"2016:4:267","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2015:13:267"},"scope":27893,"src":"1899:130:267","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":27894,"src":"251:1780:267","usedErrors":[],"usedEvents":[]}],"src":"32:2000:267"},"id":267},"contracts/token/ERC20/interfaces/IERC20Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Burnable.sol","exportedSymbols":{"IERC20Burnable":[27927]},"id":27928,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27895,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:268"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Burnable","contractDependencies":[],"contractKind":"interface","documentation":{"id":27896,"nodeType":"StructuredDocumentation","src":"58:186:268","text":"@title ERC20 Token Standard, optional extension: Burnable.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8."},"fullyImplemented":false,"id":27927,"linearizedBaseContracts":[27927],"name":"IERC20Burnable","nameLocation":"254:14:268","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27897,"nodeType":"StructuredDocumentation","src":"275:349:268","text":"@notice Burns an amount of tokens from the sender, decreasing the total supply.\n @dev Reverts if the sender does not have at least `value` of balance.\n @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\n @param value The amount of tokens to burn.\n @return result Whether the operation succeeded."},"functionSelector":"42966c68","id":27904,"implemented":false,"kind":"function","modifiers":[],"name":"burn","nameLocation":"638:4:268","nodeType":"FunctionDefinition","parameters":{"id":27900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27899,"mutability":"mutable","name":"value","nameLocation":"651:5:268","nodeType":"VariableDeclaration","scope":27904,"src":"643:13:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27898,"name":"uint256","nodeType":"ElementaryTypeName","src":"643:7:268","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"642:15:268"},"returnParameters":{"id":27903,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27902,"mutability":"mutable","name":"result","nameLocation":"681:6:268","nodeType":"VariableDeclaration","scope":27904,"src":"676:11:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27901,"name":"bool","nodeType":"ElementaryTypeName","src":"676:4:268","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"675:13:268"},"scope":27927,"src":"629:60:268","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27905,"nodeType":"StructuredDocumentation","src":"695:613:268","text":"@notice Burns an amount of tokens from a specified address, decreasing the total supply.\n @dev Reverts if `from` does not have at least `value` of balance.\n @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\n @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\n @param from The account to burn the tokens from.\n @param value The amount of tokens to burn.\n @return result Whether the operation succeeded."},"functionSelector":"79cc6790","id":27914,"implemented":false,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"1322:8:268","nodeType":"FunctionDefinition","parameters":{"id":27910,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27907,"mutability":"mutable","name":"from","nameLocation":"1339:4:268","nodeType":"VariableDeclaration","scope":27914,"src":"1331:12:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27906,"name":"address","nodeType":"ElementaryTypeName","src":"1331:7:268","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27909,"mutability":"mutable","name":"value","nameLocation":"1353:5:268","nodeType":"VariableDeclaration","scope":27914,"src":"1345:13:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27908,"name":"uint256","nodeType":"ElementaryTypeName","src":"1345:7:268","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1330:29:268"},"returnParameters":{"id":27913,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27912,"mutability":"mutable","name":"result","nameLocation":"1383:6:268","nodeType":"VariableDeclaration","scope":27914,"src":"1378:11:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27911,"name":"bool","nodeType":"ElementaryTypeName","src":"1378:4:268","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1377:13:268"},"scope":27927,"src":"1313:78:268","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27915,"nodeType":"StructuredDocumentation","src":"1397:799:268","text":"@notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\n @dev Reverts if `owners` and `values` have different lengths.\n @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\n @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\n @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\n @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\n @param owners The list of accounts to burn the tokens from.\n @param values The list of amounts of tokens to burn.\n @return result Whether the operation succeeded."},"functionSelector":"1b9a7529","id":27926,"implemented":false,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"2210:13:268","nodeType":"FunctionDefinition","parameters":{"id":27922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27918,"mutability":"mutable","name":"owners","nameLocation":"2243:6:268","nodeType":"VariableDeclaration","scope":27926,"src":"2224:25:268","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":27916,"name":"address","nodeType":"ElementaryTypeName","src":"2224:7:268","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":27917,"nodeType":"ArrayTypeName","src":"2224:9:268","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":27921,"mutability":"mutable","name":"values","nameLocation":"2270:6:268","nodeType":"VariableDeclaration","scope":27926,"src":"2251:25:268","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":27919,"name":"uint256","nodeType":"ElementaryTypeName","src":"2251:7:268","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":27920,"nodeType":"ArrayTypeName","src":"2251:9:268","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2223:54:268"},"returnParameters":{"id":27925,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27924,"mutability":"mutable","name":"result","nameLocation":"2301:6:268","nodeType":"VariableDeclaration","scope":27926,"src":"2296:11:268","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":27923,"name":"bool","nodeType":"ElementaryTypeName","src":"2296:4:268","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2295:13:268"},"scope":27927,"src":"2201:108:268","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":27928,"src":"244:2067:268","usedErrors":[],"usedEvents":[]}],"src":"32:2280:268"},"id":268},"contracts/token/ERC20/interfaces/IERC20Detailed.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Detailed.sol","exportedSymbols":{"IERC20Detailed":[27949]},"id":27950,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27929,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:269"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Detailed","contractDependencies":[],"contractKind":"interface","documentation":{"id":27930,"nodeType":"StructuredDocumentation","src":"58:186:269","text":"@title ERC20 Token Standard, optional extension: Detailed.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0xa219a025."},"fullyImplemented":false,"id":27949,"linearizedBaseContracts":[27949],"name":"IERC20Detailed","nameLocation":"254:14:269","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27931,"nodeType":"StructuredDocumentation","src":"275:105:269","text":"@notice Gets the name of the token. E.g. \"My Token\".\n @return tokenName The name of the token."},"functionSelector":"06fdde03","id":27936,"implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"394:4:269","nodeType":"FunctionDefinition","parameters":{"id":27932,"nodeType":"ParameterList","parameters":[],"src":"398:2:269"},"returnParameters":{"id":27935,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27934,"mutability":"mutable","name":"tokenName","nameLocation":"438:9:269","nodeType":"VariableDeclaration","scope":27936,"src":"424:23:269","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":27933,"name":"string","nodeType":"ElementaryTypeName","src":"424:6:269","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"423:25:269"},"scope":27949,"src":"385:64:269","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":27937,"nodeType":"StructuredDocumentation","src":"455:106:269","text":"@notice Gets the symbol of the token. E.g. \"TOK\".\n @return tokenSymbol The symbol of the token."},"functionSelector":"95d89b41","id":27942,"implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"575:6:269","nodeType":"FunctionDefinition","parameters":{"id":27938,"nodeType":"ParameterList","parameters":[],"src":"581:2:269"},"returnParameters":{"id":27941,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27940,"mutability":"mutable","name":"tokenSymbol","nameLocation":"621:11:269","nodeType":"VariableDeclaration","scope":27942,"src":"607:25:269","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":27939,"name":"string","nodeType":"ElementaryTypeName","src":"607:6:269","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"606:27:269"},"scope":27949,"src":"566:68:269","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":27943,"nodeType":"StructuredDocumentation","src":"640:516:269","text":"@notice Gets the number of decimals used to display the balances.\n @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\n @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\n @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\n @return nbDecimals The number of decimals used to display the balances."},"functionSelector":"313ce567","id":27948,"implemented":false,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"1170:8:269","nodeType":"FunctionDefinition","parameters":{"id":27944,"nodeType":"ParameterList","parameters":[],"src":"1178:2:269"},"returnParameters":{"id":27947,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27946,"mutability":"mutable","name":"nbDecimals","nameLocation":"1210:10:269","nodeType":"VariableDeclaration","scope":27948,"src":"1204:16:269","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":27945,"name":"uint8","nodeType":"ElementaryTypeName","src":"1204:5:269","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1203:18:269"},"scope":27949,"src":"1161:61:269","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":27950,"src":"244:980:269","usedErrors":[],"usedEvents":[]}],"src":"32:1193:269"},"id":269},"contracts/token/ERC20/interfaces/IERC20Metadata.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Metadata.sol","exportedSymbols":{"IERC20Metadata":[27959]},"id":27960,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27951,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:270"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Metadata","contractDependencies":[],"contractKind":"interface","documentation":{"id":27952,"nodeType":"StructuredDocumentation","src":"58:196:270","text":"@title ERC20 Token Standard, ERC1046 optional extension: Metadata.\n @dev See https://eips.ethereum.org/EIPS/eip-1046\n @dev Note: the ERC-165 identifier for this interface is 0x3c130d90."},"fullyImplemented":false,"id":27959,"linearizedBaseContracts":[27959],"name":"IERC20Metadata","nameLocation":"264:14:270","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27953,"nodeType":"StructuredDocumentation","src":"285:84:270","text":"@notice Gets the token metadata URI.\n @return uri The token metadata URI."},"functionSelector":"3c130d90","id":27958,"implemented":false,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"383:8:270","nodeType":"FunctionDefinition","parameters":{"id":27954,"nodeType":"ParameterList","parameters":[],"src":"391:2:270"},"returnParameters":{"id":27957,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27956,"mutability":"mutable","name":"uri","nameLocation":"431:3:270","nodeType":"VariableDeclaration","scope":27958,"src":"417:17:270","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":27955,"name":"string","nodeType":"ElementaryTypeName","src":"417:6:270","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"416:19:270"},"scope":27959,"src":"374:62:270","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":27960,"src":"254:184:270","usedErrors":[],"usedEvents":[]}],"src":"32:407:270"},"id":270},"contracts/token/ERC20/interfaces/IERC20Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Mintable.sol","exportedSymbols":{"IERC20Mintable":[27981]},"id":27982,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27961,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:271"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Mintable","contractDependencies":[],"contractKind":"interface","documentation":{"id":27962,"nodeType":"StructuredDocumentation","src":"58:186:271","text":"@title ERC20 Token Standard, optional extension: Mintable.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0x28963e1e."},"fullyImplemented":false,"id":27981,"linearizedBaseContracts":[27981],"name":"IERC20Mintable","nameLocation":"254:14:271","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27963,"nodeType":"StructuredDocumentation","src":"275:371:271","text":"@notice Mints an amount of tokens to a recipient, increasing the total supply.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if the total supply overflows.\n @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\n @param to The account to mint the tokens to.\n @param value The amount of tokens to mint."},"functionSelector":"40c10f19","id":27970,"implemented":false,"kind":"function","modifiers":[],"name":"mint","nameLocation":"660:4:271","nodeType":"FunctionDefinition","parameters":{"id":27968,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27965,"mutability":"mutable","name":"to","nameLocation":"673:2:271","nodeType":"VariableDeclaration","scope":27970,"src":"665:10:271","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27964,"name":"address","nodeType":"ElementaryTypeName","src":"665:7:271","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27967,"mutability":"mutable","name":"value","nameLocation":"685:5:271","nodeType":"VariableDeclaration","scope":27970,"src":"677:13:271","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27966,"name":"uint256","nodeType":"ElementaryTypeName","src":"677:7:271","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"664:27:271"},"returnParameters":{"id":27969,"nodeType":"ParameterList","parameters":[],"src":"700:0:271"},"scope":27981,"src":"651:50:271","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":27971,"nodeType":"StructuredDocumentation","src":"707:544:271","text":"@notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\n @dev Reverts if `recipients` and `values` have different lengths.\n @dev Reverts if one of `recipients` is the zero address.\n @dev Reverts if the total supply overflows.\n @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\n @param recipients The list of accounts to mint the tokens to.\n @param values The list of amounts of tokens to mint to each of `recipients`."},"functionSelector":"68573107","id":27980,"implemented":false,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"1265:9:271","nodeType":"FunctionDefinition","parameters":{"id":27978,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27974,"mutability":"mutable","name":"recipients","nameLocation":"1294:10:271","nodeType":"VariableDeclaration","scope":27980,"src":"1275:29:271","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":27972,"name":"address","nodeType":"ElementaryTypeName","src":"1275:7:271","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":27973,"nodeType":"ArrayTypeName","src":"1275:9:271","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":27977,"mutability":"mutable","name":"values","nameLocation":"1325:6:271","nodeType":"VariableDeclaration","scope":27980,"src":"1306:25:271","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":27975,"name":"uint256","nodeType":"ElementaryTypeName","src":"1306:7:271","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":27976,"nodeType":"ArrayTypeName","src":"1306:9:271","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1274:58:271"},"returnParameters":{"id":27979,"nodeType":"ParameterList","parameters":[],"src":"1341:0:271"},"scope":27981,"src":"1256:86:271","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":27982,"src":"244:1100:271","usedErrors":[],"usedEvents":[]}],"src":"32:1313:271"},"id":271},"contracts/token/ERC20/interfaces/IERC20Permit.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Permit.sol","exportedSymbols":{"IERC20Permit":[28017]},"id":28018,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":27983,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:272"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Permit","contractDependencies":[],"contractKind":"interface","documentation":{"id":27984,"nodeType":"StructuredDocumentation","src":"58:314:272","text":"@title ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals\n @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\n @dev See https://eips.ethereum.org/EIPS/eip-2612\n @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da."},"fullyImplemented":false,"id":28017,"linearizedBaseContracts":[28017],"name":"IERC20Permit","nameLocation":"382:12:272","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":27985,"nodeType":"StructuredDocumentation","src":"401:942:272","text":"@notice Sets the allowance to an account from another account using a signed permit.\n @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\n @dev Reverts if `owner` is the zero address.\n @dev Reverts if the current blocktime is greather than `deadline`.\n @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\n @dev Emits an {IERC20-Approval} event.\n @param owner The token owner granting the allowance to `spender`.\n @param spender The token spender being granted the allowance by `owner`.\n @param value The allowance amount to grant.\n @param deadline The deadline from which the permit signature is no longer valid.\n @param v Permit signature v parameter\n @param r Permit signature r parameter.\n @param s Permit signature s parameter."},"functionSelector":"d505accf","id":28002,"implemented":false,"kind":"function","modifiers":[],"name":"permit","nameLocation":"1357:6:272","nodeType":"FunctionDefinition","parameters":{"id":28000,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27987,"mutability":"mutable","name":"owner","nameLocation":"1372:5:272","nodeType":"VariableDeclaration","scope":28002,"src":"1364:13:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27986,"name":"address","nodeType":"ElementaryTypeName","src":"1364:7:272","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27989,"mutability":"mutable","name":"spender","nameLocation":"1387:7:272","nodeType":"VariableDeclaration","scope":28002,"src":"1379:15:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":27988,"name":"address","nodeType":"ElementaryTypeName","src":"1379:7:272","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":27991,"mutability":"mutable","name":"value","nameLocation":"1404:5:272","nodeType":"VariableDeclaration","scope":28002,"src":"1396:13:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27990,"name":"uint256","nodeType":"ElementaryTypeName","src":"1396:7:272","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27993,"mutability":"mutable","name":"deadline","nameLocation":"1419:8:272","nodeType":"VariableDeclaration","scope":28002,"src":"1411:16:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":27992,"name":"uint256","nodeType":"ElementaryTypeName","src":"1411:7:272","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":27995,"mutability":"mutable","name":"v","nameLocation":"1435:1:272","nodeType":"VariableDeclaration","scope":28002,"src":"1429:7:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":27994,"name":"uint8","nodeType":"ElementaryTypeName","src":"1429:5:272","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":27997,"mutability":"mutable","name":"r","nameLocation":"1446:1:272","nodeType":"VariableDeclaration","scope":28002,"src":"1438:9:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":27996,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1438:7:272","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":27999,"mutability":"mutable","name":"s","nameLocation":"1457:1:272","nodeType":"VariableDeclaration","scope":28002,"src":"1449:9:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":27998,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1449:7:272","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1363:96:272"},"returnParameters":{"id":28001,"nodeType":"ParameterList","parameters":[],"src":"1468:0:272"},"scope":28017,"src":"1348:121:272","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":28003,"nodeType":"StructuredDocumentation","src":"1475:171:272","text":"@notice Gets the current permit nonce of an account.\n @param owner The account to check the nonce of.\n @return nonce The current permit nonce of `owner`."},"functionSelector":"7ecebe00","id":28010,"implemented":false,"kind":"function","modifiers":[],"name":"nonces","nameLocation":"1660:6:272","nodeType":"FunctionDefinition","parameters":{"id":28006,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28005,"mutability":"mutable","name":"owner","nameLocation":"1675:5:272","nodeType":"VariableDeclaration","scope":28010,"src":"1667:13:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28004,"name":"address","nodeType":"ElementaryTypeName","src":"1667:7:272","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1666:15:272"},"returnParameters":{"id":28009,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28008,"mutability":"mutable","name":"nonce","nameLocation":"1713:5:272","nodeType":"VariableDeclaration","scope":28010,"src":"1705:13:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28007,"name":"uint256","nodeType":"ElementaryTypeName","src":"1705:7:272","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1704:15:272"},"scope":28017,"src":"1651:69:272","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":28011,"nodeType":"StructuredDocumentation","src":"1726:943:272","text":"@notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\n @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\n  keccak256(\n      abi.encode(\n          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n          keccak256(bytes(name)),\n          keccak256(bytes(version)),\n          chainId,\n          address(this)))\n  where\n   - `name` (string) is the ERC-20 token name.\n   - `version` (string) refers to the ERC-20 token contract version.\n   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\n   - `verifyingContract` (address) is the ERC-20 token contract address.\n @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits."},"functionSelector":"3644e515","id":28016,"implemented":false,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"2736:16:272","nodeType":"FunctionDefinition","parameters":{"id":28012,"nodeType":"ParameterList","parameters":[],"src":"2752:2:272"},"returnParameters":{"id":28015,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28014,"mutability":"mutable","name":"domainSeparator","nameLocation":"2786:15:272","nodeType":"VariableDeclaration","scope":28016,"src":"2778:23:272","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28013,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2778:7:272","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2777:25:272"},"scope":28017,"src":"2727:76:272","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":28018,"src":"372:2433:272","usedErrors":[],"usedEvents":[]}],"src":"32:2774:272"},"id":272},"contracts/token/ERC20/interfaces/IERC20Receiver.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Receiver.sol","exportedSymbols":{"IERC20Receiver":[28035]},"id":28036,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28019,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:273"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":28020,"nodeType":"StructuredDocumentation","src":"58:281:273","text":"@title ERC20 Token Standard, Tokens Receiver.\n @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0x4fc35859."},"fullyImplemented":false,"id":28035,"linearizedBaseContracts":[28035],"name":"IERC20Receiver","nameLocation":"349:14:273","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":28021,"nodeType":"StructuredDocumentation","src":"370:532:273","text":"@notice Handles the receipt of ERC20 tokens.\n @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\n @param operator The initiator of the safe transfer.\n @param from The previous tokens owner.\n @param value The amount of tokens transferred.\n @param data Optional additional data with no specified format.\n @return magicValue `bytes4(keccak256(\"onERC20Received(address,address,uint256,bytes)\"))` (`0x4fc35859`) to accept, any other value to refuse."},"functionSelector":"4fc35859","id":28034,"implemented":false,"kind":"function","modifiers":[],"name":"onERC20Received","nameLocation":"916:15:273","nodeType":"FunctionDefinition","parameters":{"id":28030,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28023,"mutability":"mutable","name":"operator","nameLocation":"940:8:273","nodeType":"VariableDeclaration","scope":28034,"src":"932:16:273","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28022,"name":"address","nodeType":"ElementaryTypeName","src":"932:7:273","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28025,"mutability":"mutable","name":"from","nameLocation":"958:4:273","nodeType":"VariableDeclaration","scope":28034,"src":"950:12:273","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28024,"name":"address","nodeType":"ElementaryTypeName","src":"950:7:273","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28027,"mutability":"mutable","name":"value","nameLocation":"972:5:273","nodeType":"VariableDeclaration","scope":28034,"src":"964:13:273","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28026,"name":"uint256","nodeType":"ElementaryTypeName","src":"964:7:273","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28029,"mutability":"mutable","name":"data","nameLocation":"994:4:273","nodeType":"VariableDeclaration","scope":28034,"src":"979:19:273","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":28028,"name":"bytes","nodeType":"ElementaryTypeName","src":"979:5:273","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"931:68:273"},"returnParameters":{"id":28033,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28032,"mutability":"mutable","name":"magicValue","nameLocation":"1025:10:273","nodeType":"VariableDeclaration","scope":28034,"src":"1018:17:273","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":28031,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1018:6:273","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1017:19:273"},"scope":28035,"src":"907:130:273","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":28036,"src":"339:700:273","usedErrors":[],"usedEvents":[]}],"src":"32:1008:273"},"id":273},"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol","exportedSymbols":{"IERC20SafeTransfers":[28065]},"id":28066,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28037,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:274"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC20SafeTransfers","contractDependencies":[],"contractKind":"interface","documentation":{"id":28038,"nodeType":"StructuredDocumentation","src":"58:192:274","text":"@title ERC20 Token Standard, optional extension: Safe Transfers.\n @dev See https://eips.ethereum.org/EIPS/eip-20\n @dev Note: the ERC-165 identifier for this interface is 0x53f41a97."},"fullyImplemented":false,"id":28065,"linearizedBaseContracts":[28065],"name":"IERC20SafeTransfers","nameLocation":"260:19:274","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":28039,"nodeType":"StructuredDocumentation","src":"286:697:274","text":"@notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if the sender does not have at least `value` of balance.\n @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n @dev Emits an {IERC20-Transfer} event.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @param data Optional additional data with no specified format, to be passed to the receiver contract.\n @return result Whether the operation succeeded."},"functionSelector":"eb795549","id":28050,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransfer","nameLocation":"997:12:274","nodeType":"FunctionDefinition","parameters":{"id":28046,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28041,"mutability":"mutable","name":"to","nameLocation":"1018:2:274","nodeType":"VariableDeclaration","scope":28050,"src":"1010:10:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28040,"name":"address","nodeType":"ElementaryTypeName","src":"1010:7:274","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28043,"mutability":"mutable","name":"value","nameLocation":"1030:5:274","nodeType":"VariableDeclaration","scope":28050,"src":"1022:13:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28042,"name":"uint256","nodeType":"ElementaryTypeName","src":"1022:7:274","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28045,"mutability":"mutable","name":"data","nameLocation":"1052:4:274","nodeType":"VariableDeclaration","scope":28050,"src":"1037:19:274","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":28044,"name":"bytes","nodeType":"ElementaryTypeName","src":"1037:5:274","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1009:48:274"},"returnParameters":{"id":28049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28048,"mutability":"mutable","name":"result","nameLocation":"1081:6:274","nodeType":"VariableDeclaration","scope":28050,"src":"1076:11:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":28047,"name":"bool","nodeType":"ElementaryTypeName","src":"1076:4:274","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1075:13:274"},"scope":28065,"src":"988:101:274","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":28051,"nodeType":"StructuredDocumentation","src":"1095:1009:274","text":"@notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `from` does not have at least `value` of balance.\n @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\n @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\n @dev Emits an {IERC20-Transfer} event.\n @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\n @param from The account which owns the tokens to transfer.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @param data Optional additional data with no specified format, to be passed to the receiver contract.\n @return result Whether the operation succeeded."},"functionSelector":"b88d4fde","id":28064,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"2118:16:274","nodeType":"FunctionDefinition","parameters":{"id":28060,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28053,"mutability":"mutable","name":"from","nameLocation":"2143:4:274","nodeType":"VariableDeclaration","scope":28064,"src":"2135:12:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28052,"name":"address","nodeType":"ElementaryTypeName","src":"2135:7:274","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28055,"mutability":"mutable","name":"to","nameLocation":"2157:2:274","nodeType":"VariableDeclaration","scope":28064,"src":"2149:10:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28054,"name":"address","nodeType":"ElementaryTypeName","src":"2149:7:274","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28057,"mutability":"mutable","name":"value","nameLocation":"2169:5:274","nodeType":"VariableDeclaration","scope":28064,"src":"2161:13:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28056,"name":"uint256","nodeType":"ElementaryTypeName","src":"2161:7:274","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28059,"mutability":"mutable","name":"data","nameLocation":"2191:4:274","nodeType":"VariableDeclaration","scope":28064,"src":"2176:19:274","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":28058,"name":"bytes","nodeType":"ElementaryTypeName","src":"2176:5:274","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2134:62:274"},"returnParameters":{"id":28063,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28062,"mutability":"mutable","name":"result","nameLocation":"2220:6:274","nodeType":"VariableDeclaration","scope":28064,"src":"2215:11:274","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":28061,"name":"bool","nodeType":"ElementaryTypeName","src":"2215:4:274","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2214:13:274"},"scope":28065,"src":"2109:119:274","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":28066,"src":"250:1980:274","usedErrors":[],"usedEvents":[]}],"src":"32:2199:274"},"id":274},"contracts/token/ERC20/interfaces/IERC677.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC677.sol","exportedSymbols":{"IERC677":[28080]},"id":28081,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28067,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:275"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC677","contractDependencies":[],"contractKind":"interface","documentation":{"id":28068,"nodeType":"StructuredDocumentation","src":"58:124:275","text":"@title ERC677 transferAndCall Token Standard, basic interface.\n @dev See https://github.com/ethereum/EIPs/issues/677"},"fullyImplemented":false,"id":28080,"linearizedBaseContracts":[28080],"name":"IERC677","nameLocation":"192:7:275","nodeType":"ContractDefinition","nodes":[{"functionSelector":"4000aea0","id":28079,"implemented":false,"kind":"function","modifiers":[],"name":"transferAndCall","nameLocation":"215:15:275","nodeType":"FunctionDefinition","parameters":{"id":28075,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28070,"mutability":"mutable","name":"receiver","nameLocation":"239:8:275","nodeType":"VariableDeclaration","scope":28079,"src":"231:16:275","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28069,"name":"address","nodeType":"ElementaryTypeName","src":"231:7:275","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28072,"mutability":"mutable","name":"amount","nameLocation":"257:6:275","nodeType":"VariableDeclaration","scope":28079,"src":"249:14:275","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28071,"name":"uint256","nodeType":"ElementaryTypeName","src":"249:7:275","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28074,"mutability":"mutable","name":"data","nameLocation":"280:4:275","nodeType":"VariableDeclaration","scope":28079,"src":"265:19:275","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":28073,"name":"bytes","nodeType":"ElementaryTypeName","src":"265:5:275","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"230:55:275"},"returnParameters":{"id":28078,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28077,"mutability":"mutable","name":"success","nameLocation":"309:7:275","nodeType":"VariableDeclaration","scope":28079,"src":"304:12:275","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":28076,"name":"bool","nodeType":"ElementaryTypeName","src":"304:4:275","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"303:14:275"},"scope":28080,"src":"206:112:275","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":28081,"src":"182:138:275","usedErrors":[],"usedEvents":[]}],"src":"32:289:275"},"id":275},"contracts/token/ERC20/interfaces/IERC677Receiver.sol":{"ast":{"absolutePath":"contracts/token/ERC20/interfaces/IERC677Receiver.sol","exportedSymbols":{"IERC677Receiver":[28095]},"id":28096,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28082,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:276"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC677Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":28083,"nodeType":"StructuredDocumentation","src":"58:127:276","text":"@title ERC677 transferAndCall Token Standard, receiver interface.\n @dev See https://github.com/ethereum/EIPs/issues/677"},"fullyImplemented":false,"id":28095,"linearizedBaseContracts":[28095],"name":"IERC677Receiver","nameLocation":"195:15:276","nodeType":"ContractDefinition","nodes":[{"functionSelector":"a4c0ed36","id":28094,"implemented":false,"kind":"function","modifiers":[],"name":"onTokenTransfer","nameLocation":"226:15:276","nodeType":"FunctionDefinition","parameters":{"id":28090,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28085,"mutability":"mutable","name":"from","nameLocation":"250:4:276","nodeType":"VariableDeclaration","scope":28094,"src":"242:12:276","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28084,"name":"address","nodeType":"ElementaryTypeName","src":"242:7:276","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28087,"mutability":"mutable","name":"amount","nameLocation":"264:6:276","nodeType":"VariableDeclaration","scope":28094,"src":"256:14:276","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28086,"name":"uint256","nodeType":"ElementaryTypeName","src":"256:7:276","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28089,"mutability":"mutable","name":"data","nameLocation":"287:4:276","nodeType":"VariableDeclaration","scope":28094,"src":"272:19:276","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":28088,"name":"bytes","nodeType":"ElementaryTypeName","src":"272:5:276","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"241:51:276"},"returnParameters":{"id":28093,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28092,"mutability":"mutable","name":"success","nameLocation":"316:7:276","nodeType":"VariableDeclaration","scope":28094,"src":"311:12:276","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":28091,"name":"bool","nodeType":"ElementaryTypeName","src":"311:4:276","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"310:14:276"},"scope":28095,"src":"217:108:276","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":28096,"src":"185:142:276","usedErrors":[],"usedEvents":[]}],"src":"32:296:276"},"id":276},"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol":{"ast":{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","exportedSymbols":{"ERC20DetailedStorage":[28291],"IERC20Detailed":[27949],"InterfaceDetectionStorage":[11680],"ProxyInitialization":[19524]},"id":28292,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28097,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:277"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Detailed.sol","file":"./../interfaces/IERC20Detailed.sol","id":28099,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28292,"sourceUnit":27950,"src":"58:66:277","symbolAliases":[{"foreign":{"id":28098,"name":"IERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27949,"src":"66:14:277","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../../proxy/libraries/ProxyInitialization.sol","id":28101,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28292,"sourceUnit":19525,"src":"125:87:277","symbolAliases":[{"foreign":{"id":28100,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"133:19:277","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":28103,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28292,"sourceUnit":11681,"src":"213:107:277","symbolAliases":[{"foreign":{"id":28102,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"221:25:277","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC20DetailedStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":28291,"linearizedBaseContracts":[28291],"name":"ERC20DetailedStorage","nameLocation":"330:20:277","nodeType":"ContractDefinition","nodes":[{"global":false,"id":28107,"libraryName":{"id":28104,"name":"InterfaceDetectionStorage","nameLocations":["363:25:277"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"363:25:277"},"nodeType":"UsingForDirective","src":"357:69:277","typeName":{"id":28106,"nodeType":"UserDefinedTypeName","pathNode":{"id":28105,"name":"InterfaceDetectionStorage.Layout","nameLocations":["393:25:277","419:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"393:32:277"},"referencedDeclaration":11590,"src":"393:32:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"global":false,"id":28111,"libraryName":{"id":28108,"name":"ERC20DetailedStorage","nameLocations":["437:20:277"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"437:20:277"},"nodeType":"UsingForDirective","src":"431:59:277","typeName":{"id":28110,"nodeType":"UserDefinedTypeName","pathNode":{"id":28109,"name":"ERC20DetailedStorage.Layout","nameLocations":["462:20:277","483:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"462:27:277"},"referencedDeclaration":28118,"src":"462:27:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"canonicalName":"ERC20DetailedStorage.Layout","id":28118,"members":[{"constant":false,"id":28113,"mutability":"mutable","name":"tokenName","nameLocation":"527:9:277","nodeType":"VariableDeclaration","scope":28118,"src":"520:16:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":28112,"name":"string","nodeType":"ElementaryTypeName","src":"520:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28115,"mutability":"mutable","name":"tokenSymbol","nameLocation":"553:11:277","nodeType":"VariableDeclaration","scope":28118,"src":"546:18:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":28114,"name":"string","nodeType":"ElementaryTypeName","src":"546:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28117,"mutability":"mutable","name":"tokenDecimals","nameLocation":"580:13:277","nodeType":"VariableDeclaration","scope":28118,"src":"574:19:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28116,"name":"uint8","nodeType":"ElementaryTypeName","src":"574:5:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"name":"Layout","nameLocation":"503:6:277","nodeType":"StructDefinition","scope":28291,"src":"496:104:277","visibility":"public"},{"constant":true,"id":28131,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"632:19:277","nodeType":"VariableDeclaration","scope":28291,"src":"606:129:277","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28119,"name":"bytes32","nodeType":"ElementaryTypeName","src":"606:7:277","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e455243323044657461696c65642e73746f72616765","id":28125,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"680:48:277","typeDescriptions":{"typeIdentifier":"t_stringliteral_335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Detailed.storage\""},"value":"animoca.core.token.ERC20.ERC20Detailed.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Detailed.storage\""}],"id":28124,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"670:9:277","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28126,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"670:59:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28123,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"662:7:277","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28122,"name":"uint256","nodeType":"ElementaryTypeName","src":"662:7:277","typeDescriptions":{}}},"id":28127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"662:68:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28128,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"733:1:277","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"662:72:277","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28121,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"654:7:277","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28120,"name":"bytes32","nodeType":"ElementaryTypeName","src":"654:7:277","typeDescriptions":{}}},"id":28130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"654:81:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":28144,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"767:21:277","nodeType":"VariableDeclaration","scope":28291,"src":"741:129:277","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28132,"name":"bytes32","nodeType":"ElementaryTypeName","src":"741:7:277","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28142,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e455243323044657461696c65642e7068617365","id":28138,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"817:46:277","typeDescriptions":{"typeIdentifier":"t_stringliteral_d217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb75","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Detailed.phase\""},"value":"animoca.core.token.ERC20.ERC20Detailed.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_d217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb75","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Detailed.phase\""}],"id":28137,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"807:9:277","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28139,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"807:57:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28136,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"799:7:277","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28135,"name":"uint256","nodeType":"ElementaryTypeName","src":"799:7:277","typeDescriptions":{}}},"id":28140,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"799:66:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"868:1:277","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"799:70:277","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28134,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"791:7:277","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28133,"name":"bytes32","nodeType":"ElementaryTypeName","src":"791:7:277","typeDescriptions":{}}},"id":28143,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"791:79:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":28187,"nodeType":"Block","src":"1420:224:277","statements":[{"expression":{"id":28161,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28157,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28148,"src":"1430:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28159,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1432:9:277","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":28113,"src":"1430:11:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28160,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28150,"src":"1444:9:277","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"1430:23:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":28162,"nodeType":"ExpressionStatement","src":"1430:23:277"},{"expression":{"id":28167,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28163,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28148,"src":"1463:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28165,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1465:11:277","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":28115,"src":"1463:13:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28166,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28152,"src":"1479:11:277","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"1463:27:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":28168,"nodeType":"ExpressionStatement","src":"1463:27:277"},{"expression":{"id":28173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28169,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28148,"src":"1500:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28171,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1502:13:277","memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":28117,"src":"1500:15:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28172,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28154,"src":"1518:13:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"1500:31:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":28174,"nodeType":"ExpressionStatement","src":"1500:31:277"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":28181,"name":"IERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27949,"src":"1603:14:277","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Detailed_$27949_$","typeString":"type(contract IERC20Detailed)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Detailed_$27949_$","typeString":"type(contract IERC20Detailed)"}],"id":28180,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1598:4:277","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1598:20:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Detailed_$27949","typeString":"type(contract IERC20Detailed)"}},"id":28183,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1619:11:277","memberName":"interfaceId","nodeType":"MemberAccess","src":"1598:32:277","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28184,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1632:4:277","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28175,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1541:25:277","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28177,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1567:6:277","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"1541:32:277","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28178,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1541:34:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28179,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1576:21:277","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"1541:56:277","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1541:96:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28186,"nodeType":"ExpressionStatement","src":"1541:96:277"}]},"documentation":{"id":28145,"nodeType":"StructuredDocumentation","src":"877:413:277","text":"@notice Initializes the storage with the token details (immutable version).\n @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenDecimals The token decimals."},"id":28188,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1304:15:277","nodeType":"FunctionDefinition","parameters":{"id":28155,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28148,"mutability":"mutable","name":"s","nameLocation":"1335:1:277","nodeType":"VariableDeclaration","scope":28188,"src":"1320:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28147,"nodeType":"UserDefinedTypeName","pathNode":{"id":28146,"name":"Layout","nameLocations":["1320:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"1320:6:277"},"referencedDeclaration":28118,"src":"1320:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":28150,"mutability":"mutable","name":"tokenName","nameLocation":"1352:9:277","nodeType":"VariableDeclaration","scope":28188,"src":"1338:23:277","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":28149,"name":"string","nodeType":"ElementaryTypeName","src":"1338:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28152,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1377:11:277","nodeType":"VariableDeclaration","scope":28188,"src":"1363:25:277","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":28151,"name":"string","nodeType":"ElementaryTypeName","src":"1363:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28154,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1396:13:277","nodeType":"VariableDeclaration","scope":28188,"src":"1390:19:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28153,"name":"uint8","nodeType":"ElementaryTypeName","src":"1390:5:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1319:91:277"},"returnParameters":{"id":28156,"nodeType":"ParameterList","parameters":[],"src":"1420:0:277"},"scope":28291,"src":"1295:349:277","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28238,"nodeType":"Block","src":"2354:288:277","statements":[{"expression":{"arguments":[{"id":28204,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28144,"src":"2393:21:277","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":28205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2416:1:277","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":28201,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2364:19:277","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":28203,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2384:8:277","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2364:28:277","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":28206,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2364:54:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28207,"nodeType":"ExpressionStatement","src":"2364:54:277"},{"expression":{"id":28212,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28208,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28192,"src":"2428:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28210,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2430:9:277","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":28113,"src":"2428:11:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28211,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28194,"src":"2442:9:277","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"2428:23:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":28213,"nodeType":"ExpressionStatement","src":"2428:23:277"},{"expression":{"id":28218,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28214,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28192,"src":"2461:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28216,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2463:11:277","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":28115,"src":"2461:13:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28217,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28196,"src":"2477:11:277","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"2461:27:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":28219,"nodeType":"ExpressionStatement","src":"2461:27:277"},{"expression":{"id":28224,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28220,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28192,"src":"2498:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28222,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2500:13:277","memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":28117,"src":"2498:15:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28223,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28198,"src":"2516:13:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"2498:31:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":28225,"nodeType":"ExpressionStatement","src":"2498:31:277"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":28232,"name":"IERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27949,"src":"2601:14:277","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Detailed_$27949_$","typeString":"type(contract IERC20Detailed)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Detailed_$27949_$","typeString":"type(contract IERC20Detailed)"}],"id":28231,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2596:4:277","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28233,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2596:20:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Detailed_$27949","typeString":"type(contract IERC20Detailed)"}},"id":28234,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2617:11:277","memberName":"interfaceId","nodeType":"MemberAccess","src":"2596:32:277","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28235,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2630:4:277","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28226,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2539:25:277","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2565:6:277","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2539:32:277","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2539:34:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28230,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2574:21:277","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2539:56:277","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28236,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2539:96:277","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28237,"nodeType":"ExpressionStatement","src":"2539:96:277"}]},"documentation":{"id":28189,"nodeType":"StructuredDocumentation","src":"1650:576:277","text":"@notice Initializes the storage with the token details (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenDecimals The token decimals."},"id":28239,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"2240:9:277","nodeType":"FunctionDefinition","parameters":{"id":28199,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28192,"mutability":"mutable","name":"s","nameLocation":"2265:1:277","nodeType":"VariableDeclaration","scope":28239,"src":"2250:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28191,"nodeType":"UserDefinedTypeName","pathNode":{"id":28190,"name":"Layout","nameLocations":["2250:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"2250:6:277"},"referencedDeclaration":28118,"src":"2250:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":28194,"mutability":"mutable","name":"tokenName","nameLocation":"2284:9:277","nodeType":"VariableDeclaration","scope":28239,"src":"2268:25:277","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":28193,"name":"string","nodeType":"ElementaryTypeName","src":"2268:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28196,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2311:11:277","nodeType":"VariableDeclaration","scope":28239,"src":"2295:27:277","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":28195,"name":"string","nodeType":"ElementaryTypeName","src":"2295:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":28198,"mutability":"mutable","name":"tokenDecimals","nameLocation":"2330:13:277","nodeType":"VariableDeclaration","scope":28239,"src":"2324:19:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28197,"name":"uint8","nodeType":"ElementaryTypeName","src":"2324:5:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2249:95:277"},"returnParameters":{"id":28200,"nodeType":"ParameterList","parameters":[],"src":"2354:0:277"},"scope":28291,"src":"2231:411:277","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28251,"nodeType":"Block","src":"2838:35:277","statements":[{"expression":{"expression":{"id":28248,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28243,"src":"2855:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28249,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2857:9:277","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":28113,"src":"2855:11:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":28247,"id":28250,"nodeType":"Return","src":"2848:18:277"}]},"documentation":{"id":28240,"nodeType":"StructuredDocumentation","src":"2648:105:277","text":"@notice Gets the name of the token. E.g. \"My Token\".\n @return tokenName The name of the token."},"id":28252,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"2767:4:277","nodeType":"FunctionDefinition","parameters":{"id":28244,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28243,"mutability":"mutable","name":"s","nameLocation":"2787:1:277","nodeType":"VariableDeclaration","scope":28252,"src":"2772:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28242,"nodeType":"UserDefinedTypeName","pathNode":{"id":28241,"name":"Layout","nameLocations":["2772:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"2772:6:277"},"referencedDeclaration":28118,"src":"2772:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"}],"src":"2771:18:277"},"returnParameters":{"id":28247,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28246,"mutability":"mutable","name":"tokenName","nameLocation":"2827:9:277","nodeType":"VariableDeclaration","scope":28252,"src":"2813:23:277","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":28245,"name":"string","nodeType":"ElementaryTypeName","src":"2813:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2812:25:277"},"scope":28291,"src":"2758:115:277","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28264,"nodeType":"Block","src":"3074:37:277","statements":[{"expression":{"expression":{"id":28261,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28256,"src":"3091:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28262,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3093:11:277","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":28115,"src":"3091:13:277","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":28260,"id":28263,"nodeType":"Return","src":"3084:20:277"}]},"documentation":{"id":28253,"nodeType":"StructuredDocumentation","src":"2879:106:277","text":"@notice Gets the symbol of the token. E.g. \"TOK\".\n @return tokenSymbol The symbol of the token."},"id":28265,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"2999:6:277","nodeType":"FunctionDefinition","parameters":{"id":28257,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28256,"mutability":"mutable","name":"s","nameLocation":"3021:1:277","nodeType":"VariableDeclaration","scope":28265,"src":"3006:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28255,"nodeType":"UserDefinedTypeName","pathNode":{"id":28254,"name":"Layout","nameLocations":["3006:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"3006:6:277"},"referencedDeclaration":28118,"src":"3006:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"}],"src":"3005:18:277"},"returnParameters":{"id":28260,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28259,"mutability":"mutable","name":"tokenSymbol","nameLocation":"3061:11:277","nodeType":"VariableDeclaration","scope":28265,"src":"3047:25:277","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":28258,"name":"string","nodeType":"ElementaryTypeName","src":"3047:6:277","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3046:27:277"},"scope":28291,"src":"2990:121:277","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28277,"nodeType":"Block","src":"3715:39:277","statements":[{"expression":{"expression":{"id":28274,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28269,"src":"3732:1:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28275,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3734:13:277","memberName":"tokenDecimals","nodeType":"MemberAccess","referencedDeclaration":28117,"src":"3732:15:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"functionReturnParameters":28273,"id":28276,"nodeType":"Return","src":"3725:22:277"}]},"documentation":{"id":28266,"nodeType":"StructuredDocumentation","src":"3117:516:277","text":"@notice Gets the number of decimals used to display the balances.\n @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\n @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\n @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\n @return nbDecimals The number of decimals used to display the balances."},"id":28278,"implemented":true,"kind":"function","modifiers":[],"name":"decimals","nameLocation":"3647:8:277","nodeType":"FunctionDefinition","parameters":{"id":28270,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28269,"mutability":"mutable","name":"s","nameLocation":"3671:1:277","nodeType":"VariableDeclaration","scope":28278,"src":"3656:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28268,"nodeType":"UserDefinedTypeName","pathNode":{"id":28267,"name":"Layout","nameLocations":["3656:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"3656:6:277"},"referencedDeclaration":28118,"src":"3656:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"}],"src":"3655:18:277"},"returnParameters":{"id":28273,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28272,"mutability":"mutable","name":"nbDecimals","nameLocation":"3703:10:277","nodeType":"VariableDeclaration","scope":28278,"src":"3697:16:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28271,"name":"uint8","nodeType":"ElementaryTypeName","src":"3697:5:277","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"3696:18:277"},"scope":28291,"src":"3638:116:277","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28289,"nodeType":"Block","src":"3819:115:277","statements":[{"assignments":[28285],"declarations":[{"constant":false,"id":28285,"mutability":"mutable","name":"position","nameLocation":"3837:8:277","nodeType":"VariableDeclaration","scope":28289,"src":"3829:16:277","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28284,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3829:7:277","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":28287,"initialValue":{"id":28286,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28131,"src":"3848:19:277","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3829:38:277"},{"AST":{"nativeSrc":"3886:42:277","nodeType":"YulBlock","src":"3886:42:277","statements":[{"nativeSrc":"3900:18:277","nodeType":"YulAssignment","src":"3900:18:277","value":{"name":"position","nativeSrc":"3910:8:277","nodeType":"YulIdentifier","src":"3910:8:277"},"variableNames":[{"name":"s.slot","nativeSrc":"3900:6:277","nodeType":"YulIdentifier","src":"3900:6:277"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":28285,"isOffset":false,"isSlot":false,"src":"3910:8:277","valueSize":1},{"declaration":28282,"isOffset":false,"isSlot":true,"src":"3900:6:277","suffix":"slot","valueSize":1}],"id":28288,"nodeType":"InlineAssembly","src":"3877:51:277"}]},"id":28290,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"3769:6:277","nodeType":"FunctionDefinition","parameters":{"id":28279,"nodeType":"ParameterList","parameters":[],"src":"3775:2:277"},"returnParameters":{"id":28283,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28282,"mutability":"mutable","name":"s","nameLocation":"3816:1:277","nodeType":"VariableDeclaration","scope":28290,"src":"3801:16:277","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"},"typeName":{"id":28281,"nodeType":"UserDefinedTypeName","pathNode":{"id":28280,"name":"Layout","nameLocations":["3801:6:277"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"3801:6:277"},"referencedDeclaration":28118,"src":"3801:6:277","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}},"visibility":"internal"}],"src":"3800:18:277"},"scope":28291,"src":"3760:174:277","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":28292,"src":"322:3614:277","usedErrors":[],"usedEvents":[]}],"src":"32:3905:277"},"id":277},"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol":{"ast":{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","exportedSymbols":{"ERC20MetadataStorage":[28380],"IERC20Metadata":[27959],"InterfaceDetectionStorage":[11680]},"id":28381,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28293,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:278"},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Metadata.sol","file":"./../interfaces/IERC20Metadata.sol","id":28295,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28381,"sourceUnit":27960,"src":"58:66:278","symbolAliases":[{"foreign":{"id":28294,"name":"IERC20Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27959,"src":"66:14:278","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":28297,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28381,"sourceUnit":11681,"src":"125:107:278","symbolAliases":[{"foreign":{"id":28296,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"133:25:278","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC20MetadataStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":28380,"linearizedBaseContracts":[28380],"name":"ERC20MetadataStorage","nameLocation":"242:20:278","nodeType":"ContractDefinition","nodes":[{"global":false,"id":28301,"libraryName":{"id":28298,"name":"InterfaceDetectionStorage","nameLocations":["275:25:278"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"275:25:278"},"nodeType":"UsingForDirective","src":"269:69:278","typeName":{"id":28300,"nodeType":"UserDefinedTypeName","pathNode":{"id":28299,"name":"InterfaceDetectionStorage.Layout","nameLocations":["305:25:278","331:6:278"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"305:32:278"},"referencedDeclaration":11590,"src":"305:32:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"global":false,"id":28305,"libraryName":{"id":28302,"name":"ERC20MetadataStorage","nameLocations":["349:20:278"],"nodeType":"IdentifierPath","referencedDeclaration":28380,"src":"349:20:278"},"nodeType":"UsingForDirective","src":"343:59:278","typeName":{"id":28304,"nodeType":"UserDefinedTypeName","pathNode":{"id":28303,"name":"ERC20MetadataStorage.Layout","nameLocations":["374:20:278","395:6:278"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"374:27:278"},"referencedDeclaration":28308,"src":"374:27:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}}},{"canonicalName":"ERC20MetadataStorage.Layout","id":28308,"members":[{"constant":false,"id":28307,"mutability":"mutable","name":"uri","nameLocation":"439:3:278","nodeType":"VariableDeclaration","scope":28308,"src":"432:10:278","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":28306,"name":"string","nodeType":"ElementaryTypeName","src":"432:6:278","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"name":"Layout","nameLocation":"415:6:278","nodeType":"StructDefinition","scope":28380,"src":"408:41:278","visibility":"public"},{"constant":true,"id":28321,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"481:19:278","nodeType":"VariableDeclaration","scope":28380,"src":"455:129:278","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28309,"name":"bytes32","nodeType":"ElementaryTypeName","src":"455:7:278","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e45524332304d657461646174612e73746f72616765","id":28315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"529:48:278","typeDescriptions":{"typeIdentifier":"t_stringliteral_f41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839ceb","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Metadata.storage\""},"value":"animoca.core.token.ERC20.ERC20Metadata.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839ceb","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Metadata.storage\""}],"id":28314,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"519:9:278","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"519:59:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28313,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"511:7:278","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28312,"name":"uint256","nodeType":"ElementaryTypeName","src":"511:7:278","typeDescriptions":{}}},"id":28317,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"511:68:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"582:1:278","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"511:72:278","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28311,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"503:7:278","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28310,"name":"bytes32","nodeType":"ElementaryTypeName","src":"503:7:278","typeDescriptions":{}}},"id":28320,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"503:81:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":28337,"nodeType":"Block","src":"701:113:278","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28331,"name":"IERC20Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27959,"src":"773:14:278","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Metadata_$27959_$","typeString":"type(contract IERC20Metadata)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Metadata_$27959_$","typeString":"type(contract IERC20Metadata)"}],"id":28330,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"768:4:278","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28332,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"768:20:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Metadata_$27959","typeString":"type(contract IERC20Metadata)"}},"id":28333,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"789:11:278","memberName":"interfaceId","nodeType":"MemberAccess","src":"768:32:278","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28334,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"802:4:278","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28325,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"711:25:278","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28327,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"737:6:278","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"711:32:278","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"711:34:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28329,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"746:21:278","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"711:56:278","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"711:96:278","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28336,"nodeType":"ExpressionStatement","src":"711:96:278"}]},"documentation":{"id":28322,"nodeType":"StructuredDocumentation","src":"591:80:278","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"id":28338,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"685:4:278","nodeType":"FunctionDefinition","parameters":{"id":28323,"nodeType":"ParameterList","parameters":[],"src":"689:2:278"},"returnParameters":{"id":28324,"nodeType":"ParameterList","parameters":[],"src":"701:0:278"},"scope":28380,"src":"676:138:278","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28353,"nodeType":"Block","src":"959:28:278","statements":[{"expression":{"id":28351,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":28347,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28342,"src":"969:1:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout storage pointer"}},"id":28349,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"971:3:278","memberName":"uri","nodeType":"MemberAccess","referencedDeclaration":28307,"src":"969:5:278","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28350,"name":"uri","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28344,"src":"977:3:278","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"969:11:278","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":28352,"nodeType":"ExpressionStatement","src":"969:11:278"}]},"documentation":{"id":28339,"nodeType":"StructuredDocumentation","src":"820:65:278","text":"@notice Sets the token URI.\n @param uri The token URI."},"id":28354,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"899:11:278","nodeType":"FunctionDefinition","parameters":{"id":28345,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28342,"mutability":"mutable","name":"s","nameLocation":"926:1:278","nodeType":"VariableDeclaration","scope":28354,"src":"911:16:278","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"},"typeName":{"id":28341,"nodeType":"UserDefinedTypeName","pathNode":{"id":28340,"name":"Layout","nameLocations":["911:6:278"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"911:6:278"},"referencedDeclaration":28308,"src":"911:6:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":28344,"mutability":"mutable","name":"uri","nameLocation":"945:3:278","nodeType":"VariableDeclaration","scope":28354,"src":"929:19:278","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":28343,"name":"string","nodeType":"ElementaryTypeName","src":"929:6:278","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"910:39:278"},"returnParameters":{"id":28346,"nodeType":"ParameterList","parameters":[],"src":"959:0:278"},"scope":28380,"src":"890:97:278","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28366,"nodeType":"Block","src":"1160:29:278","statements":[{"expression":{"expression":{"id":28363,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28358,"src":"1177:1:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout storage pointer"}},"id":28364,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1179:3:278","memberName":"uri","nodeType":"MemberAccess","referencedDeclaration":28307,"src":"1177:5:278","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":28362,"id":28365,"nodeType":"Return","src":"1170:12:278"}]},"documentation":{"id":28355,"nodeType":"StructuredDocumentation","src":"993:84:278","text":"@notice Gets the token metadata URI.\n @return uri The token metadata URI."},"id":28367,"implemented":true,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"1091:8:278","nodeType":"FunctionDefinition","parameters":{"id":28359,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28358,"mutability":"mutable","name":"s","nameLocation":"1115:1:278","nodeType":"VariableDeclaration","scope":28367,"src":"1100:16:278","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"},"typeName":{"id":28357,"nodeType":"UserDefinedTypeName","pathNode":{"id":28356,"name":"Layout","nameLocations":["1100:6:278"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"1100:6:278"},"referencedDeclaration":28308,"src":"1100:6:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}},"visibility":"internal"}],"src":"1099:18:278"},"returnParameters":{"id":28362,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28361,"mutability":"mutable","name":"uri","nameLocation":"1155:3:278","nodeType":"VariableDeclaration","scope":28367,"src":"1141:17:278","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":28360,"name":"string","nodeType":"ElementaryTypeName","src":"1141:6:278","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1140:19:278"},"scope":28380,"src":"1082:107:278","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28378,"nodeType":"Block","src":"1254:115:278","statements":[{"assignments":[28374],"declarations":[{"constant":false,"id":28374,"mutability":"mutable","name":"position","nameLocation":"1272:8:278","nodeType":"VariableDeclaration","scope":28378,"src":"1264:16:278","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28373,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1264:7:278","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":28376,"initialValue":{"id":28375,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28321,"src":"1283:19:278","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"1264:38:278"},{"AST":{"nativeSrc":"1321:42:278","nodeType":"YulBlock","src":"1321:42:278","statements":[{"nativeSrc":"1335:18:278","nodeType":"YulAssignment","src":"1335:18:278","value":{"name":"position","nativeSrc":"1345:8:278","nodeType":"YulIdentifier","src":"1345:8:278"},"variableNames":[{"name":"s.slot","nativeSrc":"1335:6:278","nodeType":"YulIdentifier","src":"1335:6:278"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":28374,"isOffset":false,"isSlot":false,"src":"1345:8:278","valueSize":1},{"declaration":28371,"isOffset":false,"isSlot":true,"src":"1335:6:278","suffix":"slot","valueSize":1}],"id":28377,"nodeType":"InlineAssembly","src":"1312:51:278"}]},"id":28379,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"1204:6:278","nodeType":"FunctionDefinition","parameters":{"id":28368,"nodeType":"ParameterList","parameters":[],"src":"1210:2:278"},"returnParameters":{"id":28372,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28371,"mutability":"mutable","name":"s","nameLocation":"1251:1:278","nodeType":"VariableDeclaration","scope":28379,"src":"1236:16:278","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"},"typeName":{"id":28370,"nodeType":"UserDefinedTypeName","pathNode":{"id":28369,"name":"Layout","nameLocations":["1236:6:278"],"nodeType":"IdentifierPath","referencedDeclaration":28308,"src":"1236:6:278"},"referencedDeclaration":28308,"src":"1236:6:278","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28308_storage_ptr","typeString":"struct ERC20MetadataStorage.Layout"}},"visibility":"internal"}],"src":"1235:18:278"},"scope":28380,"src":"1195:174:278","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":28381,"src":"234:1137:278","usedErrors":[],"usedEvents":[]}],"src":"32:1340:278"},"id":278},"contracts/token/ERC20/libraries/ERC20PermitStorage.sol":{"ast":{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","exportedSymbols":{"ERC20DetailedStorage":[28291],"ERC20PermitExpired":[27081],"ERC20PermitFromAddressZero":[27076],"ERC20PermitInvalidSignature":[27084],"ERC20PermitStorage":[28612],"ERC20Storage":[30139],"IERC20Permit":[28017],"InterfaceDetectionStorage":[11680]},"id":28613,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28382,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:279"},{"absolutePath":"contracts/token/ERC20/errors/ERC20PermitErrors.sol","file":"./../errors/ERC20PermitErrors.sol","id":28386,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28613,"sourceUnit":27085,"src":"58:126:279","symbolAliases":[{"foreign":{"id":28383,"name":"ERC20PermitFromAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27076,"src":"66:26:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28384,"name":"ERC20PermitExpired","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27081,"src":"94:18:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28385,"name":"ERC20PermitInvalidSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27084,"src":"114:27:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Permit.sol","file":"./../interfaces/IERC20Permit.sol","id":28388,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28613,"sourceUnit":28018,"src":"185:62:279","symbolAliases":[{"foreign":{"id":28387,"name":"IERC20Permit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28017,"src":"193:12:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./ERC20Storage.sol","id":28390,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28613,"sourceUnit":30140,"src":"248:48:279","symbolAliases":[{"foreign":{"id":28389,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"256:12:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./ERC20DetailedStorage.sol","id":28392,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28613,"sourceUnit":28292,"src":"297:64:279","symbolAliases":[{"foreign":{"id":28391,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"305:20:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":28394,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":28613,"sourceUnit":11681,"src":"362:107:279","symbolAliases":[{"foreign":{"id":28393,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"370:25:279","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC20PermitStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":28612,"linearizedBaseContracts":[28612],"name":"ERC20PermitStorage","nameLocation":"479:18:279","nodeType":"ContractDefinition","nodes":[{"global":false,"id":28398,"libraryName":{"id":28395,"name":"ERC20Storage","nameLocations":["510:12:279"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"510:12:279"},"nodeType":"UsingForDirective","src":"504:43:279","typeName":{"id":28397,"nodeType":"UserDefinedTypeName","pathNode":{"id":28396,"name":"ERC20Storage.Layout","nameLocations":["527:12:279","540:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"527:19:279"},"referencedDeclaration":28678,"src":"527:19:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":28402,"libraryName":{"id":28399,"name":"ERC20DetailedStorage","nameLocations":["558:20:279"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"558:20:279"},"nodeType":"UsingForDirective","src":"552:59:279","typeName":{"id":28401,"nodeType":"UserDefinedTypeName","pathNode":{"id":28400,"name":"ERC20DetailedStorage.Layout","nameLocations":["583:20:279","604:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"583:27:279"},"referencedDeclaration":28118,"src":"583:27:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"global":false,"id":28406,"libraryName":{"id":28403,"name":"InterfaceDetectionStorage","nameLocations":["622:25:279"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"622:25:279"},"nodeType":"UsingForDirective","src":"616:69:279","typeName":{"id":28405,"nodeType":"UserDefinedTypeName","pathNode":{"id":28404,"name":"InterfaceDetectionStorage.Layout","nameLocations":["652:25:279","678:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"652:32:279"},"referencedDeclaration":11590,"src":"652:32:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ERC20PermitStorage.Layout","id":28411,"members":[{"constant":false,"id":28410,"mutability":"mutable","name":"accountNonces","nameLocation":"743:13:279","nodeType":"VariableDeclaration","scope":28411,"src":"715:41:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":28409,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":28407,"name":"address","nodeType":"ElementaryTypeName","src":"723:7:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"715:27:279","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":28408,"name":"uint256","nodeType":"ElementaryTypeName","src":"734:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"}],"name":"Layout","nameLocation":"698:6:279","nodeType":"StructDefinition","scope":28612,"src":"691:72:279","visibility":"public"},{"constant":true,"id":28424,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"795:19:279","nodeType":"VariableDeclaration","scope":28612,"src":"769:127:279","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28412,"name":"bytes32","nodeType":"ElementaryTypeName","src":"769:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28422,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e45524332305065726d69742e73746f72616765","id":28418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"843:46:279","typeDescriptions":{"typeIdentifier":"t_stringliteral_93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011e","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Permit.storage\""},"value":"animoca.core.token.ERC20.ERC20Permit.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011e","typeString":"literal_string \"animoca.core.token.ERC20.ERC20Permit.storage\""}],"id":28417,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"833:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28419,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"833:57:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28416,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"825:7:279","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28415,"name":"uint256","nodeType":"ElementaryTypeName","src":"825:7:279","typeDescriptions":{}}},"id":28420,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"825:66:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28421,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"894:1:279","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"825:70:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28414,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"817:7:279","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28413,"name":"bytes32","nodeType":"ElementaryTypeName","src":"817:7:279","typeDescriptions":{}}},"id":28423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"817:79:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":28429,"mutability":"constant","name":"PERMIT_TYPEHASH","nameLocation":"1003:15:279","nodeType":"VariableDeclaration","scope":28612,"src":"977:139:279","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28425,"name":"bytes32","nodeType":"ElementaryTypeName","src":"977:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"hexValue":"5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529","id":28427,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1031:84:279","typeDescriptions":{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""},"value":"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""}],"id":28426,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1021:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1021:95:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":28445,"nodeType":"Block","src":"1231:111:279","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28439,"name":"IERC20Permit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28017,"src":"1303:12:279","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Permit_$28017_$","typeString":"type(contract IERC20Permit)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Permit_$28017_$","typeString":"type(contract IERC20Permit)"}],"id":28438,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"1298:4:279","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1298:18:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Permit_$28017","typeString":"type(contract IERC20Permit)"}},"id":28441,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1317:11:279","memberName":"interfaceId","nodeType":"MemberAccess","src":"1298:30:279","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28442,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1330:4:279","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28433,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1241:25:279","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28435,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1267:6:279","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"1241:32:279","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28436,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1241:34:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28437,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1276:21:279","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"1241:56:279","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1241:94:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28444,"nodeType":"ExpressionStatement","src":"1241:94:279"}]},"documentation":{"id":28430,"nodeType":"StructuredDocumentation","src":"1123:78:279","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Permit."},"id":28446,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"1215:4:279","nodeType":"FunctionDefinition","parameters":{"id":28431,"nodeType":"ParameterList","parameters":[],"src":"1219:2:279"},"returnParameters":{"id":28432,"nodeType":"ParameterList","parameters":[],"src":"1231:0:279"},"scope":28612,"src":"1206:136:279","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28543,"nodeType":"Block","src":"2390:605:279","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":28472,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28467,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28452,"src":"2404:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":28470,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2421:1:279","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":28469,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2413:7:279","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":28468,"name":"address","nodeType":"ElementaryTypeName","src":"2413:7:279","typeDescriptions":{}}},"id":28471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2413:10:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2404:19:279","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28476,"nodeType":"IfStatement","src":"2400:60:279","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":28473,"name":"ERC20PermitFromAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27076,"src":"2432:26:279","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":28474,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2432:28:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28475,"nodeType":"RevertStatement","src":"2425:35:279"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":28477,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2474:5:279","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":28478,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2480:9:279","memberName":"timestamp","nodeType":"MemberAccess","src":"2474:15:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":28479,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28458,"src":"2492:8:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2474:26:279","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28485,"nodeType":"IfStatement","src":"2470:67:279","trueBody":{"errorCall":{"arguments":[{"id":28482,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28458,"src":"2528:8:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28481,"name":"ERC20PermitExpired","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27081,"src":"2509:18:279","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":28483,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2509:28:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28484,"nodeType":"RevertStatement","src":"2502:35:279"}},{"id":28532,"nodeType":"UncheckedBlock","src":"2547:380:279","statements":[{"assignments":[28487],"declarations":[{"constant":false,"id":28487,"mutability":"mutable","name":"hashStruct","nameLocation":"2579:10:279","nodeType":"VariableDeclaration","scope":28532,"src":"2571:18:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28486,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2571:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":28503,"initialValue":{"arguments":[{"arguments":[{"id":28491,"name":"PERMIT_TYPEHASH","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28429,"src":"2613:15:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":28492,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28452,"src":"2630:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28493,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28454,"src":"2637:7:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28494,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28456,"src":"2646:5:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":28499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2653:25:279","subExpression":{"baseExpression":{"expression":{"id":28495,"name":"st","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28450,"src":"2653:2:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout storage pointer"}},"id":28496,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2656:13:279","memberName":"accountNonces","nodeType":"MemberAccess","referencedDeclaration":28410,"src":"2653:16:279","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28498,"indexExpression":{"id":28497,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28452,"src":"2670:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2653:23:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":28500,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28458,"src":"2680:8:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":28489,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2602:3:279","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":28490,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2606:6:279","memberName":"encode","nodeType":"MemberAccess","src":"2602:10:279","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":28501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2602:87:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":28488,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2592:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28502,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2592:98:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2571:119:279"},{"assignments":[28505],"declarations":[{"constant":false,"id":28505,"mutability":"mutable","name":"hash","nameLocation":"2712:4:279","nodeType":"VariableDeclaration","scope":28532,"src":"2704:12:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28504,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2704:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":28515,"initialValue":{"arguments":[{"arguments":[{"hexValue":"1901","id":28509,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2746:10:279","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"arguments":[],"expression":{"argumentTypes":[],"id":28510,"name":"DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28599,"src":"2758:16:279","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":28511,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2758:18:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":28512,"name":"hashStruct","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28487,"src":"2778:10:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":28507,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2729:3:279","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":28508,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2733:12:279","memberName":"encodePacked","nodeType":"MemberAccess","src":"2729:16:279","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":28513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2729:60:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":28506,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2719:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28514,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2719:71:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2704:86:279"},{"assignments":[28517],"declarations":[{"constant":false,"id":28517,"mutability":"mutable","name":"signer","nameLocation":"2812:6:279","nodeType":"VariableDeclaration","scope":28532,"src":"2804:14:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28516,"name":"address","nodeType":"ElementaryTypeName","src":"2804:7:279","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":28524,"initialValue":{"arguments":[{"id":28519,"name":"hash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28505,"src":"2831:4:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":28520,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28460,"src":"2837:1:279","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":28521,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28462,"src":"2840:1:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":28522,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28464,"src":"2843:1:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28518,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"2821:9:279","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":28523,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2821:24:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2804:41:279"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":28527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28525,"name":"signer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28517,"src":"2863:6:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":28526,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28452,"src":"2873:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2863:15:279","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28531,"nodeType":"IfStatement","src":"2859:57:279","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":28528,"name":"ERC20PermitInvalidSignature","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27084,"src":"2887:27:279","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":28529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2887:29:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28530,"nodeType":"RevertStatement","src":"2880:36:279"}}]},{"expression":{"arguments":[{"id":28538,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28452,"src":"2966:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28539,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28454,"src":"2973:7:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28540,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28456,"src":"2982:5:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28533,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2936:12:279","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":28535,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2949:6:279","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"2936:19:279","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":28536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2936:21:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28537,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2958:7:279","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":28880,"src":"2936:29:279","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":28541,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2936:52:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28542,"nodeType":"ExpressionStatement","src":"2936:52:279"}]},"documentation":{"id":28447,"nodeType":"StructuredDocumentation","src":"1348:897:279","text":"@notice Sets the allowance to an account from another account using a signed permit.\n @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\n @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\n @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\n @dev Emits an {IERC20-Approval} event.\n @param owner The token owner granting the allowance to `spender`.\n @param spender The token spender being granted the allowance by `owner`.\n @param value The allowance amount to grant.\n @param deadline The deadline from which the permit signature is no longer valid.\n @param v Permit signature v parameter\n @param r Permit signature r parameter.\n @param s Permit signature s parameter."},"id":28544,"implemented":true,"kind":"function","modifiers":[],"name":"permit","nameLocation":"2259:6:279","nodeType":"FunctionDefinition","parameters":{"id":28465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28450,"mutability":"mutable","name":"st","nameLocation":"2281:2:279","nodeType":"VariableDeclaration","scope":28544,"src":"2266:17:279","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"},"typeName":{"id":28449,"nodeType":"UserDefinedTypeName","pathNode":{"id":28448,"name":"Layout","nameLocations":["2266:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"2266:6:279"},"referencedDeclaration":28411,"src":"2266:6:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":28452,"mutability":"mutable","name":"owner","nameLocation":"2293:5:279","nodeType":"VariableDeclaration","scope":28544,"src":"2285:13:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28451,"name":"address","nodeType":"ElementaryTypeName","src":"2285:7:279","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28454,"mutability":"mutable","name":"spender","nameLocation":"2308:7:279","nodeType":"VariableDeclaration","scope":28544,"src":"2300:15:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28453,"name":"address","nodeType":"ElementaryTypeName","src":"2300:7:279","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28456,"mutability":"mutable","name":"value","nameLocation":"2325:5:279","nodeType":"VariableDeclaration","scope":28544,"src":"2317:13:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28455,"name":"uint256","nodeType":"ElementaryTypeName","src":"2317:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28458,"mutability":"mutable","name":"deadline","nameLocation":"2340:8:279","nodeType":"VariableDeclaration","scope":28544,"src":"2332:16:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28457,"name":"uint256","nodeType":"ElementaryTypeName","src":"2332:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":28460,"mutability":"mutable","name":"v","nameLocation":"2356:1:279","nodeType":"VariableDeclaration","scope":28544,"src":"2350:7:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":28459,"name":"uint8","nodeType":"ElementaryTypeName","src":"2350:5:279","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":28462,"mutability":"mutable","name":"r","nameLocation":"2367:1:279","nodeType":"VariableDeclaration","scope":28544,"src":"2359:9:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28461,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2359:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":28464,"mutability":"mutable","name":"s","nameLocation":"2378:1:279","nodeType":"VariableDeclaration","scope":28544,"src":"2370:9:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28463,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2370:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2265:115:279"},"returnParameters":{"id":28466,"nodeType":"ParameterList","parameters":[],"src":"2390:0:279"},"scope":28612,"src":"2250:745:279","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28560,"nodeType":"Block","src":"3264:46:279","statements":[{"expression":{"baseExpression":{"expression":{"id":28555,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28548,"src":"3281:1:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout storage pointer"}},"id":28556,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3283:13:279","memberName":"accountNonces","nodeType":"MemberAccess","referencedDeclaration":28410,"src":"3281:15:279","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28558,"indexExpression":{"id":28557,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28550,"src":"3297:5:279","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3281:22:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":28554,"id":28559,"nodeType":"Return","src":"3274:29:279"}]},"documentation":{"id":28545,"nodeType":"StructuredDocumentation","src":"3001:171:279","text":"@notice Gets the current permit nonce of an account.\n @param owner The account to check the nonce of.\n @return nonce The current permit nonce of `owner`."},"id":28561,"implemented":true,"kind":"function","modifiers":[],"name":"nonces","nameLocation":"3186:6:279","nodeType":"FunctionDefinition","parameters":{"id":28551,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28548,"mutability":"mutable","name":"s","nameLocation":"3208:1:279","nodeType":"VariableDeclaration","scope":28561,"src":"3193:16:279","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"},"typeName":{"id":28547,"nodeType":"UserDefinedTypeName","pathNode":{"id":28546,"name":"Layout","nameLocations":["3193:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"3193:6:279"},"referencedDeclaration":28411,"src":"3193:6:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":28550,"mutability":"mutable","name":"owner","nameLocation":"3219:5:279","nodeType":"VariableDeclaration","scope":28561,"src":"3211:13:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28549,"name":"address","nodeType":"ElementaryTypeName","src":"3211:7:279","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3192:33:279"},"returnParameters":{"id":28554,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28553,"mutability":"mutable","name":"nonce","nameLocation":"3257:5:279","nodeType":"VariableDeclaration","scope":28561,"src":"3249:13:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28552,"name":"uint256","nodeType":"ElementaryTypeName","src":"3249:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3248:15:279"},"scope":28612,"src":"3177:133:279","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28598,"nodeType":"Block","src":"4377:485:279","statements":[{"assignments":[28568],"declarations":[{"constant":false,"id":28568,"mutability":"mutable","name":"chainId","nameLocation":"4395:7:279","nodeType":"VariableDeclaration","scope":28598,"src":"4387:15:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28567,"name":"uint256","nodeType":"ElementaryTypeName","src":"4387:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":28569,"nodeType":"VariableDeclarationStatement","src":"4387:15:279"},{"AST":{"nativeSrc":"4421:44:279","nodeType":"YulBlock","src":"4421:44:279","statements":[{"nativeSrc":"4435:20:279","nodeType":"YulAssignment","src":"4435:20:279","value":{"arguments":[],"functionName":{"name":"chainid","nativeSrc":"4446:7:279","nodeType":"YulIdentifier","src":"4446:7:279"},"nativeSrc":"4446:9:279","nodeType":"YulFunctionCall","src":"4446:9:279"},"variableNames":[{"name":"chainId","nativeSrc":"4435:7:279","nodeType":"YulIdentifier","src":"4435:7:279"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":28568,"isOffset":false,"isSlot":false,"src":"4435:7:279","valueSize":1}],"id":28570,"nodeType":"InlineAssembly","src":"4412:53:279"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429","id":28575,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4562:84:279","typeDescriptions":{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""},"value":"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""}],"id":28574,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4552:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28576,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4552:95:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28580,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"4685:20:279","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":28581,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4706:6:279","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"4685:27:279","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":28582,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4685:29:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":28583,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4715:4:279","memberName":"name","nodeType":"MemberAccess","referencedDeclaration":28252,"src":"4685:34:279","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$28118_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer) view returns (string memory)"}},"id":28584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4685:36:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":28579,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4679:5:279","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":28578,"name":"bytes","nodeType":"ElementaryTypeName","src":"4679:5:279","typeDescriptions":{}}},"id":28585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4679:43:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":28577,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4669:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28586,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4669:54:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"hexValue":"31","id":28588,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4755:3:279","typeDescriptions":{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""}],"id":28587,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4745:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4745:14:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":28590,"name":"chainId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28568,"src":"4781:7:279","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":28593,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4818:4:279","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20PermitStorage_$28612","typeString":"library ERC20PermitStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC20PermitStorage_$28612","typeString":"library ERC20PermitStorage"}],"id":28592,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4810:7:279","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":28591,"name":"address","nodeType":"ElementaryTypeName","src":"4810:7:279","typeDescriptions":{}}},"id":28594,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4810:13:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":28572,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4520:3:279","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":28573,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4524:6:279","memberName":"encode","nodeType":"MemberAccess","src":"4520:10:279","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":28595,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4520:321:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":28571,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4493:9:279","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4493:362:279","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":28566,"id":28597,"nodeType":"Return","src":"4474:381:279"}]},"documentation":{"id":28562,"nodeType":"StructuredDocumentation","src":"3316:943:279","text":"@notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\n @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\n  keccak256(\n      abi.encode(\n          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n          keccak256(bytes(name)),\n          keccak256(bytes(version)),\n          chainId,\n          address(this)))\n  where\n   - `name` (string) is the ERC-20 token name.\n   - `version` (string) refers to the ERC-20 token contract version.\n   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\n   - `verifyingContract` (address) is the ERC-20 token contract address.\n @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits."},"id":28599,"implemented":true,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"4326:16:279","nodeType":"FunctionDefinition","parameters":{"id":28563,"nodeType":"ParameterList","parameters":[],"src":"4342:2:279"},"returnParameters":{"id":28566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28565,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":28599,"src":"4368:7:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28564,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4368:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"4367:9:279"},"scope":28612,"src":"4317:545:279","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":28610,"nodeType":"Block","src":"4927:115:279","statements":[{"assignments":[28606],"declarations":[{"constant":false,"id":28606,"mutability":"mutable","name":"position","nameLocation":"4945:8:279","nodeType":"VariableDeclaration","scope":28610,"src":"4937:16:279","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28605,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4937:7:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":28608,"initialValue":{"id":28607,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28424,"src":"4956:19:279","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"4937:38:279"},{"AST":{"nativeSrc":"4994:42:279","nodeType":"YulBlock","src":"4994:42:279","statements":[{"nativeSrc":"5008:18:279","nodeType":"YulAssignment","src":"5008:18:279","value":{"name":"position","nativeSrc":"5018:8:279","nodeType":"YulIdentifier","src":"5018:8:279"},"variableNames":[{"name":"s.slot","nativeSrc":"5008:6:279","nodeType":"YulIdentifier","src":"5008:6:279"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":28606,"isOffset":false,"isSlot":false,"src":"5018:8:279","valueSize":1},{"declaration":28603,"isOffset":false,"isSlot":true,"src":"5008:6:279","suffix":"slot","valueSize":1}],"id":28609,"nodeType":"InlineAssembly","src":"4985:51:279"}]},"id":28611,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"4877:6:279","nodeType":"FunctionDefinition","parameters":{"id":28600,"nodeType":"ParameterList","parameters":[],"src":"4883:2:279"},"returnParameters":{"id":28604,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28603,"mutability":"mutable","name":"s","nameLocation":"4924:1:279","nodeType":"VariableDeclaration","scope":28611,"src":"4909:16:279","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"},"typeName":{"id":28602,"nodeType":"UserDefinedTypeName","pathNode":{"id":28601,"name":"Layout","nameLocations":["4909:6:279"],"nodeType":"IdentifierPath","referencedDeclaration":28411,"src":"4909:6:279"},"referencedDeclaration":28411,"src":"4909:6:279","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28411_storage_ptr","typeString":"struct ERC20PermitStorage.Layout"}},"visibility":"internal"}],"src":"4908:18:279"},"scope":28612,"src":"4868:174:279","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":28613,"src":"471:4573:279","usedErrors":[],"usedEvents":[]}],"src":"32:5013:279"},"id":279},"contracts/token/ERC20/libraries/ERC20Storage.sol":{"ast":{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","exportedSymbols":{"Address":[38035],"Approval":[27111],"ERC20AllowanceOverflow":[27019],"ERC20ApprovalToAddressZero":[27031],"ERC20BatchMintValuesOverflow":[27064],"ERC20BatchTransferValuesOverflow":[27024],"ERC20InsufficientAllowance":[27042],"ERC20InsufficientBalance":[27056],"ERC20MintToAddressZero":[27061],"ERC20SafeTransferRejected":[27091],"ERC20Storage":[30139],"ERC20TotalSupplyOverflow":[27071],"ERC20TransferToAddressZero":[27047],"IERC20":[27839],"IERC20Allowance":[27863],"IERC20BatchTransfers":[27893],"IERC20Burnable":[27927],"IERC20Mintable":[27981],"IERC20Receiver":[28035],"IERC20SafeTransfers":[28065],"InconsistentArrayLengths":[7886],"InterfaceDetectionStorage":[11680],"ProxyInitialization":[19524],"Transfer":[27102]},"id":30140,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":28614,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:280"},{"absolutePath":"contracts/token/ERC20/errors/ERC20Errors.sol","file":"./../errors/ERC20Errors.sol","id":28619,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27057,"src":"103:171:280","symbolAliases":[{"foreign":{"id":28615,"name":"ERC20ApprovalToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27031,"src":"116:26:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28616,"name":"ERC20InsufficientAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27042,"src":"148:26:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28617,"name":"ERC20TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27047,"src":"180:26:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28618,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"212:24:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol","file":"./../errors/ERC20AllowanceErrors.sol","id":28621,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27020,"src":"275:76:280","symbolAliases":[{"foreign":{"id":28620,"name":"ERC20AllowanceOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27019,"src":"283:22:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol","file":"./../errors/ERC20BatchTransfersErrors.sol","id":28623,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27025,"src":"352:91:280","symbolAliases":[{"foreign":{"id":28622,"name":"ERC20BatchTransferValuesOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27024,"src":"360:32:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol","file":"./../errors/ERC20SafeTransfersErrors.sol","id":28625,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27092,"src":"444:83:280","symbolAliases":[{"foreign":{"id":28624,"name":"ERC20SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27091,"src":"452:25:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/errors/ERC20MintableErrors.sol","file":"./../errors/ERC20MintableErrors.sol","id":28629,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27072,"src":"528:131:280","symbolAliases":[{"foreign":{"id":28626,"name":"ERC20MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27061,"src":"536:22:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28627,"name":"ERC20BatchMintValuesOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27064,"src":"560:28:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28628,"name":"ERC20TotalSupplyOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27071,"src":"590:24:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../../CommonErrors.sol","id":28631,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":7890,"src":"660:69:280","symbolAliases":[{"foreign":{"id":28630,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"668:24:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/events/ERC20Events.sol","file":"./../events/ERC20Events.sol","id":28634,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27112,"src":"730:63:280","symbolAliases":[{"foreign":{"id":28632,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"738:8:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":28633,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27111,"src":"748:8:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20.sol","file":"./../interfaces/IERC20.sol","id":28636,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27840,"src":"794:50:280","symbolAliases":[{"foreign":{"id":28635,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27839,"src":"802:6:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Allowance.sol","file":"./../interfaces/IERC20Allowance.sol","id":28638,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27864,"src":"845:68:280","symbolAliases":[{"foreign":{"id":28637,"name":"IERC20Allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27863,"src":"853:15:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol","file":"./../interfaces/IERC20BatchTransfers.sol","id":28640,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27894,"src":"914:78:280","symbolAliases":[{"foreign":{"id":28639,"name":"IERC20BatchTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27893,"src":"922:20:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol","file":"./../interfaces/IERC20SafeTransfers.sol","id":28642,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":28066,"src":"993:76:280","symbolAliases":[{"foreign":{"id":28641,"name":"IERC20SafeTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28065,"src":"1001:19:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Mintable.sol","file":"./../interfaces/IERC20Mintable.sol","id":28644,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27982,"src":"1070:66:280","symbolAliases":[{"foreign":{"id":28643,"name":"IERC20Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27981,"src":"1078:14:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Burnable.sol","file":"./../interfaces/IERC20Burnable.sol","id":28646,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":27928,"src":"1137:66:280","symbolAliases":[{"foreign":{"id":28645,"name":"IERC20Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27927,"src":"1145:14:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/interfaces/IERC20Receiver.sol","file":"./../interfaces/IERC20Receiver.sol","id":28648,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":28036,"src":"1204:66:280","symbolAliases":[{"foreign":{"id":28647,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"1212:14:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../../utils/libraries/Address.sol","id":28650,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":38036,"src":"1271:63:280","symbolAliases":[{"foreign":{"id":28649,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"1279:7:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../../proxy/libraries/ProxyInitialization.sol","id":28652,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":19525,"src":"1335:87:280","symbolAliases":[{"foreign":{"id":28651,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"1343:19:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":28654,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30140,"sourceUnit":11681,"src":"1423:107:280","symbolAliases":[{"foreign":{"id":28653,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1431:25:280","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC20Storage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":30139,"linearizedBaseContracts":[30139],"name":"ERC20Storage","nameLocation":"1540:12:280","nodeType":"ContractDefinition","nodes":[{"global":false,"id":28657,"libraryName":{"id":28655,"name":"Address","nameLocations":["1565:7:280"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"1565:7:280"},"nodeType":"UsingForDirective","src":"1559:26:280","typeName":{"id":28656,"name":"address","nodeType":"ElementaryTypeName","src":"1577:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":28661,"libraryName":{"id":28658,"name":"ERC20Storage","nameLocations":["1596:12:280"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"1596:12:280"},"nodeType":"UsingForDirective","src":"1590:43:280","typeName":{"id":28660,"nodeType":"UserDefinedTypeName","pathNode":{"id":28659,"name":"ERC20Storage.Layout","nameLocations":["1613:12:280","1626:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"1613:19:280"},"referencedDeclaration":28678,"src":"1613:19:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":28665,"libraryName":{"id":28662,"name":"InterfaceDetectionStorage","nameLocations":["1644:25:280"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1644:25:280"},"nodeType":"UsingForDirective","src":"1638:69:280","typeName":{"id":28664,"nodeType":"UserDefinedTypeName","pathNode":{"id":28663,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1674:25:280","1700:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1674:32:280"},"referencedDeclaration":11590,"src":"1674:32:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ERC20Storage.Layout","id":28678,"members":[{"constant":false,"id":28669,"mutability":"mutable","name":"balances","nameLocation":"1765:8:280","nodeType":"VariableDeclaration","scope":28678,"src":"1737:36:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":28668,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":28666,"name":"address","nodeType":"ElementaryTypeName","src":"1745:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1737:27:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":28667,"name":"uint256","nodeType":"ElementaryTypeName","src":"1756:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"constant":false,"id":28675,"mutability":"mutable","name":"allowances","nameLocation":"1831:10:280","nodeType":"VariableDeclaration","scope":28678,"src":"1783:58:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":28674,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":28670,"name":"address","nodeType":"ElementaryTypeName","src":"1791:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1783:47:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":28673,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":28671,"name":"address","nodeType":"ElementaryTypeName","src":"1810:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1802:27:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":28672,"name":"uint256","nodeType":"ElementaryTypeName","src":"1821:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"internal"},{"constant":false,"id":28677,"mutability":"mutable","name":"supply","nameLocation":"1859:6:280","nodeType":"VariableDeclaration","scope":28678,"src":"1851:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28676,"name":"uint256","nodeType":"ElementaryTypeName","src":"1851:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Layout","nameLocation":"1720:6:280","nodeType":"StructDefinition","scope":30139,"src":"1713:159:280","visibility":"public"},{"constant":true,"id":28691,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"1904:19:280","nodeType":"VariableDeclaration","scope":30139,"src":"1878:121:280","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28679,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1878:7:280","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28689,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e45524332302e73746f72616765","id":28685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1952:40:280","typeDescriptions":{"typeIdentifier":"t_stringliteral_1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef","typeString":"literal_string \"animoca.core.token.ERC20.ERC20.storage\""},"value":"animoca.core.token.ERC20.ERC20.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef","typeString":"literal_string \"animoca.core.token.ERC20.ERC20.storage\""}],"id":28684,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1942:9:280","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28686,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1942:51:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28683,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1934:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28682,"name":"uint256","nodeType":"ElementaryTypeName","src":"1934:7:280","typeDescriptions":{}}},"id":28687,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1934:60:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28688,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1997:1:280","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1934:64:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28681,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1926:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28680,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1926:7:280","typeDescriptions":{}}},"id":28690,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1926:73:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":28704,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"2031:21:280","nodeType":"VariableDeclaration","scope":30139,"src":"2005:121:280","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":28692,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2005:7:280","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28702,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e636f72652e746f6b656e2e45524332302e45524332302e7068617365","id":28698,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2081:38:280","typeDescriptions":{"typeIdentifier":"t_stringliteral_53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d12274991","typeString":"literal_string \"animoca.core.token.ERC20.ERC20.phase\""},"value":"animoca.core.token.ERC20.ERC20.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d12274991","typeString":"literal_string \"animoca.core.token.ERC20.ERC20.phase\""}],"id":28697,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2071:9:280","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":28699,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2071:49:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":28696,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2063:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28695,"name":"uint256","nodeType":"ElementaryTypeName","src":"2063:7:280","typeDescriptions":{}}},"id":28700,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2063:58:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":28701,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2124:1:280","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2063:62:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28694,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2055:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":28693,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2055:7:280","typeDescriptions":{}}},"id":28703,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2055:71:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":28709,"mutability":"constant","name":"ERC20_RECEIVED","nameLocation":"2158:14:280","nodeType":"VariableDeclaration","scope":30139,"src":"2133:81:280","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":28705,"name":"bytes4","nodeType":"ElementaryTypeName","src":"2133:6:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"expression":{"expression":{"id":28706,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"2175:14:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Receiver_$28035_$","typeString":"type(contract IERC20Receiver)"}},"id":28707,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2190:15:280","memberName":"onERC20Received","nodeType":"MemberAccess","referencedDeclaration":28034,"src":"2175:30:280","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC20Receiver.onERC20Received(address,address,uint256,bytes calldata) returns (bytes4)"}},"id":28708,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2206:8:280","memberName":"selector","nodeType":"MemberAccess","src":"2175:39:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"body":{"id":28742,"nodeType":"Block","src":"2339:268:280","statements":[{"assignments":[28717],"declarations":[{"constant":false,"id":28717,"mutability":"mutable","name":"erc165Layout","nameLocation":"2390:12:280","nodeType":"VariableDeclaration","scope":28742,"src":"2349:53:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"},"typeName":{"id":28716,"nodeType":"UserDefinedTypeName","pathNode":{"id":28715,"name":"InterfaceDetectionStorage.Layout","nameLocations":["2349:25:280","2375:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"2349:32:280"},"referencedDeclaration":11590,"src":"2349:32:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}},"visibility":"internal"}],"id":28721,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28718,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2405:25:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28719,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2431:6:280","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2405:32:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2405:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"nodeType":"VariableDeclarationStatement","src":"2349:90:280"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":28726,"name":"IERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27839,"src":"2489:6:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20_$27839_$","typeString":"type(contract IERC20)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20_$27839_$","typeString":"type(contract IERC20)"}],"id":28725,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2484:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2484:12:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20_$27839","typeString":"type(contract IERC20)"}},"id":28728,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2497:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"2484:24:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28729,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2510:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":28722,"name":"erc165Layout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28717,"src":"2449:12:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28724,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2462:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2449:34:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28730,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2449:66:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28731,"nodeType":"ExpressionStatement","src":"2449:66:280"},{"expression":{"arguments":[{"expression":{"arguments":[{"id":28736,"name":"IERC20Allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27863,"src":"2565:15:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Allowance_$27863_$","typeString":"type(contract IERC20Allowance)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Allowance_$27863_$","typeString":"type(contract IERC20Allowance)"}],"id":28735,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2560:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28737,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2560:21:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Allowance_$27863","typeString":"type(contract IERC20Allowance)"}},"id":28738,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2582:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"2560:33:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28739,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2595:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":28732,"name":"erc165Layout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28717,"src":"2525:12:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28734,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2538:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2525:34:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28740,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2525:75:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28741,"nodeType":"ExpressionStatement","src":"2525:75:280"}]},"documentation":{"id":28710,"nodeType":"StructuredDocumentation","src":"2221:88:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"id":28743,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2323:4:280","nodeType":"FunctionDefinition","parameters":{"id":28711,"nodeType":"ParameterList","parameters":[],"src":"2327:2:280"},"returnParameters":{"id":28712,"nodeType":"ParameterList","parameters":[],"src":"2339:0:280"},"scope":30139,"src":"2314:293:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28770,"nodeType":"Block","src":"2814:151:280","statements":[{"expression":{"arguments":[{"id":28756,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28704,"src":"2853:21:280","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":28757,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2876:1:280","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":28753,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2824:19:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":28755,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2844:8:280","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2824:28:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":28758,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2824:54:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28759,"nodeType":"ExpressionStatement","src":"2824:54:280"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":28760,"name":"init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28743,"src":"2888:4:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":28761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2888:6:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28762,"nodeType":"ExpressionStatement","src":"2888:6:280"},{"expression":{"arguments":[{"id":28766,"name":"initialHolders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28747,"src":"2923:14:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},{"id":28767,"name":"initialAllocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28750,"src":"2939:18:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":28763,"name":"layout","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30107,"src":"2904:6:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":28764,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2904:8:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28765,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2913:9:280","memberName":"batchMint","nodeType":"MemberAccess","referencedDeclaration":29811,"src":"2904:18:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":28768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2904:54:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28769,"nodeType":"ExpressionStatement","src":"2904:54:280"}]},"documentation":{"id":28744,"nodeType":"StructuredDocumentation","src":"2613:88:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"id":28771,"implemented":true,"kind":"function","modifiers":[],"name":"initWithAllocations","nameLocation":"2715:19:280","nodeType":"FunctionDefinition","parameters":{"id":28751,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28747,"mutability":"mutable","name":"initialHolders","nameLocation":"2752:14:280","nodeType":"VariableDeclaration","scope":28771,"src":"2735:31:280","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":28745,"name":"address","nodeType":"ElementaryTypeName","src":"2735:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":28746,"nodeType":"ArrayTypeName","src":"2735:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":28750,"mutability":"mutable","name":"initialAllocations","nameLocation":"2785:18:280","nodeType":"VariableDeclaration","scope":28771,"src":"2768:35:280","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":28748,"name":"uint256","nodeType":"ElementaryTypeName","src":"2768:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":28749,"nodeType":"ArrayTypeName","src":"2768:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2734:70:280"},"returnParameters":{"id":28752,"nodeType":"ParameterList","parameters":[],"src":"2814:0:280"},"scope":30139,"src":"2706:259:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28787,"nodeType":"Block","src":"3106:119:280","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28781,"name":"IERC20BatchTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27893,"src":"3178:20:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20BatchTransfers_$27893_$","typeString":"type(contract IERC20BatchTransfers)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20BatchTransfers_$27893_$","typeString":"type(contract IERC20BatchTransfers)"}],"id":28780,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3173:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28782,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3173:26:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20BatchTransfers_$27893","typeString":"type(contract IERC20BatchTransfers)"}},"id":28783,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3200:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"3173:38:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28784,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3213:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28775,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3116:25:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3142:6:280","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3116:32:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28778,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3116:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28779,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3151:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3116:56:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28785,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3116:102:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28786,"nodeType":"ExpressionStatement","src":"3116:102:280"}]},"documentation":{"id":28772,"nodeType":"StructuredDocumentation","src":"2971:86:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."},"id":28788,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20BatchTransfers","nameLocation":"3071:23:280","nodeType":"FunctionDefinition","parameters":{"id":28773,"nodeType":"ParameterList","parameters":[],"src":"3094:2:280"},"returnParameters":{"id":28774,"nodeType":"ParameterList","parameters":[],"src":"3106:0:280"},"scope":30139,"src":"3062:163:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28804,"nodeType":"Block","src":"3364:118:280","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28798,"name":"IERC20SafeTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28065,"src":"3436:19:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20SafeTransfers_$28065_$","typeString":"type(contract IERC20SafeTransfers)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20SafeTransfers_$28065_$","typeString":"type(contract IERC20SafeTransfers)"}],"id":28797,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3431:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28799,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3431:25:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20SafeTransfers_$28065","typeString":"type(contract IERC20SafeTransfers)"}},"id":28800,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3457:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"3431:37:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28801,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3470:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28792,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3374:25:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3400:6:280","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3374:32:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28795,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3374:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28796,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3409:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3374:56:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28802,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3374:101:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28803,"nodeType":"ExpressionStatement","src":"3374:101:280"}]},"documentation":{"id":28789,"nodeType":"StructuredDocumentation","src":"3231:85:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers."},"id":28805,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20SafeTransfers","nameLocation":"3330:22:280","nodeType":"FunctionDefinition","parameters":{"id":28790,"nodeType":"ParameterList","parameters":[],"src":"3352:2:280"},"returnParameters":{"id":28791,"nodeType":"ParameterList","parameters":[],"src":"3364:0:280"},"scope":30139,"src":"3321:161:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28821,"nodeType":"Block","src":"3611:113:280","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28815,"name":"IERC20Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27981,"src":"3683:14:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Mintable_$27981_$","typeString":"type(contract IERC20Mintable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Mintable_$27981_$","typeString":"type(contract IERC20Mintable)"}],"id":28814,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3678:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28816,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3678:20:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Mintable_$27981","typeString":"type(contract IERC20Mintable)"}},"id":28817,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3699:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"3678:32:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3712:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28809,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3621:25:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3647:6:280","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3621:32:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28812,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3621:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28813,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3656:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3621:56:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28819,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3621:96:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28820,"nodeType":"ExpressionStatement","src":"3621:96:280"}]},"documentation":{"id":28806,"nodeType":"StructuredDocumentation","src":"3488:80:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Mintable."},"id":28822,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20Mintable","nameLocation":"3582:17:280","nodeType":"FunctionDefinition","parameters":{"id":28807,"nodeType":"ParameterList","parameters":[],"src":"3599:2:280"},"returnParameters":{"id":28808,"nodeType":"ParameterList","parameters":[],"src":"3611:0:280"},"scope":30139,"src":"3573:151:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28838,"nodeType":"Block","src":"3853:113:280","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":28832,"name":"IERC20Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27927,"src":"3925:14:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Burnable_$27927_$","typeString":"type(contract IERC20Burnable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC20Burnable_$27927_$","typeString":"type(contract IERC20Burnable)"}],"id":28831,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3920:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28833,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3920:20:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC20Burnable_$27927","typeString":"type(contract IERC20Burnable)"}},"id":28834,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3941:11:280","memberName":"interfaceId","nodeType":"MemberAccess","src":"3920:32:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":28835,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3954:4:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":28826,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3863:25:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":28828,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3889:6:280","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3863:32:280","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":28829,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3863:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":28830,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3898:21:280","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3863:56:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":28836,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3863:96:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28837,"nodeType":"ExpressionStatement","src":"3863:96:280"}]},"documentation":{"id":28823,"nodeType":"StructuredDocumentation","src":"3730:80:280","text":"@notice Marks the following ERC165 interface(s) as supported: ERC20Burnable."},"id":28839,"implemented":true,"kind":"function","modifiers":[],"name":"initERC20Burnable","nameLocation":"3824:17:280","nodeType":"FunctionDefinition","parameters":{"id":28824,"nodeType":"ParameterList","parameters":[],"src":"3841:2:280"},"returnParameters":{"id":28825,"nodeType":"ParameterList","parameters":[],"src":"3853:0:280"},"scope":30139,"src":"3815:151:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28879,"nodeType":"Block","src":"4519:176:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":28857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28852,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28847,"src":"4533:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":28855,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4552:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":28854,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4544:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":28853,"name":"address","nodeType":"ElementaryTypeName","src":"4544:7:280","typeDescriptions":{}}},"id":28856,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4544:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4533:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28862,"nodeType":"IfStatement","src":"4529:67:280","trueBody":{"errorCall":{"arguments":[{"id":28859,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28845,"src":"4590:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":28858,"name":"ERC20ApprovalToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27031,"src":"4563:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":28860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4563:33:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28861,"nodeType":"RevertStatement","src":"4556:40:280"}},{"expression":{"id":28871,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":28863,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28843,"src":"4606:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28867,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4608:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"4606:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":28868,"indexExpression":{"id":28865,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28845,"src":"4619:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4606:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28869,"indexExpression":{"id":28866,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28847,"src":"4626:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4606:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28870,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28849,"src":"4637:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4606:36:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":28872,"nodeType":"ExpressionStatement","src":"4606:36:280"},{"eventCall":{"arguments":[{"id":28874,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28845,"src":"4666:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28875,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28847,"src":"4673:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28876,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28849,"src":"4682:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28873,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27111,"src":"4657:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":28877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4657:31:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28878,"nodeType":"EmitStatement","src":"4652:36:280"}]},"documentation":{"id":28840,"nodeType":"StructuredDocumentation","src":"3972:451:280","text":"@notice Sets the allowance to an account by an owner.\n @dev Note: This function implements {ERC20-approve(address,uint256)}.\n @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n @dev Emits an {Approval} event.\n @param owner The account to set the allowance from.\n @param spender The account being granted the allowance by `owner`.\n @param value The allowance amount to grant."},"id":28880,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"4437:7:280","nodeType":"FunctionDefinition","parameters":{"id":28850,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28843,"mutability":"mutable","name":"s","nameLocation":"4460:1:280","nodeType":"VariableDeclaration","scope":28880,"src":"4445:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":28842,"nodeType":"UserDefinedTypeName","pathNode":{"id":28841,"name":"Layout","nameLocations":["4445:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"4445:6:280"},"referencedDeclaration":28678,"src":"4445:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":28845,"mutability":"mutable","name":"owner","nameLocation":"4471:5:280","nodeType":"VariableDeclaration","scope":28880,"src":"4463:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28844,"name":"address","nodeType":"ElementaryTypeName","src":"4463:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28847,"mutability":"mutable","name":"spender","nameLocation":"4486:7:280","nodeType":"VariableDeclaration","scope":28880,"src":"4478:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28846,"name":"address","nodeType":"ElementaryTypeName","src":"4478:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28849,"mutability":"mutable","name":"value","nameLocation":"4503:5:280","nodeType":"VariableDeclaration","scope":28880,"src":"4495:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28848,"name":"uint256","nodeType":"ElementaryTypeName","src":"4495:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4444:65:280"},"returnParameters":{"id":28851,"nodeType":"ParameterList","parameters":[],"src":"4519:0:280"},"scope":30139,"src":"4428:267:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":28956,"nodeType":"Block","src":"5441:581:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":28898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28893,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28888,"src":"5455:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":28896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5474:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":28895,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5466:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":28894,"name":"address","nodeType":"ElementaryTypeName","src":"5466:7:280","typeDescriptions":{}}},"id":28897,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5466:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5455:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28903,"nodeType":"IfStatement","src":"5451:67:280","trueBody":{"errorCall":{"arguments":[{"id":28900,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28886,"src":"5512:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":28899,"name":"ERC20ApprovalToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27031,"src":"5485:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":28901,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5485:33:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28902,"nodeType":"RevertStatement","src":"5478:40:280"}},{"assignments":[28905],"declarations":[{"constant":false,"id":28905,"mutability":"mutable","name":"currentAllowance","nameLocation":"5536:16:280","nodeType":"VariableDeclaration","scope":28956,"src":"5528:24:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28904,"name":"uint256","nodeType":"ElementaryTypeName","src":"5528:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":28912,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":28906,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28884,"src":"5555:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28907,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5557:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"5555:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":28909,"indexExpression":{"id":28908,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28886,"src":"5568:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5555:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28911,"indexExpression":{"id":28910,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28888,"src":"5575:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5555:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5528:55:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28915,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28913,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28890,"src":"5597:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":28914,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5606:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5597:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28949,"nodeType":"IfStatement","src":"5593:366:280","trueBody":{"id":28948,"nodeType":"Block","src":"5609:350:280","statements":[{"id":28947,"nodeType":"UncheckedBlock","src":"5623:326:280","statements":[{"assignments":[28917],"declarations":[{"constant":false,"id":28917,"mutability":"mutable","name":"newAllowance","nameLocation":"5659:12:280","nodeType":"VariableDeclaration","scope":28947,"src":"5651:20:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28916,"name":"uint256","nodeType":"ElementaryTypeName","src":"5651:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":28921,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28918,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28905,"src":"5674:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":28919,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28890,"src":"5693:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5674:24:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5651:47:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28924,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28922,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28917,"src":"5720:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":28923,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28905,"src":"5736:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5720:32:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28932,"nodeType":"IfStatement","src":"5716:108:280","trueBody":{"errorCall":{"arguments":[{"id":28926,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28886,"src":"5784:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28927,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28888,"src":"5791:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28928,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28905,"src":"5800:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":28929,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28890,"src":"5818:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28925,"name":"ERC20AllowanceOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27019,"src":"5761:22:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256,uint256) pure returns (error)"}},"id":28930,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5761:63:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28931,"nodeType":"RevertStatement","src":"5754:70:280"}},{"expression":{"id":28941,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":28933,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28884,"src":"5842:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28937,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5844:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"5842:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":28938,"indexExpression":{"id":28935,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28886,"src":"5855:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5842:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28939,"indexExpression":{"id":28936,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28888,"src":"5862:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5842:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28940,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28917,"src":"5873:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5842:43:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":28942,"nodeType":"ExpressionStatement","src":"5842:43:280"},{"expression":{"id":28945,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":28943,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28905,"src":"5903:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":28944,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28917,"src":"5922:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5903:31:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":28946,"nodeType":"ExpressionStatement","src":"5903:31:280"}]}]}},{"eventCall":{"arguments":[{"id":28951,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28886,"src":"5982:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28952,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28888,"src":"5989:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":28953,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28905,"src":"5998:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":28950,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27111,"src":"5973:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":28954,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5973:42:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":28955,"nodeType":"EmitStatement","src":"5968:47:280"}]},"documentation":{"id":28881,"nodeType":"StructuredDocumentation","src":"4701:634:280","text":"@notice Increases the allowance granted to an account by an owner.\n @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\n @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\n @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\n @param owner The account increasing the allowance.\n @param spender The account whose allowance is being increased.\n @param value The allowance amount increase."},"id":28957,"implemented":true,"kind":"function","modifiers":[],"name":"increaseAllowance","nameLocation":"5349:17:280","nodeType":"FunctionDefinition","parameters":{"id":28891,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28884,"mutability":"mutable","name":"s","nameLocation":"5382:1:280","nodeType":"VariableDeclaration","scope":28957,"src":"5367:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":28883,"nodeType":"UserDefinedTypeName","pathNode":{"id":28882,"name":"Layout","nameLocations":["5367:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"5367:6:280"},"referencedDeclaration":28678,"src":"5367:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":28886,"mutability":"mutable","name":"owner","nameLocation":"5393:5:280","nodeType":"VariableDeclaration","scope":28957,"src":"5385:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28885,"name":"address","nodeType":"ElementaryTypeName","src":"5385:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28888,"mutability":"mutable","name":"spender","nameLocation":"5408:7:280","nodeType":"VariableDeclaration","scope":28957,"src":"5400:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28887,"name":"address","nodeType":"ElementaryTypeName","src":"5400:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28890,"mutability":"mutable","name":"value","nameLocation":"5425:5:280","nodeType":"VariableDeclaration","scope":28957,"src":"5417:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28889,"name":"uint256","nodeType":"ElementaryTypeName","src":"5417:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5366:65:280"},"returnParameters":{"id":28892,"nodeType":"ParameterList","parameters":[],"src":"5441:0:280"},"scope":30139,"src":"5340:682:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29041,"nodeType":"Block","src":"6794:750:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":28975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28970,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28965,"src":"6808:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":28973,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6827:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":28972,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6819:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":28971,"name":"address","nodeType":"ElementaryTypeName","src":"6819:7:280","typeDescriptions":{}}},"id":28974,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6819:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6808:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":28980,"nodeType":"IfStatement","src":"6804:67:280","trueBody":{"errorCall":{"arguments":[{"id":28977,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28963,"src":"6865:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":28976,"name":"ERC20ApprovalToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27031,"src":"6838:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":28978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6838:33:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":28979,"nodeType":"RevertStatement","src":"6831:40:280"}},{"assignments":[28982],"declarations":[{"constant":false,"id":28982,"mutability":"mutable","name":"currentAllowance","nameLocation":"6889:16:280","nodeType":"VariableDeclaration","scope":29041,"src":"6881:24:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28981,"name":"uint256","nodeType":"ElementaryTypeName","src":"6881:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":28989,"initialValue":{"baseExpression":{"baseExpression":{"expression":{"id":28983,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28961,"src":"6908:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":28984,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6910:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"6908:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":28986,"indexExpression":{"id":28985,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28963,"src":"6921:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6908:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":28988,"indexExpression":{"id":28987,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28965,"src":"6928:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6908:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6881:55:280"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":29000,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28996,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28990,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"6951:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":28993,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6976:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":28992,"name":"uint256","nodeType":"ElementaryTypeName","src":"6976:7:280","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":28991,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"6971:4:280","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":28994,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6971:13:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":28995,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6985:3:280","memberName":"max","nodeType":"MemberAccess","src":"6971:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6951:37:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":28999,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":28997,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28967,"src":"6992:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":28998,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7001:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6992:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6951:51:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29034,"nodeType":"IfStatement","src":"6947:534:280","trueBody":{"id":29033,"nodeType":"Block","src":"7004:477:280","statements":[{"id":29032,"nodeType":"UncheckedBlock","src":"7018:453:280","statements":[{"assignments":[29002],"declarations":[{"constant":false,"id":29002,"mutability":"mutable","name":"newAllowance","nameLocation":"7177:12:280","nodeType":"VariableDeclaration","scope":29032,"src":"7169:20:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29001,"name":"uint256","nodeType":"ElementaryTypeName","src":"7169:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29006,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29003,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"7192:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29004,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28967,"src":"7211:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7192:24:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7169:47:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29009,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29007,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29002,"src":"7238:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29008,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"7254:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7238:32:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29017,"nodeType":"IfStatement","src":"7234:112:280","trueBody":{"errorCall":{"arguments":[{"id":29011,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28963,"src":"7306:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29012,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28965,"src":"7313:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29013,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"7322:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29014,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28967,"src":"7340:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29010,"name":"ERC20InsufficientAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27042,"src":"7279:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256,uint256) pure returns (error)"}},"id":29015,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7279:67:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29016,"nodeType":"RevertStatement","src":"7272:74:280"}},{"expression":{"id":29026,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":29018,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28961,"src":"7364:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29022,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7366:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"7364:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":29023,"indexExpression":{"id":29020,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28963,"src":"7377:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7364:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29024,"indexExpression":{"id":29021,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28965,"src":"7384:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7364:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29025,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29002,"src":"7395:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7364:43:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29027,"nodeType":"ExpressionStatement","src":"7364:43:280"},{"expression":{"id":29030,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29028,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"7425:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29029,"name":"newAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29002,"src":"7444:12:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7425:31:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29031,"nodeType":"ExpressionStatement","src":"7425:31:280"}]}]}},{"eventCall":{"arguments":[{"id":29036,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28963,"src":"7504:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29037,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28965,"src":"7511:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29038,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28982,"src":"7520:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29035,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27111,"src":"7495:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29039,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7495:42:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29040,"nodeType":"EmitStatement","src":"7490:47:280"}]},"documentation":{"id":28958,"nodeType":"StructuredDocumentation","src":"6028:660:280","text":"@notice Decreases the allowance granted to an account by an owner.\n @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\n @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\n @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\n @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\n @param owner The account decreasing the allowance.\n @param spender The account whose allowance is being decreased.\n @param value The allowance amount decrease."},"id":29042,"implemented":true,"kind":"function","modifiers":[],"name":"decreaseAllowance","nameLocation":"6702:17:280","nodeType":"FunctionDefinition","parameters":{"id":28968,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28961,"mutability":"mutable","name":"s","nameLocation":"6735:1:280","nodeType":"VariableDeclaration","scope":29042,"src":"6720:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":28960,"nodeType":"UserDefinedTypeName","pathNode":{"id":28959,"name":"Layout","nameLocations":["6720:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"6720:6:280"},"referencedDeclaration":28678,"src":"6720:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":28963,"mutability":"mutable","name":"owner","nameLocation":"6746:5:280","nodeType":"VariableDeclaration","scope":29042,"src":"6738:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28962,"name":"address","nodeType":"ElementaryTypeName","src":"6738:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28965,"mutability":"mutable","name":"spender","nameLocation":"6761:7:280","nodeType":"VariableDeclaration","scope":29042,"src":"6753:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28964,"name":"address","nodeType":"ElementaryTypeName","src":"6753:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":28967,"mutability":"mutable","name":"value","nameLocation":"6778:5:280","nodeType":"VariableDeclaration","scope":29042,"src":"6770:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":28966,"name":"uint256","nodeType":"ElementaryTypeName","src":"6770:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6719:65:280"},"returnParameters":{"id":28969,"nodeType":"ParameterList","parameters":[],"src":"6794:0:280"},"scope":30139,"src":"6693:851:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29122,"nodeType":"Block","src":"8191:542:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29055,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29050,"src":"8205:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":29058,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8219:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29057,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8211:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29056,"name":"address","nodeType":"ElementaryTypeName","src":"8211:7:280","typeDescriptions":{}}},"id":29059,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8211:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8205:16:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29065,"nodeType":"IfStatement","src":"8201:61:280","trueBody":{"errorCall":{"arguments":[{"id":29062,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8257:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":29061,"name":"ERC20TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27047,"src":"8230:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":29063,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8230:32:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29064,"nodeType":"RevertStatement","src":"8223:39:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29068,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29066,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29052,"src":"8277:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29067,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8286:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8277:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29115,"nodeType":"IfStatement","src":"8273:413:280","trueBody":{"id":29114,"nodeType":"Block","src":"8289:397:280","statements":[{"assignments":[29070],"declarations":[{"constant":false,"id":29070,"mutability":"mutable","name":"balance","nameLocation":"8311:7:280","nodeType":"VariableDeclaration","scope":29114,"src":"8303:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29069,"name":"uint256","nodeType":"ElementaryTypeName","src":"8303:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29075,"initialValue":{"baseExpression":{"expression":{"id":29071,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29046,"src":"8321:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29072,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8323:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"8321:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29074,"indexExpression":{"id":29073,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8332:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8321:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8303:34:280"},{"id":29113,"nodeType":"UncheckedBlock","src":"8351:325:280","statements":[{"assignments":[29077],"declarations":[{"constant":false,"id":29077,"mutability":"mutable","name":"newBalance","nameLocation":"8387:10:280","nodeType":"VariableDeclaration","scope":29113,"src":"8379:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29076,"name":"uint256","nodeType":"ElementaryTypeName","src":"8379:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29081,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29080,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29078,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29070,"src":"8400:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29079,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29052,"src":"8410:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8400:15:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8379:36:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29084,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29082,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29077,"src":"8437:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29083,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29070,"src":"8451:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8437:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29091,"nodeType":"IfStatement","src":"8433:80:280","trueBody":{"errorCall":{"arguments":[{"id":29086,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8492:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29087,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29070,"src":"8498:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29088,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29052,"src":"8507:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29085,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"8467:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29089,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8467:46:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29090,"nodeType":"RevertStatement","src":"8460:53:280"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29094,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29092,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8535:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29093,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29050,"src":"8543:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8535:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29112,"nodeType":"IfStatement","src":"8531:131:280","trueBody":{"id":29111,"nodeType":"Block","src":"8547:115:280","statements":[{"expression":{"id":29101,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29095,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29046,"src":"8569:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29098,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8571:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"8569:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29099,"indexExpression":{"id":29097,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8580:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8569:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29100,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29077,"src":"8588:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8569:29:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29102,"nodeType":"ExpressionStatement","src":"8569:29:280"},{"expression":{"id":29109,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29103,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29046,"src":"8620:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29106,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8622:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"8620:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29107,"indexExpression":{"id":29105,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29050,"src":"8631:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8620:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29108,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29052,"src":"8638:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8620:23:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29110,"nodeType":"ExpressionStatement","src":"8620:23:280"}]}}]}]}},{"eventCall":{"arguments":[{"id":29117,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29048,"src":"8710:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29118,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29050,"src":"8716:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29119,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29052,"src":"8720:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29116,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"8701:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29120,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8701:25:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29121,"nodeType":"EmitStatement","src":"8696:30:280"}]},"documentation":{"id":29043,"nodeType":"StructuredDocumentation","src":"7550:550:280","text":"@notice Transfers an amount of tokens from an account to a recipient.\n @dev Note: This function implements {ERC20-transfer(address,uint256)}.\n @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Emits a {Transfer} event.\n @param from The account transferring the tokens.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer."},"id":29123,"implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"8114:8:280","nodeType":"FunctionDefinition","parameters":{"id":29053,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29046,"mutability":"mutable","name":"s","nameLocation":"8138:1:280","nodeType":"VariableDeclaration","scope":29123,"src":"8123:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29045,"nodeType":"UserDefinedTypeName","pathNode":{"id":29044,"name":"Layout","nameLocations":["8123:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"8123:6:280"},"referencedDeclaration":28678,"src":"8123:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29048,"mutability":"mutable","name":"from","nameLocation":"8149:4:280","nodeType":"VariableDeclaration","scope":29123,"src":"8141:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29047,"name":"address","nodeType":"ElementaryTypeName","src":"8141:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29050,"mutability":"mutable","name":"to","nameLocation":"8163:2:280","nodeType":"VariableDeclaration","scope":29123,"src":"8155:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29049,"name":"address","nodeType":"ElementaryTypeName","src":"8155:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29052,"mutability":"mutable","name":"value","nameLocation":"8175:5:280","nodeType":"VariableDeclaration","scope":29123,"src":"8167:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29051,"name":"uint256","nodeType":"ElementaryTypeName","src":"8167:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8122:59:280"},"returnParameters":{"id":29054,"nodeType":"ParameterList","parameters":[],"src":"8191:0:280"},"scope":30139,"src":"8105:628:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29159,"nodeType":"Block","src":"9693:138:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29138,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29131,"src":"9707:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29139,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29129,"src":"9715:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9707:14:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29150,"nodeType":"IfStatement","src":"9703:85:280","trueBody":{"id":29149,"nodeType":"Block","src":"9723:65:280","statements":[{"expression":{"arguments":[{"id":29144,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29131,"src":"9757:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29145,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29129,"src":"9763:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29146,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29135,"src":"9771:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29141,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29127,"src":"9737:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29143,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9739:17:280","memberName":"decreaseAllowance","nodeType":"MemberAccess","referencedDeclaration":29042,"src":"9737:19:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29147,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9737:40:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29148,"nodeType":"ExpressionStatement","src":"9737:40:280"}]}},{"expression":{"arguments":[{"id":29154,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29131,"src":"9808:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29155,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29133,"src":"9814:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29156,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29135,"src":"9818:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29151,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29127,"src":"9797:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29153,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9799:8:280","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":29123,"src":"9797:10:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9797:27:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29158,"nodeType":"ExpressionStatement","src":"9797:27:280"}]},"documentation":{"id":29124,"nodeType":"StructuredDocumentation","src":"8739:843:280","text":"@notice Transfers an amount of tokens from an account to a recipient by a sender.\n @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\n @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n @dev Emits a {Transfer} event.\n @dev Optionally emits an {Approval} event if `sender` is not `from`.\n @param sender The message sender.\n @param from The account which owns the tokens to transfer.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer."},"id":29160,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"9596:12:280","nodeType":"FunctionDefinition","parameters":{"id":29136,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29127,"mutability":"mutable","name":"s","nameLocation":"9624:1:280","nodeType":"VariableDeclaration","scope":29160,"src":"9609:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29126,"nodeType":"UserDefinedTypeName","pathNode":{"id":29125,"name":"Layout","nameLocations":["9609:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"9609:6:280"},"referencedDeclaration":28678,"src":"9609:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29129,"mutability":"mutable","name":"sender","nameLocation":"9635:6:280","nodeType":"VariableDeclaration","scope":29160,"src":"9627:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29128,"name":"address","nodeType":"ElementaryTypeName","src":"9627:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29131,"mutability":"mutable","name":"from","nameLocation":"9651:4:280","nodeType":"VariableDeclaration","scope":29160,"src":"9643:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29130,"name":"address","nodeType":"ElementaryTypeName","src":"9643:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29133,"mutability":"mutable","name":"to","nameLocation":"9665:2:280","nodeType":"VariableDeclaration","scope":29160,"src":"9657:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29132,"name":"address","nodeType":"ElementaryTypeName","src":"9657:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29135,"mutability":"mutable","name":"value","nameLocation":"9677:5:280","nodeType":"VariableDeclaration","scope":29160,"src":"9669:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29134,"name":"uint256","nodeType":"ElementaryTypeName","src":"9669:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9608:75:280"},"returnParameters":{"id":29137,"nodeType":"ParameterList","parameters":[],"src":"9693:0:280"},"scope":30139,"src":"9587:244:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29333,"nodeType":"Block","src":"10975:1674:280","statements":[{"assignments":[29176],"declarations":[{"constant":false,"id":29176,"mutability":"mutable","name":"length","nameLocation":"10993:6:280","nodeType":"VariableDeclaration","scope":29333,"src":"10985:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29175,"name":"uint256","nodeType":"ElementaryTypeName","src":"10985:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29179,"initialValue":{"expression":{"id":29177,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29169,"src":"11002:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29178,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11013:6:280","memberName":"length","nodeType":"MemberAccess","src":"11002:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10985:34:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29183,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29180,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29176,"src":"11033:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":29181,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29172,"src":"11043:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29182,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11050:6:280","memberName":"length","nodeType":"MemberAccess","src":"11043:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11033:23:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29187,"nodeType":"IfStatement","src":"11029:62:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29184,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"11065:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11065:26:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29186,"nodeType":"RevertStatement","src":"11058:33:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29188,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29176,"src":"11106:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":29189,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11116:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11106:11:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29192,"nodeType":"IfStatement","src":"11102:24:280","trueBody":{"functionReturnParameters":29174,"id":29191,"nodeType":"Return","src":"11119:7:280"}},{"assignments":[29194],"declarations":[{"constant":false,"id":29194,"mutability":"mutable","name":"balance","nameLocation":"11144:7:280","nodeType":"VariableDeclaration","scope":29333,"src":"11136:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29193,"name":"uint256","nodeType":"ElementaryTypeName","src":"11136:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29199,"initialValue":{"baseExpression":{"expression":{"id":29195,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29164,"src":"11154:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29196,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11156:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"11154:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29198,"indexExpression":{"id":29197,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"11165:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11154:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11136:34:280"},{"assignments":[29201],"declarations":[{"constant":false,"id":29201,"mutability":"mutable","name":"totalValue","nameLocation":"11189:10:280","nodeType":"VariableDeclaration","scope":29333,"src":"11181:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29200,"name":"uint256","nodeType":"ElementaryTypeName","src":"11181:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29202,"nodeType":"VariableDeclarationStatement","src":"11181:18:280"},{"assignments":[29204],"declarations":[{"constant":false,"id":29204,"mutability":"mutable","name":"selfTransferTotalValue","nameLocation":"11217:22:280","nodeType":"VariableDeclaration","scope":29333,"src":"11209:30:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29203,"name":"uint256","nodeType":"ElementaryTypeName","src":"11209:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29205,"nodeType":"VariableDeclarationStatement","src":"11209:30:280"},{"body":{"id":29295,"nodeType":"Block","src":"11282:879:280","statements":[{"assignments":[29216],"declarations":[{"constant":false,"id":29216,"mutability":"mutable","name":"to","nameLocation":"11304:2:280","nodeType":"VariableDeclaration","scope":29295,"src":"11296:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29215,"name":"address","nodeType":"ElementaryTypeName","src":"11296:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":29220,"initialValue":{"baseExpression":{"id":29217,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29169,"src":"11309:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29219,"indexExpression":{"id":29218,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29207,"src":"11320:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11309:13:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"11296:26:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29226,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29221,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29216,"src":"11340:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":29224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11354:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29223,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"11346:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29222,"name":"address","nodeType":"ElementaryTypeName","src":"11346:7:280","typeDescriptions":{}}},"id":29225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11346:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11340:16:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29231,"nodeType":"IfStatement","src":"11336:61:280","trueBody":{"errorCall":{"arguments":[{"id":29228,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"11392:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":29227,"name":"ERC20TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27047,"src":"11365:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":29229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11365:32:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29230,"nodeType":"RevertStatement","src":"11358:39:280"}},{"assignments":[29233],"declarations":[{"constant":false,"id":29233,"mutability":"mutable","name":"value","nameLocation":"11420:5:280","nodeType":"VariableDeclaration","scope":29295,"src":"11412:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29232,"name":"uint256","nodeType":"ElementaryTypeName","src":"11412:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29237,"initialValue":{"baseExpression":{"id":29234,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29172,"src":"11428:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29236,"indexExpression":{"id":29235,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29207,"src":"11435:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"11428:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11412:25:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29240,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29238,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11455:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29239,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11464:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11455:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29288,"nodeType":"IfStatement","src":"11451:656:280","trueBody":{"id":29287,"nodeType":"Block","src":"11467:640:280","statements":[{"id":29286,"nodeType":"UncheckedBlock","src":"11485:608:280","statements":[{"assignments":[29242],"declarations":[{"constant":false,"id":29242,"mutability":"mutable","name":"newTotalValue","nameLocation":"11525:13:280","nodeType":"VariableDeclaration","scope":29286,"src":"11517:21:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29241,"name":"uint256","nodeType":"ElementaryTypeName","src":"11517:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29246,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29243,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"11541:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29244,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11554:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11541:18:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"11517:42:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29247,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29242,"src":"11585:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":29248,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"11602:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11585:27:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29253,"nodeType":"IfStatement","src":"11581:74:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29250,"name":"ERC20BatchTransferValuesOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27024,"src":"11621:32:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29251,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11621:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29252,"nodeType":"RevertStatement","src":"11614:41:280"}},{"expression":{"id":29256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29254,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"11677:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29255,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29242,"src":"11690:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11677:26:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29257,"nodeType":"ExpressionStatement","src":"11677:26:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29258,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"11729:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29259,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29216,"src":"11737:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"11729:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":29284,"nodeType":"Block","src":"11819:256:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29272,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29270,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11849:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":29271,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29194,"src":"11857:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11849:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29279,"nodeType":"IfStatement","src":"11845:74:280","trueBody":{"errorCall":{"arguments":[{"id":29274,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"11898:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29275,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29194,"src":"11904:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29276,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11913:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29273,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"11873:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29277,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11873:46:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29278,"nodeType":"RevertStatement","src":"11866:53:280"}},{"expression":{"id":29282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29280,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29204,"src":"11945:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29281,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11971:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11945:31:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29283,"nodeType":"ExpressionStatement","src":"11945:31:280"}]},"id":29285,"nodeType":"IfStatement","src":"11725:350:280","trueBody":{"id":29269,"nodeType":"Block","src":"11741:72:280","statements":[{"expression":{"id":29267,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29261,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29164,"src":"11767:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29264,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11769:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"11767:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29265,"indexExpression":{"id":29263,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29216,"src":"11778:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"11767:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29266,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"11785:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11767:23:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29268,"nodeType":"ExpressionStatement","src":"11767:23:280"}]}}]}]}},{"eventCall":{"arguments":[{"id":29290,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"12134:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29291,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29216,"src":"12140:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29292,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29233,"src":"12144:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29289,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"12125:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12125:25:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29294,"nodeType":"EmitStatement","src":"12120:30:280"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29211,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29209,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29207,"src":"11265:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":29210,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29176,"src":"11269:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11265:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29296,"initializationExpression":{"assignments":[29207],"declarations":[{"constant":false,"id":29207,"mutability":"mutable","name":"i","nameLocation":"11262:1:280","nodeType":"VariableDeclaration","scope":29296,"src":"11254:9:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29206,"name":"uint256","nodeType":"ElementaryTypeName","src":"11254:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29208,"nodeType":"VariableDeclarationStatement","src":"11254:9:280"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":29213,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"11277:3:280","subExpression":{"id":29212,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29207,"src":"11279:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29214,"nodeType":"ExpressionStatement","src":"11277:3:280"},"nodeType":"ForStatement","src":"11249:912:280"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":29303,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29297,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"12175:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12189:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"12175:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29300,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"12194:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29301,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29204,"src":"12208:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12194:36:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12175:55:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29332,"nodeType":"IfStatement","src":"12171:472:280","trueBody":{"id":29331,"nodeType":"Block","src":"12232:411:280","statements":[{"id":29330,"nodeType":"UncheckedBlock","src":"12246:387:280","statements":[{"assignments":[29305],"declarations":[{"constant":false,"id":29305,"mutability":"mutable","name":"newBalance","nameLocation":"12282:10:280","nodeType":"VariableDeclaration","scope":29330,"src":"12274:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29304,"name":"uint256","nodeType":"ElementaryTypeName","src":"12274:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29309,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29308,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29306,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29194,"src":"12295:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29307,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"12305:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12295:20:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12274:41:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29312,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29310,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29305,"src":"12409:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29311,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29194,"src":"12423:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12409:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29319,"nodeType":"IfStatement","src":"12405:85:280","trueBody":{"errorCall":{"arguments":[{"id":29314,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"12464:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29315,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29194,"src":"12470:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29316,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29201,"src":"12479:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29313,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"12439:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29317,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12439:51:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29318,"nodeType":"RevertStatement","src":"12432:58:280"}},{"expression":{"id":29328,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29320,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29164,"src":"12508:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29323,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12510:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"12508:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29324,"indexExpression":{"id":29322,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29166,"src":"12519:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"12508:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29327,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29325,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29305,"src":"12527:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29326,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29204,"src":"12540:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12527:35:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12508:54:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29329,"nodeType":"ExpressionStatement","src":"12508:54:280"}]}]}}]},"documentation":{"id":29161,"nodeType":"StructuredDocumentation","src":"9963:885:280","text":"@notice Transfers multiple amounts of tokens from an account to multiple recipients.\n @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\n @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\n @dev Emits a {Transfer} event for each transfer.\n @param from The account transferring the tokens.\n @param recipients The list of accounts to transfer the tokens to.\n @param values The list of amounts of tokens to transfer to each of `recipients`."},"id":29334,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransfer","nameLocation":"10862:13:280","nodeType":"FunctionDefinition","parameters":{"id":29173,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29164,"mutability":"mutable","name":"s","nameLocation":"10891:1:280","nodeType":"VariableDeclaration","scope":29334,"src":"10876:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29163,"nodeType":"UserDefinedTypeName","pathNode":{"id":29162,"name":"Layout","nameLocations":["10876:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"10876:6:280"},"referencedDeclaration":28678,"src":"10876:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29166,"mutability":"mutable","name":"from","nameLocation":"10902:4:280","nodeType":"VariableDeclaration","scope":29334,"src":"10894:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29165,"name":"address","nodeType":"ElementaryTypeName","src":"10894:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29169,"mutability":"mutable","name":"recipients","nameLocation":"10927:10:280","nodeType":"VariableDeclaration","scope":29334,"src":"10908:29:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":29167,"name":"address","nodeType":"ElementaryTypeName","src":"10908:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29168,"nodeType":"ArrayTypeName","src":"10908:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":29172,"mutability":"mutable","name":"values","nameLocation":"10958:6:280","nodeType":"VariableDeclaration","scope":29334,"src":"10939:25:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":29170,"name":"uint256","nodeType":"ElementaryTypeName","src":"10939:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29171,"nodeType":"ArrayTypeName","src":"10939:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"10875:90:280"},"returnParameters":{"id":29174,"nodeType":"ParameterList","parameters":[],"src":"10975:0:280"},"scope":30139,"src":"10853:1796:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29522,"nodeType":"Block","src":"13991:1808:280","statements":[{"assignments":[29352],"declarations":[{"constant":false,"id":29352,"mutability":"mutable","name":"length","nameLocation":"14009:6:280","nodeType":"VariableDeclaration","scope":29522,"src":"14001:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29351,"name":"uint256","nodeType":"ElementaryTypeName","src":"14001:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29355,"initialValue":{"expression":{"id":29353,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29345,"src":"14018:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14029:6:280","memberName":"length","nodeType":"MemberAccess","src":"14018:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"14001:34:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29359,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29356,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29352,"src":"14049:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":29357,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29348,"src":"14059:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29358,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"14066:6:280","memberName":"length","nodeType":"MemberAccess","src":"14059:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14049:23:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29363,"nodeType":"IfStatement","src":"14045:62:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29360,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"14081:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29361,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14081:26:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29362,"nodeType":"RevertStatement","src":"14074:33:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29366,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29364,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29352,"src":"14122:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":29365,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14132:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14122:11:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29368,"nodeType":"IfStatement","src":"14118:24:280","trueBody":{"functionReturnParameters":29350,"id":29367,"nodeType":"Return","src":"14135:7:280"}},{"assignments":[29370],"declarations":[{"constant":false,"id":29370,"mutability":"mutable","name":"balance","nameLocation":"14160:7:280","nodeType":"VariableDeclaration","scope":29522,"src":"14152:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29369,"name":"uint256","nodeType":"ElementaryTypeName","src":"14152:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29375,"initialValue":{"baseExpression":{"expression":{"id":29371,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29338,"src":"14170:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29372,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14172:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"14170:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29374,"indexExpression":{"id":29373,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"14181:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14170:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"14152:34:280"},{"assignments":[29377],"declarations":[{"constant":false,"id":29377,"mutability":"mutable","name":"totalValue","nameLocation":"14205:10:280","nodeType":"VariableDeclaration","scope":29522,"src":"14197:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29376,"name":"uint256","nodeType":"ElementaryTypeName","src":"14197:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29378,"nodeType":"VariableDeclarationStatement","src":"14197:18:280"},{"assignments":[29380],"declarations":[{"constant":false,"id":29380,"mutability":"mutable","name":"selfTransferTotalValue","nameLocation":"14233:22:280","nodeType":"VariableDeclaration","scope":29522,"src":"14225:30:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29379,"name":"uint256","nodeType":"ElementaryTypeName","src":"14225:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29381,"nodeType":"VariableDeclarationStatement","src":"14225:30:280"},{"body":{"id":29507,"nodeType":"Block","src":"14298:1395:280","statements":[{"assignments":[29392],"declarations":[{"constant":false,"id":29392,"mutability":"mutable","name":"to","nameLocation":"14320:2:280","nodeType":"VariableDeclaration","scope":29507,"src":"14312:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29391,"name":"address","nodeType":"ElementaryTypeName","src":"14312:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":29396,"initialValue":{"baseExpression":{"id":29393,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29345,"src":"14325:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29395,"indexExpression":{"id":29394,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29383,"src":"14336:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14325:13:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"14312:26:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29402,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29397,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29392,"src":"14356:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":29400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14370:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29399,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14362:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29398,"name":"address","nodeType":"ElementaryTypeName","src":"14362:7:280","typeDescriptions":{}}},"id":29401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14362:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14356:16:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29407,"nodeType":"IfStatement","src":"14352:61:280","trueBody":{"errorCall":{"arguments":[{"id":29404,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"14408:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":29403,"name":"ERC20TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27047,"src":"14381:26:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":29405,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14381:32:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29406,"nodeType":"RevertStatement","src":"14374:39:280"}},{"assignments":[29409],"declarations":[{"constant":false,"id":29409,"mutability":"mutable","name":"value","nameLocation":"14436:5:280","nodeType":"VariableDeclaration","scope":29507,"src":"14428:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29408,"name":"uint256","nodeType":"ElementaryTypeName","src":"14428:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29413,"initialValue":{"baseExpression":{"id":29410,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29348,"src":"14444:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29412,"indexExpression":{"id":29411,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29383,"src":"14451:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14444:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"14428:25:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29416,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29414,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14472:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29415,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14481:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"14472:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29464,"nodeType":"IfStatement","src":"14468:656:280","trueBody":{"id":29463,"nodeType":"Block","src":"14484:640:280","statements":[{"id":29462,"nodeType":"UncheckedBlock","src":"14502:608:280","statements":[{"assignments":[29418],"declarations":[{"constant":false,"id":29418,"mutability":"mutable","name":"newTotalValue","nameLocation":"14542:13:280","nodeType":"VariableDeclaration","scope":29462,"src":"14534:21:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29417,"name":"uint256","nodeType":"ElementaryTypeName","src":"14534:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29422,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29419,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"14558:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29420,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14571:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14558:18:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"14534:42:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29425,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29423,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29418,"src":"14602:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":29424,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"14619:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14602:27:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29429,"nodeType":"IfStatement","src":"14598:74:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29426,"name":"ERC20BatchTransferValuesOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27024,"src":"14638:32:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14638:34:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29428,"nodeType":"RevertStatement","src":"14631:41:280"}},{"expression":{"id":29432,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29430,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"14694:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29431,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29418,"src":"14707:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14694:26:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29433,"nodeType":"ExpressionStatement","src":"14694:26:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29434,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"14746:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29435,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29392,"src":"14754:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14746:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":29460,"nodeType":"Block","src":"14836:256:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29448,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29446,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14866:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":29447,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29370,"src":"14874:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14866:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29455,"nodeType":"IfStatement","src":"14862:74:280","trueBody":{"errorCall":{"arguments":[{"id":29450,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"14915:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29451,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29370,"src":"14921:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29452,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14930:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29449,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"14890:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29453,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14890:46:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29454,"nodeType":"RevertStatement","src":"14883:53:280"}},{"expression":{"id":29458,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29456,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29380,"src":"14962:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29457,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14988:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14962:31:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29459,"nodeType":"ExpressionStatement","src":"14962:31:280"}]},"id":29461,"nodeType":"IfStatement","src":"14742:350:280","trueBody":{"id":29445,"nodeType":"Block","src":"14758:72:280","statements":[{"expression":{"id":29443,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29437,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29338,"src":"14784:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29440,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14786:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"14784:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29441,"indexExpression":{"id":29439,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29392,"src":"14795:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"14784:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29442,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"14802:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14784:23:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29444,"nodeType":"ExpressionStatement","src":"14784:23:280"}]}}]}]}},{"eventCall":{"arguments":[{"id":29466,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"15152:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29467,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29392,"src":"15158:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29468,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29409,"src":"15162:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29465,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"15143:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15143:25:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29470,"nodeType":"EmitStatement","src":"15138:30:280"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":29477,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29473,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29471,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"15187:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29472,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15201:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"15187:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29474,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"15206:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29475,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29380,"src":"15220:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15206:36:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"15187:55:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29506,"nodeType":"IfStatement","src":"15183:500:280","trueBody":{"id":29505,"nodeType":"Block","src":"15244:439:280","statements":[{"id":29504,"nodeType":"UncheckedBlock","src":"15262:407:280","statements":[{"assignments":[29479],"declarations":[{"constant":false,"id":29479,"mutability":"mutable","name":"newBalance","nameLocation":"15302:10:280","nodeType":"VariableDeclaration","scope":29504,"src":"15294:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29478,"name":"uint256","nodeType":"ElementaryTypeName","src":"15294:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29483,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29482,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29480,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29370,"src":"15315:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29481,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"15325:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15315:20:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"15294:41:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29486,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29484,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29479,"src":"15437:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29485,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29370,"src":"15451:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15437:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29493,"nodeType":"IfStatement","src":"15433:85:280","trueBody":{"errorCall":{"arguments":[{"id":29488,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"15492:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29489,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29370,"src":"15498:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29490,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"15507:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29487,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"15467:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15467:51:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29492,"nodeType":"RevertStatement","src":"15460:58:280"}},{"expression":{"id":29502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29494,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29338,"src":"15540:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29497,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15542:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"15540:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29498,"indexExpression":{"id":29496,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"15551:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"15540:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29501,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29499,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29479,"src":"15559:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29500,"name":"selfTransferTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29380,"src":"15572:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15559:35:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"15540:54:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29503,"nodeType":"ExpressionStatement","src":"15540:54:280"}]}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29385,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29383,"src":"14281:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":29386,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29352,"src":"14285:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14281:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29508,"initializationExpression":{"assignments":[29383],"declarations":[{"constant":false,"id":29383,"mutability":"mutable","name":"i","nameLocation":"14278:1:280","nodeType":"VariableDeclaration","scope":29508,"src":"14270:9:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29382,"name":"uint256","nodeType":"ElementaryTypeName","src":"14270:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29384,"nodeType":"VariableDeclarationStatement","src":"14270:9:280"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":29389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"14293:3:280","subExpression":{"id":29388,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29383,"src":"14295:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29390,"nodeType":"ExpressionStatement","src":"14293:3:280"},"nodeType":"ForStatement","src":"14265:1428:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29511,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29509,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"15707:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29510,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29340,"src":"15715:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"15707:14:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29521,"nodeType":"IfStatement","src":"15703:90:280","trueBody":{"id":29520,"nodeType":"Block","src":"15723:70:280","statements":[{"expression":{"arguments":[{"id":29515,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29342,"src":"15757:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29516,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29340,"src":"15763:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29517,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29377,"src":"15771:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29512,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29338,"src":"15737:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29514,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15739:17:280","memberName":"decreaseAllowance","nodeType":"MemberAccess","referencedDeclaration":29042,"src":"15737:19:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15737:45:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29519,"nodeType":"ExpressionStatement","src":"15737:45:280"}]}}]},"documentation":{"id":29335,"nodeType":"StructuredDocumentation","src":"12655:1189:280","text":"@notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\n @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\n @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\n @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\n @dev Emits a {Transfer} event for each transfer.\n @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n @param sender The message sender.\n @param from The account transferring the tokens.\n @param recipients The list of accounts to transfer the tokens to.\n @param values The list of amounts of tokens to transfer to each of `recipients`."},"id":29523,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"13858:17:280","nodeType":"FunctionDefinition","parameters":{"id":29349,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29338,"mutability":"mutable","name":"s","nameLocation":"13891:1:280","nodeType":"VariableDeclaration","scope":29523,"src":"13876:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29337,"nodeType":"UserDefinedTypeName","pathNode":{"id":29336,"name":"Layout","nameLocations":["13876:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"13876:6:280"},"referencedDeclaration":28678,"src":"13876:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29340,"mutability":"mutable","name":"sender","nameLocation":"13902:6:280","nodeType":"VariableDeclaration","scope":29523,"src":"13894:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29339,"name":"address","nodeType":"ElementaryTypeName","src":"13894:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29342,"mutability":"mutable","name":"from","nameLocation":"13918:4:280","nodeType":"VariableDeclaration","scope":29523,"src":"13910:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29341,"name":"address","nodeType":"ElementaryTypeName","src":"13910:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29345,"mutability":"mutable","name":"recipients","nameLocation":"13943:10:280","nodeType":"VariableDeclaration","scope":29523,"src":"13924:29:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":29343,"name":"address","nodeType":"ElementaryTypeName","src":"13924:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29344,"nodeType":"ArrayTypeName","src":"13924:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":29348,"mutability":"mutable","name":"values","nameLocation":"13974:6:280","nodeType":"VariableDeclaration","scope":29523,"src":"13955:25:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":29346,"name":"uint256","nodeType":"ElementaryTypeName","src":"13955:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29347,"nodeType":"ArrayTypeName","src":"13955:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"13875:106:280"},"returnParameters":{"id":29350,"nodeType":"ParameterList","parameters":[],"src":"13991:0:280"},"scope":30139,"src":"13849:1950:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29559,"nodeType":"Block","src":"17062:149:280","statements":[{"expression":{"arguments":[{"id":29541,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29529,"src":"17083:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29542,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29531,"src":"17089:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29543,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29533,"src":"17093:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29538,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29527,"src":"17072:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29540,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17074:8:280","memberName":"transfer","nodeType":"MemberAccess","referencedDeclaration":29123,"src":"17072:10:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17072:27:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29545,"nodeType":"ExpressionStatement","src":"17072:27:280"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":29546,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29531,"src":"17113:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29547,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17116:11:280","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"17113:14:280","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":29548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17113:16:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29558,"nodeType":"IfStatement","src":"17109:96:280","trueBody":{"id":29557,"nodeType":"Block","src":"17131:74:280","statements":[{"expression":{"arguments":[{"id":29550,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29529,"src":"17166:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29551,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29529,"src":"17172:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29552,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29531,"src":"17178:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29553,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29533,"src":"17182:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29554,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29535,"src":"17189:4:280","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":29549,"name":"_callOnERC20Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30138,"src":"17145:20:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":29555,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17145:49:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29556,"nodeType":"ExpressionStatement","src":"17145:49:280"}]}}]},"documentation":{"id":29524,"nodeType":"StructuredDocumentation","src":"15930:1016:280","text":"@notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\n @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @param from The account transferring the tokens.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @param data Optional additional data with no specified format, to be passed to the receiver contract."},"id":29560,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransfer","nameLocation":"16960:12:280","nodeType":"FunctionDefinition","parameters":{"id":29536,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29527,"mutability":"mutable","name":"s","nameLocation":"16988:1:280","nodeType":"VariableDeclaration","scope":29560,"src":"16973:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29526,"nodeType":"UserDefinedTypeName","pathNode":{"id":29525,"name":"Layout","nameLocations":["16973:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"16973:6:280"},"referencedDeclaration":28678,"src":"16973:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29529,"mutability":"mutable","name":"from","nameLocation":"16999:4:280","nodeType":"VariableDeclaration","scope":29560,"src":"16991:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29528,"name":"address","nodeType":"ElementaryTypeName","src":"16991:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29531,"mutability":"mutable","name":"to","nameLocation":"17013:2:280","nodeType":"VariableDeclaration","scope":29560,"src":"17005:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29530,"name":"address","nodeType":"ElementaryTypeName","src":"17005:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29533,"mutability":"mutable","name":"value","nameLocation":"17025:5:280","nodeType":"VariableDeclaration","scope":29560,"src":"17017:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29532,"name":"uint256","nodeType":"ElementaryTypeName","src":"17017:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":29535,"mutability":"mutable","name":"data","nameLocation":"17047:4:280","nodeType":"VariableDeclaration","scope":29560,"src":"17032:19:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":29534,"name":"bytes","nodeType":"ElementaryTypeName","src":"17032:5:280","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"16972:80:280"},"returnParameters":{"id":29537,"nodeType":"ParameterList","parameters":[],"src":"17062:0:280"},"scope":30139,"src":"16951:260:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29599,"nodeType":"Block","src":"18664:163:280","statements":[{"expression":{"arguments":[{"id":29580,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29566,"src":"18689:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29581,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29568,"src":"18697:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29582,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29570,"src":"18703:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29583,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29572,"src":"18707:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29577,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29564,"src":"18674:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29579,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18676:12:280","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":29160,"src":"18674:14:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,address,uint256)"}},"id":29584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18674:39:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29585,"nodeType":"ExpressionStatement","src":"18674:39:280"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":29586,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29570,"src":"18727:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"18730:11:280","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"18727:14:280","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":29588,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18727:16:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29598,"nodeType":"IfStatement","src":"18723:98:280","trueBody":{"id":29597,"nodeType":"Block","src":"18745:76:280","statements":[{"expression":{"arguments":[{"id":29590,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29566,"src":"18780:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29591,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29568,"src":"18788:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29592,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29570,"src":"18794:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29593,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29572,"src":"18798:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29594,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29574,"src":"18805:4:280","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":29589,"name":"_callOnERC20Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30138,"src":"18759:20:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":29595,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18759:51:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29596,"nodeType":"ExpressionStatement","src":"18759:51:280"}]}}]},"documentation":{"id":29561,"nodeType":"StructuredDocumentation","src":"17217:1311:280","text":"@notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\n @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n @param sender The message sender.\n @param from The account transferring the tokens.\n @param to The account to transfer the tokens to.\n @param value The amount of tokens to transfer.\n @param data Optional additional data with no specified format, to be passed to the receiver contract."},"id":29600,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"18542:16:280","nodeType":"FunctionDefinition","parameters":{"id":29575,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29564,"mutability":"mutable","name":"s","nameLocation":"18574:1:280","nodeType":"VariableDeclaration","scope":29600,"src":"18559:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29563,"nodeType":"UserDefinedTypeName","pathNode":{"id":29562,"name":"Layout","nameLocations":["18559:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"18559:6:280"},"referencedDeclaration":28678,"src":"18559:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29566,"mutability":"mutable","name":"sender","nameLocation":"18585:6:280","nodeType":"VariableDeclaration","scope":29600,"src":"18577:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29565,"name":"address","nodeType":"ElementaryTypeName","src":"18577:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29568,"mutability":"mutable","name":"from","nameLocation":"18601:4:280","nodeType":"VariableDeclaration","scope":29600,"src":"18593:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29567,"name":"address","nodeType":"ElementaryTypeName","src":"18593:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29570,"mutability":"mutable","name":"to","nameLocation":"18615:2:280","nodeType":"VariableDeclaration","scope":29600,"src":"18607:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29569,"name":"address","nodeType":"ElementaryTypeName","src":"18607:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29572,"mutability":"mutable","name":"value","nameLocation":"18627:5:280","nodeType":"VariableDeclaration","scope":29600,"src":"18619:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29571,"name":"uint256","nodeType":"ElementaryTypeName","src":"18619:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":29574,"mutability":"mutable","name":"data","nameLocation":"18649:4:280","nodeType":"VariableDeclaration","scope":29600,"src":"18634:19:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":29573,"name":"bytes","nodeType":"ElementaryTypeName","src":"18634:5:280","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"18558:96:280"},"returnParameters":{"id":29576,"nodeType":"ParameterList","parameters":[],"src":"18664:0:280"},"scope":30139,"src":"18533:294:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29670,"nodeType":"Block","src":"19532:495:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29616,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29611,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29606,"src":"19546:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":29614,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19560:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29613,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19552:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29612,"name":"address","nodeType":"ElementaryTypeName","src":"19552:7:280","typeDescriptions":{}}},"id":29615,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19552:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"19546:16:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29620,"nodeType":"IfStatement","src":"19542:53:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29617,"name":"ERC20MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27061,"src":"19571:22:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19571:24:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29619,"nodeType":"RevertStatement","src":"19564:31:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29621,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29608,"src":"19609:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29622,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19618:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"19609:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29660,"nodeType":"IfStatement","src":"19605:370:280","trueBody":{"id":29659,"nodeType":"Block","src":"19621:354:280","statements":[{"assignments":[29625],"declarations":[{"constant":false,"id":29625,"mutability":"mutable","name":"supply","nameLocation":"19643:6:280","nodeType":"VariableDeclaration","scope":29659,"src":"19635:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29624,"name":"uint256","nodeType":"ElementaryTypeName","src":"19635:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29628,"initialValue":{"expression":{"id":29626,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29604,"src":"19652:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29627,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19654:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"19652:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19635:25:280"},{"id":29658,"nodeType":"UncheckedBlock","src":"19674:291:280","statements":[{"assignments":[29630],"declarations":[{"constant":false,"id":29630,"mutability":"mutable","name":"newSupply","nameLocation":"19710:9:280","nodeType":"VariableDeclaration","scope":29658,"src":"19702:17:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29629,"name":"uint256","nodeType":"ElementaryTypeName","src":"19702:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29634,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29631,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29625,"src":"19722:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29632,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29608,"src":"19731:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19722:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"19702:34:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29635,"name":"newSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29630,"src":"19758:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":29636,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29625,"src":"19771:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19758:19:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29643,"nodeType":"IfStatement","src":"19754:71:280","trueBody":{"errorCall":{"arguments":[{"id":29639,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29625,"src":"19811:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29640,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29608,"src":"19819:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29638,"name":"ERC20TotalSupplyOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27071,"src":"19786:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":29641,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19786:39:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29642,"nodeType":"RevertStatement","src":"19779:46:280"}},{"expression":{"id":29648,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":29644,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29604,"src":"19843:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29646,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"19845:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"19843:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29647,"name":"newSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29630,"src":"19854:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19843:20:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29649,"nodeType":"ExpressionStatement","src":"19843:20:280"},{"expression":{"id":29656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29650,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29604,"src":"19881:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29653,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19883:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"19881:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29654,"indexExpression":{"id":29652,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29606,"src":"19892:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"19881:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29655,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29608,"src":"19899:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"19881:23:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29657,"nodeType":"ExpressionStatement","src":"19881:23:280"}]}]}},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":29664,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20006:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29663,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19998:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29662,"name":"address","nodeType":"ElementaryTypeName","src":"19998:7:280","typeDescriptions":{}}},"id":29665,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19998:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29666,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29606,"src":"20010:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29667,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29608,"src":"20014:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29661,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"19989:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29668,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19989:31:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29669,"nodeType":"EmitStatement","src":"19984:36:280"}]},"documentation":{"id":29601,"nodeType":"StructuredDocumentation","src":"18951:508:280","text":"@notice Mints an amount of tokens to a recipient, increasing the total supply.\n @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\n @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\n @dev Emits a {Transfer} event with `from` set to the zero address.\n @param to The account to mint the tokens to.\n @param value The amount of tokens to mint."},"id":29671,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"19473:4:280","nodeType":"FunctionDefinition","parameters":{"id":29609,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29604,"mutability":"mutable","name":"s","nameLocation":"19493:1:280","nodeType":"VariableDeclaration","scope":29671,"src":"19478:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29603,"nodeType":"UserDefinedTypeName","pathNode":{"id":29602,"name":"Layout","nameLocations":["19478:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"19478:6:280"},"referencedDeclaration":28678,"src":"19478:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29606,"mutability":"mutable","name":"to","nameLocation":"19504:2:280","nodeType":"VariableDeclaration","scope":29671,"src":"19496:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29605,"name":"address","nodeType":"ElementaryTypeName","src":"19496:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29608,"mutability":"mutable","name":"value","nameLocation":"19516:5:280","nodeType":"VariableDeclaration","scope":29671,"src":"19508:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29607,"name":"uint256","nodeType":"ElementaryTypeName","src":"19508:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"19477:45:280"},"returnParameters":{"id":29610,"nodeType":"ParameterList","parameters":[],"src":"19532:0:280"},"scope":30139,"src":"19464:563:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29810,"nodeType":"Block","src":"20957:1133:280","statements":[{"assignments":[29685],"declarations":[{"constant":false,"id":29685,"mutability":"mutable","name":"length","nameLocation":"20975:6:280","nodeType":"VariableDeclaration","scope":29810,"src":"20967:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29684,"name":"uint256","nodeType":"ElementaryTypeName","src":"20967:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29688,"initialValue":{"expression":{"id":29686,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29678,"src":"20984:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":29687,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"20995:6:280","memberName":"length","nodeType":"MemberAccess","src":"20984:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"20967:34:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29692,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29689,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29685,"src":"21015:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":29690,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29681,"src":"21025:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":29691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"21032:6:280","memberName":"length","nodeType":"MemberAccess","src":"21025:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21015:23:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29696,"nodeType":"IfStatement","src":"21011:62:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29693,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"21047:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29694,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21047:26:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29695,"nodeType":"RevertStatement","src":"21040:33:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29699,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29697,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29685,"src":"21088:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":29698,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21098:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21088:11:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29701,"nodeType":"IfStatement","src":"21084:24:280","trueBody":{"functionReturnParameters":29683,"id":29700,"nodeType":"Return","src":"21101:7:280"}},{"assignments":[29703],"declarations":[{"constant":false,"id":29703,"mutability":"mutable","name":"totalValue","nameLocation":"21126:10:280","nodeType":"VariableDeclaration","scope":29810,"src":"21118:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29702,"name":"uint256","nodeType":"ElementaryTypeName","src":"21118:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29704,"nodeType":"VariableDeclarationStatement","src":"21118:18:280"},{"body":{"id":29776,"nodeType":"Block","src":"21179:593:280","statements":[{"assignments":[29715],"declarations":[{"constant":false,"id":29715,"mutability":"mutable","name":"to","nameLocation":"21201:2:280","nodeType":"VariableDeclaration","scope":29776,"src":"21193:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29714,"name":"address","nodeType":"ElementaryTypeName","src":"21193:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":29719,"initialValue":{"baseExpression":{"id":29716,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29678,"src":"21206:10:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":29718,"indexExpression":{"id":29717,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29706,"src":"21217:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21206:13:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"21193:26:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29725,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29720,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29715,"src":"21237:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":29723,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21251:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29722,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21243:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29721,"name":"address","nodeType":"ElementaryTypeName","src":"21243:7:280","typeDescriptions":{}}},"id":29724,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21243:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21237:16:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29729,"nodeType":"IfStatement","src":"21233:53:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29726,"name":"ERC20MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27061,"src":"21262:22:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29727,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21262:24:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29728,"nodeType":"RevertStatement","src":"21255:31:280"}},{"assignments":[29731],"declarations":[{"constant":false,"id":29731,"mutability":"mutable","name":"value","nameLocation":"21309:5:280","nodeType":"VariableDeclaration","scope":29776,"src":"21301:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29730,"name":"uint256","nodeType":"ElementaryTypeName","src":"21301:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29735,"initialValue":{"baseExpression":{"id":29732,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29681,"src":"21317:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":29734,"indexExpression":{"id":29733,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29706,"src":"21324:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21317:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21301:25:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29738,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29736,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29731,"src":"21344:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29737,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21353:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21344:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29766,"nodeType":"IfStatement","src":"21340:372:280","trueBody":{"id":29765,"nodeType":"Block","src":"21356:356:280","statements":[{"id":29764,"nodeType":"UncheckedBlock","src":"21374:324:280","statements":[{"assignments":[29740],"declarations":[{"constant":false,"id":29740,"mutability":"mutable","name":"newTotalValue","nameLocation":"21414:13:280","nodeType":"VariableDeclaration","scope":29764,"src":"21406:21:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29739,"name":"uint256","nodeType":"ElementaryTypeName","src":"21406:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29744,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29741,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"21430:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29742,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29731,"src":"21443:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21430:18:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21406:42:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29745,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29740,"src":"21474:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":29746,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"21491:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21474:27:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29751,"nodeType":"IfStatement","src":"21470:70:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29748,"name":"ERC20BatchMintValuesOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27064,"src":"21510:28:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21510:30:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29750,"nodeType":"RevertStatement","src":"21503:37:280"}},{"expression":{"id":29754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":29752,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"21562:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29753,"name":"newTotalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29740,"src":"21575:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21562:26:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29755,"nodeType":"ExpressionStatement","src":"21562:26:280"},{"expression":{"id":29762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29756,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29675,"src":"21610:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29759,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21612:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"21610:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29760,"indexExpression":{"id":29758,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29715,"src":"21621:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"21610:14:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":29761,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29731,"src":"21628:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21610:23:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29763,"nodeType":"ExpressionStatement","src":"21610:23:280"}]}]}},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":29770,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21747:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29769,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21739:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29768,"name":"address","nodeType":"ElementaryTypeName","src":"21739:7:280","typeDescriptions":{}}},"id":29771,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21739:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29772,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29715,"src":"21751:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29773,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29731,"src":"21755:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29767,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"21730:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21730:31:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29775,"nodeType":"EmitStatement","src":"21725:36:280"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29708,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29706,"src":"21162:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":29709,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29685,"src":"21166:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21162:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29777,"initializationExpression":{"assignments":[29706],"declarations":[{"constant":false,"id":29706,"mutability":"mutable","name":"i","nameLocation":"21159:1:280","nodeType":"VariableDeclaration","scope":29777,"src":"21151:9:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29705,"name":"uint256","nodeType":"ElementaryTypeName","src":"21151:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29707,"nodeType":"VariableDeclarationStatement","src":"21151:9:280"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":29712,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"21174:3:280","subExpression":{"id":29711,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29706,"src":"21176:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29713,"nodeType":"ExpressionStatement","src":"21174:3:280"},"nodeType":"ForStatement","src":"21146:626:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29780,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29778,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"21786:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29779,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21800:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"21786:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29809,"nodeType":"IfStatement","src":"21782:302:280","trueBody":{"id":29808,"nodeType":"Block","src":"21803:281:280","statements":[{"id":29807,"nodeType":"UncheckedBlock","src":"21817:257:280","statements":[{"assignments":[29782],"declarations":[{"constant":false,"id":29782,"mutability":"mutable","name":"supply","nameLocation":"21853:6:280","nodeType":"VariableDeclaration","scope":29807,"src":"21845:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29781,"name":"uint256","nodeType":"ElementaryTypeName","src":"21845:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29785,"initialValue":{"expression":{"id":29783,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29675,"src":"21862:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29784,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21864:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"21862:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21845:25:280"},{"assignments":[29787],"declarations":[{"constant":false,"id":29787,"mutability":"mutable","name":"newSupply","nameLocation":"21896:9:280","nodeType":"VariableDeclaration","scope":29807,"src":"21888:17:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29786,"name":"uint256","nodeType":"ElementaryTypeName","src":"21888:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29791,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29788,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29782,"src":"21908:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":29789,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"21917:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21908:19:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21888:39:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29794,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29792,"name":"newSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29787,"src":"21949:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":29793,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29782,"src":"21962:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21949:19:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29800,"nodeType":"IfStatement","src":"21945:76:280","trueBody":{"errorCall":{"arguments":[{"id":29796,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29782,"src":"22002:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29797,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29703,"src":"22010:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29795,"name":"ERC20TotalSupplyOverflow","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27071,"src":"21977:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (uint256,uint256) pure returns (error)"}},"id":29798,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21977:44:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29799,"nodeType":"RevertStatement","src":"21970:51:280"}},{"expression":{"id":29805,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":29801,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29675,"src":"22039:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29803,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"22041:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"22039:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29804,"name":"newSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29787,"src":"22050:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22039:20:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29806,"nodeType":"ExpressionStatement","src":"22039:20:280"}]}]}}]},"documentation":{"id":29672,"nodeType":"StructuredDocumentation","src":"20033:819:280","text":"@notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\n @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\n @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\n @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\n @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\n @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\n @param recipients The list of accounts to mint the tokens to.\n @param values The list of amounts of tokens to mint to each of `recipients`."},"id":29811,"implemented":true,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"20866:9:280","nodeType":"FunctionDefinition","parameters":{"id":29682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29675,"mutability":"mutable","name":"s","nameLocation":"20891:1:280","nodeType":"VariableDeclaration","scope":29811,"src":"20876:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29674,"nodeType":"UserDefinedTypeName","pathNode":{"id":29673,"name":"Layout","nameLocations":["20876:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"20876:6:280"},"referencedDeclaration":28678,"src":"20876:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29678,"mutability":"mutable","name":"recipients","nameLocation":"20911:10:280","nodeType":"VariableDeclaration","scope":29811,"src":"20894:27:280","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":29676,"name":"address","nodeType":"ElementaryTypeName","src":"20894:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29677,"nodeType":"ArrayTypeName","src":"20894:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":29681,"mutability":"mutable","name":"values","nameLocation":"20940:6:280","nodeType":"VariableDeclaration","scope":29811,"src":"20923:23:280","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":29679,"name":"uint256","nodeType":"ElementaryTypeName","src":"20923:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29680,"nodeType":"ArrayTypeName","src":"20923:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"20875:72:280"},"returnParameters":{"id":29683,"nodeType":"ParameterList","parameters":[],"src":"20957:0:280"},"scope":30139,"src":"20857:1233:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29874,"nodeType":"Block","src":"22729:454:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29822,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29819,"src":"22743:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29823,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22752:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"22743:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29864,"nodeType":"IfStatement","src":"22739:389:280","trueBody":{"id":29863,"nodeType":"Block","src":"22755:373:280","statements":[{"assignments":[29826],"declarations":[{"constant":false,"id":29826,"mutability":"mutable","name":"balance","nameLocation":"22777:7:280","nodeType":"VariableDeclaration","scope":29863,"src":"22769:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29825,"name":"uint256","nodeType":"ElementaryTypeName","src":"22769:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29831,"initialValue":{"baseExpression":{"expression":{"id":29827,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29815,"src":"22787:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29828,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22789:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"22787:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29830,"indexExpression":{"id":29829,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29817,"src":"22798:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"22787:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22769:34:280"},{"id":29862,"nodeType":"UncheckedBlock","src":"22817:301:280","statements":[{"assignments":[29833],"declarations":[{"constant":false,"id":29833,"mutability":"mutable","name":"newBalance","nameLocation":"22853:10:280","nodeType":"VariableDeclaration","scope":29862,"src":"22845:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29832,"name":"uint256","nodeType":"ElementaryTypeName","src":"22845:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29837,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29836,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29834,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29826,"src":"22866:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29835,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29819,"src":"22876:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22866:15:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22845:36:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29838,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29833,"src":"22903:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29839,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29826,"src":"22917:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22903:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29847,"nodeType":"IfStatement","src":"22899:80:280","trueBody":{"errorCall":{"arguments":[{"id":29842,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29817,"src":"22958:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29843,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29826,"src":"22964:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":29844,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29819,"src":"22973:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29841,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"22933:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":29845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22933:46:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29846,"nodeType":"RevertStatement","src":"22926:53:280"}},{"expression":{"id":29854,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":29848,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29815,"src":"22997:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29851,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"22999:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"22997:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29852,"indexExpression":{"id":29850,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29817,"src":"23008:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"22997:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":29853,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29833,"src":"23016:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22997:29:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29855,"nodeType":"ExpressionStatement","src":"22997:29:280"},{"expression":{"id":29860,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":29856,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29815,"src":"23044:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29858,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"23046:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"23044:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":29859,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29819,"src":"23056:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23044:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29861,"nodeType":"ExpressionStatement","src":"23044:17:280"}]}]}},{"eventCall":{"arguments":[{"id":29866,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29817,"src":"23152:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":29869,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23166:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":29868,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23158:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":29867,"name":"address","nodeType":"ElementaryTypeName","src":"23158:7:280","typeDescriptions":{}}},"id":29870,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23158:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29871,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29819,"src":"23170:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29865,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"23143:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":29872,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23143:33:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29873,"nodeType":"EmitStatement","src":"23138:38:280"}]},"documentation":{"id":29812,"nodeType":"StructuredDocumentation","src":"22214:440:280","text":"@notice Burns an amount of tokens from an account, decreasing the total supply.\n @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Emits a {Transfer} event with `to` set to the zero address.\n @param from The account burning the tokens.\n @param value The amount of tokens to burn."},"id":29875,"implemented":true,"kind":"function","modifiers":[],"name":"burn","nameLocation":"22668:4:280","nodeType":"FunctionDefinition","parameters":{"id":29820,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29815,"mutability":"mutable","name":"s","nameLocation":"22688:1:280","nodeType":"VariableDeclaration","scope":29875,"src":"22673:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29814,"nodeType":"UserDefinedTypeName","pathNode":{"id":29813,"name":"Layout","nameLocations":["22673:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"22673:6:280"},"referencedDeclaration":28678,"src":"22673:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29817,"mutability":"mutable","name":"from","nameLocation":"22699:4:280","nodeType":"VariableDeclaration","scope":29875,"src":"22691:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29816,"name":"address","nodeType":"ElementaryTypeName","src":"22691:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29819,"mutability":"mutable","name":"value","nameLocation":"22713:5:280","nodeType":"VariableDeclaration","scope":29875,"src":"22705:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29818,"name":"uint256","nodeType":"ElementaryTypeName","src":"22705:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"22672:47:280"},"returnParameters":{"id":29821,"nodeType":"ParameterList","parameters":[],"src":"22729:0:280"},"scope":30139,"src":"22659:524:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":29908,"nodeType":"Block","src":"24027:130:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29888,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29883,"src":"24041:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29889,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29881,"src":"24049:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"24041:14:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29900,"nodeType":"IfStatement","src":"24037:85:280","trueBody":{"id":29899,"nodeType":"Block","src":"24057:65:280","statements":[{"expression":{"arguments":[{"id":29894,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29883,"src":"24091:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29895,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29881,"src":"24097:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29896,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29885,"src":"24105:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29891,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29879,"src":"24071:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29893,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24073:17:280","memberName":"decreaseAllowance","nodeType":"MemberAccess","referencedDeclaration":29042,"src":"24071:19:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29897,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24071:40:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29898,"nodeType":"ExpressionStatement","src":"24071:40:280"}]}},{"expression":{"arguments":[{"id":29904,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29883,"src":"24138:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29905,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29885,"src":"24144:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29901,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29879,"src":"24131:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29903,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24133:4:280","memberName":"burn","nodeType":"MemberAccess","referencedDeclaration":29875,"src":"24131:6:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,uint256)"}},"id":29906,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24131:19:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29907,"nodeType":"ExpressionStatement","src":"24131:19:280"}]},"documentation":{"id":29876,"nodeType":"StructuredDocumentation","src":"23189:743:280","text":"@notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\n @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\n @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\n @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\n @dev Emits a {Transfer} event with `to` set to the zero address.\n @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\n @param sender The message sender.\n @param from The account to burn the tokens from.\n @param value The amount of tokens to burn."},"id":29909,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"23946:8:280","nodeType":"FunctionDefinition","parameters":{"id":29886,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29879,"mutability":"mutable","name":"s","nameLocation":"23970:1:280","nodeType":"VariableDeclaration","scope":29909,"src":"23955:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29878,"nodeType":"UserDefinedTypeName","pathNode":{"id":29877,"name":"Layout","nameLocations":["23955:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"23955:6:280"},"referencedDeclaration":28678,"src":"23955:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29881,"mutability":"mutable","name":"sender","nameLocation":"23981:6:280","nodeType":"VariableDeclaration","scope":29909,"src":"23973:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29880,"name":"address","nodeType":"ElementaryTypeName","src":"23973:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29883,"mutability":"mutable","name":"from","nameLocation":"23997:4:280","nodeType":"VariableDeclaration","scope":29909,"src":"23989:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29882,"name":"address","nodeType":"ElementaryTypeName","src":"23989:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29885,"mutability":"mutable","name":"value","nameLocation":"24011:5:280","nodeType":"VariableDeclaration","scope":29909,"src":"24003:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29884,"name":"uint256","nodeType":"ElementaryTypeName","src":"24003:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"23954:63:280"},"returnParameters":{"id":29887,"nodeType":"ParameterList","parameters":[],"src":"24027:0:280"},"scope":30139,"src":"23937:220:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":30043,"nodeType":"Block","src":"25272:1122:280","statements":[{"assignments":[29925],"declarations":[{"constant":false,"id":29925,"mutability":"mutable","name":"length","nameLocation":"25290:6:280","nodeType":"VariableDeclaration","scope":30043,"src":"25282:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29924,"name":"uint256","nodeType":"ElementaryTypeName","src":"25282:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29928,"initialValue":{"expression":{"id":29926,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29918,"src":"25299:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29927,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25306:6:280","memberName":"length","nodeType":"MemberAccess","src":"25299:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25282:30:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29929,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29925,"src":"25326:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":29930,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29921,"src":"25336:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25343:6:280","memberName":"length","nodeType":"MemberAccess","src":"25336:13:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25326:23:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29936,"nodeType":"IfStatement","src":"25322:62:280","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":29933,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"25358:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":29934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25358:26:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":29935,"nodeType":"RevertStatement","src":"25351:33:280"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29937,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29925,"src":"25399:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":29938,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25409:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"25399:11:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29941,"nodeType":"IfStatement","src":"25395:24:280","trueBody":{"functionReturnParameters":29923,"id":29940,"nodeType":"Return","src":"25412:7:280"}},{"assignments":[29943],"declarations":[{"constant":false,"id":29943,"mutability":"mutable","name":"totalValue","nameLocation":"25437:10:280","nodeType":"VariableDeclaration","scope":30043,"src":"25429:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29942,"name":"uint256","nodeType":"ElementaryTypeName","src":"25429:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29944,"nodeType":"VariableDeclarationStatement","src":"25429:18:280"},{"body":{"id":30029,"nodeType":"Block","src":"25490:717:280","statements":[{"assignments":[29955],"declarations":[{"constant":false,"id":29955,"mutability":"mutable","name":"from","nameLocation":"25512:4:280","nodeType":"VariableDeclaration","scope":30029,"src":"25504:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29954,"name":"address","nodeType":"ElementaryTypeName","src":"25504:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":29959,"initialValue":{"baseExpression":{"id":29956,"name":"owners","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29918,"src":"25519:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},"id":29958,"indexExpression":{"id":29957,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29946,"src":"25526:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25519:9:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"25504:24:280"},{"assignments":[29961],"declarations":[{"constant":false,"id":29961,"mutability":"mutable","name":"value","nameLocation":"25550:5:280","nodeType":"VariableDeclaration","scope":30029,"src":"25542:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29960,"name":"uint256","nodeType":"ElementaryTypeName","src":"25542:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29965,"initialValue":{"baseExpression":{"id":29962,"name":"values","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29921,"src":"25558:6:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":29964,"indexExpression":{"id":29963,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29946,"src":"25565:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25558:9:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25542:25:280"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":29968,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29966,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"25586:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":29967,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29915,"src":"25594:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25586:14:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":29978,"nodeType":"IfStatement","src":"25582:93:280","trueBody":{"id":29977,"nodeType":"Block","src":"25602:73:280","statements":[{"expression":{"arguments":[{"id":29972,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"25640:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29973,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29915,"src":"25646:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":29974,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"25654:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":29969,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29913,"src":"25620:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29971,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25622:17:280","memberName":"decreaseAllowance","nodeType":"MemberAccess","referencedDeclaration":29042,"src":"25620:19:280","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address,address,uint256)"}},"id":29975,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25620:40:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":29976,"nodeType":"ExpressionStatement","src":"25620:40:280"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29981,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29979,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"25693:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":29980,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"25702:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"25693:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":30019,"nodeType":"IfStatement","src":"25689:455:280","trueBody":{"id":30018,"nodeType":"Block","src":"25705:439:280","statements":[{"assignments":[29983],"declarations":[{"constant":false,"id":29983,"mutability":"mutable","name":"balance","nameLocation":"25731:7:280","nodeType":"VariableDeclaration","scope":30018,"src":"25723:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29982,"name":"uint256","nodeType":"ElementaryTypeName","src":"25723:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29988,"initialValue":{"baseExpression":{"expression":{"id":29984,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29913,"src":"25741:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":29985,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25743:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"25741:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":29987,"indexExpression":{"id":29986,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"25752:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25741:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25723:34:280"},{"id":30017,"nodeType":"UncheckedBlock","src":"25775:355:280","statements":[{"assignments":[29990],"declarations":[{"constant":false,"id":29990,"mutability":"mutable","name":"newBalance","nameLocation":"25815:10:280","nodeType":"VariableDeclaration","scope":30017,"src":"25807:18:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29989,"name":"uint256","nodeType":"ElementaryTypeName","src":"25807:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29994,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29993,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29991,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29983,"src":"25828:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":29992,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"25838:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25828:15:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25807:36:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29997,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29995,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29990,"src":"25869:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":29996,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29983,"src":"25883:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25869:21:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":30004,"nodeType":"IfStatement","src":"25865:80:280","trueBody":{"errorCall":{"arguments":[{"id":29999,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"25924:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":30000,"name":"balance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29983,"src":"25930:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":30001,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"25939:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":29998,"name":"ERC20InsufficientBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27056,"src":"25899:24:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256,uint256) pure returns (error)"}},"id":30002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25899:46:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":30003,"nodeType":"RevertStatement","src":"25892:53:280"}},{"expression":{"id":30011,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":30005,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29913,"src":"25967:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30008,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25969:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"25967:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":30009,"indexExpression":{"id":30007,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"25978:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"25967:16:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":30010,"name":"newBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29990,"src":"25986:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25967:29:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":30012,"nodeType":"ExpressionStatement","src":"25967:29:280"},{"expression":{"id":30015,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":30013,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29943,"src":"26018:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":30014,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"26032:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26018:19:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":30016,"nodeType":"ExpressionStatement","src":"26018:19:280"}]}]}},{"eventCall":{"arguments":[{"id":30021,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29955,"src":"26172:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":30024,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26186:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":30023,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26178:7:280","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":30022,"name":"address","nodeType":"ElementaryTypeName","src":"26178:7:280","typeDescriptions":{}}},"id":30025,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26178:10:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":30026,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29961,"src":"26190:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":30020,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27102,"src":"26163:8:280","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":30027,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26163:33:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30028,"nodeType":"EmitStatement","src":"26158:38:280"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29950,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":29948,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29946,"src":"25473:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":29949,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29925,"src":"25477:6:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25473:10:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":30030,"initializationExpression":{"assignments":[29946],"declarations":[{"constant":false,"id":29946,"mutability":"mutable","name":"i","nameLocation":"25470:1:280","nodeType":"VariableDeclaration","scope":30030,"src":"25462:9:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":29945,"name":"uint256","nodeType":"ElementaryTypeName","src":"25462:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":29947,"nodeType":"VariableDeclarationStatement","src":"25462:9:280"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":29952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"25485:3:280","subExpression":{"id":29951,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29946,"src":"25487:1:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29953,"nodeType":"ExpressionStatement","src":"25485:3:280"},"nodeType":"ForStatement","src":"25457:750:280"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":30033,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":30031,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29943,"src":"26221:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":30032,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26235:1:280","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"26221:15:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":30042,"nodeType":"IfStatement","src":"26217:171:280","trueBody":{"id":30041,"nodeType":"Block","src":"26238:150:280","statements":[{"id":30040,"nodeType":"UncheckedBlock","src":"26252:126:280","statements":[{"expression":{"id":30038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":30034,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29913,"src":"26280:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30036,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"26282:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"26280:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":30037,"name":"totalValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29943,"src":"26292:10:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26280:22:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":30039,"nodeType":"ExpressionStatement","src":"26280:22:280"}]}]}}]},"documentation":{"id":29910,"nodeType":"StructuredDocumentation","src":"24163:984:280","text":"@notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\n @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\n @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\n @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\n @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\n  at least the corresponding `value` of allowance by this `owner`.\n @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\n @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\n @param sender The message sender.\n @param owners The list of accounts to burn the tokens from.\n @param values The list of amounts of tokens to burn."},"id":30044,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"25161:13:280","nodeType":"FunctionDefinition","parameters":{"id":29922,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29913,"mutability":"mutable","name":"s","nameLocation":"25190:1:280","nodeType":"VariableDeclaration","scope":30044,"src":"25175:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":29912,"nodeType":"UserDefinedTypeName","pathNode":{"id":29911,"name":"Layout","nameLocations":["25175:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"25175:6:280"},"referencedDeclaration":28678,"src":"25175:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":29915,"mutability":"mutable","name":"sender","nameLocation":"25201:6:280","nodeType":"VariableDeclaration","scope":30044,"src":"25193:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":29914,"name":"address","nodeType":"ElementaryTypeName","src":"25193:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":29918,"mutability":"mutable","name":"owners","nameLocation":"25228:6:280","nodeType":"VariableDeclaration","scope":30044,"src":"25209:25:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":29916,"name":"address","nodeType":"ElementaryTypeName","src":"25209:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":29917,"nodeType":"ArrayTypeName","src":"25209:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":29921,"mutability":"mutable","name":"values","nameLocation":"25255:6:280","nodeType":"VariableDeclaration","scope":30044,"src":"25236:25:280","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":29919,"name":"uint256","nodeType":"ElementaryTypeName","src":"25236:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":29920,"nodeType":"ArrayTypeName","src":"25236:9:280","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"25174:88:280"},"returnParameters":{"id":29923,"nodeType":"ParameterList","parameters":[],"src":"25272:0:280"},"scope":30139,"src":"25152:1242:280","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":30056,"nodeType":"Block","src":"26637:32:280","statements":[{"expression":{"expression":{"id":30053,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30048,"src":"26654:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30054,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26656:6:280","memberName":"supply","nodeType":"MemberAccess","referencedDeclaration":28677,"src":"26654:8:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":30052,"id":30055,"nodeType":"Return","src":"26647:15:280"}]},"documentation":{"id":30045,"nodeType":"StructuredDocumentation","src":"26400:154:280","text":"@notice Gets the total token supply.\n @dev Note: This function implements {ERC20-totalSupply()}.\n @return supply The total token supply."},"id":30057,"implemented":true,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"26568:11:280","nodeType":"FunctionDefinition","parameters":{"id":30049,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30048,"mutability":"mutable","name":"s","nameLocation":"26595:1:280","nodeType":"VariableDeclaration","scope":30057,"src":"26580:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":30047,"nodeType":"UserDefinedTypeName","pathNode":{"id":30046,"name":"Layout","nameLocations":["26580:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"26580:6:280"},"referencedDeclaration":28678,"src":"26580:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"}],"src":"26579:18:280"},"returnParameters":{"id":30052,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30051,"mutability":"mutable","name":"supply","nameLocation":"26629:6:280","nodeType":"VariableDeclaration","scope":30057,"src":"26621:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":30050,"name":"uint256","nodeType":"ElementaryTypeName","src":"26621:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"26620:16:280"},"scope":30139,"src":"26559:110:280","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":30073,"nodeType":"Block","src":"26990:41:280","statements":[{"expression":{"baseExpression":{"expression":{"id":30068,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30061,"src":"27007:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30069,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27009:8:280","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":28669,"src":"27007:10:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":30071,"indexExpression":{"id":30070,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30063,"src":"27018:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"27007:17:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":30067,"id":30072,"nodeType":"Return","src":"27000:24:280"}]},"documentation":{"id":30058,"nodeType":"StructuredDocumentation","src":"26675:218:280","text":"@notice Gets an account balance.\n @dev Note: This function implements {ERC20-balanceOf(address)}.\n @param owner The account whose balance will be returned.\n @return balance The account balance."},"id":30074,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"26907:9:280","nodeType":"FunctionDefinition","parameters":{"id":30064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30061,"mutability":"mutable","name":"s","nameLocation":"26932:1:280","nodeType":"VariableDeclaration","scope":30074,"src":"26917:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":30060,"nodeType":"UserDefinedTypeName","pathNode":{"id":30059,"name":"Layout","nameLocations":["26917:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"26917:6:280"},"referencedDeclaration":28678,"src":"26917:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":30063,"mutability":"mutable","name":"owner","nameLocation":"26943:5:280","nodeType":"VariableDeclaration","scope":30074,"src":"26935:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30062,"name":"address","nodeType":"ElementaryTypeName","src":"26935:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"26916:33:280"},"returnParameters":{"id":30067,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30066,"mutability":"mutable","name":"balance","nameLocation":"26981:7:280","nodeType":"VariableDeclaration","scope":30074,"src":"26973:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":30065,"name":"uint256","nodeType":"ElementaryTypeName","src":"26973:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"26972:17:280"},"scope":30139,"src":"26898:133:280","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":30094,"nodeType":"Block","src":"27559:52:280","statements":[{"expression":{"baseExpression":{"baseExpression":{"expression":{"id":30087,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30078,"src":"27576:1:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30088,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27578:10:280","memberName":"allowances","nodeType":"MemberAccess","referencedDeclaration":28675,"src":"27576:12:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":30090,"indexExpression":{"id":30089,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30080,"src":"27589:5:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"27576:19:280","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":30092,"indexExpression":{"id":30091,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30082,"src":"27596:7:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"27576:28:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":30086,"id":30093,"nodeType":"Return","src":"27569:35:280"}]},"documentation":{"id":30075,"nodeType":"StructuredDocumentation","src":"27037:410:280","text":"@notice Gets the amount that an account is allowed to spend on behalf of another.\n @dev Note: This function implements {ERC20-allowance(address,address)}.\n @param owner The account that has granted an allowance to `spender`.\n @param spender The account that was granted an allowance by `owner`.\n @return value The amount which `spender` is allowed to spend on behalf of `owner`."},"id":30095,"implemented":true,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"27461:9:280","nodeType":"FunctionDefinition","parameters":{"id":30083,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30078,"mutability":"mutable","name":"s","nameLocation":"27486:1:280","nodeType":"VariableDeclaration","scope":30095,"src":"27471:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":30077,"nodeType":"UserDefinedTypeName","pathNode":{"id":30076,"name":"Layout","nameLocations":["27471:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"27471:6:280"},"referencedDeclaration":28678,"src":"27471:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":30080,"mutability":"mutable","name":"owner","nameLocation":"27497:5:280","nodeType":"VariableDeclaration","scope":30095,"src":"27489:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30079,"name":"address","nodeType":"ElementaryTypeName","src":"27489:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":30082,"mutability":"mutable","name":"spender","nameLocation":"27512:7:280","nodeType":"VariableDeclaration","scope":30095,"src":"27504:15:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30081,"name":"address","nodeType":"ElementaryTypeName","src":"27504:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"27470:50:280"},"returnParameters":{"id":30086,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30085,"mutability":"mutable","name":"value","nameLocation":"27552:5:280","nodeType":"VariableDeclaration","scope":30095,"src":"27544:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":30084,"name":"uint256","nodeType":"ElementaryTypeName","src":"27544:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27543:15:280"},"scope":30139,"src":"27452:159:280","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":30106,"nodeType":"Block","src":"27676:115:280","statements":[{"assignments":[30102],"declarations":[{"constant":false,"id":30102,"mutability":"mutable","name":"position","nameLocation":"27694:8:280","nodeType":"VariableDeclaration","scope":30106,"src":"27686:16:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":30101,"name":"bytes32","nodeType":"ElementaryTypeName","src":"27686:7:280","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":30104,"initialValue":{"id":30103,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28691,"src":"27705:19:280","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"27686:38:280"},{"AST":{"nativeSrc":"27743:42:280","nodeType":"YulBlock","src":"27743:42:280","statements":[{"nativeSrc":"27757:18:280","nodeType":"YulAssignment","src":"27757:18:280","value":{"name":"position","nativeSrc":"27767:8:280","nodeType":"YulIdentifier","src":"27767:8:280"},"variableNames":[{"name":"s.slot","nativeSrc":"27757:6:280","nodeType":"YulIdentifier","src":"27757:6:280"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":30102,"isOffset":false,"isSlot":false,"src":"27767:8:280","valueSize":1},{"declaration":30099,"isOffset":false,"isSlot":true,"src":"27757:6:280","suffix":"slot","valueSize":1}],"id":30105,"nodeType":"InlineAssembly","src":"27734:51:280"}]},"id":30107,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"27626:6:280","nodeType":"FunctionDefinition","parameters":{"id":30096,"nodeType":"ParameterList","parameters":[],"src":"27632:2:280"},"returnParameters":{"id":30100,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30099,"mutability":"mutable","name":"s","nameLocation":"27673:1:280","nodeType":"VariableDeclaration","scope":30107,"src":"27658:16:280","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"},"typeName":{"id":30098,"nodeType":"UserDefinedTypeName","pathNode":{"id":30097,"name":"Layout","nameLocations":["27658:6:280"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"27658:6:280"},"referencedDeclaration":28678,"src":"27658:6:280","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}},"visibility":"internal"}],"src":"27657:18:280"},"scope":30139,"src":"27617:174:280","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":30137,"nodeType":"Block","src":"28343:138:280","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":30131,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":30125,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30110,"src":"28392:6:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":30126,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30112,"src":"28400:4:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":30127,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30116,"src":"28406:5:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":30128,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30118,"src":"28413:4:280","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":30122,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30114,"src":"28372:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":30121,"name":"IERC20Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28035,"src":"28357:14:280","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC20Receiver_$28035_$","typeString":"type(contract IERC20Receiver)"}},"id":30123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28357:18:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC20Receiver_$28035","typeString":"contract IERC20Receiver"}},"id":30124,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"28376:15:280","memberName":"onERC20Received","nodeType":"MemberAccess","referencedDeclaration":28034,"src":"28357:34:280","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,bytes memory) external returns (bytes4)"}},"id":30129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28357:61:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":30130,"name":"ERC20_RECEIVED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28709,"src":"28422:14:280","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"28357:79:280","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":30136,"nodeType":"IfStatement","src":"28353:121:280","trueBody":{"errorCall":{"arguments":[{"id":30133,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30114,"src":"28471:2:280","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":30132,"name":"ERC20SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27091,"src":"28445:25:280","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":30134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28445:29:280","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":30135,"nodeType":"RevertStatement","src":"28438:36:280"}}]},"documentation":{"id":30108,"nodeType":"StructuredDocumentation","src":"27797:427:280","text":"@notice Calls {IERC20Receiver-onERC20Received} on a target contract.\n @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n @param sender The message sender.\n @param from Previous token owner.\n @param to New token owner.\n @param value The value transferred.\n @param data Optional data to send along with the receiver contract call."},"id":30138,"implemented":true,"kind":"function","modifiers":[],"name":"_callOnERC20Received","nameLocation":"28238:20:280","nodeType":"FunctionDefinition","parameters":{"id":30119,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30110,"mutability":"mutable","name":"sender","nameLocation":"28267:6:280","nodeType":"VariableDeclaration","scope":30138,"src":"28259:14:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30109,"name":"address","nodeType":"ElementaryTypeName","src":"28259:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":30112,"mutability":"mutable","name":"from","nameLocation":"28283:4:280","nodeType":"VariableDeclaration","scope":30138,"src":"28275:12:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30111,"name":"address","nodeType":"ElementaryTypeName","src":"28275:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":30114,"mutability":"mutable","name":"to","nameLocation":"28297:2:280","nodeType":"VariableDeclaration","scope":30138,"src":"28289:10:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30113,"name":"address","nodeType":"ElementaryTypeName","src":"28289:7:280","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":30116,"mutability":"mutable","name":"value","nameLocation":"28309:5:280","nodeType":"VariableDeclaration","scope":30138,"src":"28301:13:280","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":30115,"name":"uint256","nodeType":"ElementaryTypeName","src":"28301:7:280","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":30118,"mutability":"mutable","name":"data","nameLocation":"28329:4:280","nodeType":"VariableDeclaration","scope":30138,"src":"28316:17:280","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":30117,"name":"bytes","nodeType":"ElementaryTypeName","src":"28316:5:280","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"28258:76:280"},"returnParameters":{"id":30120,"nodeType":"ParameterList","parameters":[],"src":"28343:0:280"},"scope":30139,"src":"28229:252:280","stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"scope":30140,"src":"1532:26951:280","usedErrors":[],"usedEvents":[]}],"src":"32:28452:280"},"id":280},"contracts/token/ERC20/preset/ERC20FixedSupply.sol":{"ast":{"absolutePath":"contracts/token/ERC20/preset/ERC20FixedSupply.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC20":[26093],"ERC20BatchTransfers":[26113],"ERC20Detailed":[26168],"ERC20FixedSupply":[30257],"ERC20Metadata":[26196],"ERC20Permit":[26244],"ERC20SafeTransfers":[26299],"ERC20Storage":[30139],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"TokenRecovery":[19661]},"id":30258,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30141,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:281"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":30143,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":13387,"src":"57:87:281","symbolAliases":[{"foreign":{"id":30142,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../../../token/ERC20/libraries/ERC20Storage.sol","id":30145,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":30140,"src":"145:79:281","symbolAliases":[{"foreign":{"id":30144,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"153:12:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20.sol","file":"./../ERC20.sol","id":30147,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26094,"src":"225:37:281","symbolAliases":[{"foreign":{"id":30146,"name":"ERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26093,"src":"233:5:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Detailed.sol","file":"./../ERC20Detailed.sol","id":30149,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26169,"src":"263:53:281","symbolAliases":[{"foreign":{"id":30148,"name":"ERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26168,"src":"271:13:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Metadata.sol","file":"./../ERC20Metadata.sol","id":30151,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26197,"src":"317:53:281","symbolAliases":[{"foreign":{"id":30150,"name":"ERC20Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26196,"src":"325:13:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Permit.sol","file":"./../ERC20Permit.sol","id":30153,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26245,"src":"371:49:281","symbolAliases":[{"foreign":{"id":30152,"name":"ERC20Permit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26244,"src":"379:11:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20SafeTransfers.sol","file":"./../ERC20SafeTransfers.sol","id":30155,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26300,"src":"421:63:281","symbolAliases":[{"foreign":{"id":30154,"name":"ERC20SafeTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26299,"src":"429:18:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20BatchTransfers.sol","file":"./../ERC20BatchTransfers.sol","id":30157,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":26114,"src":"485:65:281","symbolAliases":[{"foreign":{"id":30156,"name":"ERC20BatchTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26113,"src":"493:19:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":30159,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":19662,"src":"551:68:281","symbolAliases":[{"foreign":{"id":30158,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"559:13:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":30161,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":7935,"src":"620:74:281","symbolAliases":[{"foreign":{"id":30160,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"628:17:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":30163,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":1207,"src":"695:66:281","symbolAliases":[{"foreign":{"id":30162,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"703:7:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":30165,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":13298,"src":"762:101:281","symbolAliases":[{"foreign":{"id":30164,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"770:28:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":30167,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30258,"sourceUnit":13143,"src":"864:88:281","symbolAliases":[{"foreign":{"id":30166,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"872:24:281","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":30169,"name":"ERC20","nameLocations":["1079:5:281"],"nodeType":"IdentifierPath","referencedDeclaration":26093,"src":"1079:5:281"},"id":30170,"nodeType":"InheritanceSpecifier","src":"1079:5:281"},{"baseName":{"id":30171,"name":"ERC20Detailed","nameLocations":["1090:13:281"],"nodeType":"IdentifierPath","referencedDeclaration":26168,"src":"1090:13:281"},"id":30172,"nodeType":"InheritanceSpecifier","src":"1090:13:281"},{"baseName":{"id":30173,"name":"ERC20Metadata","nameLocations":["1109:13:281"],"nodeType":"IdentifierPath","referencedDeclaration":26196,"src":"1109:13:281"},"id":30174,"nodeType":"InheritanceSpecifier","src":"1109:13:281"},{"baseName":{"id":30175,"name":"ERC20Permit","nameLocations":["1128:11:281"],"nodeType":"IdentifierPath","referencedDeclaration":26244,"src":"1128:11:281"},"id":30176,"nodeType":"InheritanceSpecifier","src":"1128:11:281"},{"baseName":{"id":30177,"name":"ERC20SafeTransfers","nameLocations":["1145:18:281"],"nodeType":"IdentifierPath","referencedDeclaration":26299,"src":"1145:18:281"},"id":30178,"nodeType":"InheritanceSpecifier","src":"1145:18:281"},{"baseName":{"id":30179,"name":"ERC20BatchTransfers","nameLocations":["1169:19:281"],"nodeType":"IdentifierPath","referencedDeclaration":26113,"src":"1169:19:281"},"id":30180,"nodeType":"InheritanceSpecifier","src":"1169:19:281"},{"baseName":{"id":30181,"name":"TokenRecovery","nameLocations":["1194:13:281"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1194:13:281"},"id":30182,"nodeType":"InheritanceSpecifier","src":"1194:13:281"},{"baseName":{"id":30183,"name":"ForwarderRegistryContext","nameLocations":["1213:24:281"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1213:24:281"},"id":30184,"nodeType":"InheritanceSpecifier","src":"1213:24:281"}],"canonicalName":"ERC20FixedSupply","contractDependencies":[],"contractKind":"contract","documentation":{"id":30168,"nodeType":"StructuredDocumentation","src":"954:92:281","text":"@title ERC20 Fungible Token Standard, fixed supply preset contract (immutable version)."},"fullyImplemented":true,"id":30257,"linearizedBaseContracts":[30257,13142,13370,13297,19661,26113,26565,26299,27006,26244,26931,26196,7934,26168,26707,27949,26093,11554,11579,8139,19810,26768,26492,1206,8562,19938,27893,28065,28017,27959,27863,27839],"name":"ERC20FixedSupply","nameLocation":"1055:16:281","nodeType":"ContractDefinition","nodes":[{"global":false,"id":30188,"libraryName":{"id":30185,"name":"ERC20Storage","nameLocations":["1250:12:281"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"1250:12:281"},"nodeType":"UsingForDirective","src":"1244:43:281","typeName":{"id":30187,"nodeType":"UserDefinedTypeName","pathNode":{"id":30186,"name":"ERC20Storage.Layout","nameLocations":["1267:12:281","1280:6:281"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"1267:19:281"},"referencedDeclaration":28678,"src":"1267:19:281","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"body":{"id":30227,"nodeType":"Block","src":"1653:70:281","statements":[{"expression":{"arguments":[{"id":30223,"name":"holders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30197,"src":"1695:7:281","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},{"id":30224,"name":"allocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30200,"src":"1704:11:281","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"},{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30218,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"1663:12:281","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30220,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1676:6:281","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"1663:19:281","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":30221,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1663:21:281","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30222,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1685:9:281","memberName":"batchMint","nodeType":"MemberAccess","referencedDeclaration":29811,"src":"1663:31:281","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":30225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1663:53:281","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30226,"nodeType":"ExpressionStatement","src":"1663:53:281"}]},"id":30228,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":30206,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30190,"src":"1540:9:281","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30207,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30192,"src":"1551:11:281","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30208,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30194,"src":"1564:13:281","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":30209,"kind":"baseConstructorSpecifier","modifierName":{"id":30205,"name":"ERC20Detailed","nameLocations":["1526:13:281"],"nodeType":"IdentifierPath","referencedDeclaration":26168,"src":"1526:13:281"},"nodeType":"ModifierInvocation","src":"1526:52:281"},{"arguments":[{"id":30211,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30203,"src":"1604:17:281","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":30212,"kind":"baseConstructorSpecifier","modifierName":{"id":30210,"name":"ForwarderRegistryContext","nameLocations":["1579:24:281"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1579:24:281"},"nodeType":"ModifierInvocation","src":"1579:43:281"},{"arguments":[{"expression":{"id":30214,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1641:3:281","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":30215,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1645:6:281","memberName":"sender","nodeType":"MemberAccess","src":"1641:10:281","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":30216,"kind":"baseConstructorSpecifier","modifierName":{"id":30213,"name":"ContractOwnership","nameLocations":["1623:17:281"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1623:17:281"},"nodeType":"ModifierInvocation","src":"1623:29:281"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30204,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30190,"mutability":"mutable","name":"tokenName","nameLocation":"1328:9:281","nodeType":"VariableDeclaration","scope":30228,"src":"1314:23:281","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30189,"name":"string","nodeType":"ElementaryTypeName","src":"1314:6:281","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30192,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1361:11:281","nodeType":"VariableDeclaration","scope":30228,"src":"1347:25:281","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30191,"name":"string","nodeType":"ElementaryTypeName","src":"1347:6:281","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30194,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1388:13:281","nodeType":"VariableDeclaration","scope":30228,"src":"1382:19:281","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":30193,"name":"uint8","nodeType":"ElementaryTypeName","src":"1382:5:281","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":30197,"mutability":"mutable","name":"holders","nameLocation":"1428:7:281","nodeType":"VariableDeclaration","scope":30228,"src":"1411:24:281","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":30195,"name":"address","nodeType":"ElementaryTypeName","src":"1411:7:281","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":30196,"nodeType":"ArrayTypeName","src":"1411:9:281","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":30200,"mutability":"mutable","name":"allocations","nameLocation":"1462:11:281","nodeType":"VariableDeclaration","scope":30228,"src":"1445:28:281","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":30198,"name":"uint256","nodeType":"ElementaryTypeName","src":"1445:7:281","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":30199,"nodeType":"ArrayTypeName","src":"1445:9:281","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":30203,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1502:17:281","nodeType":"VariableDeclaration","scope":30228,"src":"1483:36:281","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":30202,"nodeType":"UserDefinedTypeName","pathNode":{"id":30201,"name":"IForwarderRegistry","nameLocations":["1483:18:281"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1483:18:281"},"referencedDeclaration":13386,"src":"1483:18:281","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1304:221:281"},"returnParameters":{"id":30217,"nodeType":"ParameterList","parameters":[],"src":"1653:0:281"},"scope":30257,"src":"1293:430:281","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":30241,"nodeType":"Block","src":"1888:65:281","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30237,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1905:28:281","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30238,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1934:10:281","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1905:39:281","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30239,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1905:41:281","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":30236,"id":30240,"nodeType":"Return","src":"1898:48:281"}]},"documentation":{"id":30229,"nodeType":"StructuredDocumentation","src":"1729:44:281","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30242,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1787:10:281","nodeType":"FunctionDefinition","overrides":{"id":30233,"nodeType":"OverrideSpecifier","overrides":[{"id":30231,"name":"Context","nameLocations":["1831:7:281"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1831:7:281"},{"id":30232,"name":"ForwarderRegistryContextBase","nameLocations":["1840:28:281"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1840:28:281"}],"src":"1822:47:281"},"parameters":{"id":30230,"nodeType":"ParameterList","parameters":[],"src":"1797:2:281"},"returnParameters":{"id":30236,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30235,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30242,"src":"1879:7:281","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30234,"name":"address","nodeType":"ElementaryTypeName","src":"1879:7:281","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1878:9:281"},"scope":30257,"src":"1778:175:281","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":30255,"nodeType":"Block","src":"2123:63:281","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30251,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2140:28:281","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30252,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2169:8:281","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2140:37:281","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":30253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2140:39:281","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":30250,"id":30254,"nodeType":"Return","src":"2133:46:281"}]},"documentation":{"id":30243,"nodeType":"StructuredDocumentation","src":"1959:44:281","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30256,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2017:8:281","nodeType":"FunctionDefinition","overrides":{"id":30247,"nodeType":"OverrideSpecifier","overrides":[{"id":30245,"name":"Context","nameLocations":["2059:7:281"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2059:7:281"},{"id":30246,"name":"ForwarderRegistryContextBase","nameLocations":["2068:28:281"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2068:28:281"}],"src":"2050:47:281"},"parameters":{"id":30244,"nodeType":"ParameterList","parameters":[],"src":"2025:2:281"},"returnParameters":{"id":30250,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30249,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30256,"src":"2107:14:281","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":30248,"name":"bytes","nodeType":"ElementaryTypeName","src":"2107:5:281","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2106:16:281"},"scope":30257,"src":"2008:178:281","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":30258,"src":"1046:1142:281","usedErrors":[464,1216,1219,7886,8246,11559,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8287,27102,27111]}],"src":"32:2157:281"},"id":281},"contracts/token/ERC20/preset/ERC20MintBurn.sol":{"ast":{"absolutePath":"contracts/token/ERC20/preset/ERC20MintBurn.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC20":[26093],"ERC20BatchTransfers":[26113],"ERC20Burnable":[26133],"ERC20Detailed":[26168],"ERC20Metadata":[26196],"ERC20MintBurn":[30362],"ERC20Mintable":[26220],"ERC20Permit":[26244],"ERC20SafeTransfers":[26299],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"TokenRecovery":[19661]},"id":30363,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30259,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:282"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":30261,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":13387,"src":"57:87:282","symbolAliases":[{"foreign":{"id":30260,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20.sol","file":"./../ERC20.sol","id":30263,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26094,"src":"145:37:282","symbolAliases":[{"foreign":{"id":30262,"name":"ERC20","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26093,"src":"153:5:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Detailed.sol","file":"./../ERC20Detailed.sol","id":30265,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26169,"src":"183:53:282","symbolAliases":[{"foreign":{"id":30264,"name":"ERC20Detailed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26168,"src":"191:13:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Metadata.sol","file":"./../ERC20Metadata.sol","id":30267,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26197,"src":"237:53:282","symbolAliases":[{"foreign":{"id":30266,"name":"ERC20Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26196,"src":"245:13:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Permit.sol","file":"./../ERC20Permit.sol","id":30269,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26245,"src":"291:49:282","symbolAliases":[{"foreign":{"id":30268,"name":"ERC20Permit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26244,"src":"299:11:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20SafeTransfers.sol","file":"./../ERC20SafeTransfers.sol","id":30271,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26300,"src":"341:63:282","symbolAliases":[{"foreign":{"id":30270,"name":"ERC20SafeTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26299,"src":"349:18:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20BatchTransfers.sol","file":"./../ERC20BatchTransfers.sol","id":30273,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26114,"src":"405:65:282","symbolAliases":[{"foreign":{"id":30272,"name":"ERC20BatchTransfers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26113,"src":"413:19:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Mintable.sol","file":"./../ERC20Mintable.sol","id":30275,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26221,"src":"471:53:282","symbolAliases":[{"foreign":{"id":30274,"name":"ERC20Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26220,"src":"479:13:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/ERC20Burnable.sol","file":"./../ERC20Burnable.sol","id":30277,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":26134,"src":"525:53:282","symbolAliases":[{"foreign":{"id":30276,"name":"ERC20Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26133,"src":"533:13:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":30279,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":19662,"src":"579:68:282","symbolAliases":[{"foreign":{"id":30278,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"587:13:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":30281,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":7935,"src":"648:74:282","symbolAliases":[{"foreign":{"id":30280,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"656:17:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":30283,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":1207,"src":"723:66:282","symbolAliases":[{"foreign":{"id":30282,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"731:7:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":30285,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":13298,"src":"790:101:282","symbolAliases":[{"foreign":{"id":30284,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"798:28:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":30287,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30363,"sourceUnit":13143,"src":"892:88:282","symbolAliases":[{"foreign":{"id":30286,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"900:24:282","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":30289,"name":"ERC20","nameLocations":["1113:5:282"],"nodeType":"IdentifierPath","referencedDeclaration":26093,"src":"1113:5:282"},"id":30290,"nodeType":"InheritanceSpecifier","src":"1113:5:282"},{"baseName":{"id":30291,"name":"ERC20Detailed","nameLocations":["1124:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":26168,"src":"1124:13:282"},"id":30292,"nodeType":"InheritanceSpecifier","src":"1124:13:282"},{"baseName":{"id":30293,"name":"ERC20Metadata","nameLocations":["1143:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":26196,"src":"1143:13:282"},"id":30294,"nodeType":"InheritanceSpecifier","src":"1143:13:282"},{"baseName":{"id":30295,"name":"ERC20Permit","nameLocations":["1162:11:282"],"nodeType":"IdentifierPath","referencedDeclaration":26244,"src":"1162:11:282"},"id":30296,"nodeType":"InheritanceSpecifier","src":"1162:11:282"},{"baseName":{"id":30297,"name":"ERC20SafeTransfers","nameLocations":["1179:18:282"],"nodeType":"IdentifierPath","referencedDeclaration":26299,"src":"1179:18:282"},"id":30298,"nodeType":"InheritanceSpecifier","src":"1179:18:282"},{"baseName":{"id":30299,"name":"ERC20BatchTransfers","nameLocations":["1203:19:282"],"nodeType":"IdentifierPath","referencedDeclaration":26113,"src":"1203:19:282"},"id":30300,"nodeType":"InheritanceSpecifier","src":"1203:19:282"},{"baseName":{"id":30301,"name":"ERC20Mintable","nameLocations":["1228:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":26220,"src":"1228:13:282"},"id":30302,"nodeType":"InheritanceSpecifier","src":"1228:13:282"},{"baseName":{"id":30303,"name":"ERC20Burnable","nameLocations":["1247:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":26133,"src":"1247:13:282"},"id":30304,"nodeType":"InheritanceSpecifier","src":"1247:13:282"},{"baseName":{"id":30305,"name":"TokenRecovery","nameLocations":["1266:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1266:13:282"},"id":30306,"nodeType":"InheritanceSpecifier","src":"1266:13:282"},{"baseName":{"id":30307,"name":"ForwarderRegistryContext","nameLocations":["1285:24:282"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1285:24:282"},"id":30308,"nodeType":"InheritanceSpecifier","src":"1285:24:282"}],"canonicalName":"ERC20MintBurn","contractDependencies":[],"contractKind":"contract","documentation":{"id":30288,"nodeType":"StructuredDocumentation","src":"982:101:282","text":"@title ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version)."},"fullyImplemented":true,"id":30362,"linearizedBaseContracts":[30362,13142,13370,13297,19661,26133,26654,26220,7901,26113,26565,26299,27006,26244,26931,26196,7934,26168,26707,27949,26093,11554,11579,8139,19810,8091,26853,26768,26492,1206,8562,19938,27927,8546,27981,27893,28065,28017,27959,27863,27839],"name":"ERC20MintBurn","nameLocation":"1092:13:282","nodeType":"ContractDefinition","nodes":[{"body":{"id":30332,"nodeType":"Block","src":"1604:2:282","statements":[]},"id":30333,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":30320,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30310,"src":"1491:9:282","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30321,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30312,"src":"1502:11:282","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30322,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30314,"src":"1515:13:282","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"id":30323,"kind":"baseConstructorSpecifier","modifierName":{"id":30319,"name":"ERC20Detailed","nameLocations":["1477:13:282"],"nodeType":"IdentifierPath","referencedDeclaration":26168,"src":"1477:13:282"},"nodeType":"ModifierInvocation","src":"1477:52:282"},{"arguments":[{"id":30325,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30317,"src":"1555:17:282","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":30326,"kind":"baseConstructorSpecifier","modifierName":{"id":30324,"name":"ForwarderRegistryContext","nameLocations":["1530:24:282"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1530:24:282"},"nodeType":"ModifierInvocation","src":"1530:43:282"},{"arguments":[{"expression":{"id":30328,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1592:3:282","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":30329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1596:6:282","memberName":"sender","nodeType":"MemberAccess","src":"1592:10:282","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":30330,"kind":"baseConstructorSpecifier","modifierName":{"id":30327,"name":"ContractOwnership","nameLocations":["1574:17:282"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1574:17:282"},"nodeType":"ModifierInvocation","src":"1574:29:282"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30318,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30310,"mutability":"mutable","name":"tokenName","nameLocation":"1351:9:282","nodeType":"VariableDeclaration","scope":30333,"src":"1337:23:282","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30309,"name":"string","nodeType":"ElementaryTypeName","src":"1337:6:282","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30312,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1384:11:282","nodeType":"VariableDeclaration","scope":30333,"src":"1370:25:282","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30311,"name":"string","nodeType":"ElementaryTypeName","src":"1370:6:282","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30314,"mutability":"mutable","name":"tokenDecimals","nameLocation":"1411:13:282","nodeType":"VariableDeclaration","scope":30333,"src":"1405:19:282","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":30313,"name":"uint8","nodeType":"ElementaryTypeName","src":"1405:5:282","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":30317,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1453:17:282","nodeType":"VariableDeclaration","scope":30333,"src":"1434:36:282","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":30316,"nodeType":"UserDefinedTypeName","pathNode":{"id":30315,"name":"IForwarderRegistry","nameLocations":["1434:18:282"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1434:18:282"},"referencedDeclaration":13386,"src":"1434:18:282","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1327:149:282"},"returnParameters":{"id":30331,"nodeType":"ParameterList","parameters":[],"src":"1604:0:282"},"scope":30362,"src":"1316:290:282","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":30346,"nodeType":"Block","src":"1771:65:282","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30342,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1788:28:282","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1817:10:282","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1788:39:282","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30344,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1788:41:282","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":30341,"id":30345,"nodeType":"Return","src":"1781:48:282"}]},"documentation":{"id":30334,"nodeType":"StructuredDocumentation","src":"1612:44:282","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30347,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1670:10:282","nodeType":"FunctionDefinition","overrides":{"id":30338,"nodeType":"OverrideSpecifier","overrides":[{"id":30336,"name":"Context","nameLocations":["1714:7:282"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1714:7:282"},{"id":30337,"name":"ForwarderRegistryContextBase","nameLocations":["1723:28:282"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1723:28:282"}],"src":"1705:47:282"},"parameters":{"id":30335,"nodeType":"ParameterList","parameters":[],"src":"1680:2:282"},"returnParameters":{"id":30341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30340,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30347,"src":"1762:7:282","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30339,"name":"address","nodeType":"ElementaryTypeName","src":"1762:7:282","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1761:9:282"},"scope":30362,"src":"1661:175:282","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":30360,"nodeType":"Block","src":"2006:63:282","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30356,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2023:28:282","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2052:8:282","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2023:37:282","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":30358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2023:39:282","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":30355,"id":30359,"nodeType":"Return","src":"2016:46:282"}]},"documentation":{"id":30348,"nodeType":"StructuredDocumentation","src":"1842:44:282","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30361,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1900:8:282","nodeType":"FunctionDefinition","overrides":{"id":30352,"nodeType":"OverrideSpecifier","overrides":[{"id":30350,"name":"Context","nameLocations":["1942:7:282"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1942:7:282"},{"id":30351,"name":"ForwarderRegistryContextBase","nameLocations":["1951:28:282"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1951:28:282"}],"src":"1933:47:282"},"parameters":{"id":30349,"nodeType":"ParameterList","parameters":[],"src":"1908:2:282"},"returnParameters":{"id":30355,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30354,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30361,"src":"1990:14:282","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":30353,"name":"bytes","nodeType":"ElementaryTypeName","src":"1990:5:282","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1989:16:282"},"scope":30362,"src":"1891:178:282","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":30363,"src":"1083:988:282","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8269,8278,8287,27102,27111]}],"src":"32:2040:282"},"id":282},"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC20Base":[26492],"ERC20BatchTransfersBase":[26565],"ERC20DetailedBase":[26707],"ERC20DetailedStorage":[28291],"ERC20FixedSupplyProxied":[30541],"ERC20MetadataBase":[26768],"ERC20MetadataStorage":[28380],"ERC20PermitBase":[26931],"ERC20PermitStorage":[28612],"ERC20SafeTransfersBase":[27006],"ERC20Storage":[30139],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"InterfaceDetection":[11554],"TokenRecoveryBase":[19810]},"id":30542,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30364,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:283"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":30366,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":13387,"src":"57:90:283","symbolAliases":[{"foreign":{"id":30365,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../../../../token/ERC20/libraries/ERC20Storage.sol","id":30368,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":30140,"src":"148:82:283","symbolAliases":[{"foreign":{"id":30367,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"156:12:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol","id":30370,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":28292,"src":"231:98:283","symbolAliases":[{"foreign":{"id":30369,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"239:20:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol","id":30372,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":28381,"src":"330:98:283","symbolAliases":[{"foreign":{"id":30371,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"338:20:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol","id":30374,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":28613,"src":"429:94:283","symbolAliases":[{"foreign":{"id":30373,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"437:18:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":30376,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":9110,"src":"524:101:283","symbolAliases":[{"foreign":{"id":30375,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"532:24:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20Base.sol","file":"./../../base/ERC20Base.sol","id":30378,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":26493,"src":"626:53:283","symbolAliases":[{"foreign":{"id":30377,"name":"ERC20Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26492,"src":"634:9:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20DetailedBase.sol","file":"./../../base/ERC20DetailedBase.sol","id":30380,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":26708,"src":"680:69:283","symbolAliases":[{"foreign":{"id":30379,"name":"ERC20DetailedBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26707,"src":"688:17:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MetadataBase.sol","file":"./../../base/ERC20MetadataBase.sol","id":30382,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":26769,"src":"750:69:283","symbolAliases":[{"foreign":{"id":30381,"name":"ERC20MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26768,"src":"758:17:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20PermitBase.sol","file":"./../../base/ERC20PermitBase.sol","id":30384,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":26932,"src":"820:65:283","symbolAliases":[{"foreign":{"id":30383,"name":"ERC20PermitBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26931,"src":"828:15:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol","file":"./../../base/ERC20SafeTransfersBase.sol","id":30386,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":27007,"src":"886:79:283","symbolAliases":[{"foreign":{"id":30385,"name":"ERC20SafeTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27006,"src":"894:22:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol","file":"./../../base/ERC20BatchTransfersBase.sol","id":30388,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":26566,"src":"966:81:283","symbolAliases":[{"foreign":{"id":30387,"name":"ERC20BatchTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26565,"src":"974:23:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":30390,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":19811,"src":"1048:84:283","symbolAliases":[{"foreign":{"id":30389,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1056:17:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":30392,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":8140,"src":"1133:90:283","symbolAliases":[{"foreign":{"id":30391,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1141:21:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":30394,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":11555,"src":"1224:86:283","symbolAliases":[{"foreign":{"id":30393,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1232:18:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":30396,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":1207,"src":"1311:66:283","symbolAliases":[{"foreign":{"id":30395,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1319:7:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":30398,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":13298,"src":"1378:104:283","symbolAliases":[{"foreign":{"id":30397,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1386:28:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":30400,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30542,"sourceUnit":13143,"src":"1483:91:283","symbolAliases":[{"foreign":{"id":30399,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1491:24:283","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":30402,"name":"ERC20Base","nameLocations":["1706:9:283"],"nodeType":"IdentifierPath","referencedDeclaration":26492,"src":"1706:9:283"},"id":30403,"nodeType":"InheritanceSpecifier","src":"1706:9:283"},{"baseName":{"id":30404,"name":"ERC20DetailedBase","nameLocations":["1721:17:283"],"nodeType":"IdentifierPath","referencedDeclaration":26707,"src":"1721:17:283"},"id":30405,"nodeType":"InheritanceSpecifier","src":"1721:17:283"},{"baseName":{"id":30406,"name":"ERC20MetadataBase","nameLocations":["1744:17:283"],"nodeType":"IdentifierPath","referencedDeclaration":26768,"src":"1744:17:283"},"id":30407,"nodeType":"InheritanceSpecifier","src":"1744:17:283"},{"baseName":{"id":30408,"name":"ERC20PermitBase","nameLocations":["1767:15:283"],"nodeType":"IdentifierPath","referencedDeclaration":26931,"src":"1767:15:283"},"id":30409,"nodeType":"InheritanceSpecifier","src":"1767:15:283"},{"baseName":{"id":30410,"name":"ERC20SafeTransfersBase","nameLocations":["1788:22:283"],"nodeType":"IdentifierPath","referencedDeclaration":27006,"src":"1788:22:283"},"id":30411,"nodeType":"InheritanceSpecifier","src":"1788:22:283"},{"baseName":{"id":30412,"name":"ERC20BatchTransfersBase","nameLocations":["1816:23:283"],"nodeType":"IdentifierPath","referencedDeclaration":26565,"src":"1816:23:283"},"id":30413,"nodeType":"InheritanceSpecifier","src":"1816:23:283"},{"baseName":{"id":30414,"name":"InterfaceDetection","nameLocations":["1845:18:283"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"1845:18:283"},"id":30415,"nodeType":"InheritanceSpecifier","src":"1845:18:283"},{"baseName":{"id":30416,"name":"TokenRecoveryBase","nameLocations":["1869:17:283"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"1869:17:283"},"id":30417,"nodeType":"InheritanceSpecifier","src":"1869:17:283"},{"baseName":{"id":30418,"name":"ContractOwnershipBase","nameLocations":["1892:21:283"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"1892:21:283"},"id":30419,"nodeType":"InheritanceSpecifier","src":"1892:21:283"},{"baseName":{"id":30420,"name":"ForwarderRegistryContext","nameLocations":["1919:24:283"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1919:24:283"},"id":30421,"nodeType":"InheritanceSpecifier","src":"1919:24:283"}],"canonicalName":"ERC20FixedSupplyProxied","contractDependencies":[],"contractKind":"contract","documentation":{"id":30401,"nodeType":"StructuredDocumentation","src":"1576:90:283","text":"@title ERC20 Fungible Token Standard, fixed supply preset contract (proxied version)."},"fullyImplemented":true,"id":30541,"linearizedBaseContracts":[30541,13142,13370,13297,8139,19810,11554,11579,26565,27006,26931,26768,26707,27949,26492,1206,8562,19938,27893,28065,28017,27959,27863,27839],"name":"ERC20FixedSupplyProxied","nameLocation":"1675:23:283","nodeType":"ContractDefinition","nodes":[{"global":false,"id":30425,"libraryName":{"id":30422,"name":"ERC20Storage","nameLocations":["1956:12:283"],"nodeType":"IdentifierPath","referencedDeclaration":30139,"src":"1956:12:283"},"nodeType":"UsingForDirective","src":"1950:43:283","typeName":{"id":30424,"nodeType":"UserDefinedTypeName","pathNode":{"id":30423,"name":"ERC20Storage.Layout","nameLocations":["1973:12:283","1986:6:283"],"nodeType":"IdentifierPath","referencedDeclaration":28678,"src":"1973:19:283"},"referencedDeclaration":28678,"src":"1973:19:283","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout"}}},{"global":false,"id":30429,"libraryName":{"id":30426,"name":"ERC20DetailedStorage","nameLocations":["2004:20:283"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"2004:20:283"},"nodeType":"UsingForDirective","src":"1998:59:283","typeName":{"id":30428,"nodeType":"UserDefinedTypeName","pathNode":{"id":30427,"name":"ERC20DetailedStorage.Layout","nameLocations":["2029:20:283","2050:6:283"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"2029:27:283"},"referencedDeclaration":28118,"src":"2029:27:283","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"global":false,"id":30433,"libraryName":{"id":30430,"name":"ContractOwnershipStorage","nameLocations":["2068:24:283"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2068:24:283"},"nodeType":"UsingForDirective","src":"2062:67:283","typeName":{"id":30432,"nodeType":"UserDefinedTypeName","pathNode":{"id":30431,"name":"ContractOwnershipStorage.Layout","nameLocations":["2097:24:283","2122:6:283"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2097:31:283"},"referencedDeclaration":8882,"src":"2097:31:283","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":30442,"nodeType":"Block","src":"2229:2:283","statements":[]},"id":30443,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":30439,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30436,"src":"2210:17:283","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":30440,"kind":"baseConstructorSpecifier","modifierName":{"id":30438,"name":"ForwarderRegistryContext","nameLocations":["2185:24:283"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2185:24:283"},"nodeType":"ModifierInvocation","src":"2185:43:283"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30437,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30436,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2166:17:283","nodeType":"VariableDeclaration","scope":30443,"src":"2147:36:283","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":30435,"nodeType":"UserDefinedTypeName","pathNode":{"id":30434,"name":"IForwarderRegistry","nameLocations":["2147:18:283"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2147:18:283"},"referencedDeclaration":13386,"src":"2147:18:283","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2146:38:283"},"returnParameters":{"id":30441,"nodeType":"ParameterList","parameters":[],"src":"2229:0:283"},"scope":30541,"src":"2135:96:283","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":30511,"nodeType":"Block","src":"2443:421:283","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":30463,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[30526],"referencedDeclaration":30526,"src":"2497:10:283","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30464,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2497:12:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30458,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2453:24:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":30460,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2478:6:283","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2453:31:283","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":30461,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2453:33:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":30462,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2487:9:283","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2453:43:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":30465,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2453:57:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30466,"nodeType":"ExpressionStatement","src":"2453:57:283"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30467,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2520:12:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30469,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2533:4:283","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28743,"src":"2520:17:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30470,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2520:19:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30471,"nodeType":"ExpressionStatement","src":"2520:19:283"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30472,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2549:12:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30474,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2562:23:283","memberName":"initERC20BatchTransfers","nodeType":"MemberAccess","referencedDeclaration":28788,"src":"2549:36:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30475,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2549:38:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30476,"nodeType":"ExpressionStatement","src":"2549:38:283"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30477,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2597:12:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30479,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2610:22:283","memberName":"initERC20SafeTransfers","nodeType":"MemberAccess","referencedDeclaration":28805,"src":"2597:35:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2597:37:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30481,"nodeType":"ExpressionStatement","src":"2597:37:283"},{"expression":{"arguments":[{"id":30487,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30445,"src":"2684:9:283","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":30488,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30447,"src":"2695:11:283","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":30489,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30449,"src":"2708:13:283","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30482,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"2644:20:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":30484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2665:6:283","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"2644:27:283","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":30485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2644:29:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":30486,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2674:9:283","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":28239,"src":"2644:39:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28118_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_uint8_$returns$__$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer,string calldata,string calldata,uint8)"}},"id":30490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2644:78:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30491,"nodeType":"ExpressionStatement","src":"2644:78:283"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30492,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"2732:20:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":30494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2753:4:283","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28338,"src":"2732:25:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2732:27:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30496,"nodeType":"ExpressionStatement","src":"2732:27:283"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30497,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"2769:18:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":30499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2788:4:283","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28446,"src":"2769:23:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30500,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2769:25:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30501,"nodeType":"ExpressionStatement","src":"2769:25:283"},{"expression":{"arguments":[{"id":30507,"name":"holders","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30452,"src":"2836:7:283","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":30508,"name":"allocations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30455,"src":"2845:11:283","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30502,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2804:12:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2817:6:283","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":30107,"src":"2804:19:283","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function () pure returns (struct ERC20Storage.Layout storage pointer)"}},"id":30505,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2804:21:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28678_storage_ptr","typeString":"struct ERC20Storage.Layout storage pointer"}},"id":30506,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2826:9:283","memberName":"batchMint","nodeType":"MemberAccess","referencedDeclaration":29811,"src":"2804:31:283","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28678_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$28678_storage_ptr_$","typeString":"function (struct ERC20Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":30509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2804:53:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30510,"nodeType":"ExpressionStatement","src":"2804:53:283"}]},"functionSelector":"8a6d57b6","id":30512,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2246:4:283","nodeType":"FunctionDefinition","parameters":{"id":30456,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30445,"mutability":"mutable","name":"tokenName","nameLocation":"2276:9:283","nodeType":"VariableDeclaration","scope":30512,"src":"2260:25:283","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":30444,"name":"string","nodeType":"ElementaryTypeName","src":"2260:6:283","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30447,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2311:11:283","nodeType":"VariableDeclaration","scope":30512,"src":"2295:27:283","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":30446,"name":"string","nodeType":"ElementaryTypeName","src":"2295:6:283","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30449,"mutability":"mutable","name":"tokenDecimals","nameLocation":"2338:13:283","nodeType":"VariableDeclaration","scope":30512,"src":"2332:19:283","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":30448,"name":"uint8","nodeType":"ElementaryTypeName","src":"2332:5:283","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":30452,"mutability":"mutable","name":"holders","nameLocation":"2380:7:283","nodeType":"VariableDeclaration","scope":30512,"src":"2361:26:283","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":30450,"name":"address","nodeType":"ElementaryTypeName","src":"2361:7:283","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":30451,"nodeType":"ArrayTypeName","src":"2361:9:283","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":30455,"mutability":"mutable","name":"allocations","nameLocation":"2416:11:283","nodeType":"VariableDeclaration","scope":30512,"src":"2397:30:283","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":30453,"name":"uint256","nodeType":"ElementaryTypeName","src":"2397:7:283","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":30454,"nodeType":"ArrayTypeName","src":"2397:9:283","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2250:183:283"},"returnParameters":{"id":30457,"nodeType":"ParameterList","parameters":[],"src":"2443:0:283"},"scope":30541,"src":"2237:627:283","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":30525,"nodeType":"Block","src":"3029:65:283","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30521,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3046:28:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30522,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3075:10:283","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3046:39:283","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30523,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3046:41:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":30520,"id":30524,"nodeType":"Return","src":"3039:48:283"}]},"documentation":{"id":30513,"nodeType":"StructuredDocumentation","src":"2870:44:283","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30526,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"2928:10:283","nodeType":"FunctionDefinition","overrides":{"id":30517,"nodeType":"OverrideSpecifier","overrides":[{"id":30515,"name":"Context","nameLocations":["2972:7:283"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2972:7:283"},{"id":30516,"name":"ForwarderRegistryContextBase","nameLocations":["2981:28:283"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2981:28:283"}],"src":"2963:47:283"},"parameters":{"id":30514,"nodeType":"ParameterList","parameters":[],"src":"2938:2:283"},"returnParameters":{"id":30520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30519,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30526,"src":"3020:7:283","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30518,"name":"address","nodeType":"ElementaryTypeName","src":"3020:7:283","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3019:9:283"},"scope":30541,"src":"2919:175:283","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":30539,"nodeType":"Block","src":"3264:63:283","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30535,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3281:28:283","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3310:8:283","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3281:37:283","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":30537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3281:39:283","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":30534,"id":30538,"nodeType":"Return","src":"3274:46:283"}]},"documentation":{"id":30527,"nodeType":"StructuredDocumentation","src":"3100:44:283","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30540,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3158:8:283","nodeType":"FunctionDefinition","overrides":{"id":30531,"nodeType":"OverrideSpecifier","overrides":[{"id":30529,"name":"Context","nameLocations":["3200:7:283"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3200:7:283"},{"id":30530,"name":"ForwarderRegistryContextBase","nameLocations":["3209:28:283"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3209:28:283"}],"src":"3191:47:283"},"parameters":{"id":30528,"nodeType":"ParameterList","parameters":[],"src":"3166:2:283"},"returnParameters":{"id":30534,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30533,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30540,"src":"3248:14:283","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":30532,"name":"bytes","nodeType":"ElementaryTypeName","src":"3248:5:283","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3247:16:283"},"scope":30541,"src":"3149:178:283","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":30542,"src":"1666:1663:283","usedErrors":[464,1216,1219,7886,8246,11559,19192,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8287,27102,27111]}],"src":"32:3298:283"},"id":283},"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC20Base":[26492],"ERC20BatchTransfersBase":[26565],"ERC20BurnableBase":[26654],"ERC20DetailedBase":[26707],"ERC20DetailedStorage":[28291],"ERC20MetadataBase":[26768],"ERC20MetadataStorage":[28380],"ERC20MintBurnProxied":[30723],"ERC20MintableBase":[26853],"ERC20PermitBase":[26931],"ERC20PermitStorage":[28612],"ERC20SafeTransfersBase":[27006],"ERC20Storage":[30139],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"InterfaceDetection":[11554],"TokenRecoveryBase":[19810]},"id":30724,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30543,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:284"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":30545,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":13387,"src":"57:90:284","symbolAliases":[{"foreign":{"id":30544,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20Storage.sol","file":"./../../../../token/ERC20/libraries/ERC20Storage.sol","id":30547,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":30140,"src":"148:82:284","symbolAliases":[{"foreign":{"id":30546,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"156:12:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol","id":30549,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":28292,"src":"231:98:284","symbolAliases":[{"foreign":{"id":30548,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"239:20:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol","id":30551,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":28381,"src":"330:98:284","symbolAliases":[{"foreign":{"id":30550,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"338:20:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/libraries/ERC20PermitStorage.sol","file":"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol","id":30553,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":28613,"src":"429:94:284","symbolAliases":[{"foreign":{"id":30552,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"437:18:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":30555,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":9110,"src":"524:101:284","symbolAliases":[{"foreign":{"id":30554,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"532:24:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20Base.sol","file":"./../../base/ERC20Base.sol","id":30557,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26493,"src":"626:53:284","symbolAliases":[{"foreign":{"id":30556,"name":"ERC20Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26492,"src":"634:9:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20DetailedBase.sol","file":"./../../base/ERC20DetailedBase.sol","id":30559,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26708,"src":"680:69:284","symbolAliases":[{"foreign":{"id":30558,"name":"ERC20DetailedBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26707,"src":"688:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MetadataBase.sol","file":"./../../base/ERC20MetadataBase.sol","id":30561,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26769,"src":"750:69:284","symbolAliases":[{"foreign":{"id":30560,"name":"ERC20MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26768,"src":"758:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20PermitBase.sol","file":"./../../base/ERC20PermitBase.sol","id":30563,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26932,"src":"820:65:284","symbolAliases":[{"foreign":{"id":30562,"name":"ERC20PermitBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26931,"src":"828:15:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol","file":"./../../base/ERC20SafeTransfersBase.sol","id":30565,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":27007,"src":"886:79:284","symbolAliases":[{"foreign":{"id":30564,"name":"ERC20SafeTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":27006,"src":"894:22:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol","file":"./../../base/ERC20BatchTransfersBase.sol","id":30567,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26566,"src":"966:81:284","symbolAliases":[{"foreign":{"id":30566,"name":"ERC20BatchTransfersBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26565,"src":"974:23:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20MintableBase.sol","file":"./../../base/ERC20MintableBase.sol","id":30569,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26854,"src":"1048:69:284","symbolAliases":[{"foreign":{"id":30568,"name":"ERC20MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26853,"src":"1056:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC20/base/ERC20BurnableBase.sol","file":"./../../base/ERC20BurnableBase.sol","id":30571,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":26655,"src":"1118:69:284","symbolAliases":[{"foreign":{"id":30570,"name":"ERC20BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":26654,"src":"1126:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":30573,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":19811,"src":"1188:84:284","symbolAliases":[{"foreign":{"id":30572,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1196:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":30575,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":8140,"src":"1273:90:284","symbolAliases":[{"foreign":{"id":30574,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1281:21:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":30577,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":8092,"src":"1364:82:284","symbolAliases":[{"foreign":{"id":30576,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1372:17:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":30579,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":11555,"src":"1447:86:284","symbolAliases":[{"foreign":{"id":30578,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1455:18:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":30581,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":1207,"src":"1534:66:284","symbolAliases":[{"foreign":{"id":30580,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1542:7:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":30583,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":13298,"src":"1601:104:284","symbolAliases":[{"foreign":{"id":30582,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1609:28:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":30585,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30724,"sourceUnit":13143,"src":"1706:91:284","symbolAliases":[{"foreign":{"id":30584,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1714:24:284","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":30587,"name":"ERC20Base","nameLocations":["1935:9:284"],"nodeType":"IdentifierPath","referencedDeclaration":26492,"src":"1935:9:284"},"id":30588,"nodeType":"InheritanceSpecifier","src":"1935:9:284"},{"baseName":{"id":30589,"name":"ERC20DetailedBase","nameLocations":["1950:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":26707,"src":"1950:17:284"},"id":30590,"nodeType":"InheritanceSpecifier","src":"1950:17:284"},{"baseName":{"id":30591,"name":"ERC20PermitBase","nameLocations":["1973:15:284"],"nodeType":"IdentifierPath","referencedDeclaration":26931,"src":"1973:15:284"},"id":30592,"nodeType":"InheritanceSpecifier","src":"1973:15:284"},{"baseName":{"id":30593,"name":"ERC20MetadataBase","nameLocations":["1994:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":26768,"src":"1994:17:284"},"id":30594,"nodeType":"InheritanceSpecifier","src":"1994:17:284"},{"baseName":{"id":30595,"name":"ERC20SafeTransfersBase","nameLocations":["2017:22:284"],"nodeType":"IdentifierPath","referencedDeclaration":27006,"src":"2017:22:284"},"id":30596,"nodeType":"InheritanceSpecifier","src":"2017:22:284"},{"baseName":{"id":30597,"name":"ERC20BatchTransfersBase","nameLocations":["2045:23:284"],"nodeType":"IdentifierPath","referencedDeclaration":26565,"src":"2045:23:284"},"id":30598,"nodeType":"InheritanceSpecifier","src":"2045:23:284"},{"baseName":{"id":30599,"name":"ERC20MintableBase","nameLocations":["2074:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":26853,"src":"2074:17:284"},"id":30600,"nodeType":"InheritanceSpecifier","src":"2074:17:284"},{"baseName":{"id":30601,"name":"ERC20BurnableBase","nameLocations":["2097:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":26654,"src":"2097:17:284"},"id":30602,"nodeType":"InheritanceSpecifier","src":"2097:17:284"},{"baseName":{"id":30603,"name":"AccessControlBase","nameLocations":["2120:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2120:17:284"},"id":30604,"nodeType":"InheritanceSpecifier","src":"2120:17:284"},{"baseName":{"id":30605,"name":"InterfaceDetection","nameLocations":["2143:18:284"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2143:18:284"},"id":30606,"nodeType":"InheritanceSpecifier","src":"2143:18:284"},{"baseName":{"id":30607,"name":"TokenRecoveryBase","nameLocations":["2167:17:284"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2167:17:284"},"id":30608,"nodeType":"InheritanceSpecifier","src":"2167:17:284"},{"baseName":{"id":30609,"name":"ContractOwnershipBase","nameLocations":["2190:21:284"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2190:21:284"},"id":30610,"nodeType":"InheritanceSpecifier","src":"2190:21:284"},{"baseName":{"id":30611,"name":"ForwarderRegistryContext","nameLocations":["2217:24:284"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2217:24:284"},"id":30612,"nodeType":"InheritanceSpecifier","src":"2217:24:284"}],"canonicalName":"ERC20MintBurnProxied","contractDependencies":[],"contractKind":"contract","documentation":{"id":30586,"nodeType":"StructuredDocumentation","src":"1799:99:284","text":"@title ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version)."},"fullyImplemented":true,"id":30723,"linearizedBaseContracts":[30723,13142,13370,13297,8139,19810,11554,11579,8091,26654,26853,26565,27006,26768,26931,26707,27949,26492,1206,8562,19938,8546,27927,27981,27893,28065,27959,28017,27863,27839],"name":"ERC20MintBurnProxied","nameLocation":"1907:20:284","nodeType":"ContractDefinition","nodes":[{"global":false,"id":30616,"libraryName":{"id":30613,"name":"ERC20DetailedStorage","nameLocations":["2254:20:284"],"nodeType":"IdentifierPath","referencedDeclaration":28291,"src":"2254:20:284"},"nodeType":"UsingForDirective","src":"2248:59:284","typeName":{"id":30615,"nodeType":"UserDefinedTypeName","pathNode":{"id":30614,"name":"ERC20DetailedStorage.Layout","nameLocations":["2279:20:284","2300:6:284"],"nodeType":"IdentifierPath","referencedDeclaration":28118,"src":"2279:27:284"},"referencedDeclaration":28118,"src":"2279:27:284","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout"}}},{"global":false,"id":30620,"libraryName":{"id":30617,"name":"ContractOwnershipStorage","nameLocations":["2318:24:284"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2318:24:284"},"nodeType":"UsingForDirective","src":"2312:67:284","typeName":{"id":30619,"nodeType":"UserDefinedTypeName","pathNode":{"id":30618,"name":"ContractOwnershipStorage.Layout","nameLocations":["2347:24:284","2372:6:284"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2347:31:284"},"referencedDeclaration":8882,"src":"2347:31:284","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":30629,"nodeType":"Block","src":"2479:2:284","statements":[]},"id":30630,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":30626,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30623,"src":"2460:17:284","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":30627,"kind":"baseConstructorSpecifier","modifierName":{"id":30625,"name":"ForwarderRegistryContext","nameLocations":["2435:24:284"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2435:24:284"},"nodeType":"ModifierInvocation","src":"2435:43:284"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30624,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30623,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2416:17:284","nodeType":"VariableDeclaration","scope":30630,"src":"2397:36:284","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":30622,"nodeType":"UserDefinedTypeName","pathNode":{"id":30621,"name":"IForwarderRegistry","nameLocations":["2397:18:284"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2397:18:284"},"referencedDeclaration":13386,"src":"2397:18:284","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2396:38:284"},"returnParameters":{"id":30628,"nodeType":"ParameterList","parameters":[],"src":"2479:0:284"},"scope":30723,"src":"2385:96:284","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":30693,"nodeType":"Block","src":"2587:442:284","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":30644,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[30708],"referencedDeclaration":30708,"src":"2641:10:284","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2641:12:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30639,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2597:24:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":30641,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2622:6:284","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2597:31:284","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":30642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2597:33:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":30643,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2631:9:284","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2597:43:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":30646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2597:57:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30647,"nodeType":"ExpressionStatement","src":"2597:57:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30648,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2664:12:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2677:4:284","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28743,"src":"2664:17:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2664:19:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30652,"nodeType":"ExpressionStatement","src":"2664:19:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30653,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2693:12:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30655,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2706:23:284","memberName":"initERC20BatchTransfers","nodeType":"MemberAccess","referencedDeclaration":28788,"src":"2693:36:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30656,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2693:38:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30657,"nodeType":"ExpressionStatement","src":"2693:38:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30658,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2741:12:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2754:22:284","memberName":"initERC20SafeTransfers","nodeType":"MemberAccess","referencedDeclaration":28805,"src":"2741:35:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2741:37:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30662,"nodeType":"ExpressionStatement","src":"2741:37:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30663,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2788:12:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2801:17:284","memberName":"initERC20Mintable","nodeType":"MemberAccess","referencedDeclaration":28822,"src":"2788:30:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30666,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2788:32:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30667,"nodeType":"ExpressionStatement","src":"2788:32:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30668,"name":"ERC20Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30139,"src":"2830:12:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20Storage_$30139_$","typeString":"type(library ERC20Storage)"}},"id":30670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2843:17:284","memberName":"initERC20Burnable","nodeType":"MemberAccess","referencedDeclaration":28839,"src":"2830:30:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2830:32:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30672,"nodeType":"ExpressionStatement","src":"2830:32:284"},{"expression":{"arguments":[{"id":30678,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30632,"src":"2912:9:284","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":30679,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30634,"src":"2923:11:284","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":30680,"name":"tokenDecimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30636,"src":"2936:13:284","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint8","typeString":"uint8"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30673,"name":"ERC20DetailedStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28291,"src":"2872:20:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20DetailedStorage_$28291_$","typeString":"type(library ERC20DetailedStorage)"}},"id":30675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2893:6:284","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":28290,"src":"2872:27:284","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function () pure returns (struct ERC20DetailedStorage.Layout storage pointer)"}},"id":30676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2872:29:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$28118_storage_ptr","typeString":"struct ERC20DetailedStorage.Layout storage pointer"}},"id":30677,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2902:9:284","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":28239,"src":"2872:39:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$28118_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_uint8_$returns$__$attached_to$_t_struct$_Layout_$28118_storage_ptr_$","typeString":"function (struct ERC20DetailedStorage.Layout storage pointer,string calldata,string calldata,uint8)"}},"id":30681,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2872:78:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30682,"nodeType":"ExpressionStatement","src":"2872:78:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30683,"name":"ERC20MetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28380,"src":"2960:20:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20MetadataStorage_$28380_$","typeString":"type(library ERC20MetadataStorage)"}},"id":30685,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2981:4:284","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28338,"src":"2960:25:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2960:27:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30687,"nodeType":"ExpressionStatement","src":"2960:27:284"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30688,"name":"ERC20PermitStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":28612,"src":"2997:18:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC20PermitStorage_$28612_$","typeString":"type(library ERC20PermitStorage)"}},"id":30690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3016:4:284","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":28446,"src":"2997:23:284","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30691,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2997:25:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30692,"nodeType":"ExpressionStatement","src":"2997:25:284"}]},"functionSelector":"f57b0182","id":30694,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2496:4:284","nodeType":"FunctionDefinition","parameters":{"id":30637,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30632,"mutability":"mutable","name":"tokenName","nameLocation":"2517:9:284","nodeType":"VariableDeclaration","scope":30694,"src":"2501:25:284","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":30631,"name":"string","nodeType":"ElementaryTypeName","src":"2501:6:284","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30634,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2544:11:284","nodeType":"VariableDeclaration","scope":30694,"src":"2528:27:284","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":30633,"name":"string","nodeType":"ElementaryTypeName","src":"2528:6:284","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30636,"mutability":"mutable","name":"tokenDecimals","nameLocation":"2563:13:284","nodeType":"VariableDeclaration","scope":30694,"src":"2557:19:284","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":30635,"name":"uint8","nodeType":"ElementaryTypeName","src":"2557:5:284","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"2500:77:284"},"returnParameters":{"id":30638,"nodeType":"ParameterList","parameters":[],"src":"2587:0:284"},"scope":30723,"src":"2487:542:284","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":30707,"nodeType":"Block","src":"3194:65:284","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30703,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3211:28:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30704,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3240:10:284","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3211:39:284","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":30705,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3211:41:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":30702,"id":30706,"nodeType":"Return","src":"3204:48:284"}]},"documentation":{"id":30695,"nodeType":"StructuredDocumentation","src":"3035:44:284","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30708,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3093:10:284","nodeType":"FunctionDefinition","overrides":{"id":30699,"nodeType":"OverrideSpecifier","overrides":[{"id":30697,"name":"Context","nameLocations":["3137:7:284"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3137:7:284"},{"id":30698,"name":"ForwarderRegistryContextBase","nameLocations":["3146:28:284"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3146:28:284"}],"src":"3128:47:284"},"parameters":{"id":30696,"nodeType":"ParameterList","parameters":[],"src":"3103:2:284"},"returnParameters":{"id":30702,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30701,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30708,"src":"3185:7:284","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":30700,"name":"address","nodeType":"ElementaryTypeName","src":"3185:7:284","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3184:9:284"},"scope":30723,"src":"3084:175:284","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":30721,"nodeType":"Block","src":"3429:63:284","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30717,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3446:28:284","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":30718,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3475:8:284","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3446:37:284","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":30719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3446:39:284","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":30716,"id":30720,"nodeType":"Return","src":"3439:46:284"}]},"documentation":{"id":30709,"nodeType":"StructuredDocumentation","src":"3265:44:284","text":"@inheritdoc ForwarderRegistryContextBase"},"id":30722,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3323:8:284","nodeType":"FunctionDefinition","overrides":{"id":30713,"nodeType":"OverrideSpecifier","overrides":[{"id":30711,"name":"Context","nameLocations":["3365:7:284"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3365:7:284"},{"id":30712,"name":"ForwarderRegistryContextBase","nameLocations":["3374:28:284"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3374:28:284"}],"src":"3356:47:284"},"parameters":{"id":30710,"nodeType":"ParameterList","parameters":[],"src":"3331:2:284"},"returnParameters":{"id":30716,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30715,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":30722,"src":"3413:14:284","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":30714,"name":"bytes","nodeType":"ElementaryTypeName","src":"3413:5:284","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3412:16:284"},"scope":30723,"src":"3314:178:284","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":30724,"src":"1898:1596:284","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,27019,27024,27031,27042,27047,27056,27061,27064,27071,27076,27081,27084,27091],"usedEvents":[8269,8278,8287,27102,27111]}],"src":"32:3463:284"},"id":284},"contracts/token/ERC721/ERC721.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721.sol","exportedSymbols":{"ERC721":[30747],"ERC721Base":[31227],"ERC721Storage":[34972],"InterfaceDetection":[11554]},"id":30748,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30725,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:285"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30727,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30748,"sourceUnit":34973,"src":"58:60:285","symbolAliases":[{"foreign":{"id":30726,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:285","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721Base.sol","file":"./base/ERC721Base.sol","id":30729,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30748,"sourceUnit":31228,"src":"119:49:285","symbolAliases":[{"foreign":{"id":30728,"name":"ERC721Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31227,"src":"127:10:285","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":30731,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30748,"sourceUnit":11555,"src":"169:80:285","symbolAliases":[{"foreign":{"id":30730,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"177:18:285","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30733,"name":"ERC721Base","nameLocations":["445:10:285"],"nodeType":"IdentifierPath","referencedDeclaration":31227,"src":"445:10:285"},"id":30734,"nodeType":"InheritanceSpecifier","src":"445:10:285"},{"baseName":{"id":30735,"name":"InterfaceDetection","nameLocations":["457:18:285"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"457:18:285"},"id":30736,"nodeType":"InheritanceSpecifier","src":"457:18:285"}],"canonicalName":"ERC721","contractDependencies":[],"contractKind":"contract","documentation":{"id":30732,"nodeType":"StructuredDocumentation","src":"251:166:285","text":"@title ERC721 Non-Fungible Token Standard (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30747,"linearizedBaseContracts":[30747,11554,11579,31227,1206,33094],"name":"ERC721","nameLocation":"435:6:285","nodeType":"ContractDefinition","nodes":[{"body":{"id":30745,"nodeType":"Block","src":"572:37:285","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30740,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"582:13:285","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30742,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"596:4:285","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"582:18:285","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30743,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"582:20:285","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30744,"nodeType":"ExpressionStatement","src":"582:20:285"}]},"documentation":{"id":30737,"nodeType":"StructuredDocumentation","src":"482:71:285","text":"@notice Marks the following ERC165 interfaces as supported: ERC721."},"id":30746,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30738,"nodeType":"ParameterList","parameters":[],"src":"569:2:285"},"returnParameters":{"id":30739,"nodeType":"ParameterList","parameters":[],"src":"572:0:285"},"scope":30747,"src":"558:51:285","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30748,"src":"417:194:285","usedErrors":[11559,32109,32114,32123,32126,32131,32140,32147,32154,32157],"usedEvents":[32185,32194,32203]}],"src":"32:580:285"},"id":285},"contracts/token/ERC721/ERC721BatchTransfer.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721BatchTransfer.sol","exportedSymbols":{"ERC721BatchTransfer":[30767],"ERC721BatchTransferBase":[31269],"ERC721Storage":[34972]},"id":30768,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30749,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:286"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30751,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30768,"sourceUnit":34973,"src":"58:60:286","symbolAliases":[{"foreign":{"id":30750,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:286","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferBase.sol","file":"./base/ERC721BatchTransferBase.sol","id":30753,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30768,"sourceUnit":31270,"src":"119:75:286","symbolAliases":[{"foreign":{"id":30752,"name":"ERC721BatchTransferBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31269,"src":"127:23:286","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30755,"name":"ERC721BatchTransferBase","nameLocations":["438:23:286"],"nodeType":"IdentifierPath","referencedDeclaration":31269,"src":"438:23:286"},"id":30756,"nodeType":"InheritanceSpecifier","src":"438:23:286"}],"canonicalName":"ERC721BatchTransfer","contractDependencies":[],"contractKind":"contract","documentation":{"id":30754,"nodeType":"StructuredDocumentation","src":"196:201:286","text":"@title ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30767,"linearizedBaseContracts":[30767,31269,1206,33109],"name":"ERC721BatchTransfer","nameLocation":"415:19:286","nodeType":"ContractDefinition","nodes":[{"body":{"id":30765,"nodeType":"Block","src":"573:56:286","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30760,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"583:13:286","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"597:23:286","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"583:37:286","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30763,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"583:39:286","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30764,"nodeType":"ExpressionStatement","src":"583:39:286"}]},"documentation":{"id":30757,"nodeType":"StructuredDocumentation","src":"468:86:286","text":"@notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer"},"id":30766,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30758,"nodeType":"ParameterList","parameters":[],"src":"570:2:286"},"returnParameters":{"id":30759,"nodeType":"ParameterList","parameters":[],"src":"573:0:286"},"scope":30767,"src":"559:70:286","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30768,"src":"397:234:286","usedErrors":[11559,32126,32131,32140,32147],"usedEvents":[32185]}],"src":"32:600:286"},"id":286},"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol","exportedSymbols":{"ERC721BatchTransferWithOperatorFilterer":[30787],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721Storage":[34972]},"id":30788,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30769,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:287"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30771,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30788,"sourceUnit":34973,"src":"58:60:287","symbolAliases":[{"foreign":{"id":30770,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:287","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","file":"./base/ERC721BatchTransferWithOperatorFiltererBase.sol","id":30773,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30788,"sourceUnit":31331,"src":"119:115:287","symbolAliases":[{"foreign":{"id":30772,"name":"ERC721BatchTransferWithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31330,"src":"127:43:287","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30775,"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocations":["522:43:287"],"nodeType":"IdentifierPath","referencedDeclaration":31330,"src":"522:43:287"},"id":30776,"nodeType":"InheritanceSpecifier","src":"522:43:287"}],"canonicalName":"ERC721BatchTransferWithOperatorFilterer","contractDependencies":[],"contractKind":"contract","documentation":{"id":30774,"nodeType":"StructuredDocumentation","src":"236:225:287","text":"@title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30787,"linearizedBaseContracts":[30787,31330,1206,33109],"name":"ERC721BatchTransferWithOperatorFilterer","nameLocation":"479:39:287","nodeType":"ContractDefinition","nodes":[{"body":{"id":30785,"nodeType":"Block","src":"677:56:287","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30780,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"687:13:287","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30782,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"701:23:287","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"687:37:287","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30783,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"687:39:287","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30784,"nodeType":"ExpressionStatement","src":"687:39:287"}]},"documentation":{"id":30777,"nodeType":"StructuredDocumentation","src":"572:86:287","text":"@notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer"},"id":30786,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30778,"nodeType":"ParameterList","parameters":[],"src":"674:2:287"},"returnParameters":{"id":30779,"nodeType":"ParameterList","parameters":[],"src":"677:0:287"},"scope":30787,"src":"663:70:287","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30788,"src":"461:274:287","usedErrors":[11559,32126,32131,32140,32147,37090],"usedEvents":[32185]}],"src":"32:704:287"},"id":287},"contracts/token/ERC721/ERC721Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721Burnable.sol","exportedSymbols":{"ERC721Burnable":[30807],"ERC721BurnableBase":[31389],"ERC721Storage":[34972]},"id":30808,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30789,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:288"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30791,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30808,"sourceUnit":34973,"src":"58:60:288","symbolAliases":[{"foreign":{"id":30790,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:288","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BurnableBase.sol","file":"./base/ERC721BurnableBase.sol","id":30793,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30808,"sourceUnit":31390,"src":"119:65:288","symbolAliases":[{"foreign":{"id":30792,"name":"ERC721BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31389,"src":"127:18:288","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30795,"name":"ERC721BurnableBase","nameLocations":["418:18:288"],"nodeType":"IdentifierPath","referencedDeclaration":31389,"src":"418:18:288"},"id":30796,"nodeType":"InheritanceSpecifier","src":"418:18:288"}],"canonicalName":"ERC721Burnable","contractDependencies":[],"contractKind":"contract","documentation":{"id":30794,"nodeType":"StructuredDocumentation","src":"186:196:288","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30807,"linearizedBaseContracts":[30807,31389,1206,33130],"name":"ERC721Burnable","nameLocation":"400:14:288","nodeType":"ContractDefinition","nodes":[{"body":{"id":30805,"nodeType":"Block","src":"541:51:288","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30800,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"551:13:288","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30802,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"565:18:288","memberName":"initERC721Burnable","nodeType":"MemberAccess","referencedDeclaration":33416,"src":"551:32:288","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30803,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"551:34:288","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30804,"nodeType":"ExpressionStatement","src":"551:34:288"}]},"documentation":{"id":30797,"nodeType":"StructuredDocumentation","src":"443:79:288","text":"@notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable"},"id":30806,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30798,"nodeType":"ParameterList","parameters":[],"src":"538:2:288"},"returnParameters":{"id":30799,"nodeType":"ParameterList","parameters":[],"src":"541:0:288"},"scope":30807,"src":"527:65:288","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30808,"src":"382:212:288","usedErrors":[11559,32131,32140,32147],"usedEvents":[32185]}],"src":"32:563:288"},"id":288},"contracts/token/ERC721/ERC721Deliverable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721Deliverable.sol","exportedSymbols":{"AccessControl":[7901],"ERC721Deliverable":[30831],"ERC721DeliverableBase":[31446],"ERC721Storage":[34972]},"id":30832,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30809,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:289"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30811,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30832,"sourceUnit":34973,"src":"58:60:289","symbolAliases":[{"foreign":{"id":30810,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:289","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableBase.sol","file":"./base/ERC721DeliverableBase.sol","id":30813,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30832,"sourceUnit":31447,"src":"119:71:289","symbolAliases":[{"foreign":{"id":30812,"name":"ERC721DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31446,"src":"127:21:289","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":30815,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30832,"sourceUnit":7902,"src":"191:63:289","symbolAliases":[{"foreign":{"id":30814,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"199:13:289","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30817,"name":"ERC721DeliverableBase","nameLocations":["579:21:289"],"nodeType":"IdentifierPath","referencedDeclaration":31446,"src":"579:21:289"},"id":30818,"nodeType":"InheritanceSpecifier","src":"579:21:289"},{"baseName":{"id":30819,"name":"AccessControl","nameLocations":["602:13:289"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"602:13:289"},"id":30820,"nodeType":"InheritanceSpecifier","src":"602:13:289"}],"canonicalName":"ERC721Deliverable","contractDependencies":[],"contractKind":"contract","documentation":{"id":30816,"nodeType":"StructuredDocumentation","src":"256:284:289","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\n @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30831,"linearizedBaseContracts":[30831,7901,7934,11554,11579,8139,8091,31446,1206,8562,8546,33144],"name":"ERC721Deliverable","nameLocation":"558:17:289","nodeType":"ContractDefinition","nodes":[{"body":{"id":30829,"nodeType":"Block","src":"725:54:289","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30824,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"735:13:289","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"749:21:289","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"735:35:289","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30827,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"735:37:289","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30828,"nodeType":"ExpressionStatement","src":"735:37:289"}]},"documentation":{"id":30821,"nodeType":"StructuredDocumentation","src":"622:84:289","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable."},"id":30830,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30822,"nodeType":"ParameterList","parameters":[],"src":"722:2:289"},"returnParameters":{"id":30823,"nodeType":"ParameterList","parameters":[],"src":"725:0:289"},"scope":30831,"src":"711:68:289","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30832,"src":"540:241:289","usedErrors":[7886,8223,8246,11559,32162,32167],"usedEvents":[8269,8278,8287,32185]}],"src":"32:750:289"},"id":289},"contracts/token/ERC721/ERC721DeliverableOnce.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721DeliverableOnce.sol","exportedSymbols":{"AccessControl":[7901],"ERC721DeliverableOnce":[30855],"ERC721DeliverableOnceBase":[31503],"ERC721Storage":[34972]},"id":30856,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30833,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:290"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30835,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30856,"sourceUnit":34973,"src":"58:60:290","symbolAliases":[{"foreign":{"id":30834,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:290","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol","file":"./base/ERC721DeliverableOnceBase.sol","id":30837,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30856,"sourceUnit":31504,"src":"119:79:290","symbolAliases":[{"foreign":{"id":30836,"name":"ERC721DeliverableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31503,"src":"127:25:290","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":30839,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30856,"sourceUnit":7902,"src":"199:63:290","symbolAliases":[{"foreign":{"id":30838,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"207:13:290","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30841,"name":"ERC721DeliverableOnceBase","nameLocations":["593:25:290"],"nodeType":"IdentifierPath","referencedDeclaration":31503,"src":"593:25:290"},"id":30842,"nodeType":"InheritanceSpecifier","src":"593:25:290"},{"baseName":{"id":30843,"name":"AccessControl","nameLocations":["620:13:290"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"620:13:290"},"id":30844,"nodeType":"InheritanceSpecifier","src":"620:13:290"}],"canonicalName":"ERC721DeliverableOnce","contractDependencies":[],"contractKind":"contract","documentation":{"id":30840,"nodeType":"StructuredDocumentation","src":"264:286:290","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\n @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30855,"linearizedBaseContracts":[30855,7901,7934,11554,11579,8139,8091,31503,1206,8562,8546,33144],"name":"ERC721DeliverableOnce","nameLocation":"568:21:290","nodeType":"ContractDefinition","nodes":[{"body":{"id":30853,"nodeType":"Block","src":"743:54:290","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30848,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"753:13:290","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"767:21:290","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"753:35:290","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30851,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"753:37:290","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30852,"nodeType":"ExpressionStatement","src":"753:37:290"}]},"documentation":{"id":30845,"nodeType":"StructuredDocumentation","src":"640:84:290","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable."},"id":30854,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30846,"nodeType":"ParameterList","parameters":[],"src":"740:2:290"},"returnParameters":{"id":30847,"nodeType":"ParameterList","parameters":[],"src":"743:0:290"},"scope":30855,"src":"729:68:290","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30856,"src":"550:249:290","usedErrors":[7886,8223,8246,11559,32162,32167,32174],"usedEvents":[8269,8278,8287,32185]}],"src":"32:768:290"},"id":290},"contracts/token/ERC721/ERC721Metadata.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721Metadata.sol","exportedSymbols":{"ERC721Metadata":[30900],"ERC721MetadataBase":[31583],"ERC721Storage":[34972],"ITokenMetadataResolver":[36704],"TokenMetadataStorage":[36891]},"id":30901,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30857,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:291"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../metadata/interfaces/ITokenMetadataResolver.sol","id":30859,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30901,"sourceUnit":36705,"src":"58:91:291","symbolAliases":[{"foreign":{"id":30858,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"66:22:291","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../metadata/libraries/TokenMetadataStorage.sol","id":30861,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30901,"sourceUnit":36892,"src":"150:86:291","symbolAliases":[{"foreign":{"id":30860,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"158:20:291","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30863,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30901,"sourceUnit":34973,"src":"237:60:291","symbolAliases":[{"foreign":{"id":30862,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"245:13:291","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","file":"./base/ERC721MetadataBase.sol","id":30865,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30901,"sourceUnit":31584,"src":"298:65:291","symbolAliases":[{"foreign":{"id":30864,"name":"ERC721MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31583,"src":"306:18:291","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30867,"name":"ERC721MetadataBase","nameLocations":["691:18:291"],"nodeType":"IdentifierPath","referencedDeclaration":31583,"src":"691:18:291"},"id":30868,"nodeType":"InheritanceSpecifier","src":"691:18:291"}],"canonicalName":"ERC721Metadata","contractDependencies":[],"contractKind":"contract","documentation":{"id":30866,"nodeType":"StructuredDocumentation","src":"365:290:291","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30900,"linearizedBaseContracts":[30900,31583,33168,36683],"name":"ERC721Metadata","nameLocation":"673:14:291","nodeType":"ContractDefinition","nodes":[{"global":false,"id":30872,"libraryName":{"id":30869,"name":"TokenMetadataStorage","nameLocations":["722:20:291"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"722:20:291"},"nodeType":"UsingForDirective","src":"716:59:291","typeName":{"id":30871,"nodeType":"UserDefinedTypeName","pathNode":{"id":30870,"name":"TokenMetadataStorage.Layout","nameLocations":["747:20:291","768:6:291"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"747:27:291"},"referencedDeclaration":36718,"src":"747:27:291","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"body":{"id":30898,"nodeType":"Block","src":"1129:138:291","statements":[{"expression":{"arguments":[{"id":30888,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30875,"src":"1185:4:291","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30889,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30877,"src":"1191:6:291","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":30890,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30880,"src":"1199:16:291","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30883,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1139:20:291","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":30885,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1160:6:291","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1139:27:291","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":30886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1139:29:291","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":30887,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1169:15:291","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":36777,"src":"1139:45:291","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string memory,string memory,contract ITokenMetadataResolver)"}},"id":30891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1139:77:291","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30892,"nodeType":"ExpressionStatement","src":"1139:77:291"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30893,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1226:13:291","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30895,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1240:18:291","memberName":"initERC721Metadata","nodeType":"MemberAccess","referencedDeclaration":33365,"src":"1226:32:291","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30896,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1226:34:291","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30897,"nodeType":"ExpressionStatement","src":"1226:34:291"}]},"documentation":{"id":30873,"nodeType":"StructuredDocumentation","src":"781:248:291","text":"@notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\n @param name The name of the token.\n @param symbol The symbol of the token.\n @param metadataResolver The address of the metadata resolver contract."},"id":30899,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30881,"nodeType":"ParameterList","parameters":[{"constant":false,"id":30875,"mutability":"mutable","name":"name","nameLocation":"1060:4:291","nodeType":"VariableDeclaration","scope":30899,"src":"1046:18:291","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30874,"name":"string","nodeType":"ElementaryTypeName","src":"1046:6:291","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30877,"mutability":"mutable","name":"symbol","nameLocation":"1080:6:291","nodeType":"VariableDeclaration","scope":30899,"src":"1066:20:291","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":30876,"name":"string","nodeType":"ElementaryTypeName","src":"1066:6:291","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":30880,"mutability":"mutable","name":"metadataResolver","nameLocation":"1111:16:291","nodeType":"VariableDeclaration","scope":30899,"src":"1088:39:291","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":30879,"nodeType":"UserDefinedTypeName","pathNode":{"id":30878,"name":"ITokenMetadataResolver","nameLocations":["1088:22:291"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1088:22:291"},"referencedDeclaration":36704,"src":"1088:22:291","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1045:83:291"},"returnParameters":{"id":30882,"nodeType":"ParameterList","parameters":[],"src":"1129:0:291"},"scope":30900,"src":"1034:233:291","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30901,"src":"655:614:291","usedErrors":[11559,32131],"usedEvents":[]}],"src":"32:1238:291"},"id":291},"contracts/token/ERC721/ERC721Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721Mintable.sol","exportedSymbols":{"AccessControl":[7901],"ERC721Mintable":[30924],"ERC721MintableBase":[31700],"ERC721Storage":[34972]},"id":30925,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30902,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:292"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30904,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30925,"sourceUnit":34973,"src":"58:60:292","symbolAliases":[{"foreign":{"id":30903,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:292","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","file":"./base/ERC721MintableBase.sol","id":30906,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30925,"sourceUnit":31701,"src":"119:65:292","symbolAliases":[{"foreign":{"id":30905,"name":"ERC721MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31700,"src":"127:18:292","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":30908,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30925,"sourceUnit":7902,"src":"185:63:292","symbolAliases":[{"foreign":{"id":30907,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"193:13:292","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30910,"name":"ERC721MintableBase","nameLocations":["564:18:292"],"nodeType":"IdentifierPath","referencedDeclaration":31700,"src":"564:18:292"},"id":30911,"nodeType":"InheritanceSpecifier","src":"564:18:292"},{"baseName":{"id":30912,"name":"AccessControl","nameLocations":["584:13:292"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"584:13:292"},"id":30913,"nodeType":"InheritanceSpecifier","src":"584:13:292"}],"canonicalName":"ERC721Mintable","contractDependencies":[],"contractKind":"contract","documentation":{"id":30909,"nodeType":"StructuredDocumentation","src":"250:278:292","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\n @notice ERC721Mintable implementation where burnt tokens can be minted again.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30924,"linearizedBaseContracts":[30924,7901,7934,11554,11579,8139,8091,31700,1206,8562,8546,33199],"name":"ERC721Mintable","nameLocation":"546:14:292","nodeType":"ContractDefinition","nodes":[{"body":{"id":30922,"nodeType":"Block","src":"704:51:292","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30917,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"714:13:292","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30919,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"728:18:292","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"714:32:292","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30920,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"714:34:292","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30921,"nodeType":"ExpressionStatement","src":"714:34:292"}]},"documentation":{"id":30914,"nodeType":"StructuredDocumentation","src":"604:81:292","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"id":30923,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30915,"nodeType":"ParameterList","parameters":[],"src":"701:2:292"},"returnParameters":{"id":30916,"nodeType":"ParameterList","parameters":[],"src":"704:0:292"},"scope":30924,"src":"690:65:292","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30925,"src":"528:229:292","usedErrors":[8223,8246,11559,32154,32162,32167],"usedEvents":[8269,8278,8287,32185]}],"src":"32:726:292"},"id":292},"contracts/token/ERC721/ERC721MintableOnce.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721MintableOnce.sol","exportedSymbols":{"AccessControl":[7901],"ERC721MintableOnce":[30948],"ERC721MintableOnceBase":[31833],"ERC721Storage":[34972]},"id":30949,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30926,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:293"},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30928,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30949,"sourceUnit":34973,"src":"58:60:293","symbolAliases":[{"foreign":{"id":30927,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"66:13:293","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableOnceBase.sol","file":"./base/ERC721MintableOnceBase.sol","id":30930,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30949,"sourceUnit":31834,"src":"119:73:293","symbolAliases":[{"foreign":{"id":30929,"name":"ERC721MintableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31833,"src":"127:22:293","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/AccessControl.sol","file":"./../../access/AccessControl.sol","id":30932,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30949,"sourceUnit":7902,"src":"193:63:293","symbolAliases":[{"foreign":{"id":30931,"name":"AccessControl","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7901,"src":"201:13:293","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30934,"name":"ERC721MintableOnceBase","nameLocations":["578:22:293"],"nodeType":"IdentifierPath","referencedDeclaration":31833,"src":"578:22:293"},"id":30935,"nodeType":"InheritanceSpecifier","src":"578:22:293"},{"baseName":{"id":30936,"name":"AccessControl","nameLocations":["602:13:293"],"nodeType":"IdentifierPath","referencedDeclaration":7901,"src":"602:13:293"},"id":30937,"nodeType":"InheritanceSpecifier","src":"602:13:293"}],"canonicalName":"ERC721MintableOnce","contractDependencies":[],"contractKind":"contract","documentation":{"id":30933,"nodeType":"StructuredDocumentation","src":"258:280:293","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\n @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":30948,"linearizedBaseContracts":[30948,7901,7934,11554,11579,8139,8091,31833,1206,8562,8546,33199],"name":"ERC721MintableOnce","nameLocation":"556:18:293","nodeType":"ContractDefinition","nodes":[{"body":{"id":30946,"nodeType":"Block","src":"722:51:293","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30941,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"732:13:293","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":30943,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"746:18:293","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"732:32:293","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":30944,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"732:34:293","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30945,"nodeType":"ExpressionStatement","src":"732:34:293"}]},"documentation":{"id":30938,"nodeType":"StructuredDocumentation","src":"622:81:293","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"id":30947,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30939,"nodeType":"ParameterList","parameters":[],"src":"719:2:293"},"returnParameters":{"id":30940,"nodeType":"ParameterList","parameters":[],"src":"722:0:293"},"scope":30948,"src":"708:65:293","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30949,"src":"538:237:293","usedErrors":[8223,8246,11559,32154,32162,32167,32174],"usedEvents":[8269,8278,8287,32185]}],"src":"32:744:293"},"id":293},"contracts/token/ERC721/ERC721Receiver.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721Receiver.sol","exportedSymbols":{"ERC721Receiver":[30983],"IERC721Receiver":[33217],"InterfaceDetection":[11554],"InterfaceDetectionStorage":[11680]},"id":30984,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30950,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:294"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Receiver.sol","file":"./interfaces/IERC721Receiver.sol","id":30952,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30984,"sourceUnit":33218,"src":"58:65:294","symbolAliases":[{"foreign":{"id":30951,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"66:15:294","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../introspection/libraries/InterfaceDetectionStorage.sol","id":30954,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30984,"sourceUnit":11681,"src":"124:104:294","symbolAliases":[{"foreign":{"id":30953,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"132:25:294","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../introspection/InterfaceDetection.sol","id":30956,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":30984,"sourceUnit":11555,"src":"229:80:294","symbolAliases":[{"foreign":{"id":30955,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"237:18:294","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30958,"name":"IERC721Receiver","nameLocations":["523:15:294"],"nodeType":"IdentifierPath","referencedDeclaration":33217,"src":"523:15:294"},"id":30959,"nodeType":"InheritanceSpecifier","src":"523:15:294"},{"baseName":{"id":30960,"name":"InterfaceDetection","nameLocations":["540:18:294"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"540:18:294"},"id":30961,"nodeType":"InheritanceSpecifier","src":"540:18:294"}],"canonicalName":"ERC721Receiver","contractDependencies":[],"contractKind":"contract","documentation":{"id":30957,"nodeType":"StructuredDocumentation","src":"311:176:294","text":"@title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":false,"id":30983,"linearizedBaseContracts":[30983,11554,11579,33217],"name":"ERC721Receiver","nameLocation":"505:14:294","nodeType":"ContractDefinition","nodes":[{"global":false,"id":30965,"libraryName":{"id":30962,"name":"InterfaceDetectionStorage","nameLocations":["571:25:294"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"571:25:294"},"nodeType":"UsingForDirective","src":"565:69:294","typeName":{"id":30964,"nodeType":"UserDefinedTypeName","pathNode":{"id":30963,"name":"InterfaceDetectionStorage.Layout","nameLocations":["601:25:294","627:6:294"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"601:32:294"},"referencedDeclaration":11590,"src":"601:32:294","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"body":{"id":30981,"nodeType":"Block","src":"740:114:294","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":30975,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"812:15:294","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$33217_$","typeString":"type(contract IERC721Receiver)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$33217_$","typeString":"type(contract IERC721Receiver)"}],"id":30974,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"807:4:294","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":30976,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"807:21:294","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Receiver_$33217","typeString":"type(contract IERC721Receiver)"}},"id":30977,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"829:11:294","memberName":"interfaceId","nodeType":"MemberAccess","src":"807:33:294","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":30978,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"842:4:294","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":30969,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"750:25:294","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":30971,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"776:6:294","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"750:32:294","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":30972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"750:34:294","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":30973,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"785:21:294","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"750:56:294","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":30979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"750:97:294","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":30980,"nodeType":"ExpressionStatement","src":"750:97:294"}]},"documentation":{"id":30966,"nodeType":"StructuredDocumentation","src":"640:81:294","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Receiver."},"id":30982,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":30967,"nodeType":"ParameterList","parameters":[],"src":"737:2:294"},"returnParameters":{"id":30968,"nodeType":"ParameterList","parameters":[],"src":"740:0:294"},"scope":30983,"src":"726:128:294","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":30984,"src":"487:369:294","usedErrors":[11559],"usedEvents":[]}],"src":"32:825:294"},"id":294},"contracts/token/ERC721/ERC721WithOperatorFilterer.sol":{"ast":{"absolutePath":"contracts/token/ERC721/ERC721WithOperatorFilterer.sol","exportedSymbols":{"ContractOwnership":[7934],"ERC721Storage":[34972],"ERC721WithOperatorFilterer":[31030],"ERC721WithOperatorFiltererBase":[32102],"IOperatorFilterRegistry":[37474],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870]},"id":31031,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":30985,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:295"},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../royalty/interfaces/IOperatorFilterRegistry.sol","id":30987,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":37475,"src":"58:92:295","symbolAliases":[{"foreign":{"id":30986,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"66:23:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./libraries/ERC721Storage.sol","id":30989,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":34973,"src":"151:60:295","symbolAliases":[{"foreign":{"id":30988,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"159:13:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../royalty/libraries/OperatorFiltererStorage.sol","id":30991,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":37871,"src":"212:91:295","symbolAliases":[{"foreign":{"id":30990,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"220:23:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","file":"./base/ERC721WithOperatorFiltererBase.sol","id":30993,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":32103,"src":"304:89:295","symbolAliases":[{"foreign":{"id":30992,"name":"ERC721WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32102,"src":"312:30:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../royalty/base/OperatorFiltererBase.sol","id":30995,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":37074,"src":"394:80:295","symbolAliases":[{"foreign":{"id":30994,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"402:20:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":30997,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31031,"sourceUnit":7935,"src":"475:71:295","symbolAliases":[{"foreign":{"id":30996,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"483:17:295","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":30999,"name":"ERC721WithOperatorFiltererBase","nameLocations":["785:30:295"],"nodeType":"IdentifierPath","referencedDeclaration":32102,"src":"785:30:295"},"id":31000,"nodeType":"InheritanceSpecifier","src":"785:30:295"},{"baseName":{"id":31001,"name":"OperatorFiltererBase","nameLocations":["817:20:295"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"817:20:295"},"id":31002,"nodeType":"InheritanceSpecifier","src":"817:20:295"},{"baseName":{"id":31003,"name":"ContractOwnership","nameLocations":["839:17:295"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"839:17:295"},"id":31004,"nodeType":"InheritanceSpecifier","src":"839:17:295"}],"canonicalName":"ERC721WithOperatorFilterer","contractDependencies":[],"contractKind":"contract","documentation":{"id":30998,"nodeType":"StructuredDocumentation","src":"548:189:295","text":"@title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":31030,"linearizedBaseContracts":[31030,7934,11554,11579,8139,37073,32102,1206,8562,33094],"name":"ERC721WithOperatorFilterer","nameLocation":"755:26:295","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31008,"libraryName":{"id":31005,"name":"OperatorFiltererStorage","nameLocations":["869:23:295"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"869:23:295"},"nodeType":"UsingForDirective","src":"863:65:295","typeName":{"id":31007,"nodeType":"UserDefinedTypeName","pathNode":{"id":31006,"name":"OperatorFiltererStorage.Layout","nameLocations":["897:23:295","921:6:295"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"897:30:295"},"referencedDeclaration":37673,"src":"897:30:295","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":31028,"nodeType":"Block","src":"1293:119:295","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31015,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1303:13:295","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31017,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1317:4:295","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"1303:18:295","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":31018,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1303:20:295","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31019,"nodeType":"ExpressionStatement","src":"1303:20:295"},{"expression":{"arguments":[{"id":31025,"name":"operatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31012,"src":"1382:22:295","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31020,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1333:23:295","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31022,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1357:6:295","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1333:30:295","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31023,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1333:32:295","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31024,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1366:15:295","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":37716,"src":"1333:48:295","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":31026,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1333:72:295","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31027,"nodeType":"ExpressionStatement","src":"1333:72:295"}]},"documentation":{"id":31009,"nodeType":"StructuredDocumentation","src":"934:294:295","text":"@notice Marks the following ERC165 interfaces as supported: ERC721.\n @notice Sets the address that the contract will make OperatorFilter checks against.\n @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed."},"id":31029,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":31013,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31012,"mutability":"mutable","name":"operatorFilterRegistry","nameLocation":"1269:22:295","nodeType":"VariableDeclaration","scope":31029,"src":"1245:46:295","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":31011,"nodeType":"UserDefinedTypeName","pathNode":{"id":31010,"name":"IOperatorFilterRegistry","nameLocations":["1245:23:295"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1245:23:295"},"referencedDeclaration":37474,"src":"1245:23:295","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1244:48:295"},"returnParameters":{"id":31014,"nodeType":"ParameterList","parameters":[],"src":"1293:0:295"},"scope":31030,"src":"1233:179:295","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":31031,"src":"737:677:295","usedErrors":[8246,11559,32109,32114,32123,32126,32131,32140,32147,32154,32157,37090],"usedEvents":[8287,32185,32194,32203]}],"src":"32:1383:295"},"id":295},"contracts/token/ERC721/base/ERC721Base.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721Base.sol","exportedSymbols":{"Context":[1206],"ERC721Base":[31227],"ERC721Storage":[34972],"IERC721":[33094]},"id":31228,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31032,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:296"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../interfaces/IERC721.sol","id":31034,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31228,"sourceUnit":33095,"src":"58:52:296","symbolAliases":[{"foreign":{"id":31033,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"66:7:296","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31036,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31228,"sourceUnit":34973,"src":"111:63:296","symbolAliases":[{"foreign":{"id":31035,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"119:13:296","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31038,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31228,"sourceUnit":1207,"src":"175:66:296","symbolAliases":[{"foreign":{"id":31037,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"183:7:296","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31040,"name":"IERC721","nameLocations":["501:7:296"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"501:7:296"},"id":31041,"nodeType":"InheritanceSpecifier","src":"501:7:296"},{"baseName":{"id":31042,"name":"Context","nameLocations":["510:7:296"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"510:7:296"},"id":31043,"nodeType":"InheritanceSpecifier","src":"510:7:296"}],"canonicalName":"ERC721Base","contractDependencies":[],"contractKind":"contract","documentation":{"id":31039,"nodeType":"StructuredDocumentation","src":"243:226:296","text":"@title ERC721 Non-Fungible Token Standard (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard)."},"fullyImplemented":true,"id":31227,"linearizedBaseContracts":[31227,1206,33094],"name":"ERC721Base","nameLocation":"487:10:296","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31047,"libraryName":{"id":31044,"name":"ERC721Storage","nameLocations":["530:13:296"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"530:13:296"},"nodeType":"UsingForDirective","src":"524:45:296","typeName":{"id":31046,"nodeType":"UserDefinedTypeName","pathNode":{"id":31045,"name":"ERC721Storage.Layout","nameLocations":["548:13:296","562:6:296"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"548:20:296"},"referencedDeclaration":33288,"src":"548:20:296","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"baseFunctions":[33019],"body":{"id":31066,"nodeType":"Block","src":"666:74:296","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31060,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"707:10:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31061,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"707:12:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31062,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31050,"src":"721:2:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31063,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31052,"src":"725:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31055,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"676:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31057,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"690:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"676:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31058,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"676:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31059,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"699:7:296","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":33534,"src":"676:30:296","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256)"}},"id":31064,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"676:57:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31065,"nodeType":"ExpressionStatement","src":"676:57:296"}]},"documentation":{"id":31048,"nodeType":"StructuredDocumentation","src":"575:23:296","text":"@inheritdoc IERC721"},"functionSelector":"095ea7b3","id":31067,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"612:7:296","nodeType":"FunctionDefinition","parameters":{"id":31053,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31050,"mutability":"mutable","name":"to","nameLocation":"628:2:296","nodeType":"VariableDeclaration","scope":31067,"src":"620:10:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31049,"name":"address","nodeType":"ElementaryTypeName","src":"620:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31052,"mutability":"mutable","name":"tokenId","nameLocation":"640:7:296","nodeType":"VariableDeclaration","scope":31067,"src":"632:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31051,"name":"uint256","nodeType":"ElementaryTypeName","src":"632:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"619:29:296"},"returnParameters":{"id":31054,"nodeType":"ParameterList","parameters":[],"src":"666:0:296"},"scope":31227,"src":"603:137:296","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33027],"body":{"id":31086,"nodeType":"Block","src":"851:91:296","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31080,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"902:10:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31081,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"902:12:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31082,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31070,"src":"916:8:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31083,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31072,"src":"926:8:296","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31075,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"861:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31077,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"875:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"861:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31078,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"861:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31079,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"884:17:296","memberName":"setApprovalForAll","nodeType":"MemberAccess","referencedDeclaration":33572,"src":"861:40:296","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,bool)"}},"id":31084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"861:74:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31085,"nodeType":"ExpressionStatement","src":"861:74:296"}]},"documentation":{"id":31068,"nodeType":"StructuredDocumentation","src":"746:23:296","text":"@inheritdoc IERC721"},"functionSelector":"a22cb465","id":31087,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"783:17:296","nodeType":"FunctionDefinition","parameters":{"id":31073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31070,"mutability":"mutable","name":"operator","nameLocation":"809:8:296","nodeType":"VariableDeclaration","scope":31087,"src":"801:16:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31069,"name":"address","nodeType":"ElementaryTypeName","src":"801:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31072,"mutability":"mutable","name":"approved","nameLocation":"824:8:296","nodeType":"VariableDeclaration","scope":31087,"src":"819:13:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":31071,"name":"bool","nodeType":"ElementaryTypeName","src":"819:4:296","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"800:33:296"},"returnParameters":{"id":31074,"nodeType":"ParameterList","parameters":[],"src":"851:0:296"},"scope":31227,"src":"774:168:296","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33037],"body":{"id":31109,"nodeType":"Block","src":"1058:85:296","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31102,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1104:10:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31103,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1104:12:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31104,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31090,"src":"1118:4:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31105,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31092,"src":"1124:2:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31106,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31094,"src":"1128:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31097,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1068:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31099,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1082:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1068:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31100,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1068:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31101,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1091:12:296","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33689,"src":"1068:35:296","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":31107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1068:68:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31108,"nodeType":"ExpressionStatement","src":"1068:68:296"}]},"documentation":{"id":31088,"nodeType":"StructuredDocumentation","src":"948:23:296","text":"@inheritdoc IERC721"},"functionSelector":"23b872dd","id":31110,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"985:12:296","nodeType":"FunctionDefinition","parameters":{"id":31095,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31090,"mutability":"mutable","name":"from","nameLocation":"1006:4:296","nodeType":"VariableDeclaration","scope":31110,"src":"998:12:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31089,"name":"address","nodeType":"ElementaryTypeName","src":"998:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31092,"mutability":"mutable","name":"to","nameLocation":"1020:2:296","nodeType":"VariableDeclaration","scope":31110,"src":"1012:10:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31091,"name":"address","nodeType":"ElementaryTypeName","src":"1012:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31094,"mutability":"mutable","name":"tokenId","nameLocation":"1032:7:296","nodeType":"VariableDeclaration","scope":31110,"src":"1024:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31093,"name":"uint256","nodeType":"ElementaryTypeName","src":"1024:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"997:43:296"},"returnParameters":{"id":31096,"nodeType":"ParameterList","parameters":[],"src":"1058:0:296"},"scope":31227,"src":"976:167:296","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33047],"body":{"id":31132,"nodeType":"Block","src":"1263:89:296","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31125,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1313:10:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31126,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1313:12:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31127,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31113,"src":"1327:4:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31128,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31115,"src":"1333:2:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31129,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31117,"src":"1337:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31120,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1273:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31122,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1287:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1273:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1273:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31124,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1296:16:296","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33727,"src":"1273:39:296","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":31130,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1273:72:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31131,"nodeType":"ExpressionStatement","src":"1273:72:296"}]},"documentation":{"id":31111,"nodeType":"StructuredDocumentation","src":"1149:23:296","text":"@inheritdoc IERC721"},"functionSelector":"42842e0e","id":31133,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"1186:16:296","nodeType":"FunctionDefinition","parameters":{"id":31118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31113,"mutability":"mutable","name":"from","nameLocation":"1211:4:296","nodeType":"VariableDeclaration","scope":31133,"src":"1203:12:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31112,"name":"address","nodeType":"ElementaryTypeName","src":"1203:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31115,"mutability":"mutable","name":"to","nameLocation":"1225:2:296","nodeType":"VariableDeclaration","scope":31133,"src":"1217:10:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31114,"name":"address","nodeType":"ElementaryTypeName","src":"1217:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31117,"mutability":"mutable","name":"tokenId","nameLocation":"1237:7:296","nodeType":"VariableDeclaration","scope":31133,"src":"1229:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31116,"name":"uint256","nodeType":"ElementaryTypeName","src":"1229:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1202:43:296"},"returnParameters":{"id":31119,"nodeType":"ParameterList","parameters":[],"src":"1263:0:296"},"scope":31227,"src":"1177:175:296","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33059],"body":{"id":31158,"nodeType":"Block","src":"1493:95:296","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31150,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1543:10:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1543:12:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31152,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31136,"src":"1557:4:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31153,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31138,"src":"1563:2:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31154,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31140,"src":"1567:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":31155,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31142,"src":"1576:4:296","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31145,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1503:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1517:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1503:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31148,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1503:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31149,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1526:16:296","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33767,"src":"1503:39:296","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256,bytes calldata)"}},"id":31156,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1503:78:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31157,"nodeType":"ExpressionStatement","src":"1503:78:296"}]},"documentation":{"id":31134,"nodeType":"StructuredDocumentation","src":"1358:23:296","text":"@inheritdoc IERC721"},"functionSelector":"b88d4fde","id":31159,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"1395:16:296","nodeType":"FunctionDefinition","parameters":{"id":31143,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31136,"mutability":"mutable","name":"from","nameLocation":"1420:4:296","nodeType":"VariableDeclaration","scope":31159,"src":"1412:12:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31135,"name":"address","nodeType":"ElementaryTypeName","src":"1412:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31138,"mutability":"mutable","name":"to","nameLocation":"1434:2:296","nodeType":"VariableDeclaration","scope":31159,"src":"1426:10:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31137,"name":"address","nodeType":"ElementaryTypeName","src":"1426:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31140,"mutability":"mutable","name":"tokenId","nameLocation":"1446:7:296","nodeType":"VariableDeclaration","scope":31159,"src":"1438:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31139,"name":"uint256","nodeType":"ElementaryTypeName","src":"1438:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":31142,"mutability":"mutable","name":"data","nameLocation":"1470:4:296","nodeType":"VariableDeclaration","scope":31159,"src":"1455:19:296","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":31141,"name":"bytes","nodeType":"ElementaryTypeName","src":"1455:5:296","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1411:64:296"},"returnParameters":{"id":31144,"nodeType":"ParameterList","parameters":[],"src":"1493:0:296"},"scope":31227,"src":"1386:202:296","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33067],"body":{"id":31174,"nodeType":"Block","src":"1704:63:296","statements":[{"expression":{"arguments":[{"id":31171,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31162,"src":"1754:5:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31167,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1721:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1735:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1721:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31169,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1721:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31170,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1744:9:296","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":34728,"src":"1721:32:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address) view returns (uint256)"}},"id":31172,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1721:39:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":31166,"id":31173,"nodeType":"Return","src":"1714:46:296"}]},"documentation":{"id":31160,"nodeType":"StructuredDocumentation","src":"1594:23:296","text":"@inheritdoc IERC721"},"functionSelector":"70a08231","id":31175,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"1631:9:296","nodeType":"FunctionDefinition","parameters":{"id":31163,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31162,"mutability":"mutable","name":"owner","nameLocation":"1649:5:296","nodeType":"VariableDeclaration","scope":31175,"src":"1641:13:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31161,"name":"address","nodeType":"ElementaryTypeName","src":"1641:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1640:15:296"},"returnParameters":{"id":31166,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31165,"mutability":"mutable","name":"balance","nameLocation":"1695:7:296","nodeType":"VariableDeclaration","scope":31175,"src":"1687:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31164,"name":"uint256","nodeType":"ElementaryTypeName","src":"1687:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1686:17:296"},"scope":31227,"src":"1622:145:296","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33075],"body":{"id":31190,"nodeType":"Block","src":"1886:63:296","statements":[{"expression":{"arguments":[{"id":31187,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31178,"src":"1934:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31183,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1903:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31184,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1917:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1903:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1903:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31186,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1926:7:296","memberName":"ownerOf","nodeType":"MemberAccess","referencedDeclaration":34760,"src":"1903:30:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_address_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (address)"}},"id":31188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1903:39:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":31182,"id":31189,"nodeType":"Return","src":"1896:46:296"}]},"documentation":{"id":31176,"nodeType":"StructuredDocumentation","src":"1773:23:296","text":"@inheritdoc IERC721"},"functionSelector":"6352211e","id":31191,"implemented":true,"kind":"function","modifiers":[],"name":"ownerOf","nameLocation":"1810:7:296","nodeType":"FunctionDefinition","parameters":{"id":31179,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31178,"mutability":"mutable","name":"tokenId","nameLocation":"1826:7:296","nodeType":"VariableDeclaration","scope":31191,"src":"1818:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31177,"name":"uint256","nodeType":"ElementaryTypeName","src":"1818:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1817:17:296"},"returnParameters":{"id":31182,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31181,"mutability":"mutable","name":"tokenOwner","nameLocation":"1874:10:296","nodeType":"VariableDeclaration","scope":31191,"src":"1866:18:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31180,"name":"address","nodeType":"ElementaryTypeName","src":"1866:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1865:20:296"},"scope":31227,"src":"1801:148:296","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33083],"body":{"id":31206,"nodeType":"Block","src":"2070:67:296","statements":[{"expression":{"arguments":[{"id":31203,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31194,"src":"2122:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31199,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2087:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31200,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2101:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2087:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31201,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2087:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31202,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2110:11:296","memberName":"getApproved","nodeType":"MemberAccess","referencedDeclaration":34804,"src":"2087:34:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_address_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (address)"}},"id":31204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2087:43:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":31198,"id":31205,"nodeType":"Return","src":"2080:50:296"}]},"documentation":{"id":31192,"nodeType":"StructuredDocumentation","src":"1955:23:296","text":"@inheritdoc IERC721"},"functionSelector":"081812fc","id":31207,"implemented":true,"kind":"function","modifiers":[],"name":"getApproved","nameLocation":"1992:11:296","nodeType":"FunctionDefinition","parameters":{"id":31195,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31194,"mutability":"mutable","name":"tokenId","nameLocation":"2012:7:296","nodeType":"VariableDeclaration","scope":31207,"src":"2004:15:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31193,"name":"uint256","nodeType":"ElementaryTypeName","src":"2004:7:296","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2003:17:296"},"returnParameters":{"id":31198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31197,"mutability":"mutable","name":"approved","nameLocation":"2060:8:296","nodeType":"VariableDeclaration","scope":31207,"src":"2052:16:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31196,"name":"address","nodeType":"ElementaryTypeName","src":"2052:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2051:18:296"},"scope":31227,"src":"1983:154:296","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33093],"body":{"id":31225,"nodeType":"Block","src":"2282:80:296","statements":[{"expression":{"arguments":[{"id":31221,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31210,"src":"2339:5:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31222,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31212,"src":"2346:8:296","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31217,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2299:13:296","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31218,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2313:6:296","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2299:20:296","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31219,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2299:22:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31220,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2322:16:296","memberName":"isApprovedForAll","nodeType":"MemberAccess","referencedDeclaration":34825,"src":"2299:39:296","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":31223,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2299:56:296","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":31216,"id":31224,"nodeType":"Return","src":"2292:63:296"}]},"documentation":{"id":31208,"nodeType":"StructuredDocumentation","src":"2143:23:296","text":"@inheritdoc IERC721"},"functionSelector":"e985e9c5","id":31226,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"2180:16:296","nodeType":"FunctionDefinition","parameters":{"id":31213,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31210,"mutability":"mutable","name":"owner","nameLocation":"2205:5:296","nodeType":"VariableDeclaration","scope":31226,"src":"2197:13:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31209,"name":"address","nodeType":"ElementaryTypeName","src":"2197:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31212,"mutability":"mutable","name":"operator","nameLocation":"2220:8:296","nodeType":"VariableDeclaration","scope":31226,"src":"2212:16:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31211,"name":"address","nodeType":"ElementaryTypeName","src":"2212:7:296","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2196:33:296"},"returnParameters":{"id":31216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31215,"mutability":"mutable","name":"approvedForAll","nameLocation":"2266:14:296","nodeType":"VariableDeclaration","scope":31226,"src":"2261:19:296","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":31214,"name":"bool","nodeType":"ElementaryTypeName","src":"2261:4:296","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2260:21:296"},"scope":31227,"src":"2171:191:296","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":31228,"src":"469:1895:296","usedErrors":[32109,32114,32123,32126,32131,32140,32147,32154,32157],"usedEvents":[32185,32194,32203]}],"src":"32:2333:296"},"id":296},"contracts/token/ERC721/base/ERC721BatchTransferBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferBase.sol","exportedSymbols":{"Context":[1206],"ERC721BatchTransferBase":[31269],"ERC721Storage":[34972],"IERC721BatchTransfer":[33109]},"id":31270,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31229,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:297"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol","file":"./../interfaces/IERC721BatchTransfer.sol","id":31231,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31270,"sourceUnit":33110,"src":"58:78:297","symbolAliases":[{"foreign":{"id":31230,"name":"IERC721BatchTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33109,"src":"66:20:297","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31233,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31270,"sourceUnit":34973,"src":"137:63:297","symbolAliases":[{"foreign":{"id":31232,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"145:13:297","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31235,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31270,"sourceUnit":1207,"src":"201:66:297","symbolAliases":[{"foreign":{"id":31234,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"209:7:297","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31237,"name":"IERC721BatchTransfer","nameLocations":["575:20:297"],"nodeType":"IdentifierPath","referencedDeclaration":33109,"src":"575:20:297"},"id":31238,"nodeType":"InheritanceSpecifier","src":"575:20:297"},{"baseName":{"id":31239,"name":"Context","nameLocations":["597:7:297"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"597:7:297"},"id":31240,"nodeType":"InheritanceSpecifier","src":"597:7:297"}],"canonicalName":"ERC721BatchTransferBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31236,"nodeType":"StructuredDocumentation","src":"269:261:297","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard)."},"fullyImplemented":true,"id":31269,"linearizedBaseContracts":[31269,1206,33109],"name":"ERC721BatchTransferBase","nameLocation":"548:23:297","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31244,"libraryName":{"id":31241,"name":"ERC721Storage","nameLocations":["617:13:297"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"617:13:297"},"nodeType":"UsingForDirective","src":"611:45:297","typeName":{"id":31243,"nodeType":"UserDefinedTypeName","pathNode":{"id":31242,"name":"ERC721Storage.Layout","nameLocations":["635:13:297","649:6:297"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"635:20:297"},"referencedDeclaration":33288,"src":"635:20:297","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"baseFunctions":[33108],"body":{"id":31267,"nodeType":"Block","src":"802:91:297","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31260,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"853:10:297","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31261,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"853:12:297","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31262,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31247,"src":"867:4:297","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31263,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31249,"src":"873:2:297","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31264,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31252,"src":"877:8:297","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31255,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"812:13:297","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"826:6:297","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"812:20:297","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31258,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"812:22:297","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31259,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"835:17:297","memberName":"batchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33919,"src":"812:40:297","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256[] calldata)"}},"id":31265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"812:74:297","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31266,"nodeType":"ExpressionStatement","src":"812:74:297"}]},"documentation":{"id":31245,"nodeType":"StructuredDocumentation","src":"662:36:297","text":"@inheritdoc IERC721BatchTransfer"},"functionSelector":"f3993d11","id":31268,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"712:17:297","nodeType":"FunctionDefinition","parameters":{"id":31253,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31247,"mutability":"mutable","name":"from","nameLocation":"738:4:297","nodeType":"VariableDeclaration","scope":31268,"src":"730:12:297","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31246,"name":"address","nodeType":"ElementaryTypeName","src":"730:7:297","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31249,"mutability":"mutable","name":"to","nameLocation":"752:2:297","nodeType":"VariableDeclaration","scope":31268,"src":"744:10:297","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31248,"name":"address","nodeType":"ElementaryTypeName","src":"744:7:297","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31252,"mutability":"mutable","name":"tokenIds","nameLocation":"775:8:297","nodeType":"VariableDeclaration","scope":31268,"src":"756:27:297","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31250,"name":"uint256","nodeType":"ElementaryTypeName","src":"756:7:297","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31251,"nodeType":"ArrayTypeName","src":"756:9:297","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"729:55:297"},"returnParameters":{"id":31254,"nodeType":"ParameterList","parameters":[],"src":"802:0:297"},"scope":31269,"src":"703:190:297","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31270,"src":"530:365:297","usedErrors":[32126,32131,32140,32147],"usedEvents":[32185]}],"src":"32:864:297"},"id":297},"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","exportedSymbols":{"Context":[1206],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721Storage":[34972],"IERC721BatchTransfer":[33109],"OperatorFiltererStorage":[37870]},"id":31331,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31271,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:298"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol","file":"./../interfaces/IERC721BatchTransfer.sol","id":31273,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31331,"sourceUnit":33110,"src":"58:78:298","symbolAliases":[{"foreign":{"id":31272,"name":"IERC721BatchTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33109,"src":"66:20:298","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31275,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31331,"sourceUnit":34973,"src":"137:63:298","symbolAliases":[{"foreign":{"id":31274,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"145:13:298","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../royalty/libraries/OperatorFiltererStorage.sol","id":31277,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31331,"sourceUnit":37871,"src":"201:94:298","symbolAliases":[{"foreign":{"id":31276,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"209:23:298","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31279,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31331,"sourceUnit":1207,"src":"296:66:298","symbolAliases":[{"foreign":{"id":31278,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"304:7:298","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31281,"name":"IERC721BatchTransfer","nameLocations":["713:20:298"],"nodeType":"IdentifierPath","referencedDeclaration":33109,"src":"713:20:298"},"id":31282,"nodeType":"InheritanceSpecifier","src":"713:20:298"},{"baseName":{"id":31283,"name":"Context","nameLocations":["735:7:298"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"735:7:298"},"id":31284,"nodeType":"InheritanceSpecifier","src":"735:7:298"}],"canonicalName":"ERC721BatchTransferWithOperatorFiltererBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31280,"nodeType":"StructuredDocumentation","src":"364:284:298","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard)."},"fullyImplemented":true,"id":31330,"linearizedBaseContracts":[31330,1206,33109],"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocation":"666:43:298","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31288,"libraryName":{"id":31285,"name":"ERC721Storage","nameLocations":["755:13:298"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"755:13:298"},"nodeType":"UsingForDirective","src":"749:45:298","typeName":{"id":31287,"nodeType":"UserDefinedTypeName","pathNode":{"id":31286,"name":"ERC721Storage.Layout","nameLocations":["773:13:298","787:6:298"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"773:20:298"},"referencedDeclaration":33288,"src":"773:20:298","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31292,"libraryName":{"id":31289,"name":"OperatorFiltererStorage","nameLocations":["805:23:298"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"805:23:298"},"nodeType":"UsingForDirective","src":"799:65:298","typeName":{"id":31291,"nodeType":"UserDefinedTypeName","pathNode":{"id":31290,"name":"OperatorFiltererStorage.Layout","nameLocations":["833:23:298","857:6:298"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"833:30:298"},"referencedDeclaration":37673,"src":"833:30:298","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"baseFunctions":[33108],"body":{"id":31328,"nodeType":"Block","src":"1128:214:298","statements":[{"assignments":[31304],"declarations":[{"constant":false,"id":31304,"mutability":"mutable","name":"sender","nameLocation":"1146:6:298","nodeType":"VariableDeclaration","scope":31328,"src":"1138:14:298","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31303,"name":"address","nodeType":"ElementaryTypeName","src":"1138:7:298","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":31307,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":31305,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1155:10:298","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1155:12:298","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1138:29:298"},{"expression":{"arguments":[{"id":31313,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31304,"src":"1244:6:298","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31314,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31295,"src":"1252:4:298","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31308,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1177:23:298","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31310,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1201:6:298","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1177:30:298","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31311,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1177:32:298","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31312,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1210:33:298","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"1177:66:298","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":31315,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1177:80:298","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31316,"nodeType":"ExpressionStatement","src":"1177:80:298"},{"expression":{"arguments":[{"id":31322,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31304,"src":"1308:6:298","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31323,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31295,"src":"1316:4:298","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31324,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31297,"src":"1322:2:298","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31325,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31300,"src":"1326:8:298","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31317,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1267:13:298","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31319,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1281:6:298","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1267:20:298","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1267:22:298","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31321,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1290:17:298","memberName":"batchTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33919,"src":"1267:40:298","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256[] calldata)"}},"id":31326,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1267:68:298","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31327,"nodeType":"ExpressionStatement","src":"1267:68:298"}]},"documentation":{"id":31293,"nodeType":"StructuredDocumentation","src":"870:154:298","text":"@inheritdoc IERC721BatchTransfer\n @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"f3993d11","id":31329,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"1038:17:298","nodeType":"FunctionDefinition","parameters":{"id":31301,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31295,"mutability":"mutable","name":"from","nameLocation":"1064:4:298","nodeType":"VariableDeclaration","scope":31329,"src":"1056:12:298","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31294,"name":"address","nodeType":"ElementaryTypeName","src":"1056:7:298","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31297,"mutability":"mutable","name":"to","nameLocation":"1078:2:298","nodeType":"VariableDeclaration","scope":31329,"src":"1070:10:298","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31296,"name":"address","nodeType":"ElementaryTypeName","src":"1070:7:298","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31300,"mutability":"mutable","name":"tokenIds","nameLocation":"1101:8:298","nodeType":"VariableDeclaration","scope":31329,"src":"1082:27:298","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31298,"name":"uint256","nodeType":"ElementaryTypeName","src":"1082:7:298","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31299,"nodeType":"ArrayTypeName","src":"1082:9:298","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1055:55:298"},"returnParameters":{"id":31302,"nodeType":"ParameterList","parameters":[],"src":"1128:0:298"},"scope":31330,"src":"1029:313:298","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31331,"src":"648:696:298","usedErrors":[32126,32131,32140,32147,37090],"usedEvents":[32185]}],"src":"32:1313:298"},"id":298},"contracts/token/ERC721/base/ERC721BurnableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721BurnableBase.sol","exportedSymbols":{"Context":[1206],"ERC721BurnableBase":[31389],"ERC721Storage":[34972],"IERC721Burnable":[33130]},"id":31390,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31332,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:299"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Burnable.sol","file":"./../interfaces/IERC721Burnable.sol","id":31334,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31390,"sourceUnit":33131,"src":"58:68:299","symbolAliases":[{"foreign":{"id":31333,"name":"IERC721Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33130,"src":"66:15:299","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31336,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31390,"sourceUnit":34973,"src":"127:63:299","symbolAliases":[{"foreign":{"id":31335,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"135:13:299","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31338,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31390,"sourceUnit":1207,"src":"191:66:299","symbolAliases":[{"foreign":{"id":31337,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"199:7:299","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31340,"name":"IERC721Burnable","nameLocations":["554:15:299"],"nodeType":"IdentifierPath","referencedDeclaration":33130,"src":"554:15:299"},"id":31341,"nodeType":"InheritanceSpecifier","src":"554:15:299"},{"baseName":{"id":31342,"name":"Context","nameLocations":["571:7:299"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"571:7:299"},"id":31343,"nodeType":"InheritanceSpecifier","src":"571:7:299"}],"canonicalName":"ERC721BurnableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31339,"nodeType":"StructuredDocumentation","src":"259:255:299","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard)."},"fullyImplemented":true,"id":31389,"linearizedBaseContracts":[31389,1206,33130],"name":"ERC721BurnableBase","nameLocation":"532:18:299","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31347,"libraryName":{"id":31344,"name":"ERC721Storage","nameLocations":["591:13:299"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"591:13:299"},"nodeType":"UsingForDirective","src":"585:45:299","typeName":{"id":31346,"nodeType":"UserDefinedTypeName","pathNode":{"id":31345,"name":"ERC721Storage.Layout","nameLocations":["609:13:299","623:6:299"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"609:20:299"},"referencedDeclaration":33288,"src":"609:20:299","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"baseFunctions":[33120],"body":{"id":31366,"nodeType":"Block","src":"738:77:299","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31360,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"780:10:299","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31361,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"780:12:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31362,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31350,"src":"794:4:299","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31363,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31352,"src":"800:7:299","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31355,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"748:13:299","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"762:6:299","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"748:20:299","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"748:22:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31359,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"771:8:299","memberName":"burnFrom","nodeType":"MemberAccess","referencedDeclaration":34576,"src":"748:31:299","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256)"}},"id":31364,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"748:60:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31365,"nodeType":"ExpressionStatement","src":"748:60:299"}]},"documentation":{"id":31348,"nodeType":"StructuredDocumentation","src":"636:31:299","text":"@inheritdoc IERC721Burnable"},"functionSelector":"79cc6790","id":31367,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"681:8:299","nodeType":"FunctionDefinition","parameters":{"id":31353,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31350,"mutability":"mutable","name":"from","nameLocation":"698:4:299","nodeType":"VariableDeclaration","scope":31367,"src":"690:12:299","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31349,"name":"address","nodeType":"ElementaryTypeName","src":"690:7:299","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31352,"mutability":"mutable","name":"tokenId","nameLocation":"712:7:299","nodeType":"VariableDeclaration","scope":31367,"src":"704:15:299","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31351,"name":"uint256","nodeType":"ElementaryTypeName","src":"704:7:299","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"689:31:299"},"returnParameters":{"id":31354,"nodeType":"ParameterList","parameters":[],"src":"738:0:299"},"scope":31389,"src":"672:143:299","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33129],"body":{"id":31387,"nodeType":"Block","src":"940:83:299","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31381,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"987:10:299","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"987:12:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31383,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31370,"src":"1001:4:299","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31384,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31373,"src":"1007:8:299","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31376,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"950:13:299","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31378,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"964:6:299","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"950:20:299","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31379,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"950:22:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31380,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"973:13:299","memberName":"batchBurnFrom","nodeType":"MemberAccess","referencedDeclaration":34701,"src":"950:36:299","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256[] calldata)"}},"id":31385,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"950:66:299","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31386,"nodeType":"ExpressionStatement","src":"950:66:299"}]},"documentation":{"id":31368,"nodeType":"StructuredDocumentation","src":"821:31:299","text":"@inheritdoc IERC721Burnable"},"functionSelector":"f2472965","id":31388,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"866:13:299","nodeType":"FunctionDefinition","parameters":{"id":31374,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31370,"mutability":"mutable","name":"from","nameLocation":"888:4:299","nodeType":"VariableDeclaration","scope":31388,"src":"880:12:299","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31369,"name":"address","nodeType":"ElementaryTypeName","src":"880:7:299","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31373,"mutability":"mutable","name":"tokenIds","nameLocation":"913:8:299","nodeType":"VariableDeclaration","scope":31388,"src":"894:27:299","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31371,"name":"uint256","nodeType":"ElementaryTypeName","src":"894:7:299","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31372,"nodeType":"ArrayTypeName","src":"894:9:299","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"879:43:299"},"returnParameters":{"id":31375,"nodeType":"ParameterList","parameters":[],"src":"940:0:299"},"scope":31389,"src":"857:166:299","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31390,"src":"514:511:299","usedErrors":[32131,32140,32147],"usedEvents":[32185]}],"src":"32:994:299"},"id":299},"contracts/token/ERC721/base/ERC721DeliverableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC721DeliverableBase":[31446],"ERC721Storage":[34972],"IERC721Deliverable":[33144]},"id":31447,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31391,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:300"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Deliverable.sol","file":"./../interfaces/IERC721Deliverable.sol","id":31393,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31447,"sourceUnit":33145,"src":"58:74:300","symbolAliases":[{"foreign":{"id":31392,"name":"IERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33144,"src":"66:18:300","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31395,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31447,"sourceUnit":34973,"src":"133:63:300","symbolAliases":[{"foreign":{"id":31394,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"141:13:300","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":31397,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31447,"sourceUnit":8852,"src":"197:90:300","symbolAliases":[{"foreign":{"id":31396,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"205:20:300","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31399,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31447,"sourceUnit":1207,"src":"288:66:300","symbolAliases":[{"foreign":{"id":31398,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"296:7:300","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31401,"name":"IERC721Deliverable","nameLocations":["795:18:300"],"nodeType":"IdentifierPath","referencedDeclaration":33144,"src":"795:18:300"},"id":31402,"nodeType":"InheritanceSpecifier","src":"795:18:300"},{"baseName":{"id":31403,"name":"Context","nameLocations":["815:7:300"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"815:7:300"},"id":31404,"nodeType":"InheritanceSpecifier","src":"815:7:300"}],"canonicalName":"ERC721DeliverableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31400,"nodeType":"StructuredDocumentation","src":"356:396:300","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\n @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":31446,"linearizedBaseContracts":[31446,1206,33144],"name":"ERC721DeliverableBase","nameLocation":"770:21:300","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31408,"libraryName":{"id":31405,"name":"ERC721Storage","nameLocations":["835:13:300"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"835:13:300"},"nodeType":"UsingForDirective","src":"829:45:300","typeName":{"id":31407,"nodeType":"UserDefinedTypeName","pathNode":{"id":31406,"name":"ERC721Storage.Layout","nameLocations":["853:13:300","867:6:300"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"853:20:300"},"referencedDeclaration":33288,"src":"853:20:300","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31412,"libraryName":{"id":31409,"name":"AccessControlStorage","nameLocations":["885:20:300"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"885:20:300"},"nodeType":"UsingForDirective","src":"879:59:300","typeName":{"id":31411,"nodeType":"UserDefinedTypeName","pathNode":{"id":31410,"name":"AccessControlStorage.Layout","nameLocations":["910:20:300","931:6:300"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"910:27:300"},"referencedDeclaration":8616,"src":"910:27:300","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"id":31415,"mutability":"constant","name":"_MINTER_ROLE","nameLocation":"1047:12:300","nodeType":"VariableDeclaration","scope":31446,"src":"1022:48:300","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":31413,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1022:7:300","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":31414,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1062:8:300","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"private"},{"baseFunctions":[33143],"body":{"id":31444,"nodeType":"Block","src":"1299:151:300","statements":[{"expression":{"arguments":[{"id":31430,"name":"_MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31415,"src":"1354:12:300","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31431,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1368:10:300","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1368:12:300","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31425,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1309:20:300","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31427,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1330:6:300","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1309:27:300","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1309:29:300","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31429,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1339:14:300","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1309:44:300","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31433,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1309:72:300","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31434,"nodeType":"ExpressionStatement","src":"1309:72:300"},{"expression":{"arguments":[{"id":31440,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31419,"src":"1422:10:300","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":31441,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31422,"src":"1434:8:300","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31435,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1391:13:300","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31437,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1405:6:300","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1391:20:300","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1391:22:300","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31439,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1414:7:300","memberName":"deliver","nodeType":"MemberAccess","referencedDeclaration":34158,"src":"1391:30:300","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":31442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1391:52:300","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31443,"nodeType":"ExpressionStatement","src":"1391:52:300"}]},"documentation":{"id":31416,"nodeType":"StructuredDocumentation","src":"1077:123:300","text":"@inheritdoc IERC721Deliverable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"9da5e832","id":31445,"implemented":true,"kind":"function","modifiers":[],"name":"deliver","nameLocation":"1214:7:300","nodeType":"FunctionDefinition","parameters":{"id":31423,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31419,"mutability":"mutable","name":"recipients","nameLocation":"1241:10:300","nodeType":"VariableDeclaration","scope":31445,"src":"1222:29:300","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":31417,"name":"address","nodeType":"ElementaryTypeName","src":"1222:7:300","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":31418,"nodeType":"ArrayTypeName","src":"1222:9:300","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":31422,"mutability":"mutable","name":"tokenIds","nameLocation":"1272:8:300","nodeType":"VariableDeclaration","scope":31445,"src":"1253:27:300","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31420,"name":"uint256","nodeType":"ElementaryTypeName","src":"1253:7:300","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31421,"nodeType":"ArrayTypeName","src":"1253:9:300","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1221:60:300"},"returnParameters":{"id":31424,"nodeType":"ParameterList","parameters":[],"src":"1299:0:300"},"scope":31446,"src":"1205:245:300","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31447,"src":"752:700:300","usedErrors":[7886,8223,32162,32167],"usedEvents":[32185]}],"src":"32:1421:300"},"id":300},"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC721DeliverableOnceBase":[31503],"ERC721Storage":[34972],"IERC721Deliverable":[33144]},"id":31504,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31448,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:301"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Deliverable.sol","file":"./../interfaces/IERC721Deliverable.sol","id":31450,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31504,"sourceUnit":33145,"src":"58:74:301","symbolAliases":[{"foreign":{"id":31449,"name":"IERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33144,"src":"66:18:301","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31452,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31504,"sourceUnit":34973,"src":"133:63:301","symbolAliases":[{"foreign":{"id":31451,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"141:13:301","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":31454,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31504,"sourceUnit":8852,"src":"197:90:301","symbolAliases":[{"foreign":{"id":31453,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"205:20:301","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31456,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31504,"sourceUnit":1207,"src":"288:66:301","symbolAliases":[{"foreign":{"id":31455,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"296:7:301","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31458,"name":"IERC721Deliverable","nameLocations":["801:18:301"],"nodeType":"IdentifierPath","referencedDeclaration":33144,"src":"801:18:301"},"id":31459,"nodeType":"InheritanceSpecifier","src":"801:18:301"},{"baseName":{"id":31460,"name":"Context","nameLocations":["821:7:301"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"821:7:301"},"id":31461,"nodeType":"InheritanceSpecifier","src":"821:7:301"}],"canonicalName":"ERC721DeliverableOnceBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31457,"nodeType":"StructuredDocumentation","src":"356:398:301","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\n @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":31503,"linearizedBaseContracts":[31503,1206,33144],"name":"ERC721DeliverableOnceBase","nameLocation":"772:25:301","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31465,"libraryName":{"id":31462,"name":"ERC721Storage","nameLocations":["841:13:301"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"841:13:301"},"nodeType":"UsingForDirective","src":"835:45:301","typeName":{"id":31464,"nodeType":"UserDefinedTypeName","pathNode":{"id":31463,"name":"ERC721Storage.Layout","nameLocations":["859:13:301","873:6:301"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"859:20:301"},"referencedDeclaration":33288,"src":"859:20:301","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31469,"libraryName":{"id":31466,"name":"AccessControlStorage","nameLocations":["891:20:301"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"891:20:301"},"nodeType":"UsingForDirective","src":"885:59:301","typeName":{"id":31468,"nodeType":"UserDefinedTypeName","pathNode":{"id":31467,"name":"AccessControlStorage.Layout","nameLocations":["916:20:301","937:6:301"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"916:27:301"},"referencedDeclaration":8616,"src":"916:27:301","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"id":31472,"mutability":"constant","name":"_MINTER_ROLE","nameLocation":"1057:12:301","nodeType":"VariableDeclaration","scope":31503,"src":"1032:48:301","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":31470,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1032:7:301","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":31471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1072:8:301","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"private"},{"baseFunctions":[33143],"body":{"id":31501,"nodeType":"Block","src":"1402:155:301","statements":[{"expression":{"arguments":[{"id":31487,"name":"_MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31472,"src":"1457:12:301","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31488,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1471:10:301","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31489,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1471:12:301","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31482,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1412:20:301","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31484,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1433:6:301","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1412:27:301","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1412:29:301","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31486,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1442:14:301","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1412:44:301","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1412:72:301","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31491,"nodeType":"ExpressionStatement","src":"1412:72:301"},{"expression":{"arguments":[{"id":31497,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31476,"src":"1529:10:301","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"}},{"id":31498,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31479,"src":"1541:8:301","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[] calldata"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31492,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1494:13:301","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1508:6:301","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1494:20:301","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1494:22:301","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31496,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1517:11:301","memberName":"deliverOnce","nodeType":"MemberAccess","referencedDeclaration":34485,"src":"1494:34:301","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address[] memory,uint256[] memory)"}},"id":31499,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1494:56:301","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31500,"nodeType":"ExpressionStatement","src":"1494:56:301"}]},"documentation":{"id":31473,"nodeType":"StructuredDocumentation","src":"1087:216:301","text":"@inheritdoc IERC721Deliverable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt."},"functionSelector":"9da5e832","id":31502,"implemented":true,"kind":"function","modifiers":[],"name":"deliver","nameLocation":"1317:7:301","nodeType":"FunctionDefinition","parameters":{"id":31480,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31476,"mutability":"mutable","name":"recipients","nameLocation":"1344:10:301","nodeType":"VariableDeclaration","scope":31502,"src":"1325:29:301","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":31474,"name":"address","nodeType":"ElementaryTypeName","src":"1325:7:301","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":31475,"nodeType":"ArrayTypeName","src":"1325:9:301","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":31479,"mutability":"mutable","name":"tokenIds","nameLocation":"1375:8:301","nodeType":"VariableDeclaration","scope":31502,"src":"1356:27:301","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31477,"name":"uint256","nodeType":"ElementaryTypeName","src":"1356:7:301","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31478,"nodeType":"ArrayTypeName","src":"1356:9:301","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1324:60:301"},"returnParameters":{"id":31481,"nodeType":"ParameterList","parameters":[],"src":"1402:0:301"},"scope":31503,"src":"1308:249:301","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31504,"src":"754:805:301","usedErrors":[7886,8223,32162,32167,32174],"usedEvents":[32185]}],"src":"32:1528:301"},"id":301},"contracts/token/ERC721/base/ERC721MetadataBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","exportedSymbols":{"ERC721MetadataBase":[31583],"ERC721Storage":[34972],"IERC721Metadata":[33168],"TokenMetadataBase":[36683],"TokenMetadataStorage":[36891]},"id":31584,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31505,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:302"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Metadata.sol","file":"./../interfaces/IERC721Metadata.sol","id":31507,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31584,"sourceUnit":33169,"src":"58:68:302","symbolAliases":[{"foreign":{"id":31506,"name":"IERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33168,"src":"66:15:302","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31509,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31584,"sourceUnit":34973,"src":"127:63:302","symbolAliases":[{"foreign":{"id":31508,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"135:13:302","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../metadata/libraries/TokenMetadataStorage.sol","id":31511,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31584,"sourceUnit":36892,"src":"191:89:302","symbolAliases":[{"foreign":{"id":31510,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"199:20:302","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/base/TokenMetadataBase.sol","file":"./../../metadata/base/TokenMetadataBase.sol","id":31513,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31584,"sourceUnit":36684,"src":"281:78:302","symbolAliases":[{"foreign":{"id":31512,"name":"TokenMetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36683,"src":"289:17:302","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31515,"name":"TokenMetadataBase","nameLocations":["750:17:302"],"nodeType":"IdentifierPath","referencedDeclaration":36683,"src":"750:17:302"},"id":31516,"nodeType":"InheritanceSpecifier","src":"750:17:302"},{"baseName":{"id":31517,"name":"IERC721Metadata","nameLocations":["769:15:302"],"nodeType":"IdentifierPath","referencedDeclaration":33168,"src":"769:15:302"},"id":31518,"nodeType":"InheritanceSpecifier","src":"769:15:302"}],"canonicalName":"ERC721MetadataBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31514,"nodeType":"StructuredDocumentation","src":"361:349:302","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard)."},"fullyImplemented":true,"id":31583,"linearizedBaseContracts":[31583,33168,36683],"name":"ERC721MetadataBase","nameLocation":"728:18:302","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31522,"libraryName":{"id":31519,"name":"ERC721Storage","nameLocations":["797:13:302"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"797:13:302"},"nodeType":"UsingForDirective","src":"791:45:302","typeName":{"id":31521,"nodeType":"UserDefinedTypeName","pathNode":{"id":31520,"name":"ERC721Storage.Layout","nameLocations":["815:13:302","829:6:302"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"815:20:302"},"referencedDeclaration":33288,"src":"815:20:302","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31526,"libraryName":{"id":31523,"name":"TokenMetadataStorage","nameLocations":["847:20:302"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"847:20:302"},"nodeType":"UsingForDirective","src":"841:59:302","typeName":{"id":31525,"nodeType":"UserDefinedTypeName","pathNode":{"id":31524,"name":"TokenMetadataStorage.Layout","nameLocations":["872:20:302","893:6:302"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"872:27:302"},"referencedDeclaration":36718,"src":"872:27:302","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"baseFunctions":[33153,36655],"body":{"id":31539,"nodeType":"Block","src":"1057:48:302","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31535,"name":"TokenMetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36683,"src":"1074:17:302","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataBase_$36683_$","typeString":"type(contract TokenMetadataBase)"}},"id":31536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1092:4:302","memberName":"name","nodeType":"MemberAccess","referencedDeclaration":36655,"src":"1074:22:302","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_string_memory_ptr_$","typeString":"function () view returns (string memory)"}},"id":31537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1074:24:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":31534,"id":31538,"nodeType":"Return","src":"1067:31:302"}]},"documentation":{"id":31527,"nodeType":"StructuredDocumentation","src":"906:31:302","text":"@inheritdoc IERC721Metadata"},"functionSelector":"06fdde03","id":31540,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"951:4:302","nodeType":"FunctionDefinition","overrides":{"id":31531,"nodeType":"OverrideSpecifier","overrides":[{"id":31529,"name":"IERC721Metadata","nameLocations":["987:15:302"],"nodeType":"IdentifierPath","referencedDeclaration":33168,"src":"987:15:302"},{"id":31530,"name":"TokenMetadataBase","nameLocations":["1004:17:302"],"nodeType":"IdentifierPath","referencedDeclaration":36683,"src":"1004:17:302"}],"src":"978:44:302"},"parameters":{"id":31528,"nodeType":"ParameterList","parameters":[],"src":"955:2:302"},"returnParameters":{"id":31534,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31533,"mutability":"mutable","name":"tokenName","nameLocation":"1046:9:302","nodeType":"VariableDeclaration","scope":31540,"src":"1032:23:302","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":31532,"name":"string","nodeType":"ElementaryTypeName","src":"1032:6:302","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1031:25:302"},"scope":31583,"src":"942:163:302","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[33159,36668],"body":{"id":31553,"nodeType":"Block","src":"1266:50:302","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31549,"name":"TokenMetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36683,"src":"1283:17:302","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataBase_$36683_$","typeString":"type(contract TokenMetadataBase)"}},"id":31550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1301:6:302","memberName":"symbol","nodeType":"MemberAccess","referencedDeclaration":36668,"src":"1283:24:302","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_string_memory_ptr_$","typeString":"function () view returns (string memory)"}},"id":31551,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1283:26:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":31548,"id":31552,"nodeType":"Return","src":"1276:33:302"}]},"documentation":{"id":31541,"nodeType":"StructuredDocumentation","src":"1111:31:302","text":"@inheritdoc IERC721Metadata"},"functionSelector":"95d89b41","id":31554,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"1156:6:302","nodeType":"FunctionDefinition","overrides":{"id":31545,"nodeType":"OverrideSpecifier","overrides":[{"id":31543,"name":"IERC721Metadata","nameLocations":["1194:15:302"],"nodeType":"IdentifierPath","referencedDeclaration":33168,"src":"1194:15:302"},{"id":31544,"name":"TokenMetadataBase","nameLocations":["1211:17:302"],"nodeType":"IdentifierPath","referencedDeclaration":36683,"src":"1211:17:302"}],"src":"1185:44:302"},"parameters":{"id":31542,"nodeType":"ParameterList","parameters":[],"src":"1162:2:302"},"returnParameters":{"id":31548,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31547,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1253:11:302","nodeType":"VariableDeclaration","scope":31554,"src":"1239:25:302","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":31546,"name":"string","nodeType":"ElementaryTypeName","src":"1239:6:302","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1238:27:302"},"scope":31583,"src":"1147:169:302","stateMutability":"view","virtual":true,"visibility":"public"},{"baseFunctions":[33167],"body":{"id":31581,"nodeType":"Block","src":"1443:182:302","statements":[{"expression":{"arguments":[{"id":31567,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31557,"src":"1484:7:302","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31562,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1453:13:302","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31564,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1467:6:302","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1453:20:302","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1453:22:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31566,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1476:7:302","memberName":"ownerOf","nodeType":"MemberAccess","referencedDeclaration":34760,"src":"1453:30:302","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_address_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (address)"}},"id":31568,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1453:39:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":31569,"nodeType":"ExpressionStatement","src":"1453:39:302"},{"expression":{"arguments":[{"arguments":[{"id":31576,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1603:4:302","typeDescriptions":{"typeIdentifier":"t_contract$_ERC721MetadataBase_$31583","typeString":"contract ERC721MetadataBase"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC721MetadataBase_$31583","typeString":"contract ERC721MetadataBase"}],"id":31575,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1595:7:302","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":31574,"name":"address","nodeType":"ElementaryTypeName","src":"1595:7:302","typeDescriptions":{}}},"id":31577,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1595:13:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31578,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31557,"src":"1610:7:302","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31570,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1548:20:302","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":31571,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1569:6:302","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1548:27:302","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":31572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1548:29:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":31573,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1578:16:302","memberName":"tokenMetadataURI","nodeType":"MemberAccess","referencedDeclaration":36878,"src":"1548:46:302","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$_t_address_$_t_uint256_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,address,uint256) view returns (string memory)"}},"id":31579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1548:70:302","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":31561,"id":31580,"nodeType":"Return","src":"1541:77:302"}]},"documentation":{"id":31555,"nodeType":"StructuredDocumentation","src":"1322:31:302","text":"@inheritdoc IERC721Metadata"},"functionSelector":"c87b56dd","id":31582,"implemented":true,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"1367:8:302","nodeType":"FunctionDefinition","parameters":{"id":31558,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31557,"mutability":"mutable","name":"tokenId","nameLocation":"1384:7:302","nodeType":"VariableDeclaration","scope":31582,"src":"1376:15:302","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31556,"name":"uint256","nodeType":"ElementaryTypeName","src":"1376:7:302","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1375:17:302"},"returnParameters":{"id":31561,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31560,"mutability":"mutable","name":"uri","nameLocation":"1438:3:302","nodeType":"VariableDeclaration","scope":31582,"src":"1424:17:302","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":31559,"name":"string","nodeType":"ElementaryTypeName","src":"1424:6:302","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1423:19:302"},"scope":31583,"src":"1358:267:302","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":31584,"src":"710:917:302","usedErrors":[32131],"usedEvents":[]}],"src":"32:1596:302"},"id":302},"contracts/token/ERC721/base/ERC721MintableBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC721MintableBase":[31700],"ERC721Storage":[34972],"IERC721Mintable":[33199]},"id":31701,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31585,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:303"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Mintable.sol","file":"./../interfaces/IERC721Mintable.sol","id":31587,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31701,"sourceUnit":33200,"src":"58:68:303","symbolAliases":[{"foreign":{"id":31586,"name":"IERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33199,"src":"66:15:303","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31589,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31701,"sourceUnit":34973,"src":"127:63:303","symbolAliases":[{"foreign":{"id":31588,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"135:13:303","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":31591,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31701,"sourceUnit":8852,"src":"191:90:303","symbolAliases":[{"foreign":{"id":31590,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"199:20:303","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31593,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31701,"sourceUnit":1207,"src":"282:66:303","symbolAliases":[{"foreign":{"id":31592,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"290:7:303","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31595,"name":"IERC721Mintable","nameLocations":["780:15:303"],"nodeType":"IdentifierPath","referencedDeclaration":33199,"src":"780:15:303"},"id":31596,"nodeType":"InheritanceSpecifier","src":"780:15:303"},{"baseName":{"id":31597,"name":"Context","nameLocations":["797:7:303"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"797:7:303"},"id":31598,"nodeType":"InheritanceSpecifier","src":"797:7:303"}],"canonicalName":"ERC721MintableBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31594,"nodeType":"StructuredDocumentation","src":"350:390:303","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\n @notice ERC721Mintable implementation where burnt tokens can be minted again.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":31700,"linearizedBaseContracts":[31700,1206,33199],"name":"ERC721MintableBase","nameLocation":"758:18:303","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31602,"libraryName":{"id":31599,"name":"ERC721Storage","nameLocations":["817:13:303"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"817:13:303"},"nodeType":"UsingForDirective","src":"811:45:303","typeName":{"id":31601,"nodeType":"UserDefinedTypeName","pathNode":{"id":31600,"name":"ERC721Storage.Layout","nameLocations":["835:13:303","849:6:303"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"835:20:303"},"referencedDeclaration":33288,"src":"835:20:303","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31606,"libraryName":{"id":31603,"name":"AccessControlStorage","nameLocations":["867:20:303"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"867:20:303"},"nodeType":"UsingForDirective","src":"861:59:303","typeName":{"id":31605,"nodeType":"UserDefinedTypeName","pathNode":{"id":31604,"name":"AccessControlStorage.Layout","nameLocations":["892:20:303","913:6:303"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"892:27:303"},"referencedDeclaration":8616,"src":"892:27:303","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"d5391393","id":31609,"mutability":"constant","name":"MINTER_ROLE","nameLocation":"950:11:303","nodeType":"VariableDeclaration","scope":31700,"src":"926:46:303","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":31607,"name":"bytes32","nodeType":"ElementaryTypeName","src":"926:7:303","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":31608,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"964:8:303","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"public"},{"baseFunctions":[33179],"body":{"id":31636,"nodeType":"Block","src":"1164:138:303","statements":[{"expression":{"arguments":[{"id":31622,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31609,"src":"1219:11:303","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31623,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1232:10:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31624,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1232:12:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31617,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1174:20:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1195:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1174:27:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31620,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1174:29:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31621,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1204:14:303","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1174:44:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31625,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1174:71:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31626,"nodeType":"ExpressionStatement","src":"1174:71:303"},{"expression":{"arguments":[{"id":31632,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31612,"src":"1283:2:303","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31633,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31614,"src":"1287:7:303","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31627,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1255:13:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1269:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1255:20:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1255:22:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31631,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1278:4:303","memberName":"mint","nodeType":"MemberAccess","referencedDeclaration":33982,"src":"1255:27:303","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256)"}},"id":31634,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1255:40:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31635,"nodeType":"ExpressionStatement","src":"1255:40:303"}]},"documentation":{"id":31610,"nodeType":"StructuredDocumentation","src":"979:120:303","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"40c10f19","id":31637,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"1113:4:303","nodeType":"FunctionDefinition","parameters":{"id":31615,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31612,"mutability":"mutable","name":"to","nameLocation":"1126:2:303","nodeType":"VariableDeclaration","scope":31637,"src":"1118:10:303","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31611,"name":"address","nodeType":"ElementaryTypeName","src":"1118:7:303","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31614,"mutability":"mutable","name":"tokenId","nameLocation":"1138:7:303","nodeType":"VariableDeclaration","scope":31637,"src":"1130:15:303","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31613,"name":"uint256","nodeType":"ElementaryTypeName","src":"1130:7:303","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1117:29:303"},"returnParameters":{"id":31616,"nodeType":"ParameterList","parameters":[],"src":"1164:0:303"},"scope":31700,"src":"1104:198:303","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33189],"body":{"id":31669,"nodeType":"Block","src":"1518:162:303","statements":[{"expression":{"arguments":[{"id":31652,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31609,"src":"1573:11:303","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31653,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1586:10:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31654,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1586:12:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31647,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1528:20:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31649,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1549:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1528:27:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31650,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1528:29:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31651,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1558:14:303","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1528:44:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31655,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1528:71:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31656,"nodeType":"ExpressionStatement","src":"1528:71:303"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31662,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1641:10:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1641:12:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31664,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31640,"src":"1655:2:303","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31665,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31642,"src":"1659:7:303","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":31666,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31644,"src":"1668:4:303","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31657,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1609:13:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31659,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1623:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1609:20:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1609:22:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31661,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1632:8:303","memberName":"safeMint","nodeType":"MemberAccess","referencedDeclaration":34021,"src":"1609:31:303","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256,bytes memory)"}},"id":31667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1609:64:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31668,"nodeType":"ExpressionStatement","src":"1609:64:303"}]},"documentation":{"id":31638,"nodeType":"StructuredDocumentation","src":"1308:120:303","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"8832e6e3","id":31670,"implemented":true,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"1442:8:303","nodeType":"FunctionDefinition","parameters":{"id":31645,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31640,"mutability":"mutable","name":"to","nameLocation":"1459:2:303","nodeType":"VariableDeclaration","scope":31670,"src":"1451:10:303","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31639,"name":"address","nodeType":"ElementaryTypeName","src":"1451:7:303","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31642,"mutability":"mutable","name":"tokenId","nameLocation":"1471:7:303","nodeType":"VariableDeclaration","scope":31670,"src":"1463:15:303","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31641,"name":"uint256","nodeType":"ElementaryTypeName","src":"1463:7:303","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":31644,"mutability":"mutable","name":"data","nameLocation":"1495:4:303","nodeType":"VariableDeclaration","scope":31670,"src":"1480:19:303","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":31643,"name":"bytes","nodeType":"ElementaryTypeName","src":"1480:5:303","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1450:50:303"},"returnParameters":{"id":31646,"nodeType":"ParameterList","parameters":[],"src":"1518:0:303"},"scope":31700,"src":"1433:247:303","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33198],"body":{"id":31698,"nodeType":"Block","src":"1888:144:303","statements":[{"expression":{"arguments":[{"id":31684,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31609,"src":"1943:11:303","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31685,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1956:10:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1956:12:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31679,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1898:20:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31681,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1919:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1898:27:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1898:29:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31683,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1928:14:303","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1898:44:303","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31687,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1898:71:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31688,"nodeType":"ExpressionStatement","src":"1898:71:303"},{"expression":{"arguments":[{"id":31694,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31673,"src":"2012:2:303","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31695,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31676,"src":"2016:8:303","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31689,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1979:13:303","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31691,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1993:6:303","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1979:20:303","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31692,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1979:22:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31693,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2002:9:303","memberName":"batchMint","nodeType":"MemberAccess","referencedDeclaration":34109,"src":"1979:32:303","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256[] memory)"}},"id":31696,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1979:46:303","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31697,"nodeType":"ExpressionStatement","src":"1979:46:303"}]},"documentation":{"id":31671,"nodeType":"StructuredDocumentation","src":"1686:120:303","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role."},"functionSelector":"4684d7e9","id":31699,"implemented":true,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"1820:9:303","nodeType":"FunctionDefinition","parameters":{"id":31677,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31673,"mutability":"mutable","name":"to","nameLocation":"1838:2:303","nodeType":"VariableDeclaration","scope":31699,"src":"1830:10:303","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31672,"name":"address","nodeType":"ElementaryTypeName","src":"1830:7:303","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31676,"mutability":"mutable","name":"tokenIds","nameLocation":"1861:8:303","nodeType":"VariableDeclaration","scope":31699,"src":"1842:27:303","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31674,"name":"uint256","nodeType":"ElementaryTypeName","src":"1842:7:303","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31675,"nodeType":"ArrayTypeName","src":"1842:9:303","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1829:41:303"},"returnParameters":{"id":31678,"nodeType":"ParameterList","parameters":[],"src":"1888:0:303"},"scope":31700,"src":"1811:221:303","stateMutability":"nonpayable","virtual":true,"visibility":"external"}],"scope":31701,"src":"740:1294:303","usedErrors":[8223,32154,32162,32167],"usedEvents":[32185]}],"src":"32:2003:303"},"id":303},"contracts/token/ERC721/base/ERC721MintableOnceBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721MintableOnceBase.sol","exportedSymbols":{"AccessControlStorage":[8851],"Context":[1206],"ERC721MintableOnceBase":[31833],"ERC721Storage":[34972],"IERC721Mintable":[33199]},"id":31834,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31702,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:304"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Mintable.sol","file":"./../interfaces/IERC721Mintable.sol","id":31704,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31834,"sourceUnit":33200,"src":"58:68:304","symbolAliases":[{"foreign":{"id":31703,"name":"IERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33199,"src":"66:15:304","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31706,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31834,"sourceUnit":34973,"src":"127:63:304","symbolAliases":[{"foreign":{"id":31705,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"135:13:304","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../../access/libraries/AccessControlStorage.sol","id":31708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31834,"sourceUnit":8852,"src":"191:90:304","symbolAliases":[{"foreign":{"id":31707,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"199:20:304","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31710,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":31834,"sourceUnit":1207,"src":"282:66:304","symbolAliases":[{"foreign":{"id":31709,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"290:7:304","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31712,"name":"IERC721Mintable","nameLocations":["786:15:304"],"nodeType":"IdentifierPath","referencedDeclaration":33199,"src":"786:15:304"},"id":31713,"nodeType":"InheritanceSpecifier","src":"786:15:304"},{"baseName":{"id":31714,"name":"Context","nameLocations":["803:7:304"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"803:7:304"},"id":31715,"nodeType":"InheritanceSpecifier","src":"803:7:304"}],"canonicalName":"ERC721MintableOnceBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31711,"nodeType":"StructuredDocumentation","src":"350:392:304","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\n @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\n @dev Note: This contract requires AccessControl."},"fullyImplemented":true,"id":31833,"linearizedBaseContracts":[31833,1206,33199],"name":"ERC721MintableOnceBase","nameLocation":"760:22:304","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31719,"libraryName":{"id":31716,"name":"ERC721Storage","nameLocations":["823:13:304"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"823:13:304"},"nodeType":"UsingForDirective","src":"817:45:304","typeName":{"id":31718,"nodeType":"UserDefinedTypeName","pathNode":{"id":31717,"name":"ERC721Storage.Layout","nameLocations":["841:13:304","855:6:304"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"841:20:304"},"referencedDeclaration":33288,"src":"841:20:304","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31723,"libraryName":{"id":31720,"name":"AccessControlStorage","nameLocations":["873:20:304"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"873:20:304"},"nodeType":"UsingForDirective","src":"867:59:304","typeName":{"id":31722,"nodeType":"UserDefinedTypeName","pathNode":{"id":31721,"name":"AccessControlStorage.Layout","nameLocations":["898:20:304","919:6:304"],"nodeType":"IdentifierPath","referencedDeclaration":8616,"src":"898:27:304"},"referencedDeclaration":8616,"src":"898:27:304","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout"}}},{"constant":true,"functionSelector":"d5391393","id":31726,"mutability":"constant","name":"MINTER_ROLE","nameLocation":"956:11:304","nodeType":"VariableDeclaration","scope":31833,"src":"932:46:304","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":31724,"name":"bytes32","nodeType":"ElementaryTypeName","src":"932:7:304","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":31725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"970:8:304","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"public"},{"baseFunctions":[33179],"body":{"id":31753,"nodeType":"Block","src":"1255:142:304","statements":[{"expression":{"arguments":[{"id":31739,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31726,"src":"1310:11:304","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31740,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1323:10:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31741,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1323:12:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31734,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1265:20:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31736,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1286:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1265:27:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1265:29:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31738,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1295:14:304","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1265:44:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1265:71:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31743,"nodeType":"ExpressionStatement","src":"1265:71:304"},{"expression":{"arguments":[{"id":31749,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31729,"src":"1378:2:304","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31750,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31731,"src":"1382:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31744,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1346:13:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1360:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1346:20:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31747,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1346:22:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31748,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1369:8:304","memberName":"mintOnce","nodeType":"MemberAccess","referencedDeclaration":34233,"src":"1346:31:304","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256)"}},"id":31751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1346:44:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31752,"nodeType":"ExpressionStatement","src":"1346:44:304"}]},"documentation":{"id":31727,"nodeType":"StructuredDocumentation","src":"985:205:304","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt."},"functionSelector":"40c10f19","id":31754,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"1204:4:304","nodeType":"FunctionDefinition","parameters":{"id":31732,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31729,"mutability":"mutable","name":"to","nameLocation":"1217:2:304","nodeType":"VariableDeclaration","scope":31754,"src":"1209:10:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31728,"name":"address","nodeType":"ElementaryTypeName","src":"1209:7:304","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31731,"mutability":"mutable","name":"tokenId","nameLocation":"1229:7:304","nodeType":"VariableDeclaration","scope":31754,"src":"1221:15:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31730,"name":"uint256","nodeType":"ElementaryTypeName","src":"1221:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1208:29:304"},"returnParameters":{"id":31733,"nodeType":"ParameterList","parameters":[],"src":"1255:0:304"},"scope":31833,"src":"1195:202:304","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33189],"body":{"id":31786,"nodeType":"Block","src":"1698:166:304","statements":[{"expression":{"arguments":[{"id":31769,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31726,"src":"1753:11:304","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31770,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1766:10:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31771,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1766:12:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31764,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"1708:20:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31766,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1729:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"1708:27:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31767,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1708:29:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31768,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1738:14:304","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"1708:44:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31772,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1708:71:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31773,"nodeType":"ExpressionStatement","src":"1708:71:304"},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31779,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1825:10:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1825:12:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31781,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31757,"src":"1839:2:304","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31782,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31759,"src":"1843:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":31783,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31761,"src":"1852:4:304","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31774,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1789:13:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31776,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1803:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1789:20:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31777,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1789:22:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31778,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1812:12:304","memberName":"safeMintOnce","nodeType":"MemberAccess","referencedDeclaration":34272,"src":"1789:35:304","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256,bytes memory)"}},"id":31784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1789:68:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31785,"nodeType":"ExpressionStatement","src":"1789:68:304"}]},"documentation":{"id":31755,"nodeType":"StructuredDocumentation","src":"1403:205:304","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt."},"functionSelector":"8832e6e3","id":31787,"implemented":true,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"1622:8:304","nodeType":"FunctionDefinition","parameters":{"id":31762,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31757,"mutability":"mutable","name":"to","nameLocation":"1639:2:304","nodeType":"VariableDeclaration","scope":31787,"src":"1631:10:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31756,"name":"address","nodeType":"ElementaryTypeName","src":"1631:7:304","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31759,"mutability":"mutable","name":"tokenId","nameLocation":"1651:7:304","nodeType":"VariableDeclaration","scope":31787,"src":"1643:15:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31758,"name":"uint256","nodeType":"ElementaryTypeName","src":"1643:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":31761,"mutability":"mutable","name":"data","nameLocation":"1675:4:304","nodeType":"VariableDeclaration","scope":31787,"src":"1660:19:304","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":31760,"name":"bytes","nodeType":"ElementaryTypeName","src":"1660:5:304","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1630:50:304"},"returnParameters":{"id":31763,"nodeType":"ParameterList","parameters":[],"src":"1698:0:304"},"scope":31833,"src":"1613:251:304","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33198],"body":{"id":31815,"nodeType":"Block","src":"2165:148:304","statements":[{"expression":{"arguments":[{"id":31801,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31726,"src":"2220:11:304","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[],"expression":{"argumentTypes":[],"id":31802,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2233:10:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31803,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2233:12:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31796,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"2175:20:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_AccessControlStorage_$8851_$","typeString":"type(library AccessControlStorage)"}},"id":31798,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2196:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":8850,"src":"2175:27:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function () pure returns (struct AccessControlStorage.Layout storage pointer)"}},"id":31799,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2175:29:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8616_storage_ptr","typeString":"struct AccessControlStorage.Layout storage pointer"}},"id":31800,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2205:14:304","memberName":"enforceHasRole","nodeType":"MemberAccess","referencedDeclaration":8814,"src":"2175:44:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8616_storage_ptr_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8616_storage_ptr_$","typeString":"function (struct AccessControlStorage.Layout storage pointer,bytes32,address) view"}},"id":31804,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2175:71:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31805,"nodeType":"ExpressionStatement","src":"2175:71:304"},{"expression":{"arguments":[{"id":31811,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31790,"src":"2293:2:304","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31812,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31793,"src":"2297:8:304","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31806,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2256:13:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2270:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2256:20:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2256:22:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31810,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2279:13:304","memberName":"batchMintOnce","nodeType":"MemberAccess","referencedDeclaration":34372,"src":"2256:36:304","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256[] memory)"}},"id":31813,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2256:50:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31814,"nodeType":"ExpressionStatement","src":"2256:50:304"}]},"documentation":{"id":31788,"nodeType":"StructuredDocumentation","src":"1870:213:304","text":"@inheritdoc IERC721Mintable\n @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\n @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt."},"functionSelector":"4684d7e9","id":31816,"implemented":true,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"2097:9:304","nodeType":"FunctionDefinition","parameters":{"id":31794,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31790,"mutability":"mutable","name":"to","nameLocation":"2115:2:304","nodeType":"VariableDeclaration","scope":31816,"src":"2107:10:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31789,"name":"address","nodeType":"ElementaryTypeName","src":"2107:7:304","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31793,"mutability":"mutable","name":"tokenIds","nameLocation":"2138:8:304","nodeType":"VariableDeclaration","scope":31816,"src":"2119:27:304","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":31791,"name":"uint256","nodeType":"ElementaryTypeName","src":"2119:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":31792,"nodeType":"ArrayTypeName","src":"2119:9:304","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"2106:41:304"},"returnParameters":{"id":31795,"nodeType":"ParameterList","parameters":[],"src":"2165:0:304"},"scope":31833,"src":"2088:225:304","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":31831,"nodeType":"Block","src":"2557:64:304","statements":[{"expression":{"arguments":[{"id":31828,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31819,"src":"2606:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31824,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2574:13:304","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31825,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2588:6:304","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2574:20:304","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31826,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2574:22:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31827,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2597:8:304","memberName":"wasBurnt","nodeType":"MemberAccess","referencedDeclaration":34844,"src":"2574:31:304","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_bool_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (bool)"}},"id":31829,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2574:40:304","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":31823,"id":31830,"nodeType":"Return","src":"2567:47:304"}]},"documentation":{"id":31817,"nodeType":"StructuredDocumentation","src":"2319:147:304","text":"@notice Gets whether a token was burnt.\n @param tokenId The token identifier.\n @return tokenWasBurnt Whether the token was burnt."},"functionSelector":"c77c6955","id":31832,"implemented":true,"kind":"function","modifiers":[],"name":"wasBurnt","nameLocation":"2480:8:304","nodeType":"FunctionDefinition","parameters":{"id":31820,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31819,"mutability":"mutable","name":"tokenId","nameLocation":"2497:7:304","nodeType":"VariableDeclaration","scope":31832,"src":"2489:15:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31818,"name":"uint256","nodeType":"ElementaryTypeName","src":"2489:7:304","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2488:17:304"},"returnParameters":{"id":31823,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31822,"mutability":"mutable","name":"tokenWasBurnt","nameLocation":"2542:13:304","nodeType":"VariableDeclaration","scope":31832,"src":"2537:18:304","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":31821,"name":"bool","nodeType":"ElementaryTypeName","src":"2537:4:304","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2536:20:304"},"scope":31833,"src":"2471:150:304","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":31834,"src":"742:1881:304","usedErrors":[8223,32154,32162,32167,32174],"usedEvents":[32185]}],"src":"32:2592:304"},"id":304},"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol":{"ast":{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","exportedSymbols":{"Context":[1206],"ERC721Storage":[34972],"ERC721WithOperatorFiltererBase":[32102],"IERC721":[33094],"OperatorFiltererStorage":[37870]},"id":32103,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":31835,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:305"},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../interfaces/IERC721.sol","id":31837,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32103,"sourceUnit":33095,"src":"58:52:305","symbolAliases":[{"foreign":{"id":31836,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"66:7:305","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":31839,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32103,"sourceUnit":34973,"src":"111:63:305","symbolAliases":[{"foreign":{"id":31838,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"119:13:305","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../royalty/libraries/OperatorFiltererStorage.sol","id":31841,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32103,"sourceUnit":37871,"src":"175:94:305","symbolAliases":[{"foreign":{"id":31840,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"183:23:305","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":31843,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32103,"sourceUnit":1207,"src":"270:66:305","symbolAliases":[{"foreign":{"id":31842,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"278:7:305","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":31845,"name":"IERC721","nameLocations":["695:7:305"],"nodeType":"IdentifierPath","referencedDeclaration":33094,"src":"695:7:305"},"id":31846,"nodeType":"InheritanceSpecifier","src":"695:7:305"},{"baseName":{"id":31847,"name":"Context","nameLocations":["704:7:305"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"704:7:305"},"id":31848,"nodeType":"InheritanceSpecifier","src":"704:7:305"}],"canonicalName":"ERC721WithOperatorFiltererBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":31844,"nodeType":"StructuredDocumentation","src":"338:305:305","text":"@title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard).\n @dev Note: This contract requires OperatorFilterer."},"fullyImplemented":true,"id":32102,"linearizedBaseContracts":[32102,1206,33094],"name":"ERC721WithOperatorFiltererBase","nameLocation":"661:30:305","nodeType":"ContractDefinition","nodes":[{"global":false,"id":31852,"libraryName":{"id":31849,"name":"ERC721Storage","nameLocations":["724:13:305"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"724:13:305"},"nodeType":"UsingForDirective","src":"718:45:305","typeName":{"id":31851,"nodeType":"UserDefinedTypeName","pathNode":{"id":31850,"name":"ERC721Storage.Layout","nameLocations":["742:13:305","756:6:305"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"742:20:305"},"referencedDeclaration":33288,"src":"742:20:305","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":31856,"libraryName":{"id":31853,"name":"OperatorFiltererStorage","nameLocations":["774:23:305"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"774:23:305"},"nodeType":"UsingForDirective","src":"768:65:305","typeName":{"id":31855,"nodeType":"UserDefinedTypeName","pathNode":{"id":31854,"name":"OperatorFiltererStorage.Layout","nameLocations":["802:23:305","826:6:305"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"802:30:305"},"referencedDeclaration":37673,"src":"802:30:305","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"baseFunctions":[33019],"body":{"id":31891,"nodeType":"Block","src":"1054:200:305","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":31869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":31864,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31859,"src":"1068:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":31867,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1082:1:305","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":31866,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1074:7:305","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":31865,"name":"address","nodeType":"ElementaryTypeName","src":"1074:7:305","typeDescriptions":{}}},"id":31868,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1074:10:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1068:16:305","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":31879,"nodeType":"IfStatement","src":"1064:117:305","trueBody":{"id":31878,"nodeType":"Block","src":"1086:95:305","statements":[{"expression":{"arguments":[{"id":31875,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31859,"src":"1167:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31870,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1100:23:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1124:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1100:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31873,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1100:32:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31874,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1133:33:305","memberName":"requireAllowedOperatorForApproval","nodeType":"MemberAccess","referencedDeclaration":37794,"src":"1100:66:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address) view"}},"id":31876,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1100:70:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31877,"nodeType":"ExpressionStatement","src":"1100:70:305"}]}},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31885,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1221:10:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1221:12:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31887,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31859,"src":"1235:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31888,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31861,"src":"1239:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31880,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1190:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31882,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1204:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1190:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31883,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1190:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31884,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1213:7:305","memberName":"approve","nodeType":"MemberAccess","referencedDeclaration":33534,"src":"1190:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,uint256)"}},"id":31889,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1190:57:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31890,"nodeType":"ExpressionStatement","src":"1190:57:305"}]},"documentation":{"id":31857,"nodeType":"StructuredDocumentation","src":"839:147:305","text":"@inheritdoc IERC721\n @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry."},"functionSelector":"095ea7b3","id":31892,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"1000:7:305","nodeType":"FunctionDefinition","parameters":{"id":31862,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31859,"mutability":"mutable","name":"to","nameLocation":"1016:2:305","nodeType":"VariableDeclaration","scope":31892,"src":"1008:10:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31858,"name":"address","nodeType":"ElementaryTypeName","src":"1008:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31861,"mutability":"mutable","name":"tokenId","nameLocation":"1028:7:305","nodeType":"VariableDeclaration","scope":31892,"src":"1020:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31860,"name":"uint256","nodeType":"ElementaryTypeName","src":"1020:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1007:29:305"},"returnParameters":{"id":31863,"nodeType":"ParameterList","parameters":[],"src":"1054:0:305"},"scope":32102,"src":"991:263:305","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33027],"body":{"id":31922,"nodeType":"Block","src":"1490:215:305","statements":[{"condition":{"id":31900,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31897,"src":"1504:8:305","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":31910,"nodeType":"IfStatement","src":"1500:115:305","trueBody":{"id":31909,"nodeType":"Block","src":"1514:101:305","statements":[{"expression":{"arguments":[{"id":31906,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31895,"src":"1595:8:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31901,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1528:23:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1552:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1528:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31904,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1528:32:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31905,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1561:33:305","memberName":"requireAllowedOperatorForApproval","nodeType":"MemberAccess","referencedDeclaration":37794,"src":"1528:66:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address) view"}},"id":31907,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1528:76:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31908,"nodeType":"ExpressionStatement","src":"1528:76:305"}]}},{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":31916,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1665:10:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31917,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1665:12:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31918,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31895,"src":"1679:8:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31919,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31897,"src":"1689:8:305","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31911,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1624:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1638:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"1624:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31914,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1624:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31915,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1647:17:305","memberName":"setApprovalForAll","nodeType":"MemberAccess","referencedDeclaration":33572,"src":"1624:40:305","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,bool)"}},"id":31920,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1624:74:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31921,"nodeType":"ExpressionStatement","src":"1624:74:305"}]},"documentation":{"id":31893,"nodeType":"StructuredDocumentation","src":"1260:148:305","text":"@inheritdoc IERC721\n @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry."},"functionSelector":"a22cb465","id":31923,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"1422:17:305","nodeType":"FunctionDefinition","parameters":{"id":31898,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31895,"mutability":"mutable","name":"operator","nameLocation":"1448:8:305","nodeType":"VariableDeclaration","scope":31923,"src":"1440:16:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31894,"name":"address","nodeType":"ElementaryTypeName","src":"1440:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31897,"mutability":"mutable","name":"approved","nameLocation":"1463:8:305","nodeType":"VariableDeclaration","scope":31923,"src":"1458:13:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":31896,"name":"bool","nodeType":"ElementaryTypeName","src":"1458:4:305","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1439:33:305"},"returnParameters":{"id":31899,"nodeType":"ParameterList","parameters":[],"src":"1490:0:305"},"scope":32102,"src":"1413:292:305","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33037],"body":{"id":31958,"nodeType":"Block","src":"1941:208:305","statements":[{"assignments":[31934],"declarations":[{"constant":false,"id":31934,"mutability":"mutable","name":"sender","nameLocation":"1959:6:305","nodeType":"VariableDeclaration","scope":31958,"src":"1951:14:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31933,"name":"address","nodeType":"ElementaryTypeName","src":"1951:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":31937,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":31935,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1968:10:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31936,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1968:12:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1951:29:305"},{"expression":{"arguments":[{"id":31943,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31934,"src":"2057:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31944,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31926,"src":"2065:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31938,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1990:23:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31940,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2014:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1990:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31941,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1990:32:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31942,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2023:33:305","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"1990:66:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":31945,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1990:80:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31946,"nodeType":"ExpressionStatement","src":"1990:80:305"},{"expression":{"arguments":[{"id":31952,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31934,"src":"2116:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31953,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31926,"src":"2124:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31954,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31928,"src":"2130:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31955,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31930,"src":"2134:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31947,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2080:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31949,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2094:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2080:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31950,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2080:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31951,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2103:12:305","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33689,"src":"2080:35:305","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":31956,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2080:62:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31957,"nodeType":"ExpressionStatement","src":"2080:62:305"}]},"documentation":{"id":31924,"nodeType":"StructuredDocumentation","src":"1711:143:305","text":"@inheritdoc IERC721\n @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"23b872dd","id":31959,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"1868:12:305","nodeType":"FunctionDefinition","parameters":{"id":31931,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31926,"mutability":"mutable","name":"from","nameLocation":"1889:4:305","nodeType":"VariableDeclaration","scope":31959,"src":"1881:12:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31925,"name":"address","nodeType":"ElementaryTypeName","src":"1881:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31928,"mutability":"mutable","name":"to","nameLocation":"1903:2:305","nodeType":"VariableDeclaration","scope":31959,"src":"1895:10:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31927,"name":"address","nodeType":"ElementaryTypeName","src":"1895:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31930,"mutability":"mutable","name":"tokenId","nameLocation":"1915:7:305","nodeType":"VariableDeclaration","scope":31959,"src":"1907:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31929,"name":"uint256","nodeType":"ElementaryTypeName","src":"1907:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1880:43:305"},"returnParameters":{"id":31932,"nodeType":"ParameterList","parameters":[],"src":"1941:0:305"},"scope":32102,"src":"1859:290:305","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33047],"body":{"id":31994,"nodeType":"Block","src":"2389:212:305","statements":[{"assignments":[31970],"declarations":[{"constant":false,"id":31970,"mutability":"mutable","name":"sender","nameLocation":"2407:6:305","nodeType":"VariableDeclaration","scope":31994,"src":"2399:14:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31969,"name":"address","nodeType":"ElementaryTypeName","src":"2399:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":31973,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":31971,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2416:10:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":31972,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2416:12:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2399:29:305"},{"expression":{"arguments":[{"id":31979,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31970,"src":"2505:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31980,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31962,"src":"2513:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31974,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"2438:23:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":31976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2462:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"2438:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":31977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2438:32:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":31978,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2471:33:305","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"2438:66:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":31981,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2438:80:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31982,"nodeType":"ExpressionStatement","src":"2438:80:305"},{"expression":{"arguments":[{"id":31988,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31970,"src":"2568:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31989,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31962,"src":"2576:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31990,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31964,"src":"2582:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":31991,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31966,"src":"2586:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":31983,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2528:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":31985,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2542:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"2528:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":31986,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2528:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":31987,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2551:16:305","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33727,"src":"2528:39:305","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":31992,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2528:66:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":31993,"nodeType":"ExpressionStatement","src":"2528:66:305"}]},"documentation":{"id":31960,"nodeType":"StructuredDocumentation","src":"2155:143:305","text":"@inheritdoc IERC721\n @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"42842e0e","id":31995,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"2312:16:305","nodeType":"FunctionDefinition","parameters":{"id":31967,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31962,"mutability":"mutable","name":"from","nameLocation":"2337:4:305","nodeType":"VariableDeclaration","scope":31995,"src":"2329:12:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31961,"name":"address","nodeType":"ElementaryTypeName","src":"2329:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31964,"mutability":"mutable","name":"to","nameLocation":"2351:2:305","nodeType":"VariableDeclaration","scope":31995,"src":"2343:10:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31963,"name":"address","nodeType":"ElementaryTypeName","src":"2343:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":31966,"mutability":"mutable","name":"tokenId","nameLocation":"2363:7:305","nodeType":"VariableDeclaration","scope":31995,"src":"2355:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":31965,"name":"uint256","nodeType":"ElementaryTypeName","src":"2355:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2328:43:305"},"returnParameters":{"id":31968,"nodeType":"ParameterList","parameters":[],"src":"2389:0:305"},"scope":32102,"src":"2303:298:305","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33059],"body":{"id":32033,"nodeType":"Block","src":"2862:218:305","statements":[{"assignments":[32008],"declarations":[{"constant":false,"id":32008,"mutability":"mutable","name":"sender","nameLocation":"2880:6:305","nodeType":"VariableDeclaration","scope":32033,"src":"2872:14:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32007,"name":"address","nodeType":"ElementaryTypeName","src":"2872:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":32011,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":32009,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"2889:10:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2889:12:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"2872:29:305"},{"expression":{"arguments":[{"id":32017,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32008,"src":"2978:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":32018,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31998,"src":"2986:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32012,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"2911:23:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":32014,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2935:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"2911:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":32015,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2911:32:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":32016,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2944:33:305","memberName":"requireAllowedOperatorForTransfer","nodeType":"MemberAccess","referencedDeclaration":37779,"src":"2911:66:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address,address) view"}},"id":32019,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2911:80:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32020,"nodeType":"ExpressionStatement","src":"2911:80:305"},{"expression":{"arguments":[{"id":32026,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32008,"src":"3041:6:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":32027,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31998,"src":"3049:4:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":32028,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32000,"src":"3055:2:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":32029,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32002,"src":"3059:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":32030,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32004,"src":"3068:4:305","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32021,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3001:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32023,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3015:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"3001:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":32024,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3001:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":32025,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3024:16:305","memberName":"safeTransferFrom","nodeType":"MemberAccess","referencedDeclaration":33767,"src":"3001:39:305","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256,bytes calldata)"}},"id":32031,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3001:72:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32032,"nodeType":"ExpressionStatement","src":"3001:72:305"}]},"documentation":{"id":31996,"nodeType":"StructuredDocumentation","src":"2607:143:305","text":"@inheritdoc IERC721\n @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry."},"functionSelector":"b88d4fde","id":32034,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"2764:16:305","nodeType":"FunctionDefinition","parameters":{"id":32005,"nodeType":"ParameterList","parameters":[{"constant":false,"id":31998,"mutability":"mutable","name":"from","nameLocation":"2789:4:305","nodeType":"VariableDeclaration","scope":32034,"src":"2781:12:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31997,"name":"address","nodeType":"ElementaryTypeName","src":"2781:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32000,"mutability":"mutable","name":"to","nameLocation":"2803:2:305","nodeType":"VariableDeclaration","scope":32034,"src":"2795:10:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":31999,"name":"address","nodeType":"ElementaryTypeName","src":"2795:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32002,"mutability":"mutable","name":"tokenId","nameLocation":"2815:7:305","nodeType":"VariableDeclaration","scope":32034,"src":"2807:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32001,"name":"uint256","nodeType":"ElementaryTypeName","src":"2807:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":32004,"mutability":"mutable","name":"data","nameLocation":"2839:4:305","nodeType":"VariableDeclaration","scope":32034,"src":"2824:19:305","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32003,"name":"bytes","nodeType":"ElementaryTypeName","src":"2824:5:305","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2780:64:305"},"returnParameters":{"id":32006,"nodeType":"ParameterList","parameters":[],"src":"2862:0:305"},"scope":32102,"src":"2755:325:305","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[33067],"body":{"id":32049,"nodeType":"Block","src":"3196:63:305","statements":[{"expression":{"arguments":[{"id":32046,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32037,"src":"3246:5:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32042,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3213:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32043,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3227:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"3213:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":32044,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3213:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":32045,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3236:9:305","memberName":"balanceOf","nodeType":"MemberAccess","referencedDeclaration":34728,"src":"3213:32:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$returns$_t_uint256_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address) view returns (uint256)"}},"id":32047,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3213:39:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":32041,"id":32048,"nodeType":"Return","src":"3206:46:305"}]},"documentation":{"id":32035,"nodeType":"StructuredDocumentation","src":"3086:23:305","text":"@inheritdoc IERC721"},"functionSelector":"70a08231","id":32050,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"3123:9:305","nodeType":"FunctionDefinition","parameters":{"id":32038,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32037,"mutability":"mutable","name":"owner","nameLocation":"3141:5:305","nodeType":"VariableDeclaration","scope":32050,"src":"3133:13:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32036,"name":"address","nodeType":"ElementaryTypeName","src":"3133:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3132:15:305"},"returnParameters":{"id":32041,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32040,"mutability":"mutable","name":"balance","nameLocation":"3187:7:305","nodeType":"VariableDeclaration","scope":32050,"src":"3179:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32039,"name":"uint256","nodeType":"ElementaryTypeName","src":"3179:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3178:17:305"},"scope":32102,"src":"3114:145:305","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33075],"body":{"id":32065,"nodeType":"Block","src":"3378:63:305","statements":[{"expression":{"arguments":[{"id":32062,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32053,"src":"3426:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32058,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3395:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32059,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3409:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"3395:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":32060,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3395:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":32061,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3418:7:305","memberName":"ownerOf","nodeType":"MemberAccess","referencedDeclaration":34760,"src":"3395:30:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_address_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (address)"}},"id":32063,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3395:39:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32057,"id":32064,"nodeType":"Return","src":"3388:46:305"}]},"documentation":{"id":32051,"nodeType":"StructuredDocumentation","src":"3265:23:305","text":"@inheritdoc IERC721"},"functionSelector":"6352211e","id":32066,"implemented":true,"kind":"function","modifiers":[],"name":"ownerOf","nameLocation":"3302:7:305","nodeType":"FunctionDefinition","parameters":{"id":32054,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32053,"mutability":"mutable","name":"tokenId","nameLocation":"3318:7:305","nodeType":"VariableDeclaration","scope":32066,"src":"3310:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32052,"name":"uint256","nodeType":"ElementaryTypeName","src":"3310:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3309:17:305"},"returnParameters":{"id":32057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32056,"mutability":"mutable","name":"tokenOwner","nameLocation":"3366:10:305","nodeType":"VariableDeclaration","scope":32066,"src":"3358:18:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32055,"name":"address","nodeType":"ElementaryTypeName","src":"3358:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3357:20:305"},"scope":32102,"src":"3293:148:305","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33083],"body":{"id":32081,"nodeType":"Block","src":"3562:67:305","statements":[{"expression":{"arguments":[{"id":32078,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32069,"src":"3614:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32074,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3579:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32075,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3593:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"3579:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":32076,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3579:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":32077,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3602:11:305","memberName":"getApproved","nodeType":"MemberAccess","referencedDeclaration":34804,"src":"3579:34:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_uint256_$returns$_t_address_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,uint256) view returns (address)"}},"id":32079,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3579:43:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32073,"id":32080,"nodeType":"Return","src":"3572:50:305"}]},"documentation":{"id":32067,"nodeType":"StructuredDocumentation","src":"3447:23:305","text":"@inheritdoc IERC721"},"functionSelector":"081812fc","id":32082,"implemented":true,"kind":"function","modifiers":[],"name":"getApproved","nameLocation":"3484:11:305","nodeType":"FunctionDefinition","parameters":{"id":32070,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32069,"mutability":"mutable","name":"tokenId","nameLocation":"3504:7:305","nodeType":"VariableDeclaration","scope":32082,"src":"3496:15:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32068,"name":"uint256","nodeType":"ElementaryTypeName","src":"3496:7:305","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3495:17:305"},"returnParameters":{"id":32073,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32072,"mutability":"mutable","name":"approved","nameLocation":"3552:8:305","nodeType":"VariableDeclaration","scope":32082,"src":"3544:16:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32071,"name":"address","nodeType":"ElementaryTypeName","src":"3544:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3543:18:305"},"scope":32102,"src":"3475:154:305","stateMutability":"view","virtual":true,"visibility":"external"},{"baseFunctions":[33093],"body":{"id":32100,"nodeType":"Block","src":"3774:80:305","statements":[{"expression":{"arguments":[{"id":32096,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32085,"src":"3831:5:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":32097,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32087,"src":"3838:8:305","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32092,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3791:13:305","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3805:6:305","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":34856,"src":"3791:20:305","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function () pure returns (struct ERC721Storage.Layout storage pointer)"}},"id":32094,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3791:22:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":32095,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3814:16:305","memberName":"isApprovedForAll","nodeType":"MemberAccess","referencedDeclaration":34825,"src":"3791:39:305","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":32098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3791:56:305","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":32091,"id":32099,"nodeType":"Return","src":"3784:63:305"}]},"documentation":{"id":32083,"nodeType":"StructuredDocumentation","src":"3635:23:305","text":"@inheritdoc IERC721"},"functionSelector":"e985e9c5","id":32101,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"3672:16:305","nodeType":"FunctionDefinition","parameters":{"id":32088,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32085,"mutability":"mutable","name":"owner","nameLocation":"3697:5:305","nodeType":"VariableDeclaration","scope":32101,"src":"3689:13:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32084,"name":"address","nodeType":"ElementaryTypeName","src":"3689:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32087,"mutability":"mutable","name":"operator","nameLocation":"3712:8:305","nodeType":"VariableDeclaration","scope":32101,"src":"3704:16:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32086,"name":"address","nodeType":"ElementaryTypeName","src":"3704:7:305","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3688:33:305"},"returnParameters":{"id":32091,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32090,"mutability":"mutable","name":"approvedForAll","nameLocation":"3758:14:305","nodeType":"VariableDeclaration","scope":32101,"src":"3753:19:305","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":32089,"name":"bool","nodeType":"ElementaryTypeName","src":"3753:4:305","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3752:21:305"},"scope":32102,"src":"3663:191:305","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":32103,"src":"643:3213:305","usedErrors":[32109,32114,32123,32126,32131,32140,32147,32154,32157,37090],"usedEvents":[32185,32194,32203]}],"src":"32:3825:305"},"id":305},"contracts/token/ERC721/errors/ERC721Errors.sol":{"ast":{"absolutePath":"contracts/token/ERC721/errors/ERC721Errors.sol","exportedSymbols":{"ERC721BalanceOfAddressZero":[32157],"ERC721NonApprovedForApproval":[32123],"ERC721NonApprovedForTransfer":[32140],"ERC721NonExistingToken":[32131],"ERC721NonOwnedToken":[32147],"ERC721SafeTransferRejected":[32154],"ERC721SelfApproval":[32109],"ERC721SelfApprovalForAll":[32114],"ERC721TransferToAddressZero":[32126]},"id":32158,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32104,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:306"},{"documentation":{"id":32105,"nodeType":"StructuredDocumentation","src":"58:108:306","text":"@notice Thrown when trying to approve oneself.\n @param account The account trying to approve itself."},"errorSelector":"b7fdc010","id":32109,"name":"ERC721SelfApproval","nameLocation":"172:18:306","nodeType":"ErrorDefinition","parameters":{"id":32108,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32107,"mutability":"mutable","name":"account","nameLocation":"199:7:306","nodeType":"VariableDeclaration","scope":32109,"src":"191:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32106,"name":"address","nodeType":"ElementaryTypeName","src":"191:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"190:17:306"},"src":"166:42:306"},{"documentation":{"id":32110,"nodeType":"StructuredDocumentation","src":"210:120:306","text":"@notice Thrown when trying to approveForAll oneself.\n @param account The account trying to approveForAll itself."},"errorSelector":"e4215c6a","id":32114,"name":"ERC721SelfApprovalForAll","nameLocation":"336:24:306","nodeType":"ErrorDefinition","parameters":{"id":32113,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32112,"mutability":"mutable","name":"account","nameLocation":"369:7:306","nodeType":"VariableDeclaration","scope":32114,"src":"361:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32111,"name":"address","nodeType":"ElementaryTypeName","src":"361:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"360:17:306"},"src":"330:48:306"},{"documentation":{"id":32115,"nodeType":"StructuredDocumentation","src":"380:207:306","text":"@notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\n @param sender The message sender.\n @param tokenId The identifier of the token."},"errorSelector":"c7563a18","id":32123,"name":"ERC721NonApprovedForApproval","nameLocation":"593:28:306","nodeType":"ErrorDefinition","parameters":{"id":32122,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32117,"mutability":"mutable","name":"sender","nameLocation":"630:6:306","nodeType":"VariableDeclaration","scope":32123,"src":"622:14:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32116,"name":"address","nodeType":"ElementaryTypeName","src":"622:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32119,"mutability":"mutable","name":"owner","nameLocation":"646:5:306","nodeType":"VariableDeclaration","scope":32123,"src":"638:13:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32118,"name":"address","nodeType":"ElementaryTypeName","src":"638:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32121,"mutability":"mutable","name":"tokenId","nameLocation":"661:7:306","nodeType":"VariableDeclaration","scope":32123,"src":"653:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32120,"name":"uint256","nodeType":"ElementaryTypeName","src":"653:7:306","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"621:48:306"},"src":"587:83:306"},{"documentation":{"id":32124,"nodeType":"StructuredDocumentation","src":"672:66:306","text":"@notice Thrown when transferring a token to the zero address."},"errorSelector":"86c87067","id":32126,"name":"ERC721TransferToAddressZero","nameLocation":"744:27:306","nodeType":"ErrorDefinition","parameters":{"id":32125,"nodeType":"ParameterList","parameters":[],"src":"771:2:306"},"src":"738:36:306"},{"documentation":{"id":32127,"nodeType":"StructuredDocumentation","src":"776:132:306","text":"@notice Thrown when a token does not exist but is required to.\n @param tokenId The identifier of the token that was checked."},"errorSelector":"dd560475","id":32131,"name":"ERC721NonExistingToken","nameLocation":"914:22:306","nodeType":"ErrorDefinition","parameters":{"id":32130,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32129,"mutability":"mutable","name":"tokenId","nameLocation":"945:7:306","nodeType":"VariableDeclaration","scope":32131,"src":"937:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32128,"name":"uint256","nodeType":"ElementaryTypeName","src":"937:7:306","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"936:17:306"},"src":"908:46:306"},{"documentation":{"id":32132,"nodeType":"StructuredDocumentation","src":"956:197:306","text":"@notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\n @param sender The message sender.\n @param tokenId The identifier of the token."},"errorSelector":"a4a3018b","id":32140,"name":"ERC721NonApprovedForTransfer","nameLocation":"1159:28:306","nodeType":"ErrorDefinition","parameters":{"id":32139,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32134,"mutability":"mutable","name":"sender","nameLocation":"1196:6:306","nodeType":"VariableDeclaration","scope":32140,"src":"1188:14:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32133,"name":"address","nodeType":"ElementaryTypeName","src":"1188:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32136,"mutability":"mutable","name":"owner","nameLocation":"1212:5:306","nodeType":"VariableDeclaration","scope":32140,"src":"1204:13:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32135,"name":"address","nodeType":"ElementaryTypeName","src":"1204:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32138,"mutability":"mutable","name":"tokenId","nameLocation":"1227:7:306","nodeType":"VariableDeclaration","scope":32140,"src":"1219:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32137,"name":"uint256","nodeType":"ElementaryTypeName","src":"1219:7:306","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1187:48:306"},"src":"1153:83:306"},{"documentation":{"id":32141,"nodeType":"StructuredDocumentation","src":"1238:185:306","text":"@notice Thrown when a token is not owned by the expected account.\n @param account The account that was expected to own the token.\n @param tokenId The identifier of the token."},"errorSelector":"14dbb536","id":32147,"name":"ERC721NonOwnedToken","nameLocation":"1429:19:306","nodeType":"ErrorDefinition","parameters":{"id":32146,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32143,"mutability":"mutable","name":"account","nameLocation":"1457:7:306","nodeType":"VariableDeclaration","scope":32147,"src":"1449:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32142,"name":"address","nodeType":"ElementaryTypeName","src":"1449:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32145,"mutability":"mutable","name":"tokenId","nameLocation":"1474:7:306","nodeType":"VariableDeclaration","scope":32147,"src":"1466:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32144,"name":"uint256","nodeType":"ElementaryTypeName","src":"1466:7:306","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1448:34:306"},"src":"1423:60:306"},{"documentation":{"id":32148,"nodeType":"StructuredDocumentation","src":"1485:172:306","text":"@notice Thrown when a safe transfer is rejected by the recipient contract.\n @param recipient The recipient contract.\n @param tokenId The identifier of the token."},"errorSelector":"c215a7a1","id":32154,"name":"ERC721SafeTransferRejected","nameLocation":"1663:26:306","nodeType":"ErrorDefinition","parameters":{"id":32153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32150,"mutability":"mutable","name":"recipient","nameLocation":"1698:9:306","nodeType":"VariableDeclaration","scope":32154,"src":"1690:17:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32149,"name":"address","nodeType":"ElementaryTypeName","src":"1690:7:306","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32152,"mutability":"mutable","name":"tokenId","nameLocation":"1717:7:306","nodeType":"VariableDeclaration","scope":32154,"src":"1709:15:306","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32151,"name":"uint256","nodeType":"ElementaryTypeName","src":"1709:7:306","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1689:36:306"},"src":"1657:69:306"},{"documentation":{"id":32155,"nodeType":"StructuredDocumentation","src":"1728:66:306","text":"@notice Thrown when querying the balance of the zero address."},"errorSelector":"aefbce4e","id":32157,"name":"ERC721BalanceOfAddressZero","nameLocation":"1800:26:306","nodeType":"ErrorDefinition","parameters":{"id":32156,"nodeType":"ParameterList","parameters":[],"src":"1826:2:306"},"src":"1794:35:306"}],"src":"32:1798:306"},"id":306},"contracts/token/ERC721/errors/ERC721MintableErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC721/errors/ERC721MintableErrors.sol","exportedSymbols":{"ERC721ExistingToken":[32167],"ERC721MintToAddressZero":[32162]},"id":32168,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32159,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:307"},{"documentation":{"id":32160,"nodeType":"StructuredDocumentation","src":"58:61:307","text":"@notice Thrown when minting a token to the zero address."},"errorSelector":"7851b9cd","id":32162,"name":"ERC721MintToAddressZero","nameLocation":"125:23:307","nodeType":"ErrorDefinition","parameters":{"id":32161,"nodeType":"ParameterList","parameters":[],"src":"148:2:307"},"src":"119:32:307"},{"documentation":{"id":32163,"nodeType":"StructuredDocumentation","src":"153:129:307","text":"@notice Thrown when minting a token that already exists.\n @param tokenId The identifier of the token that already exists."},"errorSelector":"753eceac","id":32167,"name":"ERC721ExistingToken","nameLocation":"288:19:307","nodeType":"ErrorDefinition","parameters":{"id":32166,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32165,"mutability":"mutable","name":"tokenId","nameLocation":"316:7:307","nodeType":"VariableDeclaration","scope":32167,"src":"308:15:307","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32164,"name":"uint256","nodeType":"ElementaryTypeName","src":"308:7:307","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"307:17:307"},"src":"282:43:307"}],"src":"32:294:307"},"id":307},"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol":{"ast":{"absolutePath":"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol","exportedSymbols":{"ERC721BurntToken":[32174]},"id":32175,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32169,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:308"},{"documentation":{"id":32170,"nodeType":"StructuredDocumentation","src":"58:174:308","text":"@notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\n @param tokenId The identifier of the token that has been burnt before."},"errorSelector":"31e8d3d5","id":32174,"name":"ERC721BurntToken","nameLocation":"238:16:308","nodeType":"ErrorDefinition","parameters":{"id":32173,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32172,"mutability":"mutable","name":"tokenId","nameLocation":"263:7:308","nodeType":"VariableDeclaration","scope":32174,"src":"255:15:308","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32171,"name":"uint256","nodeType":"ElementaryTypeName","src":"255:7:308","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"254:17:308"},"src":"232:40:308"}],"src":"32:241:308"},"id":308},"contracts/token/ERC721/events/ERC721Events.sol":{"ast":{"absolutePath":"contracts/token/ERC721/events/ERC721Events.sol","exportedSymbols":{"Approval":[32194],"ApprovalForAll":[32203],"Transfer":[32185]},"id":32204,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32176,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:309"},{"anonymous":false,"documentation":{"id":32177,"nodeType":"StructuredDocumentation","src":"58:179:309","text":"@notice Emitted when a token is transferred.\n @param from The previous token owner.\n @param to The new token owner.\n @param tokenId The transferred token identifier."},"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","id":32185,"name":"Transfer","nameLocation":"243:8:309","nodeType":"EventDefinition","parameters":{"id":32184,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32179,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"268:4:309","nodeType":"VariableDeclaration","scope":32185,"src":"252:20:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32178,"name":"address","nodeType":"ElementaryTypeName","src":"252:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32181,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"290:2:309","nodeType":"VariableDeclaration","scope":32185,"src":"274:18:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32180,"name":"address","nodeType":"ElementaryTypeName","src":"274:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32183,"indexed":true,"mutability":"mutable","name":"tokenId","nameLocation":"310:7:309","nodeType":"VariableDeclaration","scope":32185,"src":"294:23:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32182,"name":"uint256","nodeType":"ElementaryTypeName","src":"294:7:309","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"251:67:309"},"src":"237:82:309"},{"anonymous":false,"documentation":{"id":32186,"nodeType":"StructuredDocumentation","src":"321:183:309","text":"@notice Emitted when a single token approval is set.\n @param owner The token owner.\n @param approved The approved address.\n @param tokenId The approved token identifier."},"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","id":32194,"name":"Approval","nameLocation":"510:8:309","nodeType":"EventDefinition","parameters":{"id":32193,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32188,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"535:5:309","nodeType":"VariableDeclaration","scope":32194,"src":"519:21:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32187,"name":"address","nodeType":"ElementaryTypeName","src":"519:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32190,"indexed":true,"mutability":"mutable","name":"approved","nameLocation":"558:8:309","nodeType":"VariableDeclaration","scope":32194,"src":"542:24:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32189,"name":"address","nodeType":"ElementaryTypeName","src":"542:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32192,"indexed":true,"mutability":"mutable","name":"tokenId","nameLocation":"584:7:309","nodeType":"VariableDeclaration","scope":32194,"src":"568:23:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":32191,"name":"uint256","nodeType":"ElementaryTypeName","src":"568:7:309","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"518:74:309"},"src":"504:89:309"},{"anonymous":false,"documentation":{"id":32195,"nodeType":"StructuredDocumentation","src":"595:222:309","text":"@notice Emitted when an approval for all tokens is set or unset.\n @param owner The tokens owner.\n @param operator The approved address.\n @param approved True when then approval is set, false when it is unset."},"eventSelector":"17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31","id":32203,"name":"ApprovalForAll","nameLocation":"823:14:309","nodeType":"EventDefinition","parameters":{"id":32202,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32197,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"854:5:309","nodeType":"VariableDeclaration","scope":32203,"src":"838:21:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32196,"name":"address","nodeType":"ElementaryTypeName","src":"838:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32199,"indexed":true,"mutability":"mutable","name":"operator","nameLocation":"877:8:309","nodeType":"VariableDeclaration","scope":32203,"src":"861:24:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32198,"name":"address","nodeType":"ElementaryTypeName","src":"861:7:309","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":32201,"indexed":false,"mutability":"mutable","name":"approved","nameLocation":"892:8:309","nodeType":"VariableDeclaration","scope":32203,"src":"887:13:309","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":32200,"name":"bool","nodeType":"ElementaryTypeName","src":"887:4:309","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"837:64:309"},"src":"817:85:309"}],"src":"32:871:309"},"id":309},"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol","exportedSymbols":{"Context":[1206],"ERC721BatchTransferBase":[31269],"ERC721BatchTransferFacet":[32284],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32285,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32205,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:310"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32207,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":13387,"src":"57:87:310","symbolAliases":[{"foreign":{"id":32206,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32209,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":34973,"src":"145:63:310","symbolAliases":[{"foreign":{"id":32208,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32211,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":19478,"src":"209:83:310","symbolAliases":[{"foreign":{"id":32210,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferBase.sol","file":"./../base/ERC721BatchTransferBase.sol","id":32213,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":31270,"src":"293:78:310","symbolAliases":[{"foreign":{"id":32212,"name":"ERC721BatchTransferBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31269,"src":"301:23:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32215,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":1207,"src":"372:66:310","symbolAliases":[{"foreign":{"id":32214,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"380:7:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32217,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32285,"sourceUnit":13298,"src":"439:101:310","symbolAliases":[{"foreign":{"id":32216,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"447:28:310","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32219,"name":"ERC721BatchTransferBase","nameLocations":["892:23:310"],"nodeType":"IdentifierPath","referencedDeclaration":31269,"src":"892:23:310"},"id":32220,"nodeType":"InheritanceSpecifier","src":"892:23:310"},{"baseName":{"id":32221,"name":"ForwarderRegistryContextBase","nameLocations":["917:28:310"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"917:28:310"},"id":32222,"nodeType":"InheritanceSpecifier","src":"917:28:310"}],"canonicalName":"ERC721BatchTransferFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32218,"nodeType":"StructuredDocumentation","src":"542:313:310","text":"@title ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":32284,"linearizedBaseContracts":[32284,13297,31269,1206,33109],"name":"ERC721BatchTransferFacet","nameLocation":"864:24:310","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32226,"libraryName":{"id":32223,"name":"ProxyAdminStorage","nameLocations":["958:17:310"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"958:17:310"},"nodeType":"UsingForDirective","src":"952:53:310","typeName":{"id":32225,"nodeType":"UserDefinedTypeName","pathNode":{"id":32224,"name":"ProxyAdminStorage.Layout","nameLocations":["980:17:310","998:6:310"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"980:24:310"},"referencedDeclaration":19308,"src":"980:24:310","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32235,"nodeType":"Block","src":"1109:2:310","statements":[]},"id":32236,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32232,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32229,"src":"1090:17:310","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32233,"kind":"baseConstructorSpecifier","modifierName":{"id":32231,"name":"ForwarderRegistryContextBase","nameLocations":["1061:28:310"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1061:28:310"},"nodeType":"ModifierInvocation","src":"1061:47:310"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32230,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32229,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1042:17:310","nodeType":"VariableDeclaration","scope":32236,"src":"1023:36:310","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32228,"nodeType":"UserDefinedTypeName","pathNode":{"id":32227,"name":"IForwarderRegistry","nameLocations":["1023:18:310"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1023:18:310"},"referencedDeclaration":13386,"src":"1023:18:310","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1022:38:310"},"returnParameters":{"id":32234,"nodeType":"ParameterList","parameters":[],"src":"1109:0:310"},"scope":32284,"src":"1011:100:310","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32254,"nodeType":"Block","src":"1339:126:310","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32245,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32269],"referencedDeclaration":32269,"src":"1396:10:310","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1396:12:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32240,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1349:17:310","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32242,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1367:6:310","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1349:24:310","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32243,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1349:26:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32244,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1376:19:310","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1349:46:310","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32247,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1349:60:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32248,"nodeType":"ExpressionStatement","src":"1349:60:310"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32249,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1419:13:310","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1433:23:310","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"1419:37:310","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32252,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1419:39:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32253,"nodeType":"ExpressionStatement","src":"1419:39:310"}]},"documentation":{"id":32237,"nodeType":"StructuredDocumentation","src":"1117:166:310","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"684a78aa","id":32255,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721BatchTransferStorage","nameLocation":"1297:30:310","nodeType":"FunctionDefinition","parameters":{"id":32238,"nodeType":"ParameterList","parameters":[],"src":"1327:2:310"},"returnParameters":{"id":32239,"nodeType":"ParameterList","parameters":[],"src":"1339:0:310"},"scope":32284,"src":"1288:177:310","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32268,"nodeType":"Block","src":"1630:65:310","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32264,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1647:28:310","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32265,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1676:10:310","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1647:39:310","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1647:41:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32263,"id":32267,"nodeType":"Return","src":"1640:48:310"}]},"documentation":{"id":32256,"nodeType":"StructuredDocumentation","src":"1471:44:310","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32269,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1529:10:310","nodeType":"FunctionDefinition","overrides":{"id":32260,"nodeType":"OverrideSpecifier","overrides":[{"id":32258,"name":"Context","nameLocations":["1573:7:310"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1573:7:310"},{"id":32259,"name":"ForwarderRegistryContextBase","nameLocations":["1582:28:310"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1582:28:310"}],"src":"1564:47:310"},"parameters":{"id":32257,"nodeType":"ParameterList","parameters":[],"src":"1539:2:310"},"returnParameters":{"id":32263,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32262,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32269,"src":"1621:7:310","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32261,"name":"address","nodeType":"ElementaryTypeName","src":"1621:7:310","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1620:9:310"},"scope":32284,"src":"1520:175:310","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32282,"nodeType":"Block","src":"1865:63:310","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32278,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1882:28:310","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1911:8:310","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1882:37:310","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1882:39:310","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32277,"id":32281,"nodeType":"Return","src":"1875:46:310"}]},"documentation":{"id":32270,"nodeType":"StructuredDocumentation","src":"1701:44:310","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32283,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1759:8:310","nodeType":"FunctionDefinition","overrides":{"id":32274,"nodeType":"OverrideSpecifier","overrides":[{"id":32272,"name":"Context","nameLocations":["1801:7:310"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1801:7:310"},{"id":32273,"name":"ForwarderRegistryContextBase","nameLocations":["1810:28:310"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1810:28:310"}],"src":"1792:47:310"},"parameters":{"id":32271,"nodeType":"ParameterList","parameters":[],"src":"1767:2:310"},"returnParameters":{"id":32277,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32276,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32283,"src":"1849:14:310","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32275,"name":"bytes","nodeType":"ElementaryTypeName","src":"1849:5:310","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1848:16:310"},"scope":32284,"src":"1750:178:310","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32285,"src":"855:1075:310","usedErrors":[11559,19183,32126,32131,32140,32147],"usedEvents":[32185]}],"src":"32:1899:310"},"id":310},"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol","exportedSymbols":{"Context":[1206],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721BatchTransferWithOperatorFiltererFacet":[32365],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32366,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32286,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:311"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32288,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":13387,"src":"57:87:311","symbolAliases":[{"foreign":{"id":32287,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32290,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":34973,"src":"145:63:311","symbolAliases":[{"foreign":{"id":32289,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32292,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":19478,"src":"209:83:311","symbolAliases":[{"foreign":{"id":32291,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","file":"./../base/ERC721BatchTransferWithOperatorFiltererBase.sol","id":32294,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":31331,"src":"293:118:311","symbolAliases":[{"foreign":{"id":32293,"name":"ERC721BatchTransferWithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31330,"src":"301:43:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32296,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":1207,"src":"412:66:311","symbolAliases":[{"foreign":{"id":32295,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"420:7:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32298,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32366,"sourceUnit":13298,"src":"479:101:311","symbolAliases":[{"foreign":{"id":32297,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"487:28:311","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32300,"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocations":["1001:43:311"],"nodeType":"IdentifierPath","referencedDeclaration":31330,"src":"1001:43:311"},"id":32301,"nodeType":"InheritanceSpecifier","src":"1001:43:311"},{"baseName":{"id":32302,"name":"ForwarderRegistryContextBase","nameLocations":["1046:28:311"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1046:28:311"},"id":32303,"nodeType":"InheritanceSpecifier","src":"1046:28:311"}],"canonicalName":"ERC721BatchTransferWithOperatorFiltererFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32299,"nodeType":"StructuredDocumentation","src":"582:362:311","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}."},"fullyImplemented":true,"id":32365,"linearizedBaseContracts":[32365,13297,31330,1206,33109],"name":"ERC721BatchTransferWithOperatorFiltererFacet","nameLocation":"953:44:311","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32307,"libraryName":{"id":32304,"name":"ProxyAdminStorage","nameLocations":["1087:17:311"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1087:17:311"},"nodeType":"UsingForDirective","src":"1081:53:311","typeName":{"id":32306,"nodeType":"UserDefinedTypeName","pathNode":{"id":32305,"name":"ProxyAdminStorage.Layout","nameLocations":["1109:17:311","1127:6:311"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1109:24:311"},"referencedDeclaration":19308,"src":"1109:24:311","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32316,"nodeType":"Block","src":"1238:2:311","statements":[]},"id":32317,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32313,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32310,"src":"1219:17:311","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32314,"kind":"baseConstructorSpecifier","modifierName":{"id":32312,"name":"ForwarderRegistryContextBase","nameLocations":["1190:28:311"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1190:28:311"},"nodeType":"ModifierInvocation","src":"1190:47:311"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32311,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32310,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1171:17:311","nodeType":"VariableDeclaration","scope":32317,"src":"1152:36:311","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32309,"nodeType":"UserDefinedTypeName","pathNode":{"id":32308,"name":"IForwarderRegistry","nameLocations":["1152:18:311"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1152:18:311"},"referencedDeclaration":13386,"src":"1152:18:311","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1151:38:311"},"returnParameters":{"id":32315,"nodeType":"ParameterList","parameters":[],"src":"1238:0:311"},"scope":32365,"src":"1140:100:311","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32335,"nodeType":"Block","src":"1468:126:311","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32326,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32350],"referencedDeclaration":32350,"src":"1525:10:311","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32327,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1525:12:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32321,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1478:17:311","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1496:6:311","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1478:24:311","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32324,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1478:26:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32325,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1505:19:311","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1478:46:311","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1478:60:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32329,"nodeType":"ExpressionStatement","src":"1478:60:311"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32330,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1548:13:311","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1562:23:311","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"1548:37:311","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32333,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1548:39:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32334,"nodeType":"ExpressionStatement","src":"1548:39:311"}]},"documentation":{"id":32318,"nodeType":"StructuredDocumentation","src":"1246:166:311","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"684a78aa","id":32336,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721BatchTransferStorage","nameLocation":"1426:30:311","nodeType":"FunctionDefinition","parameters":{"id":32319,"nodeType":"ParameterList","parameters":[],"src":"1456:2:311"},"returnParameters":{"id":32320,"nodeType":"ParameterList","parameters":[],"src":"1468:0:311"},"scope":32365,"src":"1417:177:311","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32349,"nodeType":"Block","src":"1759:65:311","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32345,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1776:28:311","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1805:10:311","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1776:39:311","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32347,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1776:41:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32344,"id":32348,"nodeType":"Return","src":"1769:48:311"}]},"documentation":{"id":32337,"nodeType":"StructuredDocumentation","src":"1600:44:311","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32350,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1658:10:311","nodeType":"FunctionDefinition","overrides":{"id":32341,"nodeType":"OverrideSpecifier","overrides":[{"id":32339,"name":"Context","nameLocations":["1702:7:311"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1702:7:311"},{"id":32340,"name":"ForwarderRegistryContextBase","nameLocations":["1711:28:311"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1711:28:311"}],"src":"1693:47:311"},"parameters":{"id":32338,"nodeType":"ParameterList","parameters":[],"src":"1668:2:311"},"returnParameters":{"id":32344,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32343,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32350,"src":"1750:7:311","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32342,"name":"address","nodeType":"ElementaryTypeName","src":"1750:7:311","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1749:9:311"},"scope":32365,"src":"1649:175:311","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32363,"nodeType":"Block","src":"1994:63:311","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32359,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2011:28:311","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32360,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2040:8:311","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2011:37:311","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32361,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2011:39:311","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32358,"id":32362,"nodeType":"Return","src":"2004:46:311"}]},"documentation":{"id":32351,"nodeType":"StructuredDocumentation","src":"1830:44:311","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32364,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1888:8:311","nodeType":"FunctionDefinition","overrides":{"id":32355,"nodeType":"OverrideSpecifier","overrides":[{"id":32353,"name":"Context","nameLocations":["1930:7:311"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1930:7:311"},{"id":32354,"name":"ForwarderRegistryContextBase","nameLocations":["1939:28:311"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1939:28:311"}],"src":"1921:47:311"},"parameters":{"id":32352,"nodeType":"ParameterList","parameters":[],"src":"1896:2:311"},"returnParameters":{"id":32358,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32357,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32364,"src":"1978:14:311","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32356,"name":"bytes","nodeType":"ElementaryTypeName","src":"1978:5:311","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1977:16:311"},"scope":32365,"src":"1879:178:311","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32366,"src":"944:1115:311","usedErrors":[11559,19183,32126,32131,32140,32147,37090],"usedEvents":[32185]}],"src":"32:2028:311"},"id":311},"contracts/token/ERC721/facets/ERC721BurnableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721BurnableFacet.sol","exportedSymbols":{"Context":[1206],"ERC721BurnableBase":[31389],"ERC721BurnableFacet":[32446],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32447,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32367,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:312"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32369,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":13387,"src":"57:87:312","symbolAliases":[{"foreign":{"id":32368,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32371,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":34973,"src":"145:63:312","symbolAliases":[{"foreign":{"id":32370,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32373,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":19478,"src":"209:83:312","symbolAliases":[{"foreign":{"id":32372,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BurnableBase.sol","file":"./../base/ERC721BurnableBase.sol","id":32375,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":31390,"src":"293:68:312","symbolAliases":[{"foreign":{"id":32374,"name":"ERC721BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31389,"src":"301:18:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32377,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":1207,"src":"362:66:312","symbolAliases":[{"foreign":{"id":32376,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"370:7:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32379,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32447,"sourceUnit":13298,"src":"429:101:312","symbolAliases":[{"foreign":{"id":32378,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"437:28:312","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32381,"name":"ERC721BurnableBase","nameLocations":["871:18:312"],"nodeType":"IdentifierPath","referencedDeclaration":31389,"src":"871:18:312"},"id":32382,"nodeType":"InheritanceSpecifier","src":"871:18:312"},{"baseName":{"id":32383,"name":"ForwarderRegistryContextBase","nameLocations":["891:28:312"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"891:28:312"},"id":32384,"nodeType":"InheritanceSpecifier","src":"891:28:312"}],"canonicalName":"ERC721BurnableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32380,"nodeType":"StructuredDocumentation","src":"532:307:312","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":32446,"linearizedBaseContracts":[32446,13297,31389,1206,33130],"name":"ERC721BurnableFacet","nameLocation":"848:19:312","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32388,"libraryName":{"id":32385,"name":"ProxyAdminStorage","nameLocations":["932:17:312"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"932:17:312"},"nodeType":"UsingForDirective","src":"926:53:312","typeName":{"id":32387,"nodeType":"UserDefinedTypeName","pathNode":{"id":32386,"name":"ProxyAdminStorage.Layout","nameLocations":["954:17:312","972:6:312"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"954:24:312"},"referencedDeclaration":19308,"src":"954:24:312","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32397,"nodeType":"Block","src":"1083:2:312","statements":[]},"id":32398,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32394,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32391,"src":"1064:17:312","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32395,"kind":"baseConstructorSpecifier","modifierName":{"id":32393,"name":"ForwarderRegistryContextBase","nameLocations":["1035:28:312"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1035:28:312"},"nodeType":"ModifierInvocation","src":"1035:47:312"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32392,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32391,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1016:17:312","nodeType":"VariableDeclaration","scope":32398,"src":"997:36:312","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32390,"nodeType":"UserDefinedTypeName","pathNode":{"id":32389,"name":"IForwarderRegistry","nameLocations":["997:18:312"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"997:18:312"},"referencedDeclaration":13386,"src":"997:18:312","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"996:38:312"},"returnParameters":{"id":32396,"nodeType":"ParameterList","parameters":[],"src":"1083:0:312"},"scope":32446,"src":"985:100:312","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32416,"nodeType":"Block","src":"1303:121:312","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32407,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32431],"referencedDeclaration":32431,"src":"1360:10:312","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1360:12:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32402,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1313:17:312","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1331:6:312","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1313:24:312","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32405,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1313:26:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32406,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1340:19:312","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1313:46:312","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32409,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1313:60:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32410,"nodeType":"ExpressionStatement","src":"1313:60:312"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32411,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1383:13:312","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32413,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1397:18:312","memberName":"initERC721Burnable","nodeType":"MemberAccess","referencedDeclaration":33416,"src":"1383:32:312","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32414,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1383:34:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32415,"nodeType":"ExpressionStatement","src":"1383:34:312"}]},"documentation":{"id":32399,"nodeType":"StructuredDocumentation","src":"1091:161:312","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"de815811","id":32417,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721BurnableStorage","nameLocation":"1266:25:312","nodeType":"FunctionDefinition","parameters":{"id":32400,"nodeType":"ParameterList","parameters":[],"src":"1291:2:312"},"returnParameters":{"id":32401,"nodeType":"ParameterList","parameters":[],"src":"1303:0:312"},"scope":32446,"src":"1257:167:312","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32430,"nodeType":"Block","src":"1589:65:312","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32426,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1606:28:312","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32427,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1635:10:312","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1606:39:312","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1606:41:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32425,"id":32429,"nodeType":"Return","src":"1599:48:312"}]},"documentation":{"id":32418,"nodeType":"StructuredDocumentation","src":"1430:44:312","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32431,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1488:10:312","nodeType":"FunctionDefinition","overrides":{"id":32422,"nodeType":"OverrideSpecifier","overrides":[{"id":32420,"name":"Context","nameLocations":["1532:7:312"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1532:7:312"},{"id":32421,"name":"ForwarderRegistryContextBase","nameLocations":["1541:28:312"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1541:28:312"}],"src":"1523:47:312"},"parameters":{"id":32419,"nodeType":"ParameterList","parameters":[],"src":"1498:2:312"},"returnParameters":{"id":32425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32424,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32431,"src":"1580:7:312","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32423,"name":"address","nodeType":"ElementaryTypeName","src":"1580:7:312","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1579:9:312"},"scope":32446,"src":"1479:175:312","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32444,"nodeType":"Block","src":"1824:63:312","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32440,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1841:28:312","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1870:8:312","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1841:37:312","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1841:39:312","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32439,"id":32443,"nodeType":"Return","src":"1834:46:312"}]},"documentation":{"id":32432,"nodeType":"StructuredDocumentation","src":"1660:44:312","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32445,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1718:8:312","nodeType":"FunctionDefinition","overrides":{"id":32436,"nodeType":"OverrideSpecifier","overrides":[{"id":32434,"name":"Context","nameLocations":["1760:7:312"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1760:7:312"},{"id":32435,"name":"ForwarderRegistryContextBase","nameLocations":["1769:28:312"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1769:28:312"}],"src":"1751:47:312"},"parameters":{"id":32433,"nodeType":"ParameterList","parameters":[],"src":"1726:2:312"},"returnParameters":{"id":32439,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32438,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32445,"src":"1808:14:312","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32437,"name":"bytes","nodeType":"ElementaryTypeName","src":"1808:5:312","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1807:16:312"},"scope":32446,"src":"1709:178:312","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32447,"src":"839:1050:312","usedErrors":[11559,19183,32131,32140,32147],"usedEvents":[32185]}],"src":"32:1858:312"},"id":312},"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol","exportedSymbols":{"Context":[1206],"ERC721DeliverableBase":[31446],"ERC721DeliverableFacet":[32527],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32528,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32448,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:313"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32450,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":13387,"src":"57:87:313","symbolAliases":[{"foreign":{"id":32449,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32452,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":34973,"src":"145:63:313","symbolAliases":[{"foreign":{"id":32451,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32454,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":19478,"src":"209:83:313","symbolAliases":[{"foreign":{"id":32453,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableBase.sol","file":"./../base/ERC721DeliverableBase.sol","id":32456,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":31447,"src":"293:74:313","symbolAliases":[{"foreign":{"id":32455,"name":"ERC721DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31446,"src":"301:21:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32458,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":1207,"src":"368:66:313","symbolAliases":[{"foreign":{"id":32457,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"376:7:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32460,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32528,"sourceUnit":13298,"src":"435:101:313","symbolAliases":[{"foreign":{"id":32459,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"443:28:313","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32462,"name":"ERC721DeliverableBase","nameLocations":["990:21:313"],"nodeType":"IdentifierPath","referencedDeclaration":31446,"src":"990:21:313"},"id":32463,"nodeType":"InheritanceSpecifier","src":"990:21:313"},{"baseName":{"id":32464,"name":"ForwarderRegistryContextBase","nameLocations":["1013:28:313"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1013:28:313"},"id":32465,"nodeType":"InheritanceSpecifier","src":"1013:28:313"}],"canonicalName":"ERC721DeliverableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32461,"nodeType":"StructuredDocumentation","src":"538:417:313","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\n @notice ERC721Deliverable implementation where burnt tokens can be minted again.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}."},"fullyImplemented":true,"id":32527,"linearizedBaseContracts":[32527,13297,31446,1206,33144],"name":"ERC721DeliverableFacet","nameLocation":"964:22:313","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32469,"libraryName":{"id":32466,"name":"ProxyAdminStorage","nameLocations":["1054:17:313"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1054:17:313"},"nodeType":"UsingForDirective","src":"1048:53:313","typeName":{"id":32468,"nodeType":"UserDefinedTypeName","pathNode":{"id":32467,"name":"ProxyAdminStorage.Layout","nameLocations":["1076:17:313","1094:6:313"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1076:24:313"},"referencedDeclaration":19308,"src":"1076:24:313","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32478,"nodeType":"Block","src":"1205:2:313","statements":[]},"id":32479,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32475,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32472,"src":"1186:17:313","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32476,"kind":"baseConstructorSpecifier","modifierName":{"id":32474,"name":"ForwarderRegistryContextBase","nameLocations":["1157:28:313"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1157:28:313"},"nodeType":"ModifierInvocation","src":"1157:47:313"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32473,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32472,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1138:17:313","nodeType":"VariableDeclaration","scope":32479,"src":"1119:36:313","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32471,"nodeType":"UserDefinedTypeName","pathNode":{"id":32470,"name":"IForwarderRegistry","nameLocations":["1119:18:313"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1119:18:313"},"referencedDeclaration":13386,"src":"1119:18:313","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1118:38:313"},"returnParameters":{"id":32477,"nodeType":"ParameterList","parameters":[],"src":"1205:0:313"},"scope":32527,"src":"1107:100:313","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32497,"nodeType":"Block","src":"1431:124:313","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32488,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32512],"referencedDeclaration":32512,"src":"1488:10:313","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32489,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1488:12:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32483,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1441:17:313","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1459:6:313","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1441:24:313","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32486,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1441:26:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32487,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1468:19:313","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1441:46:313","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1441:60:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32491,"nodeType":"ExpressionStatement","src":"1441:60:313"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32492,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1511:13:313","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1525:21:313","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"1511:35:313","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1511:37:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32496,"nodeType":"ExpressionStatement","src":"1511:37:313"}]},"documentation":{"id":32480,"nodeType":"StructuredDocumentation","src":"1213:164:313","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"a330f88d","id":32498,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721DeliverableStorage","nameLocation":"1391:28:313","nodeType":"FunctionDefinition","parameters":{"id":32481,"nodeType":"ParameterList","parameters":[],"src":"1419:2:313"},"returnParameters":{"id":32482,"nodeType":"ParameterList","parameters":[],"src":"1431:0:313"},"scope":32527,"src":"1382:173:313","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32511,"nodeType":"Block","src":"1720:65:313","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32507,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1737:28:313","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32508,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1766:10:313","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1737:39:313","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1737:41:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32506,"id":32510,"nodeType":"Return","src":"1730:48:313"}]},"documentation":{"id":32499,"nodeType":"StructuredDocumentation","src":"1561:44:313","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32512,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1619:10:313","nodeType":"FunctionDefinition","overrides":{"id":32503,"nodeType":"OverrideSpecifier","overrides":[{"id":32501,"name":"Context","nameLocations":["1663:7:313"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1663:7:313"},{"id":32502,"name":"ForwarderRegistryContextBase","nameLocations":["1672:28:313"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1672:28:313"}],"src":"1654:47:313"},"parameters":{"id":32500,"nodeType":"ParameterList","parameters":[],"src":"1629:2:313"},"returnParameters":{"id":32506,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32505,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32512,"src":"1711:7:313","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32504,"name":"address","nodeType":"ElementaryTypeName","src":"1711:7:313","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1710:9:313"},"scope":32527,"src":"1610:175:313","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32525,"nodeType":"Block","src":"1955:63:313","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32521,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1972:28:313","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32522,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2001:8:313","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1972:37:313","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32523,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1972:39:313","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32520,"id":32524,"nodeType":"Return","src":"1965:46:313"}]},"documentation":{"id":32513,"nodeType":"StructuredDocumentation","src":"1791:44:313","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32526,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1849:8:313","nodeType":"FunctionDefinition","overrides":{"id":32517,"nodeType":"OverrideSpecifier","overrides":[{"id":32515,"name":"Context","nameLocations":["1891:7:313"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1891:7:313"},{"id":32516,"name":"ForwarderRegistryContextBase","nameLocations":["1900:28:313"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1900:28:313"}],"src":"1882:47:313"},"parameters":{"id":32514,"nodeType":"ParameterList","parameters":[],"src":"1857:2:313"},"returnParameters":{"id":32520,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32519,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32526,"src":"1939:14:313","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32518,"name":"bytes","nodeType":"ElementaryTypeName","src":"1939:5:313","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1938:16:313"},"scope":32527,"src":"1840:178:313","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32528,"src":"955:1065:313","usedErrors":[7886,8223,11559,19183,32162,32167],"usedEvents":[32185]}],"src":"32:1989:313"},"id":313},"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol","exportedSymbols":{"Context":[1206],"ERC721DeliverableOnceBase":[31503],"ERC721DeliverableOnceFacet":[32608],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32609,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32529,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:314"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32531,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":13387,"src":"57:87:314","symbolAliases":[{"foreign":{"id":32530,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32533,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":34973,"src":"145:63:314","symbolAliases":[{"foreign":{"id":32532,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32535,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":19478,"src":"209:83:314","symbolAliases":[{"foreign":{"id":32534,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol","file":"./../base/ERC721DeliverableOnceBase.sol","id":32537,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":31504,"src":"293:82:314","symbolAliases":[{"foreign":{"id":32536,"name":"ERC721DeliverableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31503,"src":"301:25:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32539,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":1207,"src":"376:66:314","symbolAliases":[{"foreign":{"id":32538,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"384:7:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32541,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32609,"sourceUnit":13298,"src":"443:101:314","symbolAliases":[{"foreign":{"id":32540,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"451:28:314","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32543,"name":"ERC721DeliverableOnceBase","nameLocations":["1005:25:314"],"nodeType":"IdentifierPath","referencedDeclaration":31503,"src":"1005:25:314"},"id":32544,"nodeType":"InheritanceSpecifier","src":"1005:25:314"},{"baseName":{"id":32545,"name":"ForwarderRegistryContextBase","nameLocations":["1032:28:314"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1032:28:314"},"id":32546,"nodeType":"InheritanceSpecifier","src":"1032:28:314"}],"canonicalName":"ERC721DeliverableOnceFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32542,"nodeType":"StructuredDocumentation","src":"546:420:314","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\n @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}."},"fullyImplemented":true,"id":32608,"linearizedBaseContracts":[32608,13297,31503,1206,33144],"name":"ERC721DeliverableOnceFacet","nameLocation":"975:26:314","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32550,"libraryName":{"id":32547,"name":"ProxyAdminStorage","nameLocations":["1073:17:314"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1073:17:314"},"nodeType":"UsingForDirective","src":"1067:53:314","typeName":{"id":32549,"nodeType":"UserDefinedTypeName","pathNode":{"id":32548,"name":"ProxyAdminStorage.Layout","nameLocations":["1095:17:314","1113:6:314"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1095:24:314"},"referencedDeclaration":19308,"src":"1095:24:314","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32559,"nodeType":"Block","src":"1224:2:314","statements":[]},"id":32560,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32556,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32553,"src":"1205:17:314","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32557,"kind":"baseConstructorSpecifier","modifierName":{"id":32555,"name":"ForwarderRegistryContextBase","nameLocations":["1176:28:314"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1176:28:314"},"nodeType":"ModifierInvocation","src":"1176:47:314"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32554,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32553,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1157:17:314","nodeType":"VariableDeclaration","scope":32560,"src":"1138:36:314","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32552,"nodeType":"UserDefinedTypeName","pathNode":{"id":32551,"name":"IForwarderRegistry","nameLocations":["1138:18:314"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1138:18:314"},"referencedDeclaration":13386,"src":"1138:18:314","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1137:38:314"},"returnParameters":{"id":32558,"nodeType":"ParameterList","parameters":[],"src":"1224:0:314"},"scope":32608,"src":"1126:100:314","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32578,"nodeType":"Block","src":"1454:124:314","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32569,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32593],"referencedDeclaration":32593,"src":"1511:10:314","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1511:12:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32564,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1464:17:314","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32566,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1482:6:314","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1464:24:314","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32567,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1464:26:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32568,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1491:19:314","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1464:46:314","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32571,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1464:60:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32572,"nodeType":"ExpressionStatement","src":"1464:60:314"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32573,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1534:13:314","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1548:21:314","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"1534:35:314","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32576,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1534:37:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32577,"nodeType":"ExpressionStatement","src":"1534:37:314"}]},"documentation":{"id":32561,"nodeType":"StructuredDocumentation","src":"1232:164:314","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"c0b88468","id":32579,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721DeliverableOnceStorage","nameLocation":"1410:32:314","nodeType":"FunctionDefinition","parameters":{"id":32562,"nodeType":"ParameterList","parameters":[],"src":"1442:2:314"},"returnParameters":{"id":32563,"nodeType":"ParameterList","parameters":[],"src":"1454:0:314"},"scope":32608,"src":"1401:177:314","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32592,"nodeType":"Block","src":"1743:65:314","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32588,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1760:28:314","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1789:10:314","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1760:39:314","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1760:41:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32587,"id":32591,"nodeType":"Return","src":"1753:48:314"}]},"documentation":{"id":32580,"nodeType":"StructuredDocumentation","src":"1584:44:314","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32593,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1642:10:314","nodeType":"FunctionDefinition","overrides":{"id":32584,"nodeType":"OverrideSpecifier","overrides":[{"id":32582,"name":"Context","nameLocations":["1686:7:314"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1686:7:314"},{"id":32583,"name":"ForwarderRegistryContextBase","nameLocations":["1695:28:314"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1695:28:314"}],"src":"1677:47:314"},"parameters":{"id":32581,"nodeType":"ParameterList","parameters":[],"src":"1652:2:314"},"returnParameters":{"id":32587,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32586,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32593,"src":"1734:7:314","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32585,"name":"address","nodeType":"ElementaryTypeName","src":"1734:7:314","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1733:9:314"},"scope":32608,"src":"1633:175:314","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32606,"nodeType":"Block","src":"1978:63:314","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32602,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1995:28:314","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2024:8:314","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1995:37:314","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1995:39:314","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32601,"id":32605,"nodeType":"Return","src":"1988:46:314"}]},"documentation":{"id":32594,"nodeType":"StructuredDocumentation","src":"1814:44:314","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32607,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1872:8:314","nodeType":"FunctionDefinition","overrides":{"id":32598,"nodeType":"OverrideSpecifier","overrides":[{"id":32596,"name":"Context","nameLocations":["1914:7:314"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1914:7:314"},{"id":32597,"name":"ForwarderRegistryContextBase","nameLocations":["1923:28:314"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1923:28:314"}],"src":"1905:47:314"},"parameters":{"id":32595,"nodeType":"ParameterList","parameters":[],"src":"1880:2:314"},"returnParameters":{"id":32601,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32600,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32607,"src":"1962:14:314","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32599,"name":"bytes","nodeType":"ElementaryTypeName","src":"1962:5:314","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1961:16:314"},"scope":32608,"src":"1863:178:314","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32609,"src":"966:1077:314","usedErrors":[7886,8223,11559,19183,32162,32167,32174],"usedEvents":[32185]}],"src":"32:2012:314"},"id":314},"contracts/token/ERC721/facets/ERC721Facet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721Facet.sol","exportedSymbols":{"Context":[1206],"ERC721Base":[31227],"ERC721Facet":[32689],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32690,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32610,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:315"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32612,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":13387,"src":"57:87:315","symbolAliases":[{"foreign":{"id":32611,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32614,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":34973,"src":"145:63:315","symbolAliases":[{"foreign":{"id":32613,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32616,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":19478,"src":"209:83:315","symbolAliases":[{"foreign":{"id":32615,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721Base.sol","file":"./../base/ERC721Base.sol","id":32618,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":31228,"src":"293:52:315","symbolAliases":[{"foreign":{"id":32617,"name":"ERC721Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31227,"src":"301:10:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32620,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":1207,"src":"346:66:315","symbolAliases":[{"foreign":{"id":32619,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"354:7:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32622,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32690,"sourceUnit":13298,"src":"413:101:315","symbolAliases":[{"foreign":{"id":32621,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"421:28:315","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32624,"name":"ERC721Base","nameLocations":["818:10:315"],"nodeType":"IdentifierPath","referencedDeclaration":31227,"src":"818:10:315"},"id":32625,"nodeType":"InheritanceSpecifier","src":"818:10:315"},{"baseName":{"id":32626,"name":"ForwarderRegistryContextBase","nameLocations":["830:28:315"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"830:28:315"},"id":32627,"nodeType":"InheritanceSpecifier","src":"830:28:315"}],"canonicalName":"ERC721Facet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32623,"nodeType":"StructuredDocumentation","src":"516:278:315","text":"@title ERC721 Non-Fungible Token Standard (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":32689,"linearizedBaseContracts":[32689,13297,31227,1206,33094],"name":"ERC721Facet","nameLocation":"803:11:315","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32631,"libraryName":{"id":32628,"name":"ProxyAdminStorage","nameLocations":["871:17:315"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"871:17:315"},"nodeType":"UsingForDirective","src":"865:53:315","typeName":{"id":32630,"nodeType":"UserDefinedTypeName","pathNode":{"id":32629,"name":"ProxyAdminStorage.Layout","nameLocations":["893:17:315","911:6:315"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"893:24:315"},"referencedDeclaration":19308,"src":"893:24:315","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32640,"nodeType":"Block","src":"1022:2:315","statements":[]},"id":32641,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32637,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32634,"src":"1003:17:315","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32638,"kind":"baseConstructorSpecifier","modifierName":{"id":32636,"name":"ForwarderRegistryContextBase","nameLocations":["974:28:315"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"974:28:315"},"nodeType":"ModifierInvocation","src":"974:47:315"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32635,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32634,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"955:17:315","nodeType":"VariableDeclaration","scope":32641,"src":"936:36:315","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32633,"nodeType":"UserDefinedTypeName","pathNode":{"id":32632,"name":"IForwarderRegistry","nameLocations":["936:18:315"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"936:18:315"},"referencedDeclaration":13386,"src":"936:18:315","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"935:38:315"},"returnParameters":{"id":32639,"nodeType":"ParameterList","parameters":[],"src":"1022:0:315"},"scope":32689,"src":"924:100:315","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32659,"nodeType":"Block","src":"1224:107:315","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32650,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32674],"referencedDeclaration":32674,"src":"1281:10:315","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32651,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1281:12:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32645,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1234:17:315","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1252:6:315","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1234:24:315","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1234:26:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32649,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1261:19:315","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1234:46:315","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32652,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1234:60:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32653,"nodeType":"ExpressionStatement","src":"1234:60:315"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32654,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1304:13:315","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1318:4:315","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"1304:18:315","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32657,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1304:20:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32658,"nodeType":"ExpressionStatement","src":"1304:20:315"}]},"documentation":{"id":32642,"nodeType":"StructuredDocumentation","src":"1030:151:315","text":"@notice Marks the following ERC165 interfaces as supported: ERC721.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"b1c7ee02","id":32660,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Storage","nameLocation":"1195:17:315","nodeType":"FunctionDefinition","parameters":{"id":32643,"nodeType":"ParameterList","parameters":[],"src":"1212:2:315"},"returnParameters":{"id":32644,"nodeType":"ParameterList","parameters":[],"src":"1224:0:315"},"scope":32689,"src":"1186:145:315","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32673,"nodeType":"Block","src":"1496:65:315","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32669,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1513:28:315","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32670,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1542:10:315","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1513:39:315","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1513:41:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32668,"id":32672,"nodeType":"Return","src":"1506:48:315"}]},"documentation":{"id":32661,"nodeType":"StructuredDocumentation","src":"1337:44:315","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32674,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1395:10:315","nodeType":"FunctionDefinition","overrides":{"id":32665,"nodeType":"OverrideSpecifier","overrides":[{"id":32663,"name":"Context","nameLocations":["1439:7:315"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1439:7:315"},{"id":32664,"name":"ForwarderRegistryContextBase","nameLocations":["1448:28:315"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1448:28:315"}],"src":"1430:47:315"},"parameters":{"id":32662,"nodeType":"ParameterList","parameters":[],"src":"1405:2:315"},"returnParameters":{"id":32668,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32667,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32674,"src":"1487:7:315","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32666,"name":"address","nodeType":"ElementaryTypeName","src":"1487:7:315","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1486:9:315"},"scope":32689,"src":"1386:175:315","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32687,"nodeType":"Block","src":"1731:63:315","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32683,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1748:28:315","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1777:8:315","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1748:37:315","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1748:39:315","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32682,"id":32686,"nodeType":"Return","src":"1741:46:315"}]},"documentation":{"id":32675,"nodeType":"StructuredDocumentation","src":"1567:44:315","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32688,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1625:8:315","nodeType":"FunctionDefinition","overrides":{"id":32679,"nodeType":"OverrideSpecifier","overrides":[{"id":32677,"name":"Context","nameLocations":["1667:7:315"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1667:7:315"},{"id":32678,"name":"ForwarderRegistryContextBase","nameLocations":["1676:28:315"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1676:28:315"}],"src":"1658:47:315"},"parameters":{"id":32676,"nodeType":"ParameterList","parameters":[],"src":"1633:2:315"},"returnParameters":{"id":32682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32681,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32688,"src":"1715:14:315","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32680,"name":"bytes","nodeType":"ElementaryTypeName","src":"1715:5:315","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1714:16:315"},"scope":32689,"src":"1616:178:315","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32690,"src":"794:1002:315","usedErrors":[11559,19183,32109,32114,32123,32126,32131,32140,32147,32154,32157],"usedEvents":[32185,32194,32203]}],"src":"32:1765:315"},"id":315},"contracts/token/ERC721/facets/ERC721MetadataFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721MetadataFacet.sol","exportedSymbols":{"ERC721MetadataBase":[31583],"ERC721MetadataFacet":[32765],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ITokenMetadataResolver":[36704],"ProxyAdminStorage":[19477],"TokenMetadataStorage":[36891]},"id":32766,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32691,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:316"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32693,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":13387,"src":"57:87:316","symbolAliases":[{"foreign":{"id":32692,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":32695,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":36705,"src":"145:94:316","symbolAliases":[{"foreign":{"id":32694,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32697,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":19478,"src":"240:83:316","symbolAliases":[{"foreign":{"id":32696,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"248:17:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../metadata/libraries/TokenMetadataStorage.sol","id":32699,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":36892,"src":"324:89:316","symbolAliases":[{"foreign":{"id":32698,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"332:20:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32701,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":34973,"src":"414:63:316","symbolAliases":[{"foreign":{"id":32700,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"422:13:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","file":"./../base/ERC721MetadataBase.sol","id":32703,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":31584,"src":"478:68:316","symbolAliases":[{"foreign":{"id":32702,"name":"ERC721MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31583,"src":"486:18:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32705,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32766,"sourceUnit":13298,"src":"547:101:316","symbolAliases":[{"foreign":{"id":32704,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"555:28:316","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32707,"name":"ERC721MetadataBase","nameLocations":["1083:18:316"],"nodeType":"IdentifierPath","referencedDeclaration":31583,"src":"1083:18:316"},"id":32708,"nodeType":"InheritanceSpecifier","src":"1083:18:316"},{"baseName":{"id":32709,"name":"ForwarderRegistryContextBase","nameLocations":["1103:28:316"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1103:28:316"},"id":32710,"nodeType":"InheritanceSpecifier","src":"1103:28:316"}],"canonicalName":"ERC721MetadataFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32706,"nodeType":"StructuredDocumentation","src":"650:401:316","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).\n @notice This contracts uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}."},"fullyImplemented":true,"id":32765,"linearizedBaseContracts":[32765,13297,31583,33168,36683],"name":"ERC721MetadataFacet","nameLocation":"1060:19:316","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32714,"libraryName":{"id":32711,"name":"ProxyAdminStorage","nameLocations":["1144:17:316"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1144:17:316"},"nodeType":"UsingForDirective","src":"1138:53:316","typeName":{"id":32713,"nodeType":"UserDefinedTypeName","pathNode":{"id":32712,"name":"ProxyAdminStorage.Layout","nameLocations":["1166:17:316","1184:6:316"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1166:24:316"},"referencedDeclaration":19308,"src":"1166:24:316","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":32718,"libraryName":{"id":32715,"name":"TokenMetadataStorage","nameLocations":["1202:20:316"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"1202:20:316"},"nodeType":"UsingForDirective","src":"1196:59:316","typeName":{"id":32717,"nodeType":"UserDefinedTypeName","pathNode":{"id":32716,"name":"TokenMetadataStorage.Layout","nameLocations":["1227:20:316","1248:6:316"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"1227:27:316"},"referencedDeclaration":36718,"src":"1227:27:316","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"body":{"id":32727,"nodeType":"Block","src":"1359:2:316","statements":[]},"id":32728,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32724,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32721,"src":"1340:17:316","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32725,"kind":"baseConstructorSpecifier","modifierName":{"id":32723,"name":"ForwarderRegistryContextBase","nameLocations":["1311:28:316"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1311:28:316"},"nodeType":"ModifierInvocation","src":"1311:47:316"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32722,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32721,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1292:17:316","nodeType":"VariableDeclaration","scope":32728,"src":"1273:36:316","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32720,"nodeType":"UserDefinedTypeName","pathNode":{"id":32719,"name":"IForwarderRegistry","nameLocations":["1273:18:316"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1273:18:316"},"referencedDeclaration":13386,"src":"1273:18:316","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1272:38:316"},"returnParameters":{"id":32726,"nodeType":"ParameterList","parameters":[],"src":"1359:0:316"},"scope":32765,"src":"1261:100:316","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32763,"nodeType":"Block","src":"2079:202:316","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32744,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13231,"src":"2136:10:316","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32745,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2136:12:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32739,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"2089:17:316","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32741,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2107:6:316","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"2089:24:316","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2089:26:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32743,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2116:19:316","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"2089:46:316","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32746,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2089:60:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32747,"nodeType":"ExpressionStatement","src":"2089:60:316"},{"expression":{"arguments":[{"id":32753,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32731,"src":"2199:4:316","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":32754,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32733,"src":"2205:6:316","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":32755,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32736,"src":"2213:16:316","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32748,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"2159:20:316","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":32750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2180:6:316","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"2159:27:316","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":32751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2159:29:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":32752,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2189:9:316","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"2159:39:316","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":32756,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2159:71:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32757,"nodeType":"ExpressionStatement","src":"2159:71:316"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32758,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2240:13:316","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2254:18:316","memberName":"initERC721Metadata","nodeType":"MemberAccess","referencedDeclaration":33365,"src":"2240:32:316","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32761,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2240:34:316","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32762,"nodeType":"ExpressionStatement","src":"2240:34:316"}]},"documentation":{"id":32729,"nodeType":"StructuredDocumentation","src":"1367:576:316","text":"@notice Initializes the storage with the contract metadata.\n @notice Sets the proxy initialization phase to `1`.\n @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param name The name of the token.\n @param symbol The symbol of the token.\n @param metadataResolver The address of the metadata resolver contract."},"functionSelector":"fa6d22ca","id":32764,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721MetadataStorage","nameLocation":"1957:25:316","nodeType":"FunctionDefinition","parameters":{"id":32737,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32731,"mutability":"mutable","name":"name","nameLocation":"1999:4:316","nodeType":"VariableDeclaration","scope":32764,"src":"1983:20:316","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":32730,"name":"string","nodeType":"ElementaryTypeName","src":"1983:6:316","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":32733,"mutability":"mutable","name":"symbol","nameLocation":"2021:6:316","nodeType":"VariableDeclaration","scope":32764,"src":"2005:22:316","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":32732,"name":"string","nodeType":"ElementaryTypeName","src":"2005:6:316","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":32736,"mutability":"mutable","name":"metadataResolver","nameLocation":"2052:16:316","nodeType":"VariableDeclaration","scope":32764,"src":"2029:39:316","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":32735,"nodeType":"UserDefinedTypeName","pathNode":{"id":32734,"name":"ITokenMetadataResolver","nameLocations":["2029:22:316"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2029:22:316"},"referencedDeclaration":36704,"src":"2029:22:316","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1982:87:316"},"returnParameters":{"id":32738,"nodeType":"ParameterList","parameters":[],"src":"2079:0:316"},"scope":32765,"src":"1948:333:316","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":32766,"src":"1051:1232:316","usedErrors":[11559,19183,19192,32131],"usedEvents":[]}],"src":"32:2252:316"},"id":316},"contracts/token/ERC721/facets/ERC721MintableFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721MintableFacet.sol","exportedSymbols":{"Context":[1206],"ERC721MintableBase":[31700],"ERC721MintableFacet":[32846],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32847,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32767,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:317"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32769,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":13387,"src":"57:87:317","symbolAliases":[{"foreign":{"id":32768,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32771,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":34973,"src":"145:63:317","symbolAliases":[{"foreign":{"id":32770,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32773,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":19478,"src":"209:83:317","symbolAliases":[{"foreign":{"id":32772,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","file":"./../base/ERC721MintableBase.sol","id":32775,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":31701,"src":"293:68:317","symbolAliases":[{"foreign":{"id":32774,"name":"ERC721MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31700,"src":"301:18:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32777,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":1207,"src":"362:66:317","symbolAliases":[{"foreign":{"id":32776,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"370:7:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32779,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32847,"sourceUnit":13298,"src":"429:101:317","symbolAliases":[{"foreign":{"id":32778,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"437:28:317","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32781,"name":"ERC721MintableBase","nameLocations":["975:18:317"],"nodeType":"IdentifierPath","referencedDeclaration":31700,"src":"975:18:317"},"id":32782,"nodeType":"InheritanceSpecifier","src":"975:18:317"},{"baseName":{"id":32783,"name":"ForwarderRegistryContextBase","nameLocations":["995:28:317"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"995:28:317"},"id":32784,"nodeType":"InheritanceSpecifier","src":"995:28:317"}],"canonicalName":"ERC721MintableFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32780,"nodeType":"StructuredDocumentation","src":"532:411:317","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\n @notice ERC721Mintable implementation where burnt tokens can be minted again.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}."},"fullyImplemented":true,"id":32846,"linearizedBaseContracts":[32846,13297,31700,1206,33199],"name":"ERC721MintableFacet","nameLocation":"952:19:317","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32788,"libraryName":{"id":32785,"name":"ProxyAdminStorage","nameLocations":["1036:17:317"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1036:17:317"},"nodeType":"UsingForDirective","src":"1030:53:317","typeName":{"id":32787,"nodeType":"UserDefinedTypeName","pathNode":{"id":32786,"name":"ProxyAdminStorage.Layout","nameLocations":["1058:17:317","1076:6:317"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1058:24:317"},"referencedDeclaration":19308,"src":"1058:24:317","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32797,"nodeType":"Block","src":"1187:2:317","statements":[]},"id":32798,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32794,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32791,"src":"1168:17:317","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32795,"kind":"baseConstructorSpecifier","modifierName":{"id":32793,"name":"ForwarderRegistryContextBase","nameLocations":["1139:28:317"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1139:28:317"},"nodeType":"ModifierInvocation","src":"1139:47:317"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32792,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32791,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1120:17:317","nodeType":"VariableDeclaration","scope":32798,"src":"1101:36:317","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32790,"nodeType":"UserDefinedTypeName","pathNode":{"id":32789,"name":"IForwarderRegistry","nameLocations":["1101:18:317"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1101:18:317"},"referencedDeclaration":13386,"src":"1101:18:317","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1100:38:317"},"returnParameters":{"id":32796,"nodeType":"ParameterList","parameters":[],"src":"1187:0:317"},"scope":32846,"src":"1089:100:317","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32816,"nodeType":"Block","src":"1407:121:317","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32807,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32831],"referencedDeclaration":32831,"src":"1464:10:317","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32808,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1464:12:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32802,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1417:17:317","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1435:6:317","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1417:24:317","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32805,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1417:26:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32806,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1444:19:317","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1417:46:317","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32809,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1417:60:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32810,"nodeType":"ExpressionStatement","src":"1417:60:317"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32811,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1487:13:317","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1501:18:317","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"1487:32:317","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1487:34:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32815,"nodeType":"ExpressionStatement","src":"1487:34:317"}]},"documentation":{"id":32799,"nodeType":"StructuredDocumentation","src":"1195:161:317","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"a920466f","id":32817,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721MintableStorage","nameLocation":"1370:25:317","nodeType":"FunctionDefinition","parameters":{"id":32800,"nodeType":"ParameterList","parameters":[],"src":"1395:2:317"},"returnParameters":{"id":32801,"nodeType":"ParameterList","parameters":[],"src":"1407:0:317"},"scope":32846,"src":"1361:167:317","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32830,"nodeType":"Block","src":"1693:65:317","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32826,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1710:28:317","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32827,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1739:10:317","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1710:39:317","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32828,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1710:41:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32825,"id":32829,"nodeType":"Return","src":"1703:48:317"}]},"documentation":{"id":32818,"nodeType":"StructuredDocumentation","src":"1534:44:317","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32831,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1592:10:317","nodeType":"FunctionDefinition","overrides":{"id":32822,"nodeType":"OverrideSpecifier","overrides":[{"id":32820,"name":"Context","nameLocations":["1636:7:317"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1636:7:317"},{"id":32821,"name":"ForwarderRegistryContextBase","nameLocations":["1645:28:317"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1645:28:317"}],"src":"1627:47:317"},"parameters":{"id":32819,"nodeType":"ParameterList","parameters":[],"src":"1602:2:317"},"returnParameters":{"id":32825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32824,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32831,"src":"1684:7:317","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32823,"name":"address","nodeType":"ElementaryTypeName","src":"1684:7:317","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1683:9:317"},"scope":32846,"src":"1583:175:317","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32844,"nodeType":"Block","src":"1928:63:317","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32840,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1945:28:317","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1974:8:317","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1945:37:317","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32842,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1945:39:317","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32839,"id":32843,"nodeType":"Return","src":"1938:46:317"}]},"documentation":{"id":32832,"nodeType":"StructuredDocumentation","src":"1764:44:317","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32845,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1822:8:317","nodeType":"FunctionDefinition","overrides":{"id":32836,"nodeType":"OverrideSpecifier","overrides":[{"id":32834,"name":"Context","nameLocations":["1864:7:317"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1864:7:317"},{"id":32835,"name":"ForwarderRegistryContextBase","nameLocations":["1873:28:317"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1873:28:317"}],"src":"1855:47:317"},"parameters":{"id":32833,"nodeType":"ParameterList","parameters":[],"src":"1830:2:317"},"returnParameters":{"id":32839,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32838,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32845,"src":"1912:14:317","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32837,"name":"bytes","nodeType":"ElementaryTypeName","src":"1912:5:317","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1911:16:317"},"scope":32846,"src":"1813:178:317","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32847,"src":"943:1050:317","usedErrors":[8223,11559,19183,32154,32162,32167],"usedEvents":[32185]}],"src":"32:1962:317"},"id":317},"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol","exportedSymbols":{"Context":[1206],"ERC721MintableOnceBase":[31833],"ERC721MintableOnceFacet":[32927],"ERC721Storage":[34972],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":32928,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32848,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:318"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32850,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":13387,"src":"57:87:318","symbolAliases":[{"foreign":{"id":32849,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32852,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":34973,"src":"145:63:318","symbolAliases":[{"foreign":{"id":32851,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32854,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":19478,"src":"209:83:318","symbolAliases":[{"foreign":{"id":32853,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableOnceBase.sol","file":"./../base/ERC721MintableOnceBase.sol","id":32856,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":31834,"src":"293:76:318","symbolAliases":[{"foreign":{"id":32855,"name":"ERC721MintableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31833,"src":"301:22:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32858,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":1207,"src":"370:66:318","symbolAliases":[{"foreign":{"id":32857,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"378:7:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32860,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":32928,"sourceUnit":13298,"src":"437:101:318","symbolAliases":[{"foreign":{"id":32859,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"445:28:318","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32862,"name":"ERC721MintableOnceBase","nameLocations":["990:22:318"],"nodeType":"IdentifierPath","referencedDeclaration":31833,"src":"990:22:318"},"id":32863,"nodeType":"InheritanceSpecifier","src":"990:22:318"},{"baseName":{"id":32864,"name":"ForwarderRegistryContextBase","nameLocations":["1014:28:318"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1014:28:318"},"id":32865,"nodeType":"InheritanceSpecifier","src":"1014:28:318"}],"canonicalName":"ERC721MintableOnceFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32861,"nodeType":"StructuredDocumentation","src":"540:414:318","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\n @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}."},"fullyImplemented":true,"id":32927,"linearizedBaseContracts":[32927,13297,31833,1206,33199],"name":"ERC721MintableOnceFacet","nameLocation":"963:23:318","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32869,"libraryName":{"id":32866,"name":"ProxyAdminStorage","nameLocations":["1055:17:318"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1055:17:318"},"nodeType":"UsingForDirective","src":"1049:53:318","typeName":{"id":32868,"nodeType":"UserDefinedTypeName","pathNode":{"id":32867,"name":"ProxyAdminStorage.Layout","nameLocations":["1077:17:318","1095:6:318"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1077:24:318"},"referencedDeclaration":19308,"src":"1077:24:318","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32878,"nodeType":"Block","src":"1206:2:318","statements":[]},"id":32879,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32875,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32872,"src":"1187:17:318","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32876,"kind":"baseConstructorSpecifier","modifierName":{"id":32874,"name":"ForwarderRegistryContextBase","nameLocations":["1158:28:318"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1158:28:318"},"nodeType":"ModifierInvocation","src":"1158:47:318"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32873,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32872,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1139:17:318","nodeType":"VariableDeclaration","scope":32879,"src":"1120:36:318","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32871,"nodeType":"UserDefinedTypeName","pathNode":{"id":32870,"name":"IForwarderRegistry","nameLocations":["1120:18:318"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1120:18:318"},"referencedDeclaration":13386,"src":"1120:18:318","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1119:38:318"},"returnParameters":{"id":32877,"nodeType":"ParameterList","parameters":[],"src":"1206:0:318"},"scope":32927,"src":"1108:100:318","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32897,"nodeType":"Block","src":"1430:121:318","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32888,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32912],"referencedDeclaration":32912,"src":"1487:10:318","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32889,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1487:12:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32883,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1440:17:318","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32885,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1458:6:318","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1440:24:318","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1440:26:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32887,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1467:19:318","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1440:46:318","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32890,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1440:60:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32891,"nodeType":"ExpressionStatement","src":"1440:60:318"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32892,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1510:13:318","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1524:18:318","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"1510:32:318","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32895,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1510:34:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32896,"nodeType":"ExpressionStatement","src":"1510:34:318"}]},"documentation":{"id":32880,"nodeType":"StructuredDocumentation","src":"1214:161:318","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"83b0b740","id":32898,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721MintableOnceStorage","nameLocation":"1389:29:318","nodeType":"FunctionDefinition","parameters":{"id":32881,"nodeType":"ParameterList","parameters":[],"src":"1418:2:318"},"returnParameters":{"id":32882,"nodeType":"ParameterList","parameters":[],"src":"1430:0:318"},"scope":32927,"src":"1380:171:318","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32911,"nodeType":"Block","src":"1716:65:318","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32907,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1733:28:318","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32908,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1762:10:318","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1733:39:318","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32909,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1733:41:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32906,"id":32910,"nodeType":"Return","src":"1726:48:318"}]},"documentation":{"id":32899,"nodeType":"StructuredDocumentation","src":"1557:44:318","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32912,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1615:10:318","nodeType":"FunctionDefinition","overrides":{"id":32903,"nodeType":"OverrideSpecifier","overrides":[{"id":32901,"name":"Context","nameLocations":["1659:7:318"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1659:7:318"},{"id":32902,"name":"ForwarderRegistryContextBase","nameLocations":["1668:28:318"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1668:28:318"}],"src":"1650:47:318"},"parameters":{"id":32900,"nodeType":"ParameterList","parameters":[],"src":"1625:2:318"},"returnParameters":{"id":32906,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32905,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32912,"src":"1707:7:318","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32904,"name":"address","nodeType":"ElementaryTypeName","src":"1707:7:318","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1706:9:318"},"scope":32927,"src":"1606:175:318","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":32925,"nodeType":"Block","src":"1951:63:318","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32921,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1968:28:318","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32922,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1997:8:318","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1968:37:318","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":32923,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1968:39:318","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":32920,"id":32924,"nodeType":"Return","src":"1961:46:318"}]},"documentation":{"id":32913,"nodeType":"StructuredDocumentation","src":"1787:44:318","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32926,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1845:8:318","nodeType":"FunctionDefinition","overrides":{"id":32917,"nodeType":"OverrideSpecifier","overrides":[{"id":32915,"name":"Context","nameLocations":["1887:7:318"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1887:7:318"},{"id":32916,"name":"ForwarderRegistryContextBase","nameLocations":["1896:28:318"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1896:28:318"}],"src":"1878:47:318"},"parameters":{"id":32914,"nodeType":"ParameterList","parameters":[],"src":"1853:2:318"},"returnParameters":{"id":32920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32919,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32926,"src":"1935:14:318","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32918,"name":"bytes","nodeType":"ElementaryTypeName","src":"1935:5:318","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1934:16:318"},"scope":32927,"src":"1836:178:318","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":32928,"src":"954:1062:318","usedErrors":[8223,11559,19183,32154,32162,32167,32174],"usedEvents":[32185]}],"src":"32:1985:318"},"id":318},"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol":{"ast":{"absolutePath":"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol","exportedSymbols":{"Context":[1206],"ERC721Storage":[34972],"ERC721WithOperatorFiltererBase":[32102],"ERC721WithOperatorFiltererFacet":[33008],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":33009,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":32929,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:319"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":32931,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":13387,"src":"57:87:319","symbolAliases":[{"foreign":{"id":32930,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../libraries/ERC721Storage.sol","id":32933,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":34973,"src":"145:63:319","symbolAliases":[{"foreign":{"id":32932,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"153:13:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":32935,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":19478,"src":"209:83:319","symbolAliases":[{"foreign":{"id":32934,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"217:17:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","file":"./../base/ERC721WithOperatorFiltererBase.sol","id":32937,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":32103,"src":"293:92:319","symbolAliases":[{"foreign":{"id":32936,"name":"ERC721WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32102,"src":"301:30:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":32939,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":1207,"src":"386:66:319","symbolAliases":[{"foreign":{"id":32938,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"394:7:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":32941,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":33009,"sourceUnit":13298,"src":"453:101:319","symbolAliases":[{"foreign":{"id":32940,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"461:28:319","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":32943,"name":"ERC721WithOperatorFiltererBase","nameLocations":["925:30:319"],"nodeType":"IdentifierPath","referencedDeclaration":32102,"src":"925:30:319"},"id":32944,"nodeType":"InheritanceSpecifier","src":"925:30:319"},{"baseName":{"id":32945,"name":"ForwarderRegistryContextBase","nameLocations":["957:28:319"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"957:28:319"},"id":32946,"nodeType":"InheritanceSpecifier","src":"957:28:319"}],"canonicalName":"ERC721WithOperatorFiltererFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":32942,"nodeType":"StructuredDocumentation","src":"556:325:319","text":"@title ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}."},"fullyImplemented":true,"id":33008,"linearizedBaseContracts":[33008,13297,32102,1206,33094],"name":"ERC721WithOperatorFiltererFacet","nameLocation":"890:31:319","nodeType":"ContractDefinition","nodes":[{"global":false,"id":32950,"libraryName":{"id":32947,"name":"ProxyAdminStorage","nameLocations":["998:17:319"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"998:17:319"},"nodeType":"UsingForDirective","src":"992:53:319","typeName":{"id":32949,"nodeType":"UserDefinedTypeName","pathNode":{"id":32948,"name":"ProxyAdminStorage.Layout","nameLocations":["1020:17:319","1038:6:319"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1020:24:319"},"referencedDeclaration":19308,"src":"1020:24:319","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":32959,"nodeType":"Block","src":"1149:2:319","statements":[]},"id":32960,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":32956,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32953,"src":"1130:17:319","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":32957,"kind":"baseConstructorSpecifier","modifierName":{"id":32955,"name":"ForwarderRegistryContextBase","nameLocations":["1101:28:319"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1101:28:319"},"nodeType":"ModifierInvocation","src":"1101:47:319"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":32954,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32953,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1082:17:319","nodeType":"VariableDeclaration","scope":32960,"src":"1063:36:319","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":32952,"nodeType":"UserDefinedTypeName","pathNode":{"id":32951,"name":"IForwarderRegistry","nameLocations":["1063:18:319"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1063:18:319"},"referencedDeclaration":13386,"src":"1063:18:319","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1062:38:319"},"returnParameters":{"id":32958,"nodeType":"ParameterList","parameters":[],"src":"1149:0:319"},"scope":33008,"src":"1051:100:319","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":32978,"nodeType":"Block","src":"1351:107:319","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":32969,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[32993],"referencedDeclaration":32993,"src":"1408:10:319","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32970,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1408:12:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32964,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1361:17:319","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":32966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1379:6:319","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1361:24:319","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":32967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1361:26:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":32968,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1388:19:319","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1361:46:319","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":32971,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1361:60:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32972,"nodeType":"ExpressionStatement","src":"1361:60:319"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32973,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"1431:13:319","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":32975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1445:4:319","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"1431:18:319","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":32976,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1431:20:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":32977,"nodeType":"ExpressionStatement","src":"1431:20:319"}]},"documentation":{"id":32961,"nodeType":"StructuredDocumentation","src":"1157:151:319","text":"@notice Marks the following ERC165 interfaces as supported: ERC721.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"b1c7ee02","id":32979,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Storage","nameLocation":"1322:17:319","nodeType":"FunctionDefinition","parameters":{"id":32962,"nodeType":"ParameterList","parameters":[],"src":"1339:2:319"},"returnParameters":{"id":32963,"nodeType":"ParameterList","parameters":[],"src":"1351:0:319"},"scope":33008,"src":"1313:145:319","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":32992,"nodeType":"Block","src":"1623:65:319","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":32988,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1640:28:319","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":32989,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1669:10:319","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1640:39:319","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":32990,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1640:41:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":32987,"id":32991,"nodeType":"Return","src":"1633:48:319"}]},"documentation":{"id":32980,"nodeType":"StructuredDocumentation","src":"1464:44:319","text":"@inheritdoc ForwarderRegistryContextBase"},"id":32993,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1522:10:319","nodeType":"FunctionDefinition","overrides":{"id":32984,"nodeType":"OverrideSpecifier","overrides":[{"id":32982,"name":"Context","nameLocations":["1566:7:319"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1566:7:319"},{"id":32983,"name":"ForwarderRegistryContextBase","nameLocations":["1575:28:319"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1575:28:319"}],"src":"1557:47:319"},"parameters":{"id":32981,"nodeType":"ParameterList","parameters":[],"src":"1532:2:319"},"returnParameters":{"id":32987,"nodeType":"ParameterList","parameters":[{"constant":false,"id":32986,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":32993,"src":"1614:7:319","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":32985,"name":"address","nodeType":"ElementaryTypeName","src":"1614:7:319","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1613:9:319"},"scope":33008,"src":"1513:175:319","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":33006,"nodeType":"Block","src":"1858:63:319","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33002,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1875:28:319","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":33003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1904:8:319","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1875:37:319","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":33004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1875:39:319","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":33001,"id":33005,"nodeType":"Return","src":"1868:46:319"}]},"documentation":{"id":32994,"nodeType":"StructuredDocumentation","src":"1694:44:319","text":"@inheritdoc ForwarderRegistryContextBase"},"id":33007,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1752:8:319","nodeType":"FunctionDefinition","overrides":{"id":32998,"nodeType":"OverrideSpecifier","overrides":[{"id":32996,"name":"Context","nameLocations":["1794:7:319"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1794:7:319"},{"id":32997,"name":"ForwarderRegistryContextBase","nameLocations":["1803:28:319"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1803:28:319"}],"src":"1785:47:319"},"parameters":{"id":32995,"nodeType":"ParameterList","parameters":[],"src":"1760:2:319"},"returnParameters":{"id":33001,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33000,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":33007,"src":"1842:14:319","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":32999,"name":"bytes","nodeType":"ElementaryTypeName","src":"1842:5:319","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1841:16:319"},"scope":33008,"src":"1743:178:319","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":33009,"src":"881:1042:319","usedErrors":[11559,19183,32109,32114,32123,32126,32131,32140,32147,32154,32157,37090],"usedEvents":[32185,32194,32203]}],"src":"32:1892:319"},"id":319},"contracts/token/ERC721/interfaces/IERC721.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","exportedSymbols":{"IERC721":[33094]},"id":33095,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33010,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:320"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721","contractDependencies":[],"contractKind":"interface","documentation":{"id":33011,"nodeType":"StructuredDocumentation","src":"58:296:320","text":"@title ERC721 Non-Fungible Token Standard, basic interface (functions).\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev This interface only contains the standard functions. See IERC721Events for the events.\n @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd."},"fullyImplemented":false,"id":33094,"linearizedBaseContracts":[33094],"name":"IERC721","nameLocation":"364:7:320","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33012,"nodeType":"StructuredDocumentation","src":"378:684:320","text":"@notice Sets or unsets an approval to transfer a single token on behalf of its owner.\n @dev Note: There can only be one approved address per token at a given time.\n @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\n @dev Reverts if `tokenId` does not exist.\n @dev Reverts if `to` is the token owner.\n @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\n @dev Emits an {Approval} event.\n @param to The address to approve, or the zero address to remove any existing approval.\n @param tokenId The token identifier to give approval for."},"functionSelector":"095ea7b3","id":33019,"implemented":false,"kind":"function","modifiers":[],"name":"approve","nameLocation":"1076:7:320","nodeType":"FunctionDefinition","parameters":{"id":33017,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33014,"mutability":"mutable","name":"to","nameLocation":"1092:2:320","nodeType":"VariableDeclaration","scope":33019,"src":"1084:10:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33013,"name":"address","nodeType":"ElementaryTypeName","src":"1084:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33016,"mutability":"mutable","name":"tokenId","nameLocation":"1104:7:320","nodeType":"VariableDeclaration","scope":33019,"src":"1096:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33015,"name":"uint256","nodeType":"ElementaryTypeName","src":"1096:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1083:29:320"},"returnParameters":{"id":33018,"nodeType":"ParameterList","parameters":[],"src":"1121:0:320"},"scope":33094,"src":"1067:55:320","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33020,"nodeType":"StructuredDocumentation","src":"1128:341:320","text":"@notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\n @dev Reverts if the sender is the same as `operator`.\n @dev Emits an {ApprovalForAll} event.\n @param operator The address to approve for all tokens.\n @param approved True to set an approval for all tokens, false to unset it."},"functionSelector":"a22cb465","id":33027,"implemented":false,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"1483:17:320","nodeType":"FunctionDefinition","parameters":{"id":33025,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33022,"mutability":"mutable","name":"operator","nameLocation":"1509:8:320","nodeType":"VariableDeclaration","scope":33027,"src":"1501:16:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33021,"name":"address","nodeType":"ElementaryTypeName","src":"1501:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33024,"mutability":"mutable","name":"approved","nameLocation":"1524:8:320","nodeType":"VariableDeclaration","scope":33027,"src":"1519:13:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":33023,"name":"bool","nodeType":"ElementaryTypeName","src":"1519:4:320","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1500:33:320"},"returnParameters":{"id":33026,"nodeType":"ParameterList","parameters":[],"src":"1542:0:320"},"scope":33094,"src":"1474:69:320","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33028,"nodeType":"StructuredDocumentation","src":"1549:667:320","text":"@notice Unsafely transfers the ownership of a token to a recipient.\n @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `from` is not the owner of `tokenId`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n @dev Emits a {Transfer} event.\n @param from The current token owner.\n @param to The recipient of the token transfer. Self-transfers are possible.\n @param tokenId The identifier of the token to transfer."},"functionSelector":"23b872dd","id":33037,"implemented":false,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"2230:12:320","nodeType":"FunctionDefinition","parameters":{"id":33035,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33030,"mutability":"mutable","name":"from","nameLocation":"2251:4:320","nodeType":"VariableDeclaration","scope":33037,"src":"2243:12:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33029,"name":"address","nodeType":"ElementaryTypeName","src":"2243:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33032,"mutability":"mutable","name":"to","nameLocation":"2265:2:320","nodeType":"VariableDeclaration","scope":33037,"src":"2257:10:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33031,"name":"address","nodeType":"ElementaryTypeName","src":"2257:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33034,"mutability":"mutable","name":"tokenId","nameLocation":"2277:7:320","nodeType":"VariableDeclaration","scope":33037,"src":"2269:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33033,"name":"uint256","nodeType":"ElementaryTypeName","src":"2269:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2242:43:320"},"returnParameters":{"id":33036,"nodeType":"ParameterList","parameters":[],"src":"2294:0:320"},"scope":33094,"src":"2221:74:320","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33038,"nodeType":"StructuredDocumentation","src":"2301:663:320","text":"@notice Safely transfers the ownership of a token to a recipient.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `from` is not the owner of `tokenId`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @param from The current token owner.\n @param to The recipient of the token transfer.\n @param tokenId The identifier of the token to transfer."},"functionSelector":"42842e0e","id":33047,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"2978:16:320","nodeType":"FunctionDefinition","parameters":{"id":33045,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33040,"mutability":"mutable","name":"from","nameLocation":"3003:4:320","nodeType":"VariableDeclaration","scope":33047,"src":"2995:12:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33039,"name":"address","nodeType":"ElementaryTypeName","src":"2995:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33042,"mutability":"mutable","name":"to","nameLocation":"3017:2:320","nodeType":"VariableDeclaration","scope":33047,"src":"3009:10:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33041,"name":"address","nodeType":"ElementaryTypeName","src":"3009:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33044,"mutability":"mutable","name":"tokenId","nameLocation":"3029:7:320","nodeType":"VariableDeclaration","scope":33047,"src":"3021:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33043,"name":"uint256","nodeType":"ElementaryTypeName","src":"3021:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2994:43:320"},"returnParameters":{"id":33046,"nodeType":"ParameterList","parameters":[],"src":"3046:0:320"},"scope":33094,"src":"2969:78:320","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33048,"nodeType":"StructuredDocumentation","src":"3053:735:320","text":"@notice Safely transfers the ownership of a token to a recipient.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `from` is not the owner of `tokenId`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @param from The current token owner.\n @param to The recipient of the token transfer.\n @param tokenId The identifier of the token to transfer.\n @param data Optional data to send along to a receiver contract."},"functionSelector":"b88d4fde","id":33059,"implemented":false,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"3802:16:320","nodeType":"FunctionDefinition","parameters":{"id":33057,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33050,"mutability":"mutable","name":"from","nameLocation":"3827:4:320","nodeType":"VariableDeclaration","scope":33059,"src":"3819:12:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33049,"name":"address","nodeType":"ElementaryTypeName","src":"3819:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33052,"mutability":"mutable","name":"to","nameLocation":"3841:2:320","nodeType":"VariableDeclaration","scope":33059,"src":"3833:10:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33051,"name":"address","nodeType":"ElementaryTypeName","src":"3833:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33054,"mutability":"mutable","name":"tokenId","nameLocation":"3853:7:320","nodeType":"VariableDeclaration","scope":33059,"src":"3845:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33053,"name":"uint256","nodeType":"ElementaryTypeName","src":"3845:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":33056,"mutability":"mutable","name":"data","nameLocation":"3877:4:320","nodeType":"VariableDeclaration","scope":33059,"src":"3862:19:320","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":33055,"name":"bytes","nodeType":"ElementaryTypeName","src":"3862:5:320","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3818:64:320"},"returnParameters":{"id":33058,"nodeType":"ParameterList","parameters":[],"src":"3891:0:320"},"scope":33094,"src":"3793:99:320","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33060,"nodeType":"StructuredDocumentation","src":"3898:209:320","text":"@notice Gets the balance of an address.\n @dev Reverts if `owner` is the zero address.\n @param owner The address to query the balance of.\n @return balance The amount owned by the owner."},"functionSelector":"70a08231","id":33067,"implemented":false,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"4121:9:320","nodeType":"FunctionDefinition","parameters":{"id":33063,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33062,"mutability":"mutable","name":"owner","nameLocation":"4139:5:320","nodeType":"VariableDeclaration","scope":33067,"src":"4131:13:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33061,"name":"address","nodeType":"ElementaryTypeName","src":"4131:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4130:15:320"},"returnParameters":{"id":33066,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33065,"mutability":"mutable","name":"balance","nameLocation":"4177:7:320","nodeType":"VariableDeclaration","scope":33067,"src":"4169:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33064,"name":"uint256","nodeType":"ElementaryTypeName","src":"4169:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4168:17:320"},"scope":33094,"src":"4112:74:320","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":33068,"nodeType":"StructuredDocumentation","src":"4192:217:320","text":"@notice Gets the owner of a token.\n @dev Reverts if `tokenId` does not exist.\n @param tokenId The token identifier to query the owner of.\n @return tokenOwner The owner of the token identifier."},"functionSelector":"6352211e","id":33075,"implemented":false,"kind":"function","modifiers":[],"name":"ownerOf","nameLocation":"4423:7:320","nodeType":"FunctionDefinition","parameters":{"id":33071,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33070,"mutability":"mutable","name":"tokenId","nameLocation":"4439:7:320","nodeType":"VariableDeclaration","scope":33075,"src":"4431:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33069,"name":"uint256","nodeType":"ElementaryTypeName","src":"4431:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4430:17:320"},"returnParameters":{"id":33074,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33073,"mutability":"mutable","name":"tokenOwner","nameLocation":"4479:10:320","nodeType":"VariableDeclaration","scope":33075,"src":"4471:18:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33072,"name":"address","nodeType":"ElementaryTypeName","src":"4471:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4470:20:320"},"scope":33094,"src":"4414:77:320","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":33076,"nodeType":"StructuredDocumentation","src":"4497:285:320","text":"@notice Gets the approved address for a token.\n @dev Reverts if `tokenId` does not exist.\n @param tokenId The token identifier to query the approval of.\n @return approved The approved address for the token identifier, or the zero address if no approval is set."},"functionSelector":"081812fc","id":33083,"implemented":false,"kind":"function","modifiers":[],"name":"getApproved","nameLocation":"4796:11:320","nodeType":"FunctionDefinition","parameters":{"id":33079,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33078,"mutability":"mutable","name":"tokenId","nameLocation":"4816:7:320","nodeType":"VariableDeclaration","scope":33083,"src":"4808:15:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33077,"name":"uint256","nodeType":"ElementaryTypeName","src":"4808:7:320","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4807:17:320"},"returnParameters":{"id":33082,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33081,"mutability":"mutable","name":"approved","nameLocation":"4856:8:320","nodeType":"VariableDeclaration","scope":33083,"src":"4848:16:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33080,"name":"address","nodeType":"ElementaryTypeName","src":"4848:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4847:18:320"},"scope":33094,"src":"4787:79:320","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":33084,"nodeType":"StructuredDocumentation","src":"4872:323:320","text":"@notice Gets whether an operator is approved for all tokens by an owner.\n @param owner The address which gives the approval for all tokens.\n @param operator The address which receives the approval for all tokens.\n @return approvedForAll Whether the operator is approved for all tokens by the owner."},"functionSelector":"e985e9c5","id":33093,"implemented":false,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"5209:16:320","nodeType":"FunctionDefinition","parameters":{"id":33089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33086,"mutability":"mutable","name":"owner","nameLocation":"5234:5:320","nodeType":"VariableDeclaration","scope":33093,"src":"5226:13:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33085,"name":"address","nodeType":"ElementaryTypeName","src":"5226:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33088,"mutability":"mutable","name":"operator","nameLocation":"5249:8:320","nodeType":"VariableDeclaration","scope":33093,"src":"5241:16:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33087,"name":"address","nodeType":"ElementaryTypeName","src":"5241:7:320","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5225:33:320"},"returnParameters":{"id":33092,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33091,"mutability":"mutable","name":"approvedForAll","nameLocation":"5287:14:320","nodeType":"VariableDeclaration","scope":33093,"src":"5282:19:320","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":33090,"name":"bool","nodeType":"ElementaryTypeName","src":"5282:4:320","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5281:21:320"},"scope":33094,"src":"5200:103:320","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":33095,"src":"354:4951:320","usedErrors":[],"usedEvents":[]}],"src":"32:5274:320"},"id":320},"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol","exportedSymbols":{"IERC721BatchTransfer":[33109]},"id":33110,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33096,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:321"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721BatchTransfer","contractDependencies":[],"contractKind":"interface","documentation":{"id":33097,"nodeType":"StructuredDocumentation","src":"58:207:321","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0xf3993d11."},"fullyImplemented":false,"id":33109,"linearizedBaseContracts":[33109],"name":"IERC721BatchTransfer","nameLocation":"275:20:321","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33098,"nodeType":"StructuredDocumentation","src":"302:578:321","text":"@notice Unsafely transfers a batch of tokens to a recipient.\n @dev Resets the token approval for each of `tokenIds`.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if one of `tokenIds` is not owned by `from`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\n @param from Current tokens owner.\n @param to Address of the new token owner.\n @param tokenIds Identifiers of the tokens to transfer."},"functionSelector":"f3993d11","id":33108,"implemented":false,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"894:17:321","nodeType":"FunctionDefinition","parameters":{"id":33106,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33100,"mutability":"mutable","name":"from","nameLocation":"920:4:321","nodeType":"VariableDeclaration","scope":33108,"src":"912:12:321","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33099,"name":"address","nodeType":"ElementaryTypeName","src":"912:7:321","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33102,"mutability":"mutable","name":"to","nameLocation":"934:2:321","nodeType":"VariableDeclaration","scope":33108,"src":"926:10:321","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33101,"name":"address","nodeType":"ElementaryTypeName","src":"926:7:321","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33105,"mutability":"mutable","name":"tokenIds","nameLocation":"957:8:321","nodeType":"VariableDeclaration","scope":33108,"src":"938:27:321","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":33103,"name":"uint256","nodeType":"ElementaryTypeName","src":"938:7:321","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33104,"nodeType":"ArrayTypeName","src":"938:9:321","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"911:55:321"},"returnParameters":{"id":33107,"nodeType":"ParameterList","parameters":[],"src":"975:0:321"},"scope":33109,"src":"885:91:321","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":33110,"src":"265:713:321","usedErrors":[],"usedEvents":[]}],"src":"32:947:321"},"id":321},"contracts/token/ERC721/interfaces/IERC721Burnable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Burnable.sol","exportedSymbols":{"IERC721Burnable":[33130]},"id":33131,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33111,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:322"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Burnable","contractDependencies":[],"contractKind":"interface","documentation":{"id":33112,"nodeType":"StructuredDocumentation","src":"58:201:322","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5."},"fullyImplemented":false,"id":33130,"linearizedBaseContracts":[33130],"name":"IERC721Burnable","nameLocation":"269:15:322","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33113,"nodeType":"StructuredDocumentation","src":"291:371:322","text":"@notice Burns a token.\n @dev Reverts if `tokenId` is not owned by `from`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\n @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\n @param from The current token owner.\n @param tokenId The identifier of the token to burn."},"functionSelector":"79cc6790","id":33120,"implemented":false,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"676:8:322","nodeType":"FunctionDefinition","parameters":{"id":33118,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33115,"mutability":"mutable","name":"from","nameLocation":"693:4:322","nodeType":"VariableDeclaration","scope":33120,"src":"685:12:322","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33114,"name":"address","nodeType":"ElementaryTypeName","src":"685:7:322","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33117,"mutability":"mutable","name":"tokenId","nameLocation":"707:7:322","nodeType":"VariableDeclaration","scope":33120,"src":"699:15:322","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33116,"name":"uint256","nodeType":"ElementaryTypeName","src":"699:7:322","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"684:31:322"},"returnParameters":{"id":33119,"nodeType":"ParameterList","parameters":[],"src":"724:0:322"},"scope":33130,"src":"667:58:322","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33121,"nodeType":"StructuredDocumentation","src":"731:425:322","text":"@notice Burns a batch of tokens.\n @dev Reverts if one of `tokenIds` is not owned by `from`.\n @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\n @param from The current tokens owner.\n @param tokenIds The identifiers of the tokens to burn."},"functionSelector":"f2472965","id":33129,"implemented":false,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"1170:13:322","nodeType":"FunctionDefinition","parameters":{"id":33127,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33123,"mutability":"mutable","name":"from","nameLocation":"1192:4:322","nodeType":"VariableDeclaration","scope":33129,"src":"1184:12:322","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33122,"name":"address","nodeType":"ElementaryTypeName","src":"1184:7:322","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33126,"mutability":"mutable","name":"tokenIds","nameLocation":"1217:8:322","nodeType":"VariableDeclaration","scope":33129,"src":"1198:27:322","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":33124,"name":"uint256","nodeType":"ElementaryTypeName","src":"1198:7:322","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33125,"nodeType":"ArrayTypeName","src":"1198:9:322","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1183:43:322"},"returnParameters":{"id":33128,"nodeType":"ParameterList","parameters":[],"src":"1235:0:322"},"scope":33130,"src":"1161:75:322","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":33131,"src":"259:979:322","usedErrors":[],"usedEvents":[]}],"src":"32:1207:322"},"id":322},"contracts/token/ERC721/interfaces/IERC721Deliverable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Deliverable.sol","exportedSymbols":{"IERC721Deliverable":[33144]},"id":33145,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33132,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:323"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Deliverable","contractDependencies":[],"contractKind":"interface","documentation":{"id":33133,"nodeType":"StructuredDocumentation","src":"58:204:323","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0x9da5e832."},"fullyImplemented":false,"id":33144,"linearizedBaseContracts":[33144],"name":"IERC721Deliverable","nameLocation":"272:18:323","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33134,"nodeType":"StructuredDocumentation","src":"297:487:323","text":"@notice Unsafely mints tokens to multiple recipients.\n @dev Reverts if `recipients` and `tokenIds` have different lengths.\n @dev Reverts if one of `recipients` is the zero address.\n @dev Reverts if one of `tokenIds` already exists.\n @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n @param recipients Addresses of the new tokens owners.\n @param tokenIds Identifiers of the tokens to mint."},"functionSelector":"9da5e832","id":33143,"implemented":false,"kind":"function","modifiers":[],"name":"deliver","nameLocation":"798:7:323","nodeType":"FunctionDefinition","parameters":{"id":33141,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33137,"mutability":"mutable","name":"recipients","nameLocation":"825:10:323","nodeType":"VariableDeclaration","scope":33143,"src":"806:29:323","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":33135,"name":"address","nodeType":"ElementaryTypeName","src":"806:7:323","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":33136,"nodeType":"ArrayTypeName","src":"806:9:323","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":33140,"mutability":"mutable","name":"tokenIds","nameLocation":"856:8:323","nodeType":"VariableDeclaration","scope":33143,"src":"837:27:323","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":33138,"name":"uint256","nodeType":"ElementaryTypeName","src":"837:7:323","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33139,"nodeType":"ArrayTypeName","src":"837:9:323","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"805:60:323"},"returnParameters":{"id":33142,"nodeType":"ParameterList","parameters":[],"src":"874:0:323"},"scope":33144,"src":"789:86:323","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":33145,"src":"262:615:323","usedErrors":[],"usedEvents":[]}],"src":"32:846:323"},"id":323},"contracts/token/ERC721/interfaces/IERC721Metadata.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Metadata.sol","exportedSymbols":{"IERC721Metadata":[33168]},"id":33169,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33146,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:324"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Metadata","contractDependencies":[],"contractKind":"interface","documentation":{"id":33147,"nodeType":"StructuredDocumentation","src":"58:201:324","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f."},"fullyImplemented":false,"id":33168,"linearizedBaseContracts":[33168],"name":"IERC721Metadata","nameLocation":"269:15:324","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33148,"nodeType":"StructuredDocumentation","src":"291:105:324","text":"@notice Gets the name of the token. E.g. \"My Token\".\n @return tokenName The name of the token."},"functionSelector":"06fdde03","id":33153,"implemented":false,"kind":"function","modifiers":[],"name":"name","nameLocation":"410:4:324","nodeType":"FunctionDefinition","parameters":{"id":33149,"nodeType":"ParameterList","parameters":[],"src":"414:2:324"},"returnParameters":{"id":33152,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33151,"mutability":"mutable","name":"tokenName","nameLocation":"454:9:324","nodeType":"VariableDeclaration","scope":33153,"src":"440:23:324","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":33150,"name":"string","nodeType":"ElementaryTypeName","src":"440:6:324","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"439:25:324"},"scope":33168,"src":"401:64:324","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":33154,"nodeType":"StructuredDocumentation","src":"471:106:324","text":"@notice Gets the symbol of the token. E.g. \"TOK\".\n @return tokenSymbol The symbol of the token."},"functionSelector":"95d89b41","id":33159,"implemented":false,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"591:6:324","nodeType":"FunctionDefinition","parameters":{"id":33155,"nodeType":"ParameterList","parameters":[],"src":"597:2:324"},"returnParameters":{"id":33158,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33157,"mutability":"mutable","name":"tokenSymbol","nameLocation":"637:11:324","nodeType":"VariableDeclaration","scope":33159,"src":"623:25:324","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":33156,"name":"string","nodeType":"ElementaryTypeName","src":"623:6:324","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"622:27:324"},"scope":33168,"src":"582:68:324","stateMutability":"view","virtual":false,"visibility":"external"},{"documentation":{"id":33160,"nodeType":"StructuredDocumentation","src":"656:215:324","text":"@notice Gets the metadata URI for a token identifier.\n @dev Reverts if `tokenId` does not exist.\n @param tokenId The token identifier.\n @return uri The metadata URI for the token identifier."},"functionSelector":"c87b56dd","id":33167,"implemented":false,"kind":"function","modifiers":[],"name":"tokenURI","nameLocation":"885:8:324","nodeType":"FunctionDefinition","parameters":{"id":33163,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33162,"mutability":"mutable","name":"tokenId","nameLocation":"902:7:324","nodeType":"VariableDeclaration","scope":33167,"src":"894:15:324","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33161,"name":"uint256","nodeType":"ElementaryTypeName","src":"894:7:324","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"893:17:324"},"returnParameters":{"id":33166,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33165,"mutability":"mutable","name":"uri","nameLocation":"948:3:324","nodeType":"VariableDeclaration","scope":33167,"src":"934:17:324","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":33164,"name":"string","nodeType":"ElementaryTypeName","src":"934:6:324","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"933:19:324"},"scope":33168,"src":"876:77:324","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":33169,"src":"259:696:324","usedErrors":[],"usedEvents":[]}],"src":"32:924:324"},"id":324},"contracts/token/ERC721/interfaces/IERC721Mintable.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Mintable.sol","exportedSymbols":{"IERC721Mintable":[33199]},"id":33200,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33170,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:325"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Mintable","contractDependencies":[],"contractKind":"interface","documentation":{"id":33171,"nodeType":"StructuredDocumentation","src":"58:201:325","text":"@title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0x8e773e13."},"fullyImplemented":false,"id":33199,"linearizedBaseContracts":[33199],"name":"IERC721Mintable","nameLocation":"269:15:325","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33172,"nodeType":"StructuredDocumentation","src":"291:311:325","text":"@notice Unsafely mints a token.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `tokenId` already exists.\n @dev Emits an {IERC721-Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint."},"functionSelector":"40c10f19","id":33179,"implemented":false,"kind":"function","modifiers":[],"name":"mint","nameLocation":"616:4:325","nodeType":"FunctionDefinition","parameters":{"id":33177,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33174,"mutability":"mutable","name":"to","nameLocation":"629:2:325","nodeType":"VariableDeclaration","scope":33179,"src":"621:10:325","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33173,"name":"address","nodeType":"ElementaryTypeName","src":"621:7:325","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33176,"mutability":"mutable","name":"tokenId","nameLocation":"641:7:325","nodeType":"VariableDeclaration","scope":33179,"src":"633:15:325","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33175,"name":"uint256","nodeType":"ElementaryTypeName","src":"633:7:325","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"620:29:325"},"returnParameters":{"id":33178,"nodeType":"ParameterList","parameters":[],"src":"658:0:325"},"scope":33199,"src":"607:52:325","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33180,"nodeType":"StructuredDocumentation","src":"665:504:325","text":"@notice Safely mints a token.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if `tokenId` already exists.\n @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits an {IERC721-Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint.\n @param data Optional data to pass along to the receiver call."},"functionSelector":"8832e6e3","id":33189,"implemented":false,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"1183:8:325","nodeType":"FunctionDefinition","parameters":{"id":33187,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33182,"mutability":"mutable","name":"to","nameLocation":"1200:2:325","nodeType":"VariableDeclaration","scope":33189,"src":"1192:10:325","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33181,"name":"address","nodeType":"ElementaryTypeName","src":"1192:7:325","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33184,"mutability":"mutable","name":"tokenId","nameLocation":"1212:7:325","nodeType":"VariableDeclaration","scope":33189,"src":"1204:15:325","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33183,"name":"uint256","nodeType":"ElementaryTypeName","src":"1204:7:325","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":33186,"mutability":"mutable","name":"data","nameLocation":"1236:4:325","nodeType":"VariableDeclaration","scope":33189,"src":"1221:19:325","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":33185,"name":"bytes","nodeType":"ElementaryTypeName","src":"1221:5:325","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1191:50:325"},"returnParameters":{"id":33188,"nodeType":"ParameterList","parameters":[],"src":"1250:0:325"},"scope":33199,"src":"1174:77:325","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"documentation":{"id":33190,"nodeType":"StructuredDocumentation","src":"1257:356:325","text":"@notice Unsafely mints a batch of tokens.\n @dev Reverts if `to` is the zero address.\n @dev Reverts if one of `tokenIds` already exists.\n @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\n @param to Address of the new tokens owner.\n @param tokenIds Identifiers of the tokens to mint."},"functionSelector":"4684d7e9","id":33198,"implemented":false,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"1627:9:325","nodeType":"FunctionDefinition","parameters":{"id":33196,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33192,"mutability":"mutable","name":"to","nameLocation":"1645:2:325","nodeType":"VariableDeclaration","scope":33198,"src":"1637:10:325","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33191,"name":"address","nodeType":"ElementaryTypeName","src":"1637:7:325","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33195,"mutability":"mutable","name":"tokenIds","nameLocation":"1668:8:325","nodeType":"VariableDeclaration","scope":33198,"src":"1649:27:325","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":33193,"name":"uint256","nodeType":"ElementaryTypeName","src":"1649:7:325","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33194,"nodeType":"ArrayTypeName","src":"1649:9:325","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"1636:41:325"},"returnParameters":{"id":33197,"nodeType":"ParameterList","parameters":[],"src":"1686:0:325"},"scope":33199,"src":"1618:69:325","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":33200,"src":"259:1430:325","usedErrors":[],"usedEvents":[]}],"src":"32:1658:325"},"id":325},"contracts/token/ERC721/interfaces/IERC721Receiver.sol":{"ast":{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Receiver.sol","exportedSymbols":{"IERC721Receiver":[33217]},"id":33218,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33201,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:326"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC721Receiver","contractDependencies":[],"contractKind":"interface","documentation":{"id":33202,"nodeType":"StructuredDocumentation","src":"58:263:326","text":"@title ERC721 Non-Fungible Token Standard, Tokens Receiver.\n @notice Interface for supporting safe transfers from ERC721 contracts.\n @dev See https://eips.ethereum.org/EIPS/eip-721\n @dev Note: The ERC-165 identifier for this interface is 0x150b7a02."},"fullyImplemented":false,"id":33217,"linearizedBaseContracts":[33217],"name":"IERC721Receiver","nameLocation":"331:15:326","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":33203,"nodeType":"StructuredDocumentation","src":"353:589:326","text":"@notice Handles the receipt of an ERC721 token.\n @dev Note: This function is called by an ERC721 contract after a safe transfer.\n @dev Note: The ERC721 contract address is always the message sender.\n @param operator The initiator of the safe transfer.\n @param from The previous token owner.\n @param tokenId The token identifier.\n @param data Optional additional data with no specified format.\n @return magicValue `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` (`0x150b7a02`) to accept, any other value to refuse."},"functionSelector":"150b7a02","id":33216,"implemented":false,"kind":"function","modifiers":[],"name":"onERC721Received","nameLocation":"956:16:326","nodeType":"FunctionDefinition","parameters":{"id":33212,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33205,"mutability":"mutable","name":"operator","nameLocation":"981:8:326","nodeType":"VariableDeclaration","scope":33216,"src":"973:16:326","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33204,"name":"address","nodeType":"ElementaryTypeName","src":"973:7:326","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33207,"mutability":"mutable","name":"from","nameLocation":"999:4:326","nodeType":"VariableDeclaration","scope":33216,"src":"991:12:326","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33206,"name":"address","nodeType":"ElementaryTypeName","src":"991:7:326","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33209,"mutability":"mutable","name":"tokenId","nameLocation":"1013:7:326","nodeType":"VariableDeclaration","scope":33216,"src":"1005:15:326","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33208,"name":"uint256","nodeType":"ElementaryTypeName","src":"1005:7:326","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":33211,"mutability":"mutable","name":"data","nameLocation":"1037:4:326","nodeType":"VariableDeclaration","scope":33216,"src":"1022:19:326","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":33210,"name":"bytes","nodeType":"ElementaryTypeName","src":"1022:5:326","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"972:70:326"},"returnParameters":{"id":33215,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33214,"mutability":"mutable","name":"magicValue","nameLocation":"1068:10:326","nodeType":"VariableDeclaration","scope":33216,"src":"1061:17:326","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":33213,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1061:6:326","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"}],"src":"1060:19:326"},"scope":33217,"src":"947:133:326","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":33218,"src":"321:761:326","usedErrors":[],"usedEvents":[]}],"src":"32:1051:326"},"id":326},"contracts/token/ERC721/libraries/ERC721Storage.sol":{"ast":{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","exportedSymbols":{"Address":[38035],"Approval":[32194],"ApprovalForAll":[32203],"ERC721BalanceOfAddressZero":[32157],"ERC721BurntToken":[32174],"ERC721ExistingToken":[32167],"ERC721MintToAddressZero":[32162],"ERC721NonApprovedForApproval":[32123],"ERC721NonApprovedForTransfer":[32140],"ERC721NonExistingToken":[32131],"ERC721NonOwnedToken":[32147],"ERC721SafeTransferRejected":[32154],"ERC721SelfApproval":[32109],"ERC721SelfApprovalForAll":[32114],"ERC721Storage":[34972],"ERC721TransferToAddressZero":[32126],"IERC721":[33094],"IERC721BatchTransfer":[33109],"IERC721Burnable":[33130],"IERC721Deliverable":[33144],"IERC721Metadata":[33168],"IERC721Mintable":[33199],"IERC721Receiver":[33217],"InconsistentArrayLengths":[7886],"InterfaceDetectionStorage":[11680],"Transfer":[32185]},"id":34973,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":33219,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:327"},{"absolutePath":"contracts/token/ERC721/errors/ERC721Errors.sol","file":"./../errors/ERC721Errors.sol","id":33229,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":32158,"src":"103:318:327","symbolAliases":[{"foreign":{"id":33220,"name":"ERC721SelfApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32109,"src":"116:18:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33221,"name":"ERC721SelfApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32114,"src":"140:24:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33222,"name":"ERC721NonApprovedForApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32123,"src":"170:28:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33223,"name":"ERC721TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32126,"src":"204:27:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33224,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"237:22:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33225,"name":"ERC721NonApprovedForTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32140,"src":"265:28:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33226,"name":"ERC721NonOwnedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32147,"src":"299:19:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33227,"name":"ERC721SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32154,"src":"324:26:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33228,"name":"ERC721BalanceOfAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32157,"src":"356:26:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/errors/ERC721MintableErrors.sol","file":"./../errors/ERC721MintableErrors.sol","id":33232,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":32168,"src":"422:98:327","symbolAliases":[{"foreign":{"id":33230,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"430:23:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33231,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"455:19:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol","file":"./../errors/ERC721MintableOnceErrors.sol","id":33234,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":32175,"src":"521:74:327","symbolAliases":[{"foreign":{"id":33233,"name":"ERC721BurntToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32174,"src":"529:16:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../../CommonErrors.sol","id":33236,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":7890,"src":"596:69:327","symbolAliases":[{"foreign":{"id":33235,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"604:24:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/events/ERC721Events.sol","file":"./../events/ERC721Events.sol","id":33240,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":32204,"src":"666:80:327","symbolAliases":[{"foreign":{"id":33237,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"674:8:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33238,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32194,"src":"684:8:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":33239,"name":"ApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32203,"src":"694:14:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721.sol","file":"./../interfaces/IERC721.sol","id":33242,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33095,"src":"747:52:327","symbolAliases":[{"foreign":{"id":33241,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"755:7:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol","file":"./../interfaces/IERC721BatchTransfer.sol","id":33244,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33110,"src":"800:78:327","symbolAliases":[{"foreign":{"id":33243,"name":"IERC721BatchTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33109,"src":"808:20:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Metadata.sol","file":"./../interfaces/IERC721Metadata.sol","id":33246,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33169,"src":"879:68:327","symbolAliases":[{"foreign":{"id":33245,"name":"IERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33168,"src":"887:15:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Mintable.sol","file":"./../interfaces/IERC721Mintable.sol","id":33248,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33200,"src":"948:68:327","symbolAliases":[{"foreign":{"id":33247,"name":"IERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33199,"src":"956:15:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Deliverable.sol","file":"./../interfaces/IERC721Deliverable.sol","id":33250,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33145,"src":"1017:74:327","symbolAliases":[{"foreign":{"id":33249,"name":"IERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33144,"src":"1025:18:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Burnable.sol","file":"./../interfaces/IERC721Burnable.sol","id":33252,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33131,"src":"1092:68:327","symbolAliases":[{"foreign":{"id":33251,"name":"IERC721Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33130,"src":"1100:15:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/interfaces/IERC721Receiver.sol","file":"./../interfaces/IERC721Receiver.sol","id":33254,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":33218,"src":"1161:68:327","symbolAliases":[{"foreign":{"id":33253,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"1169:15:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/utils/libraries/Address.sol","file":"./../../../utils/libraries/Address.sol","id":33256,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":38036,"src":"1230:63:327","symbolAliases":[{"foreign":{"id":33255,"name":"Address","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38035,"src":"1238:7:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":33258,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":34973,"sourceUnit":11681,"src":"1294:107:327","symbolAliases":[{"foreign":{"id":33257,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"1302:25:327","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC721Storage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":34972,"linearizedBaseContracts":[34972],"name":"ERC721Storage","nameLocation":"1411:13:327","nodeType":"ContractDefinition","nodes":[{"global":false,"id":33261,"libraryName":{"id":33259,"name":"Address","nameLocations":["1437:7:327"],"nodeType":"IdentifierPath","referencedDeclaration":38035,"src":"1437:7:327"},"nodeType":"UsingForDirective","src":"1431:26:327","typeName":{"id":33260,"name":"address","nodeType":"ElementaryTypeName","src":"1449:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":33265,"libraryName":{"id":33262,"name":"ERC721Storage","nameLocations":["1468:13:327"],"nodeType":"IdentifierPath","referencedDeclaration":34972,"src":"1468:13:327"},"nodeType":"UsingForDirective","src":"1462:45:327","typeName":{"id":33264,"nodeType":"UserDefinedTypeName","pathNode":{"id":33263,"name":"ERC721Storage.Layout","nameLocations":["1486:13:327","1500:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"1486:20:327"},"referencedDeclaration":33288,"src":"1486:20:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}}},{"global":false,"id":33269,"libraryName":{"id":33266,"name":"InterfaceDetectionStorage","nameLocations":["1518:25:327"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"1518:25:327"},"nodeType":"UsingForDirective","src":"1512:69:327","typeName":{"id":33268,"nodeType":"UserDefinedTypeName","pathNode":{"id":33267,"name":"InterfaceDetectionStorage.Layout","nameLocations":["1548:25:327","1574:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"1548:32:327"},"referencedDeclaration":11590,"src":"1548:32:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ERC721Storage.Layout","id":33288,"members":[{"constant":false,"id":33273,"mutability":"mutable","name":"owners","nameLocation":"1639:6:327","nodeType":"VariableDeclaration","scope":33288,"src":"1611:34:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"},"typeName":{"id":33272,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":33270,"name":"uint256","nodeType":"ElementaryTypeName","src":"1619:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1611:27:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":33271,"name":"uint256","nodeType":"ElementaryTypeName","src":"1630:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"constant":false,"id":33277,"mutability":"mutable","name":"balances","nameLocation":"1683:8:327","nodeType":"VariableDeclaration","scope":33288,"src":"1655:36:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":33276,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":33274,"name":"address","nodeType":"ElementaryTypeName","src":"1663:7:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1655:27:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":33275,"name":"uint256","nodeType":"ElementaryTypeName","src":"1674:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"constant":false,"id":33281,"mutability":"mutable","name":"approvals","nameLocation":"1729:9:327","nodeType":"VariableDeclaration","scope":33288,"src":"1701:37:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"typeName":{"id":33280,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":33278,"name":"uint256","nodeType":"ElementaryTypeName","src":"1709:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1701:27:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":33279,"name":"address","nodeType":"ElementaryTypeName","src":"1720:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":33287,"mutability":"mutable","name":"operators","nameLocation":"1793:9:327","nodeType":"VariableDeclaration","scope":33288,"src":"1748:54:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"},"typeName":{"id":33286,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":33282,"name":"address","nodeType":"ElementaryTypeName","src":"1756:7:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1748:44:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":33285,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":33283,"name":"address","nodeType":"ElementaryTypeName","src":"1775:7:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1767:24:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":33284,"name":"bool","nodeType":"ElementaryTypeName","src":"1786:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}}},"visibility":"internal"}],"name":"Layout","nameLocation":"1594:6:327","nodeType":"StructDefinition","scope":34972,"src":"1587:222:327","visibility":"public"},{"constant":true,"id":33301,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"1841:19:327","nodeType":"VariableDeclaration","scope":34972,"src":"1815:118:327","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":33289,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1815:7:327","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":33299,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e4552433732312e4552433732312e73746f72616765","id":33295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1889:37:327","typeDescriptions":{"typeIdentifier":"t_stringliteral_ddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1","typeString":"literal_string \"animoca.token.ERC721.ERC721.storage\""},"value":"animoca.token.ERC721.ERC721.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_ddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1","typeString":"literal_string \"animoca.token.ERC721.ERC721.storage\""}],"id":33294,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"1879:9:327","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":33296,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1879:48:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":33293,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1871:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":33292,"name":"uint256","nodeType":"ElementaryTypeName","src":"1871:7:327","typeDescriptions":{}}},"id":33297,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1871:57:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":33298,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1931:1:327","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1871:61:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1863:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":33290,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1863:7:327","typeDescriptions":{}}},"id":33300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1863:70:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":33306,"mutability":"constant","name":"ERC721_RECEIVED","nameLocation":"1965:15:327","nodeType":"VariableDeclaration","scope":34972,"src":"1940:84:327","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"typeName":{"id":33302,"name":"bytes4","nodeType":"ElementaryTypeName","src":"1940:6:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"value":{"expression":{"expression":{"id":33303,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"1983:15:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$33217_$","typeString":"type(contract IERC721Receiver)"}},"id":33304,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1999:16:327","memberName":"onERC721Received","nodeType":"MemberAccess","referencedDeclaration":33216,"src":"1983:32:327","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$","typeString":"function IERC721Receiver.onERC721Received(address,address,uint256,bytes calldata) returns (bytes4)"}},"id":33305,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2016:8:327","memberName":"selector","nodeType":"MemberAccess","src":"1983:41:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"visibility":"internal"},{"constant":true,"id":33311,"mutability":"constant","name":"TOKEN_APPROVAL_OWNER_FLAG","nameLocation":"2192:25:327","nodeType":"VariableDeclaration","scope":34972,"src":"2166:62:327","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33307,"name":"uint256","nodeType":"ElementaryTypeName","src":"2166:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"commonType":{"typeIdentifier":"t_rational_1461501637330902918203684832716283019655932542976_by_1","typeString":"int_const 1461...(41 digits omitted)...2976"},"id":33310,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"31","id":33308,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2220:1:327","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"313630","id":33309,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2225:3:327","typeDescriptions":{"typeIdentifier":"t_rational_160_by_1","typeString":"int_const 160"},"value":"160"},"src":"2220:8:327","typeDescriptions":{"typeIdentifier":"t_rational_1461501637330902918203684832716283019655932542976_by_1","typeString":"int_const 1461...(41 digits omitted)...2976"}},"visibility":"internal"},{"constant":true,"id":33314,"mutability":"constant","name":"BURNT_TOKEN_OWNER_VALUE","nameLocation":"2388:23:327","nodeType":"VariableDeclaration","scope":34972,"src":"2362:118:327","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33312,"name":"uint256","nodeType":"ElementaryTypeName","src":"2362:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"307864656164303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030","id":33313,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2414:66:327","typeDescriptions":{"typeIdentifier":"t_rational_100719116927691798707895874029850069994745719541394658707722161504685790330880_by_1","typeString":"int_const 1007...(70 digits omitted)...0880"},"value":"0xdead000000000000000000000000000000000000000000000000000000000000"},"visibility":"internal"},{"body":{"id":33330,"nodeType":"Block","src":"2590:106:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33324,"name":"IERC721","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33094,"src":"2662:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721_$33094_$","typeString":"type(contract IERC721)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721_$33094_$","typeString":"type(contract IERC721)"}],"id":33323,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2657:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33325,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2657:13:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721_$33094","typeString":"type(contract IERC721)"}},"id":33326,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2671:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"2657:25:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33327,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2684:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33318,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2600:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33320,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2626:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2600:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2600:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33322,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2635:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2600:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33328,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2600:89:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33329,"nodeType":"ExpressionStatement","src":"2600:89:327"}]},"documentation":{"id":33315,"nodeType":"StructuredDocumentation","src":"2487:73:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721."},"id":33331,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2574:4:327","nodeType":"FunctionDefinition","parameters":{"id":33316,"nodeType":"ParameterList","parameters":[],"src":"2578:2:327"},"returnParameters":{"id":33317,"nodeType":"ParameterList","parameters":[],"src":"2590:0:327"},"scope":34972,"src":"2565:131:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33347,"nodeType":"Block","src":"2837:119:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33341,"name":"IERC721BatchTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33109,"src":"2909:20:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721BatchTransfer_$33109_$","typeString":"type(contract IERC721BatchTransfer)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721BatchTransfer_$33109_$","typeString":"type(contract IERC721BatchTransfer)"}],"id":33340,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"2904:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33342,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2904:26:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721BatchTransfer_$33109","typeString":"type(contract IERC721BatchTransfer)"}},"id":33343,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2931:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"2904:38:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33344,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2944:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33335,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"2847:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2873:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"2847:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33338,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2847:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33339,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2882:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"2847:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33345,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2847:102:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33346,"nodeType":"ExpressionStatement","src":"2847:102:327"}]},"documentation":{"id":33332,"nodeType":"StructuredDocumentation","src":"2702:86:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer."},"id":33348,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721BatchTransfer","nameLocation":"2802:23:327","nodeType":"FunctionDefinition","parameters":{"id":33333,"nodeType":"ParameterList","parameters":[],"src":"2825:2:327"},"returnParameters":{"id":33334,"nodeType":"ParameterList","parameters":[],"src":"2837:0:327"},"scope":34972,"src":"2793:163:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33364,"nodeType":"Block","src":"3087:114:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33358,"name":"IERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33168,"src":"3159:15:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Metadata_$33168_$","typeString":"type(contract IERC721Metadata)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Metadata_$33168_$","typeString":"type(contract IERC721Metadata)"}],"id":33357,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3154:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33359,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3154:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Metadata_$33168","typeString":"type(contract IERC721Metadata)"}},"id":33360,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3176:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"3154:33:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33361,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3189:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33352,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3097:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33354,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3123:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3097:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33355,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3097:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33356,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3132:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3097:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33362,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3097:97:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33363,"nodeType":"ExpressionStatement","src":"3097:97:327"}]},"documentation":{"id":33349,"nodeType":"StructuredDocumentation","src":"2962:81:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Metadata."},"id":33365,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Metadata","nameLocation":"3057:18:327","nodeType":"FunctionDefinition","parameters":{"id":33350,"nodeType":"ParameterList","parameters":[],"src":"3075:2:327"},"returnParameters":{"id":33351,"nodeType":"ParameterList","parameters":[],"src":"3087:0:327"},"scope":34972,"src":"3048:153:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33381,"nodeType":"Block","src":"3332:114:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33375,"name":"IERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33199,"src":"3404:15:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Mintable_$33199_$","typeString":"type(contract IERC721Mintable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Mintable_$33199_$","typeString":"type(contract IERC721Mintable)"}],"id":33374,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3399:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33376,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3399:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Mintable_$33199","typeString":"type(contract IERC721Mintable)"}},"id":33377,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3421:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"3399:33:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33378,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3434:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33369,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3342:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33371,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3368:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3342:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33372,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3342:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33373,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3377:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3342:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33379,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3342:97:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33380,"nodeType":"ExpressionStatement","src":"3342:97:327"}]},"documentation":{"id":33366,"nodeType":"StructuredDocumentation","src":"3207:81:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"id":33382,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Mintable","nameLocation":"3302:18:327","nodeType":"FunctionDefinition","parameters":{"id":33367,"nodeType":"ParameterList","parameters":[],"src":"3320:2:327"},"returnParameters":{"id":33368,"nodeType":"ParameterList","parameters":[],"src":"3332:0:327"},"scope":34972,"src":"3293:153:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33398,"nodeType":"Block","src":"3583:117:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33392,"name":"IERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33144,"src":"3655:18:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Deliverable_$33144_$","typeString":"type(contract IERC721Deliverable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Deliverable_$33144_$","typeString":"type(contract IERC721Deliverable)"}],"id":33391,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3650:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33393,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3650:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Deliverable_$33144","typeString":"type(contract IERC721Deliverable)"}},"id":33394,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3675:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"3650:36:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33395,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3688:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33386,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3593:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3619:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3593:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33389,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3593:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33390,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3628:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3593:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3593:100:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33397,"nodeType":"ExpressionStatement","src":"3593:100:327"}]},"documentation":{"id":33383,"nodeType":"StructuredDocumentation","src":"3452:84:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable."},"id":33399,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Deliverable","nameLocation":"3550:21:327","nodeType":"FunctionDefinition","parameters":{"id":33384,"nodeType":"ParameterList","parameters":[],"src":"3571:2:327"},"returnParameters":{"id":33385,"nodeType":"ParameterList","parameters":[],"src":"3583:0:327"},"scope":34972,"src":"3541:159:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33415,"nodeType":"Block","src":"3831:114:327","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":33409,"name":"IERC721Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33130,"src":"3903:15:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Burnable_$33130_$","typeString":"type(contract IERC721Burnable)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC721Burnable_$33130_$","typeString":"type(contract IERC721Burnable)"}],"id":33408,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3898:4:327","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":33410,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3898:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC721Burnable_$33130","typeString":"type(contract IERC721Burnable)"}},"id":33411,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3920:11:327","memberName":"interfaceId","nodeType":"MemberAccess","src":"3898:33:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":33412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3933:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33403,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"3841:25:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":33405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3867:6:327","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"3841:32:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":33406,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3841:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":33407,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3876:21:327","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"3841:56:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":33413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3841:97:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33414,"nodeType":"ExpressionStatement","src":"3841:97:327"}]},"documentation":{"id":33400,"nodeType":"StructuredDocumentation","src":"3706:81:327","text":"@notice Marks the following ERC165 interface(s) as supported: ERC721Burnable."},"id":33416,"implemented":true,"kind":"function","modifiers":[],"name":"initERC721Burnable","nameLocation":"3801:18:327","nodeType":"FunctionDefinition","parameters":{"id":33401,"nodeType":"ParameterList","parameters":[],"src":"3819:2:327"},"returnParameters":{"id":33402,"nodeType":"ParameterList","parameters":[],"src":"3831:0:327"},"scope":34972,"src":"3792:153:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33533,"nodeType":"Block","src":"4749:963:327","statements":[{"assignments":[33430],"declarations":[{"constant":false,"id":33430,"mutability":"mutable","name":"owner","nameLocation":"4767:5:327","nodeType":"VariableDeclaration","scope":33533,"src":"4759:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33429,"name":"uint256","nodeType":"ElementaryTypeName","src":"4759:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33435,"initialValue":{"baseExpression":{"expression":{"id":33431,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33420,"src":"4775:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33432,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4777:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"4775:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33434,"indexExpression":{"id":33433,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"4784:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4775:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"4759:33:327"},{"condition":{"id":33439,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4806:20:327","subExpression":{"arguments":[{"id":33437,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33430,"src":"4820:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33436,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"4807:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4807:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33444,"nodeType":"IfStatement","src":"4802:64:327","trueBody":{"errorCall":{"arguments":[{"id":33441,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"4858:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33440,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"4835:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":33442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4835:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33443,"nodeType":"RevertStatement","src":"4828:38:327"}},{"assignments":[33446],"declarations":[{"constant":false,"id":33446,"mutability":"mutable","name":"ownerAddress","nameLocation":"4884:12:327","nodeType":"VariableDeclaration","scope":33533,"src":"4876:20:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33445,"name":"address","nodeType":"ElementaryTypeName","src":"4876:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":33450,"initialValue":{"arguments":[{"id":33448,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33430,"src":"4911:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33447,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"4899:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":33449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4899:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4876:41:327"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33451,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33424,"src":"4931:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":33452,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"4937:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4931:18:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33458,"nodeType":"IfStatement","src":"4927:63:327","trueBody":{"errorCall":{"arguments":[{"id":33455,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"4977:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33454,"name":"ERC721SelfApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32109,"src":"4958:18:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":33456,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4958:32:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33457,"nodeType":"RevertStatement","src":"4951:39:327"}},{"condition":{"id":33464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"5004:39:327","subExpression":{"arguments":[{"id":33460,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33420,"src":"5019:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},{"id":33461,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"5022:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33462,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33422,"src":"5036:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":33459,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34914,"src":"5005:13:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":33463,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5005:38:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33471,"nodeType":"IfStatement","src":"5000:111:327","trueBody":{"errorCall":{"arguments":[{"id":33466,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33422,"src":"5081:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33467,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"5089:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33468,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"5103:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33465,"name":"ERC721NonApprovedForApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32123,"src":"5052:28:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256) pure returns (error)"}},"id":33469,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5052:59:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33470,"nodeType":"RevertStatement","src":"5045:66:327"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33477,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33472,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33424,"src":"5125:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":33475,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5139:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":33474,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5131:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33473,"name":"address","nodeType":"ElementaryTypeName","src":"5131:7:327","typeDescriptions":{}}},"id":33476,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5131:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5125:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":33525,"nodeType":"Block","src":"5346:310:327","statements":[{"assignments":[33499],"declarations":[{"constant":false,"id":33499,"mutability":"mutable","name":"ownerWithApprovalBit","nameLocation":"5368:20:327","nodeType":"VariableDeclaration","scope":33525,"src":"5360:28:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33498,"name":"uint256","nodeType":"ElementaryTypeName","src":"5360:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33503,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":33502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33500,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33430,"src":"5391:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"|","rightExpression":{"id":33501,"name":"TOKEN_APPROVAL_OWNER_FLAG","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33311,"src":"5399:25:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5391:33:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"5360:64:327"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":33506,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33504,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33430,"src":"5442:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":33505,"name":"ownerWithApprovalBit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33499,"src":"5451:20:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5442:29:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33516,"nodeType":"IfStatement","src":"5438:169:327","trueBody":{"id":33515,"nodeType":"Block","src":"5473:134:327","statements":[{"expression":{"id":33513,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33507,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33420,"src":"5552:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33510,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5554:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"5552:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33511,"indexExpression":{"id":33509,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"5561:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5552:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":33512,"name":"ownerWithApprovalBit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33499,"src":"5572:20:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5552:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33514,"nodeType":"ExpressionStatement","src":"5552:40:327"}]}},{"expression":{"id":33523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33517,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33420,"src":"5620:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33520,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5622:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"5620:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":33521,"indexExpression":{"id":33519,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"5632:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5620:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":33522,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33424,"src":"5643:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5620:25:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":33524,"nodeType":"ExpressionStatement","src":"5620:25:327"}]},"id":33526,"nodeType":"IfStatement","src":"5121:535:327","trueBody":{"id":33497,"nodeType":"Block","src":"5143:197:327","statements":[{"condition":{"arguments":[{"id":33479,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33430,"src":"5179:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33478,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"5161:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5161:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33496,"nodeType":"IfStatement","src":"5157:173:327","trueBody":{"id":33495,"nodeType":"Block","src":"5187:143:327","statements":[{"expression":{"id":33493,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33481,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33420,"src":"5265:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33484,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"5267:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"5265:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33485,"indexExpression":{"id":33483,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"5274:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5265:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":33490,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"5301:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33489,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5293:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":33488,"name":"uint160","nodeType":"ElementaryTypeName","src":"5293:7:327","typeDescriptions":{}}},"id":33491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5293:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":33487,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5285:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":33486,"name":"uint256","nodeType":"ElementaryTypeName","src":"5285:7:327","typeDescriptions":{}}},"id":33492,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5285:30:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5265:50:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33494,"nodeType":"ExpressionStatement","src":"5265:50:327"}]}}]}},{"eventCall":{"arguments":[{"id":33528,"name":"ownerAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33446,"src":"5679:12:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33529,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33424,"src":"5693:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33530,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33426,"src":"5697:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33527,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32194,"src":"5670:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":33531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5670:35:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33532,"nodeType":"EmitStatement","src":"5665:40:327"}]},"documentation":{"id":33417,"nodeType":"StructuredDocumentation","src":"3951:704:327","text":"@notice Sets or unsets an approval to transfer a single token on behalf of its owner.\n @dev Note: This function implements {ERC721-approve(address,uint256)}.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\n @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\n @dev Emits an {Approval} event.\n @param sender The message sender.\n @param to The address to approve, or the zero address to remove any existing approval.\n @param tokenId The token identifier to give approval for."},"id":33534,"implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"4669:7:327","nodeType":"FunctionDefinition","parameters":{"id":33427,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33420,"mutability":"mutable","name":"s","nameLocation":"4692:1:327","nodeType":"VariableDeclaration","scope":33534,"src":"4677:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33419,"nodeType":"UserDefinedTypeName","pathNode":{"id":33418,"name":"Layout","nameLocations":["4677:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"4677:6:327"},"referencedDeclaration":33288,"src":"4677:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33422,"mutability":"mutable","name":"sender","nameLocation":"4703:6:327","nodeType":"VariableDeclaration","scope":33534,"src":"4695:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33421,"name":"address","nodeType":"ElementaryTypeName","src":"4695:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33424,"mutability":"mutable","name":"to","nameLocation":"4719:2:327","nodeType":"VariableDeclaration","scope":33534,"src":"4711:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33423,"name":"address","nodeType":"ElementaryTypeName","src":"4711:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33426,"mutability":"mutable","name":"tokenId","nameLocation":"4731:7:327","nodeType":"VariableDeclaration","scope":33534,"src":"4723:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33425,"name":"uint256","nodeType":"ElementaryTypeName","src":"4723:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4676:63:327"},"returnParameters":{"id":33428,"nodeType":"ParameterList","parameters":[],"src":"4749:0:327"},"scope":34972,"src":"4660:1052:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33571,"nodeType":"Block","src":"6325:187:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33549,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33547,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33542,"src":"6339:8:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":33548,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33540,"src":"6351:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"6339:18:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33554,"nodeType":"IfStatement","src":"6335:63:327","trueBody":{"errorCall":{"arguments":[{"id":33551,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33540,"src":"6391:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33550,"name":"ERC721SelfApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32114,"src":"6366:24:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":33552,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6366:32:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33553,"nodeType":"RevertStatement","src":"6359:39:327"}},{"expression":{"id":33563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"expression":{"id":33555,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33538,"src":"6408:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33559,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6410:9:327","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":33287,"src":"6408:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":33560,"indexExpression":{"id":33557,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33540,"src":"6420:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6408:19:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":33561,"indexExpression":{"id":33558,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33542,"src":"6428:8:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6408:29:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":33562,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33544,"src":"6440:8:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"6408:40:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33564,"nodeType":"ExpressionStatement","src":"6408:40:327"},{"eventCall":{"arguments":[{"id":33566,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33540,"src":"6478:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33567,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33542,"src":"6486:8:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33568,"name":"approved","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33544,"src":"6496:8:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":33565,"name":"ApprovalForAll","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32203,"src":"6463:14:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$returns$__$","typeString":"function (address,address,bool)"}},"id":33569,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6463:42:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33570,"nodeType":"EmitStatement","src":"6458:47:327"}]},"documentation":{"id":33535,"nodeType":"StructuredDocumentation","src":"5718:499:327","text":"@notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\n @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\n @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\n @dev Emits an {ApprovalForAll} event.\n @param sender The message sender.\n @param operator The address to approve for all tokens.\n @param approved True to set an approval for all tokens, false to unset it."},"id":33572,"implemented":true,"kind":"function","modifiers":[],"name":"setApprovalForAll","nameLocation":"6231:17:327","nodeType":"FunctionDefinition","parameters":{"id":33545,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33538,"mutability":"mutable","name":"s","nameLocation":"6264:1:327","nodeType":"VariableDeclaration","scope":33572,"src":"6249:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33537,"nodeType":"UserDefinedTypeName","pathNode":{"id":33536,"name":"Layout","nameLocations":["6249:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"6249:6:327"},"referencedDeclaration":33288,"src":"6249:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33540,"mutability":"mutable","name":"sender","nameLocation":"6275:6:327","nodeType":"VariableDeclaration","scope":33572,"src":"6267:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33539,"name":"address","nodeType":"ElementaryTypeName","src":"6267:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33542,"mutability":"mutable","name":"operator","nameLocation":"6291:8:327","nodeType":"VariableDeclaration","scope":33572,"src":"6283:16:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33541,"name":"address","nodeType":"ElementaryTypeName","src":"6283:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33544,"mutability":"mutable","name":"approved","nameLocation":"6306:8:327","nodeType":"VariableDeclaration","scope":33572,"src":"6301:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":33543,"name":"bool","nodeType":"ElementaryTypeName","src":"6301:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6248:67:327"},"returnParameters":{"id":33546,"nodeType":"ParameterList","parameters":[],"src":"6325:0:327"},"scope":34972,"src":"6222:290:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33688,"nodeType":"Block","src":"7493:848:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33587,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33582,"src":"7507:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":33590,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7521:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":33589,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7513:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33588,"name":"address","nodeType":"ElementaryTypeName","src":"7513:7:327","typeDescriptions":{}}},"id":33591,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7513:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7507:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33596,"nodeType":"IfStatement","src":"7503:58:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":33593,"name":"ERC721TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32126,"src":"7532:27:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":33594,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7532:29:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33595,"nodeType":"RevertStatement","src":"7525:36:327"}},{"assignments":[33598],"declarations":[{"constant":false,"id":33598,"mutability":"mutable","name":"owner","nameLocation":"7580:5:327","nodeType":"VariableDeclaration","scope":33688,"src":"7572:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33597,"name":"uint256","nodeType":"ElementaryTypeName","src":"7572:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33603,"initialValue":{"baseExpression":{"expression":{"id":33599,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"7588:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33600,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7590:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"7588:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33602,"indexExpression":{"id":33601,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7597:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7588:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7572:33:327"},{"condition":{"id":33607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"7619:20:327","subExpression":{"arguments":[{"id":33605,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33598,"src":"7633:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33604,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"7620:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7620:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33612,"nodeType":"IfStatement","src":"7615:64:327","trueBody":{"errorCall":{"arguments":[{"id":33609,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7671:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33608,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"7648:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":33610,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7648:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33611,"nodeType":"RevertStatement","src":"7641:38:327"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":33614,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33598,"src":"7705:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33613,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"7693:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":33615,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7693:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":33616,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"7715:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7693:26:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33623,"nodeType":"IfStatement","src":"7689:73:327","trueBody":{"errorCall":{"arguments":[{"id":33619,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"7748:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33620,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7754:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33618,"name":"ERC721NonOwnedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32147,"src":"7728:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256) pure returns (error)"}},"id":33621,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7728:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33622,"nodeType":"RevertStatement","src":"7721:41:327"}},{"condition":{"id":33629,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"7777:31:327","subExpression":{"arguments":[{"id":33625,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"7792:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},{"id":33626,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"7795:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33627,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33578,"src":"7801:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":33624,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34914,"src":"7778:13:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":33628,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7778:30:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33649,"nodeType":"IfStatement","src":"7773:185:327","trueBody":{"id":33648,"nodeType":"Block","src":"7810:148:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":33640,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"7828:25:327","subExpression":{"arguments":[{"id":33631,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33598,"src":"7847:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33630,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"7829:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33632,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7829:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33634,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33578,"src":"7857:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"expression":{"id":33635,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"7867:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33636,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7869:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"7867:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":33638,"indexExpression":{"id":33637,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7879:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7867:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7857:30:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"7828:59:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33647,"nodeType":"IfStatement","src":"7824:123:327","trueBody":{"errorCall":{"arguments":[{"id":33642,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33578,"src":"7925:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33643,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"7933:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33644,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7939:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33641,"name":"ERC721NonApprovedForTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32140,"src":"7896:28:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256) pure returns (error)"}},"id":33645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7896:51:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33646,"nodeType":"RevertStatement","src":"7889:58:327"}}]}},{"expression":{"id":33662,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33650,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"7968:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33653,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7970:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"7968:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33654,"indexExpression":{"id":33652,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"7977:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7968:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":33659,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33582,"src":"8004:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33658,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7996:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":33657,"name":"uint160","nodeType":"ElementaryTypeName","src":"7996:7:327","typeDescriptions":{}}},"id":33660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7996:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":33656,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7988:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":33655,"name":"uint256","nodeType":"ElementaryTypeName","src":"7988:7:327","typeDescriptions":{}}},"id":33661,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7988:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7968:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33663,"nodeType":"ExpressionStatement","src":"7968:40:327"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33666,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33664,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"8022:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":33665,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33582,"src":"8030:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8022:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33681,"nodeType":"IfStatement","src":"8018:274:327","trueBody":{"id":33680,"nodeType":"Block","src":"8034:258:327","statements":[{"id":33679,"nodeType":"UncheckedBlock","src":"8048:234:327","statements":[{"expression":{"id":33671,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"8153:18:327","subExpression":{"baseExpression":{"expression":{"id":33667,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"8155:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33668,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8157:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"8155:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":33670,"indexExpression":{"id":33669,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"8166:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8155:16:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33672,"nodeType":"ExpressionStatement","src":"8153:18:327"},{"expression":{"id":33677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"8251:16:327","subExpression":{"baseExpression":{"expression":{"id":33673,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33576,"src":"8253:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33674,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8255:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"8253:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":33676,"indexExpression":{"id":33675,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33582,"src":"8264:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8253:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33678,"nodeType":"ExpressionStatement","src":"8251:16:327"}]}]}},{"eventCall":{"arguments":[{"id":33683,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33580,"src":"8316:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33684,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33582,"src":"8322:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33685,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33584,"src":"8326:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33682,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"8307:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":33686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8307:27:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33687,"nodeType":"EmitStatement","src":"8302:32:327"}]},"documentation":{"id":33573,"nodeType":"StructuredDocumentation","src":"6518:862:327","text":"@notice Unsafely transfers the ownership of a token to a recipient by a sender.\n @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n @dev Emits a {Transfer} event.\n @param sender The message sender.\n @param from The current token owner.\n @param to The recipient of the token transfer.\n @param tokenId The identifier of the token to transfer."},"id":33689,"implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"7394:12:327","nodeType":"FunctionDefinition","parameters":{"id":33585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33576,"mutability":"mutable","name":"s","nameLocation":"7422:1:327","nodeType":"VariableDeclaration","scope":33689,"src":"7407:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33575,"nodeType":"UserDefinedTypeName","pathNode":{"id":33574,"name":"Layout","nameLocations":["7407:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"7407:6:327"},"referencedDeclaration":33288,"src":"7407:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33578,"mutability":"mutable","name":"sender","nameLocation":"7433:6:327","nodeType":"VariableDeclaration","scope":33689,"src":"7425:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33577,"name":"address","nodeType":"ElementaryTypeName","src":"7425:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33580,"mutability":"mutable","name":"from","nameLocation":"7449:4:327","nodeType":"VariableDeclaration","scope":33689,"src":"7441:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33579,"name":"address","nodeType":"ElementaryTypeName","src":"7441:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33582,"mutability":"mutable","name":"to","nameLocation":"7463:2:327","nodeType":"VariableDeclaration","scope":33689,"src":"7455:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33581,"name":"address","nodeType":"ElementaryTypeName","src":"7455:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33584,"mutability":"mutable","name":"tokenId","nameLocation":"7475:7:327","nodeType":"VariableDeclaration","scope":33689,"src":"7467:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33583,"name":"uint256","nodeType":"ElementaryTypeName","src":"7467:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7406:77:327"},"returnParameters":{"id":33586,"nodeType":"ParameterList","parameters":[],"src":"7493:0:327"},"scope":34972,"src":"7385:956:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33726,"nodeType":"Block","src":"9625:166:327","statements":[{"expression":{"arguments":[{"id":33707,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33695,"src":"9650:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33708,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33697,"src":"9658:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33709,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33699,"src":"9664:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33710,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33701,"src":"9668:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":33704,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33693,"src":"9635:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33706,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9637:12:327","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33689,"src":"9635:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":33711,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9635:41:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33712,"nodeType":"ExpressionStatement","src":"9635:41:327"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33713,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33699,"src":"9690:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":33714,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9693:11:327","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"9690:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":33715,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9690:16:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33725,"nodeType":"IfStatement","src":"9686:99:327","trueBody":{"id":33724,"nodeType":"Block","src":"9708:77:327","statements":[{"expression":{"arguments":[{"id":33717,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33695,"src":"9744:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33718,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33697,"src":"9752:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33719,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33699,"src":"9758:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33720,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33701,"src":"9762:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"hexValue":"","id":33721,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9771:2:327","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":33716,"name":"_callOnERC721Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34888,"src":"9722:21:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":33722,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9722:52:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33723,"nodeType":"ExpressionStatement","src":"9722:52:327"}]}}]},"documentation":{"id":33690,"nodeType":"StructuredDocumentation","src":"8347:1161:327","text":"@notice Safely transfers the ownership of a token to a recipient by a sender.\n @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @param sender The message sender.\n @param from The current token owner.\n @param to The recipient of the token transfer.\n @param tokenId The identifier of the token to transfer."},"id":33727,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"9522:16:327","nodeType":"FunctionDefinition","parameters":{"id":33702,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33693,"mutability":"mutable","name":"s","nameLocation":"9554:1:327","nodeType":"VariableDeclaration","scope":33727,"src":"9539:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33692,"nodeType":"UserDefinedTypeName","pathNode":{"id":33691,"name":"Layout","nameLocations":["9539:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"9539:6:327"},"referencedDeclaration":33288,"src":"9539:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33695,"mutability":"mutable","name":"sender","nameLocation":"9565:6:327","nodeType":"VariableDeclaration","scope":33727,"src":"9557:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33694,"name":"address","nodeType":"ElementaryTypeName","src":"9557:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33697,"mutability":"mutable","name":"from","nameLocation":"9581:4:327","nodeType":"VariableDeclaration","scope":33727,"src":"9573:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33696,"name":"address","nodeType":"ElementaryTypeName","src":"9573:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33699,"mutability":"mutable","name":"to","nameLocation":"9595:2:327","nodeType":"VariableDeclaration","scope":33727,"src":"9587:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33698,"name":"address","nodeType":"ElementaryTypeName","src":"9587:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33701,"mutability":"mutable","name":"tokenId","nameLocation":"9607:7:327","nodeType":"VariableDeclaration","scope":33727,"src":"9599:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33700,"name":"uint256","nodeType":"ElementaryTypeName","src":"9599:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9538:77:327"},"returnParameters":{"id":33703,"nodeType":"ParameterList","parameters":[],"src":"9625:0:327"},"scope":34972,"src":"9513:278:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33766,"nodeType":"Block","src":"11174:168:327","statements":[{"expression":{"arguments":[{"id":33747,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33733,"src":"11199:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33748,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33735,"src":"11207:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33749,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33737,"src":"11213:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33750,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33739,"src":"11217:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":33744,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33731,"src":"11184:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33746,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11186:12:327","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":33689,"src":"11184:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address,address,uint256)"}},"id":33751,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11184:41:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33752,"nodeType":"ExpressionStatement","src":"11184:41:327"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":33753,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33737,"src":"11239:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":33754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"11242:11:327","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"11239:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":33755,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11239:16:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33765,"nodeType":"IfStatement","src":"11235:101:327","trueBody":{"id":33764,"nodeType":"Block","src":"11257:79:327","statements":[{"expression":{"arguments":[{"id":33757,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33733,"src":"11293:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33758,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33735,"src":"11301:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33759,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33737,"src":"11307:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33760,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33739,"src":"11311:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":33761,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33741,"src":"11320:4:327","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":33756,"name":"_callOnERC721Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34888,"src":"11271:21:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":33762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11271:54:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33763,"nodeType":"ExpressionStatement","src":"11271:54:327"}]}}]},"documentation":{"id":33728,"nodeType":"StructuredDocumentation","src":"9797:1239:327","text":"@notice Safely transfers the ownership of a token to a recipient by a sender.\n @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Resets the token approval for `tokenId`.\n @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event.\n @param sender The message sender.\n @param from The current token owner.\n @param to The recipient of the token transfer.\n @param tokenId The identifier of the token to transfer.\n @param data Optional data to send along to a receiver contract."},"id":33767,"implemented":true,"kind":"function","modifiers":[],"name":"safeTransferFrom","nameLocation":"11050:16:327","nodeType":"FunctionDefinition","parameters":{"id":33742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33731,"mutability":"mutable","name":"s","nameLocation":"11082:1:327","nodeType":"VariableDeclaration","scope":33767,"src":"11067:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33730,"nodeType":"UserDefinedTypeName","pathNode":{"id":33729,"name":"Layout","nameLocations":["11067:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"11067:6:327"},"referencedDeclaration":33288,"src":"11067:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33733,"mutability":"mutable","name":"sender","nameLocation":"11093:6:327","nodeType":"VariableDeclaration","scope":33767,"src":"11085:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33732,"name":"address","nodeType":"ElementaryTypeName","src":"11085:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33735,"mutability":"mutable","name":"from","nameLocation":"11109:4:327","nodeType":"VariableDeclaration","scope":33767,"src":"11101:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33734,"name":"address","nodeType":"ElementaryTypeName","src":"11101:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33737,"mutability":"mutable","name":"to","nameLocation":"11123:2:327","nodeType":"VariableDeclaration","scope":33767,"src":"11115:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33736,"name":"address","nodeType":"ElementaryTypeName","src":"11115:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33739,"mutability":"mutable","name":"tokenId","nameLocation":"11135:7:327","nodeType":"VariableDeclaration","scope":33767,"src":"11127:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33738,"name":"uint256","nodeType":"ElementaryTypeName","src":"11127:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":33741,"mutability":"mutable","name":"data","nameLocation":"11159:4:327","nodeType":"VariableDeclaration","scope":33767,"src":"11144:19:327","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":33740,"name":"bytes","nodeType":"ElementaryTypeName","src":"11144:5:327","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"11066:98:327"},"returnParameters":{"id":33743,"nodeType":"ParameterList","parameters":[],"src":"11174:0:327"},"scope":34972,"src":"11041:301:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33918,"nodeType":"Block","src":"12399:1084:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33788,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33783,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33777,"src":"12413:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":33786,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"12427:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":33785,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12419:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33784,"name":"address","nodeType":"ElementaryTypeName","src":"12419:7:327","typeDescriptions":{}}},"id":33787,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12419:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12413:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33792,"nodeType":"IfStatement","src":"12409:58:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":33789,"name":"ERC721TransferToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32126,"src":"12438:27:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":33790,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12438:29:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33791,"nodeType":"RevertStatement","src":"12431:36:327"}},{"assignments":[33794],"declarations":[{"constant":false,"id":33794,"mutability":"mutable","name":"operatable","nameLocation":"12482:10:327","nodeType":"VariableDeclaration","scope":33918,"src":"12477:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":33793,"name":"bool","nodeType":"ElementaryTypeName","src":"12477:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":33800,"initialValue":{"arguments":[{"id":33796,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"12509:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},{"id":33797,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"12512:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33798,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33773,"src":"12518:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":33795,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34914,"src":"12495:13:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":33799,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12495:30:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"12477:48:327"},{"assignments":[33802],"declarations":[{"constant":false,"id":33802,"mutability":"mutable","name":"length","nameLocation":"12544:6:327","nodeType":"VariableDeclaration","scope":33918,"src":"12536:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33801,"name":"uint256","nodeType":"ElementaryTypeName","src":"12536:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33805,"initialValue":{"expression":{"id":33803,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33780,"src":"12553:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":33804,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12562:6:327","memberName":"length","nodeType":"MemberAccess","src":"12553:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12536:32:327"},{"body":{"id":33890,"nodeType":"Block","src":"12611:552:327","statements":[{"assignments":[33816],"declarations":[{"constant":false,"id":33816,"mutability":"mutable","name":"tokenId","nameLocation":"12633:7:327","nodeType":"VariableDeclaration","scope":33890,"src":"12625:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33815,"name":"uint256","nodeType":"ElementaryTypeName","src":"12625:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33820,"initialValue":{"baseExpression":{"id":33817,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33780,"src":"12643:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":33819,"indexExpression":{"id":33818,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33807,"src":"12652:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12643:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12625:29:327"},{"assignments":[33822],"declarations":[{"constant":false,"id":33822,"mutability":"mutable","name":"owner","nameLocation":"12676:5:327","nodeType":"VariableDeclaration","scope":33890,"src":"12668:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33821,"name":"uint256","nodeType":"ElementaryTypeName","src":"12668:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33827,"initialValue":{"baseExpression":{"expression":{"id":33823,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"12684:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33824,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12686:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"12684:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33826,"indexExpression":{"id":33825,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"12693:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12684:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12668:33:327"},{"condition":{"id":33831,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"12719:20:327","subExpression":{"arguments":[{"id":33829,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33822,"src":"12733:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33828,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"12720:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33830,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12720:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33836,"nodeType":"IfStatement","src":"12715:64:327","trueBody":{"errorCall":{"arguments":[{"id":33833,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"12771:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33832,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"12748:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":33834,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12748:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33835,"nodeType":"RevertStatement","src":"12741:38:327"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":33838,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33822,"src":"12809:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33837,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"12797:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":33839,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12797:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":33840,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"12819:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12797:26:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33847,"nodeType":"IfStatement","src":"12793:73:327","trueBody":{"errorCall":{"arguments":[{"id":33843,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"12852:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33844,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"12858:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33842,"name":"ERC721NonOwnedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32147,"src":"12832:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256) pure returns (error)"}},"id":33845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12832:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33846,"nodeType":"RevertStatement","src":"12825:41:327"}},{"condition":{"id":33849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"12884:11:327","subExpression":{"id":33848,"name":"operatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33794,"src":"12885:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33869,"nodeType":"IfStatement","src":"12880:173:327","trueBody":{"id":33868,"nodeType":"Block","src":"12897:156:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":33860,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"12919:25:327","subExpression":{"arguments":[{"id":33851,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33822,"src":"12938:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33850,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"12920:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33852,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12920:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33854,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33773,"src":"12948:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"expression":{"id":33855,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"12958:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33856,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"12960:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"12958:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":33858,"indexExpression":{"id":33857,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"12970:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12958:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"12948:30:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"12919:59:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33867,"nodeType":"IfStatement","src":"12915:123:327","trueBody":{"errorCall":{"arguments":[{"id":33862,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33773,"src":"13016:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33863,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"13024:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33864,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"13030:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33861,"name":"ERC721NonApprovedForTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32140,"src":"12987:28:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256) pure returns (error)"}},"id":33865,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12987:51:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33866,"nodeType":"RevertStatement","src":"12980:58:327"}}]}},{"expression":{"id":33882,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33870,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"13066:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33873,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13068:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"13066:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33874,"indexExpression":{"id":33872,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"13075:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13066:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":33879,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33777,"src":"13102:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33878,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13094:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":33877,"name":"uint160","nodeType":"ElementaryTypeName","src":"13094:7:327","typeDescriptions":{}}},"id":33880,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13094:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":33876,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"13086:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":33875,"name":"uint256","nodeType":"ElementaryTypeName","src":"13086:7:327","typeDescriptions":{}}},"id":33881,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13086:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13066:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33883,"nodeType":"ExpressionStatement","src":"13066:40:327"},{"eventCall":{"arguments":[{"id":33885,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"13134:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33886,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33777,"src":"13140:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33887,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33816,"src":"13144:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33884,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"13125:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":33888,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"13125:27:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33889,"nodeType":"EmitStatement","src":"13120:32:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":33811,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33809,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33807,"src":"12594:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":33810,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33802,"src":"12598:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12594:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33891,"initializationExpression":{"assignments":[33807],"declarations":[{"constant":false,"id":33807,"mutability":"mutable","name":"i","nameLocation":"12591:1:327","nodeType":"VariableDeclaration","scope":33891,"src":"12583:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33806,"name":"uint256","nodeType":"ElementaryTypeName","src":"12583:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":33808,"nodeType":"VariableDeclarationStatement","src":"12583:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":33813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"12606:3:327","subExpression":{"id":33812,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33807,"src":"12608:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33814,"nodeType":"ExpressionStatement","src":"12606:3:327"},"nodeType":"ForStatement","src":"12578:585:327"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":33898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33892,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"13177:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":33893,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33777,"src":"13185:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"13177:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":33897,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33895,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33802,"src":"13191:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":33896,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"13201:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"13191:11:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"13177:25:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33917,"nodeType":"IfStatement","src":"13173:304:327","trueBody":{"id":33916,"nodeType":"Block","src":"13204:273:327","statements":[{"id":33915,"nodeType":"UncheckedBlock","src":"13218:249:327","statements":[{"expression":{"id":33905,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33899,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"13323:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33902,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13325:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"13323:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":33903,"indexExpression":{"id":33901,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33775,"src":"13334:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13323:16:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":33904,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33802,"src":"13343:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13323:26:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33906,"nodeType":"ExpressionStatement","src":"13323:26:327"},{"expression":{"id":33913,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33907,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33771,"src":"13428:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33910,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"13430:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"13428:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":33911,"indexExpression":{"id":33909,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33777,"src":"13439:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"13428:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":33912,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33802,"src":"13446:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"13428:24:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33914,"nodeType":"ExpressionStatement","src":"13428:24:327"}]}]}}]},"documentation":{"id":33768,"nodeType":"StructuredDocumentation","src":"11348:921:327","text":"@notice Unsafely transfers a batch of tokens to a recipient by a sender.\n @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\n @dev Resets the token approval for each of `tokenIds`.\n @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\n @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\n @dev Emits a {Transfer} event for each of `tokenIds`.\n @param sender The message sender.\n @param from Current tokens owner.\n @param to Address of the new token owner.\n @param tokenIds Identifiers of the tokens to transfer."},"id":33919,"implemented":true,"kind":"function","modifiers":[],"name":"batchTransferFrom","nameLocation":"12283:17:327","nodeType":"FunctionDefinition","parameters":{"id":33781,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33771,"mutability":"mutable","name":"s","nameLocation":"12316:1:327","nodeType":"VariableDeclaration","scope":33919,"src":"12301:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33770,"nodeType":"UserDefinedTypeName","pathNode":{"id":33769,"name":"Layout","nameLocations":["12301:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"12301:6:327"},"referencedDeclaration":33288,"src":"12301:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33773,"mutability":"mutable","name":"sender","nameLocation":"12327:6:327","nodeType":"VariableDeclaration","scope":33919,"src":"12319:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33772,"name":"address","nodeType":"ElementaryTypeName","src":"12319:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33775,"mutability":"mutable","name":"from","nameLocation":"12343:4:327","nodeType":"VariableDeclaration","scope":33919,"src":"12335:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33774,"name":"address","nodeType":"ElementaryTypeName","src":"12335:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33777,"mutability":"mutable","name":"to","nameLocation":"12357:2:327","nodeType":"VariableDeclaration","scope":33919,"src":"12349:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33776,"name":"address","nodeType":"ElementaryTypeName","src":"12349:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33780,"mutability":"mutable","name":"tokenIds","nameLocation":"12380:8:327","nodeType":"VariableDeclaration","scope":33919,"src":"12361:27:327","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":33778,"name":"uint256","nodeType":"ElementaryTypeName","src":"12361:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33779,"nodeType":"ArrayTypeName","src":"12361:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"12300:89:327"},"returnParameters":{"id":33782,"nodeType":"ParameterList","parameters":[],"src":"12399:0:327"},"scope":34972,"src":"12274:1209:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":33981,"nodeType":"Block","src":"14105:390:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":33935,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":33930,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33925,"src":"14119:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":33933,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14133:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":33932,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14125:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33931,"name":"address","nodeType":"ElementaryTypeName","src":"14125:7:327","typeDescriptions":{}}},"id":33934,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14125:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"14119:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33939,"nodeType":"IfStatement","src":"14115:54:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":33936,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"14144:23:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":33937,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14144:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33938,"nodeType":"RevertStatement","src":"14137:32:327"}},{"condition":{"arguments":[{"baseExpression":{"expression":{"id":33941,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33923,"src":"14196:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33942,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14198:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"14196:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33944,"indexExpression":{"id":33943,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33927,"src":"14205:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"14196:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33940,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"14183:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":33945,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14183:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":33950,"nodeType":"IfStatement","src":"14179:72:327","trueBody":{"errorCall":{"arguments":[{"id":33947,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33927,"src":"14243:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33946,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"14223:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":33948,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14223:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":33949,"nodeType":"RevertStatement","src":"14216:35:327"}},{"expression":{"id":33963,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":33951,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33923,"src":"14262:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33954,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14264:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"14262:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":33955,"indexExpression":{"id":33953,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33927,"src":"14271:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"14262:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":33960,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33925,"src":"14298:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":33959,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14290:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":33958,"name":"uint160","nodeType":"ElementaryTypeName","src":"14290:7:327","typeDescriptions":{}}},"id":33961,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14290:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":33957,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14282:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":33956,"name":"uint256","nodeType":"ElementaryTypeName","src":"14282:7:327","typeDescriptions":{}}},"id":33962,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14282:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"14262:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33964,"nodeType":"ExpressionStatement","src":"14262:40:327"},{"id":33971,"nodeType":"UncheckedBlock","src":"14313:127:327","statements":[{"expression":{"id":33969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"14413:16:327","subExpression":{"baseExpression":{"expression":{"id":33965,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33923,"src":"14415:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33966,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"14417:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"14415:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":33968,"indexExpression":{"id":33967,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33925,"src":"14426:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"14415:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":33970,"nodeType":"ExpressionStatement","src":"14413:16:327"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":33975,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"14472:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":33974,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"14464:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33973,"name":"address","nodeType":"ElementaryTypeName","src":"14464:7:327","typeDescriptions":{}}},"id":33976,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14464:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33977,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33925,"src":"14476:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":33978,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33927,"src":"14480:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":33972,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"14455:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":33979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"14455:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":33980,"nodeType":"EmitStatement","src":"14450:38:327"}]},"documentation":{"id":33920,"nodeType":"StructuredDocumentation","src":"13489:541:327","text":"@notice Unsafely mints a token.\n @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\n @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n @dev Emits a {Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint."},"id":33982,"implemented":true,"kind":"function","modifiers":[],"name":"mint","nameLocation":"14044:4:327","nodeType":"FunctionDefinition","parameters":{"id":33928,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33923,"mutability":"mutable","name":"s","nameLocation":"14064:1:327","nodeType":"VariableDeclaration","scope":33982,"src":"14049:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33922,"nodeType":"UserDefinedTypeName","pathNode":{"id":33921,"name":"Layout","nameLocations":["14049:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"14049:6:327"},"referencedDeclaration":33288,"src":"14049:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33925,"mutability":"mutable","name":"to","nameLocation":"14075:2:327","nodeType":"VariableDeclaration","scope":33982,"src":"14067:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33924,"name":"address","nodeType":"ElementaryTypeName","src":"14067:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33927,"mutability":"mutable","name":"tokenId","nameLocation":"14087:7:327","nodeType":"VariableDeclaration","scope":33982,"src":"14079:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33926,"name":"uint256","nodeType":"ElementaryTypeName","src":"14079:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"14048:47:327"},"returnParameters":{"id":33929,"nodeType":"ParameterList","parameters":[],"src":"14105:0:327"},"scope":34972,"src":"14035:460:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34020,"nodeType":"Block","src":"15539:152:327","statements":[{"expression":{"arguments":[{"id":34000,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33990,"src":"15556:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34001,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33992,"src":"15560:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":33997,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33986,"src":"15549:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":33999,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"15551:4:327","memberName":"mint","nodeType":"MemberAccess","referencedDeclaration":33982,"src":"15549:6:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256)"}},"id":34002,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15549:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34003,"nodeType":"ExpressionStatement","src":"15549:19:327"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":34004,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33990,"src":"15582:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":34005,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"15585:11:327","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"15582:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":34006,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15582:16:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34019,"nodeType":"IfStatement","src":"15578:107:327","trueBody":{"id":34018,"nodeType":"Block","src":"15600:85:327","statements":[{"expression":{"arguments":[{"id":34008,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33988,"src":"15636:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":34011,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"15652:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34010,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"15644:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34009,"name":"address","nodeType":"ElementaryTypeName","src":"15644:7:327","typeDescriptions":{}}},"id":34012,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15644:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34013,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33990,"src":"15656:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34014,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33992,"src":"15660:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":34015,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33994,"src":"15669:4:327","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":34007,"name":"_callOnERC721Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34888,"src":"15614:21:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":34016,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"15614:60:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34017,"nodeType":"ExpressionStatement","src":"15614:60:327"}]}}]},"documentation":{"id":33983,"nodeType":"StructuredDocumentation","src":"14501:924:327","text":"@notice Safely mints a token.\n @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\n @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\n @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint.\n @param data Optional data to pass along to the receiver call."},"id":34021,"implemented":true,"kind":"function","modifiers":[],"name":"safeMint","nameLocation":"15439:8:327","nodeType":"FunctionDefinition","parameters":{"id":33995,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33986,"mutability":"mutable","name":"s","nameLocation":"15463:1:327","nodeType":"VariableDeclaration","scope":34021,"src":"15448:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":33985,"nodeType":"UserDefinedTypeName","pathNode":{"id":33984,"name":"Layout","nameLocations":["15448:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"15448:6:327"},"referencedDeclaration":33288,"src":"15448:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":33988,"mutability":"mutable","name":"sender","nameLocation":"15474:6:327","nodeType":"VariableDeclaration","scope":34021,"src":"15466:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33987,"name":"address","nodeType":"ElementaryTypeName","src":"15466:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33990,"mutability":"mutable","name":"to","nameLocation":"15490:2:327","nodeType":"VariableDeclaration","scope":34021,"src":"15482:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":33989,"name":"address","nodeType":"ElementaryTypeName","src":"15482:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":33992,"mutability":"mutable","name":"tokenId","nameLocation":"15502:7:327","nodeType":"VariableDeclaration","scope":34021,"src":"15494:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":33991,"name":"uint256","nodeType":"ElementaryTypeName","src":"15494:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":33994,"mutability":"mutable","name":"data","nameLocation":"15524:4:327","nodeType":"VariableDeclaration","scope":34021,"src":"15511:17:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":33993,"name":"bytes","nodeType":"ElementaryTypeName","src":"15511:5:327","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"15447:82:327"},"returnParameters":{"id":33996,"nodeType":"ParameterList","parameters":[],"src":"15539:0:327"},"scope":34972,"src":"15430:261:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34108,"nodeType":"Block","src":"16390:472:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34038,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34033,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34027,"src":"16404:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":34036,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16418:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34035,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16410:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34034,"name":"address","nodeType":"ElementaryTypeName","src":"16410:7:327","typeDescriptions":{}}},"id":34037,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16410:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"16404:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34042,"nodeType":"IfStatement","src":"16400:54:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34039,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"16429:23:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34040,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16429:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34041,"nodeType":"RevertStatement","src":"16422:32:327"}},{"assignments":[34044],"declarations":[{"constant":false,"id":34044,"mutability":"mutable","name":"length","nameLocation":"16473:6:327","nodeType":"VariableDeclaration","scope":34108,"src":"16465:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34043,"name":"uint256","nodeType":"ElementaryTypeName","src":"16465:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34047,"initialValue":{"expression":{"id":34045,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34030,"src":"16482:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"16491:6:327","memberName":"length","nodeType":"MemberAccess","src":"16482:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"16465:32:327"},{"body":{"id":34097,"nodeType":"Block","src":"16540:247:327","statements":[{"assignments":[34058],"declarations":[{"constant":false,"id":34058,"mutability":"mutable","name":"tokenId","nameLocation":"16562:7:327","nodeType":"VariableDeclaration","scope":34097,"src":"16554:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34057,"name":"uint256","nodeType":"ElementaryTypeName","src":"16554:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34062,"initialValue":{"baseExpression":{"id":34059,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34030,"src":"16572:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34061,"indexExpression":{"id":34060,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34049,"src":"16581:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16572:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"16554:29:327"},{"condition":{"arguments":[{"baseExpression":{"expression":{"id":34064,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34025,"src":"16614:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34065,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16616:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"16614:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34067,"indexExpression":{"id":34066,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34058,"src":"16623:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"16614:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34063,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"16601:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34068,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16601:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34073,"nodeType":"IfStatement","src":"16597:72:327","trueBody":{"errorCall":{"arguments":[{"id":34070,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34058,"src":"16661:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34069,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"16641:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34071,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16641:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34072,"nodeType":"RevertStatement","src":"16634:35:327"}},{"expression":{"id":34086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34074,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34025,"src":"16684:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34077,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16686:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"16684:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34078,"indexExpression":{"id":34076,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34058,"src":"16693:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"16684:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":34083,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34027,"src":"16720:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":34082,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16712:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34081,"name":"uint160","nodeType":"ElementaryTypeName","src":"16712:7:327","typeDescriptions":{}}},"id":34084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16712:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":34080,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16704:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":34079,"name":"uint256","nodeType":"ElementaryTypeName","src":"16704:7:327","typeDescriptions":{}}},"id":34085,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16704:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16684:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34087,"nodeType":"ExpressionStatement","src":"16684:40:327"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":34091,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"16760:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34090,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"16752:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34089,"name":"address","nodeType":"ElementaryTypeName","src":"16752:7:327","typeDescriptions":{}}},"id":34092,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16752:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34093,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34027,"src":"16764:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34094,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34058,"src":"16768:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34088,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"16743:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34095,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"16743:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34096,"nodeType":"EmitStatement","src":"16738:38:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34051,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34049,"src":"16523:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":34052,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34044,"src":"16527:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16523:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34098,"initializationExpression":{"assignments":[34049],"declarations":[{"constant":false,"id":34049,"mutability":"mutable","name":"i","nameLocation":"16520:1:327","nodeType":"VariableDeclaration","scope":34098,"src":"16512:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34048,"name":"uint256","nodeType":"ElementaryTypeName","src":"16512:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34050,"nodeType":"VariableDeclarationStatement","src":"16512:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":34055,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"16535:3:327","subExpression":{"id":34054,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34049,"src":"16537:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34056,"nodeType":"ExpressionStatement","src":"16535:3:327"},"nodeType":"ForStatement","src":"16507:280:327"},{"id":34107,"nodeType":"UncheckedBlock","src":"16797:59:327","statements":[{"expression":{"id":34105,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34099,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34025,"src":"16821:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34102,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"16823:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"16821:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34103,"indexExpression":{"id":34101,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34027,"src":"16832:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"16821:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":34104,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34044,"src":"16839:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"16821:24:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34106,"nodeType":"ExpressionStatement","src":"16821:24:327"}]}]},"documentation":{"id":34022,"nodeType":"StructuredDocumentation","src":"15697:603:327","text":"@notice Unsafely mints a batch of tokens.\n @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\n @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\n @param to Address of the new tokens owner.\n @param tokenIds Identifiers of the tokens to mint."},"id":34109,"implemented":true,"kind":"function","modifiers":[],"name":"batchMint","nameLocation":"16314:9:327","nodeType":"FunctionDefinition","parameters":{"id":34031,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34025,"mutability":"mutable","name":"s","nameLocation":"16339:1:327","nodeType":"VariableDeclaration","scope":34109,"src":"16324:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34024,"nodeType":"UserDefinedTypeName","pathNode":{"id":34023,"name":"Layout","nameLocations":["16324:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"16324:6:327"},"referencedDeclaration":33288,"src":"16324:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34027,"mutability":"mutable","name":"to","nameLocation":"16350:2:327","nodeType":"VariableDeclaration","scope":34109,"src":"16342:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34026,"name":"address","nodeType":"ElementaryTypeName","src":"16342:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34030,"mutability":"mutable","name":"tokenIds","nameLocation":"16371:8:327","nodeType":"VariableDeclaration","scope":34109,"src":"16354:25:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":34028,"name":"uint256","nodeType":"ElementaryTypeName","src":"16354:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34029,"nodeType":"ArrayTypeName","src":"16354:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"16323:57:327"},"returnParameters":{"id":34032,"nodeType":"ParameterList","parameters":[],"src":"16390:0:327"},"scope":34972,"src":"16305:557:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34157,"nodeType":"Block","src":"17738:226:327","statements":[{"assignments":[34123],"declarations":[{"constant":false,"id":34123,"mutability":"mutable","name":"length","nameLocation":"17756:6:327","nodeType":"VariableDeclaration","scope":34157,"src":"17748:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34122,"name":"uint256","nodeType":"ElementaryTypeName","src":"17748:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34126,"initialValue":{"expression":{"id":34124,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34116,"src":"17765:10:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":34125,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17776:6:327","memberName":"length","nodeType":"MemberAccess","src":"17765:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"17748:34:327"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34130,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34127,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34123,"src":"17796:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":34128,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34119,"src":"17806:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"17815:6:327","memberName":"length","nodeType":"MemberAccess","src":"17806:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17796:25:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34134,"nodeType":"IfStatement","src":"17792:64:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34131,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"17830:24:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34132,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17830:26:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34133,"nodeType":"RevertStatement","src":"17823:33:327"}},{"body":{"id":34155,"nodeType":"Block","src":"17899:59:327","statements":[{"expression":{"arguments":[{"baseExpression":{"id":34147,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34116,"src":"17920:10:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":34149,"indexExpression":{"id":34148,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34136,"src":"17931:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17920:13:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"baseExpression":{"id":34150,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34119,"src":"17935:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34152,"indexExpression":{"id":34151,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34136,"src":"17944:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"17935:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":34144,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34113,"src":"17913:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34146,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"17915:4:327","memberName":"mint","nodeType":"MemberAccess","referencedDeclaration":33982,"src":"17913:6:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256)"}},"id":34153,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"17913:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34154,"nodeType":"ExpressionStatement","src":"17913:34:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34138,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34136,"src":"17882:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":34139,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34123,"src":"17886:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"17882:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34156,"initializationExpression":{"assignments":[34136],"declarations":[{"constant":false,"id":34136,"mutability":"mutable","name":"i","nameLocation":"17879:1:327","nodeType":"VariableDeclaration","scope":34156,"src":"17871:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34135,"name":"uint256","nodeType":"ElementaryTypeName","src":"17871:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34137,"nodeType":"VariableDeclarationStatement","src":"17871:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":34142,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"17894:3:327","subExpression":{"id":34141,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34136,"src":"17896:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34143,"nodeType":"ExpressionStatement","src":"17894:3:327"},"nodeType":"ForStatement","src":"17866:92:327"}]},"documentation":{"id":34110,"nodeType":"StructuredDocumentation","src":"16868:765:327","text":"@notice Unsafely mints tokens to multiple recipients.\n @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\n @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\n @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\n @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n @param recipients Addresses of the new tokens owners.\n @param tokenIds Identifiers of the tokens to mint."},"id":34158,"implemented":true,"kind":"function","modifiers":[],"name":"deliver","nameLocation":"17647:7:327","nodeType":"FunctionDefinition","parameters":{"id":34120,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34113,"mutability":"mutable","name":"s","nameLocation":"17670:1:327","nodeType":"VariableDeclaration","scope":34158,"src":"17655:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34112,"nodeType":"UserDefinedTypeName","pathNode":{"id":34111,"name":"Layout","nameLocations":["17655:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"17655:6:327"},"referencedDeclaration":33288,"src":"17655:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34116,"mutability":"mutable","name":"recipients","nameLocation":"17690:10:327","nodeType":"VariableDeclaration","scope":34158,"src":"17673:27:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":34114,"name":"address","nodeType":"ElementaryTypeName","src":"17673:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":34115,"nodeType":"ArrayTypeName","src":"17673:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":34119,"mutability":"mutable","name":"tokenIds","nameLocation":"17719:8:327","nodeType":"VariableDeclaration","scope":34158,"src":"17702:25:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":34117,"name":"uint256","nodeType":"ElementaryTypeName","src":"17702:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34118,"nodeType":"ArrayTypeName","src":"17702:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"17654:74:327"},"returnParameters":{"id":34121,"nodeType":"ParameterList","parameters":[],"src":"17738:0:327"},"scope":34972,"src":"17638:326:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34232,"nodeType":"Block","src":"18680:491:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34174,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34169,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34164,"src":"18694:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":34172,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"18708:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34171,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18700:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34170,"name":"address","nodeType":"ElementaryTypeName","src":"18700:7:327","typeDescriptions":{}}},"id":34173,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18700:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"18694:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34178,"nodeType":"IfStatement","src":"18690:54:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34175,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"18719:23:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34176,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18719:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34177,"nodeType":"RevertStatement","src":"18712:32:327"}},{"assignments":[34180],"declarations":[{"constant":false,"id":34180,"mutability":"mutable","name":"owner","nameLocation":"18763:5:327","nodeType":"VariableDeclaration","scope":34232,"src":"18755:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34179,"name":"uint256","nodeType":"ElementaryTypeName","src":"18755:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34185,"initialValue":{"baseExpression":{"expression":{"id":34181,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34162,"src":"18771:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34182,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18773:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"18771:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34184,"indexExpression":{"id":34183,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34166,"src":"18780:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"18771:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"18755:33:327"},{"condition":{"arguments":[{"id":34187,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34180,"src":"18815:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34186,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"18802:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18802:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34193,"nodeType":"IfStatement","src":"18798:60:327","trueBody":{"errorCall":{"arguments":[{"id":34190,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34166,"src":"18850:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34189,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"18830:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34191,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18830:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34192,"nodeType":"RevertStatement","src":"18823:35:327"}},{"condition":{"arguments":[{"id":34195,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34180,"src":"18887:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34194,"name":"_tokenWasBurnt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34957,"src":"18872:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34196,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18872:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34201,"nodeType":"IfStatement","src":"18868:59:327","trueBody":{"errorCall":{"arguments":[{"id":34198,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34166,"src":"18919:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34197,"name":"ERC721BurntToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32174,"src":"18902:16:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34199,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18902:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34200,"nodeType":"RevertStatement","src":"18895:32:327"}},{"expression":{"id":34214,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34202,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34162,"src":"18938:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34205,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"18940:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"18938:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34206,"indexExpression":{"id":34204,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34166,"src":"18947:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"18938:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":34211,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34164,"src":"18974:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":34210,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18966:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34209,"name":"uint160","nodeType":"ElementaryTypeName","src":"18966:7:327","typeDescriptions":{}}},"id":34212,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18966:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":34208,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"18958:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":34207,"name":"uint256","nodeType":"ElementaryTypeName","src":"18958:7:327","typeDescriptions":{}}},"id":34213,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"18958:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"18938:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34215,"nodeType":"ExpressionStatement","src":"18938:40:327"},{"id":34222,"nodeType":"UncheckedBlock","src":"18989:127:327","statements":[{"expression":{"id":34220,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"19089:16:327","subExpression":{"baseExpression":{"expression":{"id":34216,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34162,"src":"19091:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34217,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"19093:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"19091:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34219,"indexExpression":{"id":34218,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34164,"src":"19102:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"19091:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34221,"nodeType":"ExpressionStatement","src":"19089:16:327"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":34226,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"19148:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34225,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"19140:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34224,"name":"address","nodeType":"ElementaryTypeName","src":"19140:7:327","typeDescriptions":{}}},"id":34227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19140:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34228,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34164,"src":"19152:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34229,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34166,"src":"19156:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34223,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"19131:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34230,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"19131:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34231,"nodeType":"EmitStatement","src":"19126:38:327"}]},"documentation":{"id":34159,"nodeType":"StructuredDocumentation","src":"17970:631:327","text":"@notice Unsafely mints a token once.\n @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\n @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n @dev Emits a {Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint."},"id":34233,"implemented":true,"kind":"function","modifiers":[],"name":"mintOnce","nameLocation":"18615:8:327","nodeType":"FunctionDefinition","parameters":{"id":34167,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34162,"mutability":"mutable","name":"s","nameLocation":"18639:1:327","nodeType":"VariableDeclaration","scope":34233,"src":"18624:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34161,"nodeType":"UserDefinedTypeName","pathNode":{"id":34160,"name":"Layout","nameLocations":["18624:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"18624:6:327"},"referencedDeclaration":33288,"src":"18624:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34164,"mutability":"mutable","name":"to","nameLocation":"18650:2:327","nodeType":"VariableDeclaration","scope":34233,"src":"18642:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34163,"name":"address","nodeType":"ElementaryTypeName","src":"18642:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34166,"mutability":"mutable","name":"tokenId","nameLocation":"18662:7:327","nodeType":"VariableDeclaration","scope":34233,"src":"18654:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34165,"name":"uint256","nodeType":"ElementaryTypeName","src":"18654:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"18623:47:327"},"returnParameters":{"id":34168,"nodeType":"ParameterList","parameters":[],"src":"18680:0:327"},"scope":34972,"src":"18606:565:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34271,"nodeType":"Block","src":"20180:156:327","statements":[{"expression":{"arguments":[{"id":34251,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34241,"src":"20201:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34252,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34243,"src":"20205:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":34248,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34237,"src":"20190:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34250,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"20192:8:327","memberName":"mintOnce","nodeType":"MemberAccess","referencedDeclaration":34233,"src":"20190:10:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$33288_storage_ptr_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,uint256)"}},"id":34253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20190:23:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34254,"nodeType":"ExpressionStatement","src":"20190:23:327"},{"condition":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":34255,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34241,"src":"20227:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":34256,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"20230:11:327","memberName":"hasBytecode","nodeType":"MemberAccess","referencedDeclaration":38034,"src":"20227:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$attached_to$_t_address_$","typeString":"function (address) view returns (bool)"}},"id":34257,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20227:16:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34270,"nodeType":"IfStatement","src":"20223:107:327","trueBody":{"id":34269,"nodeType":"Block","src":"20245:85:327","statements":[{"expression":{"arguments":[{"id":34259,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34239,"src":"20281:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":34262,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"20297:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34261,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"20289:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34260,"name":"address","nodeType":"ElementaryTypeName","src":"20289:7:327","typeDescriptions":{}}},"id":34263,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20289:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34264,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34241,"src":"20301:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34265,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34243,"src":"20305:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":34266,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34245,"src":"20314:4:327","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":34258,"name":"_callOnERC721Received","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34888,"src":"20259:21:327","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (address,address,address,uint256,bytes memory)"}},"id":34267,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"20259:60:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34268,"nodeType":"ExpressionStatement","src":"20259:60:327"}]}}]},"documentation":{"id":34234,"nodeType":"StructuredDocumentation","src":"19177:885:327","text":"@notice Safely mints a token once.\n @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\n @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\n @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\n @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\n  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\n @dev Emits a {Transfer} event from the zero address.\n @param to Address of the new token owner.\n @param tokenId Identifier of the token to mint.\n @param data Optional data to pass along to the receiver call."},"id":34272,"implemented":true,"kind":"function","modifiers":[],"name":"safeMintOnce","nameLocation":"20076:12:327","nodeType":"FunctionDefinition","parameters":{"id":34246,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34237,"mutability":"mutable","name":"s","nameLocation":"20104:1:327","nodeType":"VariableDeclaration","scope":34272,"src":"20089:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34236,"nodeType":"UserDefinedTypeName","pathNode":{"id":34235,"name":"Layout","nameLocations":["20089:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"20089:6:327"},"referencedDeclaration":33288,"src":"20089:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34239,"mutability":"mutable","name":"sender","nameLocation":"20115:6:327","nodeType":"VariableDeclaration","scope":34272,"src":"20107:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34238,"name":"address","nodeType":"ElementaryTypeName","src":"20107:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34241,"mutability":"mutable","name":"to","nameLocation":"20131:2:327","nodeType":"VariableDeclaration","scope":34272,"src":"20123:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34240,"name":"address","nodeType":"ElementaryTypeName","src":"20123:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34243,"mutability":"mutable","name":"tokenId","nameLocation":"20143:7:327","nodeType":"VariableDeclaration","scope":34272,"src":"20135:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34242,"name":"uint256","nodeType":"ElementaryTypeName","src":"20135:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":34245,"mutability":"mutable","name":"data","nameLocation":"20165:4:327","nodeType":"VariableDeclaration","scope":34272,"src":"20152:17:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":34244,"name":"bytes","nodeType":"ElementaryTypeName","src":"20152:5:327","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"20088:82:327"},"returnParameters":{"id":34247,"nodeType":"ParameterList","parameters":[],"src":"20180:0:327"},"scope":34972,"src":"20067:269:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34371,"nodeType":"Block","src":"21137:581:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34284,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34278,"src":"21151:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":34287,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21165:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34286,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21157:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34285,"name":"address","nodeType":"ElementaryTypeName","src":"21157:7:327","typeDescriptions":{}}},"id":34288,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21157:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"21151:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34293,"nodeType":"IfStatement","src":"21147:54:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34290,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"21176:23:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34291,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21176:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34292,"nodeType":"RevertStatement","src":"21169:32:327"}},{"assignments":[34295],"declarations":[{"constant":false,"id":34295,"mutability":"mutable","name":"length","nameLocation":"21220:6:327","nodeType":"VariableDeclaration","scope":34371,"src":"21212:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34294,"name":"uint256","nodeType":"ElementaryTypeName","src":"21212:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34298,"initialValue":{"expression":{"id":34296,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34281,"src":"21229:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34297,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"21238:6:327","memberName":"length","nodeType":"MemberAccess","src":"21229:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21212:32:327"},{"body":{"id":34360,"nodeType":"Block","src":"21287:356:327","statements":[{"assignments":[34309],"declarations":[{"constant":false,"id":34309,"mutability":"mutable","name":"tokenId","nameLocation":"21309:7:327","nodeType":"VariableDeclaration","scope":34360,"src":"21301:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34308,"name":"uint256","nodeType":"ElementaryTypeName","src":"21301:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34313,"initialValue":{"baseExpression":{"id":34310,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34281,"src":"21319:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34312,"indexExpression":{"id":34311,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34300,"src":"21328:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21319:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21301:29:327"},{"assignments":[34315],"declarations":[{"constant":false,"id":34315,"mutability":"mutable","name":"owner","nameLocation":"21352:5:327","nodeType":"VariableDeclaration","scope":34360,"src":"21344:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34314,"name":"uint256","nodeType":"ElementaryTypeName","src":"21344:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34320,"initialValue":{"baseExpression":{"expression":{"id":34316,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34276,"src":"21360:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34317,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21362:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"21360:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34319,"indexExpression":{"id":34318,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34309,"src":"21369:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"21360:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"21344:33:327"},{"condition":{"arguments":[{"id":34322,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34315,"src":"21408:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34321,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"21395:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34323,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21395:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34328,"nodeType":"IfStatement","src":"21391:60:327","trueBody":{"errorCall":{"arguments":[{"id":34325,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34309,"src":"21443:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34324,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"21423:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34326,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21423:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34327,"nodeType":"RevertStatement","src":"21416:35:327"}},{"condition":{"arguments":[{"id":34330,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34315,"src":"21484:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34329,"name":"_tokenWasBurnt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34957,"src":"21469:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21469:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34336,"nodeType":"IfStatement","src":"21465:59:327","trueBody":{"errorCall":{"arguments":[{"id":34333,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34309,"src":"21516:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34332,"name":"ERC721BurntToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32174,"src":"21499:16:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21499:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34335,"nodeType":"RevertStatement","src":"21492:32:327"}},{"expression":{"id":34349,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34337,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34276,"src":"21539:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34340,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21541:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"21539:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34341,"indexExpression":{"id":34339,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34309,"src":"21548:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"21539:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":34346,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34278,"src":"21575:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":34345,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21567:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34344,"name":"uint160","nodeType":"ElementaryTypeName","src":"21567:7:327","typeDescriptions":{}}},"id":34347,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21567:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":34343,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21559:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":34342,"name":"uint256","nodeType":"ElementaryTypeName","src":"21559:7:327","typeDescriptions":{}}},"id":34348,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21559:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21539:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34350,"nodeType":"ExpressionStatement","src":"21539:40:327"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":34354,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"21616:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34353,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"21608:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34352,"name":"address","nodeType":"ElementaryTypeName","src":"21608:7:327","typeDescriptions":{}}},"id":34355,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21608:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34356,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34278,"src":"21620:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34357,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34309,"src":"21624:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34351,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"21599:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"21599:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34359,"nodeType":"EmitStatement","src":"21594:38:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34304,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34302,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34300,"src":"21270:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":34303,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34295,"src":"21274:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21270:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34361,"initializationExpression":{"assignments":[34300],"declarations":[{"constant":false,"id":34300,"mutability":"mutable","name":"i","nameLocation":"21267:1:327","nodeType":"VariableDeclaration","scope":34361,"src":"21259:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34299,"name":"uint256","nodeType":"ElementaryTypeName","src":"21259:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34301,"nodeType":"VariableDeclarationStatement","src":"21259:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":34306,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"21282:3:327","subExpression":{"id":34305,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34300,"src":"21284:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34307,"nodeType":"ExpressionStatement","src":"21282:3:327"},"nodeType":"ForStatement","src":"21254:389:327"},{"id":34370,"nodeType":"UncheckedBlock","src":"21653:59:327","statements":[{"expression":{"id":34368,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34362,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34276,"src":"21677:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34365,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"21679:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"21677:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34366,"indexExpression":{"id":34364,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34278,"src":"21688:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"21677:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":34367,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34295,"src":"21695:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"21677:24:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34369,"nodeType":"ExpressionStatement","src":"21677:24:327"}]}]},"documentation":{"id":34273,"nodeType":"StructuredDocumentation","src":"20342:701:327","text":"@notice Unsafely mints a batch of tokens once.\n @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\n @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\n @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\n @param to Address of the new tokens owner.\n @param tokenIds Identifiers of the tokens to mint."},"id":34372,"implemented":true,"kind":"function","modifiers":[],"name":"batchMintOnce","nameLocation":"21057:13:327","nodeType":"FunctionDefinition","parameters":{"id":34282,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34276,"mutability":"mutable","name":"s","nameLocation":"21086:1:327","nodeType":"VariableDeclaration","scope":34372,"src":"21071:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34275,"nodeType":"UserDefinedTypeName","pathNode":{"id":34274,"name":"Layout","nameLocations":["21071:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"21071:6:327"},"referencedDeclaration":33288,"src":"21071:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34278,"mutability":"mutable","name":"to","nameLocation":"21097:2:327","nodeType":"VariableDeclaration","scope":34372,"src":"21089:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34277,"name":"address","nodeType":"ElementaryTypeName","src":"21089:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34281,"mutability":"mutable","name":"tokenIds","nameLocation":"21118:8:327","nodeType":"VariableDeclaration","scope":34372,"src":"21101:25:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":34279,"name":"uint256","nodeType":"ElementaryTypeName","src":"21101:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34280,"nodeType":"ArrayTypeName","src":"21101:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"21070:57:327"},"returnParameters":{"id":34283,"nodeType":"ParameterList","parameters":[],"src":"21137:0:327"},"scope":34972,"src":"21048:670:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34484,"nodeType":"Block","src":"22696:704:327","statements":[{"assignments":[34386],"declarations":[{"constant":false,"id":34386,"mutability":"mutable","name":"length","nameLocation":"22714:6:327","nodeType":"VariableDeclaration","scope":34484,"src":"22706:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34385,"name":"uint256","nodeType":"ElementaryTypeName","src":"22706:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34389,"initialValue":{"expression":{"id":34387,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34379,"src":"22723:10:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":34388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22734:6:327","memberName":"length","nodeType":"MemberAccess","src":"22723:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22706:34:327"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34390,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34386,"src":"22754:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":34391,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34382,"src":"22764:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34392,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"22773:6:327","memberName":"length","nodeType":"MemberAccess","src":"22764:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22754:25:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34397,"nodeType":"IfStatement","src":"22750:64:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34394,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"22788:24:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22788:26:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34396,"nodeType":"RevertStatement","src":"22781:33:327"}},{"body":{"id":34482,"nodeType":"Block","src":"22857:537:327","statements":[{"assignments":[34408],"declarations":[{"constant":false,"id":34408,"mutability":"mutable","name":"to","nameLocation":"22879:2:327","nodeType":"VariableDeclaration","scope":34482,"src":"22871:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34407,"name":"address","nodeType":"ElementaryTypeName","src":"22871:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":34412,"initialValue":{"baseExpression":{"id":34409,"name":"recipients","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34379,"src":"22884:10:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[] memory"}},"id":34411,"indexExpression":{"id":34410,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34399,"src":"22895:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"22884:13:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"22871:26:327"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34418,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34413,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34408,"src":"22915:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":34416,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"22929:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34415,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"22921:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34414,"name":"address","nodeType":"ElementaryTypeName","src":"22921:7:327","typeDescriptions":{}}},"id":34417,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22921:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"22915:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34422,"nodeType":"IfStatement","src":"22911:54:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34419,"name":"ERC721MintToAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32162,"src":"22940:23:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34420,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"22940:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34421,"nodeType":"RevertStatement","src":"22933:32:327"}},{"assignments":[34424],"declarations":[{"constant":false,"id":34424,"mutability":"mutable","name":"tokenId","nameLocation":"22988:7:327","nodeType":"VariableDeclaration","scope":34482,"src":"22980:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34423,"name":"uint256","nodeType":"ElementaryTypeName","src":"22980:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34428,"initialValue":{"baseExpression":{"id":34425,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34382,"src":"22998:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":34427,"indexExpression":{"id":34426,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34399,"src":"23007:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"22998:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"22980:29:327"},{"assignments":[34430],"declarations":[{"constant":false,"id":34430,"mutability":"mutable","name":"owner","nameLocation":"23031:5:327","nodeType":"VariableDeclaration","scope":34482,"src":"23023:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34429,"name":"uint256","nodeType":"ElementaryTypeName","src":"23023:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34435,"initialValue":{"baseExpression":{"expression":{"id":34431,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34376,"src":"23039:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34432,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23041:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"23039:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34434,"indexExpression":{"id":34433,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34424,"src":"23048:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"23039:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"23023:33:327"},{"condition":{"arguments":[{"id":34437,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34430,"src":"23087:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34436,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"23074:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34438,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23074:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34443,"nodeType":"IfStatement","src":"23070:60:327","trueBody":{"errorCall":{"arguments":[{"id":34440,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34424,"src":"23122:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34439,"name":"ERC721ExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32167,"src":"23102:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34441,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23102:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34442,"nodeType":"RevertStatement","src":"23095:35:327"}},{"condition":{"arguments":[{"id":34445,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34430,"src":"23163:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34444,"name":"_tokenWasBurnt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34957,"src":"23148:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34446,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23148:21:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34451,"nodeType":"IfStatement","src":"23144:59:327","trueBody":{"errorCall":{"arguments":[{"id":34448,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34424,"src":"23195:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34447,"name":"ERC721BurntToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32174,"src":"23178:16:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23178:25:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34450,"nodeType":"RevertStatement","src":"23171:32:327"}},{"expression":{"id":34464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34452,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34376,"src":"23218:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34455,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23220:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"23218:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34456,"indexExpression":{"id":34454,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34424,"src":"23227:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"23218:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"arguments":[{"id":34461,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34408,"src":"23254:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":34460,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23246:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34459,"name":"uint160","nodeType":"ElementaryTypeName","src":"23246:7:327","typeDescriptions":{}}},"id":34462,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23246:11:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":34458,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23238:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":34457,"name":"uint256","nodeType":"ElementaryTypeName","src":"23238:7:327","typeDescriptions":{}}},"id":34463,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23238:20:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"23218:40:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34465,"nodeType":"ExpressionStatement","src":"23218:40:327"},{"id":34472,"nodeType":"UncheckedBlock","src":"23272:59:327","statements":[{"expression":{"id":34470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"23300:16:327","subExpression":{"baseExpression":{"expression":{"id":34466,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34376,"src":"23302:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34467,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"23304:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"23302:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34469,"indexExpression":{"id":34468,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34408,"src":"23313:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"23302:14:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34471,"nodeType":"ExpressionStatement","src":"23300:16:327"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":34476,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"23367:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34475,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"23359:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34474,"name":"address","nodeType":"ElementaryTypeName","src":"23359:7:327","typeDescriptions":{}}},"id":34477,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23359:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34478,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34408,"src":"23371:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34479,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34424,"src":"23375:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34473,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"23350:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34480,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"23350:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34481,"nodeType":"EmitStatement","src":"23345:38:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34403,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34401,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34399,"src":"22840:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":34402,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34386,"src":"22844:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"22840:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34483,"initializationExpression":{"assignments":[34399],"declarations":[{"constant":false,"id":34399,"mutability":"mutable","name":"i","nameLocation":"22837:1:327","nodeType":"VariableDeclaration","scope":34483,"src":"22829:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34398,"name":"uint256","nodeType":"ElementaryTypeName","src":"22829:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34400,"nodeType":"VariableDeclarationStatement","src":"22829:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":34405,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"22852:3:327","subExpression":{"id":34404,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34399,"src":"22854:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34406,"nodeType":"ExpressionStatement","src":"22852:3:327"},"nodeType":"ForStatement","src":"22824:570:327"}]},"documentation":{"id":34373,"nodeType":"StructuredDocumentation","src":"21724:863:327","text":"@notice Unsafely mints tokens to multiple recipients once.\n @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\n @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\n @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\n @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\n @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\n @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\n @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\n @param recipients Addresses of the new tokens owners.\n @param tokenIds Identifiers of the tokens to mint."},"id":34485,"implemented":true,"kind":"function","modifiers":[],"name":"deliverOnce","nameLocation":"22601:11:327","nodeType":"FunctionDefinition","parameters":{"id":34383,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34376,"mutability":"mutable","name":"s","nameLocation":"22628:1:327","nodeType":"VariableDeclaration","scope":34485,"src":"22613:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34375,"nodeType":"UserDefinedTypeName","pathNode":{"id":34374,"name":"Layout","nameLocations":["22613:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"22613:6:327"},"referencedDeclaration":33288,"src":"22613:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34379,"mutability":"mutable","name":"recipients","nameLocation":"22648:10:327","nodeType":"VariableDeclaration","scope":34485,"src":"22631:27:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":34377,"name":"address","nodeType":"ElementaryTypeName","src":"22631:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":34378,"nodeType":"ArrayTypeName","src":"22631:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":34382,"mutability":"mutable","name":"tokenIds","nameLocation":"22677:8:327","nodeType":"VariableDeclaration","scope":34485,"src":"22660:25:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":34380,"name":"uint256","nodeType":"ElementaryTypeName","src":"22660:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34381,"nodeType":"ArrayTypeName","src":"22660:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"22612:74:327"},"returnParameters":{"id":34384,"nodeType":"ParameterList","parameters":[],"src":"22696:0:327"},"scope":34972,"src":"22592:808:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34575,"nodeType":"Block","src":"24068:648:327","statements":[{"assignments":[34499],"declarations":[{"constant":false,"id":34499,"mutability":"mutable","name":"owner","nameLocation":"24086:5:327","nodeType":"VariableDeclaration","scope":34575,"src":"24078:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34498,"name":"uint256","nodeType":"ElementaryTypeName","src":"24078:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34504,"initialValue":{"baseExpression":{"expression":{"id":34500,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34489,"src":"24094:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34501,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24096:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"24094:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34503,"indexExpression":{"id":34502,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24103:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24094:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"24078:33:327"},{"condition":{"id":34508,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"24125:20:327","subExpression":{"arguments":[{"id":34506,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34499,"src":"24139:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34505,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"24126:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24126:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34513,"nodeType":"IfStatement","src":"24121:64:327","trueBody":{"errorCall":{"arguments":[{"id":34510,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24177:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34509,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"24154:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34511,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24154:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34512,"nodeType":"RevertStatement","src":"24147:38:327"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34518,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":34515,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34499,"src":"24211:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34514,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"24199:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":34516,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24199:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":34517,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24221:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"24199:26:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34524,"nodeType":"IfStatement","src":"24195:73:327","trueBody":{"errorCall":{"arguments":[{"id":34520,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24254:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34521,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24260:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34519,"name":"ERC721NonOwnedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32147,"src":"24234:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256) pure returns (error)"}},"id":34522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24234:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34523,"nodeType":"RevertStatement","src":"24227:41:327"}},{"condition":{"id":34530,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"24283:31:327","subExpression":{"arguments":[{"id":34526,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34489,"src":"24298:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},{"id":34527,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24301:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34528,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34491,"src":"24307:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":34525,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34914,"src":"24284:13:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":34529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24284:30:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34550,"nodeType":"IfStatement","src":"24279:185:327","trueBody":{"id":34549,"nodeType":"Block","src":"24316:148:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":34541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"24334:25:327","subExpression":{"arguments":[{"id":34532,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34499,"src":"24353:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34531,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"24335:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34533,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24335:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34535,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34491,"src":"24363:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"expression":{"id":34536,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34489,"src":"24373:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34537,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24375:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"24373:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":34539,"indexExpression":{"id":34538,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24385:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"24373:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"24363:30:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"24334:59:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34548,"nodeType":"IfStatement","src":"24330:123:327","trueBody":{"errorCall":{"arguments":[{"id":34543,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34491,"src":"24431:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34544,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24439:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34545,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24445:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34542,"name":"ERC721NonApprovedForTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32140,"src":"24402:28:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256) pure returns (error)"}},"id":34546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24402:51:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34547,"nodeType":"RevertStatement","src":"24395:58:327"}}]}},{"expression":{"id":34557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34551,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34489,"src":"24474:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34554,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24476:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"24474:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34555,"indexExpression":{"id":34553,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24483:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"24474:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":34556,"name":"BURNT_TOKEN_OWNER_VALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33314,"src":"24494:23:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"24474:43:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34558,"nodeType":"ExpressionStatement","src":"24474:43:327"},{"id":34565,"nodeType":"UncheckedBlock","src":"24528:132:327","statements":[{"expression":{"id":34563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"24631:18:327","subExpression":{"baseExpression":{"expression":{"id":34559,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34489,"src":"24633:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34560,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"24635:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"24633:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34562,"indexExpression":{"id":34561,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24644:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"24633:16:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34564,"nodeType":"ExpressionStatement","src":"24631:18:327"}]},{"eventCall":{"arguments":[{"id":34567,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34493,"src":"24683:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":34570,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"24697:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34569,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"24689:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34568,"name":"address","nodeType":"ElementaryTypeName","src":"24689:7:327","typeDescriptions":{}}},"id":34571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24689:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34572,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34495,"src":"24701:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34566,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"24674:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34573,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"24674:35:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34574,"nodeType":"EmitStatement","src":"24669:40:327"}]},"documentation":{"id":34486,"nodeType":"StructuredDocumentation","src":"23406:565:327","text":"@notice Burns a token by a sender.\n @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\n @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\n @dev Emits a {Transfer} event with `to` set to the zero address.\n @param sender The message sender.\n @param from The current token owner.\n @param tokenId The identifier of the token to burn."},"id":34576,"implemented":true,"kind":"function","modifiers":[],"name":"burnFrom","nameLocation":"23985:8:327","nodeType":"FunctionDefinition","parameters":{"id":34496,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34489,"mutability":"mutable","name":"s","nameLocation":"24009:1:327","nodeType":"VariableDeclaration","scope":34576,"src":"23994:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34488,"nodeType":"UserDefinedTypeName","pathNode":{"id":34487,"name":"Layout","nameLocations":["23994:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"23994:6:327"},"referencedDeclaration":33288,"src":"23994:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34491,"mutability":"mutable","name":"sender","nameLocation":"24020:6:327","nodeType":"VariableDeclaration","scope":34576,"src":"24012:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34490,"name":"address","nodeType":"ElementaryTypeName","src":"24012:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34493,"mutability":"mutable","name":"from","nameLocation":"24036:4:327","nodeType":"VariableDeclaration","scope":34576,"src":"24028:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34492,"name":"address","nodeType":"ElementaryTypeName","src":"24028:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34495,"mutability":"mutable","name":"tokenId","nameLocation":"24050:7:327","nodeType":"VariableDeclaration","scope":34576,"src":"24042:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34494,"name":"uint256","nodeType":"ElementaryTypeName","src":"24042:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"23993:65:327"},"returnParameters":{"id":34497,"nodeType":"ParameterList","parameters":[],"src":"24068:0:327"},"scope":34972,"src":"23976:740:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34700,"nodeType":"Block","src":"25462:833:327","statements":[{"assignments":[34591],"declarations":[{"constant":false,"id":34591,"mutability":"mutable","name":"operatable","nameLocation":"25477:10:327","nodeType":"VariableDeclaration","scope":34700,"src":"25472:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34590,"name":"bool","nodeType":"ElementaryTypeName","src":"25472:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":34597,"initialValue":{"arguments":[{"id":34593,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34580,"src":"25504:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},{"id":34594,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"25507:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34595,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34582,"src":"25513:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":34592,"name":"_isOperatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34914,"src":"25490:13:327","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$33288_storage_ptr_$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (struct ERC721Storage.Layout storage pointer,address,address) view returns (bool)"}},"id":34596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25490:30:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"25472:48:327"},{"assignments":[34599],"declarations":[{"constant":false,"id":34599,"mutability":"mutable","name":"length","nameLocation":"25539:6:327","nodeType":"VariableDeclaration","scope":34700,"src":"25531:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34598,"name":"uint256","nodeType":"ElementaryTypeName","src":"25531:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34602,"initialValue":{"expression":{"id":34600,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34587,"src":"25548:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":34601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"25557:6:327","memberName":"length","nodeType":"MemberAccess","src":"25548:15:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25531:32:327"},{"body":{"id":34684,"nodeType":"Block","src":"25606:563:327","statements":[{"assignments":[34613],"declarations":[{"constant":false,"id":34613,"mutability":"mutable","name":"tokenId","nameLocation":"25628:7:327","nodeType":"VariableDeclaration","scope":34684,"src":"25620:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34612,"name":"uint256","nodeType":"ElementaryTypeName","src":"25620:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34617,"initialValue":{"baseExpression":{"id":34614,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34587,"src":"25638:8:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":34616,"indexExpression":{"id":34615,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34604,"src":"25647:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25638:11:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25620:29:327"},{"assignments":[34619],"declarations":[{"constant":false,"id":34619,"mutability":"mutable","name":"owner","nameLocation":"25671:5:327","nodeType":"VariableDeclaration","scope":34684,"src":"25663:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34618,"name":"uint256","nodeType":"ElementaryTypeName","src":"25663:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34624,"initialValue":{"baseExpression":{"expression":{"id":34620,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34580,"src":"25679:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34621,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25681:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"25679:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34623,"indexExpression":{"id":34622,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"25688:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25679:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"25663:33:327"},{"condition":{"id":34628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"25714:20:327","subExpression":{"arguments":[{"id":34626,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34619,"src":"25728:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34625,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"25715:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25715:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34633,"nodeType":"IfStatement","src":"25710:64:327","trueBody":{"errorCall":{"arguments":[{"id":34630,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"25766:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34629,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"25743:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34631,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25743:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34632,"nodeType":"RevertStatement","src":"25736:38:327"}},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34638,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":34635,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34619,"src":"25804:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34634,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"25792:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":34636,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25792:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":34637,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"25814:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25792:26:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34644,"nodeType":"IfStatement","src":"25788:73:327","trueBody":{"errorCall":{"arguments":[{"id":34640,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"25847:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34641,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"25853:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34639,"name":"ERC721NonOwnedToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32147,"src":"25827:19:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256) pure returns (error)"}},"id":34642,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25827:34:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34643,"nodeType":"RevertStatement","src":"25820:41:327"}},{"condition":{"id":34646,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"25879:11:327","subExpression":{"id":34645,"name":"operatable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34591,"src":"25880:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34666,"nodeType":"IfStatement","src":"25875:173:327","trueBody":{"id":34665,"nodeType":"Block","src":"25892:156:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":34657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34650,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"25914:25:327","subExpression":{"arguments":[{"id":34648,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34619,"src":"25933:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34647,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"25915:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34649,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25915:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34656,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34651,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34582,"src":"25943:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"baseExpression":{"expression":{"id":34652,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34580,"src":"25953:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34653,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"25955:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"25953:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":34655,"indexExpression":{"id":34654,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"25965:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"25953:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"25943:30:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"25914:59:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34664,"nodeType":"IfStatement","src":"25910:123:327","trueBody":{"errorCall":{"arguments":[{"id":34659,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34582,"src":"26011:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34660,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"26019:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34661,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"26025:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34658,"name":"ERC721NonApprovedForTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32140,"src":"25982:28:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,address,uint256) pure returns (error)"}},"id":34662,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"25982:51:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34663,"nodeType":"RevertStatement","src":"25975:58:327"}}]}},{"expression":{"id":34673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34667,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34580,"src":"26061:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34670,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26063:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"26061:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34671,"indexExpression":{"id":34669,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"26070:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"26061:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":34672,"name":"BURNT_TOKEN_OWNER_VALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33314,"src":"26081:23:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26061:43:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34674,"nodeType":"ExpressionStatement","src":"26061:43:327"},{"eventCall":{"arguments":[{"id":34676,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"26132:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":34679,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26146:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34678,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26138:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34677,"name":"address","nodeType":"ElementaryTypeName","src":"26138:7:327","typeDescriptions":{}}},"id":34680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26138:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34681,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34613,"src":"26150:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34675,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32185,"src":"26123:8:327","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":34682,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26123:35:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":34683,"nodeType":"EmitStatement","src":"26118:40:327"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34608,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34606,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34604,"src":"25589:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":34607,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34599,"src":"25593:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"25589:10:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34685,"initializationExpression":{"assignments":[34604],"declarations":[{"constant":false,"id":34604,"mutability":"mutable","name":"i","nameLocation":"25586:1:327","nodeType":"VariableDeclaration","scope":34685,"src":"25578:9:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34603,"name":"uint256","nodeType":"ElementaryTypeName","src":"25578:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34605,"nodeType":"VariableDeclarationStatement","src":"25578:9:327"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":34610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"25601:3:327","subExpression":{"id":34609,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34604,"src":"25603:1:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34611,"nodeType":"ExpressionStatement","src":"25601:3:327"},"nodeType":"ForStatement","src":"25573:596:327"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34686,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34599,"src":"26183:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":34687,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26193:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"26183:11:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34699,"nodeType":"IfStatement","src":"26179:110:327","trueBody":{"id":34698,"nodeType":"Block","src":"26196:93:327","statements":[{"id":34697,"nodeType":"UncheckedBlock","src":"26210:69:327","statements":[{"expression":{"id":34695,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"expression":{"id":34689,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34580,"src":"26238:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34692,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26240:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"26238:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34693,"indexExpression":{"id":34691,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34584,"src":"26249:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"26238:16:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":34694,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34599,"src":"26258:6:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"26238:26:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34696,"nodeType":"ExpressionStatement","src":"26238:26:327"}]}]}}]},"documentation":{"id":34577,"nodeType":"StructuredDocumentation","src":"24722:626:327","text":"@notice Burns a batch of tokens by a sender.\n @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\n @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\n @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\n @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\n @param sender The message sender.\n @param from The current tokens owner.\n @param tokenIds The identifiers of the tokens to burn."},"id":34701,"implemented":true,"kind":"function","modifiers":[],"name":"batchBurnFrom","nameLocation":"25362:13:327","nodeType":"FunctionDefinition","parameters":{"id":34588,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34580,"mutability":"mutable","name":"s","nameLocation":"25391:1:327","nodeType":"VariableDeclaration","scope":34701,"src":"25376:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34579,"nodeType":"UserDefinedTypeName","pathNode":{"id":34578,"name":"Layout","nameLocations":["25376:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"25376:6:327"},"referencedDeclaration":33288,"src":"25376:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34582,"mutability":"mutable","name":"sender","nameLocation":"25402:6:327","nodeType":"VariableDeclaration","scope":34701,"src":"25394:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34581,"name":"address","nodeType":"ElementaryTypeName","src":"25394:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34584,"mutability":"mutable","name":"from","nameLocation":"25418:4:327","nodeType":"VariableDeclaration","scope":34701,"src":"25410:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34583,"name":"address","nodeType":"ElementaryTypeName","src":"25410:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34587,"mutability":"mutable","name":"tokenIds","nameLocation":"25443:8:327","nodeType":"VariableDeclaration","scope":34701,"src":"25424:27:327","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":34585,"name":"uint256","nodeType":"ElementaryTypeName","src":"25424:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":34586,"nodeType":"ArrayTypeName","src":"25424:9:327","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"25375:77:327"},"returnParameters":{"id":34589,"nodeType":"ParameterList","parameters":[],"src":"25462:0:327"},"scope":34972,"src":"25353:942:327","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":34727,"nodeType":"Block","src":"26714:111:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34712,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34707,"src":"26728:5:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":34715,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"26745:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34714,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"26737:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34713,"name":"address","nodeType":"ElementaryTypeName","src":"26737:7:327","typeDescriptions":{}}},"id":34716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26737:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"26728:19:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34721,"nodeType":"IfStatement","src":"26724:60:327","trueBody":{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":34718,"name":"ERC721BalanceOfAddressZero","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32157,"src":"26756:26:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":34719,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"26756:28:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34720,"nodeType":"RevertStatement","src":"26749:35:327"}},{"expression":{"baseExpression":{"expression":{"id":34722,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34705,"src":"26801:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34723,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"26803:8:327","memberName":"balances","nodeType":"MemberAccess","referencedDeclaration":33277,"src":"26801:10:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":34725,"indexExpression":{"id":34724,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34707,"src":"26812:5:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"26801:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":34711,"id":34726,"nodeType":"Return","src":"26794:24:327"}]},"documentation":{"id":34702,"nodeType":"StructuredDocumentation","src":"26301:316:327","text":"@notice Gets the balance of an address.\n @dev Note: This function implements {ERC721-balanceOf(address)}.\n @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\n @param owner The address to query the balance of.\n @return balance The amount owned by the owner."},"id":34728,"implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"26631:9:327","nodeType":"FunctionDefinition","parameters":{"id":34708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34705,"mutability":"mutable","name":"s","nameLocation":"26656:1:327","nodeType":"VariableDeclaration","scope":34728,"src":"26641:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34704,"nodeType":"UserDefinedTypeName","pathNode":{"id":34703,"name":"Layout","nameLocations":["26641:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"26641:6:327"},"referencedDeclaration":33288,"src":"26641:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34707,"mutability":"mutable","name":"owner","nameLocation":"26667:5:327","nodeType":"VariableDeclaration","scope":34728,"src":"26659:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34706,"name":"address","nodeType":"ElementaryTypeName","src":"26659:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"26640:33:327"},"returnParameters":{"id":34711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34710,"mutability":"mutable","name":"balance","nameLocation":"26705:7:327","nodeType":"VariableDeclaration","scope":34728,"src":"26697:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34709,"name":"uint256","nodeType":"ElementaryTypeName","src":"26697:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"26696:17:327"},"scope":34972,"src":"26622:203:327","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":34759,"nodeType":"Block","src":"27238:159:327","statements":[{"assignments":[34740],"declarations":[{"constant":false,"id":34740,"mutability":"mutable","name":"owner","nameLocation":"27256:5:327","nodeType":"VariableDeclaration","scope":34759,"src":"27248:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34739,"name":"uint256","nodeType":"ElementaryTypeName","src":"27248:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34745,"initialValue":{"baseExpression":{"expression":{"id":34741,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34732,"src":"27264:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34742,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27266:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"27264:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34744,"indexExpression":{"id":34743,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34734,"src":"27273:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"27264:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27248:33:327"},{"condition":{"id":34749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"27295:20:327","subExpression":{"arguments":[{"id":34747,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34740,"src":"27309:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34746,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"27296:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27296:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34754,"nodeType":"IfStatement","src":"27291:64:327","trueBody":{"errorCall":{"arguments":[{"id":34751,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34734,"src":"27347:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34750,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"27324:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27324:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34753,"nodeType":"RevertStatement","src":"27317:38:327"}},{"expression":{"arguments":[{"id":34756,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34740,"src":"27384:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34755,"name":"_tokenOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34930,"src":"27372:11:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_address_$","typeString":"function (uint256) pure returns (address)"}},"id":34757,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27372:18:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":34738,"id":34758,"nodeType":"Return","src":"27365:25:327"}]},"documentation":{"id":34729,"nodeType":"StructuredDocumentation","src":"26831:307:327","text":"@notice Gets the owner of a token.\n @dev Note: This function implements {ERC721-ownerOf(uint256)}.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @param tokenId The token identifier to query the owner of.\n @return tokenOwner The owner of the token."},"id":34760,"implemented":true,"kind":"function","modifiers":[],"name":"ownerOf","nameLocation":"27152:7:327","nodeType":"FunctionDefinition","parameters":{"id":34735,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34732,"mutability":"mutable","name":"s","nameLocation":"27175:1:327","nodeType":"VariableDeclaration","scope":34760,"src":"27160:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34731,"nodeType":"UserDefinedTypeName","pathNode":{"id":34730,"name":"Layout","nameLocations":["27160:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"27160:6:327"},"referencedDeclaration":33288,"src":"27160:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34734,"mutability":"mutable","name":"tokenId","nameLocation":"27186:7:327","nodeType":"VariableDeclaration","scope":34760,"src":"27178:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34733,"name":"uint256","nodeType":"ElementaryTypeName","src":"27178:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27159:35:327"},"returnParameters":{"id":34738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34737,"mutability":"mutable","name":"tokenOwner","nameLocation":"27226:10:327","nodeType":"VariableDeclaration","scope":34760,"src":"27218:18:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34736,"name":"address","nodeType":"ElementaryTypeName","src":"27218:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"27217:20:327"},"scope":34972,"src":"27143:254:327","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":34803,"nodeType":"Block","src":"27895:263:327","statements":[{"assignments":[34772],"declarations":[{"constant":false,"id":34772,"mutability":"mutable","name":"owner","nameLocation":"27913:5:327","nodeType":"VariableDeclaration","scope":34803,"src":"27905:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34771,"name":"uint256","nodeType":"ElementaryTypeName","src":"27905:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":34777,"initialValue":{"baseExpression":{"expression":{"id":34773,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34764,"src":"27921:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34774,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"27923:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"27921:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34776,"indexExpression":{"id":34775,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34766,"src":"27930:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"27921:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"27905:33:327"},{"condition":{"id":34781,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"27952:20:327","subExpression":{"arguments":[{"id":34779,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34772,"src":"27966:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34778,"name":"_tokenExists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34945,"src":"27953:12:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27953:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34786,"nodeType":"IfStatement","src":"27948:64:327","trueBody":{"errorCall":{"arguments":[{"id":34783,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34766,"src":"28004:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34782,"name":"ERC721NonExistingToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32131,"src":"27981:22:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":34784,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"27981:31:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34785,"nodeType":"RevertStatement","src":"27974:38:327"}},{"condition":{"arguments":[{"id":34788,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34772,"src":"28044:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34787,"name":"_tokenHasApproval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34971,"src":"28026:17:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34789,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28026:24:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":34801,"nodeType":"Block","src":"28110:42:327","statements":[{"expression":{"arguments":[{"hexValue":"30","id":34798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"28139:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":34797,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"28131:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34796,"name":"address","nodeType":"ElementaryTypeName","src":"28131:7:327","typeDescriptions":{}}},"id":34799,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"28131:10:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":34770,"id":34800,"nodeType":"Return","src":"28124:17:327"}]},"id":34802,"nodeType":"IfStatement","src":"28022:130:327","trueBody":{"id":34795,"nodeType":"Block","src":"28052:52:327","statements":[{"expression":{"baseExpression":{"expression":{"id":34790,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34764,"src":"28073:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34791,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"28075:9:327","memberName":"approvals","nodeType":"MemberAccess","referencedDeclaration":33281,"src":"28073:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":34793,"indexExpression":{"id":34792,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34766,"src":"28085:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"28073:20:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":34770,"id":34794,"nodeType":"Return","src":"28066:27:327"}]}}]},"documentation":{"id":34761,"nodeType":"StructuredDocumentation","src":"27403:390:327","text":"@notice Gets the approved address for a token.\n @dev Note: This function implements {ERC721-getApproved(uint256)}.\n @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\n @param tokenId The token identifier to query the approval of.\n @return approved The approved address for the token identifier, or the zero address if no approval is set."},"id":34804,"implemented":true,"kind":"function","modifiers":[],"name":"getApproved","nameLocation":"27807:11:327","nodeType":"FunctionDefinition","parameters":{"id":34767,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34764,"mutability":"mutable","name":"s","nameLocation":"27834:1:327","nodeType":"VariableDeclaration","scope":34804,"src":"27819:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34763,"nodeType":"UserDefinedTypeName","pathNode":{"id":34762,"name":"Layout","nameLocations":["27819:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"27819:6:327"},"referencedDeclaration":33288,"src":"27819:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34766,"mutability":"mutable","name":"tokenId","nameLocation":"27845:7:327","nodeType":"VariableDeclaration","scope":34804,"src":"27837:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34765,"name":"uint256","nodeType":"ElementaryTypeName","src":"27837:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"27818:35:327"},"returnParameters":{"id":34770,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34769,"mutability":"mutable","name":"approved","nameLocation":"27885:8:327","nodeType":"VariableDeclaration","scope":34804,"src":"27877:16:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34768,"name":"address","nodeType":"ElementaryTypeName","src":"27877:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"27876:18:327"},"scope":34972,"src":"27798:360:327","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":34824,"nodeType":"Block","src":"28701:52:327","statements":[{"expression":{"baseExpression":{"baseExpression":{"expression":{"id":34817,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34808,"src":"28718:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34818,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"28720:9:327","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":33287,"src":"28718:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":34820,"indexExpression":{"id":34819,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34810,"src":"28730:5:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"28718:18:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":34822,"indexExpression":{"id":34821,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34812,"src":"28737:8:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"28718:28:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34816,"id":34823,"nodeType":"Return","src":"28711:35:327"}]},"documentation":{"id":34805,"nodeType":"StructuredDocumentation","src":"28164:411:327","text":"@notice Gets whether an operator is approved for all tokens by an owner.\n @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\n @param owner The address which gives the approval for all tokens.\n @param operator The address which receives the approval for all tokens.\n @return approvedForAll Whether the operator is approved for all tokens by the owner."},"id":34825,"implemented":true,"kind":"function","modifiers":[],"name":"isApprovedForAll","nameLocation":"28589:16:327","nodeType":"FunctionDefinition","parameters":{"id":34813,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34808,"mutability":"mutable","name":"s","nameLocation":"28621:1:327","nodeType":"VariableDeclaration","scope":34825,"src":"28606:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34807,"nodeType":"UserDefinedTypeName","pathNode":{"id":34806,"name":"Layout","nameLocations":["28606:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"28606:6:327"},"referencedDeclaration":33288,"src":"28606:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34810,"mutability":"mutable","name":"owner","nameLocation":"28632:5:327","nodeType":"VariableDeclaration","scope":34825,"src":"28624:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34809,"name":"address","nodeType":"ElementaryTypeName","src":"28624:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34812,"mutability":"mutable","name":"operator","nameLocation":"28647:8:327","nodeType":"VariableDeclaration","scope":34825,"src":"28639:16:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34811,"name":"address","nodeType":"ElementaryTypeName","src":"28639:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"28605:51:327"},"returnParameters":{"id":34816,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34815,"mutability":"mutable","name":"approvedForAll","nameLocation":"28685:14:327","nodeType":"VariableDeclaration","scope":34825,"src":"28680:19:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34814,"name":"bool","nodeType":"ElementaryTypeName","src":"28680:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"28679:21:327"},"scope":34972,"src":"28580:173:327","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":34843,"nodeType":"Block","src":"29007:57:327","statements":[{"expression":{"arguments":[{"baseExpression":{"expression":{"id":34837,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34829,"src":"29039:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34838,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"29041:6:327","memberName":"owners","nodeType":"MemberAccess","referencedDeclaration":33273,"src":"29039:8:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_uint256_$","typeString":"mapping(uint256 => uint256)"}},"id":34840,"indexExpression":{"id":34839,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34831,"src":"29048:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"29039:17:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34836,"name":"_tokenWasBurnt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34957,"src":"29024:14:327","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_bool_$","typeString":"function (uint256) pure returns (bool)"}},"id":34841,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29024:33:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34835,"id":34842,"nodeType":"Return","src":"29017:40:327"}]},"documentation":{"id":34826,"nodeType":"StructuredDocumentation","src":"28759:147:327","text":"@notice Gets whether a token was burnt.\n @param tokenId The token identifier.\n @return tokenWasBurnt Whether the token was burnt."},"id":34844,"implemented":true,"kind":"function","modifiers":[],"name":"wasBurnt","nameLocation":"28920:8:327","nodeType":"FunctionDefinition","parameters":{"id":34832,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34829,"mutability":"mutable","name":"s","nameLocation":"28944:1:327","nodeType":"VariableDeclaration","scope":34844,"src":"28929:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34828,"nodeType":"UserDefinedTypeName","pathNode":{"id":34827,"name":"Layout","nameLocations":["28929:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"28929:6:327"},"referencedDeclaration":33288,"src":"28929:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34831,"mutability":"mutable","name":"tokenId","nameLocation":"28955:7:327","nodeType":"VariableDeclaration","scope":34844,"src":"28947:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34830,"name":"uint256","nodeType":"ElementaryTypeName","src":"28947:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"28928:35:327"},"returnParameters":{"id":34835,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34834,"mutability":"mutable","name":"tokenWasBurnt","nameLocation":"28992:13:327","nodeType":"VariableDeclaration","scope":34844,"src":"28987:18:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34833,"name":"bool","nodeType":"ElementaryTypeName","src":"28987:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"28986:20:327"},"scope":34972,"src":"28911:153:327","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":34855,"nodeType":"Block","src":"29129:115:327","statements":[{"assignments":[34851],"declarations":[{"constant":false,"id":34851,"mutability":"mutable","name":"position","nameLocation":"29147:8:327","nodeType":"VariableDeclaration","scope":34855,"src":"29139:16:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":34850,"name":"bytes32","nodeType":"ElementaryTypeName","src":"29139:7:327","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":34853,"initialValue":{"id":34852,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33301,"src":"29158:19:327","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"29139:38:327"},{"AST":{"nativeSrc":"29196:42:327","nodeType":"YulBlock","src":"29196:42:327","statements":[{"nativeSrc":"29210:18:327","nodeType":"YulAssignment","src":"29210:18:327","value":{"name":"position","nativeSrc":"29220:8:327","nodeType":"YulIdentifier","src":"29220:8:327"},"variableNames":[{"name":"s.slot","nativeSrc":"29210:6:327","nodeType":"YulIdentifier","src":"29210:6:327"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":34851,"isOffset":false,"isSlot":false,"src":"29220:8:327","valueSize":1},{"declaration":34848,"isOffset":false,"isSlot":true,"src":"29210:6:327","suffix":"slot","valueSize":1}],"id":34854,"nodeType":"InlineAssembly","src":"29187:51:327"}]},"id":34856,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"29079:6:327","nodeType":"FunctionDefinition","parameters":{"id":34845,"nodeType":"ParameterList","parameters":[],"src":"29085:2:327"},"returnParameters":{"id":34849,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34848,"mutability":"mutable","name":"s","nameLocation":"29126:1:327","nodeType":"VariableDeclaration","scope":34856,"src":"29111:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34847,"nodeType":"UserDefinedTypeName","pathNode":{"id":34846,"name":"Layout","nameLocations":["29111:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"29111:6:327"},"referencedDeclaration":33288,"src":"29111:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"}],"src":"29110:18:327"},"scope":34972,"src":"29070:174:327","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":34887,"nodeType":"Block","src":"29818:153:327","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes4","typeString":"bytes4"},"id":34880,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":34874,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34859,"src":"29869:6:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34875,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34861,"src":"29877:4:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34876,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34865,"src":"29883:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":34877,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34867,"src":"29892:4:327","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":34871,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34863,"src":"29848:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":34870,"name":"IERC721Receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33217,"src":"29832:15:327","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC721Receiver_$33217_$","typeString":"type(contract IERC721Receiver)"}},"id":34872,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29832:19:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC721Receiver_$33217","typeString":"contract IERC721Receiver"}},"id":34873,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"29852:16:327","memberName":"onERC721Received","nodeType":"MemberAccess","referencedDeclaration":33216,"src":"29832:36:327","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$","typeString":"function (address,address,uint256,bytes memory) external returns (bytes4)"}},"id":34878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29832:65:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":34879,"name":"ERC721_RECEIVED","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33306,"src":"29901:15:327","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},"src":"29832:84:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":34886,"nodeType":"IfStatement","src":"29828:136:327","trueBody":{"errorCall":{"arguments":[{"id":34882,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34863,"src":"29952:2:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":34883,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34865,"src":"29956:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34881,"name":"ERC721SafeTransferRejected","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32154,"src":"29925:26:327","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$","typeString":"function (address,uint256) pure returns (error)"}},"id":34884,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"29925:39:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":34885,"nodeType":"RevertStatement","src":"29918:46:327"}}]},"documentation":{"id":34857,"nodeType":"StructuredDocumentation","src":"29250:446:327","text":"@notice Calls {IERC721Receiver-onERC721Received} on a target contract.\n @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\n @param sender The message sender.\n @param from Previous token owner.\n @param to New token owner.\n @param tokenId Identifier of the token transferred.\n @param data Optional data to send along with the receiver contract call."},"id":34888,"implemented":true,"kind":"function","modifiers":[],"name":"_callOnERC721Received","nameLocation":"29710:21:327","nodeType":"FunctionDefinition","parameters":{"id":34868,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34859,"mutability":"mutable","name":"sender","nameLocation":"29740:6:327","nodeType":"VariableDeclaration","scope":34888,"src":"29732:14:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34858,"name":"address","nodeType":"ElementaryTypeName","src":"29732:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34861,"mutability":"mutable","name":"from","nameLocation":"29756:4:327","nodeType":"VariableDeclaration","scope":34888,"src":"29748:12:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34860,"name":"address","nodeType":"ElementaryTypeName","src":"29748:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34863,"mutability":"mutable","name":"to","nameLocation":"29770:2:327","nodeType":"VariableDeclaration","scope":34888,"src":"29762:10:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34862,"name":"address","nodeType":"ElementaryTypeName","src":"29762:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34865,"mutability":"mutable","name":"tokenId","nameLocation":"29782:7:327","nodeType":"VariableDeclaration","scope":34888,"src":"29774:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34864,"name":"uint256","nodeType":"ElementaryTypeName","src":"29774:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":34867,"mutability":"mutable","name":"data","nameLocation":"29804:4:327","nodeType":"VariableDeclaration","scope":34888,"src":"29791:17:327","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":34866,"name":"bytes","nodeType":"ElementaryTypeName","src":"29791:5:327","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"29731:78:327"},"returnParameters":{"id":34869,"nodeType":"ParameterList","parameters":[],"src":"29818:0:327"},"scope":34972,"src":"29701:270:327","stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"body":{"id":34913,"nodeType":"Block","src":"30396:73:327","statements":[{"expression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":34911,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":34903,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34901,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34894,"src":"30414:5:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":34902,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34896,"src":"30423:7:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"30414:16:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":34904,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"30413:18:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"baseExpression":{"baseExpression":{"expression":{"id":34905,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34892,"src":"30435:1:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout storage pointer"}},"id":34906,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"30437:9:327","memberName":"operators","nodeType":"MemberAccess","referencedDeclaration":33287,"src":"30435:11:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$","typeString":"mapping(address => mapping(address => bool))"}},"id":34908,"indexExpression":{"id":34907,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34894,"src":"30447:5:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"30435:18:327","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_bool_$","typeString":"mapping(address => bool)"}},"id":34910,"indexExpression":{"id":34909,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34896,"src":"30454:7:327","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"30435:27:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"30413:49:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34900,"id":34912,"nodeType":"Return","src":"30406:56:327"}]},"documentation":{"id":34889,"nodeType":"StructuredDocumentation","src":"29977:302:327","text":"@notice Returns whether an account is authorised to make a transfer on behalf of an owner.\n @param owner The token owner.\n @param account The account to check the operatability of.\n @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise."},"id":34914,"implemented":true,"kind":"function","modifiers":[],"name":"_isOperatable","nameLocation":"30293:13:327","nodeType":"FunctionDefinition","parameters":{"id":34897,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34892,"mutability":"mutable","name":"s","nameLocation":"30322:1:327","nodeType":"VariableDeclaration","scope":34914,"src":"30307:16:327","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"},"typeName":{"id":34891,"nodeType":"UserDefinedTypeName","pathNode":{"id":34890,"name":"Layout","nameLocations":["30307:6:327"],"nodeType":"IdentifierPath","referencedDeclaration":33288,"src":"30307:6:327"},"referencedDeclaration":33288,"src":"30307:6:327","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$33288_storage_ptr","typeString":"struct ERC721Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":34894,"mutability":"mutable","name":"owner","nameLocation":"30333:5:327","nodeType":"VariableDeclaration","scope":34914,"src":"30325:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34893,"name":"address","nodeType":"ElementaryTypeName","src":"30325:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":34896,"mutability":"mutable","name":"account","nameLocation":"30348:7:327","nodeType":"VariableDeclaration","scope":34914,"src":"30340:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34895,"name":"address","nodeType":"ElementaryTypeName","src":"30340:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"30306:50:327"},"returnParameters":{"id":34900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34899,"mutability":"mutable","name":"operatable","nameLocation":"30384:10:327","nodeType":"VariableDeclaration","scope":34914,"src":"30379:15:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34898,"name":"bool","nodeType":"ElementaryTypeName","src":"30379:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"30378:17:327"},"scope":34972,"src":"30284:185:327","stateMutability":"view","virtual":false,"visibility":"private"},{"body":{"id":34929,"nodeType":"Block","src":"30553:47:327","statements":[{"expression":{"arguments":[{"arguments":[{"id":34925,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34916,"src":"30586:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34924,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30578:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34923,"name":"uint160","nodeType":"ElementaryTypeName","src":"30578:7:327","typeDescriptions":{}}},"id":34926,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30578:14:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":34922,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30570:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":34921,"name":"address","nodeType":"ElementaryTypeName","src":"30570:7:327","typeDescriptions":{}}},"id":34927,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30570:23:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":34920,"id":34928,"nodeType":"Return","src":"30563:30:327"}]},"id":34930,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenOwner","nameLocation":"30484:11:327","nodeType":"FunctionDefinition","parameters":{"id":34917,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34916,"mutability":"mutable","name":"owner","nameLocation":"30504:5:327","nodeType":"VariableDeclaration","scope":34930,"src":"30496:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34915,"name":"uint256","nodeType":"ElementaryTypeName","src":"30496:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30495:15:327"},"returnParameters":{"id":34920,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34919,"mutability":"mutable","name":"tokenOwner","nameLocation":"30541:10:327","nodeType":"VariableDeclaration","scope":34930,"src":"30533:18:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":34918,"name":"address","nodeType":"ElementaryTypeName","src":"30533:7:327","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"30532:20:327"},"scope":34972,"src":"30475:125:327","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":34944,"nodeType":"Block","src":"30683:43:327","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint160","typeString":"uint160"},"id":34942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":34939,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34932,"src":"30708:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":34938,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"30700:7:327","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":34937,"name":"uint160","nodeType":"ElementaryTypeName","src":"30700:7:327","typeDescriptions":{}}},"id":34940,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"30700:14:327","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":34941,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"30718:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"30700:19:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34936,"id":34943,"nodeType":"Return","src":"30693:26:327"}]},"id":34945,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenExists","nameLocation":"30615:12:327","nodeType":"FunctionDefinition","parameters":{"id":34933,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34932,"mutability":"mutable","name":"owner","nameLocation":"30636:5:327","nodeType":"VariableDeclaration","scope":34945,"src":"30628:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34931,"name":"uint256","nodeType":"ElementaryTypeName","src":"30628:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30627:15:327"},"returnParameters":{"id":34936,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34935,"mutability":"mutable","name":"tokenExists","nameLocation":"30670:11:327","nodeType":"VariableDeclaration","scope":34945,"src":"30665:16:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34934,"name":"bool","nodeType":"ElementaryTypeName","src":"30665:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"30664:18:327"},"scope":34972,"src":"30606:120:327","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":34956,"nodeType":"Block","src":"30813:56:327","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34954,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34952,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34947,"src":"30830:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":34953,"name":"BURNT_TOKEN_OWNER_VALUE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33314,"src":"30839:23:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30830:32:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34951,"id":34955,"nodeType":"Return","src":"30823:39:327"}]},"id":34957,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenWasBurnt","nameLocation":"30741:14:327","nodeType":"FunctionDefinition","parameters":{"id":34948,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34947,"mutability":"mutable","name":"owner","nameLocation":"30764:5:327","nodeType":"VariableDeclaration","scope":34957,"src":"30756:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34946,"name":"uint256","nodeType":"ElementaryTypeName","src":"30756:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30755:15:327"},"returnParameters":{"id":34951,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34950,"mutability":"mutable","name":"tokenWasBurnt","nameLocation":"30798:13:327","nodeType":"VariableDeclaration","scope":34957,"src":"30793:18:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34949,"name":"bool","nodeType":"ElementaryTypeName","src":"30793:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"30792:20:327"},"scope":34972,"src":"30732:137:327","stateMutability":"pure","virtual":false,"visibility":"private"},{"body":{"id":34970,"nodeType":"Block","src":"30962:62:327","statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34968,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":34966,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":34964,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34959,"src":"30979:5:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"&","rightExpression":{"id":34965,"name":"TOKEN_APPROVAL_OWNER_FLAG","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":33311,"src":"30987:25:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"30979:33:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":34967,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"31016:1:327","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"30979:38:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":34963,"id":34969,"nodeType":"Return","src":"30972:45:327"}]},"id":34971,"implemented":true,"kind":"function","modifiers":[],"name":"_tokenHasApproval","nameLocation":"30884:17:327","nodeType":"FunctionDefinition","parameters":{"id":34960,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34959,"mutability":"mutable","name":"owner","nameLocation":"30910:5:327","nodeType":"VariableDeclaration","scope":34971,"src":"30902:13:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":34958,"name":"uint256","nodeType":"ElementaryTypeName","src":"30902:7:327","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"30901:15:327"},"returnParameters":{"id":34963,"nodeType":"ParameterList","parameters":[{"constant":false,"id":34962,"mutability":"mutable","name":"tokenHasApproval","nameLocation":"30944:16:327","nodeType":"VariableDeclaration","scope":34971,"src":"30939:21:327","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":34961,"name":"bool","nodeType":"ElementaryTypeName","src":"30939:4:327","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"30938:23:327"},"scope":34972,"src":"30875:149:327","stateMutability":"pure","virtual":false,"visibility":"private"}],"scope":34973,"src":"1403:29623:327","usedErrors":[],"usedEvents":[]}],"src":"32:30995:327"},"id":327},"contracts/token/ERC721/preset/ERC721Full.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/ERC721Full.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC2981":[36915],"ERC721BatchTransferWithOperatorFilterer":[30787],"ERC721Deliverable":[30831],"ERC721Full":[35079],"ERC721Metadata":[30900],"ERC721Mintable":[30924],"ERC721WithOperatorFilterer":[31030],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"TokenRecovery":[19661]},"id":35080,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":34974,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:328"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":34976,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":13387,"src":"57:87:328","symbolAliases":[{"foreign":{"id":34975,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":34978,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":36705,"src":"145:94:328","symbolAliases":[{"foreign":{"id":34977,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../royalty/interfaces/IOperatorFilterRegistry.sol","id":34980,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":37475,"src":"240:95:328","symbolAliases":[{"foreign":{"id":34979,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"248:23:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721WithOperatorFilterer.sol","file":"./../ERC721WithOperatorFilterer.sol","id":34982,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":31031,"src":"336:79:328","symbolAliases":[{"foreign":{"id":34981,"name":"ERC721WithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31030,"src":"344:26:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol","file":"./../ERC721BatchTransferWithOperatorFilterer.sol","id":34984,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":30788,"src":"416:105:328","symbolAliases":[{"foreign":{"id":34983,"name":"ERC721BatchTransferWithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30787,"src":"424:39:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Metadata.sol","file":"./../ERC721Metadata.sol","id":34986,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":30901,"src":"522:55:328","symbolAliases":[{"foreign":{"id":34985,"name":"ERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30900,"src":"530:14:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Mintable.sol","file":"./../ERC721Mintable.sol","id":34988,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":30925,"src":"578:55:328","symbolAliases":[{"foreign":{"id":34987,"name":"ERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30924,"src":"586:14:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Deliverable.sol","file":"./../ERC721Deliverable.sol","id":34990,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":30832,"src":"634:61:328","symbolAliases":[{"foreign":{"id":34989,"name":"ERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30831,"src":"642:17:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/ERC2981.sol","file":"./../../royalty/ERC2981.sol","id":34992,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":36916,"src":"696:52:328","symbolAliases":[{"foreign":{"id":34991,"name":"ERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36915,"src":"704:7:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":34994,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":7935,"src":"749:74:328","symbolAliases":[{"foreign":{"id":34993,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"757:17:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":34996,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":19662,"src":"824:68:328","symbolAliases":[{"foreign":{"id":34995,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"832:13:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":34998,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":1207,"src":"893:66:328","symbolAliases":[{"foreign":{"id":34997,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"901:7:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":35000,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":13298,"src":"960:101:328","symbolAliases":[{"foreign":{"id":34999,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"968:28:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":35002,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35080,"sourceUnit":13143,"src":"1062:88:328","symbolAliases":[{"foreign":{"id":35001,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1070:24:328","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35003,"name":"ERC721WithOperatorFilterer","nameLocations":["1179:26:328"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1179:26:328"},"id":35004,"nodeType":"InheritanceSpecifier","src":"1179:26:328"},{"baseName":{"id":35005,"name":"ERC721BatchTransferWithOperatorFilterer","nameLocations":["1211:39:328"],"nodeType":"IdentifierPath","referencedDeclaration":30787,"src":"1211:39:328"},"id":35006,"nodeType":"InheritanceSpecifier","src":"1211:39:328"},{"baseName":{"id":35007,"name":"ERC721Metadata","nameLocations":["1256:14:328"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1256:14:328"},"id":35008,"nodeType":"InheritanceSpecifier","src":"1256:14:328"},{"baseName":{"id":35009,"name":"ERC721Mintable","nameLocations":["1276:14:328"],"nodeType":"IdentifierPath","referencedDeclaration":30924,"src":"1276:14:328"},"id":35010,"nodeType":"InheritanceSpecifier","src":"1276:14:328"},{"baseName":{"id":35011,"name":"ERC721Deliverable","nameLocations":["1296:17:328"],"nodeType":"IdentifierPath","referencedDeclaration":30831,"src":"1296:17:328"},"id":35012,"nodeType":"InheritanceSpecifier","src":"1296:17:328"},{"baseName":{"id":35013,"name":"ERC2981","nameLocations":["1319:7:328"],"nodeType":"IdentifierPath","referencedDeclaration":36915,"src":"1319:7:328"},"id":35014,"nodeType":"InheritanceSpecifier","src":"1319:7:328"},{"baseName":{"id":35015,"name":"TokenRecovery","nameLocations":["1332:13:328"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1332:13:328"},"id":35016,"nodeType":"InheritanceSpecifier","src":"1332:13:328"},{"baseName":{"id":35017,"name":"ForwarderRegistryContext","nameLocations":["1351:24:328"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1351:24:328"},"id":35018,"nodeType":"InheritanceSpecifier","src":"1351:24:328"}],"canonicalName":"ERC721Full","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35079,"linearizedBaseContracts":[35079,13142,13370,13297,19661,36915,30831,30924,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31446,31700,37073,32102,1206,8562,19938,8546,33144,33199,33109,33094],"name":"ERC721Full","nameLocation":"1161:10:328","nodeType":"ContractDefinition","nodes":[{"body":{"id":35049,"nodeType":"Block","src":"1821:2:328","statements":[]},"id":35050,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":35034,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1637:3:328","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":35035,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1641:6:328","memberName":"sender","nodeType":"MemberAccess","src":"1637:10:328","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":35036,"kind":"baseConstructorSpecifier","modifierName":{"id":35033,"name":"ContractOwnership","nameLocations":["1619:17:328"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1619:17:328"},"nodeType":"ModifierInvocation","src":"1619:29:328"},{"arguments":[{"id":35038,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35020,"src":"1672:9:328","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35039,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35022,"src":"1683:11:328","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35040,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35025,"src":"1696:16:328","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"id":35041,"kind":"baseConstructorSpecifier","modifierName":{"id":35037,"name":"ERC721Metadata","nameLocations":["1657:14:328"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1657:14:328"},"nodeType":"ModifierInvocation","src":"1657:56:328"},{"arguments":[{"id":35043,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35028,"src":"1749:14:328","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"id":35044,"kind":"baseConstructorSpecifier","modifierName":{"id":35042,"name":"ERC721WithOperatorFilterer","nameLocations":["1722:26:328"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1722:26:328"},"nodeType":"ModifierInvocation","src":"1722:42:328"},{"arguments":[{"id":35046,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35031,"src":"1798:17:328","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35047,"kind":"baseConstructorSpecifier","modifierName":{"id":35045,"name":"ForwarderRegistryContext","nameLocations":["1773:24:328"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1773:24:328"},"nodeType":"ModifierInvocation","src":"1773:43:328"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35032,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35020,"mutability":"mutable","name":"tokenName","nameLocation":"1417:9:328","nodeType":"VariableDeclaration","scope":35050,"src":"1403:23:328","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35019,"name":"string","nodeType":"ElementaryTypeName","src":"1403:6:328","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35022,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1450:11:328","nodeType":"VariableDeclaration","scope":35050,"src":"1436:25:328","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35021,"name":"string","nodeType":"ElementaryTypeName","src":"1436:6:328","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35025,"mutability":"mutable","name":"metadataResolver","nameLocation":"1494:16:328","nodeType":"VariableDeclaration","scope":35050,"src":"1471:39:328","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35024,"nodeType":"UserDefinedTypeName","pathNode":{"id":35023,"name":"ITokenMetadataResolver","nameLocations":["1471:22:328"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1471:22:328"},"referencedDeclaration":36704,"src":"1471:22:328","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35028,"mutability":"mutable","name":"filterRegistry","nameLocation":"1544:14:328","nodeType":"VariableDeclaration","scope":35050,"src":"1520:38:328","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35027,"nodeType":"UserDefinedTypeName","pathNode":{"id":35026,"name":"IOperatorFilterRegistry","nameLocations":["1520:23:328"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1520:23:328"},"referencedDeclaration":37474,"src":"1520:23:328","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":35031,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1587:17:328","nodeType":"VariableDeclaration","scope":35050,"src":"1568:36:328","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35030,"nodeType":"UserDefinedTypeName","pathNode":{"id":35029,"name":"IForwarderRegistry","nameLocations":["1568:18:328"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1568:18:328"},"referencedDeclaration":13386,"src":"1568:18:328","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1393:217:328"},"returnParameters":{"id":35048,"nodeType":"ParameterList","parameters":[],"src":"1821:0:328"},"scope":35079,"src":"1382:441:328","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":35063,"nodeType":"Block","src":"1988:65:328","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35059,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2005:28:328","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35060,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2034:10:328","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2005:39:328","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35061,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2005:41:328","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35058,"id":35062,"nodeType":"Return","src":"1998:48:328"}]},"documentation":{"id":35051,"nodeType":"StructuredDocumentation","src":"1829:44:328","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35064,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1887:10:328","nodeType":"FunctionDefinition","overrides":{"id":35055,"nodeType":"OverrideSpecifier","overrides":[{"id":35053,"name":"Context","nameLocations":["1931:7:328"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1931:7:328"},{"id":35054,"name":"ForwarderRegistryContextBase","nameLocations":["1940:28:328"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1940:28:328"}],"src":"1922:47:328"},"parameters":{"id":35052,"nodeType":"ParameterList","parameters":[],"src":"1897:2:328"},"returnParameters":{"id":35058,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35057,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35064,"src":"1979:7:328","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35056,"name":"address","nodeType":"ElementaryTypeName","src":"1979:7:328","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1978:9:328"},"scope":35079,"src":"1878:175:328","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35077,"nodeType":"Block","src":"2223:63:328","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35073,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2240:28:328","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2269:8:328","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2240:37:328","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35075,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2240:39:328","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35072,"id":35076,"nodeType":"Return","src":"2233:46:328"}]},"documentation":{"id":35065,"nodeType":"StructuredDocumentation","src":"2059:44:328","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35078,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2117:8:328","nodeType":"FunctionDefinition","overrides":{"id":35069,"nodeType":"OverrideSpecifier","overrides":[{"id":35067,"name":"Context","nameLocations":["2159:7:328"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2159:7:328"},{"id":35068,"name":"ForwarderRegistryContextBase","nameLocations":["2168:28:328"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2168:28:328"}],"src":"2150:47:328"},"parameters":{"id":35066,"nodeType":"ParameterList","parameters":[],"src":"2125:2:328"},"returnParameters":{"id":35072,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35071,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35078,"src":"2207:14:328","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35070,"name":"bytes","nodeType":"ElementaryTypeName","src":"2207:5:328","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2206:16:328"},"scope":35079,"src":"2108:178:328","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35080,"src":"1152:1136:328","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:2257:328"},"id":328},"contracts/token/ERC721/preset/ERC721FullBurn.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/ERC721FullBurn.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC2981":[36915],"ERC721BatchTransferWithOperatorFilterer":[30787],"ERC721Burnable":[30807],"ERC721Deliverable":[30831],"ERC721FullBurn":[35190],"ERC721Metadata":[30900],"ERC721Mintable":[30924],"ERC721WithOperatorFilterer":[31030],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"TokenRecovery":[19661]},"id":35191,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35081,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:329"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":35083,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":13387,"src":"57:87:329","symbolAliases":[{"foreign":{"id":35082,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":35085,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":36705,"src":"145:94:329","symbolAliases":[{"foreign":{"id":35084,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../royalty/interfaces/IOperatorFilterRegistry.sol","id":35087,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":37475,"src":"240:95:329","symbolAliases":[{"foreign":{"id":35086,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"248:23:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721WithOperatorFilterer.sol","file":"./../ERC721WithOperatorFilterer.sol","id":35089,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":31031,"src":"336:79:329","symbolAliases":[{"foreign":{"id":35088,"name":"ERC721WithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31030,"src":"344:26:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol","file":"./../ERC721BatchTransferWithOperatorFilterer.sol","id":35091,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":30788,"src":"416:105:329","symbolAliases":[{"foreign":{"id":35090,"name":"ERC721BatchTransferWithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30787,"src":"424:39:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Metadata.sol","file":"./../ERC721Metadata.sol","id":35093,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":30901,"src":"522:55:329","symbolAliases":[{"foreign":{"id":35092,"name":"ERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30900,"src":"530:14:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Mintable.sol","file":"./../ERC721Mintable.sol","id":35095,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":30925,"src":"578:55:329","symbolAliases":[{"foreign":{"id":35094,"name":"ERC721Mintable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30924,"src":"586:14:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Deliverable.sol","file":"./../ERC721Deliverable.sol","id":35097,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":30832,"src":"634:61:329","symbolAliases":[{"foreign":{"id":35096,"name":"ERC721Deliverable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30831,"src":"642:17:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Burnable.sol","file":"./../ERC721Burnable.sol","id":35099,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":30808,"src":"696:55:329","symbolAliases":[{"foreign":{"id":35098,"name":"ERC721Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30807,"src":"704:14:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/ERC2981.sol","file":"./../../royalty/ERC2981.sol","id":35101,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":36916,"src":"752:52:329","symbolAliases":[{"foreign":{"id":35100,"name":"ERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36915,"src":"760:7:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":35103,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":7935,"src":"805:74:329","symbolAliases":[{"foreign":{"id":35102,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"813:17:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":35105,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":19662,"src":"880:68:329","symbolAliases":[{"foreign":{"id":35104,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"888:13:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":35107,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":1207,"src":"949:66:329","symbolAliases":[{"foreign":{"id":35106,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"957:7:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":35109,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":13298,"src":"1016:101:329","symbolAliases":[{"foreign":{"id":35108,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1024:28:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":35111,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35191,"sourceUnit":13143,"src":"1118:88:329","symbolAliases":[{"foreign":{"id":35110,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1126:24:329","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35112,"name":"ERC721WithOperatorFilterer","nameLocations":["1239:26:329"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1239:26:329"},"id":35113,"nodeType":"InheritanceSpecifier","src":"1239:26:329"},{"baseName":{"id":35114,"name":"ERC721BatchTransferWithOperatorFilterer","nameLocations":["1271:39:329"],"nodeType":"IdentifierPath","referencedDeclaration":30787,"src":"1271:39:329"},"id":35115,"nodeType":"InheritanceSpecifier","src":"1271:39:329"},{"baseName":{"id":35116,"name":"ERC721Metadata","nameLocations":["1316:14:329"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1316:14:329"},"id":35117,"nodeType":"InheritanceSpecifier","src":"1316:14:329"},{"baseName":{"id":35118,"name":"ERC721Mintable","nameLocations":["1336:14:329"],"nodeType":"IdentifierPath","referencedDeclaration":30924,"src":"1336:14:329"},"id":35119,"nodeType":"InheritanceSpecifier","src":"1336:14:329"},{"baseName":{"id":35120,"name":"ERC721Deliverable","nameLocations":["1356:17:329"],"nodeType":"IdentifierPath","referencedDeclaration":30831,"src":"1356:17:329"},"id":35121,"nodeType":"InheritanceSpecifier","src":"1356:17:329"},{"baseName":{"id":35122,"name":"ERC721Burnable","nameLocations":["1379:14:329"],"nodeType":"IdentifierPath","referencedDeclaration":30807,"src":"1379:14:329"},"id":35123,"nodeType":"InheritanceSpecifier","src":"1379:14:329"},{"baseName":{"id":35124,"name":"ERC2981","nameLocations":["1399:7:329"],"nodeType":"IdentifierPath","referencedDeclaration":36915,"src":"1399:7:329"},"id":35125,"nodeType":"InheritanceSpecifier","src":"1399:7:329"},{"baseName":{"id":35126,"name":"TokenRecovery","nameLocations":["1412:13:329"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1412:13:329"},"id":35127,"nodeType":"InheritanceSpecifier","src":"1412:13:329"},{"baseName":{"id":35128,"name":"ForwarderRegistryContext","nameLocations":["1431:24:329"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1431:24:329"},"id":35129,"nodeType":"InheritanceSpecifier","src":"1431:24:329"}],"canonicalName":"ERC721FullBurn","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35190,"linearizedBaseContracts":[35190,13142,13370,13297,19661,36915,30807,31389,30831,30924,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31446,31700,37073,32102,1206,8562,19938,33130,8546,33144,33199,33109,33094],"name":"ERC721FullBurn","nameLocation":"1217:14:329","nodeType":"ContractDefinition","nodes":[{"body":{"id":35160,"nodeType":"Block","src":"1901:2:329","statements":[]},"id":35161,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":35145,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1717:3:329","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":35146,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1721:6:329","memberName":"sender","nodeType":"MemberAccess","src":"1717:10:329","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":35147,"kind":"baseConstructorSpecifier","modifierName":{"id":35144,"name":"ContractOwnership","nameLocations":["1699:17:329"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1699:17:329"},"nodeType":"ModifierInvocation","src":"1699:29:329"},{"arguments":[{"id":35149,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35131,"src":"1752:9:329","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35150,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35133,"src":"1763:11:329","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35151,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35136,"src":"1776:16:329","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"id":35152,"kind":"baseConstructorSpecifier","modifierName":{"id":35148,"name":"ERC721Metadata","nameLocations":["1737:14:329"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1737:14:329"},"nodeType":"ModifierInvocation","src":"1737:56:329"},{"arguments":[{"id":35154,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35139,"src":"1829:14:329","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"id":35155,"kind":"baseConstructorSpecifier","modifierName":{"id":35153,"name":"ERC721WithOperatorFilterer","nameLocations":["1802:26:329"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1802:26:329"},"nodeType":"ModifierInvocation","src":"1802:42:329"},{"arguments":[{"id":35157,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35142,"src":"1878:17:329","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35158,"kind":"baseConstructorSpecifier","modifierName":{"id":35156,"name":"ForwarderRegistryContext","nameLocations":["1853:24:329"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1853:24:329"},"nodeType":"ModifierInvocation","src":"1853:43:329"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35143,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35131,"mutability":"mutable","name":"tokenName","nameLocation":"1497:9:329","nodeType":"VariableDeclaration","scope":35161,"src":"1483:23:329","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35130,"name":"string","nodeType":"ElementaryTypeName","src":"1483:6:329","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35133,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1530:11:329","nodeType":"VariableDeclaration","scope":35161,"src":"1516:25:329","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35132,"name":"string","nodeType":"ElementaryTypeName","src":"1516:6:329","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35136,"mutability":"mutable","name":"metadataResolver","nameLocation":"1574:16:329","nodeType":"VariableDeclaration","scope":35161,"src":"1551:39:329","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35135,"nodeType":"UserDefinedTypeName","pathNode":{"id":35134,"name":"ITokenMetadataResolver","nameLocations":["1551:22:329"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1551:22:329"},"referencedDeclaration":36704,"src":"1551:22:329","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35139,"mutability":"mutable","name":"filterRegistry","nameLocation":"1624:14:329","nodeType":"VariableDeclaration","scope":35161,"src":"1600:38:329","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35138,"nodeType":"UserDefinedTypeName","pathNode":{"id":35137,"name":"IOperatorFilterRegistry","nameLocations":["1600:23:329"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1600:23:329"},"referencedDeclaration":37474,"src":"1600:23:329","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":35142,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1667:17:329","nodeType":"VariableDeclaration","scope":35161,"src":"1648:36:329","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35141,"nodeType":"UserDefinedTypeName","pathNode":{"id":35140,"name":"IForwarderRegistry","nameLocations":["1648:18:329"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1648:18:329"},"referencedDeclaration":13386,"src":"1648:18:329","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1473:217:329"},"returnParameters":{"id":35159,"nodeType":"ParameterList","parameters":[],"src":"1901:0:329"},"scope":35190,"src":"1462:441:329","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":35174,"nodeType":"Block","src":"2068:65:329","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35170,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2085:28:329","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2114:10:329","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2085:39:329","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35172,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2085:41:329","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35169,"id":35173,"nodeType":"Return","src":"2078:48:329"}]},"documentation":{"id":35162,"nodeType":"StructuredDocumentation","src":"1909:44:329","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35175,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1967:10:329","nodeType":"FunctionDefinition","overrides":{"id":35166,"nodeType":"OverrideSpecifier","overrides":[{"id":35164,"name":"Context","nameLocations":["2011:7:329"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2011:7:329"},{"id":35165,"name":"ForwarderRegistryContextBase","nameLocations":["2020:28:329"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2020:28:329"}],"src":"2002:47:329"},"parameters":{"id":35163,"nodeType":"ParameterList","parameters":[],"src":"1977:2:329"},"returnParameters":{"id":35169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35168,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35175,"src":"2059:7:329","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35167,"name":"address","nodeType":"ElementaryTypeName","src":"2059:7:329","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2058:9:329"},"scope":35190,"src":"1958:175:329","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35188,"nodeType":"Block","src":"2303:63:329","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35184,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2320:28:329","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35185,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2349:8:329","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2320:37:329","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35186,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2320:39:329","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35183,"id":35187,"nodeType":"Return","src":"2313:46:329"}]},"documentation":{"id":35176,"nodeType":"StructuredDocumentation","src":"2139:44:329","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35189,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2197:8:329","nodeType":"FunctionDefinition","overrides":{"id":35180,"nodeType":"OverrideSpecifier","overrides":[{"id":35178,"name":"Context","nameLocations":["2239:7:329"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2239:7:329"},{"id":35179,"name":"ForwarderRegistryContextBase","nameLocations":["2248:28:329"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2248:28:329"}],"src":"2230:47:329"},"parameters":{"id":35177,"nodeType":"ParameterList","parameters":[],"src":"2205:2:329"},"returnParameters":{"id":35183,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35182,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35189,"src":"2287:14:329","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35181,"name":"bytes","nodeType":"ElementaryTypeName","src":"2287:5:329","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2286:16:329"},"scope":35190,"src":"2188:178:329","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35191,"src":"1208:1160:329","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:2337:329"},"id":329},"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol","exportedSymbols":{"Context":[1206],"ContractOwnership":[7934],"ERC2981":[36915],"ERC721BatchTransferWithOperatorFilterer":[30787],"ERC721Burnable":[30807],"ERC721DeliverableOnce":[30855],"ERC721FullMintOnceBurn":[35301],"ERC721Metadata":[30900],"ERC721MintableOnce":[30948],"ERC721WithOperatorFilterer":[31030],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"TokenRecovery":[19661]},"id":35302,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35192,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:330"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":35194,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":13387,"src":"57:87:330","symbolAliases":[{"foreign":{"id":35193,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../metadata/interfaces/ITokenMetadataResolver.sol","id":35196,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":36705,"src":"145:94:330","symbolAliases":[{"foreign":{"id":35195,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"153:22:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../royalty/interfaces/IOperatorFilterRegistry.sol","id":35198,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":37475,"src":"240:95:330","symbolAliases":[{"foreign":{"id":35197,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"248:23:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721WithOperatorFilterer.sol","file":"./../ERC721WithOperatorFilterer.sol","id":35200,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":31031,"src":"336:79:330","symbolAliases":[{"foreign":{"id":35199,"name":"ERC721WithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31030,"src":"344:26:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol","file":"./../ERC721BatchTransferWithOperatorFilterer.sol","id":35202,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":30788,"src":"416:105:330","symbolAliases":[{"foreign":{"id":35201,"name":"ERC721BatchTransferWithOperatorFilterer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30787,"src":"424:39:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Metadata.sol","file":"./../ERC721Metadata.sol","id":35204,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":30901,"src":"522:55:330","symbolAliases":[{"foreign":{"id":35203,"name":"ERC721Metadata","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30900,"src":"530:14:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721MintableOnce.sol","file":"./../ERC721MintableOnce.sol","id":35206,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":30949,"src":"578:63:330","symbolAliases":[{"foreign":{"id":35205,"name":"ERC721MintableOnce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30948,"src":"586:18:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721DeliverableOnce.sol","file":"./../ERC721DeliverableOnce.sol","id":35208,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":30856,"src":"642:69:330","symbolAliases":[{"foreign":{"id":35207,"name":"ERC721DeliverableOnce","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30855,"src":"650:21:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/ERC721Burnable.sol","file":"./../ERC721Burnable.sol","id":35210,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":30808,"src":"712:55:330","symbolAliases":[{"foreign":{"id":35209,"name":"ERC721Burnable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30807,"src":"720:14:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/ERC2981.sol","file":"./../../royalty/ERC2981.sol","id":35212,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":36916,"src":"768:52:330","symbolAliases":[{"foreign":{"id":35211,"name":"ERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36915,"src":"776:7:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../../access/ContractOwnership.sol","id":35214,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":7935,"src":"821:74:330","symbolAliases":[{"foreign":{"id":35213,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"829:17:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/TokenRecovery.sol","file":"./../../../security/TokenRecovery.sol","id":35216,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":19662,"src":"896:68:330","symbolAliases":[{"foreign":{"id":35215,"name":"TokenRecovery","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19661,"src":"904:13:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":35218,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":1207,"src":"965:66:330","symbolAliases":[{"foreign":{"id":35217,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"973:7:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":35220,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":13298,"src":"1032:101:330","symbolAliases":[{"foreign":{"id":35219,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1040:28:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../metatx/ForwarderRegistryContext.sol","id":35222,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35302,"sourceUnit":13143,"src":"1134:88:330","symbolAliases":[{"foreign":{"id":35221,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1142:24:330","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35223,"name":"ERC721WithOperatorFilterer","nameLocations":["1263:26:330"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1263:26:330"},"id":35224,"nodeType":"InheritanceSpecifier","src":"1263:26:330"},{"baseName":{"id":35225,"name":"ERC721BatchTransferWithOperatorFilterer","nameLocations":["1295:39:330"],"nodeType":"IdentifierPath","referencedDeclaration":30787,"src":"1295:39:330"},"id":35226,"nodeType":"InheritanceSpecifier","src":"1295:39:330"},{"baseName":{"id":35227,"name":"ERC721Metadata","nameLocations":["1340:14:330"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1340:14:330"},"id":35228,"nodeType":"InheritanceSpecifier","src":"1340:14:330"},{"baseName":{"id":35229,"name":"ERC721MintableOnce","nameLocations":["1360:18:330"],"nodeType":"IdentifierPath","referencedDeclaration":30948,"src":"1360:18:330"},"id":35230,"nodeType":"InheritanceSpecifier","src":"1360:18:330"},{"baseName":{"id":35231,"name":"ERC721DeliverableOnce","nameLocations":["1384:21:330"],"nodeType":"IdentifierPath","referencedDeclaration":30855,"src":"1384:21:330"},"id":35232,"nodeType":"InheritanceSpecifier","src":"1384:21:330"},{"baseName":{"id":35233,"name":"ERC721Burnable","nameLocations":["1411:14:330"],"nodeType":"IdentifierPath","referencedDeclaration":30807,"src":"1411:14:330"},"id":35234,"nodeType":"InheritanceSpecifier","src":"1411:14:330"},{"baseName":{"id":35235,"name":"ERC2981","nameLocations":["1431:7:330"],"nodeType":"IdentifierPath","referencedDeclaration":36915,"src":"1431:7:330"},"id":35236,"nodeType":"InheritanceSpecifier","src":"1431:7:330"},{"baseName":{"id":35237,"name":"TokenRecovery","nameLocations":["1444:13:330"],"nodeType":"IdentifierPath","referencedDeclaration":19661,"src":"1444:13:330"},"id":35238,"nodeType":"InheritanceSpecifier","src":"1444:13:330"},{"baseName":{"id":35239,"name":"ForwarderRegistryContext","nameLocations":["1463:24:330"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1463:24:330"},"id":35240,"nodeType":"InheritanceSpecifier","src":"1463:24:330"}],"canonicalName":"ERC721FullMintOnceBurn","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35301,"linearizedBaseContracts":[35301,13142,13370,13297,19661,36915,30807,31389,30855,30948,7901,30900,31583,33168,36683,30787,31330,31030,7934,11554,11579,8139,19810,37012,37280,8091,31503,31833,37073,32102,1206,8562,19938,33130,8546,33144,33199,33109,33094],"name":"ERC721FullMintOnceBurn","nameLocation":"1233:22:330","nodeType":"ContractDefinition","nodes":[{"body":{"id":35271,"nodeType":"Block","src":"1933:2:330","statements":[]},"id":35272,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"expression":{"id":35256,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1749:3:330","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":35257,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1753:6:330","memberName":"sender","nodeType":"MemberAccess","src":"1749:10:330","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":35258,"kind":"baseConstructorSpecifier","modifierName":{"id":35255,"name":"ContractOwnership","nameLocations":["1731:17:330"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"1731:17:330"},"nodeType":"ModifierInvocation","src":"1731:29:330"},{"arguments":[{"id":35260,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35242,"src":"1784:9:330","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35261,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35244,"src":"1795:11:330","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":35262,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35247,"src":"1808:16:330","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"id":35263,"kind":"baseConstructorSpecifier","modifierName":{"id":35259,"name":"ERC721Metadata","nameLocations":["1769:14:330"],"nodeType":"IdentifierPath","referencedDeclaration":30900,"src":"1769:14:330"},"nodeType":"ModifierInvocation","src":"1769:56:330"},{"arguments":[{"id":35265,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35250,"src":"1861:14:330","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"id":35266,"kind":"baseConstructorSpecifier","modifierName":{"id":35264,"name":"ERC721WithOperatorFilterer","nameLocations":["1834:26:330"],"nodeType":"IdentifierPath","referencedDeclaration":31030,"src":"1834:26:330"},"nodeType":"ModifierInvocation","src":"1834:42:330"},{"arguments":[{"id":35268,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35253,"src":"1910:17:330","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35269,"kind":"baseConstructorSpecifier","modifierName":{"id":35267,"name":"ForwarderRegistryContext","nameLocations":["1885:24:330"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"1885:24:330"},"nodeType":"ModifierInvocation","src":"1885:43:330"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35254,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35242,"mutability":"mutable","name":"tokenName","nameLocation":"1529:9:330","nodeType":"VariableDeclaration","scope":35272,"src":"1515:23:330","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35241,"name":"string","nodeType":"ElementaryTypeName","src":"1515:6:330","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35244,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1562:11:330","nodeType":"VariableDeclaration","scope":35272,"src":"1548:25:330","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":35243,"name":"string","nodeType":"ElementaryTypeName","src":"1548:6:330","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35247,"mutability":"mutable","name":"metadataResolver","nameLocation":"1606:16:330","nodeType":"VariableDeclaration","scope":35272,"src":"1583:39:330","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35246,"nodeType":"UserDefinedTypeName","pathNode":{"id":35245,"name":"ITokenMetadataResolver","nameLocations":["1583:22:330"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1583:22:330"},"referencedDeclaration":36704,"src":"1583:22:330","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35250,"mutability":"mutable","name":"filterRegistry","nameLocation":"1656:14:330","nodeType":"VariableDeclaration","scope":35272,"src":"1632:38:330","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35249,"nodeType":"UserDefinedTypeName","pathNode":{"id":35248,"name":"IOperatorFilterRegistry","nameLocations":["1632:23:330"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1632:23:330"},"referencedDeclaration":37474,"src":"1632:23:330","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"},{"constant":false,"id":35253,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1699:17:330","nodeType":"VariableDeclaration","scope":35272,"src":"1680:36:330","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35252,"nodeType":"UserDefinedTypeName","pathNode":{"id":35251,"name":"IForwarderRegistry","nameLocations":["1680:18:330"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1680:18:330"},"referencedDeclaration":13386,"src":"1680:18:330","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1505:217:330"},"returnParameters":{"id":35270,"nodeType":"ParameterList","parameters":[],"src":"1933:0:330"},"scope":35301,"src":"1494:441:330","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[1188,13231],"body":{"id":35285,"nodeType":"Block","src":"2100:65:330","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35281,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2117:28:330","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35282,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2146:10:330","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2117:39:330","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2117:41:330","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35280,"id":35284,"nodeType":"Return","src":"2110:48:330"}]},"documentation":{"id":35273,"nodeType":"StructuredDocumentation","src":"1941:44:330","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35286,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1999:10:330","nodeType":"FunctionDefinition","overrides":{"id":35277,"nodeType":"OverrideSpecifier","overrides":[{"id":35275,"name":"Context","nameLocations":["2043:7:330"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2043:7:330"},{"id":35276,"name":"ForwarderRegistryContextBase","nameLocations":["2052:28:330"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2052:28:330"}],"src":"2034:47:330"},"parameters":{"id":35274,"nodeType":"ParameterList","parameters":[],"src":"2009:2:330"},"returnParameters":{"id":35280,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35279,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35286,"src":"2091:7:330","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35278,"name":"address","nodeType":"ElementaryTypeName","src":"2091:7:330","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2090:9:330"},"scope":35301,"src":"1990:175:330","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35299,"nodeType":"Block","src":"2335:63:330","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35295,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2352:28:330","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35296,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2381:8:330","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2352:37:330","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35297,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2352:39:330","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35294,"id":35298,"nodeType":"Return","src":"2345:46:330"}]},"documentation":{"id":35287,"nodeType":"StructuredDocumentation","src":"2171:44:330","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35300,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2229:8:330","nodeType":"FunctionDefinition","overrides":{"id":35291,"nodeType":"OverrideSpecifier","overrides":[{"id":35289,"name":"Context","nameLocations":["2271:7:330"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2271:7:330"},{"id":35290,"name":"ForwarderRegistryContextBase","nameLocations":["2280:28:330"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2280:28:330"}],"src":"2262:47:330"},"parameters":{"id":35288,"nodeType":"ParameterList","parameters":[],"src":"2237:2:330"},"returnParameters":{"id":35294,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35293,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35300,"src":"2319:14:330","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35292,"name":"bytes","nodeType":"ElementaryTypeName","src":"2319:5:330","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2318:16:330"},"scope":35301,"src":"2220:178:330","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35302,"src":"1224:1176:330","usedErrors":[464,1216,1219,7886,8223,8246,11559,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,32174,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:2369:330"},"id":330},"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC2981Base":[37012],"ERC2981Storage":[37657],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721BurnableBase":[31389],"ERC721DeliverableBase":[31446],"ERC721FullBurnProxied":[35502],"ERC721MetadataBase":[31583],"ERC721MintableBase":[31700],"ERC721Storage":[34972],"ERC721WithOperatorFiltererBase":[32102],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"InterfaceDetection":[11554],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870],"TokenMetadataStorage":[36891],"TokenRecoveryBase":[19810]},"id":35503,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35303,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:331"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":35305,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":13387,"src":"57:90:331","symbolAliases":[{"foreign":{"id":35304,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../metadata/interfaces/ITokenMetadataResolver.sol","id":35307,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":36705,"src":"148:97:331","symbolAliases":[{"foreign":{"id":35306,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"156:22:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../royalty/interfaces/IOperatorFilterRegistry.sol","id":35309,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":37475,"src":"246:98:331","symbolAliases":[{"foreign":{"id":35308,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"254:23:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../../libraries/ERC721Storage.sol","id":35311,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":34973,"src":"345:66:331","symbolAliases":[{"foreign":{"id":35310,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"353:13:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../../../royalty/libraries/ERC2981Storage.sol","id":35313,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":37658,"src":"412:79:331","symbolAliases":[{"foreign":{"id":35312,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"420:14:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../../metadata/libraries/TokenMetadataStorage.sol","id":35315,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":36892,"src":"492:92:331","symbolAliases":[{"foreign":{"id":35314,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"500:20:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../../royalty/libraries/OperatorFiltererStorage.sol","id":35317,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":37871,"src":"585:97:331","symbolAliases":[{"foreign":{"id":35316,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"593:23:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":35319,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":9110,"src":"683:101:331","symbolAliases":[{"foreign":{"id":35318,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"691:24:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","file":"./../../base/ERC721WithOperatorFiltererBase.sol","id":35321,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":32103,"src":"785:95:331","symbolAliases":[{"foreign":{"id":35320,"name":"ERC721WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32102,"src":"793:30:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","file":"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol","id":35323,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":31331,"src":"881:121:331","symbolAliases":[{"foreign":{"id":35322,"name":"ERC721BatchTransferWithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31330,"src":"889:43:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","file":"./../../base/ERC721MetadataBase.sol","id":35325,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":31584,"src":"1003:71:331","symbolAliases":[{"foreign":{"id":35324,"name":"ERC721MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31583,"src":"1011:18:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","file":"./../../base/ERC721MintableBase.sol","id":35327,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":31701,"src":"1075:71:331","symbolAliases":[{"foreign":{"id":35326,"name":"ERC721MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31700,"src":"1083:18:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableBase.sol","file":"./../../base/ERC721DeliverableBase.sol","id":35329,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":31447,"src":"1147:77:331","symbolAliases":[{"foreign":{"id":35328,"name":"ERC721DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31446,"src":"1155:21:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BurnableBase.sol","file":"./../../base/ERC721BurnableBase.sol","id":35331,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":31390,"src":"1225:71:331","symbolAliases":[{"foreign":{"id":35330,"name":"ERC721BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31389,"src":"1233:18:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../../../royalty/base/ERC2981Base.sol","id":35333,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":37013,"src":"1297:68:331","symbolAliases":[{"foreign":{"id":35332,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"1305:11:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../../../royalty/base/OperatorFiltererBase.sol","id":35335,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":37074,"src":"1366:86:331","symbolAliases":[{"foreign":{"id":35334,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"1374:20:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":35337,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":8140,"src":"1453:90:331","symbolAliases":[{"foreign":{"id":35336,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1461:21:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":35339,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":8092,"src":"1544:82:331","symbolAliases":[{"foreign":{"id":35338,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1552:17:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":35341,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":19811,"src":"1627:84:331","symbolAliases":[{"foreign":{"id":35340,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1635:17:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":35343,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":11555,"src":"1712:86:331","symbolAliases":[{"foreign":{"id":35342,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1720:18:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":35345,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":1207,"src":"1799:66:331","symbolAliases":[{"foreign":{"id":35344,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1807:7:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":35347,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":13298,"src":"1866:104:331","symbolAliases":[{"foreign":{"id":35346,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1874:28:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":35349,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35503,"sourceUnit":13143,"src":"1971:91:331","symbolAliases":[{"foreign":{"id":35348,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1979:24:331","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35350,"name":"ERC721WithOperatorFiltererBase","nameLocations":["2102:30:331"],"nodeType":"IdentifierPath","referencedDeclaration":32102,"src":"2102:30:331"},"id":35351,"nodeType":"InheritanceSpecifier","src":"2102:30:331"},{"baseName":{"id":35352,"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocations":["2138:43:331"],"nodeType":"IdentifierPath","referencedDeclaration":31330,"src":"2138:43:331"},"id":35353,"nodeType":"InheritanceSpecifier","src":"2138:43:331"},{"baseName":{"id":35354,"name":"ERC721MetadataBase","nameLocations":["2187:18:331"],"nodeType":"IdentifierPath","referencedDeclaration":31583,"src":"2187:18:331"},"id":35355,"nodeType":"InheritanceSpecifier","src":"2187:18:331"},{"baseName":{"id":35356,"name":"ERC721MintableBase","nameLocations":["2211:18:331"],"nodeType":"IdentifierPath","referencedDeclaration":31700,"src":"2211:18:331"},"id":35357,"nodeType":"InheritanceSpecifier","src":"2211:18:331"},{"baseName":{"id":35358,"name":"ERC721DeliverableBase","nameLocations":["2235:21:331"],"nodeType":"IdentifierPath","referencedDeclaration":31446,"src":"2235:21:331"},"id":35359,"nodeType":"InheritanceSpecifier","src":"2235:21:331"},{"baseName":{"id":35360,"name":"ERC721BurnableBase","nameLocations":["2262:18:331"],"nodeType":"IdentifierPath","referencedDeclaration":31389,"src":"2262:18:331"},"id":35361,"nodeType":"InheritanceSpecifier","src":"2262:18:331"},{"baseName":{"id":35362,"name":"ERC2981Base","nameLocations":["2286:11:331"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"2286:11:331"},"id":35363,"nodeType":"InheritanceSpecifier","src":"2286:11:331"},{"baseName":{"id":35364,"name":"OperatorFiltererBase","nameLocations":["2303:20:331"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"2303:20:331"},"id":35365,"nodeType":"InheritanceSpecifier","src":"2303:20:331"},{"baseName":{"id":35366,"name":"ContractOwnershipBase","nameLocations":["2329:21:331"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2329:21:331"},"id":35367,"nodeType":"InheritanceSpecifier","src":"2329:21:331"},{"baseName":{"id":35368,"name":"AccessControlBase","nameLocations":["2356:17:331"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2356:17:331"},"id":35369,"nodeType":"InheritanceSpecifier","src":"2356:17:331"},{"baseName":{"id":35370,"name":"TokenRecoveryBase","nameLocations":["2379:17:331"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2379:17:331"},"id":35371,"nodeType":"InheritanceSpecifier","src":"2379:17:331"},{"baseName":{"id":35372,"name":"InterfaceDetection","nameLocations":["2402:18:331"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2402:18:331"},"id":35373,"nodeType":"InheritanceSpecifier","src":"2402:18:331"},{"baseName":{"id":35374,"name":"ForwarderRegistryContext","nameLocations":["2426:24:331"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2426:24:331"},"id":35375,"nodeType":"InheritanceSpecifier","src":"2426:24:331"}],"canonicalName":"ERC721FullBurnProxied","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35502,"linearizedBaseContracts":[35502,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31389,31446,31700,31583,33168,36683,31330,32102,1206,19938,8546,8562,33130,33144,33199,33109,33094],"name":"ERC721FullBurnProxied","nameLocation":"2073:21:331","nodeType":"ContractDefinition","nodes":[{"global":false,"id":35379,"libraryName":{"id":35376,"name":"ContractOwnershipStorage","nameLocations":["2463:24:331"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2463:24:331"},"nodeType":"UsingForDirective","src":"2457:67:331","typeName":{"id":35378,"nodeType":"UserDefinedTypeName","pathNode":{"id":35377,"name":"ContractOwnershipStorage.Layout","nameLocations":["2492:24:331","2517:6:331"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2492:31:331"},"referencedDeclaration":8882,"src":"2492:31:331","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":35383,"libraryName":{"id":35380,"name":"TokenMetadataStorage","nameLocations":["2535:20:331"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"2535:20:331"},"nodeType":"UsingForDirective","src":"2529:59:331","typeName":{"id":35382,"nodeType":"UserDefinedTypeName","pathNode":{"id":35381,"name":"TokenMetadataStorage.Layout","nameLocations":["2560:20:331","2581:6:331"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2560:27:331"},"referencedDeclaration":36718,"src":"2560:27:331","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"global":false,"id":35387,"libraryName":{"id":35384,"name":"OperatorFiltererStorage","nameLocations":["2599:23:331"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"2599:23:331"},"nodeType":"UsingForDirective","src":"2593:65:331","typeName":{"id":35386,"nodeType":"UserDefinedTypeName","pathNode":{"id":35385,"name":"OperatorFiltererStorage.Layout","nameLocations":["2627:23:331","2651:6:331"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2627:30:331"},"referencedDeclaration":37673,"src":"2627:30:331","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":35396,"nodeType":"Block","src":"2758:2:331","statements":[]},"id":35397,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":35393,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35390,"src":"2739:17:331","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35394,"kind":"baseConstructorSpecifier","modifierName":{"id":35392,"name":"ForwarderRegistryContext","nameLocations":["2714:24:331"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2714:24:331"},"nodeType":"ModifierInvocation","src":"2714:43:331"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35391,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35390,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2695:17:331","nodeType":"VariableDeclaration","scope":35397,"src":"2676:36:331","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35389,"nodeType":"UserDefinedTypeName","pathNode":{"id":35388,"name":"IForwarderRegistry","nameLocations":["2676:18:331"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2676:18:331"},"referencedDeclaration":13386,"src":"2676:18:331","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2675:38:331"},"returnParameters":{"id":35395,"nodeType":"ParameterList","parameters":[],"src":"2758:0:331"},"scope":35502,"src":"2664:96:331","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":35472,"nodeType":"Block","src":"2964:522:331","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":35415,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[35487],"referencedDeclaration":35487,"src":"3018:10:331","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35416,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3018:12:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35410,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2974:24:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":35412,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2999:6:331","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2974:31:331","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":35413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2974:33:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":35414,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3008:9:331","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2974:43:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":35417,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2974:57:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35418,"nodeType":"ExpressionStatement","src":"2974:57:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35419,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3041:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35421,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3055:4:331","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"3041:18:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35422,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3041:20:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35423,"nodeType":"ExpressionStatement","src":"3041:20:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35424,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3071:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35426,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3085:23:331","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"3071:37:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3071:39:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35428,"nodeType":"ExpressionStatement","src":"3071:39:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35429,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3120:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3134:18:331","memberName":"initERC721Metadata","nodeType":"MemberAccess","referencedDeclaration":33365,"src":"3120:32:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35432,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3120:34:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35433,"nodeType":"ExpressionStatement","src":"3120:34:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35434,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3164:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3178:18:331","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"3164:32:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3164:34:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35438,"nodeType":"ExpressionStatement","src":"3164:34:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35439,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3208:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3222:21:331","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"3208:35:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3208:37:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35443,"nodeType":"ExpressionStatement","src":"3208:37:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35444,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3255:13:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3269:18:331","memberName":"initERC721Burnable","nodeType":"MemberAccess","referencedDeclaration":33416,"src":"3255:32:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3255:34:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35448,"nodeType":"ExpressionStatement","src":"3255:34:331"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35449,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"3299:14:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":35451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3314:4:331","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"3299:19:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35452,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3299:21:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35453,"nodeType":"ExpressionStatement","src":"3299:21:331"},{"expression":{"arguments":[{"id":35459,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35399,"src":"3370:9:331","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35460,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35401,"src":"3381:11:331","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35461,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35404,"src":"3394:16:331","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35454,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"3330:20:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":35456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3351:6:331","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"3330:27:331","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":35457,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3330:29:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":35458,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3360:9:331","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"3330:39:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":35462,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3330:81:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35463,"nodeType":"ExpressionStatement","src":"3330:81:331"},{"expression":{"arguments":[{"id":35469,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35407,"src":"3464:14:331","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35464,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"3421:23:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":35466,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3445:6:331","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"3421:30:331","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":35467,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3421:32:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":35468,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3454:9:331","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"3421:42:331","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":35470,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3421:58:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35471,"nodeType":"ExpressionStatement","src":"3421:58:331"}]},"functionSelector":"0e07f854","id":35473,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2775:4:331","nodeType":"FunctionDefinition","parameters":{"id":35408,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35399,"mutability":"mutable","name":"tokenName","nameLocation":"2805:9:331","nodeType":"VariableDeclaration","scope":35473,"src":"2789:25:331","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35398,"name":"string","nodeType":"ElementaryTypeName","src":"2789:6:331","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35401,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2840:11:331","nodeType":"VariableDeclaration","scope":35473,"src":"2824:27:331","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35400,"name":"string","nodeType":"ElementaryTypeName","src":"2824:6:331","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35404,"mutability":"mutable","name":"metadataResolver","nameLocation":"2884:16:331","nodeType":"VariableDeclaration","scope":35473,"src":"2861:39:331","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35403,"nodeType":"UserDefinedTypeName","pathNode":{"id":35402,"name":"ITokenMetadataResolver","nameLocations":["2861:22:331"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2861:22:331"},"referencedDeclaration":36704,"src":"2861:22:331","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35407,"mutability":"mutable","name":"filterRegistry","nameLocation":"2934:14:331","nodeType":"VariableDeclaration","scope":35473,"src":"2910:38:331","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35406,"nodeType":"UserDefinedTypeName","pathNode":{"id":35405,"name":"IOperatorFilterRegistry","nameLocations":["2910:23:331"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2910:23:331"},"referencedDeclaration":37474,"src":"2910:23:331","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2779:175:331"},"returnParameters":{"id":35409,"nodeType":"ParameterList","parameters":[],"src":"2964:0:331"},"scope":35502,"src":"2766:720:331","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":35486,"nodeType":"Block","src":"3651:65:331","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35482,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3668:28:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3697:10:331","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3668:39:331","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3668:41:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35481,"id":35485,"nodeType":"Return","src":"3661:48:331"}]},"documentation":{"id":35474,"nodeType":"StructuredDocumentation","src":"3492:44:331","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35487,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3550:10:331","nodeType":"FunctionDefinition","overrides":{"id":35478,"nodeType":"OverrideSpecifier","overrides":[{"id":35476,"name":"Context","nameLocations":["3594:7:331"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3594:7:331"},{"id":35477,"name":"ForwarderRegistryContextBase","nameLocations":["3603:28:331"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3603:28:331"}],"src":"3585:47:331"},"parameters":{"id":35475,"nodeType":"ParameterList","parameters":[],"src":"3560:2:331"},"returnParameters":{"id":35481,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35480,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35487,"src":"3642:7:331","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35479,"name":"address","nodeType":"ElementaryTypeName","src":"3642:7:331","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3641:9:331"},"scope":35502,"src":"3541:175:331","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35500,"nodeType":"Block","src":"3886:63:331","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35496,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3903:28:331","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3932:8:331","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3903:37:331","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35498,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3903:39:331","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35495,"id":35499,"nodeType":"Return","src":"3896:46:331"}]},"documentation":{"id":35488,"nodeType":"StructuredDocumentation","src":"3722:44:331","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35501,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3780:8:331","nodeType":"FunctionDefinition","overrides":{"id":35492,"nodeType":"OverrideSpecifier","overrides":[{"id":35490,"name":"Context","nameLocations":["3822:7:331"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3822:7:331"},{"id":35491,"name":"ForwarderRegistryContextBase","nameLocations":["3831:28:331"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3831:28:331"}],"src":"3813:47:331"},"parameters":{"id":35489,"nodeType":"ParameterList","parameters":[],"src":"3788:2:331"},"returnParameters":{"id":35495,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35494,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35501,"src":"3870:14:331","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35493,"name":"bytes","nodeType":"ElementaryTypeName","src":"3870:5:331","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3869:16:331"},"scope":35502,"src":"3771:178:331","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35503,"src":"2064:1887:331","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:3920:331"},"id":331},"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC2981Base":[37012],"ERC2981Storage":[37657],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721BurnableBase":[31389],"ERC721DeliverableOnceBase":[31503],"ERC721FullMintOnceBurnProxied":[35703],"ERC721MetadataBase":[31583],"ERC721MintableOnceBase":[31833],"ERC721Storage":[34972],"ERC721WithOperatorFiltererBase":[32102],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"InterfaceDetection":[11554],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870],"TokenMetadataStorage":[36891],"TokenRecoveryBase":[19810]},"id":35704,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35504,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:332"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":35506,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":13387,"src":"57:90:332","symbolAliases":[{"foreign":{"id":35505,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../metadata/interfaces/ITokenMetadataResolver.sol","id":35508,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":36705,"src":"148:97:332","symbolAliases":[{"foreign":{"id":35507,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"156:22:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../royalty/interfaces/IOperatorFilterRegistry.sol","id":35510,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":37475,"src":"246:98:332","symbolAliases":[{"foreign":{"id":35509,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"254:23:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../../libraries/ERC721Storage.sol","id":35512,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":34973,"src":"345:66:332","symbolAliases":[{"foreign":{"id":35511,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"353:13:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../../../royalty/libraries/ERC2981Storage.sol","id":35514,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":37658,"src":"412:79:332","symbolAliases":[{"foreign":{"id":35513,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"420:14:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../../metadata/libraries/TokenMetadataStorage.sol","id":35516,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":36892,"src":"492:92:332","symbolAliases":[{"foreign":{"id":35515,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"500:20:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../../royalty/libraries/OperatorFiltererStorage.sol","id":35518,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":37871,"src":"585:97:332","symbolAliases":[{"foreign":{"id":35517,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"593:23:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":35520,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":9110,"src":"683:101:332","symbolAliases":[{"foreign":{"id":35519,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"691:24:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","file":"./../../base/ERC721WithOperatorFiltererBase.sol","id":35522,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":32103,"src":"785:95:332","symbolAliases":[{"foreign":{"id":35521,"name":"ERC721WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32102,"src":"793:30:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","file":"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol","id":35524,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":31331,"src":"881:121:332","symbolAliases":[{"foreign":{"id":35523,"name":"ERC721BatchTransferWithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31330,"src":"889:43:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","file":"./../../base/ERC721MetadataBase.sol","id":35526,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":31584,"src":"1003:71:332","symbolAliases":[{"foreign":{"id":35525,"name":"ERC721MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31583,"src":"1011:18:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableOnceBase.sol","file":"./../../base/ERC721MintableOnceBase.sol","id":35528,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":31834,"src":"1075:79:332","symbolAliases":[{"foreign":{"id":35527,"name":"ERC721MintableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31833,"src":"1083:22:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol","file":"./../../base/ERC721DeliverableOnceBase.sol","id":35530,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":31504,"src":"1155:85:332","symbolAliases":[{"foreign":{"id":35529,"name":"ERC721DeliverableOnceBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31503,"src":"1163:25:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BurnableBase.sol","file":"./../../base/ERC721BurnableBase.sol","id":35532,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":31390,"src":"1241:71:332","symbolAliases":[{"foreign":{"id":35531,"name":"ERC721BurnableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31389,"src":"1249:18:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../../../royalty/base/ERC2981Base.sol","id":35534,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":37013,"src":"1313:68:332","symbolAliases":[{"foreign":{"id":35533,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"1321:11:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../../../royalty/base/OperatorFiltererBase.sol","id":35536,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":37074,"src":"1382:86:332","symbolAliases":[{"foreign":{"id":35535,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"1390:20:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":35538,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":8140,"src":"1469:90:332","symbolAliases":[{"foreign":{"id":35537,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1477:21:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":35540,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":8092,"src":"1560:82:332","symbolAliases":[{"foreign":{"id":35539,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1568:17:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":35542,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":19811,"src":"1643:84:332","symbolAliases":[{"foreign":{"id":35541,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1651:17:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":35544,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":11555,"src":"1728:86:332","symbolAliases":[{"foreign":{"id":35543,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1736:18:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":35546,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":1207,"src":"1815:66:332","symbolAliases":[{"foreign":{"id":35545,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1823:7:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":35548,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":13298,"src":"1882:104:332","symbolAliases":[{"foreign":{"id":35547,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1890:28:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":35550,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35704,"sourceUnit":13143,"src":"1987:91:332","symbolAliases":[{"foreign":{"id":35549,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1995:24:332","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35551,"name":"ERC721WithOperatorFiltererBase","nameLocations":["2126:30:332"],"nodeType":"IdentifierPath","referencedDeclaration":32102,"src":"2126:30:332"},"id":35552,"nodeType":"InheritanceSpecifier","src":"2126:30:332"},{"baseName":{"id":35553,"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocations":["2162:43:332"],"nodeType":"IdentifierPath","referencedDeclaration":31330,"src":"2162:43:332"},"id":35554,"nodeType":"InheritanceSpecifier","src":"2162:43:332"},{"baseName":{"id":35555,"name":"ERC721MetadataBase","nameLocations":["2211:18:332"],"nodeType":"IdentifierPath","referencedDeclaration":31583,"src":"2211:18:332"},"id":35556,"nodeType":"InheritanceSpecifier","src":"2211:18:332"},{"baseName":{"id":35557,"name":"ERC721MintableOnceBase","nameLocations":["2235:22:332"],"nodeType":"IdentifierPath","referencedDeclaration":31833,"src":"2235:22:332"},"id":35558,"nodeType":"InheritanceSpecifier","src":"2235:22:332"},{"baseName":{"id":35559,"name":"ERC721DeliverableOnceBase","nameLocations":["2263:25:332"],"nodeType":"IdentifierPath","referencedDeclaration":31503,"src":"2263:25:332"},"id":35560,"nodeType":"InheritanceSpecifier","src":"2263:25:332"},{"baseName":{"id":35561,"name":"ERC721BurnableBase","nameLocations":["2294:18:332"],"nodeType":"IdentifierPath","referencedDeclaration":31389,"src":"2294:18:332"},"id":35562,"nodeType":"InheritanceSpecifier","src":"2294:18:332"},{"baseName":{"id":35563,"name":"ERC2981Base","nameLocations":["2318:11:332"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"2318:11:332"},"id":35564,"nodeType":"InheritanceSpecifier","src":"2318:11:332"},{"baseName":{"id":35565,"name":"OperatorFiltererBase","nameLocations":["2335:20:332"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"2335:20:332"},"id":35566,"nodeType":"InheritanceSpecifier","src":"2335:20:332"},{"baseName":{"id":35567,"name":"ContractOwnershipBase","nameLocations":["2361:21:332"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2361:21:332"},"id":35568,"nodeType":"InheritanceSpecifier","src":"2361:21:332"},{"baseName":{"id":35569,"name":"AccessControlBase","nameLocations":["2388:17:332"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2388:17:332"},"id":35570,"nodeType":"InheritanceSpecifier","src":"2388:17:332"},{"baseName":{"id":35571,"name":"TokenRecoveryBase","nameLocations":["2411:17:332"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2411:17:332"},"id":35572,"nodeType":"InheritanceSpecifier","src":"2411:17:332"},{"baseName":{"id":35573,"name":"InterfaceDetection","nameLocations":["2434:18:332"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2434:18:332"},"id":35574,"nodeType":"InheritanceSpecifier","src":"2434:18:332"},{"baseName":{"id":35575,"name":"ForwarderRegistryContext","nameLocations":["2458:24:332"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2458:24:332"},"id":35576,"nodeType":"InheritanceSpecifier","src":"2458:24:332"}],"canonicalName":"ERC721FullMintOnceBurnProxied","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35703,"linearizedBaseContracts":[35703,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31389,31503,31833,31583,33168,36683,31330,32102,1206,19938,8546,8562,33130,33144,33199,33109,33094],"name":"ERC721FullMintOnceBurnProxied","nameLocation":"2089:29:332","nodeType":"ContractDefinition","nodes":[{"global":false,"id":35580,"libraryName":{"id":35577,"name":"ContractOwnershipStorage","nameLocations":["2495:24:332"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2495:24:332"},"nodeType":"UsingForDirective","src":"2489:67:332","typeName":{"id":35579,"nodeType":"UserDefinedTypeName","pathNode":{"id":35578,"name":"ContractOwnershipStorage.Layout","nameLocations":["2524:24:332","2549:6:332"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2524:31:332"},"referencedDeclaration":8882,"src":"2524:31:332","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"global":false,"id":35584,"libraryName":{"id":35581,"name":"TokenMetadataStorage","nameLocations":["2567:20:332"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"2567:20:332"},"nodeType":"UsingForDirective","src":"2561:59:332","typeName":{"id":35583,"nodeType":"UserDefinedTypeName","pathNode":{"id":35582,"name":"TokenMetadataStorage.Layout","nameLocations":["2592:20:332","2613:6:332"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2592:27:332"},"referencedDeclaration":36718,"src":"2592:27:332","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"global":false,"id":35588,"libraryName":{"id":35585,"name":"OperatorFiltererStorage","nameLocations":["2631:23:332"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"2631:23:332"},"nodeType":"UsingForDirective","src":"2625:65:332","typeName":{"id":35587,"nodeType":"UserDefinedTypeName","pathNode":{"id":35586,"name":"OperatorFiltererStorage.Layout","nameLocations":["2659:23:332","2683:6:332"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2659:30:332"},"referencedDeclaration":37673,"src":"2659:30:332","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":35597,"nodeType":"Block","src":"2790:2:332","statements":[]},"id":35598,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":35594,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35591,"src":"2771:17:332","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35595,"kind":"baseConstructorSpecifier","modifierName":{"id":35593,"name":"ForwarderRegistryContext","nameLocations":["2746:24:332"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2746:24:332"},"nodeType":"ModifierInvocation","src":"2746:43:332"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35592,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35591,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2727:17:332","nodeType":"VariableDeclaration","scope":35598,"src":"2708:36:332","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35590,"nodeType":"UserDefinedTypeName","pathNode":{"id":35589,"name":"IForwarderRegistry","nameLocations":["2708:18:332"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2708:18:332"},"referencedDeclaration":13386,"src":"2708:18:332","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2707:38:332"},"returnParameters":{"id":35596,"nodeType":"ParameterList","parameters":[],"src":"2790:0:332"},"scope":35703,"src":"2696:96:332","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":35673,"nodeType":"Block","src":"2996:522:332","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":35616,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[35688],"referencedDeclaration":35688,"src":"3050:10:332","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3050:12:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35611,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"3006:24:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":35613,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3031:6:332","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"3006:31:332","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":35614,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3006:33:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":35615,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3040:9:332","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"3006:43:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":35618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3006:57:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35619,"nodeType":"ExpressionStatement","src":"3006:57:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35620,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3073:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35622,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3087:4:332","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"3073:18:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35623,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3073:20:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35624,"nodeType":"ExpressionStatement","src":"3073:20:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35625,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3103:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3117:23:332","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"3103:37:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35628,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3103:39:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35629,"nodeType":"ExpressionStatement","src":"3103:39:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35630,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3152:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35632,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3166:18:332","memberName":"initERC721Metadata","nodeType":"MemberAccess","referencedDeclaration":33365,"src":"3152:32:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35633,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3152:34:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35634,"nodeType":"ExpressionStatement","src":"3152:34:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35635,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3196:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3210:18:332","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"3196:32:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3196:34:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35639,"nodeType":"ExpressionStatement","src":"3196:34:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35640,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3240:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35642,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3254:21:332","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"3240:35:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35643,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3240:37:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35644,"nodeType":"ExpressionStatement","src":"3240:37:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35645,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3287:13:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35647,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3301:18:332","memberName":"initERC721Burnable","nodeType":"MemberAccess","referencedDeclaration":33416,"src":"3287:32:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35648,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3287:34:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35649,"nodeType":"ExpressionStatement","src":"3287:34:332"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35650,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"3331:14:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":35652,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3346:4:332","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"3331:19:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35653,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3331:21:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35654,"nodeType":"ExpressionStatement","src":"3331:21:332"},{"expression":{"arguments":[{"id":35660,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35600,"src":"3402:9:332","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35661,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35602,"src":"3413:11:332","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35662,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35605,"src":"3426:16:332","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35655,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"3362:20:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":35657,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3383:6:332","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"3362:27:332","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":35658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3362:29:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":35659,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3392:9:332","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"3362:39:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":35663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3362:81:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35664,"nodeType":"ExpressionStatement","src":"3362:81:332"},{"expression":{"arguments":[{"id":35670,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35608,"src":"3496:14:332","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35665,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"3453:23:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":35667,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3477:6:332","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"3453:30:332","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":35668,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3453:32:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":35669,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3486:9:332","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"3453:42:332","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":35671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3453:58:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35672,"nodeType":"ExpressionStatement","src":"3453:58:332"}]},"functionSelector":"0e07f854","id":35674,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2807:4:332","nodeType":"FunctionDefinition","parameters":{"id":35609,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35600,"mutability":"mutable","name":"tokenName","nameLocation":"2837:9:332","nodeType":"VariableDeclaration","scope":35674,"src":"2821:25:332","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35599,"name":"string","nodeType":"ElementaryTypeName","src":"2821:6:332","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35602,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2872:11:332","nodeType":"VariableDeclaration","scope":35674,"src":"2856:27:332","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35601,"name":"string","nodeType":"ElementaryTypeName","src":"2856:6:332","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35605,"mutability":"mutable","name":"metadataResolver","nameLocation":"2916:16:332","nodeType":"VariableDeclaration","scope":35674,"src":"2893:39:332","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35604,"nodeType":"UserDefinedTypeName","pathNode":{"id":35603,"name":"ITokenMetadataResolver","nameLocations":["2893:22:332"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2893:22:332"},"referencedDeclaration":36704,"src":"2893:22:332","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35608,"mutability":"mutable","name":"filterRegistry","nameLocation":"2966:14:332","nodeType":"VariableDeclaration","scope":35674,"src":"2942:38:332","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35607,"nodeType":"UserDefinedTypeName","pathNode":{"id":35606,"name":"IOperatorFilterRegistry","nameLocations":["2942:23:332"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2942:23:332"},"referencedDeclaration":37474,"src":"2942:23:332","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2811:175:332"},"returnParameters":{"id":35610,"nodeType":"ParameterList","parameters":[],"src":"2996:0:332"},"scope":35703,"src":"2798:720:332","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":35687,"nodeType":"Block","src":"3683:65:332","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35683,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3700:28:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3729:10:332","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3700:39:332","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35685,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3700:41:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35682,"id":35686,"nodeType":"Return","src":"3693:48:332"}]},"documentation":{"id":35675,"nodeType":"StructuredDocumentation","src":"3524:44:332","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35688,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3582:10:332","nodeType":"FunctionDefinition","overrides":{"id":35679,"nodeType":"OverrideSpecifier","overrides":[{"id":35677,"name":"Context","nameLocations":["3626:7:332"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3626:7:332"},{"id":35678,"name":"ForwarderRegistryContextBase","nameLocations":["3635:28:332"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3635:28:332"}],"src":"3617:47:332"},"parameters":{"id":35676,"nodeType":"ParameterList","parameters":[],"src":"3592:2:332"},"returnParameters":{"id":35682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35681,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35688,"src":"3674:7:332","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35680,"name":"address","nodeType":"ElementaryTypeName","src":"3674:7:332","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3673:9:332"},"scope":35703,"src":"3573:175:332","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35701,"nodeType":"Block","src":"3918:63:332","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35697,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3935:28:332","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35698,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3964:8:332","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3935:37:332","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35699,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3935:39:332","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35696,"id":35700,"nodeType":"Return","src":"3928:46:332"}]},"documentation":{"id":35689,"nodeType":"StructuredDocumentation","src":"3754:44:332","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35702,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3812:8:332","nodeType":"FunctionDefinition","overrides":{"id":35693,"nodeType":"OverrideSpecifier","overrides":[{"id":35691,"name":"Context","nameLocations":["3854:7:332"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3854:7:332"},{"id":35692,"name":"ForwarderRegistryContextBase","nameLocations":["3863:28:332"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3863:28:332"}],"src":"3845:47:332"},"parameters":{"id":35690,"nodeType":"ParameterList","parameters":[],"src":"3820:2:332"},"returnParameters":{"id":35696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35695,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35702,"src":"3902:14:332","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35694,"name":"bytes","nodeType":"ElementaryTypeName","src":"3902:5:332","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3901:16:332"},"scope":35703,"src":"3803:178:332","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35704,"src":"2080:1903:332","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,32174,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:3952:332"},"id":332},"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol":{"ast":{"absolutePath":"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol","exportedSymbols":{"AccessControlBase":[8091],"Context":[1206],"ContractOwnershipBase":[8139],"ContractOwnershipStorage":[9109],"ERC2981Base":[37012],"ERC2981Storage":[37657],"ERC721BatchTransferWithOperatorFiltererBase":[31330],"ERC721DeliverableBase":[31446],"ERC721FullProxied":[35895],"ERC721MetadataBase":[31583],"ERC721MintableBase":[31700],"ERC721Storage":[34972],"ERC721WithOperatorFiltererBase":[32102],"ForwarderRegistryContext":[13142],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"ITokenMetadataResolver":[36704],"InterfaceDetection":[11554],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870],"TokenMetadataStorage":[36891],"TokenRecoveryBase":[19810]},"id":35896,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35705,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:333"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../../metatx/interfaces/IForwarderRegistry.sol","id":35707,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":13387,"src":"57:90:333","symbolAliases":[{"foreign":{"id":35706,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../../../metadata/interfaces/ITokenMetadataResolver.sol","id":35709,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":36705,"src":"148:97:333","symbolAliases":[{"foreign":{"id":35708,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"156:22:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../../../royalty/interfaces/IOperatorFilterRegistry.sol","id":35711,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":37475,"src":"246:98:333","symbolAliases":[{"foreign":{"id":35710,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"254:23:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/libraries/ERC721Storage.sol","file":"./../../libraries/ERC721Storage.sol","id":35713,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":34973,"src":"345:66:333","symbolAliases":[{"foreign":{"id":35712,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"353:13:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../../../royalty/libraries/ERC2981Storage.sol","id":35715,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":37658,"src":"412:79:333","symbolAliases":[{"foreign":{"id":35714,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"420:14:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../../../metadata/libraries/TokenMetadataStorage.sol","id":35717,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":36892,"src":"492:92:333","symbolAliases":[{"foreign":{"id":35716,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"500:20:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../../../royalty/libraries/OperatorFiltererStorage.sol","id":35719,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":37871,"src":"585:97:333","symbolAliases":[{"foreign":{"id":35718,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"593:23:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../../access/libraries/ContractOwnershipStorage.sol","id":35721,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":9110,"src":"683:101:333","symbolAliases":[{"foreign":{"id":35720,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"691:24:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol","file":"./../../base/ERC721WithOperatorFiltererBase.sol","id":35723,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":32103,"src":"785:95:333","symbolAliases":[{"foreign":{"id":35722,"name":"ERC721WithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":32102,"src":"793:30:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol","file":"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol","id":35725,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":31331,"src":"881:121:333","symbolAliases":[{"foreign":{"id":35724,"name":"ERC721BatchTransferWithOperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31330,"src":"889:43:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MetadataBase.sol","file":"./../../base/ERC721MetadataBase.sol","id":35727,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":31584,"src":"1003:71:333","symbolAliases":[{"foreign":{"id":35726,"name":"ERC721MetadataBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31583,"src":"1011:18:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721MintableBase.sol","file":"./../../base/ERC721MintableBase.sol","id":35729,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":31701,"src":"1075:71:333","symbolAliases":[{"foreign":{"id":35728,"name":"ERC721MintableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31700,"src":"1083:18:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/ERC721/base/ERC721DeliverableBase.sol","file":"./../../base/ERC721DeliverableBase.sol","id":35731,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":31447,"src":"1147:77:333","symbolAliases":[{"foreign":{"id":35730,"name":"ERC721DeliverableBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":31446,"src":"1155:21:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../../../royalty/base/ERC2981Base.sol","id":35733,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":37013,"src":"1225:68:333","symbolAliases":[{"foreign":{"id":35732,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"1233:11:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../../../royalty/base/OperatorFiltererBase.sol","id":35735,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":37074,"src":"1294:86:333","symbolAliases":[{"foreign":{"id":35734,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"1302:20:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/ContractOwnershipBase.sol","file":"./../../../../access/base/ContractOwnershipBase.sol","id":35737,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":8140,"src":"1381:90:333","symbolAliases":[{"foreign":{"id":35736,"name":"ContractOwnershipBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8139,"src":"1389:21:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/base/AccessControlBase.sol","file":"./../../../../access/base/AccessControlBase.sol","id":35739,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":8092,"src":"1472:82:333","symbolAliases":[{"foreign":{"id":35738,"name":"AccessControlBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8091,"src":"1480:17:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/security/base/TokenRecoveryBase.sol","file":"./../../../../security/base/TokenRecoveryBase.sol","id":35741,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":19811,"src":"1555:84:333","symbolAliases":[{"foreign":{"id":35740,"name":"TokenRecoveryBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19810,"src":"1563:17:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/InterfaceDetection.sol","file":"./../../../../introspection/InterfaceDetection.sol","id":35743,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":11555,"src":"1640:86:333","symbolAliases":[{"foreign":{"id":35742,"name":"InterfaceDetection","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11554,"src":"1648:18:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":35745,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":1207,"src":"1727:66:333","symbolAliases":[{"foreign":{"id":35744,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"1735:7:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../../metatx/base/ForwarderRegistryContextBase.sol","id":35747,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":13298,"src":"1794:104:333","symbolAliases":[{"foreign":{"id":35746,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1802:28:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/ForwarderRegistryContext.sol","file":"./../../../../metatx/ForwarderRegistryContext.sol","id":35749,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":35896,"sourceUnit":13143,"src":"1899:91:333","symbolAliases":[{"foreign":{"id":35748,"name":"ForwarderRegistryContext","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13142,"src":"1907:24:333","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35750,"name":"ERC721WithOperatorFiltererBase","nameLocations":["2026:30:333"],"nodeType":"IdentifierPath","referencedDeclaration":32102,"src":"2026:30:333"},"id":35751,"nodeType":"InheritanceSpecifier","src":"2026:30:333"},{"baseName":{"id":35752,"name":"ERC721BatchTransferWithOperatorFiltererBase","nameLocations":["2062:43:333"],"nodeType":"IdentifierPath","referencedDeclaration":31330,"src":"2062:43:333"},"id":35753,"nodeType":"InheritanceSpecifier","src":"2062:43:333"},{"baseName":{"id":35754,"name":"ERC721MetadataBase","nameLocations":["2111:18:333"],"nodeType":"IdentifierPath","referencedDeclaration":31583,"src":"2111:18:333"},"id":35755,"nodeType":"InheritanceSpecifier","src":"2111:18:333"},{"baseName":{"id":35756,"name":"ERC721MintableBase","nameLocations":["2135:18:333"],"nodeType":"IdentifierPath","referencedDeclaration":31700,"src":"2135:18:333"},"id":35757,"nodeType":"InheritanceSpecifier","src":"2135:18:333"},{"baseName":{"id":35758,"name":"ERC721DeliverableBase","nameLocations":["2159:21:333"],"nodeType":"IdentifierPath","referencedDeclaration":31446,"src":"2159:21:333"},"id":35759,"nodeType":"InheritanceSpecifier","src":"2159:21:333"},{"baseName":{"id":35760,"name":"ERC2981Base","nameLocations":["2186:11:333"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"2186:11:333"},"id":35761,"nodeType":"InheritanceSpecifier","src":"2186:11:333"},{"baseName":{"id":35762,"name":"OperatorFiltererBase","nameLocations":["2203:20:333"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"2203:20:333"},"id":35763,"nodeType":"InheritanceSpecifier","src":"2203:20:333"},{"baseName":{"id":35764,"name":"ContractOwnershipBase","nameLocations":["2229:21:333"],"nodeType":"IdentifierPath","referencedDeclaration":8139,"src":"2229:21:333"},"id":35765,"nodeType":"InheritanceSpecifier","src":"2229:21:333"},{"baseName":{"id":35766,"name":"AccessControlBase","nameLocations":["2256:17:333"],"nodeType":"IdentifierPath","referencedDeclaration":8091,"src":"2256:17:333"},"id":35767,"nodeType":"InheritanceSpecifier","src":"2256:17:333"},{"baseName":{"id":35768,"name":"TokenRecoveryBase","nameLocations":["2279:17:333"],"nodeType":"IdentifierPath","referencedDeclaration":19810,"src":"2279:17:333"},"id":35769,"nodeType":"InheritanceSpecifier","src":"2279:17:333"},{"baseName":{"id":35770,"name":"InterfaceDetection","nameLocations":["2302:18:333"],"nodeType":"IdentifierPath","referencedDeclaration":11554,"src":"2302:18:333"},"id":35771,"nodeType":"InheritanceSpecifier","src":"2302:18:333"},{"baseName":{"id":35772,"name":"ForwarderRegistryContext","nameLocations":["2326:24:333"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2326:24:333"},"id":35773,"nodeType":"InheritanceSpecifier","src":"2326:24:333"}],"canonicalName":"ERC721FullProxied","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":35895,"linearizedBaseContracts":[35895,13142,13370,13297,11554,11579,19810,8091,8139,37073,37012,37280,31446,31700,31583,33168,36683,31330,32102,1206,19938,8546,8562,33144,33199,33109,33094],"name":"ERC721FullProxied","nameLocation":"2001:17:333","nodeType":"ContractDefinition","nodes":[{"global":false,"id":35777,"libraryName":{"id":35774,"name":"TokenMetadataStorage","nameLocations":["2363:20:333"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"2363:20:333"},"nodeType":"UsingForDirective","src":"2357:59:333","typeName":{"id":35776,"nodeType":"UserDefinedTypeName","pathNode":{"id":35775,"name":"TokenMetadataStorage.Layout","nameLocations":["2388:20:333","2409:6:333"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2388:27:333"},"referencedDeclaration":36718,"src":"2388:27:333","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"global":false,"id":35781,"libraryName":{"id":35778,"name":"OperatorFiltererStorage","nameLocations":["2427:23:333"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"2427:23:333"},"nodeType":"UsingForDirective","src":"2421:65:333","typeName":{"id":35780,"nodeType":"UserDefinedTypeName","pathNode":{"id":35779,"name":"OperatorFiltererStorage.Layout","nameLocations":["2455:23:333","2479:6:333"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2455:30:333"},"referencedDeclaration":37673,"src":"2455:30:333","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"global":false,"id":35785,"libraryName":{"id":35782,"name":"ContractOwnershipStorage","nameLocations":["2497:24:333"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"2497:24:333"},"nodeType":"UsingForDirective","src":"2491:67:333","typeName":{"id":35784,"nodeType":"UserDefinedTypeName","pathNode":{"id":35783,"name":"ContractOwnershipStorage.Layout","nameLocations":["2526:24:333","2551:6:333"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"2526:31:333"},"referencedDeclaration":8882,"src":"2526:31:333","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":35794,"nodeType":"Block","src":"2658:2:333","statements":[]},"id":35795,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":35791,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35788,"src":"2639:17:333","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":35792,"kind":"baseConstructorSpecifier","modifierName":{"id":35790,"name":"ForwarderRegistryContext","nameLocations":["2614:24:333"],"nodeType":"IdentifierPath","referencedDeclaration":13142,"src":"2614:24:333"},"nodeType":"ModifierInvocation","src":"2614:43:333"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":35789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35788,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"2595:17:333","nodeType":"VariableDeclaration","scope":35795,"src":"2576:36:333","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":35787,"nodeType":"UserDefinedTypeName","pathNode":{"id":35786,"name":"IForwarderRegistry","nameLocations":["2576:18:333"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"2576:18:333"},"referencedDeclaration":13386,"src":"2576:18:333","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"2575:38:333"},"returnParameters":{"id":35793,"nodeType":"ParameterList","parameters":[],"src":"2658:0:333"},"scope":35895,"src":"2564:96:333","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":35865,"nodeType":"Block","src":"2864:478:333","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":35813,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[35880],"referencedDeclaration":35880,"src":"2918:10:333","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35814,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2918:12:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35808,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"2874:24:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":35810,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2899:6:333","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"2874:31:333","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":35811,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2874:33:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":35812,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2908:9:333","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":8975,"src":"2874:43:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address)"}},"id":35815,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2874:57:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35816,"nodeType":"ExpressionStatement","src":"2874:57:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35817,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2941:13:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35819,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2955:4:333","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":33331,"src":"2941:18:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35820,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2941:20:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35821,"nodeType":"ExpressionStatement","src":"2941:20:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35822,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"2971:13:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35824,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2985:23:333","memberName":"initERC721BatchTransfer","nodeType":"MemberAccess","referencedDeclaration":33348,"src":"2971:37:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35825,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2971:39:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35826,"nodeType":"ExpressionStatement","src":"2971:39:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35827,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3020:13:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3034:18:333","memberName":"initERC721Metadata","nodeType":"MemberAccess","referencedDeclaration":33365,"src":"3020:32:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35830,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3020:34:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35831,"nodeType":"ExpressionStatement","src":"3020:34:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35832,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3064:13:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35834,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3078:18:333","memberName":"initERC721Mintable","nodeType":"MemberAccess","referencedDeclaration":33382,"src":"3064:32:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35835,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3064:34:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35836,"nodeType":"ExpressionStatement","src":"3064:34:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35837,"name":"ERC721Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":34972,"src":"3108:13:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC721Storage_$34972_$","typeString":"type(library ERC721Storage)"}},"id":35839,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3122:21:333","memberName":"initERC721Deliverable","nodeType":"MemberAccess","referencedDeclaration":33399,"src":"3108:35:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35840,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3108:37:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35841,"nodeType":"ExpressionStatement","src":"3108:37:333"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35842,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"3155:14:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":35844,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3170:4:333","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"3155:19:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":35845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3155:21:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35846,"nodeType":"ExpressionStatement","src":"3155:21:333"},{"expression":{"arguments":[{"id":35852,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35797,"src":"3226:9:333","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35853,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35799,"src":"3237:11:333","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":35854,"name":"metadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35802,"src":"3250:16:333","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35847,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"3186:20:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":35849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3207:6:333","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"3186:27:333","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":35850,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3186:29:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":35851,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3216:9:333","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":36817,"src":"3186:39:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$36718_storage_ptr_$_t_string_calldata_ptr_$_t_string_calldata_ptr_$_t_contract$_ITokenMetadataResolver_$36704_$returns$__$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)"}},"id":35855,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3186:81:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35856,"nodeType":"ExpressionStatement","src":"3186:81:333"},{"expression":{"arguments":[{"id":35862,"name":"filterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35805,"src":"3320:14:333","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35857,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"3277:23:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":35859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3301:6:333","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"3277:30:333","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":35860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3277:32:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":35861,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3310:9:333","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"3277:42:333","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":35863,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3277:58:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35864,"nodeType":"ExpressionStatement","src":"3277:58:333"}]},"functionSelector":"0e07f854","id":35866,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"2675:4:333","nodeType":"FunctionDefinition","parameters":{"id":35806,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35797,"mutability":"mutable","name":"tokenName","nameLocation":"2705:9:333","nodeType":"VariableDeclaration","scope":35866,"src":"2689:25:333","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35796,"name":"string","nodeType":"ElementaryTypeName","src":"2689:6:333","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35799,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2740:11:333","nodeType":"VariableDeclaration","scope":35866,"src":"2724:27:333","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35798,"name":"string","nodeType":"ElementaryTypeName","src":"2724:6:333","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":35802,"mutability":"mutable","name":"metadataResolver","nameLocation":"2784:16:333","nodeType":"VariableDeclaration","scope":35866,"src":"2761:39:333","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":35801,"nodeType":"UserDefinedTypeName","pathNode":{"id":35800,"name":"ITokenMetadataResolver","nameLocations":["2761:22:333"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2761:22:333"},"referencedDeclaration":36704,"src":"2761:22:333","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"},{"constant":false,"id":35805,"mutability":"mutable","name":"filterRegistry","nameLocation":"2834:14:333","nodeType":"VariableDeclaration","scope":35866,"src":"2810:38:333","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":35804,"nodeType":"UserDefinedTypeName","pathNode":{"id":35803,"name":"IOperatorFilterRegistry","nameLocations":["2810:23:333"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2810:23:333"},"referencedDeclaration":37474,"src":"2810:23:333","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2679:175:333"},"returnParameters":{"id":35807,"nodeType":"ParameterList","parameters":[],"src":"2864:0:333"},"scope":35895,"src":"2666:676:333","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":35879,"nodeType":"Block","src":"3507:65:333","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35875,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3524:28:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3553:10:333","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"3524:39:333","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":35877,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3524:41:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":35874,"id":35878,"nodeType":"Return","src":"3517:48:333"}]},"documentation":{"id":35867,"nodeType":"StructuredDocumentation","src":"3348:44:333","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35880,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"3406:10:333","nodeType":"FunctionDefinition","overrides":{"id":35871,"nodeType":"OverrideSpecifier","overrides":[{"id":35869,"name":"Context","nameLocations":["3450:7:333"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3450:7:333"},{"id":35870,"name":"ForwarderRegistryContextBase","nameLocations":["3459:28:333"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3459:28:333"}],"src":"3441:47:333"},"parameters":{"id":35868,"nodeType":"ParameterList","parameters":[],"src":"3416:2:333"},"returnParameters":{"id":35874,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35873,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35880,"src":"3498:7:333","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35872,"name":"address","nodeType":"ElementaryTypeName","src":"3498:7:333","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3497:9:333"},"scope":35895,"src":"3397:175:333","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":35893,"nodeType":"Block","src":"3742:63:333","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":35889,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"3759:28:333","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":35890,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3788:8:333","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"3759:37:333","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":35891,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3759:39:333","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":35888,"id":35892,"nodeType":"Return","src":"3752:46:333"}]},"documentation":{"id":35881,"nodeType":"StructuredDocumentation","src":"3578:44:333","text":"@inheritdoc ForwarderRegistryContextBase"},"id":35894,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"3636:8:333","nodeType":"FunctionDefinition","overrides":{"id":35885,"nodeType":"OverrideSpecifier","overrides":[{"id":35883,"name":"Context","nameLocations":["3678:7:333"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"3678:7:333"},{"id":35884,"name":"ForwarderRegistryContextBase","nameLocations":["3687:28:333"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"3687:28:333"}],"src":"3669:47:333"},"parameters":{"id":35882,"nodeType":"ParameterList","parameters":[],"src":"3644:2:333"},"returnParameters":{"id":35888,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35887,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35894,"src":"3726:14:333","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":35886,"name":"bytes","nodeType":"ElementaryTypeName","src":"3726:5:333","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3725:16:333"},"scope":35895,"src":"3627:178:333","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":35896,"src":"1992:1815:333","usedErrors":[464,1216,1219,7886,8223,8246,11559,19192,20056,32109,32114,32123,32126,32131,32140,32147,32154,32157,32162,32167,37080,37083,37090],"usedEvents":[8269,8278,8287,32185,32194,32203]}],"src":"32:3776:333"},"id":333},"contracts/token/metadata/TokenMetadataResolverPerToken.sol":{"ast":{"absolutePath":"contracts/token/metadata/TokenMetadataResolverPerToken.sol","exportedSymbols":{"AccessControlStorage":[8851],"ITokenMetadataResolver":[36704],"InconsistentArrayLengths":[7886],"TokenMetadataResolverPerToken":[36022]},"id":36023,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":35897,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:334"},{"absolutePath":"contracts/CommonErrors.sol","file":"./../../CommonErrors.sol","id":35899,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36023,"sourceUnit":7890,"src":"57:66:334","symbolAliases":[{"foreign":{"id":35898,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"65:24:334","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./interfaces/ITokenMetadataResolver.sol","id":35901,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36023,"sourceUnit":36705,"src":"124:79:334","symbolAliases":[{"foreign":{"id":35900,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"132:22:334","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/AccessControlStorage.sol","file":"./../../access/libraries/AccessControlStorage.sol","id":35903,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36023,"sourceUnit":8852,"src":"204:87:334","symbolAliases":[{"foreign":{"id":35902,"name":"AccessControlStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":8851,"src":"212:20:334","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":35905,"name":"ITokenMetadataResolver","nameLocations":["570:22:334"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"570:22:334"},"id":35906,"nodeType":"InheritanceSpecifier","src":"570:22:334"}],"canonicalName":"TokenMetadataResolverPerToken","contractDependencies":[],"contractKind":"contract","documentation":{"id":35904,"nodeType":"StructuredDocumentation","src":"293:235:334","text":"@title TokenMetadataResolverPerToken.\n @notice Token Metadata Resolver which stores the metadata URI for each token.\n @notice Only minters of the target token contract can set the token metadata URI for this target contract."},"fullyImplemented":true,"id":36022,"linearizedBaseContracts":[36022,36704],"name":"TokenMetadataResolverPerToken","nameLocation":"537:29:334","nodeType":"ContractDefinition","nodes":[{"global":false,"id":35909,"libraryName":{"id":35907,"name":"AccessControlStorage","nameLocations":["605:20:334"],"nodeType":"IdentifierPath","referencedDeclaration":8851,"src":"605:20:334"},"nodeType":"UsingForDirective","src":"599:39:334","typeName":{"id":35908,"name":"address","nodeType":"ElementaryTypeName","src":"630:7:334","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"constant":true,"functionSelector":"d5391393","id":35912,"mutability":"constant","name":"MINTER_ROLE","nameLocation":"668:11:334","nodeType":"VariableDeclaration","scope":36022,"src":"644:46:334","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":35910,"name":"bytes32","nodeType":"ElementaryTypeName","src":"644:7:334","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"hexValue":"6d696e746572","id":35911,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"682:8:334","typeDescriptions":{"typeIdentifier":"t_stringliteral_39eb9ec2059d897c44a17440c762c429de204f6fddd727156ca52b8da086a6f7","typeString":"literal_string \"minter\""},"value":"minter"},"visibility":"public"},{"constant":false,"functionSelector":"361953a3","id":35918,"mutability":"mutable","name":"metadataURI","nameLocation":"751:11:334","nodeType":"VariableDeclaration","scope":36022,"src":"697:65:334","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_string_storage_$_$","typeString":"mapping(address => mapping(uint256 => string))"},"typeName":{"id":35917,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":35913,"name":"address","nodeType":"ElementaryTypeName","src":"705:7:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"697:46:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_string_storage_$_$","typeString":"mapping(address => mapping(uint256 => string))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":35916,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":35914,"name":"uint256","nodeType":"ElementaryTypeName","src":"724:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"716:26:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_string_storage_$","typeString":"mapping(uint256 => string)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":35915,"name":"string","nodeType":"ElementaryTypeName","src":"735:6:334","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}}},"visibility":"public"},{"body":{"id":35944,"nodeType":"Block","src":"1219:140:334","statements":[{"expression":{"arguments":[{"id":35931,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35912,"src":"1272:11:334","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":35932,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1285:3:334","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":35933,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1289:6:334","memberName":"sender","nodeType":"MemberAccess","src":"1285:10:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":35928,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35921,"src":"1229:13:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":35930,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1243:28:334","memberName":"enforceHasTargetContractRole","nodeType":"MemberAccess","referencedDeclaration":8838,"src":"1229:42:334","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_address_$","typeString":"function (address,bytes32,address) view"}},"id":35934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1229:67:334","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35935,"nodeType":"ExpressionStatement","src":"1229:67:334"},{"expression":{"id":35942,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":35936,"name":"metadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35918,"src":"1306:11:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_string_storage_$_$","typeString":"mapping(address => mapping(uint256 => string storage ref))"}},"id":35939,"indexExpression":{"id":35937,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35921,"src":"1318:13:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1306:26:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_string_storage_$","typeString":"mapping(uint256 => string storage ref)"}},"id":35940,"indexExpression":{"id":35938,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35923,"src":"1333:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1306:35:334","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":35941,"name":"tokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35925,"src":"1344:8:334","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"1306:46:334","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":35943,"nodeType":"ExpressionStatement","src":"1306:46:334"}]},"documentation":{"id":35919,"nodeType":"StructuredDocumentation","src":"769:343:334","text":"@notice Sets the metadata URI for a token on a contract.\n @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\n @param tokenContract The token contract on which to set the token URI.\n @param tokenId The token identifier.\n @param tokenURI The token metadata URI."},"functionSelector":"4e5786bf","id":35945,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"1126:11:334","nodeType":"FunctionDefinition","parameters":{"id":35926,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35921,"mutability":"mutable","name":"tokenContract","nameLocation":"1146:13:334","nodeType":"VariableDeclaration","scope":35945,"src":"1138:21:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35920,"name":"address","nodeType":"ElementaryTypeName","src":"1138:7:334","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":35923,"mutability":"mutable","name":"tokenId","nameLocation":"1169:7:334","nodeType":"VariableDeclaration","scope":35945,"src":"1161:15:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":35922,"name":"uint256","nodeType":"ElementaryTypeName","src":"1161:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":35925,"mutability":"mutable","name":"tokenURI","nameLocation":"1194:8:334","nodeType":"VariableDeclaration","scope":35945,"src":"1178:24:334","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":35924,"name":"string","nodeType":"ElementaryTypeName","src":"1178:6:334","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1137:66:334"},"returnParameters":{"id":35927,"nodeType":"ParameterList","parameters":[],"src":"1219:0:334"},"scope":36022,"src":"1117:242:334","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"body":{"id":36002,"nodeType":"Block","src":"1946:347:334","statements":[{"assignments":[35958],"declarations":[{"constant":false,"id":35958,"mutability":"mutable","name":"length","nameLocation":"1964:6:334","nodeType":"VariableDeclaration","scope":36002,"src":"1956:14:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":35957,"name":"uint256","nodeType":"ElementaryTypeName","src":"1956:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":35961,"initialValue":{"expression":{"id":35959,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35951,"src":"1973:8:334","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":35960,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1982:6:334","memberName":"length","nodeType":"MemberAccess","src":"1973:15:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1956:32:334"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":35965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":35962,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35958,"src":"2002:6:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":35963,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35954,"src":"2012:9:334","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}},"id":35964,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2022:6:334","memberName":"length","nodeType":"MemberAccess","src":"2012:16:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2002:26:334","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":35970,"nodeType":"IfStatement","src":"1998:90:334","trueBody":{"id":35969,"nodeType":"Block","src":"2030:58:334","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":35966,"name":"InconsistentArrayLengths","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7886,"src":"2051:24:334","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":35967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2051:26:334","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":35968,"nodeType":"RevertStatement","src":"2044:33:334"}]}},{"expression":{"arguments":[{"id":35974,"name":"MINTER_ROLE","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35912,"src":"2140:11:334","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":35975,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2153:3:334","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":35976,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2157:6:334","memberName":"sender","nodeType":"MemberAccess","src":"2153:10:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":35971,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35948,"src":"2097:13:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":35973,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2111:28:334","memberName":"enforceHasTargetContractRole","nodeType":"MemberAccess","referencedDeclaration":8838,"src":"2097:42:334","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_bytes32_$_t_address_$returns$__$attached_to$_t_address_$","typeString":"function (address,bytes32,address) view"}},"id":35977,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2097:67:334","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":35978,"nodeType":"ExpressionStatement","src":"2097:67:334"},{"body":{"id":36000,"nodeType":"Block","src":"2208:79:334","statements":[{"expression":{"id":35998,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":35988,"name":"metadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35918,"src":"2222:11:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_string_storage_$_$","typeString":"mapping(address => mapping(uint256 => string storage ref))"}},"id":35993,"indexExpression":{"id":35989,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35948,"src":"2234:13:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2222:26:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_string_storage_$","typeString":"mapping(uint256 => string storage ref)"}},"id":35994,"indexExpression":{"baseExpression":{"id":35990,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35951,"src":"2249:8:334","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},"id":35992,"indexExpression":{"id":35991,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35980,"src":"2258:1:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2249:11:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2222:39:334","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":35995,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35954,"src":"2264:9:334","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}},"id":35997,"indexExpression":{"id":35996,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35980,"src":"2274:1:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2264:12:334","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"2222:54:334","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":35999,"nodeType":"ExpressionStatement","src":"2222:54:334"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":35984,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":35982,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35980,"src":"2191:1:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":35983,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35958,"src":"2195:6:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2191:10:334","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36001,"initializationExpression":{"assignments":[35980],"declarations":[{"constant":false,"id":35980,"mutability":"mutable","name":"i","nameLocation":"2188:1:334","nodeType":"VariableDeclaration","scope":36001,"src":"2180:9:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":35979,"name":"uint256","nodeType":"ElementaryTypeName","src":"2180:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":35981,"nodeType":"VariableDeclarationStatement","src":"2180:9:334"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":35986,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"2203:3:334","subExpression":{"id":35985,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35980,"src":"2205:1:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":35987,"nodeType":"ExpressionStatement","src":"2203:3:334"},"nodeType":"ForStatement","src":"2175:112:334"}]},"documentation":{"id":35946,"nodeType":"StructuredDocumentation","src":"1365:454:334","text":"@notice Sets the metadata URIs for a batch of tokens on a contract.\n @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\n @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\n @param tokenContract The token contract on which to set the token URI.\n @param tokenIds The token identifiers.\n @param tokenURIs The token metadata URIs."},"functionSelector":"626dc9a8","id":36003,"implemented":true,"kind":"function","modifiers":[],"name":"batchSetTokenURI","nameLocation":"1833:16:334","nodeType":"FunctionDefinition","parameters":{"id":35955,"nodeType":"ParameterList","parameters":[{"constant":false,"id":35948,"mutability":"mutable","name":"tokenContract","nameLocation":"1858:13:334","nodeType":"VariableDeclaration","scope":36003,"src":"1850:21:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":35947,"name":"address","nodeType":"ElementaryTypeName","src":"1850:7:334","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":35951,"mutability":"mutable","name":"tokenIds","nameLocation":"1892:8:334","nodeType":"VariableDeclaration","scope":36003,"src":"1873:27:334","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":35949,"name":"uint256","nodeType":"ElementaryTypeName","src":"1873:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":35950,"nodeType":"ArrayTypeName","src":"1873:9:334","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":35954,"mutability":"mutable","name":"tokenURIs","nameLocation":"1920:9:334","nodeType":"VariableDeclaration","scope":36003,"src":"1902:27:334","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":35952,"name":"string","nodeType":"ElementaryTypeName","src":"1902:6:334","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":35953,"nodeType":"ArrayTypeName","src":"1902:8:334","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"1849:81:334"},"returnParameters":{"id":35956,"nodeType":"ParameterList","parameters":[],"src":"1946:0:334"},"scope":36022,"src":"1824:469:334","stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"baseFunctions":[36703],"body":{"id":36020,"nodeType":"Block","src":"2665:59:334","statements":[{"expression":{"baseExpression":{"baseExpression":{"id":36014,"name":"metadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":35918,"src":"2682:11:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_uint256_$_t_string_storage_$_$","typeString":"mapping(address => mapping(uint256 => string storage ref))"}},"id":36016,"indexExpression":{"id":36015,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36006,"src":"2694:13:334","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2682:26:334","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_string_storage_$","typeString":"mapping(uint256 => string storage ref)"}},"id":36018,"indexExpression":{"id":36017,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36008,"src":"2709:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2682:35:334","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":36013,"id":36019,"nodeType":"Return","src":"2675:42:334"}]},"documentation":{"id":36004,"nodeType":"StructuredDocumentation","src":"2299:231:334","text":"@notice Gets the token metadata URI for a token.\n @param tokenContract The token contract for which to retrieve the token URI.\n @param tokenId The token identifier.\n @return tokenURI The token metadata URI."},"functionSelector":"f724dad7","id":36021,"implemented":true,"kind":"function","modifiers":[],"name":"tokenMetadataURI","nameLocation":"2544:16:334","nodeType":"FunctionDefinition","overrides":{"id":36010,"nodeType":"OverrideSpecifier","overrides":[],"src":"2623:8:334"},"parameters":{"id":36009,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36006,"mutability":"mutable","name":"tokenContract","nameLocation":"2569:13:334","nodeType":"VariableDeclaration","scope":36021,"src":"2561:21:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36005,"name":"address","nodeType":"ElementaryTypeName","src":"2561:7:334","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36008,"mutability":"mutable","name":"tokenId","nameLocation":"2592:7:334","nodeType":"VariableDeclaration","scope":36021,"src":"2584:15:334","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36007,"name":"uint256","nodeType":"ElementaryTypeName","src":"2584:7:334","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2560:40:334"},"returnParameters":{"id":36013,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36012,"mutability":"mutable","name":"tokenURI","nameLocation":"2655:8:334","nodeType":"VariableDeclaration","scope":36021,"src":"2641:22:334","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36011,"name":"string","nodeType":"ElementaryTypeName","src":"2641:6:334","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2640:24:334"},"scope":36022,"src":"2535:189:334","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":36023,"src":"528:2198:334","usedErrors":[7886,8232,8239],"usedEvents":[]}],"src":"32:2695:334"},"id":334},"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol":{"ast":{"absolutePath":"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol","exportedSymbols":{"IERC1155MetadataSetter":[24244],"TokenMetadataResolverPerToken":[36022],"TokenMetadataResolverPerTokenERC1155":[36090]},"id":36091,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36024,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:335"},{"absolutePath":"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol","file":"./../ERC1155/interfaces/IERC1155MetadataSetter.sol","id":36026,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36091,"sourceUnit":24245,"src":"57:90:335","symbolAliases":[{"foreign":{"id":36025,"name":"IERC1155MetadataSetter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24244,"src":"65:22:335","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/TokenMetadataResolverPerToken.sol","file":"./TokenMetadataResolverPerToken.sol","id":36028,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36091,"sourceUnit":36023,"src":"148:82:335","symbolAliases":[{"foreign":{"id":36027,"name":"TokenMetadataResolverPerToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36022,"src":"156:29:335","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":36030,"name":"TokenMetadataResolverPerToken","nameLocations":["655:29:335"],"nodeType":"IdentifierPath","referencedDeclaration":36022,"src":"655:29:335"},"id":36031,"nodeType":"InheritanceSpecifier","src":"655:29:335"}],"canonicalName":"TokenMetadataResolverPerTokenERC1155","contractDependencies":[],"contractKind":"contract","documentation":{"id":36029,"nodeType":"StructuredDocumentation","src":"232:374:335","text":"@title TokenMetadataResolverPerTokenERC1155.\n @notice Token Metadata Resolver which stores the metadata URI for each token, for ERC1155 token contracts.\n @notice When a metadata URI is set, the target ERC1155 contract will be asked to emit a URI event.\n @notice Only minters of the target token contract can set the token metadata URI for this target contract."},"fullyImplemented":true,"id":36090,"linearizedBaseContracts":[36090,36022,36704],"name":"TokenMetadataResolverPerTokenERC1155","nameLocation":"615:36:335","nodeType":"ContractDefinition","nodes":[{"baseFunctions":[35945],"body":{"id":36058,"nodeType":"Block","src":"897:146:335","statements":[{"expression":{"arguments":[{"id":36045,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36034,"src":"925:13:335","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36046,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36036,"src":"940:7:335","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":36047,"name":"tokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36038,"src":"949:8:335","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":36042,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"907:5:335","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_TokenMetadataResolverPerTokenERC1155_$36090_$","typeString":"type(contract super TokenMetadataResolverPerTokenERC1155)"}},"id":36044,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"913:11:335","memberName":"setTokenURI","nodeType":"MemberAccess","referencedDeclaration":35945,"src":"907:17:335","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_string_calldata_ptr_$returns$__$","typeString":"function (address,uint256,string calldata)"}},"id":36048,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"907:51:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36049,"nodeType":"ExpressionStatement","src":"907:51:335"},{"expression":{"arguments":[{"id":36054,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36036,"src":"1018:7:335","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":36055,"name":"tokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36038,"src":"1027:8:335","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"arguments":[{"id":36051,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36034,"src":"991:13:335","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36050,"name":"IERC1155MetadataSetter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24244,"src":"968:22:335","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155MetadataSetter_$24244_$","typeString":"type(contract IERC1155MetadataSetter)"}},"id":36052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"968:37:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155MetadataSetter_$24244","typeString":"contract IERC1155MetadataSetter"}},"id":36053,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1006:11:335","memberName":"setTokenURI","nodeType":"MemberAccess","referencedDeclaration":24233,"src":"968:49:335","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_uint256_$_t_string_memory_ptr_$returns$__$","typeString":"function (uint256,string memory) external"}},"id":36056,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"968:68:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36057,"nodeType":"ExpressionStatement","src":"968:68:335"}]},"documentation":{"id":36032,"nodeType":"StructuredDocumentation","src":"691:98:335","text":"@inheritdoc TokenMetadataResolverPerToken\n @dev The token contract emits a {URI} event."},"functionSelector":"4e5786bf","id":36059,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenURI","nameLocation":"803:11:335","nodeType":"FunctionDefinition","overrides":{"id":36040,"nodeType":"OverrideSpecifier","overrides":[],"src":"888:8:335"},"parameters":{"id":36039,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36034,"mutability":"mutable","name":"tokenContract","nameLocation":"823:13:335","nodeType":"VariableDeclaration","scope":36059,"src":"815:21:335","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36033,"name":"address","nodeType":"ElementaryTypeName","src":"815:7:335","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36036,"mutability":"mutable","name":"tokenId","nameLocation":"846:7:335","nodeType":"VariableDeclaration","scope":36059,"src":"838:15:335","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36035,"name":"uint256","nodeType":"ElementaryTypeName","src":"838:7:335","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":36038,"mutability":"mutable","name":"tokenURI","nameLocation":"871:8:335","nodeType":"VariableDeclaration","scope":36059,"src":"855:24:335","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36037,"name":"string","nodeType":"ElementaryTypeName","src":"855:6:335","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"814:66:335"},"returnParameters":{"id":36041,"nodeType":"ParameterList","parameters":[],"src":"897:0:335"},"scope":36090,"src":"794:249:335","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"baseFunctions":[36003],"body":{"id":36088,"nodeType":"Block","src":"1290:160:335","statements":[{"expression":{"arguments":[{"id":36075,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36062,"src":"1323:13:335","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36076,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36065,"src":"1338:8:335","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":36077,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36068,"src":"1348:9:335","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}],"expression":{"id":36072,"name":"super","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-25,"src":"1300:5:335","typeDescriptions":{"typeIdentifier":"t_type$_t_super$_TokenMetadataResolverPerTokenERC1155_$36090_$","typeString":"type(contract super TokenMetadataResolverPerTokenERC1155)"}},"id":36074,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1306:16:335","memberName":"batchSetTokenURI","nodeType":"MemberAccess","referencedDeclaration":36003,"src":"1300:22:335","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_array$_t_uint256_$dyn_calldata_ptr_$_t_array$_t_string_calldata_ptr_$dyn_calldata_ptr_$returns$__$","typeString":"function (address,uint256[] calldata,string calldata[] calldata)"}},"id":36078,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1300:58:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36079,"nodeType":"ExpressionStatement","src":"1300:58:335"},{"expression":{"arguments":[{"id":36084,"name":"tokenIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36065,"src":"1423:8:335","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"}},{"id":36085,"name":"tokenURIs","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36068,"src":"1433:9:335","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[] calldata"},{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string calldata[] calldata"}],"expression":{"arguments":[{"id":36081,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36062,"src":"1391:13:335","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36080,"name":"IERC1155MetadataSetter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24244,"src":"1368:22:335","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC1155MetadataSetter_$24244_$","typeString":"type(contract IERC1155MetadataSetter)"}},"id":36082,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1368:37:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IERC1155MetadataSetter_$24244","typeString":"contract IERC1155MetadataSetter"}},"id":36083,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1406:16:335","memberName":"batchSetTokenURI","nodeType":"MemberAccess","referencedDeclaration":24243,"src":"1368:54:335","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$returns$__$","typeString":"function (uint256[] memory,string memory[] memory) external"}},"id":36086,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1368:75:335","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36087,"nodeType":"ExpressionStatement","src":"1368:75:335"}]},"documentation":{"id":36060,"nodeType":"StructuredDocumentation","src":"1049:113:335","text":"@inheritdoc TokenMetadataResolverPerToken\n @dev The token contract emits a {URI} event for each token."},"functionSelector":"626dc9a8","id":36089,"implemented":true,"kind":"function","modifiers":[],"name":"batchSetTokenURI","nameLocation":"1176:16:335","nodeType":"FunctionDefinition","overrides":{"id":36070,"nodeType":"OverrideSpecifier","overrides":[],"src":"1281:8:335"},"parameters":{"id":36069,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36062,"mutability":"mutable","name":"tokenContract","nameLocation":"1201:13:335","nodeType":"VariableDeclaration","scope":36089,"src":"1193:21:335","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36061,"name":"address","nodeType":"ElementaryTypeName","src":"1193:7:335","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36065,"mutability":"mutable","name":"tokenIds","nameLocation":"1235:8:335","nodeType":"VariableDeclaration","scope":36089,"src":"1216:27:335","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_calldata_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":36063,"name":"uint256","nodeType":"ElementaryTypeName","src":"1216:7:335","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36064,"nodeType":"ArrayTypeName","src":"1216:9:335","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":36068,"mutability":"mutable","name":"tokenURIs","nameLocation":"1263:9:335","nodeType":"VariableDeclaration","scope":36089,"src":"1245:27:335","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_string_calldata_ptr_$dyn_calldata_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":36066,"name":"string","nodeType":"ElementaryTypeName","src":"1245:6:335","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":36067,"nodeType":"ArrayTypeName","src":"1245:8:335","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"1192:81:335"},"returnParameters":{"id":36071,"nodeType":"ParameterList","parameters":[],"src":"1290:0:335"},"scope":36090,"src":"1167:283:335","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":36091,"src":"606:846:335","usedErrors":[7886,8232,8239],"usedEvents":[]}],"src":"32:1421:335"},"id":335},"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol":{"ast":{"absolutePath":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol","exportedSymbols":{"ContractOwnershipStorage":[9109],"ITokenMetadataResolver":[36704],"LinkTokenInterface":[94],"Strings":[2875],"TokenMetadataResolverRandomizedReveal":[36551],"VRFV2WrapperConsumerBase":[257],"VRFV2WrapperInterface":[284]},"id":36552,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36092,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:336"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./interfaces/ITokenMetadataResolver.sol","id":36094,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":36705,"src":"57:79:336","symbolAliases":[{"foreign":{"id":36093,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"65:22:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol","file":"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol","id":36096,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":95,"src":"137:106:336","symbolAliases":[{"foreign":{"id":36095,"name":"LinkTokenInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":94,"src":"145:18:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","file":"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol","id":36098,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":285,"src":"244:109:336","symbolAliases":[{"foreign":{"id":36097,"name":"VRFV2WrapperInterface","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"252:21:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":36100,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":9110,"src":"354:95:336","symbolAliases":[{"foreign":{"id":36099,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"362:24:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","file":"@openzeppelin/contracts/utils/Strings.sol","id":36102,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":2876,"src":"450:66:336","symbolAliases":[{"foreign":{"id":36101,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2875,"src":"458:7:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol","file":"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol","id":36104,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36552,"sourceUnit":258,"src":"517:104:336","symbolAliases":[{"foreign":{"id":36103,"name":"VRFV2WrapperConsumerBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":257,"src":"525:24:336","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":36106,"name":"ITokenMetadataResolver","nameLocations":["1048:22:336"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1048:22:336"},"id":36107,"nodeType":"InheritanceSpecifier","src":"1048:22:336"},{"baseName":{"id":36108,"name":"VRFV2WrapperConsumerBase","nameLocations":["1072:24:336"],"nodeType":"IdentifierPath","referencedDeclaration":257,"src":"1072:24:336"},"id":36109,"nodeType":"InheritanceSpecifier","src":"1072:24:336"}],"canonicalName":"TokenMetadataResolverRandomizedReveal","contractDependencies":[],"contractKind":"contract","documentation":{"id":36105,"nodeType":"StructuredDocumentation","src":"623:375:336","text":"@title TokenMetadataResolverRandomizedReveal.\n @notice Token Metadata Resolver with a reveal mechanism.\n @notice Before reveal, all the tokens have the same metadata URI. After reveal tokens have individual metadata URIs based on a random offset.\n @notice This resolver is designed to work with incremental token IDs NFTs starting at 0 and a fixed token supply."},"fullyImplemented":true,"id":36551,"linearizedBaseContracts":[36551,257,36704],"name":"TokenMetadataResolverRandomizedReveal","nameLocation":"1007:37:336","nodeType":"ContractDefinition","nodes":[{"global":false,"id":36112,"libraryName":{"id":36110,"name":"ContractOwnershipStorage","nameLocations":["1109:24:336"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"1109:24:336"},"nodeType":"UsingForDirective","src":"1103:43:336","typeName":{"id":36111,"name":"address","nodeType":"ElementaryTypeName","src":"1138:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":36115,"libraryName":{"id":36113,"name":"Strings","nameLocations":["1157:7:336"],"nodeType":"IdentifierPath","referencedDeclaration":2875,"src":"1157:7:336"},"nodeType":"UsingForDirective","src":"1151:26:336","typeName":{"id":36114,"name":"uint256","nodeType":"ElementaryTypeName","src":"1169:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},{"canonicalName":"TokenMetadataResolverRandomizedReveal.RevealStatus","id":36119,"members":[{"id":36116,"name":"NotRequested","nameLocation":"1211:12:336","nodeType":"EnumValue","src":"1211:12:336"},{"id":36117,"name":"Requested","nameLocation":"1238:9:336","nodeType":"EnumValue","src":"1238:9:336"},{"id":36118,"name":"Revealed","nameLocation":"1262:8:336","nodeType":"EnumValue","src":"1262:8:336"}],"name":"RevealStatus","nameLocation":"1188:12:336","nodeType":"EnumDefinition","src":"1183:98:336"},{"constant":false,"functionSelector":"6844d6fa","id":36123,"mutability":"mutable","name":"preRevealTokenMetadataURI","nameLocation":"1321:25:336","nodeType":"VariableDeclaration","scope":36551,"src":"1287:59:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"typeName":{"id":36122,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36120,"name":"address","nodeType":"ElementaryTypeName","src":"1295:7:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1287:26:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36121,"name":"string","nodeType":"ElementaryTypeName","src":"1306:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"visibility":"public"},{"constant":false,"functionSelector":"6b0fce13","id":36127,"mutability":"mutable","name":"postRevealBaseMetadataURI","nameLocation":"1436:25:336","nodeType":"VariableDeclaration","scope":36551,"src":"1402:59:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"typeName":{"id":36126,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36124,"name":"address","nodeType":"ElementaryTypeName","src":"1410:7:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1402:26:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36125,"name":"string","nodeType":"ElementaryTypeName","src":"1421:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"visibility":"public"},{"constant":false,"functionSelector":"e643792e","id":36131,"mutability":"mutable","name":"tokenSupply","nameLocation":"1552:11:336","nodeType":"VariableDeclaration","scope":36551,"src":"1517:46:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":36130,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36128,"name":"address","nodeType":"ElementaryTypeName","src":"1525:7:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1517:27:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36129,"name":"uint256","nodeType":"ElementaryTypeName","src":"1536:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"49855083","id":36136,"mutability":"mutable","name":"revealStatus","nameLocation":"1642:12:336","nodeType":"VariableDeclaration","scope":36551,"src":"1602:52:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"},"typeName":{"id":36135,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36132,"name":"address","nodeType":"ElementaryTypeName","src":"1610:7:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1602:32:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36134,"nodeType":"UserDefinedTypeName","pathNode":{"id":36133,"name":"RevealStatus","nameLocations":["1621:12:336"],"nodeType":"IdentifierPath","referencedDeclaration":36119,"src":"1621:12:336"},"referencedDeclaration":36119,"src":"1621:12:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}}},"visibility":"public"},{"constant":false,"functionSelector":"4bf810d8","id":36140,"mutability":"mutable","name":"metadataOffset","nameLocation":"1729:14:336","nodeType":"VariableDeclaration","scope":36551,"src":"1694:49:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":36139,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36137,"name":"address","nodeType":"ElementaryTypeName","src":"1702:7:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1694:27:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36138,"name":"uint256","nodeType":"ElementaryTypeName","src":"1713:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"constant":false,"functionSelector":"005e24de","id":36144,"mutability":"mutable","name":"requestIdToTokenContract","nameLocation":"1820:24:336","nodeType":"VariableDeclaration","scope":36551,"src":"1785:59:336","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"typeName":{"id":36143,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36141,"name":"uint256","nodeType":"ElementaryTypeName","src":"1793:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"1785:27:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36142,"name":"address","nodeType":"ElementaryTypeName","src":"1804:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"public"},{"anonymous":false,"documentation":{"id":36145,"nodeType":"StructuredDocumentation","src":"1881:332:336","text":"@notice Emitted when the token data is set.\n @param tokenContract The token contract on which the base metadata URI was set.\n @param preRevealTokenMetadataURI The pre-reveal token metadata URI.\n @param postRevealBaseMetadataURI The post-reveal base metadata URI.\n @param tokenSupply The token supply."},"eventSelector":"1e2c5cd029119717a495b3bafc43690a7584a3f26d1253838c2aacfdebae1f43","id":36155,"name":"TokenDataSet","nameLocation":"2224:12:336","nodeType":"EventDefinition","parameters":{"id":36154,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36147,"indexed":false,"mutability":"mutable","name":"tokenContract","nameLocation":"2245:13:336","nodeType":"VariableDeclaration","scope":36155,"src":"2237:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36146,"name":"address","nodeType":"ElementaryTypeName","src":"2237:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36149,"indexed":false,"mutability":"mutable","name":"preRevealTokenMetadataURI","nameLocation":"2267:25:336","nodeType":"VariableDeclaration","scope":36155,"src":"2260:32:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36148,"name":"string","nodeType":"ElementaryTypeName","src":"2260:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36151,"indexed":false,"mutability":"mutable","name":"postRevealBaseMetadataURI","nameLocation":"2301:25:336","nodeType":"VariableDeclaration","scope":36155,"src":"2294:32:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36150,"name":"string","nodeType":"ElementaryTypeName","src":"2294:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36153,"indexed":false,"mutability":"mutable","name":"tokenSupply","nameLocation":"2336:11:336","nodeType":"VariableDeclaration","scope":36155,"src":"2328:19:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36152,"name":"uint256","nodeType":"ElementaryTypeName","src":"2328:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2236:112:336"},"src":"2218:131:336"},{"anonymous":false,"documentation":{"id":36156,"nodeType":"StructuredDocumentation","src":"2355:208:336","text":"@notice Emitted when a request to reveal tokens is made.\n @param tokenContract The token contract on which the tokens are requested to reveal.\n @param requestId The ChainLink VRF request ID."},"eventSelector":"40cafdc32fe56fc488360b1b38d2c0ae3ac896e631536bb4bae762e342f0e704","id":36162,"name":"RevealRequested","nameLocation":"2574:15:336","nodeType":"EventDefinition","parameters":{"id":36161,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36158,"indexed":false,"mutability":"mutable","name":"tokenContract","nameLocation":"2598:13:336","nodeType":"VariableDeclaration","scope":36162,"src":"2590:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36157,"name":"address","nodeType":"ElementaryTypeName","src":"2590:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36160,"indexed":false,"mutability":"mutable","name":"requestId","nameLocation":"2621:9:336","nodeType":"VariableDeclaration","scope":36162,"src":"2613:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36159,"name":"uint256","nodeType":"ElementaryTypeName","src":"2613:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2589:42:336"},"src":"2568:64:336"},{"anonymous":false,"documentation":{"id":36163,"nodeType":"StructuredDocumentation","src":"2638:244:336","text":"@notice Emitted when the tokens are revealed.\n @param tokenContract The token contract on which the tokens are revealed.\n @param requestId The ChainLink VRF request ID.\n @param metadataOffset The random metadata offset."},"eventSelector":"4188cd09fa8447854490f2c7c4b3e63e3e8e55beb167c0bc1fd93e3fc30f49f8","id":36171,"name":"TokensRevealed","nameLocation":"2893:14:336","nodeType":"EventDefinition","parameters":{"id":36170,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36165,"indexed":false,"mutability":"mutable","name":"tokenContract","nameLocation":"2916:13:336","nodeType":"VariableDeclaration","scope":36171,"src":"2908:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36164,"name":"address","nodeType":"ElementaryTypeName","src":"2908:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36167,"indexed":false,"mutability":"mutable","name":"requestId","nameLocation":"2939:9:336","nodeType":"VariableDeclaration","scope":36171,"src":"2931:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36166,"name":"uint256","nodeType":"ElementaryTypeName","src":"2931:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":36169,"indexed":false,"mutability":"mutable","name":"metadataOffset","nameLocation":"2958:14:336","nodeType":"VariableDeclaration","scope":36171,"src":"2950:22:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36168,"name":"uint256","nodeType":"ElementaryTypeName","src":"2950:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2907:66:336"},"src":"2887:87:336"},{"documentation":{"id":36172,"nodeType":"StructuredDocumentation","src":"2980:150:336","text":"@notice Thrown when trying to set an empty pre-reveal token metadata URI.\n @param tokenContract The token contract which data is being set."},"errorSelector":"9e9de65d","id":36176,"name":"EmptyPreRevealTokenMetadataURI","nameLocation":"3141:30:336","nodeType":"ErrorDefinition","parameters":{"id":36175,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36174,"mutability":"mutable","name":"tokenContract","nameLocation":"3180:13:336","nodeType":"VariableDeclaration","scope":36176,"src":"3172:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36173,"name":"address","nodeType":"ElementaryTypeName","src":"3172:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3171:23:336"},"src":"3135:60:336"},{"documentation":{"id":36177,"nodeType":"StructuredDocumentation","src":"3201:150:336","text":"@notice Thrown when trying to set an empty post-reveal base metadata URI.\n @param tokenContract The token contract which data is being set."},"errorSelector":"ea1c6ea0","id":36181,"name":"EmptyPostRevealBaseMetadataURI","nameLocation":"3362:30:336","nodeType":"ErrorDefinition","parameters":{"id":36180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36179,"mutability":"mutable","name":"tokenContract","nameLocation":"3401:13:336","nodeType":"VariableDeclaration","scope":36181,"src":"3393:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36178,"name":"address","nodeType":"ElementaryTypeName","src":"3393:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3392:23:336"},"src":"3356:60:336"},{"documentation":{"id":36182,"nodeType":"StructuredDocumentation","src":"3422:141:336","text":"@notice Thrown when setting token data with a zero token supply.\n @param tokenContract The token contract which data is being set."},"errorSelector":"0f633658","id":36186,"name":"ZeroTokenSupply","nameLocation":"3574:15:336","nodeType":"ErrorDefinition","parameters":{"id":36185,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36184,"mutability":"mutable","name":"tokenContract","nameLocation":"3598:13:336","nodeType":"VariableDeclaration","scope":36186,"src":"3590:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36183,"name":"address","nodeType":"ElementaryTypeName","src":"3590:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3589:23:336"},"src":"3568:45:336"},{"documentation":{"id":36187,"nodeType":"StructuredDocumentation","src":"3619:169:336","text":"@notice Thrown when requesting to reveal tokens but the token data is not set.\n @param tokenContract The token contract on which is being requested to reveal."},"errorSelector":"7f78e403","id":36191,"name":"TokenDataNotSet","nameLocation":"3799:15:336","nodeType":"ErrorDefinition","parameters":{"id":36190,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36189,"mutability":"mutable","name":"tokenContract","nameLocation":"3823:13:336","nodeType":"VariableDeclaration","scope":36191,"src":"3815:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36188,"name":"address","nodeType":"ElementaryTypeName","src":"3815:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3814:23:336"},"src":"3793:45:336"},{"documentation":{"id":36192,"nodeType":"StructuredDocumentation","src":"3844:192:336","text":"@notice Thrown when trying to set the metadata for a token which has already been requested to reveal.\n @param tokenContract The token contract which is already requested to reveal."},"errorSelector":"66daadea","id":36196,"name":"RevealAlreadyRequested","nameLocation":"4047:22:336","nodeType":"ErrorDefinition","parameters":{"id":36195,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36194,"mutability":"mutable","name":"tokenContract","nameLocation":"4078:13:336","nodeType":"VariableDeclaration","scope":36196,"src":"4070:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36193,"name":"address","nodeType":"ElementaryTypeName","src":"4070:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4069:23:336"},"src":"4041:52:336"},{"documentation":{"id":36197,"nodeType":"StructuredDocumentation","src":"4099:151:336","text":"@notice Emitted when trying to reveal a token which is already revealed.\n @param tokenContract The token contract which is already revealed."},"errorSelector":"d2a6a91e","id":36201,"name":"TokensAlreadyRevealed","nameLocation":"4261:21:336","nodeType":"ErrorDefinition","parameters":{"id":36200,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36199,"mutability":"mutable","name":"tokenContract","nameLocation":"4291:13:336","nodeType":"VariableDeclaration","scope":36201,"src":"4283:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36198,"name":"address","nodeType":"ElementaryTypeName","src":"4283:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4282:23:336"},"src":"4255:51:336"},{"documentation":{"id":36202,"nodeType":"StructuredDocumentation","src":"4312:116:336","text":"@notice Thrown when trying to call the `onTokenTransfer` function but the sender is not the LINK token contract."},"errorSelector":"c1248c42","id":36206,"name":"WrongLINKTokenAddress","nameLocation":"4439:21:336","nodeType":"ErrorDefinition","parameters":{"id":36205,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36204,"mutability":"mutable","name":"wrongAddress","nameLocation":"4469:12:336","nodeType":"VariableDeclaration","scope":36206,"src":"4461:20:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36203,"name":"address","nodeType":"ElementaryTypeName","src":"4461:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4460:22:336"},"src":"4433:50:336"},{"documentation":{"id":36207,"nodeType":"StructuredDocumentation","src":"4489:169:336","text":"@notice Thrown when trying to fulfill a randomness request with a wrong request ID (ie. not associated to a token contract).\n @param requestId The request ID."},"errorSelector":"597349fa","id":36211,"name":"UnknownRequestId","nameLocation":"4669:16:336","nodeType":"ErrorDefinition","parameters":{"id":36210,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36209,"mutability":"mutable","name":"requestId","nameLocation":"4694:9:336","nodeType":"VariableDeclaration","scope":36211,"src":"4686:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36208,"name":"uint256","nodeType":"ElementaryTypeName","src":"4686:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4685:19:336"},"src":"4663:42:336"},{"body":{"id":36222,"nodeType":"Block","src":"4810:2:336","statements":[]},"id":36223,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":36218,"name":"linkToken","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36213,"src":"4787:9:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36219,"name":"vrfWrapper","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36215,"src":"4798:10:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"id":36220,"kind":"baseConstructorSpecifier","modifierName":{"id":36217,"name":"VRFV2WrapperConsumerBase","nameLocations":["4762:24:336"],"nodeType":"IdentifierPath","referencedDeclaration":257,"src":"4762:24:336"},"nodeType":"ModifierInvocation","src":"4762:47:336"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":36216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36213,"mutability":"mutable","name":"linkToken","nameLocation":"4731:9:336","nodeType":"VariableDeclaration","scope":36223,"src":"4723:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36212,"name":"address","nodeType":"ElementaryTypeName","src":"4723:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36215,"mutability":"mutable","name":"vrfWrapper","nameLocation":"4750:10:336","nodeType":"VariableDeclaration","scope":36223,"src":"4742:18:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36214,"name":"address","nodeType":"ElementaryTypeName","src":"4742:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4722:39:336"},"returnParameters":{"id":36221,"nodeType":"ParameterList","parameters":[],"src":"4810:0:336"},"scope":36551,"src":"4711:101:336","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":36310,"nodeType":"Block","src":"5823:732:336","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36241,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":36237,"name":"preRevealTokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36228,"src":"5843:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"id":36236,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5837:5:336","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":36235,"name":"bytes","nodeType":"ElementaryTypeName","src":"5837:5:336","typeDescriptions":{}}},"id":36238,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5837:24:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":36239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5862:6:336","memberName":"length","nodeType":"MemberAccess","src":"5837:31:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":36240,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5872:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5837:36:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36246,"nodeType":"IfStatement","src":"5833:94:336","trueBody":{"errorCall":{"arguments":[{"id":36243,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"5913:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36242,"name":"EmptyPreRevealTokenMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36176,"src":"5882:30:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36244,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5882:45:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36245,"nodeType":"RevertStatement","src":"5875:52:336"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"id":36249,"name":"postRevealBaseURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36230,"src":"5947:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"id":36248,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5941:5:336","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":36247,"name":"bytes","nodeType":"ElementaryTypeName","src":"5941:5:336","typeDescriptions":{}}},"id":36250,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5941:24:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"id":36251,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5966:6:336","memberName":"length","nodeType":"MemberAccess","src":"5941:31:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":36252,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5976:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5941:36:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36258,"nodeType":"IfStatement","src":"5937:94:336","trueBody":{"errorCall":{"arguments":[{"id":36255,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6017:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36254,"name":"EmptyPostRevealBaseMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36181,"src":"5986:30:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36256,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5986:45:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36257,"nodeType":"RevertStatement","src":"5979:52:336"}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":36259,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36232,"src":"6045:6:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":36260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6055:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6045:11:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36266,"nodeType":"IfStatement","src":"6041:54:336","trueBody":{"errorCall":{"arguments":[{"id":36263,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6081:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36262,"name":"ZeroTokenSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36186,"src":"6065:15:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36264,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6065:30:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36265,"nodeType":"RevertStatement","src":"6058:37:336"}},{"expression":{"arguments":[{"expression":{"id":36270,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"6148:3:336","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":36271,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6152:6:336","memberName":"sender","nodeType":"MemberAccess","src":"6148:10:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":36267,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6105:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":36269,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6119:28:336","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9096,"src":"6105:42:336","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$attached_to$_t_address_$","typeString":"function (address,address) view"}},"id":36272,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6105:54:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36273,"nodeType":"ExpressionStatement","src":"6105:54:336"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"},"id":36279,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36274,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"6173:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36276,"indexExpression":{"id":36275,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6186:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6173:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"id":36277,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"6204:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36278,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"6217:12:336","memberName":"NotRequested","nodeType":"MemberAccess","referencedDeclaration":36116,"src":"6204:25:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"6173:56:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36284,"nodeType":"IfStatement","src":"6169:106:336","trueBody":{"errorCall":{"arguments":[{"id":36281,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6261:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36280,"name":"RevealAlreadyRequested","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36196,"src":"6238:22:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36282,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6238:37:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36283,"nodeType":"RevertStatement","src":"6231:44:336"}},{"expression":{"id":36289,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36285,"name":"preRevealTokenMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36123,"src":"6285:25:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36287,"indexExpression":{"id":36286,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6311:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6285:40:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36288,"name":"preRevealTokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36228,"src":"6328:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"6285:60:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36290,"nodeType":"ExpressionStatement","src":"6285:60:336"},{"expression":{"id":36295,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36291,"name":"postRevealBaseMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36127,"src":"6355:25:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36293,"indexExpression":{"id":36292,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6381:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6355:40:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36294,"name":"postRevealBaseURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36230,"src":"6398:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"6355:60:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36296,"nodeType":"ExpressionStatement","src":"6355:60:336"},{"expression":{"id":36301,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36297,"name":"tokenSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36131,"src":"6425:11:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36299,"indexExpression":{"id":36298,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6437:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6425:26:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36300,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36232,"src":"6454:6:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6425:35:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36302,"nodeType":"ExpressionStatement","src":"6425:35:336"},{"eventCall":{"arguments":[{"id":36304,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36226,"src":"6488:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36305,"name":"preRevealTokenURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36228,"src":"6503:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":36306,"name":"postRevealBaseURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36230,"src":"6522:17:336","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},{"id":36307,"name":"supply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36232,"src":"6541:6:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36303,"name":"TokenDataSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36155,"src":"6475:12:336","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (address,string memory,string memory,uint256)"}},"id":36308,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6475:73:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36309,"nodeType":"EmitStatement","src":"6470:78:336"}]},"documentation":{"id":36224,"nodeType":"StructuredDocumentation","src":"4818:860:336","text":"@notice Sets the metadata URIs and the token supply for a token contract.\n @dev Reverts with {EmptyPreRevealTokenMetadataURI} if the pre-reveal token metadata URI is empty.\n @dev Reverts with {EmptyPostRevealBaseMetadataURIs} if the post-reveal base metadata URI is empty.\n @dev Reverts with {ZeroTokenSupply} if the token supply is 0.\n @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n @dev Reverts with {RevealAlreadyRequested} if reveal has already been requested.\n @dev Emits a {TokenDataSet} event.\n @param tokenContract The token contract on which to set the base metadata URI.\n @param preRevealTokenURI The pre-reveal token metadata URI.\n @param postRevealBaseURI The post-reveal base metadata URI.\n @param supply The token supply."},"functionSelector":"7c9bc105","id":36311,"implemented":true,"kind":"function","modifiers":[],"name":"setTokenData","nameLocation":"5692:12:336","nodeType":"FunctionDefinition","parameters":{"id":36233,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36226,"mutability":"mutable","name":"tokenContract","nameLocation":"5713:13:336","nodeType":"VariableDeclaration","scope":36311,"src":"5705:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36225,"name":"address","nodeType":"ElementaryTypeName","src":"5705:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36228,"mutability":"mutable","name":"preRevealTokenURI","nameLocation":"5744:17:336","nodeType":"VariableDeclaration","scope":36311,"src":"5728:33:336","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36227,"name":"string","nodeType":"ElementaryTypeName","src":"5728:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36230,"mutability":"mutable","name":"postRevealBaseURI","nameLocation":"5779:17:336","nodeType":"VariableDeclaration","scope":36311,"src":"5763:33:336","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36229,"name":"string","nodeType":"ElementaryTypeName","src":"5763:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36232,"mutability":"mutable","name":"supply","nameLocation":"5806:6:336","nodeType":"VariableDeclaration","scope":36311,"src":"5798:14:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36231,"name":"uint256","nodeType":"ElementaryTypeName","src":"5798:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5704:109:336"},"returnParameters":{"id":36234,"nodeType":"ParameterList","parameters":[],"src":"5823:0:336"},"scope":36551,"src":"5683:872:336","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":36408,"nodeType":"Block","src":"8400:784:336","statements":[{"expression":{"arguments":[{"expression":{"id":36324,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8453:3:336","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":36325,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8457:6:336","memberName":"sender","nodeType":"MemberAccess","src":"8453:10:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":36321,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"8410:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":36323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8424:28:336","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9096,"src":"8410:42:336","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$attached_to$_t_address_$","typeString":"function (address,address) view"}},"id":36326,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8410:54:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36327,"nodeType":"ExpressionStatement","src":"8410:54:336"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36332,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36328,"name":"tokenSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36131,"src":"8478:11:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36330,"indexExpression":{"id":36329,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"8490:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8478:26:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":36331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8508:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8478:31:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36337,"nodeType":"IfStatement","src":"8474:74:336","trueBody":{"errorCall":{"arguments":[{"id":36334,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"8534:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36333,"name":"TokenDataNotSet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36191,"src":"8518:15:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8518:30:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36336,"nodeType":"RevertStatement","src":"8511:37:336"}},{"condition":{"commonType":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"},"id":36343,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36338,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"8562:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36340,"indexExpression":{"id":36339,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"8575:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8562:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":36341,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"8593:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36342,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8606:8:336","memberName":"Revealed","nodeType":"MemberAccess","referencedDeclaration":36118,"src":"8593:21:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"8562:52:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36348,"nodeType":"IfStatement","src":"8558:101:336","trueBody":{"errorCall":{"arguments":[{"id":36345,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"8645:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36344,"name":"TokensAlreadyRevealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36201,"src":"8623:21:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36346,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8623:36:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36347,"nodeType":"RevertStatement","src":"8616:43:336"}},{"assignments":[36350],"declarations":[{"constant":false,"id":36350,"mutability":"mutable","name":"requestPrice","nameLocation":"8677:12:336","nodeType":"VariableDeclaration","scope":36408,"src":"8669:20:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36349,"name":"uint256","nodeType":"ElementaryTypeName","src":"8669:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":36355,"initialValue":{"arguments":[{"id":36353,"name":"callbackGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36316,"src":"8729:16:336","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"id":36351,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"8692:14:336","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"id":36352,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8707:21:336","memberName":"calculateRequestPrice","nodeType":"MemberAccess","referencedDeclaration":273,"src":"8692:36:336","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_uint32_$returns$_t_uint256_$","typeString":"function (uint32) view external returns (uint256)"}},"id":36354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8692:54:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8669:77:336"},{"expression":{"arguments":[{"expression":{"id":36359,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8774:3:336","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":36360,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8778:6:336","memberName":"sender","nodeType":"MemberAccess","src":"8774:10:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"id":36363,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"8794:4:336","typeDescriptions":{"typeIdentifier":"t_contract$_TokenMetadataResolverRandomizedReveal_$36551","typeString":"contract TokenMetadataResolverRandomizedReveal"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_TokenMetadataResolverRandomizedReveal_$36551","typeString":"contract TokenMetadataResolverRandomizedReveal"}],"id":36362,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8786:7:336","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":36361,"name":"address","nodeType":"ElementaryTypeName","src":"8786:7:336","typeDescriptions":{}}},"id":36364,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8786:13:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36365,"name":"requestPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36350,"src":"8801:12:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":36356,"name":"LINK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":162,"src":"8756:4:336","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"id":36358,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8761:12:336","memberName":"transferFrom","nodeType":"MemberAccess","referencedDeclaration":93,"src":"8756:17:336","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$","typeString":"function (address,address,uint256) external returns (bool)"}},"id":36366,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8756:58:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36367,"nodeType":"ExpressionStatement","src":"8756:58:336"},{"expression":{"arguments":[{"arguments":[{"id":36373,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"8853:14:336","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}],"id":36372,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8845:7:336","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":36371,"name":"address","nodeType":"ElementaryTypeName","src":"8845:7:336","typeDescriptions":{}}},"id":36374,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8845:23:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36375,"name":"requestPrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36350,"src":"8870:12:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":36378,"name":"callbackGasLimit","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36316,"src":"8895:16:336","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},{"id":36379,"name":"requestConfirmations","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36318,"src":"8913:20:336","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},{"hexValue":"31","id":36380,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8935:1:336","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"},{"typeIdentifier":"t_uint16","typeString":"uint16"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":36376,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"8884:3:336","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":36377,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"8888:6:336","memberName":"encode","nodeType":"MemberAccess","src":"8884:10:336","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":36381,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8884:53:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":36368,"name":"LINK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":162,"src":"8824:4:336","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"id":36370,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8829:15:336","memberName":"transferAndCall","nodeType":"MemberAccess","referencedDeclaration":82,"src":"8824:20:336","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$","typeString":"function (address,uint256,bytes memory) external returns (bool)"}},"id":36382,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8824:114:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36383,"nodeType":"ExpressionStatement","src":"8824:114:336"},{"assignments":[36385],"declarations":[{"constant":false,"id":36385,"mutability":"mutable","name":"requestId","nameLocation":"8956:9:336","nodeType":"VariableDeclaration","scope":36408,"src":"8948:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36384,"name":"uint256","nodeType":"ElementaryTypeName","src":"8948:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":36389,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36386,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"8968:14:336","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"id":36387,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8983:13:336","memberName":"lastRequestId","nodeType":"MemberAccess","referencedDeclaration":265,"src":"8968:28:336","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":36388,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8968:30:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"8948:50:336"},{"expression":{"id":36394,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36390,"name":"requestIdToTokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36144,"src":"9008:24:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":36392,"indexExpression":{"id":36391,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36385,"src":"9033:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9008:35:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36393,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"9046:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9008:51:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":36395,"nodeType":"ExpressionStatement","src":"9008:51:336"},{"expression":{"id":36401,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36396,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"9069:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36398,"indexExpression":{"id":36397,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"9082:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9069:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":36399,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"9099:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36400,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9112:9:336","memberName":"Requested","nodeType":"MemberAccess","referencedDeclaration":36117,"src":"9099:22:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"9069:52:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"id":36402,"nodeType":"ExpressionStatement","src":"9069:52:336"},{"eventCall":{"arguments":[{"id":36404,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36314,"src":"9152:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36405,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36385,"src":"9167:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36403,"name":"RevealRequested","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36162,"src":"9136:15:336","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,uint256)"}},"id":36406,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9136:41:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36407,"nodeType":"EmitStatement","src":"9131:46:336"}]},"documentation":{"id":36312,"nodeType":"StructuredDocumentation","src":"6561:1725:336","text":"@notice Requests to switch the base metadata URI to the post-reveal URI while applying a fixed random offset to the metadata token id.\n @notice The random offset is requested via Chainlink VRF direct funding method:\n @notice  - payment of LINK token  will be made, and pre-approval of LINK to this contract is required\n @notice    (the amount to be approved cannot reliably be known in advance, but can be estimated with `VRF_V2_WRAPPER.estimateRequestPrice`),\n @notice  - the randomness request will be fulfilled later by a call to the `rawFulfillRandomWords` callback.\n @notice This function can be called multiple times as long as the tokens have not been effectively revealed yet, so that any failure to\n @notice  execute the fulfill callback (such as because of insufficient gas) does not prevent from retrying.\n @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n @dev Reverts with {TokenDataNotSet} if the token data has not been set yet.\n @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\n @dev Emits a {RevealRequested} event.\n @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from the sender to this contract.\n @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from this contract to the VRF Wrapper.\n @param tokenContract The token contract for which to reveal the tokens.\n @param callbackGasLimit The gas limit to set for the VRF V2 wrapper callback.\n @param requestConfirmations The number of confirmations to wait before fulfilling the request."},"functionSelector":"28e82e43","id":36409,"implemented":true,"kind":"function","modifiers":[],"name":"requestReveal","nameLocation":"8300:13:336","nodeType":"FunctionDefinition","parameters":{"id":36319,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36314,"mutability":"mutable","name":"tokenContract","nameLocation":"8322:13:336","nodeType":"VariableDeclaration","scope":36409,"src":"8314:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36313,"name":"address","nodeType":"ElementaryTypeName","src":"8314:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36316,"mutability":"mutable","name":"callbackGasLimit","nameLocation":"8344:16:336","nodeType":"VariableDeclaration","scope":36409,"src":"8337:23:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":36315,"name":"uint32","nodeType":"ElementaryTypeName","src":"8337:6:336","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"visibility":"internal"},{"constant":false,"id":36318,"mutability":"mutable","name":"requestConfirmations","nameLocation":"8369:20:336","nodeType":"VariableDeclaration","scope":36409,"src":"8362:27:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"},"typeName":{"id":36317,"name":"uint16","nodeType":"ElementaryTypeName","src":"8362:6:336","typeDescriptions":{"typeIdentifier":"t_uint16","typeString":"uint16"}},"visibility":"internal"}],"src":"8313:77:336"},"returnParameters":{"id":36320,"nodeType":"ParameterList","parameters":[],"src":"8400:0:336"},"scope":36551,"src":"8291:893:336","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[36703],"body":{"id":36458,"nodeType":"Block","src":"9346:378:336","statements":[{"condition":{"commonType":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"},"id":36424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36419,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"9360:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36421,"indexExpression":{"id":36420,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36412,"src":"9373:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9360:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":36422,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"9391:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36423,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9404:8:336","memberName":"Revealed","nodeType":"MemberAccess","referencedDeclaration":36118,"src":"9391:21:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"9360:52:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":36456,"nodeType":"Block","src":"9646:72:336","statements":[{"expression":{"baseExpression":{"id":36452,"name":"preRevealTokenMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36123,"src":"9667:25:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36454,"indexExpression":{"id":36453,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36412,"src":"9693:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9667:40:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":36418,"id":36455,"nodeType":"Return","src":"9660:47:336"}]},"id":36457,"nodeType":"IfStatement","src":"9356:362:336","trueBody":{"id":36451,"nodeType":"Block","src":"9414:226:336","statements":[{"assignments":[36426],"declarations":[{"constant":false,"id":36426,"mutability":"mutable","name":"metadataId","nameLocation":"9436:10:336","nodeType":"VariableDeclaration","scope":36451,"src":"9428:18:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36425,"name":"uint256","nodeType":"ElementaryTypeName","src":"9428:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":36437,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36436,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36431,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":36427,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36414,"src":"9450:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"baseExpression":{"id":36428,"name":"metadataOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36140,"src":"9460:14:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36430,"indexExpression":{"id":36429,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36412,"src":"9475:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9460:29:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9450:39:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":36432,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"9449:41:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"baseExpression":{"id":36433,"name":"tokenSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36131,"src":"9493:11:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36435,"indexExpression":{"id":36434,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36412,"src":"9505:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9493:26:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9449:70:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9428:91:336"},{"expression":{"arguments":[{"arguments":[{"baseExpression":{"id":36442,"name":"postRevealBaseMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36127,"src":"9564:25:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36444,"indexExpression":{"id":36443,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36412,"src":"9590:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9564:40:336","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36445,"name":"metadataId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36426,"src":"9606:10:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9617:8:336","memberName":"toString","nodeType":"MemberAccess","referencedDeclaration":1587,"src":"9606:19:336","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$attached_to$_t_uint256_$","typeString":"function (uint256) pure returns (string memory)"}},"id":36447,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9606:21:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_storage","typeString":"string storage ref"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":36440,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"9547:3:336","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":36441,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9551:12:336","memberName":"encodePacked","nodeType":"MemberAccess","src":"9547:16:336","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":36448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9547:81:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":36439,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9540:6:336","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":36438,"name":"string","nodeType":"ElementaryTypeName","src":"9540:6:336","typeDescriptions":{}}},"id":36449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9540:89:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":36418,"id":36450,"nodeType":"Return","src":"9533:96:336"}]}}]},"documentation":{"id":36410,"nodeType":"StructuredDocumentation","src":"9190:38:336","text":"@inheritdoc ITokenMetadataResolver"},"functionSelector":"f724dad7","id":36459,"implemented":true,"kind":"function","modifiers":[],"name":"tokenMetadataURI","nameLocation":"9242:16:336","nodeType":"FunctionDefinition","parameters":{"id":36415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36412,"mutability":"mutable","name":"tokenContract","nameLocation":"9267:13:336","nodeType":"VariableDeclaration","scope":36459,"src":"9259:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36411,"name":"address","nodeType":"ElementaryTypeName","src":"9259:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36414,"mutability":"mutable","name":"tokenId","nameLocation":"9290:7:336","nodeType":"VariableDeclaration","scope":36459,"src":"9282:15:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36413,"name":"uint256","nodeType":"ElementaryTypeName","src":"9282:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9258:40:336"},"returnParameters":{"id":36418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36417,"mutability":"mutable","name":"tokenURI","nameLocation":"9336:8:336","nodeType":"VariableDeclaration","scope":36459,"src":"9322:22:336","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36416,"name":"string","nodeType":"ElementaryTypeName","src":"9322:6:336","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"9321:24:336"},"scope":36551,"src":"9233:491:336","stateMutability":"view","virtual":false,"visibility":"external"},{"baseFunctions":[231],"body":{"id":36531,"nodeType":"Block","src":"10300:558:336","statements":[{"assignments":[36470],"declarations":[{"constant":false,"id":36470,"mutability":"mutable","name":"tokenContract","nameLocation":"10318:13:336","nodeType":"VariableDeclaration","scope":36531,"src":"10310:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36469,"name":"address","nodeType":"ElementaryTypeName","src":"10310:7:336","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":36474,"initialValue":{"baseExpression":{"id":36471,"name":"requestIdToTokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36144,"src":"10334:24:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":36473,"indexExpression":{"id":36472,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36462,"src":"10359:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10334:35:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"10310:59:336"},{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":36480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":36475,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10383:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":36478,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10408:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":36477,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10400:7:336","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":36476,"name":"address","nodeType":"ElementaryTypeName","src":"10400:7:336","typeDescriptions":{}}},"id":36479,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10400:10:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10383:27:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36485,"nodeType":"IfStatement","src":"10379:67:336","trueBody":{"errorCall":{"arguments":[{"id":36482,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36462,"src":"10436:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36481,"name":"UnknownRequestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36211,"src":"10419:16:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":36483,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10419:27:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36484,"nodeType":"RevertStatement","src":"10412:34:336"}},{"expression":{"id":36489,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"10456:42:336","subExpression":{"baseExpression":{"id":36486,"name":"requestIdToTokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36144,"src":"10463:24:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_address_$","typeString":"mapping(uint256 => address)"}},"id":36488,"indexExpression":{"id":36487,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36462,"src":"10488:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10463:35:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36490,"nodeType":"ExpressionStatement","src":"10456:42:336"},{"condition":{"commonType":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"},"id":36496,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36491,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"10512:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36493,"indexExpression":{"id":36492,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10525:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10512:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":36494,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"10543:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10556:8:336","memberName":"Revealed","nodeType":"MemberAccess","referencedDeclaration":36118,"src":"10543:21:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"10512:52:336","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":36501,"nodeType":"IfStatement","src":"10508:101:336","trueBody":{"errorCall":{"arguments":[{"id":36498,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10595:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":36497,"name":"TokensAlreadyRevealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36201,"src":"10573:21:336","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":36499,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10573:36:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":36500,"nodeType":"RevertStatement","src":"10566:43:336"}},{"assignments":[36503],"declarations":[{"constant":false,"id":36503,"mutability":"mutable","name":"offset","nameLocation":"10627:6:336","nodeType":"VariableDeclaration","scope":36531,"src":"10619:14:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36502,"name":"uint256","nodeType":"ElementaryTypeName","src":"10619:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":36511,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":36504,"name":"randomWords","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36465,"src":"10636:11:336","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":36506,"indexExpression":{"hexValue":"30","id":36505,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10648:1:336","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10636:14:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"baseExpression":{"id":36507,"name":"tokenSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36131,"src":"10653:11:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36509,"indexExpression":{"id":36508,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10665:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10653:26:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10636:43:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10619:60:336"},{"expression":{"id":36516,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36512,"name":"metadataOffset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36140,"src":"10689:14:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":36514,"indexExpression":{"id":36513,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10704:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10689:29:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36515,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36503,"src":"10721:6:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10689:38:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36517,"nodeType":"ExpressionStatement","src":"10689:38:336"},{"expression":{"id":36523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36518,"name":"revealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36136,"src":"10737:12:336","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_enum$_RevealStatus_$36119_$","typeString":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36520,"indexExpression":{"id":36519,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10750:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10737:27:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":36521,"name":"RevealStatus","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36119,"src":"10767:12:336","typeDescriptions":{"typeIdentifier":"t_type$_t_enum$_RevealStatus_$36119_$","typeString":"type(enum TokenMetadataResolverRandomizedReveal.RevealStatus)"}},"id":36522,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10780:8:336","memberName":"Revealed","nodeType":"MemberAccess","referencedDeclaration":36118,"src":"10767:21:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"src":"10737:51:336","typeDescriptions":{"typeIdentifier":"t_enum$_RevealStatus_$36119","typeString":"enum TokenMetadataResolverRandomizedReveal.RevealStatus"}},"id":36524,"nodeType":"ExpressionStatement","src":"10737:51:336"},{"eventCall":{"arguments":[{"id":36526,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36470,"src":"10818:13:336","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36527,"name":"requestId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36462,"src":"10833:9:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":36528,"name":"offset","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36503,"src":"10844:6:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36525,"name":"TokensRevealed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36171,"src":"10803:14:336","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$","typeString":"function (address,uint256,uint256)"}},"id":36529,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10803:48:336","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36530,"nodeType":"EmitStatement","src":"10798:53:336"}]},"documentation":{"id":36460,"nodeType":"StructuredDocumentation","src":"9730:462:336","text":"@notice Callback function called by the VRF V2 wrapper when the randomness is received. Applies the random offset.\n @dev Reverts with {UnknownRequestId} if the request ID is not associated to a token contract.\n @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\n @dev Emits a {TokensRevealed} event.\n @param requestId The ChainLink VRF request ID.\n @param randomWords The randomness result."},"id":36532,"implemented":true,"kind":"function","modifiers":[],"name":"fulfillRandomWords","nameLocation":"10206:18:336","nodeType":"FunctionDefinition","overrides":{"id":36467,"nodeType":"OverrideSpecifier","overrides":[],"src":"10291:8:336"},"parameters":{"id":36466,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36462,"mutability":"mutable","name":"requestId","nameLocation":"10233:9:336","nodeType":"VariableDeclaration","scope":36532,"src":"10225:17:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36461,"name":"uint256","nodeType":"ElementaryTypeName","src":"10225:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":36465,"mutability":"mutable","name":"randomWords","nameLocation":"10261:11:336","nodeType":"VariableDeclaration","scope":36532,"src":"10244:28:336","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":36463,"name":"uint256","nodeType":"ElementaryTypeName","src":"10244:7:336","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36464,"nodeType":"ArrayTypeName","src":"10244:9:336","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"src":"10224:49:336"},"returnParameters":{"id":36468,"nodeType":"ParameterList","parameters":[],"src":"10300:0:336"},"scope":36551,"src":"10197:661:336","stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"body":{"id":36540,"nodeType":"Block","src":"10992:28:336","statements":[{"expression":{"id":36538,"name":"LINK","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":162,"src":"11009:4:336","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"functionReturnParameters":36537,"id":36539,"nodeType":"Return","src":"11002:11:336"}]},"functionSelector":"ee206f9d","id":36541,"implemented":true,"kind":"function","modifiers":[],"name":"CHAINLINK_LINK_TOKEN","nameLocation":"10926:20:336","nodeType":"FunctionDefinition","parameters":{"id":36533,"nodeType":"ParameterList","parameters":[],"src":"10946:2:336"},"returnParameters":{"id":36537,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36536,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":36541,"src":"10972:18:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"},"typeName":{"id":36535,"nodeType":"UserDefinedTypeName","pathNode":{"id":36534,"name":"LinkTokenInterface","nameLocations":["10972:18:336"],"nodeType":"IdentifierPath","referencedDeclaration":94,"src":"10972:18:336"},"referencedDeclaration":94,"src":"10972:18:336","typeDescriptions":{"typeIdentifier":"t_contract$_LinkTokenInterface_$94","typeString":"contract LinkTokenInterface"}},"visibility":"internal"}],"src":"10971:20:336"},"scope":36551,"src":"10917:103:336","stateMutability":"view","virtual":false,"visibility":"external"},{"body":{"id":36549,"nodeType":"Block","src":"11158:38:336","statements":[{"expression":{"id":36547,"name":"VRF_V2_WRAPPER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":165,"src":"11175:14:336","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"functionReturnParameters":36546,"id":36548,"nodeType":"Return","src":"11168:21:336"}]},"functionSelector":"981e4cc2","id":36550,"implemented":true,"kind":"function","modifiers":[],"name":"CHAINLINK_VRF_WRAPPER","nameLocation":"11088:21:336","nodeType":"FunctionDefinition","parameters":{"id":36542,"nodeType":"ParameterList","parameters":[],"src":"11109:2:336"},"returnParameters":{"id":36546,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36545,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":36550,"src":"11135:21:336","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"},"typeName":{"id":36544,"nodeType":"UserDefinedTypeName","pathNode":{"id":36543,"name":"VRFV2WrapperInterface","nameLocations":["11135:21:336"],"nodeType":"IdentifierPath","referencedDeclaration":284,"src":"11135:21:336"},"referencedDeclaration":284,"src":"11135:21:336","typeDescriptions":{"typeIdentifier":"t_contract$_VRFV2WrapperInterface_$284","typeString":"contract VRFV2WrapperInterface"}},"visibility":"internal"}],"src":"11134:23:336"},"scope":36551,"src":"11079:117:336","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":36552,"src":"998:10200:336","usedErrors":[8239,8258,36176,36181,36186,36191,36196,36201,36206,36211],"usedEvents":[36155,36162,36171]}],"src":"32:11167:336"},"id":336},"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol":{"ast":{"absolutePath":"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol","exportedSymbols":{"ContractOwnershipStorage":[9109],"ITokenMetadataResolver":[36704],"Strings":[2875],"TokenMetadataResolverWithBaseURI":[36631]},"id":36632,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36553,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:337"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./interfaces/ITokenMetadataResolver.sol","id":36555,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36632,"sourceUnit":36705,"src":"57:79:337","symbolAliases":[{"foreign":{"id":36554,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"65:22:337","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../access/libraries/ContractOwnershipStorage.sol","id":36557,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36632,"sourceUnit":9110,"src":"137:95:337","symbolAliases":[{"foreign":{"id":36556,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"145:24:337","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Strings.sol","file":"@openzeppelin/contracts/utils/Strings.sol","id":36559,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36632,"sourceUnit":2876,"src":"233:66:337","symbolAliases":[{"foreign":{"id":36558,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2875,"src":"241:7:337","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":36561,"name":"ITokenMetadataResolver","nameLocations":["642:22:337"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"642:22:337"},"id":36562,"nodeType":"InheritanceSpecifier","src":"642:22:337"}],"canonicalName":"TokenMetadataResolverWithBaseURI","contractDependencies":[],"contractKind":"contract","documentation":{"id":36560,"nodeType":"StructuredDocumentation","src":"301:296:337","text":"@title TokenMetadataResolverWithBaseURI.\n @notice Token Metadata Resolver which uses a base metadata URI concatenated with the token identifier to produce a token metadata URI.\n @notice Only the owner of the target token contract can set the base metadata URI for this target contract."},"fullyImplemented":true,"id":36631,"linearizedBaseContracts":[36631,36704],"name":"TokenMetadataResolverWithBaseURI","nameLocation":"606:32:337","nodeType":"ContractDefinition","nodes":[{"global":false,"id":36565,"libraryName":{"id":36563,"name":"ContractOwnershipStorage","nameLocations":["677:24:337"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"677:24:337"},"nodeType":"UsingForDirective","src":"671:43:337","typeName":{"id":36564,"name":"address","nodeType":"ElementaryTypeName","src":"706:7:337","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},{"global":false,"id":36568,"libraryName":{"id":36566,"name":"Strings","nameLocations":["725:7:337"],"nodeType":"IdentifierPath","referencedDeclaration":2875,"src":"725:7:337"},"nodeType":"UsingForDirective","src":"719:26:337","typeName":{"id":36567,"name":"uint256","nodeType":"ElementaryTypeName","src":"737:7:337","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},{"constant":false,"functionSelector":"3fb0a0db","id":36572,"mutability":"mutable","name":"baseMetadataURI","nameLocation":"785:15:337","nodeType":"VariableDeclaration","scope":36631,"src":"751:49:337","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"typeName":{"id":36571,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":36569,"name":"address","nodeType":"ElementaryTypeName","src":"759:7:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"751:26:337","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":36570,"name":"string","nodeType":"ElementaryTypeName","src":"770:6:337","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}}},"visibility":"public"},{"anonymous":false,"documentation":{"id":36573,"nodeType":"StructuredDocumentation","src":"807:196:337","text":"@notice Emitted when the base metadata URI is set.\n @param tokenContract The token contract on which the base metadata URI was set.\n @param baseMetadataURI The base metadata URI."},"eventSelector":"88abd97025db503bd9cbc01e09174912e82e0973d1b96c37a3d25d4f7e20f7a3","id":36579,"name":"BaseMetadataURISet","nameLocation":"1014:18:337","nodeType":"EventDefinition","parameters":{"id":36578,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36575,"indexed":false,"mutability":"mutable","name":"tokenContract","nameLocation":"1041:13:337","nodeType":"VariableDeclaration","scope":36579,"src":"1033:21:337","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36574,"name":"address","nodeType":"ElementaryTypeName","src":"1033:7:337","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36577,"indexed":false,"mutability":"mutable","name":"baseMetadataURI","nameLocation":"1063:15:337","nodeType":"VariableDeclaration","scope":36579,"src":"1056:22:337","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36576,"name":"string","nodeType":"ElementaryTypeName","src":"1056:6:337","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1032:47:337"},"src":"1008:72:337"},{"body":{"id":36605,"nodeType":"Block","src":"1502:178:337","statements":[{"expression":{"arguments":[{"expression":{"id":36590,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1555:3:337","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":36591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1559:6:337","memberName":"sender","nodeType":"MemberAccess","src":"1555:10:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":36587,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36582,"src":"1512:13:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":36589,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1526:28:337","memberName":"enforceIsTargetContractOwner","nodeType":"MemberAccess","referencedDeclaration":9096,"src":"1512:42:337","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$__$attached_to$_t_address_$","typeString":"function (address,address) view"}},"id":36592,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1512:54:337","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36593,"nodeType":"ExpressionStatement","src":"1512:54:337"},{"expression":{"id":36598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":36594,"name":"baseMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36572,"src":"1576:15:337","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36596,"indexExpression":{"id":36595,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36582,"src":"1592:13:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1576:30:337","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36597,"name":"baseURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36584,"src":"1609:7:337","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"1576:40:337","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36599,"nodeType":"ExpressionStatement","src":"1576:40:337"},{"eventCall":{"arguments":[{"id":36601,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36582,"src":"1650:13:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36602,"name":"baseURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36584,"src":"1665:7:337","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"id":36600,"name":"BaseMetadataURISet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36579,"src":"1631:18:337","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$","typeString":"function (address,string memory)"}},"id":36603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1631:42:337","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36604,"nodeType":"EmitStatement","src":"1626:47:337"}]},"documentation":{"id":36580,"nodeType":"StructuredDocumentation","src":"1086:326:337","text":"@notice Sets the base metadata URI.\n @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\n @dev Emits a {BaseMetadataURISet} event.\n @param tokenContract The token contract on which to set the base metadata URI.\n @param baseURI The base metadata URI."},"functionSelector":"6169966a","id":36606,"implemented":true,"kind":"function","modifiers":[],"name":"setBaseMetadataURI","nameLocation":"1426:18:337","nodeType":"FunctionDefinition","parameters":{"id":36585,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36582,"mutability":"mutable","name":"tokenContract","nameLocation":"1453:13:337","nodeType":"VariableDeclaration","scope":36606,"src":"1445:21:337","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36581,"name":"address","nodeType":"ElementaryTypeName","src":"1445:7:337","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36584,"mutability":"mutable","name":"baseURI","nameLocation":"1484:7:337","nodeType":"VariableDeclaration","scope":36606,"src":"1468:23:337","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36583,"name":"string","nodeType":"ElementaryTypeName","src":"1468:6:337","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1444:48:337"},"returnParameters":{"id":36586,"nodeType":"ParameterList","parameters":[],"src":"1502:0:337"},"scope":36631,"src":"1417:263:337","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[36703],"body":{"id":36629,"nodeType":"Block","src":"2177:100:337","statements":[{"expression":{"arguments":[{"arguments":[{"baseExpression":{"id":36620,"name":"baseMetadataURI","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36572,"src":"2218:15:337","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_string_storage_$","typeString":"mapping(address => string storage ref)"}},"id":36622,"indexExpression":{"id":36621,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36609,"src":"2234:13:337","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2218:30:337","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36623,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36611,"src":"2250:7:337","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":36624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2258:8:337","memberName":"toString","nodeType":"MemberAccess","referencedDeclaration":1587,"src":"2250:16:337","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$attached_to$_t_uint256_$","typeString":"function (uint256) pure returns (string memory)"}},"id":36625,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2250:18:337","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_storage","typeString":"string storage ref"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":36618,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2201:3:337","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":36619,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2205:12:337","memberName":"encodePacked","nodeType":"MemberAccess","src":"2201:16:337","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":36626,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2201:68:337","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":36617,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2194:6:337","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":36616,"name":"string","nodeType":"ElementaryTypeName","src":"2194:6:337","typeDescriptions":{}}},"id":36627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2194:76:337","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":36615,"id":36628,"nodeType":"Return","src":"2187:83:337"}]},"documentation":{"id":36607,"nodeType":"StructuredDocumentation","src":"1686:373:337","text":"@notice Gets the token metadata URI for a token as the concatenation of the base metadata URI and the token identifier.\n @param tokenContract The token contract for which to retrieve the token URI.\n @param tokenId The token identifier.\n @return tokenURI The token metadata URI as the concatenation of the base metadata URI and the token identifier."},"functionSelector":"f724dad7","id":36630,"implemented":true,"kind":"function","modifiers":[],"name":"tokenMetadataURI","nameLocation":"2073:16:337","nodeType":"FunctionDefinition","parameters":{"id":36612,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36609,"mutability":"mutable","name":"tokenContract","nameLocation":"2098:13:337","nodeType":"VariableDeclaration","scope":36630,"src":"2090:21:337","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36608,"name":"address","nodeType":"ElementaryTypeName","src":"2090:7:337","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36611,"mutability":"mutable","name":"tokenId","nameLocation":"2121:7:337","nodeType":"VariableDeclaration","scope":36630,"src":"2113:15:337","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36610,"name":"uint256","nodeType":"ElementaryTypeName","src":"2113:7:337","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2089:40:337"},"returnParameters":{"id":36615,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36614,"mutability":"mutable","name":"tokenURI","nameLocation":"2167:8:337","nodeType":"VariableDeclaration","scope":36630,"src":"2153:22:337","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36613,"name":"string","nodeType":"ElementaryTypeName","src":"2153:6:337","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2152:24:337"},"scope":36631,"src":"2064:213:337","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":36632,"src":"597:1682:337","usedErrors":[8239,8258],"usedEvents":[36579]}],"src":"32:2248:337"},"id":337},"contracts/token/metadata/base/TokenMetadataBase.sol":{"ast":{"absolutePath":"contracts/token/metadata/base/TokenMetadataBase.sol","exportedSymbols":{"ITokenMetadataResolver":[36704],"TokenMetadataBase":[36683],"TokenMetadataStorage":[36891]},"id":36684,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36633,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:338"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../interfaces/ITokenMetadataResolver.sol","id":36635,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36684,"sourceUnit":36705,"src":"58:82:338","symbolAliases":[{"foreign":{"id":36634,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"66:22:338","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","file":"./../libraries/TokenMetadataStorage.sol","id":36637,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36684,"sourceUnit":36892,"src":"141:77:338","symbolAliases":[{"foreign":{"id":36636,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"149:20:338","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[],"canonicalName":"TokenMetadataBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":36638,"nodeType":"StructuredDocumentation","src":"220:283:338","text":"@title TokenMetadataBase (proxiable version).\n @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\n @dev This contract is to be used via inheritance in a proxied implementation."},"fullyImplemented":true,"id":36683,"linearizedBaseContracts":[36683],"name":"TokenMetadataBase","nameLocation":"521:17:338","nodeType":"ContractDefinition","nodes":[{"global":false,"id":36642,"libraryName":{"id":36639,"name":"TokenMetadataStorage","nameLocations":["551:20:338"],"nodeType":"IdentifierPath","referencedDeclaration":36891,"src":"551:20:338"},"nodeType":"UsingForDirective","src":"545:59:338","typeName":{"id":36641,"nodeType":"UserDefinedTypeName","pathNode":{"id":36640,"name":"TokenMetadataStorage.Layout","nameLocations":["576:20:338","597:6:338"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"576:27:338"},"referencedDeclaration":36718,"src":"576:27:338","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}}},{"body":{"id":36654,"nodeType":"Block","src":"776:60:338","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36648,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"793:20:338","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":36649,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"814:6:338","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"793:27:338","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":36650,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"793:29:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36651,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"823:4:338","memberName":"name","nodeType":"MemberAccess","referencedDeclaration":36830,"src":"793:34:338","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer) view returns (string memory)"}},"id":36652,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"793:36:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":36647,"id":36653,"nodeType":"Return","src":"786:43:338"}]},"documentation":{"id":36643,"nodeType":"StructuredDocumentation","src":"610:91:338","text":"@notice Gets the token name. E.g. \"My Token\".\n @return tokenName The token name."},"functionSelector":"06fdde03","id":36655,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"715:4:338","nodeType":"FunctionDefinition","parameters":{"id":36644,"nodeType":"ParameterList","parameters":[],"src":"719:2:338"},"returnParameters":{"id":36647,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36646,"mutability":"mutable","name":"tokenName","nameLocation":"765:9:338","nodeType":"VariableDeclaration","scope":36655,"src":"751:23:338","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36645,"name":"string","nodeType":"ElementaryTypeName","src":"751:6:338","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"750:25:338"},"scope":36683,"src":"706:130:338","stateMutability":"view","virtual":true,"visibility":"public"},{"body":{"id":36667,"nodeType":"Block","src":"1013:62:338","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36661,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1030:20:338","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":36662,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1051:6:338","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1030:27:338","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":36663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1030:29:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36664,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1060:6:338","memberName":"symbol","nodeType":"MemberAccess","referencedDeclaration":36843,"src":"1030:36:338","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$returns$_t_string_memory_ptr_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer) view returns (string memory)"}},"id":36665,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1030:38:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":36660,"id":36666,"nodeType":"Return","src":"1023:45:338"}]},"documentation":{"id":36656,"nodeType":"StructuredDocumentation","src":"842:92:338","text":"@notice Gets the token symbol. E.g. \"TOK\".\n @return tokenSymbol The token symbol."},"functionSelector":"95d89b41","id":36668,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"948:6:338","nodeType":"FunctionDefinition","parameters":{"id":36657,"nodeType":"ParameterList","parameters":[],"src":"954:2:338"},"returnParameters":{"id":36660,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36659,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1000:11:338","nodeType":"VariableDeclaration","scope":36668,"src":"986:25:338","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36658,"name":"string","nodeType":"ElementaryTypeName","src":"986:6:338","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"985:27:338"},"scope":36683,"src":"939:136:338","stateMutability":"view","virtual":true,"visibility":"public"},{"body":{"id":36681,"nodeType":"Block","src":"1319:72:338","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36675,"name":"TokenMetadataStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36891,"src":"1336:20:338","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TokenMetadataStorage_$36891_$","typeString":"type(library TokenMetadataStorage)"}},"id":36676,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1357:6:338","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":36890,"src":"1336:27:338","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function () pure returns (struct TokenMetadataStorage.Layout storage pointer)"}},"id":36677,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1336:29:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36678,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1366:16:338","memberName":"metadataResolver","nodeType":"MemberAccess","referencedDeclaration":36857,"src":"1336:46:338","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$36718_storage_ptr_$returns$_t_contract$_ITokenMetadataResolver_$36704_$attached_to$_t_struct$_Layout_$36718_storage_ptr_$","typeString":"function (struct TokenMetadataStorage.Layout storage pointer) view returns (contract ITokenMetadataResolver)"}},"id":36679,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1336:48:338","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"functionReturnParameters":36674,"id":36680,"nodeType":"Return","src":"1329:55:338"}]},"documentation":{"id":36669,"nodeType":"StructuredDocumentation","src":"1081:128:338","text":"@notice Gets the token metadata resolver address.\n @return tokenMetadataResolver The token metadata resolver address."},"functionSelector":"a0c76f62","id":36682,"implemented":true,"kind":"function","modifiers":[],"name":"metadataResolver","nameLocation":"1223:16:338","nodeType":"FunctionDefinition","parameters":{"id":36670,"nodeType":"ParameterList","parameters":[],"src":"1239:2:338"},"returnParameters":{"id":36674,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36673,"mutability":"mutable","name":"tokenMetadataResolver","nameLocation":"1296:21:338","nodeType":"VariableDeclaration","scope":36682,"src":"1273:44:338","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":36672,"nodeType":"UserDefinedTypeName","pathNode":{"id":36671,"name":"ITokenMetadataResolver","nameLocations":["1273:22:338"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1273:22:338"},"referencedDeclaration":36704,"src":"1273:22:338","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1272:46:338"},"scope":36683,"src":"1214:177:338","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":36684,"src":"503:890:338","usedErrors":[],"usedEvents":[]}],"src":"32:1362:338"},"id":338},"contracts/token/metadata/errors/TokenMetadataErrors.sol":{"ast":{"absolutePath":"contracts/token/metadata/errors/TokenMetadataErrors.sol","exportedSymbols":{"NotMetadataResolver":[36690]},"id":36691,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36685,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:339"},{"documentation":{"id":36686,"nodeType":"StructuredDocumentation","src":"58:133:339","text":"@notice Thrown when an account is not the metadata resolver but is required to.\n @param account The account that was checked."},"errorSelector":"22060671","id":36690,"name":"NotMetadataResolver","nameLocation":"197:19:339","nodeType":"ErrorDefinition","parameters":{"id":36689,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36688,"mutability":"mutable","name":"account","nameLocation":"225:7:339","nodeType":"VariableDeclaration","scope":36690,"src":"217:15:339","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36687,"name":"address","nodeType":"ElementaryTypeName","src":"217:7:339","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"216:17:339"},"src":"191:43:339"}],"src":"32:203:339"},"id":339},"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol":{"ast":{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","exportedSymbols":{"ITokenMetadataResolver":[36704]},"id":36705,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36692,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:340"},{"abstract":false,"baseContracts":[],"canonicalName":"ITokenMetadataResolver","contractDependencies":[],"contractKind":"interface","documentation":{"id":36693,"nodeType":"StructuredDocumentation","src":"58:86:340","text":"@title ITokenMetadataResolver\n @notice Interface for Token Metadata Resolvers."},"fullyImplemented":false,"id":36704,"linearizedBaseContracts":[36704],"name":"ITokenMetadataResolver","nameLocation":"154:22:340","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":36694,"nodeType":"StructuredDocumentation","src":"183:231:340","text":"@notice Gets the token metadata URI for a token.\n @param tokenContract The token contract for which to retrieve the token URI.\n @param tokenId The token identifier.\n @return tokenURI The token metadata URI."},"functionSelector":"f724dad7","id":36703,"implemented":false,"kind":"function","modifiers":[],"name":"tokenMetadataURI","nameLocation":"428:16:340","nodeType":"FunctionDefinition","parameters":{"id":36699,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36696,"mutability":"mutable","name":"tokenContract","nameLocation":"453:13:340","nodeType":"VariableDeclaration","scope":36703,"src":"445:21:340","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36695,"name":"address","nodeType":"ElementaryTypeName","src":"445:7:340","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36698,"mutability":"mutable","name":"tokenId","nameLocation":"476:7:340","nodeType":"VariableDeclaration","scope":36703,"src":"468:15:340","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36697,"name":"uint256","nodeType":"ElementaryTypeName","src":"468:7:340","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"444:40:340"},"returnParameters":{"id":36702,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36701,"mutability":"mutable","name":"tokenURI","nameLocation":"522:8:340","nodeType":"VariableDeclaration","scope":36703,"src":"508:22:340","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36700,"name":"string","nodeType":"ElementaryTypeName","src":"508:6:340","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"507:24:340"},"scope":36704,"src":"419:113:340","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":36705,"src":"144:390:340","usedErrors":[],"usedEvents":[]}],"src":"32:503:340"},"id":340},"contracts/token/metadata/libraries/TokenMetadataStorage.sol":{"ast":{"absolutePath":"contracts/token/metadata/libraries/TokenMetadataStorage.sol","exportedSymbols":{"ITokenMetadataResolver":[36704],"ProxyInitialization":[19524],"TokenMetadataStorage":[36891]},"id":36892,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36706,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:341"},{"absolutePath":"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol","file":"./../interfaces/ITokenMetadataResolver.sol","id":36708,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36892,"sourceUnit":36705,"src":"58:82:341","symbolAliases":[{"foreign":{"id":36707,"name":"ITokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36704,"src":"66:22:341","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../../proxy/libraries/ProxyInitialization.sol","id":36710,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36892,"sourceUnit":19525,"src":"141:87:341","symbolAliases":[{"foreign":{"id":36709,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"149:19:341","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"TokenMetadataStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":36891,"linearizedBaseContracts":[36891],"name":"TokenMetadataStorage","nameLocation":"238:20:341","nodeType":"ContractDefinition","nodes":[{"canonicalName":"TokenMetadataStorage.Layout","id":36718,"members":[{"constant":false,"id":36712,"mutability":"mutable","name":"tokenName","nameLocation":"296:9:341","nodeType":"VariableDeclaration","scope":36718,"src":"289:16:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":36711,"name":"string","nodeType":"ElementaryTypeName","src":"289:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36714,"mutability":"mutable","name":"tokenSymbol","nameLocation":"322:11:341","nodeType":"VariableDeclaration","scope":36718,"src":"315:18:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"},"typeName":{"id":36713,"name":"string","nodeType":"ElementaryTypeName","src":"315:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36717,"mutability":"mutable","name":"tokenMetadataResolver","nameLocation":"366:21:341","nodeType":"VariableDeclaration","scope":36718,"src":"343:44:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":36716,"nodeType":"UserDefinedTypeName","pathNode":{"id":36715,"name":"ITokenMetadataResolver","nameLocations":["343:22:341"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"343:22:341"},"referencedDeclaration":36704,"src":"343:22:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"name":"Layout","nameLocation":"272:6:341","nodeType":"StructDefinition","scope":36891,"src":"265:129:341","visibility":"public"},{"constant":true,"id":36731,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"426:19:341","nodeType":"VariableDeclaration","scope":36891,"src":"400:127:341","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":36719,"name":"bytes32","nodeType":"ElementaryTypeName","src":"400:7:341","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36729,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e6d657461646174612e546f6b656e4d657461646174612e73746f72616765","id":36725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"474:46:341","typeDescriptions":{"typeIdentifier":"t_stringliteral_7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","typeString":"literal_string \"animoca.token.metadata.TokenMetadata.storage\""},"value":"animoca.token.metadata.TokenMetadata.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","typeString":"literal_string \"animoca.token.metadata.TokenMetadata.storage\""}],"id":36724,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"464:9:341","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":36726,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"464:57:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":36723,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"456:7:341","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":36722,"name":"uint256","nodeType":"ElementaryTypeName","src":"456:7:341","typeDescriptions":{}}},"id":36727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"456:66:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":36728,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"525:1:341","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"456:70:341","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36721,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"448:7:341","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":36720,"name":"bytes32","nodeType":"ElementaryTypeName","src":"448:7:341","typeDescriptions":{}}},"id":36730,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"448:79:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":36744,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"559:21:341","nodeType":"VariableDeclaration","scope":36891,"src":"533:127:341","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":36732,"name":"bytes32","nodeType":"ElementaryTypeName","src":"533:7:341","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":36742,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e6d657461646174612e546f6b656e4d657461646174612e7068617365","id":36738,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"609:44:341","typeDescriptions":{"typeIdentifier":"t_stringliteral_92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf59","typeString":"literal_string \"animoca.token.metadata.TokenMetadata.phase\""},"value":"animoca.token.metadata.TokenMetadata.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf59","typeString":"literal_string \"animoca.token.metadata.TokenMetadata.phase\""}],"id":36737,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"599:9:341","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":36739,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"599:55:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":36736,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"591:7:341","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":36735,"name":"uint256","nodeType":"ElementaryTypeName","src":"591:7:341","typeDescriptions":{}}},"id":36740,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"591:64:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":36741,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"658:1:341","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"591:68:341","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":36734,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"583:7:341","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":36733,"name":"bytes32","nodeType":"ElementaryTypeName","src":"583:7:341","typeDescriptions":{}}},"id":36743,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"583:77:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":36776,"nodeType":"Block","src":"1209:134:341","statements":[{"expression":{"id":36762,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36758,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36748,"src":"1219:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36760,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1221:9:341","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":36712,"src":"1219:11:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36761,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36750,"src":"1233:9:341","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"1219:23:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36763,"nodeType":"ExpressionStatement","src":"1219:23:341"},{"expression":{"id":36768,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36764,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36748,"src":"1252:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36766,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1254:11:341","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":36714,"src":"1252:13:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36767,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36752,"src":"1268:11:341","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"1252:27:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36769,"nodeType":"ExpressionStatement","src":"1252:27:341"},{"expression":{"id":36774,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36770,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36748,"src":"1289:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36772,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1291:21:341","memberName":"tokenMetadataResolver","nodeType":"MemberAccess","referencedDeclaration":36717,"src":"1289:23:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36773,"name":"tokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36755,"src":"1315:21:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"src":"1289:47:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"id":36775,"nodeType":"ExpressionStatement","src":"1289:47:341"}]},"documentation":{"id":36745,"nodeType":"StructuredDocumentation","src":"667:349:341","text":"@notice Initializes the metadata storage (immutable version).\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenMetadataResolver The address of the metadata resolver contract."},"id":36777,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1030:15:341","nodeType":"FunctionDefinition","parameters":{"id":36756,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36748,"mutability":"mutable","name":"s","nameLocation":"1070:1:341","nodeType":"VariableDeclaration","scope":36777,"src":"1055:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36747,"nodeType":"UserDefinedTypeName","pathNode":{"id":36746,"name":"Layout","nameLocations":["1055:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"1055:6:341"},"referencedDeclaration":36718,"src":"1055:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":36750,"mutability":"mutable","name":"tokenName","nameLocation":"1095:9:341","nodeType":"VariableDeclaration","scope":36777,"src":"1081:23:341","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36749,"name":"string","nodeType":"ElementaryTypeName","src":"1081:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36752,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1128:11:341","nodeType":"VariableDeclaration","scope":36777,"src":"1114:25:341","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36751,"name":"string","nodeType":"ElementaryTypeName","src":"1114:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36755,"mutability":"mutable","name":"tokenMetadataResolver","nameLocation":"1172:21:341","nodeType":"VariableDeclaration","scope":36777,"src":"1149:44:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":36754,"nodeType":"UserDefinedTypeName","pathNode":{"id":36753,"name":"ITokenMetadataResolver","nameLocations":["1149:22:341"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1149:22:341"},"referencedDeclaration":36704,"src":"1149:22:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1045:154:341"},"returnParameters":{"id":36757,"nodeType":"ParameterList","parameters":[],"src":"1209:0:341"},"scope":36891,"src":"1021:322:341","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":36816,"nodeType":"Block","src":"2052:198:341","statements":[{"expression":{"arguments":[{"id":36794,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36744,"src":"2091:21:341","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":36795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2114:1:341","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":36791,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"2062:19:341","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":36793,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2082:8:341","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"2062:28:341","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":36796,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2062:54:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36797,"nodeType":"ExpressionStatement","src":"2062:54:341"},{"expression":{"id":36802,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36798,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36781,"src":"2126:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36800,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2128:9:341","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":36712,"src":"2126:11:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36801,"name":"tokenName","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36783,"src":"2140:9:341","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"2126:23:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36803,"nodeType":"ExpressionStatement","src":"2126:23:341"},{"expression":{"id":36808,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36804,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36781,"src":"2159:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36806,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2161:11:341","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":36714,"src":"2159:13:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36807,"name":"tokenSymbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36785,"src":"2175:11:341","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}},"src":"2159:27:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":36809,"nodeType":"ExpressionStatement","src":"2159:27:341"},{"expression":{"id":36814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":36810,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36781,"src":"2196:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36812,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2198:21:341","memberName":"tokenMetadataResolver","nodeType":"MemberAccess","referencedDeclaration":36717,"src":"2196:23:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":36813,"name":"tokenMetadataResolver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36788,"src":"2222:21:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"src":"2196:47:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"id":36815,"nodeType":"ExpressionStatement","src":"2196:47:341"}]},"documentation":{"id":36778,"nodeType":"StructuredDocumentation","src":"1349:512:341","text":"@notice Initializes the metadata storage (proxied version).\n @notice Sets the proxy initialization phase to `1`.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param tokenName The token name.\n @param tokenSymbol The token symbol.\n @param tokenMetadataResolver The address of the metadata resolver contract."},"id":36817,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"1875:9:341","nodeType":"FunctionDefinition","parameters":{"id":36789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36781,"mutability":"mutable","name":"s","nameLocation":"1909:1:341","nodeType":"VariableDeclaration","scope":36817,"src":"1894:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36780,"nodeType":"UserDefinedTypeName","pathNode":{"id":36779,"name":"Layout","nameLocations":["1894:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"1894:6:341"},"referencedDeclaration":36718,"src":"1894:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":36783,"mutability":"mutable","name":"tokenName","nameLocation":"1936:9:341","nodeType":"VariableDeclaration","scope":36817,"src":"1920:25:341","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36782,"name":"string","nodeType":"ElementaryTypeName","src":"1920:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36785,"mutability":"mutable","name":"tokenSymbol","nameLocation":"1971:11:341","nodeType":"VariableDeclaration","scope":36817,"src":"1955:27:341","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":36784,"name":"string","nodeType":"ElementaryTypeName","src":"1955:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":36788,"mutability":"mutable","name":"tokenMetadataResolver","nameLocation":"2015:21:341","nodeType":"VariableDeclaration","scope":36817,"src":"1992:44:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":36787,"nodeType":"UserDefinedTypeName","pathNode":{"id":36786,"name":"ITokenMetadataResolver","nameLocations":["1992:22:341"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"1992:22:341"},"referencedDeclaration":36704,"src":"1992:22:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"1884:158:341"},"returnParameters":{"id":36790,"nodeType":"ParameterList","parameters":[],"src":"2052:0:341"},"scope":36891,"src":"1866:384:341","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":36829,"nodeType":"Block","src":"2438:35:341","statements":[{"expression":{"expression":{"id":36826,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36821,"src":"2455:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36827,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2457:9:341","memberName":"tokenName","nodeType":"MemberAccess","referencedDeclaration":36712,"src":"2455:11:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":36825,"id":36828,"nodeType":"Return","src":"2448:18:341"}]},"documentation":{"id":36818,"nodeType":"StructuredDocumentation","src":"2256:97:341","text":"@notice Gets the name of the token.\n @return tokenName The name of the token contract."},"id":36830,"implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"2367:4:341","nodeType":"FunctionDefinition","parameters":{"id":36822,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36821,"mutability":"mutable","name":"s","nameLocation":"2387:1:341","nodeType":"VariableDeclaration","scope":36830,"src":"2372:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36820,"nodeType":"UserDefinedTypeName","pathNode":{"id":36819,"name":"Layout","nameLocations":["2372:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2372:6:341"},"referencedDeclaration":36718,"src":"2372:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"}],"src":"2371:18:341"},"returnParameters":{"id":36825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36824,"mutability":"mutable","name":"tokenName","nameLocation":"2427:9:341","nodeType":"VariableDeclaration","scope":36830,"src":"2413:23:341","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36823,"name":"string","nodeType":"ElementaryTypeName","src":"2413:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2412:25:341"},"scope":36891,"src":"2358:115:341","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":36842,"nodeType":"Block","src":"2671:37:341","statements":[{"expression":{"expression":{"id":36839,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36834,"src":"2688:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36840,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2690:11:341","memberName":"tokenSymbol","nodeType":"MemberAccess","referencedDeclaration":36714,"src":"2688:13:341","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":36838,"id":36841,"nodeType":"Return","src":"2681:20:341"}]},"documentation":{"id":36831,"nodeType":"StructuredDocumentation","src":"2479:103:341","text":"@notice Gets the symbol of the token.\n @return tokenSymbol The symbol of the token contract."},"id":36843,"implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"2596:6:341","nodeType":"FunctionDefinition","parameters":{"id":36835,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36834,"mutability":"mutable","name":"s","nameLocation":"2618:1:341","nodeType":"VariableDeclaration","scope":36843,"src":"2603:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36833,"nodeType":"UserDefinedTypeName","pathNode":{"id":36832,"name":"Layout","nameLocations":["2603:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2603:6:341"},"referencedDeclaration":36718,"src":"2603:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"}],"src":"2602:18:341"},"returnParameters":{"id":36838,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36837,"mutability":"mutable","name":"tokenSymbol","nameLocation":"2658:11:341","nodeType":"VariableDeclaration","scope":36843,"src":"2644:25:341","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36836,"name":"string","nodeType":"ElementaryTypeName","src":"2644:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2643:27:341"},"scope":36891,"src":"2587:121:341","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":36856,"nodeType":"Block","src":"2974:47:341","statements":[{"expression":{"expression":{"id":36853,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36847,"src":"2991:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36854,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2993:21:341","memberName":"tokenMetadataResolver","nodeType":"MemberAccess","referencedDeclaration":36717,"src":"2991:23:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"functionReturnParameters":36852,"id":36855,"nodeType":"Return","src":"2984:30:341"}]},"documentation":{"id":36844,"nodeType":"StructuredDocumentation","src":"2714:142:341","text":"@notice Gets the address of the token metadata resolver.\n @return tokenMetadataResolver The address of the token metadata resolver."},"id":36857,"implemented":true,"kind":"function","modifiers":[],"name":"metadataResolver","nameLocation":"2870:16:341","nodeType":"FunctionDefinition","parameters":{"id":36848,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36847,"mutability":"mutable","name":"s","nameLocation":"2902:1:341","nodeType":"VariableDeclaration","scope":36857,"src":"2887:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36846,"nodeType":"UserDefinedTypeName","pathNode":{"id":36845,"name":"Layout","nameLocations":["2887:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"2887:6:341"},"referencedDeclaration":36718,"src":"2887:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"}],"src":"2886:18:341"},"returnParameters":{"id":36852,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36851,"mutability":"mutable","name":"tokenMetadataResolver","nameLocation":"2951:21:341","nodeType":"VariableDeclaration","scope":36857,"src":"2928:44:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"},"typeName":{"id":36850,"nodeType":"UserDefinedTypeName","pathNode":{"id":36849,"name":"ITokenMetadataResolver","nameLocations":["2928:22:341"],"nodeType":"IdentifierPath","referencedDeclaration":36704,"src":"2928:22:341"},"referencedDeclaration":36704,"src":"2928:22:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"visibility":"internal"}],"src":"2927:46:341"},"scope":36891,"src":"2861:160:341","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":36877,"nodeType":"Block","src":"3347:88:341","statements":[{"expression":{"arguments":[{"id":36873,"name":"tokenContract","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36863,"src":"3405:13:341","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":36874,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36865,"src":"3420:7:341","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"expression":{"id":36870,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36861,"src":"3364:1:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout storage pointer"}},"id":36871,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3366:21:341","memberName":"tokenMetadataResolver","nodeType":"MemberAccess","referencedDeclaration":36717,"src":"3364:23:341","typeDescriptions":{"typeIdentifier":"t_contract$_ITokenMetadataResolver_$36704","typeString":"contract ITokenMetadataResolver"}},"id":36872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3388:16:341","memberName":"tokenMetadataURI","nodeType":"MemberAccess","referencedDeclaration":36703,"src":"3364:40:341","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (address,uint256) view external returns (string memory)"}},"id":36875,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3364:64:341","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":36869,"id":36876,"nodeType":"Return","src":"3357:71:341"}]},"documentation":{"id":36858,"nodeType":"StructuredDocumentation","src":"3027:193:341","text":"@notice Gets the token metadata URI retieved from the metadata resolver contract.\n @param tokenContract The address of the token contract.\n @param tokenId The ID of the token."},"id":36878,"implemented":true,"kind":"function","modifiers":[],"name":"tokenMetadataURI","nameLocation":"3234:16:341","nodeType":"FunctionDefinition","parameters":{"id":36866,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36861,"mutability":"mutable","name":"s","nameLocation":"3266:1:341","nodeType":"VariableDeclaration","scope":36878,"src":"3251:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36860,"nodeType":"UserDefinedTypeName","pathNode":{"id":36859,"name":"Layout","nameLocations":["3251:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"3251:6:341"},"referencedDeclaration":36718,"src":"3251:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":36863,"mutability":"mutable","name":"tokenContract","nameLocation":"3277:13:341","nodeType":"VariableDeclaration","scope":36878,"src":"3269:21:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36862,"name":"address","nodeType":"ElementaryTypeName","src":"3269:7:341","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":36865,"mutability":"mutable","name":"tokenId","nameLocation":"3300:7:341","nodeType":"VariableDeclaration","scope":36878,"src":"3292:15:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36864,"name":"uint256","nodeType":"ElementaryTypeName","src":"3292:7:341","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3250:58:341"},"returnParameters":{"id":36869,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36868,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":36878,"src":"3332:13:341","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":36867,"name":"string","nodeType":"ElementaryTypeName","src":"3332:6:341","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"3331:15:341"},"scope":36891,"src":"3225:210:341","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":36889,"nodeType":"Block","src":"3500:115:341","statements":[{"assignments":[36885],"declarations":[{"constant":false,"id":36885,"mutability":"mutable","name":"position","nameLocation":"3518:8:341","nodeType":"VariableDeclaration","scope":36889,"src":"3510:16:341","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":36884,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3510:7:341","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":36887,"initialValue":{"id":36886,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36731,"src":"3529:19:341","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3510:38:341"},{"AST":{"nativeSrc":"3567:42:341","nodeType":"YulBlock","src":"3567:42:341","statements":[{"nativeSrc":"3581:18:341","nodeType":"YulAssignment","src":"3581:18:341","value":{"name":"position","nativeSrc":"3591:8:341","nodeType":"YulIdentifier","src":"3591:8:341"},"variableNames":[{"name":"s.slot","nativeSrc":"3581:6:341","nodeType":"YulIdentifier","src":"3581:6:341"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":36885,"isOffset":false,"isSlot":false,"src":"3591:8:341","valueSize":1},{"declaration":36882,"isOffset":false,"isSlot":true,"src":"3581:6:341","suffix":"slot","valueSize":1}],"id":36888,"nodeType":"InlineAssembly","src":"3558:51:341"}]},"id":36890,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"3450:6:341","nodeType":"FunctionDefinition","parameters":{"id":36879,"nodeType":"ParameterList","parameters":[],"src":"3456:2:341"},"returnParameters":{"id":36883,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36882,"mutability":"mutable","name":"s","nameLocation":"3497:1:341","nodeType":"VariableDeclaration","scope":36890,"src":"3482:16:341","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"},"typeName":{"id":36881,"nodeType":"UserDefinedTypeName","pathNode":{"id":36880,"name":"Layout","nameLocations":["3482:6:341"],"nodeType":"IdentifierPath","referencedDeclaration":36718,"src":"3482:6:341"},"referencedDeclaration":36718,"src":"3482:6:341","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$36718_storage_ptr","typeString":"struct TokenMetadataStorage.Layout"}},"visibility":"internal"}],"src":"3481:18:341"},"scope":36891,"src":"3441:174:341","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":36892,"src":"230:3387:341","usedErrors":[],"usedEvents":[]}],"src":"32:3586:341"},"id":341},"contracts/token/royalty/ERC2981.sol":{"ast":{"absolutePath":"contracts/token/royalty/ERC2981.sol","exportedSymbols":{"ContractOwnership":[7934],"ERC2981":[36915],"ERC2981Base":[37012],"ERC2981Storage":[37657]},"id":36916,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36893,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:342"},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./libraries/ERC2981Storage.sol","id":36895,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36916,"sourceUnit":37658,"src":"58:62:342","symbolAliases":[{"foreign":{"id":36894,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"66:14:342","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./base/ERC2981Base.sol","id":36897,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36916,"sourceUnit":37013,"src":"121:51:342","symbolAliases":[{"foreign":{"id":36896,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"129:11:342","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/ContractOwnership.sol","file":"./../../access/ContractOwnership.sol","id":36899,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":36916,"sourceUnit":7935,"src":"173:71:342","symbolAliases":[{"foreign":{"id":36898,"name":"ContractOwnership","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7934,"src":"181:17:342","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":36901,"name":"ERC2981Base","nameLocations":["435:11:342"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"435:11:342"},"id":36902,"nodeType":"InheritanceSpecifier","src":"435:11:342"},{"baseName":{"id":36903,"name":"ContractOwnership","nameLocations":["448:17:342"],"nodeType":"IdentifierPath","referencedDeclaration":7934,"src":"448:17:342"},"id":36904,"nodeType":"InheritanceSpecifier","src":"448:17:342"}],"canonicalName":"ERC2981","contractDependencies":[],"contractKind":"contract","documentation":{"id":36900,"nodeType":"StructuredDocumentation","src":"246:160:342","text":"@title ERC2981 NFT Royalty Standard (immutable version).\n @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation."},"fullyImplemented":true,"id":36915,"linearizedBaseContracts":[36915,7934,11554,11579,8139,37012,37280,1206,8562],"name":"ERC2981","nameLocation":"424:7:342","nodeType":"ContractDefinition","nodes":[{"body":{"id":36913,"nodeType":"Block","src":"565:38:342","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36908,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"575:14:342","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":36910,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"590:4:342","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"575:19:342","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":36911,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"575:21:342","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36912,"nodeType":"ExpressionStatement","src":"575:21:342"}]},"documentation":{"id":36905,"nodeType":"StructuredDocumentation","src":"472:74:342","text":"@notice Marks the following ERC165 interface(s) as supported: ERC2981."},"id":36914,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":36906,"nodeType":"ParameterList","parameters":[],"src":"562:2:342"},"returnParameters":{"id":36907,"nodeType":"ParameterList","parameters":[],"src":"565:0:342"},"scope":36915,"src":"551:52:342","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":36916,"src":"406:199:342","usedErrors":[8246,11559,37080,37083],"usedEvents":[8287]}],"src":"32:574:342"},"id":342},"contracts/token/royalty/base/ERC2981Base.sol":{"ast":{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"ERC2981Base":[37012],"ERC2981Storage":[37657],"IERC2981":[37280]},"id":37013,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":36917,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:343"},{"absolutePath":"contracts/token/royalty/interfaces/IERC2981.sol","file":"./../interfaces/IERC2981.sol","id":36919,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37013,"sourceUnit":37281,"src":"58:54:343","symbolAliases":[{"foreign":{"id":36918,"name":"IERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37280,"src":"66:8:343","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../libraries/ERC2981Storage.sol","id":36921,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37013,"sourceUnit":37658,"src":"113:65:343","symbolAliases":[{"foreign":{"id":36920,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"121:14:343","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../access/libraries/ContractOwnershipStorage.sol","id":36923,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37013,"sourceUnit":9110,"src":"179:98:343","symbolAliases":[{"foreign":{"id":36922,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"187:24:343","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":36925,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37013,"sourceUnit":1207,"src":"278:66:343","symbolAliases":[{"foreign":{"id":36924,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"286:7:343","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":36927,"name":"Context","nameLocations":["675:7:343"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"675:7:343"},"id":36928,"nodeType":"InheritanceSpecifier","src":"675:7:343"},{"baseName":{"id":36929,"name":"IERC2981","nameLocations":["684:8:343"],"nodeType":"IdentifierPath","referencedDeclaration":37280,"src":"684:8:343"},"id":36930,"nodeType":"InheritanceSpecifier","src":"684:8:343"}],"canonicalName":"ERC2981Base","contractDependencies":[],"contractKind":"contract","documentation":{"id":36926,"nodeType":"StructuredDocumentation","src":"346:296:343","text":"@title ERC2981 NFT Royalty Standard (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC165 (Interface Detection Standard).\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":37012,"linearizedBaseContracts":[37012,37280,1206],"name":"ERC2981Base","nameLocation":"660:11:343","nodeType":"ContractDefinition","nodes":[{"global":false,"id":36934,"libraryName":{"id":36931,"name":"ERC2981Storage","nameLocations":["705:14:343"],"nodeType":"IdentifierPath","referencedDeclaration":37657,"src":"705:14:343"},"nodeType":"UsingForDirective","src":"699:47:343","typeName":{"id":36933,"nodeType":"UserDefinedTypeName","pathNode":{"id":36932,"name":"ERC2981Storage.Layout","nameLocations":["724:14:343","739:6:343"],"nodeType":"IdentifierPath","referencedDeclaration":37492,"src":"724:21:343"},"referencedDeclaration":37492,"src":"724:21:343","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"}}},{"global":false,"id":36938,"libraryName":{"id":36935,"name":"ContractOwnershipStorage","nameLocations":["757:24:343"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"757:24:343"},"nodeType":"UsingForDirective","src":"751:67:343","typeName":{"id":36937,"nodeType":"UserDefinedTypeName","pathNode":{"id":36936,"name":"ContractOwnershipStorage.Layout","nameLocations":["786:24:343","811:6:343"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"786:31:343"},"referencedDeclaration":8882,"src":"786:31:343","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"constant":true,"functionSelector":"e1a8bf2c","id":36942,"mutability":"constant","name":"ROYALTY_FEE_DENOMINATOR","nameLocation":"848:23:343","nodeType":"VariableDeclaration","scope":37012,"src":"824:88:343","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36939,"name":"uint256","nodeType":"ElementaryTypeName","src":"824:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"expression":{"id":36940,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"874:14:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":36941,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"889:23:343","memberName":"ROYALTY_FEE_DENOMINATOR","nodeType":"MemberAccess","referencedDeclaration":37508,"src":"874:38:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"body":{"id":36965,"nodeType":"Block","src":"1312:153:343","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":36953,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1379:10:343","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":36954,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1379:12:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36948,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1322:24:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":36950,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1347:6:343","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1322:31:343","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":36951,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1322:33:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":36952,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1356:22:343","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1322:56:343","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":36955,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1322:70:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36956,"nodeType":"ExpressionStatement","src":"1322:70:343"},{"expression":{"arguments":[{"id":36962,"name":"percentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36945,"src":"1447:10:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36957,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"1402:14:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":36959,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1417:6:343","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37656,"src":"1402:21:343","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function () pure returns (struct ERC2981Storage.Layout storage pointer)"}},"id":36960,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1402:23:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":36961,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1426:20:343","memberName":"setRoyaltyPercentage","nodeType":"MemberAccess","referencedDeclaration":37553,"src":"1402:44:343","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37492_storage_ptr_$_t_uint256_$returns$__$attached_to$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function (struct ERC2981Storage.Layout storage pointer,uint256)"}},"id":36963,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1402:56:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36964,"nodeType":"ExpressionStatement","src":"1402:56:343"}]},"documentation":{"id":36943,"nodeType":"StructuredDocumentation","src":"919:321:343","text":"@notice Sets the royalty percentage.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\n @param percentage The new percentage to set. For example 50000 sets 50% royalty."},"functionSelector":"61ba27da","id":36966,"implemented":true,"kind":"function","modifiers":[],"name":"setRoyaltyPercentage","nameLocation":"1254:20:343","nodeType":"FunctionDefinition","parameters":{"id":36946,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36945,"mutability":"mutable","name":"percentage","nameLocation":"1283:10:343","nodeType":"VariableDeclaration","scope":36966,"src":"1275:18:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36944,"name":"uint256","nodeType":"ElementaryTypeName","src":"1275:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1274:20:343"},"returnParameters":{"id":36947,"nodeType":"ParameterList","parameters":[],"src":"1312:0:343"},"scope":37012,"src":"1245:220:343","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":36989,"nodeType":"Block","src":"1800:149:343","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":36977,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1867:10:343","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":36978,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1867:12:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36972,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1810:24:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":36974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1835:6:343","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1810:31:343","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":36975,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1810:33:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":36976,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1844:22:343","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1810:56:343","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":36979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1810:70:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36980,"nodeType":"ExpressionStatement","src":"1810:70:343"},{"expression":{"arguments":[{"id":36986,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36969,"src":"1933:8:343","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":36981,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"1890:14:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":36983,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1905:6:343","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37656,"src":"1890:21:343","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function () pure returns (struct ERC2981Storage.Layout storage pointer)"}},"id":36984,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1890:23:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":36985,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1914:18:343","memberName":"setRoyaltyReceiver","nodeType":"MemberAccess","referencedDeclaration":37580,"src":"1890:42:343","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37492_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function (struct ERC2981Storage.Layout storage pointer,address)"}},"id":36987,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1890:52:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":36988,"nodeType":"ExpressionStatement","src":"1890:52:343"}]},"documentation":{"id":36967,"nodeType":"StructuredDocumentation","src":"1471:261:343","text":"@notice Sets the royalty receiver.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\n @param receiver The new receiver to set."},"functionSelector":"8dc251e3","id":36990,"implemented":true,"kind":"function","modifiers":[],"name":"setRoyaltyReceiver","nameLocation":"1746:18:343","nodeType":"FunctionDefinition","parameters":{"id":36970,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36969,"mutability":"mutable","name":"receiver","nameLocation":"1773:8:343","nodeType":"VariableDeclaration","scope":36990,"src":"1765:16:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36968,"name":"address","nodeType":"ElementaryTypeName","src":"1765:7:343","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1764:18:343"},"returnParameters":{"id":36971,"nodeType":"ParameterList","parameters":[],"src":"1800:0:343"},"scope":37012,"src":"1737:212:343","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"baseFunctions":[37279],"body":{"id":37010,"nodeType":"Block","src":"2113:79:343","statements":[{"expression":{"arguments":[{"id":37006,"name":"tokenId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36993,"src":"2166:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":37007,"name":"salePrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":36995,"src":"2175:9:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37002,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"2130:14:343","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":37003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2145:6:343","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37656,"src":"2130:21:343","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function () pure returns (struct ERC2981Storage.Layout storage pointer)"}},"id":37004,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2130:23:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":37005,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2154:11:343","memberName":"royaltyInfo","nodeType":"MemberAccess","referencedDeclaration":37644,"src":"2130:35:343","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37492_storage_ptr_$_t_uint256_$_t_uint256_$returns$_t_address_$_t_uint256_$attached_to$_t_struct$_Layout_$37492_storage_ptr_$","typeString":"function (struct ERC2981Storage.Layout storage pointer,uint256,uint256) view returns (address,uint256)"}},"id":37008,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2130:55:343","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_address_$_t_uint256_$","typeString":"tuple(address,uint256)"}},"functionReturnParameters":37001,"id":37009,"nodeType":"Return","src":"2123:62:343"}]},"documentation":{"id":36991,"nodeType":"StructuredDocumentation","src":"1955:24:343","text":"@inheritdoc IERC2981"},"functionSelector":"2a55205a","id":37011,"implemented":true,"kind":"function","modifiers":[],"name":"royaltyInfo","nameLocation":"1993:11:343","nodeType":"FunctionDefinition","parameters":{"id":36996,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36993,"mutability":"mutable","name":"tokenId","nameLocation":"2013:7:343","nodeType":"VariableDeclaration","scope":37011,"src":"2005:15:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36992,"name":"uint256","nodeType":"ElementaryTypeName","src":"2005:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":36995,"mutability":"mutable","name":"salePrice","nameLocation":"2030:9:343","nodeType":"VariableDeclaration","scope":37011,"src":"2022:17:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36994,"name":"uint256","nodeType":"ElementaryTypeName","src":"2022:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2004:36:343"},"returnParameters":{"id":37001,"nodeType":"ParameterList","parameters":[{"constant":false,"id":36998,"mutability":"mutable","name":"receiver","nameLocation":"2080:8:343","nodeType":"VariableDeclaration","scope":37011,"src":"2072:16:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":36997,"name":"address","nodeType":"ElementaryTypeName","src":"2072:7:343","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37000,"mutability":"mutable","name":"royaltyAmount","nameLocation":"2098:13:343","nodeType":"VariableDeclaration","scope":37011,"src":"2090:21:343","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":36999,"name":"uint256","nodeType":"ElementaryTypeName","src":"2090:7:343","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2071:41:343"},"scope":37012,"src":"1984:208:343","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":37013,"src":"642:1552:343","usedErrors":[8246,37080,37083],"usedEvents":[]}],"src":"32:2163:343"},"id":343},"contracts/token/royalty/base/OperatorFiltererBase.sol":{"ast":{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","exportedSymbols":{"Context":[1206],"ContractOwnershipStorage":[9109],"IOperatorFilterRegistry":[37474],"OperatorFiltererBase":[37073],"OperatorFiltererStorage":[37870]},"id":37074,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37014,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:344"},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../interfaces/IOperatorFilterRegistry.sol","id":37016,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37074,"sourceUnit":37475,"src":"58:84:344","symbolAliases":[{"foreign":{"id":37015,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"66:23:344","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../libraries/OperatorFiltererStorage.sol","id":37018,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37074,"sourceUnit":37871,"src":"143:83:344","symbolAliases":[{"foreign":{"id":37017,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"151:23:344","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/access/libraries/ContractOwnershipStorage.sol","file":"./../../../access/libraries/ContractOwnershipStorage.sol","id":37020,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37074,"sourceUnit":9110,"src":"227:98:344","symbolAliases":[{"foreign":{"id":37019,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"235:24:344","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":37022,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37074,"sourceUnit":1207,"src":"326:66:344","symbolAliases":[{"foreign":{"id":37021,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"334:7:344","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":true,"baseContracts":[{"baseName":{"id":37024,"name":"Context","nameLocations":["664:7:344"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"664:7:344"},"id":37025,"nodeType":"InheritanceSpecifier","src":"664:7:344"}],"canonicalName":"OperatorFiltererBase","contractDependencies":[],"contractKind":"contract","documentation":{"id":37023,"nodeType":"StructuredDocumentation","src":"394:228:344","text":"@title Operator Filterer for token contracts (proxiable version).\n @dev This contract is to be used via inheritance in a proxied implementation.\n @dev Note: This contract requires ERC173 (Contract Ownership standard)."},"fullyImplemented":true,"id":37073,"linearizedBaseContracts":[37073,1206],"name":"OperatorFiltererBase","nameLocation":"640:20:344","nodeType":"ContractDefinition","nodes":[{"global":false,"id":37029,"libraryName":{"id":37026,"name":"OperatorFiltererStorage","nameLocations":["684:23:344"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"684:23:344"},"nodeType":"UsingForDirective","src":"678:65:344","typeName":{"id":37028,"nodeType":"UserDefinedTypeName","pathNode":{"id":37027,"name":"OperatorFiltererStorage.Layout","nameLocations":["712:23:344","736:6:344"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"712:30:344"},"referencedDeclaration":37673,"src":"712:30:344","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"global":false,"id":37033,"libraryName":{"id":37030,"name":"ContractOwnershipStorage","nameLocations":["754:24:344"],"nodeType":"IdentifierPath","referencedDeclaration":9109,"src":"754:24:344"},"nodeType":"UsingForDirective","src":"748:67:344","typeName":{"id":37032,"nodeType":"UserDefinedTypeName","pathNode":{"id":37031,"name":"ContractOwnershipStorage.Layout","nameLocations":["783:24:344","808:6:344"],"nodeType":"IdentifierPath","referencedDeclaration":8882,"src":"783:31:344"},"referencedDeclaration":8882,"src":"783:31:344","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout"}}},{"body":{"id":37057,"nodeType":"Block","src":"1212:168:344","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":37045,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1188,"src":"1279:10:344","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":37046,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1279:12:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37040,"name":"ContractOwnershipStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9109,"src":"1222:24:344","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ContractOwnershipStorage_$9109_$","typeString":"type(library ContractOwnershipStorage)"}},"id":37042,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1247:6:344","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":9108,"src":"1222:31:344","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function () pure returns (struct ContractOwnershipStorage.Layout storage pointer)"}},"id":37043,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1222:33:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$8882_storage_ptr","typeString":"struct ContractOwnershipStorage.Layout storage pointer"}},"id":37044,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1256:22:344","memberName":"enforceIsContractOwner","nodeType":"MemberAccess","referencedDeclaration":9076,"src":"1222:56:344","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$8882_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$8882_storage_ptr_$","typeString":"function (struct ContractOwnershipStorage.Layout storage pointer,address) view"}},"id":37047,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1222:70:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37048,"nodeType":"ExpressionStatement","src":"1222:70:344"},{"expression":{"arguments":[{"id":37054,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37037,"src":"1364:8:344","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37049,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1302:23:344","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":37051,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1326:6:344","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1302:30:344","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":37052,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1302:32:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37053,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1335:28:344","memberName":"updateOperatorFilterRegistry","nodeType":"MemberAccess","referencedDeclaration":37757,"src":"1302:61:344","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":37055,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1302:71:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37056,"nodeType":"ExpressionStatement","src":"1302:71:344"}]},"documentation":{"id":37034,"nodeType":"StructuredDocumentation","src":"821:297:344","text":"@notice Updates the address that the contract will make OperatorFilter checks against.\n @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\n @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed."},"functionSelector":"114ba8ee","id":37058,"implemented":true,"kind":"function","modifiers":[],"name":"updateOperatorFilterRegistry","nameLocation":"1132:28:344","nodeType":"FunctionDefinition","parameters":{"id":37038,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37037,"mutability":"mutable","name":"registry","nameLocation":"1185:8:344","nodeType":"VariableDeclaration","scope":37058,"src":"1161:32:344","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37036,"nodeType":"UserDefinedTypeName","pathNode":{"id":37035,"name":"IOperatorFilterRegistry","nameLocations":["1161:23:344"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1161:23:344"},"referencedDeclaration":37474,"src":"1161:23:344","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1160:34:344"},"returnParameters":{"id":37039,"nodeType":"ParameterList","parameters":[],"src":"1212:0:344"},"scope":37073,"src":"1123:257:344","stateMutability":"nonpayable","virtual":true,"visibility":"external"},{"body":{"id":37071,"nodeType":"Block","src":"1535:81:344","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37065,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1552:23:344","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":37066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1576:6:344","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1552:30:344","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":37067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1552:32:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37068,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1585:22:344","memberName":"operatorFilterRegistry","nodeType":"MemberAccess","referencedDeclaration":37807,"src":"1552:55:344","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$returns$_t_contract$_IOperatorFilterRegistry_$37474_$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer) view returns (contract IOperatorFilterRegistry)"}},"id":37069,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1552:57:344","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"functionReturnParameters":37064,"id":37070,"nodeType":"Return","src":"1545:64:344"}]},"documentation":{"id":37059,"nodeType":"StructuredDocumentation","src":"1386:54:344","text":"@notice Gets the operator filter registry address."},"functionSelector":"b0ccc31e","id":37072,"implemented":true,"kind":"function","modifiers":[],"name":"operatorFilterRegistry","nameLocation":"1454:22:344","nodeType":"FunctionDefinition","parameters":{"id":37060,"nodeType":"ParameterList","parameters":[],"src":"1476:2:344"},"returnParameters":{"id":37064,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37063,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37072,"src":"1510:23:344","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37062,"nodeType":"UserDefinedTypeName","pathNode":{"id":37061,"name":"IOperatorFilterRegistry","nameLocations":["1510:23:344"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1510:23:344"},"referencedDeclaration":37474,"src":"1510:23:344","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1509:25:344"},"scope":37073,"src":"1445:171:344","stateMutability":"view","virtual":true,"visibility":"external"}],"scope":37074,"src":"622:996:344","usedErrors":[8246],"usedEvents":[]}],"src":"32:1587:344"},"id":344},"contracts/token/royalty/errors/ERC2981Errors.sol":{"ast":{"absolutePath":"contracts/token/royalty/errors/ERC2981Errors.sol","exportedSymbols":{"ERC2981IncorrectRoyaltyPercentage":[37080],"ERC2981IncorrectRoyaltyReceiver":[37083]},"id":37084,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37075,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:345"},{"documentation":{"id":37076,"nodeType":"StructuredDocumentation","src":"58:168:345","text":"@notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\n @param percentage The royalty percentage that was attempted to be set."},"errorSelector":"ac040408","id":37080,"name":"ERC2981IncorrectRoyaltyPercentage","nameLocation":"232:33:345","nodeType":"ErrorDefinition","parameters":{"id":37079,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37078,"mutability":"mutable","name":"percentage","nameLocation":"274:10:345","nodeType":"VariableDeclaration","scope":37080,"src":"266:18:345","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37077,"name":"uint256","nodeType":"ElementaryTypeName","src":"266:7:345","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"265:20:345"},"src":"226:60:345"},{"documentation":{"id":37081,"nodeType":"StructuredDocumentation","src":"288:77:345","text":"@notice Thrown when setting a royalty receiver that is the zero address."},"errorSelector":"16de0c80","id":37083,"name":"ERC2981IncorrectRoyaltyReceiver","nameLocation":"371:31:345","nodeType":"ErrorDefinition","parameters":{"id":37082,"nodeType":"ParameterList","parameters":[],"src":"402:2:345"},"src":"365:40:345"}],"src":"32:374:345"},"id":345},"contracts/token/royalty/errors/OperatorFiltererErrors.sol":{"ast":{"absolutePath":"contracts/token/royalty/errors/OperatorFiltererErrors.sol","exportedSymbols":{"OperatorNotAllowed":[37090]},"id":37091,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37085,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:346"},{"documentation":{"id":37086,"nodeType":"StructuredDocumentation","src":"58:145:346","text":"@notice Thrown when transferring to or giving approval to a non-authorized operator.\n @param operator The address that is not authorized."},"errorSelector":"ede71dcc","id":37090,"name":"OperatorNotAllowed","nameLocation":"209:18:346","nodeType":"ErrorDefinition","parameters":{"id":37089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37088,"mutability":"mutable","name":"operator","nameLocation":"236:8:346","nodeType":"VariableDeclaration","scope":37090,"src":"228:16:346","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37087,"name":"address","nodeType":"ElementaryTypeName","src":"228:7:346","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"227:18:346"},"src":"203:43:346"}],"src":"32:215:346"},"id":346},"contracts/token/royalty/facets/ERC2981Facet.sol":{"ast":{"absolutePath":"contracts/token/royalty/facets/ERC2981Facet.sol","exportedSymbols":{"Context":[1206],"ERC2981Base":[37012],"ERC2981Facet":[37171],"ERC2981Storage":[37657],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"ProxyAdminStorage":[19477]},"id":37172,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37092,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:347"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":37094,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":13387,"src":"57:87:347","symbolAliases":[{"foreign":{"id":37093,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","file":"./../libraries/ERC2981Storage.sol","id":37096,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":37658,"src":"145:65:347","symbolAliases":[{"foreign":{"id":37095,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"153:14:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":37098,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":19478,"src":"211:83:347","symbolAliases":[{"foreign":{"id":37097,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"219:17:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/ERC2981Base.sol","file":"./../base/ERC2981Base.sol","id":37100,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":37013,"src":"295:54:347","symbolAliases":[{"foreign":{"id":37099,"name":"ERC2981Base","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37012,"src":"303:11:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":37102,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":1207,"src":"350:66:347","symbolAliases":[{"foreign":{"id":37101,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"358:7:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":37104,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37172,"sourceUnit":13298,"src":"417:101:347","symbolAliases":[{"foreign":{"id":37103,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"425:28:347","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":37106,"name":"ERC2981Base","nameLocations":["842:11:347"],"nodeType":"IdentifierPath","referencedDeclaration":37012,"src":"842:11:347"},"id":37107,"nodeType":"InheritanceSpecifier","src":"842:11:347"},{"baseName":{"id":37108,"name":"ForwarderRegistryContextBase","nameLocations":["855:28:347"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"855:28:347"},"id":37109,"nodeType":"InheritanceSpecifier","src":"855:28:347"}],"canonicalName":"ERC2981Facet","contractDependencies":[],"contractKind":"contract","documentation":{"id":37105,"nodeType":"StructuredDocumentation","src":"520:297:347","text":"@title ERC2981 NFT Royalty Standard (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}."},"fullyImplemented":true,"id":37171,"linearizedBaseContracts":[37171,13297,37012,37280,1206],"name":"ERC2981Facet","nameLocation":"826:12:347","nodeType":"ContractDefinition","nodes":[{"global":false,"id":37113,"libraryName":{"id":37110,"name":"ProxyAdminStorage","nameLocations":["896:17:347"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"896:17:347"},"nodeType":"UsingForDirective","src":"890:53:347","typeName":{"id":37112,"nodeType":"UserDefinedTypeName","pathNode":{"id":37111,"name":"ProxyAdminStorage.Layout","nameLocations":["918:17:347","936:6:347"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"918:24:347"},"referencedDeclaration":19308,"src":"918:24:347","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"body":{"id":37122,"nodeType":"Block","src":"1047:2:347","statements":[]},"id":37123,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":37119,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37116,"src":"1028:17:347","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":37120,"kind":"baseConstructorSpecifier","modifierName":{"id":37118,"name":"ForwarderRegistryContextBase","nameLocations":["999:28:347"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"999:28:347"},"nodeType":"ModifierInvocation","src":"999:47:347"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":37117,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37116,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"980:17:347","nodeType":"VariableDeclaration","scope":37123,"src":"961:36:347","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":37115,"nodeType":"UserDefinedTypeName","pathNode":{"id":37114,"name":"IForwarderRegistry","nameLocations":["961:18:347"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"961:18:347"},"referencedDeclaration":13386,"src":"961:18:347","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"960:38:347"},"returnParameters":{"id":37121,"nodeType":"ParameterList","parameters":[],"src":"1047:0:347"},"scope":37171,"src":"949:100:347","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":37141,"nodeType":"Block","src":"1246:108:347","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":37132,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[37156],"referencedDeclaration":37156,"src":"1303:10:347","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":37133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1303:12:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37127,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1256:17:347","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":37129,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1274:6:347","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1256:24:347","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":37130,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1256:26:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":37131,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1283:19:347","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1256:46:347","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":37134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1256:60:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37135,"nodeType":"ExpressionStatement","src":"1256:60:347"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37136,"name":"ERC2981Storage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37657,"src":"1326:14:347","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ERC2981Storage_$37657_$","typeString":"type(library ERC2981Storage)"}},"id":37138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1341:4:347","memberName":"init","nodeType":"MemberAccess","referencedDeclaration":37525,"src":"1326:19:347","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":37139,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1326:21:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37140,"nodeType":"ExpressionStatement","src":"1326:21:347"}]},"documentation":{"id":37124,"nodeType":"StructuredDocumentation","src":"1055:154:347","text":"@notice Marks the following ERC165 interface(s) as supported: ERC2981.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"functionSelector":"d60da201","id":37142,"implemented":true,"kind":"function","modifiers":[],"name":"initERC2981","nameLocation":"1223:11:347","nodeType":"FunctionDefinition","parameters":{"id":37125,"nodeType":"ParameterList","parameters":[],"src":"1234:2:347"},"returnParameters":{"id":37126,"nodeType":"ParameterList","parameters":[],"src":"1246:0:347"},"scope":37171,"src":"1214:140:347","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":37155,"nodeType":"Block","src":"1519:65:347","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37151,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1536:28:347","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":37152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1565:10:347","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"1536:39:347","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":37153,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1536:41:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":37150,"id":37154,"nodeType":"Return","src":"1529:48:347"}]},"documentation":{"id":37143,"nodeType":"StructuredDocumentation","src":"1360:44:347","text":"@inheritdoc ForwarderRegistryContextBase"},"id":37156,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1418:10:347","nodeType":"FunctionDefinition","overrides":{"id":37147,"nodeType":"OverrideSpecifier","overrides":[{"id":37145,"name":"Context","nameLocations":["1462:7:347"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1462:7:347"},{"id":37146,"name":"ForwarderRegistryContextBase","nameLocations":["1471:28:347"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1471:28:347"}],"src":"1453:47:347"},"parameters":{"id":37144,"nodeType":"ParameterList","parameters":[],"src":"1428:2:347"},"returnParameters":{"id":37150,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37149,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37156,"src":"1510:7:347","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37148,"name":"address","nodeType":"ElementaryTypeName","src":"1510:7:347","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1509:9:347"},"scope":37171,"src":"1409:175:347","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":37169,"nodeType":"Block","src":"1754:63:347","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37165,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"1771:28:347","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":37166,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1800:8:347","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"1771:37:347","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":37167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1771:39:347","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":37164,"id":37168,"nodeType":"Return","src":"1764:46:347"}]},"documentation":{"id":37157,"nodeType":"StructuredDocumentation","src":"1590:44:347","text":"@inheritdoc ForwarderRegistryContextBase"},"id":37170,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"1648:8:347","nodeType":"FunctionDefinition","overrides":{"id":37161,"nodeType":"OverrideSpecifier","overrides":[{"id":37159,"name":"Context","nameLocations":["1690:7:347"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"1690:7:347"},{"id":37160,"name":"ForwarderRegistryContextBase","nameLocations":["1699:28:347"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1699:28:347"}],"src":"1681:47:347"},"parameters":{"id":37158,"nodeType":"ParameterList","parameters":[],"src":"1656:2:347"},"returnParameters":{"id":37164,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37163,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37170,"src":"1738:14:347","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":37162,"name":"bytes","nodeType":"ElementaryTypeName","src":"1738:5:347","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1737:16:347"},"scope":37171,"src":"1639:178:347","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":37172,"src":"817:1002:347","usedErrors":[8246,11559,19183,37080,37083],"usedEvents":[]}],"src":"32:1788:347"},"id":347},"contracts/token/royalty/facets/OperatorFiltererFacet.sol":{"ast":{"absolutePath":"contracts/token/royalty/facets/OperatorFiltererFacet.sol","exportedSymbols":{"Context":[1206],"ForwarderRegistryContextBase":[13297],"IForwarderRegistry":[13386],"IOperatorFilterRegistry":[37474],"OperatorFiltererBase":[37073],"OperatorFiltererFacet":[37264],"OperatorFiltererStorage":[37870],"ProxyAdminStorage":[19477]},"id":37265,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37173,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:348"},{"absolutePath":"contracts/metatx/interfaces/IForwarderRegistry.sol","file":"./../../../metatx/interfaces/IForwarderRegistry.sol","id":37175,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":13387,"src":"57:87:348","symbolAliases":[{"foreign":{"id":37174,"name":"IForwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13386,"src":"65:18:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../interfaces/IOperatorFilterRegistry.sol","id":37177,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":37475,"src":"145:84:348","symbolAliases":[{"foreign":{"id":37176,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"153:23:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","file":"./../libraries/OperatorFiltererStorage.sol","id":37179,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":37871,"src":"230:83:348","symbolAliases":[{"foreign":{"id":37178,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"238:23:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyAdminStorage.sol","file":"./../../../proxy/libraries/ProxyAdminStorage.sol","id":37181,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":19478,"src":"314:83:348","symbolAliases":[{"foreign":{"id":37180,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"322:17:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/base/OperatorFiltererBase.sol","file":"./../base/OperatorFiltererBase.sol","id":37183,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":37074,"src":"398:72:348","symbolAliases":[{"foreign":{"id":37182,"name":"OperatorFiltererBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37073,"src":"406:20:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"@openzeppelin/contracts/utils/Context.sol","file":"@openzeppelin/contracts/utils/Context.sol","id":37185,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":1207,"src":"471:66:348","symbolAliases":[{"foreign":{"id":37184,"name":"Context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1206,"src":"479:7:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/metatx/base/ForwarderRegistryContextBase.sol","file":"./../../../metatx/base/ForwarderRegistryContextBase.sol","id":37187,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37265,"sourceUnit":13298,"src":"538:101:348","symbolAliases":[{"foreign":{"id":37186,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"546:28:348","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[{"baseName":{"id":37189,"name":"OperatorFiltererBase","nameLocations":["954:20:348"],"nodeType":"IdentifierPath","referencedDeclaration":37073,"src":"954:20:348"},"id":37190,"nodeType":"InheritanceSpecifier","src":"954:20:348"},{"baseName":{"id":37191,"name":"ForwarderRegistryContextBase","nameLocations":["976:28:348"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"976:28:348"},"id":37192,"nodeType":"InheritanceSpecifier","src":"976:28:348"}],"canonicalName":"OperatorFiltererFacet","contractDependencies":[],"contractKind":"contract","documentation":{"id":37188,"nodeType":"StructuredDocumentation","src":"641:279:348","text":"@title Operator Filterer for token contracts (facet version).\n @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\n @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}."},"fullyImplemented":true,"id":37264,"linearizedBaseContracts":[37264,13297,37073,1206],"name":"OperatorFiltererFacet","nameLocation":"929:21:348","nodeType":"ContractDefinition","nodes":[{"global":false,"id":37196,"libraryName":{"id":37193,"name":"ProxyAdminStorage","nameLocations":["1017:17:348"],"nodeType":"IdentifierPath","referencedDeclaration":19477,"src":"1017:17:348"},"nodeType":"UsingForDirective","src":"1011:53:348","typeName":{"id":37195,"nodeType":"UserDefinedTypeName","pathNode":{"id":37194,"name":"ProxyAdminStorage.Layout","nameLocations":["1039:17:348","1057:6:348"],"nodeType":"IdentifierPath","referencedDeclaration":19308,"src":"1039:24:348"},"referencedDeclaration":19308,"src":"1039:24:348","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout"}}},{"global":false,"id":37200,"libraryName":{"id":37197,"name":"OperatorFiltererStorage","nameLocations":["1075:23:348"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"1075:23:348"},"nodeType":"UsingForDirective","src":"1069:65:348","typeName":{"id":37199,"nodeType":"UserDefinedTypeName","pathNode":{"id":37198,"name":"OperatorFiltererStorage.Layout","nameLocations":["1103:23:348","1127:6:348"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"1103:30:348"},"referencedDeclaration":37673,"src":"1103:30:348","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"body":{"id":37209,"nodeType":"Block","src":"1238:2:348","statements":[]},"id":37210,"implemented":true,"kind":"constructor","modifiers":[{"arguments":[{"id":37206,"name":"forwarderRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37203,"src":"1219:17:348","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}}],"id":37207,"kind":"baseConstructorSpecifier","modifierName":{"id":37205,"name":"ForwarderRegistryContextBase","nameLocations":["1190:28:348"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"1190:28:348"},"nodeType":"ModifierInvocation","src":"1190:47:348"}],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":37204,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37203,"mutability":"mutable","name":"forwarderRegistry","nameLocation":"1171:17:348","nodeType":"VariableDeclaration","scope":37210,"src":"1152:36:348","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"},"typeName":{"id":37202,"nodeType":"UserDefinedTypeName","pathNode":{"id":37201,"name":"IForwarderRegistry","nameLocations":["1152:18:348"],"nodeType":"IdentifierPath","referencedDeclaration":13386,"src":"1152:18:348"},"referencedDeclaration":13386,"src":"1152:18:348","typeDescriptions":{"typeIdentifier":"t_contract$_IForwarderRegistry_$13386","typeString":"contract IForwarderRegistry"}},"visibility":"internal"}],"src":"1151:38:348"},"returnParameters":{"id":37208,"nodeType":"ParameterList","parameters":[],"src":"1238:0:348"},"scope":37264,"src":"1140:100:348","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":37234,"nodeType":"Block","src":"1756:153:348","statements":[{"expression":{"arguments":[{"arguments":[],"expression":{"argumentTypes":[],"id":37222,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[37249],"referencedDeclaration":37249,"src":"1813:10:348","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":37223,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1813:12:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37217,"name":"ProxyAdminStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19477,"src":"1766:17:348","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyAdminStorage_$19477_$","typeString":"type(library ProxyAdminStorage)"}},"id":37219,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1784:6:348","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":19476,"src":"1766:24:348","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function () pure returns (struct ProxyAdminStorage.Layout storage pointer)"}},"id":37220,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1766:26:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$19308_storage_ptr","typeString":"struct ProxyAdminStorage.Layout storage pointer"}},"id":37221,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1793:19:348","memberName":"enforceIsProxyAdmin","nodeType":"MemberAccess","referencedDeclaration":19464,"src":"1766:46:348","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$19308_storage_ptr_$_t_address_$returns$__$attached_to$_t_struct$_Layout_$19308_storage_ptr_$","typeString":"function (struct ProxyAdminStorage.Layout storage pointer,address) view"}},"id":37224,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1766:60:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37225,"nodeType":"ExpressionStatement","src":"1766:60:348"},{"expression":{"arguments":[{"id":37231,"name":"operatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37214,"src":"1879:22:348","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37226,"name":"OperatorFiltererStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37870,"src":"1836:23:348","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_OperatorFiltererStorage_$37870_$","typeString":"type(library OperatorFiltererStorage)"}},"id":37228,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1860:6:348","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":37819,"src":"1836:30:348","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function () pure returns (struct OperatorFiltererStorage.Layout storage pointer)"}},"id":37229,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1836:32:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37230,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1869:9:348","memberName":"proxyInit","nodeType":"MemberAccess","referencedDeclaration":37740,"src":"1836:42:348","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":37232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1836:66:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37233,"nodeType":"ExpressionStatement","src":"1836:66:348"}]},"documentation":{"id":37211,"nodeType":"StructuredDocumentation","src":"1246:418:348","text":"@notice Sets the address that the contract will make OperatorFilter checks against.\n @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed."},"functionSelector":"30fd6a75","id":37235,"implemented":true,"kind":"function","modifiers":[],"name":"initOperatorFilterer","nameLocation":"1678:20:348","nodeType":"FunctionDefinition","parameters":{"id":37215,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37214,"mutability":"mutable","name":"operatorFilterRegistry","nameLocation":"1723:22:348","nodeType":"VariableDeclaration","scope":37235,"src":"1699:46:348","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37213,"nodeType":"UserDefinedTypeName","pathNode":{"id":37212,"name":"IOperatorFilterRegistry","nameLocations":["1699:23:348"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1699:23:348"},"referencedDeclaration":37474,"src":"1699:23:348","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1698:48:348"},"returnParameters":{"id":37216,"nodeType":"ParameterList","parameters":[],"src":"1756:0:348"},"scope":37264,"src":"1669:240:348","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"baseFunctions":[1188,13231],"body":{"id":37248,"nodeType":"Block","src":"2074:65:348","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37244,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2091:28:348","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":37245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2120:10:348","memberName":"_msgSender","nodeType":"MemberAccess","referencedDeclaration":13231,"src":"2091:39:348","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":37246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2091:41:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":37243,"id":37247,"nodeType":"Return","src":"2084:48:348"}]},"documentation":{"id":37236,"nodeType":"StructuredDocumentation","src":"1915:44:348","text":"@inheritdoc ForwarderRegistryContextBase"},"id":37249,"implemented":true,"kind":"function","modifiers":[],"name":"_msgSender","nameLocation":"1973:10:348","nodeType":"FunctionDefinition","overrides":{"id":37240,"nodeType":"OverrideSpecifier","overrides":[{"id":37238,"name":"Context","nameLocations":["2017:7:348"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2017:7:348"},{"id":37239,"name":"ForwarderRegistryContextBase","nameLocations":["2026:28:348"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2026:28:348"}],"src":"2008:47:348"},"parameters":{"id":37237,"nodeType":"ParameterList","parameters":[],"src":"1983:2:348"},"returnParameters":{"id":37243,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37242,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37249,"src":"2065:7:348","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37241,"name":"address","nodeType":"ElementaryTypeName","src":"2065:7:348","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2064:9:348"},"scope":37264,"src":"1964:175:348","stateMutability":"view","virtual":true,"visibility":"internal"},{"baseFunctions":[1197,13296],"body":{"id":37262,"nodeType":"Block","src":"2309:63:348","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37258,"name":"ForwarderRegistryContextBase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13297,"src":"2326:28:348","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ForwarderRegistryContextBase_$13297_$","typeString":"type(contract ForwarderRegistryContextBase)"}},"id":37259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2355:8:348","memberName":"_msgData","nodeType":"MemberAccess","referencedDeclaration":13296,"src":"2326:37:348","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$","typeString":"function () view returns (bytes calldata)"}},"id":37260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2326:39:348","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"functionReturnParameters":37257,"id":37261,"nodeType":"Return","src":"2319:46:348"}]},"documentation":{"id":37250,"nodeType":"StructuredDocumentation","src":"2145:44:348","text":"@inheritdoc ForwarderRegistryContextBase"},"id":37263,"implemented":true,"kind":"function","modifiers":[],"name":"_msgData","nameLocation":"2203:8:348","nodeType":"FunctionDefinition","overrides":{"id":37254,"nodeType":"OverrideSpecifier","overrides":[{"id":37252,"name":"Context","nameLocations":["2245:7:348"],"nodeType":"IdentifierPath","referencedDeclaration":1206,"src":"2245:7:348"},{"id":37253,"name":"ForwarderRegistryContextBase","nameLocations":["2254:28:348"],"nodeType":"IdentifierPath","referencedDeclaration":13297,"src":"2254:28:348"}],"src":"2236:47:348"},"parameters":{"id":37251,"nodeType":"ParameterList","parameters":[],"src":"2211:2:348"},"returnParameters":{"id":37257,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37256,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37263,"src":"2293:14:348","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":37255,"name":"bytes","nodeType":"ElementaryTypeName","src":"2293:5:348","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2292:16:348"},"scope":37264,"src":"2194:178:348","stateMutability":"view","virtual":true,"visibility":"internal"}],"scope":37265,"src":"920:1454:348","usedErrors":[8246,19183,19192],"usedEvents":[]}],"src":"32:2343:348"},"id":348},"contracts/token/royalty/interfaces/IERC2981.sol":{"ast":{"absolutePath":"contracts/token/royalty/interfaces/IERC2981.sol","exportedSymbols":{"IERC2981":[37280]},"id":37281,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37266,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:349"},{"abstract":false,"baseContracts":[],"canonicalName":"IERC2981","contractDependencies":[],"contractKind":"interface","documentation":{"id":37267,"nodeType":"StructuredDocumentation","src":"58:166:349","text":"@title ERC2981 NFT Royalty Standard.\n @dev See https://eips.ethereum.org/EIPS/eip-2981\n @dev Note: The ERC-165 identifier for this interface is 0x2a55205a."},"fullyImplemented":false,"id":37280,"linearizedBaseContracts":[37280],"name":"IERC2981","nameLocation":"234:8:349","nodeType":"ContractDefinition","nodes":[{"documentation":{"id":37268,"nodeType":"StructuredDocumentation","src":"249:386:349","text":"@notice Called with the sale price to determine how much royalty is owed and to whom.\n @param tokenId The NFT asset queried for royalty information\n @param salePrice The sale price of the NFT asset specified by `tokenId`\n @return receiver Address of who should be sent the royalty payment\n @return royaltyAmount The royalty payment amount for `salePrice`"},"functionSelector":"2a55205a","id":37279,"implemented":false,"kind":"function","modifiers":[],"name":"royaltyInfo","nameLocation":"649:11:349","nodeType":"FunctionDefinition","parameters":{"id":37273,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37270,"mutability":"mutable","name":"tokenId","nameLocation":"669:7:349","nodeType":"VariableDeclaration","scope":37279,"src":"661:15:349","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37269,"name":"uint256","nodeType":"ElementaryTypeName","src":"661:7:349","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":37272,"mutability":"mutable","name":"salePrice","nameLocation":"686:9:349","nodeType":"VariableDeclaration","scope":37279,"src":"678:17:349","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37271,"name":"uint256","nodeType":"ElementaryTypeName","src":"678:7:349","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"660:36:349"},"returnParameters":{"id":37278,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37275,"mutability":"mutable","name":"receiver","nameLocation":"728:8:349","nodeType":"VariableDeclaration","scope":37279,"src":"720:16:349","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37274,"name":"address","nodeType":"ElementaryTypeName","src":"720:7:349","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37277,"mutability":"mutable","name":"royaltyAmount","nameLocation":"746:13:349","nodeType":"VariableDeclaration","scope":37279,"src":"738:21:349","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37276,"name":"uint256","nodeType":"ElementaryTypeName","src":"738:7:349","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"719:41:349"},"scope":37280,"src":"640:121:349","stateMutability":"view","virtual":false,"visibility":"external"}],"scope":37281,"src":"224:539:349","usedErrors":[],"usedEvents":[]}],"src":"32:732:349"},"id":349},"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol":{"ast":{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","exportedSymbols":{"IOperatorFilterRegistry":[37474]},"id":37475,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37282,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:350"},{"abstract":false,"baseContracts":[],"canonicalName":"IOperatorFilterRegistry","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":37474,"linearizedBaseContracts":[37474],"name":"IOperatorFilterRegistry","nameLocation":"68:23:350","nodeType":"ContractDefinition","nodes":[{"functionSelector":"c6171134","id":37291,"implemented":false,"kind":"function","modifiers":[],"name":"isOperatorAllowed","nameLocation":"107:17:350","nodeType":"FunctionDefinition","parameters":{"id":37287,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37284,"mutability":"mutable","name":"registrant","nameLocation":"133:10:350","nodeType":"VariableDeclaration","scope":37291,"src":"125:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37283,"name":"address","nodeType":"ElementaryTypeName","src":"125:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37286,"mutability":"mutable","name":"operator","nameLocation":"153:8:350","nodeType":"VariableDeclaration","scope":37291,"src":"145:16:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37285,"name":"address","nodeType":"ElementaryTypeName","src":"145:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"124:38:350"},"returnParameters":{"id":37290,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37289,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37291,"src":"186:4:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37288,"name":"bool","nodeType":"ElementaryTypeName","src":"186:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"185:6:350"},"scope":37474,"src":"98:94:350","stateMutability":"view","virtual":false,"visibility":"external"},{"functionSelector":"4420e486","id":37296,"implemented":false,"kind":"function","modifiers":[],"name":"register","nameLocation":"207:8:350","nodeType":"FunctionDefinition","parameters":{"id":37294,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37293,"mutability":"mutable","name":"registrant","nameLocation":"224:10:350","nodeType":"VariableDeclaration","scope":37296,"src":"216:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37292,"name":"address","nodeType":"ElementaryTypeName","src":"216:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"215:20:350"},"returnParameters":{"id":37295,"nodeType":"ParameterList","parameters":[],"src":"244:0:350"},"scope":37474,"src":"198:47:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"7d3e3dbe","id":37303,"implemented":false,"kind":"function","modifiers":[],"name":"registerAndSubscribe","nameLocation":"260:20:350","nodeType":"FunctionDefinition","parameters":{"id":37301,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37298,"mutability":"mutable","name":"registrant","nameLocation":"289:10:350","nodeType":"VariableDeclaration","scope":37303,"src":"281:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37297,"name":"address","nodeType":"ElementaryTypeName","src":"281:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37300,"mutability":"mutable","name":"subscription","nameLocation":"309:12:350","nodeType":"VariableDeclaration","scope":37303,"src":"301:20:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37299,"name":"address","nodeType":"ElementaryTypeName","src":"301:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"280:42:350"},"returnParameters":{"id":37302,"nodeType":"ParameterList","parameters":[],"src":"331:0:350"},"scope":37474,"src":"251:81:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"a0af2903","id":37310,"implemented":false,"kind":"function","modifiers":[],"name":"registerAndCopyEntries","nameLocation":"347:22:350","nodeType":"FunctionDefinition","parameters":{"id":37308,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37305,"mutability":"mutable","name":"registrant","nameLocation":"378:10:350","nodeType":"VariableDeclaration","scope":37310,"src":"370:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37304,"name":"address","nodeType":"ElementaryTypeName","src":"370:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37307,"mutability":"mutable","name":"registrantToCopy","nameLocation":"398:16:350","nodeType":"VariableDeclaration","scope":37310,"src":"390:24:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37306,"name":"address","nodeType":"ElementaryTypeName","src":"390:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"369:46:350"},"returnParameters":{"id":37309,"nodeType":"ParameterList","parameters":[],"src":"424:0:350"},"scope":37474,"src":"338:87:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"2ec2c246","id":37315,"implemented":false,"kind":"function","modifiers":[],"name":"unregister","nameLocation":"440:10:350","nodeType":"FunctionDefinition","parameters":{"id":37313,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37312,"mutability":"mutable","name":"addr","nameLocation":"459:4:350","nodeType":"VariableDeclaration","scope":37315,"src":"451:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37311,"name":"address","nodeType":"ElementaryTypeName","src":"451:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"450:14:350"},"returnParameters":{"id":37314,"nodeType":"ParameterList","parameters":[],"src":"473:0:350"},"scope":37474,"src":"431:43:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"a2f367ab","id":37324,"implemented":false,"kind":"function","modifiers":[],"name":"updateOperator","nameLocation":"489:14:350","nodeType":"FunctionDefinition","parameters":{"id":37322,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37317,"mutability":"mutable","name":"registrant","nameLocation":"512:10:350","nodeType":"VariableDeclaration","scope":37324,"src":"504:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37316,"name":"address","nodeType":"ElementaryTypeName","src":"504:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37319,"mutability":"mutable","name":"operator","nameLocation":"532:8:350","nodeType":"VariableDeclaration","scope":37324,"src":"524:16:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37318,"name":"address","nodeType":"ElementaryTypeName","src":"524:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37321,"mutability":"mutable","name":"filtered","nameLocation":"547:8:350","nodeType":"VariableDeclaration","scope":37324,"src":"542:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37320,"name":"bool","nodeType":"ElementaryTypeName","src":"542:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"503:53:350"},"returnParameters":{"id":37323,"nodeType":"ParameterList","parameters":[],"src":"565:0:350"},"scope":37474,"src":"480:86:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"a14584c1","id":37334,"implemented":false,"kind":"function","modifiers":[],"name":"updateOperators","nameLocation":"581:15:350","nodeType":"FunctionDefinition","parameters":{"id":37332,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37326,"mutability":"mutable","name":"registrant","nameLocation":"605:10:350","nodeType":"VariableDeclaration","scope":37334,"src":"597:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37325,"name":"address","nodeType":"ElementaryTypeName","src":"597:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37329,"mutability":"mutable","name":"operators","nameLocation":"636:9:350","nodeType":"VariableDeclaration","scope":37334,"src":"617:28:350","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_calldata_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":37327,"name":"address","nodeType":"ElementaryTypeName","src":"617:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37328,"nodeType":"ArrayTypeName","src":"617:9:350","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"},{"constant":false,"id":37331,"mutability":"mutable","name":"filtered","nameLocation":"652:8:350","nodeType":"VariableDeclaration","scope":37334,"src":"647:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37330,"name":"bool","nodeType":"ElementaryTypeName","src":"647:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"596:65:350"},"returnParameters":{"id":37333,"nodeType":"ParameterList","parameters":[],"src":"670:0:350"},"scope":37474,"src":"572:99:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"712fc00b","id":37343,"implemented":false,"kind":"function","modifiers":[],"name":"updateCodeHash","nameLocation":"686:14:350","nodeType":"FunctionDefinition","parameters":{"id":37341,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37336,"mutability":"mutable","name":"registrant","nameLocation":"709:10:350","nodeType":"VariableDeclaration","scope":37343,"src":"701:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37335,"name":"address","nodeType":"ElementaryTypeName","src":"701:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37338,"mutability":"mutable","name":"codehash","nameLocation":"729:8:350","nodeType":"VariableDeclaration","scope":37343,"src":"721:16:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37337,"name":"bytes32","nodeType":"ElementaryTypeName","src":"721:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":37340,"mutability":"mutable","name":"filtered","nameLocation":"744:8:350","nodeType":"VariableDeclaration","scope":37343,"src":"739:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37339,"name":"bool","nodeType":"ElementaryTypeName","src":"739:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"700:53:350"},"returnParameters":{"id":37342,"nodeType":"ParameterList","parameters":[],"src":"762:0:350"},"scope":37474,"src":"677:86:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"063298b6","id":37353,"implemented":false,"kind":"function","modifiers":[],"name":"updateCodeHashes","nameLocation":"778:16:350","nodeType":"FunctionDefinition","parameters":{"id":37351,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37345,"mutability":"mutable","name":"registrant","nameLocation":"803:10:350","nodeType":"VariableDeclaration","scope":37353,"src":"795:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37344,"name":"address","nodeType":"ElementaryTypeName","src":"795:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37348,"mutability":"mutable","name":"codeHashes","nameLocation":"834:10:350","nodeType":"VariableDeclaration","scope":37353,"src":"815:29:350","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_calldata_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":37346,"name":"bytes32","nodeType":"ElementaryTypeName","src":"815:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":37347,"nodeType":"ArrayTypeName","src":"815:9:350","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"},{"constant":false,"id":37350,"mutability":"mutable","name":"filtered","nameLocation":"851:8:350","nodeType":"VariableDeclaration","scope":37353,"src":"846:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37349,"name":"bool","nodeType":"ElementaryTypeName","src":"846:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"794:66:350"},"returnParameters":{"id":37352,"nodeType":"ParameterList","parameters":[],"src":"869:0:350"},"scope":37474,"src":"769:101:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"b314d414","id":37360,"implemented":false,"kind":"function","modifiers":[],"name":"subscribe","nameLocation":"885:9:350","nodeType":"FunctionDefinition","parameters":{"id":37358,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37355,"mutability":"mutable","name":"registrant","nameLocation":"903:10:350","nodeType":"VariableDeclaration","scope":37360,"src":"895:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37354,"name":"address","nodeType":"ElementaryTypeName","src":"895:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37357,"mutability":"mutable","name":"registrantToSubscribe","nameLocation":"923:21:350","nodeType":"VariableDeclaration","scope":37360,"src":"915:29:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37356,"name":"address","nodeType":"ElementaryTypeName","src":"915:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"894:51:350"},"returnParameters":{"id":37359,"nodeType":"ParameterList","parameters":[],"src":"954:0:350"},"scope":37474,"src":"876:79:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"34a0dc10","id":37367,"implemented":false,"kind":"function","modifiers":[],"name":"unsubscribe","nameLocation":"970:11:350","nodeType":"FunctionDefinition","parameters":{"id":37365,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37362,"mutability":"mutable","name":"registrant","nameLocation":"990:10:350","nodeType":"VariableDeclaration","scope":37367,"src":"982:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37361,"name":"address","nodeType":"ElementaryTypeName","src":"982:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37364,"mutability":"mutable","name":"copyExistingEntries","nameLocation":"1007:19:350","nodeType":"VariableDeclaration","scope":37367,"src":"1002:24:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37363,"name":"bool","nodeType":"ElementaryTypeName","src":"1002:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"981:46:350"},"returnParameters":{"id":37366,"nodeType":"ParameterList","parameters":[],"src":"1036:0:350"},"scope":37474,"src":"961:76:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"3c5030bb","id":37374,"implemented":false,"kind":"function","modifiers":[],"name":"subscriptionOf","nameLocation":"1052:14:350","nodeType":"FunctionDefinition","parameters":{"id":37370,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37369,"mutability":"mutable","name":"addr","nameLocation":"1075:4:350","nodeType":"VariableDeclaration","scope":37374,"src":"1067:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37368,"name":"address","nodeType":"ElementaryTypeName","src":"1067:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1066:14:350"},"returnParameters":{"id":37373,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37372,"mutability":"mutable","name":"registrant","nameLocation":"1107:10:350","nodeType":"VariableDeclaration","scope":37374,"src":"1099:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37371,"name":"address","nodeType":"ElementaryTypeName","src":"1099:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1098:20:350"},"scope":37474,"src":"1043:76:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"5745ae28","id":37382,"implemented":false,"kind":"function","modifiers":[],"name":"subscribers","nameLocation":"1134:11:350","nodeType":"FunctionDefinition","parameters":{"id":37377,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37376,"mutability":"mutable","name":"registrant","nameLocation":"1154:10:350","nodeType":"VariableDeclaration","scope":37382,"src":"1146:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37375,"name":"address","nodeType":"ElementaryTypeName","src":"1146:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1145:20:350"},"returnParameters":{"id":37381,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37380,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37382,"src":"1184:16:350","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":37378,"name":"address","nodeType":"ElementaryTypeName","src":"1184:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37379,"nodeType":"ArrayTypeName","src":"1184:9:350","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"1183:18:350"},"scope":37474,"src":"1125:77:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"55940e51","id":37391,"implemented":false,"kind":"function","modifiers":[],"name":"subscriberAt","nameLocation":"1217:12:350","nodeType":"FunctionDefinition","parameters":{"id":37387,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37384,"mutability":"mutable","name":"registrant","nameLocation":"1238:10:350","nodeType":"VariableDeclaration","scope":37391,"src":"1230:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37383,"name":"address","nodeType":"ElementaryTypeName","src":"1230:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37386,"mutability":"mutable","name":"index","nameLocation":"1258:5:350","nodeType":"VariableDeclaration","scope":37391,"src":"1250:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37385,"name":"uint256","nodeType":"ElementaryTypeName","src":"1250:7:350","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1229:35:350"},"returnParameters":{"id":37390,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37389,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37391,"src":"1283:7:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37388,"name":"address","nodeType":"ElementaryTypeName","src":"1283:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1282:9:350"},"scope":37474,"src":"1208:84:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"1e06b4b4","id":37398,"implemented":false,"kind":"function","modifiers":[],"name":"copyEntriesOf","nameLocation":"1307:13:350","nodeType":"FunctionDefinition","parameters":{"id":37396,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37393,"mutability":"mutable","name":"registrant","nameLocation":"1329:10:350","nodeType":"VariableDeclaration","scope":37398,"src":"1321:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37392,"name":"address","nodeType":"ElementaryTypeName","src":"1321:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37395,"mutability":"mutable","name":"registrantToCopy","nameLocation":"1349:16:350","nodeType":"VariableDeclaration","scope":37398,"src":"1341:24:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37394,"name":"address","nodeType":"ElementaryTypeName","src":"1341:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1320:46:350"},"returnParameters":{"id":37397,"nodeType":"ParameterList","parameters":[],"src":"1375:0:350"},"scope":37474,"src":"1298:78:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"e4aecb54","id":37407,"implemented":false,"kind":"function","modifiers":[],"name":"isOperatorFiltered","nameLocation":"1391:18:350","nodeType":"FunctionDefinition","parameters":{"id":37403,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37400,"mutability":"mutable","name":"registrant","nameLocation":"1418:10:350","nodeType":"VariableDeclaration","scope":37407,"src":"1410:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37399,"name":"address","nodeType":"ElementaryTypeName","src":"1410:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37402,"mutability":"mutable","name":"operator","nameLocation":"1438:8:350","nodeType":"VariableDeclaration","scope":37407,"src":"1430:16:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37401,"name":"address","nodeType":"ElementaryTypeName","src":"1430:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1409:38:350"},"returnParameters":{"id":37406,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37405,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37407,"src":"1466:4:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37404,"name":"bool","nodeType":"ElementaryTypeName","src":"1466:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1465:6:350"},"scope":37474,"src":"1382:90:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"5eae3173","id":37416,"implemented":false,"kind":"function","modifiers":[],"name":"isCodeHashOfFiltered","nameLocation":"1487:20:350","nodeType":"FunctionDefinition","parameters":{"id":37412,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37409,"mutability":"mutable","name":"registrant","nameLocation":"1516:10:350","nodeType":"VariableDeclaration","scope":37416,"src":"1508:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37408,"name":"address","nodeType":"ElementaryTypeName","src":"1508:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37411,"mutability":"mutable","name":"operatorWithCode","nameLocation":"1536:16:350","nodeType":"VariableDeclaration","scope":37416,"src":"1528:24:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37410,"name":"address","nodeType":"ElementaryTypeName","src":"1528:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1507:46:350"},"returnParameters":{"id":37415,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37414,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37416,"src":"1572:4:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37413,"name":"bool","nodeType":"ElementaryTypeName","src":"1572:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1571:6:350"},"scope":37474,"src":"1478:100:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"6af0c315","id":37425,"implemented":false,"kind":"function","modifiers":[],"name":"isCodeHashFiltered","nameLocation":"1593:18:350","nodeType":"FunctionDefinition","parameters":{"id":37421,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37418,"mutability":"mutable","name":"registrant","nameLocation":"1620:10:350","nodeType":"VariableDeclaration","scope":37425,"src":"1612:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37417,"name":"address","nodeType":"ElementaryTypeName","src":"1612:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37420,"mutability":"mutable","name":"codeHash","nameLocation":"1640:8:350","nodeType":"VariableDeclaration","scope":37425,"src":"1632:16:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37419,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1632:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1611:38:350"},"returnParameters":{"id":37424,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37423,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37425,"src":"1668:4:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37422,"name":"bool","nodeType":"ElementaryTypeName","src":"1668:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1667:6:350"},"scope":37474,"src":"1584:90:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"c4308805","id":37433,"implemented":false,"kind":"function","modifiers":[],"name":"filteredOperators","nameLocation":"1689:17:350","nodeType":"FunctionDefinition","parameters":{"id":37428,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37427,"mutability":"mutable","name":"addr","nameLocation":"1715:4:350","nodeType":"VariableDeclaration","scope":37433,"src":"1707:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37426,"name":"address","nodeType":"ElementaryTypeName","src":"1707:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1706:14:350"},"returnParameters":{"id":37432,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37431,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37433,"src":"1739:16:350","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_memory_ptr","typeString":"address[]"},"typeName":{"baseType":{"id":37429,"name":"address","nodeType":"ElementaryTypeName","src":"1739:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37430,"nodeType":"ArrayTypeName","src":"1739:9:350","typeDescriptions":{"typeIdentifier":"t_array$_t_address_$dyn_storage_ptr","typeString":"address[]"}},"visibility":"internal"}],"src":"1738:18:350"},"scope":37474,"src":"1680:77:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"22fa2762","id":37441,"implemented":false,"kind":"function","modifiers":[],"name":"filteredCodeHashes","nameLocation":"1772:18:350","nodeType":"FunctionDefinition","parameters":{"id":37436,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37435,"mutability":"mutable","name":"addr","nameLocation":"1799:4:350","nodeType":"VariableDeclaration","scope":37441,"src":"1791:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37434,"name":"address","nodeType":"ElementaryTypeName","src":"1791:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1790:14:350"},"returnParameters":{"id":37440,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37439,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37441,"src":"1823:16:350","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_memory_ptr","typeString":"bytes32[]"},"typeName":{"baseType":{"id":37437,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1823:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":37438,"nodeType":"ArrayTypeName","src":"1823:9:350","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes32_$dyn_storage_ptr","typeString":"bytes32[]"}},"visibility":"internal"}],"src":"1822:18:350"},"scope":37474,"src":"1763:78:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"3f1cc5fa","id":37450,"implemented":false,"kind":"function","modifiers":[],"name":"filteredOperatorAt","nameLocation":"1856:18:350","nodeType":"FunctionDefinition","parameters":{"id":37446,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37443,"mutability":"mutable","name":"registrant","nameLocation":"1883:10:350","nodeType":"VariableDeclaration","scope":37450,"src":"1875:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37442,"name":"address","nodeType":"ElementaryTypeName","src":"1875:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37445,"mutability":"mutable","name":"index","nameLocation":"1903:5:350","nodeType":"VariableDeclaration","scope":37450,"src":"1895:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37444,"name":"uint256","nodeType":"ElementaryTypeName","src":"1895:7:350","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1874:35:350"},"returnParameters":{"id":37449,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37448,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37450,"src":"1928:7:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37447,"name":"address","nodeType":"ElementaryTypeName","src":"1928:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1927:9:350"},"scope":37474,"src":"1847:90:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"a6529eb5","id":37459,"implemented":false,"kind":"function","modifiers":[],"name":"filteredCodeHashAt","nameLocation":"1952:18:350","nodeType":"FunctionDefinition","parameters":{"id":37455,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37452,"mutability":"mutable","name":"registrant","nameLocation":"1979:10:350","nodeType":"VariableDeclaration","scope":37459,"src":"1971:18:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37451,"name":"address","nodeType":"ElementaryTypeName","src":"1971:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37454,"mutability":"mutable","name":"index","nameLocation":"1999:5:350","nodeType":"VariableDeclaration","scope":37459,"src":"1991:13:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37453,"name":"uint256","nodeType":"ElementaryTypeName","src":"1991:7:350","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1970:35:350"},"returnParameters":{"id":37458,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37457,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37459,"src":"2024:7:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37456,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2024:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2023:9:350"},"scope":37474,"src":"1943:90:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"c3c5a547","id":37466,"implemented":false,"kind":"function","modifiers":[],"name":"isRegistered","nameLocation":"2048:12:350","nodeType":"FunctionDefinition","parameters":{"id":37462,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37461,"mutability":"mutable","name":"addr","nameLocation":"2069:4:350","nodeType":"VariableDeclaration","scope":37466,"src":"2061:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37460,"name":"address","nodeType":"ElementaryTypeName","src":"2061:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2060:14:350"},"returnParameters":{"id":37465,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37464,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37466,"src":"2093:4:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37463,"name":"bool","nodeType":"ElementaryTypeName","src":"2093:4:350","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2092:6:350"},"scope":37474,"src":"2039:60:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"functionSelector":"bbd652c7","id":37473,"implemented":false,"kind":"function","modifiers":[],"name":"codeHashOf","nameLocation":"2114:10:350","nodeType":"FunctionDefinition","parameters":{"id":37469,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37468,"mutability":"mutable","name":"addr","nameLocation":"2133:4:350","nodeType":"VariableDeclaration","scope":37473,"src":"2125:12:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37467,"name":"address","nodeType":"ElementaryTypeName","src":"2125:7:350","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2124:14:350"},"returnParameters":{"id":37472,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37471,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37473,"src":"2157:7:350","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37470,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2157:7:350","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"2156:9:350"},"scope":37474,"src":"2105:61:350","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":37475,"src":"58:2110:350","usedErrors":[],"usedEvents":[]}],"src":"32:2137:350"},"id":350},"contracts/token/royalty/libraries/ERC2981Storage.sol":{"ast":{"absolutePath":"contracts/token/royalty/libraries/ERC2981Storage.sol","exportedSymbols":{"ERC2981IncorrectRoyaltyPercentage":[37080],"ERC2981IncorrectRoyaltyReceiver":[37083],"ERC2981Storage":[37657],"IERC2981":[37280],"InterfaceDetectionStorage":[11680]},"id":37658,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37476,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:351"},{"absolutePath":"contracts/token/royalty/errors/ERC2981Errors.sol","file":"./../errors/ERC2981Errors.sol","id":37479,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37658,"sourceUnit":37084,"src":"58:113:351","symbolAliases":[{"foreign":{"id":37477,"name":"ERC2981IncorrectRoyaltyReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37083,"src":"66:31:351","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":37478,"name":"ERC2981IncorrectRoyaltyPercentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37080,"src":"99:33:351","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IERC2981.sol","file":"./../interfaces/IERC2981.sol","id":37481,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37658,"sourceUnit":37281,"src":"172:54:351","symbolAliases":[{"foreign":{"id":37480,"name":"IERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37280,"src":"180:8:351","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/introspection/libraries/InterfaceDetectionStorage.sol","file":"./../../../introspection/libraries/InterfaceDetectionStorage.sol","id":37483,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37658,"sourceUnit":11681,"src":"227:107:351","symbolAliases":[{"foreign":{"id":37482,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"235:25:351","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"ERC2981Storage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":37657,"linearizedBaseContracts":[37657],"name":"ERC2981Storage","nameLocation":"344:14:351","nodeType":"ContractDefinition","nodes":[{"global":false,"id":37487,"libraryName":{"id":37484,"name":"InterfaceDetectionStorage","nameLocations":["371:25:351"],"nodeType":"IdentifierPath","referencedDeclaration":11680,"src":"371:25:351"},"nodeType":"UsingForDirective","src":"365:69:351","typeName":{"id":37486,"nodeType":"UserDefinedTypeName","pathNode":{"id":37485,"name":"InterfaceDetectionStorage.Layout","nameLocations":["401:25:351","427:6:351"],"nodeType":"IdentifierPath","referencedDeclaration":11590,"src":"401:32:351"},"referencedDeclaration":11590,"src":"401:32:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout"}}},{"canonicalName":"ERC2981Storage.Layout","id":37492,"members":[{"constant":false,"id":37489,"mutability":"mutable","name":"royaltyReceiver","nameLocation":"472:15:351","nodeType":"VariableDeclaration","scope":37492,"src":"464:23:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37488,"name":"address","nodeType":"ElementaryTypeName","src":"464:7:351","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37491,"mutability":"mutable","name":"royaltyPercentage","nameLocation":"504:17:351","nodeType":"VariableDeclaration","scope":37492,"src":"497:24:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"},"typeName":{"id":37490,"name":"uint96","nodeType":"ElementaryTypeName","src":"497:6:351","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"visibility":"internal"}],"name":"Layout","nameLocation":"447:6:351","nodeType":"StructDefinition","scope":37657,"src":"440:88:351","visibility":"public"},{"constant":true,"id":37505,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"560:19:351","nodeType":"VariableDeclaration","scope":37657,"src":"534:120:351","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37493,"name":"bytes32","nodeType":"ElementaryTypeName","src":"534:7:351","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37503,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e726f79616c74792e455243323938312e73746f72616765","id":37499,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"608:39:351","typeDescriptions":{"typeIdentifier":"t_stringliteral_2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b80007826858","typeString":"literal_string \"animoca.token.royalty.ERC2981.storage\""},"value":"animoca.token.royalty.ERC2981.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b80007826858","typeString":"literal_string \"animoca.token.royalty.ERC2981.storage\""}],"id":37498,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"598:9:351","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":37500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"598:50:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":37497,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"590:7:351","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":37496,"name":"uint256","nodeType":"ElementaryTypeName","src":"590:7:351","typeDescriptions":{}}},"id":37501,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"590:59:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":37502,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"652:1:351","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"590:63:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"582:7:351","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":37494,"name":"bytes32","nodeType":"ElementaryTypeName","src":"582:7:351","typeDescriptions":{}}},"id":37504,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"582:72:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":37508,"mutability":"constant","name":"ROYALTY_FEE_DENOMINATOR","nameLocation":"687:23:351","nodeType":"VariableDeclaration","scope":37657,"src":"661:58:351","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37506,"name":"uint256","nodeType":"ElementaryTypeName","src":"661:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"313030303030","id":37507,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"713:6:351","typeDescriptions":{"typeIdentifier":"t_rational_100000_by_1","typeString":"int_const 100000"},"value":"100000"},"visibility":"internal"},{"body":{"id":37524,"nodeType":"Block","src":"830:107:351","statements":[{"expression":{"arguments":[{"expression":{"arguments":[{"id":37518,"name":"IERC2981","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37280,"src":"902:8:351","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IERC2981_$37280_$","typeString":"type(contract IERC2981)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_contract$_IERC2981_$37280_$","typeString":"type(contract IERC2981)"}],"id":37517,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"897:4:351","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":37519,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"897:14:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_contract$_IERC2981_$37280","typeString":"type(contract IERC2981)"}},"id":37520,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"912:11:351","memberName":"interfaceId","nodeType":"MemberAccess","src":"897:26:351","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"hexValue":"74727565","id":37521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"925:4:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":37512,"name":"InterfaceDetectionStorage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11680,"src":"840:25:351","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_InterfaceDetectionStorage_$11680_$","typeString":"type(library InterfaceDetectionStorage)"}},"id":37514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"866:6:351","memberName":"layout","nodeType":"MemberAccess","referencedDeclaration":11679,"src":"840:32:351","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$__$returns$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function () pure returns (struct InterfaceDetectionStorage.Layout storage pointer)"}},"id":37515,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"840:34:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$11590_storage_ptr","typeString":"struct InterfaceDetectionStorage.Layout storage pointer"}},"id":37516,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"875:21:351","memberName":"setSupportedInterface","nodeType":"MemberAccess","referencedDeclaration":11633,"src":"840:56:351","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$11590_storage_ptr_$_t_bytes4_$_t_bool_$returns$__$attached_to$_t_struct$_Layout_$11590_storage_ptr_$","typeString":"function (struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)"}},"id":37522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"840:90:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37523,"nodeType":"ExpressionStatement","src":"840:90:351"}]},"documentation":{"id":37509,"nodeType":"StructuredDocumentation","src":"726:74:351","text":"@notice Marks the following ERC165 interface(s) as supported: ERC2981."},"id":37525,"implemented":true,"kind":"function","modifiers":[],"name":"init","nameLocation":"814:4:351","nodeType":"FunctionDefinition","parameters":{"id":37510,"nodeType":"ParameterList","parameters":[],"src":"818:2:351"},"returnParameters":{"id":37511,"nodeType":"ParameterList","parameters":[],"src":"830:0:351"},"scope":37657,"src":"805:132:351","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37552,"nodeType":"Block","src":"1267:185:351","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37534,"name":"percentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37531,"src":"1281:10:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":37535,"name":"ROYALTY_FEE_DENOMINATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37508,"src":"1294:23:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1281:36:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37542,"nodeType":"IfStatement","src":"1277:119:351","trueBody":{"id":37541,"nodeType":"Block","src":"1319:77:351","statements":[{"errorCall":{"arguments":[{"id":37538,"name":"percentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37531,"src":"1374:10:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37537,"name":"ERC2981IncorrectRoyaltyPercentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37080,"src":"1340:33:351","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_uint256_$returns$_t_error_$","typeString":"function (uint256) pure returns (error)"}},"id":37539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1340:45:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":37540,"nodeType":"RevertStatement","src":"1333:52:351"}]}},{"expression":{"id":37550,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":37543,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37529,"src":"1405:1:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":37545,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1407:17:351","memberName":"royaltyPercentage","nodeType":"MemberAccess","referencedDeclaration":37491,"src":"1405:19:351","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":37548,"name":"percentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37531,"src":"1434:10:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37547,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1427:6:351","typeDescriptions":{"typeIdentifier":"t_type$_t_uint96_$","typeString":"type(uint96)"},"typeName":{"id":37546,"name":"uint96","nodeType":"ElementaryTypeName","src":"1427:6:351","typeDescriptions":{}}},"id":37549,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1427:18:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"src":"1405:40:351","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"id":37551,"nodeType":"ExpressionStatement","src":"1405:40:351"}]},"documentation":{"id":37526,"nodeType":"StructuredDocumentation","src":"943:242:351","text":"@notice Sets the royalty percentage.\n @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\n @param percentage The new percentage to set. For example 50000 sets 50% royalty."},"id":37553,"implemented":true,"kind":"function","modifiers":[],"name":"setRoyaltyPercentage","nameLocation":"1199:20:351","nodeType":"FunctionDefinition","parameters":{"id":37532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37529,"mutability":"mutable","name":"s","nameLocation":"1235:1:351","nodeType":"VariableDeclaration","scope":37553,"src":"1220:16:351","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"},"typeName":{"id":37528,"nodeType":"UserDefinedTypeName","pathNode":{"id":37527,"name":"Layout","nameLocations":["1220:6:351"],"nodeType":"IdentifierPath","referencedDeclaration":37492,"src":"1220:6:351"},"referencedDeclaration":37492,"src":"1220:6:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":37531,"mutability":"mutable","name":"percentage","nameLocation":"1246:10:351","nodeType":"VariableDeclaration","scope":37553,"src":"1238:18:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37530,"name":"uint256","nodeType":"ElementaryTypeName","src":"1238:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1219:38:351"},"returnParameters":{"id":37533,"nodeType":"ParameterList","parameters":[],"src":"1267:0:351"},"scope":37657,"src":"1190:262:351","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37579,"nodeType":"Block","src":"1718:147:351","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":37567,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37562,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37559,"src":"1732:8:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":37565,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1752:1:351","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":37564,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1744:7:351","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":37563,"name":"address","nodeType":"ElementaryTypeName","src":"1744:7:351","typeDescriptions":{}}},"id":37566,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1744:10:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1732:22:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37572,"nodeType":"IfStatement","src":"1728:93:351","trueBody":{"id":37571,"nodeType":"Block","src":"1756:65:351","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":37568,"name":"ERC2981IncorrectRoyaltyReceiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37083,"src":"1777:31:351","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$_t_error_$","typeString":"function () pure returns (error)"}},"id":37569,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1777:33:351","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":37570,"nodeType":"RevertStatement","src":"1770:40:351"}]}},{"expression":{"id":37577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":37573,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37557,"src":"1830:1:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":37575,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1832:15:351","memberName":"royaltyReceiver","nodeType":"MemberAccess","referencedDeclaration":37489,"src":"1830:17:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":37576,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37559,"src":"1850:8:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1830:28:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37578,"nodeType":"ExpressionStatement","src":"1830:28:351"}]},"documentation":{"id":37554,"nodeType":"StructuredDocumentation","src":"1458:182:351","text":"@notice Sets the royalty receiver.\n @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\n @param receiver The new receiver to set."},"id":37580,"implemented":true,"kind":"function","modifiers":[],"name":"setRoyaltyReceiver","nameLocation":"1654:18:351","nodeType":"FunctionDefinition","parameters":{"id":37560,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37557,"mutability":"mutable","name":"s","nameLocation":"1688:1:351","nodeType":"VariableDeclaration","scope":37580,"src":"1673:16:351","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"},"typeName":{"id":37556,"nodeType":"UserDefinedTypeName","pathNode":{"id":37555,"name":"Layout","nameLocations":["1673:6:351"],"nodeType":"IdentifierPath","referencedDeclaration":37492,"src":"1673:6:351"},"referencedDeclaration":37492,"src":"1673:6:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":37559,"mutability":"mutable","name":"receiver","nameLocation":"1699:8:351","nodeType":"VariableDeclaration","scope":37580,"src":"1691:16:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37558,"name":"address","nodeType":"ElementaryTypeName","src":"1691:7:351","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1672:36:351"},"returnParameters":{"id":37561,"nodeType":"ParameterList","parameters":[],"src":"1718:0:351"},"scope":37657,"src":"1645:220:351","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37643,"nodeType":"Block","src":"2394:488:351","statements":[{"expression":{"id":37598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":37595,"name":"receiver","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37591,"src":"2404:8:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":37596,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37584,"src":"2415:1:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":37597,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2417:15:351","memberName":"royaltyReceiver","nodeType":"MemberAccess","referencedDeclaration":37489,"src":"2415:17:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2404:28:351","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37599,"nodeType":"ExpressionStatement","src":"2404:28:351"},{"assignments":[37601],"declarations":[{"constant":false,"id":37601,"mutability":"mutable","name":"royaltyPercentage","nameLocation":"2450:17:351","nodeType":"VariableDeclaration","scope":37643,"src":"2442:25:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37600,"name":"uint256","nodeType":"ElementaryTypeName","src":"2442:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":37604,"initialValue":{"expression":{"id":37602,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37584,"src":"2470:1:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout storage pointer"}},"id":37603,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"2472:17:351","memberName":"royaltyPercentage","nodeType":"MemberAccess","referencedDeclaration":37491,"src":"2470:19:351","typeDescriptions":{"typeIdentifier":"t_uint96","typeString":"uint96"}},"nodeType":"VariableDeclarationStatement","src":"2442:47:351"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":37611,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37607,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37605,"name":"salePrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37588,"src":"2503:9:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":37606,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2516:1:351","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2503:14:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37610,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37608,"name":"royaltyPercentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37601,"src":"2521:17:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":37609,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2542:1:351","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2521:22:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2503:40:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":37641,"nodeType":"Block","src":"2593:283:351","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37619,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37617,"name":"salePrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37588,"src":"2611:9:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":37618,"name":"ROYALTY_FEE_DENOMINATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37508,"src":"2623:23:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2611:35:351","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":37639,"nodeType":"Block","src":"2760:106:351","statements":[{"expression":{"id":37637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":37630,"name":"royaltyAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37593,"src":"2778:13:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37636,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37631,"name":"salePrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37588,"src":"2795:9:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":37632,"name":"ROYALTY_FEE_DENOMINATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37508,"src":"2807:23:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2795:35:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":37634,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2794:37:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":37635,"name":"royaltyPercentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37601,"src":"2834:17:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2794:57:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2778:73:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":37638,"nodeType":"ExpressionStatement","src":"2778:73:351"}]},"id":37640,"nodeType":"IfStatement","src":"2607:259:351","trueBody":{"id":37629,"nodeType":"Block","src":"2648:106:351","statements":[{"expression":{"id":37627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":37620,"name":"royaltyAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37593,"src":"2666:13:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37626,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37621,"name":"salePrice","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37588,"src":"2683:9:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"id":37622,"name":"royaltyPercentage","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37601,"src":"2695:17:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2683:29:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":37624,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"2682:31:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"/","rightExpression":{"id":37625,"name":"ROYALTY_FEE_DENOMINATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37508,"src":"2716:23:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2682:57:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2666:73:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":37628,"nodeType":"ExpressionStatement","src":"2666:73:351"}]}}]},"id":37642,"nodeType":"IfStatement","src":"2499:377:351","trueBody":{"id":37616,"nodeType":"Block","src":"2545:42:351","statements":[{"expression":{"id":37614,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":37612,"name":"royaltyAmount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37593,"src":"2559:13:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"30","id":37613,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2575:1:351","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2559:17:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":37615,"nodeType":"ExpressionStatement","src":"2559:17:351"}]}}]},"documentation":{"id":37581,"nodeType":"StructuredDocumentation","src":"2035:223:351","text":"@param salePrice The sale price of the NFT asset specified by `tokenId`\n @return receiver Address of who should be sent the royalty payment\n @return royaltyAmount The royalty payment amount for `salePrice`"},"id":37644,"implemented":true,"kind":"function","modifiers":[],"name":"royaltyInfo","nameLocation":"2272:11:351","nodeType":"FunctionDefinition","parameters":{"id":37589,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37584,"mutability":"mutable","name":"s","nameLocation":"2299:1:351","nodeType":"VariableDeclaration","scope":37644,"src":"2284:16:351","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"},"typeName":{"id":37583,"nodeType":"UserDefinedTypeName","pathNode":{"id":37582,"name":"Layout","nameLocations":["2284:6:351"],"nodeType":"IdentifierPath","referencedDeclaration":37492,"src":"2284:6:351"},"referencedDeclaration":37492,"src":"2284:6:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"}},"visibility":"internal"},{"constant":false,"id":37586,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37644,"src":"2302:7:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37585,"name":"uint256","nodeType":"ElementaryTypeName","src":"2302:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":37588,"mutability":"mutable","name":"salePrice","nameLocation":"2319:9:351","nodeType":"VariableDeclaration","scope":37644,"src":"2311:17:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37587,"name":"uint256","nodeType":"ElementaryTypeName","src":"2311:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2283:46:351"},"returnParameters":{"id":37594,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37591,"mutability":"mutable","name":"receiver","nameLocation":"2361:8:351","nodeType":"VariableDeclaration","scope":37644,"src":"2353:16:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37590,"name":"address","nodeType":"ElementaryTypeName","src":"2353:7:351","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37593,"mutability":"mutable","name":"royaltyAmount","nameLocation":"2379:13:351","nodeType":"VariableDeclaration","scope":37644,"src":"2371:21:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37592,"name":"uint256","nodeType":"ElementaryTypeName","src":"2371:7:351","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2352:41:351"},"scope":37657,"src":"2263:619:351","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":37655,"nodeType":"Block","src":"2947:115:351","statements":[{"assignments":[37651],"declarations":[{"constant":false,"id":37651,"mutability":"mutable","name":"position","nameLocation":"2965:8:351","nodeType":"VariableDeclaration","scope":37655,"src":"2957:16:351","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37650,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2957:7:351","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":37653,"initialValue":{"id":37652,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37505,"src":"2976:19:351","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"2957:38:351"},{"AST":{"nativeSrc":"3014:42:351","nodeType":"YulBlock","src":"3014:42:351","statements":[{"nativeSrc":"3028:18:351","nodeType":"YulAssignment","src":"3028:18:351","value":{"name":"position","nativeSrc":"3038:8:351","nodeType":"YulIdentifier","src":"3038:8:351"},"variableNames":[{"name":"s.slot","nativeSrc":"3028:6:351","nodeType":"YulIdentifier","src":"3028:6:351"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":37651,"isOffset":false,"isSlot":false,"src":"3038:8:351","valueSize":1},{"declaration":37648,"isOffset":false,"isSlot":true,"src":"3028:6:351","suffix":"slot","valueSize":1}],"id":37654,"nodeType":"InlineAssembly","src":"3005:51:351"}]},"id":37656,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"2897:6:351","nodeType":"FunctionDefinition","parameters":{"id":37645,"nodeType":"ParameterList","parameters":[],"src":"2903:2:351"},"returnParameters":{"id":37649,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37648,"mutability":"mutable","name":"s","nameLocation":"2944:1:351","nodeType":"VariableDeclaration","scope":37656,"src":"2929:16:351","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"},"typeName":{"id":37647,"nodeType":"UserDefinedTypeName","pathNode":{"id":37646,"name":"Layout","nameLocations":["2929:6:351"],"nodeType":"IdentifierPath","referencedDeclaration":37492,"src":"2929:6:351"},"referencedDeclaration":37492,"src":"2929:6:351","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37492_storage_ptr","typeString":"struct ERC2981Storage.Layout"}},"visibility":"internal"}],"src":"2928:18:351"},"scope":37657,"src":"2888:174:351","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":37658,"src":"336:2728:351","usedErrors":[],"usedEvents":[]}],"src":"32:3033:351"},"id":351},"contracts/token/royalty/libraries/OperatorFiltererStorage.sol":{"ast":{"absolutePath":"contracts/token/royalty/libraries/OperatorFiltererStorage.sol","exportedSymbols":{"IOperatorFilterRegistry":[37474],"OperatorFiltererStorage":[37870],"OperatorNotAllowed":[37090],"ProxyInitialization":[19524]},"id":37871,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37659,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:352"},{"absolutePath":"contracts/token/royalty/errors/OperatorFiltererErrors.sol","file":"./../errors/OperatorFiltererErrors.sol","id":37661,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37871,"sourceUnit":37091,"src":"58:74:352","symbolAliases":[{"foreign":{"id":37660,"name":"OperatorNotAllowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37090,"src":"66:18:352","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol","file":"./../interfaces/IOperatorFilterRegistry.sol","id":37663,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37871,"sourceUnit":37475,"src":"133:84:352","symbolAliases":[{"foreign":{"id":37662,"name":"IOperatorFilterRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37474,"src":"141:23:352","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"absolutePath":"contracts/proxy/libraries/ProxyInitialization.sol","file":"./../../../proxy/libraries/ProxyInitialization.sol","id":37665,"nameLocation":"-1:-1:-1","nodeType":"ImportDirective","scope":37871,"sourceUnit":19525,"src":"218:87:352","symbolAliases":[{"foreign":{"id":37664,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"226:19:352","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"abstract":false,"baseContracts":[],"canonicalName":"OperatorFiltererStorage","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":37870,"linearizedBaseContracts":[37870],"name":"OperatorFiltererStorage","nameLocation":"315:23:352","nodeType":"ContractDefinition","nodes":[{"global":false,"id":37669,"libraryName":{"id":37666,"name":"OperatorFiltererStorage","nameLocations":["351:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37870,"src":"351:23:352"},"nodeType":"UsingForDirective","src":"345:65:352","typeName":{"id":37668,"nodeType":"UserDefinedTypeName","pathNode":{"id":37667,"name":"OperatorFiltererStorage.Layout","nameLocations":["379:23:352","403:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"379:30:352"},"referencedDeclaration":37673,"src":"379:30:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}}},{"canonicalName":"OperatorFiltererStorage.Layout","id":37673,"members":[{"constant":false,"id":37672,"mutability":"mutable","name":"registry","nameLocation":"464:8:352","nodeType":"VariableDeclaration","scope":37673,"src":"440:32:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37671,"nodeType":"UserDefinedTypeName","pathNode":{"id":37670,"name":"IOperatorFilterRegistry","nameLocations":["440:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"440:23:352"},"referencedDeclaration":37474,"src":"440:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"name":"Layout","nameLocation":"423:6:352","nodeType":"StructDefinition","scope":37870,"src":"416:63:352","visibility":"public"},{"constant":true,"id":37686,"mutability":"constant","name":"PROXY_INIT_PHASE_SLOT","nameLocation":"511:21:352","nodeType":"VariableDeclaration","scope":37870,"src":"485:129:352","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37674,"name":"bytes32","nodeType":"ElementaryTypeName","src":"485:7:352","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37684,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e726f79616c74792e4f70657261746f7246696c74657265722e7068617365","id":37680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"561:46:352","typeDescriptions":{"typeIdentifier":"t_stringliteral_2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6e","typeString":"literal_string \"animoca.token.royalty.OperatorFilterer.phase\""},"value":"animoca.token.royalty.OperatorFilterer.phase"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6e","typeString":"literal_string \"animoca.token.royalty.OperatorFilterer.phase\""}],"id":37679,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"551:9:352","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":37681,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"551:57:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":37678,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"543:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":37677,"name":"uint256","nodeType":"ElementaryTypeName","src":"543:7:352","typeDescriptions":{}}},"id":37682,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"543:66:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":37683,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"612:1:352","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"543:70:352","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37676,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"535:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":37675,"name":"bytes32","nodeType":"ElementaryTypeName","src":"535:7:352","typeDescriptions":{}}},"id":37685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"535:79:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":true,"id":37699,"mutability":"constant","name":"LAYOUT_STORAGE_SLOT","nameLocation":"646:19:352","nodeType":"VariableDeclaration","scope":37870,"src":"620:129:352","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37687,"name":"bytes32","nodeType":"ElementaryTypeName","src":"620:7:352","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"value":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37697,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"arguments":[{"arguments":[{"hexValue":"616e696d6f63612e746f6b656e2e726f79616c74792e4f70657261746f7246696c74657265722e73746f72616765","id":37693,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"694:48:352","typeDescriptions":{"typeIdentifier":"t_stringliteral_609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd31","typeString":"literal_string \"animoca.token.royalty.OperatorFilterer.storage\""},"value":"animoca.token.royalty.OperatorFilterer.storage"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd31","typeString":"literal_string \"animoca.token.royalty.OperatorFilterer.storage\""}],"id":37692,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"684:9:352","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":37694,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"684:59:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":37691,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"676:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":37690,"name":"uint256","nodeType":"ElementaryTypeName","src":"676:7:352","typeDescriptions":{}}},"id":37695,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"676:68:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"hexValue":"31","id":37696,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"747:1:352","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"676:72:352","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37689,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"668:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":37688,"name":"bytes32","nodeType":"ElementaryTypeName","src":"668:7:352","typeDescriptions":{}}},"id":37698,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"668:81:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"body":{"id":37715,"nodeType":"Block","src":"1165:38:352","statements":[{"expression":{"id":37713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":37709,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37703,"src":"1175:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37711,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1177:8:352","memberName":"registry","nodeType":"MemberAccess","referencedDeclaration":37672,"src":"1175:10:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":37712,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37706,"src":"1188:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"src":"1175:21:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"id":37714,"nodeType":"ExpressionStatement","src":"1175:21:352"}]},"documentation":{"id":37700,"nodeType":"StructuredDocumentation","src":"756:318:352","text":"@notice Sets the address that the contract will make OperatorFilter checks against.\n @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\n @param registry The operator filter registry address. When set to the zero address, checks will be bypassed."},"id":37716,"implemented":true,"kind":"function","modifiers":[],"name":"constructorInit","nameLocation":"1088:15:352","nodeType":"FunctionDefinition","parameters":{"id":37707,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37703,"mutability":"mutable","name":"s","nameLocation":"1119:1:352","nodeType":"VariableDeclaration","scope":37716,"src":"1104:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37702,"nodeType":"UserDefinedTypeName","pathNode":{"id":37701,"name":"Layout","nameLocations":["1104:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"1104:6:352"},"referencedDeclaration":37673,"src":"1104:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37706,"mutability":"mutable","name":"registry","nameLocation":"1146:8:352","nodeType":"VariableDeclaration","scope":37716,"src":"1122:32:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37705,"nodeType":"UserDefinedTypeName","pathNode":{"id":37704,"name":"IOperatorFilterRegistry","nameLocations":["1122:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1122:23:352"},"referencedDeclaration":37474,"src":"1122:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1103:52:352"},"returnParameters":{"id":37708,"nodeType":"ParameterList","parameters":[],"src":"1165:0:352"},"scope":37870,"src":"1079:124:352","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37739,"nodeType":"Block","src":"1717:108:352","statements":[{"expression":{"arguments":[{"id":37729,"name":"PROXY_INIT_PHASE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37686,"src":"1756:21:352","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"hexValue":"31","id":37730,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1779:1:352","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"}],"expression":{"id":37726,"name":"ProxyInitialization","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19524,"src":"1727:19:352","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ProxyInitialization_$19524_$","typeString":"type(library ProxyInitialization)"}},"id":37728,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1747:8:352","memberName":"setPhase","nodeType":"MemberAccess","referencedDeclaration":19523,"src":"1727:28:352","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes32_$_t_uint256_$returns$__$","typeString":"function (bytes32,uint256)"}},"id":37731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1727:54:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37732,"nodeType":"ExpressionStatement","src":"1727:54:352"},{"expression":{"arguments":[{"id":37736,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37723,"src":"1809:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"expression":{"id":37733,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37720,"src":"1791:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37735,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1793:15:352","memberName":"constructorInit","nodeType":"MemberAccess","referencedDeclaration":37716,"src":"1791:17:352","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_struct$_Layout_$37673_storage_ptr_$_t_contract$_IOperatorFilterRegistry_$37474_$returns$__$attached_to$_t_struct$_Layout_$37673_storage_ptr_$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)"}},"id":37737,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1791:27:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37738,"nodeType":"ExpressionStatement","src":"1791:27:352"}]},"documentation":{"id":37717,"nodeType":"StructuredDocumentation","src":"1209:423:352","text":"@notice Sets the address that the contract will make OperatorFilter checks against.\n @dev Note: This function should be called ONLY in the init function of a proxied contract.\n @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\n @param registry The operator filter registry address. When set to the zero address, checks will be bypassed."},"id":37740,"implemented":true,"kind":"function","modifiers":[],"name":"proxyInit","nameLocation":"1646:9:352","nodeType":"FunctionDefinition","parameters":{"id":37724,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37720,"mutability":"mutable","name":"s","nameLocation":"1671:1:352","nodeType":"VariableDeclaration","scope":37740,"src":"1656:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37719,"nodeType":"UserDefinedTypeName","pathNode":{"id":37718,"name":"Layout","nameLocations":["1656:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"1656:6:352"},"referencedDeclaration":37673,"src":"1656:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37723,"mutability":"mutable","name":"registry","nameLocation":"1698:8:352","nodeType":"VariableDeclaration","scope":37740,"src":"1674:32:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37722,"nodeType":"UserDefinedTypeName","pathNode":{"id":37721,"name":"IOperatorFilterRegistry","nameLocations":["1674:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"1674:23:352"},"referencedDeclaration":37474,"src":"1674:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"1655:52:352"},"returnParameters":{"id":37725,"nodeType":"ParameterList","parameters":[],"src":"1717:0:352"},"scope":37870,"src":"1637:188:352","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37756,"nodeType":"Block","src":"2146:38:352","statements":[{"expression":{"id":37754,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":37750,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37744,"src":"2156:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37752,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"2158:8:352","memberName":"registry","nodeType":"MemberAccess","referencedDeclaration":37672,"src":"2156:10:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":37753,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37747,"src":"2169:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"src":"2156:21:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"id":37755,"nodeType":"ExpressionStatement","src":"2156:21:352"}]},"documentation":{"id":37741,"nodeType":"StructuredDocumentation","src":"1831:211:352","text":"@notice Updates the address that the contract will make OperatorFilter checks against.\n @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed."},"id":37757,"implemented":true,"kind":"function","modifiers":[],"name":"updateOperatorFilterRegistry","nameLocation":"2056:28:352","nodeType":"FunctionDefinition","parameters":{"id":37748,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37744,"mutability":"mutable","name":"s","nameLocation":"2100:1:352","nodeType":"VariableDeclaration","scope":37757,"src":"2085:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37743,"nodeType":"UserDefinedTypeName","pathNode":{"id":37742,"name":"Layout","nameLocations":["2085:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2085:6:352"},"referencedDeclaration":37673,"src":"2085:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37747,"mutability":"mutable","name":"registry","nameLocation":"2127:8:352","nodeType":"VariableDeclaration","scope":37757,"src":"2103:32:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37746,"nodeType":"UserDefinedTypeName","pathNode":{"id":37745,"name":"IOperatorFilterRegistry","nameLocations":["2103:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"2103:23:352"},"referencedDeclaration":37474,"src":"2103:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"2084:52:352"},"returnParameters":{"id":37749,"nodeType":"ParameterList","parameters":[],"src":"2146:0:352"},"scope":37870,"src":"2047:137:352","stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"body":{"id":37778,"nodeType":"Block","src":"2417:277:352","statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":37770,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37768,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37763,"src":"2616:6:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":37769,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37765,"src":"2626:4:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2616:14:352","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37777,"nodeType":"IfStatement","src":"2612:76:352","trueBody":{"id":37776,"nodeType":"Block","src":"2632:56:352","statements":[{"expression":{"arguments":[{"id":37772,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37761,"src":"2667:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},{"id":37773,"name":"sender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37763,"src":"2670:6:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"}],"id":37771,"name":"_checkFilterOperator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37869,"src":"2646:20:352","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$returns$__$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address) view"}},"id":37774,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2646:31:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37775,"nodeType":"ExpressionStatement","src":"2646:31:352"}]}}]},"documentation":{"id":37758,"nodeType":"StructuredDocumentation","src":"2190:117:352","text":"@dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry."},"id":37779,"implemented":true,"kind":"function","modifiers":[],"name":"requireAllowedOperatorForTransfer","nameLocation":"2321:33:352","nodeType":"FunctionDefinition","parameters":{"id":37766,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37761,"mutability":"mutable","name":"s","nameLocation":"2370:1:352","nodeType":"VariableDeclaration","scope":37779,"src":"2355:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37760,"nodeType":"UserDefinedTypeName","pathNode":{"id":37759,"name":"Layout","nameLocations":["2355:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2355:6:352"},"referencedDeclaration":37673,"src":"2355:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37763,"mutability":"mutable","name":"sender","nameLocation":"2381:6:352","nodeType":"VariableDeclaration","scope":37779,"src":"2373:14:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37762,"name":"address","nodeType":"ElementaryTypeName","src":"2373:7:352","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37765,"mutability":"mutable","name":"from","nameLocation":"2397:4:352","nodeType":"VariableDeclaration","scope":37779,"src":"2389:12:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37764,"name":"address","nodeType":"ElementaryTypeName","src":"2389:7:352","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2354:48:352"},"returnParameters":{"id":37767,"nodeType":"ParameterList","parameters":[],"src":"2417:0:352"},"scope":37870,"src":"2312:382:352","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":37793,"nodeType":"Block","src":"2897:50:352","statements":[{"expression":{"arguments":[{"id":37789,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37783,"src":"2928:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},{"id":37790,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37785,"src":"2931:8:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"},{"typeIdentifier":"t_address","typeString":"address"}],"id":37788,"name":"_checkFilterOperator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37869,"src":"2907:20:352","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_Layout_$37673_storage_ptr_$_t_address_$returns$__$","typeString":"function (struct OperatorFiltererStorage.Layout storage pointer,address) view"}},"id":37791,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2907:33:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":37792,"nodeType":"ExpressionStatement","src":"2907:33:352"}]},"documentation":{"id":37780,"nodeType":"StructuredDocumentation","src":"2700:99:352","text":"@dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry."},"id":37794,"implemented":true,"kind":"function","modifiers":[],"name":"requireAllowedOperatorForApproval","nameLocation":"2813:33:352","nodeType":"FunctionDefinition","parameters":{"id":37786,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37783,"mutability":"mutable","name":"s","nameLocation":"2862:1:352","nodeType":"VariableDeclaration","scope":37794,"src":"2847:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37782,"nodeType":"UserDefinedTypeName","pathNode":{"id":37781,"name":"Layout","nameLocations":["2847:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2847:6:352"},"referencedDeclaration":37673,"src":"2847:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37785,"mutability":"mutable","name":"operator","nameLocation":"2873:8:352","nodeType":"VariableDeclaration","scope":37794,"src":"2865:16:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37784,"name":"address","nodeType":"ElementaryTypeName","src":"2865:7:352","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2846:36:352"},"returnParameters":{"id":37787,"nodeType":"ParameterList","parameters":[],"src":"2897:0:352"},"scope":37870,"src":"2804:143:352","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":37806,"nodeType":"Block","src":"3051:34:352","statements":[{"expression":{"expression":{"id":37803,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37797,"src":"3068:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37804,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3070:8:352","memberName":"registry","nodeType":"MemberAccess","referencedDeclaration":37672,"src":"3068:10:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"functionReturnParameters":37802,"id":37805,"nodeType":"Return","src":"3061:17:352"}]},"id":37807,"implemented":true,"kind":"function","modifiers":[],"name":"operatorFilterRegistry","nameLocation":"2962:22:352","nodeType":"FunctionDefinition","parameters":{"id":37798,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37797,"mutability":"mutable","name":"s","nameLocation":"3000:1:352","nodeType":"VariableDeclaration","scope":37807,"src":"2985:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37796,"nodeType":"UserDefinedTypeName","pathNode":{"id":37795,"name":"Layout","nameLocations":["2985:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"2985:6:352"},"referencedDeclaration":37673,"src":"2985:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"}],"src":"2984:18:352"},"returnParameters":{"id":37802,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37801,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":37807,"src":"3026:23:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37800,"nodeType":"UserDefinedTypeName","pathNode":{"id":37799,"name":"IOperatorFilterRegistry","nameLocations":["3026:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"3026:23:352"},"referencedDeclaration":37474,"src":"3026:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"src":"3025:25:352"},"scope":37870,"src":"2953:132:352","stateMutability":"view","virtual":false,"visibility":"internal"},{"body":{"id":37818,"nodeType":"Block","src":"3150:115:352","statements":[{"assignments":[37814],"declarations":[{"constant":false,"id":37814,"mutability":"mutable","name":"position","nameLocation":"3168:8:352","nodeType":"VariableDeclaration","scope":37818,"src":"3160:16:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":37813,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3160:7:352","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":37816,"initialValue":{"id":37815,"name":"LAYOUT_STORAGE_SLOT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37699,"src":"3179:19:352","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3160:38:352"},{"AST":{"nativeSrc":"3217:42:352","nodeType":"YulBlock","src":"3217:42:352","statements":[{"nativeSrc":"3231:18:352","nodeType":"YulAssignment","src":"3231:18:352","value":{"name":"position","nativeSrc":"3241:8:352","nodeType":"YulIdentifier","src":"3241:8:352"},"variableNames":[{"name":"s.slot","nativeSrc":"3231:6:352","nodeType":"YulIdentifier","src":"3231:6:352"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":37814,"isOffset":false,"isSlot":false,"src":"3241:8:352","valueSize":1},{"declaration":37811,"isOffset":false,"isSlot":true,"src":"3231:6:352","suffix":"slot","valueSize":1}],"id":37817,"nodeType":"InlineAssembly","src":"3208:51:352"}]},"id":37819,"implemented":true,"kind":"function","modifiers":[],"name":"layout","nameLocation":"3100:6:352","nodeType":"FunctionDefinition","parameters":{"id":37808,"nodeType":"ParameterList","parameters":[],"src":"3106:2:352"},"returnParameters":{"id":37812,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37811,"mutability":"mutable","name":"s","nameLocation":"3147:1:352","nodeType":"VariableDeclaration","scope":37819,"src":"3132:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37810,"nodeType":"UserDefinedTypeName","pathNode":{"id":37809,"name":"Layout","nameLocations":["3132:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"3132:6:352"},"referencedDeclaration":37673,"src":"3132:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"}],"src":"3131:18:352"},"scope":37870,"src":"3091:174:352","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":37868,"nodeType":"Block","src":"3350:400:352","statements":[{"assignments":[37829],"declarations":[{"constant":false,"id":37829,"mutability":"mutable","name":"registry","nameLocation":"3384:8:352","nodeType":"VariableDeclaration","scope":37868,"src":"3360:32:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"},"typeName":{"id":37828,"nodeType":"UserDefinedTypeName","pathNode":{"id":37827,"name":"IOperatorFilterRegistry","nameLocations":["3360:23:352"],"nodeType":"IdentifierPath","referencedDeclaration":37474,"src":"3360:23:352"},"referencedDeclaration":37474,"src":"3360:23:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"visibility":"internal"}],"id":37832,"initialValue":{"expression":{"id":37830,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37822,"src":"3395:1:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout storage pointer"}},"id":37831,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3397:8:352","memberName":"registry","nodeType":"MemberAccess","referencedDeclaration":37672,"src":"3395:10:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"nodeType":"VariableDeclarationStatement","src":"3360:45:352"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":37850,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":37841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":37835,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37829,"src":"3532:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"id":37834,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3524:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":37833,"name":"address","nodeType":"ElementaryTypeName","src":"3524:7:352","typeDescriptions":{}}},"id":37836,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3524:17:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":37839,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3553:1:352","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":37838,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3545:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":37837,"name":"address","nodeType":"ElementaryTypeName","src":"3545:7:352","typeDescriptions":{}}},"id":37840,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3545:10:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3524:31:352","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37849,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"arguments":[{"id":37844,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37829,"src":"3567:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}],"id":37843,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3559:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":37842,"name":"address","nodeType":"ElementaryTypeName","src":"3559:7:352","typeDescriptions":{}}},"id":37845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3559:17:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37846,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3577:4:352","memberName":"code","nodeType":"MemberAccess","src":"3559:22:352","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":37847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3582:6:352","memberName":"length","nodeType":"MemberAccess","src":"3559:29:352","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":37848,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3591:1:352","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3559:33:352","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3524:68:352","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37867,"nodeType":"IfStatement","src":"3520:224:352","trueBody":{"id":37866,"nodeType":"Block","src":"3594:150:352","statements":[{"condition":{"id":37859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"3612:52:352","subExpression":{"arguments":[{"arguments":[{"id":37855,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3648:4:352","typeDescriptions":{"typeIdentifier":"t_contract$_OperatorFiltererStorage_$37870","typeString":"library OperatorFiltererStorage"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_OperatorFiltererStorage_$37870","typeString":"library OperatorFiltererStorage"}],"id":37854,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3640:7:352","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":37853,"name":"address","nodeType":"ElementaryTypeName","src":"3640:7:352","typeDescriptions":{}}},"id":37856,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3640:13:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":37857,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37824,"src":"3655:8:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":37851,"name":"registry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37829,"src":"3613:8:352","typeDescriptions":{"typeIdentifier":"t_contract$_IOperatorFilterRegistry_$37474","typeString":"contract IOperatorFilterRegistry"}},"id":37852,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3622:17:352","memberName":"isOperatorAllowed","nodeType":"MemberAccess","referencedDeclaration":37291,"src":"3613:26:352","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$_t_address_$returns$_t_bool_$","typeString":"function (address,address) view external returns (bool)"}},"id":37858,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3613:51:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37865,"nodeType":"IfStatement","src":"3608:126:352","trueBody":{"id":37864,"nodeType":"Block","src":"3666:68:352","statements":[{"errorCall":{"arguments":[{"id":37861,"name":"operator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37824,"src":"3710:8:352","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":37860,"name":"OperatorNotAllowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37090,"src":"3691:18:352","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$_t_error_$","typeString":"function (address) pure returns (error)"}},"id":37862,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3691:28:352","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":37863,"nodeType":"RevertStatement","src":"3684:35:352"}]}}]}}]},"id":37869,"implemented":true,"kind":"function","modifiers":[],"name":"_checkFilterOperator","nameLocation":"3280:20:352","nodeType":"FunctionDefinition","parameters":{"id":37825,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37822,"mutability":"mutable","name":"s","nameLocation":"3316:1:352","nodeType":"VariableDeclaration","scope":37869,"src":"3301:16:352","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"},"typeName":{"id":37821,"nodeType":"UserDefinedTypeName","pathNode":{"id":37820,"name":"Layout","nameLocations":["3301:6:352"],"nodeType":"IdentifierPath","referencedDeclaration":37673,"src":"3301:6:352"},"referencedDeclaration":37673,"src":"3301:6:352","typeDescriptions":{"typeIdentifier":"t_struct$_Layout_$37673_storage_ptr","typeString":"struct OperatorFiltererStorage.Layout"}},"visibility":"internal"},{"constant":false,"id":37824,"mutability":"mutable","name":"operator","nameLocation":"3327:8:352","nodeType":"VariableDeclaration","scope":37869,"src":"3319:16:352","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37823,"name":"address","nodeType":"ElementaryTypeName","src":"3319:7:352","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3300:36:352"},"returnParameters":{"id":37826,"nodeType":"ParameterList","parameters":[],"src":"3350:0:352"},"scope":37870,"src":"3271:479:352","stateMutability":"view","virtual":false,"visibility":"private"}],"scope":37871,"src":"307:3445:352","usedErrors":[],"usedEvents":[]}],"src":"32:3721:352"},"id":352},"contracts/utils/MultiStaticCall.sol":{"ast":{"absolutePath":"contracts/utils/MultiStaticCall.sol","exportedSymbols":{"MultiStaticCall":[38015]},"id":38016,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":37872,"literals":["solidity","0.8",".30"],"nodeType":"PragmaDirective","src":"32:23:353"},{"abstract":false,"baseContracts":[],"canonicalName":"MultiStaticCall","contractDependencies":[],"contractKind":"contract","documentation":{"id":37873,"nodeType":"StructuredDocumentation","src":"57:148:353","text":"@title MultiStaticCall - Aggregate results from multiple static calls\n @dev Derived from https://github.com/makerdao/multicall (MIT licence)"},"fullyImplemented":true,"id":38015,"linearizedBaseContracts":[38015],"name":"MultiStaticCall","nameLocation":"214:15:353","nodeType":"ContractDefinition","nodes":[{"canonicalName":"MultiStaticCall.Call","id":37878,"members":[{"constant":false,"id":37875,"mutability":"mutable","name":"target","nameLocation":"266:6:353","nodeType":"VariableDeclaration","scope":37878,"src":"258:14:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37874,"name":"address","nodeType":"ElementaryTypeName","src":"258:7:353","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37877,"mutability":"mutable","name":"callData","nameLocation":"288:8:353","nodeType":"VariableDeclaration","scope":37878,"src":"282:14:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":37876,"name":"bytes","nodeType":"ElementaryTypeName","src":"282:5:353","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"Call","nameLocation":"243:4:353","nodeType":"StructDefinition","scope":38015,"src":"236:67:353","visibility":"public"},{"canonicalName":"MultiStaticCall.Result","id":37883,"members":[{"constant":false,"id":37880,"mutability":"mutable","name":"success","nameLocation":"338:7:353","nodeType":"VariableDeclaration","scope":37883,"src":"333:12:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37879,"name":"bool","nodeType":"ElementaryTypeName","src":"333:4:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":37882,"mutability":"mutable","name":"returnData","nameLocation":"361:10:353","nodeType":"VariableDeclaration","scope":37883,"src":"355:16:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"},"typeName":{"id":37881,"name":"bytes","nodeType":"ElementaryTypeName","src":"355:5:353","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"name":"Result","nameLocation":"316:6:353","nodeType":"StructDefinition","scope":38015,"src":"309:69:353","visibility":"public"},{"documentation":{"id":37884,"nodeType":"StructuredDocumentation","src":"384:205:353","text":"@notice Emitted when a static call reverts without return data.\n @param target The target contract address of the static call.\n @param data The encoded function call executed on `target`."},"errorSelector":"1199c442","id":37890,"name":"StaticCallReverted","nameLocation":"600:18:353","nodeType":"ErrorDefinition","parameters":{"id":37889,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37886,"mutability":"mutable","name":"target","nameLocation":"627:6:353","nodeType":"VariableDeclaration","scope":37890,"src":"619:14:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37885,"name":"address","nodeType":"ElementaryTypeName","src":"619:7:353","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":37888,"mutability":"mutable","name":"data","nameLocation":"641:4:353","nodeType":"VariableDeclaration","scope":37890,"src":"635:10:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":37887,"name":"bytes","nodeType":"ElementaryTypeName","src":"635:5:353","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"618:28:353"},"src":"594:53:353"},{"body":{"id":37984,"nodeType":"Block","src":"1195:745:353","statements":[{"assignments":[37905],"declarations":[{"constant":false,"id":37905,"mutability":"mutable","name":"length","nameLocation":"1213:6:353","nodeType":"VariableDeclaration","scope":37984,"src":"1205:14:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37904,"name":"uint256","nodeType":"ElementaryTypeName","src":"1205:7:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":37908,"initialValue":{"expression":{"id":37906,"name":"calls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37897,"src":"1222:5:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata[] calldata"}},"id":37907,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1228:6:353","memberName":"length","nodeType":"MemberAccess","src":"1222:12:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1205:29:353"},{"expression":{"id":37916,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":37909,"name":"returnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37902,"src":"1244:10:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":37914,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37905,"src":"1270:6:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":37913,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1257:12:353","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct MultiStaticCall.Result memory[] memory)"},"typeName":{"baseType":{"id":37911,"nodeType":"UserDefinedTypeName","pathNode":{"id":37910,"name":"Result","nameLocations":["1261:6:353"],"nodeType":"IdentifierPath","referencedDeclaration":37883,"src":"1261:6:353"},"referencedDeclaration":37883,"src":"1261:6:353","typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_storage_ptr","typeString":"struct MultiStaticCall.Result"}},"id":37912,"nodeType":"ArrayTypeName","src":"1261:8:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_storage_$dyn_storage_ptr","typeString":"struct MultiStaticCall.Result[]"}}},"id":37915,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1257:20:353","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"src":"1244:33:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"id":37917,"nodeType":"ExpressionStatement","src":"1244:33:353"},{"body":{"id":37982,"nodeType":"Block","src":"1320:614:353","statements":[{"assignments":[37928],"declarations":[{"constant":false,"id":37928,"mutability":"mutable","name":"target","nameLocation":"1342:6:353","nodeType":"VariableDeclaration","scope":37982,"src":"1334:14:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":37927,"name":"address","nodeType":"ElementaryTypeName","src":"1334:7:353","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":37933,"initialValue":{"expression":{"baseExpression":{"id":37929,"name":"calls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37897,"src":"1351:5:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata[] calldata"}},"id":37931,"indexExpression":{"id":37930,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37919,"src":"1357:1:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1351:8:353","typeDescriptions":{"typeIdentifier":"t_struct$_Call_$37878_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata"}},"id":37932,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1360:6:353","memberName":"target","nodeType":"MemberAccess","referencedDeclaration":37875,"src":"1351:15:353","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1334:32:353"},{"assignments":[37935],"declarations":[{"constant":false,"id":37935,"mutability":"mutable","name":"data","nameLocation":"1395:4:353","nodeType":"VariableDeclaration","scope":37982,"src":"1380:19:353","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":37934,"name":"bytes","nodeType":"ElementaryTypeName","src":"1380:5:353","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":37940,"initialValue":{"expression":{"baseExpression":{"id":37936,"name":"calls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37897,"src":"1402:5:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata[] calldata"}},"id":37938,"indexExpression":{"id":37937,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37919,"src":"1408:1:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1402:8:353","typeDescriptions":{"typeIdentifier":"t_struct$_Call_$37878_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata"}},"id":37939,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1411:8:353","memberName":"callData","nodeType":"MemberAccess","referencedDeclaration":37877,"src":"1402:17:353","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},"nodeType":"VariableDeclarationStatement","src":"1380:39:353"},{"assignments":[37942,37944],"declarations":[{"constant":false,"id":37942,"mutability":"mutable","name":"success","nameLocation":"1439:7:353","nodeType":"VariableDeclaration","scope":37982,"src":"1434:12:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37941,"name":"bool","nodeType":"ElementaryTypeName","src":"1434:4:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":37944,"mutability":"mutable","name":"ret","nameLocation":"1461:3:353","nodeType":"VariableDeclaration","scope":37982,"src":"1448:16:353","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":37943,"name":"bytes","nodeType":"ElementaryTypeName","src":"1448:5:353","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":37949,"initialValue":{"arguments":[{"id":37947,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37935,"src":"1486:4:353","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":37945,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37928,"src":"1468:6:353","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":37946,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1475:10:353","memberName":"staticcall","nodeType":"MemberAccess","src":"1468:17:353","typeDescriptions":{"typeIdentifier":"t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$","typeString":"function (bytes memory) view returns (bool,bytes memory)"}},"id":37948,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1468:23:353","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$_t_bool_$_t_bytes_memory_ptr_$","typeString":"tuple(bool,bytes memory)"}},"nodeType":"VariableDeclarationStatement","src":"1433:58:353"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":37953,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37950,"name":"requireSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37893,"src":"1510:14:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"id":37952,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"1528:8:353","subExpression":{"id":37951,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37942,"src":"1529:7:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"1510:26:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37972,"nodeType":"IfStatement","src":"1506:367:353","trueBody":{"id":37971,"nodeType":"Block","src":"1538:335:353","statements":[{"assignments":[37955],"declarations":[{"constant":false,"id":37955,"mutability":"mutable","name":"returndataLength","nameLocation":"1564:16:353","nodeType":"VariableDeclaration","scope":37971,"src":"1556:24:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37954,"name":"uint256","nodeType":"ElementaryTypeName","src":"1556:7:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":37958,"initialValue":{"expression":{"id":37956,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37944,"src":"1583:3:353","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":37957,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1587:6:353","memberName":"length","nodeType":"MemberAccess","src":"1583:10:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1556:37:353"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37961,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37959,"name":"returndataLength","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37955,"src":"1615:16:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":37960,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1635:1:353","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1615:21:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":37969,"nodeType":"Block","src":"1779:80:353","statements":[{"errorCall":{"arguments":[{"id":37965,"name":"target","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37928,"src":"1827:6:353","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":37966,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37935,"src":"1835:4:353","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":37964,"name":"StaticCallReverted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37890,"src":"1808:18:353","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$_t_bytes_memory_ptr_$returns$_t_error_$","typeString":"function (address,bytes memory) pure returns (error)"}},"id":37967,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1808:32:353","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_error","typeString":"error"}},"id":37968,"nodeType":"RevertStatement","src":"1801:39:353"}]},"id":37970,"nodeType":"IfStatement","src":"1611:248:353","trueBody":{"id":37963,"nodeType":"Block","src":"1638:135:353","statements":[{"AST":{"nativeSrc":"1669:86:353","nodeType":"YulBlock","src":"1669:86:353","statements":[{"expression":{"arguments":[{"arguments":[{"kind":"number","nativeSrc":"1706:2:353","nodeType":"YulLiteral","src":"1706:2:353","type":"","value":"32"},{"name":"ret","nativeSrc":"1710:3:353","nodeType":"YulIdentifier","src":"1710:3:353"}],"functionName":{"name":"add","nativeSrc":"1702:3:353","nodeType":"YulIdentifier","src":"1702:3:353"},"nativeSrc":"1702:12:353","nodeType":"YulFunctionCall","src":"1702:12:353"},{"name":"returndataLength","nativeSrc":"1716:16:353","nodeType":"YulIdentifier","src":"1716:16:353"}],"functionName":{"name":"revert","nativeSrc":"1695:6:353","nodeType":"YulIdentifier","src":"1695:6:353"},"nativeSrc":"1695:38:353","nodeType":"YulFunctionCall","src":"1695:38:353"},"nativeSrc":"1695:38:353","nodeType":"YulExpressionStatement","src":"1695:38:353"}]},"evmVersion":"paris","externalReferences":[{"declaration":37944,"isOffset":false,"isSlot":false,"src":"1710:3:353","valueSize":1},{"declaration":37955,"isOffset":false,"isSlot":false,"src":"1716:16:353","valueSize":1}],"id":37962,"nodeType":"InlineAssembly","src":"1660:95:353"}]}}]}},{"expression":{"id":37980,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":37973,"name":"returnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37902,"src":"1887:10:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"id":37975,"indexExpression":{"id":37974,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37919,"src":"1898:1:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1887:13:353","typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_memory_ptr","typeString":"struct MultiStaticCall.Result memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":37977,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37942,"src":"1910:7:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":37978,"name":"ret","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37944,"src":"1919:3:353","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":37976,"name":"Result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37883,"src":"1903:6:353","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Result_$37883_storage_ptr_$","typeString":"type(struct MultiStaticCall.Result storage pointer)"}},"id":37979,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1903:20:353","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_memory_ptr","typeString":"struct MultiStaticCall.Result memory"}},"src":"1887:36:353","typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_memory_ptr","typeString":"struct MultiStaticCall.Result memory"}},"id":37981,"nodeType":"ExpressionStatement","src":"1887:36:353"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":37923,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":37921,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37919,"src":"1303:1:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":37922,"name":"length","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37905,"src":"1307:6:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1303:10:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":37983,"initializationExpression":{"assignments":[37919],"declarations":[{"constant":false,"id":37919,"mutability":"mutable","name":"i","nameLocation":"1300:1:353","nodeType":"VariableDeclaration","scope":37983,"src":"1292:9:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37918,"name":"uint256","nodeType":"ElementaryTypeName","src":"1292:7:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":37920,"nodeType":"VariableDeclarationStatement","src":"1292:9:353"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":37925,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"1315:3:353","subExpression":{"id":37924,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37919,"src":"1317:1:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":37926,"nodeType":"ExpressionStatement","src":"1315:3:353"},"nodeType":"ForStatement","src":"1287:647:353"}]},"documentation":{"id":37891,"nodeType":"StructuredDocumentation","src":"653:422:353","text":"@notice Aggregates the results of multiple static calls.\n @dev Reverts if `requireSuccess` is true and one of the static calls fails.\n @param requireSuccess Whether a failed static call should trigger a revert.\n @param calls The list of target contracts and encoded function calls for each static call.\n @return returnData The list of success flags and raw return data for each static call."},"functionSelector":"bce38bd7","id":37985,"implemented":true,"kind":"function","modifiers":[],"name":"tryAggregate","nameLocation":"1089:12:353","nodeType":"FunctionDefinition","parameters":{"id":37898,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37893,"mutability":"mutable","name":"requireSuccess","nameLocation":"1107:14:353","nodeType":"VariableDeclaration","scope":37985,"src":"1102:19:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37892,"name":"bool","nodeType":"ElementaryTypeName","src":"1102:4:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":37897,"mutability":"mutable","name":"calls","nameLocation":"1139:5:353","nodeType":"VariableDeclaration","scope":37985,"src":"1123:21:353","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call[]"},"typeName":{"baseType":{"id":37895,"nodeType":"UserDefinedTypeName","pathNode":{"id":37894,"name":"Call","nameLocations":["1123:4:353"],"nodeType":"IdentifierPath","referencedDeclaration":37878,"src":"1123:4:353"},"referencedDeclaration":37878,"src":"1123:4:353","typeDescriptions":{"typeIdentifier":"t_struct$_Call_$37878_storage_ptr","typeString":"struct MultiStaticCall.Call"}},"id":37896,"nodeType":"ArrayTypeName","src":"1123:6:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_storage_$dyn_storage_ptr","typeString":"struct MultiStaticCall.Call[]"}},"visibility":"internal"}],"src":"1101:44:353"},"returnParameters":{"id":37903,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37902,"mutability":"mutable","name":"returnData","nameLocation":"1183:10:353","nodeType":"VariableDeclaration","scope":37985,"src":"1167:26:353","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result[]"},"typeName":{"baseType":{"id":37900,"nodeType":"UserDefinedTypeName","pathNode":{"id":37899,"name":"Result","nameLocations":["1167:6:353"],"nodeType":"IdentifierPath","referencedDeclaration":37883,"src":"1167:6:353"},"referencedDeclaration":37883,"src":"1167:6:353","typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_storage_ptr","typeString":"struct MultiStaticCall.Result"}},"id":37901,"nodeType":"ArrayTypeName","src":"1167:8:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_storage_$dyn_storage_ptr","typeString":"struct MultiStaticCall.Result[]"}},"visibility":"internal"}],"src":"1166:28:353"},"scope":38015,"src":"1080:860:353","stateMutability":"view","virtual":false,"visibility":"public"},{"body":{"id":38013,"nodeType":"Block","src":"2811:101:353","statements":[{"expression":{"id":38004,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":38001,"name":"blockNumber","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37995,"src":"2821:11:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":38002,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2835:5:353","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":38003,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2841:6:353","memberName":"number","nodeType":"MemberAccess","src":"2835:12:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2821:26:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":38005,"nodeType":"ExpressionStatement","src":"2821:26:353"},{"expression":{"id":38011,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":38006,"name":"returnData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37999,"src":"2857:10:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":38008,"name":"requireSuccess","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37988,"src":"2883:14:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"id":38009,"name":"calls","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37992,"src":"2899:5:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call calldata[] calldata"}],"id":38007,"name":"tryAggregate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":37985,"src":"2870:12:353","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bool_$_t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr_$returns$_t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr_$","typeString":"function (bool,struct MultiStaticCall.Call calldata[] calldata) view returns (struct MultiStaticCall.Result memory[] memory)"}},"id":38010,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2870:35:353","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"src":"2857:48:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result memory[] memory"}},"id":38012,"nodeType":"ExpressionStatement","src":"2857:48:353"}]},"documentation":{"id":37986,"nodeType":"StructuredDocumentation","src":"1946:716:353","text":"@notice Aggregates the results of multiple static calls, together with the associated block number.\n @dev Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.\n @dev Reverts if `requireSuccess` is true and one of the static calls fails.\n @param requireSuccess Whether a failed static call should trigger a revert.\n @param calls The list of target contracts and encoded function calls for each static call.\n @return blockNumber The latest mined block number indicating at which point the return data is valid.\n @return returnData The list of success flags and raw return data for each static call."},"functionSelector":"399542e9","id":38014,"implemented":true,"kind":"function","modifiers":[],"name":"tryBlockAndAggregate","nameLocation":"2676:20:353","nodeType":"FunctionDefinition","parameters":{"id":37993,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37988,"mutability":"mutable","name":"requireSuccess","nameLocation":"2702:14:353","nodeType":"VariableDeclaration","scope":38014,"src":"2697:19:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":37987,"name":"bool","nodeType":"ElementaryTypeName","src":"2697:4:353","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":37992,"mutability":"mutable","name":"calls","nameLocation":"2734:5:353","nodeType":"VariableDeclaration","scope":38014,"src":"2718:21:353","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_calldata_ptr_$dyn_calldata_ptr","typeString":"struct MultiStaticCall.Call[]"},"typeName":{"baseType":{"id":37990,"nodeType":"UserDefinedTypeName","pathNode":{"id":37989,"name":"Call","nameLocations":["2718:4:353"],"nodeType":"IdentifierPath","referencedDeclaration":37878,"src":"2718:4:353"},"referencedDeclaration":37878,"src":"2718:4:353","typeDescriptions":{"typeIdentifier":"t_struct$_Call_$37878_storage_ptr","typeString":"struct MultiStaticCall.Call"}},"id":37991,"nodeType":"ArrayTypeName","src":"2718:6:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Call_$37878_storage_$dyn_storage_ptr","typeString":"struct MultiStaticCall.Call[]"}},"visibility":"internal"}],"src":"2696:44:353"},"returnParameters":{"id":38000,"nodeType":"ParameterList","parameters":[{"constant":false,"id":37995,"mutability":"mutable","name":"blockNumber","nameLocation":"2770:11:353","nodeType":"VariableDeclaration","scope":38014,"src":"2762:19:353","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":37994,"name":"uint256","nodeType":"ElementaryTypeName","src":"2762:7:353","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":37999,"mutability":"mutable","name":"returnData","nameLocation":"2799:10:353","nodeType":"VariableDeclaration","scope":38014,"src":"2783:26:353","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_memory_ptr_$dyn_memory_ptr","typeString":"struct MultiStaticCall.Result[]"},"typeName":{"baseType":{"id":37997,"nodeType":"UserDefinedTypeName","pathNode":{"id":37996,"name":"Result","nameLocations":["2783:6:353"],"nodeType":"IdentifierPath","referencedDeclaration":37883,"src":"2783:6:353"},"referencedDeclaration":37883,"src":"2783:6:353","typeDescriptions":{"typeIdentifier":"t_struct$_Result_$37883_storage_ptr","typeString":"struct MultiStaticCall.Result"}},"id":37998,"nodeType":"ArrayTypeName","src":"2783:8:353","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_Result_$37883_storage_$dyn_storage_ptr","typeString":"struct MultiStaticCall.Result[]"}},"visibility":"internal"}],"src":"2761:49:353"},"scope":38015,"src":"2667:245:353","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":38016,"src":"205:2709:353","usedErrors":[37890],"usedEvents":[]}],"src":"32:2883:353"},"id":353},"contracts/utils/libraries/Address.sol":{"ast":{"absolutePath":"contracts/utils/libraries/Address.sol","exportedSymbols":{"Address":[38035]},"id":38036,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":38017,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:354"},{"abstract":false,"baseContracts":[],"canonicalName":"Address","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":38035,"linearizedBaseContracts":[38035],"name":"Address","nameLocation":"66:7:354","nodeType":"ContractDefinition","nodes":[{"body":{"id":38033,"nodeType":"Block","src":"344:122:354","statements":[{"assignments":[38026],"declarations":[{"constant":false,"id":38026,"mutability":"mutable","name":"size","nameLocation":"362:4:354","nodeType":"VariableDeclaration","scope":38033,"src":"354:12:354","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":38025,"name":"uint256","nodeType":"ElementaryTypeName","src":"354:7:354","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":38027,"nodeType":"VariableDeclarationStatement","src":"354:12:354"},{"AST":{"nativeSrc":"385:49:354","nodeType":"YulBlock","src":"385:49:354","statements":[{"nativeSrc":"399:25:354","nodeType":"YulAssignment","src":"399:25:354","value":{"arguments":[{"name":"addr","nativeSrc":"419:4:354","nodeType":"YulIdentifier","src":"419:4:354"}],"functionName":{"name":"extcodesize","nativeSrc":"407:11:354","nodeType":"YulIdentifier","src":"407:11:354"},"nativeSrc":"407:17:354","nodeType":"YulFunctionCall","src":"407:17:354"},"variableNames":[{"name":"size","nativeSrc":"399:4:354","nodeType":"YulIdentifier","src":"399:4:354"}]}]},"evmVersion":"paris","externalReferences":[{"declaration":38020,"isOffset":false,"isSlot":false,"src":"419:4:354","valueSize":1},{"declaration":38026,"isOffset":false,"isSlot":false,"src":"399:4:354","valueSize":1}],"id":38028,"nodeType":"InlineAssembly","src":"376:58:354"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38031,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38029,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38026,"src":"450:4:354","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":38030,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"458:1:354","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"450:9:354","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":38024,"id":38032,"nodeType":"Return","src":"443:16:354"}]},"documentation":{"id":38018,"nodeType":"StructuredDocumentation","src":"80:195:354","text":"@notice Checks if the address is a deployed smart contract.\n @param addr The address to check.\n @return hasBytecode True if `addr` is a deployed smart contract, false otherwise."},"id":38034,"implemented":true,"kind":"function","modifiers":[],"name":"hasBytecode","nameLocation":"289:11:354","nodeType":"FunctionDefinition","parameters":{"id":38021,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38020,"mutability":"mutable","name":"addr","nameLocation":"309:4:354","nodeType":"VariableDeclaration","scope":38034,"src":"301:12:354","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":38019,"name":"address","nodeType":"ElementaryTypeName","src":"301:7:354","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"300:14:354"},"returnParameters":{"id":38024,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38023,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":38034,"src":"338:4:354","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":38022,"name":"bool","nodeType":"ElementaryTypeName","src":"338:4:354","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"337:6:354"},"scope":38035,"src":"280:186:354","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":38036,"src":"58:410:354","usedErrors":[],"usedEvents":[]}],"src":"32:437:354"},"id":354},"contracts/utils/libraries/Bytes32.sol":{"ast":{"absolutePath":"contracts/utils/libraries/Bytes32.sol","exportedSymbols":{"Bytes32":[38193]},"id":38194,"license":"MIT","nodeType":"SourceUnit","nodes":[{"id":38037,"literals":["solidity","^","0.8",".30"],"nodeType":"PragmaDirective","src":"32:24:355"},{"abstract":false,"baseContracts":[],"canonicalName":"Bytes32","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"id":38193,"linearizedBaseContracts":[38193],"name":"Bytes32","nameLocation":"66:7:355","nodeType":"ContractDefinition","nodes":[{"body":{"id":38114,"nodeType":"Block","src":"292:533:355","statements":[{"assignments":[38046],"declarations":[{"constant":false,"id":38046,"mutability":"mutable","name":"base32Alphabet","nameLocation":"310:14:355","nodeType":"VariableDeclaration","scope":38114,"src":"302:22:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":38045,"name":"bytes32","nodeType":"ElementaryTypeName","src":"302:7:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":38048,"initialValue":{"hexValue":"307836313632363336343635363636373638363936413642364336443645364637303731373237333734373537363737373837393741333233333334333533363337","id":38047,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"327:66:355","typeDescriptions":{"typeIdentifier":"t_rational_44048183304486788312148433451363384677562265908331949128489393199232333461047_by_1","typeString":"int_const 4404...(69 digits omitted)...1047"},"value":"0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637"},"nodeType":"VariableDeclarationStatement","src":"302:91:355"},{"assignments":[38050],"declarations":[{"constant":false,"id":38050,"mutability":"mutable","name":"i","nameLocation":"411:1:355","nodeType":"VariableDeclaration","scope":38114,"src":"403:9:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":38049,"name":"uint256","nodeType":"ElementaryTypeName","src":"403:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":38055,"initialValue":{"arguments":[{"id":38053,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38040,"src":"423:5:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":38052,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"415:7:355","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":38051,"name":"uint256","nodeType":"ElementaryTypeName","src":"415:7:355","typeDescriptions":{}}},"id":38054,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"415:14:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"403:26:355"},{"assignments":[38057],"declarations":[{"constant":false,"id":38057,"mutability":"mutable","name":"k","nameLocation":"447:1:355","nodeType":"VariableDeclaration","scope":38114,"src":"439:9:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":38056,"name":"uint256","nodeType":"ElementaryTypeName","src":"439:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":38059,"initialValue":{"hexValue":"3532","id":38058,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"451:2:355","typeDescriptions":{"typeIdentifier":"t_rational_52_by_1","typeString":"int_const 52"},"value":"52"},"nodeType":"VariableDeclarationStatement","src":"439:14:355"},{"assignments":[38061],"declarations":[{"constant":false,"id":38061,"mutability":"mutable","name":"bstr","nameLocation":"476:4:355","nodeType":"VariableDeclaration","scope":38114,"src":"463:17:355","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":38060,"name":"bytes","nodeType":"ElementaryTypeName","src":"463:5:355","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":38066,"initialValue":{"arguments":[{"id":38064,"name":"k","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38057,"src":"493:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":38063,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"483:9:355","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":38062,"name":"bytes","nodeType":"ElementaryTypeName","src":"487:5:355","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":38065,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"483:12:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"463:32:355"},{"id":38108,"nodeType":"UncheckedBlock","src":"505:285:355","statements":[{"expression":{"id":38082,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":38067,"name":"bstr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38061,"src":"529:4:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":38070,"indexExpression":{"id":38069,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"534:3:355","subExpression":{"id":38068,"name":"k","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38057,"src":"536:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"529:9:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":38071,"name":"base32Alphabet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38046,"src":"541:14:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":38081,"indexExpression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38079,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38076,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38074,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38050,"src":"563:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"38","id":38075,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"567:1:355","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"563:5:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":38077,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"562:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<<","rightExpression":{"hexValue":"32","id":38078,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"573:1:355","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"562:12:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":38073,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"556:5:355","typeDescriptions":{"typeIdentifier":"t_type$_t_uint8_$","typeString":"type(uint8)"},"typeName":{"id":38072,"name":"uint8","nodeType":"ElementaryTypeName","src":"556:5:355","typeDescriptions":{}}},"id":38080,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"556:19:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"541:35:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"529:47:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":38083,"nodeType":"ExpressionStatement","src":"529:47:355"},{"expression":{"id":38086,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":38084,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38050,"src":"654:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"hexValue":"38","id":38085,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"659:1:355","typeDescriptions":{"typeIdentifier":"t_rational_8_by_1","typeString":"int_const 8"},"value":"8"},"src":"654:6:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":38087,"nodeType":"ExpressionStatement","src":"654:6:355"},{"body":{"id":38106,"nodeType":"Block","src":"688:92:355","statements":[{"expression":{"id":38100,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":38091,"name":"bstr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38061,"src":"706:4:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":38094,"indexExpression":{"id":38093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"711:3:355","subExpression":{"id":38092,"name":"k","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38057,"src":"713:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"706:9:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":38095,"name":"base32Alphabet","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38046,"src":"718:14:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":38099,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38098,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38096,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38050,"src":"733:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"hexValue":"3332","id":38097,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"737:2:355","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"733:6:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"718:22:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"706:34:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":38101,"nodeType":"ExpressionStatement","src":"706:34:355"},{"expression":{"id":38104,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":38102,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38050,"src":"758:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"/=","rightHandSide":{"hexValue":"3332","id":38103,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"763:2:355","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"758:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":38105,"nodeType":"ExpressionStatement","src":"758:7:355"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38090,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38088,"name":"k","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38057,"src":"681:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":38089,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"685:1:355","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"681:5:355","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":38107,"nodeType":"WhileStatement","src":"674:106:355"}]},{"expression":{"arguments":[{"id":38111,"name":"bstr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38061,"src":"813:4:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":38110,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"806:6:355","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":38109,"name":"string","nodeType":"ElementaryTypeName","src":"806:6:355","typeDescriptions":{}}},"id":38112,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"806:12:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":38044,"id":38113,"nodeType":"Return","src":"799:19:355"}]},"documentation":{"id":38038,"nodeType":"StructuredDocumentation","src":"80:130:355","text":"@notice Converts bytes32 to base32 string.\n @param value value to convert.\n @return the converted base32 string."},"id":38115,"implemented":true,"kind":"function","modifiers":[],"name":"toBase32String","nameLocation":"224:14:355","nodeType":"FunctionDefinition","parameters":{"id":38041,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38040,"mutability":"mutable","name":"value","nameLocation":"247:5:355","nodeType":"VariableDeclaration","scope":38115,"src":"239:13:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":38039,"name":"bytes32","nodeType":"ElementaryTypeName","src":"239:7:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"238:15:355"},"returnParameters":{"id":38044,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38043,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":38115,"src":"277:13:355","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":38042,"name":"string","nodeType":"ElementaryTypeName","src":"277:6:355","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"276:15:355"},"scope":38193,"src":"215:610:355","stateMutability":"pure","virtual":false,"visibility":"internal"},{"body":{"id":38191,"nodeType":"Block","src":"1079:515:355","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":38125,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38123,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38118,"src":"1093:5:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30783030","id":38124,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1102:4:355","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x00"},"src":"1093:13:355","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":38128,"nodeType":"IfStatement","src":"1089:28:355","trueBody":{"expression":{"hexValue":"","id":38126,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1115:2:355","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"functionReturnParameters":38122,"id":38127,"nodeType":"Return","src":"1108:9:355"}},{"assignments":[38130],"declarations":[{"constant":false,"id":38130,"mutability":"mutable","name":"bytesString","nameLocation":"1140:11:355","nodeType":"VariableDeclaration","scope":38191,"src":"1127:24:355","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":38129,"name":"bytes","nodeType":"ElementaryTypeName","src":"1127:5:355","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":38138,"initialValue":{"arguments":[{"arguments":[{"id":38135,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38118,"src":"1177:5:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":38133,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1160:3:355","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":38134,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"1164:12:355","memberName":"encodePacked","nodeType":"MemberAccess","src":"1160:16:355","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":38136,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1160:23:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":38132,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1154:5:355","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":38131,"name":"bytes","nodeType":"ElementaryTypeName","src":"1154:5:355","typeDescriptions":{}}},"id":38137,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1154:30:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1127:57:355"},{"assignments":[38140],"declarations":[{"constant":false,"id":38140,"mutability":"mutable","name":"pos","nameLocation":"1202:3:355","nodeType":"VariableDeclaration","scope":38191,"src":"1194:11:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":38139,"name":"uint256","nodeType":"ElementaryTypeName","src":"1194:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":38142,"initialValue":{"hexValue":"3331","id":38141,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1208:2:355","typeDescriptions":{"typeIdentifier":"t_rational_31_by_1","typeString":"int_const 31"},"value":"31"},"nodeType":"VariableDeclarationStatement","src":"1194:16:355"},{"body":{"id":38155,"nodeType":"Block","src":"1233:118:355","statements":[{"condition":{"commonType":{"typeIdentifier":"t_bytes1","typeString":"bytes1"},"id":38148,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":38144,"name":"bytesString","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38130,"src":"1251:11:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":38146,"indexExpression":{"id":38145,"name":"pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38140,"src":"1263:3:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1251:16:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":38147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1271:1:355","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1251:21:355","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":38150,"nodeType":"IfStatement","src":"1247:32:355","trueBody":{"id":38149,"nodeType":"Break","src":"1274:5:355"}},{"id":38154,"nodeType":"UncheckedBlock","src":"1293:48:355","statements":[{"expression":{"id":38152,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"--","prefix":true,"src":"1321:5:355","subExpression":{"id":38151,"name":"pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38140,"src":"1323:3:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":38153,"nodeType":"ExpressionStatement","src":"1321:5:355"}]}]},"condition":{"hexValue":"74727565","id":38143,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1227:4:355","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"id":38156,"nodeType":"WhileStatement","src":"1220:131:355"},{"id":38190,"nodeType":"UncheckedBlock","src":"1360:228:355","statements":[{"assignments":[38158],"declarations":[{"constant":false,"id":38158,"mutability":"mutable","name":"asciiString","nameLocation":"1397:11:355","nodeType":"VariableDeclaration","scope":38190,"src":"1384:24:355","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":38157,"name":"bytes","nodeType":"ElementaryTypeName","src":"1384:5:355","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":38165,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38163,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38161,"name":"pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38140,"src":"1421:3:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":38162,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1427:1:355","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1421:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":38160,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"1411:9:355","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":38159,"name":"bytes","nodeType":"ElementaryTypeName","src":"1415:5:355","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":38164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1411:18:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"1384:45:355"},{"body":{"id":38183,"nodeType":"Block","src":"1474:64:355","statements":[{"expression":{"id":38181,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":38175,"name":"asciiString","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38158,"src":"1492:11:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":38177,"indexExpression":{"id":38176,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38167,"src":"1504:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"1492:14:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":38178,"name":"bytesString","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38130,"src":"1509:11:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":38180,"indexExpression":{"id":38179,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38167,"src":"1521:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1509:14:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"1492:31:355","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":38182,"nodeType":"ExpressionStatement","src":"1492:31:355"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":38171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":38169,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38167,"src":"1459:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":38170,"name":"pos","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38140,"src":"1464:3:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"1459:8:355","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":38184,"initializationExpression":{"assignments":[38167],"declarations":[{"constant":false,"id":38167,"mutability":"mutable","name":"i","nameLocation":"1456:1:355","nodeType":"VariableDeclaration","scope":38184,"src":"1448:9:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":38166,"name":"uint256","nodeType":"ElementaryTypeName","src":"1448:7:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":38168,"nodeType":"VariableDeclarationStatement","src":"1448:9:355"},"isSimpleCounterLoop":false,"loopExpression":{"expression":{"id":38173,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":true,"src":"1469:3:355","subExpression":{"id":38172,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38167,"src":"1471:1:355","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":38174,"nodeType":"ExpressionStatement","src":"1469:3:355"},"nodeType":"ForStatement","src":"1443:95:355"},{"expression":{"arguments":[{"id":38187,"name":"asciiString","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":38158,"src":"1565:11:355","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":38186,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1558:6:355","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":38185,"name":"string","nodeType":"ElementaryTypeName","src":"1558:6:355","typeDescriptions":{}}},"id":38188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1558:19:355","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":38122,"id":38189,"nodeType":"Return","src":"1551:26:355"}]}]},"documentation":{"id":38116,"nodeType":"StructuredDocumentation","src":"831:167:355","text":"@notice Converts a bytes32 value to an ASCII string, trimming the tailing zeros.\n @param value value to convert.\n @return the converted ASCII string."},"id":38192,"implemented":true,"kind":"function","modifiers":[],"name":"toASCIIString","nameLocation":"1012:13:355","nodeType":"FunctionDefinition","parameters":{"id":38119,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38118,"mutability":"mutable","name":"value","nameLocation":"1034:5:355","nodeType":"VariableDeclaration","scope":38192,"src":"1026:13:355","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":38117,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1026:7:355","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1025:15:355"},"returnParameters":{"id":38122,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38121,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":38192,"src":"1064:13:355","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":38120,"name":"string","nodeType":"ElementaryTypeName","src":"1064:6:355","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1063:15:355"},"scope":38193,"src":"1003:591:355","stateMutability":"pure","virtual":false,"visibility":"internal"}],"scope":38194,"src":"58:1538:355","usedErrors":[],"usedEvents":[]}],"src":"32:1565:355"},"id":355}},"contracts":{"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol":{"LinkTokenInterface":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"decimalPlaces","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"increaseApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"totalTokensIssued","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"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":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","decreaseApproval(address,uint256)":"66188463","increaseApproval(address,uint256)":"d73dd623","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferAndCall(address,uint256,bytes)":"4000aea0","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remaining\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimalPlaces\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalTokensIssued\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\":\"LinkTokenInterface\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface LinkTokenInterface {\\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\\n\\n  function approve(address spender, uint256 value) external returns (bool success);\\n\\n  function balanceOf(\\n    address owner\\n  ) external view returns (uint256 balance);\\n\\n  function decimals() external view returns (uint8 decimalPlaces);\\n\\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\\n\\n  function increaseApproval(address spender, uint256 subtractedValue) external;\\n\\n  function name() external view returns (string memory tokenName);\\n\\n  function symbol() external view returns (string memory tokenSymbol);\\n\\n  function totalSupply() external view returns (uint256 totalTokensIssued);\\n\\n  function transfer(address to, uint256 value) external returns (bool success);\\n\\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\\n\\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xcee9303d524c29fefc346775ec0be31d134a5f14c990fe04961a9f516eb23ad5\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol":{"VRFConsumerBaseV2":{"abi":[{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"PURPOSEReggie the Random Oracle (not his real job) wants to provide randomnessto Vera the verifier in such a way that Vera can be sure he's notmaking his output up to suit himself. Reggie provides Vera a public keyto which he knows the secret key. Each time Vera provides a seed toReggie, he gives back a value which is computed completelydeterministically from the seed and the secret key.Reggie provides a proof by which Vera can verify that the output wascorrectly computed once Reggie tells it to her, but without that proof,the output is indistinguishable to her from a uniform random samplefrom the output space.The purpose of this contract is to make it easy for unrelated contractsto talk to Vera the verifier about the work Reggie is doing, to providesimple access to a verifiable source of randomness. It ensures 2 things:1. The fulfillment came from the VRFCoordinator2. The consumer contract implements fulfillRandomWords. *****************************************************************************USAGECalling contracts must inherit from VRFConsumerBase, and caninitialize VRFConsumerBase's attributes in their constructor asshown:contract VRFConsumer {constructor(<other arguments>, address _vrfCoordinator, address _link)VRFConsumerBase(_vrfCoordinator) public {<initialization with other arguments goes here>}}The oracle will have given you an ID for the VRF keypair they havecommitted to (let's call it keyHash). Create subscription, fund itand your consumer contract as a consumer of it (see VRFCoordinatorInterfacesubscription management functions).Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,callbackGasLimit, numWords),see (VRFCoordinatorInterface for a description of the arguments).Once the VRFCoordinator has received and validated the oracle's responseto your request, it will call your contract's fulfillRandomWords method.The randomness argument to fulfillRandomWords is a set of random wordsgenerated from your requestId and the blockHash of the request.If your contract could have concurrent requests open, you can use therequestId returned from requestRandomWords to track which response is associatedwith which randomness request.See \"SECURITY CONSIDERATIONS\" for principles to keep in mind,if your contract could have multiple requests in flight simultaneously.Colliding `requestId`s are cryptographically impossible as long as seedsdiffer. *****************************************************************************SECURITY CONSIDERATIONSA method with the ability to call your fulfillRandomness method directlycould spoof a VRF response with any random value, so it's critical thatit cannot be directly called by anything other than this base contract(specifically, by the VRFConsumerBase.rawFulfillRandomness method).For your users to trust that your contract's random behavior is freefrom malicious interference, it's best if you can write it so that allbehaviors implied by a VRF response are executed *during* yourfulfillRandomness method. If your contract must store the response (oranything derived from it) and use it later, you must ensure that anyuser-significant behavior which depends on that stored value cannot bemanipulated by a subsequent VRF request.Similarly, both miners and the VRF oracle itself have some influenceover the order in which VRF responses appear on the blockchain, so ifyour contract could have multiple VRF requests in flight simultaneously,you must ensure that the order in which the VRF responses arrive cannotbe used to manipulate your contract's user-significant behavior.Since the block hash of the block which contains the requestRandomnesscall is mixed into the input to the VRF *last*, a sufficiently powerfulminer could, in principle, fork the blockchain to evict the blockcontaining the request, forcing the request to be included in adifferent block with a different hash, and therefore a different inputto the VRF. However, such an attack would incur a substantial economiccost. This cost scales with the number of blocks the VRF oracle waitsuntil it calls responds to a request. It is for this reason thatthat you can signal to an oracle you'd like them to wait longer beforeresponding to the request (however this is not enforced in the contractand so remains effective only in the case of unmodified oracle software).","kind":"dev","methods":{"constructor":{"params":{"_vrfCoordinator":"address of VRFCoordinator contract"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"rawFulfillRandomWords(uint256,uint256[])":"1fe543e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"have\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"want\",\"type\":\"address\"}],\"name\":\"OnlyCoordinatorCanFulfill\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"randomWords\",\"type\":\"uint256[]\"}],\"name\":\"rawFulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"PURPOSEReggie the Random Oracle (not his real job) wants to provide randomnessto Vera the verifier in such a way that Vera can be sure he's notmaking his output up to suit himself. Reggie provides Vera a public keyto which he knows the secret key. Each time Vera provides a seed toReggie, he gives back a value which is computed completelydeterministically from the seed and the secret key.Reggie provides a proof by which Vera can verify that the output wascorrectly computed once Reggie tells it to her, but without that proof,the output is indistinguishable to her from a uniform random samplefrom the output space.The purpose of this contract is to make it easy for unrelated contractsto talk to Vera the verifier about the work Reggie is doing, to providesimple access to a verifiable source of randomness. It ensures 2 things:1. The fulfillment came from the VRFCoordinator2. The consumer contract implements fulfillRandomWords. *****************************************************************************USAGECalling contracts must inherit from VRFConsumerBase, and caninitialize VRFConsumerBase's attributes in their constructor asshown:contract VRFConsumer {constructor(<other arguments>, address _vrfCoordinator, address _link)VRFConsumerBase(_vrfCoordinator) public {<initialization with other arguments goes here>}}The oracle will have given you an ID for the VRF keypair they havecommitted to (let's call it keyHash). Create subscription, fund itand your consumer contract as a consumer of it (see VRFCoordinatorInterfacesubscription management functions).Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,callbackGasLimit, numWords),see (VRFCoordinatorInterface for a description of the arguments).Once the VRFCoordinator has received and validated the oracle's responseto your request, it will call your contract's fulfillRandomWords method.The randomness argument to fulfillRandomWords is a set of random wordsgenerated from your requestId and the blockHash of the request.If your contract could have concurrent requests open, you can use therequestId returned from requestRandomWords to track which response is associatedwith which randomness request.See \\\"SECURITY CONSIDERATIONS\\\" for principles to keep in mind,if your contract could have multiple requests in flight simultaneously.Colliding `requestId`s are cryptographically impossible as long as seedsdiffer. *****************************************************************************SECURITY CONSIDERATIONSA method with the ability to call your fulfillRandomness method directlycould spoof a VRF response with any random value, so it's critical thatit cannot be directly called by anything other than this base contract(specifically, by the VRFConsumerBase.rawFulfillRandomness method).For your users to trust that your contract's random behavior is freefrom malicious interference, it's best if you can write it so that allbehaviors implied by a VRF response are executed *during* yourfulfillRandomness method. If your contract must store the response (oranything derived from it) and use it later, you must ensure that anyuser-significant behavior which depends on that stored value cannot bemanipulated by a subsequent VRF request.Similarly, both miners and the VRF oracle itself have some influenceover the order in which VRF responses appear on the blockchain, so ifyour contract could have multiple VRF requests in flight simultaneously,you must ensure that the order in which the VRF responses arrive cannotbe used to manipulate your contract's user-significant behavior.Since the block hash of the block which contains the requestRandomnesscall is mixed into the input to the VRF *last*, a sufficiently powerfulminer could, in principle, fork the blockchain to evict the blockcontaining the request, forcing the request to be included in adifferent block with a different hash, and therefore a different inputto the VRF. However, such an attack would incur a substantial economiccost. This cost scales with the number of blocks the VRF oracle waitsuntil it calls responds to a request. It is for this reason thatthat you can signal to an oracle you'd like them to wait longer beforeresponding to the request (however this is not enforced in the contractand so remains effective only in the case of unmodified oracle software).\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_vrfCoordinator\":\"address of VRFCoordinator contract\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Interface for contracts using VRF randomness *****************************************************************************\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol\":\"VRFConsumerBaseV2\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n *\\n * @notice Interface for contracts using VRF randomness\\n * *****************************************************************************\\n * @dev PURPOSE\\n *\\n * @dev Reggie the Random Oracle (not his real job) wants to provide randomness\\n * @dev to Vera the verifier in such a way that Vera can be sure he's not\\n * @dev making his output up to suit himself. Reggie provides Vera a public key\\n * @dev to which he knows the secret key. Each time Vera provides a seed to\\n * @dev Reggie, he gives back a value which is computed completely\\n * @dev deterministically from the seed and the secret key.\\n *\\n * @dev Reggie provides a proof by which Vera can verify that the output was\\n * @dev correctly computed once Reggie tells it to her, but without that proof,\\n * @dev the output is indistinguishable to her from a uniform random sample\\n * @dev from the output space.\\n *\\n * @dev The purpose of this contract is to make it easy for unrelated contracts\\n * @dev to talk to Vera the verifier about the work Reggie is doing, to provide\\n * @dev simple access to a verifiable source of randomness. It ensures 2 things:\\n * @dev 1. The fulfillment came from the VRFCoordinator\\n * @dev 2. The consumer contract implements fulfillRandomWords.\\n * *****************************************************************************\\n * @dev USAGE\\n *\\n * @dev Calling contracts must inherit from VRFConsumerBase, and can\\n * @dev initialize VRFConsumerBase's attributes in their constructor as\\n * @dev shown:\\n *\\n * @dev   contract VRFConsumer {\\n * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)\\n * @dev       VRFConsumerBase(_vrfCoordinator) public {\\n * @dev         <initialization with other arguments goes here>\\n * @dev       }\\n * @dev   }\\n *\\n * @dev The oracle will have given you an ID for the VRF keypair they have\\n * @dev committed to (let's call it keyHash). Create subscription, fund it\\n * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface\\n * @dev subscription management functions).\\n * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,\\n * @dev callbackGasLimit, numWords),\\n * @dev see (VRFCoordinatorInterface for a description of the arguments).\\n *\\n * @dev Once the VRFCoordinator has received and validated the oracle's response\\n * @dev to your request, it will call your contract's fulfillRandomWords method.\\n *\\n * @dev The randomness argument to fulfillRandomWords is a set of random words\\n * @dev generated from your requestId and the blockHash of the request.\\n *\\n * @dev If your contract could have concurrent requests open, you can use the\\n * @dev requestId returned from requestRandomWords to track which response is associated\\n * @dev with which randomness request.\\n * @dev See \\\"SECURITY CONSIDERATIONS\\\" for principles to keep in mind,\\n * @dev if your contract could have multiple requests in flight simultaneously.\\n *\\n * @dev Colliding `requestId`s are cryptographically impossible as long as seeds\\n * @dev differ.\\n *\\n * *****************************************************************************\\n * @dev SECURITY CONSIDERATIONS\\n *\\n * @dev A method with the ability to call your fulfillRandomness method directly\\n * @dev could spoof a VRF response with any random value, so it's critical that\\n * @dev it cannot be directly called by anything other than this base contract\\n * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).\\n *\\n * @dev For your users to trust that your contract's random behavior is free\\n * @dev from malicious interference, it's best if you can write it so that all\\n * @dev behaviors implied by a VRF response are executed *during* your\\n * @dev fulfillRandomness method. If your contract must store the response (or\\n * @dev anything derived from it) and use it later, you must ensure that any\\n * @dev user-significant behavior which depends on that stored value cannot be\\n * @dev manipulated by a subsequent VRF request.\\n *\\n * @dev Similarly, both miners and the VRF oracle itself have some influence\\n * @dev over the order in which VRF responses appear on the blockchain, so if\\n * @dev your contract could have multiple VRF requests in flight simultaneously,\\n * @dev you must ensure that the order in which the VRF responses arrive cannot\\n * @dev be used to manipulate your contract's user-significant behavior.\\n *\\n * @dev Since the block hash of the block which contains the requestRandomness\\n * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful\\n * @dev miner could, in principle, fork the blockchain to evict the block\\n * @dev containing the request, forcing the request to be included in a\\n * @dev different block with a different hash, and therefore a different input\\n * @dev to the VRF. However, such an attack would incur a substantial economic\\n * @dev cost. This cost scales with the number of blocks the VRF oracle waits\\n * @dev until it calls responds to a request. It is for this reason that\\n * @dev that you can signal to an oracle you'd like them to wait longer before\\n * @dev responding to the request (however this is not enforced in the contract\\n * @dev and so remains effective only in the case of unmodified oracle software).\\n */\\nabstract contract VRFConsumerBaseV2 {\\n  error OnlyCoordinatorCanFulfill(address have, address want);\\n\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  address private immutable vrfCoordinator;\\n\\n  /**\\n   * @param _vrfCoordinator address of VRFCoordinator contract\\n   */\\n  constructor(\\n    address _vrfCoordinator\\n  ) {\\n    vrfCoordinator = _vrfCoordinator;\\n  }\\n\\n  /**\\n   * @notice fulfillRandomness handles the VRF response. Your contract must\\n   * @notice implement it. See \\\"SECURITY CONSIDERATIONS\\\" above for important\\n   * @notice principles to keep in mind when implementing your fulfillRandomness\\n   * @notice method.\\n   *\\n   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this\\n   * @dev signature, and will call it once it has verified the proof\\n   * @dev associated with the randomness. (It is triggered via a call to\\n   * @dev rawFulfillRandomness, below.)\\n   *\\n   * @param requestId The Id initially returned by requestRandomness\\n   * @param randomWords the VRF output expanded to the requested number of words\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;\\n\\n  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF\\n  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating\\n  // the origin of the call\\n  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {\\n    if (msg.sender != vrfCoordinator) {\\n      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);\\n    }\\n    fulfillRandomWords(requestId, randomWords);\\n  }\\n}\\n\",\"keccak256\":\"0x377514238c3fd6e6f9acdce8b537aa8c189c3164edc1027a3d25044ab24d7b4f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Interface for contracts using VRF randomness *****************************************************************************","version":1}}},"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol":{"VRFV2WrapperConsumerBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256[]","name":"_randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"PURPOSECreate VRF V2 requests without the need for subscription management. Rather than creatingand funding a VRF V2 subscription, a user can use this wrapper to create one off requests,paying up front rather than at fulfillment.Since the price is determined using the gas price of the request transaction rather thanthe fulfillment transaction, the wrapper charges an additional premium on callback gasusage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract. *****************************************************************************USAGECalling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be fundedwith enough LINK to make the request, otherwise requests will revert. To request randomness,call the 'requestRandomness' function with the desired VRF parameters. This function handlespaying for the request based on the current pricing.Consumers must implement the fullfillRandomWords function, which will be called duringfulfillment with the randomness result.","kind":"dev","methods":{"constructor":{"params":{"_link":"is the address of LinkToken","_vrfV2Wrapper":"is the address of the VRFV2Wrapper contract"}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"rawFulfillRandomWords(uint256,uint256[])":"1fe543e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"_randomWords\",\"type\":\"uint256[]\"}],\"name\":\"rawFulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"PURPOSECreate VRF V2 requests without the need for subscription management. Rather than creatingand funding a VRF V2 subscription, a user can use this wrapper to create one off requests,paying up front rather than at fulfillment.Since the price is determined using the gas price of the request transaction rather thanthe fulfillment transaction, the wrapper charges an additional premium on callback gasusage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract. *****************************************************************************USAGECalling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be fundedwith enough LINK to make the request, otherwise requests will revert. To request randomness,call the 'requestRandomness' function with the desired VRF parameters. This function handlespaying for the request based on the current pricing.Consumers must implement the fullfillRandomWords function, which will be called duringfulfillment with the randomness result.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_link\":\"is the address of LinkToken\",\"_vrfV2Wrapper\":\"is the address of the VRFV2Wrapper contract\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Interface for contracts using VRF randomness through the VRF V2 wrapper ********************************************************************************\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol\":\"VRFV2WrapperConsumerBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface LinkTokenInterface {\\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\\n\\n  function approve(address spender, uint256 value) external returns (bool success);\\n\\n  function balanceOf(\\n    address owner\\n  ) external view returns (uint256 balance);\\n\\n  function decimals() external view returns (uint8 decimalPlaces);\\n\\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\\n\\n  function increaseApproval(address spender, uint256 subtractedValue) external;\\n\\n  function name() external view returns (string memory tokenName);\\n\\n  function symbol() external view returns (string memory tokenSymbol);\\n\\n  function totalSupply() external view returns (uint256 totalTokensIssued);\\n\\n  function transfer(address to, uint256 value) external returns (bool success);\\n\\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\\n\\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xcee9303d524c29fefc346775ec0be31d134a5f14c990fe04961a9f516eb23ad5\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {LinkTokenInterface} from \\\"../shared/interfaces/LinkTokenInterface.sol\\\";\\nimport {VRFV2WrapperInterface} from \\\"./interfaces/VRFV2WrapperInterface.sol\\\";\\n\\n/**\\n *\\n * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\\n * ********************************************************************************\\n * @dev PURPOSE\\n *\\n * @dev Create VRF V2 requests without the need for subscription management. Rather than creating\\n * @dev and funding a VRF V2 subscription, a user can use this wrapper to create one off requests,\\n * @dev paying up front rather than at fulfillment.\\n *\\n * @dev Since the price is determined using the gas price of the request transaction rather than\\n * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\\n * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\\n * *****************************************************************************\\n * @dev USAGE\\n *\\n * @dev Calling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be funded\\n * @dev with enough LINK to make the request, otherwise requests will revert. To request randomness,\\n * @dev call the 'requestRandomness' function with the desired VRF parameters. This function handles\\n * @dev paying for the request based on the current pricing.\\n *\\n * @dev Consumers must implement the fullfillRandomWords function, which will be called during\\n * @dev fulfillment with the randomness result.\\n */\\nabstract contract VRFV2WrapperConsumerBase {\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  LinkTokenInterface internal immutable LINK;\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  VRFV2WrapperInterface internal immutable VRF_V2_WRAPPER;\\n\\n  /**\\n   * @param _link is the address of LinkToken\\n   * @param _vrfV2Wrapper is the address of the VRFV2Wrapper contract\\n   */\\n  constructor(address _link, address _vrfV2Wrapper) {\\n    LINK = LinkTokenInterface(_link);\\n    VRF_V2_WRAPPER = VRFV2WrapperInterface(_vrfV2Wrapper);\\n  }\\n\\n  /**\\n   * @dev Requests randomness from the VRF V2 wrapper.\\n   *\\n   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\\n   *        fulfillRandomWords function.\\n   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the\\n   *        request. A higher number of confirmations increases security by reducing the likelihood\\n   *        that a chain re-org changes a published randomness outcome.\\n   * @param _numWords is the number of random words to request.\\n   *\\n   * @return requestId is the VRF V2 request ID of the newly created randomness request.\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function requestRandomness(\\n    uint32 _callbackGasLimit,\\n    uint16 _requestConfirmations,\\n    uint32 _numWords\\n  ) internal returns (uint256 requestId) {\\n    LINK.transferAndCall(\\n      address(VRF_V2_WRAPPER),\\n      VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit),\\n      abi.encode(_callbackGasLimit, _requestConfirmations, _numWords)\\n    );\\n    return VRF_V2_WRAPPER.lastRequestId();\\n  }\\n\\n  /**\\n   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\\n   * @notice implement it.\\n   *\\n   * @param _requestId is the VRF V2 request ID.\\n   * @param _randomWords is the randomness result.\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;\\n\\n  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {\\n    // solhint-disable-next-line gas-custom-errors\\n    require(msg.sender == address(VRF_V2_WRAPPER), \\\"only VRF V2 wrapper can fulfill\\\");\\n    fulfillRandomWords(_requestId, _randomWords);\\n  }\\n}\\n\",\"keccak256\":\"0x05d5043384cff455fbc91265acfb11a9b6c64c27ab9648944bce1df25a98d10c\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface VRFV2WrapperInterface {\\n  /**\\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\\n   * be relied option within the same transaction that the request was made.\\n   */\\n  function lastRequestId() external view returns (uint256);\\n\\n  /**\\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\\n   * @notice block.\\n   *\\n   * @dev This function relies on the transaction gas price which is not automatically set during\\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   */\\n  function calculateRequestPrice(\\n    uint32 _callbackGasLimit\\n  ) external view returns (uint256);\\n\\n  /**\\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\\n   *\\n   * @dev This is a convenience function that can be called in simulation to better understand\\n   * @dev pricing.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\\n   */\\n  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x64e35b94edb2bf70b2fd64d5c571394b44e3c66f707ece3555fe81e847f2517a\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Interface for contracts using VRF randomness through the VRF V2 wrapper ********************************************************************************","version":1}}},"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol":{"VRFV2WrapperInterface":{"abi":[{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"name":"calculateRequestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"uint256","name":"_requestGasPriceWei","type":"uint256"}],"name":"estimateRequestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"calculateRequestPrice(uint32)":{"details":"This function relies on the transaction gas price which is not automatically set duringsimulation. To estimate the price at a specific gas price, use the estimatePrice function.","params":{"_callbackGasLimit":"is the gas limit used to estimate the price."}},"estimateRequestPrice(uint32,uint256)":{"details":"This is a convenience function that can be called in simulation to better understandpricing.","params":{"_callbackGasLimit":"is the gas limit used to estimate the price.","_requestGasPriceWei":"is the gas price in wei used for the estimation."}},"lastRequestId()":{"returns":{"_0":"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"calculateRequestPrice(uint32)":"4306d354","estimateRequestPrice(uint32,uint256)":"7fb5d19d","lastRequestId()":"fc2a88c3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"_requestGasPriceWei\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRequestId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"calculateRequestPrice(uint32)\":{\"details\":\"This function relies on the transaction gas price which is not automatically set duringsimulation. To estimate the price at a specific gas price, use the estimatePrice function.\",\"params\":{\"_callbackGasLimit\":\"is the gas limit used to estimate the price.\"}},\"estimateRequestPrice(uint32,uint256)\":{\"details\":\"This is a convenience function that can be called in simulation to better understandpricing.\",\"params\":{\"_callbackGasLimit\":\"is the gas limit used to estimate the price.\",\"_requestGasPriceWei\":\"is the gas price in wei used for the estimation.\"}},\"lastRequestId()\":{\"returns\":{\"_0\":\"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"calculateRequestPrice(uint32)\":{\"notice\":\"Calculates the price of a VRF request with the given callbackGasLimit at the currentblock.\"},\"estimateRequestPrice(uint32,uint256)\":{\"notice\":\"Estimates the price of a VRF request with a specific gas limit and gas price.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\":\"VRFV2WrapperInterface\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface VRFV2WrapperInterface {\\n  /**\\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\\n   * be relied option within the same transaction that the request was made.\\n   */\\n  function lastRequestId() external view returns (uint256);\\n\\n  /**\\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\\n   * @notice block.\\n   *\\n   * @dev This function relies on the transaction gas price which is not automatically set during\\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   */\\n  function calculateRequestPrice(\\n    uint32 _callbackGasLimit\\n  ) external view returns (uint256);\\n\\n  /**\\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\\n   *\\n   * @dev This is a convenience function that can be called in simulation to better understand\\n   * @dev pricing.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\\n   */\\n  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x64e35b94edb2bf70b2fd64d5c571394b44e3c66f707ece3555fe81e847f2517a\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"calculateRequestPrice(uint32)":{"notice":"Calculates the price of a VRF request with the given callbackGasLimit at the currentblock."},"estimateRequestPrice(uint32,uint256)":{"notice":"Estimates the price of a VRF request with a specific gas limit and gas price."}},"version":1}}},"@openzeppelin/contracts/interfaces/IERC1363.sol":{"IERC1363":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"approveAndCall(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.","params":{"spender":"The address which will spend the funds.","value":"The amount of tokens to be spent."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}},"approveAndCall(address,uint256,bytes)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.","params":{"data":"Additional data with no specified format, sent in call to `spender`.","spender":"The address which will spend the funds.","value":"The amount of tokens to be spent."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"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[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferAndCall(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to` and then calls {IERC1363Receiver-onTransferReceived} on `to`.","params":{"to":"The address which you want to transfer to.","value":"The amount of tokens to be transferred."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}},"transferAndCall(address,uint256,bytes)":{"details":"Moves a `value` amount of tokens from the caller's account to `to` and then calls {IERC1363Receiver-onTransferReceived} on `to`.","params":{"data":"Additional data with no specified format, sent in call to `to`.","to":"The address which you want to transfer to.","value":"The amount of tokens to be transferred."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFromAndCall(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism and then calls {IERC1363Receiver-onTransferReceived} on `to`.","params":{"from":"The address which you want to send tokens from.","to":"The address which you want to transfer to.","value":"The amount of tokens to be transferred."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}},"transferFromAndCall(address,address,uint256,bytes)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism and then calls {IERC1363Receiver-onTransferReceived} on `to`.","params":{"data":"Additional data with no specified format, sent in call to `to`.","from":"The address which you want to send tokens from.","to":"The address which you want to transfer to.","value":"The amount of tokens to be transferred."},"returns":{"_0":"A boolean value indicating whether the operation succeeded unless throwing."}}},"title":"IERC1363","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","approveAndCall(address,uint256)":"3177029f","approveAndCall(address,uint256,bytes)":"cae9ca51","balanceOf(address)":"70a08231","supportsInterface(bytes4)":"01ffc9a7","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferAndCall(address,uint256)":"1296ee62","transferAndCall(address,uint256,bytes)":"4000aea0","transferFrom(address,address,uint256)":"23b872dd","transferFromAndCall(address,address,uint256)":"d8fbe994","transferFromAndCall(address,address,uint256,bytes)":"c1d34b89"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"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\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferFromAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFromAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"approveAndCall(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\",\"params\":{\"spender\":\"The address which will spend the funds.\",\"value\":\"The amount of tokens to be spent.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}},\"approveAndCall(address,uint256,bytes)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\",\"params\":{\"data\":\"Additional data with no specified format, sent in call to `spender`.\",\"spender\":\"The address which will spend the funds.\",\"value\":\"The amount of tokens to be spent.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"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[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferAndCall(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to` and then calls {IERC1363Receiver-onTransferReceived} on `to`.\",\"params\":{\"to\":\"The address which you want to transfer to.\",\"value\":\"The amount of tokens to be transferred.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}},\"transferAndCall(address,uint256,bytes)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to` and then calls {IERC1363Receiver-onTransferReceived} on `to`.\",\"params\":{\"data\":\"Additional data with no specified format, sent in call to `to`.\",\"to\":\"The address which you want to transfer to.\",\"value\":\"The amount of tokens to be transferred.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFromAndCall(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism and then calls {IERC1363Receiver-onTransferReceived} on `to`.\",\"params\":{\"from\":\"The address which you want to send tokens from.\",\"to\":\"The address which you want to transfer to.\",\"value\":\"The amount of tokens to be transferred.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}},\"transferFromAndCall(address,address,uint256,bytes)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism and then calls {IERC1363Receiver-onTransferReceived} on `to`.\",\"params\":{\"data\":\"Additional data with no specified format, sent in call to `to`.\",\"from\":\"The address which you want to send tokens from.\",\"to\":\"The address which you want to transfer to.\",\"value\":\"The amount of tokens to be transferred.\"},\"returns\":{\"_0\":\"A boolean value indicating whether the operation succeeded unless throwing.\"}}},\"title\":\"IERC1363\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":\"IERC1363\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"IERC20":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"Interface of the ERC-20 standard as defined in the ERC.","events":{"Approval(address,address,uint256)":{"details":"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."},"Transfer(address,address,uint256)":{"details":"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."}},"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC-20 standard as defined in the ERC.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"SafeERC20":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"SafeERC20FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"}],"devdoc":{"details":"Wrappers around ERC-20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.","errors":{"SafeERC20FailedDecreaseAllowance(address,uint256,uint256)":[{"details":"Indicates a failed `decreaseAllowance` request."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{},"title":"SafeERC20","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212208feee1ecb4436e1b9da399c46a4b9d1aebd7305a41880c51a86d0ce064e24c0464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 RETURNCONTRACT 0xE1 EOFCREATE 0xB4 NUMBER PUSH15 0x1B9DA399C46A4B9D1AEBD7305A4188 0xC MLOAD 0xA8 PUSH14 0xCE064E24C0464736F6C63430008 0x1E STOP CALLER ","sourceMap":"698:9376:8:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212208feee1ecb4436e1b9da399c46a4b9d1aebd7305a41880c51a86d0ce064e24c0464736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 RETURNCONTRACT 0xE1 EOFCREATE 0xB4 NUMBER PUSH15 0x1B9DA399C46A4B9D1AEBD7305A4188 0xC MLOAD 0xA8 PUSH14 0xCE064E24C0464736F6C63430008 0x1E STOP CALLER ","sourceMap":"698:9376:8:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_callOptionalReturn(contract IERC20,bytes memory)":"infinite","_callOptionalReturnBool(contract IERC20,bytes memory)":"infinite","approveAndCallRelaxed(contract IERC1363,address,uint256,bytes memory)":"infinite","forceApprove(contract IERC20,address,uint256)":"infinite","safeDecreaseAllowance(contract IERC20,address,uint256)":"infinite","safeIncreaseAllowance(contract IERC20,address,uint256)":"infinite","safeTransfer(contract IERC20,address,uint256)":"infinite","safeTransferFrom(contract IERC20,address,address,uint256)":"infinite","transferAndCallRelaxed(contract IERC1363,address,uint256,bytes memory)":"infinite","transferFromAndCallRelaxed(contract IERC1363,address,address,uint256,bytes memory)":"infinite","trySafeTransfer(contract IERC20,address,uint256)":"infinite","trySafeTransferFrom(contract IERC20,address,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentAllowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requestedDecrease\",\"type\":\"uint256\"}],\"name\":\"SafeERC20FailedDecreaseAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Wrappers around ERC-20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\",\"errors\":{\"SafeERC20FailedDecreaseAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failed `decreaseAllowance` request.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"SafeERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":\"SafeERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Address.sol":{"Address":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"}],"devdoc":{"details":"Collection of functions related to the address type","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220dac032cd3ae44e8a2d3daf547f8229d31cbbaeb585d2a511bab67a66edb250f464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDA 0xC0 ORIGIN 0xCD GASPRICE RETF 0x4E DUP11 0x2D RETURNDATASIZE 0xAF SLOAD PUSH32 0x8229D31CBBAEB585D2A511BAB67A66EDB250F464736F6C634300081E00330000 ","sourceMap":"233:5762:9:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220dac032cd3ae44e8a2d3daf547f8229d31cbbaeb585d2a511bab67a66edb250f464736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDA 0xC0 ORIGIN 0xCD GASPRICE RETF 0x4E DUP11 0x2D RETURNDATASIZE 0xAF SLOAD PUSH32 0x8229D31CBBAEB585D2A511BAB67A66EDB250F464736F6C634300081E00330000 ","sourceMap":"233:5762:9:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_revert(bytes memory)":"infinite","functionCall(address,bytes memory)":"infinite","functionCallWithValue(address,bytes memory,uint256)":"infinite","functionDelegateCall(address,bytes memory)":"infinite","functionStaticCall(address,bytes memory)":"infinite","sendValue(address payable,uint256)":"infinite","verifyCallResult(bool,bytes memory)":"infinite","verifyCallResultFromTarget(address,bool,bytes memory)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/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":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":{\"@openzeppelin/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Errors.sol":{"Errors":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MissingPrecompile","type":"error"}],"devdoc":{"details":"Collection of common custom errors used in multiple contracts IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. It is recommended to avoid relying on the error API for critical functionality. _Available since v5.1._","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"FailedDeployment()":[{"details":"The deployment failed."}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"MissingPrecompile(address)":[{"details":"A necessary precompile is missing."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220db18e11f89c737e95960bf496e6968c6d2ed9568a8127d3c1761c9388b6e6ae964736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDB XOR RJUMPI 0x1F89 0xC7 CALLDATACOPY 0xE9 MSIZE PUSH1 0xBF BLOBHASH PUSH15 0x6968C6D2ED9568A8127D3C1761C938 DUP12 PUSH15 0x6AE964736F6C634300081E00330000 ","sourceMap":"411:484:11:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220db18e11f89c737e95960bf496e6968c6d2ed9568a8127d3c1761c9388b6e6ae964736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDB XOR RJUMPI 0x1F89 0xC7 CALLDATACOPY 0xE9 MSIZE PUSH1 0xBF BLOBHASH PUSH15 0x6968C6D2ED9568A8127D3C1761C938 DUP12 PUSH15 0x6AE964736F6C634300081E00330000 ","sourceMap":"411:484:11:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedDeployment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"MissingPrecompile\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of common custom errors used in multiple contracts IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. It is recommended to avoid relying on the error API for critical functionality. _Available since v5.1._\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"FailedDeployment()\":[{\"details\":\"The deployment failed.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"MissingPrecompile(address)\":[{\"details\":\"A necessary precompile is missing.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Errors.sol\":\"Errors\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Panic.sol":{"Panic":{"abi":[],"devdoc":{"details":"Helper library for emitting standardized panic codes. ```solidity contract Example {      using Panic for uint256;      // Use any of the declared internal constants      function foo() { Panic.GENERIC.panic(); }      // Alternatively      function foo() { Panic.panic(Panic.GENERIC); } } ``` Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil]. _Available since v5.1._","kind":"dev","methods":{},"stateVariables":{"ARRAY_OUT_OF_BOUNDS":{"details":"array out of bounds access"},"ASSERT":{"details":"used by the assert() builtin"},"DIVISION_BY_ZERO":{"details":"division or modulo by zero"},"EMPTY_ARRAY_POP":{"details":"empty array pop"},"ENUM_CONVERSION_ERROR":{"details":"enum conversion error"},"GENERIC":{"details":"generic / unspecified error"},"INVALID_INTERNAL_FUNCTION":{"details":"calling invalid internal function"},"RESOURCE_ERROR":{"details":"resource error (too large allocation or too large array)"},"STORAGE_ENCODING_ERROR":{"details":"invalid encoding in storage"},"UNDER_OVERFLOW":{"details":"arithmetic underflow or overflow"}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220d2cdcddf388992b3f0247a3f1fd1d1322ce320f1be9931368a9ae7cd2ea98e4c64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD2 0xCD 0xCD 0xDF CODESIZE DUP10 SWAP3 0xB3 CREATE 0x24 PUSH27 0x3F1FD1D1322CE320F1BE9931368A9AE7CD2EA98E4C64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"657:1315:12:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220d2cdcddf388992b3f0247a3f1fd1d1322ce320f1be9931368a9ae7cd2ea98e4c64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD2 0xCD 0xCD 0xDF CODESIZE DUP10 SWAP3 0xB3 CREATE 0x24 PUSH27 0x3F1FD1D1322CE320F1BE9931368A9AE7CD2EA98E4C64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"657:1315:12:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"panic(uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Helper library for emitting standardized panic codes. ```solidity contract Example {      using Panic for uint256;      // Use any of the declared internal constants      function foo() { Panic.GENERIC.panic(); }      // Alternatively      function foo() { Panic.panic(Panic.GENERIC); } } ``` Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil]. _Available since v5.1._\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"ARRAY_OUT_OF_BOUNDS\":{\"details\":\"array out of bounds access\"},\"ASSERT\":{\"details\":\"used by the assert() builtin\"},\"DIVISION_BY_ZERO\":{\"details\":\"division or modulo by zero\"},\"EMPTY_ARRAY_POP\":{\"details\":\"empty array pop\"},\"ENUM_CONVERSION_ERROR\":{\"details\":\"enum conversion error\"},\"GENERIC\":{\"details\":\"generic / unspecified error\"},\"INVALID_INTERNAL_FUNCTION\":{\"details\":\"calling invalid internal function\"},\"RESOURCE_ERROR\":{\"details\":\"resource error (too large allocation or too large array)\"},\"STORAGE_ENCODING_ERROR\":{\"details\":\"invalid encoding in storage\"},\"UNDER_OVERFLOW\":{\"details\":\"arithmetic underflow or overflow\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Panic.sol\":\"Panic\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"ReentrancyGuard":{"abi":[{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"}],"devdoc":{"details":"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, consider using {ReentrancyGuardTransient} instead. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, consider using {ReentrancyGuardTransient} instead. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\",\"errors\":{\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"@openzeppelin/contracts/utils/ReentrancyGuard.sol:ReentrancyGuard","label":"_status","offset":0,"slot":"0","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/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 ERC-1967 implementation slot: ```solidity contract ERC1967 {     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;     function _getImplementation() internal view returns (address) {         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;     }     function _setImplementation(address newImplementation) internal {         require(newImplementation.code.length > 0);         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;     } } ``` TIP: Consider using this library along with {SlotDerivation}.","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220ded6a9080175d2ce378735286f41a2ca000637fcb34b8336c1b972108f6d9a7964736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE 0xD6 0xA9 ADDMOD ADD PUSH22 0xD2CE378735286F41A2CA000637FCB34B8336C1B97210 DUP16 PUSH14 0x9A7964736F6C634300081E003300 ","sourceMap":"1407:2774:14:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220ded6a9080175d2ce378735286f41a2ca000637fcb34b8336c1b972108f6d9a7964736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE 0xD6 0xA9 ADDMOD ADD PUSH22 0xD2CE378735286F41A2CA000637FCB34B8336C1B97210 DUP16 PUSH14 0x9A7964736F6C634300081E003300 ","sourceMap":"1407:2774:14:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"getAddressSlot(bytes32)":"infinite","getBooleanSlot(bytes32)":"infinite","getBytes32Slot(bytes32)":"infinite","getBytesSlot(bytes storage pointer)":"infinite","getBytesSlot(bytes32)":"infinite","getInt256Slot(bytes32)":"infinite","getStringSlot(bytes32)":"infinite","getStringSlot(string storage pointer)":"infinite","getUint256Slot(bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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 ERC-1967 implementation slot: ```solidity contract ERC1967 {     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;     function _getImplementation() internal view returns (address) {         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;     }     function _setImplementation(address newImplementation) internal {         require(newImplementation.code.length > 0);         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;     } } ``` TIP: Consider using this library along with {SlotDerivation}.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/Strings.sol":{"Strings":{"abi":[{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"StringsInsufficientHexLength","type":"error"},{"inputs":[],"name":"StringsInvalidAddressFormat","type":"error"},{"inputs":[],"name":"StringsInvalidChar","type":"error"}],"devdoc":{"details":"String operations.","errors":{"StringsInsufficientHexLength(uint256,uint256)":[{"details":"The `value` string doesn't fit in the specified `length`."}],"StringsInvalidAddressFormat()":[{"details":"The string being parsed is not a properly formatted address."}],"StringsInvalidChar()":[{"details":"The string being parsed contains characters that are not in scope of the given base."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122022abc4984d6bc7dedc2401ea30974017efda863d9837b6c1731448e1b32fc27764736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 0xAB 0xC4 SWAP9 0x4D PUSH12 0xC7DEDC2401EA30974017EFDA DUP7 RETURNDATASIZE SWAP9 CALLDATACOPY 0xB6 0xC1 PUSH20 0x1448E1B32FC27764736F6C634300081E00330000 ","sourceMap":"297:18982:15:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122022abc4984d6bc7dedc2401ea30974017efda863d9837b6c1731448e1b32fc27764736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 0xAB 0xC4 SWAP9 0x4D PUSH12 0xC7DEDC2401EA30974017EFDA DUP7 RETURNDATASIZE SWAP9 CALLDATACOPY 0xB6 0xC1 PUSH20 0x1448E1B32FC27764736F6C634300081E00330000 ","sourceMap":"297:18982:15:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_tryParseChr(bytes1)":"infinite","_tryParseHexUintUncheckedBounds(string memory,uint256,uint256)":"infinite","_tryParseIntUncheckedBounds(string memory,uint256,uint256)":"infinite","_tryParseUintUncheckedBounds(string memory,uint256,uint256)":"infinite","_unsafeReadBytesOffset(bytes memory,uint256)":"infinite","equal(string memory,string memory)":"infinite","escapeJSON(string memory)":"infinite","parseAddress(string memory)":"infinite","parseAddress(string memory,uint256,uint256)":"infinite","parseHexUint(string memory)":"infinite","parseHexUint(string memory,uint256,uint256)":"infinite","parseInt(string memory)":"infinite","parseInt(string memory,uint256,uint256)":"infinite","parseUint(string memory)":"infinite","parseUint(string memory,uint256,uint256)":"infinite","toChecksumHexString(address)":"infinite","toHexString(address)":"infinite","toHexString(uint256)":"infinite","toHexString(uint256,uint256)":"infinite","toString(uint256)":"infinite","toStringSigned(int256)":"infinite","tryParseAddress(string memory)":"infinite","tryParseAddress(string memory,uint256,uint256)":"infinite","tryParseHexUint(string memory)":"infinite","tryParseHexUint(string memory,uint256,uint256)":"infinite","tryParseInt(string memory)":"infinite","tryParseInt(string memory,uint256,uint256)":"infinite","tryParseUint(string memory)":"infinite","tryParseUint(string memory,uint256,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StringsInvalidAddressFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StringsInvalidChar\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"String operations.\",\"errors\":{\"StringsInsufficientHexLength(uint256,uint256)\":[{\"details\":\"The `value` string doesn't fit in the specified `length`.\"}],\"StringsInvalidAddressFormat()\":[{\"details\":\"The string being parsed is not a properly formatted address.\"}],\"StringsInvalidChar()\":[{\"details\":\"The string being parsed contains characters that are not in scope of the given base.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Strings.sol\":\"Strings\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SafeCast} from \\\"./math/SafeCast.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    using SafeCast for *;\\n\\n    bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n    uint8 private constant ADDRESS_LENGTH = 20;\\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\\n        (1 << 0x08) | // backspace\\n            (1 << 0x09) | // tab\\n            (1 << 0x0a) | // newline\\n            (1 << 0x0c) | // form feed\\n            (1 << 0x0d) | // carriage return\\n            (1 << 0x22) | // double quote\\n            (1 << 0x5c); // backslash\\n\\n    /**\\n     * @dev The `value` string doesn't fit in the specified `length`.\\n     */\\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n    /**\\n     * @dev The string being parsed contains characters that are not in scope of the given base.\\n     */\\n    error StringsInvalidChar();\\n\\n    /**\\n     * @dev The string being parsed is not a properly formatted address.\\n     */\\n    error StringsInvalidAddressFormat();\\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            assembly (\\\"memory-safe\\\") {\\n                ptr := add(add(buffer, 0x20), length)\\n            }\\n            while (true) {\\n                ptr--;\\n                assembly (\\\"memory-safe\\\") {\\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\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 toStringSigned(int256 value) internal pure returns (string memory) {\\n        return string.concat(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        uint256 localValue = value;\\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] = HEX_DIGITS[localValue & 0xf];\\n            localValue >>= 4;\\n        }\\n        if (localValue != 0) {\\n            revert StringsInsufficientHexLength(value, length);\\n        }\\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\\n     * 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 Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\\n     * representation, according to EIP-55.\\n     */\\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(toHexString(addr));\\n\\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\\n        uint256 hashValue;\\n        assembly (\\\"memory-safe\\\") {\\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\\n        }\\n\\n        for (uint256 i = 41; i > 1; --i) {\\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\\n                // case shift by xoring with 0x20\\n                buffer[i] ^= 0x20;\\n            }\\n            hashValue >>= 4;\\n        }\\n        return string(buffer);\\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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input) internal pure returns (uint256) {\\n        return parseUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 9) return (false, 0);\\n            result *= 10;\\n            result += chr;\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `int256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input) internal pure returns (int256) {\\n        return parseInt(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\\n        (bool success, int256 value) = tryParseInt(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\\n     * the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\\n\\n    /**\\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character or if the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, int256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseIntUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseIntUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, int256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // Check presence of a negative sign.\\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        bool positiveSign = sign == bytes1(\\\"+\\\");\\n        bool negativeSign = sign == bytes1(\\\"-\\\");\\n        uint256 offset = (positiveSign || negativeSign).toUint();\\n\\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\\n\\n        if (absSuccess && absValue < ABS_MIN_INT256) {\\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\\n            return (true, type(int256).min);\\n        } else return (false, 0);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input) internal pure returns (uint256) {\\n        return parseHexUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\\n     * invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseHexUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // skip 0x prefix if present\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 offset = hasPrefix.toUint() * 2;\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin + offset; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 15) return (false, 0);\\n            result *= 16;\\n            unchecked {\\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\\n                result += chr;\\n            }\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as an `address`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input) internal pure returns (address) {\\n        return parseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\\n        (bool success, address value) = tryParseAddress(input, begin, end);\\n        if (!success) revert StringsInvalidAddressFormat();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\\n     * formatted address. See {parseAddress-string} requirements.\\n     */\\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\\n        return tryParseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\\n     */\\n    function tryParseAddress(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, address value) {\\n        if (end > bytes(input).length || begin > end) return (false, address(0));\\n\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\\n\\n        // check that input is the correct length\\n        if (end - begin == expectedLength) {\\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\\n            return (s, address(uint160(v)));\\n        } else {\\n            return (false, address(0));\\n        }\\n    }\\n\\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\\n        uint8 value = uint8(chr);\\n\\n        // Try to parse `chr`:\\n        // - Case 1: [0-9]\\n        // - Case 2: [a-f]\\n        // - Case 3: [A-F]\\n        // - otherwise not supported\\n        unchecked {\\n            if (value > 47 && value < 58) value -= 48;\\n            else if (value > 96 && value < 103) value -= 87;\\n            else if (value > 64 && value < 71) value -= 55;\\n            else return type(uint8).max;\\n        }\\n\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\\n     *\\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\\n     *\\n     * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\\n     * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\\n     * characters that are not in this range, but other tooling may provide different results.\\n     */\\n    function escapeJSON(string memory input) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(input);\\n        bytes memory output = new bytes(2 * buffer.length); // worst case scenario\\n        uint256 outputLength = 0;\\n\\n        for (uint256 i; i < buffer.length; ++i) {\\n            bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\\n            if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\\n                output[outputLength++] = \\\"\\\\\\\\\\\";\\n                if (char == 0x08) output[outputLength++] = \\\"b\\\";\\n                else if (char == 0x09) output[outputLength++] = \\\"t\\\";\\n                else if (char == 0x0a) output[outputLength++] = \\\"n\\\";\\n                else if (char == 0x0c) output[outputLength++] = \\\"f\\\";\\n                else if (char == 0x0d) output[outputLength++] = \\\"r\\\";\\n                else if (char == 0x5c) output[outputLength++] = \\\"\\\\\\\\\\\";\\n                else if (char == 0x22) {\\n                    // solhint-disable-next-line quotes\\n                    output[outputLength++] = '\\\"';\\n                }\\n            } else {\\n                output[outputLength++] = char;\\n            }\\n        }\\n        // write the actual length and deallocate unused memory\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(output, outputLength)\\n            mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\\n        }\\n\\n        return string(output);\\n    }\\n\\n    /**\\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\\n     *\\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\\n     * assembly block as such would prevent some optimizations.\\n     */\\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\\n        assembly (\\\"memory-safe\\\") {\\n            value := mload(add(add(buffer, 0x20), offset))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two signed numbers.\\n     */\\n    function max(int256 a, int256 b) internal pure returns (int256) {\\n        return ternary(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 ternary(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            // Formula from the \\\"Bit Twiddling Hacks\\\" by Sean Eron Anderson.\\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\\n            // taking advantage of the most significant (or \\\"sign\\\" bit) in two's complement representation.\\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\\n            int256 mask = n >> 255;\\n\\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\\n            return uint256((n + mask) ^ mask);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"ECDSA":{"abi":[{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"}],"devdoc":{"details":"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.","errors":{"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220520e75b3797a9df144be0e16acc54617718cb6142298754c050e128a9672dfab64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE 0xE PUSH22 0xB3797A9DF144BE0E16ACC54617718CB6142298754C05 0xE SLT DUP11 SWAP7 PUSH19 0xDFAB64736F6C634300081E0033000000000000 ","sourceMap":"344:7470:16:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220520e75b3797a9df144be0e16acc54617718cb6142298754c050e128a9672dfab64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE 0xE PUSH22 0xB3797A9DF144BE0E16ACC54617718CB6142298754C05 0xE SLT DUP11 SWAP7 PUSH19 0xDFAB64736F6C634300081E0033000000000000 ","sourceMap":"344:7470:16:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_throwError(enum ECDSA.RecoverError,bytes32)":"infinite","recover(bytes32,bytes memory)":"infinite","recover(bytes32,bytes32,bytes32)":"infinite","recover(bytes32,uint8,bytes32,bytes32)":"infinite","tryRecover(bytes32,bytes memory)":"infinite","tryRecover(bytes32,bytes32,bytes32)":"infinite","tryRecover(bytes32,uint8,bytes32,bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":\"ECDSA\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS\\n    }\\n\\n    /**\\n     * @dev The signature derives the `address(0)`.\\n     */\\n    error ECDSAInvalidSignature();\\n\\n    /**\\n     * @dev The signature has an invalid length.\\n     */\\n    error ECDSAInvalidSignatureLength(uint256 length);\\n\\n    /**\\n     * @dev The signature has an S value that is in the upper half order.\\n     */\\n    error ECDSAInvalidSignatureS(bytes32 s);\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\\n     * and a bytes32 providing additional information about the error.\\n     *\\n     * If no error is returned, then the address can be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes memory signature\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly (\\\"memory-safe\\\") {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        unchecked {\\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\\n            return tryRecover(hash, v, r, s);\\n        }\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     */\\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS, s);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\\n        }\\n\\n        return (signer, RecoverError.NoError, bytes32(0));\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\\n     */\\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert ECDSAInvalidSignature();\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert ECDSAInvalidSignatureS(errorArg);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/cryptography/Hashes.sol":{"Hashes":{"abi":[],"devdoc":{"details":"Library of standard hash functions. _Available since v5.1._","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212209d2dd17dbd209e44f1b357456392eaf51cf8c2f2fc52c56d8c94689c303b5adb64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP14 0x2D DATALOADN 0x7DBD KECCAK256 SWAP15 PREVRANDAO CALL 0xB3 JUMPI GASLIMIT PUSH4 0x92EAF51C EXTCALL 0xC2 CALLCODE 0xFC MSTORE 0xC5 PUSH14 0x8C94689C303B5ADB64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"221:811:17:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212209d2dd17dbd209e44f1b357456392eaf51cf8c2f2fc52c56d8c94689c303b5adb64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP14 0x2D DATALOADN 0x7DBD KECCAK256 SWAP15 PREVRANDAO CALL 0xB3 JUMPI GASLIMIT PUSH4 0x92EAF51C EXTCALL 0xC2 CALLCODE 0xFC MSTORE 0xC5 PUSH14 0x8C94689C303B5ADB64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"221:811:17:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"commutativeKeccak256(bytes32,bytes32)":"infinite","efficientKeccak256(bytes32,bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library of standard hash functions. _Available since v5.1._\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/Hashes.sol\":\"Hashes\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/cryptography/Hashes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library of standard hash functions.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Hashes {\\n    /**\\n     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\\n     *\\n     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n     */\\n    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {\\n        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);\\n    }\\n\\n    /**\\n     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n     */\\n    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, a)\\n            mstore(0x20, b)\\n            value := keccak256(0x00, 0x40)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8cbd338f083224b4b6f0ff42cbda641a0a6c31ffcdca197452b97fe4d0918269\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"MerkleProof":{"abi":[{"inputs":[],"name":"MerkleProofInvalidMultiproof","type":"error"}],"devdoc":{"details":"These functions deal with verification of Merkle Tree proofs. The tree and the proofs can be generated using our https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. You will find a quickstart guide in the readme. WARNING: You should avoid using leaf values that are 64 bytes long prior to hashing, or use a hash function other than keccak256 for hashing leaves. This is because the concatenation of a sorted pair of internal nodes in the Merkle tree could be reinterpreted as a leaf value. OpenZeppelin's JavaScript library generates Merkle trees that are safe against this attack out of the box. IMPORTANT: Consider memory side-effects when using custom hashing functions that access memory in an unsafe way. NOTE: This library supports proof verification for merkle trees built using custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving leaf inclusion in trees built using non-commutative hashing functions requires additional logic that is not supported by this library.","errors":{"MerkleProofInvalidMultiproof()":[{"details":"The multiproof provided is not valid."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212206f338bf47c1bee7ed2256285fc554f6a2d612879b4d17b0cb79647dd94669c1364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH16 0x338BF47C1BEE7ED2256285FC554F6A2D PUSH2 0x2879 0xB4 DATALOADN 0x7B0C 0xB7 SWAP7 SELFBALANCE 0xDD SWAP5 PUSH7 0x9C1364736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1353:22982:18:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212206f338bf47c1bee7ed2256285fc554f6a2d612879b4d17b0cb79647dd94669c1364736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH16 0x338BF47C1BEE7ED2256285FC554F6A2D PUSH2 0x2879 0xB4 DATALOADN 0x7B0C 0xB7 SWAP7 SELFBALANCE 0xDD SWAP5 PUSH7 0x9C1364736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1353:22982:18:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"multiProofVerify(bytes32[] memory,bool[] memory,bytes32,bytes32[] memory)":"infinite","multiProofVerify(bytes32[] memory,bool[] memory,bytes32,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32))":"infinite","multiProofVerifyCalldata(bytes32[] calldata,bool[] calldata,bytes32,bytes32[] memory)":"infinite","multiProofVerifyCalldata(bytes32[] calldata,bool[] calldata,bytes32,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32))":"infinite","processMultiProof(bytes32[] memory,bool[] memory,bytes32[] memory)":"infinite","processMultiProof(bytes32[] memory,bool[] memory,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32))":"infinite","processMultiProofCalldata(bytes32[] calldata,bool[] calldata,bytes32[] memory)":"infinite","processMultiProofCalldata(bytes32[] calldata,bool[] calldata,bytes32[] memory,function (bytes32,bytes32) view returns (bytes32))":"infinite","processProof(bytes32[] memory,bytes32)":"infinite","processProof(bytes32[] memory,bytes32,function (bytes32,bytes32) view returns (bytes32))":"infinite","processProofCalldata(bytes32[] calldata,bytes32)":"infinite","processProofCalldata(bytes32[] calldata,bytes32,function (bytes32,bytes32) view returns (bytes32))":"infinite","verify(bytes32[] memory,bytes32,bytes32)":"infinite","verify(bytes32[] memory,bytes32,bytes32,function (bytes32,bytes32) view returns (bytes32))":"infinite","verifyCalldata(bytes32[] calldata,bytes32,bytes32)":"infinite","verifyCalldata(bytes32[] calldata,bytes32,bytes32,function (bytes32,bytes32) view returns (bytes32))":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"MerkleProofInvalidMultiproof\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"These functions deal with verification of Merkle Tree proofs. The tree and the proofs can be generated using our https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. You will find a quickstart guide in the readme. WARNING: You should avoid using leaf values that are 64 bytes long prior to hashing, or use a hash function other than keccak256 for hashing leaves. This is because the concatenation of a sorted pair of internal nodes in the Merkle tree could be reinterpreted as a leaf value. OpenZeppelin's JavaScript library generates Merkle trees that are safe against this attack out of the box. IMPORTANT: Consider memory side-effects when using custom hashing functions that access memory in an unsafe way. NOTE: This library supports proof verification for merkle trees built using custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving leaf inclusion in trees built using non-commutative hashing functions requires additional logic that is not supported by this library.\",\"errors\":{\"MerkleProofInvalidMultiproof()\":[{\"details\":\"The multiproof provided is not valid.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":\"MerkleProof\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/cryptography/Hashes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library of standard hash functions.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Hashes {\\n    /**\\n     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\\n     *\\n     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n     */\\n    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {\\n        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);\\n    }\\n\\n    /**\\n     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n     */\\n    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, a)\\n            mstore(0x20, b)\\n            value := keccak256(0x00, 0x40)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8cbd338f083224b4b6f0ff42cbda641a0a6c31ffcdca197452b97fe4d0918269\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)\\n// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.\\n\\npragma solidity ^0.8.20;\\n\\nimport {Hashes} from \\\"./Hashes.sol\\\";\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the Merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\\n * against this attack out of the box.\\n *\\n * IMPORTANT: Consider memory side-effects when using custom hashing functions\\n * that access memory in an unsafe way.\\n *\\n * NOTE: This library supports proof verification for merkle trees built using\\n * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving\\n * leaf inclusion in trees built using non-commutative hashing functions requires\\n * additional logic that is not supported by this library.\\n */\\nlibrary MerkleProof {\\n    /**\\n     *@dev The multiproof provided is not valid.\\n     */\\n    error MerkleProofInvalidMultiproof();\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProof(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function verify(\\n        bytes32[] memory proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProof(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function processProof(\\n        bytes32[] memory proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProofCalldata(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function verifyCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProofCalldata(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function processProofCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x36a0c409c437a753cac9b92b75f93b0fbe92803bf2c8ff1517e54b247f166134\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/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 ERC-165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[ERC]. 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[ERC 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":""},"gasEstimates":null,"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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 ERC-165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[ERC]. 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[ERC 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\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/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":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212202df3619c93f9e6cfd6145433e87643f9cfe7e2519f07e0f9625f034c669c6a2b64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2D RETURN PUSH2 0x9C93 EXTDELEGATECALL DUPN 0xCF 0xD6 EQ SLOAD CALLER 0xE8 PUSH23 0x43F9CFE7E2519F07E0F9625F034C669C6A2B64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"281:31863:20:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212202df3619c93f9e6cfd6145433e87643f9cfe7e2519f07e0f9625f034c669c6a2b64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2D RETURN PUSH2 0x9C93 EXTDELEGATECALL DUPN 0xCF 0xD6 EQ SLOAD CALLER 0xE8 PUSH23 0x43F9CFE7E2519F07E0F9625F034C669C6A2B64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"281:31863:20:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_zeroBytes(bytes memory)":"infinite","add512(uint256,uint256)":"infinite","average(uint256,uint256)":"infinite","ceilDiv(uint256,uint256)":"infinite","invMod(uint256,uint256)":"infinite","invModPrime(uint256,uint256)":"infinite","log10(uint256)":"infinite","log10(uint256,enum Math.Rounding)":"infinite","log2(uint256)":"infinite","log2(uint256,enum Math.Rounding)":"infinite","log256(uint256)":"infinite","log256(uint256,enum Math.Rounding)":"infinite","max(uint256,uint256)":"infinite","min(uint256,uint256)":"infinite","modExp(bytes memory,bytes memory,bytes memory)":"infinite","modExp(uint256,uint256,uint256)":"infinite","mul512(uint256,uint256)":"infinite","mulDiv(uint256,uint256,uint256)":"infinite","mulDiv(uint256,uint256,uint256,enum Math.Rounding)":"infinite","mulShr(uint256,uint256,uint8)":"infinite","mulShr(uint256,uint256,uint8,enum Math.Rounding)":"infinite","saturatingAdd(uint256,uint256)":"infinite","saturatingMul(uint256,uint256)":"infinite","saturatingSub(uint256,uint256)":"infinite","sqrt(uint256)":"infinite","sqrt(uint256,enum Math.Rounding)":"infinite","ternary(bool,uint256,uint256)":"infinite","tryAdd(uint256,uint256)":"infinite","tryDiv(uint256,uint256)":"infinite","tryMod(uint256,uint256)":"infinite","tryModExp(bytes memory,bytes memory,bytes memory)":"infinite","tryModExp(uint256,uint256,uint256)":"infinite","tryMul(uint256,uint256)":"infinite","trySub(uint256,uint256)":"infinite","unsignedRoundsUp(enum Math.Rounding)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":{\"@openzeppelin/contracts/utils/math/Math.sol\":\"Math\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"SafeCast":{"abi":[{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"int256","name":"value","type":"int256"}],"name":"SafeCastOverflowedIntDowncast","type":"error"},{"inputs":[{"internalType":"int256","name":"value","type":"int256"}],"name":"SafeCastOverflowedIntToUint","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintToInt","type":"error"}],"devdoc":{"details":"Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow checks. Downcasting from uint256/int256 in Solidity does not revert on overflow. This can easily result in undesired exploitation or bugs, since developers usually assume that overflows raise errors. `SafeCast` restores this intuition by reverting the transaction when such an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.","errors":{"SafeCastOverflowedIntDowncast(uint8,int256)":[{"details":"Value doesn't fit in an int of `bits` size."}],"SafeCastOverflowedIntToUint(int256)":[{"details":"An int value doesn't fit in an uint of `bits` size."}],"SafeCastOverflowedUintDowncast(uint8,uint256)":[{"details":"Value doesn't fit in an uint of `bits` size."}],"SafeCastOverflowedUintToInt(uint256)":[{"details":"An uint value doesn't fit in an int of `bits` size."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122037b37d5f69a51b604f4ca27f8bd38f3f0cdd45f44c43ff0764cd4ef0f853a3c464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATACOPY 0xB3 PUSH30 0x5F69A51B604F4CA27F8BD38F3F0CDD45F44C43FF0764CD4EF0F853A3C464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"769:34173:21:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122037b37d5f69a51b604f4ca27f8bd38f3f0cdd45f44c43ff0764cd4ef0f853a3c464736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATACOPY 0xB3 PUSH30 0x5F69A51B604F4CA27F8BD38F3F0CDD45F44C43FF0764CD4EF0F853A3C464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"769:34173:21:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"toInt104(int256)":"infinite","toInt112(int256)":"infinite","toInt120(int256)":"infinite","toInt128(int256)":"infinite","toInt136(int256)":"infinite","toInt144(int256)":"infinite","toInt152(int256)":"infinite","toInt16(int256)":"infinite","toInt160(int256)":"infinite","toInt168(int256)":"infinite","toInt176(int256)":"infinite","toInt184(int256)":"infinite","toInt192(int256)":"infinite","toInt200(int256)":"infinite","toInt208(int256)":"infinite","toInt216(int256)":"infinite","toInt224(int256)":"infinite","toInt232(int256)":"infinite","toInt24(int256)":"infinite","toInt240(int256)":"infinite","toInt248(int256)":"infinite","toInt256(uint256)":"infinite","toInt32(int256)":"infinite","toInt40(int256)":"infinite","toInt48(int256)":"infinite","toInt56(int256)":"infinite","toInt64(int256)":"infinite","toInt72(int256)":"infinite","toInt8(int256)":"infinite","toInt80(int256)":"infinite","toInt88(int256)":"infinite","toInt96(int256)":"infinite","toUint(bool)":"infinite","toUint104(uint256)":"infinite","toUint112(uint256)":"infinite","toUint120(uint256)":"infinite","toUint128(uint256)":"infinite","toUint136(uint256)":"infinite","toUint144(uint256)":"infinite","toUint152(uint256)":"infinite","toUint16(uint256)":"infinite","toUint160(uint256)":"infinite","toUint168(uint256)":"infinite","toUint176(uint256)":"infinite","toUint184(uint256)":"infinite","toUint192(uint256)":"infinite","toUint200(uint256)":"infinite","toUint208(uint256)":"infinite","toUint216(uint256)":"infinite","toUint224(uint256)":"infinite","toUint232(uint256)":"infinite","toUint24(uint256)":"infinite","toUint240(uint256)":"infinite","toUint248(uint256)":"infinite","toUint256(int256)":"infinite","toUint32(uint256)":"infinite","toUint40(uint256)":"infinite","toUint48(uint256)":"infinite","toUint56(uint256)":"infinite","toUint64(uint256)":"infinite","toUint72(uint256)":"infinite","toUint8(uint256)":"infinite","toUint80(uint256)":"infinite","toUint88(uint256)":"infinite","toUint96(uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"int256\",\"name\":\"value\",\"type\":\"int256\"}],\"name\":\"SafeCastOverflowedIntDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"value\",\"type\":\"int256\"}],\"name\":\"SafeCastOverflowedIntToUint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintToInt\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow checks. Downcasting from uint256/int256 in Solidity does not revert on overflow. This can easily result in undesired exploitation or bugs, since developers usually assume that overflows raise errors. `SafeCast` restores this intuition by reverting the transaction when such an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"errors\":{\"SafeCastOverflowedIntDowncast(uint8,int256)\":[{\"details\":\"Value doesn't fit in an int of `bits` size.\"}],\"SafeCastOverflowedIntToUint(int256)\":[{\"details\":\"An int value doesn't fit in an uint of `bits` size.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"SafeCastOverflowedUintToInt(uint256)\":[{\"details\":\"An uint value doesn't fit in an int of `bits` size.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":\"SafeCast\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"@openzeppelin/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":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a8bdcea47331fb33f70214660208aebc646e78357711e71043d750cf4f9b2a1f64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA8 0xBD 0xCE LOG4 PUSH20 0x31FB33F70214660208AEBC646E78357711E71043 0xD7 POP 0xCF 0x4F SWAP12 0x2A 0x1F PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"258:2354:22:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220a8bdcea47331fb33f70214660208aebc646e78357711e71043d750cf4f9b2a1f64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA8 0xBD 0xCE LOG4 PUSH20 0x31FB33F70214660208AEBC646E78357711E71043 0xD7 POP 0xCF 0x4F SWAP12 0x2A 0x1F PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"258:2354:22:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"abs(int256)":"infinite","average(int256,int256)":"infinite","max(int256,int256)":"infinite","min(int256,int256)":"infinite","ternary(bool,int256,int256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":{\"@openzeppelin/contracts/utils/math/SignedMath.sol\":\"SignedMath\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two signed numbers.\\n     */\\n    function max(int256 a, int256 b) internal pure returns (int256) {\\n        return ternary(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 ternary(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            // Formula from the \\\"Bit Twiddling Hacks\\\" by Sean Eron Anderson.\\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\\n            // taking advantage of the most significant (or \\\"sign\\\" bit) in two's complement representation.\\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\\n            int256 mask = n >> 255;\\n\\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\\n            return uint256((n + mask) ^ mask);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/access/AccessControl.sol":{"AccessControl":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"Access control via roles management (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"Access control via roles management (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/AccessControl.sol\":\"AccessControl\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/access/ContractOwnership.sol":{"ContractOwnership":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"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":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"constructor":{"details":"Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"the initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"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\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"the initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Initializes the storage with an initial contract owner.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/ContractOwnership.sol\":\"ContractOwnership\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"constructor":{"notice":"Initializes the storage with an initial contract owner.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/access/SafeContractOwnership.sol":{"SafeContractOwnership":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotPendingContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferPending","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":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotPendingContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferPending(address)":{"params":{"pendingOwner":"the address of the new contract owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"constructor":{"details":"Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"the initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pendingOwner()":{"returns":{"_0":"The address of the pending contract owner."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"acceptOwnership()":"79ba5097","owner()":"8da5cb5b","pendingOwner()":"e30c3978","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotPendingContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferPending\",\"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\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotPendingContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferPending(address)\":{\"params\":{\"pendingOwner\":\"the address of the new contract owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"constructor\":{\"details\":\"Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"the initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending contract owner.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPendingContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the pending contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferPending(address)\":{\"notice\":\"Emitted when a new contract owner is pending.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"constructor\":{\"notice\":\"Initializes the storage with an initial contract owner.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/SafeContractOwnership.sol\":\"SafeContractOwnership\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/SafeContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {SafeContractOwnershipStorage} from \\\"./libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {SafeContractOwnershipBase} from \\\"./base/SafeContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract SafeContractOwnership is SafeContractOwnershipBase, InterfaceDetection {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        SafeContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xebdacc63051ce380bd81a09658aa64ce085557611de25c6cfbeec271b6c6a956\",\"license\":\"MIT\"},\"contracts/access/base/SafeContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173Safe} from \\\"./../interfaces/IERC173Safe.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173Safe\\n    function transferOwnership(address newOwner) public virtual {\\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function acceptOwnership() public virtual {\\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function owner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function pendingOwner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().pendingOwner();\\n    }\\n}\\n\",\"keccak256\":\"0xc2d602249dfe5707d43f9ede77361953d9239c06ef691cfe95a467f0018c4c44\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPendingContractOwner(address)":[{"notice":"Thrown when an account is not the pending contract owner but is required to."}]},"events":{"OwnershipTransferPending(address)":{"notice":"Emitted when a new contract owner is pending."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"constructor":{"notice":"Initializes the storage with an initial contract owner.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/access/base/AccessControlBase.sol":{"AccessControlBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}}},"title":"Access control via roles management (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}}},\"title\":\"Access control via roles management (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/base/AccessControlBase.sol\":\"AccessControlBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."}},"version":1}}},"contracts/access/base/ContractOwnershipBase.sol":{"ContractOwnershipBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/base/ContractOwnershipBase.sol\":\"ContractOwnershipBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"owner()":{"notice":"Gets the address of the contract owner."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/access/base/SafeContractOwnershipBase.sol":{"SafeContractOwnershipBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotPendingContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferPending","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":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotPendingContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferPending(address)":{"params":{"pendingOwner":"the address of the new contract owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pendingOwner()":{"returns":{"_0":"The address of the pending contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"acceptOwnership()":"79ba5097","owner()":"8da5cb5b","pendingOwner()":"e30c3978","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotPendingContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferPending\",\"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\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotPendingContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferPending(address)\":{\"params\":{\"pendingOwner\":\"the address of the new contract owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPendingContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the pending contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferPending(address)\":{\"notice\":\"Emitted when a new contract owner is pending.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/base/SafeContractOwnershipBase.sol\":\"SafeContractOwnershipBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/SafeContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173Safe} from \\\"./../interfaces/IERC173Safe.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173Safe\\n    function transferOwnership(address newOwner) public virtual {\\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function acceptOwnership() public virtual {\\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function owner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function pendingOwner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().pendingOwner();\\n    }\\n}\\n\",\"keccak256\":\"0xc2d602249dfe5707d43f9ede77361953d9239c06ef691cfe95a467f0018c4c44\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPendingContractOwner(address)":[{"notice":"Thrown when an account is not the pending contract owner but is required to."}]},"events":{"OwnershipTransferPending(address)":{"notice":"Emitted when a new contract owner is pending."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/access/facets/AccessControlFacet.sol":{"AccessControlFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ContractOwnershipFacet}.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}}},"title":"Access control via roles management (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6107c138819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161073f908161008282396080518161057c0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80632f2ff15d146103b45780638bb9c5bf1461024557806391d14854146101d75763d547741f1461004857600080fd5b346101d25761005636610514565b61005e610565565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101a557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661011057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101d2576101e536610514565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b229060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356102a0610565565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561036c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016101a0565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101d2576103c236610514565b6103ca610565565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101a557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561047d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016101a0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126101d2576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101d25790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106fa5732331480156106ff575b6106fa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105f0575b506105ed57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ee5760009161064b575b50386105e3565b60203d6020116106e7575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106ba576020918391604052810103126106b657519081151582036106b3575038610644565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610656565b6040513d6000823e3d90fd5b503390565b50601836106105ac56fea26469706673582212206faab25003815ba2aeb91cc75ef90aedee3304b1dbe52ae4c620c063eecb75a664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x7C1 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x73F SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x57C ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1D7 JUMPI PUSH4 0xD547741F EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x56 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST PUSH2 0x5E PUSH2 0x565 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1A5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x110 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x1E5 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D2 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x2A0 PUSH2 0x565 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1A0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x3C2 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST PUSH2 0x3CA PUSH2 0x565 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1A5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x47D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1A0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x40 SWAP2 ADD SLT PUSH2 0x1D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1D2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6FA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6FF JUMPI JUMPDEST PUSH2 0x6FA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5F0 JUMPI JUMPDEST POP PUSH2 0x5ED JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x64B JUMPI JUMPDEST POP CODESIZE PUSH2 0x5E3 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E7 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6BA JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6B6 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6B3 JUMPI POP CODESIZE PUSH2 0x644 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5AC JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH16 0xAAB25003815BA2AEB91CC75EF90AEDEE CALLER DIV 0xB1 0xDB JUMPF 0x2AE4 0xC6 KECCAK256 0xC0 PUSH4 0xEECB75A6 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"631:650:35:-:0;;;;;;;;;;;;;-1:-1:-1;;631:650:35;;;;-1:-1:-1;;;;;631:650:35;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;631:650:35;;;;;;745:39:76;;631:650:35;;;;;;;;745:39:76;631:650:35;;;;;;;-1:-1:-1;631:650:35;;;;;;-1:-1:-1;631:650:35;;;;;-1:-1:-1;631:650:35"},"deployedBytecode":{"functionDebugData":{"abi_decode_bytes32t_address":{"entryPoint":1300,"id":null,"parameterSlots":1,"returnSlots":2},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"fun_msgSender":{"entryPoint":1381,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1404}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80632f2ff15d146103b45780638bb9c5bf1461024557806391d14854146101d75763d547741f1461004857600080fd5b346101d25761005636610514565b61005e610565565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101a557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661011057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101d2576101e536610514565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b229060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356102a0610565565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561036c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016101a0565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101d2576103c236610514565b6103ca610565565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101a557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561047d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016101a0565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126101d2576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101d25790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106fa5732331480156106ff575b6106fa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105f0575b506105ed57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ee5760009161064b575b50386105e3565b60203d6020116106e7575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106ba576020918391604052810103126106b657519081151582036106b3575038610644565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610656565b6040513d6000823e3d90fd5b503390565b50601836106105ac56fea26469706673582212206faab25003815ba2aeb91cc75ef90aedee3304b1dbe52ae4c620c063eecb75a664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1D7 JUMPI PUSH4 0xD547741F EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x56 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST PUSH2 0x5E PUSH2 0x565 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1A5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x110 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x1E5 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D2 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x2A0 PUSH2 0x565 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1A0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D2 JUMPI PUSH2 0x3C2 CALLDATASIZE PUSH2 0x514 JUMP JUMPDEST PUSH2 0x3CA PUSH2 0x565 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1A5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x47D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1A0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x40 SWAP2 ADD SLT PUSH2 0x1D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1D2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6FA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6FF JUMPI JUMPDEST PUSH2 0x6FA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5F0 JUMPI JUMPDEST POP PUSH2 0x5ED JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x64B JUMPI JUMPDEST POP CODESIZE PUSH2 0x5E3 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E7 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6BA JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6B6 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6B3 JUMPI POP CODESIZE PUSH2 0x644 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5AC JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH16 0xAAB25003815BA2AEB91CC75EF90AEDEE CALLER DIV 0xB1 0xDB JUMPF 0x2AE4 0xC6 KECCAK256 0xC0 PUSH4 0xEECB75A6 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"631:650:35:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;998:41;;:::i;:::-;5148:19:42;631:650:35;;;;;;;4503:26:42;;;4499:64;;4464:19:41;631:650:35;;;;;;;;;;;;;-1:-1:-1;631:650:35;;;;;-1:-1:-1;631:650:35;;;1880:140:41;;631:650:35;1880:140:41;631:650:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;631:650:35;;;;1973:36:41;;;;631:650:35;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;631:650:35;;-1:-1:-1;4538:25:42;631:650:35;;;;;;;;;;;:::i;:::-;4464:19:41;631:650:35;;;;;;;;;;2800:22:41;631:650:35;-1:-1:-1;631:650:35;;;;;;-1:-1:-1;631:650:35;;;;;;;;;;;;;;;;;;;;;;;;;998:41;;:::i;:::-;631:650;;;;;;;;;;;;;-1:-1:-1;631:650:35;;;;;-1:-1:-1;631:650:35;;;3741:25:41;3737:66;;631:650:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;631:650:35;;;;2455:33:41;631:650:35;3737:66:41;631:650:35;3775:28:41;;;631:650:35;3775:28:41;631:650:35;;;;;;;3775:28:41;631:650:35;;;;;;;:::i;:::-;998:41;;:::i;:::-;5148:19:42;631:650:35;;;;;;;4503:26:42;;;4499:64;;4464:19:41;631:650:35;;;;;;;;;;;;;-1:-1:-1;631:650:35;;;;;-1:-1:-1;631:650:35;;;1254:25:41;1250:140;;631:650:35;1250:140:41;631:650:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1320:4:41;631:650:35;;;;;;;;;;;;;;;;;;;;1343:36:41;;631:650:35;;;;1343:36:41;631:650:35;;;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;631:650:35;1029:19:76;631:650:35;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;631:650:35;;;;;;1676:74:76;;;;631:650:35;1676:74:76;;;;;;631:650:35;1327:10:76;631:650:35;;;;1744:4:76;631:650:35;;;;1676:74:76;;;;;;;631:650:35;1676:74:76;;;1630:120;;;;;1676:74;631:650:35;1676:74:76;631:650:35;1676:74:76;;;;631:650:35;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;631:650:35;;;;;;;;;;;;;1676:74:76;;;;631:650:35;;;;;;;;;;;;;;1676:74:76;631:650:35;;1676:74:76;;;;;;631:650:35;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"371000","executionCost":"infinite","totalCost":"infinite"},"external":{"grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2511","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ContractOwnershipFacet}.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}}},\"title\":\"Access control via roles management (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/facets/AccessControlFacet.sol\":\"AccessControlFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/AccessControlFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlBase} from \\\"./../base/AccessControlBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Access control via roles management (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\\ncontract AccessControlFacet is AccessControlBase, ForwarderRegistryContextBase {\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x888a8befb9392bb10895bb71172cadb27beffc9c8585bc5ae7e132bb76570969\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."}},"version":1}}},"contracts/access/facets/ContractOwnershipFacet.sol":{"ContractOwnershipFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initContractOwnershipStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"initContractOwnershipStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"The initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61068b38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161060990816100828239608051816104460152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806363e340d6146101d55780638da5cb5b146101645763f2fde38b1461003d57600080fd5b3461015f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361015f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100b661042f565b9073ffffffffffffffffffffffffffffffffffffffff80825416921682810361013257508282036100e357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461015f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461015f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361015f5761022d61042f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361040257507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835460018110156103d0575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83558161037b575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806102e7565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156105c45732331480156105c9575b6105c4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156104ba575b506104b757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156105b857600091610515575b50386104ad565b60203d6020116105b1575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761058457602091839160405281010312610580575190811515820361057d57503861050e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610520565b6040513d6000823e3d90fd5b503390565b506018361061047656fea264697066735822122074fdbcdc5a30e80397e6229fe93e25cfc2a4cf27ac949d8647e5791042fdfebf64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x68B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x609 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x446 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x164 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x15F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xB6 PUSH2 0x42F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x132 JUMPI POP DUP3 DUP3 SUB PUSH2 0xE3 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x15F JUMPI PUSH2 0x22D PUSH2 0x42F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x402 JUMPI POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3D0 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE DUP2 PUSH2 0x37B JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x2E7 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x5C4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x5C9 JUMPI JUMPDEST PUSH2 0x5C4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4BA JUMPI JUMPDEST POP PUSH2 0x4B7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5B8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x515 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4AD JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x5B1 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x584 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x580 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x57D JUMPI POP CODESIZE PUSH2 0x50E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x520 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x476 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH21 0xFDBCDC5A30E80397E6229FE93E25CFC2A4CF27AC94 SWAP14 DUP7 SELFBALANCE JUMPF 0x7910 TIMESTAMP REVERT INVALID 0xBF PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"880:1580:36:-:0;;;;;;;;;;;;;-1:-1:-1;;880:1580:36;;;;-1:-1:-1;;;;;880:1580:36;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;880:1580:36;;;;;;745:39:76;;880:1580:36;;;;;;;;745:39:76;880:1580:36;;;;;;;-1:-1:-1;880:1580:36;;;;;;-1:-1:-1;880:1580:36;;;;;-1:-1:-1;880:1580:36"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":1071,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1094}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806363e340d6146101d55780638da5cb5b146101645763f2fde38b1461003d57600080fd5b3461015f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361015f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100b661042f565b9073ffffffffffffffffffffffffffffffffffffffff80825416921682810361013257508282036100e357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461015f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461015f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361015f5761022d61042f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361040257507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835460018110156103d0575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83558161037b575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806102e7565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156105c45732331480156105c9575b6105c4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156104ba575b506104b757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156105b857600091610515575b50386104ad565b60203d6020116105b1575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761058457602091839160405281010312610580575190811515820361057d57503861050e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610520565b6040513d6000823e3d90fd5b503390565b506018361061047656fea264697066735822122074fdbcdc5a30e80397e6229fe93e25cfc2a4cf27ac949d8647e5791042fdfebf64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x164 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x15F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xB6 PUSH2 0x42F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x132 JUMPI POP DUP3 DUP3 SUB PUSH2 0xE3 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x15F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x15F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x15F JUMPI PUSH2 0x22D PUSH2 0x42F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x402 JUMPI POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3D0 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE DUP2 PUSH2 0x37B JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x2E7 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x5C4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x5C9 JUMPI JUMPDEST PUSH2 0x5C4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4BA JUMPI JUMPDEST POP PUSH2 0x4B7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5B8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x515 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4AD JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x5B1 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x584 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x580 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x57D JUMPI POP CODESIZE PUSH2 0x50E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x520 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x476 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH21 0xFDBCDC5A30E80397E6229FE93E25CFC2A4CF27AC94 SWAP14 DUP7 SELFBALANCE JUMPF 0x7910 TIMESTAMP REVERT INVALID 0xBF PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"880:1580:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2177:41;;:::i;:::-;880:1580;;;;;;;;3205:23:42;;;3201:60;;3275:25;;;;3271:146;;880:1580:36;3271:146:42;880:1580:36;;;;;;;;3361:45:42;880:1580:36;3361:45:42;;880:1580:36;3201:60:42;3237:24;880:1580:36;3237:24:42;880:1580:36;;;;3237:24:42;880:1580:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2177:41;;:::i;:::-;880:1580;;;;;;;3174:18:180;;;3170:53;;5148:19:42;880:1580:36;;;636:1:180;900:21:181;;;896:88;;880:1580:36;636:1:180;880:1580:36;;1649:26:42;1645:152;;880:1580:36;1863:25:42;880:1580:36;500:10:59;880:1580:36;;500:10:59;;;;;;636:1:180;500:10:59;;;880:1580:36;1645:152:42;880:1580:36;;;;;;;;;1740:46:42;;;;1645:152;;;;896:88:181;930:54;880:1580:36;930:54:181;880:1580:36;;636:1:180;880:1580:36;;;;930:54:181;3170:53:180;3201:22;880:1580:36;3201:22:180;880:1580:36;;;;3201:22:180;907:917:76;880:1580:36;1029:19:76;880:1580:36;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;880:1580:36;;;;;;1676:74:76;;;;880:1580:36;1676:74:76;;;;;;880:1580:36;1327:10:76;880:1580:36;;;;1744:4:76;880:1580:36;;;;1676:74:76;;;;;;;880:1580:36;1676:74:76;;;1630:120;;;;;1676:74;880:1580:36;1676:74:76;880:1580:36;1676:74:76;;;;880:1580:36;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;880:1580:36;;;;;;;;;;;;;1676:74:76;;;;880:1580:36;;;;;;;;;;;;;;1676:74:76;880:1580:36;;1676:74:76;;;;;;880:1580:36;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"309000","executionCost":"infinite","totalCost":"infinite"},"external":{"initContractOwnershipStorage(address)":"infinite","owner()":"2275","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initContractOwnershipStorage(address)":"63e340d6","owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initContractOwnershipStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"initContractOwnershipStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"The initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"initContractOwnershipStorage(address)\":{\"notice\":\"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/facets/ContractOwnershipFacet.sol\":\"ContractOwnershipFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/ContractOwnershipFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../base/ContractOwnershipBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ContractOwnershipFacet is ContractOwnershipBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function initContractOwnershipStorage(address initialOwner) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ContractOwnershipStorage.layout().proxyInit(initialOwner);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x79d3c23b25f51ec2ada657a35b02e81dc0a82cc4100bda7c52e965c93140b17e\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"initContractOwnershipStorage(address)":{"notice":"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/access/facets/SafeContractOwnershipFacet.sol":{"SafeContractOwnershipFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotPendingContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferPending","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":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initContractOwnershipStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotPendingContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferPending(address)":{"params":{"pendingOwner":"the address of the new contract owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"initContractOwnershipStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"The initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pendingOwner()":{"returns":{"_0":"The address of the pending contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC173 Contract Ownership Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61098938819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161090790816100828239608051816107440152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806363e340d6146104d357806379ba5097146103385780638da5cb5b146102c7578063e30c3978146102565763f2fde38b1461005357600080fd5b346102515760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102515760043573ffffffffffffffffffffffffffffffffffffffff8116809103610251577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b6100cc61072d565b9073ffffffffffffffffffffffffffffffffffffffff8082541692168281036102245750826101ab57600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101b457005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610251577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b61039061072d565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c541691168181036104a657508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102515760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102515760043573ffffffffffffffffffffffffffffffffffffffff81168091036102515761052b61072d565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361070057507f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b7f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5460018110156106ce575060017f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5581610679575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806105e5565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c25732331480156108c7575b6108c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156107b8575b506107b557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108b657600091610813575b50386107ab565b60203d6020116108af575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176108825760209183916040528101031261087e575190811515820361087b57503861080c565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61081e565b6040513d6000823e3d90fd5b503390565b506018361061077456fea264697066735822122032eed99fbbb6cb1dd096086a4e3621c07f5d21593649ab0e03c543fb62a0509264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x989 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x907 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x744 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x4D3 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C7 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x256 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x251 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0xCC PUSH2 0x72D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x224 JUMPI POP DUP3 PUSH2 0x1AB JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1B4 JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x390 PUSH2 0x72D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x4A6 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x251 JUMPI PUSH2 0x52B PUSH2 0x72D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x700 JUMPI POP PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x6CE JUMPI POP PUSH1 0x1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SSTORE DUP2 PUSH2 0x679 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x5E5 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8C7 JUMPI JUMPDEST PUSH2 0x8C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7B8 JUMPI JUMPDEST POP PUSH2 0x7B5 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8B6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x813 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7AB JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8AF JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x882 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x87E JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x87B JUMPI POP CODESIZE PUSH2 0x80C JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x81E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x774 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ORIGIN RETURNCONTRACT 0xD9 SWAP16 0xBB 0xB6 0xCB SAR 0xD0 SWAP7 ADDMOD PUSH11 0x4E3621C07F5D21593649AB 0xE SUB 0xC5 NUMBER EXTSTATICCALL PUSH3 0xA05092 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"896:1600:37:-:0;;;;;;;;;;;;;-1:-1:-1;;896:1600:37;;;;-1:-1:-1;;;;;896:1600:37;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;896:1600:37;;;;;;745:39:76;;896:1600:37;;;;;;;;745:39:76;896:1600:37;;;;;;;-1:-1:-1;896:1600:37;;;;;;-1:-1:-1;896:1600:37;;;;;-1:-1:-1;896:1600:37"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":1837,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1860}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806363e340d6146104d357806379ba5097146103385780638da5cb5b146102c7578063e30c3978146102565763f2fde38b1461005357600080fd5b346102515760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102515760043573ffffffffffffffffffffffffffffffffffffffff8116809103610251577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b6100cc61072d565b9073ffffffffffffffffffffffffffffffffffffffff8082541692168281036102245750826101ab57600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101b457005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102515760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610251577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b61039061072d565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c541691168181036104a657508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102515760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102515760043573ffffffffffffffffffffffffffffffffffffffff81168091036102515761052b61072d565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361070057507f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b7f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5460018110156106ce575060017f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5581610679575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806105e5565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c25732331480156108c7575b6108c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156107b8575b506107b557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108b657600091610813575b50386107ab565b60203d6020116108af575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176108825760209183916040528101031261087e575190811515820361087b57503861080c565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61081e565b6040513d6000823e3d90fd5b503390565b506018361061077456fea264697066735822122032eed99fbbb6cb1dd096086a4e3621c07f5d21593649ab0e03c543fb62a0509264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x4D3 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C7 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x256 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x251 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0xCC PUSH2 0x72D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x224 JUMPI POP DUP3 PUSH2 0x1AB JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1B4 JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x390 PUSH2 0x72D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x4A6 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x251 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x251 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x251 JUMPI PUSH2 0x52B PUSH2 0x72D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x700 JUMPI POP PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x6CE JUMPI POP PUSH1 0x1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SSTORE DUP2 PUSH2 0x679 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x5E5 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8C7 JUMPI JUMPDEST PUSH2 0x8C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7B8 JUMPI JUMPDEST POP PUSH2 0x7B5 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8B6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x813 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7AB JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8AF JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x882 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x87E JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x87B JUMPI POP CODESIZE PUSH2 0x80C JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x81E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x774 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ORIGIN RETURNCONTRACT 0xD9 SWAP16 0xBB 0xB6 0xCB SAR 0xD0 SWAP7 ADDMOD PUSH11 0x4E3621C07F5D21593649AB 0xE SUB 0xC5 NUMBER EXTSTATICCALL PUSH3 0xA05092 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"896:1600:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2213:41;;:::i;:::-;896:1600;;;;;;;;3421:22:43;;;3417:59;;-1:-1:-1;3490:22:43;;;896:1600:37;;;;;;;;;;3570:22:43;896:1600:37;;3570:22:43;896:1600:37;3624:46:43;;;;896:1600:37;3486:378:43;3705:24;;;3701:153;;896:1600:37;3701:153:43;3749:22;896:1600:37;;;;;;;;3805:34:43;896:1600:37;3805:34:43;;3701:153;3417:59;3452:24;896:1600:37;3452:24:43;896:1600:37;;;;3452:24:43;896:1600:37;;;;;;;;;;;;;;;;;4996:22:43;896:1600:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2213:41;;:::i;:::-;896:1600;;4211:22:43;896:1600:37;;;;4247:30:43;;;4243:74;;896:1600:37;;;;;;;;4332:59:43;896:1600:37;4332:59:43;;896:1600:37;;;;;;;;;4211:22:43;896:1600:37;;4211:22:43;896:1600:37;;;;4243:74:43;4286:31;896:1600:37;4286:31:43;896:1600:37;;;;4286:31:43;896:1600:37;;;;;;;;;;;;;;;;;;;;;2213:41;;:::i;:::-;896:1600;;;;;;;3174:18:180;;;3170:53;;6505:19:43;896:1600:37;;;636:1:180;900:21:181;;;896:88;;:1600:37;636:1:180;896:1600:37;;1758:26:43;1754:152;;896:1600:37;1972:25:43;896:1600:37;500:10:59;896:1600:37;;500:10:59;;;;;;636:1:180;500:10:59;;;896:1600:37;1754:152:43;896:1600:37;;;;;;;;;1849:46:43;;;;1754:152;;;;896:88:181;930:54;896:1600:37;930:54:181;896:1600:37;;636:1:180;896:1600:37;;;;930:54:181;3170:53:180;3201:22;896:1600:37;3201:22:180;896:1600:37;;;;3201:22:180;907:917:76;896:1600:37;1029:19:76;896:1600:37;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;896:1600:37;;;;;;1676:74:76;;;;896:1600:37;1676:74:76;;;;;;896:1600:37;1327:10:76;896:1600:37;;;;1744:4:76;896:1600:37;;;;1676:74:76;;;;;;;896:1600:37;1676:74:76;;;1630:120;;;;;1676:74;896:1600:37;1676:74:76;896:1600:37;1676:74:76;;;;896:1600:37;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;896:1600:37;;;;;;;;;;;;;1676:74:76;;;;896:1600:37;;;;;;;;;;;;;;1676:74:76;896:1600:37;;1676:74:76;;;;;;896:1600:37;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"462200","executionCost":"infinite","totalCost":"infinite"},"external":{"acceptOwnership()":"infinite","initContractOwnershipStorage(address)":"infinite","owner()":"2297","pendingOwner()":"2319","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"acceptOwnership()":"79ba5097","initContractOwnershipStorage(address)":"63e340d6","owner()":"8da5cb5b","pendingOwner()":"e30c3978","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotPendingContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferPending\",\"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\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initContractOwnershipStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotPendingContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferPending(address)\":{\"params\":{\"pendingOwner\":\"the address of the new contract owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"initContractOwnershipStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"The initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC173 Contract Ownership Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPendingContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the pending contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"OwnershipTransferPending(address)\":{\"notice\":\"Emitted when a new contract owner is pending.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"initContractOwnershipStorage(address)\":{\"notice\":\"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/facets/SafeContractOwnershipFacet.sol\":\"SafeContractOwnershipFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/SafeContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173Safe} from \\\"./../interfaces/IERC173Safe.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173Safe\\n    function transferOwnership(address newOwner) public virtual {\\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function acceptOwnership() public virtual {\\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function owner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function pendingOwner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().pendingOwner();\\n    }\\n}\\n\",\"keccak256\":\"0xc2d602249dfe5707d43f9ede77361953d9239c06ef691cfe95a467f0018c4c44\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/SafeContractOwnershipFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {SafeContractOwnershipBase} from \\\"./../base/SafeContractOwnershipBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract SafeContractOwnershipFacet is SafeContractOwnershipBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function initContractOwnershipStorage(address initialOwner) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        SafeContractOwnershipStorage.layout().proxyInit(initialOwner);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8c84ae059813a46756fc058279f80f327bce4b6d9926606e52049ad6191f8e7a\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPendingContractOwner(address)":[{"notice":"Thrown when an account is not the pending contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"OwnershipTransferPending(address)":{"notice":"Emitted when a new contract owner is pending."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"initContractOwnershipStorage(address)":{"notice":"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/access/interfaces/IAccessControl.sol":{"IAccessControl":{"abi":[{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}}},"title":"Access control via roles management (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"hasRole(bytes32,address)":"91d14854","renounceRole(bytes32)":"8bb9c5bf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}}},\"title\":\"Access control via roles management (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/interfaces/IAccessControl.sol\":\"IAccessControl\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."}},"version":1}}},"contracts/access/interfaces/IERC173.sol":{"IERC173":{"abi":[{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"contractOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173Note: the ERC-165 identifier for this interface is 0x7f5828d0","kind":"dev","methods":{"owner()":{"returns":{"contractOwner":"The address of the contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC-173 Contract Ownership Standard (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"contractOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173Note: the ERC-165 identifier for this interface is 0x7f5828d0\",\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"contractOwner\":\"The address of the contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC-173 Contract Ownership Standard (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/interfaces/IERC173.sol\":\"IERC173\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"owner()":{"notice":"Gets the address of the contract owner."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/access/interfaces/IERC173Safe.sol":{"IERC173Safe":{"abi":[{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"contractOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"pendingContractOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-173Note: the ERC-165 identifier for this interface is 0x7f5828d0","kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"owner()":{"returns":{"contractOwner":"The address of the contract owner."}},"pendingOwner()":{"returns":{"pendingContractOwner":"The address of the pending contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC-173 Contract Ownership Standard with safe ownership transfer (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"acceptOwnership()":"79ba5097","owner()":"8da5cb5b","pendingOwner()":"e30c3978","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"contractOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"pendingContractOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-173Note: the ERC-165 identifier for this interface is 0x7f5828d0\",\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"owner()\":{\"returns\":{\"contractOwner\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"pendingContractOwner\":\"The address of the pending contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/interfaces/IERC173Safe.sol\":\"IERC173Safe\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/access/libraries/AccessControlStorage.sol":{"AccessControlStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122086c5b6a6bf958dc05821668bcc701763bcf14ebf46b7afc975a17d49f250ad1f64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP7 0xC5 0xB6 0xA6 0xBF SWAP6 DUP14 0xC0 PC 0x21 PUSH7 0x8BCC701763BCF1 0x4E 0xBF CHAINID 0xB7 0xAF 0xC9 PUSH22 0xA17D49F250AD1F64736F6C634300081E003300000000 ","sourceMap":"422:4130:41:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122086c5b6a6bf958dc05821668bcc701763bcf14ebf46b7afc975a17d49f250ad1f64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP7 0xC5 0xB6 0xA6 0xBF SWAP6 DUP14 0xC0 PC 0x21 PUSH7 0x8BCC701763BCF1 0x4E 0xBF CHAINID 0xB7 0xAF 0xC9 PUSH22 0xA17D49F250AD1F64736F6C634300081E003300000000 ","sourceMap":"422:4130:41:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"enforceHasRole(struct AccessControlStorage.Layout storage pointer,bytes32,address)":"infinite","enforceHasTargetContractRole(address,bytes32,address)":"infinite","grantRole(struct AccessControlStorage.Layout storage pointer,bytes32,address,address)":"infinite","hasRole(struct AccessControlStorage.Layout storage pointer,bytes32,address)":"infinite","hasTargetContractRole(address,bytes32,address)":"infinite","layout()":"infinite","renounceRole(struct AccessControlStorage.Layout storage pointer,address,bytes32)":"infinite","revokeRole(struct AccessControlStorage.Layout storage pointer,bytes32,address,address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/libraries/AccessControlStorage.sol\":\"AccessControlStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/access/libraries/ContractOwnershipStorage.sol":{"ContractOwnershipStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220bc8ba6eda0833c7153950fc676ebe6bb4e3e574beb11861711d96036922c4f3764736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC DUP12 0xA6 0xED LOG0 DUP4 EXTCODECOPY PUSH18 0x53950FC676EBE6BB4E3E574BEB11861711D9 PUSH1 0x36 SWAP3 0x2C 0x4F CALLDATACOPY PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"589:4647:42:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220bc8ba6eda0833c7153950fc676ebe6bb4e3e574beb11861711d96036922c4f3764736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC DUP12 0xA6 0xED LOG0 DUP4 EXTCODECOPY PUSH18 0x53950FC676EBE6BB4E3E574BEB11861711D9 PUSH1 0x36 SWAP3 0x2C 0x4F CALLDATACOPY PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"589:4647:42:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"constructorInit(struct ContractOwnershipStorage.Layout storage pointer,address)":"infinite","enforceIsContractOwner(struct ContractOwnershipStorage.Layout storage pointer,address)":"infinite","enforceIsTargetContractOwner(address,address)":"infinite","isTargetContractOwner(address,address)":"infinite","layout()":"infinite","owner(struct ContractOwnershipStorage.Layout storage pointer)":"infinite","proxyInit(struct ContractOwnershipStorage.Layout storage pointer,address)":"infinite","transferOwnership(struct ContractOwnershipStorage.Layout storage pointer,address,address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/libraries/ContractOwnershipStorage.sol\":\"ContractOwnershipStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/access/libraries/SafeContractOwnershipStorage.sol":{"SafeContractOwnershipStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220116763754f9756278d3b7bac9742a5d46729326978cb3068e680235fdd6e997764736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT PUSH8 0x63754F9756278D3B PUSH28 0xAC9742A5D46729326978CB3068E680235FDD6E997764736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"640:5953:43:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220116763754f9756278d3b7bac9742a5d46729326978cb3068e680235fdd6e997764736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT PUSH8 0x63754F9756278D3B PUSH28 0xAC9742A5D46729326978CB3068E680235FDD6E997764736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"640:5953:43:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"acceptOwnership(struct SafeContractOwnershipStorage.Layout storage pointer,address)":"infinite","constructorInit(struct SafeContractOwnershipStorage.Layout storage pointer,address)":"infinite","enforceIsContractOwner(struct SafeContractOwnershipStorage.Layout storage pointer,address)":"infinite","enforceIsTargetContractOwner(address,address)":"infinite","isTargetContractOwner(address,address)":"infinite","layout()":"infinite","owner(struct SafeContractOwnershipStorage.Layout storage pointer)":"infinite","pendingOwner(struct SafeContractOwnershipStorage.Layout storage pointer)":"infinite","proxyInit(struct SafeContractOwnershipStorage.Layout storage pointer,address)":"infinite","transferOwnership(struct SafeContractOwnershipStorage.Layout storage pointer,address,address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":\"SafeContractOwnershipStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/cryptography/interfaces/IERC1271.sol":{"IERC1271":{"abi":[{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1271","kind":"dev","methods":{"isValidSignature(bytes32,bytes)":{"params":{"hash":"The hash of the signed data.","signature":"The signature for `hash`."},"returns":{"magicValue":"`0x1626ba7e` (`bytes4(keccak256(\"isValidSignature(bytes32,bytes)\")`) if the signature is valid, else any other value."}}},"title":"Standard Signature Validation Method for Contracts.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isValidSignature(bytes32,bytes)":"1626ba7e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1271\",\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes32,bytes)\":{\"params\":{\"hash\":\"The hash of the signed data.\",\"signature\":\"The signature for `hash`.\"},\"returns\":{\"magicValue\":\"`0x1626ba7e` (`bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\")`) if the signature is valid, else any other value.\"}}},\"title\":\"Standard Signature Validation Method for Contracts.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Returns whether the signature is valid for the data hash.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/cryptography/interfaces/IERC1271.sol\":\"IERC1271\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/cryptography/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Standard Signature Validation Method for Contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1271\\ninterface IERC1271 {\\n    /// @notice Returns whether the signature is valid for the data hash.\\n    /// @param hash The hash of the signed data.\\n    /// @param signature The signature for `hash`.\\n    /// @return magicValue `0x1626ba7e` (`bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\")`) if the signature is valid, else any other value.\\n    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x398946875e5504f89b0137202e1733544939f6dea85c0b5e50fb388d11f5d8fa\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isValidSignature(bytes32,bytes)":{"notice":"Returns whether the signature is valid for the data hash."}},"version":1}}},"contracts/diamond/Diamond.sol":{"Diamond":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Initialization[]","name":"initializations","type":"tuple[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"EmptyFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"EmptyInitCallData","type":"error"},{"inputs":[],"name":"EtherReceptionDisabled","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionAlreadyPresent","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"InitCallReverted","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ModifyingImmutableFunction","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"NonContractFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"NonContractInitCallTarget","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"RemovingWithNonZeroAddressFacet","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ReplacingFunctionByItself","type":"error"},{"inputs":[],"name":"ZeroAddressTargetInitCallButNonEmptyData","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2535","errors":{"EmptyFacet(address)":[{"params":{"facet":"The facet address."}}],"EmptyInitCallData(address)":[{"params":{"target":"The target address for the initialization call."}}],"FunctionAlreadyPresent(address,bytes4)":[{"params":{"facet":"The facet address which already has the function.","selector":"The function selector which has already been added."}}],"FunctionNotFound(bytes4)":[{"params":{"selector":"The function selector which has not been added."}}],"InitCallReverted(address,bytes)":[{"params":{"data":"The data for the initialization call.","target":"The target address for the initialization call."}}],"ModifyingImmutableFunction(bytes4)":[{"params":{"selector":"The function selector which is immutable."}}],"NonContractFacet(address)":[{"params":{"facet":"The facet address."}}],"NonContractInitCallTarget(address)":[{"params":{"target":"The target address for the initialization call."}}],"RemovingWithNonZeroAddressFacet(address)":[{"params":{"facet":"The facet address which is not zero."}}],"ReplacingFunctionByItself(address,bytes4)":[{"params":{"facet":"The facet address.","selector":"The function selector."}}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"params":{"cuts":"The list of facet addresses, actions and function selectors applied to the diamond.","data":"The encoded function call executed on `target`.","target":"The address of the contract where `data` was executed."}}},"kind":"dev","methods":{"constructor":{"details":"Emits a {DiamondCut} event.","params":{"cuts":"The list of facet addresses, actions and function selectors to apply to the diamond.","initializations":"The list of addresses and encoded function calls to execute with delegatecall."}}},"title":"ERC2535 Diamond Standard, Diamond.","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_address_fromMemory":{"entryPoint":550,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_struct_Initialization_dyn_fromMemory":{"entryPoint":632,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address_bytes":{"entryPoint":1687,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_to_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"abi_encode_array_struct_FacetCut_dyn_address_stringliteral_c5d2":{"entryPoint":1416,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory":{"entryPoint":490,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_5032":{"entryPoint":423,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_5038":{"entryPoint":459,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_FacetCut_dyn":{"entryPoint":527,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":570,"id":null,"parameterSlots":1,"returnSlots":1},"array_storeLengthForEncoding_array_struct_FacetCut_dyn":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"constructor_Diamond":{"entryPoint":859,"id":9513,"parameterSlots":2,"returnSlots":0},"convert_address_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes20_to_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes32_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":597,"id":null,"parameterSlots":3,"returnSlots":0},"extract_from_storage_value_offset_uint16":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_returndata":{"entryPoint":1649,"id":null,"parameterSlots":0,"returnSlots":1},"fun_addFacetSelectors":{"entryPoint":3180,"id":10506,"parameterSlots":3,"returnSlots":2},"fun_hasBytecode":{"entryPoint":null,"id":38034,"parameterSlots":1,"returnSlots":1},"fun_initializationCall":{"entryPoint":1746,"id":10999,"parameterSlots":2,"returnSlots":0},"fun_removeFacetSelectors":{"entryPoint":1948,"id":10805,"parameterSlots":3,"returnSlots":2},"fun_replaceFacetSelectors":{"entryPoint":2834,"id":10918,"parameterSlots":1,"returnSlots":0},"mapping_index_access_mapping_bytes4_bytes32_of_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"mapping_index_access_mapping_uint256__bytes32__of_uint256":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"mapping_index_access_mapping_uint256_bytes32_of_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"memory_array_index_access_struct_Initialization_dyn":{"entryPoint":1342,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":401,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_memoryt_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"read_from_memoryt_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_left_t_uint256_t_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_left_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_right_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"update_storage_value_offset_uint16_to_uint16":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0},"validator_assert_enum_FacetCutAction":{"entryPoint":1384,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[],"linkReferences":{},"object":"6080604052610f9180380380610014816101ea565b9283398101906040818303126100b65780516001600160401b0381116100b65781019082601f830112156100b6578151916100566100518461020f565b6101ea565b9260208085838152019160051b830101918583116100b65760208101915b8383106100bb57505050506020810151926001600160401b0384116100b6576100a7936100a19201610278565b9061035b565b6040516101389081610df98239f35b600080fd5b82516001600160401b0381116100b65782016060818903601f1901126100b6576100e36101a7565b906100f060208201610226565b8252604081015160038110156100b657602083015260608101516001600160401b0381116100b657602091010188601f820112156100b65780516101366100518261020f565b9160208084848152019260051b820101908b82116100b657602001915b818310610170575050506040820152815260209283019201610074565b82516001600160e01b0319811681036100b657815260209283019201610153565b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176101c657604052565b610191565b60408051919082016001600160401b038111838210176101c657604052565b6040519190601f01601f191682016001600160401b038111838210176101c657604052565b6001600160401b0381116101c65760051b60200190565b51906001600160a01b03821682036100b657565b6001600160401b0381116101c657601f01601f191660200190565b60005b8381106102685750506000910152565b8181015183820152602001610258565b81601f820112156100b6578051906102926100518361020f565b9260208085858152019360051b830101918183116100b65760208101935b8385106102bf57505050505090565b84516001600160401b0381116100b65782016040818503601f1901126100b6576102e76101cb565b906102f460208201610226565b825260408101516001600160401b0381116100b65760209101019184601f840112156100b6578251916103296100518461023a565b83815286602085870101116100b65761034c602095948695868085019101610255565b838201528152019401936102b0565b90610380610379600080516020610f518339815191525461ffff1690565b61ffff1690565b8060009160078216610528575b84516000905b808210610480575050810361045d575b60078116610430575b505080519060005b8281106103f4575050506103ef7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739160405191829182610588565b0390a1565b8061042a6104156104076001948661053e565b51516001600160a01b031690565b6020610421848761053e565b510151906106d2565b016103b4565b6104559060031c5b600052600080516020610f71833981519152602052604060002090565b5538806103ac565b600080516020610f51833981519152805461ffff191661ffff83161790556103a3565b909261048c848861053e565b5190604082015151156105095760208201516104a781610568565b6104b081610568565b806104ce5750906001956104c392610c6c565b9490935b0190610393565b806104de60019297949397610568565b036104f457906104ef600192610b12565b6104c7565b600195610501929561079c565b9490936104c7565b815163b39ad1bb60e01b6000526001600160a01b031660045260246000fd5b91506105376104388260031c90565b549161038d565b80518210156105525760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6003111561057257565b634e487b7160e01b600052602160045260246000fd5b9060608201916060815281518093526080810192602060808260051b8401019301936000905b8282106105da57505060006020830152506105d792506040818303910152602090600081520190565b90565b838503607f19018152855180516001600160a01b03168652602081015194959394929391926060830191600382101561057257604060809160209384870152015193606060408201528451809452019201906000905b80821061064e575050506020958601959094939260010191016105ae565b82516001600160e01b031916845260209384019390920191600190910190610630565b3d15610692573d906106856100518361023a565b9182523d6000602084013e565b606090565b909160609260018060a01b03168252604060208301526106c68151809281604086015260208686019101610255565b601f01601f1916010190565b906001600160a01b038216806106fd57509050516106ec57565b6301cd29fb60e71b60005260046000fd5b81511561077f57300361075b575b600080825160208401855af490610720610671565b911561072b57505050565b815192831561073b575050602001fd5b61075760405192839263e83ddca560e01b845260048401610697565b0390fd5b813b61070b5763df3b7fa960e01b6000526001600160a01b03821660045260246000fd5b623ca88560ea1b6000526001600160a01b03831660045260246000fd5b82516001600160a01b031680610af5575060076107bc8295939560031c90565b9116916000915b60408501518051841015610ae7576107de846107ec9261053e565b516001600160e01b03191690565b9561081887600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b549461086e61086261085c61084e8b600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b546001600160601b03191690565b60601c90565b6001600160a01b031690565b15610ac857306108a861086261085c61084e8c600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b14610aa95781610a9957505060001901916108db83600080516020610f7183398151915290600052602052604060002090565b54936007965b6000610942610901886108f48c60051b90565b1b63ffffffff60e01b1690565b6001600160e01b031980821694919082168503610a1f575b506001600160e01b0319166000908152600080516020610f318339815191526020526040902090565b5561095e600761095661ffff851660031c90565b931660051b90565b90828614610a0257906109be9161098d84600080516020610f7183398151915290600052602052604060002090565b5490821c9163ffffffff60e01b901c19161791600080516020610f7183398151915290600052602052604060002090565b555b85156109d3575b929492600101916107c3565b925060006109f983600080516020610f7183398151915290600052602052604060002090565b556000926109c7565b6001600160e01b0319821c1990961695901c9490941793506109c0565b610a92610a60610a5361084e84600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b6001600160601b03191690565b60018060601b0388161791600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b5538610919565b60001901969094919391906108e1565b6363c95ddd60e11b6000526001600160e01b0319881660045260246000fd5b630a82dd7360e31b6000526001600160e01b0319881660045260246000fd5b5090935060031b9050179190565b6391a5e1a360e01b6000526001600160a01b031660045260246000fd5b80516001600160a01b031690813b15610c4e57604001805151606083901b6001600160601b0319169290916001600160a01b0382169060005b848110610b5a57505050505050565b610b686107de82845161053e565b6001600160e01b031981166000908152600080516020610f3183398151915260205260409020548060601c8015610c2f57308114610c10578514610be4576001600160e01b03199091166000908152600080516020610f3183398151915260205260409020600192916001600160601b03168817905501610b4b565b6373d5d79760e01b6000526001600160a01b0386166004526001600160e01b0319821660245260446000fd5b6363c95ddd60e11b6000526001600160e01b0319831660045260246000fd5b630a82dd7360e31b6000526001600160e01b0319831660045260246000fd5b63190c2f0160e11b6000526001600160a01b03821660045260246000fd5b825191939290916001600160a01b03163081141580610def575b610dd257506040810190815151906000925b828410610ca757505050509190565b90919293610cb96107de86845161053e565b96610ceb61085c61084e8a600080516020610f318339815191529063ffffffff60e01b16600052602052604060002090565b6001600160a01b038116610da7575083516001600160e01b031989166000908152600080516020610f318339815191526020526040902060e0929160601b6001600160601b03191684179055610d446007841660051b90565b9863ffffffff831b16891c9063ffffffff831b8a1c1916179714610d72575b60018091019401929190610c98565b95610d9e610d808860031c90565b600080516020610f7183398151915290600052602052604060002090565b55600095610d63565b635f19e89b60e11b6000526001600160a01b03166004526001600160e01b0319881660245260446000fd5b63190c2f0160e11b6000526001600160a01b031660045260246000fd5b50803b15610c8656fe608060405236156100d8577fffffffff0000000000000000000000000000000000000000000000000000000060003516806000527f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e260205260406000205460601c9081156100885760008083368280378136915af43d6000803e15610083573d6000f35b3d6000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000907f5416eb98000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b7f7b5c32900000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220120b5ccaef7a982bab4fa37a76f400415985543c4f2263483a24e1115a0b64ef64736f6c634300081e003365d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e265d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e365d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e4","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0xF91 DUP1 CODESIZE SUB DUP1 PUSH2 0x14 DUP2 PUSH2 0x1EA JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH1 0x40 DUP2 DUP4 SUB SLT PUSH2 0xB6 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP2 ADD SWAP1 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP2 MLOAD SWAP2 PUSH2 0x56 PUSH2 0x51 DUP5 PUSH2 0x20F JUMP JUMPDEST PUSH2 0x1EA JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP4 ADD ADD SWAP2 DUP6 DUP4 GT PUSH2 0xB6 JUMPI PUSH1 0x20 DUP2 ADD SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0xBB JUMPI POP POP POP POP PUSH1 0x20 DUP2 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 GT PUSH2 0xB6 JUMPI PUSH2 0xA7 SWAP4 PUSH2 0xA1 SWAP3 ADD PUSH2 0x278 JUMP JUMPDEST SWAP1 PUSH2 0x35B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x138 SWAP1 DUP2 PUSH2 0xDF9 DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP3 ADD PUSH1 0x60 DUP2 DUP10 SUB PUSH1 0x1F NOT ADD SLT PUSH2 0xB6 JUMPI PUSH2 0xE3 PUSH2 0x1A7 JUMP JUMPDEST SWAP1 PUSH2 0xF0 PUSH1 0x20 DUP3 ADD PUSH2 0x226 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x3 DUP2 LT ISZERO PUSH2 0xB6 JUMPI PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI PUSH1 0x20 SWAP2 ADD ADD DUP9 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP1 MLOAD PUSH2 0x136 PUSH2 0x51 DUP3 PUSH2 0x20F JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP1 DUP5 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP12 DUP3 GT PUSH2 0xB6 JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x170 JUMPI POP POP POP PUSH1 0x40 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x74 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 SUB PUSH2 0xB6 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x153 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x60 DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x191 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 SWAP1 DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x1C6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0xB6 JUMPI JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x1C6 JUMPI PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x268 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x258 JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP1 MLOAD SWAP1 PUSH2 0x292 PUSH2 0x51 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 DUP6 DUP6 DUP2 MSTORE ADD SWAP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP2 DUP2 DUP4 GT PUSH2 0xB6 JUMPI PUSH1 0x20 DUP2 ADD SWAP4 JUMPDEST DUP4 DUP6 LT PUSH2 0x2BF JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP3 ADD PUSH1 0x40 DUP2 DUP6 SUB PUSH1 0x1F NOT ADD SLT PUSH2 0xB6 JUMPI PUSH2 0x2E7 PUSH2 0x1CB JUMP JUMPDEST SWAP1 PUSH2 0x2F4 PUSH1 0x20 DUP3 ADD PUSH2 0x226 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI PUSH1 0x20 SWAP2 ADD ADD SWAP2 DUP5 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP3 MLOAD SWAP2 PUSH2 0x329 PUSH2 0x51 DUP5 PUSH2 0x23A JUMP JUMPDEST DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP8 ADD ADD GT PUSH2 0xB6 JUMPI PUSH2 0x34C PUSH1 0x20 SWAP6 SWAP5 DUP7 SWAP6 DUP7 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x255 JUMP JUMPDEST DUP4 DUP3 ADD MSTORE DUP2 MSTORE ADD SWAP5 ADD SWAP4 PUSH2 0x2B0 JUMP JUMPDEST SWAP1 PUSH2 0x380 PUSH2 0x379 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF51 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x0 SWAP2 PUSH1 0x7 DUP3 AND PUSH2 0x528 JUMPI JUMPDEST DUP5 MLOAD PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0x480 JUMPI POP POP DUP2 SUB PUSH2 0x45D JUMPI JUMPDEST PUSH1 0x7 DUP2 AND PUSH2 0x430 JUMPI JUMPDEST POP POP DUP1 MLOAD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x3F4 JUMPI POP POP POP PUSH2 0x3EF PUSH32 0x8FAA70878671CCD212D20771B795C50AF8FD3FF6CF27F4BDE57E5D4DE0AEB673 SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x588 JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST DUP1 PUSH2 0x42A PUSH2 0x415 PUSH2 0x407 PUSH1 0x1 SWAP5 DUP7 PUSH2 0x53E JUMP JUMPDEST MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH2 0x421 DUP5 DUP8 PUSH2 0x53E JUMP JUMPDEST MLOAD ADD MLOAD SWAP1 PUSH2 0x6D2 JUMP JUMPDEST ADD PUSH2 0x3B4 JUMP JUMPDEST PUSH2 0x455 SWAP1 PUSH1 0x3 SHR JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE CODESIZE DUP1 PUSH2 0x3AC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF51 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0xFFFF DUP4 AND OR SWAP1 SSTORE PUSH2 0x3A3 JUMP JUMPDEST SWAP1 SWAP3 PUSH2 0x48C DUP5 DUP9 PUSH2 0x53E JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x40 DUP3 ADD MLOAD MLOAD ISZERO PUSH2 0x509 JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4A7 DUP2 PUSH2 0x568 JUMP JUMPDEST PUSH2 0x4B0 DUP2 PUSH2 0x568 JUMP JUMPDEST DUP1 PUSH2 0x4CE JUMPI POP SWAP1 PUSH1 0x1 SWAP6 PUSH2 0x4C3 SWAP3 PUSH2 0xC6C JUMP JUMPDEST SWAP5 SWAP1 SWAP4 JUMPDEST ADD SWAP1 PUSH2 0x393 JUMP JUMPDEST DUP1 PUSH2 0x4DE PUSH1 0x1 SWAP3 SWAP8 SWAP5 SWAP4 SWAP8 PUSH2 0x568 JUMP JUMPDEST SUB PUSH2 0x4F4 JUMPI SWAP1 PUSH2 0x4EF PUSH1 0x1 SWAP3 PUSH2 0xB12 JUMP JUMPDEST PUSH2 0x4C7 JUMP JUMPDEST PUSH1 0x1 SWAP6 PUSH2 0x501 SWAP3 SWAP6 PUSH2 0x79C JUMP JUMPDEST SWAP5 SWAP1 SWAP4 PUSH2 0x4C7 JUMP JUMPDEST DUP2 MLOAD PUSH4 0xB39AD1BB PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 POP PUSH2 0x537 PUSH2 0x438 DUP3 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SLOAD SWAP2 PUSH2 0x38D JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x552 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x572 JUMPI JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x60 DUP3 ADD SWAP2 PUSH1 0x60 DUP2 MSTORE DUP2 MLOAD DUP1 SWAP4 MSTORE PUSH1 0x80 DUP2 ADD SWAP3 PUSH1 0x20 PUSH1 0x80 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD SWAP4 ADD SWAP4 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x5DA JUMPI POP POP PUSH1 0x0 PUSH1 0x20 DUP4 ADD MSTORE POP PUSH2 0x5D7 SWAP3 POP PUSH1 0x40 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH1 0x20 SWAP1 PUSH1 0x0 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP4 DUP6 SUB PUSH1 0x7F NOT ADD DUP2 MSTORE DUP6 MLOAD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 MSTORE PUSH1 0x20 DUP2 ADD MLOAD SWAP5 SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 PUSH1 0x60 DUP4 ADD SWAP2 PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x572 JUMPI PUSH1 0x40 PUSH1 0x80 SWAP2 PUSH1 0x20 SWAP4 DUP5 DUP8 ADD MSTORE ADD MLOAD SWAP4 PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0x64E JUMPI POP POP POP PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 SWAP4 SWAP3 PUSH1 0x1 ADD SWAP2 ADD PUSH2 0x5AE JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x630 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x692 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x685 PUSH2 0x51 DUP4 PUSH2 0x23A JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 SWAP3 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x6C6 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x20 DUP7 DUP7 ADD SWAP2 ADD PUSH2 0x255 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP1 PUSH2 0x6FD JUMPI POP SWAP1 POP MLOAD PUSH2 0x6EC JUMPI JUMP JUMPDEST PUSH4 0x1CD29FB PUSH1 0xE7 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x77F JUMPI ADDRESS SUB PUSH2 0x75B JUMPI JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL SWAP1 PUSH2 0x720 PUSH2 0x671 JUMP JUMPDEST SWAP2 ISZERO PUSH2 0x72B JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD SWAP3 DUP4 ISZERO PUSH2 0x73B JUMPI POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x757 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH4 0xE83DDCA5 PUSH1 0xE0 SHL DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x697 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP2 EXTCODESIZE PUSH2 0x70B JUMPI PUSH4 0xDF3B7FA9 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH3 0x3CA885 PUSH1 0xEA SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0xAF5 JUMPI POP PUSH1 0x7 PUSH2 0x7BC DUP3 SWAP6 SWAP4 SWAP6 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP2 AND SWAP2 PUSH1 0x0 SWAP2 JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD DUP1 MLOAD DUP5 LT ISZERO PUSH2 0xAE7 JUMPI PUSH2 0x7DE DUP5 PUSH2 0x7EC SWAP3 PUSH2 0x53E JUMP JUMPDEST MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 JUMP JUMPDEST SWAP6 PUSH2 0x818 DUP8 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP5 PUSH2 0x86E PUSH2 0x862 PUSH2 0x85C PUSH2 0x84E DUP12 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xAC8 JUMPI ADDRESS PUSH2 0x8A8 PUSH2 0x862 PUSH2 0x85C PUSH2 0x84E DUP13 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST EQ PUSH2 0xAA9 JUMPI DUP2 PUSH2 0xA99 JUMPI POP POP PUSH1 0x0 NOT ADD SWAP2 PUSH2 0x8DB DUP4 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP4 PUSH1 0x7 SWAP7 JUMPDEST PUSH1 0x0 PUSH2 0x942 PUSH2 0x901 DUP9 PUSH2 0x8F4 DUP13 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND SWAP5 SWAP2 SWAP1 DUP3 AND DUP6 SUB PUSH2 0xA1F JUMPI JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH2 0x95E PUSH1 0x7 PUSH2 0x956 PUSH2 0xFFFF DUP6 AND PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP4 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SWAP1 DUP3 DUP7 EQ PUSH2 0xA02 JUMPI SWAP1 PUSH2 0x9BE SWAP2 PUSH2 0x98D DUP5 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 DUP3 SHR SWAP2 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL SWAP1 SHR NOT AND OR SWAP2 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMPDEST DUP6 ISZERO PUSH2 0x9D3 JUMPI JUMPDEST SWAP3 SWAP5 SWAP3 PUSH1 0x1 ADD SWAP2 PUSH2 0x7C3 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 PUSH2 0x9F9 DUP4 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP3 PUSH2 0x9C7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 SHR NOT SWAP1 SWAP7 AND SWAP6 SWAP1 SHR SWAP5 SWAP1 SWAP5 OR SWAP4 POP PUSH2 0x9C0 JUMP JUMPDEST PUSH2 0xA92 PUSH2 0xA60 PUSH2 0xA53 PUSH2 0x84E DUP5 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x60 SHL SUB DUP9 AND OR SWAP2 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE CODESIZE PUSH2 0x919 JUMP JUMPDEST PUSH1 0x0 NOT ADD SWAP7 SWAP1 SWAP5 SWAP2 SWAP4 SWAP2 SWAP1 PUSH2 0x8E1 JUMP JUMPDEST PUSH4 0x63C95DDD PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP9 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA82DD73 PUSH1 0xE3 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP9 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP1 SWAP4 POP PUSH1 0x3 SHL SWAP1 POP OR SWAP2 SWAP1 JUMP JUMPDEST PUSH4 0x91A5E1A3 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 EXTCODESIZE ISZERO PUSH2 0xC4E JUMPI PUSH1 0x40 ADD DUP1 MLOAD MLOAD PUSH1 0x60 DUP4 SWAP1 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP3 SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xB5A JUMPI POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB68 PUSH2 0x7DE DUP3 DUP5 MLOAD PUSH2 0x53E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH1 0x60 SHR DUP1 ISZERO PUSH2 0xC2F JUMPI ADDRESS DUP2 EQ PUSH2 0xC10 JUMPI DUP6 EQ PUSH2 0xBE4 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB AND DUP9 OR SWAP1 SSTORE ADD PUSH2 0xB4B JUMP JUMPDEST PUSH4 0x73D5D797 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x63C95DDD PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA82DD73 PUSH1 0xE3 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x190C2F01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 MLOAD SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ADDRESS DUP2 EQ ISZERO DUP1 PUSH2 0xDEF JUMPI JUMPDEST PUSH2 0xDD2 JUMPI POP PUSH1 0x40 DUP2 ADD SWAP1 DUP2 MLOAD MLOAD SWAP1 PUSH1 0x0 SWAP3 JUMPDEST DUP3 DUP5 LT PUSH2 0xCA7 JUMPI POP POP POP POP SWAP2 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0xCB9 PUSH2 0x7DE DUP7 DUP5 MLOAD PUSH2 0x53E JUMP JUMPDEST SWAP7 PUSH2 0xCEB PUSH2 0x85C PUSH2 0x84E DUP11 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xDA7 JUMPI POP DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF31 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0xE0 SWAP3 SWAP2 PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE PUSH2 0xD44 PUSH1 0x7 DUP5 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SWAP9 PUSH4 0xFFFFFFFF DUP4 SHL AND DUP10 SHR SWAP1 PUSH4 0xFFFFFFFF DUP4 SHL DUP11 SHR NOT AND OR SWAP8 EQ PUSH2 0xD72 JUMPI JUMPDEST PUSH1 0x1 DUP1 SWAP2 ADD SWAP5 ADD SWAP3 SWAP2 SWAP1 PUSH2 0xC98 JUMP JUMPDEST SWAP6 PUSH2 0xD9E PUSH2 0xD80 DUP9 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xF71 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP6 PUSH2 0xD63 JUMP JUMPDEST PUSH4 0x5F19E89B PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP9 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x190C2F01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0xC86 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0xD8 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH1 0x0 MSTORE PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR SWAP1 DUP2 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 DUP4 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY ISZERO PUSH2 0x83 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7B5C329000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT SIGNEXTEND TLOAD 0xCA 0xEF PUSH27 0x982BAB4FA37A76F400415985543C4F2263483A24E1115A0B64EF64 PUSH20 0x6F6C634300081E003365D27473A5B05206737961 0xF6 SWAP11 EXTCODESIZE PUSH27 0x55316862D7A6EF82B3F5455FE92FAB43E265D27473A5B052067379 PUSH2 0xF69A EXTCODESIZE PUSH27 0x55316862D7A6EF82B3F5455FE92FAB43E365D27473A5B052067379 PUSH2 0xF69A EXTCODESIZE PUSH27 0x55316862D7A6EF82B3F5455FE92FAB43E400000000000000000000 ","sourceMap":"378:931:45:-:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;378:931:45;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;378:931:45;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;-1:-1:-1;;378:931:45;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;378:931:45;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;378:931:45;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;378:931:45;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;378:931:45;;;;;;:::o;:::-;-1:-1:-1;;;;;378:931:45;;;;;;-1:-1:-1;;378:931:45;;;;:::o;:::-;;;;;;;;-1:-1:-1;;378:931:45;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;-1:-1:-1;;378:931:45;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;813:159;;3397:47:54;378:931:45;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;3397:47:54;;-1:-1:-1;3595:17:54;3611:1;3595:17;;3591:139;;813:159:45;378:931;;-1:-1:-1;3783:647:54;3799:10;;;;;;4444:38;;;;4440:108;;3783:647;3611:1;4607:17;;4603:102;;3783:647;378:931:45;;;;3130:9:54;-1:-1:-1;3141:10:54;;;;;;378:931:45;;;3267:32:54;;378:931:45;3888:18:54;378:931:45;3267:32:54;;;;;:::i;:::-;;;;813:159:45:o;3153:3:54:-;3191:18;3218:23;3191:25;:18;1801:1;3191:18;;;:::i;:::-;;378:931:45;-1:-1:-1;;;;;378:931:45;;;3191:25:54;3992:15;3218:18;;;;:::i;:::-;;:23;;;;:::i;:::-;378:931:45;3130:9:54;;4603:102;4644:35;;378:931:45;;4660:18:54;378:931:45;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;4644:35:54;378:931:45;4603:102:54;;;;4440:108;-1:-1:-1;;;;;;;;;;;378:931:45;;-1:-1:-1;;378:931:45;;;;;;;4440:108:54;;3811:3;3857:12;;;;;;:::i;:::-;;3888:18;;;;;378:931:45;3888:30:54;3884:69;;3992:15;;;378:931:45;;;;:::i;:::-;;;;:::i;:::-;4025:28:54;;;4105:58;;1801:1;4105:58;;;;:::i;:::-;4073:90;;4021:399;;378:931:45;3788:9:54;;;4021:399;378:931:45;;1801:1:54;378:931:45;;;;;;:::i;:::-;4188:32:54;1801:1;;4264:8;;1801:1;4264:8;;:::i;:::-;4021:399;;4184:236;1801:1;4344:61;;;;;:::i;:::-;4312:93;;4184:236;4021:399;;3884:69;378:931:45;;-1:-1:-1;;;;3927:26:54;-1:-1:-1;;;;;378:931:45;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;3591:139;3700:18;;3684:35;3700:18;;378:931:45;;;;3684:35:54;378:931:45;3591:139:54;;;378:931:45;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;378:931:45;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;378:931:45;;;;;-1:-1:-1;378:931:45;;-1:-1:-1;378:931:45;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;378:931:45;;;;;;;-1:-1:-1;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;378:931:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;378:931:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;378:931:45;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;378:931:45;;;;:::o;10242:893:54:-;;-1:-1:-1;;;;;378:931:45;;10328:20:54;;;378:931:45;;;;10364:71:54;;10242:893::o;10364:71::-;10393:42;;;10346:1;10393:42;;10346:1;10393:42;10324:805;378:931:45;;10470:16:54;10466:54;;10556:4;10538:23;10534:129;;10324:805;10346:1;10719:25;;;;;;;;;;;;:::i;:::-;10762:8;;10758:361;;10324:805;;;10242:893::o;10758:361::-;378:931:45;;;10856:21:54;;;;10901:102;;10719:25;10901:102;;10852:253;11056:30;378:931:45;;11056:30:54;;;;;;;;;;;;:::i;:::-;;;;10534:129;376:58:354;;10534:129:54;10581:67;-1:-1:-1;;;10346:1:54;10615:33;-1:-1:-1;;;;;378:931:45;;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;10466:54;-1:-1:-1;;;10346:1:54;10495:25;-1:-1:-1;;;;;378:931:45;;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;6135:3203;378:931:45;;-1:-1:-1;;;;;378:931:45;;6338:88:54;;6465:18;6539:1;6465:18;;;;;378:931:45;;;;6465:18:54;6523:17;;6556:9;378:931:45;6551:2661:54;6598:3;6571:18;;;;378:931:45;;6567:29:54;;;;;6635:21;;;;;:::i;:::-;378:931:45;-1:-1:-1;;;;;;378:931:45;;;6635:21:54;6689:25;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;6689:25:54;378:931:45;6749:25:54;6733:57;:43;6741:34;6749:25;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;6749:25:54;378:931:45;-1:-1:-1;;;;;;378:931:45;;;6741:34:54;378:931:45;;;;6733:43:54;-1:-1:-1;;;;;378:931:45;;;6733:57:54;;6729:96;;6898:4;6843:60;:43;6851:34;6859:25;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;6843:60:54;;6839:109;;6967:17;;;378:931:45;;;;;7106:34:54;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;7106:34:54;378:931:45;7158:23:54;6539:1;6963:343;;378:931:45;7941:25:54;7609:50;7633:24;;;378:931:45;;;;7633:24:54;378:931:45;;;;;;;7609:50:54;-1:-1:-1;;;;;;378:931:45;;;;;;;;7682:24:54;;7678:238;;6963:343;-1:-1:-1;;;;;;;378:931:45;;;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;7941:25:54;1857:44;8145:27;6539:1;8078:21;378:931:45;;;;;;;8078:21:54;8146:20;;378:931:45;;;;8145:27:54;8205:42;;;;;;8293:38;8686;8293;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;8293:38:54;378:931:45;;;;;;;;;;8503:51:54;8485:69;8484:126;8686:38;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;8686:38:54;378:931:45;8201:849:54;9068:24;;9064:138;;8201:849;6556:9;;;378:931:45;;;6556:9:54;;9064:138;9119:34;;378:931:45;9119:34:54;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;9119:34:54;1857:44;378:931:45;;9064:138:54;;8201:849;-1:-1:-1;;;;;;378:931:45;;8928:51:54;8913:66;;;378:931:45;;;8912:123:54;;;;;-1:-1:-1;8201:849:54;;7678:238;7793:29;7825:72;7859:38;7867:29;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;7859:38:54;-1:-1:-1;;;;;;378:931:45;;;7825:72:54;378:931:45;;;;;7826:29:54;;7825:72;7793:29;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;7793:29:54;378:931:45;7678:238:54;;;6963:343;-1:-1:-1;;378:931:45;;;;;;;;6963:343:54;;6839:109;-1:-1:-1;;;378:931:45;6912:36:54;-1:-1:-1;;;;;;378:931:45;;6799:26:54;378:931:45;;-1:-1:-1;3927:26:54;6729:96;-1:-1:-1;;;378:931:45;6799:26:54;-1:-1:-1;;;;;;378:931:45;;6799:26:54;378:931:45;;-1:-1:-1;3927:26:54;6567:29;-1:-1:-1;6567:29:54;;-1:-1:-1;378:931:45;;;-1:-1:-1;9238:46:54;9295:36;6135:3203;:::o;6338:88::-;-1:-1:-1;;;378:931:45;6379:47:54;-1:-1:-1;;;;;378:931:45;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;9344:892;378:931:45;;-1:-1:-1;;;;;378:931:45;9483:19:54;376:58:354;;450:9;9478:65:54;;9571:18;;;;378:931:45;;;;;-1:-1:-1;;;;;;378:931:45;;;;-1:-1:-1;;;;;378:931:45;;;-1:-1:-1;9622:10:54;;;;;;9344:892;;;;;;:::o;9634:3::-;9671:21;;:18;;;:21;:::i;:::-;-1:-1:-1;;;;;;378:931:45;;;;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;9835:29:54;;9831:68;;9944:4;9917:32;;9913:81;;10012:24;;10008:79;;-1:-1:-1;;;;;;378:931:45;;;;;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;-1:-1:-1;;;;;10172:29:54;10171:48;;;378:931:45;;9611:9:54;;10008:79;-1:-1:-1;;;;10045:42:54;-1:-1:-1;;;;;378:931:45;;10045:42:54;378:931:45;-1:-1:-1;;;;;;378:931:45;;;;;-1:-1:-1;3927:26:54;9913:81;-1:-1:-1;;;;9958:36:54;-1:-1:-1;;;;;;378:931:45;;6799:26:54;378:931:45;;-1:-1:-1;3927:26:54;9831:68;-1:-1:-1;;;;9873:26:54;-1:-1:-1;;;;;;378:931:45;;6799:26:54;378:931:45;;-1:-1:-1;3927:26:54;9478:65;-1:-1:-1;;;9454:14:54;9511:32;-1:-1:-1;;;;;378:931:45;;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;4717:1412;378:931:45;;4717:1412:54;;;;;-1:-1:-1;;;;;378:931:45;4947:4:54;4921:31;;;;:64;;4717:1412;4917:109;;5054:18;;;;;;;378:931:45;5094:9:54;378:931:45;5089:987:54;5105:10;;;;;;6086:36;;;;;4717:1412;:::o;5117:3::-;5154:18;;;;:21;;:18;;;:21;:::i;:::-;5231:25;5215:43;5223:34;5231:25;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;;;;;5215:43:54;-1:-1:-1;;;;;378:931:45;;5273:91:54;;-1:-1:-1;378:931:45;;-1:-1:-1;;;;;;378:931:45;;;;;;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;5872:3:54;;;378:931:45;;-1:-1:-1;;;;;;378:931:45;5445:48:54;;;378:931:45;5540:24:54;5557:1;5541:17;;378:931:45;;;;5540:24:54;378:931:45;;;;;;;;;;;;;5674:48:54;5659:63;5658:113;5846:29;;5842:152;;5117:3;378:931:45;;;;5117:3:54;378:931:45;5094:9:54;;;;;5842:152;5911:18;5895:35;5911:18;;378:931:45;;;;5911:18:54;-1:-1:-1;;;;;;;;;;;378:931:45;;;;;;;;;;5895:35:54;378:931:45;;;5842:152:54;;5273:91;-1:-1:-1;;;378:931:45;5315:49:54;-1:-1:-1;;;;;378:931:45;10045:42:54;378:931:45;-1:-1:-1;;;;;;378:931:45;;;;;-1:-1:-1;3927:26:54;4917:109;-1:-1:-1;;;378:931:45;4994:32:54;-1:-1:-1;;;;;378:931:45;3927:26:54;378:931:45;;-1:-1:-1;3927:26:54;4921:64;-1:-1:-1;376:58:354;;450:9;4921:64:54;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"608060405236156100d8577fffffffff0000000000000000000000000000000000000000000000000000000060003516806000527f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e260205260406000205460601c9081156100885760008083368280378136915af43d6000803e15610083573d6000f35b3d6000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000907f5416eb98000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b7f7b5c32900000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220120b5ccaef7a982bab4fa37a76f400415985543c4f2263483a24e1115a0b64ef64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0xD8 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH1 0x0 MSTORE PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR SWAP1 DUP2 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 DUP4 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY ISZERO PUSH2 0x83 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7B5C329000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT SIGNEXTEND TLOAD 0xCA 0xEF PUSH27 0x982BAB4FA37A76F400415985543C4F2263483A24E1115A0B64EF64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"378:931:45:-:0;;;;;;;11224:7:54;-1:-1:-1;11224:7:54;;378:931:45;-1:-1:-1;378:931:45;;;;;-1:-1:-1;378:931:45;;;;11295:19:54;;;11291:58;;-1:-1:-1;378:931:45;;;11359:381:54;;;378:931:45;;11359:381:54;;;;-1:-1:-1;11359:381:54;;;;;;-1:-1:-1;11359:381:54;;;-1:-1:-1;11359:381:54;11291:58;378:931:45;11323:26:54;;-1:-1:-1;11323:26:54;378:931:45;11323:26:54;378:931:45;;-1:-1:-1;11323:26:54;378:931:45;1276:24;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"62400","executionCost":"infinite","totalCost":"infinite"},"external":{"":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Initialization[]\",\"name\":\"initializations\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"EmptyFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"EmptyInitCallData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherReceptionDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionAlreadyPresent\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"InitCallReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ModifyingImmutableFunction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"NonContractFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"NonContractInitCallTarget\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"RemovingWithNonZeroAddressFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ReplacingFunctionByItself\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressTargetInitCallButNonEmptyData\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2535\",\"errors\":{\"EmptyFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"EmptyInitCallData(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address which already has the function.\",\"selector\":\"The function selector which has already been added.\"}}],\"FunctionNotFound(bytes4)\":[{\"params\":{\"selector\":\"The function selector which has not been added.\"}}],\"InitCallReverted(address,bytes)\":[{\"params\":{\"data\":\"The data for the initialization call.\",\"target\":\"The target address for the initialization call.\"}}],\"ModifyingImmutableFunction(bytes4)\":[{\"params\":{\"selector\":\"The function selector which is immutable.\"}}],\"NonContractFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"NonContractInitCallTarget(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"params\":{\"facet\":\"The facet address which is not zero.\"}}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address.\",\"selector\":\"The function selector.\"}}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors applied to the diamond.\",\"data\":\"The encoded function call executed on `target`.\",\"target\":\"The address of the contract where `data` was executed.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Emits a {DiamondCut} event.\",\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors to apply to the diamond.\",\"initializations\":\"The list of addresses and encoded function calls to execute with delegatecall.\"}}},\"title\":\"ERC2535 Diamond Standard, Diamond.\",\"version\":1},\"userdoc\":{\"errors\":{\"EmptyFacet(address)\":[{\"notice\":\"Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\"}],\"EmptyInitCallData(address)\":[{\"notice\":\"Thrown when trying to call an initialization function with a target and empty data.\"}],\"EtherReceptionDisabled()\":[{\"notice\":\"Thrown when trying to transfer tokens without calldata to the contract.\"}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"notice\":\"Thrown when trying to add a function selector that has already been added.\"}],\"FunctionNotFound(bytes4)\":[{\"notice\":\"Thrown when trying to execute, remove or replace a function selector that has not been added.\"}],\"InitCallReverted(address,bytes)\":[{\"notice\":\"Thrown when trying to call an initialization function which reverts without return data.\"}],\"ModifyingImmutableFunction(bytes4)\":[{\"notice\":\"Thrown when trying to remove or replace an immutable function.\"}],\"NonContractFacet(address)\":[{\"notice\":\"Thrown when trying to add or replace a facet which is not a deployed contract.\"}],\"NonContractInitCallTarget(address)\":[{\"notice\":\"Thrown when trying to call an initialization function on a non-contract address.\"}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"notice\":\"Thrown when trying to remove function selectors with a non-zero facet address.\"}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"notice\":\"Thrown when trying to replace a function with itself (from the same facet).\"}],\"ZeroAddressTargetInitCallButNonEmptyData()\":[{\"notice\":\"Thrown when trying to call an initialization function with a zero address target and non-empty data.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Emitted when at least a cut action is operated on the diamond.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Add/replace/remove facet functions and execute a batch of functions with delegatecall.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/Diamond.sol\":\"Diamond\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/diamond/Diamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {EtherReceptionDisabled} from \\\"./../CommonErrors.sol\\\";\\nimport {FacetCut, Initialization} from \\\"./DiamondCommon.sol\\\";\\nimport {DiamondStorage} from \\\"./libraries/DiamondStorage.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\ncontract Diamond {\\n    using DiamondStorage for DiamondStorage.Layout;\\n\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    constructor(FacetCut[] memory cuts, Initialization[] memory initializations) payable {\\n        DiamondStorage.layout().diamondCut(cuts, initializations);\\n    }\\n\\n    /// @notice Execute a function from a facet with delegatecall.\\n    /// @dev Reverts with {FunctionNotFound} if the function selector is not found.\\n    fallback() external payable {\\n        DiamondStorage.layout().delegateOnFallback();\\n    }\\n\\n    receive() external payable virtual {\\n        revert EtherReceptionDisabled();\\n    }\\n}\\n\",\"keccak256\":\"0x25be70e9c211ccf4b1105e81f879a6a98818307bd88b8185b72837a1dcaee9f4\",\"license\":\"MIT\"},\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/errors/DiamondErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\\n/// @param facet The facet address.\\nerror EmptyFacet(address facet);\\n\\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\\n/// @param facet The facet address.\\nerror NonContractFacet(address facet);\\n\\n/// @notice Thrown when trying to add a function selector that has already been added.\\n/// @param facet The facet address which already has the function.\\n/// @param selector The function selector which has already been added.\\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\\n/// @param facet The facet address which is not zero.\\nerror RemovingWithNonZeroAddressFacet(address facet);\\n\\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\\n/// @param selector The function selector which has not been added.\\nerror FunctionNotFound(bytes4 selector);\\n\\n/// @notice Thrown when trying to remove or replace an immutable function.\\n/// @param selector The function selector which is immutable.\\nerror ModifyingImmutableFunction(bytes4 selector);\\n\\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\\n/// @param facet The facet address.\\n/// @param selector The function selector.\\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\\nerror ZeroAddressTargetInitCallButNonEmptyData();\\n\\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\\n/// @param target The target address for the initialization call.\\nerror EmptyInitCallData(address target);\\n\\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\\n/// @param target The target address for the initialization call.\\nerror NonContractInitCallTarget(address target);\\n\\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\\n/// @param target The target address for the initialization call.\\n/// @param data The data for the initialization call.\\nerror InitCallReverted(address target, bytes data);\\n\",\"keccak256\":\"0x2647bd9f06a6b0d435b142d7fc15e13c51e31217822b01a3f598b7c40edb9e20\",\"license\":\"MIT\"},\"contracts/diamond/events/DiamondCutEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @notice Emitted when at least a cut action is operated on the diamond.\\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\\n/// @param target The address of the contract where `data` was executed.\\n/// @param data The encoded function call executed on `target`.\\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\\n\",\"keccak256\":\"0x74988038bb78c2fba84434628255bd30f1282dd7e6a59ef3849cb40786428aea\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"},\"contracts/diamond/libraries/DiamondStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    EmptyFacet,\\n    NonContractFacet,\\n    FunctionAlreadyPresent,\\n    RemovingWithNonZeroAddressFacet,\\n    FunctionNotFound,\\n    ModifyingImmutableFunction,\\n    ReplacingFunctionByItself,\\n    ZeroAddressTargetInitCallButNonEmptyData,\\n    EmptyInitCallData,\\n    NonContractInitCallTarget,\\n    InitCallReverted\\n} from \\\"./../errors/DiamondErrors.sol\\\";\\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {DiamondCut} from \\\"./../events/DiamondCutEvents.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\\nlibrary DiamondStorage {\\n    using Address for address;\\n    using DiamondStorage for DiamondStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        // selector => (facet address, selector slot position)\\n        mapping(bytes4 => bytes32) diamondFacets;\\n        // number of selectors registered in selectorSlots\\n        uint16 selectorCount;\\n        // array of selector slots with 8 selectors per slot\\n        mapping(uint256 => bytes32) selectorSlots;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.Diamond.storage\\\")) - 1);\\n\\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    function initDiamondCut() internal {\\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    function initDiamondLoupe() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\\n        s.cutFacets(cuts);\\n        initializationCall(target, data);\\n        emit DiamondCut(cuts, target, data);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\\n        s.cutFacets(cuts);\\n        uint256 length = initializations.length;\\n        for (uint256 i; i < length; ++i) {\\n            initializationCall(initializations[i].target, initializations[i].data);\\n        }\\n        emit DiamondCut(cuts, address(0), \\\"\\\");\\n    }\\n\\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\\n        uint256 originalSelectorCount = s.selectorCount;\\n        uint256 selectorCount = originalSelectorCount;\\n        bytes32 selectorSlot;\\n\\n        // Check if last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            // get last selectorSlot\\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\\n        }\\n\\n        uint256 length = facetCuts.length;\\n        for (uint256 i; i < length; ++i) {\\n            FacetCut memory facetCut = facetCuts[i];\\n\\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\\n\\n            FacetCutAction action = facetCut.action;\\n            if (action == FacetCutAction.ADD) {\\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            } else if (action == FacetCutAction.REPLACE) {\\n                s.replaceFacetSelectors(facetCut);\\n            } else {\\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            }\\n        }\\n\\n        if (selectorCount != originalSelectorCount) {\\n            s.selectorCount = uint16(selectorCount);\\n        }\\n\\n        // If last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n        }\\n    }\\n\\n    function addFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\\n\\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\\n\\n            // add facet for selector\\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\\n\\n            // clear selector position in slot and add selector\\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\\n\\n            // if slot is full then write it to storage\\n            if (selectorInSlotPosition == 224) {\\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n                selectorSlot = 0;\\n            }\\n\\n            unchecked {\\n                ++selectorCount;\\n            }\\n        }\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function removeFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\\n\\n        uint256 selectorSlotCount = selectorCount >> 3;\\n        uint256 selectorInSlotIndex = selectorCount & 7;\\n\\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n\\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\\n\\n            if (selectorSlot == 0) {\\n                unchecked {\\n                    selectorSlotCount--;\\n                }\\n                selectorSlot = s.selectorSlots[selectorSlotCount];\\n                selectorInSlotIndex = 7;\\n            } else {\\n                unchecked {\\n                    selectorInSlotIndex--;\\n                }\\n            }\\n\\n            bytes4 lastSelector;\\n            uint256 oldSelectorsSlotCount;\\n            uint256 oldSelectorInSlotPosition;\\n\\n            // adding a block here prevents stack too deep error\\n            {\\n                // replace selector with last selector in l.facets\\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\\n\\n                if (lastSelector != selector) {\\n                    // update last selector slot position info\\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\\n                }\\n\\n                delete s.diamondFacets[selector];\\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\\n            }\\n\\n            if (oldSelectorsSlotCount != selectorSlotCount) {\\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\\n\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                oldSelectorSlot =\\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n\\n                // update storage with the modified slot\\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\\n            } else {\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                selectorSlot =\\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n            }\\n\\n            if (selectorInSlotIndex == 0) {\\n                delete s.selectorSlots[selectorSlotCount];\\n                selectorSlot = 0;\\n            }\\n        }\\n\\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\\n        address facet = facetCut.facet;\\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n            address oldFacetAddress = address(bytes20(oldFacet));\\n\\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\\n\\n            // replace old facet address\\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\\n        }\\n    }\\n\\n    function initializationCall(address target, bytes memory data) internal {\\n        if (target == address(0)) {\\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\\n        } else {\\n            if (data.length == 0) revert EmptyInitCallData(target);\\n            if (target != address(this)) {\\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\\n            }\\n\\n            (bool success, bytes memory returndata) = target.delegatecall(data);\\n            if (!success) {\\n                uint256 returndataLength = returndata.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, returndata), returndataLength)\\n                    }\\n                } else {\\n                    revert InitCallReverted(target, data);\\n                }\\n            }\\n        }\\n    }\\n\\n    function delegateOnFallback(Layout storage s) internal {\\n        bytes4 selector = msg.sig;\\n        address facet = s.facetAddress(selector);\\n        if (facet == address(0)) revert FunctionNotFound(selector);\\n        assembly {\\n            calldatacopy(0, 0, calldatasize())\\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n            returndatacopy(0, 0, returndatasize())\\n            switch result\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            diamondFacets = new Facet[](selectorCount);\\n\\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\\n                        if (diamondFacets[facetIndex].facet == facet) {\\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\\n                            ++numFacetSelectors[facetIndex];\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    diamondFacets[numFacets].facet = facet;\\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\\n                    diamondFacets[numFacets].selectors[0] = selector;\\n                    numFacetSelectors[numFacets] = 1;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                uint256 numSelectors = numFacetSelectors[facetIndex];\\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\\n\\n                // setting the number of selectors\\n                assembly {\\n                    mstore(selectors, numSelectors)\\n                }\\n            }\\n\\n            // setting the number of facets\\n            assembly {\\n                mstore(diamondFacets, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            selectors = new bytes4[](selectorCount);\\n\\n            uint256 numSelectors;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n\\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\\n                        selectors[numSelectors] = selector;\\n                        ++numSelectors;\\n                    }\\n                }\\n            }\\n\\n            // set the number of selectors in the array\\n            assembly {\\n                mstore(selectors, numSelectors)\\n            }\\n        }\\n    }\\n\\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            addresses = new address[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                        if (facet == addresses[facetIndex]) {\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    addresses[numFacets] = facet;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            // set the number of facet addresses in the array\\n            assembly {\\n                mstore(addresses, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\\n        facet = address(bytes20(s.diamondFacets[selector]));\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x930e0c854d559149621d2185cef92daadde9f514e12cca2ca30a1a9d1af063d7\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"EmptyFacet(address)":[{"notice":"Thrown when trying to cut (add/replace/remove) a facet with no function selectors."}],"EmptyInitCallData(address)":[{"notice":"Thrown when trying to call an initialization function with a target and empty data."}],"EtherReceptionDisabled()":[{"notice":"Thrown when trying to transfer tokens without calldata to the contract."}],"FunctionAlreadyPresent(address,bytes4)":[{"notice":"Thrown when trying to add a function selector that has already been added."}],"FunctionNotFound(bytes4)":[{"notice":"Thrown when trying to execute, remove or replace a function selector that has not been added."}],"InitCallReverted(address,bytes)":[{"notice":"Thrown when trying to call an initialization function which reverts without return data."}],"ModifyingImmutableFunction(bytes4)":[{"notice":"Thrown when trying to remove or replace an immutable function."}],"NonContractFacet(address)":[{"notice":"Thrown when trying to add or replace a facet which is not a deployed contract."}],"NonContractInitCallTarget(address)":[{"notice":"Thrown when trying to call an initialization function on a non-contract address."}],"RemovingWithNonZeroAddressFacet(address)":[{"notice":"Thrown when trying to remove function selectors with a non-zero facet address."}],"ReplacingFunctionByItself(address,bytes4)":[{"notice":"Thrown when trying to replace a function with itself (from the same facet)."}],"ZeroAddressTargetInitCallButNonEmptyData()":[{"notice":"Thrown when trying to call an initialization function with a zero address target and non-empty data."}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Emitted when at least a cut action is operated on the diamond."}},"kind":"user","methods":{"constructor":{"notice":"Add/replace/remove facet functions and execute a batch of functions with delegatecall."}},"version":1}}},"contracts/diamond/facets/DiamondCutFacet.sol":{"DiamondCutFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"EmptyFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"EmptyInitCallData","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionAlreadyPresent","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"InitCallReverted","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ModifyingImmutableFunction","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"NonContractFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"NonContractInitCallTarget","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"RemovingWithNonZeroAddressFacet","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ReplacingFunctionByItself","type":"error"},{"inputs":[],"name":"ZeroAddressTargetInitCallButNonEmptyData","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Initialization[]","name":"initializations","type":"tuple[]"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDiamondCutStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2535Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"EmptyFacet(address)":[{"params":{"facet":"The facet address."}}],"EmptyInitCallData(address)":[{"params":{"target":"The target address for the initialization call."}}],"FunctionAlreadyPresent(address,bytes4)":[{"params":{"facet":"The facet address which already has the function.","selector":"The function selector which has already been added."}}],"FunctionNotFound(bytes4)":[{"params":{"selector":"The function selector which has not been added."}}],"InitCallReverted(address,bytes)":[{"params":{"data":"The data for the initialization call.","target":"The target address for the initialization call."}}],"ModifyingImmutableFunction(bytes4)":[{"params":{"selector":"The function selector which is immutable."}}],"NonContractFacet(address)":[{"params":{"facet":"The facet address."}}],"NonContractInitCallTarget(address)":[{"params":{"target":"The target address for the initialization call."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"RemovingWithNonZeroAddressFacet(address)":[{"params":{"facet":"The facet address which is not zero."}}],"ReplacingFunctionByItself(address,bytes4)":[{"params":{"facet":"The facet address.","selector":"The function selector."}}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"params":{"cuts":"The list of facet addresses, actions and function selectors applied to the diamond.","data":"The encoded function call executed on `target`.","target":"The address of the contract where `data` was executed."}}},"kind":"dev","methods":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.","params":{"cuts":"The list of facet addresses, actions and function selectors to apply to the diamond.","initializations":"The list of addresses and encoded function calls to execute with delegatecall."}},"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.","params":{"cuts":"The list of facet addresses, actions and function selectors to apply to the diamond.","data":"The encoded function call to execute on `target`.","target":"The address of the contract to execute `data` on."}},"initDiamondCutStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"Diamond Cut (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f611a3b38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516119b990816100828239608051816107a00152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80631f931c1c1461004757806395bce666146100425763b2afc5b51461003d57600080fd5b61028b565b610167565b346100ed5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed5760043567ffffffffffffffff81116100ed576100969036906004016100f2565b61009e610123565b916044359267ffffffffffffffff84116100ed57366023850112156100ed5783600401359267ffffffffffffffff84116100ed5736602485870101116100ed5760246100eb95019261067f565b005b600080fd5b9181601f840112156100ed5782359167ffffffffffffffff83116100ed576020808501948460051b0101116100ed57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100ed57565b359073ffffffffffffffffffffffffffffffffffffffff821682036100ed57565b346100ed5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed576101c87fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b906108c9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa97fd99fc2a6dc4003b726ec29f9c219e331fc037417240f076ebbefa713ce97805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557fb2afc5b5000000000000000000000000000000000000000000000000000000006000527f468a201417dcc5a2c1967626f0705f2af2d7250be82f5af6c5ba8215df80ac7280549091169091179055005b346100ed5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed5760043567ffffffffffffffff81116100ed576102da9036906004016100f2565b906024359167ffffffffffffffff83116100ed576102ff6103579336906004016100f2565b93909261032e7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b7f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29236916104d9565b90610361846104c1565b9261036f6040519485610480565b848452602084019460051b8101903682116100ed5780955b828710610399576100eb868686610af9565b863567ffffffffffffffff81116100ed578201906040823603126100ed57604051916103c483610443565b6103cd81610146565b835260208101359067ffffffffffffffff82116100ed57019036601f830112156100ed57602092610405849336908581359101610648565b83820152815201960195610387565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761045f57604052565b610414565b6060810190811067ffffffffffffffff82111761045f57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761045f57604052565b67ffffffffffffffff811161045f5760051b60200190565b929190926104e6846104c1565b936104f46040519586610480565b602085828152019060051b8201918383116100ed5780915b83831061051a575050505050565b823567ffffffffffffffff81116100ed5782016060818703126100ed576040519061054482610464565b61054d81610146565b8252602081013560038110156100ed57602083015260408101359067ffffffffffffffff82116100ed570186601f820112156100ed57803561058e816104c1565b9161059c6040519384610480565b81835260208084019260051b820101908982116100ed57602001915b8183106105d557505050604082015281526020928301920161050c565b82357fffffffff00000000000000000000000000000000000000000000000000000000811681036100ed578152602092830192016105b8565b67ffffffffffffffff811161045f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926106548261060e565b916106626040519384610480565b8294818452818301116100ed578281602093846000960137010152565b91610760916107197f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739661071361070961074c98976106e07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b7f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29536916104d9565b9687923691610648565b92610baa565b6107238183610dc8565b73ffffffffffffffffffffffffffffffffffffffff604051958695606087526060870190610953565b921660208501528382036040850152610a57565b0390a1565b908160209103126100ed575180151581036100ed5790565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108ba5732331480156108bf575b6108ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610814575b5061081157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108b557600091610886575b5038610807565b6108a8915060203d6020116108ae575b6108a08183610480565b810190610765565b3861087f565b503d610896565b61077d565b503390565b50601836106107d0565b5473ffffffffffffffffffffffffffffffffffffffff918216911681036108ed5750565b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6003111561092457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9080602083519182815201916020808360051b8301019401926000915b83831061097f57505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528551606082019073ffffffffffffffffffffffffffffffffffffffff8151168352602081015190600382101561092457604060809160209384870152015193606060408201528451809452019201906000905b808210610a1d5750505060208060019297019301930191939290610970565b9091926020806001927fffffffff0000000000000000000000000000000000000000000000000000000087511681520194019201906109fe565b919082519283825260005b848110610aa15750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610a62565b8051821015610aca5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81610b0691939293610baa565b80519060005b828110610b67575050507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673906020610b4f60405192606084526060840190610953565b600082840152600083820391826040860152520190a1565b80610ba473ffffffffffffffffffffffffffffffffffffffff610b8c60019486610ab6565b5151166020610b9b8487610ab6565b51015190610dc8565b01610b0c565b6001810190610bc5610bbe835461ffff1690565b61ffff1690565b918260009460078516610d42575b80516000915b818310610c4d575050508303610c1b575b5060078216610bf857505050565b6002610c07610c189360031c90565b910190600052602052604060002090565b55565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff841617905538610bea565b909195610c5a8783610ab6565b519060408201515115610cdb576020820151610c758161091a565b610c7e8161091a565b80610c9e575090600198610c9292886116ea565b9790965b019190610bd9565b80610cae6001929a94939a61091a565b03610cc55790610cc060019288611473565b610c96565b600198610cd3929888610f1e565b979096610c96565b610d3e610cfc835173ffffffffffffffffffffffffffffffffffffffff1690565b7fb39ad1bb0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b6000fd5b9450610d64610d518560031c90565b6002850190600052602052604060002090565b5494610bd3565b3d15610d96573d90610d7c8261060e565b91610d8a6040519384610480565b82523d6000602084013e565b606090565b60409073ffffffffffffffffffffffffffffffffffffffff61081194931681528160208201520190610a57565b9073ffffffffffffffffffffffffffffffffffffffff821680610e195750905051610def57565b7fe694fd800000000000000000000000000000000000000000000000000000000060005260046000fd5b815115610eda573003610e90575b600080825160208401855af490610e3c610d6b565b9115610e4757505050565b8151928315610e57575050602001fd5b610e8c6040519283927fe83ddca500000000000000000000000000000000000000000000000000000000845260048401610d9b565b0390fd5b813b610e27577fdf3b7fa90000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff821660045260246000fd5b7ff2a214000000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260246000fd5b9091610f3e845173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811661143057506007610f668460031c90565b9316946000935b6040860151805186101561141957610f8886610fae92610ab6565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b92610fe58486907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b549761106b61105261104c611026888a907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff1690565b156113c957306110b061105261104c611026898b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b14611379578161134b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01936110f6856002860190600052602052604060002090565b54926007975b60006111b86111358761110f8d60051b90565b1b7fffffffff000000000000000000000000000000000000000000000000000000001690565b937fffffffff00000000000000000000000000000000000000000000000000000000851694897fffffffff000000000000000000000000000000000000000000000000000000008316870361129c575b9050907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b556111d460076111cc61ffff841660031c90565b921660051b90565b81881461126957906112339160028801937fffffffff0000000000000000000000000000000000000000000000000000000061121a848790600052602052604060002090565b5491831c921c1916179290600052602052604060002090565b555b8615611245575b60010193610f6d565b91506000611260856002860190600052602052604060002090565b5560009161123c565b9294917fffffffff000000000000000000000000000000000000000000000000000000009150831c921c19161791611235565b6113006112db6110268461134394907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b6bffffffffffffffffffffffff871617918b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b553889611185565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01979195909390916110fc565b7fc792bbba000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000851660045260246000fd5b7f5416eb98000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000851660045260246000fd5b5091959350935061142b915060031b90565b179190565b7f91a5e1a30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b815173ffffffffffffffffffffffffffffffffffffffff1691823b156116a657604001908151519160009073ffffffffffffffffffffffffffffffffffffffff8516907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b16925b8581106114ee5750505050505050565b6114fc610f88828451610ab6565b6115328187907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b548060601c80156116565730811461160657851461159c5790611595866bffffffffffffffffffffffff6001959416179188907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b55016114de565b7f73d5d7970000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff89166004527fffffffff00000000000000000000000000000000000000000000000000000000821660245260446000fd5b7fc792bbba000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b7f5416eb98000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b7f32185e020000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260246000fd5b8351929493919273ffffffffffffffffffffffffffffffffffffffff16308114158061197a575b6119375750906040810191825151906000935b8285106117345750505050509190565b9091929394611747610f88878451610ab6565b9761178461104c6110268b87907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff81166118ce575060e090827fffffffffffffffffffffffffffffffffffffffff00000000000000000000000061180e6117e68a5173ffffffffffffffffffffffffffffffffffffffff1690565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b16176118468b87907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b557fffffffff000000000000000000000000000000000000000000000000000000006118756007851660051b90565b9a168a1c907fffffffff000000000000000000000000000000000000000000000000000000008b1c19161798146118b7575b6001809101950193929190611724565b966118c5610d518960031c90565b556000966118a7565b7fbe33d1360000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff166004527fffffffff00000000000000000000000000000000000000000000000000000000891660245260446000fd5b7f32185e020000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b50803b1561171156fea264697066735822122031622bfe0380e62812491a937d3f47f8ff2f78cd3f6b17aa78e489d6efa7e49464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x1A3B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x19B9 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x7A0 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F931C1C EQ PUSH2 0x47 JUMPI DUP1 PUSH4 0x95BCE666 EQ PUSH2 0x42 JUMPI PUSH4 0xB2AFC5B5 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28B JUMP JUMPDEST PUSH2 0x167 JUMP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI PUSH2 0x96 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST PUSH2 0x9E PUSH2 0x123 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xED JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0xED JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xED JUMPI CALLDATASIZE PUSH1 0x24 DUP6 DUP8 ADD ADD GT PUSH2 0xED JUMPI PUSH1 0x24 PUSH2 0xEB SWAP6 ADD SWAP3 PUSH2 0x67F JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xED JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xED JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xED JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xED JUMPI JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xED JUMPI JUMP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH2 0x1C8 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST SWAP1 PUSH2 0x8C9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA97FD99FC2A6DC4003B726EC29F9C219E331FC037417240F076EBBEFA713CE97 DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0xB2AFC5B500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x468A201417DCC5A2C1967626F0705F2AF2D7250BE82F5AF6C5BA8215DF80AC72 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI PUSH2 0x2DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xED JUMPI PUSH2 0x2FF PUSH2 0x357 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH2 0x32E PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x4D9 JUMP JUMPDEST SWAP1 PUSH2 0x361 DUP5 PUSH2 0x4C1 JUMP JUMPDEST SWAP3 PUSH2 0x36F PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x480 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xED JUMPI DUP1 SWAP6 JUMPDEST DUP3 DUP8 LT PUSH2 0x399 JUMPI PUSH2 0xEB DUP7 DUP7 DUP7 PUSH2 0xAF9 JUMP JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI DUP3 ADD SWAP1 PUSH1 0x40 DUP3 CALLDATASIZE SUB SLT PUSH2 0xED JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x3C4 DUP4 PUSH2 0x443 JUMP JUMPDEST PUSH2 0x3CD DUP2 PUSH2 0x146 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xED JUMPI ADD SWAP1 CALLDATASIZE PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xED JUMPI PUSH1 0x20 SWAP3 PUSH2 0x405 DUP5 SWAP4 CALLDATASIZE SWAP1 DUP6 DUP2 CALLDATALOAD SWAP2 ADD PUSH2 0x648 JUMP JUMPDEST DUP4 DUP3 ADD MSTORE DUP2 MSTORE ADD SWAP7 ADD SWAP6 PUSH2 0x387 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x45F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH2 0x4E6 DUP5 PUSH2 0x4C1 JUMP JUMPDEST SWAP4 PUSH2 0x4F4 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x480 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP3 DUP2 MSTORE ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 DUP4 DUP4 GT PUSH2 0xED JUMPI DUP1 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x51A JUMPI POP POP POP POP POP JUMP JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI DUP3 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT PUSH2 0xED JUMPI PUSH1 0x40 MLOAD SWAP1 PUSH2 0x544 DUP3 PUSH2 0x464 JUMP JUMPDEST PUSH2 0x54D DUP2 PUSH2 0x146 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x3 DUP2 LT ISZERO PUSH2 0xED JUMPI PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xED JUMPI ADD DUP7 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xED JUMPI DUP1 CALLDATALOAD PUSH2 0x58E DUP2 PUSH2 0x4C1 JUMP JUMPDEST SWAP2 PUSH2 0x59C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP10 DUP3 GT PUSH2 0xED JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5D5 JUMPI POP POP POP PUSH1 0x40 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x50C JUMP JUMPDEST DUP3 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xED JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x5B8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x45F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x654 DUP3 PUSH2 0x60E JUMP JUMPDEST SWAP2 PUSH2 0x662 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xED JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP2 PUSH2 0x760 SWAP2 PUSH2 0x719 PUSH32 0x8FAA70878671CCD212D20771B795C50AF8FD3FF6CF27F4BDE57E5D4DE0AEB673 SWAP7 PUSH2 0x713 PUSH2 0x709 PUSH2 0x74C SWAP9 SWAP8 PUSH2 0x6E0 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x4D9 JUMP JUMPDEST SWAP7 DUP8 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x648 JUMP JUMPDEST SWAP3 PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x723 DUP2 DUP4 PUSH2 0xDC8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP6 PUSH1 0x60 DUP8 MSTORE PUSH1 0x60 DUP8 ADD SWAP1 PUSH2 0x953 JUMP JUMPDEST SWAP3 AND PUSH1 0x20 DUP6 ADD MSTORE DUP4 DUP3 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xA57 JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xED JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xED JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8BA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8BF JUMPI JUMPDEST PUSH2 0x8BA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x814 JUMPI JUMPDEST POP PUSH2 0x811 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8B5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x886 JUMPI JUMPDEST POP CODESIZE PUSH2 0x807 JUMP JUMPDEST PUSH2 0x8A8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8AE JUMPI JUMPDEST PUSH2 0x8A0 DUP2 DUP4 PUSH2 0x480 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x765 JUMP JUMPDEST CODESIZE PUSH2 0x87F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x896 JUMP JUMPDEST PUSH2 0x77D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7D0 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND DUP2 SUB PUSH2 0x8ED JUMPI POP JUMP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x924 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP2 DUP3 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x97F JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE DUP6 MLOAD PUSH1 0x60 DUP3 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND DUP4 MSTORE PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x924 JUMPI PUSH1 0x40 PUSH1 0x80 SWAP2 PUSH1 0x20 SWAP4 DUP5 DUP8 ADD MSTORE ADD MLOAD SWAP4 PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0xA1D JUMPI POP POP POP PUSH1 0x20 DUP1 PUSH1 0x1 SWAP3 SWAP8 ADD SWAP4 ADD SWAP4 ADD SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x970 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH1 0x20 DUP1 PUSH1 0x1 SWAP3 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 MLOAD AND DUP2 MSTORE ADD SWAP5 ADD SWAP3 ADD SWAP1 PUSH2 0x9FE JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xAA1 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xA62 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xACA JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH2 0xB06 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0xBAA JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xB67 JUMPI POP POP POP PUSH32 0x8FAA70878671CCD212D20771B795C50AF8FD3FF6CF27F4BDE57E5D4DE0AEB673 SWAP1 PUSH1 0x20 PUSH2 0xB4F PUSH1 0x40 MLOAD SWAP3 PUSH1 0x60 DUP5 MSTORE PUSH1 0x60 DUP5 ADD SWAP1 PUSH2 0x953 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 ADD MSTORE PUSH1 0x0 DUP4 DUP3 SUB SWAP2 DUP3 PUSH1 0x40 DUP7 ADD MSTORE MSTORE ADD SWAP1 LOG1 JUMP JUMPDEST DUP1 PUSH2 0xBA4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB8C PUSH1 0x1 SWAP5 DUP7 PUSH2 0xAB6 JUMP JUMPDEST MLOAD MLOAD AND PUSH1 0x20 PUSH2 0xB9B DUP5 DUP8 PUSH2 0xAB6 JUMP JUMPDEST MLOAD ADD MLOAD SWAP1 PUSH2 0xDC8 JUMP JUMPDEST ADD PUSH2 0xB0C JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SWAP1 PUSH2 0xBC5 PUSH2 0xBBE DUP4 SLOAD PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP2 DUP3 PUSH1 0x0 SWAP5 PUSH1 0x7 DUP6 AND PUSH2 0xD42 JUMPI JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xC4D JUMPI POP POP POP DUP4 SUB PUSH2 0xC1B JUMPI JUMPDEST POP PUSH1 0x7 DUP3 AND PUSH2 0xBF8 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH2 0xC07 PUSH2 0xC18 SWAP4 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMP JUMPDEST DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 AND PUSH2 0xFFFF DUP5 AND OR SWAP1 SSTORE CODESIZE PUSH2 0xBEA JUMP JUMPDEST SWAP1 SWAP2 SWAP6 PUSH2 0xC5A DUP8 DUP4 PUSH2 0xAB6 JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x40 DUP3 ADD MLOAD MLOAD ISZERO PUSH2 0xCDB JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0xC75 DUP2 PUSH2 0x91A JUMP JUMPDEST PUSH2 0xC7E DUP2 PUSH2 0x91A JUMP JUMPDEST DUP1 PUSH2 0xC9E JUMPI POP SWAP1 PUSH1 0x1 SWAP9 PUSH2 0xC92 SWAP3 DUP9 PUSH2 0x16EA JUMP JUMPDEST SWAP8 SWAP1 SWAP7 JUMPDEST ADD SWAP2 SWAP1 PUSH2 0xBD9 JUMP JUMPDEST DUP1 PUSH2 0xCAE PUSH1 0x1 SWAP3 SWAP11 SWAP5 SWAP4 SWAP11 PUSH2 0x91A JUMP JUMPDEST SUB PUSH2 0xCC5 JUMPI SWAP1 PUSH2 0xCC0 PUSH1 0x1 SWAP3 DUP9 PUSH2 0x1473 JUMP JUMPDEST PUSH2 0xC96 JUMP JUMPDEST PUSH1 0x1 SWAP9 PUSH2 0xCD3 SWAP3 SWAP9 DUP9 PUSH2 0xF1E JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH2 0xC96 JUMP JUMPDEST PUSH2 0xD3E PUSH2 0xCFC DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xB39AD1BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 SWAP1 JUMP JUMPDEST PUSH1 0x0 REVERT JUMPDEST SWAP5 POP PUSH2 0xD64 PUSH2 0xD51 DUP6 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP6 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP5 PUSH2 0xBD3 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0xD96 JUMPI RETURNDATASIZE SWAP1 PUSH2 0xD7C DUP3 PUSH2 0x60E JUMP JUMPDEST SWAP2 PUSH2 0xD8A PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x811 SWAP5 SWAP4 AND DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0xA57 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 PUSH2 0xE19 JUMPI POP SWAP1 POP MLOAD PUSH2 0xDEF JUMPI JUMP JUMPDEST PUSH32 0xE694FD8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xEDA JUMPI ADDRESS SUB PUSH2 0xE90 JUMPI JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL SWAP1 PUSH2 0xE3C PUSH2 0xD6B JUMP JUMPDEST SWAP2 ISZERO PUSH2 0xE47 JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD SWAP3 DUP4 ISZERO PUSH2 0xE57 JUMPI POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0xE8C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH32 0xE83DDCA500000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0xD9B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE27 JUMPI PUSH32 0xDF3B7FA900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xF2A2140000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH2 0xF3E DUP5 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1430 JUMPI POP PUSH1 0x7 PUSH2 0xF66 DUP5 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP4 AND SWAP5 PUSH1 0x0 SWAP4 JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD DUP1 MLOAD DUP7 LT ISZERO PUSH2 0x1419 JUMPI PUSH2 0xF88 DUP7 PUSH2 0xFAE SWAP3 PUSH2 0xAB6 JUMP JUMPDEST MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0xFE5 DUP5 DUP7 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP8 PUSH2 0x106B PUSH2 0x1052 PUSH2 0x104C PUSH2 0x1026 DUP9 DUP11 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x13C9 JUMPI ADDRESS PUSH2 0x10B0 PUSH2 0x1052 PUSH2 0x104C PUSH2 0x1026 DUP10 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST EQ PUSH2 0x1379 JUMPI DUP2 PUSH2 0x134B JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP4 PUSH2 0x10F6 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP3 PUSH1 0x7 SWAP8 JUMPDEST PUSH1 0x0 PUSH2 0x11B8 PUSH2 0x1135 DUP8 PUSH2 0x110F DUP14 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST SWAP4 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND SWAP5 DUP10 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND DUP8 SUB PUSH2 0x129C JUMPI JUMPDEST SWAP1 POP SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH2 0x11D4 PUSH1 0x7 PUSH2 0x11CC PUSH2 0xFFFF DUP5 AND PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP3 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST DUP2 DUP9 EQ PUSH2 0x1269 JUMPI SWAP1 PUSH2 0x1233 SWAP2 PUSH1 0x2 DUP9 ADD SWAP4 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x121A DUP5 DUP8 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP2 DUP4 SHR SWAP3 SHR NOT AND OR SWAP3 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMPDEST DUP7 ISZERO PUSH2 0x1245 JUMPI JUMPDEST PUSH1 0x1 ADD SWAP4 PUSH2 0xF6D JUMP JUMPDEST SWAP2 POP PUSH1 0x0 PUSH2 0x1260 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP2 PUSH2 0x123C JUMP JUMPDEST SWAP3 SWAP5 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 POP DUP4 SHR SWAP3 SHR NOT AND OR SWAP2 PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x1300 PUSH2 0x12DB PUSH2 0x1026 DUP5 PUSH2 0x1343 SWAP5 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND OR SWAP2 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE CODESIZE DUP10 PUSH2 0x1185 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP8 SWAP2 SWAP6 SWAP1 SWAP4 SWAP1 SWAP2 PUSH2 0x10FC JUMP JUMPDEST PUSH32 0xC792BBBA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP6 SWAP4 POP SWAP4 POP PUSH2 0x142B SWAP2 POP PUSH1 0x3 SHL SWAP1 JUMP JUMPDEST OR SWAP2 SWAP1 JUMP JUMPDEST PUSH32 0x91A5E1A300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x16A6 JUMPI PUSH1 0x40 ADD SWAP1 DUP2 MLOAD MLOAD SWAP2 PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP7 PUSH1 0x60 SHL AND SWAP3 JUMPDEST DUP6 DUP2 LT PUSH2 0x14EE JUMPI POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14FC PUSH2 0xF88 DUP3 DUP5 MLOAD PUSH2 0xAB6 JUMP JUMPDEST PUSH2 0x1532 DUP2 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD DUP1 PUSH1 0x60 SHR DUP1 ISZERO PUSH2 0x1656 JUMPI ADDRESS DUP2 EQ PUSH2 0x1606 JUMPI DUP6 EQ PUSH2 0x159C JUMPI SWAP1 PUSH2 0x1595 DUP7 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 SWAP6 SWAP5 AND OR SWAP2 DUP9 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE ADD PUSH2 0x14DE JUMP JUMPDEST PUSH32 0x73D5D79700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x4 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC792BBBA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x32185E0200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 MLOAD SWAP3 SWAP5 SWAP4 SWAP2 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS DUP2 EQ ISZERO DUP1 PUSH2 0x197A JUMPI JUMPDEST PUSH2 0x1937 JUMPI POP SWAP1 PUSH1 0x40 DUP2 ADD SWAP2 DUP3 MLOAD MLOAD SWAP1 PUSH1 0x0 SWAP4 JUMPDEST DUP3 DUP6 LT PUSH2 0x1734 JUMPI POP POP POP POP POP SWAP2 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x1747 PUSH2 0xF88 DUP8 DUP5 MLOAD PUSH2 0xAB6 JUMP JUMPDEST SWAP8 PUSH2 0x1784 PUSH2 0x104C PUSH2 0x1026 DUP12 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x18CE JUMPI POP PUSH1 0xE0 SWAP1 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 PUSH2 0x180E PUSH2 0x17E6 DUP11 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST AND OR PUSH2 0x1846 DUP12 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1875 PUSH1 0x7 DUP6 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SWAP11 AND DUP11 SHR SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP12 SHR NOT AND OR SWAP9 EQ PUSH2 0x18B7 JUMPI JUMPDEST PUSH1 0x1 DUP1 SWAP2 ADD SWAP6 ADD SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1724 JUMP JUMPDEST SWAP7 PUSH2 0x18C5 PUSH2 0xD51 DUP10 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP7 PUSH2 0x18A7 JUMP JUMPDEST PUSH32 0xBE33D13600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP10 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x32185E0200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1711 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BALANCE PUSH3 0x2BFE03 DUP1 DUPN 0x28 SLT BLOBHASH BYTE SWAP4 PUSH30 0x3F47F8FF2F78CD3F6B17AA78E489D6EFA7E49464736F6C634300081E0033 ","sourceMap":"807:1380:49:-:0;;;;;;;;;;;;;-1:-1:-1;;807:1380:49;;;;-1:-1:-1;;;;;807:1380:49;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;807:1380:49;;;;;;745:39:76;;807:1380:49;;;;;;;;745:39:76;807:1380:49;;;;;;;-1:-1:-1;807:1380:49;;;;;;-1:-1:-1;807:1380:49;;;;;-1:-1:-1;807:1380:49"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":326,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_address_4905":{"entryPoint":291,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_struct_FacetCut_calldata_dyn_calldata":{"entryPoint":242,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_struct_FacetCut_dyn":{"entryPoint":1241,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":1608,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":1893,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_bytes":{"entryPoint":3483,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_struct_FacetCut_dyn":{"entryPoint":2387,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":2647,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_struct_FacetCut_dyn":{"entryPoint":1217,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":1550,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_address_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes20_to_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes32_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"external_fun_diamondCut":{"entryPoint":651,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_initDiamondCutStorage":{"entryPoint":359,"id":null,"parameterSlots":0,"returnSlots":0},"extract_from_storage_value_offset_uint16":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_returndata":{"entryPoint":3435,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":1152,"id":null,"parameterSlots":2,"returnSlots":0},"finalize_allocation_4909":{"entryPoint":1091,"id":null,"parameterSlots":1,"returnSlots":0},"finalize_allocation_4911":{"entryPoint":1124,"id":null,"parameterSlots":1,"returnSlots":0},"fun_addFacetSelectors":{"entryPoint":5866,"id":10506,"parameterSlots":4,"returnSlots":2},"fun_cutFacets":{"entryPoint":2986,"id":10348,"parameterSlots":2,"returnSlots":0},"fun_diamondCut":{"entryPoint":1663,"id":9731,"parameterSlots":5,"returnSlots":0},"fun_diamondCut_10197":{"entryPoint":2809,"id":10197,"parameterSlots":3,"returnSlots":0},"fun_enforceIsProxyAdmin":{"entryPoint":2249,"id":19464,"parameterSlots":2,"returnSlots":0},"fun_hasBytecode":{"entryPoint":null,"id":38034,"parameterSlots":1,"returnSlots":1},"fun_initializationCall":{"entryPoint":3528,"id":10999,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":1929,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_removeFacetSelectors":{"entryPoint":3870,"id":10805,"parameterSlots":4,"returnSlots":2},"fun_replaceFacetSelectors":{"entryPoint":5235,"id":10918,"parameterSlots":2,"returnSlots":0},"mapping_index_access_mapping_bytes4_bool_of_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"mapping_index_access_mapping_uint256_bytes32_of_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"memory_array_index_access_struct_Initialization_dyn":{"entryPoint":2742,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x41":{"entryPoint":1044,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_memoryt_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"revert_forward":{"entryPoint":1917,"id":null,"parameterSlots":0,"returnSlots":0},"shift_left_t_uint256_t_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_left_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_right_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"update_storage_value_offset_uint16_to_uint16":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"validator_assert_enum_FacetCutAction":{"entryPoint":2330,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1952}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80631f931c1c1461004757806395bce666146100425763b2afc5b51461003d57600080fd5b61028b565b610167565b346100ed5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed5760043567ffffffffffffffff81116100ed576100969036906004016100f2565b61009e610123565b916044359267ffffffffffffffff84116100ed57366023850112156100ed5783600401359267ffffffffffffffff84116100ed5736602485870101116100ed5760246100eb95019261067f565b005b600080fd5b9181601f840112156100ed5782359167ffffffffffffffff83116100ed576020808501948460051b0101116100ed57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100ed57565b359073ffffffffffffffffffffffffffffffffffffffff821682036100ed57565b346100ed5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed576101c87fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b906108c9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa97fd99fc2a6dc4003b726ec29f9c219e331fc037417240f076ebbefa713ce97805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557fb2afc5b5000000000000000000000000000000000000000000000000000000006000527f468a201417dcc5a2c1967626f0705f2af2d7250be82f5af6c5ba8215df80ac7280549091169091179055005b346100ed5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ed5760043567ffffffffffffffff81116100ed576102da9036906004016100f2565b906024359167ffffffffffffffff83116100ed576102ff6103579336906004016100f2565b93909261032e7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b7f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29236916104d9565b90610361846104c1565b9261036f6040519485610480565b848452602084019460051b8101903682116100ed5780955b828710610399576100eb868686610af9565b863567ffffffffffffffff81116100ed578201906040823603126100ed57604051916103c483610443565b6103cd81610146565b835260208101359067ffffffffffffffff82116100ed57019036601f830112156100ed57602092610405849336908581359101610648565b83820152815201960195610387565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761045f57604052565b610414565b6060810190811067ffffffffffffffff82111761045f57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761045f57604052565b67ffffffffffffffff811161045f5760051b60200190565b929190926104e6846104c1565b936104f46040519586610480565b602085828152019060051b8201918383116100ed5780915b83831061051a575050505050565b823567ffffffffffffffff81116100ed5782016060818703126100ed576040519061054482610464565b61054d81610146565b8252602081013560038110156100ed57602083015260408101359067ffffffffffffffff82116100ed570186601f820112156100ed57803561058e816104c1565b9161059c6040519384610480565b81835260208084019260051b820101908982116100ed57602001915b8183106105d557505050604082015281526020928301920161050c565b82357fffffffff00000000000000000000000000000000000000000000000000000000811681036100ed578152602092830192016105b8565b67ffffffffffffffff811161045f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926106548261060e565b916106626040519384610480565b8294818452818301116100ed578281602093846000960137010152565b91610760916107197f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739661071361070961074c98976106e07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036101c2610789565b7f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29536916104d9565b9687923691610648565b92610baa565b6107238183610dc8565b73ffffffffffffffffffffffffffffffffffffffff604051958695606087526060870190610953565b921660208501528382036040850152610a57565b0390a1565b908160209103126100ed575180151581036100ed5790565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108ba5732331480156108bf575b6108ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610814575b5061081157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108b557600091610886575b5038610807565b6108a8915060203d6020116108ae575b6108a08183610480565b810190610765565b3861087f565b503d610896565b61077d565b503390565b50601836106107d0565b5473ffffffffffffffffffffffffffffffffffffffff918216911681036108ed5750565b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6003111561092457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9080602083519182815201916020808360051b8301019401926000915b83831061097f57505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528551606082019073ffffffffffffffffffffffffffffffffffffffff8151168352602081015190600382101561092457604060809160209384870152015193606060408201528451809452019201906000905b808210610a1d5750505060208060019297019301930191939290610970565b9091926020806001927fffffffff0000000000000000000000000000000000000000000000000000000087511681520194019201906109fe565b919082519283825260005b848110610aa15750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610a62565b8051821015610aca5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81610b0691939293610baa565b80519060005b828110610b67575050507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673906020610b4f60405192606084526060840190610953565b600082840152600083820391826040860152520190a1565b80610ba473ffffffffffffffffffffffffffffffffffffffff610b8c60019486610ab6565b5151166020610b9b8487610ab6565b51015190610dc8565b01610b0c565b6001810190610bc5610bbe835461ffff1690565b61ffff1690565b918260009460078516610d42575b80516000915b818310610c4d575050508303610c1b575b5060078216610bf857505050565b6002610c07610c189360031c90565b910190600052602052604060002090565b55565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff841617905538610bea565b909195610c5a8783610ab6565b519060408201515115610cdb576020820151610c758161091a565b610c7e8161091a565b80610c9e575090600198610c9292886116ea565b9790965b019190610bd9565b80610cae6001929a94939a61091a565b03610cc55790610cc060019288611473565b610c96565b600198610cd3929888610f1e565b979096610c96565b610d3e610cfc835173ffffffffffffffffffffffffffffffffffffffff1690565b7fb39ad1bb0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b6000fd5b9450610d64610d518560031c90565b6002850190600052602052604060002090565b5494610bd3565b3d15610d96573d90610d7c8261060e565b91610d8a6040519384610480565b82523d6000602084013e565b606090565b60409073ffffffffffffffffffffffffffffffffffffffff61081194931681528160208201520190610a57565b9073ffffffffffffffffffffffffffffffffffffffff821680610e195750905051610def57565b7fe694fd800000000000000000000000000000000000000000000000000000000060005260046000fd5b815115610eda573003610e90575b600080825160208401855af490610e3c610d6b565b9115610e4757505050565b8151928315610e57575050602001fd5b610e8c6040519283927fe83ddca500000000000000000000000000000000000000000000000000000000845260048401610d9b565b0390fd5b813b610e27577fdf3b7fa90000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff821660045260246000fd5b7ff2a214000000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260246000fd5b9091610f3e845173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811661143057506007610f668460031c90565b9316946000935b6040860151805186101561141957610f8886610fae92610ab6565b517fffffffff000000000000000000000000000000000000000000000000000000001690565b92610fe58486907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b549761106b61105261104c611026888a907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff1690565b156113c957306110b061105261104c611026898b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b14611379578161134b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01936110f6856002860190600052602052604060002090565b54926007975b60006111b86111358761110f8d60051b90565b1b7fffffffff000000000000000000000000000000000000000000000000000000001690565b937fffffffff00000000000000000000000000000000000000000000000000000000851694897fffffffff000000000000000000000000000000000000000000000000000000008316870361129c575b9050907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b556111d460076111cc61ffff841660031c90565b921660051b90565b81881461126957906112339160028801937fffffffff0000000000000000000000000000000000000000000000000000000061121a848790600052602052604060002090565b5491831c921c1916179290600052602052604060002090565b555b8615611245575b60010193610f6d565b91506000611260856002860190600052602052604060002090565b5560009161123c565b9294917fffffffff000000000000000000000000000000000000000000000000000000009150831c921c19161791611235565b6113006112db6110268461134394907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b6bffffffffffffffffffffffff871617918b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b553889611185565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01979195909390916110fc565b7fc792bbba000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000851660045260246000fd5b7f5416eb98000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000851660045260246000fd5b5091959350935061142b915060031b90565b179190565b7f91a5e1a30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b815173ffffffffffffffffffffffffffffffffffffffff1691823b156116a657604001908151519160009073ffffffffffffffffffffffffffffffffffffffff8516907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b16925b8581106114ee5750505050505050565b6114fc610f88828451610ab6565b6115328187907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b548060601c80156116565730811461160657851461159c5790611595866bffffffffffffffffffffffff6001959416179188907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b55016114de565b7f73d5d7970000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff89166004527fffffffff00000000000000000000000000000000000000000000000000000000821660245260446000fd5b7fc792bbba000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b7f5416eb98000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b7f32185e020000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260246000fd5b8351929493919273ffffffffffffffffffffffffffffffffffffffff16308114158061197a575b6119375750906040810191825151906000935b8285106117345750505050509190565b9091929394611747610f88878451610ab6565b9761178461104c6110268b87907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff81166118ce575060e090827fffffffffffffffffffffffffffffffffffffffff00000000000000000000000061180e6117e68a5173ffffffffffffffffffffffffffffffffffffffff1690565b60601b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b16176118468b87907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b557fffffffff000000000000000000000000000000000000000000000000000000006118756007851660051b90565b9a168a1c907fffffffff000000000000000000000000000000000000000000000000000000008b1c19161798146118b7575b6001809101950193929190611724565b966118c5610d518960031c90565b556000966118a7565b7fbe33d1360000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff166004527fffffffff00000000000000000000000000000000000000000000000000000000891660245260446000fd5b7f32185e020000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b50803b1561171156fea264697066735822122031622bfe0380e62812491a937d3f47f8ff2f78cd3f6b17aa78e489d6efa7e49464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F931C1C EQ PUSH2 0x47 JUMPI DUP1 PUSH4 0x95BCE666 EQ PUSH2 0x42 JUMPI PUSH4 0xB2AFC5B5 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x28B JUMP JUMPDEST PUSH2 0x167 JUMP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI PUSH2 0x96 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST PUSH2 0x9E PUSH2 0x123 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xED JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0xED JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xED JUMPI CALLDATASIZE PUSH1 0x24 DUP6 DUP8 ADD ADD GT PUSH2 0xED JUMPI PUSH1 0x24 PUSH2 0xEB SWAP6 ADD SWAP3 PUSH2 0x67F JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xED JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xED JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xED JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xED JUMPI JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xED JUMPI JUMP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH2 0x1C8 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST SWAP1 PUSH2 0x8C9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA97FD99FC2A6DC4003B726EC29F9C219E331FC037417240F076EBBEFA713CE97 DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0xB2AFC5B500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x468A201417DCC5A2C1967626F0705F2AF2D7250BE82F5AF6C5BA8215DF80AC72 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST CALLVALUE PUSH2 0xED JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xED JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI PUSH2 0x2DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xED JUMPI PUSH2 0x2FF PUSH2 0x357 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xF2 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH2 0x32E PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x4D9 JUMP JUMPDEST SWAP1 PUSH2 0x361 DUP5 PUSH2 0x4C1 JUMP JUMPDEST SWAP3 PUSH2 0x36F PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x480 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xED JUMPI DUP1 SWAP6 JUMPDEST DUP3 DUP8 LT PUSH2 0x399 JUMPI PUSH2 0xEB DUP7 DUP7 DUP7 PUSH2 0xAF9 JUMP JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI DUP3 ADD SWAP1 PUSH1 0x40 DUP3 CALLDATASIZE SUB SLT PUSH2 0xED JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x3C4 DUP4 PUSH2 0x443 JUMP JUMPDEST PUSH2 0x3CD DUP2 PUSH2 0x146 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xED JUMPI ADD SWAP1 CALLDATASIZE PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xED JUMPI PUSH1 0x20 SWAP3 PUSH2 0x405 DUP5 SWAP4 CALLDATASIZE SWAP1 DUP6 DUP2 CALLDATALOAD SWAP2 ADD PUSH2 0x648 JUMP JUMPDEST DUP4 DUP3 ADD MSTORE DUP2 MSTORE ADD SWAP7 ADD SWAP6 PUSH2 0x387 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x45F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x45F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH2 0x4E6 DUP5 PUSH2 0x4C1 JUMP JUMPDEST SWAP4 PUSH2 0x4F4 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x480 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP3 DUP2 MSTORE ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 DUP4 DUP4 GT PUSH2 0xED JUMPI DUP1 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x51A JUMPI POP POP POP POP POP JUMP JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xED JUMPI DUP3 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT PUSH2 0xED JUMPI PUSH1 0x40 MLOAD SWAP1 PUSH2 0x544 DUP3 PUSH2 0x464 JUMP JUMPDEST PUSH2 0x54D DUP2 PUSH2 0x146 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0x3 DUP2 LT ISZERO PUSH2 0xED JUMPI PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xED JUMPI ADD DUP7 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xED JUMPI DUP1 CALLDATALOAD PUSH2 0x58E DUP2 PUSH2 0x4C1 JUMP JUMPDEST SWAP2 PUSH2 0x59C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP10 DUP3 GT PUSH2 0xED JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5D5 JUMPI POP POP POP PUSH1 0x40 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x50C JUMP JUMPDEST DUP3 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xED JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x5B8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x45F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x654 DUP3 PUSH2 0x60E JUMP JUMPDEST SWAP2 PUSH2 0x662 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xED JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP2 PUSH2 0x760 SWAP2 PUSH2 0x719 PUSH32 0x8FAA70878671CCD212D20771B795C50AF8FD3FF6CF27F4BDE57E5D4DE0AEB673 SWAP7 PUSH2 0x713 PUSH2 0x709 PUSH2 0x74C SWAP9 SWAP8 PUSH2 0x6E0 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x1C2 PUSH2 0x789 JUMP JUMPDEST PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x4D9 JUMP JUMPDEST SWAP7 DUP8 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x648 JUMP JUMPDEST SWAP3 PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x723 DUP2 DUP4 PUSH2 0xDC8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP6 PUSH1 0x60 DUP8 MSTORE PUSH1 0x60 DUP8 ADD SWAP1 PUSH2 0x953 JUMP JUMPDEST SWAP3 AND PUSH1 0x20 DUP6 ADD MSTORE DUP4 DUP3 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xA57 JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xED JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xED JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8BA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8BF JUMPI JUMPDEST PUSH2 0x8BA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x814 JUMPI JUMPDEST POP PUSH2 0x811 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8B5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x886 JUMPI JUMPDEST POP CODESIZE PUSH2 0x807 JUMP JUMPDEST PUSH2 0x8A8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8AE JUMPI JUMPDEST PUSH2 0x8A0 DUP2 DUP4 PUSH2 0x480 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x765 JUMP JUMPDEST CODESIZE PUSH2 0x87F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x896 JUMP JUMPDEST PUSH2 0x77D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7D0 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND DUP2 SUB PUSH2 0x8ED JUMPI POP JUMP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x924 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP2 DUP3 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x97F JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE DUP6 MLOAD PUSH1 0x60 DUP3 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND DUP4 MSTORE PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x924 JUMPI PUSH1 0x40 PUSH1 0x80 SWAP2 PUSH1 0x20 SWAP4 DUP5 DUP8 ADD MSTORE ADD MLOAD SWAP4 PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0xA1D JUMPI POP POP POP PUSH1 0x20 DUP1 PUSH1 0x1 SWAP3 SWAP8 ADD SWAP4 ADD SWAP4 ADD SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x970 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH1 0x20 DUP1 PUSH1 0x1 SWAP3 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP8 MLOAD AND DUP2 MSTORE ADD SWAP5 ADD SWAP3 ADD SWAP1 PUSH2 0x9FE JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xAA1 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xA62 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xACA JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH2 0xB06 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0xBAA JUMP JUMPDEST DUP1 MLOAD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xB67 JUMPI POP POP POP PUSH32 0x8FAA70878671CCD212D20771B795C50AF8FD3FF6CF27F4BDE57E5D4DE0AEB673 SWAP1 PUSH1 0x20 PUSH2 0xB4F PUSH1 0x40 MLOAD SWAP3 PUSH1 0x60 DUP5 MSTORE PUSH1 0x60 DUP5 ADD SWAP1 PUSH2 0x953 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 ADD MSTORE PUSH1 0x0 DUP4 DUP3 SUB SWAP2 DUP3 PUSH1 0x40 DUP7 ADD MSTORE MSTORE ADD SWAP1 LOG1 JUMP JUMPDEST DUP1 PUSH2 0xBA4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB8C PUSH1 0x1 SWAP5 DUP7 PUSH2 0xAB6 JUMP JUMPDEST MLOAD MLOAD AND PUSH1 0x20 PUSH2 0xB9B DUP5 DUP8 PUSH2 0xAB6 JUMP JUMPDEST MLOAD ADD MLOAD SWAP1 PUSH2 0xDC8 JUMP JUMPDEST ADD PUSH2 0xB0C JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SWAP1 PUSH2 0xBC5 PUSH2 0xBBE DUP4 SLOAD PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP2 DUP3 PUSH1 0x0 SWAP5 PUSH1 0x7 DUP6 AND PUSH2 0xD42 JUMPI JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xC4D JUMPI POP POP POP DUP4 SUB PUSH2 0xC1B JUMPI JUMPDEST POP PUSH1 0x7 DUP3 AND PUSH2 0xBF8 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH2 0xC07 PUSH2 0xC18 SWAP4 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMP JUMPDEST DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 AND PUSH2 0xFFFF DUP5 AND OR SWAP1 SSTORE CODESIZE PUSH2 0xBEA JUMP JUMPDEST SWAP1 SWAP2 SWAP6 PUSH2 0xC5A DUP8 DUP4 PUSH2 0xAB6 JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x40 DUP3 ADD MLOAD MLOAD ISZERO PUSH2 0xCDB JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0xC75 DUP2 PUSH2 0x91A JUMP JUMPDEST PUSH2 0xC7E DUP2 PUSH2 0x91A JUMP JUMPDEST DUP1 PUSH2 0xC9E JUMPI POP SWAP1 PUSH1 0x1 SWAP9 PUSH2 0xC92 SWAP3 DUP9 PUSH2 0x16EA JUMP JUMPDEST SWAP8 SWAP1 SWAP7 JUMPDEST ADD SWAP2 SWAP1 PUSH2 0xBD9 JUMP JUMPDEST DUP1 PUSH2 0xCAE PUSH1 0x1 SWAP3 SWAP11 SWAP5 SWAP4 SWAP11 PUSH2 0x91A JUMP JUMPDEST SUB PUSH2 0xCC5 JUMPI SWAP1 PUSH2 0xCC0 PUSH1 0x1 SWAP3 DUP9 PUSH2 0x1473 JUMP JUMPDEST PUSH2 0xC96 JUMP JUMPDEST PUSH1 0x1 SWAP9 PUSH2 0xCD3 SWAP3 SWAP9 DUP9 PUSH2 0xF1E JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH2 0xC96 JUMP JUMPDEST PUSH2 0xD3E PUSH2 0xCFC DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xB39AD1BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 SWAP1 JUMP JUMPDEST PUSH1 0x0 REVERT JUMPDEST SWAP5 POP PUSH2 0xD64 PUSH2 0xD51 DUP6 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP6 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP5 PUSH2 0xBD3 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0xD96 JUMPI RETURNDATASIZE SWAP1 PUSH2 0xD7C DUP3 PUSH2 0x60E JUMP JUMPDEST SWAP2 PUSH2 0xD8A PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x480 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x811 SWAP5 SWAP4 AND DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0xA57 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 PUSH2 0xE19 JUMPI POP SWAP1 POP MLOAD PUSH2 0xDEF JUMPI JUMP JUMPDEST PUSH32 0xE694FD8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xEDA JUMPI ADDRESS SUB PUSH2 0xE90 JUMPI JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL SWAP1 PUSH2 0xE3C PUSH2 0xD6B JUMP JUMPDEST SWAP2 ISZERO PUSH2 0xE47 JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD SWAP3 DUP4 ISZERO PUSH2 0xE57 JUMPI POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0xE8C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH32 0xE83DDCA500000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0xD9B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE27 JUMPI PUSH32 0xDF3B7FA900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xF2A2140000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH2 0xF3E DUP5 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1430 JUMPI POP PUSH1 0x7 PUSH2 0xF66 DUP5 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP4 AND SWAP5 PUSH1 0x0 SWAP4 JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD DUP1 MLOAD DUP7 LT ISZERO PUSH2 0x1419 JUMPI PUSH2 0xF88 DUP7 PUSH2 0xFAE SWAP3 PUSH2 0xAB6 JUMP JUMPDEST MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0xFE5 DUP5 DUP7 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP8 PUSH2 0x106B PUSH2 0x1052 PUSH2 0x104C PUSH2 0x1026 DUP9 DUP11 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x13C9 JUMPI ADDRESS PUSH2 0x10B0 PUSH2 0x1052 PUSH2 0x104C PUSH2 0x1026 DUP10 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST EQ PUSH2 0x1379 JUMPI DUP2 PUSH2 0x134B JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP4 PUSH2 0x10F6 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP3 PUSH1 0x7 SWAP8 JUMPDEST PUSH1 0x0 PUSH2 0x11B8 PUSH2 0x1135 DUP8 PUSH2 0x110F DUP14 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST SWAP4 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND SWAP5 DUP10 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND DUP8 SUB PUSH2 0x129C JUMPI JUMPDEST SWAP1 POP SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH2 0x11D4 PUSH1 0x7 PUSH2 0x11CC PUSH2 0xFFFF DUP5 AND PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP3 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST DUP2 DUP9 EQ PUSH2 0x1269 JUMPI SWAP1 PUSH2 0x1233 SWAP2 PUSH1 0x2 DUP9 ADD SWAP4 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x121A DUP5 DUP8 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP2 DUP4 SHR SWAP3 SHR NOT AND OR SWAP3 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMPDEST DUP7 ISZERO PUSH2 0x1245 JUMPI JUMPDEST PUSH1 0x1 ADD SWAP4 PUSH2 0xF6D JUMP JUMPDEST SWAP2 POP PUSH1 0x0 PUSH2 0x1260 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP2 PUSH2 0x123C JUMP JUMPDEST SWAP3 SWAP5 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 POP DUP4 SHR SWAP3 SHR NOT AND OR SWAP2 PUSH2 0x1235 JUMP JUMPDEST PUSH2 0x1300 PUSH2 0x12DB PUSH2 0x1026 DUP5 PUSH2 0x1343 SWAP5 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND OR SWAP2 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE CODESIZE DUP10 PUSH2 0x1185 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP8 SWAP2 SWAP6 SWAP1 SWAP4 SWAP1 SWAP2 PUSH2 0x10FC JUMP JUMPDEST PUSH32 0xC792BBBA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP6 SWAP4 POP SWAP4 POP PUSH2 0x142B SWAP2 POP PUSH1 0x3 SHL SWAP1 JUMP JUMPDEST OR SWAP2 SWAP1 JUMP JUMPDEST PUSH32 0x91A5E1A300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x16A6 JUMPI PUSH1 0x40 ADD SWAP1 DUP2 MLOAD MLOAD SWAP2 PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP7 PUSH1 0x60 SHL AND SWAP3 JUMPDEST DUP6 DUP2 LT PUSH2 0x14EE JUMPI POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14FC PUSH2 0xF88 DUP3 DUP5 MLOAD PUSH2 0xAB6 JUMP JUMPDEST PUSH2 0x1532 DUP2 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD DUP1 PUSH1 0x60 SHR DUP1 ISZERO PUSH2 0x1656 JUMPI ADDRESS DUP2 EQ PUSH2 0x1606 JUMPI DUP6 EQ PUSH2 0x159C JUMPI SWAP1 PUSH2 0x1595 DUP7 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 SWAP6 SWAP5 AND OR SWAP2 DUP9 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE ADD PUSH2 0x14DE JUMP JUMPDEST PUSH32 0x73D5D79700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x4 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC792BBBA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x32185E0200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 MLOAD SWAP3 SWAP5 SWAP4 SWAP2 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS DUP2 EQ ISZERO DUP1 PUSH2 0x197A JUMPI JUMPDEST PUSH2 0x1937 JUMPI POP SWAP1 PUSH1 0x40 DUP2 ADD SWAP2 DUP3 MLOAD MLOAD SWAP1 PUSH1 0x0 SWAP4 JUMPDEST DUP3 DUP6 LT PUSH2 0x1734 JUMPI POP POP POP POP POP SWAP2 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x1747 PUSH2 0xF88 DUP8 DUP5 MLOAD PUSH2 0xAB6 JUMP JUMPDEST SWAP8 PUSH2 0x1784 PUSH2 0x104C PUSH2 0x1026 DUP12 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x18CE JUMPI POP PUSH1 0xE0 SWAP1 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 PUSH2 0x180E PUSH2 0x17E6 DUP11 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST AND OR PUSH2 0x1846 DUP12 DUP8 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1875 PUSH1 0x7 DUP6 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SWAP11 AND DUP11 SHR SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP12 SHR NOT AND OR SWAP9 EQ PUSH2 0x18B7 JUMPI JUMPDEST PUSH1 0x1 DUP1 SWAP2 ADD SWAP6 ADD SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1724 JUMP JUMPDEST SWAP7 PUSH2 0x18C5 PUSH2 0xD51 DUP10 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP7 PUSH2 0x18A7 JUMP JUMPDEST PUSH32 0xBE33D13600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP10 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x32185E0200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1711 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BALANCE PUSH3 0x2BFE03 DUP1 DUPN 0x28 SLT BLOBHASH BYTE SWAP4 PUSH30 0x3F47F8FF2F78CD3F6B17AA78E489D6EFA7E49464736F6C634300081E0033 ","sourceMap":"807:1380:49:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;1404:12;807:1380;1404:12;;:::i;:::-;;;:::i;:::-;807:1380;500:10:59;;;;;443:1;500:10;;;;;;;;;2397:38:54;-1:-1:-1;500:10:59;;;;;;;;;;;;807:1380:49;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;3324:19:180;;;2098:12:49;807:1380;2098:12;;:::i;:::-;807:1380;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;2121:57;;;;;:::i;807:1380::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;807:1380:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;807:1380:49;;;;;;:::o;1583:233::-;;807:1380;1583:233;2822:4:54;2884:30;1583:233:49;807:1380;;;1583:233;;1732:12;807:1380;1732:12;;:::i;:::-;807:1380;;;;;:::i;:::-;;;;;;;:::i;:::-;2822:4:54;;:::i;:::-;2864;;;;:::i;:::-;807:1380:49;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2884:30:54;;;1583:233:49:o;807:1380::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;807:1380:49;1029:19:76;807:1380:49;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;807:1380:49;;;1676:74:76;;807:1380:49;;;1676:74:76;;;807:1380:49;1327:10:76;807:1380:49;;;;1744:4:76;807:1380:49;;;;;-1:-1:-1;1676:74:76;;807:1380:49;;;;;;1676:74:76;;;;;;;807:1380:49;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;1323:95::-;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;3082:148:180;807:1380:49;;;;;;;3174:18:180;;3170:53;;3082:148;:::o;3170:53::-;3201:22;-1:-1:-1;3201:22:180;;807:1380:49;;-1:-1:-1;3201:22:180;807:1380:49;;-1:-1:-1;807:1380:49;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;807:1380:49;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;807:1380:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;807:1380:49;;;;;;;;;;;-1:-1:-1;807:1380:49;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;2927:379:54;;3061:4;2927:379;;;;3061:4;:::i;:::-;807:1380:49;;3130:9:54;-1:-1:-1;3141:10:54;;;;;;807:1380:49;;;3267:32:54;807:1380:49;3218:23:54;807:1380:49;;;;;;;;;;;;:::i;:::-;-1:-1:-1;807:1380:49;;;;-1:-1:-1;807:1380:49;;;;;;;;;;3267:32:54;;;2927:379::o;3153:3::-;3191:18;3218:23;807:1380:49;3191:18:54;807:1380:49;3191:18:54;;;:::i;:::-;;807:1380:49;;3218:23:54;:18;;;;:::i;:::-;;:23;;;;:::i;:::-;807:1380:49;3130:9:54;;3312:1399;3429:15;;;807:1380:49;3397:47:54;807:1380:49;;;;;;;;;;;;3397:47:54;;;-1:-1:-1;3595:17:54;3611:1;3595:17;;3591:139;;3312:1399;807:1380:49;;-1:-1:-1;3783:647:54;3799:10;;;;;;4444:38;;;;;4440:108;;3783:647;4607:17;3611:1;4607:17;;4603:102;;3312:1399;;;:::o;4603:102::-;4644:15;4660:18;4644:35;4660:18;807:1380:49;;;;4660:18:54;4644:15;;807:1380:49;;;;;;;;;;4644:35:54;807:1380:49;3312:1399:54:o;4440:108::-;807:1380:49;;;;;;;;;;4440:108:54;;;3811:3;3857:12;;;;;;;:::i;:::-;;3888:18;;;;;807:1380:49;3888:30:54;3884:69;;3992:15;;;807:1380:49;;;;:::i;:::-;;;;:::i;:::-;4025:28:54;;;4105:58;;3429:15;4105:58;;;;;:::i;:::-;4073:90;;4021:399;;807:1380:49;3788:9:54;;;;4021:399;807:1380:49;;3429:15:54;807:1380:49;;;;;;:::i;:::-;4188:32:54;3429:15;;4264:8;;3429:15;4264:8;;;:::i;:::-;4021:399;;4184:236;3429:15;4344:61;;;;;;:::i;:::-;4312:93;;4184:236;4021:399;;3884:69;3927:26;807:1380:49;;;;;;;;3927:26:54;-1:-1:-1;3927:26:54;807:1380:49;;3927:26:54;807:1380:49;;;;3927:26:54;-1:-1:-1;3927:26:54;3591:139;3700:18;;3684:35;3700:18;;807:1380:49;;;;3700:18:54;3684:15;;;807:1380:49;;;;;;;;;;3684:35:54;807:1380:49;3591:139:54;;;807:1380:49;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;807:1380:49;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;10242:893:54:-;;807:1380:49;;;10328:20:54;;;807:1380:49;;;;10364:71:54;;10242:893::o;10364:71::-;10393:42;10346:1;10393:42;;10346:1;10393:42;10324:805;807:1380:49;;10470:16:54;10466:54;;10556:4;10538:23;10534:129;;10324:805;10346:1;10719:25;;;;;;;;;;;;:::i;:::-;10762:8;;10758:361;;10324:805;;;10242:893::o;10758:361::-;807:1380:49;;;10856:21:54;;;;10901:102;;10719:25;10901:102;;10852:253;11056:30;807:1380:49;;11056:30:54;;;;;;;;;;:::i;:::-;;;;10534:129;376:58:354;;10534:129:54;10581:67;10615:33;10346:1;10615:33;807:1380:49;;;3927:26:54;807:1380:49;;-1:-1:-1;3927:26:54;10466:54;10495:25;10346:1;10495:25;807:1380:49;;;3927:26:54;807:1380:49;;-1:-1:-1;3927:26:54;6135:3203;;;807:1380:49;;;;;;;;;;;6338:88:54;;6465:18;6539:1;6465:18;;807:1380:49;;;;6465:18:54;6523:17;;6556:9;807:1380:49;6551:2661:54;6598:3;6571:18;;;;807:1380:49;;6567:29:54;;;;;6635:21;;;;;:::i;:::-;807:1380:49;;;;;6635:21:54;6689:25;;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;6689:25:54;807:1380:49;6749:25:54;6733:57;:43;6741:34;6749:25;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;6749:25:54;807:1380:49;;;;;6741:34:54;807:1380:49;;;;6733:43:54;807:1380:49;;;;6733:57:54;;6729:96;;6898:4;6843:60;:43;6851:34;6859:25;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;6843:60:54;;6839:109;;6967:17;;;807:1380:49;;;;7106:15:54;:34;:15;;;;807:1380:49;;;;;;;;;;7106:34:54;807:1380:49;7158:23:54;6539:1;6963:343;;807:1380:49;7941:25:54;7609:50;7633:24;;;807:1380:49;;;;7633:24:54;807:1380:49;;;;;7609:50:54;807:1380:49;;;;;;;;;7682:24:54;;7678:238;;6963:343;7941:25;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;7941:25:54;1857:44;8145:27;6539:1;8078:21;807:1380:49;;;;;;;8078:21:54;8146:20;;807:1380:49;;;;8145:27:54;8205:42;;;;;8293:15;8686:38;8293:15;;;;:38;807:1380:49;8293:38:54;;;807:1380:49;;;;;;;;;;8293:38:54;807:1380:49;;;;;;8503:51:54;8485:69;8484:126;8686:38;807:1380:49;;;;;;;;;;8686:38:54;807:1380:49;8201:849:54;9068:24;;9064:138;;8201:849;807:1380:49;;;6556:9:54;;9064:138;9119:15;;807:1380:49;9119:34:54;:15;;;;807:1380:49;;;;;;;;;;9119:34:54;1857:44;807:1380:49;;9064:138:54;;8201:849;807:1380:49;;;;;;;;;;8928:51:54;8913:66;8912:123;8201:849;;;7678:238;7825:72;7859:38;7867:29;;7793;7867;500:10:59;807:1380:49;;500:10:59;;;;;;;;;7859:38:54;807:1380:49;;;;7825:72:54;1873:26;7826:29;;7825:72;7793:29;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;7793:29:54;807:1380:49;7678:238:54;;;;6963:343;807:1380:49;;;;;;;;;6963:343:54;;6839:109;6912:36;807:1380:49;6912:36:54;807:1380:49;;;6799:26:54;807:1380:49;;-1:-1:-1;3927:26:54;6729:96;6799:26;807:1380:49;6799:26:54;807:1380:49;;;6799:26:54;807:1380:49;;-1:-1:-1;3927:26:54;6567:29;;;;;;;;9239:22;6567:29;;807:1380:49;;;;9239:22:54;9238:46;9295:36;6135:3203;:::o;6338:88::-;6379:47;807:1380:49;6379:47:54;807:1380:49;;3927:26:54;807:1380:49;;-1:-1:-1;3927:26:54;9344:892;807:1380:49;;;;9483:19:54;376:58:354;;450:9;9478:65:54;;9571:18;;;;;807:1380:49;9611:9:54;-1:-1:-1;807:1380:49;;;;;;;;;;9606:624:54;9622:10;;;;;;9344:892;;;;;;;:::o;9634:3::-;9671:21;;:18;;;:21;:::i;:::-;9725:25;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;9725:25:54;807:1380:49;;;;9835:29:54;;9831:68;;9944:4;9917:32;;9913:81;;10012:24;;10008:79;;10172:29;10143:25;10172:29;1873:26;807:1380:49;10172:29:54;;;10171:48;10143:25;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;10143:25:54;807:1380:49;;9611:9:54;;10008:79;10045:42;-1:-1:-1;10045:42:54;807:1380:49;;;10045:42:54;807:1380:49;;;;;;;-1:-1:-1;3927:26:54;9913:81;9958:36;-1:-1:-1;9958:36:54;807:1380:49;;;6799:26:54;807:1380:49;;-1:-1:-1;3927:26:54;9831:68;9873:26;-1:-1:-1;9873:26:54;807:1380:49;;;6799:26:54;807:1380:49;;-1:-1:-1;3927:26:54;9478:65;9511:32;9454:14;9511:32;807:1380:49;;;3927:26:54;807:1380:49;;-1:-1:-1;3927:26:54;4717:1412;807:1380:49;;4717:1412:54;;;;;807:1380:49;;4947:4:54;4921:31;;;;:64;;4717:1412;4917:109;;5054:18;;;;;;;;807:1380:49;5094:9:54;807:1380:49;5089:987:54;5105:10;;;;;;6086:36;;;;;;4717:1412;:::o;5117:3::-;5154:18;;;;;:21;;:18;;;:21;:::i;:::-;5231:25;5215:43;5223:34;5231:25;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;5215:43:54;807:1380:49;;;5273:91:54;;807:1380:49;5872:3:54;807:1380:49;;;5445:23:54;807:1380:49;;;;;;;;;;;;;;5445:23:54;807:1380:49;5445:48:54;5417:25;;;500:10:59;807:1380:49;;500:10:59;;;;;;;;;5417:25:54;807:1380:49;1971:17:54;5540:24;5557:1;5541:17;;807:1380:49;;;;5540:24:54;807:1380:49;;;;;1971:17:54;807:1380:49;;5674:48:54;5659:63;5658:113;5846:29;;5842:152;;5117:3;807:1380:49;;;;5117:3:54;807:1380:49;5094:9:54;;;;;;5842:152;5911:18;5895:35;5911:18;;807:1380:49;;;;5895:35:54;807:1380:49;;;5842:152:54;;5273:91;5315:49;807:1380:49;5315:49:54;807:1380:49;;10045:42:54;807:1380:49;;;;;;;-1:-1:-1;3927:26:54;4917:109;4994:32;807:1380:49;4994:32:54;807:1380:49;;3927:26:54;807:1380:49;;-1:-1:-1;3927:26:54;4921:64;-1:-1:-1;376:58:354;;450:9;4921:64:54;"},"gasEstimates":{"creation":{"codeDepositCost":"1317000","executionCost":"infinite","totalCost":"infinite"},"external":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":"infinite","diamondCut((address,uint8,bytes4[])[],address,bytes)":"infinite","initDiamondCutStorage()":"infinite"}},"methodIdentifiers":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":"b2afc5b5","diamondCut((address,uint8,bytes4[])[],address,bytes)":"1f931c1c","initDiamondCutStorage()":"95bce666"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"EmptyFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"EmptyInitCallData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionAlreadyPresent\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"InitCallReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ModifyingImmutableFunction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"NonContractFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"NonContractInitCallTarget\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"RemovingWithNonZeroAddressFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ReplacingFunctionByItself\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressTargetInitCallButNonEmptyData\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Initialization[]\",\"name\":\"initializations\",\"type\":\"tuple[]\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initDiamondCutStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2535Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"EmptyFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"EmptyInitCallData(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address which already has the function.\",\"selector\":\"The function selector which has already been added.\"}}],\"FunctionNotFound(bytes4)\":[{\"params\":{\"selector\":\"The function selector which has not been added.\"}}],\"InitCallReverted(address,bytes)\":[{\"params\":{\"data\":\"The data for the initialization call.\",\"target\":\"The target address for the initialization call.\"}}],\"ModifyingImmutableFunction(bytes4)\":[{\"params\":{\"selector\":\"The function selector which is immutable.\"}}],\"NonContractFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"NonContractInitCallTarget(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"params\":{\"facet\":\"The facet address which is not zero.\"}}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address.\",\"selector\":\"The function selector.\"}}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors applied to the diamond.\",\"data\":\"The encoded function call executed on `target`.\",\"target\":\"The address of the contract where `data` was executed.\"}}},\"kind\":\"dev\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\",\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors to apply to the diamond.\",\"initializations\":\"The list of addresses and encoded function calls to execute with delegatecall.\"}},\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\",\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors to apply to the diamond.\",\"data\":\"The encoded function call to execute on `target`.\",\"target\":\"The address of the contract to execute `data` on.\"}},\"initDiamondCutStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"Diamond Cut (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"EmptyFacet(address)\":[{\"notice\":\"Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\"}],\"EmptyInitCallData(address)\":[{\"notice\":\"Thrown when trying to call an initialization function with a target and empty data.\"}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"notice\":\"Thrown when trying to add a function selector that has already been added.\"}],\"FunctionNotFound(bytes4)\":[{\"notice\":\"Thrown when trying to execute, remove or replace a function selector that has not been added.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitCallReverted(address,bytes)\":[{\"notice\":\"Thrown when trying to call an initialization function which reverts without return data.\"}],\"ModifyingImmutableFunction(bytes4)\":[{\"notice\":\"Thrown when trying to remove or replace an immutable function.\"}],\"NonContractFacet(address)\":[{\"notice\":\"Thrown when trying to add or replace a facet which is not a deployed contract.\"}],\"NonContractInitCallTarget(address)\":[{\"notice\":\"Thrown when trying to call an initialization function on a non-contract address.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"notice\":\"Thrown when trying to remove function selectors with a non-zero facet address.\"}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"notice\":\"Thrown when trying to replace a function with itself (from the same facet).\"}],\"ZeroAddressTargetInitCallButNonEmptyData()\":[{\"notice\":\"Thrown when trying to call an initialization function with a zero address target and non-empty data.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Emitted when at least a cut action is operated on the diamond.\"}},\"kind\":\"user\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])\":{\"notice\":\"Add/replace/remove facet functions and execute a batch of functions with delegatecall.\"},\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Add/replace/remove facet functions and optionally execute a function with delegatecall.\"},\"initDiamondCutStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/facets/DiamondCutFacet.sol\":\"DiamondCutFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/errors/DiamondErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\\n/// @param facet The facet address.\\nerror EmptyFacet(address facet);\\n\\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\\n/// @param facet The facet address.\\nerror NonContractFacet(address facet);\\n\\n/// @notice Thrown when trying to add a function selector that has already been added.\\n/// @param facet The facet address which already has the function.\\n/// @param selector The function selector which has already been added.\\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\\n/// @param facet The facet address which is not zero.\\nerror RemovingWithNonZeroAddressFacet(address facet);\\n\\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\\n/// @param selector The function selector which has not been added.\\nerror FunctionNotFound(bytes4 selector);\\n\\n/// @notice Thrown when trying to remove or replace an immutable function.\\n/// @param selector The function selector which is immutable.\\nerror ModifyingImmutableFunction(bytes4 selector);\\n\\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\\n/// @param facet The facet address.\\n/// @param selector The function selector.\\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\\nerror ZeroAddressTargetInitCallButNonEmptyData();\\n\\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\\n/// @param target The target address for the initialization call.\\nerror EmptyInitCallData(address target);\\n\\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\\n/// @param target The target address for the initialization call.\\nerror NonContractInitCallTarget(address target);\\n\\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\\n/// @param target The target address for the initialization call.\\n/// @param data The data for the initialization call.\\nerror InitCallReverted(address target, bytes data);\\n\",\"keccak256\":\"0x2647bd9f06a6b0d435b142d7fc15e13c51e31217822b01a3f598b7c40edb9e20\",\"license\":\"MIT\"},\"contracts/diamond/events/DiamondCutEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @notice Emitted when at least a cut action is operated on the diamond.\\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\\n/// @param target The address of the contract where `data` was executed.\\n/// @param data The encoded function call executed on `target`.\\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\\n\",\"keccak256\":\"0x74988038bb78c2fba84434628255bd30f1282dd7e6a59ef3849cb40786428aea\",\"license\":\"MIT\"},\"contracts/diamond/facets/DiamondCutFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {DiamondStorage} from \\\"./../libraries/DiamondStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Diamond Cut (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract DiamondCutFacet is IDiamondCut, IDiamondCutBatchInit, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using DiamondStorage for DiamondStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initDiamondCutStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        DiamondStorage.initDiamondCut();\\n    }\\n\\n    /// @inheritdoc IDiamondCut\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        DiamondStorage.layout().diamondCut(cuts, target, data);\\n    }\\n\\n    /// @inheritdoc IDiamondCutBatchInit\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        DiamondStorage.layout().diamondCut(cuts, initializations);\\n    }\\n}\\n\",\"keccak256\":\"0xe10da8225c94bccdba79080702fcd1a76001fcaf1bff6acd429b6574aa19f43c\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"},\"contracts/diamond/libraries/DiamondStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    EmptyFacet,\\n    NonContractFacet,\\n    FunctionAlreadyPresent,\\n    RemovingWithNonZeroAddressFacet,\\n    FunctionNotFound,\\n    ModifyingImmutableFunction,\\n    ReplacingFunctionByItself,\\n    ZeroAddressTargetInitCallButNonEmptyData,\\n    EmptyInitCallData,\\n    NonContractInitCallTarget,\\n    InitCallReverted\\n} from \\\"./../errors/DiamondErrors.sol\\\";\\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {DiamondCut} from \\\"./../events/DiamondCutEvents.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\\nlibrary DiamondStorage {\\n    using Address for address;\\n    using DiamondStorage for DiamondStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        // selector => (facet address, selector slot position)\\n        mapping(bytes4 => bytes32) diamondFacets;\\n        // number of selectors registered in selectorSlots\\n        uint16 selectorCount;\\n        // array of selector slots with 8 selectors per slot\\n        mapping(uint256 => bytes32) selectorSlots;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.Diamond.storage\\\")) - 1);\\n\\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    function initDiamondCut() internal {\\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    function initDiamondLoupe() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\\n        s.cutFacets(cuts);\\n        initializationCall(target, data);\\n        emit DiamondCut(cuts, target, data);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\\n        s.cutFacets(cuts);\\n        uint256 length = initializations.length;\\n        for (uint256 i; i < length; ++i) {\\n            initializationCall(initializations[i].target, initializations[i].data);\\n        }\\n        emit DiamondCut(cuts, address(0), \\\"\\\");\\n    }\\n\\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\\n        uint256 originalSelectorCount = s.selectorCount;\\n        uint256 selectorCount = originalSelectorCount;\\n        bytes32 selectorSlot;\\n\\n        // Check if last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            // get last selectorSlot\\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\\n        }\\n\\n        uint256 length = facetCuts.length;\\n        for (uint256 i; i < length; ++i) {\\n            FacetCut memory facetCut = facetCuts[i];\\n\\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\\n\\n            FacetCutAction action = facetCut.action;\\n            if (action == FacetCutAction.ADD) {\\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            } else if (action == FacetCutAction.REPLACE) {\\n                s.replaceFacetSelectors(facetCut);\\n            } else {\\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            }\\n        }\\n\\n        if (selectorCount != originalSelectorCount) {\\n            s.selectorCount = uint16(selectorCount);\\n        }\\n\\n        // If last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n        }\\n    }\\n\\n    function addFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\\n\\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\\n\\n            // add facet for selector\\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\\n\\n            // clear selector position in slot and add selector\\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\\n\\n            // if slot is full then write it to storage\\n            if (selectorInSlotPosition == 224) {\\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n                selectorSlot = 0;\\n            }\\n\\n            unchecked {\\n                ++selectorCount;\\n            }\\n        }\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function removeFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\\n\\n        uint256 selectorSlotCount = selectorCount >> 3;\\n        uint256 selectorInSlotIndex = selectorCount & 7;\\n\\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n\\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\\n\\n            if (selectorSlot == 0) {\\n                unchecked {\\n                    selectorSlotCount--;\\n                }\\n                selectorSlot = s.selectorSlots[selectorSlotCount];\\n                selectorInSlotIndex = 7;\\n            } else {\\n                unchecked {\\n                    selectorInSlotIndex--;\\n                }\\n            }\\n\\n            bytes4 lastSelector;\\n            uint256 oldSelectorsSlotCount;\\n            uint256 oldSelectorInSlotPosition;\\n\\n            // adding a block here prevents stack too deep error\\n            {\\n                // replace selector with last selector in l.facets\\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\\n\\n                if (lastSelector != selector) {\\n                    // update last selector slot position info\\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\\n                }\\n\\n                delete s.diamondFacets[selector];\\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\\n            }\\n\\n            if (oldSelectorsSlotCount != selectorSlotCount) {\\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\\n\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                oldSelectorSlot =\\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n\\n                // update storage with the modified slot\\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\\n            } else {\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                selectorSlot =\\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n            }\\n\\n            if (selectorInSlotIndex == 0) {\\n                delete s.selectorSlots[selectorSlotCount];\\n                selectorSlot = 0;\\n            }\\n        }\\n\\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\\n        address facet = facetCut.facet;\\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n            address oldFacetAddress = address(bytes20(oldFacet));\\n\\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\\n\\n            // replace old facet address\\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\\n        }\\n    }\\n\\n    function initializationCall(address target, bytes memory data) internal {\\n        if (target == address(0)) {\\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\\n        } else {\\n            if (data.length == 0) revert EmptyInitCallData(target);\\n            if (target != address(this)) {\\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\\n            }\\n\\n            (bool success, bytes memory returndata) = target.delegatecall(data);\\n            if (!success) {\\n                uint256 returndataLength = returndata.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, returndata), returndataLength)\\n                    }\\n                } else {\\n                    revert InitCallReverted(target, data);\\n                }\\n            }\\n        }\\n    }\\n\\n    function delegateOnFallback(Layout storage s) internal {\\n        bytes4 selector = msg.sig;\\n        address facet = s.facetAddress(selector);\\n        if (facet == address(0)) revert FunctionNotFound(selector);\\n        assembly {\\n            calldatacopy(0, 0, calldatasize())\\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n            returndatacopy(0, 0, returndatasize())\\n            switch result\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            diamondFacets = new Facet[](selectorCount);\\n\\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\\n                        if (diamondFacets[facetIndex].facet == facet) {\\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\\n                            ++numFacetSelectors[facetIndex];\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    diamondFacets[numFacets].facet = facet;\\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\\n                    diamondFacets[numFacets].selectors[0] = selector;\\n                    numFacetSelectors[numFacets] = 1;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                uint256 numSelectors = numFacetSelectors[facetIndex];\\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\\n\\n                // setting the number of selectors\\n                assembly {\\n                    mstore(selectors, numSelectors)\\n                }\\n            }\\n\\n            // setting the number of facets\\n            assembly {\\n                mstore(diamondFacets, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            selectors = new bytes4[](selectorCount);\\n\\n            uint256 numSelectors;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n\\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\\n                        selectors[numSelectors] = selector;\\n                        ++numSelectors;\\n                    }\\n                }\\n            }\\n\\n            // set the number of selectors in the array\\n            assembly {\\n                mstore(selectors, numSelectors)\\n            }\\n        }\\n    }\\n\\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            addresses = new address[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                        if (facet == addresses[facetIndex]) {\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    addresses[numFacets] = facet;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            // set the number of facet addresses in the array\\n            assembly {\\n                mstore(addresses, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\\n        facet = address(bytes20(s.diamondFacets[selector]));\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x930e0c854d559149621d2185cef92daadde9f514e12cca2ca30a1a9d1af063d7\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"EmptyFacet(address)":[{"notice":"Thrown when trying to cut (add/replace/remove) a facet with no function selectors."}],"EmptyInitCallData(address)":[{"notice":"Thrown when trying to call an initialization function with a target and empty data."}],"FunctionAlreadyPresent(address,bytes4)":[{"notice":"Thrown when trying to add a function selector that has already been added."}],"FunctionNotFound(bytes4)":[{"notice":"Thrown when trying to execute, remove or replace a function selector that has not been added."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitCallReverted(address,bytes)":[{"notice":"Thrown when trying to call an initialization function which reverts without return data."}],"ModifyingImmutableFunction(bytes4)":[{"notice":"Thrown when trying to remove or replace an immutable function."}],"NonContractFacet(address)":[{"notice":"Thrown when trying to add or replace a facet which is not a deployed contract."}],"NonContractInitCallTarget(address)":[{"notice":"Thrown when trying to call an initialization function on a non-contract address."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"RemovingWithNonZeroAddressFacet(address)":[{"notice":"Thrown when trying to remove function selectors with a non-zero facet address."}],"ReplacingFunctionByItself(address,bytes4)":[{"notice":"Thrown when trying to replace a function with itself (from the same facet)."}],"ZeroAddressTargetInitCallButNonEmptyData()":[{"notice":"Thrown when trying to call an initialization function with a zero address target and non-empty data."}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Emitted when at least a cut action is operated on the diamond."}},"kind":"user","methods":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":{"notice":"Add/replace/remove facet functions and execute a batch of functions with delegatecall."},"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Add/replace/remove facet functions and optionally execute a function with delegatecall."},"initDiamondCutStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit."}},"version":1}}},"contracts/diamond/facets/DiamondLoupeFacet.sol":{"DiamondLoupeFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facetAddress_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"facetAddresses_","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"facetFunctionSelectors_","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct Facet[]","name":"facets_","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initDiamondLoupeStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2535Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"facetAddress(bytes4)":{"params":{"functionSelector":"The function selector."},"returns":{"facetAddress_":"The facet address that supports `functionSelector`, or the zero address if the facet is not found."}},"facetAddresses()":{"returns":{"facetAddresses_":"The facet addresses used by the diamond."}},"facetFunctionSelectors(address)":{"params":{"facetAddress":"The facet address."},"returns":{"facetFunctionSelectors_":"The function selectors supported by `facet`."}},"facets()":{"returns":{"facets_":"The facet addresses used by the diamond and their function selectors."}},"initDiamondLoupeStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"Diamond Loupe (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610e6a38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610de89081610082823960805181610b430152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80634fe5dd791461006757806352ef6b2c146100625780637a0ed6271461005d578063adfca15e146100585763cdffacc61461005357600080fd5b6109db565b610850565b610550565b6101f6565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a15761009e610b2c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610174577f48e2b093000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f439b4da6230337e2a9f4a90d201bac6b66c68d0f1bcc968824d5b10def70a85380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b602060408183019282815284518094520192019060005b8181106101ca5750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016101bd565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e2906102799061ffff165b61ffff1690565b9061028382610c81565b9060009060009060009460028201955b8184106102af57848652604051806102ab88826101a6565b0390f35b6102c3818890600052602052604060002090565b546000905b600882036102db575b5050600101610293565b9095946001019483861161044f5761038461037e610358610326856103008c60051b90565b1b7fffffffff000000000000000000000000000000000000000000000000000000001690565b88907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b600073ffffffffffffffffffffffffffffffffffffffff8216815b8b8582106103f1575b5050506103e757816103dd600193926103c285948d610d11565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01965b01906102c8565b50956001906103e0565b61041b6104018361043493610d11565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b82146104425760010161039f565b505050600138808b6103a8565b956102d1565b906020808351928381520192019060005b8181106104735750505090565b82517fffffffff0000000000000000000000000000000000000000000000000000000016845260209384019390920191600101610466565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106104de57505050505090565b9091929394602080610541837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187526040838b5173ffffffffffffffffffffffffffffffffffffffff815116845201519181858201520190610455565b970193019301919392906104cf565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e2906105d09061ffff16610272565b906105da82610d25565b906105e483610c81565b9260009160009060009260028201935b81841061063d5787878760005b81811061061957818352604051806102ab85826104ab565b8061062660019286610d11565b5160206106338387610d11565b5101515201610601565b610651818690600052602052604060002090565b546000905b60088203610669575b50506001016105f4565b909694600101948386116108365789610686836103008b60051b90565b8a6106c361037e610358848b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b600073ffffffffffffffffffffffffffffffffffffffff8216815b878103610798575b505061078b5784600195939461077b8796610754602061074c868f996107398d9b6107346107809c6107188686610d11565b519073ffffffffffffffffffffffffffffffffffffffff169052565b610c81565b846107448484610d11565b510152610d11565b510151610cff565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b610d11565b5201975b0190610656565b5050505096600190610784565b9193816107cb61041b6107b086859b96989a9b610d11565b515173ffffffffffffffffffffffffffffffffffffffff1690565b146107e1575050600101918e9493918e936106de565b93509493915061080e8461075460206107fa8588610d11565b510151610807858a610d11565b5190610d11565b61082c61082561081e8388610d11565b5160010190565b9186610d11565b52600138806106e6565b9661065f565b90602061084d928181520190610455565b90565b346101a15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a15760043573ffffffffffffffffffffffffffffffffffffffff81168091036101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e291906108f29061ffff16610272565b6108fb81610c81565b9160009360009160009360028301945b81851061092357878752604051806102ab898261083c565b610937818790600052602052604060002090565b546000905b6008820361094f575b505060010161090b565b9095600101958387116109d65761096a826103008360051b90565b6109a961041b61037e610358848b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b86146109ba575b506001019061093c565b8a6109ce6001939c9261075485948e610d11565b0199906109b0565b610945565b346101a15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101a1577fffffffff000000000000000000000000000000000000000000000000000000007f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29116600052602052602060406000205460601c604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b0357604052565b610a93565b908160209103126101a1575180151581036101a15790565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c5a573233148015610c5f575b610c5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610bb4575b5061084d57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c5557600091610c26575b5038610baa565b610c48915060203d602011610c4e575b610c408183610ac2565b810190610b08565b38610c1f565b503d610c36565b610b20565b503390565b5060183610610b73565b67ffffffffffffffff8111610b035760051b60200190565b90610c8b82610c69565b610c986040519182610ac2565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610cc68294610c69565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805115610d0c5760200190565b610cd0565b8051821015610d0c5760209160051b010190565b90610d2f82610c69565b610d3c6040519182610ac2565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610d6a8294610c69565b0160005b818110610d7a57505050565b60405190604082019180831067ffffffffffffffff841117610b03576020926040526000815260608382015282828601015201610d6e56fea2646970667358221220cdc08281d40f2d9b1eda4fd3152689c4909979ca9adddd4cbfc7e53abffe641b64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xE6A CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xDE8 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xB43 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4FE5DD79 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x52EF6B2C EQ PUSH2 0x62 JUMPI DUP1 PUSH4 0x7A0ED627 EQ PUSH2 0x5D JUMPI DUP1 PUSH4 0xADFCA15E EQ PUSH2 0x58 JUMPI PUSH4 0xCDFFACC6 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9DB JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0x550 JUMP JUMPDEST PUSH2 0x1F6 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH2 0x9E PUSH2 0xB2C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x174 JUMPI PUSH32 0x48E2B09300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x439B4DA6230337E2A9F4A90D201BAC6B66C68D0F1BCC968824D5B10DEF70A853 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 PUSH1 0x40 DUP2 DUP4 ADD SWAP3 DUP3 DUP2 MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1BD JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP1 PUSH2 0x279 SWAP1 PUSH2 0xFFFF AND JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x283 DUP3 PUSH2 0xC81 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP5 PUSH1 0x2 DUP3 ADD SWAP6 JUMPDEST DUP2 DUP5 LT PUSH2 0x2AF JUMPI DUP5 DUP7 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP9 DUP3 PUSH2 0x1A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2C3 DUP2 DUP9 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x2DB JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 SWAP6 SWAP5 PUSH1 0x1 ADD SWAP5 DUP4 DUP7 GT PUSH2 0x44F JUMPI PUSH2 0x384 PUSH2 0x37E PUSH2 0x358 PUSH2 0x326 DUP6 PUSH2 0x300 DUP13 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST DUP9 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 JUMPDEST DUP12 DUP6 DUP3 LT PUSH2 0x3F1 JUMPI JUMPDEST POP POP POP PUSH2 0x3E7 JUMPI DUP2 PUSH2 0x3DD PUSH1 0x1 SWAP4 SWAP3 PUSH2 0x3C2 DUP6 SWAP5 DUP14 PUSH2 0xD11 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST ADD SWAP7 JUMPDEST ADD SWAP1 PUSH2 0x2C8 JUMP JUMPDEST POP SWAP6 PUSH1 0x1 SWAP1 PUSH2 0x3E0 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x401 DUP4 PUSH2 0x434 SWAP4 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 EQ PUSH2 0x442 JUMPI PUSH1 0x1 ADD PUSH2 0x39F JUMP JUMPDEST POP POP POP PUSH1 0x1 CODESIZE DUP1 DUP12 PUSH2 0x3A8 JUMP JUMPDEST SWAP6 PUSH2 0x2D1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x473 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x466 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP2 PUSH1 0x20 PUSH1 0x40 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x4DE JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH1 0x20 DUP1 PUSH2 0x541 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP7 PUSH1 0x1 SWAP7 SUB ADD DUP8 MSTORE PUSH1 0x40 DUP4 DUP12 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND DUP5 MSTORE ADD MLOAD SWAP2 DUP2 DUP6 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x455 JUMP JUMPDEST SWAP8 ADD SWAP4 ADD SWAP4 ADD SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x4CF JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP1 PUSH2 0x5D0 SWAP1 PUSH2 0xFFFF AND PUSH2 0x272 JUMP JUMPDEST SWAP1 PUSH2 0x5DA DUP3 PUSH2 0xD25 JUMP JUMPDEST SWAP1 PUSH2 0x5E4 DUP4 PUSH2 0xC81 JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP2 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP3 PUSH1 0x2 DUP3 ADD SWAP4 JUMPDEST DUP2 DUP5 LT PUSH2 0x63D JUMPI DUP8 DUP8 DUP8 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x619 JUMPI DUP2 DUP4 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP6 DUP3 PUSH2 0x4AB JUMP JUMPDEST DUP1 PUSH2 0x626 PUSH1 0x1 SWAP3 DUP7 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH1 0x20 PUSH2 0x633 DUP4 DUP8 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD MSTORE ADD PUSH2 0x601 JUMP JUMPDEST PUSH2 0x651 DUP2 DUP7 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x669 JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x5F4 JUMP JUMPDEST SWAP1 SWAP7 SWAP5 PUSH1 0x1 ADD SWAP5 DUP4 DUP7 GT PUSH2 0x836 JUMPI DUP10 PUSH2 0x686 DUP4 PUSH2 0x300 DUP12 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST DUP11 PUSH2 0x6C3 PUSH2 0x37E PUSH2 0x358 DUP5 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 JUMPDEST DUP8 DUP2 SUB PUSH2 0x798 JUMPI JUMPDEST POP POP PUSH2 0x78B JUMPI DUP5 PUSH1 0x1 SWAP6 SWAP4 SWAP5 PUSH2 0x77B DUP8 SWAP7 PUSH2 0x754 PUSH1 0x20 PUSH2 0x74C DUP7 DUP16 SWAP10 PUSH2 0x739 DUP14 SWAP12 PUSH2 0x734 PUSH2 0x780 SWAP13 PUSH2 0x718 DUP7 DUP7 PUSH2 0xD11 JUMP JUMPDEST MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH2 0xC81 JUMP JUMPDEST DUP5 PUSH2 0x744 DUP5 DUP5 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MSTORE PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD PUSH2 0xCFF JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 MSTORE JUMP JUMPDEST PUSH2 0xD11 JUMP JUMPDEST MSTORE ADD SWAP8 JUMPDEST ADD SWAP1 PUSH2 0x656 JUMP JUMPDEST POP POP POP POP SWAP7 PUSH1 0x1 SWAP1 PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP4 DUP2 PUSH2 0x7CB PUSH2 0x41B PUSH2 0x7B0 DUP7 DUP6 SWAP12 SWAP7 SWAP9 SWAP11 SWAP12 PUSH2 0xD11 JUMP JUMPDEST MLOAD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST EQ PUSH2 0x7E1 JUMPI POP POP PUSH1 0x1 ADD SWAP2 DUP15 SWAP5 SWAP4 SWAP2 DUP15 SWAP4 PUSH2 0x6DE JUMP JUMPDEST SWAP4 POP SWAP5 SWAP4 SWAP2 POP PUSH2 0x80E DUP5 PUSH2 0x754 PUSH1 0x20 PUSH2 0x7FA DUP6 DUP9 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD PUSH2 0x807 DUP6 DUP11 PUSH2 0xD11 JUMP JUMPDEST MLOAD SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH2 0x82C PUSH2 0x825 PUSH2 0x81E DUP4 DUP9 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP7 PUSH2 0xD11 JUMP JUMPDEST MSTORE PUSH1 0x1 CODESIZE DUP1 PUSH2 0x6E6 JUMP JUMPDEST SWAP7 PUSH2 0x65F JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x84D SWAP3 DUP2 DUP2 MSTORE ADD SWAP1 PUSH2 0x455 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP2 SWAP1 PUSH2 0x8F2 SWAP1 PUSH2 0xFFFF AND PUSH2 0x272 JUMP JUMPDEST PUSH2 0x8FB DUP2 PUSH2 0xC81 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP4 PUSH1 0x0 SWAP2 PUSH1 0x0 SWAP4 PUSH1 0x2 DUP4 ADD SWAP5 JUMPDEST DUP2 DUP6 LT PUSH2 0x923 JUMPI DUP8 DUP8 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP10 DUP3 PUSH2 0x83C JUMP JUMPDEST PUSH2 0x937 DUP2 DUP8 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x94F JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x90B JUMP JUMPDEST SWAP1 SWAP6 PUSH1 0x1 ADD SWAP6 DUP4 DUP8 GT PUSH2 0x9D6 JUMPI PUSH2 0x96A DUP3 PUSH2 0x300 DUP4 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST PUSH2 0x9A9 PUSH2 0x41B PUSH2 0x37E PUSH2 0x358 DUP5 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP7 EQ PUSH2 0x9BA JUMPI JUMPDEST POP PUSH1 0x1 ADD SWAP1 PUSH2 0x93C JUMP JUMPDEST DUP11 PUSH2 0x9CE PUSH1 0x1 SWAP4 SWAP13 SWAP3 PUSH2 0x754 DUP6 SWAP5 DUP15 PUSH2 0xD11 JUMP JUMPDEST ADD SWAP10 SWAP1 PUSH2 0x9B0 JUMP JUMPDEST PUSH2 0x945 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xB03 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0xA93 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1A1 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1A1 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC5A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC5F JUMPI JUMPDEST PUSH2 0xC5A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBB4 JUMPI JUMPDEST POP PUSH2 0x84D JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC55 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC26 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBAA JUMP JUMPDEST PUSH2 0xC48 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC4E JUMPI JUMPDEST PUSH2 0xC40 DUP2 DUP4 PUSH2 0xAC2 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB08 JUMP JUMPDEST CODESIZE PUSH2 0xC1F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC36 JUMP JUMPDEST PUSH2 0xB20 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB73 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xB03 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC8B DUP3 PUSH2 0xC69 JUMP JUMPDEST PUSH2 0xC98 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xAC2 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xCC6 DUP3 SWAP5 PUSH2 0xC69 JUMP JUMPDEST ADD SWAP1 PUSH1 0x20 CALLDATASIZE SWAP2 ADD CALLDATACOPY JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD ISZERO PUSH2 0xD0C JUMPI PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0xCD0 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xD0C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xD2F DUP3 PUSH2 0xC69 JUMP JUMPDEST PUSH2 0xD3C PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xAC2 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xD6A DUP3 SWAP5 PUSH2 0xC69 JUMP JUMPDEST ADD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xD7A JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD SWAP2 DUP1 DUP4 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT OR PUSH2 0xB03 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x40 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xD6E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCD 0xC0 DUP3 DUP2 0xD4 0xF 0x2D SWAP12 0x1E 0xDA 0x4F 0xD3 ISZERO 0x26 DUP10 0xC4 SWAP1 SWAP10 PUSH26 0xCA9ADDDD4CBFC7E53ABFFE641B64736F6C634300081E00330000 ","sourceMap":"715:1456:50:-:0;;;;;;;;;;;;;-1:-1:-1;;715:1456:50;;;;-1:-1:-1;;;;;715:1456:50;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;715:1456:50;;;;;;745:39:76;;715:1456:50;;;;;;;;745:39:76;715:1456:50;;;;;;;-1:-1:-1;715:1456:50;;;;;;-1:-1:-1;715:1456:50;;;;;-1:-1:-1;715:1456:50"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":2824,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_array_address_dyn":{"entryPoint":422,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_bytes4_dyn":{"entryPoint":2108,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_bytes4_dyn_memory_ptr":{"entryPoint":1109,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_struct_Facet_dyn":{"entryPoint":1195,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_and_zero_memory_array_array_address_dyn":{"entryPoint":3201,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_and_zero_memory_array_array_struct_Facet_dyn":{"entryPoint":3365,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":3177,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes20_to_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes32_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes32_to_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"external_fun_facetAddress":{"entryPoint":2523,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_facetAddresses":{"entryPoint":502,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_facetFunctionSelectors":{"entryPoint":2128,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_facets":{"entryPoint":1360,"id":null,"parameterSlots":0,"returnSlots":0},"extract_from_storage_value_offset_uint16":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2754,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2860,"id":13231,"parameterSlots":0,"returnSlots":1},"increment_wrapping_uint256":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"mapping_index_access_mapping_bytes4__bytes32__of_bytes4":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":1},"mapping_index_access_mapping_bytes4_bytes32_of_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"mapping_index_access_mapping_uint256_bytes32_of_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":3327,"id":null,"parameterSlots":1,"returnSlots":1},"memory_array_index_access_array_address_dyn":{"entryPoint":3345,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x32":{"entryPoint":3280,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":2707,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_memoryt_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"revert_forward":{"entryPoint":2848,"id":null,"parameterSlots":0,"returnSlots":0},"shift_left_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"write_to_memory_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2883}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80634fe5dd791461006757806352ef6b2c146100625780637a0ed6271461005d578063adfca15e146100585763cdffacc61461005357600080fd5b6109db565b610850565b610550565b6101f6565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a15761009e610b2c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610174577f48e2b093000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f439b4da6230337e2a9f4a90d201bac6b66c68d0f1bcc968824d5b10def70a85380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b602060408183019282815284518094520192019060005b8181106101ca5750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016101bd565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e2906102799061ffff165b61ffff1690565b9061028382610c81565b9060009060009060009460028201955b8184106102af57848652604051806102ab88826101a6565b0390f35b6102c3818890600052602052604060002090565b546000905b600882036102db575b5050600101610293565b9095946001019483861161044f5761038461037e610358610326856103008c60051b90565b1b7fffffffff000000000000000000000000000000000000000000000000000000001690565b88907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690565b60601c90565b600073ffffffffffffffffffffffffffffffffffffffff8216815b8b8582106103f1575b5050506103e757816103dd600193926103c285948d610d11565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01965b01906102c8565b50956001906103e0565b61041b6104018361043493610d11565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b82146104425760010161039f565b505050600138808b6103a8565b956102d1565b906020808351928381520192019060005b8181106104735750505090565b82517fffffffff0000000000000000000000000000000000000000000000000000000016845260209384019390920191600101610466565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106104de57505050505090565b9091929394602080610541837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187526040838b5173ffffffffffffffffffffffffffffffffffffffff815116845201519181858201520190610455565b970193019301919392906104cf565b346101a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e2906105d09061ffff16610272565b906105da82610d25565b906105e483610c81565b9260009160009060009260028201935b81841061063d5787878760005b81811061061957818352604051806102ab85826104ab565b8061062660019286610d11565b5160206106338387610d11565b5101515201610601565b610651818690600052602052604060002090565b546000905b60088203610669575b50506001016105f4565b909694600101948386116108365789610686836103008b60051b90565b8a6106c361037e610358848b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b600073ffffffffffffffffffffffffffffffffffffffff8216815b878103610798575b505061078b5784600195939461077b8796610754602061074c868f996107398d9b6107346107809c6107188686610d11565b519073ffffffffffffffffffffffffffffffffffffffff169052565b610c81565b846107448484610d11565b510152610d11565b510151610cff565b907fffffffff00000000000000000000000000000000000000000000000000000000169052565b610d11565b5201975b0190610656565b5050505096600190610784565b9193816107cb61041b6107b086859b96989a9b610d11565b515173ffffffffffffffffffffffffffffffffffffffff1690565b146107e1575050600101918e9493918e936106de565b93509493915061080e8461075460206107fa8588610d11565b510151610807858a610d11565b5190610d11565b61082c61082561081e8388610d11565b5160010190565b9186610d11565b52600138806106e6565b9661065f565b90602061084d928181520190610455565b90565b346101a15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a15760043573ffffffffffffffffffffffffffffffffffffffff81168091036101a1577f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e3547f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e291906108f29061ffff16610272565b6108fb81610c81565b9160009360009160009360028301945b81851061092357878752604051806102ab898261083c565b610937818790600052602052604060002090565b546000905b6008820361094f575b505060010161090b565b9095600101958387116109d65761096a826103008360051b90565b6109a961041b61037e610358848b907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b86146109ba575b506001019061093c565b8a6109ce6001939c9261075485948e610d11565b0199906109b0565b610945565b346101a15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a1576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101a1577fffffffff000000000000000000000000000000000000000000000000000000007f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e29116600052602052602060406000205460601c604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b0357604052565b610a93565b908160209103126101a1575180151581036101a15790565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c5a573233148015610c5f575b610c5a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610bb4575b5061084d57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c5557600091610c26575b5038610baa565b610c48915060203d602011610c4e575b610c408183610ac2565b810190610b08565b38610c1f565b503d610c36565b610b20565b503390565b5060183610610b73565b67ffffffffffffffff8111610b035760051b60200190565b90610c8b82610c69565b610c986040519182610ac2565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610cc68294610c69565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805115610d0c5760200190565b610cd0565b8051821015610d0c5760209160051b010190565b90610d2f82610c69565b610d3c6040519182610ac2565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610d6a8294610c69565b0160005b818110610d7a57505050565b60405190604082019180831067ffffffffffffffff841117610b03576020926040526000815260608382015282828601015201610d6e56fea2646970667358221220cdc08281d40f2d9b1eda4fd3152689c4909979ca9adddd4cbfc7e53abffe641b64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4FE5DD79 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x52EF6B2C EQ PUSH2 0x62 JUMPI DUP1 PUSH4 0x7A0ED627 EQ PUSH2 0x5D JUMPI DUP1 PUSH4 0xADFCA15E EQ PUSH2 0x58 JUMPI PUSH4 0xCDFFACC6 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9DB JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0x550 JUMP JUMPDEST PUSH2 0x1F6 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH2 0x9E PUSH2 0xB2C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x174 JUMPI PUSH32 0x48E2B09300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x439B4DA6230337E2A9F4A90D201BAC6B66C68D0F1BCC968824D5B10DEF70A853 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 PUSH1 0x40 DUP2 DUP4 ADD SWAP3 DUP3 DUP2 MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1BD JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP1 PUSH2 0x279 SWAP1 PUSH2 0xFFFF AND JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x283 DUP3 PUSH2 0xC81 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP5 PUSH1 0x2 DUP3 ADD SWAP6 JUMPDEST DUP2 DUP5 LT PUSH2 0x2AF JUMPI DUP5 DUP7 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP9 DUP3 PUSH2 0x1A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2C3 DUP2 DUP9 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x2DB JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 SWAP6 SWAP5 PUSH1 0x1 ADD SWAP5 DUP4 DUP7 GT PUSH2 0x44F JUMPI PUSH2 0x384 PUSH2 0x37E PUSH2 0x358 PUSH2 0x326 DUP6 PUSH2 0x300 DUP13 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST DUP9 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 JUMPDEST DUP12 DUP6 DUP3 LT PUSH2 0x3F1 JUMPI JUMPDEST POP POP POP PUSH2 0x3E7 JUMPI DUP2 PUSH2 0x3DD PUSH1 0x1 SWAP4 SWAP3 PUSH2 0x3C2 DUP6 SWAP5 DUP14 PUSH2 0xD11 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST ADD SWAP7 JUMPDEST ADD SWAP1 PUSH2 0x2C8 JUMP JUMPDEST POP SWAP6 PUSH1 0x1 SWAP1 PUSH2 0x3E0 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x401 DUP4 PUSH2 0x434 SWAP4 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 EQ PUSH2 0x442 JUMPI PUSH1 0x1 ADD PUSH2 0x39F JUMP JUMPDEST POP POP POP PUSH1 0x1 CODESIZE DUP1 DUP12 PUSH2 0x3A8 JUMP JUMPDEST SWAP6 PUSH2 0x2D1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x473 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x466 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP2 PUSH1 0x20 PUSH1 0x40 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x4DE JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH1 0x20 DUP1 PUSH2 0x541 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 DUP7 PUSH1 0x1 SWAP7 SUB ADD DUP8 MSTORE PUSH1 0x40 DUP4 DUP12 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 MLOAD AND DUP5 MSTORE ADD MLOAD SWAP2 DUP2 DUP6 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x455 JUMP JUMPDEST SWAP8 ADD SWAP4 ADD SWAP4 ADD SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x4CF JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP1 PUSH2 0x5D0 SWAP1 PUSH2 0xFFFF AND PUSH2 0x272 JUMP JUMPDEST SWAP1 PUSH2 0x5DA DUP3 PUSH2 0xD25 JUMP JUMPDEST SWAP1 PUSH2 0x5E4 DUP4 PUSH2 0xC81 JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP2 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP3 PUSH1 0x2 DUP3 ADD SWAP4 JUMPDEST DUP2 DUP5 LT PUSH2 0x63D JUMPI DUP8 DUP8 DUP8 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x619 JUMPI DUP2 DUP4 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP6 DUP3 PUSH2 0x4AB JUMP JUMPDEST DUP1 PUSH2 0x626 PUSH1 0x1 SWAP3 DUP7 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH1 0x20 PUSH2 0x633 DUP4 DUP8 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD MSTORE ADD PUSH2 0x601 JUMP JUMPDEST PUSH2 0x651 DUP2 DUP7 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x669 JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x5F4 JUMP JUMPDEST SWAP1 SWAP7 SWAP5 PUSH1 0x1 ADD SWAP5 DUP4 DUP7 GT PUSH2 0x836 JUMPI DUP10 PUSH2 0x686 DUP4 PUSH2 0x300 DUP12 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST DUP11 PUSH2 0x6C3 PUSH2 0x37E PUSH2 0x358 DUP5 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 JUMPDEST DUP8 DUP2 SUB PUSH2 0x798 JUMPI JUMPDEST POP POP PUSH2 0x78B JUMPI DUP5 PUSH1 0x1 SWAP6 SWAP4 SWAP5 PUSH2 0x77B DUP8 SWAP7 PUSH2 0x754 PUSH1 0x20 PUSH2 0x74C DUP7 DUP16 SWAP10 PUSH2 0x739 DUP14 SWAP12 PUSH2 0x734 PUSH2 0x780 SWAP13 PUSH2 0x718 DUP7 DUP7 PUSH2 0xD11 JUMP JUMPDEST MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH2 0xC81 JUMP JUMPDEST DUP5 PUSH2 0x744 DUP5 DUP5 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MSTORE PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD PUSH2 0xCFF JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 MSTORE JUMP JUMPDEST PUSH2 0xD11 JUMP JUMPDEST MSTORE ADD SWAP8 JUMPDEST ADD SWAP1 PUSH2 0x656 JUMP JUMPDEST POP POP POP POP SWAP7 PUSH1 0x1 SWAP1 PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP4 DUP2 PUSH2 0x7CB PUSH2 0x41B PUSH2 0x7B0 DUP7 DUP6 SWAP12 SWAP7 SWAP9 SWAP11 SWAP12 PUSH2 0xD11 JUMP JUMPDEST MLOAD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST EQ PUSH2 0x7E1 JUMPI POP POP PUSH1 0x1 ADD SWAP2 DUP15 SWAP5 SWAP4 SWAP2 DUP15 SWAP4 PUSH2 0x6DE JUMP JUMPDEST SWAP4 POP SWAP5 SWAP4 SWAP2 POP PUSH2 0x80E DUP5 PUSH2 0x754 PUSH1 0x20 PUSH2 0x7FA DUP6 DUP9 PUSH2 0xD11 JUMP JUMPDEST MLOAD ADD MLOAD PUSH2 0x807 DUP6 DUP11 PUSH2 0xD11 JUMP JUMPDEST MLOAD SWAP1 PUSH2 0xD11 JUMP JUMPDEST PUSH2 0x82C PUSH2 0x825 PUSH2 0x81E DUP4 DUP9 PUSH2 0xD11 JUMP JUMPDEST MLOAD PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP7 PUSH2 0xD11 JUMP JUMPDEST MSTORE PUSH1 0x1 CODESIZE DUP1 PUSH2 0x6E6 JUMP JUMPDEST SWAP7 PUSH2 0x65F JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x84D SWAP3 DUP2 DUP2 MSTORE ADD SWAP1 PUSH2 0x455 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E3 SLOAD PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP2 SWAP1 PUSH2 0x8F2 SWAP1 PUSH2 0xFFFF AND PUSH2 0x272 JUMP JUMPDEST PUSH2 0x8FB DUP2 PUSH2 0xC81 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP4 PUSH1 0x0 SWAP2 PUSH1 0x0 SWAP4 PUSH1 0x2 DUP4 ADD SWAP5 JUMPDEST DUP2 DUP6 LT PUSH2 0x923 JUMPI DUP8 DUP8 MSTORE PUSH1 0x40 MLOAD DUP1 PUSH2 0x2AB DUP10 DUP3 PUSH2 0x83C JUMP JUMPDEST PUSH2 0x937 DUP2 DUP8 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x0 SWAP1 JUMPDEST PUSH1 0x8 DUP3 SUB PUSH2 0x94F JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x90B JUMP JUMPDEST SWAP1 SWAP6 PUSH1 0x1 ADD SWAP6 DUP4 DUP8 GT PUSH2 0x9D6 JUMPI PUSH2 0x96A DUP3 PUSH2 0x300 DUP4 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST PUSH2 0x9A9 PUSH2 0x41B PUSH2 0x37E PUSH2 0x358 DUP5 DUP12 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP7 EQ PUSH2 0x9BA JUMPI JUMPDEST POP PUSH1 0x1 ADD SWAP1 PUSH2 0x93C JUMP JUMPDEST DUP11 PUSH2 0x9CE PUSH1 0x1 SWAP4 SWAP13 SWAP3 PUSH2 0x754 DUP6 SWAP5 DUP15 PUSH2 0xD11 JUMP JUMPDEST ADD SWAP10 SWAP1 PUSH2 0x9B0 JUMP JUMPDEST PUSH2 0x945 JUMP JUMPDEST CALLVALUE PUSH2 0x1A1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1A1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xB03 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0xA93 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1A1 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1A1 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC5A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC5F JUMPI JUMPDEST PUSH2 0xC5A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBB4 JUMPI JUMPDEST POP PUSH2 0x84D JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC55 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC26 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBAA JUMP JUMPDEST PUSH2 0xC48 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC4E JUMPI JUMPDEST PUSH2 0xC40 DUP2 DUP4 PUSH2 0xAC2 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB08 JUMP JUMPDEST CODESIZE PUSH2 0xC1F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC36 JUMP JUMPDEST PUSH2 0xB20 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB73 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xB03 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC8B DUP3 PUSH2 0xC69 JUMP JUMPDEST PUSH2 0xC98 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xAC2 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xCC6 DUP3 SWAP5 PUSH2 0xC69 JUMP JUMPDEST ADD SWAP1 PUSH1 0x20 CALLDATASIZE SWAP2 ADD CALLDATACOPY JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD ISZERO PUSH2 0xD0C JUMPI PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0xCD0 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xD0C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xD2F DUP3 PUSH2 0xC69 JUMP JUMPDEST PUSH2 0xD3C PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xAC2 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xD6A DUP3 SWAP5 PUSH2 0xC69 JUMP JUMPDEST ADD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xD7A JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD SWAP2 DUP1 DUP4 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT OR PUSH2 0xB03 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x40 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xD6E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCD 0xC0 DUP3 DUP2 0xD4 0xF 0x2D SWAP12 0x1E 0xDA 0x4F 0xD3 ISZERO 0x26 DUP10 0xC4 SWAP1 SWAP10 PUSH26 0xCA9ADDDD4CBFC7E53ABFFE641B64736F6C634300081E00330000 ","sourceMap":"715:1456:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;1277:12;;:::i;:::-;715:1456;;;;;;;3174:18:180;;;3170:53;;2643:31:54;715:1456:50;;;;;;500:10:59;;;;636:1:180;500:10:59;;;715:1456:50;3170:53:180;3201:22;715:1456:50;3201:22:180;715:1456:50;;;;3201:22:180;715:1456:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15560:15:54;715:1456:50;;;15601:28:54;;715:1456:50;;;;;;;15601:28:54;;;;;:::i;:::-;15643:17;715:1456:50;15674:21:54;715:1456:50;15715:17:54;715:1456:50;15811:15:54;;;;15710:1067;15734:29;;;;;;16853:69;;;715:1456:50;;;;16853:69:54;715:1456:50;;:::i;:::-;;;;15765:11:54;15811:26;;;715:1456:50;;;;;;;;;;15811:26:54;715:1456:50;;15856:907:54;15888:22;15909:1;15888:22;;;;15856:907;15765:11;;15560:15;715:1456:50;15715:17:54;;15912:19;715:1456:50;;;15560:15:54;715:1456:50;15997:29:54;;;;15993:89;;16200:43;16208:34;16216:25;16122:40;16138:22;;;715:1456:50;;;;16138:22:54;715:1456:50;;;;;16122:40:54;16216:25;715:1456:50;;;;;;;;;;;;16216:25:54;715:1456:50;;;;;16208:34:54;715:1456:50;;;;16200:43:54;715:1456:50;;;;;16331:22:54;;;;;;;16306:258;16586:75;;;;;16683:28;;15560:15;16683:28;;;;;;;:::i;:::-;715:1456:50;;;;;;16683:28:54;715:1456:50;15912:19:54;15861:25;715:1456:50;15861:25:54;;;16586:75;16630:8;;15560:15;16630:8;;;16355:12;16408:21;;;16399:30;16408:21;;:::i;:::-;715:1456:50;;;;;16408:21:54;715:1456:50;;;;16399:30:54;;;16395:147;;15560:15;715:1456:50;16311:18:54;;16395:147;16461:19;;;15560:15;16510:5;;;;;15993:89;16054:5;;;715:1456:50;;;;;;;;;;;;;;-1:-1:-1;715:1456:50;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;11896:15:54;715:1456:50;;;11941:26:54;;715:1456:50;;;;11941:26:54;;;;;:::i;:::-;12019:28;;;;:::i;:::-;12061:17;715:1456:50;12092:21:54;715:1456:50;12180:17:54;715:1456:50;12276:15:54;;;;12175:1466;12199:29;;;;;;13660:18;;;715:1456:50;13680:22:54;;;;;;14091:73;;;715:1456:50;;;;14091:73:54;715:1456:50;;:::i;13704:12:54:-;13759:29;;11896:15;13759:29;;;:::i;:::-;715:1456:50;13387:34:54;13834:25;;;;:::i;:::-;;:35;;13939:80;715:1456:50;13660:18:54;;12230:11;12276:26;;;715:1456:50;;;;;;;;;;12276:26:54;715:1456:50;;12321:1306:54;12353:22;12374:1;12353:22;;;;12321:1306;12230:11;;11896:15;715:1456:50;12180:17:54;;12377:19;715:1456:50;;;11896:15:54;715:1456:50;12462:29:54;;;;12458:89;;12603:22;12587:40;12603:22;;;715:1456:50;;;;12587:40:54;12681:25;12665:43;12673:34;12681:25;;;715:1456:50;;;;;;;;;;;;12665:43:54;715:1456:50;;;;;12796:23:54;;;;;;12771:437;13230:75;;;;13327:24;11896:15;13327:24;;;13473:48;13327:24;;13473:48;13387:34;13473:24;13327;;;13424:27;13327:24;;:38;13543:32;13327:24;;;;;:::i;:::-;;715:1456:50;;;;;;13327:38:54;13424:27;:::i;:::-;13387:24;;;;;:::i;:::-;;:34;:64;13473:24;:::i;:::-;;:34;;:48;:::i;:::-;715:1456:50;;;;;;13473:48:54;13543:32;:::i;:::-;715:1456:50;;12377:19:54;12326:25;715:1456:50;12326:25:54;;;13230:75;13274:8;;;;;11896:15;13274:8;;;12821:12;12865:25;;;:40;:31;:25;;;;;;;;;:::i;:::-;;715:1456:50;;;;;12865:40:54;;12861:325;;12821:12;;11896:15;715:1456:50;12776:18:54;;;;;;;;;12861:325;12937:25;;;;;;:77;:25;:77;13387:34;12937:25;;;;:::i;:::-;;:35;;12973:29;;;;:::i;:::-;715:1456:50;12937:77:54;;:::i;:::-;13044:31;;;;;;:::i;:::-;715:1456:50;;;;;13044:31:54;;;;:::i;:::-;715:1456:50;11896:15:54;13154:5;;;;12458:89;12519:5;;;715:1456:50;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;14358:15:54;715:1456:50;;;14358:15:54;14399:27;;715:1456:50;;;;14399:27:54;;;;:::i;:::-;14441:20;-1:-1:-1;14475:21:54;-1:-1:-1;14563:17:54;-1:-1:-1;14659:15:54;;;;14558:688;14582:29;;;;;;15316:72;;;715:1456:50;;;;15316:72:54;715:1456:50;;:::i;14613:11:54:-;14659:26;;;715:1456:50;;;;;;;;;;14659:26:54;715:1456:50;-1:-1:-1;14704:528:54;14736:22;14757:1;14736:22;;;;14704:528;14613:11;;14358:15;715:1456:50;14563:17:54;;14760:19;715:1456:50;;14358:15:54;715:1456:50;14845:29:54;;;;14841:89;;14970:40;14986:22;;;715:1456:50;;;;14970:40:54;15037:52;15046:43;15054:34;15062:25;;;715:1456:50;;;;;;;;;;;;15037:52:54;;;15033:181;;14760:19;;14358:15;715:1456:50;14709:25:54;;;15033:181;15117:34;;14358:15;15117:34;;;;;;;;:::i;:::-;715:1456:50;15033:181:54;;;;14841:89;14902:5;;715:1456:50;;;;;;;;;;;;;;;;;;;;;;17073:25:54;715:1456:50;-1:-1:-1;715:1456:50;;;;;-1:-1:-1;715:1456:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;715:1456:50;1029:19:76;715:1456:50;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;715:1456:50;;;1676:74:76;;715:1456:50;;;1676:74:76;;;715:1456:50;1327:10:76;715:1456:50;;;;1744:4:76;715:1456:50;;;;;-1:-1:-1;1676:74:76;;715:1456:50;;;;;;1676:74:76;;;;;;;715:1456:50;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;1323:95::-;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;715:1456:50;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;-1:-1:-1;715:1456:50;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;715:1456:50;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"712000","executionCost":"infinite","totalCost":"infinite"},"external":{"facetAddress(bytes4)":"2453","facetAddresses()":"infinite","facetFunctionSelectors(address)":"infinite","facets()":"infinite","initDiamondLoupeStorage()":"infinite"}},"methodIdentifiers":{"facetAddress(bytes4)":"cdffacc6","facetAddresses()":"52ef6b2c","facetFunctionSelectors(address)":"adfca15e","facets()":"7a0ed627","initDiamondLoupeStorage()":"4fe5dd79"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"functionSelector\",\"type\":\"bytes4\"}],\"name\":\"facetAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"facetAddress_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"facetAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"facetAddresses_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"facetFunctionSelectors\",\"outputs\":[{\"internalType\":\"bytes4[]\",\"name\":\"facetFunctionSelectors_\",\"type\":\"bytes4[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"facets\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct Facet[]\",\"name\":\"facets_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initDiamondLoupeStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2535Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"facetAddress(bytes4)\":{\"params\":{\"functionSelector\":\"The function selector.\"},\"returns\":{\"facetAddress_\":\"The facet address that supports `functionSelector`, or the zero address if the facet is not found.\"}},\"facetAddresses()\":{\"returns\":{\"facetAddresses_\":\"The facet addresses used by the diamond.\"}},\"facetFunctionSelectors(address)\":{\"params\":{\"facetAddress\":\"The facet address.\"},\"returns\":{\"facetFunctionSelectors_\":\"The function selectors supported by `facet`.\"}},\"facets()\":{\"returns\":{\"facets_\":\"The facet addresses used by the diamond and their function selectors.\"}},\"initDiamondLoupeStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"Diamond Loupe (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"facetAddress(bytes4)\":{\"notice\":\"Gets the facet address that supports a given function selector.\"},\"facetAddresses()\":{\"notice\":\"Get all the facet addresses used by the diamond.\"},\"facetFunctionSelectors(address)\":{\"notice\":\"Gets all the function selectors supported by a facet.\"},\"facets()\":{\"notice\":\"Gets all the facet addresses used by the diamond and their function selectors.\"},\"initDiamondLoupeStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: DiamondLoupe.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/facets/DiamondLoupeFacet.sol\":\"DiamondLoupeFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/errors/DiamondErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\\n/// @param facet The facet address.\\nerror EmptyFacet(address facet);\\n\\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\\n/// @param facet The facet address.\\nerror NonContractFacet(address facet);\\n\\n/// @notice Thrown when trying to add a function selector that has already been added.\\n/// @param facet The facet address which already has the function.\\n/// @param selector The function selector which has already been added.\\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\\n/// @param facet The facet address which is not zero.\\nerror RemovingWithNonZeroAddressFacet(address facet);\\n\\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\\n/// @param selector The function selector which has not been added.\\nerror FunctionNotFound(bytes4 selector);\\n\\n/// @notice Thrown when trying to remove or replace an immutable function.\\n/// @param selector The function selector which is immutable.\\nerror ModifyingImmutableFunction(bytes4 selector);\\n\\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\\n/// @param facet The facet address.\\n/// @param selector The function selector.\\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\\nerror ZeroAddressTargetInitCallButNonEmptyData();\\n\\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\\n/// @param target The target address for the initialization call.\\nerror EmptyInitCallData(address target);\\n\\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\\n/// @param target The target address for the initialization call.\\nerror NonContractInitCallTarget(address target);\\n\\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\\n/// @param target The target address for the initialization call.\\n/// @param data The data for the initialization call.\\nerror InitCallReverted(address target, bytes data);\\n\",\"keccak256\":\"0x2647bd9f06a6b0d435b142d7fc15e13c51e31217822b01a3f598b7c40edb9e20\",\"license\":\"MIT\"},\"contracts/diamond/events/DiamondCutEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @notice Emitted when at least a cut action is operated on the diamond.\\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\\n/// @param target The address of the contract where `data` was executed.\\n/// @param data The encoded function call executed on `target`.\\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\\n\",\"keccak256\":\"0x74988038bb78c2fba84434628255bd30f1282dd7e6a59ef3849cb40786428aea\",\"license\":\"MIT\"},\"contracts/diamond/facets/DiamondLoupeFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {DiamondStorage} from \\\"./../libraries/DiamondStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Diamond Loupe (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract DiamondLoupeFacet is IDiamondLoupe, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using DiamondStorage for DiamondStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initDiamondLoupeStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        DiamondStorage.initDiamondLoupe();\\n    }\\n\\n    /// @inheritdoc IDiamondLoupe\\n    function facets() external view returns (Facet[] memory facets_) {\\n        facets_ = DiamondStorage.layout().facets();\\n    }\\n\\n    /// @inheritdoc IDiamondLoupe\\n    function facetFunctionSelectors(address facet) external view returns (bytes4[] memory facetFunctionSelectors_) {\\n        facetFunctionSelectors_ = DiamondStorage.layout().facetFunctionSelectors(facet);\\n    }\\n\\n    /// @inheritdoc IDiamondLoupe\\n    function facetAddresses() external view returns (address[] memory facetAddresses_) {\\n        facetAddresses_ = DiamondStorage.layout().facetAddresses();\\n    }\\n\\n    /// @inheritdoc IDiamondLoupe\\n    function facetAddress(bytes4 functionSelector) external view returns (address facetAddress_) {\\n        facetAddress_ = DiamondStorage.layout().facetAddress(functionSelector);\\n    }\\n}\\n\",\"keccak256\":\"0x9d7cfb7993b16a332f1ba1b13c4f12b66b02bbd1fbfbc1356696625307c38447\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"},\"contracts/diamond/libraries/DiamondStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    EmptyFacet,\\n    NonContractFacet,\\n    FunctionAlreadyPresent,\\n    RemovingWithNonZeroAddressFacet,\\n    FunctionNotFound,\\n    ModifyingImmutableFunction,\\n    ReplacingFunctionByItself,\\n    ZeroAddressTargetInitCallButNonEmptyData,\\n    EmptyInitCallData,\\n    NonContractInitCallTarget,\\n    InitCallReverted\\n} from \\\"./../errors/DiamondErrors.sol\\\";\\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {DiamondCut} from \\\"./../events/DiamondCutEvents.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\\nlibrary DiamondStorage {\\n    using Address for address;\\n    using DiamondStorage for DiamondStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        // selector => (facet address, selector slot position)\\n        mapping(bytes4 => bytes32) diamondFacets;\\n        // number of selectors registered in selectorSlots\\n        uint16 selectorCount;\\n        // array of selector slots with 8 selectors per slot\\n        mapping(uint256 => bytes32) selectorSlots;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.Diamond.storage\\\")) - 1);\\n\\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    function initDiamondCut() internal {\\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    function initDiamondLoupe() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\\n        s.cutFacets(cuts);\\n        initializationCall(target, data);\\n        emit DiamondCut(cuts, target, data);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\\n        s.cutFacets(cuts);\\n        uint256 length = initializations.length;\\n        for (uint256 i; i < length; ++i) {\\n            initializationCall(initializations[i].target, initializations[i].data);\\n        }\\n        emit DiamondCut(cuts, address(0), \\\"\\\");\\n    }\\n\\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\\n        uint256 originalSelectorCount = s.selectorCount;\\n        uint256 selectorCount = originalSelectorCount;\\n        bytes32 selectorSlot;\\n\\n        // Check if last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            // get last selectorSlot\\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\\n        }\\n\\n        uint256 length = facetCuts.length;\\n        for (uint256 i; i < length; ++i) {\\n            FacetCut memory facetCut = facetCuts[i];\\n\\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\\n\\n            FacetCutAction action = facetCut.action;\\n            if (action == FacetCutAction.ADD) {\\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            } else if (action == FacetCutAction.REPLACE) {\\n                s.replaceFacetSelectors(facetCut);\\n            } else {\\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            }\\n        }\\n\\n        if (selectorCount != originalSelectorCount) {\\n            s.selectorCount = uint16(selectorCount);\\n        }\\n\\n        // If last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n        }\\n    }\\n\\n    function addFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\\n\\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\\n\\n            // add facet for selector\\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\\n\\n            // clear selector position in slot and add selector\\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\\n\\n            // if slot is full then write it to storage\\n            if (selectorInSlotPosition == 224) {\\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n                selectorSlot = 0;\\n            }\\n\\n            unchecked {\\n                ++selectorCount;\\n            }\\n        }\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function removeFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\\n\\n        uint256 selectorSlotCount = selectorCount >> 3;\\n        uint256 selectorInSlotIndex = selectorCount & 7;\\n\\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n\\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\\n\\n            if (selectorSlot == 0) {\\n                unchecked {\\n                    selectorSlotCount--;\\n                }\\n                selectorSlot = s.selectorSlots[selectorSlotCount];\\n                selectorInSlotIndex = 7;\\n            } else {\\n                unchecked {\\n                    selectorInSlotIndex--;\\n                }\\n            }\\n\\n            bytes4 lastSelector;\\n            uint256 oldSelectorsSlotCount;\\n            uint256 oldSelectorInSlotPosition;\\n\\n            // adding a block here prevents stack too deep error\\n            {\\n                // replace selector with last selector in l.facets\\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\\n\\n                if (lastSelector != selector) {\\n                    // update last selector slot position info\\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\\n                }\\n\\n                delete s.diamondFacets[selector];\\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\\n            }\\n\\n            if (oldSelectorsSlotCount != selectorSlotCount) {\\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\\n\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                oldSelectorSlot =\\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n\\n                // update storage with the modified slot\\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\\n            } else {\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                selectorSlot =\\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n            }\\n\\n            if (selectorInSlotIndex == 0) {\\n                delete s.selectorSlots[selectorSlotCount];\\n                selectorSlot = 0;\\n            }\\n        }\\n\\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\\n        address facet = facetCut.facet;\\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n            address oldFacetAddress = address(bytes20(oldFacet));\\n\\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\\n\\n            // replace old facet address\\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\\n        }\\n    }\\n\\n    function initializationCall(address target, bytes memory data) internal {\\n        if (target == address(0)) {\\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\\n        } else {\\n            if (data.length == 0) revert EmptyInitCallData(target);\\n            if (target != address(this)) {\\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\\n            }\\n\\n            (bool success, bytes memory returndata) = target.delegatecall(data);\\n            if (!success) {\\n                uint256 returndataLength = returndata.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, returndata), returndataLength)\\n                    }\\n                } else {\\n                    revert InitCallReverted(target, data);\\n                }\\n            }\\n        }\\n    }\\n\\n    function delegateOnFallback(Layout storage s) internal {\\n        bytes4 selector = msg.sig;\\n        address facet = s.facetAddress(selector);\\n        if (facet == address(0)) revert FunctionNotFound(selector);\\n        assembly {\\n            calldatacopy(0, 0, calldatasize())\\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n            returndatacopy(0, 0, returndatasize())\\n            switch result\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            diamondFacets = new Facet[](selectorCount);\\n\\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\\n                        if (diamondFacets[facetIndex].facet == facet) {\\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\\n                            ++numFacetSelectors[facetIndex];\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    diamondFacets[numFacets].facet = facet;\\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\\n                    diamondFacets[numFacets].selectors[0] = selector;\\n                    numFacetSelectors[numFacets] = 1;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                uint256 numSelectors = numFacetSelectors[facetIndex];\\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\\n\\n                // setting the number of selectors\\n                assembly {\\n                    mstore(selectors, numSelectors)\\n                }\\n            }\\n\\n            // setting the number of facets\\n            assembly {\\n                mstore(diamondFacets, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            selectors = new bytes4[](selectorCount);\\n\\n            uint256 numSelectors;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n\\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\\n                        selectors[numSelectors] = selector;\\n                        ++numSelectors;\\n                    }\\n                }\\n            }\\n\\n            // set the number of selectors in the array\\n            assembly {\\n                mstore(selectors, numSelectors)\\n            }\\n        }\\n    }\\n\\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            addresses = new address[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                        if (facet == addresses[facetIndex]) {\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    addresses[numFacets] = facet;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            // set the number of facet addresses in the array\\n            assembly {\\n                mstore(addresses, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\\n        facet = address(bytes20(s.diamondFacets[selector]));\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x930e0c854d559149621d2185cef92daadde9f514e12cca2ca30a1a9d1af063d7\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"facetAddress(bytes4)":{"notice":"Gets the facet address that supports a given function selector."},"facetAddresses()":{"notice":"Get all the facet addresses used by the diamond."},"facetFunctionSelectors(address)":{"notice":"Gets all the function selectors supported by a facet."},"facets()":{"notice":"Gets all the facet addresses used by the diamond and their function selectors."},"initDiamondLoupeStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: DiamondLoupe."}},"version":1}}},"contracts/diamond/interfaces/IDiamondCut.sol":{"IDiamondCut":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2535Note: the ERC-165 identifier for this interface is 0x1f931c1c","kind":"dev","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"details":"Emits a {DiamondCut} event.","params":{"cuts":"The list of facet addresses, actions and function selectors to apply to the diamond.","data":"The encoded function call to execute on `target`.","target":"The address of the contract to execute `data` on."}}},"title":"ERC2535 Diamond Standard, Diamond Cut (functions).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":"1f931c1c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2535Note: the ERC-165 identifier for this interface is 0x1f931c1c\",\"kind\":\"dev\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"details\":\"Emits a {DiamondCut} event.\",\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors to apply to the diamond.\",\"data\":\"The encoded function call to execute on `target`.\",\"target\":\"The address of the contract to execute `data` on.\"}}},\"title\":\"ERC2535 Diamond Standard, Diamond Cut (functions).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Add/replace/remove facet functions and optionally execute a function with delegatecall.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/interfaces/IDiamondCut.sol\":\"IDiamondCut\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"diamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Add/replace/remove facet functions and optionally execute a function with delegatecall."}},"version":1}}},"contracts/diamond/interfaces/IDiamondCutBatchInit.sol":{"IDiamondCutBatchInit":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Initialization[]","name":"initializations","type":"tuple[]"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-XXXXNote: the ERC-165 identifier for this interface is 0xb2afc5b5","kind":"dev","methods":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":{"details":"Emits a {DiamondCut} event.","params":{"cuts":"The list of facet addresses, actions and function selectors to apply to the diamond.","initializations":"The list of addresses and encoded function calls to execute with delegatecall."}}},"title":"ERCXXX Diamond Standard, Diamond Cut Batch Init extension.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":"b2afc5b5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Initialization[]\",\"name\":\"initializations\",\"type\":\"tuple[]\"}],\"name\":\"diamondCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-XXXXNote: the ERC-165 identifier for this interface is 0xb2afc5b5\",\"kind\":\"dev\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])\":{\"details\":\"Emits a {DiamondCut} event.\",\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors to apply to the diamond.\",\"initializations\":\"The list of addresses and encoded function calls to execute with delegatecall.\"}}},\"title\":\"ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])\":{\"notice\":\"Add/replace/remove facet functions and execute a batch of functions with delegatecall.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":\"IDiamondCutBatchInit\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"diamondCut((address,uint8,bytes4[])[],(address,bytes)[])":{"notice":"Add/replace/remove facet functions and execute a batch of functions with delegatecall."}},"version":1}}},"contracts/diamond/interfaces/IDiamondLoupe.sol":{"IDiamondLoupe":{"abi":[{"inputs":[{"internalType":"bytes4","name":"functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"diamondFacetAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"diamondFacetsAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facetAddress","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct Facet[]","name":"diamondFacets","type":"tuple[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2535Note: the ERC-165 identifier for this interface is 0x48e2b093","kind":"dev","methods":{"facetAddress(bytes4)":{"params":{"functionSelector":"The function selector."},"returns":{"diamondFacetAddress":"The facet address that supports `functionSelector`, or the zero address if the facet is not found."}},"facetAddresses()":{"returns":{"diamondFacetsAddresses":"The facet addresses used by the diamond."}},"facetFunctionSelectors(address)":{"params":{"facetAddress":"The facet address."},"returns":{"selectors":"The function selectors supported by `facet`."}},"facets()":{"returns":{"diamondFacets":"The facet addresses used by the diamond and their function selectors."}}},"title":"ERC2535 Diamond Standard, Diamond Loupe.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"facetAddress(bytes4)":"cdffacc6","facetAddresses()":"52ef6b2c","facetFunctionSelectors(address)":"adfca15e","facets()":"7a0ed627"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"functionSelector\",\"type\":\"bytes4\"}],\"name\":\"facetAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"diamondFacetAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"facetAddresses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"diamondFacetsAddresses\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facetAddress\",\"type\":\"address\"}],\"name\":\"facetFunctionSelectors\",\"outputs\":[{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"facets\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct Facet[]\",\"name\":\"diamondFacets\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2535Note: the ERC-165 identifier for this interface is 0x48e2b093\",\"kind\":\"dev\",\"methods\":{\"facetAddress(bytes4)\":{\"params\":{\"functionSelector\":\"The function selector.\"},\"returns\":{\"diamondFacetAddress\":\"The facet address that supports `functionSelector`, or the zero address if the facet is not found.\"}},\"facetAddresses()\":{\"returns\":{\"diamondFacetsAddresses\":\"The facet addresses used by the diamond.\"}},\"facetFunctionSelectors(address)\":{\"params\":{\"facetAddress\":\"The facet address.\"},\"returns\":{\"selectors\":\"The function selectors supported by `facet`.\"}},\"facets()\":{\"returns\":{\"diamondFacets\":\"The facet addresses used by the diamond and their function selectors.\"}}},\"title\":\"ERC2535 Diamond Standard, Diamond Loupe.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"facetAddress(bytes4)\":{\"notice\":\"Gets the facet address that supports a given function selector.\"},\"facetAddresses()\":{\"notice\":\"Get all the facet addresses used by the diamond.\"},\"facetFunctionSelectors(address)\":{\"notice\":\"Gets all the function selectors supported by a facet.\"},\"facets()\":{\"notice\":\"Gets all the facet addresses used by the diamond and their function selectors.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/interfaces/IDiamondLoupe.sol\":\"IDiamondLoupe\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"facetAddress(bytes4)":{"notice":"Gets the facet address that supports a given function selector."},"facetAddresses()":{"notice":"Get all the facet addresses used by the diamond."},"facetFunctionSelectors(address)":{"notice":"Gets all the function selectors supported by a facet."},"facets()":{"notice":"Gets all the facet addresses used by the diamond and their function selectors."}},"version":1}}},"contracts/diamond/libraries/DiamondStorage.sol":{"DiamondStorage":{"abi":[],"devdoc":{"details":"derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122094a3b8f285c6d5aacf4ef62a8e92a10b095f30bc5b9ddf07afbf987c90ed7db464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 LOG3 0xB8 CALLCODE DUP6 0xC6 0xD5 0xAA 0xCF 0x4E 0xF6 0x2A DUP15 SWAP3 LOG1 SIGNEXTEND MULMOD PUSH0 ADDRESS 0xBC JUMPDEST SWAP14 0xDF SMOD 0xAF 0xBF SWAP9 PUSH29 0x90ED7DB464736F6C634300081E00330000000000000000000000000000 ","sourceMap":"1164:16125:54:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122094a3b8f285c6d5aacf4ef62a8e92a10b095f30bc5b9ddf07afbf987c90ed7db464736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 LOG3 0xB8 CALLCODE DUP6 0xC6 0xD5 0xAA 0xCF 0x4E 0xF6 0x2A DUP15 SWAP3 LOG1 SIGNEXTEND MULMOD PUSH0 ADDRESS 0xBC JUMPDEST SWAP14 0xDF SMOD 0xAF 0xBF SWAP9 PUSH29 0x90ED7DB464736F6C634300081E00330000000000000000000000000000 ","sourceMap":"1164:16125:54:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"addFacetSelectors(struct DiamondStorage.Layout storage pointer,uint256,bytes32,struct FacetCut memory)":"infinite","cutFacets(struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory)":"infinite","delegateOnFallback(struct DiamondStorage.Layout storage pointer)":"infinite","diamondCut(struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,address,bytes memory)":"infinite","diamondCut(struct DiamondStorage.Layout storage pointer,struct FacetCut memory[] memory,struct Initialization memory[] memory)":"infinite","facetAddress(struct DiamondStorage.Layout storage pointer,bytes4)":"infinite","facetAddresses(struct DiamondStorage.Layout storage pointer)":"infinite","facetFunctionSelectors(struct DiamondStorage.Layout storage pointer,address)":"infinite","facets(struct DiamondStorage.Layout storage pointer)":"infinite","initDiamondCut()":"infinite","initDiamondLoupe()":"infinite","initializationCall(address,bytes memory)":"infinite","layout()":"infinite","removeFacetSelectors(struct DiamondStorage.Layout storage pointer,uint256,bytes32,struct FacetCut memory)":"infinite","replaceFacetSelectors(struct DiamondStorage.Layout storage pointer,struct FacetCut memory)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/diamond/libraries/DiamondStorage.sol\":\"DiamondStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/errors/DiamondErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\\n/// @param facet The facet address.\\nerror EmptyFacet(address facet);\\n\\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\\n/// @param facet The facet address.\\nerror NonContractFacet(address facet);\\n\\n/// @notice Thrown when trying to add a function selector that has already been added.\\n/// @param facet The facet address which already has the function.\\n/// @param selector The function selector which has already been added.\\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\\n/// @param facet The facet address which is not zero.\\nerror RemovingWithNonZeroAddressFacet(address facet);\\n\\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\\n/// @param selector The function selector which has not been added.\\nerror FunctionNotFound(bytes4 selector);\\n\\n/// @notice Thrown when trying to remove or replace an immutable function.\\n/// @param selector The function selector which is immutable.\\nerror ModifyingImmutableFunction(bytes4 selector);\\n\\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\\n/// @param facet The facet address.\\n/// @param selector The function selector.\\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\\nerror ZeroAddressTargetInitCallButNonEmptyData();\\n\\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\\n/// @param target The target address for the initialization call.\\nerror EmptyInitCallData(address target);\\n\\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\\n/// @param target The target address for the initialization call.\\nerror NonContractInitCallTarget(address target);\\n\\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\\n/// @param target The target address for the initialization call.\\n/// @param data The data for the initialization call.\\nerror InitCallReverted(address target, bytes data);\\n\",\"keccak256\":\"0x2647bd9f06a6b0d435b142d7fc15e13c51e31217822b01a3f598b7c40edb9e20\",\"license\":\"MIT\"},\"contracts/diamond/events/DiamondCutEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @notice Emitted when at least a cut action is operated on the diamond.\\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\\n/// @param target The address of the contract where `data` was executed.\\n/// @param data The encoded function call executed on `target`.\\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\\n\",\"keccak256\":\"0x74988038bb78c2fba84434628255bd30f1282dd7e6a59ef3849cb40786428aea\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"},\"contracts/diamond/libraries/DiamondStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    EmptyFacet,\\n    NonContractFacet,\\n    FunctionAlreadyPresent,\\n    RemovingWithNonZeroAddressFacet,\\n    FunctionNotFound,\\n    ModifyingImmutableFunction,\\n    ReplacingFunctionByItself,\\n    ZeroAddressTargetInitCallButNonEmptyData,\\n    EmptyInitCallData,\\n    NonContractInitCallTarget,\\n    InitCallReverted\\n} from \\\"./../errors/DiamondErrors.sol\\\";\\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {DiamondCut} from \\\"./../events/DiamondCutEvents.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\\nlibrary DiamondStorage {\\n    using Address for address;\\n    using DiamondStorage for DiamondStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        // selector => (facet address, selector slot position)\\n        mapping(bytes4 => bytes32) diamondFacets;\\n        // number of selectors registered in selectorSlots\\n        uint16 selectorCount;\\n        // array of selector slots with 8 selectors per slot\\n        mapping(uint256 => bytes32) selectorSlots;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.Diamond.storage\\\")) - 1);\\n\\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    function initDiamondCut() internal {\\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    function initDiamondLoupe() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\\n        s.cutFacets(cuts);\\n        initializationCall(target, data);\\n        emit DiamondCut(cuts, target, data);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\\n        s.cutFacets(cuts);\\n        uint256 length = initializations.length;\\n        for (uint256 i; i < length; ++i) {\\n            initializationCall(initializations[i].target, initializations[i].data);\\n        }\\n        emit DiamondCut(cuts, address(0), \\\"\\\");\\n    }\\n\\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\\n        uint256 originalSelectorCount = s.selectorCount;\\n        uint256 selectorCount = originalSelectorCount;\\n        bytes32 selectorSlot;\\n\\n        // Check if last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            // get last selectorSlot\\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\\n        }\\n\\n        uint256 length = facetCuts.length;\\n        for (uint256 i; i < length; ++i) {\\n            FacetCut memory facetCut = facetCuts[i];\\n\\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\\n\\n            FacetCutAction action = facetCut.action;\\n            if (action == FacetCutAction.ADD) {\\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            } else if (action == FacetCutAction.REPLACE) {\\n                s.replaceFacetSelectors(facetCut);\\n            } else {\\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            }\\n        }\\n\\n        if (selectorCount != originalSelectorCount) {\\n            s.selectorCount = uint16(selectorCount);\\n        }\\n\\n        // If last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n        }\\n    }\\n\\n    function addFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\\n\\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\\n\\n            // add facet for selector\\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\\n\\n            // clear selector position in slot and add selector\\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\\n\\n            // if slot is full then write it to storage\\n            if (selectorInSlotPosition == 224) {\\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n                selectorSlot = 0;\\n            }\\n\\n            unchecked {\\n                ++selectorCount;\\n            }\\n        }\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function removeFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\\n\\n        uint256 selectorSlotCount = selectorCount >> 3;\\n        uint256 selectorInSlotIndex = selectorCount & 7;\\n\\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n\\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\\n\\n            if (selectorSlot == 0) {\\n                unchecked {\\n                    selectorSlotCount--;\\n                }\\n                selectorSlot = s.selectorSlots[selectorSlotCount];\\n                selectorInSlotIndex = 7;\\n            } else {\\n                unchecked {\\n                    selectorInSlotIndex--;\\n                }\\n            }\\n\\n            bytes4 lastSelector;\\n            uint256 oldSelectorsSlotCount;\\n            uint256 oldSelectorInSlotPosition;\\n\\n            // adding a block here prevents stack too deep error\\n            {\\n                // replace selector with last selector in l.facets\\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\\n\\n                if (lastSelector != selector) {\\n                    // update last selector slot position info\\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\\n                }\\n\\n                delete s.diamondFacets[selector];\\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\\n            }\\n\\n            if (oldSelectorsSlotCount != selectorSlotCount) {\\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\\n\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                oldSelectorSlot =\\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n\\n                // update storage with the modified slot\\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\\n            } else {\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                selectorSlot =\\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n            }\\n\\n            if (selectorInSlotIndex == 0) {\\n                delete s.selectorSlots[selectorSlotCount];\\n                selectorSlot = 0;\\n            }\\n        }\\n\\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\\n        address facet = facetCut.facet;\\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n            address oldFacetAddress = address(bytes20(oldFacet));\\n\\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\\n\\n            // replace old facet address\\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\\n        }\\n    }\\n\\n    function initializationCall(address target, bytes memory data) internal {\\n        if (target == address(0)) {\\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\\n        } else {\\n            if (data.length == 0) revert EmptyInitCallData(target);\\n            if (target != address(this)) {\\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\\n            }\\n\\n            (bool success, bytes memory returndata) = target.delegatecall(data);\\n            if (!success) {\\n                uint256 returndataLength = returndata.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, returndata), returndataLength)\\n                    }\\n                } else {\\n                    revert InitCallReverted(target, data);\\n                }\\n            }\\n        }\\n    }\\n\\n    function delegateOnFallback(Layout storage s) internal {\\n        bytes4 selector = msg.sig;\\n        address facet = s.facetAddress(selector);\\n        if (facet == address(0)) revert FunctionNotFound(selector);\\n        assembly {\\n            calldatacopy(0, 0, calldatasize())\\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n            returndatacopy(0, 0, returndatasize())\\n            switch result\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            diamondFacets = new Facet[](selectorCount);\\n\\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\\n                        if (diamondFacets[facetIndex].facet == facet) {\\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\\n                            ++numFacetSelectors[facetIndex];\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    diamondFacets[numFacets].facet = facet;\\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\\n                    diamondFacets[numFacets].selectors[0] = selector;\\n                    numFacetSelectors[numFacets] = 1;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                uint256 numSelectors = numFacetSelectors[facetIndex];\\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\\n\\n                // setting the number of selectors\\n                assembly {\\n                    mstore(selectors, numSelectors)\\n                }\\n            }\\n\\n            // setting the number of facets\\n            assembly {\\n                mstore(diamondFacets, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            selectors = new bytes4[](selectorCount);\\n\\n            uint256 numSelectors;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n\\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\\n                        selectors[numSelectors] = selector;\\n                        ++numSelectors;\\n                    }\\n                }\\n            }\\n\\n            // set the number of selectors in the array\\n            assembly {\\n                mstore(selectors, numSelectors)\\n            }\\n        }\\n    }\\n\\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            addresses = new address[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                        if (facet == addresses[facetIndex]) {\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    addresses[numFacets] = facet;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            // set the number of facet addresses in the array\\n            assembly {\\n                mstore(addresses, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\\n        facet = address(bytes20(s.diamondFacets[selector]));\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x930e0c854d559149621d2185cef92daadde9f514e12cca2ca30a1a9d1af063d7\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/introspection/InterfaceDetection.sol":{"InterfaceDetection":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC165 Interface Detection Standard (immutable or proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":\"This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC165 Interface Detection Standard (immutable or proxiable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/introspection/InterfaceDetection.sol\":\"InterfaceDetection\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/introspection/facets/InterfaceDetectionFacet.sol":{"InterfaceDetectionFacet":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC165 Interface Detection Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610181908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c6301ffc9a71461002757600080fd5b346100975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610097576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036100975761008d60209161009c565b6040519015158152f35b600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610145577f01ffc9a700000000000000000000000000000000000000000000000000000000811461013f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220cfa7c8cad2889c742f02565f7d773329cc39dbeb7398663393110c63e6ca8e1c64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x181 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x1FFC9A7 EQ PUSH2 0x27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x97 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x97 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x97 JUMPI PUSH2 0x8D PUSH1 0x20 SWAP2 PUSH2 0x9C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x145 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x13F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCF 0xA7 0xC8 0xCA 0xD2 DUP9 SWAP13 PUSH21 0x2F02565F7D773329CC39DBEB7398663393110C63E6 0xCA DUP15 SHR PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"314:57:57:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"fun_supportsInterface":{"entryPoint":156,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c6301ffc9a71461002757600080fd5b346100975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610097576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036100975761008d60209161009c565b6040519015158152f35b600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610145577f01ffc9a700000000000000000000000000000000000000000000000000000000811461013f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220cfa7c8cad2889c742f02565f7d773329cc39dbeb7398663393110c63e6ca8e1c64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x1FFC9A7 EQ PUSH2 0x27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x97 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x97 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x97 JUMPI PUSH2 0x8D PUSH1 0x20 SWAP2 PUSH2 0x9C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x145 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x13F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCF 0xA7 0xC8 0xCA 0xD2 DUP9 SWAP13 PUSH21 0x2F02565F7D773329CC39DBEB7398663393110C63E6 0xCA DUP15 SHR PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"314:57:57:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;314:57:57;635:65:55;;:::i;:::-;314:57:57;;;;;;;;;;;;1359:340:59;314:57:57;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;314:57:57;500:10:59;314:57:57;500:10:59;;;;314:57:57;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;314:57:57;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"77000","executionCost":"135","totalCost":"77135"},"external":{"supportsInterface(bytes4)":"2430"}},"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC165 Interface Detection Standard (facet version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/introspection/facets/InterfaceDetectionFacet.sol\":\"InterfaceDetectionFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/facets/InterfaceDetectionFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InterfaceDetection} from \\\"./../InterfaceDetection.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\ncontract InterfaceDetectionFacet is InterfaceDetection {}\\n\",\"keccak256\":\"0x9aa8304b156eca1d56ee3743064f4d547e547ada2900784560740456c78975ee\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/introspection/interfaces/IERC165.sol":{"IERC165":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-165.Note: The ERC-165 identifier for this interface is 0x01ffc9a7.","kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"supported":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC165 Interface Detection Standard.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"supported\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-165.Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"supported\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC165 Interface Detection Standard.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/introspection/interfaces/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/introspection/libraries/InterfaceDetectionStorage.sol":{"InterfaceDetectionStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122094eaa5c6b9d36482a0b6ba521e17568d8a1507c30fa91fc2415faa281bcac7bd64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xEA 0xA5 0xC6 0xB9 0xD3 PUSH5 0x82A0B6BA52 0x1E OR JUMP DUP14 DUP11 ISZERO SMOD 0xC3 0xF 0xA9 0x1F 0xC2 COINBASE PUSH0 0xAA 0x28 SHL 0xCA 0xC7 0xBD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"189:1692:59:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122094eaa5c6b9d36482a0b6ba521e17568d8a1507c30fa91fc2415faa281bcac7bd64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xEA 0xA5 0xC6 0xB9 0xD3 PUSH5 0x82A0B6BA52 0x1E OR JUMP DUP14 DUP11 ISZERO SMOD 0xC3 0xF 0xA9 0x1F 0xC2 COINBASE PUSH0 0xAA 0x28 SHL 0xCA 0xC7 0xBD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"189:1692:59:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"layout()":"infinite","setSupportedInterface(struct InterfaceDetectionStorage.Layout storage pointer,bytes4,bool)":"infinite","supportsInterface(struct InterfaceDetectionStorage.Layout storage pointer,bytes4)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":\"InterfaceDetectionStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/lifecycle/Checkpoints.sol":{"Checkpoints":{"abi":[{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointAlreadySet","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointReached","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckpointSet","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":[{"internalType":"bytes32[]","name":"checkpointIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"batchSetCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setCheckpoint","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"triggerCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"CheckpointAlreadySet(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"CheckpointSet(bytes32,uint256)":{"params":{"checkpointId":"The checkpoint identifier.","timestamp":"The timestamp associated to the checkpoint."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.","params":{"checkpointIds":"The checkpoint identifier.","timestamps":"The checkpoint timestamp."}},"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"setCheckpoint(bytes32,uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.","params":{"checkpointId":"The checkpoint identifiers.","timestamp":"The checkpoint timestamps."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"triggerCheckpoint(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.","params":{"checkpointId":"The checkpoint identifier."}}},"title":"Timestamp-based checkpoints management (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchSetCheckpoint(bytes32[],uint256[])":"3b149369","checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6","owner()":"8da5cb5b","setCheckpoint(bytes32,uint256)":"4f410a80","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","triggerCheckpoint(bytes32)":"deb4d746"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"CheckpointSet\",\"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\":[{\"internalType\":\"bytes32[]\",\"name\":\"checkpointIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"timestamps\",\"type\":\"uint256[]\"}],\"name\":\"batchSetCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"setCheckpoint\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"triggerCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\",\"timestamp\":\"The timestamp associated to the checkpoint.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\",\"params\":{\"checkpointIds\":\"The checkpoint identifier.\",\"timestamps\":\"The checkpoint timestamp.\"}},\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"setCheckpoint(bytes32,uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\",\"params\":{\"checkpointId\":\"The checkpoint identifiers.\",\"timestamp\":\"The checkpoint timestamps.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"triggerCheckpoint(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.\",\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}},\"title\":\"Timestamp-based checkpoints management (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"notice\":\"Thrown when trying to set a checkpoint which is already set.\"}],\"CheckpointReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has already been reached but is required not to.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"notice\":\"Emitted when a checkpoint is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"notice\":\"Sets a batch of checkpoints.\"},\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"setCheckpoint(bytes32,uint256)\":{\"notice\":\"Sets the checkpoints.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"triggerCheckpoint(bytes32)\":{\"notice\":\"Sets the checkpoint to the current block timestamp.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/Checkpoints.sol\":\"Checkpoints\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointsBase} from \\\"./base/CheckpointsBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Checkpoints is CheckpointsBase, ContractOwnership {}\\n\",\"keccak256\":\"0xf1c7a7cfd7b13386cb7a78a39161ad66b61bbc00fed7a76d365afe59c21645e0\",\"license\":\"MIT\"},\"contracts/lifecycle/base/CheckpointsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ICheckpoints} from \\\"./../interfaces/ICheckpoints.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../libraries/CheckpointsStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract CheckpointsBase is ICheckpoints, Context {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifiers.\\n    /// @param timestamp The checkpoint timestamps.\\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifier.\\n    /// @param timestamps The checkpoint timestamp.\\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\\n    }\\n}\\n\",\"keccak256\":\"0x08464b8627c51f474fb9c933ceb444633f8f85a0d2e05cd92736d55f5050192f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"notice":"Thrown when trying to set a checkpoint which is already set."}],"CheckpointReached(bytes32)":[{"notice":"Thrown when a checkpoint has already been reached but is required not to."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"CheckpointSet(bytes32,uint256)":{"notice":"Emitted when a checkpoint is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"notice":"Sets a batch of checkpoints."},"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."},"owner()":{"notice":"Gets the address of the contract owner."},"setCheckpoint(bytes32,uint256)":{"notice":"Sets the checkpoints."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"triggerCheckpoint(bytes32)":{"notice":"Sets the checkpoint to the current block timestamp."}},"version":1}}},"contracts/lifecycle/Pause.sol":{"Pause":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"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":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"constructor":{"details":"Emits a {Paused} event if `isPaused` is true.","params":{"isPaused":"The initial pause state."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"title":"Pausing mechanism (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"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\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Emits a {Paused} event if `isPaused` is true.\",\"params\":{\"isPaused\":\"The initial pause state.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"title\":\"Pausing mechanism (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Initializes the storage with an initial pause state.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/Pause.sol\":\"Pause\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Pause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PauseStorage} from \\\"./libraries/PauseStorage.sol\\\";\\nimport {PauseBase} from \\\"./base/PauseBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Pausing mechanism (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Pause is PauseBase, ContractOwnership {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    constructor(bool isPaused) {\\n        PauseStorage.layout().constructorInit(isPaused);\\n    }\\n}\\n\",\"keccak256\":\"0x2d5ed9d279d9fbaff12a44d109bd722814eb8dbedcbc6957a176e397e309f338\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Pause()":{"notice":"Emitted when the pause is triggered."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"constructor":{"notice":"Initializes the storage with an initial pause state."},"owner()":{"notice":"Gets the address of the contract owner."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/lifecycle/base/CheckpointsBase.sol":{"CheckpointsBase":{"abi":[{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointAlreadySet","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointReached","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckpointSet","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"checkpointIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"batchSetCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"triggerCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"CheckpointAlreadySet(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"CheckpointSet(bytes32,uint256)":{"params":{"checkpointId":"The checkpoint identifier.","timestamp":"The timestamp associated to the checkpoint."}}},"kind":"dev","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.","params":{"checkpointIds":"The checkpoint identifier.","timestamps":"The checkpoint timestamp."}},"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}},"setCheckpoint(bytes32,uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.","params":{"checkpointId":"The checkpoint identifiers.","timestamp":"The checkpoint timestamps."}},"triggerCheckpoint(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.","params":{"checkpointId":"The checkpoint identifier."}}},"title":"Timestamp-based checkpoints management (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchSetCheckpoint(bytes32[],uint256[])":"3b149369","checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6","setCheckpoint(bytes32,uint256)":"4f410a80","triggerCheckpoint(bytes32)":"deb4d746"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"CheckpointSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"checkpointIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"timestamps\",\"type\":\"uint256[]\"}],\"name\":\"batchSetCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"setCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"triggerCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\",\"timestamp\":\"The timestamp associated to the checkpoint.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\",\"params\":{\"checkpointIds\":\"The checkpoint identifier.\",\"timestamps\":\"The checkpoint timestamp.\"}},\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}},\"setCheckpoint(bytes32,uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\",\"params\":{\"checkpointId\":\"The checkpoint identifiers.\",\"timestamp\":\"The checkpoint timestamps.\"}},\"triggerCheckpoint(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.\",\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}},\"title\":\"Timestamp-based checkpoints management (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"notice\":\"Thrown when trying to set a checkpoint which is already set.\"}],\"CheckpointReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has already been reached but is required not to.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"notice\":\"Emitted when a checkpoint is set.\"}},\"kind\":\"user\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"notice\":\"Sets a batch of checkpoints.\"},\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"},\"setCheckpoint(bytes32,uint256)\":{\"notice\":\"Sets the checkpoints.\"},\"triggerCheckpoint(bytes32)\":{\"notice\":\"Sets the checkpoint to the current block timestamp.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/base/CheckpointsBase.sol\":\"CheckpointsBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/CheckpointsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ICheckpoints} from \\\"./../interfaces/ICheckpoints.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../libraries/CheckpointsStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract CheckpointsBase is ICheckpoints, Context {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifiers.\\n    /// @param timestamp The checkpoint timestamps.\\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifier.\\n    /// @param timestamps The checkpoint timestamp.\\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\\n    }\\n}\\n\",\"keccak256\":\"0x08464b8627c51f474fb9c933ceb444633f8f85a0d2e05cd92736d55f5050192f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"notice":"Thrown when trying to set a checkpoint which is already set."}],"CheckpointReached(bytes32)":[{"notice":"Thrown when a checkpoint has already been reached but is required not to."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"CheckpointSet(bytes32,uint256)":{"notice":"Emitted when a checkpoint is set."}},"kind":"user","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"notice":"Sets a batch of checkpoints."},"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."},"setCheckpoint(bytes32,uint256)":{"notice":"Sets the checkpoints."},"triggerCheckpoint(bytes32)":{"notice":"Sets the checkpoint to the current block timestamp."}},"version":1}}},"contracts/lifecycle/base/PauseBase.sol":{"PauseBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"title":"Pausing mechanism (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"title\":\"Pausing mechanism (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/base/PauseBase.sol\":\"PauseBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"Pause()":{"notice":"Emitted when the pause is triggered."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/lifecycle/facets/CheckpointsFacet.sol":{"CheckpointsFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointAlreadySet","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointReached","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckpointSet","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"checkpointIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"batchSetCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"triggerCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.","errors":{"CheckpointAlreadySet(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"CheckpointSet(bytes32,uint256)":{"params":{"checkpointId":"The checkpoint identifier.","timestamp":"The timestamp associated to the checkpoint."}}},"kind":"dev","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.","params":{"checkpointIds":"The checkpoint identifier.","timestamps":"The checkpoint timestamp."}},"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}},"setCheckpoint(bytes32,uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.","params":{"checkpointId":"The checkpoint identifiers.","timestamp":"The checkpoint timestamps."}},"triggerCheckpoint(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.","params":{"checkpointId":"The checkpoint identifier."}}},"title":"Timestamp-based checkpoints management (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6107ea38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161076890816100828239608051816105a50152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063151bdba6146104145780633b149369146102ce5780634f410a80146102235780635b34eba0146101ba5763deb4d7461461005357600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100c461058e565b925416911690810361018857507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b8160005280602052604060002054801515908161017d575b5061014f57816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90504210153861010a565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061029161058e565b9254169116908103610188576102cc6024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610505565b005b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55760043567ffffffffffffffff81116101b55761031d903690600401610495565b60243567ffffffffffffffff81116101b55761033d903690600401610495565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061037d61058e565b925416911690810361018857507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036103ea5760005b8481106103bf57005b806103e46103d0600193888a6104c6565b356103dc8388876104c6565b359086610505565b016103b6565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054801515908161048a575b506040519015158152f35b90504210158261047f565b9181601f840112156101b55782359167ffffffffffffffff83116101b5576020808501948460051b0101116101b557565b91908110156104d65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908060005281602052604060002054610561578261052257505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610723573233148015610728575b610723577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610619575b5061061657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561071757600091610674575b503861060c565b60203d602011610710575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106e3576020918391604052810103126106df57519081151582036106dc57503861066d565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61067f565b6040513d6000823e3d90fd5b503390565b50601836106105d556fea26469706673582212202420c784ccea8090cccb0008efca8b0c9d5a457342c94a4cea09b9b4071daaee64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x7EA CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x768 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x5A5 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x1BA JUMPI PUSH4 0xDEB4D746 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xC4 PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x17D JUMPI JUMPDEST POP PUSH2 0x14F JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO CODESIZE PUSH2 0x10A JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x291 PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI PUSH2 0x2CC PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x505 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B5 JUMPI PUSH2 0x31D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x495 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B5 JUMPI PUSH2 0x33D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x495 JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x37D PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x3EA JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x3BF JUMPI STOP JUMPDEST DUP1 PUSH2 0x3E4 PUSH2 0x3D0 PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0x4C6 JUMP JUMPDEST CALLDATALOAD PUSH2 0x3DC DUP4 DUP9 DUP8 PUSH2 0x4C6 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0x505 JUMP JUMPDEST ADD PUSH2 0x3B6 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x48A JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x47F JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1B5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1B5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1B5 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x561 JUMPI DUP3 PUSH2 0x522 JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x723 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x728 JUMPI JUMPDEST PUSH2 0x723 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x619 JUMPI JUMPDEST POP PUSH2 0x616 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x717 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x674 JUMPI JUMPDEST POP CODESIZE PUSH2 0x60C JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x710 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E3 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6DF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6DC JUMPI POP CODESIZE PUSH2 0x66D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x67F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5D5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 KECCAK256 0xC7 DUP5 0xCC 0xEA DUP1 SWAP1 0xCC 0xCB STOP ADDMOD 0xEF 0xCA DUP12 0xC SWAP14 GAS GASLIMIT PUSH20 0x42C94A4CEA09B9B4071DAAEE64736F6C63430008 0x1E STOP CALLER ","sourceMap":"733:705:68:-:0;;;;;;;;;;;;;-1:-1:-1;;733:705:68;;;;-1:-1:-1;;;;;733:705:68;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;733:705:68;;;;;;745:39:76;;733:705:68;;;;;;;;745:39:76;733:705:68;;;;;;;-1:-1:-1;733:705:68;;;;;;-1:-1:-1;733:705:68;;;;;-1:-1:-1;733:705:68"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_bytes32_dyn_calldata":{"entryPoint":1173,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_access_bytes32_dyn_calldata":{"entryPoint":1222,"id":null,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":1422,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_setCheckpoint":{"entryPoint":1285,"id":12234,"parameterSlots":3,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1445}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063151bdba6146104145780633b149369146102ce5780634f410a80146102235780635b34eba0146101ba5763deb4d7461461005357600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100c461058e565b925416911690810361018857507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b8160005280602052604060002054801515908161017d575b5061014f57816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90504210153861010a565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061029161058e565b9254169116908103610188576102cc6024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610505565b005b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55760043567ffffffffffffffff81116101b55761031d903690600401610495565b60243567ffffffffffffffff81116101b55761033d903690600401610495565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061037d61058e565b925416911690810361018857507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036103ea5760005b8481106103bf57005b806103e46103d0600193888a6104c6565b356103dc8388876104c6565b359086610505565b016103b6565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054801515908161048a575b506040519015158152f35b90504210158261047f565b9181601f840112156101b55782359167ffffffffffffffff83116101b5576020808501948460051b0101116101b557565b91908110156104d65760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908060005281602052604060002054610561578261052257505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610723573233148015610728575b610723577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610619575b5061061657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561071757600091610674575b503861060c565b60203d602011610710575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106e3576020918391604052810103126106df57519081151582036106dc57503861066d565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61067f565b6040513d6000823e3d90fd5b503390565b50601836106105d556fea26469706673582212202420c784ccea8090cccb0008efca8b0c9d5a457342c94a4cea09b9b4071daaee64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x1BA JUMPI PUSH4 0xDEB4D746 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xC4 PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x17D JUMPI JUMPDEST POP PUSH2 0x14F JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO CODESIZE PUSH2 0x10A JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x291 PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI PUSH2 0x2CC PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x505 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B5 JUMPI PUSH2 0x31D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x495 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B5 JUMPI PUSH2 0x33D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x495 JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x37D PUSH2 0x58E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x3EA JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x3BF JUMPI STOP JUMPDEST DUP1 PUSH2 0x3E4 PUSH2 0x3D0 PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0x4C6 JUMP JUMPDEST CALLDATALOAD PUSH2 0x3DC DUP4 DUP9 DUP8 PUSH2 0x4C6 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0x505 JUMP JUMPDEST ADD PUSH2 0x3B6 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x48A JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x47F JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1B5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1B5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1B5 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x561 JUMPI DUP3 PUSH2 0x522 JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x723 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x728 JUMPI JUMPDEST PUSH2 0x723 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x619 JUMPI JUMPDEST POP PUSH2 0x616 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x717 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x674 JUMPI JUMPDEST POP CODESIZE PUSH2 0x60C JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x710 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E3 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6DF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6DC JUMPI POP CODESIZE PUSH2 0x66D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x67F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5D5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 KECCAK256 0xC7 DUP5 0xCC 0xEA DUP1 SWAP1 0xCC 0xCB STOP ADDMOD 0xEF 0xCA DUP12 0xC SWAP14 GAS GASLIMIT PUSH20 0x42C94A4CEA09B9B4071DAAEE64736F6C63430008 0x1E STOP CALLER ","sourceMap":"733:705:68:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:41;;;:::i;:::-;733:705;;;;;4503:26:42;;;4499:64;;4419:19:72;733:705:68;;-1:-1:-1;733:705:68;;;;;-1:-1:-1;733:705:68;;3376:16:72;;;:50;;;;733:705:68;3369:57:72;4241:77;;733:705:68;;;2498:44:72;733:705:68;;;;;2468:15:72;733:705:68;;;;;;;;;2468:15:72;733:705:68;;;;2498:44:72;733:705:68;4241:77:72;4287:31;;733:705:68;4287:31:72;733:705:68;;;;4287:31:72;3376:50;3396:15;;;:30;;3376:50;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;733:705:68;;-1:-1:-1;4538:25:42;733:705:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:41;;;:::i;:::-;733:705;;;;;4503:26:42;;;4499:64;;1416:9:62;733:705:68;;;;;1416:9:62;:::i;:::-;733:705:68;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;733:705:68;;1155:41;;;:::i;:::-;733:705;;;;;4503:26:42;;;4499:64;;4419:19:72;733:705:68;1814:27:72;;;;1810:66;;733:705:68;1903:10:72;;;;;;733:705:68;1915:3:72;1950:16;1968:13;1950:16;733:705:68;1950:16:72;;;;:::i;:::-;733:705:68;1968:13:72;;;;;:::i;:::-;733:705:68;1968:13:72;;;:::i;:::-;733:705:68;1892:9:72;;1810:66;1850:26;733:705:68;1850:26:72;733:705:68;;1850:26:72;733:705:68;;;;;;;;;;;;;;-1:-1:-1;733:705:68;;;;;-1:-1:-1;733:705:68;;3376:16:72;;;:50;;;;733:705:68;3369:57:72;733:705:68;;;;;;;;3376:50:72;3396:15;;;:30;;3376:50;;;733:705:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;957:337:72;;733:705:68;-1:-1:-1;733:705:68;;;;;-1:-1:-1;733:705:68;;1058:79:72;;1151:14;1147:141;;957:337;;;:::o;1147:141::-;1239:38;733:705:68;;;;-1:-1:-1;733:705:68;;;;;-1:-1:-1;733:705:68;;;;;;;;;;;1239:38:72;957:337::o;1058:79::-;1103:34;-1:-1:-1;1103:34:72;;733:705:68;;-1:-1:-1;1103:34:72;907:917:76;733:705:68;1029:19:76;733:705:68;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;733:705:68;;;;;;1676:74:76;;;;733:705:68;1676:74:76;;;;;;733:705:68;1327:10:76;733:705:68;;;;1744:4:76;733:705:68;;;;1676:74:76;;;;;;;733:705:68;1676:74:76;;;1630:120;;;;;1676:74;733:705:68;1676:74:76;733:705:68;1676:74:76;;;;733:705:68;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;733:705:68;;;;;;;;;;;;;1676:74:76;;;;733:705:68;;;;;;;;;;;;;;1676:74:76;733:705:68;;1676:74:76;;;;;;733:705:68;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"379200","executionCost":"infinite","totalCost":"infinite"},"external":{"batchSetCheckpoint(bytes32[],uint256[])":"infinite","checkpoint(bytes32)":"2379","checkpointReached(bytes32)":"2378","setCheckpoint(bytes32,uint256)":"infinite","triggerCheckpoint(bytes32)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchSetCheckpoint(bytes32[],uint256[])":"3b149369","checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6","setCheckpoint(bytes32,uint256)":"4f410a80","triggerCheckpoint(bytes32)":"deb4d746"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"CheckpointSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"checkpointIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"timestamps\",\"type\":\"uint256[]\"}],\"name\":\"batchSetCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"setCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"triggerCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\",\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\",\"timestamp\":\"The timestamp associated to the checkpoint.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\",\"params\":{\"checkpointIds\":\"The checkpoint identifier.\",\"timestamps\":\"The checkpoint timestamp.\"}},\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}},\"setCheckpoint(bytes32,uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\",\"params\":{\"checkpointId\":\"The checkpoint identifiers.\",\"timestamp\":\"The checkpoint timestamps.\"}},\"triggerCheckpoint(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.\",\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}},\"title\":\"Timestamp-based checkpoints management (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"notice\":\"Thrown when trying to set a checkpoint which is already set.\"}],\"CheckpointReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has already been reached but is required not to.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"notice\":\"Emitted when a checkpoint is set.\"}},\"kind\":\"user\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"notice\":\"Sets a batch of checkpoints.\"},\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"},\"setCheckpoint(bytes32,uint256)\":{\"notice\":\"Sets the checkpoints.\"},\"triggerCheckpoint(bytes32)\":{\"notice\":\"Sets the checkpoint to the current block timestamp.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/facets/CheckpointsFacet.sol\":\"CheckpointsFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/CheckpointsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ICheckpoints} from \\\"./../interfaces/ICheckpoints.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../libraries/CheckpointsStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract CheckpointsBase is ICheckpoints, Context {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifiers.\\n    /// @param timestamp The checkpoint timestamps.\\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifier.\\n    /// @param timestamps The checkpoint timestamp.\\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\\n    }\\n}\\n\",\"keccak256\":\"0x08464b8627c51f474fb9c933ceb444633f8f85a0d2e05cd92736d55f5050192f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/facets/CheckpointsFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {CheckpointsBase} from \\\"./../base/CheckpointsBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract CheckpointsFacet is CheckpointsBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6ca8bca8db03a56e549650b53a0e464033313f630f7992266d8541559c119d96\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"notice":"Thrown when trying to set a checkpoint which is already set."}],"CheckpointReached(bytes32)":[{"notice":"Thrown when a checkpoint has already been reached but is required not to."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"CheckpointSet(bytes32,uint256)":{"notice":"Emitted when a checkpoint is set."}},"kind":"user","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"notice":"Sets a batch of checkpoints."},"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."},"setCheckpoint(bytes32,uint256)":{"notice":"Sets the checkpoints."},"triggerCheckpoint(bytes32)":{"notice":"Sets the checkpoint to the current block timestamp."}},"version":1}}},"contracts/lifecycle/facets/PauseFacet.sol":{"PauseFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"initPauseStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initPauseStorage(bool)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits a {Paused} event if `isPaused` is true.","params":{"isPaused":"The initial pause state."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"title":"Pausing mechanism (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61071b38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161069990816100828239608051816104d60152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80633f4ba83a146103a45780635c975abb146103445780638456cb59146101fa5763b606577c1461004857600080fd5b346101f55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760043580151581036101f55761008b6104bf565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101c857507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e907f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e546001811015610196575060017f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5561014657005b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102686104bf565b9254169116908103610317577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff81166102ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104126104bf565b9254169116908103610317577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff811615610495577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610654573233148015610659575b610654577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561054a575b5061054757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610648576000916105a5575b503861053d565b60203d602011610641575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761061457602091839160405281010312610610575190811515820361060d57503861059e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d6105b0565b6040513d6000823e3d90fd5b503390565b506018361061050656fea26469706673582212200bf3510c6bdf3ee8baee3f0bcac81898a2a58d25fd323bb47dc53acbb6eec8d764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x71B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x699 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x4D6 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3A4 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x344 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x1FA JUMPI PUSH4 0xB606577C EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1F5 JUMPI PUSH2 0x8B PUSH2 0x4BF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x196 JUMPI POP PUSH1 0x1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SSTORE PUSH2 0x146 JUMPI STOP JUMPDEST PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x268 PUSH2 0x4BF JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x317 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND PUSH2 0x2ED JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x412 PUSH2 0x4BF JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x317 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND ISZERO PUSH2 0x495 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x654 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x659 JUMPI JUMPDEST PUSH2 0x654 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x54A JUMPI JUMPDEST POP PUSH2 0x547 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x648 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5A5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x53D JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x641 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x614 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x610 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x60D JUMPI POP CODESIZE PUSH2 0x59E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x506 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND RETURN MLOAD 0xC PUSH12 0xDF3EE8BAEE3F0BCAC81898A2 0xA5 DUP14 0x25 REVERT ORIGIN EXTCODESIZE 0xB4 PUSH30 0xC53ACBB6EEC8D764736F6C634300081E0033000000000000000000000000 ","sourceMap":"762:1362:69:-:0;;;;;;;;;;;;;-1:-1:-1;;762:1362:69;;;;-1:-1:-1;;;;;762:1362:69;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;762:1362:69;;;;;;745:39:76;;762:1362:69;;;;;;;;745:39:76;762:1362:69;;;;;;;-1:-1:-1;762:1362:69;;;;;;-1:-1:-1;762:1362:69;;;;;-1:-1:-1;762:1362:69"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":1215,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1238}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80633f4ba83a146103a45780635c975abb146103445780638456cb59146101fa5763b606577c1461004857600080fd5b346101f55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760043580151581036101f55761008b6104bf565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101c857507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e907f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e546001811015610196575060017f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5561014657005b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102686104bf565b9254169116908103610317577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff81166102ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104126104bf565b9254169116908103610317577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff811615610495577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610654573233148015610659575b610654577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561054a575b5061054757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610648576000916105a5575b503861053d565b60203d602011610641575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761061457602091839160405281010312610610575190811515820361060d57503861059e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d6105b0565b6040513d6000823e3d90fd5b503390565b506018361061050656fea26469706673582212200bf3510c6bdf3ee8baee3f0bcac81898a2a58d25fd323bb47dc53acbb6eec8d764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3A4 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x344 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x1FA JUMPI PUSH4 0xB606577C EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1F5 JUMPI PUSH2 0x8B PUSH2 0x4BF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x196 JUMPI POP PUSH1 0x1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SSTORE PUSH2 0x146 JUMPI STOP JUMPDEST PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x268 PUSH2 0x4BF JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x317 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND PUSH2 0x2ED JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x412 PUSH2 0x4BF JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x317 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND ISZERO PUSH2 0x495 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x654 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x659 JUMPI JUMPDEST PUSH2 0x654 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x54A JUMPI JUMPDEST POP PUSH2 0x547 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x648 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5A5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x53D JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x641 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x614 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x610 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x60D JUMPI POP CODESIZE PUSH2 0x59E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x506 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND RETURN MLOAD 0xC PUSH12 0xDF3EE8BAEE3F0BCAC81898A2 0xA5 DUP14 0x25 REVERT ORIGIN EXTCODESIZE 0xB4 PUSH30 0xC53ACBB6EEC8D764736F6C634300081E0033000000000000000000000000 ","sourceMap":"762:1362:69:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1841:41;;:::i;:::-;762:1362;;;;;;;3174:18:180;;;3170:53;;3113:19:73;762:1362:69;;;;636:1:180;900:21:181;;;896:88;;762:1362:69;636:1:180;762:1362:69;;1031:82:73;;762:1362:69;1031:82:73;636:1:180;762:1362:69;;;;;;;1095:7:73;762:1362:69;1095:7:73;;762:1362:69;896:88:181;930:54;762:1362:69;930:54:181;762:1362:69;;636:1:180;762:1362:69;;;;930:54:181;3170:53:180;3201:22;762:1362:69;3201:22:180;762:1362:69;;;;3201:22:180;762:1362:69;;;;;;;;;;;;;;;;;1841:41;;;:::i;:::-;762:1362;;;;;4503:26:42;;;4499:64;;762:1362:69;;;;;;2981:31:73;;762:1362:69;;2005:4:73;762:1362:69;;;2024:7:73;762:1362:69;;2024:7:73;762:1362:69;2981:31:73;3004:8;762:1362:69;3004:8:73;762:1362:69;;3004:8:73;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;762:1362:69;;-1:-1:-1;4538:25:42;762:1362:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1841:41;;;:::i;:::-;762:1362;;;;;4503:26:42;;;4499:64;;762:1362:69;;;;;;2748:11:73;2744:35;;762:1362:69;;;;2307:9:73;762:1362:69;2307:9:73;;762:1362:69;2744:35:73;2768:11;762:1362:69;2768:11:73;762:1362:69;;2768:11:73;907:917:76;762:1362:69;1029:19:76;762:1362:69;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;762:1362:69;;;;;;1676:74:76;;;;762:1362:69;1676:74:76;;;;;;762:1362:69;1327:10:76;762:1362:69;;;;1744:4:76;762:1362:69;;;;1676:74:76;;;;;;;762:1362:69;1676:74:76;;;1630:120;;;;;1676:74;762:1362:69;1676:74:76;762:1362:69;1676:74:76;;;;762:1362:69;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;762:1362:69;;;;;;;;;;;;;1676:74:76;;;;762:1362:69;;;;;;;;;;;;;;1676:74:76;762:1362:69;;1676:74:76;;;;;;762:1362:69;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"337800","executionCost":"infinite","totalCost":"infinite"},"external":{"initPauseStorage(bool)":"infinite","pause()":"infinite","paused()":"2281","unpause()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initPauseStorage(bool)":"b606577c","pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"}],\"name\":\"initPauseStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initPauseStorage(bool)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits a {Paused} event if `isPaused` is true.\",\"params\":{\"isPaused\":\"The initial pause state.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"title\":\"Pausing mechanism (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"initPauseStorage(bool)\":{\"notice\":\"Initializes the storage with an initial pause state.Sets the proxy initialization phase to `1`.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/facets/PauseFacet.sol\":\"PauseFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/facets/PauseFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {PauseBase} from \\\"./../base/PauseBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Pausing mechanism (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract PauseFacet is PauseBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function initPauseStorage(bool isPaused) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        PauseStorage.layout().proxyInit(isPaused);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xaa8ad01435ea4da77071129ca10902a2d705c89fec447ffc1fe13b5f0de43d71\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"Pause()":{"notice":"Emitted when the pause is triggered."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"initPauseStorage(bool)":{"notice":"Initializes the storage with an initial pause state.Sets the proxy initialization phase to `1`."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/lifecycle/interfaces/ICheckpoints.sol":{"ICheckpoints":{"abi":[{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}}},"title":"Timestamp-based checkpoints management (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}}},\"title\":\"Timestamp-based checkpoints management (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/interfaces/ICheckpoints.sol\":\"ICheckpoints\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."}},"version":1}}},"contracts/lifecycle/interfaces/IPause.sol":{"IPause":{"abi":[{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"paused()":{"returns":{"isPaused":"The paused state of the contract."}}},"title":"Pausing mechanism (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"paused()":"5c975abb"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"paused()\":{\"returns\":{\"isPaused\":\"The paused state of the contract.\"}}},\"title\":\"Pausing mechanism (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/interfaces/IPause.sol\":\"IPause\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"paused()":{"notice":"Gets the paused state of the contract."}},"version":1}}},"contracts/lifecycle/libraries/CheckpointsStorage.sol":{"CheckpointsStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220a71a81802e1b487e96bd81e2e52e088f5cebd952f3cf4b6b9eece4bf730acc4264736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA7 BYTE DUP2 DUP1 0x2E SHL BASEFEE PUSH31 0x96BD81E2E52E088F5CEBD952F3CF4B6B9EECE4BF730ACC4264736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"304:4203:72:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220a71a81802e1b487e96bd81e2e52e088f5cebd952f3cf4b6b9eece4bf730acc4264736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA7 BYTE DUP2 DUP1 0x2E SHL BASEFEE PUSH31 0x96BD81E2E52E088F5CEBD952F3CF4B6B9EECE4BF730ACC4264736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"304:4203:72:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"batchSetCheckpoint(struct CheckpointsStorage.Layout storage pointer,bytes32[] calldata,uint256[] calldata)":"infinite","checkpoint(struct CheckpointsStorage.Layout storage pointer,bytes32)":"infinite","checkpointReached(struct CheckpointsStorage.Layout storage pointer,bytes32)":"infinite","enforceCheckpointNotReached(struct CheckpointsStorage.Layout storage pointer,bytes32)":"infinite","enforceCheckpointReached(struct CheckpointsStorage.Layout storage pointer,bytes32)":"infinite","layout()":"infinite","setCheckpoint(struct CheckpointsStorage.Layout storage pointer,bytes32,uint256)":"infinite","triggerCheckpoint(struct CheckpointsStorage.Layout storage pointer,bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":\"CheckpointsStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/lifecycle/libraries/PauseStorage.sol":{"PauseStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122092ed01329190112eae84962cdc8273972cb61a6d031eb441376b7620155657f564736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP3 0xED ADD ORIGIN SWAP2 SWAP1 GT 0x2E 0xAE DUP5 SWAP7 0x2C 0xDC DUP3 PUSH20 0x972CB61A6D031EB441376B7620155657F564736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"267:2934:73:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122092ed01329190112eae84962cdc8273972cb61a6d031eb441376b7620155657f564736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP3 0xED ADD ORIGIN SWAP2 SWAP1 GT 0x2E 0xAE DUP5 SWAP7 0x2C 0xDC DUP3 PUSH20 0x972CB61A6D031EB441376B7620155657F564736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"267:2934:73:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"constructorInit(struct PauseStorage.Layout storage pointer,bool)":"infinite","enforceIsNotPaused(struct PauseStorage.Layout storage pointer)":"infinite","enforceIsPaused(struct PauseStorage.Layout storage pointer)":"infinite","layout()":"infinite","pause(struct PauseStorage.Layout storage pointer)":"infinite","paused(struct PauseStorage.Layout storage pointer)":"infinite","proxyInit(struct PauseStorage.Layout storage pointer,bool)":"infinite","unpause(struct PauseStorage.Layout storage pointer)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/lifecycle/libraries/PauseStorage.sol\":\"PauseStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/metatx/ForwarderRegistry.sol":{"ForwarderRegistry":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"}],"name":"ForwarderNotApproved","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidEIP1271Signature","type":"error"},{"inputs":[],"name":"WrongSigner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"forwarder","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"ForwarderApproval","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bool","name":"isEIP1271Signature","type":"bool"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndForward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"forward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"}],"name":"isApprovedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bool","name":"isEIP1271Signature","type":"bool"}],"name":"setForwarderApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setForwarderApproval","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract should be deployed uniquely per network, in a non-upgradeable way.","errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}]},"events":{"ForwarderApproval(address,address,address,bool,uint256)":{"params":{"approved":"True for an approval, false for a disapproval.","forwarder":"The account approved or disapproved as forwarder.","nonce":"The `sender`'s account nonce before the approval change.","sender":"The account for which `forwarder` is approved or disapproved.","target":"The target contract approved or disapproved as forwarder."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"returns":{"domainSeparator":"The EIP-712 domain separator."}},"approveAndForward(bytes,bool,address,bytes)":{"details":"Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.Emits a {ForwarderApproval} event.","params":{"data":"The content of the call (the `sender` address will be appended to it according to EIP-2771).","isEIP1271Signature":"True if `sender` is a contract that provides authorization via EIP-1271.","signature":"Signature by `sender` for approving the forwarder.","target":"The destination of the call (that will receive the meta-transaction)."}},"forward(address,bytes)":{"details":"Reverts with {ForwarderNotApproved} if the caller has not been previously approved as a forwarder by the sender.","params":{"data":"The content of the call (the `sender` address will be appended to it according to EIP-2771).","target":"The destination of the call (that will receive the meta-transaction)."}},"getNonce(address,address,address)":{"params":{"forwarder":"The forwarder account.","sender":"The sender account.","target":"The target contract."},"returns":{"nonce":"The current nonce for the `sender`/`forwarder`/`target` tuple."}},"isApprovedForwarder(address,address,address)":{"params":{"forwarder":"The forwarder account.","sender":"The sender account.","target":"The target contract."},"returns":{"_0":"True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"setForwarderApproval(address,address,address,bool,bytes,bool)":{"details":"Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.Emits a {ForwarderApproval} event.","params":{"approved":"Whether to approve or disapprove the forwarder.","forwarder":"The address of the forwarder to change the approval of.","isEIP1271Signature":"True if `sender` is a contract that provides authorization via EIP-1271.","sender":"The address which signed the approval of the approval.","signature":"Signature by `sender` for approving forwarder.","target":"The target contract to change the approval of."}},"setForwarderApproval(address,address,bool)":{"details":"Emits a {ForwarderApproval} event.","params":{"forwarder":"The address of the forwarder to change the approval of."}}},"title":"Meta-Transactions Forwarder Registry.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c03460b95746608052602081017f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681527f06a520fda4ca688235391b02e357c6a65eb2a3bb40a69c0199f3f7f9cccee04160408301524660608301523060808301526080825260a082019180831060018060401b0384111760a3578260405251902060a0526112d190816100bf823960805181610d73015260a05181610d990152f35b634e487b7160e01b600052604160045260246000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063019a202814610c1a5780630c695d17146108655780633644e51514610824578063572b6c05146107e15780636fadcf72146106a35780639438f7f314610224578063953135f5146101545763ae3c8c2d1461007457600080fd5b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f576100ab610cd9565b6100b3610cfc565b73ffffffffffffffffffffffffffffffffffffffff6100d0610d1f565b9216600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5761018b610cd9565b610193610cfc565b90604435801515810361014f5761022292336000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020927effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff845416933390610f0d565b005b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5760043567ffffffffffffffff811161014f5761026e903690600401610d42565b602435801515810361014f57610282610d1f565b9160643567ffffffffffffffff811161014f576102a3903690600401610d42565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c95866000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff3316600052602052604060002073ffffffffffffffffffffffffffffffffffffffff87166000526020526040600020937effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8554169261034b610d70565b9060405160208101907f1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d28482528b604082015233606082015273ffffffffffffffffffffffffffffffffffffffff8b166080820152600160a08201528660c082015260c081526103bb60e082610e63565b519020906040519160208301937f190100000000000000000000000000000000000000000000000000000000000085526022840152604283015260428252610404606283610e63565b156105f95760209293916064915190207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8660405197889687957f1626ba7e000000000000000000000000000000000000000000000000000000008752600487015260406024870152816044870152868601376000858286010152011681010301818a5afa9081156105ed5760009161056b575b507fffffffff000000000000000000000000000000000000000000000000000000007f1626ba7e0000000000000000000000000000000000000000000000000000000091160361054157610222956104ff61050e9260018861053a975b853391610f0d565b60405194859360208501610e2d565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610e63565b3491610fb7565b7f5d52cbe30000000000000000000000000000000000000000000000000000000060005260046000fd5b6020813d6020116105e5575b8161058460209383610e63565b810103126105e15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105de57507fffffffff0000000000000000000000000000000000000000000000000000000061049a565b80fd5b5080fd5b3d9150610577565b6040513d6000823e3d90fd5b5190209061060681610ed3565b926106146040519485610e63565b818452368282011161014f578373ffffffffffffffffffffffffffffffffffffffff93600060208561065c968f999683610653980137840101526110dd565b90929192611119565b160361067957610222956104ff61050e9260018861053a976104f7565b7fa7932e6a0000000000000000000000000000000000000000000000000000000060005260046000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f576106d5610cd9565b60243567ffffffffffffffff811161014f576106f5903690600401610d42565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec92919236013560601c92836000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff3316600052602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205460f81c156107955761053a9061050e6102229560405194859360208501610e2d565b73ffffffffffffffffffffffffffffffffffffffff83857f865e4ca900000000000000000000000000000000000000000000000000000000600052600452336024521660445260646000fd5b3461014f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57610818610cd9565b50602060405160018152f35b3461014f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57602061085d610d70565b604051908152f35b3461014f5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5761089c610cd9565b6108a4610cfc565b906108ad610d1f565b606435908115159384830361014f5760843567ffffffffffffffff811161014f576108dc903690600401610d42565b60a4359591861515870361014f5773ffffffffffffffffffffffffffffffffffffffff831690816000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002073ffffffffffffffffffffffffffffffffffffffff87166000526020526040600020987effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a541698610981610d70565b9160405160208101917f1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d284835286604083015273ffffffffffffffffffffffffffffffffffffffff8a16606083015273ffffffffffffffffffffffffffffffffffffffff8b16608083015260a08201528b60c082015260c08152610a0560e082610e63565b519020906040519160208301937f190100000000000000000000000000000000000000000000000000000000000085526022840152604283015260428252610a4e606283610e63565b15610bb3579160646020949286945190207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051988997889687957f1626ba7e000000000000000000000000000000000000000000000000000000008752600487015260406024870152816044870152868601376000858286010152011681010301915afa9081156105ed57600091610b38575b507fffffffff000000000000000000000000000000000000000000000000000000007f1626ba7e000000000000000000000000000000000000000000000000000000009116036105415761022295610f0d565b6020813d602011610bab575b81610b5160209383610e63565b810103126105e15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105de57507fffffffff00000000000000000000000000000000000000000000000000000000610ae5565b3d9150610b44565b519020919290610bc282610ed3565b610bcf6040519182610e63565b828152368383011161014f5773ffffffffffffffffffffffffffffffffffffffff936000602085610c0b966106539683870137840101526110dd565b16036106795761022295610f0d565b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57610c51610cd9565b610c59610cfc565b73ffffffffffffffffffffffffffffffffffffffff610c76610d1f565b9216600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060406000205460f81c6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b9181601f8401121561014f5782359167ffffffffffffffff831161014f576020838186019501011161014f57565b467f000000000000000000000000000000000000000000000000000000000000000003610dbb577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f06a520fda4ca688235391b02e357c6a65eb2a3bb40a69c0199f3f7f9cccee041604082015246606082015230608082015260808152610e2760a082610e63565b51902090565b9160149392817fffffffffffffffffffffffffffffffffffffffff000000000000000000000000938237019160601b1681520190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ea457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ea457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600186017effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1694151560f881901b7fff000000000000000000000000000000000000000000000000000000000000001695909517905560408051948552602085019590955273ffffffffffffffffffffffffffffffffffffffff92831694918316939216917f61036a3baab62925c6646f1eb84438957e2f9b3c52d084e099f955e04788b0489190a4565b9092919283471061100e5760008161100394956020839451920190855af13d15611006573d91610fe683610ed3565b92610ff46040519485610e63565b83523d6000602085013e611040565b90565b606091611040565b83477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9061107f575080511561105557602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806110d4575b611090575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15611088565b815191906041830361110e5761110792506020820151906060604084015193015160001a90611205565b9192909190565b505060009160029190565b91909160048110156111d6578061112f57509050565b600060018203611163577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b506002810361119a57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146111aa575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161128f579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156105ed5760005173ffffffffffffffffffffffffffffffffffffffff8116156112835790600090600090565b50600090600190600090565b5050506000916003919056fea26469706673582212200cb427d0b6ba967b79e07dd757eb0df0bbd48ffbe72373ccc36acc2b6240c68664736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH1 0xB9 JUMPI CHAINID PUSH1 0x80 MSTORE PUSH1 0x20 DUP2 ADD PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 DUP2 MSTORE PUSH32 0x6A520FDA4CA688235391B02E357C6A65EB2A3BB40A69C0199F3F7F9CCCEE041 PUSH1 0x40 DUP4 ADD MSTORE CHAINID PUSH1 0x60 DUP4 ADD MSTORE ADDRESS PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x80 DUP3 MSTORE PUSH1 0xA0 DUP3 ADD SWAP2 DUP1 DUP4 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP5 GT OR PUSH1 0xA3 JUMPI DUP3 PUSH1 0x40 MSTORE MLOAD SWAP1 KECCAK256 PUSH1 0xA0 MSTORE PUSH2 0x12D1 SWAP1 DUP2 PUSH2 0xBF DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xD73 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 PUSH2 0xD99 ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x19A2028 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xC695D17 EQ PUSH2 0x865 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x824 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x7E1 JUMPI DUP1 PUSH4 0x6FADCF72 EQ PUSH2 0x6A3 JUMPI DUP1 PUSH4 0x9438F7F3 EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x953135F5 EQ PUSH2 0x154 JUMPI PUSH4 0xAE3C8C2D EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0xAB PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0xB3 PUSH2 0xCFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0 PUSH2 0xD1F JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x18B PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x193 PUSH2 0xCFC JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x14F JUMPI PUSH2 0x222 SWAP3 CALLER PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 SLOAD AND SWAP4 CALLER SWAP1 PUSH2 0xF0D JUMP JUMPDEST STOP JUMPDEST PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x26E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x14F JUMPI PUSH2 0x282 PUSH2 0xD1F JUMP JUMPDEST SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x2A3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP6 DUP7 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP4 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 SLOAD AND SWAP3 PUSH2 0x34B PUSH2 0xD70 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 PUSH32 0x1D89F51CFFDA0ADBC9DBFF2F94EEAA6D10D8C3E27A39A69C4C7A29EBB3E1D284 DUP3 MSTORE DUP12 PUSH1 0x40 DUP3 ADD MSTORE CALLER PUSH1 0x60 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0xA0 DUP3 ADD MSTORE DUP7 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x3BB PUSH1 0xE0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP4 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x22 DUP5 ADD MSTORE PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x42 DUP3 MSTORE PUSH2 0x404 PUSH1 0x62 DUP4 PUSH2 0xE63 JUMP JUMPDEST ISZERO PUSH2 0x5F9 JUMPI PUSH1 0x20 SWAP3 SWAP4 SWAP2 PUSH1 0x64 SWAP2 MLOAD SWAP1 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP8 ADD MSTORE DUP2 PUSH1 0x44 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP11 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 SWAP2 PUSH2 0x56B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x541 JUMPI PUSH2 0x222 SWAP6 PUSH2 0x4FF PUSH2 0x50E SWAP3 PUSH1 0x1 DUP9 PUSH2 0x53A SWAP8 JUMPDEST DUP6 CALLER SWAP2 PUSH2 0xF0D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0xE63 JUMP JUMPDEST CALLVALUE SWAP2 PUSH2 0xFB7 JUMP JUMPDEST PUSH32 0x5D52CBE300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x5E5 JUMPI JUMPDEST DUP2 PUSH2 0x584 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xE63 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x5E1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x5DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x49A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x577 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH2 0x606 DUP2 PUSH2 0xED3 JUMP JUMPDEST SWAP3 PUSH2 0x614 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xE63 JUMP JUMPDEST DUP2 DUP5 MSTORE CALLDATASIZE DUP3 DUP3 ADD GT PUSH2 0x14F JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 PUSH1 0x20 DUP6 PUSH2 0x65C SWAP7 DUP16 SWAP10 SWAP7 DUP4 PUSH2 0x653 SWAP9 ADD CALLDATACOPY DUP5 ADD ADD MSTORE PUSH2 0x10DD JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1119 JUMP JUMPDEST AND SUB PUSH2 0x679 JUMPI PUSH2 0x222 SWAP6 PUSH2 0x4FF PUSH2 0x50E SWAP3 PUSH1 0x1 DUP9 PUSH2 0x53A SWAP8 PUSH2 0x4F7 JUMP JUMPDEST PUSH32 0xA7932E6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x6D5 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x6F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC SWAP3 SWAP2 SWAP3 CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xF8 SHR ISZERO PUSH2 0x795 JUMPI PUSH2 0x53A SWAP1 PUSH2 0x50E PUSH2 0x222 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP6 PUSH32 0x865E4CA900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE CALLER PUSH1 0x24 MSTORE AND PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x818 PUSH2 0xCD9 JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH1 0x20 PUSH2 0x85D PUSH2 0xD70 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0xC0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x89C PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x8A4 PUSH2 0xCFC JUMP JUMPDEST SWAP1 PUSH2 0x8AD PUSH2 0xD1F JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP4 DUP5 DUP4 SUB PUSH2 0x14F JUMPI PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x8DC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH1 0xA4 CALLDATALOAD SWAP6 SWAP2 DUP7 ISZERO ISZERO DUP8 SUB PUSH2 0x14F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP9 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 SLOAD AND SWAP9 PUSH2 0x981 PUSH2 0xD70 JUMP JUMPDEST SWAP2 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x1D89F51CFFDA0ADBC9DBFF2F94EEAA6D10D8C3E27A39A69C4C7A29EBB3E1D284 DUP4 MSTORE DUP7 PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE DUP12 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xA05 PUSH1 0xE0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP4 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x22 DUP5 ADD MSTORE PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x42 DUP3 MSTORE PUSH2 0xA4E PUSH1 0x62 DUP4 PUSH2 0xE63 JUMP JUMPDEST ISZERO PUSH2 0xBB3 JUMPI SWAP2 PUSH1 0x64 PUSH1 0x20 SWAP5 SWAP3 DUP7 SWAP5 MLOAD SWAP1 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP9 DUP10 SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP8 ADD MSTORE DUP2 PUSH1 0x44 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB38 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x541 JUMPI PUSH2 0x222 SWAP6 PUSH2 0xF0D JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBAB JUMPI JUMPDEST DUP2 PUSH2 0xB51 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xE63 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x5E1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x5DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xAE5 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB44 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP2 SWAP3 SWAP1 PUSH2 0xBC2 DUP3 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xE63 JUMP JUMPDEST DUP3 DUP2 MSTORE CALLDATASIZE DUP4 DUP4 ADD GT PUSH2 0x14F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 PUSH1 0x20 DUP6 PUSH2 0xC0B SWAP7 PUSH2 0x653 SWAP7 DUP4 DUP8 ADD CALLDATACOPY DUP5 ADD ADD MSTORE PUSH2 0x10DD JUMP JUMPDEST AND SUB PUSH2 0x679 JUMPI PUSH2 0x222 SWAP6 PUSH2 0xF0D JUMP JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0xC51 PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0xC59 PUSH2 0xCFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC76 PUSH2 0xD1F JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xF8 SHR PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x14F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x14F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x14F JUMPI JUMP JUMPDEST CHAINID PUSH32 0x0 SUB PUSH2 0xDBB JUMPI PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 DUP3 MSTORE PUSH32 0x6A520FDA4CA688235391B02E357C6A65EB2A3BB40A69C0199F3F7F9CCCEE041 PUSH1 0x40 DUP3 ADD MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE ADDRESS PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP2 MSTORE PUSH2 0xE27 PUSH1 0xA0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x14 SWAP4 SWAP3 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 SWAP4 DUP3 CALLDATACOPY ADD SWAP2 PUSH1 0x60 SHL AND DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xEA4 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xEA4 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP7 ADD PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 ISZERO ISZERO PUSH1 0xF8 DUP2 SWAP1 SHL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND SWAP5 SWAP2 DUP4 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x61036A3BAAB62925C6646F1EB84438957E2F9B3C52D084E099F955E04788B048 SWAP2 SWAP1 LOG4 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 DUP4 SELFBALANCE LT PUSH2 0x100E JUMPI PUSH1 0x0 DUP2 PUSH2 0x1003 SWAP5 SWAP6 PUSH1 0x20 DUP4 SWAP5 MLOAD SWAP3 ADD SWAP1 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x1006 JUMPI RETURNDATASIZE SWAP2 PUSH2 0xFE6 DUP4 PUSH2 0xED3 JUMP JUMPDEST SWAP3 PUSH2 0xFF4 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xE63 JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x1040 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x1040 JUMP JUMPDEST DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x107F JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x1055 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x10D4 JUMPI JUMPDEST PUSH2 0x1090 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1088 JUMP JUMPDEST DUP2 MLOAD SWAP2 SWAP1 PUSH1 0x41 DUP4 SUB PUSH2 0x110E JUMPI PUSH2 0x1107 SWAP3 POP PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x1205 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 PUSH1 0x2 SWAP2 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x11D6 JUMPI DUP1 PUSH2 0x112F JUMPI POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 SUB PUSH2 0x1163 JUMPI PUSH32 0xF645EEDF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x2 DUP2 SUB PUSH2 0x119A JUMPI DUP3 PUSH32 0xFCE698F700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH1 0x3 PUSH1 0x0 SWAP3 EQ PUSH2 0x11AA JUMPI POP POP JUMP JUMPDEST PUSH1 0x24 SWAP3 POP PUSH32 0xD78BCE0C00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP5 GT PUSH2 0x128F JUMPI SWAP2 PUSH1 0x20 SWAP4 PUSH1 0x80 SWAP3 PUSH1 0xFF PUSH1 0x0 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP7 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1283 JUMPI SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP2 PUSH1 0x3 SWAP2 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC 0xB4 0x27 0xD0 0xB6 0xBA SWAP7 PUSH28 0x79E07DD757EB0DF0BBD48FFBE72373CCC36ACC2B6240C68664736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"721:8489:74:-:0;;;;2279:53;2341:30;;8953:234;;;8985:80;1176:30;;;721:8489;1176:30;;;2279:53;1176:30;;;;9164:4;2341:30;1176;;;2341;8953:234;;;1176:30;;;;;;;;;;;;;;;;;721:8489;1176:30;;8926:275;;8953:234;2381:65;721:8489;;;;;;2341:30;721:8489;;;;;8953:234;721:8489;;;;;;1176:30;;;;-1:-1:-1;1176:30:74;;;;;-1:-1:-1;1176:30:74;721:8489;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3359,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_address_4091":{"entryPoint":3324,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":3394,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":3289,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_packed_bytes_calldata_address":{"entryPoint":3629,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":3795,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3683,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":3440,"id":12889,"parameterSlots":0,"returnSlots":1},"fun_functionCallWithValue":{"entryPoint":4023,"id":1041,"parameterSlots":3,"returnSlots":1},"fun_setForwarderApproval":{"entryPoint":3853,"id":13056,"parameterSlots":6,"returnSlots":0},"fun_throwError":{"entryPoint":4377,"id":3222,"parameterSlots":2,"returnSlots":0},"fun_tryRecover":{"entryPoint":4613,"id":3137,"parameterSlots":4,"returnSlots":3},"fun_tryRecover_2949":{"entryPoint":4317,"id":2949,"parameterSlots":2,"returnSlots":3},"fun_verifyCallResultFromTarget":{"entryPoint":4160,"id":1133,"parameterSlots":3,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"12664":[{"length":32,"start":3443}],"12666":[{"length":32,"start":3481}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063019a202814610c1a5780630c695d17146108655780633644e51514610824578063572b6c05146107e15780636fadcf72146106a35780639438f7f314610224578063953135f5146101545763ae3c8c2d1461007457600080fd5b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f576100ab610cd9565b6100b3610cfc565b73ffffffffffffffffffffffffffffffffffffffff6100d0610d1f565b9216600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5761018b610cd9565b610193610cfc565b90604435801515810361014f5761022292336000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020927effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff845416933390610f0d565b005b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5760043567ffffffffffffffff811161014f5761026e903690600401610d42565b602435801515810361014f57610282610d1f565b9160643567ffffffffffffffff811161014f576102a3903690600401610d42565b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c95866000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff3316600052602052604060002073ffffffffffffffffffffffffffffffffffffffff87166000526020526040600020937effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8554169261034b610d70565b9060405160208101907f1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d28482528b604082015233606082015273ffffffffffffffffffffffffffffffffffffffff8b166080820152600160a08201528660c082015260c081526103bb60e082610e63565b519020906040519160208301937f190100000000000000000000000000000000000000000000000000000000000085526022840152604283015260428252610404606283610e63565b156105f95760209293916064915190207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8660405197889687957f1626ba7e000000000000000000000000000000000000000000000000000000008752600487015260406024870152816044870152868601376000858286010152011681010301818a5afa9081156105ed5760009161056b575b507fffffffff000000000000000000000000000000000000000000000000000000007f1626ba7e0000000000000000000000000000000000000000000000000000000091160361054157610222956104ff61050e9260018861053a975b853391610f0d565b60405194859360208501610e2d565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610e63565b3491610fb7565b7f5d52cbe30000000000000000000000000000000000000000000000000000000060005260046000fd5b6020813d6020116105e5575b8161058460209383610e63565b810103126105e15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105de57507fffffffff0000000000000000000000000000000000000000000000000000000061049a565b80fd5b5080fd5b3d9150610577565b6040513d6000823e3d90fd5b5190209061060681610ed3565b926106146040519485610e63565b818452368282011161014f578373ffffffffffffffffffffffffffffffffffffffff93600060208561065c968f999683610653980137840101526110dd565b90929192611119565b160361067957610222956104ff61050e9260018861053a976104f7565b7fa7932e6a0000000000000000000000000000000000000000000000000000000060005260046000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f576106d5610cd9565b60243567ffffffffffffffff811161014f576106f5903690600401610d42565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec92919236013560601c92836000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff3316600052602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205460f81c156107955761053a9061050e6102229560405194859360208501610e2d565b73ffffffffffffffffffffffffffffffffffffffff83857f865e4ca900000000000000000000000000000000000000000000000000000000600052600452336024521660445260646000fd5b3461014f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57610818610cd9565b50602060405160018152f35b3461014f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57602061085d610d70565b604051908152f35b3461014f5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f5761089c610cd9565b6108a4610cfc565b906108ad610d1f565b606435908115159384830361014f5760843567ffffffffffffffff811161014f576108dc903690600401610d42565b60a4359591861515870361014f5773ffffffffffffffffffffffffffffffffffffffff831690816000526000602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002073ffffffffffffffffffffffffffffffffffffffff87166000526020526040600020987effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a541698610981610d70565b9160405160208101917f1d89f51cffda0adbc9dbff2f94eeaa6d10d8c3e27a39a69c4c7a29ebb3e1d284835286604083015273ffffffffffffffffffffffffffffffffffffffff8a16606083015273ffffffffffffffffffffffffffffffffffffffff8b16608083015260a08201528b60c082015260c08152610a0560e082610e63565b519020906040519160208301937f190100000000000000000000000000000000000000000000000000000000000085526022840152604283015260428252610a4e606283610e63565b15610bb3579160646020949286945190207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051988997889687957f1626ba7e000000000000000000000000000000000000000000000000000000008752600487015260406024870152816044870152868601376000858286010152011681010301915afa9081156105ed57600091610b38575b507fffffffff000000000000000000000000000000000000000000000000000000007f1626ba7e000000000000000000000000000000000000000000000000000000009116036105415761022295610f0d565b6020813d602011610bab575b81610b5160209383610e63565b810103126105e15751907fffffffff00000000000000000000000000000000000000000000000000000000821682036105de57507fffffffff00000000000000000000000000000000000000000000000000000000610ae5565b3d9150610b44565b519020919290610bc282610ed3565b610bcf6040519182610e63565b828152368383011161014f5773ffffffffffffffffffffffffffffffffffffffff936000602085610c0b966106539683870137840101526110dd565b16036106795761022295610f0d565b3461014f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f57610c51610cd9565b610c59610cfc565b73ffffffffffffffffffffffffffffffffffffffff610c76610d1f565b9216600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060406000205460f81c6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361014f57565b9181601f8401121561014f5782359167ffffffffffffffff831161014f576020838186019501011161014f57565b467f000000000000000000000000000000000000000000000000000000000000000003610dbb577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f06a520fda4ca688235391b02e357c6a65eb2a3bb40a69c0199f3f7f9cccee041604082015246606082015230608082015260808152610e2760a082610e63565b51902090565b9160149392817fffffffffffffffffffffffffffffffffffffffff000000000000000000000000938237019160601b1681520190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ea457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ea457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600186017effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1694151560f881901b7fff000000000000000000000000000000000000000000000000000000000000001695909517905560408051948552602085019590955273ffffffffffffffffffffffffffffffffffffffff92831694918316939216917f61036a3baab62925c6646f1eb84438957e2f9b3c52d084e099f955e04788b0489190a4565b9092919283471061100e5760008161100394956020839451920190855af13d15611006573d91610fe683610ed3565b92610ff46040519485610e63565b83523d6000602085013e611040565b90565b606091611040565b83477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9061107f575080511561105557602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806110d4575b611090575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15611088565b815191906041830361110e5761110792506020820151906060604084015193015160001a90611205565b9192909190565b505060009160029190565b91909160048110156111d6578061112f57509050565b600060018203611163577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b506002810361119a57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146111aa575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161128f579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156105ed5760005173ffffffffffffffffffffffffffffffffffffffff8116156112835790600090600090565b50600090600190600090565b5050506000916003919056fea26469706673582212200cb427d0b6ba967b79e07dd757eb0df0bbd48ffbe72373ccc36acc2b6240c68664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x19A2028 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xC695D17 EQ PUSH2 0x865 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x824 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x7E1 JUMPI DUP1 PUSH4 0x6FADCF72 EQ PUSH2 0x6A3 JUMPI DUP1 PUSH4 0x9438F7F3 EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x953135F5 EQ PUSH2 0x154 JUMPI PUSH4 0xAE3C8C2D EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0xAB PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0xB3 PUSH2 0xCFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0 PUSH2 0xD1F JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x18B PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x193 PUSH2 0xCFC JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x14F JUMPI PUSH2 0x222 SWAP3 CALLER PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 SLOAD AND SWAP4 CALLER SWAP1 PUSH2 0xF0D JUMP JUMPDEST STOP JUMPDEST PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x26E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x14F JUMPI PUSH2 0x282 PUSH2 0xD1F JUMP JUMPDEST SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x2A3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP6 DUP7 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP4 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 SLOAD AND SWAP3 PUSH2 0x34B PUSH2 0xD70 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 PUSH32 0x1D89F51CFFDA0ADBC9DBFF2F94EEAA6D10D8C3E27A39A69C4C7A29EBB3E1D284 DUP3 MSTORE DUP12 PUSH1 0x40 DUP3 ADD MSTORE CALLER PUSH1 0x60 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0xA0 DUP3 ADD MSTORE DUP7 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x3BB PUSH1 0xE0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP4 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x22 DUP5 ADD MSTORE PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x42 DUP3 MSTORE PUSH2 0x404 PUSH1 0x62 DUP4 PUSH2 0xE63 JUMP JUMPDEST ISZERO PUSH2 0x5F9 JUMPI PUSH1 0x20 SWAP3 SWAP4 SWAP2 PUSH1 0x64 SWAP2 MLOAD SWAP1 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP8 ADD MSTORE DUP2 PUSH1 0x44 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP11 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 SWAP2 PUSH2 0x56B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x541 JUMPI PUSH2 0x222 SWAP6 PUSH2 0x4FF PUSH2 0x50E SWAP3 PUSH1 0x1 DUP9 PUSH2 0x53A SWAP8 JUMPDEST DUP6 CALLER SWAP2 PUSH2 0xF0D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0xE63 JUMP JUMPDEST CALLVALUE SWAP2 PUSH2 0xFB7 JUMP JUMPDEST PUSH32 0x5D52CBE300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x5E5 JUMPI JUMPDEST DUP2 PUSH2 0x584 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xE63 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x5E1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x5DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x49A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x577 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH2 0x606 DUP2 PUSH2 0xED3 JUMP JUMPDEST SWAP3 PUSH2 0x614 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xE63 JUMP JUMPDEST DUP2 DUP5 MSTORE CALLDATASIZE DUP3 DUP3 ADD GT PUSH2 0x14F JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 PUSH1 0x20 DUP6 PUSH2 0x65C SWAP7 DUP16 SWAP10 SWAP7 DUP4 PUSH2 0x653 SWAP9 ADD CALLDATACOPY DUP5 ADD ADD MSTORE PUSH2 0x10DD JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1119 JUMP JUMPDEST AND SUB PUSH2 0x679 JUMPI PUSH2 0x222 SWAP6 PUSH2 0x4FF PUSH2 0x50E SWAP3 PUSH1 0x1 DUP9 PUSH2 0x53A SWAP8 PUSH2 0x4F7 JUMP JUMPDEST PUSH32 0xA7932E6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x6D5 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x6F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC SWAP3 SWAP2 SWAP3 CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xF8 SHR ISZERO PUSH2 0x795 JUMPI PUSH2 0x53A SWAP1 PUSH2 0x50E PUSH2 0x222 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 PUSH1 0x20 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP6 PUSH32 0x865E4CA900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE CALLER PUSH1 0x24 MSTORE AND PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x818 PUSH2 0xCD9 JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH1 0x20 PUSH2 0x85D PUSH2 0xD70 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0xC0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0x89C PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x8A4 PUSH2 0xCFC JUMP JUMPDEST SWAP1 PUSH2 0x8AD PUSH2 0xD1F JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP4 DUP5 DUP4 SUB PUSH2 0x14F JUMPI PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x14F JUMPI PUSH2 0x8DC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD42 JUMP JUMPDEST PUSH1 0xA4 CALLDATALOAD SWAP6 SWAP2 DUP7 ISZERO ISZERO DUP8 SUB PUSH2 0x14F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP9 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 SLOAD AND SWAP9 PUSH2 0x981 PUSH2 0xD70 JUMP JUMPDEST SWAP2 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x1D89F51CFFDA0ADBC9DBFF2F94EEAA6D10D8C3E27A39A69C4C7A29EBB3E1D284 DUP4 MSTORE DUP7 PUSH1 0x40 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE DUP12 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xA05 PUSH1 0xE0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP4 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x22 DUP5 ADD MSTORE PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x42 DUP3 MSTORE PUSH2 0xA4E PUSH1 0x62 DUP4 PUSH2 0xE63 JUMP JUMPDEST ISZERO PUSH2 0xBB3 JUMPI SWAP2 PUSH1 0x64 PUSH1 0x20 SWAP5 SWAP3 DUP7 SWAP5 MLOAD SWAP1 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP9 DUP10 SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 DUP8 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP8 ADD MSTORE DUP2 PUSH1 0x44 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB38 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x541 JUMPI PUSH2 0x222 SWAP6 PUSH2 0xF0D JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBAB JUMPI JUMPDEST DUP2 PUSH2 0xB51 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xE63 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x5E1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x5DE JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xAE5 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB44 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP2 SWAP3 SWAP1 PUSH2 0xBC2 DUP3 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xE63 JUMP JUMPDEST DUP3 DUP2 MSTORE CALLDATASIZE DUP4 DUP4 ADD GT PUSH2 0x14F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 PUSH1 0x20 DUP6 PUSH2 0xC0B SWAP7 PUSH2 0x653 SWAP7 DUP4 DUP8 ADD CALLDATACOPY DUP5 ADD ADD MSTORE PUSH2 0x10DD JUMP JUMPDEST AND SUB PUSH2 0x679 JUMPI PUSH2 0x222 SWAP6 PUSH2 0xF0D JUMP JUMPDEST CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH2 0xC51 PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0xC59 PUSH2 0xCFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC76 PUSH2 0xD1F JUMP JUMPDEST SWAP3 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xF8 SHR PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x14F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x14F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x14F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x14F JUMPI JUMP JUMPDEST CHAINID PUSH32 0x0 SUB PUSH2 0xDBB JUMPI PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 DUP3 MSTORE PUSH32 0x6A520FDA4CA688235391B02E357C6A65EB2A3BB40A69C0199F3F7F9CCCEE041 PUSH1 0x40 DUP3 ADD MSTORE CHAINID PUSH1 0x60 DUP3 ADD MSTORE ADDRESS PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP2 MSTORE PUSH2 0xE27 PUSH1 0xA0 DUP3 PUSH2 0xE63 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x14 SWAP4 SWAP3 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 SWAP4 DUP3 CALLDATACOPY ADD SWAP2 PUSH1 0x60 SHL AND DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xEA4 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xEA4 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP7 ADD PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 ISZERO ISZERO PUSH1 0xF8 DUP2 SWAP1 SHL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND SWAP5 SWAP2 DUP4 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x61036A3BAAB62925C6646F1EB84438957E2F9B3C52D084E099F955E04788B048 SWAP2 SWAP1 LOG4 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 DUP4 SELFBALANCE LT PUSH2 0x100E JUMPI PUSH1 0x0 DUP2 PUSH2 0x1003 SWAP5 SWAP6 PUSH1 0x20 DUP4 SWAP5 MLOAD SWAP3 ADD SWAP1 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x1006 JUMPI RETURNDATASIZE SWAP2 PUSH2 0xFE6 DUP4 PUSH2 0xED3 JUMP JUMPDEST SWAP3 PUSH2 0xFF4 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xE63 JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x1040 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x1040 JUMP JUMPDEST DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x107F JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x1055 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x10D4 JUMPI JUMPDEST PUSH2 0x1090 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1088 JUMP JUMPDEST DUP2 MLOAD SWAP2 SWAP1 PUSH1 0x41 DUP4 SUB PUSH2 0x110E JUMPI PUSH2 0x1107 SWAP3 POP PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x1205 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 PUSH1 0x2 SWAP2 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x11D6 JUMPI DUP1 PUSH2 0x112F JUMPI POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 SUB PUSH2 0x1163 JUMPI PUSH32 0xF645EEDF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x2 DUP2 SUB PUSH2 0x119A JUMPI DUP3 PUSH32 0xFCE698F700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH1 0x3 PUSH1 0x0 SWAP3 EQ PUSH2 0x11AA JUMPI POP POP JUMP JUMPDEST PUSH1 0x24 SWAP3 POP PUSH32 0xD78BCE0C00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP5 GT PUSH2 0x128F JUMPI SWAP2 PUSH1 0x20 SWAP4 PUSH1 0x80 SWAP3 PUSH1 0xFF PUSH1 0x0 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP7 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1283 JUMPI SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP2 PUSH1 0x3 SWAP2 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC 0xB4 0x27 0xD0 0xB6 0xBA SWAP7 PUSH28 0x79E07DD757EB0DF0BBD48FFBE72373CCC36ACC2B6240C68664736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"721:8489:74:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;7238:30;721:8489;-1:-1:-1;721:8489:74;;;;;-1:-1:-1;721:8489:74;7238:38;721:8489;-1:-1:-1;721:8489:74;;;;;;-1:-1:-1;721:8489:74;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;2841:98;2801:10;;721:8489;;;;;;;;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;;;2801:10;;2841:98;;:::i;:::-;721:8489;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;408:89:80;721:8489:74;408:89:80;;721:8489:74;408:89:80;721:8489:74;;;;;;;;;;;6097:10;721:8489;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;;;7972:18;;;:::i;:::-;721:8489;;;;8014:73;;721:8489;1265:107;721:8489;;1265:107;721:8489;1265:107;;721:8489;6097:10;721:8489;1265:107;;721:8489;;;;;1265:107;;721:8489;6117:4;1265:107;;;721:8489;1265:107;;;;721:8489;1265:107;8014:73;;;721:8489;8014:73;;:::i;:::-;1265:107;8004:84;;721:8489;;;7918:180;721:8489;7918:180;;1265:107;;;;;;;721:8489;1265:107;;;721:8489;1265:107;7918:180;;;;;;:::i;:::-;8108:271;;;721:8489;1265:107;;;721:8489;1265:107;;8184:15;;8014:73;721:8489;;;;8150:61;;;;;1265:107;8150:61;;721:8489;8150:61;;721:8489;;;1265:107;;;;;;;;;;;721:8489;;;;;;;;;;1265:107;;8150:61;;;;;;;;;;;721:8489;8150:61;;;8108:271;1265:107;;;;;8150:83;8146:121;;6163:71;8108:271;4336:5;6192:30;8108:271;6117:4;8108:271;6192:30;8108:271;;6097:10;;4336:5;;:::i;:::-;721:8489;;6192:30;;;721:8489;6192:30;;;:::i;:::-;;8014:73;6192:30;;;;;;:::i;:::-;6224:9;6163:71;;:::i;8146:121::-;8242:25;721:8489;8242:25;721:8489;;8242:25;8150:61;721:8489;8150:61;;721:8489;8150:61;;;;;;721:8489;8150:61;;;:::i;:::-;;;1265:107;;;;;;;;;;;;;8150:61;1265:107;8150:61;;1265:107;;;;721:8489;;;8150:61;;;-1:-1:-1;8150:61:74;;;721:8489;;1265:107;721:8489;1265:107;;;;;8108:271;1265:107;8302:15;;1265:107;;;;:::i;:::-;721:8489;1265:107;721:8489;;1265:107;;;:::i;:::-;;;;721:8489;1265:107;;;;;;;721:8489;1265:107;721:8489;;1265:107;3927:8:16;1265:107:74;;;;;3871:27:16;1265:107:74;;721:8489;;;;;3871:27:16;:::i;:::-;3927:8;;;;;:::i;:::-;721:8489:74;8302:44;8298:70;;6163:71;8108:271;4336:5;6192:30;8108:271;6117:4;8108:271;6192:30;8108:271;;;8298:70;8355:13;721:8489;8355:13;721:8489;;8355:13;721:8489;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;408:89:80;721:8489:74;;;;408:89:80;;;;721:8489:74;;;;;;;;;;;4908:10;721:8489;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;4887:49;4883:110;;5032:30;721:8489;5032:30;5003:71;721:8489;;;5032:30;;;721:8489;5032:30;;;:::i;4883:110::-;721:8489;4945:48;;;721:8489;4945:48;721:8489;;4908:10;721:8489;;;;;;;4945:48;721:8489;;;;;;;;;;;;;:::i;:::-;;;;;7632:4;721:8489;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;-1:-1:-1;721:8489:74;;;;;;7972:18;;;:::i;:::-;721:8489;;;;8014:73;;721:8489;1265:107;721:8489;;1265:107;721:8489;1265:107;;721:8489;;;;1265:107;;;721:8489;;;;1265:107;;;721:8489;1265:107;;;721:8489;1265:107;721:8489;1265:107;;721:8489;;8014:73;;;721:8489;8014:73;;:::i;:::-;1265:107;8004:84;;721:8489;;;7918:180;721:8489;7918:180;;1265:107;;;;;;;721:8489;1265:107;;;721:8489;1265:107;7918:180;;;;;;:::i;:::-;8108:271;;;1265:107;721:8489;;1265:107;;;;;8184:15;;8014:73;721:8489;;;8150:61;;;;;;;1265:107;8150:61;;721:8489;8150:61;;721:8489;;1265:107;;;;;;;;;;;;721:8489;;;;;;;;;;1265:107;;8150:61;;;;;;;;;;721:8489;8150:61;;;8108:271;1265:107;;;;;8150:83;8146:121;;4336:5;8108:271;4336:5;:::i;8150:61::-;721:8489;8150:61;;721:8489;8150:61;;;;;;721:8489;8150:61;;;:::i;:::-;;;1265:107;;;;;;;;;;;;;8150:61;1265:107;8150:61;;;;;-1:-1:-1;8150:61:74;;8108:271;1265:107;8302:15;;1265:107;;;;;;:::i;:::-;;721:8489;;1265:107;;;:::i;:::-;;;;721:8489;1265:107;;;;;;721:8489;1265:107;721:8489;;1265:107;3927:8:16;1265:107:74;3871:27:16;1265:107:74;;;;721:8489;;;;;3871:27:16;:::i;3927:8::-;721:8489:74;8302:44;8298:70;;4336:5;8108:271;4336:5;:::i;721:8489::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;7460:30;721:8489;-1:-1:-1;721:8489:74;;;;;-1:-1:-1;721:8489:74;7460:38;721:8489;-1:-1:-1;721:8489:74;;;;;-1:-1:-1;721:8489:74;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6416:404::-;6525:53;6725:20;6714:31;6725:20;;6748:28;6416:404;:::o;6714:99::-;721:8489;;8953:234;;;721:8489;8985:80;721:8489;;1176:30;721:8489;1176:30;;721:8489;6525:53;1176:30;;;721:8489;9164:4;1176:30;;;721:8489;1176:30;8953:234;;;;;;:::i;:::-;1265:107;8926:275;;6416:404;:::o;721:8489::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;721:8489:74;;;;;-1:-1:-1;721:8489:74;1265:107;;;;;;721:8489;;;;1265:107;;;:::o;8391:417::-;-1:-1:-1;721:8489:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8740:61;;721:8489;8740:61;8391:417::o;2975:407:9:-;;;;;3102:21;;:29;3098:123;;3272:31;;3320:55;3272:31;;;;;;;;;;;;721:8489:74;;;;;;;;;:::i;:::-;;1265:107;721:8489;;1265:107;;;:::i;:::-;721:8489;;;3272:31:9;;721:8489:74;;;3320:55:9;:::i;:::-;2975:407;:::o;721:8489:74:-;;;3320:55:9;:::i;3098:123::-;3181:21;;3154:56;;;;721:8489:74;;;;3154:56:9;;4437:582;;4609:8;;-1:-1:-1;1265:107:74;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;1265:107:74;;4857:22:9;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;721:8489:74;4933:24:9;;4878:1;4933:24;721:8489:74;4933:24:9;721:8489:74;;4878:1:9;4933:24;4857:49;4883:18;;;:23;4857:49;;2129:778:16;1265:107:74;;;2129:778:16;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:16;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;7280:532::-;;;;721:8489:74;;;;;;7366:29:16;;;7411:7;;;:::o;7362:444::-;7375:20;721:8489:74;7462:38:16;;721:8489:74;;7523:23:16;7375:20;7523:23;721:8489:74;7375:20:16;7523:23;7458:348;-1:-1:-1;7576:35:16;7567:44;;7576:35;;7634:46;;7375:20;7634:46;721:8489:74;;;7375:20:16;7634:46;7563:243;721:8489:74;;7710:30:16;7375:20;7701:39;;7697:109;;7563:243;;7280:532::o;7697:109::-;721:8489:74;7763:32:16;;;;;721:8489:74;;7763:32:16;721:8489:74;;7375:20:16;721:8489:74;;;;;7375:20:16;721:8489:74;5203:1551:16;;;6283:66;6270:79;;6266:164;;721:8489:74;;;;;;-1:-1:-1;721:8489:74;;;;;;;;;;;;;;;;;;;6541:24:16;;;;;;;;;-1:-1:-1;6541:24:16;721:8489:74;;;6579:20:16;6575:113;;6698:49;-1:-1:-1;6698:49:16;-1:-1:-1;5203:1551:16;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:16;6541:24;6615:62;-1:-1:-1;6615:62:16;:::o;6266:164::-;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"963400","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","approveAndForward(bytes,bool,address,bytes)":"infinite","forward(address,bytes)":"infinite","getNonce(address,address,address)":"2794","isApprovedForwarder(address,address,address)":"2649","isTrustedForwarder(address)":"273","setForwarderApproval(address,address,address,bool,bytes,bool)":"infinite","setForwarderApproval(address,address,bool)":"27398"},"internal":{"_calculateDomainSeparator(uint256)":"infinite","_requireValidSignature(address,address,address,bool,uint256,bytes calldata,bool)":"infinite","_setForwarderApproval(struct ForwarderRegistry.Forwarder storage pointer,address,address,address,bool,uint256)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","approveAndForward(bytes,bool,address,bytes)":"9438f7f3","forward(address,bytes)":"6fadcf72","getNonce(address,address,address)":"ae3c8c2d","isApprovedForwarder(address,address,address)":"019a2028","isTrustedForwarder(address)":"572b6c05","setForwarderApproval(address,address,address,bool,bytes,bool)":"0c695d17","setForwarderApproval(address,address,bool)":"953135f5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"ForwarderNotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEIP1271Signature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"ForwarderApproval\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isEIP1271Signature\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"approveAndForward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"forward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"isApprovedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isEIP1271Signature\",\"type\":\"bool\"}],\"name\":\"setForwarderApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setForwarderApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract should be deployed uniquely per network, in a non-upgradeable way.\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}]},\"events\":{\"ForwarderApproval(address,address,address,bool,uint256)\":{\"params\":{\"approved\":\"True for an approval, false for a disapproval.\",\"forwarder\":\"The account approved or disapproved as forwarder.\",\"nonce\":\"The `sender`'s account nonce before the approval change.\",\"sender\":\"The account for which `forwarder` is approved or disapproved.\",\"target\":\"The target contract approved or disapproved as forwarder.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"returns\":{\"domainSeparator\":\"The EIP-712 domain separator.\"}},\"approveAndForward(bytes,bool,address,bytes)\":{\"details\":\"Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.Emits a {ForwarderApproval} event.\",\"params\":{\"data\":\"The content of the call (the `sender` address will be appended to it according to EIP-2771).\",\"isEIP1271Signature\":\"True if `sender` is a contract that provides authorization via EIP-1271.\",\"signature\":\"Signature by `sender` for approving the forwarder.\",\"target\":\"The destination of the call (that will receive the meta-transaction).\"}},\"forward(address,bytes)\":{\"details\":\"Reverts with {ForwarderNotApproved} if the caller has not been previously approved as a forwarder by the sender.\",\"params\":{\"data\":\"The content of the call (the `sender` address will be appended to it according to EIP-2771).\",\"target\":\"The destination of the call (that will receive the meta-transaction).\"}},\"getNonce(address,address,address)\":{\"params\":{\"forwarder\":\"The forwarder account.\",\"sender\":\"The sender account.\",\"target\":\"The target contract.\"},\"returns\":{\"nonce\":\"The current nonce for the `sender`/`forwarder`/`target` tuple.\"}},\"isApprovedForwarder(address,address,address)\":{\"params\":{\"forwarder\":\"The forwarder account.\",\"sender\":\"The sender account.\",\"target\":\"The target contract.\"},\"returns\":{\"_0\":\"True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"setForwarderApproval(address,address,address,bool,bytes,bool)\":{\"details\":\"Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.Emits a {ForwarderApproval} event.\",\"params\":{\"approved\":\"Whether to approve or disapprove the forwarder.\",\"forwarder\":\"The address of the forwarder to change the approval of.\",\"isEIP1271Signature\":\"True if `sender` is a contract that provides authorization via EIP-1271.\",\"sender\":\"The address which signed the approval of the approval.\",\"signature\":\"Signature by `sender` for approving forwarder.\",\"target\":\"The target contract to change the approval of.\"}},\"setForwarderApproval(address,address,bool)\":{\"details\":\"Emits a {ForwarderApproval} event.\",\"params\":{\"forwarder\":\"The address of the forwarder to change the approval of.\"}}},\"title\":\"Meta-Transactions Forwarder Registry.\",\"version\":1},\"userdoc\":{\"events\":{\"ForwarderApproval(address,address,address,bool,uint256)\":{\"notice\":\"Emitted when a forwarder is approved or disapproved.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 DOMAIN_SEPARATOR.\"},\"approveAndForward(bytes,bool,address,bytes)\":{\"notice\":\"Approves the forwarder and forwards the meta-transaction using EIP-2771.\"},\"forward(address,bytes)\":{\"notice\":\"Forwards the meta-transaction using EIP-2771.\"},\"getNonce(address,address,address)\":{\"notice\":\"Gets the current nonce for the sender/forwarder pair.\"},\"isApprovedForwarder(address,address,address)\":{\"notice\":\"Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"setForwarderApproval(address,address,address,bool,bytes,bool)\":{\"notice\":\"Approves or disapproves a forwarder using a signature.\"},\"setForwarderApproval(address,address,bool)\":{\"notice\":\"Approves or disapproves a forwarder for the sender.\"}},\"notice\":\"Users can allow specific EIP-2771 forwarders to forward meta-transactions on their behalf, per target contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/ForwarderRegistry.sol\":\"ForwarderRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS\\n    }\\n\\n    /**\\n     * @dev The signature derives the `address(0)`.\\n     */\\n    error ECDSAInvalidSignature();\\n\\n    /**\\n     * @dev The signature has an invalid length.\\n     */\\n    error ECDSAInvalidSignatureLength(uint256 length);\\n\\n    /**\\n     * @dev The signature has an S value that is in the upper half order.\\n     */\\n    error ECDSAInvalidSignatureS(bytes32 s);\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\\n     * and a bytes32 providing additional information about the error.\\n     *\\n     * If no error is returned, then the address can be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes memory signature\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly (\\\"memory-safe\\\") {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        unchecked {\\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\\n            return tryRecover(hash, v, r, s);\\n        }\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     */\\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS, s);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\\n        }\\n\\n        return (signer, RecoverError.NoError, bytes32(0));\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\\n     */\\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert ECDSAInvalidSignature();\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert ECDSAInvalidSignatureS(errorArg);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\"},\"contracts/cryptography/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Standard Signature Validation Method for Contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1271\\ninterface IERC1271 {\\n    /// @notice Returns whether the signature is valid for the data hash.\\n    /// @param hash The hash of the signed data.\\n    /// @param signature The signature for `hash`.\\n    /// @return magicValue `0x1626ba7e` (`bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\")`) if the signature is valid, else any other value.\\n    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x398946875e5504f89b0137202e1733544939f6dea85c0b5e50fb388d11f5d8fa\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC1271} from \\\"./../cryptography/interfaces/IERC1271.sol\\\";\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ERC2771Calldata} from \\\"./libraries/ERC2771Calldata.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {ECDSA} from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry.\\n/// @notice Users can allow specific EIP-2771 forwarders to forward meta-transactions on their behalf, per target contract.\\n/// @dev This contract should be deployed uniquely per network, in a non-upgradeable way.\\ncontract ForwarderRegistry is IForwarderRegistry, IERC2771 {\\n    using Address for address;\\n    using ECDSA for bytes32;\\n\\n    struct Forwarder {\\n        uint248 nonce;\\n        bool approved;\\n    }\\n\\n    error ForwarderNotApproved(address sender, address forwarder, address target);\\n    error InvalidEIP1271Signature();\\n    error WrongSigner();\\n\\n    bytes4 private constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n    bytes32 private constant EIP712_DOMAIN_NAME = keccak256(\\\"ForwarderRegistry\\\");\\n    bytes32 private constant APPROVAL_TYPEHASH =\\n        keccak256(\\\"ForwarderApproval(address sender,address forwarder,address target,bool approved,uint256 nonce)\\\");\\n\\n    // sender => forwarder => target => Forwarder\\n    mapping(address => mapping(address => mapping(address => Forwarder))) private _forwarders;\\n\\n    uint256 private immutable _DEPLOYMENT_CHAIN_ID;\\n    bytes32 private immutable _DEPLOYMENT_DOMAIN_SEPARATOR;\\n\\n    /// @notice Emitted when a forwarder is approved or disapproved.\\n    /// @param sender The account for which `forwarder` is approved or disapproved.\\n    /// @param forwarder The account approved or disapproved as forwarder.\\n    /// @param target The target contract approved or disapproved as forwarder.\\n    /// @param approved True for an approval, false for a disapproval.\\n    /// @param nonce The `sender`'s account nonce before the approval change.\\n    event ForwarderApproval(address indexed sender, address indexed forwarder, address indexed target, bool approved, uint256 nonce);\\n\\n    constructor() {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DEPLOYMENT_CHAIN_ID = chainId;\\n        _DEPLOYMENT_DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Approves or disapproves a forwarder for the sender.\\n    /// @dev Emits a {ForwarderApproval} event.\\n    /// @param forwarder The address of the forwarder to change the approval of.\\n    function setForwarderApproval(address forwarder, address target, bool approved) external {\\n        Forwarder storage forwarderData = _forwarders[msg.sender][forwarder][target];\\n        _setForwarderApproval(forwarderData, msg.sender, forwarder, target, approved, forwarderData.nonce);\\n    }\\n\\n    /// @notice Approves or disapproves a forwarder using a signature.\\n    /// @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\\n    /// @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\\n    /// @dev Emits a {ForwarderApproval} event.\\n    /// @param sender The address which signed the approval of the approval.\\n    /// @param forwarder The address of the forwarder to change the approval of.\\n    /// @param target The target contract to change the approval of.\\n    /// @param approved Whether to approve or disapprove the forwarder.\\n    /// @param signature Signature by `sender` for approving forwarder.\\n    /// @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271.\\n    function setForwarderApproval(\\n        address sender,\\n        address forwarder,\\n        address target,\\n        bool approved,\\n        bytes calldata signature,\\n        bool isEIP1271Signature\\n    ) public {\\n        Forwarder storage forwarderData = _forwarders[sender][forwarder][target];\\n        uint256 nonce = forwarderData.nonce;\\n\\n        _requireValidSignature(sender, forwarder, target, approved, nonce, signature, isEIP1271Signature);\\n        _setForwarderApproval(forwarderData, sender, forwarder, target, approved, nonce);\\n    }\\n\\n    /// @notice Forwards the meta-transaction using EIP-2771.\\n    /// @dev Reverts with {ForwarderNotApproved} if the caller has not been previously approved as a forwarder by the sender.\\n    /// @param target The destination of the call (that will receive the meta-transaction).\\n    /// @param data The content of the call (the `sender` address will be appended to it according to EIP-2771).\\n    function forward(address target, bytes calldata data) external payable {\\n        address sender = ERC2771Calldata.msgSender();\\n        if (!_forwarders[sender][msg.sender][target].approved) revert ForwarderNotApproved(sender, msg.sender, target);\\n        target.functionCallWithValue(abi.encodePacked(data, sender), msg.value);\\n    }\\n\\n    /// @notice Approves the forwarder and forwards the meta-transaction using EIP-2771.\\n    /// @dev Reverts with {InvalidEIP1271Signature} if `isEIP1271Signature` is true and the signature is reported invalid by the `sender` contract.\\n    /// @dev Reverts with {WrongSigner} if `isEIP1271Signature` is false and `sender` is not the actual signer.\\n    /// @dev Emits a {ForwarderApproval} event.\\n    /// @param signature Signature by `sender` for approving the forwarder.\\n    /// @param isEIP1271Signature True if `sender` is a contract that provides authorization via EIP-1271.\\n    /// @param target The destination of the call (that will receive the meta-transaction).\\n    /// @param data The content of the call (the `sender` address will be appended to it according to EIP-2771).\\n    function approveAndForward(bytes calldata signature, bool isEIP1271Signature, address target, bytes calldata data) external payable {\\n        address sender = ERC2771Calldata.msgSender();\\n        setForwarderApproval(sender, msg.sender, target, true, signature, isEIP1271Signature);\\n        target.functionCallWithValue(abi.encodePacked(data, sender), msg.value);\\n    }\\n\\n    /// @notice Returns the EIP-712 DOMAIN_SEPARATOR.\\n    /// @return domainSeparator The EIP-712 domain separator.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32 domainSeparator) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n\\n        // in case a fork happens, to support the chain that had to change its chainId, we compute the domain operator\\n        return chainId == _DEPLOYMENT_CHAIN_ID ? _DEPLOYMENT_DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Gets the current nonce for the sender/forwarder pair.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return nonce The current nonce for the `sender`/`forwarder`/`target` tuple.\\n    function getNonce(address sender, address forwarder, address target) external view returns (uint256 nonce) {\\n        return _forwarders[sender][forwarder][target].nonce;\\n    }\\n\\n    /// @inheritdoc IForwarderRegistry\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool) {\\n        return _forwarders[sender][forwarder][target].approved;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address) external pure returns (bool) {\\n        return true;\\n    }\\n\\n    function _requireValidSignature(\\n        address sender,\\n        address forwarder,\\n        address target,\\n        bool approved,\\n        uint256 nonce,\\n        bytes calldata signature,\\n        bool isEIP1271Signature\\n    ) private view {\\n        bytes memory data = abi.encodePacked(\\n            \\\"\\\\x19\\\\x01\\\",\\n            DOMAIN_SEPARATOR(),\\n            keccak256(abi.encode(APPROVAL_TYPEHASH, sender, forwarder, target, approved, nonce))\\n        );\\n        if (isEIP1271Signature) {\\n            if (IERC1271(sender).isValidSignature(keccak256(data), signature) != EIP1271_MAGICVALUE) revert InvalidEIP1271Signature();\\n        } else {\\n            if (keccak256(data).recover(signature) != sender) revert WrongSigner();\\n        }\\n    }\\n\\n    function _setForwarderApproval(\\n        Forwarder storage forwarderData,\\n        address sender,\\n        address forwarder,\\n        address target,\\n        bool approved,\\n        uint256 nonce\\n    ) private {\\n        forwarderData.approved = approved;\\n        unchecked {\\n            forwarderData.nonce = uint248(nonce + 1);\\n        }\\n        emit ForwarderApproval(sender, forwarder, target, approved, nonce);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\"),\\n                    EIP712_DOMAIN_NAME,\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0x19abc61bf368f0768ee7366d1b918bdcf324f570f402fb7925e5c73645dd01f5\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":12662,"contract":"contracts/metatx/ForwarderRegistry.sol:ForwarderRegistry","label":"_forwarders","offset":0,"slot":"0","type":"t_mapping(t_address,t_mapping(t_address,t_mapping(t_address,t_struct(Forwarder)12628_storage)))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_mapping(t_address,t_mapping(t_address,t_mapping(t_address,t_struct(Forwarder)12628_storage)))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => mapping(address => struct ForwarderRegistry.Forwarder)))","numberOfBytes":"32","value":"t_mapping(t_address,t_mapping(t_address,t_struct(Forwarder)12628_storage))"},"t_mapping(t_address,t_mapping(t_address,t_struct(Forwarder)12628_storage))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(address => struct ForwarderRegistry.Forwarder))","numberOfBytes":"32","value":"t_mapping(t_address,t_struct(Forwarder)12628_storage)"},"t_mapping(t_address,t_struct(Forwarder)12628_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => struct ForwarderRegistry.Forwarder)","numberOfBytes":"32","value":"t_struct(Forwarder)12628_storage"},"t_struct(Forwarder)12628_storage":{"encoding":"inplace","label":"struct ForwarderRegistry.Forwarder","members":[{"astId":12625,"contract":"contracts/metatx/ForwarderRegistry.sol:ForwarderRegistry","label":"nonce","offset":0,"slot":"0","type":"t_uint248"},{"astId":12627,"contract":"contracts/metatx/ForwarderRegistry.sol:ForwarderRegistry","label":"approved","offset":31,"slot":"0","type":"t_bool"}],"numberOfBytes":"32"},"t_uint248":{"encoding":"inplace","label":"uint248","numberOfBytes":"31"}}},"userdoc":{"events":{"ForwarderApproval(address,address,address,bool,uint256)":{"notice":"Emitted when a forwarder is approved or disapproved."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 DOMAIN_SEPARATOR."},"approveAndForward(bytes,bool,address,bytes)":{"notice":"Approves the forwarder and forwards the meta-transaction using EIP-2771."},"forward(address,bytes)":{"notice":"Forwards the meta-transaction using EIP-2771."},"getNonce(address,address,address)":{"notice":"Gets the current nonce for the sender/forwarder pair."},"isApprovedForwarder(address,address,address)":{"notice":"Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"setForwarderApproval(address,address,address,bool,bytes,bool)":{"notice":"Approves or disapproves a forwarder using a signature."},"setForwarderApproval(address,address,bool)":{"notice":"Approves or disapproves a forwarder for the sender."}},"notice":"Users can allow specific EIP-2771 forwarders to forward meta-transactions on their behalf, per target contract.","version":1}}},"contracts/metatx/ForwarderRegistryContext.sol":{"ForwarderRegistryContext":{"abi":[{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.Derived from https://github.com/wighawag/universal-forwarder (MIT licence)","kind":"dev","methods":{"constructor":{"params":{"forwarderRegistry_":"The ForwarderRegistry contract address, or the zero address to disable meta-transactions."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}}},"title":"Meta-Transactions Forwarder Registry Context (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"forwarderRegistry_\":\"The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}}},\"title\":\"Meta-Transactions Forwarder Registry Context (immutable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/ForwarderRegistryContext.sol\":\"ForwarderRegistryContext\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."}},"version":1}}},"contracts/metatx/base/ForwarderRegistryContextBase.sol":{"ForwarderRegistryContextBase":{"abi":[],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Derived from https://github.com/wighawag/universal-forwarder (MIT licence)","kind":"dev","methods":{"constructor":{"params":{"forwarderRegistry":"The ForwarderRegistry contract address, or the zero address to disable meta-transactions."}}},"title":"Meta-Transactions Forwarder Registry Context (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"forwarderRegistry\":\"The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\"}}},\"title\":\"Meta-Transactions Forwarder Registry Context (proxiable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":\"ForwarderRegistryContextBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/metatx/facets/ForwarderRegistryContextFacet.sol":{"ForwarderRegistryContextFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Derived from https://github.com/wighawag/universal-forwarder (MIT licence)","kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}}},"title":"Meta-Transactions Forwarder Registry Context (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606c57601f61022838819003918201601f19168301916001600160401b03831184841017607157808492602094604052833981010312606c57516001600160a01b0381168103606c576080526040516101a09081610088823960805181818160e701526101220152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c9081632b4c9f161461009e575063572b6c051461003557600080fd5b346100995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100995760043573ffffffffffffffffffffffffffffffffffffffff811681036100995761008f60209161010b565b6040519015158152f35b600080fd5b346100995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100995760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156101635773ffffffffffffffffffffffffffffffffffffffff161490565b505060009056fea26469706673582212204dd3c417bccde9ed848013509812681be2f5537398399c2109178802229dd2c264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6C JUMPI PUSH1 0x1F PUSH2 0x228 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x71 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6C JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6C JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1A0 SWAP1 DUP2 PUSH2 0x88 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH1 0xE7 ADD MSTORE PUSH2 0x122 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x2B4C9F16 EQ PUSH2 0x9E JUMPI POP PUSH4 0x572B6C05 EQ PUSH2 0x35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x99 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x99 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x99 JUMPI PUSH2 0x8F PUSH1 0x20 SWAP2 PUSH2 0x10B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x99 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x99 JUMPI PUSH1 0x20 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x163 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4D 0xD3 0xC4 OR 0xBC 0xCD 0xE9 0xED DUP5 DUP1 SGT POP SWAP9 SLT PUSH9 0x1BE2F5537398399C21 MULMOD OR DUP9 MUL 0x22 SWAP14 0xD2 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"473:688:77:-:0;;;;;;;;;;;;;-1:-1:-1;;473:688:77;;;;-1:-1:-1;;;;;473:688:77;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;473:688:77;;;;;;655:40;;473:688;;;;;;;;655:40;473:688;;;;;;;;;;;;-1:-1:-1;473:688:77;;;;;;-1:-1:-1;473:688:77;;;;;-1:-1:-1;473:688:77"},"deployedBytecode":{"functionDebugData":{"fun_isTrustedForwarder":{"entryPoint":267,"id":13357,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13309":[{"length":32,"start":231},{"length":32,"start":290}]},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b60003560e01c9081632b4c9f161461009e575063572b6c051461003557600080fd5b346100995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100995760043573ffffffffffffffffffffffffffffffffffffffff811681036100995761008f60209161010b565b6040519015158152f35b600080fd5b346100995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100995760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156101635773ffffffffffffffffffffffffffffffffffffffff161490565b505060009056fea26469706673582212204dd3c417bccde9ed848013509812681be2f5537398399c2109178802229dd2c264736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x2B4C9F16 EQ PUSH2 0x9E JUMPI POP PUSH4 0x572B6C05 EQ PUSH2 0x35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x99 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x99 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x99 JUMPI PUSH2 0x8F PUSH1 0x20 SWAP2 PUSH2 0x10B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x99 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x99 JUMPI PUSH1 0x20 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x163 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4D 0xD3 0xC4 OR 0xBC 0xCD 0xE9 0xED DUP5 DUP1 SGT POP SWAP9 SLT PUSH9 0x1BE2F5537398399C21 MULMOD OR DUP9 MUL 0x22 SWAP14 0xD2 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"473:688:77:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;797:19;473:688;797:19;473:688;;;;858:301;473:688;1002:19;473:688;1002:53;;;998:96;;473:688;;1111:41;858:301;:::o;998:96::-;1071:12;;473:688;1071:12;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"83200","executionCost":"infinite","totalCost":"infinite"},"external":{"forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite"}},"methodIdentifiers":{"forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\",\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}}},\"title\":\"Meta-Transactions Forwarder Registry Context (facet version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/facets/ForwarderRegistryContextFacet.sol\":\"ForwarderRegistryContextFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/facets/ForwarderRegistryContextFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC2771} from \\\"./../interfaces/IERC2771.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\ncontract ForwarderRegistryContextFacet is IERC2771 {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    constructor(IForwarderRegistry forwarderRegistry_) {\\n        _FORWARDER_REGISTRY = forwarderRegistry_;\\n    }\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0xeed5800c5f1f85145cd83767340f67705d7d74fe8bcb4fad69faab35aed9071a\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."}},"version":1}}},"contracts/metatx/interfaces/IERC2771.sol":{"IERC2771":{"abi":[{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"isTrusted","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2771","kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"isTrusted":"True if `forwarder` is trusted, false if not."}}},"title":"Secure Protocol for Native Meta Transactions.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isTrustedForwarder(address)":"572b6c05"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isTrusted\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2771\",\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"isTrusted\":\"True if `forwarder` is trusted, false if not.\"}}},\"title\":\"Secure Protocol for Native Meta Transactions.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/interfaces/IERC2771.sol\":\"IERC2771\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."}},"version":1}}},"contracts/metatx/interfaces/IForwarderRegistry.sol":{"IForwarderRegistry":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"address","name":"target","type":"address"}],"name":"isApprovedForwarder","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"isApprovedForwarder(address,address,address)":{"params":{"forwarder":"The forwarder account.","sender":"The sender account.","target":"The target contract."},"returns":{"isApproved":"True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise."}}},"title":"Meta-Transactions Forwarder Registry.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isApprovedForwarder(address,address,address)":"019a2028"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"isApprovedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isApprovedForwarder(address,address,address)\":{\"params\":{\"forwarder\":\"The forwarder account.\",\"sender\":\"The sender account.\",\"target\":\"The target contract.\"},\"returns\":{\"isApproved\":\"True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\"}}},\"title\":\"Meta-Transactions Forwarder Registry.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isApprovedForwarder(address,address,address)\":{\"notice\":\"Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/interfaces/IForwarderRegistry.sol\":\"IForwarderRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isApprovedForwarder(address,address,address)":{"notice":"Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract."}},"version":1}}},"contracts/metatx/libraries/ERC2771Calldata.sol":{"ERC2771Calldata":{"abi":[],"devdoc":{"details":"Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)See https://eips.ethereum.org/EIPS/eip-2771","kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220fe1df6fbb2fcfd1b8063b0e0435f47c1c1459f7a92d4d131d5e5d9909173303e64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID SAR 0xF6 EXTSTATICCALL 0xB2 0xFC REVERT SHL DUP1 PUSH4 0xB0E0435F SELFBALANCE 0xC1 0xC1 GASLIMIT SWAP16 PUSH27 0x92D4D131D5E5D9909173303E64736F6C634300081E003300000000 ","sourceMap":"202:568:80:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220fe1df6fbb2fcfd1b8063b0e0435f47c1c1459f7a92d4d131d5e5d9909173303e64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID SAR 0xF6 EXTSTATICCALL 0xB2 0xFC REVERT SHL DUP1 PUSH4 0xB0E0435F SELFBALANCE 0xC1 0xC1 GASLIMIT SWAP16 PUSH27 0x92D4D131D5E5D9909173303E64736F6C634300081E003300000000 ","sourceMap":"202:568:80:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"msgData()":"infinite","msgSender()":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)See https://eips.ethereum.org/EIPS/eip-2771\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/metatx/libraries/ERC2771Calldata.sol\":\"ERC2771Calldata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/mocks/access/AccessControlMock.sol":{"AccessControlMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"TEST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceHasRole","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceHasTargetContractRole","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461013f57601f61114438819003918201601f19168301916001600160401b038311848410176101445780849260209460405283398101031261013f57516001600160a01b038116810361013f57336100e0575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610fe9908161015b8239608051818181610a5901528181610b4001528181610d590152610e840152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610055565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610a7d5780632b4c9f1614610a0e5780632f2ff15d1461088257806331e66e1e146107ff5780633ad554d0146107a6578063572b6c051461075b5780638bb9c5bf146106445780638da5cb5b146105d357806391d148541461053b57806394fc4425146103be578063d547741f14610235578063db9b206a146101d05763f2fde38b146100ab57600080fd5b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576100e2610b06565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61010b610d42565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361019e575073ffffffffffffffffffffffffffffffffffffffff169283830361015157005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5761023361020a610ae3565b6004357fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610c37565b005b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5760043561026f610ae3565b610277610d42565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361019e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661032957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101cb5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576103f5610b06565b6024356044359173ffffffffffffffffffffffffffffffffffffffff83168093036101cb57803b156104f75773ffffffffffffffffffffffffffffffffffffffff166040517f91d14854000000000000000000000000000000000000000000000000000000008152826004820152836024820152602081604481855afa9081156104eb576000916104bc575b501561048957005b7f7a436c160000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6104de915060203d6020116104e4575b6104d68183610cba565b810190610d2a565b84610481565b503d6104cc565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57610572610ae3565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb577ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356106c0610d42565b916106cc838383610c37565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556103b9826040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602061079c610797610b06565b610b29565b6040519015158152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5760206040517f74657374657200000000000000000000000000000000000000000000000000008152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576040610838610e6d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576004356108bc610ae3565b6108c4610d42565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361019e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561097757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016103b9565b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101cb5761079c602091610b88565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101cb57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101cb57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610b815773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610c31577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610c2b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610c72575050565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cfb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101cb575180151581036101cb5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e5e573233148015610e63575b610e5e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610dcd575b50610dca57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156104eb57600091610e3f575b5038610dc0565b610e58915060203d6020116104e4576104d68183610cba565b38610e38565b503390565b5060183610610d89565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610fa1573233148015610fa9575b610fa157803314908115610f00575b50610ecf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101cb5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156104eb57600091610f82575b5038610ec3565b610f9b915060203d6020116104e4576104d68183610cba565b38610f7b565b506000903690565b5060183610610eb456fea264697066735822122006b1fc4b5bdab4f7198e807673fca31034e21bb09c8e0c451aa4b594e6bb3d9764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x13F JUMPI PUSH1 0x1F PUSH2 0x1144 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x144 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x13F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x13F JUMPI CALLER PUSH2 0xE0 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xFE9 SWAP1 DUP2 PUSH2 0x15B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xA59 ADD MSTORE DUP2 DUP2 PUSH2 0xB40 ADD MSTORE DUP2 DUP2 PUSH2 0xD59 ADD MSTORE PUSH2 0xE84 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x55 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xA7D JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0xA0E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x882 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7FF JUMPI DUP1 PUSH4 0x3AD554D0 EQ PUSH2 0x7A6 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x75B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x5D3 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0x94FC4425 EQ PUSH2 0x3BE JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xDB9B206A EQ PUSH2 0x1D0 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0xE2 PUSH2 0xB06 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x10B PUSH2 0xD42 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x151 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x233 PUSH2 0x20A PUSH2 0xAE3 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xC37 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x26F PUSH2 0xAE3 JUMP JUMPDEST PUSH2 0x277 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x329 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x3F5 PUSH2 0xB06 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x1CB JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x4F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE DUP4 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4BC JUMPI JUMPDEST POP ISZERO PUSH2 0x489 JUMPI STOP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4DE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI JUMPDEST PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD2A JUMP JUMPDEST DUP5 PUSH2 0x481 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4CC JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x572 PUSH2 0xAE3 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x6C0 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH2 0x6CC DUP4 DUP4 DUP4 PUSH2 0xC37 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x3B9 DUP3 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH2 0x79C PUSH2 0x797 PUSH2 0xB06 JUMP JUMPDEST PUSH2 0xB29 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7465737465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH2 0x838 PUSH2 0xE6D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8BC PUSH2 0xAE3 JUMP JUMPDEST PUSH2 0x8C4 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x977 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x3B9 JUMP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1CB JUMPI PUSH2 0x79C PUSH1 0x20 SWAP2 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1CB JUMPI JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1CB JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xB81 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xC31 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xC2B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xC72 JUMPI POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xCFB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1CB JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1CB JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE5E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE63 JUMPI JUMPDEST PUSH2 0xE5E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xDCD JUMPI JUMPDEST POP PUSH2 0xDCA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE3F JUMPI JUMPDEST POP CODESIZE PUSH2 0xDC0 JUMP JUMPDEST PUSH2 0xE58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST CODESIZE PUSH2 0xE38 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFA1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFA9 JUMPI JUMPDEST PUSH2 0xFA1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI JUMPDEST POP PUSH2 0xECF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1CB JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF82 JUMPI JUMPDEST POP CODESIZE PUSH2 0xEC3 JUMP JUMPDEST PUSH2 0xF9B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST CODESIZE PUSH2 0xF7B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEB4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MOD 0xB1 0xFC 0x4B JUMPDEST 0xDA 0xB4 0xF7 NOT DUP15 DUP1 PUSH23 0x73FCA31034E21BB09C8E0C451AA4B594E6BB3D9764736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"619:1244:81:-:0;;;;;;;;;;;;;-1:-1:-1;;619:1244:81;;;;-1:-1:-1;;;;;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;619:1244:81;;;;;;879:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;619:1244:81;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;619:1244:81;;;;;;;;745:39:76;619:1244:81;;;;;;;;;;;;;;;;;;;;;1645:152:42;619:1244:81;;;-1:-1:-1;;;;;;619:1244:81;879:10;619:1244;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;619:1244:81;-1:-1:-1;619:1244:81;;;;;;-1:-1:-1;619:1244:81;;;;;-1:-1:-1;619:1244:81"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2787,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":3370,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":2822,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":3258,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":3127,"id":8814,"parameterSlots":3,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":2857,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":3693,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3394,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":2952,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2649},{"length":32,"start":2880},{"length":32,"start":3417},{"length":32,"start":3716}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610a7d5780632b4c9f1614610a0e5780632f2ff15d1461088257806331e66e1e146107ff5780633ad554d0146107a6578063572b6c051461075b5780638bb9c5bf146106445780638da5cb5b146105d357806391d148541461053b57806394fc4425146103be578063d547741f14610235578063db9b206a146101d05763f2fde38b146100ab57600080fd5b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576100e2610b06565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61010b610d42565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361019e575073ffffffffffffffffffffffffffffffffffffffff169283830361015157005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5761023361020a610ae3565b6004357fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610c37565b005b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5760043561026f610ae3565b610277610d42565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361019e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661032957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101cb5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576103f5610b06565b6024356044359173ffffffffffffffffffffffffffffffffffffffff83168093036101cb57803b156104f75773ffffffffffffffffffffffffffffffffffffffff166040517f91d14854000000000000000000000000000000000000000000000000000000008152826004820152836024820152602081604481855afa9081156104eb576000916104bc575b501561048957005b7f7a436c160000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6104de915060203d6020116104e4575b6104d68183610cba565b810190610d2a565b84610481565b503d6104cc565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57610572610ae3565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb577ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356106c0610d42565b916106cc838383610c37565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556103b9826040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602061079c610797610b06565b610b29565b6040519015158152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb5760206040517f74657374657200000000000000000000000000000000000000000000000000008152f35b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576040610838610e6d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101cb5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576004356108bc610ae3565b6108c4610d42565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361019e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561097757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016103b9565b346101cb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101cb5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cb576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101cb5761079c602091610b88565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101cb57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101cb57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610b815773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610c31577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610c2b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610c72575050565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cfb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101cb575180151581036101cb5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e5e573233148015610e63575b610e5e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610dcd575b50610dca57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156104eb57600091610e3f575b5038610dc0565b610e58915060203d6020116104e4576104d68183610cba565b38610e38565b503390565b5060183610610d89565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610fa1573233148015610fa9575b610fa157803314908115610f00575b50610ecf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101cb5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156104eb57600091610f82575b5038610ec3565b610f9b915060203d6020116104e4576104d68183610cba565b38610f7b565b506000903690565b5060183610610eb456fea264697066735822122006b1fc4b5bdab4f7198e807673fca31034e21bb09c8e0c451aa4b594e6bb3d9764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xA7D JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0xA0E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x882 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7FF JUMPI DUP1 PUSH4 0x3AD554D0 EQ PUSH2 0x7A6 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x75B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x5D3 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0x94FC4425 EQ PUSH2 0x3BE JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xDB9B206A EQ PUSH2 0x1D0 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0xE2 PUSH2 0xB06 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x10B PUSH2 0xD42 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x151 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x233 PUSH2 0x20A PUSH2 0xAE3 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xC37 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x26F PUSH2 0xAE3 JUMP JUMPDEST PUSH2 0x277 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x329 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x3F5 PUSH2 0xB06 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x1CB JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x4F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE DUP4 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4BC JUMPI JUMPDEST POP ISZERO PUSH2 0x489 JUMPI STOP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4DE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI JUMPDEST PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD2A JUMP JUMPDEST DUP5 PUSH2 0x481 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4CC JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH2 0x572 PUSH2 0xAE3 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x6C0 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH2 0x6CC DUP4 DUP4 DUP4 PUSH2 0xC37 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x3B9 DUP3 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH2 0x79C PUSH2 0x797 PUSH2 0xB06 JUMP JUMPDEST PUSH2 0xB29 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7465737465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH2 0x838 PUSH2 0xE6D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8BC PUSH2 0xAE3 JUMP JUMPDEST PUSH2 0x8C4 PUSH2 0xD42 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x19E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x977 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x3B9 JUMP JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1CB JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1CB JUMPI PUSH2 0x79C PUSH1 0x20 SWAP2 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1CB JUMPI JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1CB JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xB81 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xC31 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xC2B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xC72 JUMPI POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xCFB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1CB JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1CB JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE5E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE63 JUMPI JUMPDEST PUSH2 0xE5E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xDCD JUMPI JUMPDEST POP PUSH2 0xDCA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE3F JUMPI JUMPDEST POP CODESIZE PUSH2 0xDC0 JUMP JUMPDEST PUSH2 0xE58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST CODESIZE PUSH2 0xE38 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFA1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFA9 JUMPI JUMPDEST PUSH2 0xFA1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI JUMPDEST POP PUSH2 0xECF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1CB JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF82 JUMPI JUMPDEST POP CODESIZE PUSH2 0xEC3 JUMP JUMPDEST PUSH2 0xF9B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E4 JUMPI PUSH2 0x4D6 DUP2 DUP4 PUSH2 0xCBA JUMP JUMPDEST CODESIZE PUSH2 0xF7B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEB4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MOD 0xB1 0xFC 0x4B JUMPDEST 0xDA 0xB4 0xF7 NOT DUP15 DUP1 PUSH23 0x73FCA31034E21BB09C8E0C451AA4B594E6BB3D9764736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"619:1244:81:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1580:41;;:::i;:::-;619:1244;;;;;;;;;;3205:23:42;;;3201:60;;619:1244:81;;;3275:25:42;;;;3271:146;;619:1244:81;3271:146:42;619:1244:81;;;;;;3361:45:42;619:1244:81;;3361:45:42;619:1244:81;3201:60:42;3237:24;619:1244:81;3237:24:42;619:1244:81;;;;3237:24:42;619:1244:81;;;;;;;;;;;;;;;1073:7;619:1244;;:::i;:::-;;;;1073:7;:::i;:::-;619:1244;;;;;;;;;;;;;;;;:::i;:::-;1580:41;;:::i;:::-;5148:19:42;619:1244:81;;;;;;;4503:26:42;;;4499:64;;4464:19:41;619:1244:81;;;;;;;;;;;;;-1:-1:-1;619:1244:81;;;500:10:59;619:1244:81;-1:-1:-1;619:1244:81;500:10:59;;1880:140:41;;619:1244:81;1880:140:41;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;619:1244:81;;;;1973:36:41;;;;619:1244:81;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;376:58:354;;450:9;3284:78:41;;619:1244:81;;;;;3379:53:41;;;619:1244:81;3379:53:41;;619:1244:81;;;;;;;3379:53:41;619:1244:81;3379:53:41;;;;;;;;;619:1244:81;3379:53:41;;;619:1244:81;4243:53:41;;4239:124;;619:1244:81;4239:124:41;4305:58;619:1244:81;4305:58:41;619:1244:81;;;;;;;;4305:58:41;3379:53;;;;619:1244:81;3379:53:41;619:1244:81;3379:53:41;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;619:1244:81;;;;;;;;;3284:78:41;619:1244:81;3326:36:41;;619:1244:81;3326:36:41;619:1244:81;;;;;3326:36:41;619:1244:81;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;619:1244:81;-1:-1:-1;619:1244:81;;;;500:10:59;619:1244:81;-1:-1:-1;619:1244:81;500:10:59;;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;619:1244:81;;;1580:41;;:::i;:::-;2394:6:41;;;;;;:::i;:::-;619:1244:81;;;;;;;;;;;-1:-1:-1;619:1244:81;;;;-1:-1:-1;619:1244:81;;;;;;;2455:33:41;619:1244:81;;;2455:33:41;;;;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1815:39;;:::i;:::-;619:1244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1580:41;;:::i;:::-;5148:19:42;619:1244:81;;;;;;;4503:26:42;;;4499:64;;4464:19:41;619:1244:81;;;;;;;;;;;;;-1:-1:-1;619:1244:81;;;500:10:59;619:1244:81;-1:-1:-1;619:1244:81;500:10:59;;1254:25:41;1250:140;;619:1244:81;1250:140:41;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;619:1244:81;;;;1343:36:41;619:1244:81;;;;;;;;;;;;;;;;941:19:75;619:1244:81;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;619:1244:81;635:65:55;;:::i;619:1244:81:-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1002:301:75:-;619:1244:81;1146:19:75;619:1244:81;1146:53:75;;;1142:96;;619:1244:81;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;619:1244:81;1215:12:75;:::o;1359:340:59:-;619:1244:81;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;619:1244:81;500:10:59;619:1244:81;500:10:59;;;;619:1244:81;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;619:1244:81;1528:12:59;:::o;3640:170:41:-;619:1244:81;-1:-1:-1;619:1244:81;;;;-1:-1:-1;619:1244:81;;;;-1:-1:-1;619:1244:81;;;500:10:59;619:1244:81;-1:-1:-1;619:1244:81;500:10:59;;3741:25:41;3737:66;;3640:170;;:::o;3737:66::-;619:1244:81;3775:28:41;;;-1:-1:-1;3775:28:41;;619:1244:81;;;;;-1:-1:-1;3775:28:41;619:1244:81;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;619:1244:81;;;;;-1:-1:-1;619:1244:81;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;619:1244:81;1029:19:76;619:1244:81;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;619:1244:81;;;1676:74:76;;619:1244:81;;;1676:74:76;;;619:1244:81;1327:10:76;619:1244:81;;;;1744:4:76;619:1244:81;;;;;-1:-1:-1;1676:74:76;;619:1244:81;;;;;;1676:74:76;;;;;;;619:1244:81;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;619:1244:81;2065:19:76;619:1244:81;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;619:1244:81;720:8:80;619:1244:81;720:8:80;;619:1244:81;;;;2115:1:76;2802:32;;:::o;2624:153::-;619:1244:81;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;619:1244:81;2361:10:76;619:1244:81;;;;2771:4:76;619:1244:81;;;;;-1:-1:-1;2682:95:76;;619:1244:81;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"814600","executionCost":"infinite","totalCost":"infinite"},"external":{"TEST_ROLE()":"232","__msgData()":"infinite","enforceHasRole(bytes32,address)":"2740","enforceHasTargetContractRole(address,bytes32,address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2631","isTrustedForwarder(address)":"infinite","owner()":"2407","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"TEST_ROLE()":"3ad554d0","__msgData()":"31e66e1e","enforceHasRole(bytes32,address)":"db9b206a","enforceHasTargetContractRole(address,bytes32,address)":"94fc4425","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"TEST_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceHasRole\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceHasTargetContractRole\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role on a target contract.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/AccessControlMock.sol\":\"AccessControlMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/AccessControlMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract AccessControlMock is AccessControl, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant TEST_ROLE = \\\"tester\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceHasRole(bytes32 role, address account) external view {\\n        AccessControlStorage.layout().enforceHasRole(role, account);\\n    }\\n\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) external view {\\n        AccessControlStorage.enforceHasTargetContractRole(targetContract, role, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x13629fa38ad6ee0db833d73c894e02057a00ec93e9c4e482595ca448af774757\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"notice":"Thrown when an account does not have the required role on a target contract."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/access/ContractOwnershipMock.sol":{"ContractOwnershipMock":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsTargetContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461015657601f610bcc38819003918201601f19168301916001600160401b0383118484101761015b5780849260409485528339810103126101565780516001600160a01b03811691908290036101565760200151906001600160a01b038216820361015657806100f9575b506307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610a5a9081610172823960805181818161056001528181610624015281816107ba01526109100152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319168217905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a33861006d565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146105845780632b4c9f161461051557806331e66e1e14610492578063572b6c05146104475780637e7d9f83146102855780638da5cb5b1461021457806397883ae2146101995763f2fde38b1461007457600080fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576100ab6105ea565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100d46108f9565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610167575073ffffffffffffffffffffffffffffffffffffffff169283830361011a57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576101d06105ea565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361016757005b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019457602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101945760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576102bc6105ea565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361019457803b156104035773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156103f7578391600091610388575b5073ffffffffffffffffffffffffffffffffffffffff160361035857005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d6020116103ef575b816103a46020938361071b565b810103126103eb57519073ffffffffffffffffffffffffffffffffffffffff821682036103e85750829073ffffffffffffffffffffffffffffffffffffffff61033a565b80fd5b5080fd5b3d9150610397565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101945760206104886104836105ea565b61060d565b6040519015158152f35b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101945760406104cb6107a3565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101945761048860209161066c565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019457565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156106655773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610715577f01ffc9a700000000000000000000000000000000000000000000000000000000811461070f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761075c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610194575180151581036101945790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108e75732331480156108ef575b6108e757803314908115610836575b50610805576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101945760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103f7576000916108b8575b50386107f9565b6108da915060203d6020116108e0575b6108d2818361071b565b81019061078b565b386108b1565b503d6108c8565b506000903690565b50601836106107ea565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a15573233148015610a1a575b610a15577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610984575b5061098157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103f7576000916109f6575b5038610977565b610a0f915060203d6020116108e0576108d2818361071b565b386109ef565b503390565b506018361061094056fea26469706673582212206e20595977c3aac938af28a0c11887077b954087331ac615624d9338c205707e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x156 JUMPI PUSH1 0x1F PUSH2 0xBCC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x15B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x156 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP2 SWAP1 DUP3 SWAP1 SUB PUSH2 0x156 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x156 JUMPI DUP1 PUSH2 0xF9 JUMPI JUMPDEST POP PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xA5A SWAP1 DUP2 PUSH2 0x172 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x560 ADD MSTORE DUP2 DUP2 PUSH2 0x624 ADD MSTORE DUP2 DUP2 PUSH2 0x7BA ADD MSTORE PUSH2 0x910 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP3 OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 CODESIZE PUSH2 0x6D JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x584 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x447 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x285 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x199 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0xAB PUSH2 0x5EA JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xD4 PUSH2 0x8F9 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x167 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x11A JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0x1D0 PUSH2 0x5EA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x167 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0x2BC PUSH2 0x5EA JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x194 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x403 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x3F7 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x388 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x358 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3EF JUMPI JUMPDEST DUP2 PUSH2 0x3A4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x71B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3EB JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3E8 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x33A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x397 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH2 0x488 PUSH2 0x483 PUSH2 0x5EA JUMP JUMPDEST PUSH2 0x60D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x40 PUSH2 0x4CB PUSH2 0x7A3 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x194 JUMPI PUSH2 0x488 PUSH1 0x20 SWAP2 PUSH2 0x66C JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x194 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x665 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x715 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x70F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x75C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x194 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x194 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8E7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8EF JUMPI JUMPDEST PUSH2 0x8E7 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x836 JUMPI JUMPDEST POP PUSH2 0x805 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x194 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8B8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7F9 JUMP JUMPDEST PUSH2 0x8DA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8E0 JUMPI JUMPDEST PUSH2 0x8D2 DUP2 DUP4 PUSH2 0x71B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x78B JUMP JUMPDEST CODESIZE PUSH2 0x8B1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x8C8 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7EA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA15 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA1A JUMPI JUMPDEST PUSH2 0xA15 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x984 JUMPI JUMPDEST POP PUSH2 0x981 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9F6 JUMPI JUMPDEST POP CODESIZE PUSH2 0x977 JUMP JUMPDEST PUSH2 0xA0F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8E0 JUMPI PUSH2 0x8D2 DUP2 DUP4 PUSH2 0x71B JUMP JUMPDEST CODESIZE PUSH2 0x9EF JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x940 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH15 0x20595977C3AAC938AF28A0C1188707 PUSH28 0x954087331AC615624D9338C205707E64736F6C634300081E00330000 ","sourceMap":"563:1239:82:-:0;;;;;;;;;;;;;-1:-1:-1;;563:1239:82;;;;-1:-1:-1;;;;;563:1239:82;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;563:1239:82;;;;;;;;;;;;;-1:-1:-1;;;;;563:1239:82;;;;;;1649:26:42;1645:152;;-1:-1:-1;;;;;;500:10:59;563:1239:82;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;563:1239:82;;;;;;;;745:39:76;563:1239:82;;;;;;;;;;;;;;;;;;;;;1645:152:42;563:1239:82;;;-1:-1:-1;;;;;;563:1239:82;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;;563:1239:82;-1:-1:-1;563:1239:82;;;;;;-1:-1:-1;563:1239:82;;;;;-1:-1:-1;563:1239:82"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1514,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":1931,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1819,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":1549,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":1955,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2297,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":1644,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1376},{"length":32,"start":1572},{"length":32,"start":1978},{"length":32,"start":2320}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146105845780632b4c9f161461051557806331e66e1e14610492578063572b6c05146104475780637e7d9f83146102855780638da5cb5b1461021457806397883ae2146101995763f2fde38b1461007457600080fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576100ab6105ea565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100d46108f9565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610167575073ffffffffffffffffffffffffffffffffffffffff169283830361011a57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576101d06105ea565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361016757005b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019457602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101945760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576102bc6105ea565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361019457803b156104035773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156103f7578391600091610388575b5073ffffffffffffffffffffffffffffffffffffffff160361035857005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d6020116103ef575b816103a46020938361071b565b810103126103eb57519073ffffffffffffffffffffffffffffffffffffffff821682036103e85750829073ffffffffffffffffffffffffffffffffffffffff61033a565b80fd5b5080fd5b3d9150610397565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101945760206104886104836105ea565b61060d565b6040519015158152f35b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101945760406104cb6107a3565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101945760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101945760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610194576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101945761048860209161066c565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019457565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156106655773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610715577f01ffc9a700000000000000000000000000000000000000000000000000000000811461070f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761075c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610194575180151581036101945790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108e75732331480156108ef575b6108e757803314908115610836575b50610805576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101945760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103f7576000916108b8575b50386107f9565b6108da915060203d6020116108e0575b6108d2818361071b565b81019061078b565b386108b1565b503d6108c8565b506000903690565b50601836106107ea565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a15573233148015610a1a575b610a15577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610984575b5061098157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103f7576000916109f6575b5038610977565b610a0f915060203d6020116108e0576108d2818361071b565b386109ef565b503390565b506018361061094056fea26469706673582212206e20595977c3aac938af28a0c11887077b954087331ac615624d9338c205707e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x584 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x447 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x285 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x199 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0xAB PUSH2 0x5EA JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xD4 PUSH2 0x8F9 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x167 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x11A JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0x1D0 PUSH2 0x5EA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x167 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH2 0x2BC PUSH2 0x5EA JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x194 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x403 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x3F7 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x388 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x358 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3EF JUMPI JUMPDEST DUP2 PUSH2 0x3A4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x71B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3EB JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3E8 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x33A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x397 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH2 0x488 PUSH2 0x483 PUSH2 0x5EA JUMP JUMPDEST PUSH2 0x60D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x40 PUSH2 0x4CB PUSH2 0x7A3 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x194 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x194 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x194 JUMPI PUSH2 0x488 PUSH1 0x20 SWAP2 PUSH2 0x66C JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x194 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x665 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x715 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x70F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x75C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x194 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x194 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8E7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8EF JUMPI JUMPDEST PUSH2 0x8E7 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x836 JUMPI JUMPDEST POP PUSH2 0x805 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x194 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8B8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7F9 JUMP JUMPDEST PUSH2 0x8DA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8E0 JUMPI JUMPDEST PUSH2 0x8D2 DUP2 DUP4 PUSH2 0x71B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x78B JUMP JUMPDEST CODESIZE PUSH2 0x8B1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x8C8 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7EA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA15 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA1A JUMPI JUMPDEST PUSH2 0xA15 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x984 JUMPI JUMPDEST POP PUSH2 0x981 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9F6 JUMPI JUMPDEST POP CODESIZE PUSH2 0x977 JUMP JUMPDEST PUSH2 0xA0F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8E0 JUMPI PUSH2 0x8D2 DUP2 DUP4 PUSH2 0x71B JUMP JUMPDEST CODESIZE PUSH2 0x9EF JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x940 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH15 0x20595977C3AAC938AF28A0C1188707 PUSH28 0x954087331AC615624D9338C205707E64736F6C634300081E00330000 ","sourceMap":"563:1239:82:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1519:41;;:::i;:::-;563:1239;;;;;;;;;;3205:23:42;;;3201:60;;563:1239:82;;;3275:25:42;;;;3271:146;;563:1239:82;3271:146:42;563:1239:82;;;;;;3361:45:42;563:1239:82;;3361:45:42;563:1239:82;3201:60:42;3237:24;563:1239:82;3237:24:42;563:1239:82;;;;3237:24:42;563:1239:82;;;;;;;;;;;;;;;;;:::i;:::-;;912:80:42;563:1239:82;;;;;4503:26:42;;;4499:64;;563:1239:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;376:58:354;;450:9;4074:78:42;;563:1239:82;;;;;4169:31:42;;563:1239:82;4169:31:42;563:1239:82;4169:31:42;;;;;;;;;;563:1239:82;4169:31:42;;;563:1239:82;;;;4169:42:42;4940:107;;563:1239:82;4940:107:42;5000:47;563:1239:82;5000:47:42;563:1239:82;;;;;;5000:47:42;4169:31;;;;563:1239:82;4169:31:42;;563:1239:82;4169:31:42;;;;;;563:1239:82;4169:31:42;;;:::i;:::-;;;563:1239:82;;;;;;;;;;;;;-1:-1:-1;4169:31:42;;563:1239:82;4169:31:42;;563:1239:82;;;;;;;4169:31:42;;;-1:-1:-1;4169:31:42;;;563:1239:82;;;;;;;;;4074:78:42;563:1239:82;4116:36:42;;563:1239:82;4116:36:42;563:1239:82;;;;;4116:36:42;563:1239:82;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1754:39;;:::i;:::-;563:1239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;563:1239:82;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;563:1239:82;635:65:55;;:::i;563:1239:82:-;;;;;;;;;;;:::o;1002:301:75:-;563:1239:82;1146:19:75;563:1239:82;1146:53:75;;;1142:96;;563:1239:82;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;563:1239:82;1215:12:75;:::o;1359:340:59:-;563:1239:82;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;563:1239:82;500:10:59;563:1239:82;500:10:59;;;;563:1239:82;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;563:1239:82;1528:12:59;:::o;563:1239:82:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;563:1239:82;;;;;-1:-1:-1;563:1239:82;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;563:1239:82;2065:19:76;563:1239:82;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;563:1239:82;720:8:80;563:1239:82;720:8:80;;563:1239:82;;;;2115:1:76;2802:32;;:::o;2624:153::-;563:1239:82;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;563:1239:82;2361:10:76;563:1239:82;;;;2771:4:76;563:1239:82;;;;;-1:-1:-1;2682:95:76;;563:1239:82;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;563:1239:82;1029:19:76;563:1239:82;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;563:1239:82;;;1676:74:76;;563:1239:82;;;1676:74:76;;;563:1239:82;1327:10:76;563:1239:82;;;;1744:4:76;563:1239:82;;;;;-1:-1:-1;1676:74:76;;563:1239:82;;;;;;1676:74:76;;;;;;;563:1239:82;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"530000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","enforceIsContractOwner(address)":"2475","enforceIsTargetContractOwner(address,address)":"infinite","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2363","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","enforceIsContractOwner(address)":"97883ae2","enforceIsTargetContractOwner(address,address)":"7e7d9f83","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsTargetContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/ContractOwnershipMock.sol\":\"ContractOwnershipMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/ContractOwnershipMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ContractOwnershipMock is ContractOwnership, ForwarderRegistryContext {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(\\n        address initialOwner,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(initialOwner) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceIsContractOwner(address account) external view {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(account);\\n    }\\n\\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\\n        ContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8568795f7daa6d64a15c5b5c1281f7ae88bef8cbed12692f7ce6f3c5ded302e4\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/access/SafeContractOwnershipMock.sol":{"SafeContractOwnershipMock":{"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotPendingContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferPending","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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsTargetContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotPendingContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"OwnershipTransferPending(address)":{"params":{"pendingOwner":"the address of the new contract owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pendingOwner()":{"returns":{"_0":"The address of the pending contract owner."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461015657601f610ecb38819003918201601f19168301916001600160401b0383118484101761015b5780849260409485528339810103126101565780516001600160a01b03811691908290036101565760200151906001600160a01b038216820361015657806100f9575b506307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610d599081610172823960805181818161085f0152818161092301528181610ab90152610c0f0152f35b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b80546001600160a01b0319168217905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a33861006d565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146108835780632b4c9f161461081457806331e66e1e14610791578063572b6c051461074657806379ba5097146105ab5780637e7d9f83146103e95780638da5cb5b1461037857806397883ae2146102fd578063e30c39781461028c5763f2fde38b1461008a57600080fd5b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576100c16108e9565b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b906100eb610bf8565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361025a575073ffffffffffffffffffffffffffffffffffffffff1691826101e157600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101ea57005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576103346108e9565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416911690810361025a57005b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102875760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576104206108e9565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361028757803b156105675773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa801561055b5783916000916104ec575b5073ffffffffffffffffffffffffffffffffffffffff16036104bc57005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d602011610553575b8161050860209383610a1a565b8101031261054f57519073ffffffffffffffffffffffffffffffffffffffff8216820361054c5750829073ffffffffffffffffffffffffffffffffffffffff61049e565b80fd5b5080fd5b3d91506104fb565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b610603610bf8565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416911681810361071957508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102875760206107876107826108e9565b61090c565b6040519015158152f35b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102875760406107ca610aa2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102875761078760209161096b565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361028757565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156109645773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610a14577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610a0e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a5b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610287575180151581036102875790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610be6573233148015610bee575b610be657803314908115610b35575b50610b04576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102875760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561055b57600091610bb7575b5038610af8565b610bd9915060203d602011610bdf575b610bd18183610a1a565b810190610a8a565b38610bb0565b503d610bc7565b506000903690565b5060183610610ae9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d14573233148015610d19575b610d14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c83575b50610c8057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561055b57600091610cf5575b5038610c76565b610d0e915060203d602011610bdf57610bd18183610a1a565b38610cee565b503390565b5060183610610c3f56fea264697066735822122081a9e8837b83f71925afa313966c3adff801897f794e60d05e04a3bc4cee2c2f64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x156 JUMPI PUSH1 0x1F PUSH2 0xECB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x15B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x156 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP2 SWAP1 DUP3 SWAP1 SUB PUSH2 0x156 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x156 JUMPI DUP1 PUSH2 0xF9 JUMPI JUMPDEST POP PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD59 SWAP1 DUP2 PUSH2 0x172 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x85F ADD MSTORE DUP2 DUP2 PUSH2 0x923 ADD MSTORE DUP2 DUP2 PUSH2 0xAB9 ADD MSTORE PUSH2 0xC0F ADD MSTORE RETURN JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP3 OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 CODESIZE PUSH2 0x6D JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x883 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x791 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x746 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x28C JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0xC1 PUSH2 0x8E9 JUMP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH2 0xEB PUSH2 0xBF8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x25A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 PUSH2 0x1E1 JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1EA JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0x334 PUSH2 0x8E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x25A JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0x420 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x287 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x567 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x55B JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x4EC JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x4BC JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x553 JUMPI JUMPDEST DUP2 PUSH2 0x508 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xA1A JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x54F JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x54C JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x49E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4FB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x603 PUSH2 0xBF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x719 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH2 0x787 PUSH2 0x782 PUSH2 0x8E9 JUMP JUMPDEST PUSH2 0x90C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x40 PUSH2 0x7CA PUSH2 0xAA2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x287 JUMPI PUSH2 0x787 PUSH1 0x20 SWAP2 PUSH2 0x96B JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x287 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x964 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xA14 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xA0E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xA5B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x287 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x287 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBE6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBEE JUMPI JUMPDEST PUSH2 0xBE6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB35 JUMPI JUMPDEST POP PUSH2 0xB04 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x287 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x55B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBB7 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAF8 JUMP JUMPDEST PUSH2 0xBD9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBDF JUMPI JUMPDEST PUSH2 0xBD1 DUP2 DUP4 PUSH2 0xA1A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA8A JUMP JUMPDEST CODESIZE PUSH2 0xBB0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBC7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAE9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD14 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD19 JUMPI JUMPDEST PUSH2 0xD14 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC83 JUMPI JUMPDEST POP PUSH2 0xC80 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x55B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCF5 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC76 JUMP JUMPDEST PUSH2 0xD0E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBDF JUMPI PUSH2 0xBD1 DUP2 DUP4 PUSH2 0xA1A JUMP JUMPDEST CODESIZE PUSH2 0xCEE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC3F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 0xA9 0xE8 DUP4 PUSH28 0x83F71925AFA313966C3ADFF801897F794E60D05E04A3BC4CEE2C2F64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"579:1267:83:-:0;;;;;;;;;;;;;-1:-1:-1;;579:1267:83;;;;-1:-1:-1;;;;;579:1267:83;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;579:1267:83;;;;;;;;;;;;;-1:-1:-1;;;;;579:1267:83;;;;;;1758:26:43;1754:152;;-1:-1:-1;;;;;;500:10:59;579:1267:83;;500:10:59;;;;-1:-1:-1;;500:10:59;1095:1:43;500:10:59;;;745:39:76;;579:1267:83;;;;;;;;745:39:76;579:1267:83;;;;;;;;;;;;;;;;;;;;;1754:152:43;579:1267:83;;;-1:-1:-1;;;;;;579:1267:83;;;;;-1:-1:-1;1849:46:43;-1:-1:-1;;1849:46:43;1754:152;;;579:1267:83;-1:-1:-1;579:1267:83;;;;;;-1:-1:-1;579:1267:83;;;;;-1:-1:-1;579:1267:83"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2281,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2698,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2586,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":2316,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":2722,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3064,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":2411,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2143},{"length":32,"start":2339},{"length":32,"start":2745},{"length":32,"start":3087}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146108835780632b4c9f161461081457806331e66e1e14610791578063572b6c051461074657806379ba5097146105ab5780637e7d9f83146103e95780638da5cb5b1461037857806397883ae2146102fd578063e30c39781461028c5763f2fde38b1461008a57600080fd5b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576100c16108e9565b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b906100eb610bf8565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361025a575073ffffffffffffffffffffffffffffffffffffffff1691826101e157600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101ea57005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576103346108e9565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416911690810361025a57005b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102875760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576104206108e9565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361028757803b156105675773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa801561055b5783916000916104ec575b5073ffffffffffffffffffffffffffffffffffffffff16036104bc57005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d602011610553575b8161050860209383610a1a565b8101031261054f57519073ffffffffffffffffffffffffffffffffffffffff8216820361054c5750829073ffffffffffffffffffffffffffffffffffffffff61049e565b80fd5b5080fd5b3d91506104fb565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b610603610bf8565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416911681810361071957508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102875760206107876107826108e9565b61090c565b6040519015158152f35b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102875760406107ca610aa2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102875760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610287576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102875761078760209161096b565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361028757565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156109645773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610a14577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610a0e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a5b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610287575180151581036102875790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610be6573233148015610bee575b610be657803314908115610b35575b50610b04576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102875760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561055b57600091610bb7575b5038610af8565b610bd9915060203d602011610bdf575b610bd18183610a1a565b810190610a8a565b38610bb0565b503d610bc7565b506000903690565b5060183610610ae9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d14573233148015610d19575b610d14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c83575b50610c8057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561055b57600091610cf5575b5038610c76565b610d0e915060203d602011610bdf57610bd18183610a1a565b38610cee565b503390565b5060183610610c3f56fea264697066735822122081a9e8837b83f71925afa313966c3adff801897f794e60d05e04a3bc4cee2c2f64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x883 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x791 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x746 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x28C JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0xC1 PUSH2 0x8E9 JUMP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH2 0xEB PUSH2 0xBF8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x25A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 PUSH2 0x1E1 JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1EA JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0x334 PUSH2 0x8E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x25A JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH2 0x420 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x287 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x567 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x55B JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x4EC JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x4BC JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x553 JUMPI JUMPDEST DUP2 PUSH2 0x508 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xA1A JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x54F JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x54C JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x49E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4FB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x603 PUSH2 0xBF8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x719 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH2 0x787 PUSH2 0x782 PUSH2 0x8E9 JUMP JUMPDEST PUSH2 0x90C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x40 PUSH2 0x7CA PUSH2 0xAA2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x287 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x287 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x287 JUMPI PUSH2 0x787 PUSH1 0x20 SWAP2 PUSH2 0x96B JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x287 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x964 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xA14 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xA0E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xA5B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x287 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x287 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBE6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBEE JUMPI JUMPDEST PUSH2 0xBE6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB35 JUMPI JUMPDEST POP PUSH2 0xB04 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x287 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x55B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBB7 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAF8 JUMP JUMPDEST PUSH2 0xBD9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBDF JUMPI JUMPDEST PUSH2 0xBD1 DUP2 DUP4 PUSH2 0xA1A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA8A JUMP JUMPDEST CODESIZE PUSH2 0xBB0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBC7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAE9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD14 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD19 JUMPI JUMPDEST PUSH2 0xD14 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC83 JUMPI JUMPDEST POP PUSH2 0xC80 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x55B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCF5 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC76 JUMP JUMPDEST PUSH2 0xD0E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBDF JUMPI PUSH2 0xBD1 DUP2 DUP4 PUSH2 0xA1A JUMP JUMPDEST CODESIZE PUSH2 0xCEE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC3F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 0xA9 0xE8 DUP4 PUSH28 0x83F71925AFA313966C3ADFF801897F794E60D05E04A3BC4CEE2C2F64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"579:1267:83:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1563:41;;;:::i;:::-;579:1267;;;;;;;;3421:22:43;;;3417:59;;-1:-1:-1;579:1267:83;;;3490:22:43;;;579:1267:83;;;;;;;;;;3570:22:43;579:1267:83;;3570:22:43;579:1267:83;3624:46:43;;;;579:1267:83;3486:378:43;3705:24;;;3701:153;;579:1267:83;3701:153:43;3749:22;579:1267:83;;;;;;;;3805:34:43;579:1267:83;3805:34:43;;3701:153;3417:59;3452:24;579:1267:83;3452:24:43;579:1267:83;;;;3452:24:43;579:1267:83;;;;;;;;;;;;;;;;;4996:22:43;579:1267:83;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1013:84:43;579:1267:83;;;;;5860:26:43;;;5856:64;;579:1267:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;376:58:354;;450:9;5431:78:43;;579:1267:83;;;;;5526:31:43;;579:1267:83;5526:31:43;579:1267:83;5526:31:43;;;;;;;;;;579:1267:83;5526:31:43;;;579:1267:83;;;;5526:42:43;6297:107;;579:1267:83;6297:107:43;6357:47;579:1267:83;6357:47:43;579:1267:83;;;;;;6357:47:43;5526:31;;;;579:1267:83;5526:31:43;;579:1267:83;5526:31:43;;;;;;579:1267:83;5526:31:43;;;:::i;:::-;;;579:1267:83;;;;;;;;;;;;;-1:-1:-1;5526:31:43;;579:1267:83;5526:31:43;;579:1267:83;;;;;;;5526:31:43;;;-1:-1:-1;5526:31:43;;;579:1267:83;;;;;;;;;5431:78:43;579:1267:83;5473:36:43;;579:1267:83;5473:36:43;579:1267:83;;;;;5473:36:43;579:1267:83;;;;;;;;;;;;1563:41;;:::i;:::-;579:1267;;4211:22:43;579:1267:83;;;;4247:30:43;;;4243:74;;579:1267:83;;;;;;;;4332:59:43;579:1267:83;4332:59:43;;579:1267:83;;;;;;;;;4211:22:43;579:1267:83;;4211:22:43;579:1267:83;;;;4243:74:43;4286:31;579:1267:83;4286:31:43;579:1267:83;;;;4286:31:43;579:1267:83;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1798:39;;:::i;:::-;579:1267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;579:1267:83;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;579:1267:83;635:65:55;;:::i;579:1267:83:-;;;;;;;;;;;:::o;1002:301:75:-;579:1267:83;1146:19:75;579:1267:83;1146:53:75;;;1142:96;;579:1267:83;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;579:1267:83;1215:12:75;:::o;1359:340:59:-;579:1267:83;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;579:1267:83;500:10:59;579:1267:83;500:10:59;;;;579:1267:83;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;579:1267:83;1528:12:59;:::o;579:1267:83:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;579:1267:83;;;;;-1:-1:-1;579:1267:83;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;579:1267:83;2065:19:76;579:1267:83;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;579:1267:83;720:8:80;579:1267:83;720:8:80;;579:1267:83;;;;2115:1:76;2802:32;;:::o;2624:153::-;579:1267:83;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;579:1267:83;2361:10:76;579:1267:83;;;;2771:4:76;579:1267:83;;;;;-1:-1:-1;2682:95:76;;579:1267:83;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;579:1267:83;1029:19:76;579:1267:83;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;579:1267:83;;;1676:74:76;;579:1267:83;;;1676:74:76;;;579:1267:83;1327:10:76;579:1267:83;;;;1744:4:76;579:1267:83;;;;;-1:-1:-1;1676:74:76;;579:1267:83;;;;;;1676:74:76;;;;;;;579:1267:83;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"683400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","acceptOwnership()":"infinite","enforceIsContractOwner(address)":"2497","enforceIsTargetContractOwner(address,address)":"infinite","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2385","pendingOwner()":"2429","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","acceptOwnership()":"79ba5097","enforceIsContractOwner(address)":"97883ae2","enforceIsTargetContractOwner(address,address)":"7e7d9f83","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","pendingOwner()":"e30c3978","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotPendingContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferPending\",\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsTargetContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotPendingContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"OwnershipTransferPending(address)\":{\"params\":{\"pendingOwner\":\"the address of the new contract owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending contract owner.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPendingContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the pending contract owner but is required to.\"}],\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"OwnershipTransferPending(address)\":{\"notice\":\"Emitted when a new contract owner is pending.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/SafeContractOwnershipMock.sol\":\"SafeContractOwnershipMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/SafeContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {SafeContractOwnershipStorage} from \\\"./libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {SafeContractOwnershipBase} from \\\"./base/SafeContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract SafeContractOwnership is SafeContractOwnershipBase, InterfaceDetection {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        SafeContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xebdacc63051ce380bd81a09658aa64ce085557611de25c6cfbeec271b6c6a956\",\"license\":\"MIT\"},\"contracts/access/base/SafeContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173Safe} from \\\"./../interfaces/IERC173Safe.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173Safe\\n    function transferOwnership(address newOwner) public virtual {\\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function acceptOwnership() public virtual {\\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function owner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function pendingOwner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().pendingOwner();\\n    }\\n}\\n\",\"keccak256\":\"0xc2d602249dfe5707d43f9ede77361953d9239c06ef691cfe95a467f0018c4c44\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/SafeContractOwnershipMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../../access/libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {SafeContractOwnership} from \\\"./../../access/SafeContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract SafeContractOwnershipMock is SafeContractOwnership, ForwarderRegistryContext {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    constructor(\\n        address initialOwner,\\n        IForwarderRegistry forwarderRegistry\\n    ) SafeContractOwnership(initialOwner) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceIsContractOwner(address account) external view {\\n        SafeContractOwnershipStorage.layout().enforceIsContractOwner(account);\\n    }\\n\\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\\n        SafeContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x11301072a13e6caff13736a9bc6e4a3a7f2b5c060cc2adfd5e4225e900204476\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPendingContractOwner(address)":[{"notice":"Thrown when an account is not the pending contract owner but is required to."}],"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"OwnershipTransferPending(address)":{"notice":"Emitted when a new contract owner is pending."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/mocks/access/facets/AccessControlFacetMock.sol":{"AccessControlFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"TEST_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceHasRole","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceHasTargetContractRole","outputs":[],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610c7238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610be9908161008982396080518181816109590152610a840152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80632f2ff15d1461068857806331e66e1e146106055780633ad554d0146105ac5780638bb9c5bf1461049557806391d14854146103fd57806394fc442514610294578063d547741f146100de5763db9b206a1461007457600080fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9576100d76100ae610814565b6004357fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610837565b005b600080fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957600435610118610814565b610120610942565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361026757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166101d257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100d95760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760043573ffffffffffffffffffffffffffffffffffffffff81168082036100d957602435906044359273ffffffffffffffffffffffffffffffffffffffff84168094036100d9573b156103d0576040517f91d14854000000000000000000000000000000000000000000000000000000008152826004820152836024820152602081604481855afa9081156103c457600091610395575b501561036257005b7f7a436c160000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6103b7915060203d6020116103bd575b6103af81836108ba565b81019061092a565b8461035a565b503d6103a5565b6040513d6000823e3d90fd5b7f73a5b5e30000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957610434610814565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346100d95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9577ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610511610942565b9161051d838383610837565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055610262826040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760206040517f74657374657200000000000000000000000000000000000000000000000000008152f35b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957604061063e610a6d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9576004356106c2610814565b6106ca610942565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361026757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561077d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610262565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100d957565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610872575050565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108fb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100d9575180151581036100d95790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a5e573233148015610a63575b610a5e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156109cd575b506109ca57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103c457600091610a3f575b50386109c0565b610a58915060203d6020116103bd576103af81836108ba565b38610a38565b503390565b5060183610610989565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba1573233148015610ba9575b610ba157803314908115610b00575b50610acf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100d95760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103c457600091610b82575b5038610ac3565b610b9b915060203d6020116103bd576103af81836108ba565b38610b7b565b506000903690565b5060183610610ab456fea2646970667358221220dc5896de2c475d47be16146a83d9b786c1c8afdaafbea71bc7a57e9a7974fd9f64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xC72 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xBE9 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x959 ADD MSTORE PUSH2 0xA84 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x688 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x605 JUMPI DUP1 PUSH4 0x3AD554D0 EQ PUSH2 0x5AC JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x495 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x3FD JUMPI DUP1 PUSH4 0x94FC4425 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xDE JUMPI PUSH4 0xDB9B206A EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH2 0xD7 PUSH2 0xAE PUSH2 0x814 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x837 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x118 PUSH2 0x814 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x267 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0xD9 JUMPI PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xD9 JUMPI EXTCODESIZE ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE DUP4 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x395 JUMPI JUMPDEST POP ISZERO PUSH2 0x362 JUMPI STOP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3B7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI JUMPDEST PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x92A JUMP JUMPDEST DUP5 PUSH2 0x35A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3A5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH2 0x434 PUSH2 0x814 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x511 PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH2 0x51D DUP4 DUP4 DUP4 PUSH2 0x837 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x262 DUP3 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7465737465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH2 0x63E PUSH2 0xA6D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x6C2 PUSH2 0x814 JUMP JUMPDEST PUSH2 0x6CA PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x267 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x77D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x262 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xD9 JUMPI JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x872 JUMPI POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8FB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xD9 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xD9 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA5E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA63 JUMPI JUMPDEST PUSH2 0xA5E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x9CD JUMPI JUMPDEST POP PUSH2 0x9CA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA3F JUMPI JUMPDEST POP CODESIZE PUSH2 0x9C0 JUMP JUMPDEST PUSH2 0xA58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST CODESIZE PUSH2 0xA38 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x989 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBA9 JUMPI JUMPDEST PUSH2 0xBA1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB00 JUMPI JUMPDEST POP PUSH2 0xACF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xD9 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB82 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAC3 JUMP JUMPDEST PUSH2 0xB9B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST CODESIZE PUSH2 0xB7B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDC PC SWAP7 0xDE 0x2C SELFBALANCE TSTORE SELFBALANCE 0xBE AND EQ PUSH11 0x83D9B786C1C8AFDAAFBEA7 SHL 0xC7 0xA5 PUSH31 0x9A7974FD9F64736F6C634300081E0033000000000000000000000000000000 ","sourceMap":"321:729:84:-:0;;;;;;;;;;;;;-1:-1:-1;;321:729:84;;;;-1:-1:-1;;;;;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;321:729:84;;;;;;745:39:76;;321:729:84;;;;;;;;745:39:76;321:729:84;;;;;;;;;;;;-1:-1:-1;321:729:84;;;;;;-1:-1:-1;321:729:84;;;;;-1:-1:-1;321:729:84"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2068,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2346,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2234,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2103,"id":8814,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":2669,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2370,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2393},{"length":32,"start":2692}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80632f2ff15d1461068857806331e66e1e146106055780633ad554d0146105ac5780638bb9c5bf1461049557806391d14854146103fd57806394fc442514610294578063d547741f146100de5763db9b206a1461007457600080fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9576100d76100ae610814565b6004357fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610837565b005b600080fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957600435610118610814565b610120610942565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361026757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166101d257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100d95760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760043573ffffffffffffffffffffffffffffffffffffffff81168082036100d957602435906044359273ffffffffffffffffffffffffffffffffffffffff84168094036100d9573b156103d0576040517f91d14854000000000000000000000000000000000000000000000000000000008152826004820152836024820152602081604481855afa9081156103c457600091610395575b501561036257005b7f7a436c160000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6103b7915060203d6020116103bd575b6103af81836108ba565b81019061092a565b8461035a565b503d6103a5565b6040513d6000823e3d90fd5b7f73a5b5e30000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957610434610814565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346100d95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9577ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610511610942565b9161051d838383610837565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055610262826040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d95760206040517f74657374657200000000000000000000000000000000000000000000000000008152f35b346100d95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d957604061063e610a6d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100d95760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d9576004356106c2610814565b6106ca610942565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361026757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561077d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610262565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100d957565b81600052602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610872575050565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108fb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100d9575180151581036100d95790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a5e573233148015610a63575b610a5e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156109cd575b506109ca57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103c457600091610a3f575b50386109c0565b610a58915060203d6020116103bd576103af81836108ba565b38610a38565b503390565b5060183610610989565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba1573233148015610ba9575b610ba157803314908115610b00575b50610acf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100d95760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103c457600091610b82575b5038610ac3565b610b9b915060203d6020116103bd576103af81836108ba565b38610b7b565b506000903690565b5060183610610ab456fea2646970667358221220dc5896de2c475d47be16146a83d9b786c1c8afdaafbea71bc7a57e9a7974fd9f64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x688 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x605 JUMPI DUP1 PUSH4 0x3AD554D0 EQ PUSH2 0x5AC JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x495 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x3FD JUMPI DUP1 PUSH4 0x94FC4425 EQ PUSH2 0x294 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xDE JUMPI PUSH4 0xDB9B206A EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH2 0xD7 PUSH2 0xAE PUSH2 0x814 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x837 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x118 PUSH2 0x814 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x267 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0xD9 JUMPI PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xD9 JUMPI EXTCODESIZE ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 PUSH1 0x4 DUP3 ADD MSTORE DUP4 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x395 JUMPI JUMPDEST POP ISZERO PUSH2 0x362 JUMPI STOP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3B7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI JUMPDEST PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x92A JUMP JUMPDEST DUP5 PUSH2 0x35A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3A5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH2 0x434 PUSH2 0x814 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x511 PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH2 0x51D DUP4 DUP4 DUP4 PUSH2 0x837 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x262 DUP3 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7465737465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH2 0x63E PUSH2 0xA6D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xD9 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x6C2 PUSH2 0x814 JUMP JUMPDEST PUSH2 0x6CA PUSH2 0x942 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x267 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x77D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x262 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xD9 JUMPI JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x872 JUMPI POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8FB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xD9 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xD9 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA5E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA63 JUMPI JUMPDEST PUSH2 0xA5E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x9CD JUMPI JUMPDEST POP PUSH2 0x9CA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA3F JUMPI JUMPDEST POP CODESIZE PUSH2 0x9C0 JUMP JUMPDEST PUSH2 0xA58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST CODESIZE PUSH2 0xA38 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x989 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBA9 JUMPI JUMPDEST PUSH2 0xBA1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB00 JUMPI JUMPDEST POP PUSH2 0xACF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xD9 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB82 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAC3 JUMP JUMPDEST PUSH2 0xB9B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3BD JUMPI PUSH2 0x3AF DUP2 DUP4 PUSH2 0x8BA JUMP JUMPDEST CODESIZE PUSH2 0xB7B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDC PC SWAP7 0xDE 0x2C SELFBALANCE TSTORE SELFBALANCE 0xBE AND EQ PUSH11 0x83D9B786C1C8AFDAAFBEA7 SHL 0xC7 0xA5 PUSH31 0x9A7974FD9F64736F6C634300081E0033000000000000000000000000000000 ","sourceMap":"321:729:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;723:7;321:729;;:::i;:::-;;;;723:7;:::i;:::-;321:729;;;;;;;;;;;;;;;;;;;;:::i;:::-;998:41:35;;:::i;:::-;5148:19:42;321:729:84;;;;;;;4503:26:42;;;4499:64;;4464:19:41;321:729:84;;;;;;;;;;;;;-1:-1:-1;321:729:84;;;;;-1:-1:-1;321:729:84;;;1880:140:41;;321:729:84;1880:140:41;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;321:729:84;;;;1973:36:41;;;;321:729:84;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;321:729:84;;-1:-1:-1;4538:25:42;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;376:58:354;450:9;3284:78:41;;321:729:84;;;3379:53:41;;;321:729:84;3379:53:41;;321:729:84;;;;;;;3379:53:41;321:729:84;3379:53:41;;;;;;;;;321:729:84;3379:53:41;;;321:729:84;4243:53:41;;4239:124;;321:729:84;4239:124:41;4305:58;321:729:84;4305:58:41;321:729:84;;;;;;;;4305:58:41;3379:53;;;;321:729:84;3379:53:41;321:729:84;3379:53:41;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;321:729:84;;;;;;;;;3284:78:41;3326:36;321:729:84;3326:36:41;321:729:84;;;;3326:36:41;321:729:84;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;321:729:84;-1:-1:-1;321:729:84;;;;;;-1:-1:-1;321:729:84;;;;;;;;;;;;;;;;;;;;;;2455:33:41;321:729:84;;;998:41:35;;:::i;:::-;2394:6:41;;;;;;:::i;:::-;321:729:84;;;;;;;;;;;-1:-1:-1;321:729:84;;;;-1:-1:-1;321:729:84;;;;;;;2455:33:41;321:729:84;;;2455:33:41;;;;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1233:39:35;;:::i;:::-;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;998:41:35;;:::i;:::-;5148:19:42;321:729:84;;;;;;;4503:26:42;;;4499:64;;4464:19:41;321:729:84;;;;;;;;;;;;;-1:-1:-1;321:729:84;;;;;-1:-1:-1;321:729:84;;;1254:25:41;1250:140;;321:729:84;1250:140:41;321:729:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;321:729:84;;;;1343:36:41;321:729:84;;;;;;;;;;;;:::o;3640:170:41:-;321:729:84;-1:-1:-1;321:729:84;;;;-1:-1:-1;321:729:84;;;;-1:-1:-1;321:729:84;;;;;-1:-1:-1;321:729:84;;;3741:25:41;3737:66;;3640:170;;:::o;3737:66::-;321:729:84;3775:28:41;;;-1:-1:-1;3775:28:41;;321:729:84;;;;;-1:-1:-1;3775:28:41;321:729:84;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;321:729:84;;;;;-1:-1:-1;321:729:84;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;321:729:84;1029:19:76;321:729:84;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;321:729:84;;;1676:74:76;;321:729:84;;;1676:74:76;;;321:729:84;1327:10:76;321:729:84;;;;1744:4:76;321:729:84;;;;;-1:-1:-1;1676:74:76;;321:729:84;;;;;;1676:74:76;;;;;;;321:729:84;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;321:729:84;2065:19:76;321:729:84;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;321:729:84;720:8:80;321:729:84;720:8:80;;321:729:84;;;;2115:1:76;2802:32;;:::o;2624:153::-;321:729:84;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;321:729:84;2361:10:76;321:729:84;;;;2771:4:76;321:729:84;;;;;-1:-1:-1;2682:95:76;;321:729:84;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"609800","executionCost":"infinite","totalCost":"infinite"},"external":{"TEST_ROLE()":"188","__msgData()":"infinite","enforceHasRole(bytes32,address)":"2649","enforceHasTargetContractRole(address,bytes32,address)":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2543","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite"}},"methodIdentifiers":{"TEST_ROLE()":"3ad554d0","__msgData()":"31e66e1e","enforceHasRole(bytes32,address)":"db9b206a","enforceHasTargetContractRole(address,bytes32,address)":"94fc4425","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"TEST_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceHasRole\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceHasTargetContractRole\",\"outputs\":[],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role on a target contract.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/facets/AccessControlFacetMock.sol\":\"AccessControlFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/AccessControlFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlBase} from \\\"./../base/AccessControlBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Access control via roles management (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\\ncontract AccessControlFacet is AccessControlBase, ForwarderRegistryContextBase {\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x888a8befb9392bb10895bb71172cadb27beffc9c8585bc5ae7e132bb76570969\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/facets/AccessControlFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {AccessControlFacet} from \\\"./../../../access/facets/AccessControlFacet.sol\\\";\\n\\ncontract AccessControlFacetMock is AccessControlFacet {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant TEST_ROLE = \\\"tester\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) AccessControlFacet(forwarderRegistry) {}\\n\\n    function enforceHasRole(bytes32 role, address account) external view {\\n        AccessControlStorage.layout().enforceHasRole(role, account);\\n    }\\n\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) external view {\\n        AccessControlStorage.enforceHasTargetContractRole(targetContract, role, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x67ad936005d163b0f95c35a614aa1db4356eadc62ba6f77fb036bf5bc0fc8bdf\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"notice":"Thrown when an account does not have the required role on a target contract."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."}},"version":1}}},"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol":{"ContractOwnershipFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsTargetContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initContractOwnershipStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"initContractOwnershipStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"The initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610af938819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610a70908161008982396080518181816107d001526109260152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461068b57806363e340d6146104325780637e7d9f83146102705780638da5cb5b146101ff57806397883ae2146101845763f2fde38b1461005e57600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5761009561070e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906100bf61090f565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610152575073ffffffffffffffffffffffffffffffffffffffff169182820361010357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f576101bb61070e565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361015257005b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461017f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f576102a761070e565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361017f57803b156103ee5773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156103e2578391600091610373575b5073ffffffffffffffffffffffffffffffffffffffff160361034357005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d6020116103da575b8161038f60209383610731565b810103126103d657519073ffffffffffffffffffffffffffffffffffffffff821682036103d35750829073ffffffffffffffffffffffffffffffffffffffff610325565b80fd5b5080fd5b3d9150610382565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5761046961070e565b61047161090f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361065e57507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc907f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561062c575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816105d7575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610543565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760406106c46107b9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761077257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261017f5751801515810361017f5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108fd573233148015610905575b6108fd5780331490811561084c575b5061081b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161017f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103e2576000916108ce575b503861080f565b6108f0915060203d6020116108f6575b6108e88183610731565b8101906107a1565b386108c7565b503d6108de565b506000903690565b5060183610610800565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a2b573233148015610a30575b610a2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561099a575b5061099757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103e257600091610a0c575b503861098d565b610a25915060203d6020116108f6576108e88183610731565b38610a05565b503390565b506018361061095656fea26469706673582212209a1306cdd7de2ac0de62c9f870fc6c11190a114b9858d3a3fbb586a21cf15f6d64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xAF9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xA70 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x7D0 ADD MSTORE PUSH2 0x926 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x68B JUMPI DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x432 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x270 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1FF JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x184 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x95 PUSH2 0x70E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xBF PUSH2 0x90F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x152 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x103 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x1BB PUSH2 0x70E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x152 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x2A7 PUSH2 0x70E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x17F JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x3EE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x3E2 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x373 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x343 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3DA JUMPI JUMPDEST DUP2 PUSH2 0x38F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x731 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3D6 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3D3 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x325 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x382 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x469 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x471 PUSH2 0x90F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x65E JUMPI POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x62C JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x5D7 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x543 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x40 PUSH2 0x6C4 PUSH2 0x7B9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x17F JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x772 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x17F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x17F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x905 JUMPI JUMPDEST PUSH2 0x8FD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x84C JUMPI JUMPDEST POP PUSH2 0x81B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x17F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x80F JUMP JUMPDEST PUSH2 0x8F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8F6 JUMPI JUMPDEST PUSH2 0x8E8 DUP2 DUP4 PUSH2 0x731 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x7A1 JUMP JUMPDEST CODESIZE PUSH2 0x8C7 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x8DE JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x800 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA2B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA30 JUMPI JUMPDEST PUSH2 0xA2B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x99A JUMPI JUMPDEST POP PUSH2 0x997 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA0C JUMPI JUMPDEST POP CODESIZE PUSH2 0x98D JUMP JUMPDEST PUSH2 0xA25 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8F6 JUMPI PUSH2 0x8E8 DUP2 DUP4 PUSH2 0x731 JUMP JUMPDEST CODESIZE PUSH2 0xA05 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x956 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 SGT MOD 0xCD 0xD7 0xDE 0x2A 0xC0 0xDE PUSH3 0xC9F870 0xFC PUSH13 0x11190A114B9858D3A3FBB586A2 SHR CALL PUSH0 PUSH14 0x64736F6C634300081E0033000000 ","sourceMap":"337:682:85:-:0;;;;;;;;;;;;;-1:-1:-1;;337:682:85;;;;-1:-1:-1;;;;;337:682:85;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;337:682:85;;;;;;745:39:76;;337:682:85;;;;;;;;745:39:76;337:682:85;;;;;;;;;;;;-1:-1:-1;337:682:85;;;;;;-1:-1:-1;337:682:85;;;;;-1:-1:-1;337:682:85"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1806,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":1953,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1841,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1977,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2319,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2000},{"length":32,"start":2342}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461068b57806363e340d6146104325780637e7d9f83146102705780638da5cb5b146101ff57806397883ae2146101845763f2fde38b1461005e57600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5761009561070e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906100bf61090f565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610152575073ffffffffffffffffffffffffffffffffffffffff169182820361010357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f576101bb61070e565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361015257005b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461017f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f576102a761070e565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361017f57803b156103ee5773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156103e2578391600091610373575b5073ffffffffffffffffffffffffffffffffffffffff160361034357005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d6020116103da575b8161038f60209383610731565b810103126103d657519073ffffffffffffffffffffffffffffffffffffffff821682036103d35750829073ffffffffffffffffffffffffffffffffffffffff610325565b80fd5b5080fd5b3d9150610382565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5761046961070e565b61047161090f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361065e57507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc907f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561062c575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816105d7575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610543565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760406106c46107b9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761077257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261017f5751801515810361017f5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108fd573233148015610905575b6108fd5780331490811561084c575b5061081b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161017f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156103e2576000916108ce575b503861080f565b6108f0915060203d6020116108f6575b6108e88183610731565b8101906107a1565b386108c7565b503d6108de565b506000903690565b5060183610610800565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a2b573233148015610a30575b610a2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561099a575b5061099757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156103e257600091610a0c575b503861098d565b610a25915060203d6020116108f6576108e88183610731565b38610a05565b503390565b506018361061095656fea26469706673582212209a1306cdd7de2ac0de62c9f870fc6c11190a114b9858d3a3fbb586a21cf15f6d64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x68B JUMPI DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x432 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x270 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1FF JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x184 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x95 PUSH2 0x70E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xBF PUSH2 0x90F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x152 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x103 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x1BB PUSH2 0x70E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x152 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x2A7 PUSH2 0x70E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x17F JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x3EE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x3E2 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x373 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x343 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3DA JUMPI JUMPDEST DUP2 PUSH2 0x38F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x731 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3D6 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3D3 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x325 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x382 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH2 0x469 PUSH2 0x70E JUMP JUMPDEST PUSH2 0x471 PUSH2 0x90F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x65E JUMPI POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x62C JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x5D7 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x543 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x40 PUSH2 0x6C4 PUSH2 0x7B9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x17F JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x772 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x17F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x17F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x905 JUMPI JUMPDEST PUSH2 0x8FD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x84C JUMPI JUMPDEST POP PUSH2 0x81B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x17F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x80F JUMP JUMPDEST PUSH2 0x8F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8F6 JUMPI JUMPDEST PUSH2 0x8E8 DUP2 DUP4 PUSH2 0x731 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x7A1 JUMP JUMPDEST CODESIZE PUSH2 0x8C7 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x8DE JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x800 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA2B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA30 JUMPI JUMPDEST PUSH2 0xA2B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x99A JUMPI JUMPDEST POP PUSH2 0x997 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA0C JUMPI JUMPDEST POP CODESIZE PUSH2 0x98D JUMP JUMPDEST PUSH2 0xA25 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8F6 JUMPI PUSH2 0x8E8 DUP2 DUP4 PUSH2 0x731 JUMP JUMPDEST CODESIZE PUSH2 0xA05 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x956 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 SGT MOD 0xCD 0xD7 0xDE 0x2A 0xC0 0xDE PUSH3 0xC9F870 0xFC PUSH13 0x11190A114B9858D3A3FBB586A2 SHR CALL PUSH0 PUSH14 0x64736F6C634300081E0033000000 ","sourceMap":"337:682:85:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2177:41:36;;;:::i;:::-;337:682:85;;;;;;;;3205:23:42;;;3201:60;;337:682:85;;;3275:25:42;;;;3271:146;;337:682:85;3271:146:42;337:682:85;;;;;;;;3361:45:42;337:682:85;3361:45:42;;337:682:85;3201:60:42;3237:24;337:682:85;3237:24:42;337:682:85;;;;3237:24:42;337:682:85;;;;;;;;;;;;;;;;;:::i;:::-;;912:80:42;337:682:85;;;;;4503:26:42;;;4499:64;;337:682:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;376:58:354;;450:9;4074:78:42;;337:682:85;;;;;4169:31:42;;337:682:85;4169:31:42;337:682:85;4169:31:42;;;;;;;;;;337:682:85;4169:31:42;;;337:682:85;;;;4169:42:42;4940:107;;337:682:85;4940:107:42;5000:47;337:682:85;5000:47:42;337:682:85;;;;;;5000:47:42;4169:31;;;;337:682:85;4169:31:42;;337:682:85;4169:31:42;;;;;;337:682:85;4169:31:42;;;:::i;:::-;;;337:682:85;;;;;;;;;;;;;-1:-1:-1;4169:31:42;;337:682:85;4169:31:42;;337:682:85;;;;;;;4169:31:42;;;-1:-1:-1;4169:31:42;;;337:682:85;;;;;;;;;4074:78:42;337:682:85;4116:36:42;;337:682:85;4116:36:42;337:682:85;;;;;4116:36:42;337:682:85;;;;;;;;;;;;;:::i;:::-;2177:41:36;;:::i;:::-;337:682:85;;;;;;;3174:18:180;;;3170:53;;5148:19:42;337:682:85;;;;636:1:180;900:21:181;;;896:88;;-1:-1:-1;636:1:180;337:682:85;;;;;;1645:152:42;;337:682:85;1863:25:42;337:682:85;500:10:59;337:682:85;;500:10:59;;;;;;636:1:180;500:10:59;;;337:682:85;1645:152:42;337:682:85;;;;;;;;;1740:46:42;;;;1645:152;;;;896:88:181;930:54;337:682:85;930:54:181;337:682:85;;636:1:180;337:682:85;;;;930:54:181;3170:53:180;3201:22;337:682:85;3201:22:180;337:682:85;;;;3201:22:180;337:682:85;;;;;;;;;;;;2412:39:36;;:::i;:::-;337:682:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;337:682:85;;;;;-1:-1:-1;337:682:85;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;337:682:85;2065:19:76;337:682:85;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;337:682:85;720:8:80;337:682:85;720:8:80;;337:682:85;;;;2115:1:76;2802:32;;:::o;2624:153::-;337:682:85;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;337:682:85;2361:10:76;337:682:85;;;;2771:4:76;337:682:85;;;;;-1:-1:-1;2682:95:76;;337:682:85;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;337:682:85;1029:19:76;337:682:85;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;337:682:85;;;1676:74:76;;337:682:85;;;1676:74:76;;;337:682:85;1327:10:76;337:682:85;;;;1744:4:76;337:682:85;;;;;-1:-1:-1;1676:74:76;;337:682:85;;;;;;1676:74:76;;;;;;;337:682:85;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"534400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","enforceIsContractOwner(address)":"2431","enforceIsTargetContractOwner(address,address)":"infinite","initContractOwnershipStorage(address)":"infinite","owner()":"2319","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","enforceIsContractOwner(address)":"97883ae2","enforceIsTargetContractOwner(address,address)":"7e7d9f83","initContractOwnershipStorage(address)":"63e340d6","owner()":"8da5cb5b","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsTargetContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initContractOwnershipStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"initContractOwnershipStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"The initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"initContractOwnershipStorage(address)\":{\"notice\":\"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol\":\"ContractOwnershipFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/ContractOwnershipFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../base/ContractOwnershipBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ContractOwnershipFacet is ContractOwnershipBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function initContractOwnershipStorage(address initialOwner) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ContractOwnershipStorage.layout().proxyInit(initialOwner);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x79d3c23b25f51ec2ada657a35b02e81dc0a82cc4100bda7c52e965c93140b17e\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/facets/ContractOwnershipFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipFacet} from \\\"./../../../access/facets/ContractOwnershipFacet.sol\\\";\\n\\ncontract ContractOwnershipFacetMock is ContractOwnershipFacet {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnershipFacet(forwarderRegistry) {}\\n\\n    function enforceIsContractOwner(address account) external view {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(account);\\n    }\\n\\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\\n        ContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0a2b04ecf2abf7c2a3a46ade890ec055ef62a45ce9caf0bcdc858d6a38cea5bf\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"initContractOwnershipStorage(address)":{"notice":"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol":{"SafeContractOwnershipFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotPendingContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferPending","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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsTargetContractOwner","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initContractOwnershipStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotPendingContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"OwnershipTransferPending(address)":{"params":{"pendingOwner":"the address of the new contract owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"acceptOwnership()":{"details":"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event."},"initContractOwnershipStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.","params":{"initialOwner":"The initial contract owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pendingOwner()":{"returns":{"_0":"The address of the pending contract owner."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610df738819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610d6e90816100898239608051818181610ace0152610c240152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461098957806363e340d61461073057806379ba5097146105955780637e7d9f83146103d35780638da5cb5b1461036257806397883ae2146102e7578063e30c3978146102765763f2fde38b1461007457600080fd5b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610271576100ab610a0c565b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b906100d5610c0d565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610244575073ffffffffffffffffffffffffffffffffffffffff1691826101cb57600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101d457005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715761031e610a0c565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416911690810361024457005b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102715760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715761040a610a0c565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361027157803b156105515773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156105455783916000916104d6575b5073ffffffffffffffffffffffffffffffffffffffff16036104a657005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d60201161053d575b816104f260209383610a2f565b8101031261053957519073ffffffffffffffffffffffffffffffffffffffff821682036105365750829073ffffffffffffffffffffffffffffffffffffffff610488565b80fd5b5080fd5b3d91506104e5565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610271577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b6105ed610c0d565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416911681810361070357508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157610767610a0c565b61076f610c0d565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361095c57507f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b907f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd54600181101561092a575060017f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5573ffffffffffffffffffffffffffffffffffffffff1690816108d5575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610841565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715760406109c2610ab7565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361027157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a7057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610271575180151581036102715790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610bfb573233148015610c03575b610bfb57803314908115610b4a575b50610b19576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102715760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561054557600091610bcc575b5038610b0d565b610bee915060203d602011610bf4575b610be68183610a2f565b810190610a9f565b38610bc5565b503d610bdc565b506000903690565b5060183610610afe565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d29573233148015610d2e575b610d29577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c98575b50610c9557503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561054557600091610d0a575b5038610c8b565b610d23915060203d602011610bf457610be68183610a2f565b38610d03565b503390565b5060183610610c5456fea2646970667358221220dbb89331f75d5adcf05ed71f6e187dbb352eda2676d10a269e038dc64e2bbf0764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xDF7 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD6E SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xACE ADD MSTORE PUSH2 0xC24 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x989 JUMPI DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x730 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x3D3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x276 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0xAB PUSH2 0xA0C JUMP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH2 0xD5 PUSH2 0xC0D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x244 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 PUSH2 0x1CB JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1D4 JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x31E PUSH2 0xA0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x244 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x40A PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x271 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x551 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x545 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x4D6 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x4A6 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x53D JUMPI JUMPDEST DUP2 PUSH2 0x4F2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xA2F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x539 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x536 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x488 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x5ED PUSH2 0xC0D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x703 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x767 PUSH2 0xA0C JUMP JUMPDEST PUSH2 0x76F PUSH2 0xC0D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x95C JUMPI POP PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x92A JUMPI POP PUSH1 0x1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x8D5 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x841 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x40 PUSH2 0x9C2 PUSH2 0xAB7 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x271 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xA70 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x271 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x271 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBFB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC03 JUMPI JUMPDEST PUSH2 0xBFB JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB4A JUMPI JUMPDEST POP PUSH2 0xB19 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x271 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBCC JUMPI JUMPDEST POP CODESIZE PUSH2 0xB0D JUMP JUMPDEST PUSH2 0xBEE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBF4 JUMPI JUMPDEST PUSH2 0xBE6 DUP2 DUP4 PUSH2 0xA2F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA9F JUMP JUMPDEST CODESIZE PUSH2 0xBC5 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBDC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAFE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD29 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD2E JUMPI JUMPDEST PUSH2 0xD29 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC98 JUMPI JUMPDEST POP PUSH2 0xC95 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD0A JUMPI JUMPDEST POP CODESIZE PUSH2 0xC8B JUMP JUMPDEST PUSH2 0xD23 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBF4 JUMPI PUSH2 0xBE6 DUP2 DUP4 PUSH2 0xA2F JUMP JUMPDEST CODESIZE PUSH2 0xD03 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC54 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDB 0xB8 SWAP4 BALANCE 0xF7 TSTORE GAS 0xDC CREATE MCOPY 0xD7 0x1F PUSH15 0x187DBB352EDA2676D10A269E038DC6 0x4E 0x2B 0xBF SMOD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"353:710:86:-:0;;;;;;;;;;;;;-1:-1:-1;;353:710:86;;;;-1:-1:-1;;;;;353:710:86;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;353:710:86;;;;;;745:39:76;;353:710:86;;;;;;;;745:39:76;353:710:86;;;;;;;;;;;;-1:-1:-1;353:710:86;;;;;;-1:-1:-1;353:710:86;;;;;-1:-1:-1;353:710:86"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2572,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2719,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2607,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2743,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3085,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2766},{"length":32,"start":3108}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461098957806363e340d61461073057806379ba5097146105955780637e7d9f83146103d35780638da5cb5b1461036257806397883ae2146102e7578063e30c3978146102765763f2fde38b1461007457600080fd5b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610271576100ab610a0c565b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b906100d5610c0d565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610244575073ffffffffffffffffffffffffffffffffffffffff1691826101cb57600092507fffffffffffffffffffffffff000000000000000000000000000000000000000081541690557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b5081036101d457005b7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c817fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557ffcf6b9a1f453b7c06ba4f44b1f8c38b02e8b90a7bd35bd0d5c43e2deb547f568600080a2005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416604051908152f35b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715761031e610a0c565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416911690810361024457005b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157602073ffffffffffffffffffffffffffffffffffffffff7f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b5416604051908152f35b346102715760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715761040a610a0c565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361027157803b156105515773ffffffffffffffffffffffffffffffffffffffff166040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481855afa80156105455783916000916104d6575b5073ffffffffffffffffffffffffffffffffffffffff16036104a657005b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b9091506020813d60201161053d575b816104f260209383610a2f565b8101031261053957519073ffffffffffffffffffffffffffffffffffffffff821682036105365750829073ffffffffffffffffffffffffffffffffffffffff610488565b80fd5b5080fd5b3d91506104e5565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610271577f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b6105ed610c0d565b73ffffffffffffffffffffffffffffffffffffffff807f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c5416911681810361070357508073ffffffffffffffffffffffffffffffffffffffff91828454167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff00000000000000000000000000000000000000007f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c54167f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12c55600080f35b7f618487520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261027157610767610a0c565b61076f610c0d565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361095c57507f9d118bc1195e908806a0d8a492ffda365ad8222890448ff28ede06205764e12b907f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd54600181101561092a575060017f0a5ee31d9c53ad463777e870bc52a4da1baabf467a02dee7381e23f5450e41cd5573ffffffffffffffffffffffffffffffffffffffff1690816108d5575b7f7f5828d0000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610841565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102715760406109c2610ab7565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361027157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a7057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610271575180151581036102715790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610bfb573233148015610c03575b610bfb57803314908115610b4a575b50610b19576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102715760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561054557600091610bcc575b5038610b0d565b610bee915060203d602011610bf4575b610be68183610a2f565b810190610a9f565b38610bc5565b503d610bdc565b506000903690565b5060183610610afe565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d29573233148015610d2e575b610d29577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c98575b50610c9557503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561054557600091610d0a575b5038610c8b565b610d23915060203d602011610bf457610be68183610a2f565b38610d03565b503390565b5060183610610c5456fea2646970667358221220dbb89331f75d5adcf05ed71f6e187dbb352eda2676d10a269e038dc64e2bbf0764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x989 JUMPI DUP1 PUSH4 0x63E340D6 EQ PUSH2 0x730 JUMPI DUP1 PUSH4 0x79BA5097 EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0x7E7D9F83 EQ PUSH2 0x3D3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x97883AE2 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x276 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0xAB PUSH2 0xA0C JUMP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH2 0xD5 PUSH2 0xC0D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x244 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 PUSH2 0x1CB JUMPI PUSH1 0x0 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP3 DUP1 LOG3 STOP JUMPDEST POP DUP2 SUB PUSH2 0x1D4 JUMPI STOP JUMPDEST PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFCF6B9A1F453B7C06BA4F44B1F8C38B02E8B90A7BD35BD0D5C43E2DEB547F568 PUSH1 0x0 DUP1 LOG2 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x31E PUSH2 0xA0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x244 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x40A PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x271 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x551 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL DUP1 ISZERO PUSH2 0x545 JUMPI DUP4 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x4D6 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SUB PUSH2 0x4A6 JUMPI STOP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x53D JUMPI JUMPDEST DUP2 PUSH2 0x4F2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xA2F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x539 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x536 JUMPI POP DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x488 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B PUSH2 0x5ED PUSH2 0xC0D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x703 JUMPI POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 DUP5 SLOAD AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SLOAD AND PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12C SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x6184875200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH2 0x767 PUSH2 0xA0C JUMP JUMPDEST PUSH2 0x76F PUSH2 0xC0D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x95C JUMPI POP PUSH32 0x9D118BC1195E908806A0D8A492FFDA365AD8222890448FF28EDE06205764E12B SWAP1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x92A JUMPI POP PUSH1 0x1 PUSH32 0xA5EE31D9C53AD463777E870BC52A4DA1BAABF467A02DEE7381E23F5450E41CD SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x8D5 JUMPI JUMPDEST PUSH32 0x7F5828D000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x841 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x271 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x271 JUMPI PUSH1 0x40 PUSH2 0x9C2 PUSH2 0xAB7 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x271 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xA70 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x271 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x271 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBFB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC03 JUMPI JUMPDEST PUSH2 0xBFB JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB4A JUMPI JUMPDEST POP PUSH2 0xB19 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x271 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBCC JUMPI JUMPDEST POP CODESIZE PUSH2 0xB0D JUMP JUMPDEST PUSH2 0xBEE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBF4 JUMPI JUMPDEST PUSH2 0xBE6 DUP2 DUP4 PUSH2 0xA2F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA9F JUMP JUMPDEST CODESIZE PUSH2 0xBC5 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBDC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAFE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD29 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD2E JUMPI JUMPDEST PUSH2 0xD29 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC98 JUMPI JUMPDEST POP PUSH2 0xC95 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD0A JUMPI JUMPDEST POP CODESIZE PUSH2 0xC8B JUMP JUMPDEST PUSH2 0xD23 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBF4 JUMPI PUSH2 0xBE6 DUP2 DUP4 PUSH2 0xA2F JUMP JUMPDEST CODESIZE PUSH2 0xD03 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC54 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDB 0xB8 SWAP4 BALANCE 0xF7 TSTORE GAS 0xDC CREATE MCOPY 0xD7 0x1F PUSH15 0x187DBB352EDA2676D10A269E038DC6 0x4E 0x2B 0xBF SMOD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"353:710:86:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2213:41:37;;;:::i;:::-;353:710:86;;;;;;;;3421:22:43;;;3417:59;;-1:-1:-1;353:710:86;;;3490:22:43;;;353:710:86;;;;;;;;;;3570:22:43;353:710:86;;3570:22:43;353:710:86;3624:46:43;;;;353:710:86;3486:378:43;3705:24;;;3701:153;;353:710:86;3701:153:43;3749:22;353:710:86;;;;;;;;3805:34:43;353:710:86;3805:34:43;;3701:153;3417:59;3452:24;353:710:86;3452:24:43;353:710:86;;;;3452:24:43;353:710:86;;;;;;;;;;;;;;;;;4996:22:43;353:710:86;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1013:84:43;353:710:86;;;;;5860:26:43;;;5856:64;;353:710:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;376:58:354;;450:9;5431:78:43;;353:710:86;;;;;5526:31:43;;353:710:86;5526:31:43;353:710:86;5526:31:43;;;;;;;;;;353:710:86;5526:31:43;;;353:710:86;;;;5526:42:43;6297:107;;353:710:86;6297:107:43;6357:47;353:710:86;6357:47:43;353:710:86;;;;;;6357:47:43;5526:31;;;;353:710:86;5526:31:43;;353:710:86;5526:31:43;;;;;;353:710:86;5526:31:43;;;:::i;:::-;;;353:710:86;;;;;;;;;;;;;-1:-1:-1;5526:31:43;;353:710:86;5526:31:43;;353:710:86;;;;;;;5526:31:43;;;-1:-1:-1;5526:31:43;;;353:710:86;;;;;;;;;5431:78:43;353:710:86;5473:36:43;;353:710:86;5473:36:43;353:710:86;;;;;5473:36:43;353:710:86;;;;;;;;;;;;2213:41:37;;:::i;:::-;353:710:86;;4211:22:43;353:710:86;;;;4247:30:43;;;4243:74;;353:710:86;;;;;;;;4332:59:43;353:710:86;4332:59:43;;353:710:86;;;;;;;;;4211:22:43;353:710:86;;4211:22:43;353:710:86;;;;4243:74:43;4286:31;353:710:86;4286:31:43;353:710:86;;;;4286:31:43;353:710:86;;;;;;;;;;;;;:::i;:::-;2213:41:37;;:::i;:::-;353:710:86;;;;;;;3174:18:180;;;3170:53;;6505:19:43;353:710:86;;;;636:1:180;900:21:181;;;896:88;;-1:-1:-1;636:1:180;353:710:86;;;;;;1754:152:43;;353:710:86;1972:25:43;353:710:86;500:10:59;353:710:86;;500:10:59;;;;;;636:1:180;500:10:59;;;353:710:86;1754:152:43;353:710:86;;;;;;;;;1849:46:43;;;;1754:152;;;;896:88:181;930:54;353:710:86;930:54:181;353:710:86;;636:1:180;353:710:86;;;;930:54:181;3170:53:180;3201:22;353:710:86;3201:22:180;353:710:86;;;;3201:22:180;353:710:86;;;;;;;;;;;;2448:39:37;;:::i;:::-;353:710:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;353:710:86;;;;;-1:-1:-1;353:710:86;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;353:710:86;2065:19:76;353:710:86;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;353:710:86;720:8:80;353:710:86;720:8:80;;353:710:86;;;;2115:1:76;2802:32;;:::o;2624:153::-;353:710:86;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;353:710:86;2361:10:76;353:710:86;;;;2771:4:76;353:710:86;;;;;-1:-1:-1;2682:95:76;;353:710:86;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;353:710:86;1029:19:76;353:710:86;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;353:710:86;;;1676:74:76;;353:710:86;;;1676:74:76;;;353:710:86;1327:10:76;353:710:86;;;;1744:4:76;353:710:86;;;;;-1:-1:-1;1676:74:76;;353:710:86;;;;;;1676:74:76;;;;;;;353:710:86;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"687600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","acceptOwnership()":"infinite","enforceIsContractOwner(address)":"2453","enforceIsTargetContractOwner(address,address)":"infinite","initContractOwnershipStorage(address)":"infinite","owner()":"2341","pendingOwner()":"2385","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","acceptOwnership()":"79ba5097","enforceIsContractOwner(address)":"97883ae2","enforceIsTargetContractOwner(address,address)":"7e7d9f83","initContractOwnershipStorage(address)":"63e340d6","owner()":"8da5cb5b","pendingOwner()":"e30c3978","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotPendingContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferPending\",\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsTargetContractOwner\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initContractOwnershipStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotPendingContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"OwnershipTransferPending(address)\":{\"params\":{\"pendingOwner\":\"the address of the new contract owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"Reverts if the sender is not the pending contract owner.Emits an {OwnershipTransferred} event.\"},\"initContractOwnershipStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\",\"params\":{\"initialOwner\":\"The initial contract owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending contract owner.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is the zero address.Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPendingContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the pending contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"OwnershipTransferPending(address)\":{\"notice\":\"Emitted when a new contract owner is pending.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"Sets the pending contract owner as the new contract owner.\"},\"initContractOwnershipStorage(address)\":{\"notice\":\"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pendingOwner()\":{\"notice\":\"Gets the address of the pending contract owner.\"},\"transferOwnership(address)\":{\"notice\":\"Sets an address as the pending new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol\":\"SafeContractOwnershipFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/base/SafeContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173Safe} from \\\"./../interfaces/IERC173Safe.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard with safe ownership transfer (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract SafeContractOwnershipBase is IERC173Safe, Context {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173Safe\\n    function transferOwnership(address newOwner) public virtual {\\n        SafeContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function acceptOwnership() public virtual {\\n        SafeContractOwnershipStorage.layout().acceptOwnership(_msgSender());\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function owner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173Safe\\n    function pendingOwner() public view virtual returns (address) {\\n        return SafeContractOwnershipStorage.layout().pendingOwner();\\n    }\\n}\\n\",\"keccak256\":\"0xc2d602249dfe5707d43f9ede77361953d9239c06ef691cfe95a467f0018c4c44\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/facets/SafeContractOwnershipFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {SafeContractOwnershipBase} from \\\"./../base/SafeContractOwnershipBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract SafeContractOwnershipFacet is SafeContractOwnershipBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function initContractOwnershipStorage(address initialOwner) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        SafeContractOwnershipStorage.layout().proxyInit(initialOwner);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8c84ae059813a46756fc058279f80f327bce4b6d9926606e52049ad6191f8e7a\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173Safe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard with safe ownership transfer (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173Safe {\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts if the sender is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership() external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner() external view returns (address pendingContractOwner);\\n}\\n\",\"keccak256\":\"0xc32d7ac82bd527f484ea5ee53a7e496ad8f1cf9f3a5c00ecf12dc85e4b162d3b\",\"license\":\"MIT\"},\"contracts/access/libraries/SafeContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotPendingContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred, OwnershipTransferPending} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary SafeContractOwnershipStorage {\\n    using Address for address;\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n        address pendingContractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.SafeContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets an address as the pending new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is the zero address.\\n    /// @dev Emits an {OwnershipTransferPending} event if `newOwner` not the zero address and not the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address currentOwner = s.contractOwner;\\n        if (sender != currentOwner) revert NotContractOwner(sender);\\n        if (newOwner == address(0)) {\\n            s.contractOwner = address(0);\\n            s.pendingContractOwner = address(0);\\n            emit OwnershipTransferred(currentOwner, address(0));\\n        } else {\\n            if (currentOwner != newOwner) {\\n                s.pendingContractOwner = newOwner;\\n                emit OwnershipTransferPending(newOwner);\\n            }\\n        }\\n    }\\n\\n    /// @notice Sets the pending contract owner as the new contract owner.\\n    /// @dev Reverts with {NotPendingContractOwner} if `sender` is not the pending contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event.\\n    function acceptOwnership(Layout storage s, address sender) internal {\\n        address pendingContractOwner = s.pendingContractOwner;\\n        if (sender != pendingContractOwner) revert NotPendingContractOwner(sender);\\n        emit OwnershipTransferred(s.contractOwner, pendingContractOwner);\\n        s.contractOwner = pendingContractOwner;\\n        s.pendingContractOwner = address(0);\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Gets the address of the pending contract owner.\\n    /// @return pendingContractOwner The address of the pending contract owner.\\n    function pendingOwner(Layout storage s) internal view returns (address pendingContractOwner) {\\n        return s.pendingContractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x50e022fa208f960c591a8e9c2c8d514be84a58f8a0b8e24cadea9318639bbb00\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/access/facets/SafeContractOwnershipFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {SafeContractOwnershipStorage} from \\\"./../../../access/libraries/SafeContractOwnershipStorage.sol\\\";\\nimport {SafeContractOwnershipFacet} from \\\"./../../../access/facets/SafeContractOwnershipFacet.sol\\\";\\n\\ncontract SafeContractOwnershipFacetMock is SafeContractOwnershipFacet {\\n    using SafeContractOwnershipStorage for SafeContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) SafeContractOwnershipFacet(forwarderRegistry) {}\\n\\n    function enforceIsContractOwner(address account) external view {\\n        SafeContractOwnershipStorage.layout().enforceIsContractOwner(account);\\n    }\\n\\n    function enforceIsTargetContractOwner(address targetContract, address account) external view {\\n        SafeContractOwnershipStorage.enforceIsTargetContractOwner(targetContract, account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x267ad93caae1e7ec522bbcc7635cb98e8a3fd75cedf8dc9a2f6ec88335970676\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPendingContractOwner(address)":[{"notice":"Thrown when an account is not the pending contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"OwnershipTransferPending(address)":{"notice":"Emitted when a new contract owner is pending."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"Sets the pending contract owner as the new contract owner."},"initContractOwnershipStorage(address)":{"notice":"Initializes the storage with an initial contract owner (proxied version).Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC173."},"owner()":{"notice":"Gets the address of the contract owner."},"pendingOwner()":{"notice":"Gets the address of the pending contract owner."},"transferOwnership(address)":{"notice":"Sets an address as the pending new contract owner."}},"version":1}}},"contracts/mocks/cryptography/ERC1654Mock.sol":{"ERC1271Mock":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ECDSAInvalidSignature()":[{"details":"The signature derives the `address(0)`."}],"ECDSAInvalidSignatureLength(uint256)":[{"details":"The signature has an invalid length."}],"ECDSAInvalidSignatureS(bytes32)":[{"details":"The signature has an S value that is in the upper half order."}]},"kind":"dev","methods":{"isValidSignature(bytes32,bytes)":{"params":{"hash":"The hash of the signed data.","signature":"The signature for `hash`."},"returns":{"magicValue":"`0x1626ba7e` (`bytes4(keccak256(\"isValidSignature(bytes32,bytes)\")`) if the signature is valid, else any other value."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61047538819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516103f390816100828239608051816101810152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080600436101561000f57600080fd5b60003560e01c631626ba7e1461002457600080fd5b3461011f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011f5760243567ffffffffffffffff811161011f573660238201121561011f5780600401359167ffffffffffffffff8311610124577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8601160116810181811067ffffffffffffffff82111761012457604052828152366024848401011161011f576000602084819560246100f596018386013783010152600435610153565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61016991610160916101f3565b9092919261022f565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146000146101cf577f1626ba7e0000000000000000000000000000000000000000000000000000000090565b7fffffffff0000000000000000000000000000000000000000000000000000000090565b81519190604183036102245761021d92506020820151906060604084015193015160001a9061031b565b9192909190565b505060009160029190565b91909160048110156102ec578061024557509050565b600060018203610279577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036102b057827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146102c0575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116103b1579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156103a55760005173ffffffffffffffffffffffffffffffffffffffff8116156103995790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b5050506000916003919056fea26469706673582212209b0552609cf445038f257a0b6e3bfcc9eb084565bb0857e91fddd73d6fa0fb5164736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x475 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3F3 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x181 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x1626BA7E EQ PUSH2 0x24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x11F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11F JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x11F JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x11F JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x124 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP7 ADD AND ADD AND DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x124 JUMPI PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE CALLDATASIZE PUSH1 0x24 DUP5 DUP5 ADD ADD GT PUSH2 0x11F JUMPI PUSH1 0x0 PUSH1 0x20 DUP5 DUP2 SWAP6 PUSH1 0x24 PUSH2 0xF5 SWAP7 ADD DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH2 0x153 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x169 SWAP2 PUSH2 0x160 SWAP2 PUSH2 0x1F3 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x22F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND SWAP2 AND EQ PUSH1 0x0 EQ PUSH2 0x1CF JUMPI PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP2 MLOAD SWAP2 SWAP1 PUSH1 0x41 DUP4 SUB PUSH2 0x224 JUMPI PUSH2 0x21D SWAP3 POP PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x31B JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 PUSH1 0x2 SWAP2 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x2EC JUMPI DUP1 PUSH2 0x245 JUMPI POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 SUB PUSH2 0x279 JUMPI PUSH32 0xF645EEDF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x2 DUP2 SUB PUSH2 0x2B0 JUMPI DUP3 PUSH32 0xFCE698F700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH1 0x3 PUSH1 0x0 SWAP3 EQ PUSH2 0x2C0 JUMPI POP POP JUMP JUMPDEST PUSH1 0x24 SWAP3 POP PUSH32 0xD78BCE0C00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP5 GT PUSH2 0x3B1 JUMPI SWAP2 PUSH1 0x20 SWAP4 PUSH1 0x80 SWAP3 PUSH1 0xFF PUSH1 0x0 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP7 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x399 JUMPI SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 PUSH1 0x3 SWAP2 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 SDIV MSTORE PUSH1 0x9C DELEGATECALL GASLIMIT SUB DUP16 0x25 PUSH27 0xB6E3BFCC9EB084565BB0857E91FDDD73D6FA0FB5164736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"205:468:87:-:0;;;;;;;;;;;;;-1:-1:-1;;205:468:87;;;;-1:-1:-1;;;;;205:468:87;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;205:468:87;;;;;;351:14;;205:468;;;;;;;;351:14;205:468;;;;;;;-1:-1:-1;205:468:87;;;;;;-1:-1:-1;205:468:87;;;;;-1:-1:-1;205:468:87"},"deployedBytecode":{"functionDebugData":{"fun_isValidSignature":{"entryPoint":339,"id":13986,"parameterSlots":2,"returnSlots":1},"fun_throwError":{"entryPoint":559,"id":3222,"parameterSlots":2,"returnSlots":0},"fun_tryRecover":{"entryPoint":795,"id":3137,"parameterSlots":4,"returnSlots":3},"fun_tryRecover_2949":{"entryPoint":499,"id":2949,"parameterSlots":2,"returnSlots":3}},"generatedSources":[],"immutableReferences":{"13948":[{"length":32,"start":385}]},"linkReferences":{},"object":"6080600436101561000f57600080fd5b60003560e01c631626ba7e1461002457600080fd5b3461011f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011f5760243567ffffffffffffffff811161011f573660238201121561011f5780600401359167ffffffffffffffff8311610124577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8601160116810181811067ffffffffffffffff82111761012457604052828152366024848401011161011f576000602084819560246100f596018386013783010152600435610153565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61016991610160916101f3565b9092919261022f565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146000146101cf577f1626ba7e0000000000000000000000000000000000000000000000000000000090565b7fffffffff0000000000000000000000000000000000000000000000000000000090565b81519190604183036102245761021d92506020820151906060604084015193015160001a9061031b565b9192909190565b505060009160029190565b91909160048110156102ec578061024557509050565b600060018203610279577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036102b057827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146102c0575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116103b1579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156103a55760005173ffffffffffffffffffffffffffffffffffffffff8116156103995790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b5050506000916003919056fea26469706673582212209b0552609cf445038f257a0b6e3bfcc9eb084565bb0857e91fddd73d6fa0fb5164736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0x1626BA7E EQ PUSH2 0x24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x11F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11F JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x11F JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x11F JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x124 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP7 ADD AND ADD AND DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x124 JUMPI PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE CALLDATASIZE PUSH1 0x24 DUP5 DUP5 ADD ADD GT PUSH2 0x11F JUMPI PUSH1 0x0 PUSH1 0x20 DUP5 DUP2 SWAP6 PUSH1 0x24 PUSH2 0xF5 SWAP7 ADD DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH2 0x153 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x169 SWAP2 PUSH2 0x160 SWAP2 PUSH2 0x1F3 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x22F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0x0 AND SWAP2 AND EQ PUSH1 0x0 EQ PUSH2 0x1CF JUMPI PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP2 MLOAD SWAP2 SWAP1 PUSH1 0x41 DUP4 SUB PUSH2 0x224 JUMPI PUSH2 0x21D SWAP3 POP PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x60 PUSH1 0x40 DUP5 ADD MLOAD SWAP4 ADD MLOAD PUSH1 0x0 BYTE SWAP1 PUSH2 0x31B JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 PUSH1 0x2 SWAP2 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x2EC JUMPI DUP1 PUSH2 0x245 JUMPI POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 SUB PUSH2 0x279 JUMPI PUSH32 0xF645EEDF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x2 DUP2 SUB PUSH2 0x2B0 JUMPI DUP3 PUSH32 0xFCE698F700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 PUSH1 0x3 PUSH1 0x0 SWAP3 EQ PUSH2 0x2C0 JUMPI POP POP JUMP JUMPDEST PUSH1 0x24 SWAP3 POP PUSH32 0xD78BCE0C00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP5 GT PUSH2 0x3B1 JUMPI SWAP2 PUSH1 0x20 SWAP4 PUSH1 0x80 SWAP3 PUSH1 0xFF PUSH1 0x0 SWAP6 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND DUP7 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x399 JUMPI SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 PUSH1 0x3 SWAP2 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 SDIV MSTORE PUSH1 0x9C DELEGATECALL GASLIMIT SUB DUP16 0x25 PUSH27 0xB6E3BFCC9EB084565BB0857E91FDDD73D6FA0FB5164736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"205:468:87:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;378:293;3927:8:16;378:293:87;3871:27:16;378:293:87;3871:27:16;:::i;:::-;3927:8;;;;;:::i;:::-;205:468:87;567:6;;205:468;;;557:16;553:112;205:468;;;;589:17;:::o;553:112::-;205:468;637:17;:::o;2129:778:16:-;205:468:87;;;2129:778:16;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:16;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;7280:532::-;;;;205:468:87;;;;;;7366:29:16;;;7411:7;;;:::o;7362:444::-;7375:20;205:468:87;7462:38:16;;205:468:87;;7523:23:16;7375:20;7523:23;205:468:87;7375:20:16;7523:23;7458:348;-1:-1:-1;7576:35:16;7567:44;;7576:35;;7634:46;;7375:20;7634:46;205:468:87;;;7375:20:16;7634:46;7563:243;205:468:87;;7710:30:16;7375:20;7701:39;;7697:109;;7563:243;;7280:532::o;7697:109::-;205:468:87;7763:32:16;;;;;205:468:87;;7763:32:16;205:468:87;;7375:20:16;205:468:87;;;;;7375:20:16;205:468:87;5203:1551:16;;;6283:66;6270:79;;6266:164;;205:468:87;;;;;;-1:-1:-1;205:468:87;;;;;;;;;;;;;;;;;;;6541:24:16;;;;;;;;;-1:-1:-1;6541:24:16;205:468:87;;;6579:20:16;6575:113;;6698:49;-1:-1:-1;6698:49:16;-1:-1:-1;5203:1551:16;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:16;6541:24;6615:62;-1:-1:-1;6615:62:16;:::o;6541:24::-;205:468:87;;;-1:-1:-1;205:468:87;;;;;6266:164:16;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"202200","executionCost":"infinite","totalCost":"infinite"},"external":{"isValidSignature(bytes32,bytes)":"infinite"}},"methodIdentifiers":{"isValidSignature(bytes32,bytes)":"1626ba7e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}]},\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes32,bytes)\":{\"params\":{\"hash\":\"The hash of the signed data.\",\"signature\":\"The signature for `hash`.\"},\"returns\":{\"magicValue\":\"`0x1626ba7e` (`bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\")`) if the signature is valid, else any other value.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Returns whether the signature is valid for the data hash.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/cryptography/ERC1654Mock.sol\":\"ERC1271Mock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS\\n    }\\n\\n    /**\\n     * @dev The signature derives the `address(0)`.\\n     */\\n    error ECDSAInvalidSignature();\\n\\n    /**\\n     * @dev The signature has an invalid length.\\n     */\\n    error ECDSAInvalidSignatureLength(uint256 length);\\n\\n    /**\\n     * @dev The signature has an S value that is in the upper half order.\\n     */\\n    error ECDSAInvalidSignatureS(bytes32 s);\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\\n     * return address(0) without also returning an error description. Errors are documented using an enum (error type)\\n     * and a bytes32 providing additional information about the error.\\n     *\\n     * If no error is returned, then the address can be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes memory signature\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly (\\\"memory-safe\\\") {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        unchecked {\\n            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n            // We do not check for an overflow here since the shift operation results in 0 or 1.\\n            uint8 v = uint8((uint256(vs) >> 255) + 27);\\n            return tryRecover(hash, v, r, s);\\n        }\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     */\\n    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS, s);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature, bytes32(0));\\n        }\\n\\n        return (signer, RecoverError.NoError, bytes32(0));\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\\n        _throwError(error, errorArg);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\\n     */\\n    function _throwError(RecoverError error, bytes32 errorArg) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert ECDSAInvalidSignature();\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert ECDSAInvalidSignatureLength(uint256(errorArg));\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert ECDSAInvalidSignatureS(errorArg);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\"},\"contracts/cryptography/interfaces/IERC1271.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Standard Signature Validation Method for Contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1271\\ninterface IERC1271 {\\n    /// @notice Returns whether the signature is valid for the data hash.\\n    /// @param hash The hash of the signed data.\\n    /// @param signature The signature for `hash`.\\n    /// @return magicValue `0x1626ba7e` (`bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\")`) if the signature is valid, else any other value.\\n    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x398946875e5504f89b0137202e1733544939f6dea85c0b5e50fb388d11f5d8fa\",\"license\":\"MIT\"},\"contracts/mocks/cryptography/ERC1654Mock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC1271} from \\\"./../../cryptography/interfaces/IERC1271.sol\\\";\\nimport {ECDSA} from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\ncontract ERC1271Mock is IERC1271 {\\n    using ECDSA for bytes32;\\n\\n    address internal immutable _OWNER;\\n\\n    constructor(address owner) {\\n        _OWNER = owner;\\n    }\\n\\n    function isValidSignature(bytes32 hash, bytes memory signature) external view override returns (bytes4 magicValue) {\\n        address signer = hash.recover(signature);\\n        if (signer == _OWNER) {\\n            return 0x1626ba7e;\\n        } else {\\n            return 0xffffffff;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xca15754f482b1a6baa3061c72dd796d6984d8d5909324a66d2e70f18c80cc006\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isValidSignature(bytes32,bytes)":{"notice":"Returns whether the signature is valid for the data hash."}},"version":1}}},"contracts/mocks/diamond/DiamondMock.sol":{"DiamondMock":{"abi":[{"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Initialization[]","name":"initializations","type":"tuple[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"EmptyFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"EmptyInitCallData","type":"error"},{"inputs":[],"name":"EtherReceptionDisabled","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionAlreadyPresent","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"InitCallReverted","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ModifyingImmutableFunction","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"NonContractFacet","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"NonContractInitCallTarget","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"RemovingWithNonZeroAddressFacet","type":"error"},{"inputs":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ReplacingFunctionByItself","type":"error"},{"inputs":[],"name":"ZeroAddressTargetInitCallButNonEmptyData","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facet","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct FacetCut[]","name":"cuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","type":"event"},{"anonymous":false,"inputs":[],"name":"ImmutableFunctionCalled","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"immutableFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"EmptyFacet(address)":[{"params":{"facet":"The facet address."}}],"EmptyInitCallData(address)":[{"params":{"target":"The target address for the initialization call."}}],"FunctionAlreadyPresent(address,bytes4)":[{"params":{"facet":"The facet address which already has the function.","selector":"The function selector which has already been added."}}],"FunctionNotFound(bytes4)":[{"params":{"selector":"The function selector which has not been added."}}],"InitCallReverted(address,bytes)":[{"params":{"data":"The data for the initialization call.","target":"The target address for the initialization call."}}],"ModifyingImmutableFunction(bytes4)":[{"params":{"selector":"The function selector which is immutable."}}],"NonContractFacet(address)":[{"params":{"facet":"The facet address."}}],"NonContractInitCallTarget(address)":[{"params":{"target":"The target address for the initialization call."}}],"RemovingWithNonZeroAddressFacet(address)":[{"params":{"facet":"The facet address which is not zero."}}],"ReplacingFunctionByItself(address,bytes4)":[{"params":{"facet":"The facet address.","selector":"The function selector."}}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"params":{"cuts":"The list of facet addresses, actions and function selectors applied to the diamond.","data":"The encoded function call executed on `target`.","target":"The address of the contract where `data` was executed."}}},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_address_fromMemory":{"entryPoint":550,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_array_struct_Initialization_dyn_fromMemory":{"entryPoint":632,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"abi_encode_address_bytes":{"entryPoint":2078,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_struct_FacetCut_dyn":{"entryPoint":1372,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":1565,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_and_zero_memory_array_array_bytes4_dyn":{"entryPoint":859,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_and_zero_memory_array_array_struct_FacetCut_dyn":{"entryPoint":948,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory":{"entryPoint":490,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_4905":{"entryPoint":423,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_4911":{"entryPoint":459,"id":null,"parameterSlots":0,"returnSlots":1},"allocate_memory_array_string":{"entryPoint":1057,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_FacetCut_dyn":{"entryPoint":527,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":570,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bool":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"cleanup_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"constructor_DiamondMock":{"entryPoint":1074,"id":14090,"parameterSlots":2,"returnSlots":0},"convert_address_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes20_to_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"convert_bytes32_to_bytes20":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":597,"id":null,"parameterSlots":3,"returnSlots":0},"extract_from_storage_value_offset_uint16":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"extract_returndata":{"entryPoint":2040,"id":null,"parameterSlots":0,"returnSlots":1},"fun_addFacetSelectors":{"entryPoint":3400,"id":10506,"parameterSlots":4,"returnSlots":2},"fun_cutFacets":{"entryPoint":1692,"id":10348,"parameterSlots":2,"returnSlots":0},"fun_diamondCut":{"entryPoint":1602,"id":10140,"parameterSlots":3,"returnSlots":0},"fun_hasBytecode":{"entryPoint":null,"id":38034,"parameterSlots":1,"returnSlots":1},"fun_initializationCall":{"entryPoint":2115,"id":10999,"parameterSlots":2,"returnSlots":0},"fun_removeFacetSelectors":{"entryPoint":2317,"id":10805,"parameterSlots":4,"returnSlots":2},"fun_replaceFacetSelectors":{"entryPoint":3079,"id":10918,"parameterSlots":2,"returnSlots":0},"mapping_index_access_mapping_bytes4_bytes32_of_bytes4":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"mapping_index_access_mapping_uint256_bytes32_of_uint256":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":1},"memory_array_index_access_array_bytes4_dyn":{"entryPoint":910,"id":null,"parameterSlots":1,"returnSlots":1},"memory_array_index_access_bytes4_dyn":{"entryPoint":928,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x32":{"entryPoint":888,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":401,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_memoryt_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_left_t_uint256_t_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_left_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"shift_right_uint256_uint8":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1},"update_storage_value_offset_uint16_to_uint16":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"validator_assert_enum_FacetCutAction":{"entryPoint":1025,"id":null,"parameterSlots":1,"returnSlots":0},"write_to_memory_address":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0},"write_to_memory_bytes4":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":0}},"generatedSources":[],"linkReferences":{},"object":"608060405261104a80380380610014816101ea565b9283398101906040818303126100b65780516001600160401b0381116100b65781019082601f830112156100b6578151916100566100518461020f565b6101ea565b9260208085838152019160051b830101918583116100b65760208101915b8383106100bb57505050506020810151926001600160401b0384116100b6576100a7936100a19201610278565b90610432565b60405161018a9081610ea08239f35b600080fd5b82516001600160401b0381116100b65782016060818903601f1901126100b6576100e36101a7565b906100f060208201610226565b8252604081015160038110156100b657602083015260608101516001600160401b0381116100b657602091010188601f820112156100b65780516101366100518261020f565b9160208084848152019260051b820101908b82116100b657602001915b818310610170575050506040820152815260209283019201610074565b82516001600160e01b0319811681036100b657815260209283019201610153565b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176101c657604052565b610191565b60408051919082016001600160401b038111838210176101c657604052565b6040519190601f01601f191682016001600160401b038111838210176101c657604052565b6001600160401b0381116101c65760051b60200190565b51906001600160a01b03821682036100b657565b6001600160401b0381116101c657601f01601f191660200190565b60005b8381106102685750506000910152565b8181015183820152602001610258565b81601f820112156100b6578051906102926100518361020f565b9260208085858152019360051b830101918183116100b65760208101935b8385106102bf57505050505090565b84516001600160401b0381116100b65782016040818503601f1901126100b6576102e76101cb565b906102f460208201610226565b825260408101516001600160401b0381116100b65760209101019184601f840112156100b6578251916103296100518461023a565b83815286602085870101116100b65761034c602095948695868085019101610255565b838201528152019401936102b0565b604090610367826101ea565b6001815291601f1901366020840137565b634e487b7160e01b600052603260045260246000fd5b80511561039b5760200190565b610378565b805182101561039b5760209160051b010190565b6040906103c0826101ea565b6001815291601f19018260005b8281106103d957505050565b6020906103e46101a7565b6000815260008382015260606040820152828285010152016103cd565b6003111561040b57565b634e487b7160e01b600052602160045260246000fd5b61042b60206101ea565b9060008252565b9190917f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e290610461818361069c565b835160005b81811061052657505061052492935060008051602061102a83398151915290602061049c6040519260608452606084019061055c565b600082840152600083820391826040860152520190a16104ba61035b565b6104d26104c68261038e565b63ba7fabfd60e01b9052565b6104da6103b4565b906104f8306104e88461038e565b516001600160a01b039091169052565b600060206105058461038e565b51015260406105138361038e565b51015261051e610421565b91610642565b565b6001906105566001600160a01b0361053e838a6103a0565b515116602061054d848b6103a0565b51015190610843565b01610466565b9080602083519182815201916020808360051b8301019401926000915b83831061058857505050505090565b9091929394601f198282030183528551606082019060018060a01b038151168352602081015190600382101561040b57604060809160209384870152015193606060408201528451809452019201906000905b8082106105fa5750505060208060019297019301930191939290610579565b82516001600160e01b0319168452602093840193909201916001909101906105db565b9060209161063681518092818552858086019101610255565b601f01601f1916010190565b9061069760008051602061102a83398151915293610663836106829561069c565b61066e816000610843565b60405193849360608552606085019061055c565b9060006020850152838203604085015261061d565b0390a1565b60018101906106b76106b0835461ffff1690565b61ffff1690565b9182600094600785166107cf575b80516000915b81831061072257505050830361070d575b50600782166106ea57505050565b60026106f961070a9360031c90565b910190600052602052604060002090565b55565b805461ffff191661ffff8416179055386106dc565b90919561072f87836103a0565b5190604082015151156107b057602082015161074a81610401565b61075381610401565b806107735750906001986107679288610d48565b9790965b0191906106cb565b806107836001929a94939a610401565b0361079a579061079560019288610c07565b61076b565b6001986107a892988861090d565b97909661076b565b815163b39ad1bb60e01b6000526001600160a01b031660045260246000fd5b94506107f16107de8560031c90565b6002850190600052602052604060002090565b54946106c5565b3d15610819573d9061080c6100518361023a565b9182523d6000602084013e565b606090565b6001600160a01b0390911681526040602082018190526108409291019061061d565b90565b906001600160a01b0382168061086e575090505161085d57565b6301cd29fb60e71b60005260046000fd5b8151156108f05730036108cc575b600080825160208401855af4906108916107f8565b911561089c57505050565b81519283156108ac575050602001fd5b6108c860405192839263e83ddca560e01b84526004840161081e565b0390fd5b813b61087c5763df3b7fa960e01b6000526001600160a01b03821660045260246000fd5b623ca88560ea1b6000526001600160a01b03831660045260246000fd5b8351919290916001600160a01b031680610bea5750600761092e8460031c90565b9316946000935b60408601518051861015610bd3576109508661095e926103a0565b516001600160e01b03191690565b9261097c84869063ffffffff60e01b16600052602052604060002090565b54976109c46109b86109b26109a4888a9063ffffffff60e01b16600052602052604060002090565b546001600160601b03191690565b60601c90565b6001600160a01b031690565b15610bb457306109f06109b86109b26109a4898b9063ffffffff60e01b16600052602052604060002090565b14610b955781610b855750506000190193610a18856002860190600052602052604060002090565b54926007975b6000610a72610a3e87610a318d60051b90565b1b63ffffffff60e01b1690565b6001600160e01b03198082169591908a9083168703610b26575b90509063ffffffff60e01b16600052602052604060002090565b55610a8e6007610a8661ffff841660031c90565b921660051b90565b818814610b0b5790610ad5916002880193610ab3838690600052602052604060002090565b5490821c9163ffffffff60e01b901c1916179290600052602052604060002090565b555b8615610ae7575b60010193610935565b91506000610b02856002860190600052602052604060002090565b55600091610ade565b6001600160e01b0319811c199095169190941c179250610ad7565b610b59610b4c6109a484610b7d949063ffffffff60e01b16600052602052604060002090565b6001600160601b03191690565b60018060601b03871617918b9063ffffffff60e01b16600052602052604060002090565b553889610a58565b6000190197919590939091610a1e565b6363c95ddd60e11b6000526001600160e01b0319851660045260246000fd5b630a82dd7360e31b6000526001600160e01b0319851660045260246000fd5b50919593509350610be5915060031b90565b179190565b6391a5e1a360e01b6000526001600160a01b031660045260246000fd5b81516001600160a01b031691823b15610d2a576040018051519190606084901b6001600160601b031916906001600160a01b0385169060005b858110610c505750505050505050565b610c5e6109508284516103a0565b6001600160e01b031981166000908152602087905260409020548060601c8015610d0b57308114610cec578514610cc0576001600160e01b03199091166000908152602087905260409020600192916001600160601b03168617905501610c40565b6373d5d79760e01b6000526001600160a01b0389166004526001600160e01b0319821660245260446000fd5b6363c95ddd60e11b6000526001600160e01b0319831660045260246000fd5b630a82dd7360e31b6000526001600160e01b0319831660045260246000fd5b63190c2f0160e11b6000526001600160a01b03831660045260246000fd5b835192949391926001600160a01b03163081141580610e96575b610e795750906040810191825151906000935b828510610d855750505050509190565b9091929394610d986109508784516103a0565b97610dbc6109b26109a48b879063ffffffff60e01b16600052602052604060002090565b6001600160a01b038116610e4e575085516001600160e01b03198a16600090815260208690526040902060e0929160601b6001600160601b03191684179055610e086007841660051b90565b9963ffffffff831b168a1c9063ffffffff831b8b1c1916179814610e37575b6001809101950193929190610d75565b96610e456107de8960031c90565b55600096610e27565b635f19e89b60e11b6000526001600160a01b03166004526001600160e01b0319891660245260446000fd5b63190c2f0160e11b6000526001600160a01b031660045260246000fd5b50803b15610d6256fe608060405260043610156100e9575b36156100bf577fffffffff0000000000000000000000000000000000000000000000000000000060003516806000527f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e260205260406000205460601c9081156100925760008083368280378136915af43d6000803e1561008d573d6000f35b3d6000fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7b5c32900000000000000000000000000000000000000000000000000000000060005260046000fd5b60003560e01c63ba7fabfd0361000e573461014f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f577f722d29b00acdf165bd4f9387f49041b6ff0b811414a43fd05527a13121fd7d34600080a1005b600080fdfea2646970667358221220fcc4c316a5d260841aa25258aca3d8d66f18edf6741dc0eefe77a1fb2b0aee6e64736f6c634300081e00338faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0x104A DUP1 CODESIZE SUB DUP1 PUSH2 0x14 DUP2 PUSH2 0x1EA JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH1 0x40 DUP2 DUP4 SUB SLT PUSH2 0xB6 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP2 ADD SWAP1 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP2 MLOAD SWAP2 PUSH2 0x56 PUSH2 0x51 DUP5 PUSH2 0x20F JUMP JUMPDEST PUSH2 0x1EA JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP4 ADD ADD SWAP2 DUP6 DUP4 GT PUSH2 0xB6 JUMPI PUSH1 0x20 DUP2 ADD SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0xBB JUMPI POP POP POP POP PUSH1 0x20 DUP2 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 GT PUSH2 0xB6 JUMPI PUSH2 0xA7 SWAP4 PUSH2 0xA1 SWAP3 ADD PUSH2 0x278 JUMP JUMPDEST SWAP1 PUSH2 0x432 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP1 DUP2 PUSH2 0xEA0 DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP3 ADD PUSH1 0x60 DUP2 DUP10 SUB PUSH1 0x1F NOT ADD SLT PUSH2 0xB6 JUMPI PUSH2 0xE3 PUSH2 0x1A7 JUMP JUMPDEST SWAP1 PUSH2 0xF0 PUSH1 0x20 DUP3 ADD PUSH2 0x226 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x3 DUP2 LT ISZERO PUSH2 0xB6 JUMPI PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI PUSH1 0x20 SWAP2 ADD ADD DUP9 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP1 MLOAD PUSH2 0x136 PUSH2 0x51 DUP3 PUSH2 0x20F JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP1 DUP5 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP12 DUP3 GT PUSH2 0xB6 JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x170 JUMPI POP POP POP PUSH1 0x40 DUP3 ADD MSTORE DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x74 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 SUB PUSH2 0xB6 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x153 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x60 DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x191 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 SWAP1 DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x1C6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x1C6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0xB6 JUMPI JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x1C6 JUMPI PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x268 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x258 JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP1 MLOAD SWAP1 PUSH2 0x292 PUSH2 0x51 DUP4 PUSH2 0x20F JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 DUP6 DUP6 DUP2 MSTORE ADD SWAP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP2 DUP2 DUP4 GT PUSH2 0xB6 JUMPI PUSH1 0x20 DUP2 ADD SWAP4 JUMPDEST DUP4 DUP6 LT PUSH2 0x2BF JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI DUP3 ADD PUSH1 0x40 DUP2 DUP6 SUB PUSH1 0x1F NOT ADD SLT PUSH2 0xB6 JUMPI PUSH2 0x2E7 PUSH2 0x1CB JUMP JUMPDEST SWAP1 PUSH2 0x2F4 PUSH1 0x20 DUP3 ADD PUSH2 0x226 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0xB6 JUMPI PUSH1 0x20 SWAP2 ADD ADD SWAP2 DUP5 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xB6 JUMPI DUP3 MLOAD SWAP2 PUSH2 0x329 PUSH2 0x51 DUP5 PUSH2 0x23A JUMP JUMPDEST DUP4 DUP2 MSTORE DUP7 PUSH1 0x20 DUP6 DUP8 ADD ADD GT PUSH2 0xB6 JUMPI PUSH2 0x34C PUSH1 0x20 SWAP6 SWAP5 DUP7 SWAP6 DUP7 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x255 JUMP JUMPDEST DUP4 DUP3 ADD MSTORE DUP2 MSTORE ADD SWAP5 ADD SWAP4 PUSH2 0x2B0 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH2 0x367 DUP3 PUSH2 0x1EA JUMP JUMPDEST PUSH1 0x1 DUP2 MSTORE SWAP2 PUSH1 0x1F NOT ADD CALLDATASIZE PUSH1 0x20 DUP5 ADD CALLDATACOPY JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x39B JUMPI PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x378 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x39B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH2 0x3C0 DUP3 PUSH2 0x1EA JUMP JUMPDEST PUSH1 0x1 DUP2 MSTORE SWAP2 PUSH1 0x1F NOT ADD DUP3 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x3D9 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x3E4 PUSH2 0x1A7 JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x3CD JUMP JUMPDEST PUSH1 0x3 GT ISZERO PUSH2 0x40B JUMPI JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x42B PUSH1 0x20 PUSH2 0x1EA JUMP JUMPDEST SWAP1 PUSH1 0x0 DUP3 MSTORE JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 SWAP1 PUSH2 0x461 DUP2 DUP4 PUSH2 0x69C JUMP JUMPDEST DUP4 MLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x526 JUMPI POP POP PUSH2 0x524 SWAP3 SWAP4 POP PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x102A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH1 0x20 PUSH2 0x49C PUSH1 0x40 MLOAD SWAP3 PUSH1 0x60 DUP5 MSTORE PUSH1 0x60 DUP5 ADD SWAP1 PUSH2 0x55C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 ADD MSTORE PUSH1 0x0 DUP4 DUP3 SUB SWAP2 DUP3 PUSH1 0x40 DUP7 ADD MSTORE MSTORE ADD SWAP1 LOG1 PUSH2 0x4BA PUSH2 0x35B JUMP JUMPDEST PUSH2 0x4D2 PUSH2 0x4C6 DUP3 PUSH2 0x38E JUMP JUMPDEST PUSH4 0xBA7FABFD PUSH1 0xE0 SHL SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x4DA PUSH2 0x3B4 JUMP JUMPDEST SWAP1 PUSH2 0x4F8 ADDRESS PUSH2 0x4E8 DUP5 PUSH2 0x38E JUMP JUMPDEST MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x505 DUP5 PUSH2 0x38E JUMP JUMPDEST MLOAD ADD MSTORE PUSH1 0x40 PUSH2 0x513 DUP4 PUSH2 0x38E JUMP JUMPDEST MLOAD ADD MSTORE PUSH2 0x51E PUSH2 0x421 JUMP JUMPDEST SWAP2 PUSH2 0x642 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 SWAP1 PUSH2 0x556 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x53E DUP4 DUP11 PUSH2 0x3A0 JUMP JUMPDEST MLOAD MLOAD AND PUSH1 0x20 PUSH2 0x54D DUP5 DUP12 PUSH2 0x3A0 JUMP JUMPDEST MLOAD ADD MLOAD SWAP1 PUSH2 0x843 JUMP JUMPDEST ADD PUSH2 0x466 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP2 DUP3 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x588 JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH1 0x1F NOT DUP3 DUP3 SUB ADD DUP4 MSTORE DUP6 MLOAD PUSH1 0x60 DUP3 ADD SWAP1 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP2 MLOAD AND DUP4 MSTORE PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x40B JUMPI PUSH1 0x40 PUSH1 0x80 SWAP2 PUSH1 0x20 SWAP4 DUP5 DUP8 ADD MSTORE ADD MLOAD SWAP4 PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0x5FA JUMPI POP POP POP PUSH1 0x20 DUP1 PUSH1 0x1 SWAP3 SWAP8 ADD SWAP4 ADD SWAP4 ADD SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x579 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x5DB JUMP JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH2 0x636 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP6 MSTORE DUP6 DUP1 DUP7 ADD SWAP2 ADD PUSH2 0x255 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x697 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x102A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP4 PUSH2 0x663 DUP4 PUSH2 0x682 SWAP6 PUSH2 0x69C JUMP JUMPDEST PUSH2 0x66E DUP2 PUSH1 0x0 PUSH2 0x843 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH1 0x60 DUP6 MSTORE PUSH1 0x60 DUP6 ADD SWAP1 PUSH2 0x55C JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD MSTORE DUP4 DUP3 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x61D JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SWAP1 PUSH2 0x6B7 PUSH2 0x6B0 DUP4 SLOAD PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP2 DUP3 PUSH1 0x0 SWAP5 PUSH1 0x7 DUP6 AND PUSH2 0x7CF JUMPI JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x722 JUMPI POP POP POP DUP4 SUB PUSH2 0x70D JUMPI JUMPDEST POP PUSH1 0x7 DUP3 AND PUSH2 0x6EA JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH2 0x6F9 PUSH2 0x70A SWAP4 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMP JUMPDEST DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0xFFFF DUP5 AND OR SWAP1 SSTORE CODESIZE PUSH2 0x6DC JUMP JUMPDEST SWAP1 SWAP2 SWAP6 PUSH2 0x72F DUP8 DUP4 PUSH2 0x3A0 JUMP JUMPDEST MLOAD SWAP1 PUSH1 0x40 DUP3 ADD MLOAD MLOAD ISZERO PUSH2 0x7B0 JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x74A DUP2 PUSH2 0x401 JUMP JUMPDEST PUSH2 0x753 DUP2 PUSH2 0x401 JUMP JUMPDEST DUP1 PUSH2 0x773 JUMPI POP SWAP1 PUSH1 0x1 SWAP9 PUSH2 0x767 SWAP3 DUP9 PUSH2 0xD48 JUMP JUMPDEST SWAP8 SWAP1 SWAP7 JUMPDEST ADD SWAP2 SWAP1 PUSH2 0x6CB JUMP JUMPDEST DUP1 PUSH2 0x783 PUSH1 0x1 SWAP3 SWAP11 SWAP5 SWAP4 SWAP11 PUSH2 0x401 JUMP JUMPDEST SUB PUSH2 0x79A JUMPI SWAP1 PUSH2 0x795 PUSH1 0x1 SWAP3 DUP9 PUSH2 0xC07 JUMP JUMPDEST PUSH2 0x76B JUMP JUMPDEST PUSH1 0x1 SWAP9 PUSH2 0x7A8 SWAP3 SWAP9 DUP9 PUSH2 0x90D JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH2 0x76B JUMP JUMPDEST DUP2 MLOAD PUSH4 0xB39AD1BB PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP5 POP PUSH2 0x7F1 PUSH2 0x7DE DUP6 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP6 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP5 PUSH2 0x6C5 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x819 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x80C PUSH2 0x51 DUP4 PUSH2 0x23A JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x840 SWAP3 SWAP2 ADD SWAP1 PUSH2 0x61D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP1 PUSH2 0x86E JUMPI POP SWAP1 POP MLOAD PUSH2 0x85D JUMPI JUMP JUMPDEST PUSH4 0x1CD29FB PUSH1 0xE7 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO PUSH2 0x8F0 JUMPI ADDRESS SUB PUSH2 0x8CC JUMPI JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD PUSH1 0x20 DUP5 ADD DUP6 GAS DELEGATECALL SWAP1 PUSH2 0x891 PUSH2 0x7F8 JUMP JUMPDEST SWAP2 ISZERO PUSH2 0x89C JUMPI POP POP POP JUMP JUMPDEST DUP2 MLOAD SWAP3 DUP4 ISZERO PUSH2 0x8AC JUMPI POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x8C8 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH4 0xE83DDCA5 PUSH1 0xE0 SHL DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x81E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP2 EXTCODESIZE PUSH2 0x87C JUMPI PUSH4 0xDF3B7FA9 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH3 0x3CA885 PUSH1 0xEA SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0xBEA JUMPI POP PUSH1 0x7 PUSH2 0x92E DUP5 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP4 AND SWAP5 PUSH1 0x0 SWAP4 JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD DUP1 MLOAD DUP7 LT ISZERO PUSH2 0xBD3 JUMPI PUSH2 0x950 DUP7 PUSH2 0x95E SWAP3 PUSH2 0x3A0 JUMP JUMPDEST MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x97C DUP5 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP8 PUSH2 0x9C4 PUSH2 0x9B8 PUSH2 0x9B2 PUSH2 0x9A4 DUP9 DUP11 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x60 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xBB4 JUMPI ADDRESS PUSH2 0x9F0 PUSH2 0x9B8 PUSH2 0x9B2 PUSH2 0x9A4 DUP10 DUP12 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST EQ PUSH2 0xB95 JUMPI DUP2 PUSH2 0xB85 JUMPI POP POP PUSH1 0x0 NOT ADD SWAP4 PUSH2 0xA18 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP3 PUSH1 0x7 SWAP8 JUMPDEST PUSH1 0x0 PUSH2 0xA72 PUSH2 0xA3E DUP8 PUSH2 0xA31 DUP14 PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SHL PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND SWAP6 SWAP2 SWAP1 DUP11 SWAP1 DUP4 AND DUP8 SUB PUSH2 0xB26 JUMPI JUMPDEST SWAP1 POP SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH2 0xA8E PUSH1 0x7 PUSH2 0xA86 PUSH2 0xFFFF DUP5 AND PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SWAP3 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST DUP2 DUP9 EQ PUSH2 0xB0B JUMPI SWAP1 PUSH2 0xAD5 SWAP2 PUSH1 0x2 DUP9 ADD SWAP4 PUSH2 0xAB3 DUP4 DUP7 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 DUP3 SHR SWAP2 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL SWAP1 SHR NOT AND OR SWAP3 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE JUMPDEST DUP7 ISZERO PUSH2 0xAE7 JUMPI JUMPDEST PUSH1 0x1 ADD SWAP4 PUSH2 0x935 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 PUSH2 0xB02 DUP6 PUSH1 0x2 DUP7 ADD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP2 PUSH2 0xADE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 SHR NOT SWAP1 SWAP6 AND SWAP2 SWAP1 SWAP5 SHR OR SWAP3 POP PUSH2 0xAD7 JUMP JUMPDEST PUSH2 0xB59 PUSH2 0xB4C PUSH2 0x9A4 DUP5 PUSH2 0xB7D SWAP5 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x60 SHL SUB DUP8 AND OR SWAP2 DUP12 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SSTORE CODESIZE DUP10 PUSH2 0xA58 JUMP JUMPDEST PUSH1 0x0 NOT ADD SWAP8 SWAP2 SWAP6 SWAP1 SWAP4 SWAP1 SWAP2 PUSH2 0xA1E JUMP JUMPDEST PUSH4 0x63C95DDD PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA82DD73 PUSH1 0xE3 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP6 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP6 SWAP4 POP SWAP4 POP PUSH2 0xBE5 SWAP2 POP PUSH1 0x3 SHL SWAP1 JUMP JUMPDEST OR SWAP2 SWAP1 JUMP JUMPDEST PUSH4 0x91A5E1A3 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0xD2A JUMPI PUSH1 0x40 ADD DUP1 MLOAD MLOAD SWAP2 SWAP1 PUSH1 0x60 DUP5 SWAP1 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT PUSH2 0xC50 JUMPI POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xC5E PUSH2 0x950 DUP3 DUP5 MLOAD PUSH2 0x3A0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP8 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH1 0x60 SHR DUP1 ISZERO PUSH2 0xD0B JUMPI ADDRESS DUP2 EQ PUSH2 0xCEC JUMPI DUP6 EQ PUSH2 0xCC0 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP8 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB AND DUP7 OR SWAP1 SSTORE ADD PUSH2 0xC40 JUMP JUMPDEST PUSH4 0x73D5D797 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x63C95DDD PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA82DD73 PUSH1 0xE3 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x190C2F01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 MLOAD SWAP3 SWAP5 SWAP4 SWAP2 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ADDRESS DUP2 EQ ISZERO DUP1 PUSH2 0xE96 JUMPI JUMPDEST PUSH2 0xE79 JUMPI POP SWAP1 PUSH1 0x40 DUP2 ADD SWAP2 DUP3 MLOAD MLOAD SWAP1 PUSH1 0x0 SWAP4 JUMPDEST DUP3 DUP6 LT PUSH2 0xD85 JUMPI POP POP POP POP POP SWAP2 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0xD98 PUSH2 0x950 DUP8 DUP5 MLOAD PUSH2 0x3A0 JUMP JUMPDEST SWAP8 PUSH2 0xDBC PUSH2 0x9B2 PUSH2 0x9A4 DUP12 DUP8 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xE4E JUMPI POP DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0xE0 SWAP3 SWAP2 PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE PUSH2 0xE08 PUSH1 0x7 DUP5 AND PUSH1 0x5 SHL SWAP1 JUMP JUMPDEST SWAP10 PUSH4 0xFFFFFFFF DUP4 SHL AND DUP11 SHR SWAP1 PUSH4 0xFFFFFFFF DUP4 SHL DUP12 SHR NOT AND OR SWAP9 EQ PUSH2 0xE37 JUMPI JUMPDEST PUSH1 0x1 DUP1 SWAP2 ADD SWAP6 ADD SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xD75 JUMP JUMPDEST SWAP7 PUSH2 0xE45 PUSH2 0x7DE DUP10 PUSH1 0x3 SHR SWAP1 JUMP JUMPDEST SSTORE PUSH1 0x0 SWAP7 PUSH2 0xE27 JUMP JUMPDEST PUSH4 0x5F19E89B PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP10 AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x190C2F01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0xD62 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0xE9 JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0xBF JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH1 0x0 MSTORE PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR SWAP1 DUP2 ISZERO PUSH2 0x92 JUMPI PUSH1 0x0 DUP1 DUP4 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY ISZERO PUSH2 0x8D JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7B5C329000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0xBA7FABFD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH32 0x722D29B00ACDF165BD4F9387F49041B6FF0B811414A43FD05527A13121FD7D34 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC 0xC4 0xC3 AND 0xA5 0xD2 PUSH1 0x84 BYTE LOG2 MSTORE PC 0xAC LOG3 0xD8 0xD6 PUSH16 0x18EDF6741DC0EEFE77A1FB2B0AEE6E64 PUSH20 0x6F6C634300081E00338FAA70878671CCD212D207 PUSH18 0xB795C50AF8FD3FF6CF27F4BDE57E5D4DE0AE 0xB6 PUSH20 0x0 ","sourceMap":"280:698:88:-:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;280:698:88;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;280:698:88;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;-1:-1:-1;;280:698:88;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;280:698:88;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;280:698:88;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;280:698:88;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;280:698:88;;;;;;:::o;:::-;-1:-1:-1;;;;;280:698:88;;;;;;-1:-1:-1;;280:698:88;;;;:::o;:::-;;;;;;;;-1:-1:-1;;280:698:88;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;-1:-1:-1;;280:698:88;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;280:698:88;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;280:698:88;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;-1:-1:-1;;280:698:88;;-1:-1:-1;280:698:88;;;;;;;;;:::o;:::-;;;;;:::i;:::-;-1:-1:-1;280:698:88;;-1:-1:-1;280:698:88;;;;;;;;;;;;;;;;;;;;-1:-1:-1;280:698:88;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;280:698:88;;:::o;409:476::-;;;;280:698;3061:4:54;;;;;:::i;:::-;280:698:88;;-1:-1:-1;3141:10:54;;;;;;280:698:88;;823:55;280:698;;;-1:-1:-1;;;;;;;;;;;280:698:88;3218:23:54;280:698:88;;;;;;;;;;;;:::i;:::-;-1:-1:-1;280:698:88;;;;-1:-1:-1;280:698:88;;;;;;;;;;3267:32:54;;;563:15:88;;:::i;:::-;588:53;;;;:::i;:::-;-1:-1:-1;;;280:698:88;;;588:53;675:17;;:::i;:::-;725:4;702:28;725:4;702:6;;;:::i;:::-;;-1:-1:-1;;;;;280:698:88;;;;;;702:28;-1:-1:-1;3218:23:54;740:6:88;;;:::i;:::-;;:13;280:698;;784:6;;;:::i;:::-;;:16;:28;280:698;;:::i;:::-;823:55;;:::i;:::-;409:476::o;3153:3:54:-;280:698:88;;3218:23:54;-1:-1:-1;;;;;3191:18:54;280:698:88;3191:18:54;;:::i;:::-;;280:698:88;;3218:23:54;:18;;;;:::i;:::-;;:23;;;;:::i;:::-;280:698:88;3130:9:54;;280:698:88;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;280:698:88;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;280:698:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;280:698:88;;;;:::o;2694:227:54:-;;280:698:88;-1:-1:-1;;;;;;;;;;;2694:227:54;2822:4;2694:227;280:698:88;2694:227:54;2822:4;:::i;:::-;2864;;280:698:88;2864:4:54;:::i;:::-;280:698:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2884:30:54;;;2694:227::o;3312:1399::-;3429:15;;;280:698:88;3397:47:54;280:698:88;;;;;;;;;;;;3397:47:54;;;-1:-1:-1;3595:17:54;3611:1;3595:17;;3591:139;;3312:1399;280:698:88;;-1:-1:-1;3783:647:54;3799:10;;;;;;4444:38;;;;;4440:108;;3783:647;4607:17;3611:1;4607:17;;4603:102;;3312:1399;;;:::o;4603:102::-;4644:15;4660:18;4644:35;4660:18;280:698:88;;;;4660:18:54;4644:15;;280:698:88;;;;;;;;;;4644:35:54;280:698:88;3312:1399:54:o;4440:108::-;280:698:88;;-1:-1:-1;;280:698:88;;;;;;;4440:108:54;;;3811:3;3857:12;;;;;;;:::i;:::-;;3888:18;;;;;280:698:88;3888:30:54;3884:69;;3992:15;;;280:698:88;;;;:::i;:::-;;;;:::i;:::-;4025:28:54;;;4105:58;;3429:15;4105:58;;;;;:::i;:::-;4073:90;;4021:399;;280:698:88;3788:9:54;;;;4021:399;280:698:88;;3429:15:54;280:698:88;;;;;;:::i;:::-;4188:32:54;3429:15;;4264:8;;3429:15;4264:8;;;:::i;:::-;4021:399;;4184:236;3429:15;4344:61;;;;;;:::i;:::-;4312:93;;4184:236;4021:399;;3884:69;280:698:88;;-1:-1:-1;;;;3927:26:54;-1:-1:-1;;;;;280:698:88;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;3591:139;3700:18;;3684:35;3700:18;;280:698:88;;;;3700:18:54;3684:15;;;280:698:88;;;;;;;;;;3684:35:54;280:698:88;3591:139:54;;;280:698:88;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;280:698:88;;;;:::o;:::-;;;:::o;:::-;-1:-1:-1;;;;;280:698:88;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;10242:893:54:-;;-1:-1:-1;;;;;280:698:88;;10328:20:54;;;280:698:88;;;;10364:71:54;;10242:893::o;10364:71::-;10393:42;;;10346:1;10393:42;;10346:1;10393:42;10324:805;280:698:88;;10470:16:54;10466:54;;10556:4;10538:23;10534:129;;10324:805;10346:1;10719:25;;;;;;;;;;;;:::i;:::-;10762:8;;10758:361;;10324:805;;;10242:893::o;10758:361::-;280:698:88;;;10856:21:54;;;;10901:102;;10719:25;10901:102;;10852:253;11056:30;280:698:88;;11056:30:54;;;;;;;;;;;;:::i;:::-;;;;10534:129;376:58:354;;10534:129:54;10581:67;-1:-1:-1;;;10346:1:54;10615:33;-1:-1:-1;;;;;280:698:88;;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;10466:54;-1:-1:-1;;;10346:1:54;10495:25;-1:-1:-1;;;;;280:698:88;;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;6135:3203;280:698:88;;6135:3203:54;;;;-1:-1:-1;;;;;280:698:88;;6338:88:54;;6465:18;6539:1;6465:18;;280:698:88;;;;6465:18:54;6523:17;;6556:9;280:698:88;6551:2661:54;6598:3;6571:18;;;;280:698:88;;6567:29:54;;;;;6635:21;;;;;:::i;:::-;280:698:88;-1:-1:-1;;;;;;280:698:88;;;6635:21:54;6689:25;;;;280:698:88;;;;;;;;;;;;;;6689:25:54;280:698:88;6749:25:54;6733:57;:43;6741:34;6749:25;;;280:698:88;;;;;;;;;;;;;;6749:25:54;280:698:88;-1:-1:-1;;;;;;280:698:88;;;6741:34:54;280:698:88;;;;6733:43:54;-1:-1:-1;;;;;280:698:88;;;6733:57:54;;6729:96;;6898:4;6843:60;:43;6851:34;6859:25;;;280:698:88;;;;;;;;;;;;;;6843:60:54;;6839:109;;6967:17;;;280:698:88;;;;;7106:15:54;:34;:15;;;;280:698:88;;;;;;;;;;7106:34:54;280:698:88;7158:23:54;6539:1;6963:343;;280:698:88;7941:25:54;7609:50;7633:24;;;280:698:88;;;;7633:24:54;280:698:88;;;;;;;7609:50:54;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;7682:24:54;;7678:238;;6963:343;7941:25;;280:698:88;;;;;;;;;;;;;;7941:25:54;1857:44;8145:27;6539:1;8078:21;280:698:88;;;;;;;8078:21:54;8146:20;;280:698:88;;;;8145:27:54;8205:42;;;;;8293:15;8686:38;8293:15;;;;:38;;;;280:698:88;;;;;;;;;;8293:38:54;280:698:88;;;;;;;;;;8503:51:54;8485:69;8484:126;8686:38;280:698:88;;;;;;;;;;8686:38:54;280:698:88;8201:849:54;9068:24;;9064:138;;8201:849;280:698:88;;;6556:9:54;;9064:138;9119:15;;280:698:88;9119:34:54;:15;;;;280:698:88;;;;;;;;;;9119:34:54;1857:44;280:698:88;;9064:138:54;;8201:849;-1:-1:-1;;;;;;280:698:88;;8928:51:54;8913:66;;;280:698:88;;;;8912:123:54;;-1:-1:-1;8201:849:54;;7678:238;7825:72;7859:38;7867:29;;7793;7867;280:698:88;;;;;;;;;;;;;;7859:38:54;-1:-1:-1;;;;;;280:698:88;;;7825:72:54;280:698:88;;;;;7826:29:54;;7825:72;7793:29;;280:698:88;;;;;;;;;;;;;;7793:29:54;280:698:88;7678:238:54;;;;6963:343;-1:-1:-1;;280:698:88;;;;;;;;6963:343:54;;6839:109;-1:-1:-1;;;280:698:88;6912:36:54;-1:-1:-1;;;;;;280:698:88;;6799:26:54;280:698:88;;-1:-1:-1;3927:26:54;6729:96;-1:-1:-1;;;280:698:88;6799:26:54;-1:-1:-1;;;;;;280:698:88;;6799:26:54;280:698:88;;-1:-1:-1;3927:26:54;6567:29;;;;;;;;9239:22;6567:29;;280:698:88;;;;9239:22:54;9238:46;9295:36;6135:3203;:::o;6338:88::-;-1:-1:-1;;;280:698:88;6379:47:54;-1:-1:-1;;;;;280:698:88;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;9344:892;280:698:88;;-1:-1:-1;;;;;280:698:88;9483:19:54;376:58:354;;450:9;9478:65:54;;9571:18;;;;280:698:88;;9571:18:54;280:698:88;;;;-1:-1:-1;;;;;;280:698:88;;-1:-1:-1;;;;;280:698:88;;;-1:-1:-1;9622:10:54;;;;;;9344:892;;;;;;;:::o;9634:3::-;9671:21;;:18;;;:21;:::i;:::-;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;;;;;;;;9835:29:54;;9831:68;;9944:4;9917:32;;9913:81;;10012:24;;10008:79;;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10172:29:54;10171:48;;;280:698:88;;9611:9:54;;10008:79;-1:-1:-1;;;;10045:42:54;-1:-1:-1;;;;;280:698:88;;10045:42:54;280:698:88;-1:-1:-1;;;;;;280:698:88;;;;;-1:-1:-1;3927:26:54;9913:81;-1:-1:-1;;;;9958:36:54;-1:-1:-1;;;;;;280:698:88;;6799:26:54;280:698:88;;-1:-1:-1;3927:26:54;9831:68;-1:-1:-1;;;;9873:26:54;-1:-1:-1;;;;;;280:698:88;;6799:26:54;280:698:88;;-1:-1:-1;3927:26:54;9478:65;-1:-1:-1;;;9454:14:54;9511:32;-1:-1:-1;;;;;280:698:88;;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;4717:1412;280:698:88;;4717:1412:54;;;;;-1:-1:-1;;;;;280:698:88;4947:4:54;4921:31;;;;:64;;4717:1412;4917:109;;5054:18;;;;;;;;280:698:88;5094:9:54;280:698:88;5089:987:54;5105:10;;;;;;6086:36;;;;;;4717:1412;:::o;5117:3::-;5154:18;;;;;:21;;:18;;;:21;:::i;:::-;5231:25;5215:43;5223:34;5231:25;;;280:698:88;;;;;;;;;;;;;;5215:43:54;-1:-1:-1;;;;;280:698:88;;5273:91:54;;-1:-1:-1;280:698:88;;-1:-1:-1;;;;;;280:698:88;;;;;;;;;;;;;5872:3:54;;;280:698:88;;-1:-1:-1;;;;;;280:698:88;5445:48:54;;;280:698:88;5540:24:54;5557:1;5541:17;;280:698:88;;;;5540:24:54;280:698:88;;;;;;;;;;;;;5674:48:54;5659:63;5658:113;5846:29;;5842:152;;5117:3;280:698:88;;;;5117:3:54;280:698:88;5094:9:54;;;;;;5842:152;5911:18;5895:35;5911:18;;280:698:88;;;;5895:35:54;280:698:88;;;5842:152:54;;5273:91;-1:-1:-1;;;280:698:88;5315:49:54;-1:-1:-1;;;;;280:698:88;10045:42:54;280:698:88;-1:-1:-1;;;;;;280:698:88;;;;;-1:-1:-1;3927:26:54;4917:109;-1:-1:-1;;;280:698:88;4994:32:54;-1:-1:-1;;;;;280:698:88;3927:26:54;280:698:88;;-1:-1:-1;3927:26:54;4921:64;-1:-1:-1;376:58:354;;450:9;4921:64:54;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"608060405260043610156100e9575b36156100bf577fffffffff0000000000000000000000000000000000000000000000000000000060003516806000527f65d27473a5b05206737961f69a3b7a55316862d7a6ef82b3f5455fe92fab43e260205260406000205460601c9081156100925760008083368280378136915af43d6000803e1561008d573d6000f35b3d6000fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7b5c32900000000000000000000000000000000000000000000000000000000060005260046000fd5b60003560e01c63ba7fabfd0361000e573461014f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014f577f722d29b00acdf165bd4f9387f49041b6ff0b811414a43fd05527a13121fd7d34600080a1005b600080fdfea2646970667358221220fcc4c316a5d260841aa25258aca3d8d66f18edf6741dc0eefe77a1fb2b0aee6e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0xE9 JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0xBF JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH1 0x0 MSTORE PUSH32 0x65D27473A5B05206737961F69A3B7A55316862D7A6EF82B3F5455FE92FAB43E2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x60 SHR SWAP1 DUP2 ISZERO PUSH2 0x92 JUMPI PUSH1 0x0 DUP1 DUP4 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY ISZERO PUSH2 0x8D JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5416EB9800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7B5C329000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR PUSH4 0xBA7FABFD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x14F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x14F JUMPI PUSH32 0x722D29B00ACDF165BD4F9387F49041B6FF0B811414A43FD05527A13121FD7D34 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC 0xC4 0xC3 AND 0xA5 0xD2 PUSH1 0x84 BYTE LOG2 MSTORE PC 0xAC LOG3 0xD8 0xD6 PUSH16 0x18EDF6741DC0EEFE77A1FB2B0AEE6E64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"280:698:88:-:0;;;;;;;;;-1:-1:-1;280:698:88;;;;11224:7:54;-1:-1:-1;11224:7:54;;280:698:88;-1:-1:-1;280:698:88;;;;;-1:-1:-1;280:698:88;;;;11295:19:54;;;11291:58;;-1:-1:-1;280:698:88;;;11359:381:54;;;280:698:88;;11359:381:54;;;;-1:-1:-1;11359:381:54;;;;;;-1:-1:-1;11359:381:54;;;-1:-1:-1;11359:381:54;11291:58;11323:26;-1:-1:-1;11323:26:54;280:698:88;;;-1:-1:-1;11323:26:54;280:698:88;1276:24:45;;;280:698:88;1276:24:45;;280:698:88;;;;;;;;;;;;;;;;;;;944:25;280:698;944:25;;280:698;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"78800","executionCost":"infinite","totalCost":"infinite"},"external":{"":"infinite","immutableFunction()":"875"}},"methodIdentifiers":{"immutableFunction()":"ba7fabfd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Initialization[]\",\"name\":\"initializations\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"EmptyFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"EmptyInitCallData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherReceptionDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionAlreadyPresent\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"FunctionNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"InitCallReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ModifyingImmutableFunction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"NonContractFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"NonContractInitCallTarget\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"}],\"name\":\"RemovingWithNonZeroAddressFacet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"ReplacingFunctionByItself\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressTargetInitCallButNonEmptyData\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"facet\",\"type\":\"address\"},{\"internalType\":\"enum FacetCutAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"bytes4[]\",\"name\":\"selectors\",\"type\":\"bytes4[]\"}],\"indexed\":false,\"internalType\":\"struct FacetCut[]\",\"name\":\"cuts\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DiamondCut\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ImmutableFunctionCalled\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"immutableFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"EmptyFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"EmptyInitCallData(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address which already has the function.\",\"selector\":\"The function selector which has already been added.\"}}],\"FunctionNotFound(bytes4)\":[{\"params\":{\"selector\":\"The function selector which has not been added.\"}}],\"InitCallReverted(address,bytes)\":[{\"params\":{\"data\":\"The data for the initialization call.\",\"target\":\"The target address for the initialization call.\"}}],\"ModifyingImmutableFunction(bytes4)\":[{\"params\":{\"selector\":\"The function selector which is immutable.\"}}],\"NonContractFacet(address)\":[{\"params\":{\"facet\":\"The facet address.\"}}],\"NonContractInitCallTarget(address)\":[{\"params\":{\"target\":\"The target address for the initialization call.\"}}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"params\":{\"facet\":\"The facet address which is not zero.\"}}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"params\":{\"facet\":\"The facet address.\",\"selector\":\"The function selector.\"}}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"params\":{\"cuts\":\"The list of facet addresses, actions and function selectors applied to the diamond.\",\"data\":\"The encoded function call executed on `target`.\",\"target\":\"The address of the contract where `data` was executed.\"}}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"EmptyFacet(address)\":[{\"notice\":\"Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\"}],\"EmptyInitCallData(address)\":[{\"notice\":\"Thrown when trying to call an initialization function with a target and empty data.\"}],\"EtherReceptionDisabled()\":[{\"notice\":\"Thrown when trying to transfer tokens without calldata to the contract.\"}],\"FunctionAlreadyPresent(address,bytes4)\":[{\"notice\":\"Thrown when trying to add a function selector that has already been added.\"}],\"FunctionNotFound(bytes4)\":[{\"notice\":\"Thrown when trying to execute, remove or replace a function selector that has not been added.\"}],\"InitCallReverted(address,bytes)\":[{\"notice\":\"Thrown when trying to call an initialization function which reverts without return data.\"}],\"ModifyingImmutableFunction(bytes4)\":[{\"notice\":\"Thrown when trying to remove or replace an immutable function.\"}],\"NonContractFacet(address)\":[{\"notice\":\"Thrown when trying to add or replace a facet which is not a deployed contract.\"}],\"NonContractInitCallTarget(address)\":[{\"notice\":\"Thrown when trying to call an initialization function on a non-contract address.\"}],\"RemovingWithNonZeroAddressFacet(address)\":[{\"notice\":\"Thrown when trying to remove function selectors with a non-zero facet address.\"}],\"ReplacingFunctionByItself(address,bytes4)\":[{\"notice\":\"Thrown when trying to replace a function with itself (from the same facet).\"}],\"ZeroAddressTargetInitCallButNonEmptyData()\":[{\"notice\":\"Thrown when trying to call an initialization function with a zero address target and non-empty data.\"}]},\"events\":{\"DiamondCut((address,uint8,bytes4[])[],address,bytes)\":{\"notice\":\"Emitted when at least a cut action is operated on the diamond.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/diamond/DiamondMock.sol\":\"DiamondMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/diamond/Diamond.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {EtherReceptionDisabled} from \\\"./../CommonErrors.sol\\\";\\nimport {FacetCut, Initialization} from \\\"./DiamondCommon.sol\\\";\\nimport {DiamondStorage} from \\\"./libraries/DiamondStorage.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\ncontract Diamond {\\n    using DiamondStorage for DiamondStorage.Layout;\\n\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    constructor(FacetCut[] memory cuts, Initialization[] memory initializations) payable {\\n        DiamondStorage.layout().diamondCut(cuts, initializations);\\n    }\\n\\n    /// @notice Execute a function from a facet with delegatecall.\\n    /// @dev Reverts with {FunctionNotFound} if the function selector is not found.\\n    fallback() external payable {\\n        DiamondStorage.layout().delegateOnFallback();\\n    }\\n\\n    receive() external payable virtual {\\n        revert EtherReceptionDisabled();\\n    }\\n}\\n\",\"keccak256\":\"0x25be70e9c211ccf4b1105e81f879a6a98818307bd88b8185b72837a1dcaee9f4\",\"license\":\"MIT\"},\"contracts/diamond/DiamondCommon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nstruct Facet {\\n    address facet;\\n    bytes4[] selectors;\\n}\\n\\nenum FacetCutAction {\\n    ADD,\\n    REPLACE,\\n    REMOVE\\n}\\n// Add=0, Replace=1, Remove=2\\n\\nstruct FacetCut {\\n    address facet;\\n    FacetCutAction action;\\n    bytes4[] selectors;\\n}\\n\\nstruct Initialization {\\n    address target;\\n    bytes data;\\n}\\n\",\"keccak256\":\"0xf97568d4b519de84cbd2cb923ef8ac8b0d4b1e364948fc42237fe2a6b0833d6e\",\"license\":\"MIT\"},\"contracts/diamond/errors/DiamondErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to cut (add/replace/remove) a facet with no function selectors.\\n/// @param facet The facet address.\\nerror EmptyFacet(address facet);\\n\\n/// @notice Thrown when trying to add or replace a facet which is not a deployed contract.\\n/// @param facet The facet address.\\nerror NonContractFacet(address facet);\\n\\n/// @notice Thrown when trying to add a function selector that has already been added.\\n/// @param facet The facet address which already has the function.\\n/// @param selector The function selector which has already been added.\\nerror FunctionAlreadyPresent(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to remove function selectors with a non-zero facet address.\\n/// @param facet The facet address which is not zero.\\nerror RemovingWithNonZeroAddressFacet(address facet);\\n\\n/// @notice Thrown when trying to execute, remove or replace a function selector that has not been added.\\n/// @param selector The function selector which has not been added.\\nerror FunctionNotFound(bytes4 selector);\\n\\n/// @notice Thrown when trying to remove or replace an immutable function.\\n/// @param selector The function selector which is immutable.\\nerror ModifyingImmutableFunction(bytes4 selector);\\n\\n/// @notice Thrown when trying to replace a function with itself (from the same facet).\\n/// @param facet The facet address.\\n/// @param selector The function selector.\\nerror ReplacingFunctionByItself(address facet, bytes4 selector);\\n\\n/// @notice Thrown when trying to call an initialization function with a zero address target and non-empty data.\\nerror ZeroAddressTargetInitCallButNonEmptyData();\\n\\n/// @notice Thrown when trying to call an initialization function with a target and empty data.\\n/// @param target The target address for the initialization call.\\nerror EmptyInitCallData(address target);\\n\\n/// @notice Thrown when trying to call an initialization function on a non-contract address.\\n/// @param target The target address for the initialization call.\\nerror NonContractInitCallTarget(address target);\\n\\n/// @notice Thrown when trying to call an initialization function which reverts without return data.\\n/// @param target The target address for the initialization call.\\n/// @param data The data for the initialization call.\\nerror InitCallReverted(address target, bytes data);\\n\",\"keccak256\":\"0x2647bd9f06a6b0d435b142d7fc15e13c51e31217822b01a3f598b7c40edb9e20\",\"license\":\"MIT\"},\"contracts/diamond/events/DiamondCutEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @notice Emitted when at least a cut action is operated on the diamond.\\n/// @param cuts The list of facet addresses, actions and function selectors applied to the diamond.\\n/// @param target The address of the contract where `data` was executed.\\n/// @param data The encoded function call executed on `target`.\\nevent DiamondCut(FacetCut[] cuts, address target, bytes data);\\n\",\"keccak256\":\"0x74988038bb78c2fba84434628255bd30f1282dd7e6a59ef3849cb40786428aea\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCut.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Cut (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x1f931c1c\\ninterface IDiamondCut {\\n    /// @notice Add/replace/remove facet functions and optionally execute a function with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param target The address of the contract to execute `data` on.\\n    /// @param data The encoded function call to execute on `target`.\\n    function diamondCut(FacetCut[] calldata cuts, address target, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x262bfc29d8826254a1d00130b47998febf2ee0c17953b9bc0daf0ab549979bb7\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondCutBatchInit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERCXXX Diamond Standard, Diamond Cut Batch Init extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-XXXX\\n/// @dev Note: the ERC-165 identifier for this interface is 0xb2afc5b5\\ninterface IDiamondCutBatchInit {\\n    /// @notice Add/replace/remove facet functions and execute a batch of functions with delegatecall.\\n    /// @dev Emits a {DiamondCut} event.\\n    /// @param cuts The list of facet addresses, actions and function selectors to apply to the diamond.\\n    /// @param initializations The list of addresses and encoded function calls to execute with delegatecall.\\n    function diamondCut(FacetCut[] calldata cuts, Initialization[] calldata initializations) external;\\n}\\n\",\"keccak256\":\"0x4216a37daac87cbe20a4cbe8267b944d0c07b97a866df3d798429bac85497c16\",\"license\":\"MIT\"},\"contracts/diamond/interfaces/IDiamondLoupe.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\nimport {Facet} from \\\"./../DiamondCommon.sol\\\";\\n\\n/// @title ERC2535 Diamond Standard, Diamond Loupe.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2535\\n/// @dev Note: the ERC-165 identifier for this interface is 0x48e2b093\\ninterface IDiamondLoupe {\\n    /// @notice Gets all the facet addresses used by the diamond and their function selectors.\\n    /// @return diamondFacets The facet addresses used by the diamond and their function selectors.\\n    function facets() external view returns (Facet[] memory diamondFacets);\\n\\n    /// @notice Gets all the function selectors supported by a facet.\\n    /// @param facetAddress The facet address.\\n    /// @return selectors The function selectors supported by `facet`.\\n    function facetFunctionSelectors(address facetAddress) external view returns (bytes4[] memory selectors);\\n\\n    /// @notice Get all the facet addresses used by the diamond.\\n    /// @return diamondFacetsAddresses The facet addresses used by the diamond.\\n    function facetAddresses() external view returns (address[] memory diamondFacetsAddresses);\\n\\n    /// @notice Gets the facet address that supports a given function selector.\\n    /// @param functionSelector The function selector.\\n    /// @return diamondFacetAddress The facet address that supports `functionSelector`, or the zero address if the facet is not found.\\n    function facetAddress(bytes4 functionSelector) external view returns (address diamondFacetAddress);\\n}\\n\",\"keccak256\":\"0x996392120806d2e3ebf0b5df39b6976b4eaf6aad93805a7b8bb0b043af88780c\",\"license\":\"MIT\"},\"contracts/diamond/libraries/DiamondStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    EmptyFacet,\\n    NonContractFacet,\\n    FunctionAlreadyPresent,\\n    RemovingWithNonZeroAddressFacet,\\n    FunctionNotFound,\\n    ModifyingImmutableFunction,\\n    ReplacingFunctionByItself,\\n    ZeroAddressTargetInitCallButNonEmptyData,\\n    EmptyInitCallData,\\n    NonContractInitCallTarget,\\n    InitCallReverted\\n} from \\\"./../errors/DiamondErrors.sol\\\";\\nimport {Facet, FacetCutAction, FacetCut, Initialization} from \\\"./../DiamondCommon.sol\\\";\\nimport {DiamondCut} from \\\"./../events/DiamondCutEvents.sol\\\";\\nimport {IDiamondCut} from \\\"./../interfaces/IDiamondCut.sol\\\";\\nimport {IDiamondCutBatchInit} from \\\"./../interfaces/IDiamondCutBatchInit.sol\\\";\\nimport {IDiamondLoupe} from \\\"./../interfaces/IDiamondLoupe.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @dev derived from https://github.com/mudgen/diamond-2 (MIT licence) and https://github.com/solidstate-network/solidstate-solidity (MIT licence)\\nlibrary DiamondStorage {\\n    using Address for address;\\n    using DiamondStorage for DiamondStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        // selector => (facet address, selector slot position)\\n        mapping(bytes4 => bytes32) diamondFacets;\\n        // number of selectors registered in selectorSlots\\n        uint16 selectorCount;\\n        // array of selector slots with 8 selectors per slot\\n        mapping(uint256 => bytes32) selectorSlots;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.Diamond.storage\\\")) - 1);\\n\\n    bytes32 internal constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff));\\n    bytes32 internal constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondCut, DiamondCutBatchInit.\\n    function initDiamondCut() internal {\\n        InterfaceDetectionStorage.Layout storage interfaceDetectionLayout = InterfaceDetectionStorage.layout();\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCut).interfaceId, true);\\n        interfaceDetectionLayout.setSupportedInterface(type(IDiamondCutBatchInit).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: DiamondLoupe.\\n    function initDiamondLoupe() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IDiamondLoupe).interfaceId, true);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, address target, bytes memory data) internal {\\n        s.cutFacets(cuts);\\n        initializationCall(target, data);\\n        emit DiamondCut(cuts, target, data);\\n    }\\n\\n    function diamondCut(Layout storage s, FacetCut[] memory cuts, Initialization[] memory initializations) internal {\\n        s.cutFacets(cuts);\\n        uint256 length = initializations.length;\\n        for (uint256 i; i < length; ++i) {\\n            initializationCall(initializations[i].target, initializations[i].data);\\n        }\\n        emit DiamondCut(cuts, address(0), \\\"\\\");\\n    }\\n\\n    function cutFacets(Layout storage s, FacetCut[] memory facetCuts) internal {\\n        uint256 originalSelectorCount = s.selectorCount;\\n        uint256 selectorCount = originalSelectorCount;\\n        bytes32 selectorSlot;\\n\\n        // Check if last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            // get last selectorSlot\\n            selectorSlot = s.selectorSlots[selectorCount >> 3];\\n        }\\n\\n        uint256 length = facetCuts.length;\\n        for (uint256 i; i < length; ++i) {\\n            FacetCut memory facetCut = facetCuts[i];\\n\\n            if (facetCut.selectors.length == 0) revert EmptyFacet(facetCut.facet);\\n\\n            FacetCutAction action = facetCut.action;\\n            if (action == FacetCutAction.ADD) {\\n                (selectorCount, selectorSlot) = s.addFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            } else if (action == FacetCutAction.REPLACE) {\\n                s.replaceFacetSelectors(facetCut);\\n            } else {\\n                (selectorCount, selectorSlot) = s.removeFacetSelectors(selectorCount, selectorSlot, facetCut);\\n            }\\n        }\\n\\n        if (selectorCount != originalSelectorCount) {\\n            s.selectorCount = uint16(selectorCount);\\n        }\\n\\n        // If last selector slot is not full\\n        if (selectorCount & 7 > 0) {\\n            s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n        }\\n    }\\n\\n    function addFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(this) && !facetCut.facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            address oldFacetAddress = address(bytes20(s.diamondFacets[selector]));\\n\\n            if (oldFacetAddress != address(0)) revert FunctionAlreadyPresent(oldFacetAddress, selector);\\n\\n            // add facet for selector\\n            s.diamondFacets[selector] = bytes20(facetCut.facet) | bytes32(selectorCount);\\n            uint256 selectorInSlotPosition = (selectorCount & 7) << 5;\\n\\n            // clear selector position in slot and add selector\\n            selectorSlot = (selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition);\\n\\n            // if slot is full then write it to storage\\n            if (selectorInSlotPosition == 224) {\\n                s.selectorSlots[selectorCount >> 3] = selectorSlot;\\n                selectorSlot = 0;\\n            }\\n\\n            unchecked {\\n                ++selectorCount;\\n            }\\n        }\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function removeFacetSelectors(\\n        Layout storage s,\\n        uint256 selectorCount,\\n        bytes32 selectorSlot,\\n        FacetCut memory facetCut\\n    ) internal returns (uint256, bytes32) {\\n        if (facetCut.facet != address(0)) revert RemovingWithNonZeroAddressFacet(facetCut.facet);\\n\\n        uint256 selectorSlotCount = selectorCount >> 3;\\n        uint256 selectorInSlotIndex = selectorCount & 7;\\n\\n        for (uint256 i; i < facetCut.selectors.length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n\\n            if (address(bytes20(s.diamondFacets[selector])) == address(0)) revert FunctionNotFound(selector);\\n            if (address(bytes20(s.diamondFacets[selector])) == address(this)) revert ModifyingImmutableFunction(selector);\\n\\n            if (selectorSlot == 0) {\\n                unchecked {\\n                    selectorSlotCount--;\\n                }\\n                selectorSlot = s.selectorSlots[selectorSlotCount];\\n                selectorInSlotIndex = 7;\\n            } else {\\n                unchecked {\\n                    selectorInSlotIndex--;\\n                }\\n            }\\n\\n            bytes4 lastSelector;\\n            uint256 oldSelectorsSlotCount;\\n            uint256 oldSelectorInSlotPosition;\\n\\n            // adding a block here prevents stack too deep error\\n            {\\n                // replace selector with last selector in l.facets\\n                lastSelector = bytes4(selectorSlot << (selectorInSlotIndex << 5));\\n\\n                if (lastSelector != selector) {\\n                    // update last selector slot position info\\n                    s.diamondFacets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(s.diamondFacets[lastSelector]);\\n                }\\n\\n                delete s.diamondFacets[selector];\\n                uint256 oldSelectorCount = uint16(uint256(oldFacet));\\n                oldSelectorsSlotCount = oldSelectorCount >> 3;\\n                oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;\\n            }\\n\\n            if (oldSelectorsSlotCount != selectorSlotCount) {\\n                bytes32 oldSelectorSlot = s.selectorSlots[oldSelectorsSlotCount];\\n\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                oldSelectorSlot =\\n                    (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n\\n                // update storage with the modified slot\\n                s.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;\\n            } else {\\n                // clears the selector we are deleting and puts the last selector in its place.\\n                selectorSlot =\\n                    (selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition);\\n            }\\n\\n            if (selectorInSlotIndex == 0) {\\n                delete s.selectorSlots[selectorSlotCount];\\n                selectorSlot = 0;\\n            }\\n        }\\n\\n        selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;\\n\\n        return (selectorCount, selectorSlot);\\n    }\\n\\n    function replaceFacetSelectors(Layout storage s, FacetCut memory facetCut) internal {\\n        address facet = facetCut.facet;\\n        if (!facet.hasBytecode()) revert NonContractFacet(facetCut.facet);\\n\\n        uint256 length = facetCut.selectors.length;\\n        for (uint256 i; i < length; ++i) {\\n            bytes4 selector = facetCut.selectors[i];\\n            bytes32 oldFacet = s.diamondFacets[selector];\\n            address oldFacetAddress = address(bytes20(oldFacet));\\n\\n            if (oldFacetAddress == address(0)) revert FunctionNotFound(selector);\\n            if (oldFacetAddress == address(this)) revert ModifyingImmutableFunction(selector);\\n            if (oldFacetAddress == facet) revert ReplacingFunctionByItself(facet, selector);\\n\\n            // replace old facet address\\n            s.diamondFacets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(facet);\\n        }\\n    }\\n\\n    function initializationCall(address target, bytes memory data) internal {\\n        if (target == address(0)) {\\n            if (data.length != 0) revert ZeroAddressTargetInitCallButNonEmptyData();\\n        } else {\\n            if (data.length == 0) revert EmptyInitCallData(target);\\n            if (target != address(this)) {\\n                if (!target.hasBytecode()) revert NonContractInitCallTarget(target);\\n            }\\n\\n            (bool success, bytes memory returndata) = target.delegatecall(data);\\n            if (!success) {\\n                uint256 returndataLength = returndata.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, returndata), returndataLength)\\n                    }\\n                } else {\\n                    revert InitCallReverted(target, data);\\n                }\\n            }\\n        }\\n    }\\n\\n    function delegateOnFallback(Layout storage s) internal {\\n        bytes4 selector = msg.sig;\\n        address facet = s.facetAddress(selector);\\n        if (facet == address(0)) revert FunctionNotFound(selector);\\n        assembly {\\n            calldatacopy(0, 0, calldatasize())\\n            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)\\n            returndatacopy(0, 0, returndatasize())\\n            switch result\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    function facets(Layout storage s) internal view returns (Facet[] memory diamondFacets) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            diamondFacets = new Facet[](selectorCount);\\n\\n            uint256[] memory numFacetSelectors = new uint256[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex != numFacets; ++facetIndex) {\\n                        if (diamondFacets[facetIndex].facet == facet) {\\n                            diamondFacets[facetIndex].selectors[numFacetSelectors[facetIndex]] = selector;\\n                            ++numFacetSelectors[facetIndex];\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    diamondFacets[numFacets].facet = facet;\\n                    diamondFacets[numFacets].selectors = new bytes4[](selectorCount);\\n                    diamondFacets[numFacets].selectors[0] = selector;\\n                    numFacetSelectors[numFacets] = 1;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                uint256 numSelectors = numFacetSelectors[facetIndex];\\n                bytes4[] memory selectors = diamondFacets[facetIndex].selectors;\\n\\n                // setting the number of selectors\\n                assembly {\\n                    mstore(selectors, numSelectors)\\n                }\\n            }\\n\\n            // setting the number of facets\\n            assembly {\\n                mstore(diamondFacets, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetFunctionSelectors(Layout storage s, address facet) internal view returns (bytes4[] memory selectors) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            selectors = new bytes4[](selectorCount);\\n\\n            uint256 numSelectors;\\n            uint256 selectorIndex;\\n\\n            // loop through function selectors\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n\\n                    if (facet == address(bytes20(s.diamondFacets[selector]))) {\\n                        selectors[numSelectors] = selector;\\n                        ++numSelectors;\\n                    }\\n                }\\n            }\\n\\n            // set the number of selectors in the array\\n            assembly {\\n                mstore(selectors, numSelectors)\\n            }\\n        }\\n    }\\n\\n    function facetAddresses(Layout storage s) internal view returns (address[] memory addresses) {\\n        unchecked {\\n            uint16 selectorCount = s.selectorCount;\\n            addresses = new address[](selectorCount);\\n            uint256 numFacets;\\n            uint256 selectorIndex;\\n\\n            for (uint256 slotIndex; selectorIndex < selectorCount; ++slotIndex) {\\n                bytes32 slot = s.selectorSlots[slotIndex];\\n\\n                for (uint256 selectorSlotIndex; selectorSlotIndex != 8; ++selectorSlotIndex) {\\n                    ++selectorIndex;\\n\\n                    if (selectorIndex > selectorCount) {\\n                        break;\\n                    }\\n\\n                    bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));\\n                    address facet = address(bytes20(s.diamondFacets[selector]));\\n\\n                    bool continueLoop;\\n\\n                    for (uint256 facetIndex; facetIndex < numFacets; ++facetIndex) {\\n                        if (facet == addresses[facetIndex]) {\\n                            continueLoop = true;\\n                            break;\\n                        }\\n                    }\\n\\n                    if (continueLoop) {\\n                        continue;\\n                    }\\n\\n                    addresses[numFacets] = facet;\\n                    ++numFacets;\\n                }\\n            }\\n\\n            // set the number of facet addresses in the array\\n            assembly {\\n                mstore(addresses, numFacets)\\n            }\\n        }\\n    }\\n\\n    function facetAddress(Layout storage s, bytes4 selector) internal view returns (address facet) {\\n        facet = address(bytes20(s.diamondFacets[selector]));\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x930e0c854d559149621d2185cef92daadde9f514e12cca2ca30a1a9d1af063d7\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/diamond/DiamondMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {FacetCutAction, FacetCut, Initialization} from \\\"./../../diamond/DiamondCommon.sol\\\";\\nimport {DiamondStorage} from \\\"./../../diamond/libraries/DiamondStorage.sol\\\";\\nimport {Diamond} from \\\"./../../diamond/Diamond.sol\\\";\\n\\ncontract DiamondMock is Diamond {\\n    using DiamondStorage for DiamondStorage.Layout;\\n\\n    event ImmutableFunctionCalled();\\n\\n    constructor(FacetCut[] memory cuts, Initialization[] memory initializations) payable Diamond(cuts, initializations) {\\n        bytes4[] memory selectors = new bytes4[](1);\\n        selectors[0] = DiamondMock.immutableFunction.selector;\\n        FacetCut[] memory cut = new FacetCut[](1);\\n        cut[0].facet = address(this);\\n        cut[0].action = FacetCutAction.ADD;\\n        cut[0].selectors = selectors;\\n\\n        DiamondStorage.layout().diamondCut(cut, address(0), \\\"\\\");\\n    }\\n\\n    function immutableFunction() external {\\n        emit ImmutableFunctionCalled();\\n    }\\n}\\n\",\"keccak256\":\"0x3dec444b9040957843be35233e609cfae3b1499f28b06450f364071ac5996225\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"EmptyFacet(address)":[{"notice":"Thrown when trying to cut (add/replace/remove) a facet with no function selectors."}],"EmptyInitCallData(address)":[{"notice":"Thrown when trying to call an initialization function with a target and empty data."}],"EtherReceptionDisabled()":[{"notice":"Thrown when trying to transfer tokens without calldata to the contract."}],"FunctionAlreadyPresent(address,bytes4)":[{"notice":"Thrown when trying to add a function selector that has already been added."}],"FunctionNotFound(bytes4)":[{"notice":"Thrown when trying to execute, remove or replace a function selector that has not been added."}],"InitCallReverted(address,bytes)":[{"notice":"Thrown when trying to call an initialization function which reverts without return data."}],"ModifyingImmutableFunction(bytes4)":[{"notice":"Thrown when trying to remove or replace an immutable function."}],"NonContractFacet(address)":[{"notice":"Thrown when trying to add or replace a facet which is not a deployed contract."}],"NonContractInitCallTarget(address)":[{"notice":"Thrown when trying to call an initialization function on a non-contract address."}],"RemovingWithNonZeroAddressFacet(address)":[{"notice":"Thrown when trying to remove function selectors with a non-zero facet address."}],"ReplacingFunctionByItself(address,bytes4)":[{"notice":"Thrown when trying to replace a function with itself (from the same facet)."}],"ZeroAddressTargetInitCallButNonEmptyData()":[{"notice":"Thrown when trying to call an initialization function with a zero address target and non-empty data."}]},"events":{"DiamondCut((address,uint8,bytes4[])[],address,bytes)":{"notice":"Emitted when at least a cut action is operated on the diamond."}},"kind":"user","methods":{},"version":1}}},"contracts/mocks/diamond/FacetMock.sol":{"FacetMock":{"abi":[{"inputs":[],"name":"RevertedWithMessage","type":"error"},{"anonymous":false,"inputs":[],"name":"FacetFunctionCalled","type":"event"},{"inputs":[],"name":"a","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"b","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"c","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"d","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"doSomething","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"e","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"f","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"g","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"h","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"i","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"j","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"k","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"revertsWithMessage","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"revertsWithoutMessage","outputs":[],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608080604052346015576101d6908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80630dbe671f1461016f57806326121ff0146100b65780633787b426146101165780634df7e3d0146100b657806382692679146100c05780638a054ac2146100b6578063b4f40c61146100b6578063b582ec5f146100b6578063b8c9d365146100b6578063c3da42b8146100b6578063e2179b8e146100b6578063e5aa3d58146100b6578063ea18c283146100bb5763ffae15ba146100b657600080fd5b61016f565b600080fd5b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb577f84728df003805e87a3a67d30130f2d8b759b34815dac8d22a3e4fcaf3a4f2d6d600080a1005b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb577f96596b5b0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb5700fea264697066735822122046b8f0ece7a15740268564ec185cb286dcc63eeef4c3ce9862a9ba39559c8e8264736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x1D6 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xDBE671F EQ PUSH2 0x16F JUMPI DUP1 PUSH4 0x26121FF0 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x3787B426 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x4DF7E3D0 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x82692679 EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0x8A054AC2 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB4F40C61 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB582EC5F EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB8C9D365 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xC3DA42B8 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xE2179B8E EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xE5AA3D58 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xEA18C283 EQ PUSH2 0xBB JUMPI PUSH4 0xFFAE15BA EQ PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x16F JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI PUSH32 0x84728DF003805E87A3A67D30130F2D8B759B34815DAC8D22A3E4FCAF3A4F2D6D PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI PUSH32 0x96596B5B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI STOP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID 0xB8 CREATE EOFCREATE 0xE7 LOG1 JUMPI BLOCKHASH 0x26 DUP6 PUSH5 0xEC185CB286 0xDC 0xC6 RETURNDATACOPY RETURNCONTRACT 0xF4 0xC3 0xCE SWAP9 PUSH3 0xA9BA39 SSTORE SWAP13 DUP15 DUP3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"57:903:89:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"external_fun_a":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80630dbe671f1461016f57806326121ff0146100b65780633787b426146101165780634df7e3d0146100b657806382692679146100c05780638a054ac2146100b6578063b4f40c61146100b6578063b582ec5f146100b6578063b8c9d365146100b6578063c3da42b8146100b6578063e2179b8e146100b6578063e5aa3d58146100b6578063ea18c283146100bb5763ffae15ba146100b657600080fd5b61016f565b600080fd5b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb577f84728df003805e87a3a67d30130f2d8b759b34815dac8d22a3e4fcaf3a4f2d6d600080a1005b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb577f96596b5b0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100bb5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100bb5700fea264697066735822122046b8f0ece7a15740268564ec185cb286dcc63eeef4c3ce9862a9ba39559c8e8264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xDBE671F EQ PUSH2 0x16F JUMPI DUP1 PUSH4 0x26121FF0 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x3787B426 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x4DF7E3D0 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x82692679 EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0x8A054AC2 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB4F40C61 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB582EC5F EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xB8C9D365 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xC3DA42B8 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xE2179B8E EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xE5AA3D58 EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0xEA18C283 EQ PUSH2 0xBB JUMPI PUSH4 0xFFAE15BA EQ PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x16F JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI PUSH32 0x84728DF003805E87A3A67D30130F2D8B759B34815DAC8D22A3E4FCAF3A4F2D6D PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI PUSH32 0x96596B5B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xBB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xBB JUMPI STOP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID 0xB8 CREATE EOFCREATE 0xE7 LOG1 JUMPI BLOCKHASH 0x26 DUP6 PUSH5 0xEC185CB286 0xDC 0xC6 RETURNDATACOPY RETURNCONTRACT 0xF4 0xC3 0xCE SWAP9 PUSH3 0xA9BA39 SSTORE SWAP13 DUP15 DUP3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"57:903:89:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;197:21;57:903;197:21;;57:903;;;;;;;;;;;;440:21;57:903;440:21;57:903;;440:21;57:903;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"94000","executionCost":"147","totalCost":"94147"},"external":{"a()":"127","b()":"205","c()":"337","d()":"249","doSomething()":"967","e()":"422","f()":"161","g()":"359","h()":"315","i()":"381","j()":"293","k()":"271","revertsWithMessage()":"179","revertsWithoutMessage()":"348"}},"methodIdentifiers":{"a()":"0dbe671f","b()":"4df7e3d0","c()":"c3da42b8","d()":"8a054ac2","doSomething()":"82692679","e()":"ffae15ba","f()":"26121ff0","g()":"e2179b8e","h()":"b8c9d365","i()":"e5aa3d58","j()":"b582ec5f","k()":"b4f40c61","revertsWithMessage()":"3787b426","revertsWithoutMessage()":"ea18c283"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"RevertedWithMessage\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"FacetFunctionCalled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"a\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"b\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"c\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"d\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"doSomething\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"e\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"f\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"g\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"h\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"j\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"k\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertsWithMessage\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertsWithoutMessage\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/diamond/FacetMock.sol\":\"FacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/mocks/diamond/FacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ncontract FacetMock {\\n    event FacetFunctionCalled();\\n\\n    error RevertedWithMessage();\\n\\n    function doSomething() external {\\n        emit FacetFunctionCalled();\\n    }\\n\\n    function revertsWithoutMessage() external pure {\\n        // solhint-disable-next-line gas-custom-errors, reason-string\\n        revert();\\n    }\\n\\n    function revertsWithMessage() external pure {\\n        revert RevertedWithMessage();\\n    }\\n\\n    // These functions are placeholders for tests to manipulate the selectorCount in different scenarios\\n    function a() external pure {}\\n\\n    function b() external pure {}\\n\\n    function c() external pure {}\\n\\n    function d() external pure {}\\n\\n    function e() external pure {}\\n\\n    function f() external pure {}\\n\\n    function g() external pure {}\\n\\n    function h() external pure {}\\n\\n    function i() external pure {}\\n\\n    function j() external pure {}\\n\\n    function k() external pure {}\\n}\\n\",\"keccak256\":\"0x9d5cfd7fcf74bd9c584e8fcee8afd7783f077cca19c599192d522cf3e09062f7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/mocks/introspection/InterfaceDetectionMock.sol":{"InterfaceDetectionMock":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"bool","name":"supported","type":"bool"}],"name":"setSupportedInterface","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":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608080604052346015576102af908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461014d57637f73528b1461003257600080fd5b346101485760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610148576100696101b9565b60243590811515809203610148577fffffffff000000000000000000000000000000000000000000000000000000007fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d91167fffffffff00000000000000000000000000000000000000000000000000000000811461011e5760005260205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b7f72c683bb0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760206101af6101896101b9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6101e8565b6040519015158152f35b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014857565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610272577f01ffc9a700000000000000000000000000000000000000000000000000000000811461026b5760005260205260ff6040600020541690565b5050600190565b505060009056fea26469706673582212208e88cfc78c853a1de14622ffba7e5e6a40da4d2a515ce0c01fb738550b4ee27164736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x2AF SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x14D JUMPI PUSH4 0x7F73528B EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH2 0x69 PUSH2 0x1B9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x148 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x11E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP4 SLOAD AND SWAP2 AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x72C683BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH1 0x20 PUSH2 0x1AF PUSH2 0x189 PUSH2 0x1B9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x148 JUMPI JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x272 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 DUP9 0xCF 0xC7 DUP13 DUP6 GASPRICE SAR RJUMPI 0x4622 SELFDESTRUCT 0xBA PUSH31 0x5E6A40DA4D2A515CE0C01FB738550B4EE27164736F6C634300081E00330000 ","sourceMap":"244:310:90:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_bytes4":{"entryPoint":441,"id":null,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":488,"id":11667,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461014d57637f73528b1461003257600080fd5b346101485760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610148576100696101b9565b60243590811515809203610148577fffffffff000000000000000000000000000000000000000000000000000000007fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d91167fffffffff00000000000000000000000000000000000000000000000000000000811461011e5760005260205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b7f72c683bb0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760206101af6101896101b9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6101e8565b6040519015158152f35b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014857565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610272577f01ffc9a700000000000000000000000000000000000000000000000000000000811461026b5760005260205260ff6040600020541690565b5050600190565b505060009056fea26469706673582212208e88cfc78c853a1de14622ffba7e5e6a40da4d2a515ce0c01fb738550b4ee27164736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x14D JUMPI PUSH4 0x7F73528B EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH2 0x69 PUSH2 0x1B9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x148 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x11E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP4 SLOAD AND SWAP2 AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x72C683BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH1 0x20 PUSH2 0x1AF PUSH2 0x189 PUSH2 0x1B9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x148 JUMPI JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x272 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP15 DUP9 0xCF 0xC7 DUP13 DUP6 GASPRICE SAR RJUMPI 0x4622 SELFDESTRUCT 0xBA PUSH31 0x5E6A40DA4D2A515CE0C01FB738550B4EE27164736F6C634300081E00330000 ","sourceMap":"244:310:90:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;881:35:59;;877:68;;244:310:90;500:10:59;244:310:90;500:10:59;244:310:90;;500:10:59;244:310:90;;;;;;;;;;;;;;877:68:59;925:20;244:310:90;925:20:59;244:310:90;;925:20:59;244:310:90;;;;;;;;;;;;;;;;635:65:55;244:310:90;;:::i;:::-;;635:65:55;:::i;:::-;244:310:90;;;;;;;;;;;;;;;;;;;:::o;1359:340:59:-;;244:310:90;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;244:310:90;500:10:59;;;;;244:310:90;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1473:78::-;1528:12;;244:310:90;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"137400","executionCost":"190","totalCost":"137590"},"external":{"setSupportedInterface(bytes4,bool)":"24567","supportsInterface(bytes4)":"2460"}},"methodIdentifiers":{"setSupportedInterface(bytes4,bool)":"7f73528b","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"},{\"internalType\":\"bool\",\"name\":\"supported\",\"type\":\"bool\"}],\"name\":\"setSupportedInterface\",\"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\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/introspection/InterfaceDetectionMock.sol\":\"InterfaceDetectionMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/introspection/InterfaceDetectionMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\ncontract InterfaceDetectionMock is InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    function setSupportedInterface(bytes4 interfaceId, bool supported) external {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(interfaceId, supported);\\n    }\\n}\\n\",\"keccak256\":\"0x1bd45fa9bb6e942330b31d6c3050e27be6529320f8a1292282648ca780960fa3\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol":{"InterfaceDetectionFacetMock":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"bool","name":"supported","type":"bool"}],"name":"setSupportedInterface","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":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608080604052346015576102af908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461014d57637f73528b1461003257600080fd5b346101485760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610148576100696101b9565b60243590811515809203610148577fffffffff000000000000000000000000000000000000000000000000000000007fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d91167fffffffff00000000000000000000000000000000000000000000000000000000811461011e5760005260205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b7f72c683bb0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760206101af6101896101b9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6101e8565b6040519015158152f35b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014857565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610272577f01ffc9a700000000000000000000000000000000000000000000000000000000811461026b5760005260205260ff6040600020541690565b5050600190565b505060009056fea2646970667358221220d612cbd75b26be594a4af4c25e1c9e12de6e68d2a710d7d37212ebda9f92637464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x2AF SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x14D JUMPI PUSH4 0x7F73528B EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH2 0x69 PUSH2 0x1B9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x148 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x11E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP4 SLOAD AND SWAP2 AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x72C683BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH1 0x20 PUSH2 0x1AF PUSH2 0x189 PUSH2 0x1B9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x148 JUMPI JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x272 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD6 SLT 0xCB 0xD7 JUMPDEST 0x26 0xBE MSIZE BLOBBASEFEE BLOBBASEFEE DELEGATECALL 0xC2 MCOPY SHR SWAP15 SLT 0xDE PUSH15 0x68D2A710D7D37212EBDA9F92637464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"267:320:91:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_bytes4":{"entryPoint":441,"id":null,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":488,"id":11667,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461014d57637f73528b1461003257600080fd5b346101485760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610148576100696101b9565b60243590811515809203610148577fffffffff000000000000000000000000000000000000000000000000000000007fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d91167fffffffff00000000000000000000000000000000000000000000000000000000811461011e5760005260205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b7f72c683bb0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101485760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101485760206101af6101896101b9565b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6101e8565b6040519015158152f35b600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361014857565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610272577f01ffc9a700000000000000000000000000000000000000000000000000000000811461026b5760005260205260ff6040600020541690565b5050600190565b505060009056fea2646970667358221220d612cbd75b26be594a4af4c25e1c9e12de6e68d2a710d7d37212ebda9f92637464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x14D JUMPI PUSH4 0x7F73528B EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH2 0x69 PUSH2 0x1B9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x148 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x11E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0xFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP4 SLOAD AND SWAP2 AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x72C683BB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x148 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x148 JUMPI PUSH1 0x20 PUSH2 0x1AF PUSH2 0x189 PUSH2 0x1B9 JUMP JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x148 JUMPI JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x272 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD6 SLT 0xCB 0xD7 JUMPDEST 0x26 0xBE MSIZE BLOBBASEFEE BLOBBASEFEE DELEGATECALL 0xC2 MCOPY SHR SWAP15 SLT 0xDE PUSH15 0x68D2A710D7D37212EBDA9F92637464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"267:320:91:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;881:35:59;;877:68;;267:320:91;500:10:59;267:320:91;500:10:59;267:320:91;;500:10:59;267:320:91;;;;;;;;;;;;;;877:68:59;925:20;267:320:91;925:20:59;267:320:91;;925:20:59;267:320:91;;;;;;;;;;;;;;;;635:65:55;267:320:91;;:::i;:::-;;635:65:55;:::i;:::-;267:320:91;;;;;;;;;;;;;;;;;;;:::o;1359:340:59:-;;267:320:91;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;267:320:91;500:10:59;;;;;267:320:91;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1473:78::-;1528:12;;267:320:91;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"137400","executionCost":"190","totalCost":"137590"},"external":{"setSupportedInterface(bytes4,bool)":"24567","supportsInterface(bytes4)":"2460"}},"methodIdentifiers":{"setSupportedInterface(bytes4,bool)":"7f73528b","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"},{\"internalType\":\"bool\",\"name\":\"supported\",\"type\":\"bool\"}],\"name\":\"setSupportedInterface\",\"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\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol\":\"InterfaceDetectionFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/facets/InterfaceDetectionFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InterfaceDetection} from \\\"./../InterfaceDetection.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\ncontract InterfaceDetectionFacet is InterfaceDetection {}\\n\",\"keccak256\":\"0x9aa8304b156eca1d56ee3743064f4d547e547ada2900784560740456c78975ee\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/introspection/facets/InterfaceDetectionFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetectionFacet} from \\\"./../../../introspection/facets/InterfaceDetectionFacet.sol\\\";\\n\\ncontract InterfaceDetectionFacetMock is InterfaceDetectionFacet {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    function setSupportedInterface(bytes4 interfaceId, bool supported) external {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(interfaceId, supported);\\n    }\\n}\\n\",\"keccak256\":\"0x62d03231871a4f4849724e3ff50809ff00e3ebc174b393a675f23b51f9e0ba48\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/mocks/lifecycle/CheckpointsMock.sol":{"CheckpointsMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointAlreadySet","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointNotReached","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointReached","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckpointSet","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":"START_CHECKPOINTID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"checkpointIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"batchSetCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"enforceCheckpointNotReached","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"enforceCheckpointReached","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setCheckpoint","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"triggerCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointNotReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"CheckpointSet(bytes32,uint256)":{"params":{"checkpointId":"The checkpoint identifier.","timestamp":"The timestamp associated to the checkpoint."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.","params":{"checkpointIds":"The checkpoint identifier.","timestamps":"The checkpoint timestamp."}},"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"setCheckpoint(bytes32,uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.","params":{"checkpointId":"The checkpoint identifiers.","timestamp":"The checkpoint timestamps."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"triggerCheckpoint(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.","params":{"checkpointId":"The checkpoint identifier."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461013f57601f61106038819003918201601f19168301916001600160401b038311848410176101445780849260209460405283398101031261013f57516001600160a01b038116810361013f57336100e0575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610f05908161015b82396080518181816107dc015281816109d901528181610c590152610dbb0152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610055565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461092b578063151bdba6146108aa578063244c00be146108005780632b4c9f161461079157806331e66e1e1461070e5780633b149369146105c85780634bddd15c146105395780634f410a801461048e578063572b6c051461042a5780635b34eba0146103c15780638da5cb5b14610350578063b4c6cf76146102f7578063deb4d746146101dc5763f2fde38b146100b657600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043573ffffffffffffffffffffffffffffffffffffffff81168091036101d7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61012f610da4565b90805473ffffffffffffffffffffffffffffffffffffffff80821693168381036101aa575083830361015d57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d610da4565b92541691169081036101aa57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6102858282610ad0565b6102c957816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760206040517f53544152540000000000000000000000000000000000000000000000000000008152f35b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043573ffffffffffffffffffffffffffffffffffffffff811681036101d7576104846020916109c2565b6040519015158152f35b346101d75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104fc610da4565b92541691169081036101aa576105376024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610b31565b005b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757600435610595817f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610ad0565b61059b57005b7f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101d75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043567ffffffffffffffff81116101d757610617903690600401610991565b60243567ffffffffffffffff81116101d757610637903690600401610991565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610677610da4565b92541691169081036101aa57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036106e45760005b8481106106b957005b806106de6106ca600193888a610af2565b356106d6838887610af2565b359086610b31565b016106b0565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576040610747610c42565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b81600052602052604060002054801515908161089f575b501561087257005b7fa7afbc520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90504210158261086a565b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b60043560005260205260206040600020548015159081610920575b506040519015158152f35b905042101582610915565b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101d757610484602091610a21565b9181601f840112156101d75782359167ffffffffffffffff83116101d7576020808501948460051b0101116101d757565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610a1a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610aca577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610ac4576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906000526020526040600020548015159081610aea575090565b905042101590565b9190811015610b025760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908060005281602052604060002054610b8d5782610b4e57505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610bfb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101d7575180151581036101d75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d92573233148015610d9a575b610d9257803314908115610cd5575b50610ca4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101d75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610d8657600091610d57575b5038610c98565b610d79915060203d602011610d7f575b610d718183610bba565b810190610c2a565b38610d50565b503d610d67565b6040513d6000823e3d90fd5b506000903690565b5060183610610c89565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ec0573233148015610ec5575b610ec0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e2f575b50610e2c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610d8657600091610ea1575b5038610e22565b610eba915060203d602011610d7f57610d718183610bba565b38610e9a565b503390565b5060183610610deb56fea2646970667358221220539cc49ea5a3606d81cbbc184056a0d65a883fc892ae8a08665b46dd557bf50c64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x13F JUMPI PUSH1 0x1F PUSH2 0x1060 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x144 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x13F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x13F JUMPI CALLER PUSH2 0xE0 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xF05 SWAP1 DUP2 PUSH2 0x15B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x7DC ADD MSTORE DUP2 DUP2 PUSH2 0x9D9 ADD MSTORE DUP2 DUP2 PUSH2 0xC59 ADD MSTORE PUSH2 0xDBB ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x55 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x8AA JUMPI DUP1 PUSH4 0x244C00BE EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x791 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x5C8 JUMPI DUP1 PUSH4 0x4BDDD15C EQ PUSH2 0x539 JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x48E JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0xB4C6CF76 EQ PUSH2 0x2F7 JUMPI DUP1 PUSH4 0xDEB4D746 EQ PUSH2 0x1DC JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1D7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x12F PUSH2 0xDA4 JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x1AA JUMPI POP DUP4 DUP4 SUB PUSH2 0x15D JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x24D PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x285 DUP3 DUP3 PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0x2C9 JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x5354415254000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1D7 JUMPI PUSH2 0x484 PUSH1 0x20 SWAP2 PUSH2 0x9C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x4FC PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI PUSH2 0x537 PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0xB31 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x595 DUP2 PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0x59B JUMPI STOP JUMPDEST PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1D7 JUMPI PUSH2 0x617 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x991 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1D7 JUMPI PUSH2 0x637 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x991 JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x677 PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x6E4 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x6B9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x6DE PUSH2 0x6CA PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0xAF2 JUMP JUMPDEST CALLDATALOAD PUSH2 0x6D6 DUP4 DUP9 DUP8 PUSH2 0xAF2 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xB31 JUMP JUMPDEST ADD PUSH2 0x6B0 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH2 0x747 PUSH2 0xC42 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x89F JUMPI JUMPDEST POP ISZERO PUSH2 0x872 JUMPI STOP JUMPDEST PUSH32 0xA7AFBC5200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x86A JUMP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x920 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x915 JUMP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1D7 JUMPI PUSH2 0x484 PUSH1 0x20 SWAP2 PUSH2 0xA21 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1D7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1D7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1D7 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xA1A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xACA JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xAC4 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0xAEA JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xB02 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xB8D JUMPI DUP3 PUSH2 0xB4E JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBFB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1D7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1D7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD92 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD9A JUMPI JUMPDEST PUSH2 0xD92 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCD5 JUMPI JUMPDEST POP PUSH2 0xCA4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1D7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD86 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD57 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC98 JUMP JUMPDEST PUSH2 0xD79 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD7F JUMPI JUMPDEST PUSH2 0xD71 DUP2 DUP4 PUSH2 0xBBA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC2A JUMP JUMPDEST CODESIZE PUSH2 0xD50 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD67 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xEC0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEC5 JUMPI JUMPDEST PUSH2 0xEC0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE2F JUMPI JUMPDEST POP PUSH2 0xE2C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD86 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEA1 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE22 JUMP JUMPDEST PUSH2 0xEBA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD7F JUMPI PUSH2 0xD71 DUP2 DUP4 PUSH2 0xBBA JUMP JUMPDEST CODESIZE PUSH2 0xE9A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDEB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 SWAP13 0xC4 SWAP15 0xA5 LOG3 PUSH1 0x6D DUP2 0xCB 0xBC XOR BLOCKHASH JUMP LOG0 0xD6 GAS DUP9 EXTCODEHASH 0xC8 SWAP3 0xAE DUP11 ADDMOD PUSH7 0x5B46DD557BF50C PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"617:1221:92:-:0;;;;;;;;;;;;;-1:-1:-1;;617:1221:92;;;;-1:-1:-1;;;;;617:1221:92;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;617:1221:92;;;;;;891:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;617:1221:92;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;617:1221:92;;;;;;;;745:39:76;617:1221:92;;;;;;;;;;;;;;;;;;;;;1645:152:42;617:1221:92;;;-1:-1:-1;;;;;;617:1221:92;891:10;617:1221;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;617:1221:92;-1:-1:-1;617:1221:92;;;;;;-1:-1:-1;617:1221:92;;;;;-1:-1:-1;617:1221:92"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_bytes32_dyn_calldata":{"entryPoint":2449,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":3114,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_bytes32_dyn_calldata":{"entryPoint":2802,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3002,"id":null,"parameterSlots":2,"returnSlots":0},"fun_checkpointReached":{"entryPoint":2768,"id":12359,"parameterSlots":2,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":2498,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":3138,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3492,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_setCheckpoint":{"entryPoint":2865,"id":12234,"parameterSlots":3,"returnSlots":0},"fun_supportsInterface":{"entryPoint":2593,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2012},{"length":32,"start":2521},{"length":32,"start":3161},{"length":32,"start":3515}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461092b578063151bdba6146108aa578063244c00be146108005780632b4c9f161461079157806331e66e1e1461070e5780633b149369146105c85780634bddd15c146105395780634f410a801461048e578063572b6c051461042a5780635b34eba0146103c15780638da5cb5b14610350578063b4c6cf76146102f7578063deb4d746146101dc5763f2fde38b146100b657600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043573ffffffffffffffffffffffffffffffffffffffff81168091036101d7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61012f610da4565b90805473ffffffffffffffffffffffffffffffffffffffff80821693168381036101aa575083830361015d57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d610da4565b92541691169081036101aa57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6102858282610ad0565b6102c957816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760206040517f53544152540000000000000000000000000000000000000000000000000000008152f35b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043573ffffffffffffffffffffffffffffffffffffffff811681036101d7576104846020916109c2565b6040519015158152f35b346101d75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104fc610da4565b92541691169081036101aa576105376024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610b31565b005b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757600435610595817f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b610ad0565b61059b57005b7f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101d75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d75760043567ffffffffffffffff81116101d757610617903690600401610991565b60243567ffffffffffffffff81116101d757610637903690600401610991565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610677610da4565b92541691169081036101aa57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036106e45760005b8481106106b957005b806106de6106ca600193888a610af2565b356106d6838887610af2565b359086610b31565b016106b0565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576040610747610c42565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b81600052602052604060002054801515908161089f575b501561087257005b7fa7afbc520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90504210158261086a565b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b60043560005260205260206040600020548015159081610920575b506040519015158152f35b905042101582610915565b346101d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d7576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101d757610484602091610a21565b9181601f840112156101d75782359167ffffffffffffffff83116101d7576020808501948460051b0101116101d757565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610a1a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610aca577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610ac4576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906000526020526040600020548015159081610aea575090565b905042101590565b9190811015610b025760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908060005281602052604060002054610b8d5782610b4e57505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610bfb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101d7575180151581036101d75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d92573233148015610d9a575b610d9257803314908115610cd5575b50610ca4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101d75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610d8657600091610d57575b5038610c98565b610d79915060203d602011610d7f575b610d718183610bba565b810190610c2a565b38610d50565b503d610d67565b6040513d6000823e3d90fd5b506000903690565b5060183610610c89565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ec0573233148015610ec5575b610ec0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e2f575b50610e2c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610d8657600091610ea1575b5038610e22565b610eba915060203d602011610d7f57610d718183610bba565b38610e9a565b503390565b5060183610610deb56fea2646970667358221220539cc49ea5a3606d81cbbc184056a0d65a883fc892ae8a08665b46dd557bf50c64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x8AA JUMPI DUP1 PUSH4 0x244C00BE EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x791 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x5C8 JUMPI DUP1 PUSH4 0x4BDDD15C EQ PUSH2 0x539 JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x48E JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0xB4C6CF76 EQ PUSH2 0x2F7 JUMPI DUP1 PUSH4 0xDEB4D746 EQ PUSH2 0x1DC JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1D7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x12F PUSH2 0xDA4 JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x1AA JUMPI POP DUP4 DUP4 SUB PUSH2 0x15D JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x24D PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x285 DUP3 DUP3 PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0x2C9 JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x5354415254000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1D7 JUMPI PUSH2 0x484 PUSH1 0x20 SWAP2 PUSH2 0x9C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x4FC PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI PUSH2 0x537 PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0xB31 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x595 DUP2 PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0x59B JUMPI STOP JUMPDEST PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1D7 JUMPI PUSH2 0x617 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x991 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1D7 JUMPI PUSH2 0x637 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x991 JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x677 PUSH2 0xDA4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AA JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x6E4 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x6B9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x6DE PUSH2 0x6CA PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0xAF2 JUMP JUMPDEST CALLDATALOAD PUSH2 0x6D6 DUP4 DUP9 DUP8 PUSH2 0xAF2 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xB31 JUMP JUMPDEST ADD PUSH2 0x6B0 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x40 PUSH2 0x747 PUSH2 0xC42 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x89F JUMPI JUMPDEST POP ISZERO PUSH2 0x872 JUMPI STOP JUMPDEST PUSH32 0xA7AFBC5200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x86A JUMP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x920 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x915 JUMP JUMPDEST CALLVALUE PUSH2 0x1D7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1D7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1D7 JUMPI PUSH2 0x484 PUSH1 0x20 SWAP2 PUSH2 0xA21 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1D7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1D7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1D7 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xA1A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xACA JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xAC4 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0xAEA JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xB02 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xB8D JUMPI DUP3 PUSH2 0xB4E JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBFB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1D7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1D7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD92 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD9A JUMPI JUMPDEST PUSH2 0xD92 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCD5 JUMPI JUMPDEST POP PUSH2 0xCA4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1D7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD86 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD57 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC98 JUMP JUMPDEST PUSH2 0xD79 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD7F JUMPI JUMPDEST PUSH2 0xD71 DUP2 DUP4 PUSH2 0xBBA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC2A JUMP JUMPDEST CODESIZE PUSH2 0xD50 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD67 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xEC0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEC5 JUMPI JUMPDEST PUSH2 0xEC0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE2F JUMPI JUMPDEST POP PUSH2 0xE2C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD86 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEA1 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE22 JUMP JUMPDEST PUSH2 0xEBA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD7F JUMPI PUSH2 0xD71 DUP2 DUP4 PUSH2 0xBBA JUMP JUMPDEST CODESIZE PUSH2 0xE9A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDEB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 SWAP13 0xC4 SWAP15 0xA5 LOG3 PUSH1 0x6D DUP2 0xCB 0xBC XOR BLOCKHASH JUMP LOG0 0xD6 GAS DUP9 EXTCODEHASH 0xC8 SWAP3 0xAE DUP11 ADDMOD PUSH7 0x5B46DD557BF50C PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"617:1221:92:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1555:41;;:::i;:::-;617:1221;;;;;;;;;3205:23:42;;;3201:60;;3275:25;;;;3271:146;;617:1221:92;3271:146:42;617:1221:92;;;;;;3361:45:42;617:1221:92;;3361:45:42;617:1221:92;3201:60:42;3237:24;617:1221:92;3237:24:42;617:1221:92;;;;3237:24:42;617:1221:92;;;;;;;;;;;;;;;;;;;1555:41;;;:::i;:::-;617:1221;;;;;4503:26:42;;;4499:64;;4419:19:72;617:1221:92;4245:33:72;;;;:::i;:::-;4241:77;;617:1221:92;;;2498:44:72;617:1221:92;;;;;2468:15:72;617:1221:92;;;;;;;;;2468:15:72;617:1221:92;;;;2498:44:72;617:1221:92;4241:77:72;4287:31;;;;;617:1221:92;;4287:31:72;;617:1221:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1555:41;;;:::i;:::-;617:1221;;;;;4503:26:42;;;4499:64;;1416:9:62;617:1221:92;;;;;1416:9:62;:::i;:::-;617:1221:92;;;;;;;;;;;;;;4245:33:72;617:1221:92;;4245:33:72;:::i;:::-;4241:77;;617:1221:92;4241:77:72;4287:31;;;;617:1221:92;;4287:31:72;;617:1221:92;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;617:1221:92;;1555:41;;;:::i;:::-;617:1221;;;;;4503:26:42;;;4499:64;;4419:19:72;617:1221:92;1814:27:72;;;;1810:66;;617:1221:92;1903:10:72;;;;;;617:1221:92;1915:3:72;1950:16;1968:13;1950:16;617:1221:92;1950:16:72;;;;:::i;:::-;617:1221:92;1968:13:72;;;;;:::i;:::-;617:1221:92;1968:13:72;;;:::i;:::-;617:1221:92;1892:9:72;;1810:66;1850:26;617:1221:92;1850:26:72;617:1221:92;;1850:26:72;617:1221:92;;;;;;;;;;;;1790:39;;:::i;:::-;617:1221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;617:1221:92;;;;;;;;;;;;;;;;;;;-1:-1:-1;617:1221:92;;;;-1:-1:-1;617:1221:92;;3376:16:72;;;:50;;;;617:1221:92;3369:57:72;3802:34;3798:81;;617:1221:92;3798:81:72;3845:34;617:1221:92;3845:34:72;617:1221:92;;;;3845:34:72;3376:50;3396:15;;;:30;;3376:50;;;617:1221:92;;;;;;;;;;;;;;-1:-1:-1;617:1221:92;;;;;-1:-1:-1;617:1221:92;;3376:16:72;;;:50;;;;617:1221:92;3369:57:72;617:1221:92;;;;;;;;3376:50:72;3396:15;;;:30;;3376:50;;;617:1221:92;;;;;;;;;;;;;;;;;;;;635:65:55;617:1221:92;635:65:55;;:::i;617:1221:92:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;617:1221:92;1146:19:75;617:1221:92;1146:53:75;;;1142:96;;617:1221:92;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;617:1221:92;1215:12:75;:::o;1359:340:59:-;617:1221:92;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;617:1221:92;500:10:59;617:1221:92;500:10:59;;;;617:1221:92;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;617:1221:92;1528:12:59;:::o;3204:229:72:-;;-1:-1:-1;617:1221:92;;;;-1:-1:-1;617:1221:92;;3376:16:72;;;:50;;;;3369:57;3204:229;:::o;3376:50::-;3396:15;;;:30;;3204:229;:::o;617:1221:92:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;957:337:72;;617:1221:92;-1:-1:-1;617:1221:92;;;;;-1:-1:-1;617:1221:92;;1058:79:72;;1151:14;1147:141;;957:337;;;:::o;1147:141::-;1239:38;617:1221:92;;;;-1:-1:-1;617:1221:92;;;;;-1:-1:-1;617:1221:92;;;;;;;;;;;1239:38:72;957:337::o;1058:79::-;1103:34;-1:-1:-1;1103:34:72;;617:1221:92;;-1:-1:-1;1103:34:72;617:1221:92;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;617:1221:92;;;;;-1:-1:-1;617:1221:92;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;617:1221:92;2065:19:76;617:1221:92;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;617:1221:92;720:8:80;617:1221:92;720:8:80;;617:1221:92;;;;2115:1:76;2802:32;;:::o;2624:153::-;617:1221:92;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;617:1221:92;2361:10:76;617:1221:92;;;;2771:4:76;617:1221:92;;;;;-1:-1:-1;2682:95:76;;617:1221:92;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;617:1221:92;;;2115:1:76;617:1221:92;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;617:1221:92;1029:19:76;617:1221:92;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;617:1221:92;;;1676:74:76;;617:1221:92;;;1676:74:76;;;617:1221:92;1327:10:76;617:1221:92;;;;1744:4:76;617:1221:92;;;;;-1:-1:-1;1676:74:76;;617:1221:92;;;;;;1676:74:76;;;;;;;617:1221:92;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"769000","executionCost":"infinite","totalCost":"infinite"},"external":{"START_CHECKPOINTID()":"386","__msgData()":"infinite","batchSetCheckpoint(bytes32[],uint256[])":"infinite","checkpoint(bytes32)":"2511","checkpointReached(bytes32)":"2400","enforceCheckpointNotReached(bytes32)":"2531","enforceCheckpointReached(bytes32)":"2433","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2473","setCheckpoint(bytes32,uint256)":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite","triggerCheckpoint(bytes32)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"START_CHECKPOINTID()":"b4c6cf76","__msgData()":"31e66e1e","batchSetCheckpoint(bytes32[],uint256[])":"3b149369","checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6","enforceCheckpointNotReached(bytes32)":"4bddd15c","enforceCheckpointReached(bytes32)":"244c00be","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","setCheckpoint(bytes32,uint256)":"4f410a80","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","triggerCheckpoint(bytes32)":"deb4d746"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointNotReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"CheckpointSet\",\"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\":\"START_CHECKPOINTID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"checkpointIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"timestamps\",\"type\":\"uint256[]\"}],\"name\":\"batchSetCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"enforceCheckpointNotReached\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"enforceCheckpointReached\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"setCheckpoint\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"triggerCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointNotReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\",\"timestamp\":\"The timestamp associated to the checkpoint.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\",\"params\":{\"checkpointIds\":\"The checkpoint identifier.\",\"timestamps\":\"The checkpoint timestamp.\"}},\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"setCheckpoint(bytes32,uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\",\"params\":{\"checkpointId\":\"The checkpoint identifiers.\",\"timestamp\":\"The checkpoint timestamps.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"triggerCheckpoint(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.\",\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"notice\":\"Thrown when trying to set a checkpoint which is already set.\"}],\"CheckpointNotReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has not been reached yet but is required to.\"}],\"CheckpointReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has already been reached but is required not to.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"notice\":\"Emitted when a checkpoint is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"notice\":\"Sets a batch of checkpoints.\"},\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"setCheckpoint(bytes32,uint256)\":{\"notice\":\"Sets the checkpoints.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"triggerCheckpoint(bytes32)\":{\"notice\":\"Sets the checkpoint to the current block timestamp.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/lifecycle/CheckpointsMock.sol\":\"CheckpointsMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointsBase} from \\\"./base/CheckpointsBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Checkpoints is CheckpointsBase, ContractOwnership {}\\n\",\"keccak256\":\"0xf1c7a7cfd7b13386cb7a78a39161ad66b61bbc00fed7a76d365afe59c21645e0\",\"license\":\"MIT\"},\"contracts/lifecycle/base/CheckpointsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ICheckpoints} from \\\"./../interfaces/ICheckpoints.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../libraries/CheckpointsStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract CheckpointsBase is ICheckpoints, Context {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifiers.\\n    /// @param timestamp The checkpoint timestamps.\\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifier.\\n    /// @param timestamps The checkpoint timestamp.\\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\\n    }\\n}\\n\",\"keccak256\":\"0x08464b8627c51f474fb9c933ceb444633f8f85a0d2e05cd92736d55f5050192f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/lifecycle/CheckpointsMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../../lifecycle/libraries/CheckpointsStorage.sol\\\";\\nimport {Checkpoints} from \\\"./../../lifecycle/Checkpoints.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract CheckpointsMock is Checkpoints, ForwarderRegistryContext {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    bytes32 public constant START_CHECKPOINTID = \\\"START\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) Checkpoints() ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceCheckpointReached(bytes32 checkpointId) external view {\\n        CheckpointsStorage.layout().enforceCheckpointReached(checkpointId);\\n    }\\n\\n    function enforceCheckpointNotReached(bytes32 checkpointId) external view {\\n        CheckpointsStorage.layout().enforceCheckpointNotReached(checkpointId);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0d733c6994597e721a08d5d4d44d0ed867f972dc5574f9f9e6136e15fe6dafe8\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"notice":"Thrown when trying to set a checkpoint which is already set."}],"CheckpointNotReached(bytes32)":[{"notice":"Thrown when a checkpoint has not been reached yet but is required to."}],"CheckpointReached(bytes32)":[{"notice":"Thrown when a checkpoint has already been reached but is required not to."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"CheckpointSet(bytes32,uint256)":{"notice":"Emitted when a checkpoint is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"notice":"Sets a batch of checkpoints."},"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"setCheckpoint(bytes32,uint256)":{"notice":"Sets the checkpoints."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"triggerCheckpoint(bytes32)":{"notice":"Sets the checkpoint to the current block timestamp."}},"version":1}}},"contracts/mocks/lifecycle/PauseMock.sol":{"PauseMock":{"abi":[{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"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":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceIsNotPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceIsPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a0346101a457601f610d7038819003918201601f19168301916001600160401b038311848410176101a95780849260409485528339810103126101a45780519081151582036101a45760200151906001600160a01b03821682036101a45733610145575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff191660011790556100f4575b608052604051610b9090816101c082396080518181816106ad0152818161074e015281816108e40152610a460152f35b600160ff19600080516020610d50833981519152541617600080516020610d50833981519152557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a16100c4565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610064565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146106d15780632b4c9f161461066257806331e66e1e146105df5780633f4ba83a146104ed578063572b6c05146104895780635c975abb146104295780638456cb5914610335578063859f7acb146102b05780638da5cb5b1461023f5780638ebd8073146101bb5763f2fde38b1461009557600080fd5b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760043573ffffffffffffffffffffffffffffffffffffffff81168091036101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61010e610a2f565b90805473ffffffffffffffffffffffffffffffffffffffff8082169316838103610189575083830361013c57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661021557005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54161561030b57005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806103a3610a2f565b9254169116908103610189577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166102155760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760043573ffffffffffffffffffffffffffffffffffffffff811681036101b6576104e3602091610737565b6040519015158152f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055b610a2f565b9254169116908103610189577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154161561030b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760406106186108cd565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101b6576104e3602091610796565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561078f5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461083f577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610839576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761088657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101b6575180151581036101b65790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a1d573233148015610a25575b610a1d57803314908115610960575b5061092f576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101b65760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610a11576000916109e2575b5038610923565b610a04915060203d602011610a0a575b6109fc8183610845565b8101906108b5565b386109db565b503d6109f2565b6040513d6000823e3d90fd5b506000903690565b5060183610610914565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b4b573233148015610b50575b610b4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610aba575b50610ab757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610a1157600091610b2c575b5038610aad565b610b45915060203d602011610a0a576109fc8183610845565b38610b25565b503390565b5060183610610a7656fea26469706673582212202efd5e53d2747e4025da4e25ff4102d8cff54ffe143b97da9cac4147323b1d1664736f6c634300081e00330186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x1A4 JUMPI PUSH1 0x1F PUSH2 0xD70 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1A9 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1A4 JUMPI DUP1 MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x1A4 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x1A4 JUMPI CALLER PUSH2 0x145 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH2 0xF4 JUMPI JUMPDEST PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB90 SWAP1 DUP2 PUSH2 0x1C0 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x6AD ADD MSTORE DUP2 DUP2 PUSH2 0x74E ADD MSTORE DUP2 DUP2 PUSH2 0x8E4 ADD MSTORE PUSH2 0xA46 ADD MSTORE RETURN JUMPDEST PUSH1 0x1 PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xD50 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xD50 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 PUSH2 0xC4 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x64 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x6D1 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x662 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x5DF JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x4ED JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x489 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x429 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x859F7ACB EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x23F JUMPI DUP1 PUSH4 0x8EBD8073 EQ PUSH2 0x1BB JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x10E PUSH2 0xA2F JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x189 JUMPI POP DUP4 DUP4 SUB PUSH2 0x13C JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x215 JUMPI STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND ISZERO PUSH2 0x30B JUMPI STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3A3 PUSH2 0xA2F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x189 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x215 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B6 JUMPI PUSH2 0x4E3 PUSH1 0x20 SWAP2 PUSH2 0x737 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55B PUSH2 0xA2F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x189 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND ISZERO PUSH2 0x30B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x40 PUSH2 0x618 PUSH2 0x8CD JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1B6 JUMPI PUSH2 0x4E3 PUSH1 0x20 SWAP2 PUSH2 0x796 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x78F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x83F JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x839 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x886 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B6 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B6 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA1D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA25 JUMPI JUMPDEST PUSH2 0xA1D JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x960 JUMPI JUMPDEST POP PUSH2 0x92F JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1B6 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA11 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9E2 JUMPI JUMPDEST POP CODESIZE PUSH2 0x923 JUMP JUMPDEST PUSH2 0xA04 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA0A JUMPI JUMPDEST PUSH2 0x9FC DUP2 DUP4 PUSH2 0x845 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x8B5 JUMP JUMPDEST CODESIZE PUSH2 0x9DB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x914 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB4B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB50 JUMPI JUMPDEST PUSH2 0xB4B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xABA JUMPI JUMPDEST POP PUSH2 0xAB7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA11 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB2C JUMPI JUMPDEST POP CODESIZE PUSH2 0xAAD JUMP JUMPDEST PUSH2 0xB45 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA0A JUMPI PUSH2 0x9FC DUP2 DUP4 PUSH2 0x845 JUMP JUMPDEST CODESIZE PUSH2 0xB25 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA76 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2E REVERT MCOPY MSTORE8 0xD2 PUSH21 0x7E4025DA4E25FF4102D8CFF54FFE143B97DA9CAC41 SELFBALANCE ORIGIN EXTCODESIZE SAR AND PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ADD DUP7 LOG0 PUSH0 PUSH4 0xB1553398 0xAD MCOPY LOG3 0x23 EXTCODECOPY 0xC DUPN 0x8B DUP13 SWAP15 EOFCREATE 0xC4 PUSH24 0x17F123C5C2B42FBD6D9E0000000000000000000000000000 ","sourceMap":"593:1065:93:-:0;;;;;;;;;;;;;-1:-1:-1;;593:1065:93;;;;-1:-1:-1;;;;;593:1065:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;593:1065:93;;;;;;823:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;593:1065:93;;500:10:59;;593:1065:93;;-1:-1:-1;;593:1065:93;990:1:42;593:1065:93;;;1031:82:73;;-1:-1:-1;745:39:76;;593:1065:93;;;;;;;;745:39:76;593:1065:93;;;;;;;;;;;;;;;;;;;;;1031:82:73;990:1:42;593:1065:93;;-1:-1:-1;;;;;;;;;;;593:1065:93;;;-1:-1:-1;;;;;;;;;;;593:1065:93;1095:7:73;-1:-1:-1;1095:7:73;;1031:82;;1645:152:42;593:1065:93;;;-1:-1:-1;;;;;;593:1065:93;823:10;593:1065;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;593:1065:93;-1:-1:-1;593:1065:93;;;;;;-1:-1:-1;593:1065:93;;;;;-1:-1:-1;593:1065:93"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":2229,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2117,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":1847,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":2253,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2607,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":1942,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1709},{"length":32,"start":1870},{"length":32,"start":2276},{"length":32,"start":2630}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146106d15780632b4c9f161461066257806331e66e1e146105df5780633f4ba83a146104ed578063572b6c05146104895780635c975abb146104295780638456cb5914610335578063859f7acb146102b05780638da5cb5b1461023f5780638ebd8073146101bb5763f2fde38b1461009557600080fd5b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760043573ffffffffffffffffffffffffffffffffffffffff81168091036101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61010e610a2f565b90805473ffffffffffffffffffffffffffffffffffffffff8082169316838103610189575083830361013c57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661021557005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54161561030b57005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806103a3610a2f565b9254169116908103610189577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166102155760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760043573ffffffffffffffffffffffffffffffffffffffff811681036101b6576104e3602091610737565b6040519015158152f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055b610a2f565b9254169116908103610189577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154161561030b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b65760406106186108cd565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101b65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b6576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101b6576104e3602091610796565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561078f5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461083f577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610839576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761088657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101b6575180151581036101b65790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a1d573233148015610a25575b610a1d57803314908115610960575b5061092f576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101b65760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610a11576000916109e2575b5038610923565b610a04915060203d602011610a0a575b6109fc8183610845565b8101906108b5565b386109db565b503d6109f2565b6040513d6000823e3d90fd5b506000903690565b5060183610610914565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b4b573233148015610b50575b610b4b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610aba575b50610ab757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610a1157600091610b2c575b5038610aad565b610b45915060203d602011610a0a576109fc8183610845565b38610b25565b503390565b5060183610610a7656fea26469706673582212202efd5e53d2747e4025da4e25ff4102d8cff54ffe143b97da9cac4147323b1d1664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x6D1 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x662 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x5DF JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x4ED JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x489 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x429 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x859F7ACB EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x23F JUMPI DUP1 PUSH4 0x8EBD8073 EQ PUSH2 0x1BB JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x10E PUSH2 0xA2F JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x189 JUMPI POP DUP4 DUP4 SUB PUSH2 0x13C JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x215 JUMPI STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND ISZERO PUSH2 0x30B JUMPI STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3A3 PUSH2 0xA2F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x189 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x215 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B6 JUMPI PUSH2 0x4E3 PUSH1 0x20 SWAP2 PUSH2 0x737 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55B PUSH2 0xA2F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x189 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND ISZERO PUSH2 0x30B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x40 PUSH2 0x618 PUSH2 0x8CD JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B6 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B6 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1B6 JUMPI PUSH2 0x4E3 PUSH1 0x20 SWAP2 PUSH2 0x796 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x78F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x83F JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x839 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x886 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B6 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B6 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA1D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA25 JUMPI JUMPDEST PUSH2 0xA1D JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x960 JUMPI JUMPDEST POP PUSH2 0x92F JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1B6 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA11 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9E2 JUMPI JUMPDEST POP CODESIZE PUSH2 0x923 JUMP JUMPDEST PUSH2 0xA04 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA0A JUMPI JUMPDEST PUSH2 0x9FC DUP2 DUP4 PUSH2 0x845 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x8B5 JUMP JUMPDEST CODESIZE PUSH2 0x9DB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x914 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB4B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB50 JUMPI JUMPDEST PUSH2 0xB4B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xABA JUMPI JUMPDEST POP PUSH2 0xAB7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA11 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB2C JUMPI JUMPDEST POP CODESIZE PUSH2 0xAAD JUMP JUMPDEST PUSH2 0xB45 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA0A JUMPI PUSH2 0x9FC DUP2 DUP4 PUSH2 0x845 JUMP JUMPDEST CODESIZE PUSH2 0xB25 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA76 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2E REVERT MCOPY MSTORE8 0xD2 PUSH21 0x7E4025DA4E25FF4102D8CFF54FFE143B97DA9CAC41 SELFBALANCE ORIGIN EXTCODESIZE SAR AND PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"593:1065:93:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1375:41;;:::i;:::-;593:1065;;;;;;;;;3205:23:42;;;3201:60;;3275:25;;;;3271:146;;593:1065:93;3271:146:42;593:1065:93;;;;;;3361:45:42;593:1065:93;;3361:45:42;593:1065:93;3201:60:42;3237:24;593:1065:93;3237:24:42;593:1065:93;;;;3237:24:42;593:1065:93;;;;;;;;;;;;;;;500:10:59;593:1065:93;500:10:59;;2981:31:73;;593:1065:93;2981:31:73;3004:8;-1:-1:-1;3004:8:73;;-1:-1:-1;3004:8:73;593:1065:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;500:10:59;593:1065:93;500:10:59;;2748:11:73;2744:35;;593:1065:93;2744:35:73;2768:11;-1:-1:-1;2768:11:73;;-1:-1:-1;2768:11:73;593:1065:93;;;;;;;;;;;;;1375:41;;;:::i;:::-;593:1065;;;;;4503:26:42;;;4499:64;;593:1065:93;500:10:59;;;;2981:31:73;;2005:4;593:1065:93;;;;;;;2024:7:73;593:1065:93;2024:7:73;;593:1065:93;;;;;;;;;;;;;500:10:59;593:1065:93;500:10:59;;593:1065:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1375:41;;;:::i;:::-;593:1065;;;;;4503:26:42;;;4499:64;;593:1065:93;500:10:59;;;;2748:11:73;2744:35;;593:1065:93;;;;;;2307:9:73;593:1065:93;2307:9:73;;593:1065:93;;;;;;;;;;;;;1610:39;;:::i;:::-;593:1065;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;593:1065:93;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;593:1065:93;635:65:55;;:::i;1002:301:75:-;593:1065:93;1146:19:75;593:1065:93;1146:53:75;;;1142:96;;593:1065:93;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;593:1065:93;1215:12:75;:::o;1359:340:59:-;593:1065:93;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;593:1065:93;500:10:59;593:1065:93;500:10:59;;;;593:1065:93;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;593:1065:93;1528:12:59;:::o;593:1065:93:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;593:1065:93;;;;;-1:-1:-1;593:1065:93;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;593:1065:93;2065:19:76;593:1065:93;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;593:1065:93;720:8:80;593:1065:93;720:8:80;;593:1065:93;;;;2115:1:76;2802:32;;:::o;2624:153::-;593:1065:93;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;593:1065:93;2361:10:76;593:1065:93;;;;2771:4:76;593:1065:93;;;;;-1:-1:-1;2682:95:76;;593:1065:93;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;593:1065:93;;;2115:1:76;593:1065:93;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;593:1065:93;1029:19:76;593:1065:93;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;593:1065:93;;;1676:74:76;;593:1065:93;;;1676:74:76;;;593:1065:93;1327:10:76;593:1065:93;;;;1744:4:76;593:1065:93;;;;;-1:-1:-1;1676:74:76;;593:1065:93;;;;;;1676:74:76;;;;;;;593:1065:93;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"592000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","enforceIsNotPaused()":"2456","enforceIsPaused()":"2415","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2429","pause()":"infinite","paused()":"2369","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite","unpause()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","enforceIsNotPaused()":"8ebd8073","enforceIsPaused()":"859f7acb","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"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\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enforceIsNotPaused\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enforceIsPaused\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/lifecycle/PauseMock.sol\":\"PauseMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Pause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PauseStorage} from \\\"./libraries/PauseStorage.sol\\\";\\nimport {PauseBase} from \\\"./base/PauseBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Pausing mechanism (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Pause is PauseBase, ContractOwnership {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    constructor(bool isPaused) {\\n        PauseStorage.layout().constructorInit(isPaused);\\n    }\\n}\\n\",\"keccak256\":\"0x2d5ed9d279d9fbaff12a44d109bd722814eb8dbedcbc6957a176e397e309f338\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/lifecycle/PauseMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PauseStorage} from \\\"./../../lifecycle/libraries/PauseStorage.sol\\\";\\nimport {Pause} from \\\"./../../lifecycle/Pause.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract PauseMock is Pause, ForwarderRegistryContext {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    constructor(\\n        bool isPaused,\\n        IForwarderRegistry forwarderRegistry\\n    ) Pause(isPaused) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceIsPaused() external view {\\n        PauseStorage.layout().enforceIsPaused();\\n    }\\n\\n    function enforceIsNotPaused() external view {\\n        PauseStorage.layout().enforceIsNotPaused();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x897051f0f29c0932930258735d04411d1c171f87859c2ccc1ca85c8aff901c79\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Pause()":{"notice":"Emitted when the pause is triggered."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol":{"CheckpointsFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointAlreadySet","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointNotReached","type":"error"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"CheckpointReached","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CheckpointSet","type":"event"},{"inputs":[],"name":"START_CHECKPOINTID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"checkpointIds","type":"bytes32[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"name":"batchSetCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"checkpointReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"enforceCheckpointNotReached","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"enforceCheckpointReached","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"checkpointId","type":"bytes32"}],"name":"triggerCheckpoint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointNotReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"CheckpointReached(bytes32)":[{"params":{"checkpointId":"The checkpoint identifier."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"CheckpointSet(bytes32,uint256)":{"params":{"checkpointId":"The checkpoint identifier.","timestamp":"The timestamp associated to the checkpoint."}}},"kind":"dev","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.","params":{"checkpointIds":"The checkpoint identifier.","timestamps":"The checkpoint timestamp."}},"checkpoint(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set."}},"checkpointReached(bytes32)":{"params":{"checkpointId":"The checkpoint identifier."},"returns":{"_0":"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise."}},"setCheckpoint(bytes32,uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.","params":{"checkpointId":"The checkpoint identifiers.","timestamp":"The checkpoint timestamps."}},"triggerCheckpoint(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.","params":{"checkpointId":"The checkpoint identifier."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610bab38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610b229081610089823960805181818161087601526109d80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063151bdba61461063b578063244c00be1461059157806331e66e1e1461050e5780633b149369146103c85780634bddd15c146103395780634f410a801461028e5780635b34eba014610225578063b4c6cf76146101cc5763deb4d7461461007f57600080fd5b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100f06109c1565b925416911690810361019a57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b61012882826106ed565b61016c57816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c75760206040517f53544152540000000000000000000000000000000000000000000000000000008152f35b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102fc6109c1565b925416911690810361019a576103376024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b61074e565b005b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c757600435610395817f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6106ed565b61039b57005b7f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c75760043567ffffffffffffffff81116101c7576104179036906004016106bc565b60243567ffffffffffffffff81116101c7576104379036906004016106bc565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104776109c1565b925416911690810361019a57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036104e45760005b8481106104b957005b806104de6104ca600193888a61070f565b356104d683888761070f565b35908661074e565b016104b0565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c757604061054761085f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7576004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b816000526020526040600020548015159081610630575b501561060357005b7fa7afbc520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9050421015826105fb565b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b600435600052602052602060406000205480151590816106b1575b506040519015158152f35b9050421015826106a6565b9181601f840112156101c75782359167ffffffffffffffff83116101c7576020808501948460051b0101116101c757565b906000526020526040600020548015159081610707575090565b905042101590565b919081101561071f5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9080600052816020526040600020546107aa578261076b57505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761081857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101c7575180151581036101c75790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109af5732331480156109b7575b6109af578033149081156108f2575b506108c1576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101c75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109a357600091610974575b50386108b5565b610996915060203d60201161099c575b61098e81836107d7565b810190610847565b3861096d565b503d610984565b6040513d6000823e3d90fd5b506000903690565b50601836106108a6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610add573233148015610ae2575b610add577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a4c575b50610a4957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109a357600091610abe575b5038610a3f565b610ad7915060203d60201161099c5761098e81836107d7565b38610ab7565b503390565b5060183610610a0856fea26469706673582212204b08bedcec5147d01dc805d644a8b4e3a40dfeed5bd1cc5161b966b016ab0a8864736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xBAB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB22 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x876 ADD MSTORE PUSH2 0x9D8 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0x244C00BE EQ PUSH2 0x591 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x50E JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x3C8 JUMPI DUP1 PUSH4 0x4BDDD15C EQ PUSH2 0x339 JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x225 JUMPI DUP1 PUSH4 0xB4C6CF76 EQ PUSH2 0x1CC JUMPI PUSH4 0xDEB4D746 EQ PUSH2 0x7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF0 PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x128 DUP3 DUP3 PUSH2 0x6ED JUMP JUMPDEST PUSH2 0x16C JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x5354415254000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2FC PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI PUSH2 0x337 PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x74E JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x395 DUP2 PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x6ED JUMP JUMPDEST PUSH2 0x39B JUMPI STOP JUMPDEST PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C7 JUMPI PUSH2 0x417 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C7 JUMPI PUSH2 0x437 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x6BC JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x477 PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x4E4 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x4B9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x4DE PUSH2 0x4CA PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0x70F JUMP JUMPDEST CALLDATALOAD PUSH2 0x4D6 DUP4 DUP9 DUP8 PUSH2 0x70F JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0x74E JUMP JUMPDEST ADD PUSH2 0x4B0 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH2 0x547 PUSH2 0x85F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x630 JUMPI JUMPDEST POP ISZERO PUSH2 0x603 JUMPI STOP JUMPDEST PUSH32 0xA7AFBC5200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x5FB JUMP JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x6B1 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x6A6 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1C7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1C7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x707 JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x71F JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7AA JUMPI DUP3 PUSH2 0x76B JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x818 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1C7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1C7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9AF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9B7 JUMPI JUMPDEST PUSH2 0x9AF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8F2 JUMPI JUMPDEST POP PUSH2 0x8C1 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1C7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x974 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B5 JUMP JUMPDEST PUSH2 0x996 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x99C JUMPI JUMPDEST PUSH2 0x98E DUP2 DUP4 PUSH2 0x7D7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x847 JUMP JUMPDEST CODESIZE PUSH2 0x96D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x984 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xADD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAE2 JUMPI JUMPDEST PUSH2 0xADD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA4C JUMPI JUMPDEST POP PUSH2 0xA49 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xABE JUMPI JUMPDEST POP CODESIZE PUSH2 0xA3F JUMP JUMPDEST PUSH2 0xAD7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x99C JUMPI PUSH2 0x98E DUP2 DUP4 PUSH2 0x7D7 JUMP JUMPDEST CODESIZE PUSH2 0xAB7 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA08 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4B ADDMOD 0xBE 0xDC EOFCREATE 0x51 SELFBALANCE 0xD0 SAR 0xC8 SDIV 0xD6 PREVRANDAO 0xA8 0xB4 CALLF 0xA40D INVALID 0xED JUMPDEST DATALOADN 0xCC51 PUSH2 0xB966 0xB0 AND 0xAB EXP DUP9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"319:690:94:-:0;;;;;;;;;;;;;-1:-1:-1;;319:690:94;;;;-1:-1:-1;;;;;319:690:94;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;319:690:94;;;;;;745:39:76;;319:690:94;;;;;;;;745:39:76;319:690:94;;;;;;;;;;;;-1:-1:-1;319:690:94;;;;;;-1:-1:-1;319:690:94;;;;;-1:-1:-1;319:690:94"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_bytes32_dyn_calldata":{"entryPoint":1724,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":2119,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_bytes32_dyn_calldata":{"entryPoint":1807,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":2007,"id":null,"parameterSlots":2,"returnSlots":0},"fun_checkpointReached":{"entryPoint":1773,"id":12359,"parameterSlots":2,"returnSlots":1},"fun_msgData":{"entryPoint":2143,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2497,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_setCheckpoint":{"entryPoint":1870,"id":12234,"parameterSlots":3,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2166},{"length":32,"start":2520}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063151bdba61461063b578063244c00be1461059157806331e66e1e1461050e5780633b149369146103c85780634bddd15c146103395780634f410a801461028e5780635b34eba014610225578063b4c6cf76146101cc5763deb4d7461461007f57600080fd5b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100f06109c1565b925416911690810361019a57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b61012882826106ed565b61016c57816040917f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953936000526020524282600020558151908152426020820152a1005b507f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c75760206040517f53544152540000000000000000000000000000000000000000000000000000008152f35b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6004356000526020526020604060002054604051908152f35b346101c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102fc6109c1565b925416911690810361019a576103376024356004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b61074e565b005b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c757600435610395817f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b6106ed565b61039b57005b7f8e54d9090000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c75760043567ffffffffffffffff81116101c7576104179036906004016106bc565b60243567ffffffffffffffff81116101c7576104379036906004016106bc565b907fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806104776109c1565b925416911690810361019a57507f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b908284036104e45760005b8481106104b957005b806104de6104ca600193888a61070f565b356104d683888761070f565b35908661074e565b016104b0565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346101c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c757604061054761085f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7576004357f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b816000526020526040600020548015159081610630575b501561060357005b7fa7afbc520000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9050421015826105fb565b346101c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c7577f0def758eb96c12015155889b8e63d1cb5c0dbce5585bbdf9d99ea353f56c716b600435600052602052602060406000205480151590816106b1575b506040519015158152f35b9050421015826106a6565b9181601f840112156101c75782359167ffffffffffffffff83116101c7576020808501948460051b0101116101c757565b906000526020526040600020548015159081610707575090565b905042101590565b919081101561071f5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9080600052816020526040600020546107aa578261076b57505050565b7f099ea97db121bdf4a102e67113e27b6bb74713015b32a5f0e1c3ea0d44fb2953926040928260005260205280836000205582519182526020820152a1565b7f33e962eb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761081857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101c7575180151581036101c75790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109af5732331480156109b7575b6109af578033149081156108f2575b506108c1576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101c75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109a357600091610974575b50386108b5565b610996915060203d60201161099c575b61098e81836107d7565b810190610847565b3861096d565b503d610984565b6040513d6000823e3d90fd5b506000903690565b50601836106108a6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610add573233148015610ae2575b610add577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a4c575b50610a4957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109a357600091610abe575b5038610a3f565b610ad7915060203d60201161099c5761098e81836107d7565b38610ab7565b503390565b5060183610610a0856fea26469706673582212204b08bedcec5147d01dc805d644a8b4e3a40dfeed5bd1cc5161b966b016ab0a8864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x151BDBA6 EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0x244C00BE EQ PUSH2 0x591 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x50E JUMPI DUP1 PUSH4 0x3B149369 EQ PUSH2 0x3C8 JUMPI DUP1 PUSH4 0x4BDDD15C EQ PUSH2 0x339 JUMPI DUP1 PUSH4 0x4F410A80 EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x5B34EBA0 EQ PUSH2 0x225 JUMPI DUP1 PUSH4 0xB4C6CF76 EQ PUSH2 0x1CC JUMPI PUSH4 0xDEB4D746 EQ PUSH2 0x7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF0 PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x128 DUP3 DUP3 PUSH2 0x6ED JUMP JUMPDEST PUSH2 0x16C JUMPI DUP2 PUSH1 0x40 SWAP2 PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE TIMESTAMP DUP3 PUSH1 0x0 KECCAK256 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST POP PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x5354415254000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2FC PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI PUSH2 0x337 PUSH1 0x24 CALLDATALOAD PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x74E JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x395 DUP2 PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH2 0x6ED JUMP JUMPDEST PUSH2 0x39B JUMPI STOP JUMPDEST PUSH32 0x8E54D90900000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C7 JUMPI PUSH2 0x417 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C7 JUMPI PUSH2 0x437 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x6BC JUMP JUMPDEST SWAP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x477 PUSH2 0x9C1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x19A JUMPI POP PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B SWAP1 DUP3 DUP5 SUB PUSH2 0x4E4 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x4B9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x4DE PUSH2 0x4CA PUSH1 0x1 SWAP4 DUP9 DUP11 PUSH2 0x70F JUMP JUMPDEST CALLDATALOAD PUSH2 0x4D6 DUP4 DUP9 DUP8 PUSH2 0x70F JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0x74E JUMP JUMPDEST ADD PUSH2 0x4B0 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x40 PUSH2 0x547 PUSH2 0x85F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x630 JUMPI JUMPDEST POP ISZERO PUSH2 0x603 JUMPI STOP JUMPDEST PUSH32 0xA7AFBC5200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x5FB JUMP JUMPDEST CALLVALUE PUSH2 0x1C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1C7 JUMPI PUSH32 0xDEF758EB96C12015155889B8E63D1CB5C0DBCE5585BBDF9D99EA353F56C716B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x6B1 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO DUP3 PUSH2 0x6A6 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1C7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1C7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP1 ISZERO ISZERO SWAP1 DUP2 PUSH2 0x707 JUMPI POP SWAP1 JUMP JUMPDEST SWAP1 POP TIMESTAMP LT ISZERO SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x71F JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7AA JUMPI DUP3 PUSH2 0x76B JUMPI POP POP POP JUMP JUMPDEST PUSH32 0x99EA97DB121BDF4A102E67113E27B6BB74713015B32A5F0E1C3EA0D44FB2953 SWAP3 PUSH1 0x40 SWAP3 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 DUP4 PUSH1 0x0 KECCAK256 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 JUMP JUMPDEST PUSH32 0x33E962EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x818 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1C7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1C7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9AF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9B7 JUMPI JUMPDEST PUSH2 0x9AF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8F2 JUMPI JUMPDEST POP PUSH2 0x8C1 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1C7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x974 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B5 JUMP JUMPDEST PUSH2 0x996 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x99C JUMPI JUMPDEST PUSH2 0x98E DUP2 DUP4 PUSH2 0x7D7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x847 JUMP JUMPDEST CODESIZE PUSH2 0x96D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x984 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xADD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAE2 JUMPI JUMPDEST PUSH2 0xADD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA4C JUMPI JUMPDEST POP PUSH2 0xA49 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xABE JUMPI JUMPDEST POP CODESIZE PUSH2 0xA3F JUMP JUMPDEST PUSH2 0xAD7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x99C JUMPI PUSH2 0x98E DUP2 DUP4 PUSH2 0x7D7 JUMP JUMPDEST CODESIZE PUSH2 0xAB7 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA08 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4B ADDMOD 0xBE 0xDC EOFCREATE 0x51 SELFBALANCE 0xD0 SAR 0xC8 SDIV 0xD6 PREVRANDAO 0xA8 0xB4 CALLF 0xA40D INVALID 0xED JUMPDEST DATALOADN 0xCC51 PUSH2 0xB966 0xB0 AND 0xAB EXP DUP9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"319:690:94:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:41:68;;;:::i;:::-;319:690:94;;;;;4503:26:42;;;4499:64;;4419:19:72;319:690:94;4245:33:72;;;;:::i;:::-;4241:77;;319:690:94;;;2498:44:72;319:690:94;;;;;2468:15:72;319:690:94;;;;;;;;;2468:15:72;319:690:94;;;;2498:44:72;319:690:94;4241:77:72;4287:31;;;;;319:690:94;;4287:31:72;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;319:690:94;;-1:-1:-1;4538:25:42;319:690:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:41:68;;;:::i;:::-;319:690:94;;;;;4503:26:42;;;4499:64;;1416:9:62;319:690:94;;;;;1416:9:62;:::i;:::-;319:690:94;;;;;;;;;;;;;;4245:33:72;319:690:94;;4245:33:72;:::i;:::-;4241:77;;319:690:94;4241:77:72;4287:31;;;;319:690:94;;4287:31:72;;319:690:94;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;319:690:94;;1155:41:68;;;:::i;:::-;319:690:94;;;;;4503:26:42;;;4499:64;;4419:19:72;319:690:94;1814:27:72;;;;1810:66;;319:690:94;1903:10:72;;;;;;319:690:94;1915:3:72;1950:16;1968:13;1950:16;319:690:94;1950:16:72;;;;:::i;:::-;319:690:94;1968:13:72;;;;;:::i;:::-;319:690:94;1968:13:72;;;:::i;:::-;319:690:94;1892:9:72;;1810:66;1850:26;319:690:94;1850:26:72;319:690:94;;1850:26:72;319:690:94;;;;;;;;;;;;1390:39:68;;:::i;:::-;319:690:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;319:690:94;;;;-1:-1:-1;319:690:94;;3376:16:72;;;:50;;;;319:690:94;3369:57:72;3802:34;3798:81;;319:690:94;3798:81:72;3845:34;319:690:94;3845:34:72;319:690:94;;;;3845:34:72;3376:50;3396:15;;;:30;;3376:50;;;319:690:94;;;;;;;;;;;;;;-1:-1:-1;319:690:94;;;;;-1:-1:-1;319:690:94;;3376:16:72;;;:50;;;;319:690:94;3369:57:72;319:690:94;;;;;;;;3376:50:72;3396:15;;;:30;;3376:50;;;319:690:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3204:229:72:-;;-1:-1:-1;319:690:94;;;;-1:-1:-1;319:690:94;;3376:16:72;;;:50;;;;3369:57;3204:229;:::o;3376:50::-;3396:15;;;:30;;3204:229;:::o;319:690:94:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;957:337:72;;319:690:94;-1:-1:-1;319:690:94;;;;;-1:-1:-1;319:690:94;;1058:79:72;;1151:14;1147:141;;957:337;;;:::o;1147:141::-;1239:38;319:690:94;;;;-1:-1:-1;319:690:94;;;;;-1:-1:-1;319:690:94;;;;;;;;;;;1239:38:72;957:337::o;1058:79::-;1103:34;-1:-1:-1;1103:34:72;;319:690:94;;-1:-1:-1;1103:34:72;319:690:94;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;319:690:94;;;;;-1:-1:-1;319:690:94;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;319:690:94;2065:19:76;319:690:94;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;319:690:94;720:8:80;319:690:94;720:8:80;;319:690:94;;;;2115:1:76;2802:32;;:::o;2624:153::-;319:690:94;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;319:690:94;2361:10:76;319:690:94;;;;2771:4:76;319:690:94;;;;;-1:-1:-1;2682:95:76;;319:690:94;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;319:690:94;;;2115:1:76;319:690:94;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;319:690:94;1029:19:76;319:690:94;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;319:690:94;;;1676:74:76;;319:690:94;;;1676:74:76;;;319:690:94;1327:10:76;319:690:94;;;;1744:4:76;319:690:94;;;;;-1:-1:-1;1676:74:76;;319:690:94;;;;;;1676:74:76;;;;;;;319:690:94;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"570000","executionCost":"infinite","totalCost":"infinite"},"external":{"START_CHECKPOINTID()":"298","__msgData()":"infinite","batchSetCheckpoint(bytes32[],uint256[])":"infinite","checkpoint(bytes32)":"2445","checkpointReached(bytes32)":"2378","enforceCheckpointNotReached(bytes32)":"2487","enforceCheckpointReached(bytes32)":"2411","setCheckpoint(bytes32,uint256)":"infinite","triggerCheckpoint(bytes32)":"infinite"}},"methodIdentifiers":{"START_CHECKPOINTID()":"b4c6cf76","__msgData()":"31e66e1e","batchSetCheckpoint(bytes32[],uint256[])":"3b149369","checkpoint(bytes32)":"5b34eba0","checkpointReached(bytes32)":"151bdba6","enforceCheckpointNotReached(bytes32)":"4bddd15c","enforceCheckpointReached(bytes32)":"244c00be","setCheckpoint(bytes32,uint256)":"4f410a80","triggerCheckpoint(bytes32)":"deb4d746"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointNotReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"CheckpointReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"CheckpointSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"START_CHECKPOINTID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"checkpointIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256[]\",\"name\":\"timestamps\",\"type\":\"uint256[]\"}],\"name\":\"batchSetCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"checkpointReached\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"enforceCheckpointNotReached\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"enforceCheckpointReached\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"setCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"checkpointId\",\"type\":\"bytes32\"}],\"name\":\"triggerCheckpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointNotReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"CheckpointReached(bytes32)\":[{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\",\"timestamp\":\"The timestamp associated to the checkpoint.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\",\"params\":{\"checkpointIds\":\"The checkpoint identifier.\",\"timestamps\":\"The checkpoint timestamp.\"}},\"checkpoint(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\"}},\"checkpointReached(bytes32)\":{\"params\":{\"checkpointId\":\"The checkpoint identifier.\"},\"returns\":{\"_0\":\"reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\"}},\"setCheckpoint(bytes32,uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointAlreadySet} if the checkpoint is already set.Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\",\"params\":{\"checkpointId\":\"The checkpoint identifiers.\",\"timestamp\":\"The checkpoint timestamps.\"}},\"triggerCheckpoint(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.Emits a {CheckpointSet} event.\",\"params\":{\"checkpointId\":\"The checkpoint identifier.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"CheckpointAlreadySet(bytes32)\":[{\"notice\":\"Thrown when trying to set a checkpoint which is already set.\"}],\"CheckpointNotReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has not been reached yet but is required to.\"}],\"CheckpointReached(bytes32)\":[{\"notice\":\"Thrown when a checkpoint has already been reached but is required not to.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"CheckpointSet(bytes32,uint256)\":{\"notice\":\"Emitted when a checkpoint is set.\"}},\"kind\":\"user\",\"methods\":{\"batchSetCheckpoint(bytes32[],uint256[])\":{\"notice\":\"Sets a batch of checkpoints.\"},\"checkpoint(bytes32)\":{\"notice\":\"Gets the checkpoint timestamp.\"},\"checkpointReached(bytes32)\":{\"notice\":\"Retrieves whether the checkpoint has been reached already.\"},\"setCheckpoint(bytes32,uint256)\":{\"notice\":\"Sets the checkpoints.\"},\"triggerCheckpoint(bytes32)\":{\"notice\":\"Sets the checkpoint to the current block timestamp.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol\":\"CheckpointsFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/CheckpointsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ICheckpoints} from \\\"./../interfaces/ICheckpoints.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../libraries/CheckpointsStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract CheckpointsBase is ICheckpoints, Context {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifiers.\\n    /// @param timestamp The checkpoint timestamps.\\n    function setCheckpoint(bytes32 checkpointId, uint256 timestamp) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().setCheckpoint(checkpointId, timestamp);\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifier.\\n    /// @param timestamps The checkpoint timestamp.\\n    function batchSetCheckpoint(bytes32[] calldata checkpointIds, uint256[] calldata timestamps) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().batchSetCheckpoint(checkpointIds, timestamps);\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(bytes32 checkpointId) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        CheckpointsStorage.layout().triggerCheckpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpoint(bytes32 checkpointId) external view virtual returns (uint256) {\\n        return CheckpointsStorage.layout().checkpoint(checkpointId);\\n    }\\n\\n    /// @inheritdoc ICheckpoints\\n    function checkpointReached(bytes32 checkpointId) external view virtual returns (bool) {\\n        return CheckpointsStorage.layout().checkpointReached(checkpointId);\\n    }\\n}\\n\",\"keccak256\":\"0x08464b8627c51f474fb9c933ceb444633f8f85a0d2e05cd92736d55f5050192f\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/CheckpointsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to set a checkpoint which is already set.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointAlreadySet(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has not been reached yet but is required to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointNotReached(bytes32 checkpointId);\\n\\n/// @notice Thrown when a checkpoint has already been reached but is required not to.\\n/// @param checkpointId The checkpoint identifier.\\nerror CheckpointReached(bytes32 checkpointId);\\n\",\"keccak256\":\"0x1b0144e1b969ce970fc80badf4882ea2ba138d8dce39937ea0aa7309db5d8bee\",\"license\":\"MIT\"},\"contracts/lifecycle/events/CheckpointsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a checkpoint is set.\\n/// @param checkpointId The checkpoint identifier.\\n/// @param timestamp The timestamp associated to the checkpoint.\\nevent CheckpointSet(bytes32 checkpointId, uint256 timestamp);\\n\",\"keccak256\":\"0x59cbcbb3253b202f3b88f5bc55a0eb03c7bc10f4ec7b4b1eb7e134e6560af2d2\",\"license\":\"MIT\"},\"contracts/lifecycle/facets/CheckpointsFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {CheckpointsBase} from \\\"./../base/CheckpointsBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Timestamp-based checkpoints management (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract CheckpointsFacet is CheckpointsBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6ca8bca8db03a56e549650b53a0e464033313f630f7992266d8541559c119d96\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/ICheckpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Timestamp-based checkpoints management (functions)\\ninterface ICheckpoints {\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(bytes32 checkpointId) external view returns (uint256);\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(bytes32 checkpointId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x52518ca9d15ce20d1c697f9897dd3065c4b7174e715f2d00d2863b10b260da64\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/CheckpointsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {CheckpointAlreadySet, CheckpointNotReached, CheckpointReached} from \\\"./../errors/CheckpointsErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {CheckpointSet} from \\\"./../events/CheckpointsEvents.sol\\\";\\n\\nlibrary CheckpointsStorage {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    struct Layout {\\n        // checkpointId => timestamp\\n        mapping(bytes32 => uint256) checkpoints;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Checkpoints.storage\\\")) - 1);\\n\\n    /// @notice Sets the checkpoint.\\n    /// @dev Reverts with {CheckpointAlreadySet} if the checkpoint is already set.\\n    /// @dev Emits a {CheckpointSet} event if the timestamp is set to a non-zero value.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @param timestamp The checkpoint timestamp.\\n    function setCheckpoint(Layout storage s, bytes32 checkpointId, uint256 timestamp) internal {\\n        if (s.checkpoints[checkpointId] != 0) revert CheckpointAlreadySet(checkpointId);\\n        if (timestamp != 0) {\\n            s.checkpoints[checkpointId] = timestamp;\\n            emit CheckpointSet(checkpointId, timestamp);\\n        }\\n    }\\n\\n    /// @notice Sets a batch of checkpoints.\\n    /// @dev Reverts with {CheckpointAlreadySet} if one of the checkpoints is already set.\\n    /// @dev Emits a {CheckpointSet} event for each timestamp set to a non-zero value.\\n    /// @param checkpointIds The checkpoint identifiers.\\n    /// @param timestamps The checkpoint timestamps.\\n    function batchSetCheckpoint(Layout storage s, bytes32[] calldata checkpointIds, uint256[] calldata timestamps) internal {\\n        uint256 length = checkpointIds.length;\\n        if (length != timestamps.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            s.setCheckpoint(checkpointIds[i], timestamps[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the checkpoint to the current block timestamp.\\n    /// @dev Reverts with {CheckpointReached} if the checkpoint is set and the current block timestamp has already reached it.\\n    /// @dev Emits a {CheckpointSet} event.\\n    /// @param checkpointId The checkpoint identifier.\\n    function triggerCheckpoint(Layout storage s, bytes32 checkpointId) internal {\\n        s.enforceCheckpointNotReached(checkpointId);\\n        s.checkpoints[checkpointId] = block.timestamp;\\n        emit CheckpointSet(checkpointId, block.timestamp);\\n    }\\n\\n    /// @notice Gets the checkpoint timestamp.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return timestamp The timestamp associated to the checkpoint. A zero value indicates that the checkpoint is not set.\\n    function checkpoint(Layout storage s, bytes32 checkpointId) internal view returns (uint256 timestamp) {\\n        return s.checkpoints[checkpointId];\\n    }\\n\\n    /// @notice Retrieves whether the checkpoint has been reached already.\\n    /// @param checkpointId The checkpoint identifier.\\n    /// @return reached True if the checkpoint has been set and the current block timestamp has already reached it, false otherwise.\\n    function checkpointReached(Layout storage s, bytes32 checkpointId) internal view returns (bool) {\\n        uint256 checkpoint_ = s.checkpoints[checkpointId];\\n        return checkpoint_ != 0 && block.timestamp >= checkpoint_;\\n    }\\n\\n    /// @notice Ensures that the checkpoint has been reached already.\\n    /// @dev Reverts with {CheckpointNotReached} if the checkpoint is not set or if the current block timestamp has not reached it yet.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (!s.checkpointReached(checkpointId)) revert CheckpointNotReached(checkpointId);\\n    }\\n\\n    /// @notice Ensures that the checkpoint has not been reached yet.\\n    /// @dev Reverts with {CheckpointReached} if checkpoint is set and the current block timestamp has already reached it.\\n    /// @param checkpointId The checkpoint identifier.\\n    function enforceCheckpointNotReached(Layout storage s, bytes32 checkpointId) internal view {\\n        if (s.checkpointReached(checkpointId)) revert CheckpointReached(checkpointId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x80597294cdf1aa0b50d730d46d5b1cb73adb2c9ef5fbec95ee0c61c347c1f531\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/lifecycle/facets/CheckpointsFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {CheckpointsStorage} from \\\"./../../../lifecycle/libraries/CheckpointsStorage.sol\\\";\\nimport {CheckpointsFacet} from \\\"./../../../lifecycle/facets/CheckpointsFacet.sol\\\";\\n\\ncontract CheckpointsFacetMock is CheckpointsFacet {\\n    using CheckpointsStorage for CheckpointsStorage.Layout;\\n\\n    bytes32 public constant START_CHECKPOINTID = \\\"START\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) CheckpointsFacet(forwarderRegistry) {}\\n\\n    function enforceCheckpointReached(bytes32 checkpointId) external view {\\n        CheckpointsStorage.layout().enforceCheckpointReached(checkpointId);\\n    }\\n\\n    function enforceCheckpointNotReached(bytes32 checkpointId) external view {\\n        CheckpointsStorage.layout().enforceCheckpointNotReached(checkpointId);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xf42f87d6aa21ef3c2f5ba636525364480ce4af50700474df7e307b377261c82d\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"CheckpointAlreadySet(bytes32)":[{"notice":"Thrown when trying to set a checkpoint which is already set."}],"CheckpointNotReached(bytes32)":[{"notice":"Thrown when a checkpoint has not been reached yet but is required to."}],"CheckpointReached(bytes32)":[{"notice":"Thrown when a checkpoint has already been reached but is required not to."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"CheckpointSet(bytes32,uint256)":{"notice":"Emitted when a checkpoint is set."}},"kind":"user","methods":{"batchSetCheckpoint(bytes32[],uint256[])":{"notice":"Sets a batch of checkpoints."},"checkpoint(bytes32)":{"notice":"Gets the checkpoint timestamp."},"checkpointReached(bytes32)":{"notice":"Retrieves whether the checkpoint has been reached already."},"setCheckpoint(bytes32,uint256)":{"notice":"Sets the checkpoints."},"triggerCheckpoint(bytes32)":{"notice":"Sets the checkpoint to the current block timestamp."}},"version":1}}},"contracts/mocks/lifecycle/facets/PauseFacetMock.sol":{"PauseFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceIsNotPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceIsPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"initPauseStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initPauseStorage(bool)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits a {Paused} event if `isPaused` is true.","params":{"isPaused":"The initial pause state."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6109ee38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610965908161008982396080518181816106b9015261081b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146105975780633f4ba83a146104a55780635c975abb146104455780638456cb5914610324578063859f7acb1461029f5780638ebd80731461021b5763b606577c1461006957600080fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004358015158103610216576100ac610804565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101e957507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e907f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5460018110156101b7575060017f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5561016757005b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661027557005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e5416156102fa57005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610392610804565b9254169116908103610418577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166102755760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610513610804565b9254169116908103610418577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff815416156102fa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760406105d06106a2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761065b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610216575180151581036102165790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107f25732331480156107fa575b6107f257803314908115610735575b50610704576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102165760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107e6576000916107b7575b50386106f8565b6107d9915060203d6020116107df575b6107d1818361061a565b81019061068a565b386107b0565b503d6107c7565b6040513d6000823e3d90fd5b506000903690565b50601836106106e9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610920573233148015610925575b610920577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561088f575b5061088c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107e657600091610901575b5038610882565b61091a915060203d6020116107df576107d1818361061a565b386108fa565b503390565b506018361061084b56fea26469706673582212204c0a7b1b58d5cf32ef4cd68b599dffd7eadacd294955ab1d590e12cc63ead27a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x9EE CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x965 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x6B9 ADD MSTORE PUSH2 0x81B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x597 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x324 JUMPI DUP1 PUSH4 0x859F7ACB EQ PUSH2 0x29F JUMPI DUP1 PUSH4 0x8EBD8073 EQ PUSH2 0x21B JUMPI PUSH4 0xB606577C EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x216 JUMPI PUSH2 0xAC PUSH2 0x804 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1E9 JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1B7 JUMPI POP PUSH1 0x1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SSTORE PUSH2 0x167 JUMPI STOP JUMPDEST PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x275 JUMPI STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND ISZERO PUSH2 0x2FA JUMPI STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x392 PUSH2 0x804 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x418 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x275 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x513 PUSH2 0x804 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x418 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND ISZERO PUSH2 0x2FA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x40 PUSH2 0x5D0 PUSH2 0x6A2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x65B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x216 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x216 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7F2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7FA JUMPI JUMPDEST PUSH2 0x7F2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x735 JUMPI JUMPDEST POP PUSH2 0x704 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x216 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7B7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6F8 JUMP JUMPDEST PUSH2 0x7D9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7DF JUMPI JUMPDEST PUSH2 0x7D1 DUP2 DUP4 PUSH2 0x61A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x68A JUMP JUMPDEST CODESIZE PUSH2 0x7B0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7C7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x920 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x925 JUMPI JUMPDEST PUSH2 0x920 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x88F JUMPI JUMPDEST POP PUSH2 0x88C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x901 JUMPI JUMPDEST POP CODESIZE PUSH2 0x882 JUMP JUMPDEST PUSH2 0x91A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7DF JUMPI PUSH2 0x7D1 DUP2 DUP4 PUSH2 0x61A JUMP JUMPDEST CODESIZE PUSH2 0x8FA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x84B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4C EXP PUSH28 0x1B58D5CF32EF4CD68B599DFFD7EADACD294955AB1D590E12CC63EAD2 PUSH27 0x64736F6C634300081E003300000000000000000000000000000000 ","sourceMap":"295:489:95:-:0;;;;;;;;;;;;;-1:-1:-1;;295:489:95;;;;-1:-1:-1;;;;;295:489:95;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;295:489:95;;;;;;745:39:76;;295:489:95;;;;;;;;745:39:76;295:489:95;;;;;;;;;;;;-1:-1:-1;295:489:95;;;;;;-1:-1:-1;295:489:95;;;;;-1:-1:-1;295:489:95"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1674,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1562,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1698,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2052,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1721},{"length":32,"start":2075}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146105975780633f4ba83a146104a55780635c975abb146104455780638456cb5914610324578063859f7acb1461029f5780638ebd80731461021b5763b606577c1461006957600080fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004358015158103610216576100ac610804565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101e957507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e907f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5460018110156101b7575060017f3bee9ead429adf7e232b4f4b772a209623333b43e5466fc9b9a766da96c2ae0e5561016757005b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661027557005b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e5416156102fa57005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610392610804565b9254169116908103610418577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166102755760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610513610804565b9254169116908103610418577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff815416156102fa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760406105d06106a2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761065b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610216575180151581036102165790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107f25732331480156107fa575b6107f257803314908115610735575b50610704576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102165760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107e6576000916107b7575b50386106f8565b6107d9915060203d6020116107df575b6107d1818361061a565b81019061068a565b386107b0565b503d6107c7565b6040513d6000823e3d90fd5b506000903690565b50601836106106e9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610920573233148015610925575b610920577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561088f575b5061088c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107e657600091610901575b5038610882565b61091a915060203d6020116107df576107d1818361061a565b386108fa565b503390565b506018361061084b56fea26469706673582212204c0a7b1b58d5cf32ef4cd68b599dffd7eadacd294955ab1d590e12cc63ead27a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x597 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x324 JUMPI DUP1 PUSH4 0x859F7ACB EQ PUSH2 0x29F JUMPI DUP1 PUSH4 0x8EBD8073 EQ PUSH2 0x21B JUMPI PUSH4 0xB606577C EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x216 JUMPI PUSH2 0xAC PUSH2 0x804 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1E9 JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1B7 JUMPI POP PUSH1 0x1 PUSH32 0x3BEE9EAD429ADF7E232B4F4B772A209623333B43E5466FC9B9A766DA96C2AE0E SSTORE PUSH2 0x167 JUMPI STOP JUMPDEST PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x275 JUMPI STOP JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND ISZERO PUSH2 0x2FA JUMPI STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x392 PUSH2 0x804 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x418 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x275 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x513 PUSH2 0x804 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x418 JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND ISZERO PUSH2 0x2FA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH1 0x40 PUSH2 0x5D0 PUSH2 0x6A2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x65B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x216 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x216 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7F2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7FA JUMPI JUMPDEST PUSH2 0x7F2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x735 JUMPI JUMPDEST POP PUSH2 0x704 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x216 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7B7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6F8 JUMP JUMPDEST PUSH2 0x7D9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7DF JUMPI JUMPDEST PUSH2 0x7D1 DUP2 DUP4 PUSH2 0x61A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x68A JUMP JUMPDEST CODESIZE PUSH2 0x7B0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7C7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6E9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x920 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x925 JUMPI JUMPDEST PUSH2 0x920 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x88F JUMPI JUMPDEST POP PUSH2 0x88C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x901 JUMPI JUMPDEST POP CODESIZE PUSH2 0x882 JUMP JUMPDEST PUSH2 0x91A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7DF JUMPI PUSH2 0x7D1 DUP2 DUP4 PUSH2 0x61A JUMP JUMPDEST CODESIZE PUSH2 0x8FA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x84B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4C EXP PUSH28 0x1B58D5CF32EF4CD68B599DFFD7EADACD294955AB1D590E12CC63EAD2 PUSH27 0x64736F6C634300081E003300000000000000000000000000000000 ","sourceMap":"295:489:95:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1841:41:69;;:::i;:::-;295:489:95;;;;;;;3174:18:180;;;3170:53;;3113:19:73;295:489:95;;;;636:1:180;900:21:181;;;896:88;;295:489:95;636:1:180;295:489:95;;1031:82:73;;295:489:95;1031:82:73;636:1:180;295:489:95;;;;;;;1095:7:73;295:489:95;1095:7:73;;295:489:95;896:88:181;930:54;295:489:95;930:54:181;295:489:95;;636:1:180;295:489:95;;;;930:54:181;3170:53:180;3201:22;295:489:95;3201:22:180;295:489:95;;;;3201:22:180;295:489:95;;;;;;;;;;;;;;;;;;;2981:31:73;;295:489:95;2981:31:73;3004:8;-1:-1:-1;3004:8:73;;-1:-1:-1;3004:8:73;295:489:95;;;;;;;;;;;;;;;2748:11:73;2744:35;;295:489:95;2744:35:73;2768:11;-1:-1:-1;2768:11:73;;-1:-1:-1;2768:11:73;295:489:95;;;;;;;;;;;;;1841:41:69;;;:::i;:::-;295:489:95;;;;;4503:26:42;;;4499:64;;295:489:95;;;;;2981:31:73;;2005:4;295:489:95;;;;;;;2024:7:73;295:489:95;2024:7:73;;295:489:95;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;295:489:95;;-1:-1:-1;4538:25:42;295:489:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1841:41:69;;;:::i;:::-;295:489:95;;;;;4503:26:42;;;4499:64;;295:489:95;;;;;2748:11:73;2744:35;;295:489:95;;;;;;2307:9:73;295:489:95;2307:9:73;;295:489:95;;;;;;;;;;;;;2076:39:69;;:::i;:::-;295:489:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;295:489:95;;;;;-1:-1:-1;295:489:95;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;295:489:95;2065:19:76;295:489:95;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;295:489:95;720:8:80;295:489:95;720:8:80;;295:489:95;;;;2115:1:76;2802:32;;:::o;2624:153::-;295:489:95;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;295:489:95;2361:10:76;295:489:95;;;;2771:4:76;295:489:95;;;;;-1:-1:-1;2682:95:76;;295:489:95;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;295:489:95;;;2115:1:76;295:489:95;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;295:489:95;1029:19:76;295:489:95;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;295:489:95;;;1676:74:76;;295:489:95;;;1676:74:76;;;295:489:95;1327:10:76;295:489:95;;;;1744:4:76;295:489:95;;;;;-1:-1:-1;1676:74:76;;295:489:95;;;;;;1676:74:76;;;;;;;295:489:95;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"481000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","enforceIsNotPaused()":"2368","enforceIsPaused()":"2349","initPauseStorage(bool)":"infinite","pause()":"infinite","paused()":"2303","unpause()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","enforceIsNotPaused()":"8ebd8073","enforceIsPaused()":"859f7acb","initPauseStorage(bool)":"b606577c","pause()":"8456cb59","paused()":"5c975abb","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enforceIsNotPaused\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enforceIsPaused\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"}],\"name\":\"initPauseStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initPauseStorage(bool)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits a {Paused} event if `isPaused` is true.\",\"params\":{\"isPaused\":\"The initial pause state.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"initPauseStorage(bool)\":{\"notice\":\"Initializes the storage with an initial pause state.Sets the proxy initialization phase to `1`.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/lifecycle/facets/PauseFacetMock.sol\":\"PauseFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/facets/PauseFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {PauseBase} from \\\"./../base/PauseBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Pausing mechanism (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract PauseFacet is PauseBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function initPauseStorage(bool isPaused) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        PauseStorage.layout().proxyInit(isPaused);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xaa8ad01435ea4da77071129ca10902a2d705c89fec447ffc1fe13b5f0de43d71\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/lifecycle/facets/PauseFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PauseStorage} from \\\"./../../../lifecycle/libraries/PauseStorage.sol\\\";\\nimport {PauseFacet} from \\\"./../../../lifecycle/facets/PauseFacet.sol\\\";\\n\\ncontract PauseFacetMock is PauseFacet {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) PauseFacet(forwarderRegistry) {}\\n\\n    function enforceIsPaused() external view {\\n        PauseStorage.layout().enforceIsPaused();\\n    }\\n\\n    function enforceIsNotPaused() external view {\\n        PauseStorage.layout().enforceIsNotPaused();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa8bd8ffe4d957470f96c550183e69d6c66d91e61722ba1a9e853c98a4bdb1acc\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"Pause()":{"notice":"Emitted when the pause is triggered."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"initPauseStorage(bool)":{"notice":"Initializes the storage with an initial pause state.Sets the proxy initialization phase to `1`."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/mocks/metatx/ForwarderMock.sol":{"ForwarderMock":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"forward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"non2771Forward","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080806040523460155761040b908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806382c662a5146101235763e5166b921461003257600080fd5b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011e576100646101b4565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361011e576044359167ffffffffffffffff831161011e57610115601460206100af61011c9636906004016101d7565b947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000866040519788948686013783019160601b168382015203017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4810184520182610205565b34916102af565b005b600080fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011e576101556101b4565b60243567ffffffffffffffff811161011e576101759036906004016101d7565b61018181939293610275565b9061018f6040519283610205565b808252368185011161011e5760208160009261011c96838601378301015234916102af565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361011e57565b9181601f8401121561011e5782359167ffffffffffffffff831161011e576020838186019501011161011e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761024657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161024657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b90929192834710610306576000816102fb94956020839451920190855af13d156102fe573d916102de83610275565b926102ec6040519485610205565b83523d6000602085013e610338565b90565b606091610338565b83477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b90610377575080511561034d57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806103cc575b610388575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b1561038056fea26469706673582212201e1b8b30f811214382c7694b67e55cbc02430047d0e3431baaf330af3626a27464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x40B SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x82C662A5 EQ PUSH2 0x123 JUMPI PUSH4 0xE5166B92 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11E JUMPI PUSH2 0x64 PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x11E JUMPI PUSH1 0x44 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x11E JUMPI PUSH2 0x115 PUSH1 0x14 PUSH1 0x20 PUSH2 0xAF PUSH2 0x11C SWAP7 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1D7 JUMP JUMPDEST SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP7 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP5 DUP7 DUP7 ADD CALLDATACOPY DUP4 ADD SWAP2 PUSH1 0x60 SHL AND DUP4 DUP3 ADD MSTORE SUB ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 DUP2 ADD DUP5 MSTORE ADD DUP3 PUSH2 0x205 JUMP JUMPDEST CALLVALUE SWAP2 PUSH2 0x2AF JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11E JUMPI PUSH2 0x155 PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x11E JUMPI PUSH2 0x175 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1D7 JUMP JUMPDEST PUSH2 0x181 DUP2 SWAP4 SWAP3 SWAP4 PUSH2 0x275 JUMP JUMPDEST SWAP1 PUSH2 0x18F PUSH1 0x40 MLOAD SWAP3 DUP4 PUSH2 0x205 JUMP JUMPDEST DUP1 DUP3 MSTORE CALLDATASIZE DUP2 DUP6 ADD GT PUSH2 0x11E JUMPI PUSH1 0x20 DUP2 PUSH1 0x0 SWAP3 PUSH2 0x11C SWAP7 DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE CALLVALUE SWAP2 PUSH2 0x2AF JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x11E JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x11E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x11E JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x11E JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x246 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x246 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 DUP4 SELFBALANCE LT PUSH2 0x306 JUMPI PUSH1 0x0 DUP2 PUSH2 0x2FB SWAP5 SWAP6 PUSH1 0x20 DUP4 SWAP5 MLOAD SWAP3 ADD SWAP1 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FE JUMPI RETURNDATASIZE SWAP2 PUSH2 0x2DE DUP4 PUSH2 0x275 JUMP JUMPDEST SWAP3 PUSH2 0x2EC PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x205 JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x338 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x338 JUMP JUMPDEST DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x377 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x34D JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x3CC JUMPI JUMPDEST PUSH2 0x388 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x380 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1E SHL DUP12 ADDRESS EXTCALL GT 0x21 NUMBER DUP3 0xC7 PUSH10 0x4B67E55CBC02430047D0 CALLF 0x431B 0xAA RETURN ADDRESS 0xAF CALLDATASIZE 0x26 LOG2 PUSH21 0x64736F6C634300081E003300000000000000000000 ","sourceMap":"125:595:96:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":436,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":471,"id":null,"parameterSlots":2,"returnSlots":2},"array_allocation_size_bytes":{"entryPoint":629,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":517,"id":null,"parameterSlots":2,"returnSlots":0},"fun_functionCallWithValue":{"entryPoint":687,"id":1041,"parameterSlots":3,"returnSlots":1},"fun_verifyCallResultFromTarget":{"entryPoint":824,"id":1133,"parameterSlots":3,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806382c662a5146101235763e5166b921461003257600080fd5b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011e576100646101b4565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361011e576044359167ffffffffffffffff831161011e57610115601460206100af61011c9636906004016101d7565b947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000866040519788948686013783019160601b168382015203017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4810184520182610205565b34916102af565b005b600080fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011e576101556101b4565b60243567ffffffffffffffff811161011e576101759036906004016101d7565b61018181939293610275565b9061018f6040519283610205565b808252368185011161011e5760208160009261011c96838601378301015234916102af565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361011e57565b9181601f8401121561011e5782359167ffffffffffffffff831161011e576020838186019501011161011e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761024657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161024657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b90929192834710610306576000816102fb94956020839451920190855af13d156102fe573d916102de83610275565b926102ec6040519485610205565b83523d6000602085013e610338565b90565b606091610338565b83477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b90610377575080511561034d57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806103cc575b610388575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b1561038056fea26469706673582212201e1b8b30f811214382c7694b67e55cbc02430047d0e3431baaf330af3626a27464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x82C662A5 EQ PUSH2 0x123 JUMPI PUSH4 0xE5166B92 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11E JUMPI PUSH2 0x64 PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x11E JUMPI PUSH1 0x44 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x11E JUMPI PUSH2 0x115 PUSH1 0x14 PUSH1 0x20 PUSH2 0xAF PUSH2 0x11C SWAP7 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1D7 JUMP JUMPDEST SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP7 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP5 DUP7 DUP7 ADD CALLDATACOPY DUP4 ADD SWAP2 PUSH1 0x60 SHL AND DUP4 DUP3 ADD MSTORE SUB ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 DUP2 ADD DUP5 MSTORE ADD DUP3 PUSH2 0x205 JUMP JUMPDEST CALLVALUE SWAP2 PUSH2 0x2AF JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x11E JUMPI PUSH2 0x155 PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x11E JUMPI PUSH2 0x175 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1D7 JUMP JUMPDEST PUSH2 0x181 DUP2 SWAP4 SWAP3 SWAP4 PUSH2 0x275 JUMP JUMPDEST SWAP1 PUSH2 0x18F PUSH1 0x40 MLOAD SWAP3 DUP4 PUSH2 0x205 JUMP JUMPDEST DUP1 DUP3 MSTORE CALLDATASIZE DUP2 DUP6 ADD GT PUSH2 0x11E JUMPI PUSH1 0x20 DUP2 PUSH1 0x0 SWAP3 PUSH2 0x11C SWAP7 DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE CALLVALUE SWAP2 PUSH2 0x2AF JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x11E JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x11E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x11E JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x11E JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x246 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x246 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 DUP4 SELFBALANCE LT PUSH2 0x306 JUMPI PUSH1 0x0 DUP2 PUSH2 0x2FB SWAP5 SWAP6 PUSH1 0x20 DUP4 SWAP5 MLOAD SWAP3 ADD SWAP1 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FE JUMPI RETURNDATASIZE SWAP2 PUSH2 0x2DE DUP4 PUSH2 0x275 JUMP JUMPDEST SWAP3 PUSH2 0x2EC PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x205 JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x338 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x338 JUMP JUMPDEST DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x377 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x34D JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x3CC JUMPI JUMPDEST PUSH2 0x388 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x380 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1E SHL DUP12 ADDRESS EXTCALL GT 0x21 NUMBER DUP3 0xC7 PUSH10 0x4B67E55CBC02430047D0 CALLF 0x431B 0xAA RETURN ADDRESS 0xAF CALLDATASIZE 0x26 LOG2 PUSH21 0x64736F6C634300081E003300000000000000000000 ","sourceMap":"125:595:96:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;671:28;125:595;;;642:69;125:595;;;;;;:::i;:::-;;;;;;671:28;;;;;;125:595;;;;;;;;;;;671:28;;;;;;;;;;:::i;:::-;701:9;642:69;;:::i;:::-;125:595;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;394:45;125:595;;;;;;;;;429:9;394:45;;:::i;125:595::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;125:595:96;;;;;-1:-1:-1;125:595:96;;;;;;;;;;;;;;:::o;2975:407:9:-;;;;;3102:21;;:29;3098:123;;3272:31;;3320:55;3272:31;;;;;;;;;;;;125:595:96;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;3272:31:9;;125:595:96;;;3320:55:9;:::i;:::-;2975:407;:::o;125:595:96:-;;;3320:55:9;:::i;3098:123::-;3181:21;;3154:56;;;;125:595:96;;;;3154:56:9;;4437:582;;4609:8;;-1:-1:-1;125:595:96;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;125:595:96;;4857:22:9;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;125:595:96;4933:24:9;;4878:1;4933:24;125:595:96;4933:24:9;125:595:96;;4878:1:9;4933:24;4857:49;4883:18;;;:23;4857:49;"},"gasEstimates":{"creation":{"codeDepositCost":"207000","executionCost":"257","totalCost":"207257"},"external":{"forward(address,address,bytes)":"infinite","non2771Forward(address,bytes)":"infinite"}},"methodIdentifiers":{"forward(address,address,bytes)":"e5166b92","non2771Forward(address,bytes)":"82c662a5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"forward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"non2771Forward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"forward(address,address,bytes)\":{\"notice\":\"Forward while appending a sender address to the calldata (EIP-2771-compatible)\"},\"non2771Forward(address,bytes)\":{\"notice\":\"Forward without appending a sender address to the calldata, so that msg.data.length < 24 (non-EIP-2771)\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/metatx/ForwarderMock.sol\":\"ForwarderMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"contracts/mocks/metatx/ForwarderMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\ncontract ForwarderMock {\\n    using Address for address;\\n\\n    /// @notice Forward without appending a sender address to the calldata, so that msg.data.length < 24 (non-EIP-2771)\\n    function non2771Forward(address target, bytes calldata data) external payable {\\n        target.functionCallWithValue(data, msg.value);\\n    }\\n\\n    /// @notice Forward while appending a sender address to the calldata (EIP-2771-compatible)\\n    function forward(address from, address target, bytes calldata data) external payable {\\n        target.functionCallWithValue(abi.encodePacked(data, from), msg.value);\\n    }\\n}\\n\",\"keccak256\":\"0xb9881b9ac4bae6673d67fe40054d27ebbe11912a56002a8974af03264e4c868d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"forward(address,address,bytes)":{"notice":"Forward while appending a sender address to the calldata (EIP-2771-compatible)"},"non2771Forward(address,bytes)":{"notice":"Forward without appending a sender address to the calldata, so that msg.data.length < 24 (non-EIP-2771)"}},"version":1}}},"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol":{"ForwarderRegistryReceiverMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smallDataTest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"d","type":"uint256"}],"name":"test","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61070838819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f5760805260405161066d908161009b8239608051818181610232015281816102da015281816103c101526105080152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806329e99f07146102565780632b4c9f16146101e757806338266b221461017f57806347850b6b146100bc5763572b6c051461005357600080fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760043573ffffffffffffffffffffffffffffffffffffffff811681036100b7576100ad6020916102c3565b6040519015158152f35b600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75773ffffffffffffffffffffffffffffffffffffffff6101086103aa565b6101106104f1565b5050166000526000602052604060002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610150576001019055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b75760005260006020526020604060002054604051908152f35b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75773ffffffffffffffffffffffffffffffffffffffff6102a26103aa565b6102aa6104f1565b5050166000526000602052600435604060002055600080f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561031b5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761036357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100b7575180151581036100b75790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104e25732331480156104e7575b6104e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610435575b5061043257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156104d6576000916104a7575b5038610428565b6104c9915060203d6020116104cf575b6104c18183610322565b810190610392565b386104a0565b503d6104b7565b6040513d6000823e3d90fd5b503390565b50601836106103f1565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561062557323314801561062d575b61062557803314908115610584575b50610553576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156104d657600091610606575b5038610547565b61061f915060203d6020116104cf576104c18183610322565b386105ff565b506000903690565b506018361061053856fea2646970667358221220282986968978bcb32a6c5d2f20e0955e6e97596d8be88fb239bdd2f97371625a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x708 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x66D SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x232 ADD MSTORE DUP2 DUP2 PUSH2 0x2DA ADD MSTORE DUP2 DUP2 PUSH2 0x3C1 ADD MSTORE PUSH2 0x508 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x29E99F07 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1E7 JUMPI DUP1 PUSH4 0x38266B22 EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x47850B6B EQ PUSH2 0xBC JUMPI PUSH4 0x572B6C05 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xB7 JUMPI PUSH2 0xAD PUSH1 0x20 SWAP2 PUSH2 0x2C3 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x108 PUSH2 0x3AA JUMP JUMPDEST PUSH2 0x110 PUSH2 0x4F1 JUMP JUMPDEST POP POP AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x150 JUMPI PUSH1 0x1 ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2A2 PUSH2 0x3AA JUMP JUMPDEST PUSH2 0x2AA PUSH2 0x4F1 JUMP JUMPDEST POP POP AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x31B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x363 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4E7 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x435 JUMPI JUMPDEST POP PUSH2 0x432 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4A7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x428 JUMP JUMPDEST PUSH2 0x4C9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4CF JUMPI JUMPDEST PUSH2 0x4C1 DUP2 DUP4 PUSH2 0x322 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x392 JUMP JUMPDEST CODESIZE PUSH2 0x4A0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4B7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3F1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x625 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x62D JUMPI JUMPDEST PUSH2 0x625 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x584 JUMPI JUMPDEST POP PUSH2 0x553 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x606 JUMPI JUMPDEST POP CODESIZE PUSH2 0x547 JUMP JUMPDEST PUSH2 0x61F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4CF JUMPI PUSH2 0x4C1 DUP2 DUP4 PUSH2 0x322 JUMP JUMPDEST CODESIZE PUSH2 0x5FF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x538 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x28 0x29 DUP7 SWAP7 DUP10 PUSH25 0xBCB32A6C5D2F20E0955E6E97596D8BE88FB239BDD2F9737162 GAS PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"225:643:97:-:0;;;;;;;;;;;;;-1:-1:-1;;225:643:97;;;;-1:-1:-1;;;;;225:643:97;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;225:643:97;;;;;;745:39:76;;225:643:97;;;;;;;;745:39:76;225:643:97;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;225:643:97;;;;;;-1:-1:-1;225:643:97;;;;;-1:-1:-1;225:643:97"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":914,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":802,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":707,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":1265,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":938,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":562},{"length":32,"start":730},{"length":32,"start":961},{"length":32,"start":1288}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806329e99f07146102565780632b4c9f16146101e757806338266b221461017f57806347850b6b146100bc5763572b6c051461005357600080fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760043573ffffffffffffffffffffffffffffffffffffffff811681036100b7576100ad6020916102c3565b6040519015158152f35b600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75773ffffffffffffffffffffffffffffffffffffffff6101086103aa565b6101106104f1565b5050166000526000602052604060002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610150576001019055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b75760005260006020526020604060002054604051908152f35b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75773ffffffffffffffffffffffffffffffffffffffff6102a26103aa565b6102aa6104f1565b5050166000526000602052600435604060002055600080f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561031b5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761036357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100b7575180151581036100b75790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104e25732331480156104e7575b6104e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610435575b5061043257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156104d6576000916104a7575b5038610428565b6104c9915060203d6020116104cf575b6104c18183610322565b810190610392565b386104a0565b503d6104b7565b6040513d6000823e3d90fd5b503390565b50601836106103f1565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561062557323314801561062d575b61062557803314908115610584575b50610553576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156104d657600091610606575b5038610547565b61061f915060203d6020116104cf576104c18183610322565b386105ff565b506000903690565b506018361061053856fea2646970667358221220282986968978bcb32a6c5d2f20e0955e6e97596d8be88fb239bdd2f97371625a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x29E99F07 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1E7 JUMPI DUP1 PUSH4 0x38266B22 EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x47850B6B EQ PUSH2 0xBC JUMPI PUSH4 0x572B6C05 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xB7 JUMPI PUSH2 0xAD PUSH1 0x20 SWAP2 PUSH2 0x2C3 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x108 PUSH2 0x3AA JUMP JUMPDEST PUSH2 0x110 PUSH2 0x4F1 JUMP JUMPDEST POP POP AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x150 JUMPI PUSH1 0x1 ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2A2 PUSH2 0x3AA JUMP JUMPDEST PUSH2 0x2AA PUSH2 0x4F1 JUMP JUMPDEST POP POP AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x31B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x363 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4E7 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x435 JUMPI JUMPDEST POP PUSH2 0x432 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4A7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x428 JUMP JUMPDEST PUSH2 0x4C9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4CF JUMPI JUMPDEST PUSH2 0x4C1 DUP2 DUP4 PUSH2 0x322 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x392 JUMP JUMPDEST CODESIZE PUSH2 0x4A0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4B7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3F1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x625 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x62D JUMPI JUMPDEST PUSH2 0x625 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x584 JUMPI JUMPDEST POP PUSH2 0x553 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x606 JUMPI JUMPDEST POP CODESIZE PUSH2 0x547 JUMP JUMPDEST PUSH2 0x61F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4CF JUMPI PUSH2 0x4C1 DUP2 DUP4 PUSH2 0x322 JUMP JUMPDEST CODESIZE PUSH2 0x5FF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x538 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x28 0x29 DUP7 SWAP7 DUP10 PUSH25 0xBCB32A6C5D2F20E0955E6E97596D8BE88FB239BDD2F9737162 GAS PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"225:643:97:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;576:12;;:::i;:::-;598:10;;:::i;:::-;225:643;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;225:643:97;;;;;;;;;;;;;;;;704:12;;:::i;:::-;726:10;;:::i;:::-;225:643;;;;;;;;;;;;;;;;;1002:301:75;225:643:97;1146:19:75;225:643:97;1146:53:75;;;1142:96;;225:643:97;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;225:643:97;1215:12:75;:::o;225:643:97:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;225:643:97;;;;;-1:-1:-1;225:643:97;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;225:643:97;1029:19:76;225:643:97;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;225:643:97;;;1676:74:76;;225:643:97;;;1676:74:76;;;225:643:97;1327:10:76;225:643:97;;;;1744:4:76;225:643:97;;;;;-1:-1:-1;1676:74:76;;225:643:97;;;;;;1676:74:76;;;;;;;225:643:97;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;225:643:97;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;225:643:97;2065:19:76;225:643:97;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;225:643:97;720:8:80;225:643:97;720:8:80;;225:643:97;;;;2115:1:76;2802:32;;:::o;2624:153::-;225:643:97;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;225:643:97;2361:10:76;225:643:97;;;;2771:4:76;225:643:97;;;;;-1:-1:-1;2682:95:76;;225:643:97;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"329000","executionCost":"infinite","totalCost":"infinite"},"external":{"forwarderRegistry()":"infinite","getData(address)":"2388","isTrustedForwarder(address)":"infinite","smallDataTest()":"infinite","test(uint256)":"infinite"}},"methodIdentifiers":{"forwarderRegistry()":"2b4c9f16","getData(address)":"38266b22","isTrustedForwarder(address)":"572b6c05","smallDataTest()":"47850b6b","test(uint256)":"29e99f07"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"who\",\"type\":\"address\"}],\"name\":\"getData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"smallDataTest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"d\",\"type\":\"uint256\"}],\"name\":\"test\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol\":\"ForwarderRegistryReceiverMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ForwarderRegistryReceiverMock is ForwarderRegistryContext {\\n    mapping(address => uint256) internal _d;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    // test function without arguments, so that msg.data.length < 24\\n    function smallDataTest() external {\\n        address sender = _msgSender();\\n        _msgData();\\n        ++_d[sender];\\n    }\\n\\n    function test(uint256 d) external {\\n        address sender = _msgSender();\\n        _msgData();\\n        _d[sender] = d;\\n    }\\n\\n    function getData(address who) external view returns (uint256) {\\n        return _d[who];\\n    }\\n}\\n\",\"keccak256\":\"0x869a8c21b9d6e69be60b64ca24945ed3247b160717d268239034b948174bf551\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":14623,"contract":"contracts/mocks/metatx/ForwarderRegistryReceiverMock.sol:ForwarderRegistryReceiverMock","label":"_d","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."}},"version":1}}},"contracts/mocks/payment/CumulativeMerkleClaimMock.sol":{"CumulativeMerkleClaimMock":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"InvalidProof","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Distributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootSet","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"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"PayoutClaimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AlreadyClaimed(address,bytes,uint256)":[{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim."}}],"InvalidProof(address,bytes,uint256)":[{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"MerkleRootSet(bytes32)":{"params":{"root":"The new merkle root."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"PayoutClaimed(bytes32,address,bytes,uint256)":{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim.","root":"The merkle root on which the claim was made."}}},"kind":"dev","methods":{"claimPayout(address,bytes,bytes32[])":{"details":"Reverts with {Paused} if the contract is paused.Reverts with {AlreadyClaimed} if this specific payout has already been claimed.Reverts with {InvalidProof} if the merkle proof cannot be verified.Emits a {PayoutClaimed} event.","params":{"claimData":"Encoded claim data for `recipient`","proof":"Merkle proof of the user based on the merkle root","recipient":"Address of the user to claim the payout"}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"setMerkleRoot(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.Emits a {MerkleRootSet} event.","params":{"merkleRoot":"The merkle root to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6080806040523461010657336100a7575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020526040600020600160ff19825416179055600160ff19600080516020610d2c833981519152541617600080516020610d2c833981519152557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1610c20908161010c8239f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610010565b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610a305780633f4ba83a1461094a5780635c975abb146108ea5780637cb647591461079b5780638456cb59146106855780638da5cb5b14610614578063affed0e0146105d8578063cc3c0f0614610589578063ebf0c7171461054d578063edcdebcc146101b05763f2fde38b1461009557600080fd5b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576100cc610aa0565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9081549173ffffffffffffffffffffffffffffffffffffffff83169182330361017d5773ffffffffffffffffffffffffffffffffffffffff169283830361013057005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b600080fd5b346101ab5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576101e7610aa0565b60243567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff82116101ab576024810191808201923660248501116101ab576044359267ffffffffffffffff84116101ab57366023850112156101ab5783600401359467ffffffffffffffff86116101ab573660248760051b870101116101ab5760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661052357600154936000549060405195602087019673ffffffffffffffffffffffffffffffffffffffff8b16977fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008c60601b168152838860348401377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f60348487810187838201520301808552011682019180831067ffffffffffffffff8411176104f457826040525190209081600052600260205260ff604060002054166104bf575060009a815b8b8d101561039e5760408d60019260248e60009360051b01013590818110600014610392578252602052205b9c019b61035e565b9082526020522061038a565b850361048257506024937f6a4408e44c908d501056e1ef88baf30a72467f3a181544a67a30cb14c8e8059888602098957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc98958c9560005260028b52604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905561043f604051938493604085526040850191610ac3565b908b8301520390a3030101126101ab577fb649c98f58055c520df0dcb5709eff2e931217ff2fb1e21376130d31bbb1c0af916040918251918252356020820152a1005b87906104bb84866040519485947f91ebfb3100000000000000000000000000000000000000000000000000000000865260048601610b02565b0390fd5b806104bb84868f8c907f7fbf254700000000000000000000000000000000000000000000000000000000865260048601610b02565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576020600054604051908152f35b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576004356000526002602052602060ff604060002054166040519015158152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576020600154604051908152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc54339073ffffffffffffffffffffffffffffffffffffffff16810361076e577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166105235760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5460043590339073ffffffffffffffffffffffffffffffffffffffff16810361076e57507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e9081549060ff8216156108c0577f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006020931690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1806000556001805401600155604051908152a1005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab57602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc54339073ffffffffffffffffffffffffffffffffffffffff16810361076e577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff8116156108c0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101ab57610a96602091610b3b565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ab57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9493929160409273ffffffffffffffffffffffffffffffffffffffff610b3693168752606060208801526060870191610ac3565b930152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610be4577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610bde576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea26469706673582212206a602bb1395603aa60ff4def882b4b85e60ca5f0e942ef074ff0b0355a21828264736f6c634300081e00330186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x106 JUMPI CALLER PUSH2 0xA7 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xD2C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0xD2C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 PUSH2 0xC20 SWAP1 DUP2 PUSH2 0x10C DUP3 CODECOPY RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x10 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x94A JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x8EA JUMPI DUP1 PUSH4 0x7CB64759 EQ PUSH2 0x79B JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x685 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x5D8 JUMPI DUP1 PUSH4 0xCC3C0F06 EQ PUSH2 0x589 JUMPI DUP1 PUSH4 0xEBF0C717 EQ PUSH2 0x54D JUMPI DUP1 PUSH4 0xEDCDEBCC EQ PUSH2 0x1B0 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH2 0xCC PUSH2 0xAA0 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 DUP2 SLOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 DUP3 CALLER SUB PUSH2 0x17D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x130 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH2 0x1E7 PUSH2 0xAA0 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1AB JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AB JUMPI PUSH1 0x24 DUP2 ADD SWAP2 DUP1 DUP3 ADD SWAP3 CALLDATASIZE PUSH1 0x24 DUP6 ADD GT PUSH2 0x1AB JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0x1AB JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP5 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x24 DUP8 PUSH1 0x5 SHL DUP8 ADD ADD GT PUSH2 0x1AB JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x523 JUMPI PUSH1 0x1 SLOAD SWAP4 PUSH1 0x0 SLOAD SWAP1 PUSH1 0x40 MLOAD SWAP6 PUSH1 0x20 DUP8 ADD SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP13 PUSH1 0x60 SHL AND DUP2 MSTORE DUP4 DUP9 PUSH1 0x34 DUP5 ADD CALLDATACOPY PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F PUSH1 0x34 DUP5 DUP8 DUP2 ADD DUP8 DUP4 DUP3 ADD MSTORE SUB ADD DUP1 DUP6 MSTORE ADD AND DUP3 ADD SWAP2 DUP1 DUP4 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT OR PUSH2 0x4F4 JUMPI DUP3 PUSH1 0x40 MSTORE MLOAD SWAP1 KECCAK256 SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x4BF JUMPI POP PUSH1 0x0 SWAP11 DUP2 JUMPDEST DUP12 DUP14 LT ISZERO PUSH2 0x39E JUMPI PUSH1 0x40 DUP14 PUSH1 0x1 SWAP3 PUSH1 0x24 DUP15 PUSH1 0x0 SWAP4 PUSH1 0x5 SHL ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 LT PUSH1 0x0 EQ PUSH2 0x392 JUMPI DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 JUMPDEST SWAP13 ADD SWAP12 PUSH2 0x35E JUMP JUMPDEST SWAP1 DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 PUSH2 0x38A JUMP JUMPDEST DUP6 SUB PUSH2 0x482 JUMPI POP PUSH1 0x24 SWAP4 PUSH32 0x6A4408E44C908D501056E1EF88BAF30A72467F3A181544A67A30CB14C8E80598 DUP9 PUSH1 0x20 SWAP9 SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC SWAP9 SWAP6 DUP13 SWAP6 PUSH1 0x0 MSTORE PUSH1 0x2 DUP12 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x43F PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH1 0x40 DUP6 MSTORE PUSH1 0x40 DUP6 ADD SWAP2 PUSH2 0xAC3 JUMP JUMPDEST SWAP1 DUP12 DUP4 ADD MSTORE SUB SWAP1 LOG3 SUB ADD ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xB649C98F58055C520DF0DCB5709EFF2E931217FF2FB1E21376130D31BBB1C0AF SWAP2 PUSH1 0x40 SWAP2 DUP3 MLOAD SWAP2 DUP3 MSTORE CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST DUP8 SWAP1 PUSH2 0x4BB DUP5 DUP7 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0x91EBFB3100000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xB02 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x4BB DUP5 DUP7 DUP16 DUP13 SWAP1 PUSH32 0x7FBF254700000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xB02 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x523 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD PUSH1 0x4 CALLDATALOAD SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 DUP2 SLOAD SWAP1 PUSH1 0xFF DUP3 AND ISZERO PUSH2 0x8C0 JUMPI PUSH32 0x42CBC405E4DBF1B691E85B9A34B08ECFCF7A9AD9078BF4D645CCFA1FAC11C10B SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH1 0x20 SWAP4 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 DUP1 PUSH1 0x0 SSTORE PUSH1 0x1 DUP1 SLOAD ADD PUSH1 0x1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND ISZERO PUSH2 0x8C0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1AB JUMPI PUSH2 0xA96 PUSH1 0x20 SWAP2 PUSH2 0xB3B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AB JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB36 SWAP4 AND DUP8 MSTORE PUSH1 0x60 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD SWAP2 PUSH2 0xAC3 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBE4 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBDE JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0x602BB1395603AA60FF4DEF DUP9 0x2B 0x4B DUP6 DUPN 0xC 0xA5 CREATE 0xE9 TIMESTAMP 0xEF SMOD 0x4F CREATE 0xB0 CALLDATALOAD GAS 0x21 DUP3 DUP3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ADD DUP7 LOG0 PUSH0 PUSH4 0xB1553398 0xAD MCOPY LOG3 0x23 EXTCODECOPY 0xC DUPN 0x8B DUP13 SWAP15 EOFCREATE 0xC4 PUSH24 0x17F123C5C2B42FBD6D9E0000000000000000000000000000 ","sourceMap":"139:336:98:-:0;;;;;;;2630:10:165;1645:152:42;;-1:-1:-1;1863:25:42;;;-1:-1:-1;500:10:59;139:336:98;500:10:59;;139:336:98;-1:-1:-1;500:10:59;2606:4:165;139:336:98;;;;;;;;2606:4:165;139:336:98;;-1:-1:-1;;;;;;;;;;;139:336:98;;;-1:-1:-1;;;;;;;;;;;139:336:98;1095:7:73;-1:-1:-1;1095:7:73;;139:336:98;;;;;;;1645:152:42;139:336:98;;;-1:-1:-1;;;;;;139:336:98;2630:10:165;139:336:98;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;139:336:98;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2720,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_bytes_calldata_uint256":{"entryPoint":2818,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":2755,"id":null,"parameterSlots":3,"returnSlots":1},"fun_supportsInterface":{"entryPoint":2875,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610a305780633f4ba83a1461094a5780635c975abb146108ea5780637cb647591461079b5780638456cb59146106855780638da5cb5b14610614578063affed0e0146105d8578063cc3c0f0614610589578063ebf0c7171461054d578063edcdebcc146101b05763f2fde38b1461009557600080fd5b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576100cc610aa0565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9081549173ffffffffffffffffffffffffffffffffffffffff83169182330361017d5773ffffffffffffffffffffffffffffffffffffffff169283830361013057005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b600080fd5b346101ab5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576101e7610aa0565b60243567ffffffffffffffff81116101ab57366023820112156101ab5780600401359067ffffffffffffffff82116101ab576024810191808201923660248501116101ab576044359267ffffffffffffffff84116101ab57366023850112156101ab5783600401359467ffffffffffffffff86116101ab573660248760051b870101116101ab5760ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e541661052357600154936000549060405195602087019673ffffffffffffffffffffffffffffffffffffffff8b16977fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008c60601b168152838860348401377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f60348487810187838201520301808552011682019180831067ffffffffffffffff8411176104f457826040525190209081600052600260205260ff604060002054166104bf575060009a815b8b8d101561039e5760408d60019260248e60009360051b01013590818110600014610392578252602052205b9c019b61035e565b9082526020522061038a565b850361048257506024937f6a4408e44c908d501056e1ef88baf30a72467f3a181544a67a30cb14c8e8059888602098957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc98958c9560005260028b52604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905561043f604051938493604085526040850191610ac3565b908b8301520390a3030101126101ab577fb649c98f58055c520df0dcb5709eff2e931217ff2fb1e21376130d31bbb1c0af916040918251918252356020820152a1005b87906104bb84866040519485947f91ebfb3100000000000000000000000000000000000000000000000000000000865260048601610b02565b0390fd5b806104bb84868f8c907f7fbf254700000000000000000000000000000000000000000000000000000000865260048601610b02565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f9e87fac80000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576020600054604051908152f35b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576004356000526002602052602060ff604060002054166040519015158152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576020600154604051908152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc54339073ffffffffffffffffffffffffffffffffffffffff16810361076e577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e60ff8154166105235760017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625600080a1005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5460043590339073ffffffffffffffffffffffffffffffffffffffff16810361076e57507f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e9081549060ff8216156108c0577f42cbc405e4dbf1b691e85b9a34b08ecfcf7a9ad9078bf4d645ccfa1fac11c10b927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006020931690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1806000556001805401600155604051908152a1005b7f6cd602010000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab57602060ff7f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e54166040519015158152f35b346101ab5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc54339073ffffffffffffffffffffffffffffffffffffffff16810361076e577f0186a05f63b1553398ad5ea3233c0ce68b8c9eecc47717f123c5c2b42fbd6d9e805460ff8116156108c0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33600080a1005b346101ab5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ab576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101ab57610a96602091610b3b565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ab57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9493929160409273ffffffffffffffffffffffffffffffffffffffff610b3693168752606060208801526060870191610ac3565b930152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610be4577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610bde576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea26469706673582212206a602bb1395603aa60ff4def882b4b85e60ca5f0e942ef074ff0b0355a21828264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x94A JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x8EA JUMPI DUP1 PUSH4 0x7CB64759 EQ PUSH2 0x79B JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x685 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x5D8 JUMPI DUP1 PUSH4 0xCC3C0F06 EQ PUSH2 0x589 JUMPI DUP1 PUSH4 0xEBF0C717 EQ PUSH2 0x54D JUMPI DUP1 PUSH4 0xEDCDEBCC EQ PUSH2 0x1B0 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH2 0xCC PUSH2 0xAA0 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 DUP2 SLOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 DUP3 CALLER SUB PUSH2 0x17D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x130 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH2 0x1E7 PUSH2 0xAA0 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1AB JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AB JUMPI PUSH1 0x24 DUP2 ADD SWAP2 DUP1 DUP3 ADD SWAP3 CALLDATASIZE PUSH1 0x24 DUP6 ADD GT PUSH2 0x1AB JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0x1AB JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP5 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0x1AB JUMPI CALLDATASIZE PUSH1 0x24 DUP8 PUSH1 0x5 SHL DUP8 ADD ADD GT PUSH2 0x1AB JUMPI PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH2 0x523 JUMPI PUSH1 0x1 SLOAD SWAP4 PUSH1 0x0 SLOAD SWAP1 PUSH1 0x40 MLOAD SWAP6 PUSH1 0x20 DUP8 ADD SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 DUP13 PUSH1 0x60 SHL AND DUP2 MSTORE DUP4 DUP9 PUSH1 0x34 DUP5 ADD CALLDATACOPY PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F PUSH1 0x34 DUP5 DUP8 DUP2 ADD DUP8 DUP4 DUP3 ADD MSTORE SUB ADD DUP1 DUP6 MSTORE ADD AND DUP3 ADD SWAP2 DUP1 DUP4 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT OR PUSH2 0x4F4 JUMPI DUP3 PUSH1 0x40 MSTORE MLOAD SWAP1 KECCAK256 SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x4BF JUMPI POP PUSH1 0x0 SWAP11 DUP2 JUMPDEST DUP12 DUP14 LT ISZERO PUSH2 0x39E JUMPI PUSH1 0x40 DUP14 PUSH1 0x1 SWAP3 PUSH1 0x24 DUP15 PUSH1 0x0 SWAP4 PUSH1 0x5 SHL ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 LT PUSH1 0x0 EQ PUSH2 0x392 JUMPI DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 JUMPDEST SWAP13 ADD SWAP12 PUSH2 0x35E JUMP JUMPDEST SWAP1 DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 PUSH2 0x38A JUMP JUMPDEST DUP6 SUB PUSH2 0x482 JUMPI POP PUSH1 0x24 SWAP4 PUSH32 0x6A4408E44C908D501056E1EF88BAF30A72467F3A181544A67A30CB14C8E80598 DUP9 PUSH1 0x20 SWAP9 SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC SWAP9 SWAP6 DUP13 SWAP6 PUSH1 0x0 MSTORE PUSH1 0x2 DUP12 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x43F PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH1 0x40 DUP6 MSTORE PUSH1 0x40 DUP6 ADD SWAP2 PUSH2 0xAC3 JUMP JUMPDEST SWAP1 DUP12 DUP4 ADD MSTORE SUB SWAP1 LOG3 SUB ADD ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xB649C98F58055C520DF0DCB5709EFF2E931217FF2FB1E21376130D31BBB1C0AF SWAP2 PUSH1 0x40 SWAP2 DUP3 MLOAD SWAP2 DUP3 MSTORE CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST DUP8 SWAP1 PUSH2 0x4BB DUP5 DUP7 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0x91EBFB3100000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xB02 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x4BB DUP5 DUP7 DUP16 DUP13 SWAP1 PUSH32 0x7FBF254700000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xB02 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x9E87FAC800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E PUSH1 0xFF DUP2 SLOAD AND PUSH2 0x523 JUMPI PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD PUSH1 0x4 CALLDATALOAD SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI POP PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SWAP1 DUP2 SLOAD SWAP1 PUSH1 0xFF DUP3 AND ISZERO PUSH2 0x8C0 JUMPI PUSH32 0x42CBC405E4DBF1B691E85B9A34B08ECFCF7A9AD9078BF4D645CCFA1FAC11C10B SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH1 0x20 SWAP4 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 DUP1 PUSH1 0x0 SSTORE PUSH1 0x1 DUP1 SLOAD ADD PUSH1 0x1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 STOP JUMPDEST PUSH32 0x6CD6020100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 SUB PUSH2 0x76E JUMPI PUSH32 0x186A05F63B1553398AD5EA3233C0CE68B8C9EECC47717F123C5C2B42FBD6D9E DUP1 SLOAD PUSH1 0xFF DUP2 AND ISZERO PUSH2 0x8C0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x0 DUP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1AB JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AB JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1AB JUMPI PUSH2 0xA96 PUSH1 0x20 SWAP2 PUSH2 0xB3B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AB JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB36 SWAP4 AND DUP8 MSTORE PUSH1 0x60 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD SWAP2 PUSH2 0xAC3 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBE4 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBDE JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0x602BB1395603AA60FF4DEF DUP9 0x2B 0x4B DUP6 DUPN 0xC 0xA5 CREATE 0xE9 TIMESTAMP 0xEF SMOD 0x4F CREATE 0xB0 CALLDATALOAD GAS 0x21 DUP3 DUP3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"139:336:98:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;735:10:10;;;3205:23:42;3201:60;;139:336:98;;3275:25:42;;;;3271:146;;139:336:98;3271:146:42;139:336:98;;;;;;3361:45:42;139:336:98;;3361:45:42;139:336:98;3201:60:42;3237:24;139:336:98;3237:24:42;735:10:10;139:336:98;;;;3237:24:42;139:336:98;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2981:31:73;;4080:5:165;139:336:98;;;;;;;4156:52:165;139:336:98;4156:52:165;;139:336:98;;;;;;;;;;;;;;;;;;4156:52:165;139:336:98;;;;;;;;;;;4156:52:165;;;;;139:336:98;;;;;;;;;;;;;;;;;;4146:63:165;;139:336:98;;;;4224:7:165;139:336:98;;;;;;;;4220:76:165;;-1:-1:-1;139:336:98;;5324:27:18;5399:3;5381:16;;;;;;139:336:98;;4080:5:165;139:336:98;;;;;;;;;;605:59:17;:5;;;:59;:5;;;889:135;;139:336:98;889:135:17;;605:59;5399:3:18;139:336:98;5366:13:18;;;605:59:17;889:135;;;139:336:98;889:135:17;;605:59;;5381:16:18;;4761:41;4306:101:165;;139:336:98;;;4454:62:165;139:336:98;;;;;;;;;;;4224:7:165;139:336:98;;;;;4080:5:165;139:336:98;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;4454:62:165;;;139:336:98;;;;;;436:30;139:336;;;;;;;;;;;;;436:30;139:336;4306:101:165;139:336:98;;4359:48:165;139:336:98;;;;4359:48:165;;;;;;139:336:98;4359:48:165;;;:::i;:::-;;;;4220:76;4246:50;;;;;;;;;;139:336:98;4246:50:165;;;:::i;139:336:98:-;;;;;;;;;;2981:31:73;3004:8;-1:-1:-1;3004:8:73;;-1:-1:-1;3004:8:73;139:336:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1373:39:165;139:336:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1346:20:165;139:336:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;735:10:10;;139:336:98;;4503:26:42;;4499:64;;139:336:98;;;;;2981:31:73;;2005:4;139:336:98;;;;;;;2024:7:73;139:336:98;2024:7:73;;139:336:98;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;139:336:98;;-1:-1:-1;4538:25:42;139:336:98;;;;;;;;;;;;;;;;735:10:10;;139:336:98;;4503:26:42;;4499:64;;3113:19:73;139:336:98;;;;;;;;2748:11:73;2744:35;;3293:25:165;139:336:98;;;;;;;2307:9:73;-1:-1:-1;2307:9:73;;139:336:98;;;;;;;;;;;;;;3293:25:165;139:336:98;2744:35:73;2768:11;-1:-1:-1;2768:11:73;;-1:-1:-1;2768:11:73;139:336:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;735:10:10;;139:336:98;;4503:26:42;;4499:64;;139:336:98;;;;;;2748:11:73;2744:35;;139:336:98;;;;2307:9:73;-1:-1:-1;2307:9:73;;139:336:98;;;;;;;;;;;;;;;;;;;;;635:65:55;139:336:98;635:65:55;;:::i;:::-;139:336:98;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;139:336:98;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;1359:340:59:-;139:336:98;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;139:336:98;500:10:59;139:336:98;500:10:59;;139:336:98;500:10:59;139:336:98;500:10:59;139:336:98;;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;139:336:98;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"620800","executionCost":"75781","totalCost":"696581"},"external":{"claimPayout(address,bytes,bytes32[])":"infinite","claimed(bytes32)":"2479","nonce()":"2379","owner()":"2363","pause()":"29443","paused()":"2303","root()":"2423","setMerkleRoot(bytes32)":"74692","supportsInterface(bytes4)":"2433","transferOwnership(address)":"26199","unpause()":"27274"},"internal":{"_distributePayout(address,bytes calldata)":"infinite"}},"methodIdentifiers":{"claimPayout(address,bytes,bytes32[])":"edcdebcc","claimed(bytes32)":"cc3c0f06","nonce()":"affed0e0","owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","root()":"ebf0c717","setMerkleRoot(bytes32)":"7cb64759","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Distributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"MerkleRootSet\",\"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\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"PayoutClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"claimPayout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"claimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"root\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"setMerkleRoot\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AlreadyClaimed(address,bytes,uint256)\":[{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\"}}],\"InvalidProof(address,bytes,uint256)\":[{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"MerkleRootSet(bytes32)\":{\"params\":{\"root\":\"The new merkle root.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"PayoutClaimed(bytes32,address,bytes,uint256)\":{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\",\"root\":\"The merkle root on which the claim was made.\"}}},\"kind\":\"dev\",\"methods\":{\"claimPayout(address,bytes,bytes32[])\":{\"details\":\"Reverts with {Paused} if the contract is paused.Reverts with {AlreadyClaimed} if this specific payout has already been claimed.Reverts with {InvalidProof} if the merkle proof cannot be verified.Emits a {PayoutClaimed} event.\",\"params\":{\"claimData\":\"Encoded claim data for `recipient`\",\"proof\":\"Merkle proof of the user based on the merkle root\",\"recipient\":\"Address of the user to claim the payout\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"setMerkleRoot(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.Emits a {MerkleRootSet} event.\",\"params\":{\"merkleRoot\":\"The merkle root to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyClaimed(address,bytes,uint256)\":[{\"notice\":\"Thrown when trying to claim the same leaf more than once.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InvalidProof(address,bytes,uint256)\":[{\"notice\":\"Thrown when a proof cannot be verified.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"MerkleRootSet(bytes32)\":{\"notice\":\"Emitted when a new merkle root is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"PayoutClaimed(bytes32,address,bytes,uint256)\":{\"notice\":\"Emitted when a payout is claimed.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"claimPayout(address,bytes,bytes32[])\":{\"notice\":\"Executes the payout for a given user (anyone can call this function).\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"setMerkleRoot(bytes32)\":{\"notice\":\"Sets the merkle root for a new claiming period and unpauses the contract.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/payment/CumulativeMerkleClaimMock.sol\":\"CumulativeMerkleClaimMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/Hashes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library of standard hash functions.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Hashes {\\n    /**\\n     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\\n     *\\n     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n     */\\n    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {\\n        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);\\n    }\\n\\n    /**\\n     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n     */\\n    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, a)\\n            mstore(0x20, b)\\n            value := keccak256(0x00, 0x40)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8cbd338f083224b4b6f0ff42cbda641a0a6c31ffcdca197452b97fe4d0918269\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)\\n// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.\\n\\npragma solidity ^0.8.20;\\n\\nimport {Hashes} from \\\"./Hashes.sol\\\";\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the Merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\\n * against this attack out of the box.\\n *\\n * IMPORTANT: Consider memory side-effects when using custom hashing functions\\n * that access memory in an unsafe way.\\n *\\n * NOTE: This library supports proof verification for merkle trees built using\\n * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving\\n * leaf inclusion in trees built using non-commutative hashing functions requires\\n * additional logic that is not supported by this library.\\n */\\nlibrary MerkleProof {\\n    /**\\n     *@dev The multiproof provided is not valid.\\n     */\\n    error MerkleProofInvalidMultiproof();\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProof(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function verify(\\n        bytes32[] memory proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProof(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function processProof(\\n        bytes32[] memory proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProofCalldata(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function verifyCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProofCalldata(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function processProofCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x36a0c409c437a753cac9b92b75f93b0fbe92803bf2c8ff1517e54b247f166134\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Pause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PauseStorage} from \\\"./libraries/PauseStorage.sol\\\";\\nimport {PauseBase} from \\\"./base/PauseBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Pausing mechanism (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Pause is PauseBase, ContractOwnership {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    constructor(bool isPaused) {\\n        PauseStorage.layout().constructorInit(isPaused);\\n    }\\n}\\n\",\"keccak256\":\"0x2d5ed9d279d9fbaff12a44d109bd722814eb8dbedcbc6957a176e397e309f338\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/mocks/payment/CumulativeMerkleClaimMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {CumulativeMerkleClaim} from \\\"./../../payment/CumulativeMerkleClaim.sol\\\";\\n\\ncontract CumulativeMerkleClaimMock is CumulativeMerkleClaim {\\n    event Distributed(address recipient, uint256 amount);\\n\\n    function _distributePayout(address recipient, bytes calldata claimData) internal virtual override {\\n        uint256 amount = abi.decode(claimData, (uint256));\\n        emit Distributed(recipient, amount);\\n    }\\n}\\n\",\"keccak256\":\"0xce5b7bce4e2a31c4c1b52f43480dff9f7c9dfef5b6ba382bbf27aeec720e4b57\",\"license\":\"MIT\"},\"contracts/payment/CumulativeMerkleClaim.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {MerkleProof} from \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PauseStorage} from \\\"./../lifecycle/libraries/PauseStorage.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\nimport {Pause} from \\\"./../lifecycle/Pause.sol\\\";\\n\\n/// @title CumulativeMerkleClaim\\n/// @notice This contract is designed for claiming payouts which will cumulate over time.\\n/// @notice A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).\\n/// @notice Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the current\\n/// @notice unclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.\\n/// @notice A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees.\\nabstract contract CumulativeMerkleClaim is Pause {\\n    using MerkleProof for bytes32[];\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    bytes32 public root;\\n    uint256 public nonce;\\n\\n    mapping(bytes32 => bool) public claimed;\\n\\n    /// @notice Emitted when a new merkle root is set.\\n    /// @param root The new merkle root.\\n    event MerkleRootSet(bytes32 root);\\n\\n    /// @notice Emitted when a payout is claimed.\\n    /// @param root The merkle root on which the claim was made.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    event PayoutClaimed(bytes32 indexed root, address indexed recipient, bytes claimData, uint256 nonce);\\n\\n    /// @notice Thrown when trying to claim the same leaf more than once.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    error AlreadyClaimed(address recipient, bytes claimData, uint256 nonce);\\n\\n    /// @notice Thrown when a proof cannot be verified.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    error InvalidProof(address recipient, bytes claimData, uint256 nonce);\\n\\n    constructor() Pause(true) ContractOwnership(msg.sender) {}\\n\\n    /// @notice Sets the merkle root for a new claiming period and unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    /// @dev Emits a {MerkleRootSet} event.\\n    /// @param merkleRoot The merkle root to set.\\n    function setMerkleRoot(bytes32 merkleRoot) public {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n        root = merkleRoot;\\n        unchecked {\\n            ++nonce;\\n        }\\n        emit MerkleRootSet(merkleRoot);\\n    }\\n\\n    /// @notice Executes the payout for a given user (anyone can call this function).\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Reverts with {AlreadyClaimed} if this specific payout has already been claimed.\\n    /// @dev Reverts with {InvalidProof} if the merkle proof cannot be verified.\\n    /// @dev Emits a {PayoutClaimed} event.\\n    /// @param recipient Address of the user to claim the payout\\n    /// @param claimData Encoded claim data for `recipient`\\n    /// @param proof Merkle proof of the user based on the merkle root\\n    function claimPayout(address recipient, bytes calldata claimData, bytes32[] calldata proof) external {\\n        PauseStorage.layout().enforceIsNotPaused();\\n\\n        uint256 currentNonce = nonce;\\n        bytes32 currentRoot = root;\\n        bytes32 leaf = keccak256(abi.encodePacked(recipient, claimData, currentNonce));\\n\\n        if (claimed[leaf]) revert AlreadyClaimed(recipient, claimData, currentNonce);\\n        if (!proof.verifyCalldata(currentRoot, leaf)) revert InvalidProof(recipient, claimData, currentNonce);\\n\\n        claimed[leaf] = true;\\n\\n        emit PayoutClaimed(currentRoot, recipient, claimData, currentNonce);\\n\\n        _distributePayout(recipient, claimData);\\n    }\\n\\n    /// @notice Distributes the payout to the recipient.\\n    /// @dev This virtual function must be implemented by inheriting contracts.\\n    /// @param recipient Address of the user to claim the payout\\n    /// @param claimData Encoded claim data for `recipient`. The encoding is specific to the inheriting contract, for example a quantity of tokens.\\n    function _distributePayout(address recipient, bytes calldata claimData) internal virtual;\\n}\\n\",\"keccak256\":\"0x4ab563dd036efa7f52085a83dba987becb5ac733b01eb728d97bfd1ab8de8ee6\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":18580,"contract":"contracts/mocks/payment/CumulativeMerkleClaimMock.sol:CumulativeMerkleClaimMock","label":"root","offset":0,"slot":"0","type":"t_bytes32"},{"astId":18582,"contract":"contracts/mocks/payment/CumulativeMerkleClaimMock.sol:CumulativeMerkleClaimMock","label":"nonce","offset":0,"slot":"1","type":"t_uint256"},{"astId":18586,"contract":"contracts/mocks/payment/CumulativeMerkleClaimMock.sol:CumulativeMerkleClaimMock","label":"claimed","offset":0,"slot":"2","type":"t_mapping(t_bytes32,t_bool)"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"AlreadyClaimed(address,bytes,uint256)":[{"notice":"Thrown when trying to claim the same leaf more than once."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InvalidProof(address,bytes,uint256)":[{"notice":"Thrown when a proof cannot be verified."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"MerkleRootSet(bytes32)":{"notice":"Emitted when a new merkle root is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Pause()":{"notice":"Emitted when the pause is triggered."},"PayoutClaimed(bytes32,address,bytes,uint256)":{"notice":"Emitted when a payout is claimed."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"claimPayout(address,bytes,bytes32[])":{"notice":"Executes the payout for a given user (anyone can call this function)."},"owner()":{"notice":"Gets the address of the contract owner."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"setMerkleRoot(bytes32)":{"notice":"Sets the merkle root for a new claiming period and unpauses the contract."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}}},"contracts/mocks/payment/PayoutWalletMock.sol":{"PayoutWalletMock":{"abi":[{"inputs":[{"internalType":"address payable","name":"initialPayoutWallet","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"ZeroAddressPayoutWallet","type":"error"},{"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":false,"internalType":"address","name":"payoutWallet","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPayoutWallet","type":"address"}],"name":"setPayoutWallet","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"PayoutWalletSet(address)":{"params":{"payoutWallet":"the new payout wallet address."}}},"kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"payoutWallet()":{"returns":{"wallet":"The payout wallet."}},"setPayoutWallet(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"newPayoutWallet":"The payout wallet."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a0346101cb57601f610bbc38819003918201601f19168301916001600160401b038311848410176101d05780849260409485528339810103126101cb5780516001600160a01b03811691908290036101cb5760200151906001600160a01b03821682036101cb573361016c575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055801561015b577f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad80546001600160a01b031916821790556040519081527fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f85590602090a16080526040516109d590816101e782396080518181816104f20152818161059301528181610729015261088b0152f35b6340b539cf60e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a361006d565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146105165780632b4c9f16146104a757806331e66e1e14610424578063572b6c05146103c05780636b8f9c431461027d5780638488bb4e1461020c5780638da5cb5b1461019b5763f2fde38b1461007457600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100ed610874565b9073ffffffffffffffffffffffffffffffffffffffff808254169216828103610169575082820361011a57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061030c610874565b925416911690810361016957507f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad81156103965781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1005b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff811681036101965761041a60209161057c565b6040519015158152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657604061045d610712565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101965761041a6020916105db565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156105d45773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610684577f01ffc9a700000000000000000000000000000000000000000000000000000000811461067e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106cb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610196575180151581036101965790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561086257323314801561086a575b610862578033149081156107a5575b50610774576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101965760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561085657600091610827575b5038610768565b610849915060203d60201161084f575b610841818361068a565b8101906106fa565b38610820565b503d610837565b6040513d6000823e3d90fd5b506000903690565b5060183610610759565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610990573233148015610995575b610990577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108ff575b506108fc57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561085657600091610971575b50386108f2565b61098a915060203d60201161084f57610841818361068a565b3861096a565b503390565b50601836106108bb56fea2646970667358221220e726586eef001c3ec0e09eed8625eba3ecd98896245ffaeb9f2057203d73adb364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x1CB JUMPI PUSH1 0x1F PUSH2 0xBBC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1D0 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1CB JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP2 SWAP1 DUP3 SWAP1 SUB PUSH2 0x1CB JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x1CB JUMPI CALLER PUSH2 0x16C JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x15B JUMPI PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP3 OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP1 PUSH1 0x20 SWAP1 LOG1 PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x9D5 SWAP1 DUP2 PUSH2 0x1E7 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x4F2 ADD MSTORE DUP2 DUP2 PUSH2 0x593 ADD MSTORE DUP2 DUP2 PUSH2 0x729 ADD MSTORE PUSH2 0x88B ADD MSTORE RETURN JUMPDEST PUSH4 0x40B539CF PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x6D JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x424 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x3C0 JUMPI DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x20C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19B JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x196 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xED PUSH2 0x874 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x169 JUMPI POP DUP3 DUP3 SUB PUSH2 0x11A JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x196 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x30C PUSH2 0x874 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x169 JUMPI POP PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD DUP2 ISZERO PUSH2 0x396 JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 STOP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x196 JUMPI PUSH2 0x41A PUSH1 0x20 SWAP2 PUSH2 0x57C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x40 PUSH2 0x45D PUSH2 0x712 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x196 JUMPI PUSH2 0x41A PUSH1 0x20 SWAP2 PUSH2 0x5DB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x5D4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x684 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x67E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6CB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x196 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x196 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x862 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x86A JUMPI JUMPDEST PUSH2 0x862 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7A5 JUMPI JUMPDEST POP PUSH2 0x774 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x196 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x827 JUMPI JUMPDEST POP CODESIZE PUSH2 0x768 JUMP JUMPDEST PUSH2 0x849 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x84F JUMPI JUMPDEST PUSH2 0x841 DUP2 DUP4 PUSH2 0x68A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6FA JUMP JUMPDEST CODESIZE PUSH2 0x820 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x837 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x759 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x990 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x995 JUMPI JUMPDEST PUSH2 0x990 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8FF JUMPI JUMPDEST POP PUSH2 0x8FC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x971 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8F2 JUMP JUMPDEST PUSH2 0x98A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x84F JUMPI PUSH2 0x841 DUP2 DUP4 PUSH2 0x68A JUMP JUMPDEST CODESIZE PUSH2 0x96A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8BB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAPN 0x26 PC PUSH15 0xEF001C3EC0E09EED8625EBA3ECD988 SWAP7 0x24 PUSH0 STATICCALL 0xEB SWAP16 KECCAK256 JUMPI KECCAK256 RETURNDATASIZE PUSH20 0xADB364736F6C634300081E003300000000000000 ","sourceMap":"530:858:99:-:0;;;;;;;;;;;;;-1:-1:-1;;530:858:99;;;;-1:-1:-1;;;;;530:858:99;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;530:858:99;;;;;;;;;;;;;-1:-1:-1;;;;;530:858:99;;;;;;765:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;530:858:99;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;2377:29:172;;2373:67;;530:858:99;;;-1:-1:-1;;;;;;530:858:99;;;;;;;;;;2491:32:172;;530:858:99;;2491:32:172;745:39:76;;530:858:99;;;;;;;;745:39:76;530:858:99;;;;;;;;;;;;;;;;;;;;;2373:67:172;2415:25;;;-1:-1:-1;2415:25:172;;-1:-1:-1;2415:25:172;1645:152:42;530:858:99;;;-1:-1:-1;;;;;;530:858:99;765:10;530:858;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;530:858:99;-1:-1:-1;530:858:99;;;;;;-1:-1:-1;530:858:99;;;;;-1:-1:-1;530:858:99"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1786,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1674,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":1404,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":1810,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2164,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":1499,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1266},{"length":32,"start":1427},{"length":32,"start":1833},{"length":32,"start":2187}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146105165780632b4c9f16146104a757806331e66e1e14610424578063572b6c05146103c05780636b8f9c431461027d5780638488bb4e1461020c5780638da5cb5b1461019b5763f2fde38b1461007457600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100ed610874565b9073ffffffffffffffffffffffffffffffffffffffff808254169216828103610169575082820361011a57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061030c610874565b925416911690810361016957507f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad81156103965781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1005b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff811681036101965761041a60209161057c565b6040519015158152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657604061045d610712565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101965761041a6020916105db565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156105d45773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610684577f01ffc9a700000000000000000000000000000000000000000000000000000000811461067e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106cb57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610196575180151581036101965790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561086257323314801561086a575b610862578033149081156107a5575b50610774576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101965760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561085657600091610827575b5038610768565b610849915060203d60201161084f575b610841818361068a565b8101906106fa565b38610820565b503d610837565b6040513d6000823e3d90fd5b506000903690565b5060183610610759565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610990573233148015610995575b610990577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108ff575b506108fc57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561085657600091610971575b50386108f2565b61098a915060203d60201161084f57610841818361068a565b3861096a565b503390565b50601836106108bb56fea2646970667358221220e726586eef001c3ec0e09eed8625eba3ecd98896245ffaeb9f2057203d73adb364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x424 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x3C0 JUMPI DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x20C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19B JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x196 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xED PUSH2 0x874 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x169 JUMPI POP DUP3 DUP3 SUB PUSH2 0x11A JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x196 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x30C PUSH2 0x874 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x169 JUMPI POP PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD DUP2 ISZERO PUSH2 0x396 JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 STOP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x196 JUMPI PUSH2 0x41A PUSH1 0x20 SWAP2 PUSH2 0x57C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x40 PUSH2 0x45D PUSH2 0x712 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x196 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x196 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x196 JUMPI PUSH2 0x41A PUSH1 0x20 SWAP2 PUSH2 0x5DB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x5D4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x684 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x67E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6CB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x196 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x196 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x862 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x86A JUMPI JUMPDEST PUSH2 0x862 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7A5 JUMPI JUMPDEST POP PUSH2 0x774 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x196 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x827 JUMPI JUMPDEST POP CODESIZE PUSH2 0x768 JUMP JUMPDEST PUSH2 0x849 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x84F JUMPI JUMPDEST PUSH2 0x841 DUP2 DUP4 PUSH2 0x68A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6FA JUMP JUMPDEST CODESIZE PUSH2 0x820 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x837 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x759 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x990 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x995 JUMPI JUMPDEST PUSH2 0x990 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8FF JUMPI JUMPDEST POP PUSH2 0x8FC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x971 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8F2 JUMP JUMPDEST PUSH2 0x98A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x84F JUMPI PUSH2 0x841 DUP2 DUP4 PUSH2 0x68A JUMP JUMPDEST CODESIZE PUSH2 0x96A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8BB JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAPN 0x26 PC PUSH15 0xEF001C3EC0E09EED8625EBA3ECD988 SWAP7 0x24 PUSH0 STATICCALL 0xEB SWAP16 KECCAK256 JUMPI KECCAK256 RETURNDATASIZE PUSH20 0xADB364736F6C634300081E003300000000000000 ","sourceMap":"530:858:99:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1105:41;;:::i;:::-;530:858;;;;;;;;3205:23:42;;;3201:60;;3275:25;;;;3271:146;;530:858:99;3271:146:42;530:858:99;;;;;;;;3361:45:42;530:858:99;3361:45:42;;530:858:99;3201:60:42;3237:24;530:858:99;3237:24:42;530:858:99;;;;3237:24:42;530:858:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1105:41;;;:::i;:::-;530:858;;;;;4503:26:42;;;4499:64;;2824:19:172;530:858:99;2377:29:172;;2373:67;;530:858:99;;2491:32:172;530:858:99;;;;;;;;;;;;;;2491:32:172;530:858:99;2373:67:172;2415:25;530:858:99;2415:25:172;530:858:99;;2415:25:172;530:858:99;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1340:39;;:::i;:::-;530:858;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;530:858:99;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;530:858:99;635:65:55;;:::i;1002:301:75:-;530:858:99;1146:19:75;530:858:99;1146:53:75;;;1142:96;;530:858:99;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;530:858:99;1215:12:75;:::o;1359:340:59:-;530:858:99;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;530:858:99;500:10:59;530:858:99;500:10:59;;;;530:858:99;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;530:858:99;1528:12:59;:::o;530:858:99:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;530:858:99;;;;;-1:-1:-1;530:858:99;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;530:858:99;2065:19:76;530:858:99;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;530:858:99;720:8:80;530:858:99;720:8:80;;530:858:99;;;;2115:1:76;2802:32;;:::o;2624:153::-;530:858:99;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;530:858:99;2361:10:76;530:858:99;;;;2771:4:76;530:858:99;;;;;-1:-1:-1;2682:95:76;;530:858:99;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;530:858:99;;;2115:1:76;530:858:99;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;530:858:99;1029:19:76;530:858:99;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;530:858:99;;;1676:74:76;;530:858:99;;;1676:74:76;;;530:858:99;1327:10:76;530:858:99;;;;1744:4:76;530:858:99;;;;;-1:-1:-1;1676:74:76;;530:858:99;;;;;;1676:74:76;;;;;;;530:858:99;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"503400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2385","payoutWallet()":"2363","setPayoutWallet(address)":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","payoutWallet()":"8488bb4e","setPayoutWallet(address)":"6b8f9c43","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"initialPayoutWallet\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressPayoutWallet\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"address\",\"name\":\"payoutWallet\",\"type\":\"address\"}],\"name\":\"PayoutWalletSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"newPayoutWallet\",\"type\":\"address\"}],\"name\":\"setPayoutWallet\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"PayoutWalletSet(address)\":{\"params\":{\"payoutWallet\":\"the new payout wallet address.\"}}},\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}},\"setPayoutWallet(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"newPayoutWallet\":\"The payout wallet.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"ZeroAddressPayoutWallet()\":[{\"notice\":\"Thrown when setting the zero address as the payout wallet.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"PayoutWalletSet(address)\":{\"notice\":\"Emitted when the payout wallet address changes.\"}},\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"},\"setPayoutWallet(address)\":{\"notice\":\"Sets the payout wallet.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/payment/PayoutWalletMock.sol\":\"PayoutWalletMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/payment/PayoutWalletMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PayoutWallet} from \\\"./../../payment/PayoutWallet.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract PayoutWalletMock is PayoutWallet, ForwarderRegistryContext {\\n    constructor(\\n        address payable initialPayoutWallet,\\n        IForwarderRegistry forwarderRegistry\\n    ) PayoutWallet(initialPayoutWallet) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x606ae47b64c8cca4c543626ec4781619e420a25989e4515834a0a6bad960c85f\",\"license\":\"MIT\"},\"contracts/payment/PayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PayoutWalletStorage} from \\\"./libraries/PayoutWalletStorage.sol\\\";\\nimport {PayoutWalletBase} from \\\"./base/PayoutWalletBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Payout wallet (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract PayoutWallet is PayoutWalletBase, ContractOwnership {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    constructor(address payable initialPayoutWallet) {\\n        PayoutWalletStorage.layout().constructorInit(initialPayoutWallet);\\n    }\\n}\\n\",\"keccak256\":\"0x4cfd896198908c885c344fa2e3bf7ef782caadb6b4739290c9e379317ea4f70b\",\"license\":\"MIT\"},\"contracts/payment/base/PayoutWalletBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPayoutWallet} from \\\"./../interfaces/IPayoutWallet.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Payout wallet (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view virtual returns (address payable wallet) {\\n        return PayoutWalletStorage.layout().payoutWallet();\\n    }\\n}\\n\",\"keccak256\":\"0x90b83174d8575394a9f8036d43ab94db79d2b9f4f65d5178b6878b6104eb0714\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"ZeroAddressPayoutWallet()":[{"notice":"Thrown when setting the zero address as the payout wallet."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"PayoutWalletSet(address)":{"notice":"Emitted when the payout wallet address changes."}},"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"payoutWallet()":{"notice":"Gets the payout wallet."},"setPayoutWallet(address)":{"notice":"Sets the payout wallet."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol":{"PayoutWalletFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"ZeroAddressPayoutWallet","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payoutWallet","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"initialPayoutWallet","type":"address"}],"name":"initPayoutWalletStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPayoutWallet","type":"address"}],"name":"setPayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"PayoutWalletSet(address)":{"params":{"payoutWallet":"the new payout wallet address."}}},"kind":"dev","methods":{"initPayoutWalletStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"initialPayoutWallet":"The initial payout wallet."}},"payoutWallet()":{"returns":{"wallet":"The payout wallet."}},"setPayoutWallet(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"newPayoutWallet":"The payout wallet."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61081c38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610793908161008982396080518181816104e701526106490152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146103275780636b8f9c43146102355780638488bb4e146101c45763a556589a1461004857600080fd5b346101bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760043573ffffffffffffffffffffffffffffffffffffffff811681036101bf5761009f610632565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361019257507f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d54907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad600183101561015f5761015d925060017f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d556103aa565b005b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101bf5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf57602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760043573ffffffffffffffffffffffffffffffffffffffff811681036101bf5761028c610632565b9073ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541692169182036102f95761015d907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad6103aa565b507f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101bf5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760406103606104d0565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9073ffffffffffffffffffffffffffffffffffffffff1690811561041e5781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1565b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761048957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101bf575180151581036101bf5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610620573233148015610628575b61062057803314908115610563575b50610532576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101bf5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610614576000916105e5575b5038610526565b610607915060203d60201161060d575b6105ff8183610448565b8101906104b8565b386105de565b503d6105f5565b6040513d6000823e3d90fd5b506000903690565b5060183610610517565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074e573233148015610753575b61074e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bd575b506106ba57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106145760009161072f575b50386106b0565b610748915060203d60201161060d576105ff8183610448565b38610728565b503390565b506018361061067956fea26469706673582212208f7eb5666d2d4f3f68f4e8a1483a6ed89dbcf62422b3fee63075e883715fc3f864736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x81C CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x793 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x4E7 ADD MSTORE PUSH2 0x649 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x1C4 JUMPI PUSH4 0xA556589A EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1BF JUMPI PUSH2 0x9F PUSH2 0x632 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x192 JUMPI POP PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SLOAD SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x15F JUMPI PUSH2 0x15D SWAP3 POP PUSH1 0x1 PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SSTORE PUSH2 0x3AA JUMP JUMPDEST STOP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1BF JUMPI PUSH2 0x28C PUSH2 0x632 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP3 AND SWAP2 DUP3 SUB PUSH2 0x2F9 JUMPI PUSH2 0x15D SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH2 0x3AA JUMP JUMPDEST POP PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x40 PUSH2 0x360 PUSH2 0x4D0 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x41E JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 JUMP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x489 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1BF JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1BF JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x620 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x628 JUMPI JUMPDEST PUSH2 0x620 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x563 JUMPI JUMPDEST POP PUSH2 0x532 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1BF JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5E5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x526 JUMP JUMPDEST PUSH2 0x607 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60D JUMPI JUMPDEST PUSH2 0x5FF DUP2 DUP4 PUSH2 0x448 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4B8 JUMP JUMPDEST CODESIZE PUSH2 0x5DE JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x5F5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x753 JUMPI JUMPDEST PUSH2 0x74E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BD JUMPI JUMPDEST POP PUSH2 0x6BA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x72F JUMPI JUMPDEST POP CODESIZE PUSH2 0x6B0 JUMP JUMPDEST PUSH2 0x748 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60D JUMPI PUSH2 0x5FF DUP2 DUP4 PUSH2 0x448 JUMP JUMPDEST CODESIZE PUSH2 0x728 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x679 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 PUSH31 0xB5666D2D4F3F68F4E8A1483A6ED89DBCF62422B3FEE63075E883715FC3F864 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"229:249:100:-:0;;;;;;;;;;;;;-1:-1:-1;;229:249:100;;;;-1:-1:-1;;;;;229:249:100;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;229:249:100;;;;;;745:39:76;;229:249:100;;;;;;;;745:39:76;229:249:100;;;;;;;;;;;;-1:-1:-1;229:249:100;;;;;;-1:-1:-1;229:249:100;;;;;-1:-1:-1;229:249:100"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1208,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1096,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1232,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1586,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_setPayoutWallet":{"entryPoint":938,"id":19070,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1255},{"length":32,"start":1609}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146103275780636b8f9c43146102355780638488bb4e146101c45763a556589a1461004857600080fd5b346101bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760043573ffffffffffffffffffffffffffffffffffffffff811681036101bf5761009f610632565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361019257507f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d54907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad600183101561015f5761015d925060017f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d556103aa565b005b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101bf5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf57602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101bf5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760043573ffffffffffffffffffffffffffffffffffffffff811681036101bf5761028c610632565b9073ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541692169182036102f95761015d907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad6103aa565b507f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101bf5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bf5760406103606104d0565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9073ffffffffffffffffffffffffffffffffffffffff1690811561041e5781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1565b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761048957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126101bf575180151581036101bf5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610620573233148015610628575b61062057803314908115610563575b50610532576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101bf5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610614576000916105e5575b5038610526565b610607915060203d60201161060d575b6105ff8183610448565b8101906104b8565b386105de565b503d6105f5565b6040513d6000823e3d90fd5b506000903690565b5060183610610517565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074e573233148015610753575b61074e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bd575b506106ba57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106145760009161072f575b50386106b0565b610748915060203d60201161060d576105ff8183610448565b38610728565b503390565b506018361061067956fea26469706673582212208f7eb5666d2d4f3f68f4e8a1483a6ed89dbcf62422b3fee63075e883715fc3f864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x1C4 JUMPI PUSH4 0xA556589A EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1BF JUMPI PUSH2 0x9F PUSH2 0x632 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x192 JUMPI POP PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SLOAD SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x15F JUMPI PUSH2 0x15D SWAP3 POP PUSH1 0x1 PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SSTORE PUSH2 0x3AA JUMP JUMPDEST STOP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1BF JUMPI PUSH2 0x28C PUSH2 0x632 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP3 AND SWAP2 DUP3 SUB PUSH2 0x2F9 JUMPI PUSH2 0x15D SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH2 0x3AA JUMP JUMPDEST POP PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1BF JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1BF JUMPI PUSH1 0x40 PUSH2 0x360 PUSH2 0x4D0 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x41E JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 JUMP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x489 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1BF JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1BF JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x620 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x628 JUMPI JUMPDEST PUSH2 0x620 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x563 JUMPI JUMPDEST POP PUSH2 0x532 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1BF JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5E5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x526 JUMP JUMPDEST PUSH2 0x607 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60D JUMPI JUMPDEST PUSH2 0x5FF DUP2 DUP4 PUSH2 0x448 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4B8 JUMP JUMPDEST CODESIZE PUSH2 0x5DE JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x5F5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x753 JUMPI JUMPDEST PUSH2 0x74E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BD JUMPI JUMPDEST POP PUSH2 0x6BA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x72F JUMPI JUMPDEST POP CODESIZE PUSH2 0x6B0 JUMP JUMPDEST PUSH2 0x748 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60D JUMPI PUSH2 0x5FF DUP2 DUP4 PUSH2 0x448 JUMP JUMPDEST CODESIZE PUSH2 0x728 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x679 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 PUSH31 0xB5666D2D4F3F68F4E8A1483A6ED89DBCF62422B3FEE63075E883715FC3F864 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"229:249:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2040:41:170;;:::i;:::-;229:249:100;;;;;;;3174:18:180;;;3170:53;;-1:-1:-1;229:249:100;;;;636:1:180;900:21:181;;;896:88;;2015:19:172;229:249:100;;636:1:180;229:249:100;;2015:19:172;:::i;:::-;229:249:100;896:88:181;930:54;;229:249:100;930:54:181;229:249:100;;636:1:180;229:249:100;;;;930:54:181;3170:53:180;3201:22;229:249:100;3201:22:180;229:249:100;;;;3201:22:180;229:249:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2040:41:170;;:::i;:::-;229:249:100;;;;;;;;4503:26:42;;;4499:64;;1295:15:167;2824:19:172;229:249:100;1295:15:167;:::i;4499:64:42:-;4538:25;;229:249:100;4538:25:42;229:249:100;;;;4538:25:42;229:249:100;;;;;;;;;;;;2275:39:170;;:::i;:::-;229:249:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2278:252:172;;229:249:100;;2377:29:172;;;2373:67;;229:249:100;;2491:32:172;229:249:100;;;;;;;;;;;;;;2491:32:172;2278:252::o;2373:67::-;2415:25;2404:1;2415:25;;2404:1;2415:25;229:249:100;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;229:249:100;;;;;-1:-1:-1;229:249:100;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;229:249:100;2065:19:76;229:249:100;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;229:249:100;720:8:80;229:249:100;720:8:80;;229:249:100;;;;2115:1:76;2802:32;;:::o;2624:153::-;229:249:100;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;229:249:100;2361:10:76;229:249:100;;;;2771:4:76;229:249:100;;;;;-1:-1:-1;2682:95:76;;229:249:100;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;229:249:100;;;2115:1:76;229:249:100;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;229:249:100;1029:19:76;229:249:100;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;229:249:100;;;1676:74:76;;229:249:100;;;1676:74:76;;;229:249:100;1327:10:76;229:249:100;;;;1744:4:76;229:249:100;;;;;-1:-1:-1;1676:74:76;;229:249:100;;;;;;1676:74:76;;;;;;;229:249:100;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"387800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initPayoutWalletStorage(address)":"infinite","payoutWallet()":"2297","setPayoutWallet(address)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initPayoutWalletStorage(address)":"a556589a","payoutWallet()":"8488bb4e","setPayoutWallet(address)":"6b8f9c43"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressPayoutWallet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payoutWallet\",\"type\":\"address\"}],\"name\":\"PayoutWalletSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"initialPayoutWallet\",\"type\":\"address\"}],\"name\":\"initPayoutWalletStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"newPayoutWallet\",\"type\":\"address\"}],\"name\":\"setPayoutWallet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"PayoutWalletSet(address)\":{\"params\":{\"payoutWallet\":\"the new payout wallet address.\"}}},\"kind\":\"dev\",\"methods\":{\"initPayoutWalletStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"initialPayoutWallet\":\"The initial payout wallet.\"}},\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}},\"setPayoutWallet(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"newPayoutWallet\":\"The payout wallet.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"ZeroAddressPayoutWallet()\":[{\"notice\":\"Thrown when setting the zero address as the payout wallet.\"}]},\"events\":{\"PayoutWalletSet(address)\":{\"notice\":\"Emitted when the payout wallet address changes.\"}},\"kind\":\"user\",\"methods\":{\"initPayoutWalletStorage(address)\":{\"notice\":\"Initializes the storage with an initial payout wallet.Sets the proxy initialization phase to `1`.\"},\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"},\"setPayoutWallet(address)\":{\"notice\":\"Sets the payout wallet.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol\":\"PayoutWalletFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/payment/facets/PayoutWalletFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PayoutWalletFacet} from \\\"./../../../payment/facets/PayoutWalletFacet.sol\\\";\\n\\ncontract PayoutWalletFacetMock is PayoutWalletFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) PayoutWalletFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x335d55b066b79a2c43aa54577178373c858cc2c6c169ec2712d52b274572987e\",\"license\":\"MIT\"},\"contracts/payment/base/PayoutWalletBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPayoutWallet} from \\\"./../interfaces/IPayoutWallet.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Payout wallet (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view virtual returns (address payable wallet) {\\n        return PayoutWalletStorage.layout().payoutWallet();\\n    }\\n}\\n\",\"keccak256\":\"0x90b83174d8575394a9f8036d43ab94db79d2b9f4f65d5178b6878b6104eb0714\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/facets/PayoutWalletFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {PayoutWalletBase} from \\\"./../base/PayoutWalletBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Payout wallet (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract PayoutWalletFacet is PayoutWalletBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial payout wallet.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function initPayoutWalletStorage(address payable initialPayoutWallet) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        PayoutWalletStorage.layout().proxyInit(initialPayoutWallet);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x58d31223888aedb675a9d588cef2f8ea71f24a225193529547af3a8cdac02d56\",\"license\":\"MIT\"},\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"ZeroAddressPayoutWallet()":[{"notice":"Thrown when setting the zero address as the payout wallet."}]},"events":{"PayoutWalletSet(address)":{"notice":"Emitted when the payout wallet address changes."}},"kind":"user","methods":{"initPayoutWalletStorage(address)":{"notice":"Initializes the storage with an initial payout wallet.Sets the proxy initialization phase to `1`."},"payoutWallet()":{"notice":"Gets the payout wallet."},"setPayoutWallet(address)":{"notice":"Sets the payout wallet."}},"version":1}}},"contracts/mocks/proxy/ProxyAdminMock.sol":{"ProxyAdminMock":{"abi":[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NoInitialProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsProxyAdmin","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"AdminChanged(address,address)":{"params":{"newAdmin":"the new admin.","previousAdmin":"the previous admin."}}},"kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461011257601f6108c038819003918201601f19168301916001600160401b038311848410176101175780849260409485528339810103126101125780516001600160a01b03811691908290036101125760200151906001600160a01b0382168203610112578015610101577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610380546001600160a01b03191682179055604080516000815260208101929092527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a1608052604051610792908161012e82396080518181816103c4015281816103ff015281816104e601526106480152f35b6305fc8cab60e51b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c9081632b4c9f161461037b5750806331e66e1e146102f85780633e47158c14610287578063572b6c05146102235780638eafcf671461019357639f712f2f1461006157600080fd5b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff811680910361018e577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103906100db610631565b82549173ffffffffffffffffffffffffffffffffffffffff8084169216828103610161575080820361010957005b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f93817fffffffffffffffffffffffff00000000000000000000000000000000000000006040951617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff811680910361018e5773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416810361016157005b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361018e5761027d6020916103e8565b6040519015158152f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e57602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760406103316104cf565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156104405773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761048857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261018e5751801515810361018e5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561061f573233148015610627575b61061f57803314908115610562575b50610531576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161018e5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610613576000916105e4575b5038610525565b610606915060203d60201161060c575b6105fe8183610447565b8101906104b7565b386105dd565b503d6105f4565b6040513d6000823e3d90fd5b506000903690565b5060183610610516565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074d573233148015610752575b61074d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bc575b506106b957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106135760009161072e575b50386106af565b610747915060203d60201161060c576105fe8183610447565b38610727565b503390565b506018361061067856fea264697066735822122007a4dd347ad81622bd711484a3104de3f1268d7ef20dabc52de347bd79d9d14d64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x112 JUMPI PUSH1 0x1F PUSH2 0x8C0 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x117 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x112 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP2 SWAP1 DUP3 SWAP1 SUB PUSH2 0x112 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x112 JUMPI DUP1 ISZERO PUSH2 0x101 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP3 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 LOG1 PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x792 SWAP1 DUP2 PUSH2 0x12E DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x3C4 ADD MSTORE DUP2 DUP2 PUSH2 0x3FF ADD MSTORE DUP2 DUP2 PUSH2 0x4E6 ADD MSTORE PUSH2 0x648 ADD MSTORE RETURN JUMPDEST PUSH4 0x5FC8CAB PUSH1 0xE5 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x2B4C9F16 EQ PUSH2 0x37B JUMPI POP DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2F8 JUMPI DUP1 PUSH4 0x3E47158C EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0x8EAFCF67 EQ PUSH2 0x193 JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x18E JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SWAP1 PUSH2 0xDB PUSH2 0x631 JUMP JUMPDEST DUP3 SLOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x161 JUMPI POP DUP1 DUP3 SUB PUSH2 0x109 JUMPI STOP JUMPDEST PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x18E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND DUP2 SUB PUSH2 0x161 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x18E JUMPI PUSH2 0x27D PUSH1 0x20 SWAP2 PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x40 PUSH2 0x331 PUSH2 0x4CF JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x20 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x440 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x488 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x18E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x18E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x61F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x627 JUMPI JUMPDEST PUSH2 0x61F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x562 JUMPI JUMPDEST POP PUSH2 0x531 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x18E JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x613 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5E4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x525 JUMP JUMPDEST PUSH2 0x606 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60C JUMPI JUMPDEST PUSH2 0x5FE DUP2 DUP4 PUSH2 0x447 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4B7 JUMP JUMPDEST CODESIZE PUSH2 0x5DD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x5F4 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x516 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x752 JUMPI JUMPDEST PUSH2 0x74D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BC JUMPI JUMPDEST POP PUSH2 0x6B9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x613 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x72E JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AF JUMP JUMPDEST PUSH2 0x747 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60C JUMPI PUSH2 0x5FE DUP2 DUP4 PUSH2 0x447 JUMP JUMPDEST CODESIZE PUSH2 0x727 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x678 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SMOD LOG4 0xDD CALLVALUE PUSH27 0xD81622BD711484A3104DE3F1268D7EF20DABC52DE347BD79D9D14D PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"533:961:101:-:0;;;;;;;;;;;;;-1:-1:-1;;533:961:101;;;;-1:-1:-1;;;;;533:961:101;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:961:101;;;;;;;;;;;;;-1:-1:-1;;;;;533:961:101;;;;;;1227:26:180;;1223:60;;533:961:101;;;-1:-1:-1;;;;;;533:961:101;;;;;;;;-1:-1:-1;533:961:101;;;;;;;;;1330:38:180;;;745:39:76;;533:961:101;;;;;;;;745:39:76;533:961:101;;;;;;;;;;;;;;;;;;;;;1223:60:180;1262:21;;;-1:-1:-1;1262:21:180;;-1:-1:-1;1262:21:180;533:961:101;-1:-1:-1;533:961:101;;;;;;-1:-1:-1;533:961:101;;;;;-1:-1:-1;533:961:101"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1207,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1095,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":1000,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":1231,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1585,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":964},{"length":32,"start":1023},{"length":32,"start":1254},{"length":32,"start":1608}]},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b60003560e01c9081632b4c9f161461037b5750806331e66e1e146102f85780633e47158c14610287578063572b6c05146102235780638eafcf671461019357639f712f2f1461006157600080fd5b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff811680910361018e577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103906100db610631565b82549173ffffffffffffffffffffffffffffffffffffffff8084169216828103610161575080820361010957005b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f93817fffffffffffffffffffffffff00000000000000000000000000000000000000006040951617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff811680910361018e5773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416810361016157005b3461018e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361018e5761027d6020916103e8565b6040519015158152f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e57602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760406103316104cf565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461018e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018e5760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156104405773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761048857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261018e5751801515810361018e5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561061f573233148015610627575b61061f57803314908115610562575b50610531576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161018e5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610613576000916105e4575b5038610525565b610606915060203d60201161060c575b6105fe8183610447565b8101906104b7565b386105dd565b503d6105f4565b6040513d6000823e3d90fd5b506000903690565b5060183610610516565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074d573233148015610752575b61074d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bc575b506106b957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106135760009161072e575b50386106af565b610747915060203d60201161060c576105fe8183610447565b38610727565b503390565b506018361061067856fea264697066735822122007a4dd347ad81622bd711484a3104de3f1268d7ef20dabc52de347bd79d9d14d64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x2B4C9F16 EQ PUSH2 0x37B JUMPI POP DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2F8 JUMPI DUP1 PUSH4 0x3E47158C EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0x8EAFCF67 EQ PUSH2 0x193 JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x18E JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SWAP1 PUSH2 0xDB PUSH2 0x631 JUMP JUMPDEST DUP3 SLOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x161 JUMPI POP DUP1 DUP3 SUB PUSH2 0x109 JUMPI STOP JUMPDEST PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x18E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND DUP2 SUB PUSH2 0x161 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x18E JUMPI PUSH2 0x27D PUSH1 0x20 SWAP2 PUSH2 0x3E8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x40 PUSH2 0x331 PUSH2 0x4CF JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x18E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18E JUMPI PUSH1 0x20 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x440 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x488 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x18E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x18E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x61F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x627 JUMPI JUMPDEST PUSH2 0x61F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x562 JUMPI JUMPDEST POP PUSH2 0x531 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x18E JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x613 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5E4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x525 JUMP JUMPDEST PUSH2 0x606 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60C JUMPI JUMPDEST PUSH2 0x5FE DUP2 DUP4 PUSH2 0x447 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4B7 JUMP JUMPDEST CODESIZE PUSH2 0x5DD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x5F4 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x516 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x752 JUMPI JUMPDEST PUSH2 0x74D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BC JUMPI JUMPDEST POP PUSH2 0x6B9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x613 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x72E JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AF JUMP JUMPDEST PUSH2 0x747 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x60C JUMPI PUSH2 0x5FE DUP2 DUP4 PUSH2 0x447 JUMP JUMPDEST CODESIZE PUSH2 0x727 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x678 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SMOD LOG4 0xDD CALLVALUE PUSH27 0xD81622BD711484A3104DE3F1268D7EF20DABC52DE347BD79D9D14D PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"533:961:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1211:41;;;:::i;:::-;533:961;;;;;;;;;2513:23:180;;;2509:57;;2580:25;;;;2576:130;;533:961:101;2576:130:180;2658:37;533:961:101;;;;;;;;;;;;;;;;;;2658:37:180;533:961:101;2509:57:180;2545:21;533:961:101;2545:21:180;533:961:101;;;;2545:21:180;533:961:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:18:180;;3170:53;;533:961:101;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1446:39;;:::i;:::-;533:961;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;533:961:101;941:19:75;533:961:101;;;;1002:301:75;533:961:101;1146:19:75;533:961:101;1146:53:75;;;1142:96;;533:961:101;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;533:961:101;1215:12:75;:::o;533:961:101:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;533:961:101;;;;;-1:-1:-1;533:961:101;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;533:961:101;2065:19:76;533:961:101;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;533:961:101;720:8:80;533:961:101;720:8:80;;533:961:101;;;;2115:1:76;2802:32;;:::o;2624:153::-;533:961:101;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;533:961:101;2361:10:76;533:961:101;;;;2771:4:76;533:961:101;;;;;-1:-1:-1;2682:95:76;;533:961:101;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;533:961:101;;;2115:1:76;533:961:101;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;533:961:101;1029:19:76;533:961:101;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;533:961:101;;;1676:74:76;;533:961:101;;;1676:74:76;;;533:961:101;1327:10:76;533:961:101;;;;1744:4:76;533:961:101;;;;;-1:-1:-1;1676:74:76;;533:961:101;;;;;;1676:74:76;;;;;;;533:961:101;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"387600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","changeProxyAdmin(address)":"infinite","enforceIsProxyAdmin(address)":"2403","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","proxyAdmin()":"2305"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","changeProxyAdmin(address)":"9f712f2f","enforceIsProxyAdmin(address)":"8eafcf67","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"NoInitialProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsProxyAdmin\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"the new admin.\",\"previousAdmin\":\"the previous admin.\"}}},\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"NoInitialProxyAdmin()\":[{\"notice\":\"Thrown when the initial admin is not set.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"Emitted when the proxy admin changes.\"}},\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/proxy/ProxyAdminMock.sol\":\"ProxyAdminMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/proxy/ProxyAdminMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdmin} from \\\"./../../proxy/ProxyAdmin.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ProxyAdminMock is ProxyAdmin, ForwarderRegistryContext {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(address admin, IForwarderRegistry forwarderRegistry) ProxyAdmin(admin) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function enforceIsProxyAdmin(address account) external view {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3ca1a966b6b60aa712ce3a82b08390386ea3564ee131d761d9825aa784694a52\",\"license\":\"MIT\"},\"contracts/proxy/ProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ProxyAdminStorage} from \\\"./libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdminBase} from \\\"./base/ProxyAdminBase.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ProxyAdmin is ProxyAdminBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial admin.\\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\\n    /// @param initialAdmin The initial payout wallet.\\n    constructor(address initialAdmin) {\\n        ProxyAdminStorage.layout().constructorInit(initialAdmin);\\n    }\\n}\\n\",\"keccak256\":\"0x3a11da964b8815c2961617c504293adfbc3a192eb109f9de8678579ba7d08d62\",\"license\":\"MIT\"},\"contracts/proxy/base/ProxyAdminBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IProxyAdmin} from \\\"./../interfaces/IProxyAdmin.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external virtual {\\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin.\\n    function proxyAdmin() external view virtual returns (address admin) {\\n        return ProxyAdminStorage.layout().proxyAdmin();\\n    }\\n}\\n\",\"keccak256\":\"0x7fb543bca8244cd09a8acb36242ed7e870512bfe36148071136515d3f7a831ac\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NoInitialProxyAdmin()":[{"notice":"Thrown when the initial admin is not set."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"AdminChanged(address,address)":{"notice":"Emitted when the proxy admin changes."}},"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol":{"ProxyAdminFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[],"name":"NoInitialProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enforceIsProxyAdmin","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"name":"initProxyAdminStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"AdminChanged(address,address)":{"params":{"newAdmin":"the new admin.","previousAdmin":"the previous admin."}}},"kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"initProxyAdminStorage(address)":{"details":"Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {AdminChanged} event if `initialAdmin` is not the zero address.","params":{"initialAdmin":"The initial payout wallet."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61085b38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516107d29081610089823960805181818161052601526106880152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146104045780633e47158c146103935780634d350622146102145780638eafcf671461018457639f712f2f1461005357600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036100cc610671565b73ffffffffffffffffffffffffffffffffffffffff80835416911681810361015257508281036100f857005b82827f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f947fffffffffffffffffffffffff0000000000000000000000000000000000000000604095541617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f5773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416810361015257005b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61037fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f7297546001811015610361575060017fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975581156103375781817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f937fffffffffffffffffffffffff00000000000000000000000000000000000000006040945416179055815190600082526020820152a1005b7fbf9195600000000000000000000000000000000000000000000000000000000060005260046000fd5b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57604061043d61050f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176104c857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261017f5751801515810361017f5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561065f573233148015610667575b61065f578033149081156105a2575b50610571576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161017f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561065357600091610624575b5038610565565b610646915060203d60201161064c575b61063e8183610487565b8101906104f7565b3861061d565b503d610634565b6040513d6000823e3d90fd5b506000903690565b5060183610610556565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561078d573233148015610792575b61078d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106fc575b506106f957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106535760009161076e575b50386106ef565b610787915060203d60201161064c5761063e8183610487565b38610767565b503390565b50601836106106b856fea2646970667358221220f2dd65fd044da51a8c5c2ce17160f6e383f5e696a3cf1d5b3ed8c72da660422e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x85B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7D2 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x526 ADD MSTORE PUSH2 0x688 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x3E47158C EQ PUSH2 0x393 JUMPI DUP1 PUSH4 0x4D350622 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x8EAFCF67 EQ PUSH2 0x184 JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0xCC PUSH2 0x671 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x152 JUMPI POP DUP3 DUP2 SUB PUSH2 0xF8 JUMPI STOP JUMPDEST DUP3 DUP3 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND DUP2 SUB PUSH2 0x152 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x361 JUMPI POP PUSH1 0x1 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SSTORE DUP2 ISZERO PUSH2 0x337 JUMPI DUP2 DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP5 SLOAD AND OR SWAP1 SSTORE DUP2 MLOAD SWAP1 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0xBF91956000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x40 PUSH2 0x43D PUSH2 0x50F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x17F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x17F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x65F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x667 JUMPI JUMPDEST PUSH2 0x65F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5A2 JUMPI JUMPDEST POP PUSH2 0x571 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x17F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x653 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x624 JUMPI JUMPDEST POP CODESIZE PUSH2 0x565 JUMP JUMPDEST PUSH2 0x646 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x64C JUMPI JUMPDEST PUSH2 0x63E DUP2 DUP4 PUSH2 0x487 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4F7 JUMP JUMPDEST CODESIZE PUSH2 0x61D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x634 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x556 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x78D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x792 JUMPI JUMPDEST PUSH2 0x78D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6FC JUMPI JUMPDEST POP PUSH2 0x6F9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x653 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x76E JUMPI JUMPDEST POP CODESIZE PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x787 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x64C JUMPI PUSH2 0x63E DUP2 DUP4 PUSH2 0x487 JUMP JUMPDEST CODESIZE PUSH2 0x767 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6B8 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE 0xDD PUSH6 0xFD044DA51A8C TLOAD 0x2C RJUMPI 0x7160 0xF6 CALLF 0x83F5 DUPN 0x96 LOG3 0xCF SAR JUMPDEST RETURNDATACOPY 0xD8 0xC7 0x2D 0xA6 PUSH1 0x42 0x2E PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"307:440:102:-:0;;;;;;;;;;;;;-1:-1:-1;;307:440:102;;;;-1:-1:-1;;;;;307:440:102;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;307:440:102;;;;;;745:39:76;;307:440:102;;;;;;;;745:39:76;307:440:102;;;;;;;;;;;;-1:-1:-1;307:440:102;;;;;;-1:-1:-1;307:440:102;;;;;-1:-1:-1;307:440:102"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1271,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1159,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1295,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1649,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1318},{"length":32,"start":1672}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146104045780633e47158c146103935780634d350622146102145780638eafcf671461018457639f712f2f1461005357600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036100cc610671565b73ffffffffffffffffffffffffffffffffffffffff80835416911681810361015257508281036100f857005b82827f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f947fffffffffffffffffffffffff0000000000000000000000000000000000000000604095541617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f5773ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416810361015257005b3461017f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361017f577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61037fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f7297546001811015610361575060017fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975581156103375781817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f937fffffffffffffffffffffffff00000000000000000000000000000000000000006040945416179055815190600082526020820152a1005b7fbf9195600000000000000000000000000000000000000000000000000000000060005260046000fd5b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b3461017f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017f57604061043d61050f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176104c857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261017f5751801515810361017f5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561065f573233148015610667575b61065f578033149081156105a2575b50610571576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161017f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561065357600091610624575b5038610565565b610646915060203d60201161064c575b61063e8183610487565b8101906104f7565b3861061d565b503d610634565b6040513d6000823e3d90fd5b506000903690565b5060183610610556565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561078d573233148015610792575b61078d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106fc575b506106f957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106535760009161076e575b50386106ef565b610787915060203d60201161064c5761063e8183610487565b38610767565b503390565b50601836106106b856fea2646970667358221220f2dd65fd044da51a8c5c2ce17160f6e383f5e696a3cf1d5b3ed8c72da660422e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x3E47158C EQ PUSH2 0x393 JUMPI DUP1 PUSH4 0x4D350622 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x8EAFCF67 EQ PUSH2 0x184 JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0xCC PUSH2 0x671 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x152 JUMPI POP DUP3 DUP2 SUB PUSH2 0xF8 JUMPI STOP JUMPDEST DUP3 DUP3 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND DUP2 SUB PUSH2 0x152 JUMPI STOP JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x17F JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x361 JUMPI POP PUSH1 0x1 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SSTORE DUP2 ISZERO PUSH2 0x337 JUMPI DUP2 DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP5 SLOAD AND OR SWAP1 SSTORE DUP2 MLOAD SWAP1 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0xBF91956000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x17F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x17F JUMPI PUSH1 0x40 PUSH2 0x43D PUSH2 0x50F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4C8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x17F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x17F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x65F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x667 JUMPI JUMPDEST PUSH2 0x65F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5A2 JUMPI JUMPDEST POP PUSH2 0x571 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x17F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x653 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x624 JUMPI JUMPDEST POP CODESIZE PUSH2 0x565 JUMP JUMPDEST PUSH2 0x646 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x64C JUMPI JUMPDEST PUSH2 0x63E DUP2 DUP4 PUSH2 0x487 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4F7 JUMP JUMPDEST CODESIZE PUSH2 0x61D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x634 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x556 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x78D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x792 JUMPI JUMPDEST PUSH2 0x78D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6FC JUMPI JUMPDEST POP PUSH2 0x6F9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x653 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x76E JUMPI JUMPDEST POP CODESIZE PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x787 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x64C JUMPI PUSH2 0x63E DUP2 DUP4 PUSH2 0x487 JUMP JUMPDEST CODESIZE PUSH2 0x767 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6B8 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE 0xDD PUSH6 0xFD044DA51A8C TLOAD 0x2C RJUMPI 0x7160 0xF6 CALLF 0x83F5 DUPN 0x96 LOG3 0xCF SAR JUMPDEST RETURNDATACOPY 0xD8 0xC7 0x2D 0xA6 PUSH1 0x42 0x2E PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"307:440:102:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1642:41:178;;:::i;:::-;307:440:102;;;;;;;2513:23:180;;;2509:57;;2580:25;;;;2576:130;;307:440:102;2576:130:180;307:440:102;;2658:37:180;307:440:102;;;;;;;;;;;2658:37:180;307:440:102;;;;;;2658:37:180;307:440:102;2509:57:180;2545:21;307:440:102;2545:21:180;307:440:102;;;;2545:21:180;307:440:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:18:180;;3170:53;;307:440:102;;;;;;;;;;;;;;;;;;;;;;;;;752:1:180;900:21:181;;;896:88;;307:440:102;752:1:180;307:440:102;;1227:26:180;;1223:60;;307:440:102;;1330:38:180;307:440:102;;;;;;;;;;;1330:38:180;307:440:102;;;;;;;1330:38:180;307:440:102;1223:60:180;1262:21;307:440:102;1262:21:180;307:440:102;;1262:21:180;896:88:181;930:54;307:440:102;930:54:181;307:440:102;;752:1:180;307:440:102;;;;930:54:181;307:440:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1877:39:178;;:::i;:::-;307:440:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;307:440:102;;;;;-1:-1:-1;307:440:102;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;307:440:102;2065:19:76;307:440:102;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;307:440:102;720:8:80;307:440:102;720:8:80;;307:440:102;;;;2115:1:76;2802:32;;:::o;2624:153::-;307:440:102;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;307:440:102;2361:10:76;307:440:102;;;;2771:4:76;307:440:102;;;;;-1:-1:-1;2682:95:76;;307:440:102;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;307:440:102;;;2115:1:76;307:440:102;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;307:440:102;1029:19:76;307:440:102;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;307:440:102;;;1676:74:76;;307:440:102;;;1676:74:76;;;307:440:102;1327:10:76;307:440:102;;;;1744:4:76;307:440:102;;;;;-1:-1:-1;1676:74:76;;307:440:102;;;;;;1676:74:76;;;;;;;307:440:102;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"400400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","changeProxyAdmin(address)":"infinite","enforceIsProxyAdmin(address)":"2373","initProxyAdminStorage(address)":"49990","proxyAdmin()":"2275"}},"methodIdentifiers":{"__msgData()":"31e66e1e","changeProxyAdmin(address)":"9f712f2f","enforceIsProxyAdmin(address)":"8eafcf67","initProxyAdminStorage(address)":"4d350622","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoInitialProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"enforceIsProxyAdmin\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialAdmin\",\"type\":\"address\"}],\"name\":\"initProxyAdminStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"the new admin.\",\"previousAdmin\":\"the previous admin.\"}}},\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"initProxyAdminStorage(address)\":{\"details\":\"Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\",\"params\":{\"initialAdmin\":\"The initial payout wallet.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NoInitialProxyAdmin()\":[{\"notice\":\"Thrown when the initial admin is not set.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"Emitted when the proxy admin changes.\"}},\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"initProxyAdminStorage(address)\":{\"notice\":\"Initializes the storage with an initial admin.Sets the proxy initialization phase to `1`.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol\":\"ProxyAdminFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/proxy/facets/ProxyAdminFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdminFacet} from \\\"./../../../proxy/facets/ProxyAdminFacet.sol\\\";\\n\\ncontract ProxyAdminFacetMock is ProxyAdminFacet {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ProxyAdminFacet(forwarderRegistry) {}\\n\\n    function enforceIsProxyAdmin(address account) external view {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(account);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd855a2736e5f0a965e4110898fa96ded5eecfc8f932d222d9f6f486706cb2341\",\"license\":\"MIT\"},\"contracts/proxy/base/ProxyAdminBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IProxyAdmin} from \\\"./../interfaces/IProxyAdmin.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external virtual {\\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin.\\n    function proxyAdmin() external view virtual returns (address admin) {\\n        return ProxyAdminStorage.layout().proxyAdmin();\\n    }\\n}\\n\",\"keccak256\":\"0x7fb543bca8244cd09a8acb36242ed7e870512bfe36148071136515d3f7a831ac\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/facets/ProxyAdminFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdminBase} from \\\"./../base/ProxyAdminBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\ncontract ProxyAdminFacet is ProxyAdminBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial admin.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\\n    /// @param initialAdmin The initial payout wallet.\\n    function initProxyAdminStorage(address initialAdmin) external {\\n        ProxyAdminStorage.layout().proxyInit(initialAdmin);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x097e3b98e64f7395aa104b83f2dec21dd42a3bc6c30e18bdd7787496c121a9ab\",\"license\":\"MIT\"},\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NoInitialProxyAdmin()":[{"notice":"Thrown when the initial admin is not set."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"AdminChanged(address,address)":{"notice":"Emitted when the proxy admin changes."}},"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"initProxyAdminStorage(address)":{"notice":"Initializes the storage with an initial admin.Sets the proxy initialization phase to `1`."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/mocks/security/SealedExecutorMock.sol":{"SealedExecutorMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"AlreadySealed","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sealId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sealer","type":"address"}],"name":"Sealed","type":"event"},{"inputs":[],"name":"SEALER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"wasSealed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"sealedCall","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AlreadySealed(uint256)":[{"params":{"sealId":"The seal identifier."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Sealed(uint256,address)":{"params":{"sealId":"the seal identifier.","sealer":"the sealer address."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isSealed(uint256)":{"params":{"sealId":"the seal identifier."},"returns":{"wasSealed":"Whether a seal has been used already."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"sealedCall(address,bytes,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the sealer role.Reverts with {AlreadySealed} if the sealId has already been used.Emits a {Sealed} event.","params":{"callData":"The encoded function call.","returnData":"The data returned by the call.","sealId":"The seal identifier.","target":"The target contract."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461013157601f61125938819003918201601f19168301916001600160401b038311848410176101365780849260209460405283398101031261013157516001600160a01b038116810361013157336100d2575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1916600117905560805260405161110c908161014d8239608051818181610dc30152610f0a0152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610055565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610b855780630b476f99146108915780632c1758c1146108235780632f2ff15d1461069757806331e66e1e14610614578063526c9811146105bb5780638bb9c5bf1461044c5780638da5cb5b146103db57806391d1485414610343578063d547741f146101ba5763f2fde38b1461009557600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576100cc610bf5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100f5610dac565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610188575073ffffffffffffffffffffffffffffffffffffffff169283830361013b57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004356101f4610c18565b6101fc610dac565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361018857507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166102ae57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55761037a610c18565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356104a7610dac565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156105735760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90806060810161033e565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55760206040517f7365616c657200000000000000000000000000000000000000000000000000008152f35b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b557604061064d610ef3565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004356106d1610c18565b6106d9610dac565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361018857507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561078c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90806060810161033e565b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b600435600052602052602060ff604060002054166040519015158152f35b346101b55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576108c8610bf5565b6024359067ffffffffffffffff82116101b557366023830112156101b55781600401359067ffffffffffffffff82116101b55736602483850101116101b55760443592610913610dac565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fd379d9a3cb0ce2c21ac2ac62c3e37fbdafed322705056ef335203f500fc21224602052604090205460ff1615610b1d577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b856000528060205260ff60406000205416610aef57610a7c93927f4ede4a0b55ef0b366eeda846c0db70204e9f7205524b8c5f653085ca572b257760408873ffffffffffffffffffffffffffffffffffffffff8996602496836000526020528360002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790558351928352166020820152a1610a2283610cab565b610a2f6040519182610c3b565b8381526020810191602060009889968796879401863783010152519082855af13d15610ae7573d91610a6083610cab565b92610a6e6040519485610c3b565b83523d85602085013e611039565b604051809260208252825192836020840152815b848110610acf575050601f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092604080968601015201168101030190f35b60208282018101516040888401015286945001610a90565b606091611039565b857f6e02cd6d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f7365616c657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101b557610beb602091610ce5565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c7c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610c7c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610d8e577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610d88576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b908160209103126101b5575180151581036101b55790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ee4573233148015610ee9575b610ee4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e37575b50610e3457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ed857600091610ea9575b5038610e2a565b610ecb915060203d602011610ed1575b610ec38183610c3b565b810190610d94565b38610ea2565b503d610eb9565b6040513d6000823e3d90fd5b503390565b5060183610610df3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561102757323314801561102f575b61102757803314908115610f86575b50610f55576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101b55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ed857600091611008575b5038610f49565b611021915060203d602011610ed157610ec38183610c3b565b38611001565b506000903690565b5060183610610f3a565b90611078575080511561104e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806110cd575b611089575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b1561108156fea2646970667358221220482a07b866a9401356053e374e3d165d82b117eaf708682f93e5714ed2bd193c64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x131 JUMPI PUSH1 0x1F PUSH2 0x1259 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x136 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x131 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x131 JUMPI CALLER PUSH2 0xD2 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x110C SWAP1 DUP2 PUSH2 0x14D DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xDC3 ADD MSTORE PUSH2 0xF0A ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x55 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xB85 JUMPI DUP1 PUSH4 0xB476F99 EQ PUSH2 0x891 JUMPI DUP1 PUSH4 0x2C1758C1 EQ PUSH2 0x823 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x697 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0x526C9811 EQ PUSH2 0x5BB JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x343 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1BA JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0xCC PUSH2 0xBF5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xF5 PUSH2 0xDAC JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x13B JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1F4 PUSH2 0xC18 JUMP JUMPDEST PUSH2 0x1FC PUSH2 0xDAC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2AE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0x37A PUSH2 0xC18 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x4A7 PUSH2 0xDAC JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x33E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH2 0x64D PUSH2 0xEF3 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x6D1 PUSH2 0xC18 JUMP JUMPDEST PUSH2 0x6D9 PUSH2 0xDAC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x78C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x33E JUMP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0x8C8 PUSH2 0xBF5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B5 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x1B5 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B5 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x1B5 JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH2 0x913 PUSH2 0xDAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xD379D9A3CB0CE2C21AC2AC62C3E37FBDAFED322705056EF335203F500FC21224 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB1D JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B DUP6 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xAEF JUMPI PUSH2 0xA7C SWAP4 SWAP3 PUSH32 0x4EDE4A0B55EF0B366EEDA846C0DB70204E9F7205524B8C5F653085CA572B2577 PUSH1 0x40 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 SWAP7 PUSH1 0x24 SWAP7 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP4 MLOAD SWAP3 DUP4 MSTORE AND PUSH1 0x20 DUP3 ADD MSTORE LOG1 PUSH2 0xA22 DUP4 PUSH2 0xCAB JUMP JUMPDEST PUSH2 0xA2F PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xC3B JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 PUSH1 0x20 PUSH1 0x0 SWAP9 DUP10 SWAP7 DUP8 SWAP7 DUP8 SWAP5 ADD DUP7 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP1 DUP3 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0xAE7 JUMPI RETURNDATASIZE SWAP2 PUSH2 0xA60 DUP4 PUSH2 0xCAB JUMP JUMPDEST SWAP3 PUSH2 0xA6E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xC3B JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE DUP6 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP5 ADD MSTORE DUP2 JUMPDEST DUP5 DUP2 LT PUSH2 0xACF JUMPI POP POP PUSH1 0x1F DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP9 DUP5 ADD ADD MSTORE DUP7 SWAP5 POP ADD PUSH2 0xA90 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x1039 JUMP JUMPDEST DUP6 PUSH32 0x6E02CD6D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1B5 JUMPI PUSH2 0xBEB PUSH1 0x20 SWAP2 PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xC7C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xC7C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD8E JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD88 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xEE4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEE9 JUMPI JUMPDEST PUSH2 0xEE4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE37 JUMPI JUMPDEST POP PUSH2 0xE34 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xED8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEA9 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE2A JUMP JUMPDEST PUSH2 0xECB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xED1 JUMPI JUMPDEST PUSH2 0xEC3 DUP2 DUP4 PUSH2 0xC3B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD94 JUMP JUMPDEST CODESIZE PUSH2 0xEA2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xEB9 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1027 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x102F JUMPI JUMPDEST PUSH2 0x1027 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF86 JUMPI JUMPDEST POP PUSH2 0xF55 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1B5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xED8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1008 JUMPI JUMPDEST POP CODESIZE PUSH2 0xF49 JUMP JUMPDEST PUSH2 0x1021 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xED1 JUMPI PUSH2 0xEC3 DUP2 DUP4 PUSH2 0xC3B JUMP JUMPDEST CODESIZE PUSH2 0x1001 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF3A JUMP JUMPDEST SWAP1 PUSH2 0x1078 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x104E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x10CD JUMPI JUMPDEST PUSH2 0x1089 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1081 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BASEFEE 0x2A SMOD 0xB8 PUSH7 0xA9401356053E37 0x4E RETURNDATASIZE AND TSTORE DUP3 0xB1 OR 0xEA 0xF7 ADDMOD PUSH9 0x2F93E5714ED2BD193C PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"211:240:103:-:0;;;;;;;;;;;;;-1:-1:-1;;211:240:103;;;;-1:-1:-1;;;;;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;211:240:103;;;;;;1558:10:182;1645:152:42;;-1:-1:-1;;;;;500:10:59;211:240:103;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;211:240:103;;;;;;;;745:39:76;211:240:103;;;;;;;;;;;1645:152:42;211:240:103;;;-1:-1:-1;;;;;;211:240:103;1558:10:182;211:240:103;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;211:240:103;-1:-1:-1;211:240:103;;;;;;-1:-1:-1;211:240:103;;;;;-1:-1:-1;211:240:103"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3061,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":3476,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":3096,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":3243,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3131,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":3827,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3500,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":3301,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_verifyCallResultFromTarget":{"entryPoint":4153,"id":1133,"parameterSlots":3,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3523},{"length":32,"start":3850}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610b855780630b476f99146108915780632c1758c1146108235780632f2ff15d1461069757806331e66e1e14610614578063526c9811146105bb5780638bb9c5bf1461044c5780638da5cb5b146103db57806391d1485414610343578063d547741f146101ba5763f2fde38b1461009557600080fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576100cc610bf5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100f5610dac565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610188575073ffffffffffffffffffffffffffffffffffffffff169283830361013b57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004356101f4610c18565b6101fc610dac565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361018857507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166102ae57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55761037a610c18565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356104a7610dac565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156105735760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90806060810161033e565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b55760206040517f7365616c657200000000000000000000000000000000000000000000000000008152f35b346101b55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b557604061064d610ef3565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101b55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004356106d1610c18565b6106d9610dac565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361018857507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561078c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90806060810161033e565b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b600435600052602052602060ff604060002054166040519015158152f35b346101b55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576108c8610bf5565b6024359067ffffffffffffffff82116101b557366023830112156101b55781600401359067ffffffffffffffff82116101b55736602483850101116101b55760443592610913610dac565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fd379d9a3cb0ce2c21ac2ac62c3e37fbdafed322705056ef335203f500fc21224602052604090205460ff1615610b1d577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b856000528060205260ff60406000205416610aef57610a7c93927f4ede4a0b55ef0b366eeda846c0db70204e9f7205524b8c5f653085ca572b257760408873ffffffffffffffffffffffffffffffffffffffff8996602496836000526020528360002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790558351928352166020820152a1610a2283610cab565b610a2f6040519182610c3b565b8381526020810191602060009889968796879401863783010152519082855af13d15610ae7573d91610a6083610cab565b92610a6e6040519485610c3b565b83523d85602085013e611039565b604051809260208252825192836020840152815b848110610acf575050601f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092604080968601015201168101030190f35b60208282018101516040888401015286945001610a90565b606091611039565b857f6e02cd6d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f7365616c657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346101b55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b5576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101b557610beb602091610ce5565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c7c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610c7c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610d8e577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610d88576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b908160209103126101b5575180151581036101b55790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ee4573233148015610ee9575b610ee4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e37575b50610e3457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ed857600091610ea9575b5038610e2a565b610ecb915060203d602011610ed1575b610ec38183610c3b565b810190610d94565b38610ea2565b503d610eb9565b6040513d6000823e3d90fd5b503390565b5060183610610df3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561102757323314801561102f575b61102757803314908115610f86575b50610f55576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101b55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ed857600091611008575b5038610f49565b611021915060203d602011610ed157610ec38183610c3b565b38611001565b506000903690565b5060183610610f3a565b90611078575080511561104e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b815115806110cd575b611089575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b1561108156fea2646970667358221220482a07b866a9401356053e374e3d165d82b117eaf708682f93e5714ed2bd193c64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xB85 JUMPI DUP1 PUSH4 0xB476F99 EQ PUSH2 0x891 JUMPI DUP1 PUSH4 0x2C1758C1 EQ PUSH2 0x823 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x697 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0x526C9811 EQ PUSH2 0x5BB JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x343 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1BA JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0xCC PUSH2 0xBF5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xF5 PUSH2 0xDAC JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x13B JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1F4 PUSH2 0xC18 JUMP JUMPDEST PUSH2 0x1FC PUSH2 0xDAC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2AE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0x37A PUSH2 0xC18 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x4A7 PUSH2 0xDAC JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x33E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH2 0x64D PUSH2 0xEF3 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x6D1 PUSH2 0xC18 JUMP JUMPDEST PUSH2 0x6D9 PUSH2 0xDAC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x188 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x78C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x33E JUMP JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH2 0x8C8 PUSH2 0xBF5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B5 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x1B5 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B5 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x1B5 JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH2 0x913 PUSH2 0xDAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xD379D9A3CB0CE2C21AC2AC62C3E37FBDAFED322705056EF335203F500FC21224 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB1D JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B DUP6 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xAEF JUMPI PUSH2 0xA7C SWAP4 SWAP3 PUSH32 0x4EDE4A0B55EF0B366EEDA846C0DB70204E9F7205524B8C5F653085CA572B2577 PUSH1 0x40 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 SWAP7 PUSH1 0x24 SWAP7 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP4 MLOAD SWAP3 DUP4 MSTORE AND PUSH1 0x20 DUP3 ADD MSTORE LOG1 PUSH2 0xA22 DUP4 PUSH2 0xCAB JUMP JUMPDEST PUSH2 0xA2F PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xC3B JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 PUSH1 0x20 PUSH1 0x0 SWAP9 DUP10 SWAP7 DUP8 SWAP7 DUP8 SWAP5 ADD DUP7 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP1 DUP3 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0xAE7 JUMPI RETURNDATASIZE SWAP2 PUSH2 0xA60 DUP4 PUSH2 0xCAB JUMP JUMPDEST SWAP3 PUSH2 0xA6E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xC3B JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE DUP6 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP5 ADD MSTORE DUP2 JUMPDEST DUP5 DUP2 LT PUSH2 0xACF JUMPI POP POP PUSH1 0x1F DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP9 DUP5 ADD ADD MSTORE DUP7 SWAP5 POP ADD PUSH2 0xA90 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0x1039 JUMP JUMPDEST DUP6 PUSH32 0x6E02CD6D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1B5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1B5 JUMPI PUSH2 0xBEB PUSH1 0x20 SWAP2 PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xC7C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xC7C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD8E JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD88 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xEE4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEE9 JUMPI JUMPDEST PUSH2 0xEE4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE37 JUMPI JUMPDEST POP PUSH2 0xE34 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xED8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEA9 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE2A JUMP JUMPDEST PUSH2 0xECB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xED1 JUMPI JUMPDEST PUSH2 0xEC3 DUP2 DUP4 PUSH2 0xC3B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD94 JUMP JUMPDEST CODESIZE PUSH2 0xEA2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xEB9 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1027 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x102F JUMPI JUMPDEST PUSH2 0x1027 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF86 JUMPI JUMPDEST POP PUSH2 0xF55 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1B5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xED8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1008 JUMPI JUMPDEST POP CODESIZE PUSH2 0xF49 JUMP JUMPDEST PUSH2 0x1021 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xED1 JUMPI PUSH2 0xEC3 DUP2 DUP4 PUSH2 0xC3B JUMP JUMPDEST CODESIZE PUSH2 0x1001 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF3A JUMP JUMPDEST SWAP1 PUSH2 0x1078 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0x104E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0x10CD JUMPI JUMPDEST PUSH2 0x1089 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1081 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BASEFEE 0x2A SMOD 0xB8 PUSH7 0xA9401356053E37 0x4E RETURNDATASIZE AND TSTORE DUP3 0xB1 OR 0xEA 0xF7 ADDMOD PUSH9 0x2F93E5714ED2BD193C PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"211:240:103:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2576:41:182;;:::i;:::-;211:240:103;;;;;;;;;;3205:23:42;;;3201:60;;211:240:103;;;3275:25:42;;;;3271:146;;211:240:103;3271:146:42;211:240:103;;;;;;3361:45:42;211:240:103;;3361:45:42;211:240:103;3201:60:42;3237:24;211:240:103;3237:24:42;211:240:103;;;;3237:24:42;211:240:103;;;;;;;;;;;;;;;;;;;:::i;:::-;2576:41:182;;:::i;:::-;5148:19:42;211:240:103;;;;;;;4503:26:42;;;4499:64;;4464:19:41;211:240:103;;;;;;;;;;;;;-1:-1:-1;211:240:103;;;500:10:59;211:240:103;-1:-1:-1;211:240:103;500:10:59;;1880:140:41;;211:240:103;1880:140:41;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;211:240:103;;;;1973:36:41;;;;211:240:103;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;211:240:103;-1:-1:-1;211:240:103;;;;500:10:59;211:240:103;-1:-1:-1;211:240:103;500:10:59;;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:41:182;;:::i;:::-;211:240:103;;;;;;;;;;;;;-1:-1:-1;211:240:103;;;500:10:59;211:240:103;-1:-1:-1;211:240:103;500:10:59;;3741:25:41;3737:66;;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;211:240:103;;;;2455:33:41;211:240:103;3737:66:41;211:240:103;3775:28:41;;;211:240:103;3775:28:41;211:240:103;;;;;;;3775:28:41;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2811:39:182;;:::i;:::-;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2576:41:182;;:::i;:::-;5148:19:42;211:240:103;;;;;;;4503:26:42;;;4499:64;;4464:19:41;211:240:103;;;;;;;;;;;;;-1:-1:-1;211:240:103;;;500:10:59;211:240:103;-1:-1:-1;211:240:103;500:10:59;;1254:25:41;1250:140;;211:240:103;1250:140:41;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;211:240:103;;;;1343:36:41;211:240:103;;;;;;;;;;;;;;;;;;;;500:10:59;211:240:103;;;500:10:59;;211:240:103;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:41:182;;;:::i;:::-;211:240:103;;;;;;;;;;;;;500:10:59;;;3741:25:41;3737:66;;211:240:103;;;;;;;500:10:59;211:240:103;;;500:10:59;;773:49:191;;3320:55:9;211:240:103;;869:22:191;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;869:22:191;211:240:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3272:31:9;;;;;;211:240:103;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;3320:55:9;:::i;:::-;211:240:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;211:240:103;;;;;;3320:55:9;:::i;773:49:191:-;801:21;;211:240:103;801:21:191;211:240:103;;;;801:21:191;3737:66:41;211:240:103;3775:28:41;;211:240:103;3775:28:41;211:240:103;;;;;;;;3775:28:41;211:240:103;;;;;;;;;;;;;;;;;;;;635:65:55;211:240:103;635:65:55;;:::i;:::-;211:240:103;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;211:240:103;;;;;-1:-1:-1;211:240:103;;;;;;;;;;;;;;:::o;1359:340:59:-;211:240:103;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;211:240:103;500:10:59;211:240:103;500:10:59;;;;211:240:103;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;211:240:103;1528:12:59;:::o;211:240:103:-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;211:240:103;1029:19:76;211:240:103;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;211:240:103;;;1676:74:76;;211:240:103;;;1676:74:76;;;211:240:103;1327:10:76;211:240:103;;;;1744:4:76;211:240:103;;;;;-1:-1:-1;1676:74:76;;211:240:103;;;;;;1676:74:76;;;;;;;211:240:103;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;211:240:103;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;211:240:103;2065:19:76;211:240:103;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;211:240:103;720:8:80;211:240:103;720:8:80;;211:240:103;;;;2115:1:76;2802:32;;:::o;2624:153::-;211:240:103;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;211:240:103;2361:10:76;211:240:103;;;;2771:4:76;211:240:103;;;;;-1:-1:-1;2682:95:76;;211:240:103;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;4437:582:9;;4609:8;;-1:-1:-1;211:240:103;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;211:240:103;;4857:22:9;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;211:240:103;4933:24:9;;4878:1;4933:24;211:240:103;4933:24:9;211:240:103;;4878:1:9;4933:24;4857:49;4883:18;;;:23;4857:49;"},"gasEstimates":{"creation":{"codeDepositCost":"872800","executionCost":"infinite","totalCost":"infinite"},"external":{"SEALER_ROLE()":"254","__msgData()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2631","isSealed(uint256)":"2369","owner()":"2407","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","sealedCall(address,bytes,uint256)":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"SEALER_ROLE()":"526c9811","__msgData()":"31e66e1e","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isSealed(uint256)":"2c1758c1","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","sealedCall(address,bytes,uint256)":"0b476f99","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"AlreadySealed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sealer\",\"type\":\"address\"}],\"name\":\"Sealed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SEALER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"isSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"wasSealed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"sealedCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AlreadySealed(uint256)\":[{\"params\":{\"sealId\":\"The seal identifier.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Sealed(uint256,address)\":{\"params\":{\"sealId\":\"the seal identifier.\",\"sealer\":\"the sealer address.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isSealed(uint256)\":{\"params\":{\"sealId\":\"the seal identifier.\"},\"returns\":{\"wasSealed\":\"Whether a seal has been used already.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"sealedCall(address,bytes,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the sealer role.Reverts with {AlreadySealed} if the sealId has already been used.Emits a {Sealed} event.\",\"params\":{\"callData\":\"The encoded function call.\",\"returnData\":\"The data returned by the call.\",\"sealId\":\"The seal identifier.\",\"target\":\"The target contract.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AlreadySealed(uint256)\":[{\"notice\":\"Thrown when trying to seal a sealId which has already been used.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Sealed(uint256,address)\":{\"notice\":\"Emitted when a seal is used.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isSealed(uint256)\":{\"notice\":\"Retrieves whether a seal has been used already.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"sealedCall(address,bytes,uint256)\":{\"notice\":\"Calls a contract function uniquely for a given seal identifier.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/security/SealedExecutorMock.sol\":\"SealedExecutorMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/security/SealedExecutorMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {SealedExecutor} from \\\"./../../security/SealedExecutor.sol\\\";\\n\\ncontract SealedExecutorMock is SealedExecutor {\\n    constructor(IForwarderRegistry forwarderRegistry) SealedExecutor(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xfe8754f4538e9f906de5943b03c98461f37d964623521c3bb760ea721aa2c343\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/SealedExecutor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlStorage} from \\\"./../access/libraries/AccessControlStorage.sol\\\";\\nimport {SealsStorage} from \\\"./libraries/SealsStorage.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {SealsBase} from \\\"./base/SealsBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../access/AccessControl.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Sealead executions via calls on target contracts.\\n/// @notice Enables contract calls to be performed uniquely thanks to a seal identifier.\\n/// @notice Multiple executions can happen for example due to automation bugs in a backend or in a script.\\n/// @notice Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,\\n/// @notice such as a constant defined in a script or in a unique database field.\\ncontract SealedExecutor is SealsBase, AccessControl, ForwarderRegistryContextBase {\\n    using SealsStorage for SealsStorage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using Address for address;\\n\\n    bytes32 public constant SEALER_ROLE = \\\"sealer\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) ContractOwnership(msg.sender) {}\\n\\n    /// @notice Calls a contract function uniquely for a given seal identifier.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the sealer role.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param target The target contract.\\n    /// @param callData The encoded function call.\\n    /// @param sealId The seal identifier.\\n    /// @param returnData The data returned by the call.\\n    function sealedCall(address target, bytes calldata callData, uint256 sealId) external returns (bytes memory returnData) {\\n        address sealer = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(SEALER_ROLE, sealer);\\n        SealsStorage.layout().seal(sealer, sealId);\\n        return target.functionCall(callData);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x7376887c1e0fd516673158b90106584cc6417559e3886d94050ef9366d12a97a\",\"license\":\"MIT\"},\"contracts/security/base/SealsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ISeals} from \\\"./../interfaces/ISeals.sol\\\";\\nimport {SealsStorage} from \\\"./../libraries/SealsStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Uniquely identified seals management (proxiable version).\\nabstract contract SealsBase is ISeals, Context {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view virtual returns (bool wasSealed) {\\n        return SealsStorage.layout().isSealed(sealId);\\n    }\\n}\\n\",\"keccak256\":\"0xc008172eeec7a415ac9b31401f3b215f94d5dd0d3dbc715cd0413713e5474f45\",\"license\":\"MIT\"},\"contracts/security/errors/SealsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to seal a sealId which has already been used.\\n/// @param sealId The seal identifier.\\nerror AlreadySealed(uint256 sealId);\\n\",\"keccak256\":\"0xe1ada78adc1270e60bc0d6e5decddde05e89194f91aa4828b89abeec8114fed1\",\"license\":\"MIT\"},\"contracts/security/events/SealsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a seal is used.\\n/// @param sealId the seal identifier.\\n/// @param sealer the sealer address.\\nevent Sealed(uint256 sealId, address sealer);\\n\",\"keccak256\":\"0x718ef405558601bf99cd720a64f0c3a9c75b254862013a4aa0b7232c007841ae\",\"license\":\"MIT\"},\"contracts/security/interfaces/ISeals.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Uniquely identified seals management.\\ninterface ISeals {\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view returns (bool wasSealed);\\n}\\n\",\"keccak256\":\"0x763b8ef3f27c078900e4591a5891d4da36b44b29b6f902cc3782ccb30a20c9b6\",\"license\":\"MIT\"},\"contracts/security/libraries/SealsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AlreadySealed} from \\\"./../errors/SealsErrors.sol\\\";\\nimport {Sealed} from \\\"./../events/SealsEvents.sol\\\";\\n\\nlibrary SealsStorage {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => bool) seals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.security.Seals.storage\\\")) - 1);\\n\\n    /// @notice Registers a unique seal identifier.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param sealer The sealer address\\n    /// @param sealId The seal identifier.\\n    function seal(Layout storage s, address sealer, uint256 sealId) internal {\\n        if (s.seals[sealId]) revert AlreadySealed(sealId);\\n        s.seals[sealId] = true;\\n        emit Sealed(sealId, sealer);\\n    }\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(Layout storage s, uint256 sealId) internal view returns (bool) {\\n        return s.seals[sealId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf14843021b6f94e638381210dce97979c8ea8d4788d968906ed089eb92ec3eb2\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"AlreadySealed(uint256)":[{"notice":"Thrown when trying to seal a sealId which has already been used."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Sealed(uint256,address)":{"notice":"Emitted when a seal is used."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isSealed(uint256)":{"notice":"Retrieves whether a seal has been used already."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"sealedCall(address,bytes,uint256)":{"notice":"Calls a contract function uniquely for a given seal identifier."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/security/TokenRecoveryMock.sol":{"TokenRecoveryMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461013f57601f61107838819003918201601f19168301916001600160401b038311848410176101445780849260209460405283398101031261013f57516001600160a01b038116810361013f57336100e0575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610f1d908161015b823960805181818161096101528181610ac601528181610c8d0152610dd30152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610055565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806301ffc9a7146109855780632b4c9f161461091657806331e66e1e14610893578063572b6c051461082f57806373c8a958146106ac5780638da5cb5b1461063b578063c3666c36146103f2578063f2fde38b146102fe5763f7ba94bd0361000e57346102a25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043567ffffffffffffffff81116102a2576100d29036906004016109eb565b60243567ffffffffffffffff81116102a2576100f29036906004016109eb565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610133610dbc565b92541691169081036102d157508181036102a75760005b81811061015357005b61015e818387610bbd565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102a257610188828587610bbd565b359081471061027057600080809381935af13d15610268573d9067ffffffffffffffff821161023957604051916101e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610c1d565b82523d6000602084013e5b15610200575060010161014a565b80511561020f57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101f2565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043573ffffffffffffffffffffffffffffffffffffffff81168091036102a2577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc610377610dbc565b90805473ffffffffffffffffffffffffffffffffffffffff80821693168381036102d157508383036103a557005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102a25761040036610a1c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610445610dbc565b92541691169081036102d15750808214801590610631575b6102a75760005b82811061046d57005b73ffffffffffffffffffffffffffffffffffffffff61049561049083858a610bbd565b610bfc565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156105ca57600091610603575b50156105d6575073ffffffffffffffffffffffffffffffffffffffff61052461049083858a610bbd565b1690610534610490828689610bbd565b9161054082878b610bbd565b3592813b156102a257606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156105ca576001926105b9575b5001610464565b60006105c491610c1d565b886105b2565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610624915060203d811161062a575b61061c8183610c1d565b810190610c5e565b896104fa565b503d610612565b508282141561045d565b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102a2576106ba36610a1c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806106fd610dbc565b92541691169081036102d15750808314801590610825575b6102a75760005b83811061072557005b610730818388610bbd565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102a25760006020918a826107718761076a610490828f8f90610bbd565b938b610bbd565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526107cc606482610c1d565b51925af1156105ca576000513d61081c5750803b155b6107ef575060010161071c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156107e2565b5085831415610715565b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043573ffffffffffffffffffffffffffffffffffffffff811681036102a257610889602091610aaf565b6040519015158152f35b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760406108cc610c76565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a2576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102a257610889602091610b0e565b9181601f840112156102a25782359167ffffffffffffffff83116102a2576020808501948460051b0101116102a257565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102a25760043567ffffffffffffffff81116102a25781610a65916004016109eb565b9290929160243567ffffffffffffffff81116102a25781610a88916004016109eb565b929092916044359067ffffffffffffffff82116102a257610aab916004016109eb565b9091565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610b075773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610bb7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610bb1576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9190811015610bcd5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102a25790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761023957604052565b908160209103126102a2575180151581036102a25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610daa573233148015610db2575b610daa57803314908115610d09575b50610cd8576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102a25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156105ca57600091610d8b575b5038610ccc565b610da4915060203d60201161062a5761061c8183610c1d565b38610d84565b506000903690565b5060183610610cbd565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ed8573233148015610edd575b610ed8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e47575b50610e4457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156105ca57600091610eb9575b5038610e3a565b610ed2915060203d60201161062a5761061c8183610c1d565b38610eb2565b503390565b5060183610610e0356fea264697066735822122046f8728af92e416f9a00add1d1c2023f2ecf29138cb8c1b212c17f20696acfe764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x13F JUMPI PUSH1 0x1F PUSH2 0x1078 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x144 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x13F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x13F JUMPI CALLER PUSH2 0xE0 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xF1D SWAP1 DUP2 PUSH2 0x15B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x961 ADD MSTORE DUP2 DUP2 PUSH2 0xAC6 ADD MSTORE DUP2 DUP2 PUSH2 0xC8D ADD MSTORE PUSH2 0xDD3 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x55 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x985 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x916 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x893 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x82F JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x6AC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2FE JUMPI PUSH4 0xF7BA94BD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI PUSH2 0xD2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI PUSH2 0xF2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x133 PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x153 JUMPI STOP JUMPDEST PUSH2 0x15E DUP2 DUP4 DUP8 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x188 DUP3 DUP6 DUP8 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x270 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x268 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x239 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1E7 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xC1D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x200 JUMPI POP PUSH1 0x1 ADD PUSH2 0x14A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x20F JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1F2 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2A2 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x377 PUSH2 0xDBC JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP4 DUP4 SUB PUSH2 0x3A5 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH2 0x400 CALLDATASIZE PUSH2 0xA1C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x445 PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x631 JUMPI JUMPDEST PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x46D JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x495 PUSH2 0x490 DUP4 DUP6 DUP11 PUSH2 0xBBD JUMP JUMPDEST PUSH2 0xBFC JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x603 JUMPI JUMPDEST POP ISZERO PUSH2 0x5D6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x524 PUSH2 0x490 DUP4 DUP6 DUP11 PUSH2 0xBBD JUMP JUMPDEST AND SWAP1 PUSH2 0x534 PUSH2 0x490 DUP3 DUP7 DUP10 PUSH2 0xBBD JUMP JUMPDEST SWAP2 PUSH2 0x540 DUP3 DUP8 DUP12 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x1 SWAP3 PUSH2 0x5B9 JUMPI JUMPDEST POP ADD PUSH2 0x464 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5C4 SWAP2 PUSH2 0xC1D JUMP JUMPDEST DUP9 PUSH2 0x5B2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x624 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x62A JUMPI JUMPDEST PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP10 PUSH2 0x4FA JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x612 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x45D JUMP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH2 0x6BA CALLDATASIZE PUSH2 0xA1C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x6FD PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x825 JUMPI JUMPDEST PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x725 JUMPI STOP JUMPDEST PUSH2 0x730 DUP2 DUP4 DUP9 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x771 DUP8 PUSH2 0x76A PUSH2 0x490 DUP3 DUP16 DUP16 SWAP1 PUSH2 0xBBD JUMP JUMPDEST SWAP4 DUP12 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x7CC PUSH1 0x64 DUP3 PUSH2 0xC1D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x81C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x7EF JUMPI POP PUSH1 0x1 ADD PUSH2 0x71C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x7E2 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x715 JUMP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x889 PUSH1 0x20 SWAP2 PUSH2 0xAAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x40 PUSH2 0x8CC PUSH2 0xC76 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x889 PUSH1 0x20 SWAP2 PUSH2 0xB0E JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2A2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2A2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2A2 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI DUP2 PUSH2 0xA65 SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI DUP2 PUSH2 0xA88 SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2A2 JUMPI PUSH2 0xAAB SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xB07 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBB7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBB1 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xBCD JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x239 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2A2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2A2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xDAA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xDB2 JUMPI JUMPDEST PUSH2 0xDAA JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD09 JUMPI JUMPDEST POP PUSH2 0xCD8 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2A2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD8B JUMPI JUMPDEST POP CODESIZE PUSH2 0xCCC JUMP JUMPDEST PUSH2 0xDA4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x62A JUMPI PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST CODESIZE PUSH2 0xD84 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xCBD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xED8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEDD JUMPI JUMPDEST PUSH2 0xED8 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE47 JUMPI JUMPDEST POP PUSH2 0xE44 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEB9 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE3A JUMP JUMPDEST PUSH2 0xED2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x62A JUMPI PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST CODESIZE PUSH2 0xEB2 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xE03 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID EXTCALL PUSH19 0x8AF92E416F9A00ADD1D1C2023F2ECF29138CB8 0xC1 0xB2 SLT 0xC1 PUSH32 0x20696ACFE764736F6C634300081E003300000000000000000000000000000000 ","sourceMap":"533:802:104:-:0;;;;;;;;;;;;;-1:-1:-1;;533:802:104;;;;-1:-1:-1;;;;;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:802:104;;;;;;677:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;533:802:104;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;533:802:104;;;;;;;;745:39:76;533:802:104;;;;;;;;;;;;;;;;;;;;;1645:152:42;533:802:104;;;-1:-1:-1;;;;;;533:802:104;677:10;533:802;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;533:802:104;-1:-1:-1;533:802:104;;;;;;-1:-1:-1;533:802:104;;;;;-1:-1:-1;533:802:104"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":2539,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":2588,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_bool_fromMemory":{"entryPoint":3166,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":3005,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3101,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":2735,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":3190,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3516,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":2830,"id":11667,"parameterSlots":1,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":3068,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2401},{"length":32,"start":2758},{"length":32,"start":3213},{"length":32,"start":3539}]},"linkReferences":{},"object":"6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806301ffc9a7146109855780632b4c9f161461091657806331e66e1e14610893578063572b6c051461082f57806373c8a958146106ac5780638da5cb5b1461063b578063c3666c36146103f2578063f2fde38b146102fe5763f7ba94bd0361000e57346102a25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043567ffffffffffffffff81116102a2576100d29036906004016109eb565b60243567ffffffffffffffff81116102a2576100f29036906004016109eb565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610133610dbc565b92541691169081036102d157508181036102a75760005b81811061015357005b61015e818387610bbd565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102a257610188828587610bbd565b359081471061027057600080809381935af13d15610268573d9067ffffffffffffffff821161023957604051916101e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610c1d565b82523d6000602084013e5b15610200575060010161014a565b80511561020f57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101f2565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043573ffffffffffffffffffffffffffffffffffffffff81168091036102a2577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc610377610dbc565b90805473ffffffffffffffffffffffffffffffffffffffff80821693168381036102d157508383036103a557005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102a25761040036610a1c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610445610dbc565b92541691169081036102d15750808214801590610631575b6102a75760005b82811061046d57005b73ffffffffffffffffffffffffffffffffffffffff61049561049083858a610bbd565b610bfc565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156105ca57600091610603575b50156105d6575073ffffffffffffffffffffffffffffffffffffffff61052461049083858a610bbd565b1690610534610490828689610bbd565b9161054082878b610bbd565b3592813b156102a257606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156105ca576001926105b9575b5001610464565b60006105c491610c1d565b886105b2565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610624915060203d811161062a575b61061c8183610c1d565b810190610c5e565b896104fa565b503d610612565b508282141561045d565b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102a2576106ba36610a1c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806106fd610dbc565b92541691169081036102d15750808314801590610825575b6102a75760005b83811061072557005b610730818388610bbd565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102a25760006020918a826107718761076a610490828f8f90610bbd565b938b610bbd565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526107cc606482610c1d565b51925af1156105ca576000513d61081c5750803b155b6107ef575060010161071c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156107e2565b5085831415610715565b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760043573ffffffffffffffffffffffffffffffffffffffff811681036102a257610889602091610aaf565b6040519015158152f35b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a25760406108cc610c76565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102a25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102a25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a2576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102a257610889602091610b0e565b9181601f840112156102a25782359167ffffffffffffffff83116102a2576020808501948460051b0101116102a257565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102a25760043567ffffffffffffffff81116102a25781610a65916004016109eb565b9290929160243567ffffffffffffffff81116102a25781610a88916004016109eb565b929092916044359067ffffffffffffffff82116102a257610aab916004016109eb565b9091565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115610b075773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610bb7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610bb1576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9190811015610bcd5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102a25790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761023957604052565b908160209103126102a2575180151581036102a25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610daa573233148015610db2575b610daa57803314908115610d09575b50610cd8576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102a25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156105ca57600091610d8b575b5038610ccc565b610da4915060203d60201161062a5761061c8183610c1d565b38610d84565b506000903690565b5060183610610cbd565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ed8573233148015610edd575b610ed8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e47575b50610e4457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156105ca57600091610eb9575b5038610e3a565b610ed2915060203d60201161062a5761061c8183610c1d565b38610eb2565b503390565b5060183610610e0356fea264697066735822122046f8728af92e416f9a00add1d1c2023f2ecf29138cb8c1b212c17f20696acfe764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x985 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x916 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x893 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x82F JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x6AC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x63B JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2FE JUMPI PUSH4 0xF7BA94BD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI PUSH2 0xD2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI PUSH2 0xF2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x133 PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x153 JUMPI STOP JUMPDEST PUSH2 0x15E DUP2 DUP4 DUP8 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x188 DUP3 DUP6 DUP8 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x270 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x268 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x239 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1E7 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xC1D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x200 JUMPI POP PUSH1 0x1 ADD PUSH2 0x14A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x20F JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1F2 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2A2 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x377 PUSH2 0xDBC JUMP JUMPDEST SWAP1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP4 DUP4 SUB PUSH2 0x3A5 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH2 0x400 CALLDATASIZE PUSH2 0xA1C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x445 PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x631 JUMPI JUMPDEST PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x46D JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x495 PUSH2 0x490 DUP4 DUP6 DUP11 PUSH2 0xBBD JUMP JUMPDEST PUSH2 0xBFC JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x603 JUMPI JUMPDEST POP ISZERO PUSH2 0x5D6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x524 PUSH2 0x490 DUP4 DUP6 DUP11 PUSH2 0xBBD JUMP JUMPDEST AND SWAP1 PUSH2 0x534 PUSH2 0x490 DUP3 DUP7 DUP10 PUSH2 0xBBD JUMP JUMPDEST SWAP2 PUSH2 0x540 DUP3 DUP8 DUP12 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x1 SWAP3 PUSH2 0x5B9 JUMPI JUMPDEST POP ADD PUSH2 0x464 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5C4 SWAP2 PUSH2 0xC1D JUMP JUMPDEST DUP9 PUSH2 0x5B2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x624 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x62A JUMPI JUMPDEST PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP10 PUSH2 0x4FA JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x612 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x45D JUMP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH2 0x6BA CALLDATASIZE PUSH2 0xA1C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x6FD PUSH2 0xDBC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2D1 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x825 JUMPI JUMPDEST PUSH2 0x2A7 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x725 JUMPI STOP JUMPDEST PUSH2 0x730 DUP2 DUP4 DUP9 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x771 DUP8 PUSH2 0x76A PUSH2 0x490 DUP3 DUP16 DUP16 SWAP1 PUSH2 0xBBD JUMP JUMPDEST SWAP4 DUP12 PUSH2 0xBBD JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x7CC PUSH1 0x64 DUP3 PUSH2 0xC1D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x81C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x7EF JUMPI POP PUSH1 0x1 ADD PUSH2 0x71C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x7E2 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x715 JUMP JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x889 PUSH1 0x20 SWAP2 PUSH2 0xAAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x40 PUSH2 0x8CC PUSH2 0xC76 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2A2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI PUSH2 0x889 PUSH1 0x20 SWAP2 PUSH2 0xB0E JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2A2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2A2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2A2 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2A2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI DUP2 PUSH2 0xA65 SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A2 JUMPI DUP2 PUSH2 0xA88 SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2A2 JUMPI PUSH2 0xAAB SWAP2 PUSH1 0x4 ADD PUSH2 0x9EB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0xB07 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBB7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xBB1 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xBCD JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2A2 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x239 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2A2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2A2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xDAA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xDB2 JUMPI JUMPDEST PUSH2 0xDAA JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD09 JUMPI JUMPDEST POP PUSH2 0xCD8 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2A2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD8B JUMPI JUMPDEST POP CODESIZE PUSH2 0xCCC JUMP JUMPDEST PUSH2 0xDA4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x62A JUMPI PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST CODESIZE PUSH2 0xD84 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xCBD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xED8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xEDD JUMPI JUMPDEST PUSH2 0xED8 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE47 JUMPI JUMPDEST POP PUSH2 0xE44 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x5CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEB9 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE3A JUMP JUMPDEST PUSH2 0xED2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x62A JUMPI PUSH2 0x61C DUP2 DUP4 PUSH2 0xC1D JUMP JUMPDEST CODESIZE PUSH2 0xEB2 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xE03 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CHAINID EXTCALL PUSH19 0x8AF92E416F9A00ADD1D1C2023F2ECF29138CB8 0xC1 0xB2 SLT 0xC1 PUSH32 0x20696ACFE764736F6C634300081E003300000000000000000000000000000000 ","sourceMap":"533:802:104:-:0;;;;;;;;;-1:-1:-1;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;533:802:104;;1052:41;;;:::i;:::-;533:802;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;533:802:104;1845:10:192;;;;;;533:802:104;1857:3:192;1876:11;;;;;:::i;:::-;533:802:104;;;;;;;;;1898:10:192;;;;;:::i;:::-;533:802:104;1375:21:9;;;:30;1371:125;;533:802:104;1548:33:9;;;;;;;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;533:802:104;;1834:9:192;;1591:58:9;533:802:104;;5690:21:9;:17;;533:802:104;5815:105:9;;;;;5686:301;5957:19;533:802:104;5957:19:9;533:802:104;;5957:19:9;533:802:104;;;;;;;;;;;;;;;1371:125:9;1455:21;;1428:57;533:802:104;1428:57:9;533:802:104;;;;;;1428:57:9;533:802:104;;;;1756:63:192;1793:26;533:802:104;1793:26:192;533:802:104;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;533:802:104;;-1:-1:-1;4538:25:42;533:802:104;;;;;;;;;;;;;;;;;;;;;;1052:41;;:::i;:::-;533:802;;;;;;;;;3205:23:42;;;3201:60;;3275:25;;;;3271:146;;533:802:104;3271:146:42;533:802:104;;;;;;3361:45:42;533:802:104;;3361:45:42;533:802:104;;;;;;;;:::i;:::-;5148:19:42;;;;;;533:802:104;;;1052:41;;:::i;:::-;533:802;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;533:802:104;3852:94:192;;533:802:104;3972:10:192;;;;;;533:802:104;3984:3:192;533:802:104;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;533:802:104;;;;4058:76:192;;4108:25;533:802:104;4058:76:192;;533:802:104;4058:76:192;;;;;;;;;;;;533:802:104;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;533:802:104;4239:12:192;;;;;;:::i;:::-;533:802:104;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;533:802:104;4239:70:192;;;;;;;533:802:104;;;;;;;4239:70:192;;;;;533:802:104;4239:70:192;;4277:4;533:802:104;4239:70:192;;533:802:104;;4058:76:192;533:802:104;;;;;;;4239:70:192;;;;;;;533:802:104;4239:70:192;;;3984:3;;533:802:104;3961:9:192;;4239:70;533:802:104;4239:70:192;;;:::i;:::-;;;;;533:802:104;;;;;;;;;4053:173:192;4161:50;533:802:104;4161:50:192;533:802:104;;4058:76:192;533:802:104;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;533:802:104;;1052:41;;;:::i;:::-;533:802;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;533:802:104;2776:90:192;;533:802:104;2892:10:192;;;;;;533:802:104;2904:3:192;2923:9;;;;;:::i;:::-;533:802:104;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;533:802:104;;;1328:43:8;533:802:104;1328:43:8;;;;533:802:104;1328:43:8;;533:802:104;1328:43:8;;;533:802:104;1328:43:8;533:802:104;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;533:802:104;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;533:802:104;;2881:9:192;;8938:146:8;9033:40;533:802:104;9033:40:8;533:802:104;;1328:43:8;533:802:104;9033:40:8;8942:68;533:802:104;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1287:39;;:::i;:::-;533:802;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:19:75;533:802:104;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;533:802:104;635:65:55;;:::i;533:802:104:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;1002:301:75:-;533:802:104;1146:19:75;533:802:104;1146:53:75;;;1142:96;;533:802:104;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;533:802:104;1215:12:75;:::o;1359:340:59:-;533:802:104;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;533:802:104;500:10:59;533:802:104;500:10:59;;;;533:802:104;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;533:802:104;1528:12:59;:::o;533:802:104:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;533:802:104;2065:19:76;533:802:104;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;533:802:104;720:8:80;533:802:104;720:8:80;;533:802:104;;;;2115:1:76;2802:32;;:::o;2624:153::-;533:802:104;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;533:802:104;2361:10:76;533:802:104;;;;2771:4:76;533:802:104;;;;;-1:-1:-1;2682:95:76;;533:802:104;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;533:802:104;1029:19:76;533:802:104;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;533:802:104;;;1676:74:76;;533:802:104;;;1676:74:76;;;533:802:104;1327:10:76;533:802:104;;;;1744:4:76;533:802:104;;;;;-1:-1:-1;1676:74:76;;533:802:104;;;;;;1676:74:76;;;;;;;533:802:104;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"773800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","forwarderRegistry()":"infinite","isTrustedForwarder(address)":"infinite","owner()":"2363","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","forwarderRegistry()":"2b4c9f16","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/security/TokenRecoveryMock.sol\":\"TokenRecoveryMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/security/TokenRecoveryMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract TokenRecoveryMock is TokenRecovery, ForwarderRegistryContext {\\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    receive() external payable {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x2e2e636bc53883b79dc9e21fd38376e92ce16fd1c28d9c991e593905e67ffa35\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol":{"TokenRecoveryFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610bc338819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610b3a908161008982396080518181816108aa01526109f00152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806331e66e1e1461069357806373c8a95814610510578063c3666c36146102c75763f7ba94bd0361000e573461026b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026b5760043567ffffffffffffffff811161026b5761009b903690600401610716565b60243567ffffffffffffffff811161026b576100bb903690600401610716565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100fc6109d9565b925416911690810361029a57508181036102705760005b81811061011c57005b6101278183876107da565b3573ffffffffffffffffffffffffffffffffffffffff811680910361026b576101518285876107da565b359081471061023957600080809381935af13d15610231573d9067ffffffffffffffff821161020257604051916101b060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461083a565b82523d6000602084013e5b156101c95750600101610113565b8051156101d857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101bb565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461026b576102d536610747565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061031a6109d9565b925416911690810361029a5750808214801590610506575b6102705760005b82811061034257005b73ffffffffffffffffffffffffffffffffffffffff61036a61036583858a6107da565b610819565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561049f576000916104d8575b50156104ab575073ffffffffffffffffffffffffffffffffffffffff6103f961036583858a6107da565b16906104096103658286896107da565b9161041582878b6107da565b3592813b1561026b57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561049f5760019261048e575b5001610339565b60006104999161083a565b88610487565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6104f9915060203d81116104ff575b6104f1818361083a565b81019061087b565b896103cf565b503d6104e7565b5082821415610332565b3461026b5761051e36610747565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105616109d9565b925416911690810361029a5750808314801590610689575b6102705760005b83811061058957005b6105948183886107da565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361026b5760006020918a826105d5876105ce610365828f8f906107da565b938b6107da565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261063060648261083a565b51925af11561049f576000513d6106805750803b155b6106535750600101610580565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415610646565b5085831415610579565b3461026b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026b5760406106cc610893565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f8401121561026b5782359167ffffffffffffffff831161026b576020808501948460051b01011161026b57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261026b5760043567ffffffffffffffff811161026b578161079091600401610716565b9290929160243567ffffffffffffffff811161026b57816107b391600401610716565b929092916044359067ffffffffffffffff821161026b576107d691600401610716565b9091565b91908110156107ea5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361026b5790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761020257604052565b9081602091031261026b5751801515810361026b5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109c75732331480156109cf575b6109c757803314908115610926575b506108f5576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161026b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561049f576000916109a8575b50386108e9565b6109c1915060203d6020116104ff576104f1818361083a565b386109a1565b506000903690565b50601836106108da565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610af5573233148015610afa575b610af5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a64575b50610a6157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561049f57600091610ad6575b5038610a57565b610aef915060203d6020116104ff576104f1818361083a565b38610acf565b503390565b5060183610610a2056fea26469706673582212201abacd751407436578ed191b4966fc805f99916317541ee3ac56e5860de36b8e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xBC3 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB3A SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x8AA ADD MSTORE PUSH2 0x9F0 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x693 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x510 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x2C7 JUMPI PUSH4 0xF7BA94BD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x26B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x26B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI PUSH2 0x9B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI PUSH2 0xBB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFC PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP2 DUP2 SUB PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x11C JUMPI STOP JUMPDEST PUSH2 0x127 DUP2 DUP4 DUP8 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x26B JUMPI PUSH2 0x151 DUP3 DUP6 DUP8 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x239 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x231 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x202 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1B0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x83A JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x1C9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x113 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x1D8 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1BB JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH2 0x2D5 CALLDATASIZE PUSH2 0x747 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x31A PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x506 JUMPI JUMPDEST PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x342 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x36A PUSH2 0x365 DUP4 DUP6 DUP11 PUSH2 0x7DA JUMP JUMPDEST PUSH2 0x819 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4D8 JUMPI JUMPDEST POP ISZERO PUSH2 0x4AB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3F9 PUSH2 0x365 DUP4 DUP6 DUP11 PUSH2 0x7DA JUMP JUMPDEST AND SWAP1 PUSH2 0x409 PUSH2 0x365 DUP3 DUP7 DUP10 PUSH2 0x7DA JUMP JUMPDEST SWAP2 PUSH2 0x415 DUP3 DUP8 DUP12 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x26B JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x49F JUMPI PUSH1 0x1 SWAP3 PUSH2 0x48E JUMPI JUMPDEST POP ADD PUSH2 0x339 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x499 SWAP2 PUSH2 0x83A JUMP JUMPDEST DUP9 PUSH2 0x487 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4F9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x4FF JUMPI JUMPDEST PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x87B JUMP JUMPDEST DUP10 PUSH2 0x3CF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4E7 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x332 JUMP JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH2 0x51E CALLDATASIZE PUSH2 0x747 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x561 PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x689 JUMPI JUMPDEST PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x589 JUMPI STOP JUMPDEST PUSH2 0x594 DUP2 DUP4 DUP9 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x26B JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x5D5 DUP8 PUSH2 0x5CE PUSH2 0x365 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x7DA JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x630 PUSH1 0x64 DUP3 PUSH2 0x83A JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x680 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x653 JUMPI POP PUSH1 0x1 ADD PUSH2 0x580 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x646 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x579 JUMP JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x26B JUMPI PUSH1 0x40 PUSH2 0x6CC PUSH2 0x893 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x26B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x26B JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x26B JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x26B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI DUP2 PUSH2 0x790 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI DUP2 PUSH2 0x7B3 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x26B JUMPI PUSH2 0x7D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7EA JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x26B JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x202 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x26B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x26B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9C7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9CF JUMPI JUMPDEST PUSH2 0x9C7 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x926 JUMPI JUMPDEST POP PUSH2 0x8F5 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x26B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9A8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8E9 JUMP JUMPDEST PUSH2 0x9C1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4FF JUMPI PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST CODESIZE PUSH2 0x9A1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAF5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAFA JUMPI JUMPDEST PUSH2 0xAF5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA64 JUMPI JUMPDEST POP PUSH2 0xA61 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0xAD6 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA57 JUMP JUMPDEST PUSH2 0xAEF SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4FF JUMPI PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST CODESIZE PUSH2 0xACF JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA20 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BYTE 0xBA 0xCD PUSH22 0x1407436578ED191B4966FC805F99916317541EE3AC56 JUMPF 0x860D CALLF 0x6B8E PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"232:287:105:-:0;;;;;;;;;;;;;-1:-1:-1;;232:287:105;;;;-1:-1:-1;;;;;232:287:105;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;232:287:105;;;;;;745:39:76;;232:287:105;;;;;;;;745:39:76;232:287:105;;;;;;;;;;;;-1:-1:-1;232:287:105;;;;;;-1:-1:-1;232:287:105;;;;;-1:-1:-1;232:287:105"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1814,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":1863,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_bool_fromMemory":{"entryPoint":2171,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":2010,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":2106,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2195,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2521,"id":13231,"parameterSlots":0,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":2073,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2218},{"length":32,"start":2544}]},"linkReferences":{},"object":"6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806331e66e1e1461069357806373c8a95814610510578063c3666c36146102c75763f7ba94bd0361000e573461026b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026b5760043567ffffffffffffffff811161026b5761009b903690600401610716565b60243567ffffffffffffffff811161026b576100bb903690600401610716565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100fc6109d9565b925416911690810361029a57508181036102705760005b81811061011c57005b6101278183876107da565b3573ffffffffffffffffffffffffffffffffffffffff811680910361026b576101518285876107da565b359081471061023957600080809381935af13d15610231573d9067ffffffffffffffff821161020257604051916101b060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461083a565b82523d6000602084013e5b156101c95750600101610113565b8051156101d857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101bb565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461026b576102d536610747565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061031a6109d9565b925416911690810361029a5750808214801590610506575b6102705760005b82811061034257005b73ffffffffffffffffffffffffffffffffffffffff61036a61036583858a6107da565b610819565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561049f576000916104d8575b50156104ab575073ffffffffffffffffffffffffffffffffffffffff6103f961036583858a6107da565b16906104096103658286896107da565b9161041582878b6107da565b3592813b1561026b57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561049f5760019261048e575b5001610339565b60006104999161083a565b88610487565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6104f9915060203d81116104ff575b6104f1818361083a565b81019061087b565b896103cf565b503d6104e7565b5082821415610332565b3461026b5761051e36610747565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105616109d9565b925416911690810361029a5750808314801590610689575b6102705760005b83811061058957005b6105948183886107da565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361026b5760006020918a826105d5876105ce610365828f8f906107da565b938b6107da565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261063060648261083a565b51925af11561049f576000513d6106805750803b155b6106535750600101610580565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415610646565b5085831415610579565b3461026b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026b5760406106cc610893565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f8401121561026b5782359167ffffffffffffffff831161026b576020808501948460051b01011161026b57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261026b5760043567ffffffffffffffff811161026b578161079091600401610716565b9290929160243567ffffffffffffffff811161026b57816107b391600401610716565b929092916044359067ffffffffffffffff821161026b576107d691600401610716565b9091565b91908110156107ea5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361026b5790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761020257604052565b9081602091031261026b5751801515810361026b5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109c75732331480156109cf575b6109c757803314908115610926575b506108f5576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161026b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561049f576000916109a8575b50386108e9565b6109c1915060203d6020116104ff576104f1818361083a565b386109a1565b506000903690565b50601836106108da565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610af5573233148015610afa575b610af5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a64575b50610a6157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561049f57600091610ad6575b5038610a57565b610aef915060203d6020116104ff576104f1818361083a565b38610acf565b503390565b5060183610610a2056fea26469706673582212201abacd751407436578ed191b4966fc805f99916317541ee3ac56e5860de36b8e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x1B JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x693 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x510 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x2C7 JUMPI PUSH4 0xF7BA94BD SUB PUSH2 0xE JUMPI CALLVALUE PUSH2 0x26B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x26B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI PUSH2 0x9B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI PUSH2 0xBB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFC PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP2 DUP2 SUB PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x11C JUMPI STOP JUMPDEST PUSH2 0x127 DUP2 DUP4 DUP8 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x26B JUMPI PUSH2 0x151 DUP3 DUP6 DUP8 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x239 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x231 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x202 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1B0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x83A JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x1C9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x113 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x1D8 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1BB JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH2 0x2D5 CALLDATASIZE PUSH2 0x747 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x31A PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x506 JUMPI JUMPDEST PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x342 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x36A PUSH2 0x365 DUP4 DUP6 DUP11 PUSH2 0x7DA JUMP JUMPDEST PUSH2 0x819 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4D8 JUMPI JUMPDEST POP ISZERO PUSH2 0x4AB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3F9 PUSH2 0x365 DUP4 DUP6 DUP11 PUSH2 0x7DA JUMP JUMPDEST AND SWAP1 PUSH2 0x409 PUSH2 0x365 DUP3 DUP7 DUP10 PUSH2 0x7DA JUMP JUMPDEST SWAP2 PUSH2 0x415 DUP3 DUP8 DUP12 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x26B JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x49F JUMPI PUSH1 0x1 SWAP3 PUSH2 0x48E JUMPI JUMPDEST POP ADD PUSH2 0x339 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x499 SWAP2 PUSH2 0x83A JUMP JUMPDEST DUP9 PUSH2 0x487 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4F9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x4FF JUMPI JUMPDEST PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x87B JUMP JUMPDEST DUP10 PUSH2 0x3CF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4E7 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x332 JUMP JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH2 0x51E CALLDATASIZE PUSH2 0x747 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x561 PUSH2 0x9D9 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x29A JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x689 JUMPI JUMPDEST PUSH2 0x270 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x589 JUMPI STOP JUMPDEST PUSH2 0x594 DUP2 DUP4 DUP9 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x26B JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x5D5 DUP8 PUSH2 0x5CE PUSH2 0x365 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x7DA JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x7DA JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x630 PUSH1 0x64 DUP3 PUSH2 0x83A JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x680 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x653 JUMPI POP PUSH1 0x1 ADD PUSH2 0x580 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x646 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x579 JUMP JUMPDEST CALLVALUE PUSH2 0x26B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x26B JUMPI PUSH1 0x40 PUSH2 0x6CC PUSH2 0x893 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x26B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x26B JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x26B JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x26B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI DUP2 PUSH2 0x790 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26B JUMPI DUP2 PUSH2 0x7B3 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x26B JUMPI PUSH2 0x7D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x716 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7EA JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x26B JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x202 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x26B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x26B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9C7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9CF JUMPI JUMPDEST PUSH2 0x9C7 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x926 JUMPI JUMPDEST POP PUSH2 0x8F5 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x26B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9A8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8E9 JUMP JUMPDEST PUSH2 0x9C1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4FF JUMPI PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST CODESIZE PUSH2 0x9A1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAF5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAFA JUMPI JUMPDEST PUSH2 0xAF5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA64 JUMPI JUMPDEST POP PUSH2 0xA61 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x49F JUMPI PUSH1 0x0 SWAP2 PUSH2 0xAD6 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA57 JUMP JUMPDEST PUSH2 0xAEF SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4FF JUMPI PUSH2 0x4F1 DUP2 DUP4 PUSH2 0x83A JUMP JUMPDEST CODESIZE PUSH2 0xACF JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA20 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BYTE 0xBA 0xCD PUSH22 0x1407436578ED191B4966FC805F99916317541EE3AC56 JUMPF 0x860D CALLF 0x6B8E PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"232:287:105:-:0;;;;;;;;;-1:-1:-1;232:287:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;232:287:105;;1044:41:188;;;:::i;:::-;232:287:105;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;232:287:105;1845:10:192;;;;;;232:287:105;1857:3:192;1876:11;;;;;:::i;:::-;232:287:105;;;;;;;;;1898:10:192;;;;;:::i;:::-;232:287:105;1375:21:9;;;:30;1371:125;;232:287:105;1548:33:9;;;;;;;232:287:105;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;232:287:105;;1834:9:192;;1591:58:9;232:287:105;;5690:21:9;:17;;232:287:105;5815:105:9;;;;;5686:301;5957:19;232:287:105;5957:19:9;232:287:105;;5957:19:9;232:287:105;;;;;;;;;;;;;;;1371:125:9;1455:21;;1428:57;232:287:105;1428:57:9;232:287:105;;;;;;1428:57:9;232:287:105;;;;1756:63:192;1793:26;232:287:105;1793:26:192;232:287:105;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;232:287:105;;-1:-1:-1;4538:25:42;232:287:105;;;;;;;:::i;:::-;5148:19:42;;;;;;232:287:105;;;1044:41:188;;:::i;:::-;232:287:105;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;232:287:105;3852:94:192;;232:287:105;3972:10:192;;;;;;232:287:105;3984:3:192;232:287:105;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;232:287:105;;;;4058:76:192;;4108:25;232:287:105;4058:76:192;;232:287:105;4058:76:192;;;;;;;;;;;;232:287:105;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;232:287:105;4239:12:192;;;;;;:::i;:::-;232:287:105;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;232:287:105;4239:70:192;;;;;;;232:287:105;;;;;;;4239:70:192;;;;;232:287:105;4239:70:192;;4277:4;232:287:105;4239:70:192;;232:287:105;;4058:76:192;232:287:105;;;;;;;4239:70:192;;;;;;;232:287:105;4239:70:192;;;3984:3;;232:287:105;3961:9:192;;4239:70;232:287:105;4239:70:192;;;:::i;:::-;;;;;232:287:105;;;;;;;;;4053:173:192;4161:50;232:287:105;4161:50:192;232:287:105;;4058:76:192;232:287:105;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;232:287:105;;;;;;;:::i;:::-;5148:19:42;;;;232:287:105;;1044:41:188;;;:::i;:::-;232:287:105;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;232:287:105;2776:90:192;;232:287:105;2892:10:192;;;;;;232:287:105;2904:3:192;2923:9;;;;;:::i;:::-;232:287:105;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;232:287:105;;;1328:43:8;232:287:105;1328:43:8;;;;232:287:105;1328:43:8;;232:287:105;1328:43:8;;;232:287:105;1328:43:8;232:287:105;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;232:287:105;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;232:287:105;;2881:9:192;;8938:146:8;9033:40;232:287:105;9033:40:8;232:287:105;;1328:43:8;232:287:105;9033:40:8;8942:68;232:287:105;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;232:287:105;;;;;;;;;;;;1279:39:188;;:::i;:::-;232:287:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;232:287:105;2065:19:76;232:287:105;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;232:287:105;720:8:80;232:287:105;720:8:80;;232:287:105;;;;2115:1:76;2802:32;;:::o;2624:153::-;232:287:105;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;232:287:105;2361:10:76;232:287:105;;;;2771:4:76;232:287:105;;;;;-1:-1:-1;2682:95:76;;232:287:105;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;232:287:105;1029:19:76;232:287:105;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;232:287:105;;;1676:74:76;;232:287:105;;;1676:74:76;;;232:287:105;1327:10:76;232:287:105;;;;1744:4:76;232:287:105;;;;;-1:-1:-1;1676:74:76;;232:287:105;;;;;;1676:74:76;;;;;;;232:287:105;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"574800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol\":\"TokenRecoveryFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/security/facets/TokenRecoveryFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {TokenRecoveryFacet} from \\\"./../../../security/facets/TokenRecoveryFacet.sol\\\";\\n\\ncontract TokenRecoveryFacetMock is TokenRecoveryFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) TokenRecoveryFacet(forwarderRegistry) {}\\n\\n    receive() external payable {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3b4755b5e2ff5b04b9484f2ab1e063305eb54ad603b5ab8bfa7275b2d87a5e98\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/facets/TokenRecoveryFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../base/TokenRecoveryBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\\ncontract TokenRecoveryFacet is TokenRecoveryBase, ForwarderRegistryContextBase {\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0b19a8140c042266a85021787d5b73c7847b303e310faeb9d60b5d0db4d22dbb\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."}},"version":1}}},"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol":{"ERC1155StakingERC20RewardsLinearPoolMock":{"abi":[{"inputs":[{"internalType":"contract IERC1155","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"address","name":"rewardHolder","type":"address"},{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardHolder","type":"address"}],"name":"RewardHolderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balances","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","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":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardHolder_","type":"address"}],"name":"setRewardHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.","params":{"amounts":"The amounts of tokens received.","from":"The address of the sender.","ids":"The ids of the tokens received.","operator":"The address of the operator."},"returns":{"_0":"bytes4 The function selector of the callback."}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.","params":{"amount":"The amount of tokens received.","from":"The address of the sender.","id":"The id of the token received.","operator":"The address of the operator."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"setRewardHolder(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.","params":{"rewardHolder_":"The address of the reward holder."}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6101003461027357601f613d9d38819003918201601f19168301916001600160401b038311848410176102785780849260a0946040528339810103126102735780516001600160a01b0381168103610273576020820151906001600160a01b03821682036102735760408301516001600160a01b03811693908490036102735760608101519060ff82168092036102735760800151906001600160a01b03821682036102735733610214575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d916307f5828d60e41b600052826020526040600020600160ff198254161790556001600055608052604d81101561020357604d81116101ed57600a0a60a052630271189760e51b6000526020526040600020600160ff1982541617905560c05260e0528060018060a01b0319600a541617600a55604051907f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d29600080a2613b0e908161028f823960805181818161292401528181613293015281816137b40152613903015260a051818181610aa501528181610da60152611c95015260c0518181816105be01528181611338015281816126a5015281816127e101528181612a5f01528181612ccd0152612e43015260e051818181610e4201526117cb0152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100ab565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c80628cc26214612ecf57806301ffc9a714612e675780630479d64414612df85780630700037d14612d955780630968f264146129485780632b4c9f16146128d95780632c9d0b80146128a05780632d1e0c02146124705780632f2ff15d146122c857806331e66e1e14612276578063569c93d214612224578063572b6c05146121d85780636806cc93146120c757806373c8a95814611f8f57806375c93bb914611bd75780637b0a47ee14611b9b57806380faa57d14611b5a578063817b1cd214611b1e5780638580cf7614611ac55780638bb9c5bf1461195b5780638da5cb5b146118e957806391d148541461185257806398807d84146117ef57806399248ea7146117805780639d696e3614611744578063bc197c8114611232578063c3666c3614610fa4578063c5c8f77014610f41578063c63ff8dd14610d20578063cbf1304d14610cb3578063d0b06f5d14610c77578063d547741f14610ac8578063ef4cadc514610a6f578063efa90b5414610a33578063f23a6e61146104fb578063f2fde38b146103d55763f7ba94bd146101b357600080fd5b346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057610202903690600401612fc9565b60243567ffffffffffffffff81116103cc57610222903690600401612fc9565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061026361379d565b925416911690810361039f575081810361037757845b818110610284578580f35b61028f81838761345b565b3573ffffffffffffffffffffffffffffffffffffffff8116809103610373576102b982858761345b565b3590814710610343578780809381935af13d1561033b573d906102db826131c3565b916102e96040519384613153565b82523d88602084013e5b156103015750600101610279565b80518790156103135750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102f3565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25761040d612f11565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061043761379d565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104d0575073ffffffffffffffffffffffffffffffffffffffff169182820361047d578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257610533612f11565b9061053c612f39565b9160843567ffffffffffffffff81116108715761055d903690600401612f5c565b505073ffffffffffffffffffffffffffffffffffffffff309116036105a7575b60206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823303610a0b5760405190826020830152604435604083015260643560608301526060825261060f608083613153565b60405191602083019484865261066184610635604082019460408652606083019061334d565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285613153565b61066961354d565b610672836134bb565b84958451850190604086602084019303126103735761069090613540565b925167ffffffffffffffff811161037357850181603f820112156103735760208101516106bc816131c3565b916106ca6040519384613153565b818352602083019360408284010111610a0757908360406106eb930161332a565b80518101602082820312610a035761070283613540565b156109035750906020826107199351010190613679565b939080925051845181036108db57879073ffffffffffffffffffffffffffffffffffffffff87165b818303610884575050506107fe575b5050505b83156107d6578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261079f60019788546130dc565b875516928385526006602052604085206107ba8382546130dc565b90556107cb6040519283928361343f565b0390a255388061057d565b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b813b156108805791859161084493836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308b60048601613742565b03925af180156108755790849161085c575b80610750565b8161086691613153565b610871578238610856565b8280fd5b6040513d86823e3d90fd5b8580fd5b9091996108ce8b6108d4928c6108a561089d848b6136fa565b51938c6136fa565b5192868252600960205260408220915260205260408d206108c78382546130dc565b90556130dc565b9a6136cd565b9190610741565b6004887f65825336000000000000000000000000000000000000000000000000000000008152fd5b61091593949850602091500190613588565b92915073ffffffffffffffffffffffffffffffffffffffff841686526009602052604086208187526020526040862061094f8482546130dc565b90558296610960575b505050610754565b813b15610880576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201523060248201526044810191909152606481019290925260a06084830152600060a48301528490829060c490829084905af18015610875579084916109ee575b80610958565b816109f891613153565b6108715782386109e8565b8780fd5b8880fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600554604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435610b03612f39565b610b0b61379d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361039f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610bbd578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b93610c6c918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600254604051908152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff610d05612f11565b16815260098352818120602435825283522054604051908152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057610d70903690600401612f5c565b9190610d7a61354d565b610d8261379d565b90610d8c826134bb565b610d95826130e9565b9384610da4575b836001815580f35b7f0000000000000000000000000000000000000000000000000000000000000000610dcf81876131fd565b908015610f1457600a546040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9182166024820152908616604482015260648082018490528152610e6690610e40608482613153565b7f0000000000000000000000000000000000000000000000000000000000000000613a4d565b85610ee75760009606939573ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca959697169586825260076020526040822055610ed0604051948594606086526060860191612f8a565b91602084015260408301520390a280388080610d9c565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff610f93612f11565b168152600883522054604051908152f35b50346103d257610fb336612ffa565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ff961379d565b925416911690810361039f5750808214801590611228575b61120057865b828110611022578780f35b73ffffffffffffffffffffffffffffffffffffffff61104a61104583858b61345b565b61349a565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156111f5578a916111b8575b501561118d57508773ffffffffffffffffffffffffffffffffffffffff6110d961104584868c61345b565b166110e861104584878a61345b565b6110f384888b61345b565b35823b156103cc576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529082908290606490829084905af180156111825761116d575b5050600101611017565b8161117791613153565b610a03578738611163565b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d82116111ed575b816111d260209383613153565b810103126111e9576111e390613540565b386110ae565b8980fd5b3d91506111c5565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415611011565b50346103d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25761126a612f11565b90611273612f39565b60443567ffffffffffffffff811161087157611293903690600401612fc9565b60649291923567ffffffffffffffff8111611740576112b6903690600401612fc9565b9560843567ffffffffffffffff8111610373576112d7903690600401612f5c565b505073ffffffffffffffffffffffffffffffffffffffff30911603611321575b60206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001695863303611718576113e692916113ba9161138a604051978895600160208801526060604088015260808701916132ed565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030160608601526132ed565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283613153565b60405191602083019484865261140c84610635604082019460408652606083019061334d565b61141461354d565b61141d836134bb565b84958451850190604086602084019303126103735761143b90613540565b925167ffffffffffffffff811161037357850181603f82011215610373576020810151611467816131c3565b916114756040519384613153565b818352602083019360408284010111610a075790836040611496930161332a565b80518101602082820312610a03576114ad83613540565b156116185750906020826114c49351010190613679565b939080925051845181036108db57879073ffffffffffffffffffffffffffffffffffffffff87165b8183036115f857505050611585575b5050505b83156107d6578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261154a60019788546130dc565b875516928385526006602052604085206115658382546130dc565b90556115766040519283928361343f565b0390a2553880808080806112f7565b813b15610880579185916115cb93836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308b60048601613742565b03925af18015610875579084916115e3575b806114fb565b816115ed91613153565b6108715782386115dd565b9091996108ce8b611611928c6108a561089d848b6136fa565b91906114ec565b61162a93949850602091500190613588565b92915073ffffffffffffffffffffffffffffffffffffffff84168652600960205260408620818752602052604086206116648482546130dc565b90558296611675575b5050506114ff565b813b15610880576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201523060248201526044810191909152606481019290925260a06084830152600060a48301528490829060c490829084905af1801561087557908491611703575b8061166d565b8161170d91613153565b6108715782386116fd565b6004867fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600454604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff611841612f11565b168152600683522054604051908152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25773ffffffffffffffffffffffffffffffffffffffff60406118a1612f39565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226119b861379d565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611a7f578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600154604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b936132db565b604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435602435611c1061379d565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611f29578215611f01578015611ed9577f000000000000000000000000000000000000000000000000000000000000000080840290848204148091029015611eb157611ccd613236565b6004556005544210801590611ea6575b611e96575b60055490611cf083426130dc565b91428111611d595750928273ffffffffffffffffffffffffffffffffffffffff92611d3e6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976131fd565b6003556005555b42600255835195865260208601521692a280f35b91600393919354611d73611d6d428661308d565b826130c9565b85019485109485150294611e6e57838211611de2575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847492604092611dda611dd373ffffffffffffffffffffffffffffffffffffffff94429061308d565b80926131fd565b600355611d45565b91611df091935080946131fd565b90808210611e4057509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611d45565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b611e9e6132db565b600255611ce2565b506001541515611cdd565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103d257611f9e36612ffa565b92939186959195507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611fe561379d565b925416911690810361039f57508083148015906120bd575b61120057865b83811061200e578780f35b61201981838861345b565b359073ffffffffffffffffffffffffffffffffffffffff82168203610a07576120b760019261204c61104584898961345b565b90612058848a8d61345b565b3573ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526120b2606483613153565b613a4d565b01612003565b5083831415611ffd565b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576120ff612f11565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061213e61379d565b925416911690810361039f575073ffffffffffffffffffffffffffffffffffffffff600a5491169073ffffffffffffffffffffffffffffffffffffffff81168203612187578280f35b7fffffffffffffffffffffffff0000000000000000000000000000000000000000168117600a557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602061221a612215612f11565b61327c565b6040519015158152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576122ad6138ec565b6122c4604051928392602084526020840191612f8a565b0390f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435612303612f39565b61230b61379d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361039f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156123be578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d93610c6c918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d0576124bb903690600401612f5c565b906124c461379d565b604051926124eb846106356020820195600187526040830194604086526060840191612f8a565b6124f361354d565b6124fc826134bb565b84928451850190604086602084019303126103735761251a90613540565b915167ffffffffffffffff811161037357850181603f8201121561037357602081015190612547826131c3565b916125556040519384613153565b808352602083019360408383010111610a0757836040612575930161332a565b86815182016020838203126103d05761258d84613540565b1561276d575050906020826125a59351010190613679565b929080925051835181036108db579087939291849073ffffffffffffffffffffffffffffffffffffffff87165b8183036127355750505061268e575b5050505b8115612666579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261262f836001546130dc565b600155169283855260066020526040852061264b8382546130dc565b905561265c6040519283928361343f565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc5761270b928492836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308c60048601613742565b03925af1801561118257612720575b806125e1565b8161272a91613153565b6103cc57833861271a565b91978495965061275b9061274e8a6127619496976136fa565b51908c6108a58c8b6136fa565b976136cd565b909189959493926125d2565b6020919496506127809392500190613588565b915073ffffffffffffffffffffffffffffffffffffffff84168352600960205260408320818452602052604083206127b98382546130dc565b905581946127ca575b5050506125e5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201523060248201526044810192909252606482015260a06084820152600060a4820152908290829060c490829084905af180156111825761288b575b806127c2565b8161289591613153565b6103cc578338612885565b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b93613236565b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057612998903690600401612f5c565b6129a061379d565b836129aa836131c3565b936129b86040519586613153565b8385526020850193368183011161087157806020928637850101526129db61354d565b6129e4816134bb565b839183518401602085820312610880576129fd82613540565b15612c495750612a14906020855186010190613679565b91508051825181036112005790869291839073ffffffffffffffffffffffffffffffffffffffff86165b818303612bc35750505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc57612ac5928492836040518096819582947f2eb2c2d60000000000000000000000000000000000000000000000000000000084528b3060048601613742565b03925af1801561118257612bae575b50505b8115612b865773ffffffffffffffffffffffffffffffffffffffff169182845260066020526040842054828110612b525790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e93928587526006602052036040862055816001540360015561265c6040519283928361343f565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b81612bb891613153565b6103cc578338612ad4565b9196612c17612c3891898798612c1c8b899a612bef612be686612c3e9b9d6136fa565b519586926136fa565b519687928b8652600960205260408620838752602052836040872054938492828410156135aa565b61308d565b91878252600960205260408220915260205260408d20556130dc565b966136cd565b909188949392612a3e565b612c5892935060200190613588565b92915073ffffffffffffffffffffffffffffffffffffffff8216808652600960205260408620828752602052612c9d846040882054612c1781838789828410156135aa565b9086526009602052604086208287526020526040862055848373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15610871576040517ff242432a00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff861660248201526044810194909452606484019190915260a06084840152600060a4840152829060c490829084905af18015612d8a57612d76575b50612ad7565b84612d8391959295613153565b9238612d70565b6040513d87823e3d90fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff612de7612f11565b168152600783522054604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103d257602061221a83613390565b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b93612f0c612f11565b6130e9565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612f3457565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203612f3457565b9181601f84011215612f345782359167ffffffffffffffff8311612f345760208381860195010111612f3457565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215612f345782359167ffffffffffffffff8311612f34576020808501948460051b010111612f3457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112612f345760043567ffffffffffffffff8111612f34578161304391600401612fc9565b9290929160243567ffffffffffffffff8111612f34578161306691600401612fc9565b929092916044359067ffffffffffffffff8211612f345761308991600401612fc9565b9091565b9190820391821161309a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561309a57565b9190820180921161309a57565b73ffffffffffffffffffffffffffffffffffffffff613150911680600052600660205261313b604060002054613135613120613236565b8460005260086020526040600020549061308d565b906130c9565b906000526007602052604060002054906130dc565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761319457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161319457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b8115613207570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015613275576131509061326f6004549161326a6132616132586132db565b6002549061308d565b600354906130c9565b6131fd565b906130dc565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132d45773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b60055480421060001461315057504290565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311612f345760209260051b809284830137010190565b60005b83811061333d5750506000910152565b818101518382015260200161332d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936133898151809281875287808801910161332a565b0116010190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613439577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613433576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061345660209160408652604086019061334d565b930152565b919081101561346b5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612f345790565b6134c3613236565b6004556005544210801590613535575b613525575b73ffffffffffffffffffffffffffffffffffffffff811690816134f9575050565b613502906130e9565b816000526007602052604060002055600454906000526008602052604060002055565b61352d6132db565b6002556134d8565b5060015415156134d3565b51908115158203612f3457565b60026000541461355e576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b90816060910312612f345761359c81613540565b916040602083015192015190565b9392919093156135ba5750505050565b6084945073ffffffffffffffffffffffffffffffffffffffff604051947f86301c82000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b9080601f83011215612f345781519167ffffffffffffffff8311613194578260051b90604051936136456020840186613153565b8452602080850192820101928311612f3457602001905b8282106136695750505090565b815181526020918201910161365c565b91606083830312612f345761368d83613540565b92602081015167ffffffffffffffff8111612f3457836136ae918301613611565b92604082015167ffffffffffffffff8111612f34576131509201613611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461309a5760010190565b805182101561346b5760209160051b010190565b906020808351928381520192019060005b81811061372c5750505090565b825184526020938401939092019160010161371f565b9261377e9073ffffffffffffffffffffffffffffffffffffffff61378c948160209895168752168686015260a0604086015260a085019061370e565b90838203606085015261370e565b906080818303910152600081520190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156138dd5732331480156138e2575b6138dd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613825575b5061315057503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156138d157600091613897575b503861381b565b90506020813d6020116138c9575b816138b260209383613153565b81010312612f34576138c390613540565b38613890565b3d91506138a5565b6040513d6000823e3d90fd5b503390565b50601836106137e4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613a3b573233148015613a43575b613a3b5780331490811561397f575b5061394e576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211612f345760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156138d157600091613a01575b5038613942565b90506020813d602011613a33575b81613a1c60209383613153565b81010312612f3457613a2d90613540565b386139fa565b3d9150613a0f565b506000903690565b5060183610613933565b906000602091828151910182855af1156138d1576000513d613acf575073ffffffffffffffffffffffffffffffffffffffff81163b155b613a8b5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415613a8456fea2646970667358221220bf714f7dd4d0ca0a2ec4a4114fc00ab31f61a82930b4500eaa87250cb08ed1ee64736f6c634300081e0033","opcodes":"PUSH2 0x100 CALLVALUE PUSH2 0x273 JUMPI PUSH1 0x1F PUSH2 0x3D9D CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x278 JUMPI DUP1 DUP5 SWAP3 PUSH1 0xA0 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x273 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x273 JUMPI PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x273 JUMPI PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP4 SWAP1 DUP5 SWAP1 SUB PUSH2 0x273 JUMPI PUSH1 0x60 DUP2 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x273 JUMPI PUSH1 0x80 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x273 JUMPI CALLER PUSH2 0x214 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x0 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x203 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x1ED JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH4 0x2711897 PUSH1 0xE5 SHL PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0xC0 MSTORE PUSH1 0xE0 MSTORE DUP1 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB NOT PUSH1 0xA SLOAD AND OR PUSH1 0xA SSTORE PUSH1 0x40 MLOAD SWAP1 PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 PUSH1 0x0 DUP1 LOG2 PUSH2 0x3B0E SWAP1 DUP2 PUSH2 0x28F DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2924 ADD MSTORE DUP2 DUP2 PUSH2 0x3293 ADD MSTORE DUP2 DUP2 PUSH2 0x37B4 ADD MSTORE PUSH2 0x3903 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0xAA5 ADD MSTORE DUP2 DUP2 PUSH2 0xDA6 ADD MSTORE PUSH2 0x1C95 ADD MSTORE PUSH1 0xC0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x5BE ADD MSTORE DUP2 DUP2 PUSH2 0x1338 ADD MSTORE DUP2 DUP2 PUSH2 0x26A5 ADD MSTORE DUP2 DUP2 PUSH2 0x27E1 ADD MSTORE DUP2 DUP2 PUSH2 0x2A5F ADD MSTORE DUP2 DUP2 PUSH2 0x2CCD ADD MSTORE PUSH2 0x2E43 ADD MSTORE PUSH1 0xE0 MLOAD DUP2 DUP2 DUP2 PUSH2 0xE42 ADD MSTORE PUSH2 0x17CB ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xAB JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x2ECF JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E67 JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x2DF8 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2D95 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x2948 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x28D9 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x28A0 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x2470 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x22C8 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2276 JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x2224 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x21D8 JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x20C7 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1F8F JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1BD7 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x1B9B JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1B5A JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0x1B1E JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0x1AC5 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x195B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x18E9 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1852 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0x17EF JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0x1780 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0x1744 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x1232 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xFA4 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0xF41 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0xD20 JUMPI DUP1 PUSH4 0xCBF1304D EQ PUSH2 0xCB3 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0xC77 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xAC8 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0xA6F JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0xA33 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4FB JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3D5 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x202 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CC JUMPI PUSH2 0x222 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x263 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP2 DUP2 SUB PUSH2 0x377 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x284 JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x28F DUP2 DUP4 DUP8 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x373 JUMPI PUSH2 0x2B9 DUP3 DUP6 DUP8 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x343 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x33B JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2DB DUP3 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x2E9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x301 JUMPI POP PUSH1 0x1 ADD PUSH2 0x279 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x313 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2F3 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x40D PUSH2 0x2F11 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x437 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x4D0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x47D JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x533 PUSH2 0x2F11 JUMP JUMPDEST SWAP1 PUSH2 0x53C PUSH2 0x2F39 JUMP JUMPDEST SWAP2 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x871 JUMPI PUSH2 0x55D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADDRESS SWAP2 AND SUB PUSH2 0x5A7 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 CALLER SUB PUSH2 0xA0B JUMPI PUSH1 0x40 MLOAD SWAP1 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x64 CALLDATALOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x60 DUP3 MSTORE PUSH2 0x60F PUSH1 0x80 DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP5 DUP5 DUP7 MSTORE PUSH2 0x661 DUP5 PUSH2 0x635 PUSH1 0x40 DUP3 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x669 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x672 DUP4 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x690 SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x6BC DUP2 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x6CA PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0xA07 JUMPI SWAP1 DUP4 PUSH1 0x40 PUSH2 0x6EB SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP1 MLOAD DUP2 ADD PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA03 JUMPI PUSH2 0x702 DUP4 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x903 JUMPI POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x719 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP4 SWAP1 DUP1 SWAP3 POP MLOAD DUP5 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI DUP8 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x884 JUMPI POP POP POP PUSH2 0x7FE JUMPI JUMPDEST POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x7D6 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x79F PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x30DC JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x7BA DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x7CB PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE CODESIZE DUP1 PUSH2 0x57D JUMP JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI SWAP2 DUP6 SWAP2 PUSH2 0x844 SWAP4 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP12 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x85C JUMPI JUMPDEST DUP1 PUSH2 0x750 JUMP JUMPDEST DUP2 PUSH2 0x866 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x856 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP7 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP10 PUSH2 0x8CE DUP12 PUSH2 0x8D4 SWAP3 DUP13 PUSH2 0x8A5 PUSH2 0x89D DUP5 DUP12 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP4 DUP13 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP3 DUP7 DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP14 KECCAK256 PUSH2 0x8C7 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x30DC JUMP JUMPDEST SWAP11 PUSH2 0x36CD JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x741 JUMP JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x915 SWAP4 SWAP5 SWAP9 POP PUSH1 0x20 SWAP2 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP2 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH2 0x94F DUP5 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP3 SWAP7 PUSH2 0x960 JUMPI JUMPDEST POP POP POP PUSH2 0x754 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP4 ADD MSTORE DUP5 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x9EE JUMPI JUMPDEST DUP1 PUSH2 0x958 JUMP JUMPDEST DUP2 PUSH2 0x9F8 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x9E8 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB03 PUSH2 0x2F39 JUMP JUMPDEST PUSH2 0xB0B PUSH2 0x379D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xBBD JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0xC6C SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD05 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x9 DUP4 MSTORE DUP2 DUP2 KECCAK256 PUSH1 0x24 CALLDATALOAD DUP3 MSTORE DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0xD70 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xD7A PUSH2 0x354D JUMP JUMPDEST PUSH2 0xD82 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH2 0xD8C DUP3 PUSH2 0x34BB JUMP JUMPDEST PUSH2 0xD95 DUP3 PUSH2 0x30E9 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0xDA4 JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0xDCF DUP2 DUP8 PUSH2 0x31FD JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0xF14 JUMPI PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 DUP7 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP2 MSTORE PUSH2 0xE66 SWAP1 PUSH2 0xE40 PUSH1 0x84 DUP3 PUSH2 0x3153 JUMP JUMPDEST PUSH32 0x0 PUSH2 0x3A4D JUMP JUMPDEST DUP6 PUSH2 0xEE7 JUMPI PUSH1 0x0 SWAP7 MOD SWAP4 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 SWAP7 SWAP8 AND SWAP6 DUP7 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0xED0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0xD9C JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF93 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH2 0xFB3 CALLDATASIZE PUSH2 0x2FFA JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFF9 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1228 JUMPI JUMPDEST PUSH2 0x1200 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x1022 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x104A PUSH2 0x1045 DUP4 DUP6 DUP12 PUSH2 0x345B JUMP JUMPDEST PUSH2 0x349A JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11F5 JUMPI DUP11 SWAP2 PUSH2 0x11B8 JUMPI JUMPDEST POP ISZERO PUSH2 0x118D JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10D9 PUSH2 0x1045 DUP5 DUP7 DUP13 PUSH2 0x345B JUMP JUMPDEST AND PUSH2 0x10E8 PUSH2 0x1045 DUP5 DUP8 DUP11 PUSH2 0x345B JUMP JUMPDEST PUSH2 0x10F3 DUP5 DUP9 DUP12 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x116D JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x1017 JUMP JUMPDEST DUP2 PUSH2 0x1177 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0xA03 JUMPI DUP8 CODESIZE PUSH2 0x1163 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x11ED JUMPI JUMPDEST DUP2 PUSH2 0x11D2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x11E9 JUMPI PUSH2 0x11E3 SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x10AE JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x11C5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x1011 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x126A PUSH2 0x2F11 JUMP JUMPDEST SWAP1 PUSH2 0x1273 PUSH2 0x2F39 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x871 JUMPI PUSH2 0x1293 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST PUSH1 0x64 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1740 JUMPI PUSH2 0x12B6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP6 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI PUSH2 0x12D7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADDRESS SWAP2 AND SUB PUSH2 0x1321 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP6 DUP7 CALLER SUB PUSH2 0x1718 JUMPI PUSH2 0x13E6 SWAP3 SWAP2 PUSH2 0x13BA SWAP2 PUSH2 0x138A PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 PUSH1 0x1 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x80 DUP8 ADD SWAP2 PUSH2 0x32ED JUMP JUMPDEST SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP6 DUP5 SUB ADD PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x32ED JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP5 MSTORE DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP5 DUP5 DUP7 MSTORE PUSH2 0x140C DUP5 PUSH2 0x635 PUSH1 0x40 DUP3 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST PUSH2 0x1414 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x141D DUP4 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x143B SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x1467 DUP2 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x1475 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0xA07 JUMPI SWAP1 DUP4 PUSH1 0x40 PUSH2 0x1496 SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP1 MLOAD DUP2 ADD PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA03 JUMPI PUSH2 0x14AD DUP4 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x1618 JUMPI POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x14C4 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP4 SWAP1 DUP1 SWAP3 POP MLOAD DUP5 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI DUP8 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x15F8 JUMPI POP POP POP PUSH2 0x1585 JUMPI JUMPDEST POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x7D6 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x154A PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x30DC JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1565 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1576 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x12F7 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI SWAP2 DUP6 SWAP2 PUSH2 0x15CB SWAP4 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP12 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x15E3 JUMPI JUMPDEST DUP1 PUSH2 0x14FB JUMP JUMPDEST DUP2 PUSH2 0x15ED SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x15DD JUMP JUMPDEST SWAP1 SWAP2 SWAP10 PUSH2 0x8CE DUP12 PUSH2 0x1611 SWAP3 DUP13 PUSH2 0x8A5 PUSH2 0x89D DUP5 DUP12 PUSH2 0x36FA JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x14EC JUMP JUMPDEST PUSH2 0x162A SWAP4 SWAP5 SWAP9 POP PUSH1 0x20 SWAP2 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP2 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH2 0x1664 DUP5 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP3 SWAP7 PUSH2 0x1675 JUMPI JUMPDEST POP POP POP PUSH2 0x14FF JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP4 ADD MSTORE DUP5 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x1703 JUMPI JUMPDEST DUP1 PUSH2 0x166D JUMP JUMPDEST DUP2 PUSH2 0x170D SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x16FD JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1841 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0x18A1 PUSH2 0x2F39 JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x19B8 PUSH2 0x379D JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1A7F JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1C10 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1F29 JUMPI DUP3 ISZERO PUSH2 0x1F01 JUMPI DUP1 ISZERO PUSH2 0x1ED9 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x1EB1 JUMPI PUSH2 0x1CCD PUSH2 0x3236 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1EA6 JUMPI JUMPDEST PUSH2 0x1E96 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1CF0 DUP4 TIMESTAMP PUSH2 0x30DC JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1D59 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1D3E PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x31FD JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1D73 PUSH2 0x1D6D TIMESTAMP DUP7 PUSH2 0x308D JUMP JUMPDEST DUP3 PUSH2 0x30C9 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x1E6E JUMPI DUP4 DUP3 GT PUSH2 0x1DE2 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1DDA PUSH2 0x1DD3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x308D JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x31FD JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1D45 JUMP JUMPDEST SWAP2 PUSH2 0x1DF0 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x31FD JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x1E40 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x1D45 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1E9E PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1CE2 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1CDD JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH2 0x1F9E CALLDATASIZE PUSH2 0x2FFA JUMP JUMPDEST SWAP3 SWAP4 SWAP2 DUP7 SWAP6 SWAP2 SWAP6 POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1FE5 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x20BD JUMPI JUMPDEST PUSH2 0x1200 JUMPI DUP7 JUMPDEST DUP4 DUP2 LT PUSH2 0x200E JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH2 0x2019 DUP2 DUP4 DUP9 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xA07 JUMPI PUSH2 0x20B7 PUSH1 0x1 SWAP3 PUSH2 0x204C PUSH2 0x1045 DUP5 DUP10 DUP10 PUSH2 0x345B JUMP JUMPDEST SWAP1 PUSH2 0x2058 DUP5 DUP11 DUP14 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x20B2 PUSH1 0x64 DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3A4D JUMP JUMPDEST ADD PUSH2 0x2003 JUMP JUMPDEST POP DUP4 DUP4 EQ ISZERO PUSH2 0x1FFD JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x20FF PUSH2 0x2F11 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x213E PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x2187 JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0xA SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x221A PUSH2 0x2215 PUSH2 0x2F11 JUMP JUMPDEST PUSH2 0x327C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x22AD PUSH2 0x38EC JUMP JUMPDEST PUSH2 0x22C4 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2303 PUSH2 0x2F39 JUMP JUMPDEST PUSH2 0x230B PUSH2 0x379D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x23BE JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0xC6C SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x24BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 PUSH2 0x24C4 PUSH2 0x379D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x24EB DUP5 PUSH2 0x635 PUSH1 0x20 DUP3 ADD SWAP6 PUSH1 0x1 DUP8 MSTORE PUSH1 0x40 DUP4 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST PUSH2 0x24F3 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x24FC DUP3 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP3 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x251A SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH2 0x2547 DUP3 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x2555 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0xA07 JUMPI DUP4 PUSH1 0x40 PUSH2 0x2575 SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP7 DUP2 MLOAD DUP3 ADD PUSH1 0x20 DUP4 DUP3 SUB SLT PUSH2 0x3D0 JUMPI PUSH2 0x258D DUP5 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x276D JUMPI POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x25A5 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP3 SWAP1 DUP1 SWAP3 POP MLOAD DUP4 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI SWAP1 DUP8 SWAP4 SWAP3 SWAP2 DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x2735 JUMPI POP POP POP PUSH2 0x268E JUMPI JUMPDEST POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x2666 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x262F DUP4 PUSH1 0x1 SLOAD PUSH2 0x30DC JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x264B DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x265C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH2 0x270B SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP13 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x2720 JUMPI JUMPDEST DUP1 PUSH2 0x25E1 JUMP JUMPDEST DUP2 PUSH2 0x272A SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x271A JUMP JUMPDEST SWAP2 SWAP8 DUP5 SWAP6 SWAP7 POP PUSH2 0x275B SWAP1 PUSH2 0x274E DUP11 PUSH2 0x2761 SWAP5 SWAP7 SWAP8 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP1 DUP13 PUSH2 0x8A5 DUP13 DUP12 PUSH2 0x36FA JUMP JUMPDEST SWAP8 PUSH2 0x36CD JUMP JUMPDEST SWAP1 SWAP2 DUP10 SWAP6 SWAP5 SWAP4 SWAP3 PUSH2 0x25D2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP5 SWAP7 POP PUSH2 0x2780 SWAP4 SWAP3 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 DUP2 DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH2 0x27B9 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP2 SWAP5 PUSH2 0x27CA JUMPI JUMPDEST POP POP POP PUSH2 0x25E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x288B JUMPI JUMPDEST DUP1 PUSH2 0x27C2 JUMP JUMPDEST DUP2 PUSH2 0x2895 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x2885 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x3236 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x2998 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST PUSH2 0x29A0 PUSH2 0x379D JUMP JUMPDEST DUP4 PUSH2 0x29AA DUP4 PUSH2 0x31C3 JUMP JUMPDEST SWAP4 PUSH2 0x29B8 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3153 JUMP JUMPDEST DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0x871 JUMPI DUP1 PUSH1 0x20 SWAP3 DUP7 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x29DB PUSH2 0x354D JUMP JUMPDEST PUSH2 0x29E4 DUP2 PUSH2 0x34BB JUMP JUMPDEST DUP4 SWAP2 DUP4 MLOAD DUP5 ADD PUSH1 0x20 DUP6 DUP3 SUB SLT PUSH2 0x880 JUMPI PUSH2 0x29FD DUP3 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x2C49 JUMPI POP PUSH2 0x2A14 SWAP1 PUSH1 0x20 DUP6 MLOAD DUP7 ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP2 POP DUP1 MLOAD DUP3 MLOAD DUP2 SUB PUSH2 0x1200 JUMPI SWAP1 DUP7 SWAP3 SWAP2 DUP4 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x2BC3 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH2 0x2AC5 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP12 ADDRESS PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x2BAE JUMPI JUMPDEST POP POP JUMPDEST DUP2 ISZERO PUSH2 0x2B86 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x2B52 JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x265C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x2BB8 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x2AD4 JUMP JUMPDEST SWAP2 SWAP7 PUSH2 0x2C17 PUSH2 0x2C38 SWAP2 DUP10 DUP8 SWAP9 PUSH2 0x2C1C DUP12 DUP10 SWAP11 PUSH2 0x2BEF PUSH2 0x2BE6 DUP7 PUSH2 0x2C3E SWAP12 SWAP14 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP6 DUP7 SWAP3 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP7 DUP8 SWAP3 DUP12 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP8 KECCAK256 SLOAD SWAP4 DUP5 SWAP3 DUP3 DUP5 LT ISZERO PUSH2 0x35AA JUMP JUMPDEST PUSH2 0x308D JUMP JUMPDEST SWAP2 DUP8 DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP14 KECCAK256 SSTORE PUSH2 0x30DC JUMP JUMPDEST SWAP7 PUSH2 0x36CD JUMP JUMPDEST SWAP1 SWAP2 DUP9 SWAP5 SWAP4 SWAP3 PUSH2 0x2A3E JUMP JUMPDEST PUSH2 0x2C58 SWAP3 SWAP4 POP PUSH1 0x20 ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP3 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH2 0x2C9D DUP5 PUSH1 0x40 DUP9 KECCAK256 SLOAD PUSH2 0x2C17 DUP2 DUP4 DUP8 DUP10 DUP3 DUP5 LT ISZERO PUSH2 0x35AA JUMP JUMPDEST SWAP1 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP3 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP5 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x871 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x64 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP5 ADD MSTORE DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x2D8A JUMPI PUSH2 0x2D76 JUMPI JUMPDEST POP PUSH2 0x2AD7 JUMP JUMPDEST DUP5 PUSH2 0x2D83 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x3153 JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x2D70 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DE7 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x221A DUP4 PUSH2 0x3390 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x2F0C PUSH2 0x2F11 JUMP JUMPDEST PUSH2 0x30E9 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F34 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP2 PUSH2 0x3043 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP2 PUSH2 0x3066 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F34 JUMPI PUSH2 0x3089 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x309A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x309A JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x309A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3150 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x313B PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3135 PUSH2 0x3120 PUSH2 0x3236 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x308D JUMP JUMPDEST SWAP1 PUSH2 0x30C9 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x30DC JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3194 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3194 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x3207 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x3275 JUMPI PUSH2 0x3150 SWAP1 PUSH2 0x326F PUSH1 0x4 SLOAD SWAP2 PUSH2 0x326A PUSH2 0x3261 PUSH2 0x3258 PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x308D JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x30C9 JUMP JUMPDEST PUSH2 0x31FD JUMP JUMPDEST SWAP1 PUSH2 0x30DC JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x32D4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x3150 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x333D JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x332D JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3389 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x332A JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3439 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3433 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3456 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x346B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F34 JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x34C3 PUSH2 0x3236 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x3535 JUMPI JUMPDEST PUSH2 0x3525 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x34F9 JUMPI POP POP JUMP JUMPDEST PUSH2 0x3502 SWAP1 PUSH2 0x30E9 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x352D PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x34D8 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x34D3 JUMP JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x355E JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x60 SWAP2 SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x359C DUP2 PUSH2 0x3540 JUMP JUMPDEST SWAP2 PUSH1 0x40 PUSH1 0x20 DUP4 ADD MLOAD SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 SWAP4 ISZERO PUSH2 0x35BA JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x84 SWAP5 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x86301C8200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP2 MLOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3194 JUMPI DUP3 PUSH1 0x5 SHL SWAP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x3645 PUSH1 0x20 DUP5 ADD DUP7 PUSH2 0x3153 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP3 DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3669 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x365C JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x368D DUP4 PUSH2 0x3540 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP4 PUSH2 0x36AE SWAP2 DUP4 ADD PUSH2 0x3611 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI PUSH2 0x3150 SWAP3 ADD PUSH2 0x3611 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x309A JUMPI PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x346B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x372C JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x371F JUMP JUMPDEST SWAP3 PUSH2 0x377E SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x378C SWAP5 DUP2 PUSH1 0x20 SWAP9 SWAP6 AND DUP8 MSTORE AND DUP7 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD SWAP1 PUSH2 0x370E JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x370E JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH1 0x0 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x38DD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x38E2 JUMPI JUMPDEST PUSH2 0x38DD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3825 JUMPI JUMPDEST POP PUSH2 0x3150 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3897 JUMPI JUMPDEST POP CODESIZE PUSH2 0x381B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x38C9 JUMPI JUMPDEST DUP2 PUSH2 0x38B2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x38C3 SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x3890 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x38A5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x37E4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3A3B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3A43 JUMPI JUMPDEST PUSH2 0x3A3B JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x397F JUMPI JUMPDEST POP PUSH2 0x394E JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2F34 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3A01 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3942 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3A33 JUMPI JUMPDEST DUP2 PUSH2 0x3A1C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x3A2D SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x39FA JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3A0F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3933 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x3ACF JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x3A8B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x3A84 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF PUSH18 0x4F7DD4D0CA0A2EC4A4114FC00AB31F61A829 ADDRESS 0xB4 POP 0xE 0xAA DUP8 0x25 0xC 0xB0 DUP15 DATALOADN 0xEE64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"632:1546:106:-:0;;;;;;;;;;;;;-1:-1:-1;;632:1546:106;;;;-1:-1:-1;;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;632:1546:106;;;;;;;;;;;-1:-1:-1;;;;;632:1546:106;;;;;;;;;;-1:-1:-1;;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;632:1546:106;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;632:1546:106;881:35:59;1863:25:42;;;-1:-1:-1;500:10:59;;632:1546:106;500:10:59;632:1546:106;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;990:1:42;-1:-1:-1;1857:1:13;632:1546:106;745:39:76;4180:2:193;4156:26;;632:1546:106;;;4180:2:193;632:1546:106;;;;;;;4221:44:193;837:39:204;;;-1:-1:-1;500:10:59;632:1546:106;500:10:59;632:1546:106;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;1057:28:196;;1065:26:195;;632:1546:106;;;;;;;;;;;;;;;1144:30:195;;-1:-1:-1;1144:30:195;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1057:28:196;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1065:26:195;632:1546:106;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;-1:-1:-1;632:1546:106;;;;;-1:-1:-1;632:1546:106;;-1:-1:-1;632:1546:106;1645:152:42;632:1546:106;;;-1:-1:-1;;;;;;632:1546:106;4082:10:193;632:1546:106;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;632:1546:106;-1:-1:-1;632:1546:106;;;;;;-1:-1:-1;632:1546:106;;;;;-1:-1:-1;632:1546:106"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12049,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":12233,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12282,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_uint256_dyn_fromMemory":{"entryPoint":13841,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13632,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_boolt_array_uint256_dynt_array_uint256_dyn_fromMemory":{"entryPoint":13945,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_boolt_uint256t_uint256_fromMemory":{"entryPoint":13704,"id":null,"parameterSlots":2,"returnSlots":3},"abi_decode_bytes_calldata":{"entryPoint":12124,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12089,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_array_uint256_dyn_array_uint256_dyn_stringliteral_c5d2":{"entryPoint":14146,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_address_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256_stringliteral_c5d2":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":14094,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":13037,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":13133,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":12170,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":13375,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":12739,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":13403,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":12508,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_uint256":{"entryPoint":12797,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":12489,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":12429,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":13098,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":12627,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOptionalReturn":{"entryPoint":14925,"id":874,"parameterSlots":2,"returnSlots":0},"fun_earned":{"entryPoint":12521,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":12924,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":13019,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgData":{"entryPoint":14572,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":14237,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":13645,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":12854,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":13200,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":13499,"id":20469,"parameterSlots":1,"returnSlots":0},"increment_uint256":{"entryPoint":14029,"id":null,"parameterSlots":1,"returnSlots":1},"memory_array_index_access_uint256_dyn":{"entryPoint":14074,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":13466,"id":null,"parameterSlots":1,"returnSlots":1},"require_helper_error_NotEnoughBalance_address_uint256_uint256_uint256":{"entryPoint":13738,"id":null,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10532},{"length":32,"start":12947},{"length":32,"start":14260},{"length":32,"start":14595}],"20300":[{"length":32,"start":2725},{"length":32,"start":3494},{"length":32,"start":7317}],"21079":[{"length":32,"start":3650},{"length":32,"start":6091}],"21197":[{"length":32,"start":1470},{"length":32,"start":4920},{"length":32,"start":9893},{"length":32,"start":10209},{"length":32,"start":10847},{"length":32,"start":11469},{"length":32,"start":11843}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c80628cc26214612ecf57806301ffc9a714612e675780630479d64414612df85780630700037d14612d955780630968f264146129485780632b4c9f16146128d95780632c9d0b80146128a05780632d1e0c02146124705780632f2ff15d146122c857806331e66e1e14612276578063569c93d214612224578063572b6c05146121d85780636806cc93146120c757806373c8a95814611f8f57806375c93bb914611bd75780637b0a47ee14611b9b57806380faa57d14611b5a578063817b1cd214611b1e5780638580cf7614611ac55780638bb9c5bf1461195b5780638da5cb5b146118e957806391d148541461185257806398807d84146117ef57806399248ea7146117805780639d696e3614611744578063bc197c8114611232578063c3666c3614610fa4578063c5c8f77014610f41578063c63ff8dd14610d20578063cbf1304d14610cb3578063d0b06f5d14610c77578063d547741f14610ac8578063ef4cadc514610a6f578063efa90b5414610a33578063f23a6e61146104fb578063f2fde38b146103d55763f7ba94bd146101b357600080fd5b346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057610202903690600401612fc9565b60243567ffffffffffffffff81116103cc57610222903690600401612fc9565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061026361379d565b925416911690810361039f575081810361037757845b818110610284578580f35b61028f81838761345b565b3573ffffffffffffffffffffffffffffffffffffffff8116809103610373576102b982858761345b565b3590814710610343578780809381935af13d1561033b573d906102db826131c3565b916102e96040519384613153565b82523d88602084013e5b156103015750600101610279565b80518790156103135750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102f3565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25761040d612f11565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061043761379d565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104d0575073ffffffffffffffffffffffffffffffffffffffff169182820361047d578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257610533612f11565b9061053c612f39565b9160843567ffffffffffffffff81116108715761055d903690600401612f5c565b505073ffffffffffffffffffffffffffffffffffffffff309116036105a7575b60206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823303610a0b5760405190826020830152604435604083015260643560608301526060825261060f608083613153565b60405191602083019484865261066184610635604082019460408652606083019061334d565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285613153565b61066961354d565b610672836134bb565b84958451850190604086602084019303126103735761069090613540565b925167ffffffffffffffff811161037357850181603f820112156103735760208101516106bc816131c3565b916106ca6040519384613153565b818352602083019360408284010111610a0757908360406106eb930161332a565b80518101602082820312610a035761070283613540565b156109035750906020826107199351010190613679565b939080925051845181036108db57879073ffffffffffffffffffffffffffffffffffffffff87165b818303610884575050506107fe575b5050505b83156107d6578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261079f60019788546130dc565b875516928385526006602052604085206107ba8382546130dc565b90556107cb6040519283928361343f565b0390a255388061057d565b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b813b156108805791859161084493836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308b60048601613742565b03925af180156108755790849161085c575b80610750565b8161086691613153565b610871578238610856565b8280fd5b6040513d86823e3d90fd5b8580fd5b9091996108ce8b6108d4928c6108a561089d848b6136fa565b51938c6136fa565b5192868252600960205260408220915260205260408d206108c78382546130dc565b90556130dc565b9a6136cd565b9190610741565b6004887f65825336000000000000000000000000000000000000000000000000000000008152fd5b61091593949850602091500190613588565b92915073ffffffffffffffffffffffffffffffffffffffff841686526009602052604086208187526020526040862061094f8482546130dc565b90558296610960575b505050610754565b813b15610880576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201523060248201526044810191909152606481019290925260a06084830152600060a48301528490829060c490829084905af18015610875579084916109ee575b80610958565b816109f891613153565b6108715782386109e8565b8780fd5b8880fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600554604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435610b03612f39565b610b0b61379d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361039f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610bbd578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b93610c6c918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600254604051908152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff610d05612f11565b16815260098352818120602435825283522054604051908152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057610d70903690600401612f5c565b9190610d7a61354d565b610d8261379d565b90610d8c826134bb565b610d95826130e9565b9384610da4575b836001815580f35b7f0000000000000000000000000000000000000000000000000000000000000000610dcf81876131fd565b908015610f1457600a546040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9182166024820152908616604482015260648082018490528152610e6690610e40608482613153565b7f0000000000000000000000000000000000000000000000000000000000000000613a4d565b85610ee75760009606939573ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca959697169586825260076020526040822055610ed0604051948594606086526060860191612f8a565b91602084015260408301520390a280388080610d9c565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff610f93612f11565b168152600883522054604051908152f35b50346103d257610fb336612ffa565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ff961379d565b925416911690810361039f5750808214801590611228575b61120057865b828110611022578780f35b73ffffffffffffffffffffffffffffffffffffffff61104a61104583858b61345b565b61349a565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156111f5578a916111b8575b501561118d57508773ffffffffffffffffffffffffffffffffffffffff6110d961104584868c61345b565b166110e861104584878a61345b565b6110f384888b61345b565b35823b156103cc576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529082908290606490829084905af180156111825761116d575b5050600101611017565b8161117791613153565b610a03578738611163565b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d82116111ed575b816111d260209383613153565b810103126111e9576111e390613540565b386110ae565b8980fd5b3d91506111c5565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415611011565b50346103d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25761126a612f11565b90611273612f39565b60443567ffffffffffffffff811161087157611293903690600401612fc9565b60649291923567ffffffffffffffff8111611740576112b6903690600401612fc9565b9560843567ffffffffffffffff8111610373576112d7903690600401612f5c565b505073ffffffffffffffffffffffffffffffffffffffff30911603611321575b60206040517fbc197c81000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001695863303611718576113e692916113ba9161138a604051978895600160208801526060604088015260808701916132ed565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030160608601526132ed565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101845283613153565b60405191602083019484865261140c84610635604082019460408652606083019061334d565b61141461354d565b61141d836134bb565b84958451850190604086602084019303126103735761143b90613540565b925167ffffffffffffffff811161037357850181603f82011215610373576020810151611467816131c3565b916114756040519384613153565b818352602083019360408284010111610a075790836040611496930161332a565b80518101602082820312610a03576114ad83613540565b156116185750906020826114c49351010190613679565b939080925051845181036108db57879073ffffffffffffffffffffffffffffffffffffffff87165b8183036115f857505050611585575b5050505b83156107d6578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261154a60019788546130dc565b875516928385526006602052604085206115658382546130dc565b90556115766040519283928361343f565b0390a2553880808080806112f7565b813b15610880579185916115cb93836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308b60048601613742565b03925af18015610875579084916115e3575b806114fb565b816115ed91613153565b6108715782386115dd565b9091996108ce8b611611928c6108a561089d848b6136fa565b91906114ec565b61162a93949850602091500190613588565b92915073ffffffffffffffffffffffffffffffffffffffff84168652600960205260408620818752602052604086206116648482546130dc565b90558296611675575b5050506114ff565b813b15610880576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201523060248201526044810191909152606481019290925260a06084830152600060a48301528490829060c490829084905af1801561087557908491611703575b8061166d565b8161170d91613153565b6108715782386116fd565b6004867fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600454604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff611841612f11565b168152600683522054604051908152f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25773ffffffffffffffffffffffffffffffffffffffff60406118a1612f39565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226119b861379d565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611a7f578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600154604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b936132db565b604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435602435611c1061379d565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611f29578215611f01578015611ed9577f000000000000000000000000000000000000000000000000000000000000000080840290848204148091029015611eb157611ccd613236565b6004556005544210801590611ea6575b611e96575b60055490611cf083426130dc565b91428111611d595750928273ffffffffffffffffffffffffffffffffffffffff92611d3e6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976131fd565b6003556005555b42600255835195865260208601521692a280f35b91600393919354611d73611d6d428661308d565b826130c9565b85019485109485150294611e6e57838211611de2575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847492604092611dda611dd373ffffffffffffffffffffffffffffffffffffffff94429061308d565b80926131fd565b600355611d45565b91611df091935080946131fd565b90808210611e4057509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611d45565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b611e9e6132db565b600255611ce2565b506001541515611cdd565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103d257611f9e36612ffa565b92939186959195507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611fe561379d565b925416911690810361039f57508083148015906120bd575b61120057865b83811061200e578780f35b61201981838861345b565b359073ffffffffffffffffffffffffffffffffffffffff82168203610a07576120b760019261204c61104584898961345b565b90612058848a8d61345b565b3573ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526120b2606483613153565b613a4d565b01612003565b5083831415611ffd565b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576120ff612f11565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061213e61379d565b925416911690810361039f575073ffffffffffffffffffffffffffffffffffffffff600a5491169073ffffffffffffffffffffffffffffffffffffffff81168203612187578280f35b7fffffffffffffffffffffffff0000000000000000000000000000000000000000168117600a557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602061221a612215612f11565b61327c565b6040519015158152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576122ad6138ec565b6122c4604051928392602084526020840191612f8a565b0390f35b50346103d25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435612303612f39565b61230b61379d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361039f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156123be578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d93610c6c918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d0576124bb903690600401612f5c565b906124c461379d565b604051926124eb846106356020820195600187526040830194604086526060840191612f8a565b6124f361354d565b6124fc826134bb565b84928451850190604086602084019303126103735761251a90613540565b915167ffffffffffffffff811161037357850181603f8201121561037357602081015190612547826131c3565b916125556040519384613153565b808352602083019360408383010111610a0757836040612575930161332a565b86815182016020838203126103d05761258d84613540565b1561276d575050906020826125a59351010190613679565b929080925051835181036108db579087939291849073ffffffffffffffffffffffffffffffffffffffff87165b8183036127355750505061268e575b5050505b8115612666579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261262f836001546130dc565b600155169283855260066020526040852061264b8382546130dc565b905561265c6040519283928361343f565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc5761270b928492836040518096819582947f2eb2c2d6000000000000000000000000000000000000000000000000000000008452308c60048601613742565b03925af1801561118257612720575b806125e1565b8161272a91613153565b6103cc57833861271a565b91978495965061275b9061274e8a6127619496976136fa565b51908c6108a58c8b6136fa565b976136cd565b909189959493926125d2565b6020919496506127809392500190613588565b915073ffffffffffffffffffffffffffffffffffffffff84168352600960205260408320818452602052604083206127b98382546130dc565b905581946127ca575b5050506125e5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc576040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201523060248201526044810192909252606482015260a06084820152600060a4820152908290829060c490829084905af180156111825761288b575b806127c2565b8161289591613153565b6103cc578338612885565b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b93613236565b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d25760043567ffffffffffffffff81116103d057612998903690600401612f5c565b6129a061379d565b836129aa836131c3565b936129b86040519586613153565b8385526020850193368183011161087157806020928637850101526129db61354d565b6129e4816134bb565b839183518401602085820312610880576129fd82613540565b15612c495750612a14906020855186010190613679565b91508051825181036112005790869291839073ffffffffffffffffffffffffffffffffffffffff86165b818303612bc35750505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691823b156103cc57612ac5928492836040518096819582947f2eb2c2d60000000000000000000000000000000000000000000000000000000084528b3060048601613742565b03925af1801561118257612bae575b50505b8115612b865773ffffffffffffffffffffffffffffffffffffffff169182845260066020526040842054828110612b525790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e93928587526006602052036040862055816001540360015561265c6040519283928361343f565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b81612bb891613153565b6103cc578338612ad4565b9196612c17612c3891898798612c1c8b899a612bef612be686612c3e9b9d6136fa565b519586926136fa565b519687928b8652600960205260408620838752602052836040872054938492828410156135aa565b61308d565b91878252600960205260408220915260205260408d20556130dc565b966136cd565b909188949392612a3e565b612c5892935060200190613588565b92915073ffffffffffffffffffffffffffffffffffffffff8216808652600960205260408620828752602052612c9d846040882054612c1781838789828410156135aa565b9086526009602052604086208287526020526040862055848373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15610871576040517ff242432a00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff861660248201526044810194909452606484019190915260a06084840152600060a4840152829060c490829084905af18015612d8a57612d76575b50612ad7565b84612d8391959295613153565b9238612d70565b6040513d87823e3d90fd5b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257604060209173ffffffffffffffffffffffffffffffffffffffff612de7612f11565b168152600783522054604051908152f35b50346103d257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d257600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103d257602061221a83613390565b50346103d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103d2576020611b93612f0c612f11565b6130e9565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612f3457565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203612f3457565b9181601f84011215612f345782359167ffffffffffffffff8311612f345760208381860195010111612f3457565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215612f345782359167ffffffffffffffff8311612f34576020808501948460051b010111612f3457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112612f345760043567ffffffffffffffff8111612f34578161304391600401612fc9565b9290929160243567ffffffffffffffff8111612f34578161306691600401612fc9565b929092916044359067ffffffffffffffff8211612f345761308991600401612fc9565b9091565b9190820391821161309a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561309a57565b9190820180921161309a57565b73ffffffffffffffffffffffffffffffffffffffff613150911680600052600660205261313b604060002054613135613120613236565b8460005260086020526040600020549061308d565b906130c9565b906000526007602052604060002054906130dc565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761319457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161319457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b8115613207570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015613275576131509061326f6004549161326a6132616132586132db565b6002549061308d565b600354906130c9565b6131fd565b906130dc565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132d45773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b60055480421060001461315057504290565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311612f345760209260051b809284830137010190565b60005b83811061333d5750506000910152565b818101518382015260200161332d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936133898151809281875287808801910161332a565b0116010190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613439577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613433576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061345660209160408652604086019061334d565b930152565b919081101561346b5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612f345790565b6134c3613236565b6004556005544210801590613535575b613525575b73ffffffffffffffffffffffffffffffffffffffff811690816134f9575050565b613502906130e9565b816000526007602052604060002055600454906000526008602052604060002055565b61352d6132db565b6002556134d8565b5060015415156134d3565b51908115158203612f3457565b60026000541461355e576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b90816060910312612f345761359c81613540565b916040602083015192015190565b9392919093156135ba5750505050565b6084945073ffffffffffffffffffffffffffffffffffffffff604051947f86301c82000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b9080601f83011215612f345781519167ffffffffffffffff8311613194578260051b90604051936136456020840186613153565b8452602080850192820101928311612f3457602001905b8282106136695750505090565b815181526020918201910161365c565b91606083830312612f345761368d83613540565b92602081015167ffffffffffffffff8111612f3457836136ae918301613611565b92604082015167ffffffffffffffff8111612f34576131509201613611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461309a5760010190565b805182101561346b5760209160051b010190565b906020808351928381520192019060005b81811061372c5750505090565b825184526020938401939092019160010161371f565b9261377e9073ffffffffffffffffffffffffffffffffffffffff61378c948160209895168752168686015260a0604086015260a085019061370e565b90838203606085015261370e565b906080818303910152600081520190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156138dd5732331480156138e2575b6138dd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613825575b5061315057503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156138d157600091613897575b503861381b565b90506020813d6020116138c9575b816138b260209383613153565b81010312612f34576138c390613540565b38613890565b3d91506138a5565b6040513d6000823e3d90fd5b503390565b50601836106137e4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613a3b573233148015613a43575b613a3b5780331490811561397f575b5061394e576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211612f345760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156138d157600091613a01575b5038613942565b90506020813d602011613a33575b81613a1c60209383613153565b81010312612f3457613a2d90613540565b386139fa565b3d9150613a0f565b506000903690565b5060183610613933565b906000602091828151910182855af1156138d1576000513d613acf575073ffffffffffffffffffffffffffffffffffffffff81163b155b613a8b5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415613a8456fea2646970667358221220bf714f7dd4d0ca0a2ec4a4114fc00ab31f61a82930b4500eaa87250cb08ed1ee64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x2ECF JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E67 JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x2DF8 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2D95 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x2948 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x28D9 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x28A0 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x2470 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x22C8 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2276 JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x2224 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x21D8 JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x20C7 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1F8F JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1BD7 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x1B9B JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1B5A JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0x1B1E JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0x1AC5 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x195B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x18E9 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1852 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0x17EF JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0x1780 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0x1744 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x1232 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xFA4 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0xF41 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0xD20 JUMPI DUP1 PUSH4 0xCBF1304D EQ PUSH2 0xCB3 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0xC77 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xAC8 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0xA6F JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0xA33 JUMPI DUP1 PUSH4 0xF23A6E61 EQ PUSH2 0x4FB JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3D5 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x202 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CC JUMPI PUSH2 0x222 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x263 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP2 DUP2 SUB PUSH2 0x377 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x284 JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x28F DUP2 DUP4 DUP8 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x373 JUMPI PUSH2 0x2B9 DUP3 DUP6 DUP8 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x343 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x33B JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2DB DUP3 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x2E9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x301 JUMPI POP PUSH1 0x1 ADD PUSH2 0x279 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x313 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2F3 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x40D PUSH2 0x2F11 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x437 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x4D0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x47D JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x533 PUSH2 0x2F11 JUMP JUMPDEST SWAP1 PUSH2 0x53C PUSH2 0x2F39 JUMP JUMPDEST SWAP2 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x871 JUMPI PUSH2 0x55D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADDRESS SWAP2 AND SUB PUSH2 0x5A7 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 CALLER SUB PUSH2 0xA0B JUMPI PUSH1 0x40 MLOAD SWAP1 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x64 CALLDATALOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x60 DUP3 MSTORE PUSH2 0x60F PUSH1 0x80 DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP5 DUP5 DUP7 MSTORE PUSH2 0x661 DUP5 PUSH2 0x635 PUSH1 0x40 DUP3 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x669 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x672 DUP4 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x690 SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x6BC DUP2 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x6CA PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0xA07 JUMPI SWAP1 DUP4 PUSH1 0x40 PUSH2 0x6EB SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP1 MLOAD DUP2 ADD PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA03 JUMPI PUSH2 0x702 DUP4 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x903 JUMPI POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x719 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP4 SWAP1 DUP1 SWAP3 POP MLOAD DUP5 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI DUP8 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x884 JUMPI POP POP POP PUSH2 0x7FE JUMPI JUMPDEST POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x7D6 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x79F PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x30DC JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x7BA DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x7CB PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE CODESIZE DUP1 PUSH2 0x57D JUMP JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI SWAP2 DUP6 SWAP2 PUSH2 0x844 SWAP4 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP12 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x85C JUMPI JUMPDEST DUP1 PUSH2 0x750 JUMP JUMPDEST DUP2 PUSH2 0x866 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x856 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP7 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP10 PUSH2 0x8CE DUP12 PUSH2 0x8D4 SWAP3 DUP13 PUSH2 0x8A5 PUSH2 0x89D DUP5 DUP12 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP4 DUP13 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP3 DUP7 DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP14 KECCAK256 PUSH2 0x8C7 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x30DC JUMP JUMPDEST SWAP11 PUSH2 0x36CD JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x741 JUMP JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x915 SWAP4 SWAP5 SWAP9 POP PUSH1 0x20 SWAP2 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP2 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH2 0x94F DUP5 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP3 SWAP7 PUSH2 0x960 JUMPI JUMPDEST POP POP POP PUSH2 0x754 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP4 ADD MSTORE DUP5 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x9EE JUMPI JUMPDEST DUP1 PUSH2 0x958 JUMP JUMPDEST DUP2 PUSH2 0x9F8 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x9E8 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB03 PUSH2 0x2F39 JUMP JUMPDEST PUSH2 0xB0B PUSH2 0x379D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xBBD JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0xC6C SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD05 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x9 DUP4 MSTORE DUP2 DUP2 KECCAK256 PUSH1 0x24 CALLDATALOAD DUP3 MSTORE DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0xD70 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xD7A PUSH2 0x354D JUMP JUMPDEST PUSH2 0xD82 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH2 0xD8C DUP3 PUSH2 0x34BB JUMP JUMPDEST PUSH2 0xD95 DUP3 PUSH2 0x30E9 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0xDA4 JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0xDCF DUP2 DUP8 PUSH2 0x31FD JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0xF14 JUMPI PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 DUP7 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP2 MSTORE PUSH2 0xE66 SWAP1 PUSH2 0xE40 PUSH1 0x84 DUP3 PUSH2 0x3153 JUMP JUMPDEST PUSH32 0x0 PUSH2 0x3A4D JUMP JUMPDEST DUP6 PUSH2 0xEE7 JUMPI PUSH1 0x0 SWAP7 MOD SWAP4 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 SWAP7 SWAP8 AND SWAP6 DUP7 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0xED0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0xD9C JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF93 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH2 0xFB3 CALLDATASIZE PUSH2 0x2FFA JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFF9 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1228 JUMPI JUMPDEST PUSH2 0x1200 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x1022 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x104A PUSH2 0x1045 DUP4 DUP6 DUP12 PUSH2 0x345B JUMP JUMPDEST PUSH2 0x349A JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11F5 JUMPI DUP11 SWAP2 PUSH2 0x11B8 JUMPI JUMPDEST POP ISZERO PUSH2 0x118D JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10D9 PUSH2 0x1045 DUP5 DUP7 DUP13 PUSH2 0x345B JUMP JUMPDEST AND PUSH2 0x10E8 PUSH2 0x1045 DUP5 DUP8 DUP11 PUSH2 0x345B JUMP JUMPDEST PUSH2 0x10F3 DUP5 DUP9 DUP12 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x116D JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x1017 JUMP JUMPDEST DUP2 PUSH2 0x1177 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0xA03 JUMPI DUP8 CODESIZE PUSH2 0x1163 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x11ED JUMPI JUMPDEST DUP2 PUSH2 0x11D2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x11E9 JUMPI PUSH2 0x11E3 SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x10AE JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x11C5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x1011 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x126A PUSH2 0x2F11 JUMP JUMPDEST SWAP1 PUSH2 0x1273 PUSH2 0x2F39 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x871 JUMPI PUSH2 0x1293 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST PUSH1 0x64 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1740 JUMPI PUSH2 0x12B6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP6 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI PUSH2 0x12D7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADDRESS SWAP2 AND SUB PUSH2 0x1321 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP6 DUP7 CALLER SUB PUSH2 0x1718 JUMPI PUSH2 0x13E6 SWAP3 SWAP2 PUSH2 0x13BA SWAP2 PUSH2 0x138A PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 PUSH1 0x1 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x80 DUP8 ADD SWAP2 PUSH2 0x32ED JUMP JUMPDEST SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP6 DUP5 SUB ADD PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x32ED JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP5 MSTORE DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD SWAP5 DUP5 DUP7 MSTORE PUSH2 0x140C DUP5 PUSH2 0x635 PUSH1 0x40 DUP3 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST PUSH2 0x1414 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x141D DUP4 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x143B SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x1467 DUP2 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x1475 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0xA07 JUMPI SWAP1 DUP4 PUSH1 0x40 PUSH2 0x1496 SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP1 MLOAD DUP2 ADD PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA03 JUMPI PUSH2 0x14AD DUP4 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x1618 JUMPI POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x14C4 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP4 SWAP1 DUP1 SWAP3 POP MLOAD DUP5 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI DUP8 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x15F8 JUMPI POP POP POP PUSH2 0x1585 JUMPI JUMPDEST POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x7D6 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x154A PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x30DC JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1565 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1576 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x12F7 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI SWAP2 DUP6 SWAP2 PUSH2 0x15CB SWAP4 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP12 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x15E3 JUMPI JUMPDEST DUP1 PUSH2 0x14FB JUMP JUMPDEST DUP2 PUSH2 0x15ED SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x15DD JUMP JUMPDEST SWAP1 SWAP2 SWAP10 PUSH2 0x8CE DUP12 PUSH2 0x1611 SWAP3 DUP13 PUSH2 0x8A5 PUSH2 0x89D DUP5 DUP12 PUSH2 0x36FA JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x14EC JUMP JUMPDEST PUSH2 0x162A SWAP4 SWAP5 SWAP9 POP PUSH1 0x20 SWAP2 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP2 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH2 0x1664 DUP5 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP3 SWAP7 PUSH2 0x1675 JUMPI JUMPDEST POP POP POP PUSH2 0x14FF JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x880 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP4 ADD MSTORE DUP5 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x875 JUMPI SWAP1 DUP5 SWAP2 PUSH2 0x1703 JUMPI JUMPDEST DUP1 PUSH2 0x166D JUMP JUMPDEST DUP2 PUSH2 0x170D SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x871 JUMPI DUP3 CODESIZE PUSH2 0x16FD JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1841 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0x18A1 PUSH2 0x2F39 JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x19B8 PUSH2 0x379D JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1A7F JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1C10 PUSH2 0x379D JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1F29 JUMPI DUP3 ISZERO PUSH2 0x1F01 JUMPI DUP1 ISZERO PUSH2 0x1ED9 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x1EB1 JUMPI PUSH2 0x1CCD PUSH2 0x3236 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1EA6 JUMPI JUMPDEST PUSH2 0x1E96 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1CF0 DUP4 TIMESTAMP PUSH2 0x30DC JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1D59 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1D3E PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x31FD JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1D73 PUSH2 0x1D6D TIMESTAMP DUP7 PUSH2 0x308D JUMP JUMPDEST DUP3 PUSH2 0x30C9 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x1E6E JUMPI DUP4 DUP3 GT PUSH2 0x1DE2 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1DDA PUSH2 0x1DD3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x308D JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x31FD JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1D45 JUMP JUMPDEST SWAP2 PUSH2 0x1DF0 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x31FD JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x1E40 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x1D45 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1E9E PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1CE2 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1CDD JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH2 0x1F9E CALLDATASIZE PUSH2 0x2FFA JUMP JUMPDEST SWAP3 SWAP4 SWAP2 DUP7 SWAP6 SWAP2 SWAP6 POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1FE5 PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x20BD JUMPI JUMPDEST PUSH2 0x1200 JUMPI DUP7 JUMPDEST DUP4 DUP2 LT PUSH2 0x200E JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH2 0x2019 DUP2 DUP4 DUP9 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xA07 JUMPI PUSH2 0x20B7 PUSH1 0x1 SWAP3 PUSH2 0x204C PUSH2 0x1045 DUP5 DUP10 DUP10 PUSH2 0x345B JUMP JUMPDEST SWAP1 PUSH2 0x2058 DUP5 DUP11 DUP14 PUSH2 0x345B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x20B2 PUSH1 0x64 DUP4 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3A4D JUMP JUMPDEST ADD PUSH2 0x2003 JUMP JUMPDEST POP DUP4 DUP4 EQ ISZERO PUSH2 0x1FFD JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x20FF PUSH2 0x2F11 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x213E PUSH2 0x379D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x2187 JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0xA SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x221A PUSH2 0x2215 PUSH2 0x2F11 JUMP JUMPDEST PUSH2 0x327C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH2 0x22AD PUSH2 0x38EC JUMP JUMPDEST PUSH2 0x22C4 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2303 PUSH2 0x2F39 JUMP JUMPDEST PUSH2 0x230B PUSH2 0x379D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x39F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x23BE JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0xC6C SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x24BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 PUSH2 0x24C4 PUSH2 0x379D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x24EB DUP5 PUSH2 0x635 PUSH1 0x20 DUP3 ADD SWAP6 PUSH1 0x1 DUP8 MSTORE PUSH1 0x40 DUP4 ADD SWAP5 PUSH1 0x40 DUP7 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x2F8A JUMP JUMPDEST PUSH2 0x24F3 PUSH2 0x354D JUMP JUMPDEST PUSH2 0x24FC DUP3 PUSH2 0x34BB JUMP JUMPDEST DUP5 SWAP3 DUP5 MLOAD DUP6 ADD SWAP1 PUSH1 0x40 DUP7 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x373 JUMPI PUSH2 0x251A SWAP1 PUSH2 0x3540 JUMP JUMPDEST SWAP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x373 JUMPI DUP6 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x373 JUMPI PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH2 0x2547 DUP3 PUSH2 0x31C3 JUMP JUMPDEST SWAP2 PUSH2 0x2555 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3153 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0xA07 JUMPI DUP4 PUSH1 0x40 PUSH2 0x2575 SWAP4 ADD PUSH2 0x332A JUMP JUMPDEST DUP7 DUP2 MLOAD DUP3 ADD PUSH1 0x20 DUP4 DUP3 SUB SLT PUSH2 0x3D0 JUMPI PUSH2 0x258D DUP5 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x276D JUMPI POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x25A5 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP3 SWAP1 DUP1 SWAP3 POP MLOAD DUP4 MLOAD DUP2 SUB PUSH2 0x8DB JUMPI SWAP1 DUP8 SWAP4 SWAP3 SWAP2 DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x2735 JUMPI POP POP POP PUSH2 0x268E JUMPI JUMPDEST POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x2666 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x262F DUP4 PUSH1 0x1 SLOAD PUSH2 0x30DC JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x264B DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x265C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH2 0x270B SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE ADDRESS DUP13 PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x2720 JUMPI JUMPDEST DUP1 PUSH2 0x25E1 JUMP JUMPDEST DUP2 PUSH2 0x272A SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x271A JUMP JUMPDEST SWAP2 SWAP8 DUP5 SWAP6 SWAP7 POP PUSH2 0x275B SWAP1 PUSH2 0x274E DUP11 PUSH2 0x2761 SWAP5 SWAP7 SWAP8 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP1 DUP13 PUSH2 0x8A5 DUP13 DUP12 PUSH2 0x36FA JUMP JUMPDEST SWAP8 PUSH2 0x36CD JUMP JUMPDEST SWAP1 SWAP2 DUP10 SWAP6 SWAP5 SWAP4 SWAP3 PUSH2 0x25D2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP5 SWAP7 POP PUSH2 0x2780 SWAP4 SWAP3 POP ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP4 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 DUP2 DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH2 0x27B9 DUP4 DUP3 SLOAD PUSH2 0x30DC JUMP JUMPDEST SWAP1 SSTORE DUP2 SWAP5 PUSH2 0x27CA JUMPI JUMPDEST POP POP POP PUSH2 0x25E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x288B JUMPI JUMPDEST DUP1 PUSH2 0x27C2 JUMP JUMPDEST DUP2 PUSH2 0x2895 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x2885 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x3236 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3D0 JUMPI PUSH2 0x2998 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F5C JUMP JUMPDEST PUSH2 0x29A0 PUSH2 0x379D JUMP JUMPDEST DUP4 PUSH2 0x29AA DUP4 PUSH2 0x31C3 JUMP JUMPDEST SWAP4 PUSH2 0x29B8 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3153 JUMP JUMPDEST DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0x871 JUMPI DUP1 PUSH1 0x20 SWAP3 DUP7 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x29DB PUSH2 0x354D JUMP JUMPDEST PUSH2 0x29E4 DUP2 PUSH2 0x34BB JUMP JUMPDEST DUP4 SWAP2 DUP4 MLOAD DUP5 ADD PUSH1 0x20 DUP6 DUP3 SUB SLT PUSH2 0x880 JUMPI PUSH2 0x29FD DUP3 PUSH2 0x3540 JUMP JUMPDEST ISZERO PUSH2 0x2C49 JUMPI POP PUSH2 0x2A14 SWAP1 PUSH1 0x20 DUP6 MLOAD DUP7 ADD ADD SWAP1 PUSH2 0x3679 JUMP JUMPDEST SWAP2 POP DUP1 MLOAD DUP3 MLOAD DUP2 SUB PUSH2 0x1200 JUMPI SWAP1 DUP7 SWAP3 SWAP2 DUP4 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND JUMPDEST DUP2 DUP4 SUB PUSH2 0x2BC3 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP2 DUP3 EXTCODESIZE ISZERO PUSH2 0x3CC JUMPI PUSH2 0x2AC5 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2EB2C2D600000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP12 ADDRESS PUSH1 0x4 DUP7 ADD PUSH2 0x3742 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1182 JUMPI PUSH2 0x2BAE JUMPI JUMPDEST POP POP JUMPDEST DUP2 ISZERO PUSH2 0x2B86 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x2B52 JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x265C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x343F JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x2BB8 SWAP2 PUSH2 0x3153 JUMP JUMPDEST PUSH2 0x3CC JUMPI DUP4 CODESIZE PUSH2 0x2AD4 JUMP JUMPDEST SWAP2 SWAP7 PUSH2 0x2C17 PUSH2 0x2C38 SWAP2 DUP10 DUP8 SWAP9 PUSH2 0x2C1C DUP12 DUP10 SWAP11 PUSH2 0x2BEF PUSH2 0x2BE6 DUP7 PUSH2 0x2C3E SWAP12 SWAP14 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP6 DUP7 SWAP3 PUSH2 0x36FA JUMP JUMPDEST MLOAD SWAP7 DUP8 SWAP3 DUP12 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP8 KECCAK256 SLOAD SWAP4 DUP5 SWAP3 DUP3 DUP5 LT ISZERO PUSH2 0x35AA JUMP JUMPDEST PUSH2 0x308D JUMP JUMPDEST SWAP2 DUP8 DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP14 KECCAK256 SSTORE PUSH2 0x30DC JUMP JUMPDEST SWAP7 PUSH2 0x36CD JUMP JUMPDEST SWAP1 SWAP2 DUP9 SWAP5 SWAP4 SWAP3 PUSH2 0x2A3E JUMP JUMPDEST PUSH2 0x2C58 SWAP3 SWAP4 POP PUSH1 0x20 ADD SWAP1 PUSH2 0x3588 JUMP JUMPDEST SWAP3 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP3 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH2 0x2C9D DUP5 PUSH1 0x40 DUP9 KECCAK256 SLOAD PUSH2 0x2C17 DUP2 DUP4 DUP8 DUP10 DUP3 DUP5 LT ISZERO PUSH2 0x35AA JUMP JUMPDEST SWAP1 DUP7 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 DUP3 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP5 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x871 JUMPI PUSH1 0x40 MLOAD PUSH32 0xF242432A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x64 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0xA4 DUP5 ADD MSTORE DUP3 SWAP1 PUSH1 0xC4 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x2D8A JUMPI PUSH2 0x2D76 JUMPI JUMPDEST POP PUSH2 0x2AD7 JUMP JUMPDEST DUP5 PUSH2 0x2D83 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x3153 JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x2D70 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DE7 PUSH2 0x2F11 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x221A DUP4 PUSH2 0x3390 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3D2 JUMPI PUSH1 0x20 PUSH2 0x1B93 PUSH2 0x2F0C PUSH2 0x2F11 JUMP JUMPDEST PUSH2 0x30E9 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F34 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP2 PUSH2 0x3043 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP2 PUSH2 0x3066 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F34 JUMPI PUSH2 0x3089 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FC9 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x309A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x309A JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x309A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3150 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x313B PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3135 PUSH2 0x3120 PUSH2 0x3236 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x308D JUMP JUMPDEST SWAP1 PUSH2 0x30C9 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x30DC JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3194 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3194 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x3207 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x3275 JUMPI PUSH2 0x3150 SWAP1 PUSH2 0x326F PUSH1 0x4 SLOAD SWAP2 PUSH2 0x326A PUSH2 0x3261 PUSH2 0x3258 PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x308D JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x30C9 JUMP JUMPDEST PUSH2 0x31FD JUMP JUMPDEST SWAP1 PUSH2 0x30DC JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x32D4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x3150 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x333D JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x332D JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3389 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x332A JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3439 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3433 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3456 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x334D JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x346B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F34 JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x34C3 PUSH2 0x3236 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x3535 JUMPI JUMPDEST PUSH2 0x3525 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x34F9 JUMPI POP POP JUMP JUMPDEST PUSH2 0x3502 SWAP1 PUSH2 0x30E9 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x352D PUSH2 0x32DB JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x34D8 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x34D3 JUMP JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2F34 JUMPI JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x355E JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x60 SWAP2 SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x359C DUP2 PUSH2 0x3540 JUMP JUMPDEST SWAP2 PUSH1 0x40 PUSH1 0x20 DUP4 ADD MLOAD SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 SWAP4 ISZERO PUSH2 0x35BA JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x84 SWAP5 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x86301C8200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x2F34 JUMPI DUP2 MLOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3194 JUMPI DUP3 PUSH1 0x5 SHL SWAP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x3645 PUSH1 0x20 DUP5 ADD DUP7 PUSH2 0x3153 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP3 DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x2F34 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3669 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x365C JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x368D DUP4 PUSH2 0x3540 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI DUP4 PUSH2 0x36AE SWAP2 DUP4 ADD PUSH2 0x3611 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F34 JUMPI PUSH2 0x3150 SWAP3 ADD PUSH2 0x3611 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x309A JUMPI PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x346B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x372C JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x371F JUMP JUMPDEST SWAP3 PUSH2 0x377E SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x378C SWAP5 DUP2 PUSH1 0x20 SWAP9 SWAP6 AND DUP8 MSTORE AND DUP7 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD SWAP1 PUSH2 0x370E JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x370E JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH1 0x0 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x38DD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x38E2 JUMPI JUMPDEST PUSH2 0x38DD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3825 JUMPI JUMPDEST POP PUSH2 0x3150 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3897 JUMPI JUMPDEST POP CODESIZE PUSH2 0x381B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x38C9 JUMPI JUMPDEST DUP2 PUSH2 0x38B2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x38C3 SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x3890 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x38A5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x37E4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3A3B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3A43 JUMPI JUMPDEST PUSH2 0x3A3B JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x397F JUMPI JUMPDEST POP PUSH2 0x394E JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2F34 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3A01 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3942 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3A33 JUMPI JUMPDEST DUP2 PUSH2 0x3A1C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3153 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2F34 JUMPI PUSH2 0x3A2D SWAP1 PUSH2 0x3540 JUMP JUMPDEST CODESIZE PUSH2 0x39FA JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3A0F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3933 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x38D1 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x3ACF JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x3A8B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x3A84 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF PUSH18 0x4F7DD4D0CA0A2EC4A4114FC00AB31F61A829 ADDRESS 0xB4 POP 0xE 0xAA DUP8 0x25 0xC 0xB0 DUP15 DATALOADN 0xEE64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"632:1546:106:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;632:1546:106;;16306:41:193;;;:::i;:::-;632:1546:106;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1834:9;1845:10;;;;;;632:1546:106;;;1857:3:192;1876:11;;;;;:::i;:::-;632:1546:106;;;;;;;;;1898:10:192;;;;;:::i;:::-;632:1546:106;1375:21:9;;;:30;1371:125;;1548:33;;;;;;;;632:1546:106;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;632:1546:106;;1834:9:192;;1591:58:9;632:1546:106;;;;5690:21:9;:17;;5815:105;632:1546:106;5815:105:9;;;;;5686:301;5957:19;;632:1546:106;5957:19:9;;;632:1546:106;;;;;1371:125:9;632:1546:106;1455:21:9;;;1428:57;;;632:1546:106;;;;1428:57:9;632:1546:106;;;;1756:63:192;632:1546:106;1793:26:192;;;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;632:1546:106;;-1:-1:-1;4538:25:42;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;;:::i;:::-;632:1546:106;;;;;;;;3205:23:42;;;3201:60;;632:1546:106;;;3275:25:42;;;;3271:146;;632:1546:106;;;3271:146:42;632:1546:106;;;;;;;;3361:45:42;;;;3271:146;;;632:1546:106;;;3201:60:42;3237:24;;;632:1546:106;;;3237:24:42;;632:1546:106;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1827:4:196;;632:1546:106;1827:4:196;632:1546:106;;1807:25:196;1803:281;;632:1546:106;;;;;;;;1803:281:196;632:1546:106;1874:13:196;632:1546:106;1852:10:196;;;:36;1848:63;;632:1546:106;;2042:29:196;;632:1546:106;2042:29:196;;632:1546:106;;;;;;;;;;;;;;2042:29:196;;;632:1546:106;2042:29:196;;:::i;:::-;632:1546:106;;2013:59:196;632:1546:106;2013:59:196;;632:1546:106;;;;2013:59:196;632:1546:106;;;;;;;;;;;;;;:::i;:::-;2013:59:196;2042:29;2013:59;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;4224:19:196;632:1546:106;;;4300:36:196;;;632:1546:106;4300:36:196;632:1546:106;4300:36:196;;632:1546:106;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4359:24:196;;632:1546:106;;;;;;;;;;:::i;:::-;;;;;;;;4471:46:196;632:1546:106;;4471:46:196;;;;:::i;:::-;632:1546:106;;;;;;;;4579:23:196;;632:1546:106;;4650:9:196;632:1546:106;;;;4661:10:196;;;;;;4892:131;;;;;4645:234;4393:978;;;;7650:16:193;;632:1546:106;;;;7779:38:193;632:1546:106;7699:26:193;632:1546:106;;;;7699:26:193;:::i;:::-;632:1546:106;;;;;;;7735:6:193;632:1546:106;;;;;7735:29:193;632:1546:106;;;7735:29:193;:::i;:::-;632:1546:106;;7779:38:193;632:1546:106;;7779:38:193;;;;;:::i;:::-;;;;632:1546:106;1803:281:196;;;;632:1546:106;;;;;;;4892:131:196;4932:76;;;;;632:1546:106;;;4932:76:196;632:1546:106;;;;4932:76:196;;;;;;632:1546:106;4932:76:196;;1827:4;4932:76;632:1546:106;4932:76:196;;;:::i;:::-;;;;;;;;;;;;;;4892:131;;;;4932:76;;;;;:::i;:::-;632:1546:106;;4932:76:196;;;;632:1546:106;;;;4932:76:196;632:1546:106;;;;;;;;;4932:76:196;632:1546:106;;;4673:3:196;4709:6;;;4826:38;4709:6;4673:3;4709:6;;4750:10;4709:6;;;;:::i;:::-;632:1546:106;4750:10:196;;;:::i;:::-;632:1546:106;;;;;4778:8:196;632:1546:106;;;;;;;;;;;;4778:30:196;632:1546:106;;;4778:30:196;:::i;:::-;632:1546:106;;4826:38:196;:::i;:::-;4673:3;;:::i;:::-;4650:9;;;;632:1546:106;;;;;;;4393:978:196;5086:42;4359:24;;;;632:1546:106;4359:24:196;;;5086:42;;:::i;:::-;632:1546:106;;;;;;;;5142:8:196;632:1546:106;;;;;;;;;;;;;5142:30:196;632:1546:106;;;5142:30:196;:::i;:::-;632:1546:106;;5186:37:196;5237:124;;;4393:978;;;;;;5237:124;5277:69;;;;;632:1546:106;;;5277:69:196;;632:1546:106;;;;5277:69:196;;632:1546:106;1827:4:196;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;;;5277:69:196;;;;;;;;;;;5237:124;;;;5277:69;;;;;:::i;:::-;632:1546:106;;5277:69:196;;;;632:1546:106;;;;;;;;1848:63:196;632:1546:106;1897:14:196;;;;;632:1546:106;;;;;;;;;;;;;2158:30:193;632:1546:106;;;;;;;;;;;;;;;;;;;;;;1971:39:193;632:1546:106;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;632:1546:106;;;;;;;4503:26:42;;;4499:64;;4464:19:41;632:1546:106;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;500:10:59;632:1546:106;-1:-1:-1;632:1546:106;500:10:59;;1880:140:41;;632:1546:106;;;1880:140:41;1973:36;632:1546:106;1973:36:41;632:1546:106;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;-1:-1:-1;632:1546:106;;;;;;;;;1973:36:41;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;;;1880:140;;;;632:1546:106;;;;;;;;;;;;;;;;2049:26:193;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;659:80:196;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;632:1546:106;;1857:1:13;632:1546:106;;;;10393:466:193;10453:14;10444:23;;;;:::i;:::-;632:1546:106;;;;;2396:12:195;632:1546:106;;;;;1745:53:8;;;632:1546:106;;;;1745:53:8;;;632:1546:106;;;;;;;;;;;;;;;1745:53:8;;;;;632:1546:106;;1745:53:8;:::i;:::-;2366:12:195;1745:53:8;:::i;:::-;632:1546:106;;;-1:-1:-1;;632:1546:106;;;;10802:46:193;632:1546:106;;;;;;;;10732:7:193;632:1546:106;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10802:46:193;;;10393:466;;;;;;632:1546:106;1745:53:8;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;632:1546:106;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;;632:1546:106;;;16306:41:193;;:::i;:::-;632:1546:106;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;632:1546:106;3852:94:192;;3961:9;3972:10;;;;;;632:1546:106;;;3984:3:192;632:1546:106;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;632:1546:106;;;;4058:76:192;;4108:25;632:1546:106;4058:76:192;;632:1546:106;4058:76:192;;;;;;;;;;;;;;;;3984:3;4057:77;;4053:173;;4239:12;;632:1546:106;4239:12:192;;;;;;:::i;:::-;632:1546:106;4284:11:192;;;;;;:::i;:::-;4297;;;;;:::i;:::-;632:1546:106;4239:70:192;;;;;632:1546:106;;;4239:70:192;;4277:4;632:1546:106;4239:70:192;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;4239:70:192;;;;;;;;3984:3;;;632:1546:106;;3961:9:192;;4239:70;;;;;:::i;:::-;632:1546:106;;4239:70:192;;;;;632:1546:106;;;;;;;;;4053:173:192;4161:50;;;632:1546:106;;4058:76:192;4161:50;;4058:76;;;;;;;;;;;;;;;;;:::i;:::-;;;632:1546:106;;;;;;;:::i;:::-;4058:76:192;;;632:1546:106;;;;4058:76:192;;;-1:-1:-1;4058:76:192;;;632:1546:106;;;;;;;;;3852:94:192;632:1546:106;3920:26:192;;;;;3856:55;3886:25;;;;;3856:55;;632:1546:106;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2907:4:196;;632:1546:106;2907:4:196;632:1546:106;;2887:25:196;2883:282;;632:1546:106;;;;;;;;2883:282:196;632:1546:106;2954:13:196;632:1546:106;2932:10:196;;;:36;2928:63;;3121:31;632:1546:106;;;;;;;3121:31:196;;;3061:4;632:1546:106;3121:31:196;;632:1546:106;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;3121:31:196;632:1546:106;3121:31:196;;;;;;:::i;:::-;632:1546:106;;3092:61:196;632:1546:106;3092:61:196;;632:1546:106;;;;3092:61:196;632:1546:106;;;;;;;;;;;;;;:::i;3092:61:196:-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;4224:19:196;632:1546:106;;;4300:36:196;;;632:1546:106;4300:36:196;632:1546:106;4300:36:196;;632:1546:106;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4359:24:196;;632:1546:106;;;;;;;;;;:::i;:::-;;;;;;;;4471:46:196;632:1546:106;;4471:46:196;;;;:::i;:::-;632:1546:106;;;;;;;;4579:23:196;;632:1546:106;;4650:9:196;632:1546:106;;;;4661:10:196;;;;;;4892:131;;;;;4645:234;4393:978;;;;7650:16:193;;632:1546:106;;;;7779:38:193;632:1546:106;7699:26:193;3061:4:196;632:1546:106;;;7699:26:193;:::i;:::-;632:1546:106;;;;;;;7735:6:193;632:1546:106;;;;;7735:29:193;632:1546:106;;;7735:29:193;:::i;:::-;632:1546:106;;7779:38:193;632:1546:106;;7779:38:193;;;;;:::i;:::-;;;;632:1546:106;2883:282:196;;;;;;;;4892:131;4932:76;;;;;632:1546:106;;;4932:76:196;632:1546:106;;;;4932:76:196;;;;;;632:1546:106;4932:76:196;;2907:4;4932:76;632:1546:106;4932:76:196;;;:::i;:::-;;;;;;;;;;;;;;4892:131;;;;4932:76;;;;;:::i;:::-;632:1546:106;;4932:76:196;;;;4673:3;4709:6;;;4826:38;4709:6;4673:3;4709:6;;4750:10;4709:6;;;;:::i;4673:3::-;4650:9;;;;4393:978;5086:42;4359:24;;;;632:1546:106;4359:24:196;;;5086:42;;:::i;:::-;632:1546:106;;;;;;;;5142:8:196;632:1546:106;;;;;;;;;;;;;5142:30:196;632:1546:106;;;5142:30:196;:::i;:::-;632:1546:106;;5186:37:196;5237:124;;;4393:978;;;;;;5237:124;5277:69;;;;;632:1546:106;;;5277:69:196;;632:1546:106;;;;5277:69:196;;632:1546:106;2907:4:196;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;;;5277:69:196;;;;;;;;;;;5237:124;;;;5277:69;;;;;:::i;:::-;632:1546:106;;5277:69:196;;;;2928:63;632:1546:106;2977:14:196;;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:36:195;632:1546:106;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;632:1546:106;;;;;;;;2800:22:41;632:1546:106;-1:-1:-1;632:1546:106;;;;500:10:59;632:1546:106;-1:-1:-1;632:1546:106;500:10:59;;632:1546:106;;;;;;;;;;;;;;;;;;;;912:80:42;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;632:1546:106;16306:41:193;;:::i;:::-;632:1546:106;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;500:10:59;632:1546:106;-1:-1:-1;632:1546:106;500:10:59;;3741:25:41;3737:66;;632:1546:106;;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;632:1546:106;;2455:33:41;632:1546:106;;3737:66:41;3775:28;632:1546:106;3775:28:41;632:1546:106;3775:28:41;;;;632:1546:106;;;;;3775:28:41;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;632:1546:106;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2081:25:193;632:1546:106;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;4464:19:41;632:1546:106;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;500:10:59;632:1546:106;-1:-1:-1;632:1546:106;500:10:59;;3741:25:41;3737:66;;12172:11:193;;632:1546:106;;12225:13:193;;632:1546:106;;12321:14:193;632:1546:106;;;2570:213:20;;;;;632:1546:106;;;34863:71:21;;632:1546:106;;4365:21:193;;:::i;:::-;632:1546:106;;4419:15:193;632:1546:106;4400:15:193;:34;;;:54;;;632:1546:106;4396:195:193;;632:1546:106;4419:15:193;632:1546:106;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;632:1546:106;12664:22:193;;632:1546:106;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;632:1546:106;4419:15:193;632:1546:106;12551:1311:193;4400:15;13871:29;632:1546:106;;;;;;;;;;;13962:39:193;;632:1546:106;;12551:1311:193;632:1546:106;12795:10:193;632:1546:106;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;632:1546:106;;1859:6:20;;;;;;632:1546:106;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;632:1546:106;4400:15:193;13357:22;13286:40;632:1546:106;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;632:1546:106;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;632:1546:106;;;;;;;;13962:39:193;632:1546:106;12795:10:193;632:1546:106;4419:15:193;632:1546:106;12551:1311:193;;632:1546:106;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;632:1546:106;4396:195:193;;4400:54;632:1546:106;4438:11:193;632:1546:106;4438:16:193;;4400:54;;632:1546:106;;;;;;;;;;;;;;;;;;;;;3737:66:41;632:1546:106;3775:28:41;632:1546:106;3775:28:41;;;;632:1546:106;;;;;;3775:28:41;632:1546:106;;;;;;;;:::i;:::-;5148:19:42;;;;;;;912:80;632:1546:106;;16306:41:193;;;:::i;:::-;632:1546:106;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;632:1546:106;2776:90:192;;2881:9;2892:10;;;;;;632:1546:106;;;2904:3:192;2923:9;;;;;:::i;:::-;632:1546:106;;;;;;;;;1328:43:8;632:1546:106;2946:11:192;;;;;;;:::i;:::-;2959:10;;;;;;:::i;:::-;632:1546:106;;;;1328:43:8;632:1546:106;1328:43:8;;;;632:1546:106;1328:43:8;;;632:1546:106;1328:43:8;632:1546:106;;;1328:43:8;;;;;;;:::i;:::-;;:::i;:::-;632:1546:106;2881:9:192;;2780:51;2807:24;;;;;2780:51;;632:1546:106;;;;;;;;;;;;;;:::i;:::-;;;16306:41:193;;;:::i;:::-;632:1546:106;;;;;4503:26:42;;;4499:64;;632:1546:106;;1638:12:195;632:1546:106;;;;;;;1621:29:195;;1617:137;;632:1546:106;;;1617:137:195;632:1546:106;;;;1638:12:195;632:1546:106;1713:30:195;;;;1617:137;;632:1546:106;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;697:27:195;632:1546:106;;;;;;;;;;;;;;;;;;;;16541:39:193;;:::i;:::-;632:1546:106;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;632:1546:106;;;;;;;4503:26:42;;;4499:64;;4464:19:41;632:1546:106;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;500:10:59;632:1546:106;-1:-1:-1;632:1546:106;500:10:59;;1254:25:41;1250:140;;632:1546:106;;;1250:140:41;1343:36;632:1546:106;1343:36:41;632:1546:106;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;1343:36:41;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;;:::i;:::-;632:1546:106;;3636:39:196;;;632:1546:106;;3636:39:196;;632:1546:106;3601:4:196;632:1546:106;;;;;;;;;;;;;;:::i;3636:39:196:-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;4224:19:196;632:1546:106;;;4300:36:196;;;632:1546:106;4300:36:196;632:1546:106;4300:36:196;;632:1546:106;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4359:24:196;;632:1546:106;;;;;;;;;;:::i;:::-;;;;;;;;;4471:46:196;632:1546:106;;4471:46:196;;;;:::i;:::-;632:1546:106;;;;;;;;4579:23:196;;632:1546:106;;4650:9:196;;;;;;632:1546:106;;;;4661:10:196;;;;;;4892:131;;;;;4645:234;4393:978;;;;7650:16:193;;632:1546:106;;;;7779:38:193;632:1546:106;7699:26:193;632:1546:106;3601:4:196;632:1546:106;7699:26:193;:::i;:::-;3601:4:196;632:1546:106;;;;;;7735:6:193;632:1546:106;;;;;7735:29:193;632:1546:106;;;7735:29:193;:::i;:::-;632:1546:106;;7779:38:193;632:1546:106;;7779:38:193;;;;;:::i;:::-;;;;3601:4:196;632:1546:106;;;;;;;;;;;4892:131:196;632:1546:106;4932:13:196;632:1546:106;4932:76:196;;;;;;;632:1546:106;;;;;;4932:76:196;;;;;;632:1546:106;4932:76:196;;4984:4;4932:76;632:1546:106;4932:76:196;;;:::i;:::-;;;;;;;;;;;4892:131;;;;4932:76;;;;;:::i;:::-;632:1546:106;;4932:76:196;;;;4673:3;4709:6;;;;;;4826:38;4709:6;;;4673:3;4709:6;;;;:::i;:::-;632:1546:106;4750:10:196;;;;;;:::i;4826:38::-;4673:3;;:::i;:::-;4650:9;;;;;;;;;4393:978;632:1546:106;4359:24:196;;;;5086:42;4359:24;;;;5086:42;;:::i;:::-;632:1546:106;;;;;;;5142:8:196;632:1546:106;;;;;;;;;;;;;5142:30:196;632:1546:106;;;5142:30:196;:::i;:::-;632:1546:106;;5186:37:196;5237:124;;;4393:978;;;;;;5237:124;632:1546:106;5277:13:196;632:1546:106;5277:69:196;;;;;;632:1546:106;;;5277:69:196;;632:1546:106;;;;5277:69:196;;632:1546:106;5324:4:196;632:1546:106;;;;;;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;;;;5277:69:196;;;;;;;;5237:124;;;;5277:69;;;;;:::i;:::-;632:1546:106;;5277:69:196;;;;632:1546:106;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;941:19:75;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;632:1546:106;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2466:103:13;;:::i;:::-;9425:6:193;;;:::i;:::-;5988:19:196;632:1546:106;;;6032:32:196;;632:1546:106;;;;;;;;;;:::i;:::-;;;;;6152:54:196;632:1546:106;;;;6152:54:196;;;;;:::i;:::-;632:1546:106;;;;;;6268:23:196;;632:1546:106;;6339:9:196;;;;;632:1546:106;;;;6350:10:196;;;;;;6737:13;;;632:1546:106;6737:13:196;632:1546:106;6737:76:196;;;;;;;632:1546:106;;;;;;6737:76:196;;;;;;632:1546:106;6737:76:196;;6781:4;;632:1546:106;6737:76:196;;;:::i;:::-;;;;;;;;;;;6334:390;6074:1190;;;9520:16:193;;632:1546:106;;;;;;;;9596:6:193;632:1546:106;;;;;;9628:28:193;;;632:1546:106;;;;9889:44:193;632:1546:106;;;;;9596:6:193;632:1546:106;;;;;;;;9838:26:193;632:1546:106;;9838:26:193;632:1546:106;9889:44:193;632:1546:106;;9889:44:193;;;;;:::i;632:1546:106:-;;;;;;;;;;;;;;;;;;;;;;;6737:76:196;;;;;:::i;:::-;632:1546:106;;6737:76:196;;;;6362:3;6398:6;;6523:73;6671:38;6398:6;;;;6637:16;6398:6;;;6439:10;6398:6;;6362:3;6398:6;;;:::i;:::-;632:1546:106;6439:10:196;;;;:::i;:::-;632:1546:106;;;;;;;6485:8:196;632:1546:106;;;;;;;;;;;;;;;6531:17:196;;;;;;;6523:73;:::i;:::-;6637:16;:::i;:::-;632:1546:106;;;;6485:8:196;632:1546:106;;;;;;;;;;;;;6671:38:196;:::i;:::-;6362:3;;:::i;:::-;6339:9;;;;;;;;6074:1190;6877:50;6032:32;;;632:1546:106;6032:32:196;6877:50;;:::i;:::-;632:1546:106;;;;;;;;;6959:8:196;632:1546:106;;;;;;;;;;7103:16:196;632:1546:106;;;;;6993:73:196;7001:17;;;;;;;;6993:73;:::i;7103:16::-;632:1546:106;;;6959:8:196;632:1546:106;;;;;;;;;;;;;;7133:37:196;;632:1546:106;7184:13:196;632:1546:106;7184:69:196;;;;;632:1546:106;;;7184:69:196;;7223:4;632:1546:106;7184:69:196;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;7184:69:196;;;;;;;;6074:1190;;;;7184:69;;;;;;;;:::i;:::-;;;;;;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;613:39:196;632:1546:106;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;;;:::i;632:1546:106:-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;632:1546:106;6009:97:193;5929:184;632:1546:106;;-1:-1:-1;632:1546:106;6010:6:193;632:1546:106;;6010:76:193;632:1546:106;-1:-1:-1;632:1546:106;;6029:56:193;:21;;:::i;:::-;632:1546:106;-1:-1:-1;632:1546:106;6053:23:193;632:1546:106;;;-1:-1:-1;632:1546:106;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;632:1546:106;-1:-1:-1;632:1546:106;6090:7:193;632:1546:106;;;-1:-1:-1;632:1546:106;;6009:97:193;;:::i;:::-;5929:184;:::o;632:1546:106:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;632:1546:106;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;5307:338:193;5407:11;632:1546:106;5432:23:193;;5428:86;;5530:108;632:1546:106;5559:78:193;5530:25;632:1546:106;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;632:1546:106;5561:40:193;;:::i;:::-;5605:10;632:1546:106;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;632:1546:106;5478:25:193;632:1546:106;5471:32:193;:::o;1002:301:75:-;632:1546:106;1146:19:75;632:1546:106;1146:53:75;;;1142:96;;632:1546:106;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;632:1546:106;1215:12:75;:::o;4919:231:193:-;5028:15;632:1546:106;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;632:1546:106:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;632:1546:106;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;1359:340:59:-;632:1546:106;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;632:1546:106;500:10:59;632:1546:106;500:10:59;;;;632:1546:106;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;632:1546:106;1528:12:59;:::o;632:1546:106:-;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;632:1546:106;4419:15:193;632:1546:106;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;632:1546:106;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;632:1546:106;-1:-1:-1;632:1546:106;4641:7:193;632:1546:106;;;-1:-1:-1;632:1546:106;;4337:49:193;632:1546:106;;-1:-1:-1;632:1546:106;4689:23:193;632:1546:106;;;-1:-1:-1;632:1546:106;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;632:1546:106;4396:195:193;;4400:54;632:1546:106;4438:11:193;632:1546:106;4438:16:193;;4400:54;;632:1546:106;;;;;;;;;;:::o;2575:307:13:-;1899:1;2702:7;632:1546:106;2702:18:13;2698:86;;1899:1;2702:7;632:1546:106;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;632:1546:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;632:1546:106;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;907:917:76:-;632:1546:106;1029:19:76;632:1546:106;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;632:1546:106;;;1676:74:76;;632:1546:106;;;1676:74:76;;;632:1546:106;1327:10:76;632:1546:106;;;;1744:4:76;632:1546:106;;;;;-1:-1:-1;1676:74:76;;632:1546:106;;;;;;1676:74:76;;;;;;;632:1546:106;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;;;:::i;:::-;;;632:1546:106;;;;;;;:::i;:::-;1676:74:76;;;;;;-1:-1:-1;1676:74:76;;;632:1546:106;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;632:1546:106;2065:19:76;632:1546:106;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;632:1546:106;720:8:80;632:1546:106;720:8:80;;632:1546:106;;;;2115:1:76;2802:32;;:::o;2624:153::-;632:1546:106;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;632:1546:106;2361:10:76;632:1546:106;;;;2771:4:76;632:1546:106;;;;;-1:-1:-1;2682:95:76;;632:1546:106;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;;;:::i;:::-;;;632:1546:106;;;;;;;:::i;:::-;2682:95:76;;;;;;-1:-1:-1;2682:95:76;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;8370:720:8;;-1:-1:-1;8507:421:8;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:8;;8942:15;;632:1546:106;;;;8960:26:8;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;632:1546:106;9033:40:8;;-1:-1:-1;9033:40:8;632:1546:106;9033:40:8;632:1546:106;;-1:-1:-1;9033:40:8;8942:68;9009:1;8994:16;;8942:68;"},"gasEstimates":{"creation":{"codeDepositCost":"3023600","executionCost":"infinite","totalCost":"infinite"},"external":{"REWARDER_ROLE()":"545","REWARD_TOKEN()":"infinite","SCALING_FACTOR()":"infinite","STAKING_TOKEN()":"infinite","__msgData()":"infinite","addReward(uint256,uint256)":"infinite","balances(address,uint256)":"3083","claim(bytes)":"infinite","distributionEnd()":"2978","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2922","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2662","lastUpdated()":"2912","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","owner()":"2700","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardHolder()":"2478","rewardPerStakePoint()":"11162","rewardPerStakePointPaid(address)":"2973","rewardPerStakePointStored()":"2780","rewardRate()":"2582","rewards(address)":"2445","setRewardHolder(address)":"infinite","stake(bytes)":"infinite","staked(address)":"2863","supportsInterface(bytes4)":"2463","totalStaked()":"2626","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_msgData()":"infinite","_msgSender()":"infinite","_tokenValue(uint256,uint256)":"infinite"}},"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","REWARD_TOKEN()":"99248ea7","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","__msgData()":"31e66e1e","addReward(uint256,uint256)":"75c93bb9","balances(address,uint256)":"cbf1304d","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardHolder()":"569c93d2","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","setRewardHolder(address)":"6806cc93","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"stakingToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"NotEnoughBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"}],\"name\":\"RewardHolderSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"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\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardHolder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardHolder_\",\"type\":\"address\"}],\"name\":\"setRewardHolder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\",\"params\":{\"amounts\":\"The amounts of tokens received.\",\"from\":\"The address of the sender.\",\"ids\":\"The ids of the tokens received.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\",\"params\":{\"amount\":\"The amount of tokens received.\",\"from\":\"The address of the sender.\",\"id\":\"The id of the token received.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"setRewardHolder(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.\",\"params\":{\"rewardHolder_\":\"The address of the reward holder.\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"setRewardHolder(address)\":{\"notice\":\"Sets the reward holder address.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol\":\"ERC1155StakingERC20RewardsLinearPoolMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {ERC1155StakingLinearPool} from \\\"./../../../staking/linear/stake/ERC1155StakingLinearPool.sol\\\";\\nimport {LinearPool_ERC20Rewards} from \\\"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC1155} from \\\"./../../../token/ERC1155/interfaces/IERC1155.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract ERC1155StakingERC20RewardsLinearPoolMock is ERC1155StakingLinearPool, LinearPool_ERC20Rewards {\\n    constructor(\\n        IERC1155 stakingToken,\\n        IERC20 rewardToken,\\n        address rewardHolder,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC1155StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\\n\\n    function _computeClaim(\\n        address staker,\\n        uint256 claimable,\\n        bytes calldata claimData\\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\\n    }\\n\\n    function _tokenValue(uint256, uint256 amount) internal view virtual override returns (uint256) {\\n        return amount;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\\n        return LinearPool._msgSender();\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\\n        return LinearPool._msgData();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x06614ad74ef19cd8aa4f984c29120bd53ceaa293f18d6baa8edc9032694990da\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/// @title LinearPool_ERC20Rewards\\n/// @notice A linear pool that allows for ERC20 rewards distribution.\\n// solhint-disable-next-line contract-name-capwords\\nabstract contract LinearPool_ERC20Rewards is ContractOwnership {\\n    using SafeERC20 for IERC20;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    IERC20 public immutable REWARD_TOKEN;\\n\\n    address public rewardHolder;\\n\\n    event RewardHolderSet(address indexed rewardHolder);\\n\\n    /// @dev Emits a {RewardHolderSet} event with the initial reward holder address.\\n    /// @param rewardToken The ERC20 token used for rewards.\\n    /// @param rewardHolder_ The address that holds the rewards.\\n    constructor(IERC20 rewardToken, address rewardHolder_) {\\n        REWARD_TOKEN = rewardToken;\\n        rewardHolder = rewardHolder_;\\n        emit RewardHolderSet(rewardHolder_);\\n    }\\n\\n    /// @notice Sets the reward holder address.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\\n    /// @param rewardHolder_ The address of the reward holder.\\n    function setRewardHolder(address rewardHolder_) external {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        if (rewardHolder_ != rewardHolder) {\\n            rewardHolder = rewardHolder_;\\n            emit RewardHolderSet(rewardHolder_);\\n        }\\n    }\\n\\n    /// @notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\\n    /// @param staker The address of the staker.\\n    /// @param claimable The amount of REWARD_TOKEN to be transferred.\\n    /// @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\\n    /// @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0.\\n    function _computeClaim(address staker, uint256 claimable, bytes calldata) internal virtual returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 0;\\n        REWARD_TOKEN.safeTransferFrom(rewardHolder, staker, claimable);\\n    }\\n\\n    /// @notice Computes the reward for a staker.\\n    /// @dev This function is empty since the rewards do not need to be transferred to this contract.\\n    function _computeAddReward(address, uint256) internal virtual {}\\n}\\n\",\"keccak256\":\"0x0c8dc711b3c8cb7f9ea2a1e8f6f956c821b0d7b56fe7a6839b5dfe3874c436ad\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC1155TokenReceiver} from \\\"./../../../token/ERC1155/ERC1155TokenReceiver.sol\\\";\\nimport {IERC1155} from \\\"./../../../token/ERC1155/interfaces/IERC1155.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\n\\n/// @title ERC1155StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC1155 tokens.\\nabstract contract ERC1155StakingLinearPool is LinearPool, ERC1155TokenReceiver {\\n    IERC1155 public immutable STAKING_TOKEN;\\n\\n    mapping(address staker => mapping(uint256 id => uint256 amount)) public balances;\\n\\n    error InvalidToken();\\n    error NotEnoughBalance(address staker, uint256 id, uint256 amount, uint256 balance);\\n\\n    constructor(\\n        IERC1155 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\\n    /// @param operator The address of the operator.\\n    /// @param from The address of the sender.\\n    /// @param id The id of the token received.\\n    /// @param amount The amount of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC1155Received(\\n        address operator,\\n        address from,\\n        uint256 id,\\n        uint256 amount,\\n        bytes calldata\\n    ) external virtual override returns (bytes4) {\\n        if (operator != address(this)) {\\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n            bool requiresTransfer = false;\\n            bool batch = false;\\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, id, amount)));\\n        }\\n        return this.onERC1155Received.selector;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\\n    /// @param operator The address of the operator.\\n    /// @param from The address of the sender.\\n    /// @param ids The ids of the tokens received.\\n    /// @param amounts The amounts of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC1155BatchReceived(\\n        address operator,\\n        address from,\\n        uint256[] calldata ids,\\n        uint256[] calldata amounts,\\n        bytes calldata\\n    ) external virtual override returns (bytes4) {\\n        if (operator != address(this)) {\\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n            bool requiresTransfer = false;\\n            bool batch = true;\\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, ids, amounts)));\\n        }\\n        return this.onERC1155BatchReceived.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        bool batch = abi.decode(data, (bool));\\n        if (batch) {\\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(data, (bool, uint256[], uint256[]));\\n            uint256 count = ids.length;\\n            require(count == amounts.length, InconsistentArrayLengths());\\n            for (uint256 i; i != count; ++i) {\\n                uint256 id = ids[i];\\n                uint256 amount = amounts[i];\\n                balances[staker][id] += amount;\\n                stakePoints += _tokenValue(id, amount);\\n            }\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.safeBatchTransferFrom(staker, address(this), ids, amounts, \\\"\\\");\\n            }\\n        } else {\\n            (, uint256 id, uint256 amount) = abi.decode(data, (bool, uint256, uint256));\\n            balances[staker][id] += amount;\\n            stakePoints = _tokenValue(id, amount);\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.safeTransferFrom(staker, address(this), id, amount, \\\"\\\");\\n            }\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\\n    /// @dev Reverts with {NotEnoughBalance} if the staker does not have enough balance for the given id and amount.\\n    /// @param withdrawData The data to be used for withdrawing, encoded as\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        bool batch = abi.decode(withdrawData, (bool));\\n        if (batch) {\\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(withdrawData, (bool, uint256[], uint256[]));\\n            uint256 count = ids.length;\\n            require(count == amounts.length, InconsistentArrayLengths());\\n            for (uint256 i; i != count; ++i) {\\n                uint256 id = ids[i];\\n                uint256 amount = amounts[i];\\n                uint256 balance = balances[staker][id];\\n                require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\\n                balances[staker][id] = balance - amount;\\n                stakePoints += _tokenValue(id, amount);\\n            }\\n            STAKING_TOKEN.safeBatchTransferFrom(address(this), staker, ids, amounts, \\\"\\\");\\n        } else {\\n            (, uint256 id, uint256 amount) = abi.decode(withdrawData, (bool, uint256, uint256));\\n            uint256 balance = balances[staker][id];\\n            require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\\n            balances[staker][id] = balance - amount;\\n            stakePoints = _tokenValue(id, amount);\\n            STAKING_TOKEN.safeTransferFrom(address(this), staker, id, amount, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Computes the stake points for a given token id and amount.\\n    /// @param id The id of the token.\\n    /// @param amount The amount of the token.\\n    /// @return stakePoints The computed stake points for the given token id and amount.\\n    function _tokenValue(uint256 id, uint256 amount) internal view virtual returns (uint256 stakePoints);\\n}\\n\",\"keccak256\":\"0xf1d03d4b540e3a1b52254d09319df6c2ba49aab7c581fcfd3dfa3244d580f604\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155TokenReceiver} from \\\"./interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, Token Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155TokenReceiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xaa801a5fe8512813bf7bfa2de627c8649e26ac732b0588604e26a0e8e9e111cf\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"},{"astId":21203,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"balances","offset":0,"slot":"9","type":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))"},{"astId":21081,"contract":"contracts/mocks/staking/linear/ERC1155StakingERC20RewardsLinearPoolMock.sol:ERC1155StakingERC20RewardsLinearPoolMock","label":"rewardHolder","offset":0,"slot":"10","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_uint256,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint256 => uint256))","numberOfBytes":"32","value":"t_mapping(t_uint256,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_uint256)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"setRewardHolder(address)":{"notice":"Sets the reward holder address."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol":{"ERC20StakingERC20RewardsLinearPoolMock":{"abi":[{"inputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"address","name":"rewardHolder","type":"address"},{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"recoverable","type":"uint256"}],"name":"InvalidRecoveryAmount","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardHolder","type":"address"}],"name":"RewardHolderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardHolder_","type":"address"}],"name":"setRewardHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC20Received(address,address,uint256,bytes)":{"details":"Reverts  with {InvalidToken} if the sender is not the staking token.","params":{"from":"The address of the sender.","value":"The amount of tokens received."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"setRewardHolder(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.","params":{"rewardHolder_":"The address of the reward holder."}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as (uint256 value)"}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_contract_IERC20_fromMemory":{"entryPoint":624,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"6101003461025557601f612ff338819003918201601f19168301916001600160401b0383118484101761025a5780849260a0946040528339810103126102555761004881610270565b61005460208301610270565b60408301516001600160a01b03811693919291908490036102555760608101519060ff82168092036102555760800151906001600160a01b038216820361025557336101f6575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d916307f5828d60e41b600052826020526040600020600160ff198254161790556001600055608052604d8110156101e557604d81116101cf57600a0a60a052634fc3585960e01b6000526020526040600020600160ff1982541617905560c05260e0528060018060a01b03196009541617600955604051907f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d29600080a2612d6e90816102858239608051818181611fa5015281816126dd015281816129460152612b63015260a051818181610557015281816107ed0152611172015260c051818181611484015281816118dc01528181611ef80152818161207e0152612227015260e05181818161083d0152610cb40152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a361009b565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036102555756fe6080604052600436101561001257600080fd5b6000803560e01c80628cc262146122b357806301ffc9a71461224b5780630479d644146121dc5780630700037d146121795780630968f26414611fc95780632b4c9f1614611f5a5780632c9d0b8014611f215780632d1e0c0214611d2e5780632f2ff15d14611b8a57806331e66e1e14611b385780634fc3585914611876578063569c93d214611824578063572b6c05146117d85780636806cc931461169c57806373c8a9581461146c57806375c93bb9146110b65780637b0a47ee1461107a57806380faa57d14611039578063817b1cd214610ffd5780638580cf7614610fa45780638bb9c5bf14610e3f5780638da5cb5b14610dcd57806391d1485414610d3b57806398807d8414610cd857806399248ea714610c695780639d696e3614610c2d578063c3666c361461096e578063c5c8f7701461090b578063c63ff8dd14610765578063d0b06f5d14610729578063d547741f1461057a578063ef4cadc514610521578063efa90b54146104e5578063f2fde38b146103bf5763f7ba94bd1461019d57600080fd5b346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576101ec9036906004016123ad565b60243567ffffffffffffffff81116103b65761020c9036906004016123ad565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d61292f565b9254169116908103610389575081810361036157845b81811061026e578580f35b610279818387612725565b3573ffffffffffffffffffffffffffffffffffffffff811680910361035d576102a3828587612725565b359081471061032d578780809381935af13d15610325573d906102c5826125a7565b916102d36040519384612537565b82523d88602084013e5b156102eb5750600101610263565b80518790156102fd5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102dd565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576103f76122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061042161292f565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104ba575073ffffffffffffffffffffffffffffffffffffffff1691828203610467578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600554604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356105b561231d565b6105bd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361038957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661066f578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600254604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576107b5903690600401612340565b6107bd6128f4565b6107c561292f565b916107cf83612862565b6107d8836124cd565b91826107e7575b846001815580f35b939192937f000000000000000000000000000000000000000000000000000000000000000061081681866125e1565b9381156108de57610861858873ffffffffffffffffffffffffffffffffffffffff600954167f0000000000000000000000000000000000000000000000000000000000000000612ae2565b50600094069273ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9495961694858752600760205260408720556108c660405193849360608552606085019161236e565b9060208301528560408301520390a2388080806107df565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff61095d6122f5565b168152600883522054604051908152f35b50346103bc5761097d366123de565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109c361292f565b9254169116908103610c025750808214801590610bf8575b610bd057865b8281106109ec578780f35b73ffffffffffffffffffffffffffffffffffffffff610a14610a0f83858b612725565b612764565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610bc5578a91610b88575b5015610b5d575073ffffffffffffffffffffffffffffffffffffffff610aa2610a0f83858b612725565b169088610ab3610a0f83878a612725565b92610abf83888b612725565b3590803b15610b59576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff95909516602486015260448501919091528390606490829084905af191898315610b4d57600193610b3d575b5050016109e1565b610b4691612537565b3889610b35565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610bbd575b81610ba260209383612537565b81010312610bb957610bb3906128e7565b38610a78565b8980fd5b3d9150610b95565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109db565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600454604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff610d2a6122f5565b168152600683522054604051908152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760ff6040602092610d7a61231d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e9c61292f565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610f5e578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600154604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020611072612785565b604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356024356110ef61292f565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff604085205416156114065782156113de5780156113b6577f00000000000000000000000000000000000000000000000000000000000000008084029084820414809102901561138e576111aa61261a565b6004556005544210801590611383575b611373575b600554906111cd83426124c0565b914281116112365750928273ffffffffffffffffffffffffffffffffffffffff9261121b6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976125e1565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461125061124a4286612471565b826124ad565b8501948510948515029461134b578382116112bf575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112b76112b073ffffffffffffffffffffffffffffffffffffffff944290612471565b80926125e1565b600355611222565b916112cd91935080946125e1565b9080821061131d57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611222565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61137b612785565b6002556111bf565b5060015415156111ba565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103bc5761147b366123de565b929493909291867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815b81848a81841061164957505050508161157d575b50507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061151061292f565b9254169116908103610c025750808214801590611573575b610bd057865b828110611539578780f35b8061156d61154d610a0f600194868c612725565b61155b610a0f84888c612725565b61156684898b612725565b3591612a7e565b0161152e565b5082821415611528565b6020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561163e578990611606575b6115cf915060015490612471565b90818111156114cf577f15c38d3e000000000000000000000000000000000000000000000000000000008952600452602452604487fd5b506020813d602011611636575b8161162060209383612537565b81010312611632576115cf90516115c1565b8880fd5b3d9150611613565b6040513d8b823e3d90fd5b610a0f8473ffffffffffffffffffffffffffffffffffffffff9361166c93612725565b161461167b575b6001016114bb565b9161169460019161168d85898b612725565b35906124c0565b929050611673565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576116d46122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061171361292f565b92541691169081036117ad575073ffffffffffffffffffffffffffffffffffffffff60095491169073ffffffffffffffffffffffffffffffffffffffff8116820361175c578280f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001681176009557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008352600452602482fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061181a6118156122f5565b6126c6565b6040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346103bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576118ae6122f5565b506118b761231d565b9060643567ffffffffffffffff81116103ba576118d8903690600401612340565b50507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff81163303611b105760405192604435602085015260208452611933604085612537565b604051916020830184815261198484611958604082019860408a526060830190612683565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612537565b61198c6128f4565b61199583612862565b835184019060408560208401930312611b0c576119b1906128e7565b955167ffffffffffffffff8111611b0c57840181603f82011215611b0c5760208101516119dd816125a7565b916119eb6040519384612537565b818352602083019360408284010111611b0857602092611a118593846040879501612660565b805101010312611b0457518095611af1575b905015611ac9578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a6f60019788546124c0565b87551692838552600660205260408520611a8a8382546124c0565b9055611a9b60405192839283612846565b0390a25560206040517f4fc35859000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611afd91833091612ae2565b3884611a23565b8480fd5b8780fd5b8580fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57611b6f612b4c565b611b8660405192839260208452602084019161236e565b0390f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435611bc561231d565b611bcd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036104ba57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff60408620541615611c7e578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57611d79903690600401612340565b611d8161292f565b60405192611da884611958602082019360018552604083019660408852606084019161236e565b611db06128f4565b611db982612862565b835184019060408560208401930312611b0c57611dd5906128e7565b925167ffffffffffffffff8111611b0c57840181603f82011215611b0c57602081015190611e02826125a7565b91611e106040519384612537565b808352602083019360408383010111611b0857602092611e368492866040819601612660565b805101010312611b04575191611ef0575b8115611ec8579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611e91836001546124c0565b6001551692838552600660205260408520611ead8382546124c0565b9055611ebe60405192839283612846565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611f1c8230837f0000000000000000000000000000000000000000000000000000000000000000612ae2565b611e47565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061107261261a565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57612019903690600401612340565b61202161292f565b908361202c826125a7565b9361203a6040519586612537565b82855260208501923681830111610b59578060209285378501015261205d6128f4565b61206682612862565b60208181855186010103126103b65751906120a282827f0000000000000000000000000000000000000000000000000000000000000000612a7e565b81156121515773ffffffffffffffffffffffffffffffffffffffff16918284526006602052604084205482811061211d5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611ebe60405192839283612846565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff6121cb6122f5565b168152600783522054604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103bc57602061181a83612797565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206110726122f06122f5565b6124cd565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b9181601f840112156123185782359167ffffffffffffffff8311612318576020838186019501011161231857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156123185782359167ffffffffffffffff8311612318576020808501948460051b01011161231857565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126123185760043567ffffffffffffffff81116123185781612427916004016123ad565b9290929160243567ffffffffffffffff8111612318578161244a916004016123ad565b929092916044359067ffffffffffffffff82116123185761246d916004016123ad565b9091565b9190820391821161247e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561247e57565b9190820180921161247e57565b73ffffffffffffffffffffffffffffffffffffffff612534911680600052600660205261251f60406000205461251961250461261a565b84600052600860205260406000205490612471565b906124ad565b906000526007602052604060002054906124c0565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761257857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161257857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81156125eb570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600154801561265957612534906126536004549161264e61264561263c612785565b60025490612471565b600354906124ad565b6125e1565b906124c0565b5060045490565b60005b8381106126735750506000910152565b8181015183820152602001612663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936126bf81518092818752878088019101612660565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561271e5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156127355760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036123185790565b60055480421060001461253457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612840577f01ffc9a700000000000000000000000000000000000000000000000000000000811461283a576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061285d602091604086526040860190612683565b930152565b61286a61261a565b60045560055442108015906128dc575b6128cc575b73ffffffffffffffffffffffffffffffffffffffff811690816128a0575050565b6128a9906124cd565b816000526007602052604060002055600454906000526008602052604060002055565b6128d4612785565b60025561287f565b50600154151561287a565b5190811515820361231857565b600260005414612905576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a6f573233148015612a74575b612a6f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156129b7575b5061253457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612a29575b50386129ad565b90506020813d602011612a5b575b81612a4460209383612537565b8101031261231857612a55906128e7565b38612a22565b3d9150612a37565b6040513d6000823e3d90fd5b503390565b5060183610612976565b612ae09273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252612adb606483612537565b612cad565b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9283166024820152929091166044830152606480830193909352918152612ae091612adb608483612537565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612c9b573233148015612ca3575b612c9b57803314908115612bdf575b50612bae576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116123185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612c61575b5038612ba2565b90506020813d602011612c93575b81612c7c60209383612537565b8101031261231857612c8d906128e7565b38612c5a565b3d9150612c6f565b506000903690565b5060183610612b93565b906000602091828151910182855af115612a63576000513d612d2f575073ffffffffffffffffffffffffffffffffffffffff81163b155b612ceb5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415612ce456fea26469706673582212209627cb29688aeecd923ac9c52dc6c9b2ee969d050ad0dafa58e900884f3d79eb64736f6c634300081e0033","opcodes":"PUSH2 0x100 CALLVALUE PUSH2 0x255 JUMPI PUSH1 0x1F PUSH2 0x2FF3 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x25A JUMPI DUP1 DUP5 SWAP3 PUSH1 0xA0 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x255 JUMPI PUSH2 0x48 DUP2 PUSH2 0x270 JUMP JUMPDEST PUSH2 0x54 PUSH1 0x20 DUP4 ADD PUSH2 0x270 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP4 SWAP2 SWAP3 SWAP2 SWAP1 DUP5 SWAP1 SUB PUSH2 0x255 JUMPI PUSH1 0x60 DUP2 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x255 JUMPI PUSH1 0x80 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x255 JUMPI CALLER PUSH2 0x1F6 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x0 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x1E5 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x1CF JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH4 0x4FC35859 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0xC0 MSTORE PUSH1 0xE0 MSTORE DUP1 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB NOT PUSH1 0x9 SLOAD AND OR PUSH1 0x9 SSTORE PUSH1 0x40 MLOAD SWAP1 PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 PUSH1 0x0 DUP1 LOG2 PUSH2 0x2D6E SWAP1 DUP2 PUSH2 0x285 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x1FA5 ADD MSTORE DUP2 DUP2 PUSH2 0x26DD ADD MSTORE DUP2 DUP2 PUSH2 0x2946 ADD MSTORE PUSH2 0x2B63 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x557 ADD MSTORE DUP2 DUP2 PUSH2 0x7ED ADD MSTORE PUSH2 0x1172 ADD MSTORE PUSH1 0xC0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x1484 ADD MSTORE DUP2 DUP2 PUSH2 0x18DC ADD MSTORE DUP2 DUP2 PUSH2 0x1EF8 ADD MSTORE DUP2 DUP2 PUSH2 0x207E ADD MSTORE PUSH2 0x2227 ADD MSTORE PUSH1 0xE0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x83D ADD MSTORE PUSH2 0xCB4 ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x9B JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x255 JUMPI JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x22B3 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x224B JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x21DC JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2179 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1FC9 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1F5A JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1F21 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1D2E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B8A JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B38 JUMPI DUP1 PUSH4 0x4FC35859 EQ PUSH2 0x1876 JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x1824 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x17D8 JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x146C JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x10B6 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x107A JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1039 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xFFD JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xFA4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xE3F JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xDCD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xD3B JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xCD8 JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0xC69 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xC2D JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x96E JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x90B JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x765 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x729 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x57A JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4E5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3BF JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3B6 JUMPI PUSH2 0x20C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x24D PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x389 JUMPI POP DUP2 DUP2 SUB PUSH2 0x361 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x26E JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x279 DUP2 DUP4 DUP8 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x35D JUMPI PUSH2 0x2A3 DUP3 DUP6 DUP8 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x32D JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2C5 DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x2D3 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2EB JUMPI POP PUSH1 0x1 ADD PUSH2 0x263 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2FD JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2DD JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x3F7 PUSH2 0x22F5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x421 PUSH2 0x292F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x4BA JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x467 JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x5B5 PUSH2 0x231D JUMP JUMPDEST PUSH2 0x5BD PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x389 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x66F JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x71E SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x7B5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x7BD PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x7C5 PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH2 0x7CF DUP4 PUSH2 0x2862 JUMP JUMPDEST PUSH2 0x7D8 DUP4 PUSH2 0x24CD JUMP JUMPDEST SWAP2 DUP3 PUSH2 0x7E7 JUMPI JUMPDEST DUP5 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST SWAP4 SWAP2 SWAP3 SWAP4 PUSH32 0x0 PUSH2 0x816 DUP2 DUP7 PUSH2 0x25E1 JUMP JUMPDEST SWAP4 DUP2 ISZERO PUSH2 0x8DE JUMPI PUSH2 0x861 DUP6 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD AND PUSH32 0x0 PUSH2 0x2AE2 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 MOD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP5 SWAP6 SWAP7 AND SWAP5 DUP6 DUP8 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SSTORE PUSH2 0x8C6 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH1 0x60 DUP6 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP4 ADD MSTORE DUP6 PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x7DF JUMP JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x95D PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH2 0x97D CALLDATASIZE PUSH2 0x23DE JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x9C3 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xC02 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xBF8 JUMPI JUMPDEST PUSH2 0xBD0 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x9EC JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA14 PUSH2 0xA0F DUP4 DUP6 DUP12 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x2764 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xBC5 JUMPI DUP11 SWAP2 PUSH2 0xB88 JUMPI JUMPDEST POP ISZERO PUSH2 0xB5D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAA2 PUSH2 0xA0F DUP4 DUP6 DUP12 PUSH2 0x2725 JUMP JUMPDEST AND SWAP1 DUP9 PUSH2 0xAB3 PUSH2 0xA0F DUP4 DUP8 DUP11 PUSH2 0x2725 JUMP JUMPDEST SWAP3 PUSH2 0xABF DUP4 DUP9 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP1 EXTCODESIZE ISZERO PUSH2 0xB59 JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x44 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL SWAP2 DUP10 DUP4 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x1 SWAP4 PUSH2 0xB3D JUMPI JUMPDEST POP POP ADD PUSH2 0x9E1 JUMP JUMPDEST PUSH2 0xB46 SWAP2 PUSH2 0x2537 JUMP JUMPDEST CODESIZE DUP10 PUSH2 0xB35 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0xBBD JUMPI JUMPDEST DUP2 PUSH2 0xBA2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xBB9 JUMPI PUSH2 0xBB3 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0xA78 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB95 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x9DB JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD2A PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0xFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH2 0xD7A PUSH2 0x231D JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP4 MSTORE DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xE9C PUSH2 0x292F JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP5 KECCAK256 SLOAD AND ISZERO PUSH2 0xF5E JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND DUP1 DUP6 MSTORE SWAP3 DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x10EF PUSH2 0x292F JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP6 KECCAK256 SLOAD AND ISZERO PUSH2 0x1406 JUMPI DUP3 ISZERO PUSH2 0x13DE JUMPI DUP1 ISZERO PUSH2 0x13B6 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x138E JUMPI PUSH2 0x11AA PUSH2 0x261A JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1383 JUMPI JUMPDEST PUSH2 0x1373 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x11CD DUP4 TIMESTAMP PUSH2 0x24C0 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1236 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x121B PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x25E1 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1250 PUSH2 0x124A TIMESTAMP DUP7 PUSH2 0x2471 JUMP JUMPDEST DUP3 PUSH2 0x24AD JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x134B JUMPI DUP4 DUP3 GT PUSH2 0x12BF JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x12B7 PUSH2 0x12B0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2471 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x25E1 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1222 JUMP JUMPDEST SWAP2 PUSH2 0x12CD SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x25E1 JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x131D JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x1222 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x137B PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x11BF JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x11BA JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH2 0x147B CALLDATASIZE PUSH2 0x23DE JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 DUP7 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMPDEST DUP2 DUP5 DUP11 DUP2 DUP5 LT PUSH2 0x1649 JUMPI POP POP POP POP DUP2 PUSH2 0x157D JUMPI JUMPDEST POP POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1510 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xC02 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1573 JUMPI JUMPDEST PUSH2 0xBD0 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x1539 JUMPI DUP8 DUP1 RETURN JUMPDEST DUP1 PUSH2 0x156D PUSH2 0x154D PUSH2 0xA0F PUSH1 0x1 SWAP5 DUP7 DUP13 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x155B PUSH2 0xA0F DUP5 DUP9 DUP13 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x1566 DUP5 DUP10 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP2 PUSH2 0x2A7E JUMP JUMPDEST ADD PUSH2 0x152E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x1528 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x24 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE GAS STATICCALL DUP1 ISZERO PUSH2 0x163E JUMPI DUP10 SWAP1 PUSH2 0x1606 JUMPI JUMPDEST PUSH2 0x15CF SWAP2 POP PUSH1 0x1 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST SWAP1 DUP2 DUP2 GT ISZERO PUSH2 0x14CF JUMPI PUSH32 0x15C38D3E00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP8 REVERT JUMPDEST POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1636 JUMPI JUMPDEST DUP2 PUSH2 0x1620 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1632 JUMPI PUSH2 0x15CF SWAP1 MLOAD PUSH2 0x15C1 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1613 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP12 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xA0F DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH2 0x166C SWAP4 PUSH2 0x2725 JUMP JUMPDEST AND EQ PUSH2 0x167B JUMPI JUMPDEST PUSH1 0x1 ADD PUSH2 0x14BB JUMP JUMPDEST SWAP2 PUSH2 0x1694 PUSH1 0x1 SWAP2 PUSH2 0x168D DUP6 DUP10 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH2 0x24C0 JUMP JUMPDEST SWAP3 SWAP1 POP PUSH2 0x1673 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x16D4 PUSH2 0x22F5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1713 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x17AD JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x175C JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0x9 SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP3 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x181A PUSH2 0x1815 PUSH2 0x22F5 JUMP JUMPDEST PUSH2 0x26C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x18AE PUSH2 0x22F5 JUMP JUMPDEST POP PUSH2 0x18B7 PUSH2 0x231D JUMP JUMPDEST SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x18D8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST POP POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER SUB PUSH2 0x1B10 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH1 0x44 CALLDATALOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x20 DUP5 MSTORE PUSH2 0x1933 PUSH1 0x40 DUP6 PUSH2 0x2537 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD DUP5 DUP2 MSTORE PUSH2 0x1984 DUP5 PUSH2 0x1958 PUSH1 0x40 DUP3 ADD SWAP9 PUSH1 0x40 DUP11 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2683 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x198C PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x1995 DUP4 PUSH2 0x2862 JUMP JUMPDEST DUP4 MLOAD DUP5 ADD SWAP1 PUSH1 0x40 DUP6 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x1B0C JUMPI PUSH2 0x19B1 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST SWAP6 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B0C JUMPI DUP5 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x19DD DUP2 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x19EB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0x1B08 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x1A11 DUP6 SWAP4 DUP5 PUSH1 0x40 DUP8 SWAP6 ADD PUSH2 0x2660 JUMP JUMPDEST DUP1 MLOAD ADD ADD SUB SLT PUSH2 0x1B04 JUMPI MLOAD DUP1 SWAP6 PUSH2 0x1AF1 JUMPI JUMPDEST SWAP1 POP ISZERO PUSH2 0x1AC9 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1A6F PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x24C0 JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1A8A DUP4 DUP3 SLOAD PUSH2 0x24C0 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1A9B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1AFD SWAP2 DUP4 ADDRESS SWAP2 PUSH2 0x2AE2 JUMP JUMPDEST CODESIZE DUP5 PUSH2 0x1A23 JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST DUP8 DUP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x1B6F PUSH2 0x2B4C JUMP JUMPDEST PUSH2 0x1B86 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BC5 PUSH2 0x231D JUMP JUMPDEST PUSH2 0x1BCD PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x4BA JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C7E JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x71E SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x1D79 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x1D81 PUSH2 0x292F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x1DA8 DUP5 PUSH2 0x1958 PUSH1 0x20 DUP3 ADD SWAP4 PUSH1 0x1 DUP6 MSTORE PUSH1 0x40 DUP4 ADD SWAP7 PUSH1 0x40 DUP9 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST PUSH2 0x1DB0 PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x1DB9 DUP3 PUSH2 0x2862 JUMP JUMPDEST DUP4 MLOAD DUP5 ADD SWAP1 PUSH1 0x40 DUP6 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x1B0C JUMPI PUSH2 0x1DD5 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B0C JUMPI DUP5 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH2 0x1E02 DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x1E10 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0x1B08 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x1E36 DUP5 SWAP3 DUP7 PUSH1 0x40 DUP2 SWAP7 ADD PUSH2 0x2660 JUMP JUMPDEST DUP1 MLOAD ADD ADD SUB SLT PUSH2 0x1B04 JUMPI MLOAD SWAP2 PUSH2 0x1EF0 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x1EC8 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1E91 DUP4 PUSH1 0x1 SLOAD PUSH2 0x24C0 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1EAD DUP4 DUP3 SLOAD PUSH2 0x24C0 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1EBE PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1F1C DUP3 ADDRESS DUP4 PUSH32 0x0 PUSH2 0x2AE2 JUMP JUMPDEST PUSH2 0x1E47 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x261A JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x2019 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x2021 PUSH2 0x292F JUMP JUMPDEST SWAP1 DUP4 PUSH2 0x202C DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP4 PUSH2 0x203A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2537 JUMP JUMPDEST DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0xB59 JUMPI DUP1 PUSH1 0x20 SWAP3 DUP6 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x205D PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x2066 DUP3 PUSH2 0x2862 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 DUP6 MLOAD DUP7 ADD ADD SUB SLT PUSH2 0x3B6 JUMPI MLOAD SWAP1 PUSH2 0x20A2 DUP3 DUP3 PUSH32 0x0 PUSH2 0x2A7E JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2151 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x211D JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1EBE PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x21CB PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x181A DUP4 PUSH2 0x2797 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x22F0 PUSH2 0x22F5 JUMP JUMPDEST PUSH2 0x24CD JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2318 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2318 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2318 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2318 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2318 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2318 JUMPI DUP2 PUSH2 0x2427 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2318 JUMPI DUP2 PUSH2 0x244A SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2318 JUMPI PUSH2 0x246D SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x247E JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x247E JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x247E JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2534 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x251F PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2519 PUSH2 0x2504 PUSH2 0x261A JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST SWAP1 PUSH2 0x24AD JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x24C0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2578 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2578 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x25EB JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2659 JUMPI PUSH2 0x2534 SWAP1 PUSH2 0x2653 PUSH1 0x4 SLOAD SWAP2 PUSH2 0x264E PUSH2 0x2645 PUSH2 0x263C PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x24AD JUMP JUMPDEST PUSH2 0x25E1 JUMP JUMPDEST SWAP1 PUSH2 0x24C0 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2673 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2663 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x26BF DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2660 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x271E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2735 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2318 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2534 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2840 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x283A JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x285D PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2683 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x286A PUSH2 0x261A JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x28DC JUMPI JUMPDEST PUSH2 0x28CC JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x28A0 JUMPI POP POP JUMP JUMPDEST PUSH2 0x28A9 SWAP1 PUSH2 0x24CD JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x28D4 PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x287F JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x287A JUMP JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2905 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2A6F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2A74 JUMPI JUMPDEST PUSH2 0x2A6F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x29B7 JUMPI JUMPDEST POP PUSH2 0x2534 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A29 JUMPI JUMPDEST POP CODESIZE PUSH2 0x29AD JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2A5B JUMPI JUMPDEST DUP2 PUSH2 0x2A44 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2318 JUMPI PUSH2 0x2A55 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0x2A22 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2976 JUMP JUMPDEST PUSH2 0x2AE0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x2ADB PUSH1 0x64 DUP4 PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x2CAD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP2 DUP2 MSTORE PUSH2 0x2AE0 SWAP2 PUSH2 0x2ADB PUSH1 0x84 DUP4 PUSH2 0x2537 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2C9B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2CA3 JUMPI JUMPDEST PUSH2 0x2C9B JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2BDF JUMPI JUMPDEST POP PUSH2 0x2BAE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2318 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2C61 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2BA2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2C93 JUMPI JUMPDEST DUP2 PUSH2 0x2C7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2318 JUMPI PUSH2 0x2C8D SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0x2C5A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2C6F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2B93 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2D2F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x2CEB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x2CE4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 0x27 0xCB 0x29 PUSH9 0x8AEECD923AC9C52DC6 0xC9 0xB2 RETURNCONTRACT 0x96 SWAP14 SDIV EXP 0xD0 0xDA STATICCALL PC 0xE9 STOP DUP9 0x4F RETURNDATASIZE PUSH26 0xEB64736F6C634300081E00330000000000000000000000000000 ","sourceMap":"553:1407:107:-:0;;;;;;;;;;;;;-1:-1:-1;;553:1407:107;;;;-1:-1:-1;;;;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;553:1407:107;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;553:1407:107;881:35:59;1863:25:42;;;-1:-1:-1;500:10:59;;553:1407:107;500:10:59;553:1407:107;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;990:1:42;-1:-1:-1;1857:1:13;553:1407:107;745:39:76;4180:2:193;4156:26;;553:1407:107;;;4180:2:193;553:1407:107;;;;;;;4221:44:193;793:32:240;;;-1:-1:-1;500:10:59;553:1407:107;500:10:59;553:1407:107;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;1077:28:197;;1065:26:195;;553:1407:107;;;;;;;1101:28:195;553:1407:107;;;1101:28:195;553:1407:107;;;1144:30:195;;-1:-1:-1;1144:30:195;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1077:28:197;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;1065:26:195;553:1407:107;;;;;;;;;;;;;;;-1:-1:-1;553:1407:107;;;;;-1:-1:-1;553:1407:107;;;;;-1:-1:-1;553:1407:107;;-1:-1:-1;553:1407:107;1645:152:42;553:1407:107;;;-1:-1:-1;;;;;;553:1407:107;4082:10:193;553:1407:107;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;553:1407:107;-1:-1:-1;553:1407:107;;;;;;-1:-1:-1;553:1407:107;;;;;-1:-1:-1;553:1407:107;;;;-1:-1:-1;;;;;553:1407:107;;;;;;:::o"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":8949,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":9133,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9182,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_bool_fromMemory":{"entryPoint":10471,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":9024,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":8989,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes":{"entryPoint":9859,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":9070,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":10310,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":9639,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":10021,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":9408,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_uint256":{"entryPoint":9697,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":9389,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":9329,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":9824,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":9527,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOptionalReturn":{"entryPoint":11437,"id":874,"parameterSlots":2,"returnSlots":0},"fun_earned":{"entryPoint":9421,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":9926,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":10117,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgData":{"entryPoint":11084,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":10543,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":10484,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":9754,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_safeTransfer":{"entryPoint":10878,"id":497,"parameterSlots":3,"returnSlots":0},"fun_safeTransferFrom":{"entryPoint":10978,"id":524,"parameterSlots":4,"returnSlots":0},"fun_supportsInterface":{"entryPoint":10135,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":10338,"id":20469,"parameterSlots":1,"returnSlots":0},"read_from_calldatat_contract_IERC20":{"entryPoint":10084,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8101},{"length":32,"start":9949},{"length":32,"start":10566},{"length":32,"start":11107}],"20300":[{"length":32,"start":1367},{"length":32,"start":2029},{"length":32,"start":4466}],"21079":[{"length":32,"start":2109},{"length":32,"start":3252}],"21799":[{"length":32,"start":5252},{"length":32,"start":6364},{"length":32,"start":7928},{"length":32,"start":8318},{"length":32,"start":8743}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c80628cc262146122b357806301ffc9a71461224b5780630479d644146121dc5780630700037d146121795780630968f26414611fc95780632b4c9f1614611f5a5780632c9d0b8014611f215780632d1e0c0214611d2e5780632f2ff15d14611b8a57806331e66e1e14611b385780634fc3585914611876578063569c93d214611824578063572b6c05146117d85780636806cc931461169c57806373c8a9581461146c57806375c93bb9146110b65780637b0a47ee1461107a57806380faa57d14611039578063817b1cd214610ffd5780638580cf7614610fa45780638bb9c5bf14610e3f5780638da5cb5b14610dcd57806391d1485414610d3b57806398807d8414610cd857806399248ea714610c695780639d696e3614610c2d578063c3666c361461096e578063c5c8f7701461090b578063c63ff8dd14610765578063d0b06f5d14610729578063d547741f1461057a578063ef4cadc514610521578063efa90b54146104e5578063f2fde38b146103bf5763f7ba94bd1461019d57600080fd5b346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576101ec9036906004016123ad565b60243567ffffffffffffffff81116103b65761020c9036906004016123ad565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061024d61292f565b9254169116908103610389575081810361036157845b81811061026e578580f35b610279818387612725565b3573ffffffffffffffffffffffffffffffffffffffff811680910361035d576102a3828587612725565b359081471061032d578780809381935af13d15610325573d906102c5826125a7565b916102d36040519384612537565b82523d88602084013e5b156102eb5750600101610263565b80518790156102fd5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102dd565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576103f76122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061042161292f565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036104ba575073ffffffffffffffffffffffffffffffffffffffff1691828203610467578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600554604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356105b561231d565b6105bd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361038957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661066f578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600254604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba576107b5903690600401612340565b6107bd6128f4565b6107c561292f565b916107cf83612862565b6107d8836124cd565b91826107e7575b846001815580f35b939192937f000000000000000000000000000000000000000000000000000000000000000061081681866125e1565b9381156108de57610861858873ffffffffffffffffffffffffffffffffffffffff600954167f0000000000000000000000000000000000000000000000000000000000000000612ae2565b50600094069273ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9495961694858752600760205260408720556108c660405193849360608552606085019161236e565b9060208301528560408301520390a2388080806107df565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff61095d6122f5565b168152600883522054604051908152f35b50346103bc5761097d366123de565b929490939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109c361292f565b9254169116908103610c025750808214801590610bf8575b610bd057865b8281106109ec578780f35b73ffffffffffffffffffffffffffffffffffffffff610a14610a0f83858b612725565b612764565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610bc5578a91610b88575b5015610b5d575073ffffffffffffffffffffffffffffffffffffffff610aa2610a0f83858b612725565b169088610ab3610a0f83878a612725565b92610abf83888b612725565b3590803b15610b59576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff95909516602486015260448501919091528390606490829084905af191898315610b4d57600193610b3d575b5050016109e1565b610b4691612537565b3889610b35565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610bbd575b81610ba260209383612537565b81010312610bb957610bb3906128e7565b38610a78565b8980fd5b3d9150610b95565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109db565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600454604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff610d2a6122f5565b168152600683522054604051908152f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760ff6040602092610d7a61231d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e9c61292f565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610f5e578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600154604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020611072612785565b604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576004356024356110ef61292f565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff604085205416156114065782156113de5780156113b6577f00000000000000000000000000000000000000000000000000000000000000008084029084820414809102901561138e576111aa61261a565b6004556005544210801590611383575b611373575b600554906111cd83426124c0565b914281116112365750928273ffffffffffffffffffffffffffffffffffffffff9261121b6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976125e1565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461125061124a4286612471565b826124ad565b8501948510948515029461134b578382116112bf575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112b76112b073ffffffffffffffffffffffffffffffffffffffff944290612471565b80926125e1565b600355611222565b916112cd91935080946125e1565b9080821061131d57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847495600355600555611222565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61137b612785565b6002556111bf565b5060015415156111ba565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103bc5761147b366123de565b929493909291867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815b81848a81841061164957505050508161157d575b50507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061151061292f565b9254169116908103610c025750808214801590611573575b610bd057865b828110611539578780f35b8061156d61154d610a0f600194868c612725565b61155b610a0f84888c612725565b61156684898b612725565b3591612a7e565b0161152e565b5082821415611528565b6020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa801561163e578990611606575b6115cf915060015490612471565b90818111156114cf577f15c38d3e000000000000000000000000000000000000000000000000000000008952600452602452604487fd5b506020813d602011611636575b8161162060209383612537565b81010312611632576115cf90516115c1565b8880fd5b3d9150611613565b6040513d8b823e3d90fd5b610a0f8473ffffffffffffffffffffffffffffffffffffffff9361166c93612725565b161461167b575b6001016114bb565b9161169460019161168d85898b612725565b35906124c0565b929050611673565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576116d46122f5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061171361292f565b92541691169081036117ad575073ffffffffffffffffffffffffffffffffffffffff60095491169073ffffffffffffffffffffffffffffffffffffffff8116820361175c578280f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001681176009557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008352600452602482fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061181a6118156122f5565b6126c6565b6040519015158152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346103bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc576118ae6122f5565b506118b761231d565b9060643567ffffffffffffffff81116103ba576118d8903690600401612340565b50507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff81163303611b105760405192604435602085015260208452611933604085612537565b604051916020830184815261198484611958604082019860408a526060830190612683565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612537565b61198c6128f4565b61199583612862565b835184019060408560208401930312611b0c576119b1906128e7565b955167ffffffffffffffff8111611b0c57840181603f82011215611b0c5760208101516119dd816125a7565b916119eb6040519384612537565b818352602083019360408284010111611b0857602092611a118593846040879501612660565b805101010312611b0457518095611af1575b905015611ac9578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a6f60019788546124c0565b87551692838552600660205260408520611a8a8382546124c0565b9055611a9b60405192839283612846565b0390a25560206040517f4fc35859000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611afd91833091612ae2565b3884611a23565b8480fd5b8780fd5b8580fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57611b6f612b4c565b611b8660405192839260208452602084019161236e565b0390f35b50346103bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435611bc561231d565b611bcd61292f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036104ba57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff60408620541615611c7e578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9361071e918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57611d79903690600401612340565b611d8161292f565b60405192611da884611958602082019360018552604083019660408852606084019161236e565b611db06128f4565b611db982612862565b835184019060408560208401930312611b0c57611dd5906128e7565b925167ffffffffffffffff8111611b0c57840181603f82011215611b0c57602081015190611e02826125a7565b91611e106040519384612537565b808352602083019360408383010111611b0857602092611e368492866040819601612660565b805101010312611b04575191611ef0575b8115611ec8579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611e91836001546124c0565b6001551692838552600660205260408520611ead8382546124c0565b9055611ebe60405192839283612846565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611f1c8230837f0000000000000000000000000000000000000000000000000000000000000000612ae2565b611e47565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602061107261261a565b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760043567ffffffffffffffff81116103ba57612019903690600401612340565b61202161292f565b908361202c826125a7565b9361203a6040519586612537565b82855260208501923681830111610b59578060209285378501015261205d6128f4565b61206682612862565b60208181855186010103126103b65751906120a282827f0000000000000000000000000000000000000000000000000000000000000000612a7e565b81156121515773ffffffffffffffffffffffffffffffffffffffff16918284526006602052604084205482811061211d5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611ebe60405192839283612846565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57604060209173ffffffffffffffffffffffffffffffffffffffff6121cb6122f5565b168152600783522054604051908152f35b50346103bc57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc57600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103bc57602061181a83612797565b50346103bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103bc5760206110726122f06122f5565b6124cd565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361231857565b9181601f840112156123185782359167ffffffffffffffff8311612318576020838186019501011161231857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156123185782359167ffffffffffffffff8311612318576020808501948460051b01011161231857565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126123185760043567ffffffffffffffff81116123185781612427916004016123ad565b9290929160243567ffffffffffffffff8111612318578161244a916004016123ad565b929092916044359067ffffffffffffffff82116123185761246d916004016123ad565b9091565b9190820391821161247e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561247e57565b9190820180921161247e57565b73ffffffffffffffffffffffffffffffffffffffff612534911680600052600660205261251f60406000205461251961250461261a565b84600052600860205260406000205490612471565b906124ad565b906000526007602052604060002054906124c0565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761257857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161257857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81156125eb570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600154801561265957612534906126536004549161264e61264561263c612785565b60025490612471565b600354906124ad565b6125e1565b906124c0565b5060045490565b60005b8381106126735750506000910152565b8181015183820152602001612663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936126bf81518092818752878088019101612660565b0116010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561271e5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156127355760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036123185790565b60055480421060001461253457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612840577f01ffc9a700000000000000000000000000000000000000000000000000000000811461283a576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b92919061285d602091604086526040860190612683565b930152565b61286a61261a565b60045560055442108015906128dc575b6128cc575b73ffffffffffffffffffffffffffffffffffffffff811690816128a0575050565b6128a9906124cd565b816000526007602052604060002055600454906000526008602052604060002055565b6128d4612785565b60025561287f565b50600154151561287a565b5190811515820361231857565b600260005414612905576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a6f573233148015612a74575b612a6f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156129b7575b5061253457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612a29575b50386129ad565b90506020813d602011612a5b575b81612a4460209383612537565b8101031261231857612a55906128e7565b38612a22565b3d9150612a37565b6040513d6000823e3d90fd5b503390565b5060183610612976565b612ae09273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252612adb606483612537565b612cad565b565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9283166024820152929091166044830152606480830193909352918152612ae091612adb608483612537565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612c9b573233148015612ca3575b612c9b57803314908115612bdf575b50612bae576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116123185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612a6357600091612c61575b5038612ba2565b90506020813d602011612c93575b81612c7c60209383612537565b8101031261231857612c8d906128e7565b38612c5a565b3d9150612c6f565b506000903690565b5060183610612b93565b906000602091828151910182855af115612a63576000513d612d2f575073ffffffffffffffffffffffffffffffffffffffff81163b155b612ceb5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60011415612ce456fea26469706673582212209627cb29688aeecd923ac9c52dc6c9b2ee969d050ad0dafa58e900884f3d79eb64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x22B3 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x224B JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x21DC JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2179 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1FC9 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1F5A JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1F21 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1D2E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B8A JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B38 JUMPI DUP1 PUSH4 0x4FC35859 EQ PUSH2 0x1876 JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x1824 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x17D8 JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x146C JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x10B6 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x107A JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1039 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xFFD JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xFA4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xE3F JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xDCD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xD3B JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xCD8 JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0xC69 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xC2D JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x96E JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x90B JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x765 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x729 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x57A JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4E5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3BF JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3B6 JUMPI PUSH2 0x20C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x24D PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x389 JUMPI POP DUP2 DUP2 SUB PUSH2 0x361 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x26E JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x279 DUP2 DUP4 DUP8 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x35D JUMPI PUSH2 0x2A3 DUP3 DUP6 DUP8 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x32D JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x325 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2C5 DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x2D3 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2EB JUMPI POP PUSH1 0x1 ADD PUSH2 0x263 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2FD JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2DD JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x3F7 PUSH2 0x22F5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x421 PUSH2 0x292F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x4BA JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x467 JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x5B5 PUSH2 0x231D JUMP JUMPDEST PUSH2 0x5BD PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x389 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x66F JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x71E SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x7B5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x7BD PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x7C5 PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH2 0x7CF DUP4 PUSH2 0x2862 JUMP JUMPDEST PUSH2 0x7D8 DUP4 PUSH2 0x24CD JUMP JUMPDEST SWAP2 DUP3 PUSH2 0x7E7 JUMPI JUMPDEST DUP5 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST SWAP4 SWAP2 SWAP3 SWAP4 PUSH32 0x0 PUSH2 0x816 DUP2 DUP7 PUSH2 0x25E1 JUMP JUMPDEST SWAP4 DUP2 ISZERO PUSH2 0x8DE JUMPI PUSH2 0x861 DUP6 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD AND PUSH32 0x0 PUSH2 0x2AE2 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 MOD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP5 SWAP6 SWAP7 AND SWAP5 DUP6 DUP8 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SSTORE PUSH2 0x8C6 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH1 0x60 DUP6 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP4 ADD MSTORE DUP6 PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x7DF JUMP JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x95D PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH2 0x97D CALLDATASIZE PUSH2 0x23DE JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x9C3 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xC02 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xBF8 JUMPI JUMPDEST PUSH2 0xBD0 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x9EC JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA14 PUSH2 0xA0F DUP4 DUP6 DUP12 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x2764 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xBC5 JUMPI DUP11 SWAP2 PUSH2 0xB88 JUMPI JUMPDEST POP ISZERO PUSH2 0xB5D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAA2 PUSH2 0xA0F DUP4 DUP6 DUP12 PUSH2 0x2725 JUMP JUMPDEST AND SWAP1 DUP9 PUSH2 0xAB3 PUSH2 0xA0F DUP4 DUP8 DUP11 PUSH2 0x2725 JUMP JUMPDEST SWAP3 PUSH2 0xABF DUP4 DUP9 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP1 EXTCODESIZE ISZERO PUSH2 0xB59 JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x44 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL SWAP2 DUP10 DUP4 ISZERO PUSH2 0xB4D JUMPI PUSH1 0x1 SWAP4 PUSH2 0xB3D JUMPI JUMPDEST POP POP ADD PUSH2 0x9E1 JUMP JUMPDEST PUSH2 0xB46 SWAP2 PUSH2 0x2537 JUMP JUMPDEST CODESIZE DUP10 PUSH2 0xB35 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0xBBD JUMPI JUMPDEST DUP2 PUSH2 0xBA2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xBB9 JUMPI PUSH2 0xBB3 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0xA78 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB95 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x9DB JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD2A PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0xFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH2 0xD7A PUSH2 0x231D JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP4 MSTORE DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xE9C PUSH2 0x292F JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP5 KECCAK256 SLOAD AND ISZERO PUSH2 0xF5E JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND DUP1 DUP6 MSTORE SWAP3 DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x10EF PUSH2 0x292F JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP6 KECCAK256 SLOAD AND ISZERO PUSH2 0x1406 JUMPI DUP3 ISZERO PUSH2 0x13DE JUMPI DUP1 ISZERO PUSH2 0x13B6 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x138E JUMPI PUSH2 0x11AA PUSH2 0x261A JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1383 JUMPI JUMPDEST PUSH2 0x1373 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x11CD DUP4 TIMESTAMP PUSH2 0x24C0 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1236 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x121B PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x25E1 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1250 PUSH2 0x124A TIMESTAMP DUP7 PUSH2 0x2471 JUMP JUMPDEST DUP3 PUSH2 0x24AD JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x134B JUMPI DUP4 DUP3 GT PUSH2 0x12BF JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x12B7 PUSH2 0x12B0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2471 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x25E1 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1222 JUMP JUMPDEST SWAP2 PUSH2 0x12CD SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x25E1 JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x131D JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x1222 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x137B PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x11BF JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x11BA JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH2 0x147B CALLDATASIZE PUSH2 0x23DE JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 DUP7 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMPDEST DUP2 DUP5 DUP11 DUP2 DUP5 LT PUSH2 0x1649 JUMPI POP POP POP POP DUP2 PUSH2 0x157D JUMPI JUMPDEST POP POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1510 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xC02 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1573 JUMPI JUMPDEST PUSH2 0xBD0 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x1539 JUMPI DUP8 DUP1 RETURN JUMPDEST DUP1 PUSH2 0x156D PUSH2 0x154D PUSH2 0xA0F PUSH1 0x1 SWAP5 DUP7 DUP13 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x155B PUSH2 0xA0F DUP5 DUP9 DUP13 PUSH2 0x2725 JUMP JUMPDEST PUSH2 0x1566 DUP5 DUP10 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP2 PUSH2 0x2A7E JUMP JUMPDEST ADD PUSH2 0x152E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x1528 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x24 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE GAS STATICCALL DUP1 ISZERO PUSH2 0x163E JUMPI DUP10 SWAP1 PUSH2 0x1606 JUMPI JUMPDEST PUSH2 0x15CF SWAP2 POP PUSH1 0x1 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST SWAP1 DUP2 DUP2 GT ISZERO PUSH2 0x14CF JUMPI PUSH32 0x15C38D3E00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP8 REVERT JUMPDEST POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1636 JUMPI JUMPDEST DUP2 PUSH2 0x1620 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1632 JUMPI PUSH2 0x15CF SWAP1 MLOAD PUSH2 0x15C1 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1613 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP12 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xA0F DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH2 0x166C SWAP4 PUSH2 0x2725 JUMP JUMPDEST AND EQ PUSH2 0x167B JUMPI JUMPDEST PUSH1 0x1 ADD PUSH2 0x14BB JUMP JUMPDEST SWAP2 PUSH2 0x1694 PUSH1 0x1 SWAP2 PUSH2 0x168D DUP6 DUP10 DUP12 PUSH2 0x2725 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH2 0x24C0 JUMP JUMPDEST SWAP3 SWAP1 POP PUSH2 0x1673 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x16D4 PUSH2 0x22F5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1713 PUSH2 0x292F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x17AD JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x175C JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0x9 SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP3 REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x181A PUSH2 0x1815 PUSH2 0x22F5 JUMP JUMPDEST PUSH2 0x26C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x9 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x18AE PUSH2 0x22F5 JUMP JUMPDEST POP PUSH2 0x18B7 PUSH2 0x231D JUMP JUMPDEST SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x18D8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST POP POP PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND CALLER SUB PUSH2 0x1B10 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH1 0x44 CALLDATALOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x20 DUP5 MSTORE PUSH2 0x1933 PUSH1 0x40 DUP6 PUSH2 0x2537 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD DUP5 DUP2 MSTORE PUSH2 0x1984 DUP5 PUSH2 0x1958 PUSH1 0x40 DUP3 ADD SWAP9 PUSH1 0x40 DUP11 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2683 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x198C PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x1995 DUP4 PUSH2 0x2862 JUMP JUMPDEST DUP4 MLOAD DUP5 ADD SWAP1 PUSH1 0x40 DUP6 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x1B0C JUMPI PUSH2 0x19B1 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST SWAP6 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B0C JUMPI DUP5 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x19DD DUP2 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x19EB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0x1B08 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x1A11 DUP6 SWAP4 DUP5 PUSH1 0x40 DUP8 SWAP6 ADD PUSH2 0x2660 JUMP JUMPDEST DUP1 MLOAD ADD ADD SUB SLT PUSH2 0x1B04 JUMPI MLOAD DUP1 SWAP6 PUSH2 0x1AF1 JUMPI JUMPDEST SWAP1 POP ISZERO PUSH2 0x1AC9 JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1A6F PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x24C0 JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1A8A DUP4 DUP3 SLOAD PUSH2 0x24C0 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1A9B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1AFD SWAP2 DUP4 ADDRESS SWAP2 PUSH2 0x2AE2 JUMP JUMPDEST CODESIZE DUP5 PUSH2 0x1A23 JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST DUP8 DUP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH2 0x1B6F PUSH2 0x2B4C JUMP JUMPDEST PUSH2 0x1B86 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BC5 PUSH2 0x231D JUMP JUMPDEST PUSH2 0x1BCD PUSH2 0x292F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x4BA JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C7E JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x71E SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x1D79 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x1D81 PUSH2 0x292F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x1DA8 DUP5 PUSH2 0x1958 PUSH1 0x20 DUP3 ADD SWAP4 PUSH1 0x1 DUP6 MSTORE PUSH1 0x40 DUP4 ADD SWAP7 PUSH1 0x40 DUP9 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x236E JUMP JUMPDEST PUSH2 0x1DB0 PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x1DB9 DUP3 PUSH2 0x2862 JUMP JUMPDEST DUP4 MLOAD DUP5 ADD SWAP1 PUSH1 0x40 DUP6 PUSH1 0x20 DUP5 ADD SWAP4 SUB SLT PUSH2 0x1B0C JUMPI PUSH2 0x1DD5 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST SWAP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B0C JUMPI DUP5 ADD DUP2 PUSH1 0x3F DUP3 ADD SLT ISZERO PUSH2 0x1B0C JUMPI PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH2 0x1E02 DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP2 PUSH2 0x1E10 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2537 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP4 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0x1B08 JUMPI PUSH1 0x20 SWAP3 PUSH2 0x1E36 DUP5 SWAP3 DUP7 PUSH1 0x40 DUP2 SWAP7 ADD PUSH2 0x2660 JUMP JUMPDEST DUP1 MLOAD ADD ADD SUB SLT PUSH2 0x1B04 JUMPI MLOAD SWAP2 PUSH2 0x1EF0 JUMPI JUMPDEST DUP2 ISZERO PUSH2 0x1EC8 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1E91 DUP4 PUSH1 0x1 SLOAD PUSH2 0x24C0 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1EAD DUP4 DUP3 SLOAD PUSH2 0x24C0 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1EBE PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1F1C DUP3 ADDRESS DUP4 PUSH32 0x0 PUSH2 0x2AE2 JUMP JUMPDEST PUSH2 0x1E47 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x261A JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3BA JUMPI PUSH2 0x2019 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2340 JUMP JUMPDEST PUSH2 0x2021 PUSH2 0x292F JUMP JUMPDEST SWAP1 DUP4 PUSH2 0x202C DUP3 PUSH2 0x25A7 JUMP JUMPDEST SWAP4 PUSH2 0x203A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2537 JUMP JUMPDEST DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0xB59 JUMPI DUP1 PUSH1 0x20 SWAP3 DUP6 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x205D PUSH2 0x28F4 JUMP JUMPDEST PUSH2 0x2066 DUP3 PUSH2 0x2862 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP2 DUP6 MLOAD DUP7 ADD ADD SUB SLT PUSH2 0x3B6 JUMPI MLOAD SWAP1 PUSH2 0x20A2 DUP3 DUP3 PUSH32 0x0 PUSH2 0x2A7E JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2151 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x211D JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1EBE PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2846 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x21CB PUSH2 0x22F5 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x181A DUP4 PUSH2 0x2797 JUMP JUMPDEST POP CALLVALUE PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3BC JUMPI PUSH1 0x20 PUSH2 0x1072 PUSH2 0x22F0 PUSH2 0x22F5 JUMP JUMPDEST PUSH2 0x24CD JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2318 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2318 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2318 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2318 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2318 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2318 JUMPI DUP2 PUSH2 0x2427 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2318 JUMPI DUP2 PUSH2 0x244A SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2318 JUMPI PUSH2 0x246D SWAP2 PUSH1 0x4 ADD PUSH2 0x23AD JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x247E JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x247E JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x247E JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2534 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x251F PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2519 PUSH2 0x2504 PUSH2 0x261A JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST SWAP1 PUSH2 0x24AD JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x24C0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2578 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2578 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x25EB JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2659 JUMPI PUSH2 0x2534 SWAP1 PUSH2 0x2653 PUSH1 0x4 SLOAD SWAP2 PUSH2 0x264E PUSH2 0x2645 PUSH2 0x263C PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2471 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x24AD JUMP JUMPDEST PUSH2 0x25E1 JUMP JUMPDEST SWAP1 PUSH2 0x24C0 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2673 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2663 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x26BF DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2660 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x271E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2735 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2318 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2534 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2840 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x283A JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x285D PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2683 JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x286A PUSH2 0x261A JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x28DC JUMPI JUMPDEST PUSH2 0x28CC JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x28A0 JUMPI POP POP JUMP JUMPDEST PUSH2 0x28A9 SWAP1 PUSH2 0x24CD JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x28D4 PUSH2 0x2785 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x287F JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x287A JUMP JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2318 JUMPI JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2905 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2A6F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2A74 JUMPI JUMPDEST PUSH2 0x2A6F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x29B7 JUMPI JUMPDEST POP PUSH2 0x2534 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A29 JUMPI JUMPDEST POP CODESIZE PUSH2 0x29AD JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2A5B JUMPI JUMPDEST DUP2 PUSH2 0x2A44 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2318 JUMPI PUSH2 0x2A55 SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0x2A22 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2976 JUMP JUMPDEST PUSH2 0x2AE0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x2ADB PUSH1 0x64 DUP4 PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x2CAD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP2 DUP2 MSTORE PUSH2 0x2AE0 SWAP2 PUSH2 0x2ADB PUSH1 0x84 DUP4 PUSH2 0x2537 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2C9B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2CA3 JUMPI JUMPDEST PUSH2 0x2C9B JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2BDF JUMPI JUMPDEST POP PUSH2 0x2BAE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2318 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2C61 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2BA2 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2C93 JUMPI JUMPDEST DUP2 PUSH2 0x2C7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2537 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2318 JUMPI PUSH2 0x2C8D SWAP1 PUSH2 0x28E7 JUMP JUMPDEST CODESIZE PUSH2 0x2C5A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2C6F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2B93 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x2A63 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2D2F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x2CEB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x2CE4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 0x27 0xCB 0x29 PUSH9 0x8AEECD923AC9C52DC6 0xC9 0xB2 RETURNCONTRACT 0x96 SWAP14 SDIV EXP 0xD0 0xDA STATICCALL PC 0xE9 STOP DUP9 0x4F RETURNDATASIZE PUSH26 0xEB64736F6C634300081E00330000000000000000000000000000 ","sourceMap":"553:1407:107:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;553:1407:107;;16306:41:193;;;:::i;:::-;553:1407:107;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1834:9;1845:10;;;;;;553:1407:107;;;1857:3:192;1876:11;;;;;:::i;:::-;553:1407:107;;;;;;;;;1898:10:192;;;;;:::i;:::-;553:1407:107;1375:21:9;;;:30;1371:125;;1548:33;;;;;;;;553:1407:107;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;553:1407:107;;1834:9:192;;1591:58:9;553:1407:107;;;;5690:21:9;:17;;5815:105;553:1407:107;5815:105:9;;;;;5686:301;5957:19;;553:1407:107;5957:19:9;;;553:1407:107;;;;;1371:125:9;553:1407:107;1455:21:9;;;1428:57;;;553:1407:107;;;;1428:57:9;553:1407:107;;;;1756:63:192;553:1407:107;1793:26:192;;;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;553:1407:107;;-1:-1:-1;4538:25:42;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;;:::i;:::-;553:1407:107;;;;;;;;3205:23:42;;;3201:60;;553:1407:107;;;3275:25:42;;;;3271:146;;553:1407:107;;;3271:146:42;553:1407:107;;;;;;;;3361:45:42;;;;3271:146;;;553:1407:107;;;3201:60:42;3237:24;;;553:1407:107;;;3237:24:42;;553:1407:107;;;;;;;;;;;;;2158:30:193;553:1407:107;;;;;;;;;;;;;;;;;;;;;;1971:39:193;553:1407:107;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;553:1407:107;;;;;;;4503:26:42;;;4499:64;;4464:19:41;553:1407:107;;;;;;;;;;;;;-1:-1:-1;553:1407:107;;;500:10:59;553:1407:107;-1:-1:-1;553:1407:107;500:10:59;;1880:140:41;;553:1407:107;;;1880:140:41;1973:36;553:1407:107;1973:36:41;553:1407:107;;;;;;;;;;;;-1:-1:-1;553:1407:107;;;;-1:-1:-1;553:1407:107;;;;;;;;;1973:36:41;;;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;;;1880:140;;;;553:1407:107;;;;;;;;;;;;;;;;2049:26:193;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;553:1407:107;;1857:1:13;553:1407:107;;;;10393:466:193;10453:14;;;;;10444:23;;;;:::i;:::-;553:1407:107;;;;;2418:9:195;553:1407:107;;;2396:12:195;553:1407:107;;2366:12:195;2418:9;:::i;:::-;-1:-1:-1;;;553:1407:107;;;10802:46:193;553:1407:107;;;;;;;;10732:7:193;553:1407:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;10802:46:193;;;10393:466;;;;;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;553:1407:107;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;;553:1407:107;;;16306:41:193;;:::i;:::-;553:1407:107;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;553:1407:107;3852:94:192;;3961:9;3972:10;;;;;;553:1407:107;;;3984:3:192;553:1407:107;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;553:1407:107;;;;4058:76:192;;4108:25;553:1407:107;4058:76:192;;553:1407:107;4058:76:192;;;;;;;;;;;;;;;;3984:3;4057:77;;4053:173;;4239:12;553:1407:107;4239:12:192;;;;;;:::i;:::-;553:1407:107;4284:11:192;;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;553:1407:107;4239:70:192;;;;;;553:1407:107;;;4239:70:192;;4277:4;553:1407:107;4239:70:192;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;4239:70:192;;;;;;;;553:1407:107;4239:70:192;;;3984:3;;;553:1407:107;3961:9:192;;4239:70;;;;:::i;:::-;;;;;;553:1407:107;;;;;;;;;;4239:70:192;553:1407:107;;;4053:173:192;4161:50;;;553:1407:107;;4058:76:192;4161:50;;4058:76;;;;;;;;;;;;;;;;;:::i;:::-;;;553:1407:107;;;;;;;:::i;:::-;4058:76:192;;;553:1407:107;;;;4058:76:192;;;-1:-1:-1;4058:76:192;;;553:1407:107;;;;;;;;;3852:94:192;553:1407:107;3920:26:192;;;;;3856:55;3886:25;;;;;3856:55;;4499:64:42;4538:25;;;;553:1407:107;;4538:25:42;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:36:195;553:1407:107;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;553:1407:107;;;;;;;;;;;;;;;;;;;;;;500:10:59;553:1407:107;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;553:1407:107;;;;;;500:10:59;;553:1407:107;;;;;;;;;;;;;;;;;;;;912:80:42;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;553:1407:107;16306:41:193;;:::i;:::-;553:1407:107;;;;;;;;;;;;;;;;;500:10:59;553:1407:107;;;500:10:59;;3741:25:41;3737:66;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;553:1407:107;;2455:33:41;553:1407:107;;3737:66:41;3775:28;553:1407:107;3775:28:41;553:1407:107;3775:28:41;;;;553:1407:107;;;;;3775:28:41;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;553:1407:107;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2081:25:193;553:1407:107;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;4464:19:41;553:1407:107;;;;;;;;;;;;;;;;500:10:59;553:1407:107;;;500:10:59;;3741:25:41;3737:66;;12172:11:193;;553:1407:107;;12225:13:193;;553:1407:107;;12321:14:193;553:1407:107;;;2570:213:20;;;;;553:1407:107;;;34863:71:21;;553:1407:107;;4365:21:193;;:::i;:::-;553:1407:107;;4419:15:193;553:1407:107;4400:15:193;:34;;;:54;;;553:1407:107;4396:195:193;;553:1407:107;4419:15:193;553:1407:107;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;553:1407:107;12664:22:193;;553:1407:107;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;553:1407:107;4419:15:193;553:1407:107;12551:1311:193;4400:15;13871:29;553:1407:107;;;;;;;;;;;13962:39:193;;553:1407:107;;12551:1311:193;553:1407:107;12795:10:193;553:1407:107;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;553:1407:107;;1859:6:20;;;;;;553:1407:107;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;553:1407:107;4400:15:193;13357:22;13286:40;553:1407:107;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;553:1407:107;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;553:1407:107;;;;;;;;13962:39:193;553:1407:107;12795:10:193;553:1407:107;4419:15:193;553:1407:107;12551:1311:193;;553:1407:107;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;553:1407:107;4396:195:193;;4400:54;553:1407:107;4438:11:193;553:1407:107;4438:16:193;;4400:54;;553:1407:107;;;;;;;;;;;;;;;;;;;;;3737:66:41;553:1407:107;3775:28:41;553:1407:107;3775:28:41;;;;553:1407:107;;;;;;3775:28:41;553:1407:107;;;;;;;;:::i;:::-;3393:34:197;;;;;;;3508:13;553:1407:107;;3393:34:197;3453:17;;;;;;;;;3619:31;;;;;3615:297;;3437:169;5148:19:42;;553:1407:107;;16306:41:193;;;:::i;:::-;553:1407:107;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;3437:169:197;2776:90:192;;2881:9;2892:10;;;;;;553:1407:107;;;2904:3:192;2923:9;2959:10;2923:9;;553:1407:107;2923:9:192;;;;:::i;:::-;2946:11;;;;;;:::i;:::-;2959:10;;;;;:::i;:::-;553:1407:107;2959:10:192;;:::i;:::-;553:1407:107;2881:9:192;;2780:51;2807:24;;;;;2780:51;;3615:297:197;553:1407:107;3688:38:197;553:1407:107;;;3688:38:197;;;;553:1407:107;3688:38:197;;3720:4;553:1407:107;3688:38:197;;553:1407:107;3688:38:197;;;;;;;;;;3615:297;3688:52;553:1407:107;;;;3688:52:197;;:::i;:::-;3758:40;;;;3754:148;3615:297;3754:148;3825:62;;;553:1407:107;;3688:38:197;553:1407:107;;3825:62:197;;3688:38;;553:1407:107;3688:38:197;;553:1407:107;3688:38:197;;;;;;553:1407:107;3688:38:197;;;:::i;:::-;;;553:1407:107;;;;3688:52:197;553:1407:107;;3688:38:197;;553:1407:107;;;;3688:38:197;;;-1:-1:-1;3688:38:197;;;553:1407:107;;;;;;;;;3472:3:197;3495:9;;553:1407:107;3495:9:197;;;;:::i;:::-;553:1407:107;3495:26:197;3491:105;;3472:3;553:1407:107;;3442:9:197;;3491:105;3571:10;3541:40;553:1407:107;3571:10:197;;;;;;:::i;:::-;553:1407:107;3541:40:197;;:::i;:::-;3491:105;;;;;553:1407:107;;;;;;;;;;;;;;:::i;:::-;;;16306:41:193;;;:::i;:::-;553:1407:107;;;;;4503:26:42;;;4499:64;;553:1407:107;;1638:12:195;553:1407:107;;;;;;;1621:29:195;;1617:137;;553:1407:107;;;1617:137:195;553:1407:107;;;;1638:12:195;553:1407:107;1713:30:195;;;;1617:137;;553:1407:107;;;4499:64:42;4538:25;;;;553:1407:107;;4538:25:42;;553:1407:107;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;697:27:195;553:1407:107;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1630:13:197;;;553:1407:107;;;1608:10:197;:36;1604:63;;553:1407:107;;;;;;1758:17:197;;553:1407:107;;1758:17:197;;;553:1407:107;1758:17:197;;:::i;:::-;553:1407:107;;1729:47:197;553:1407:107;1729:47:197;;553:1407:107;;;1729:47:197;553:1407:107;;;;;;;;;;;;;;:::i;:::-;1729:47:197;1758:17;1729:47;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;553:1407:107;;2488:36:197;;;553:1407:107;2488:36:197;553:1407:107;2488:36:197;;553:1407:107;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2548:27:197;;553:1407:107;;;;;2585:113:197;;;;553:1407:107;7650:16:193;;;553:1407:107;;;;7779:38:193;553:1407:107;7699:26:193;553:1407:107;;;;7699:26:193;:::i;:::-;553:1407:107;;;;;;;7735:6:193;553:1407:107;;;;;7735:29:193;553:1407:107;;;7735:29:193;:::i;:::-;553:1407:107;;7779:38:193;553:1407:107;;7779:38:193;;;;;:::i;:::-;;;;553:1407:107;;;;;;;;;;;;;;;2585:113:197;2675:11;2668:4;;;2675:11;;:::i;:::-;2585:113;;;;553:1407:107;;;;;;;;;;;;1604:63:197;553:1407:107;1653:14:197;;;;;553:1407:107;;;;;;;;;;;;16541:39:193;;:::i;:::-;553:1407:107;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;553:1407:107;;;;;;;4503:26:42;;;4499:64;;4464:19:41;553:1407:107;;;;;;;;;;;;;;;;;500:10:59;553:1407:107;;;500:10:59;;1254:25:41;1250:140;;553:1407:107;;;1250:140:41;1343:36;553:1407:107;1343:36:41;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;;;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;553:1407:107;;2094:39:197;;;553:1407:107;;2094:39:197;;553:1407:107;2059:4:197;553:1407:107;;;;;;;;;;;;;;:::i;2094:39:197:-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;553:1407:107;;2488:36:197;;;553:1407:107;2488:36:197;553:1407:107;2488:36:197;;553:1407:107;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2548:27:197;;553:1407:107;;;;;2585:113:197;;;553:1407:107;7650:16:193;;553:1407:107;;;;7779:38:193;553:1407:107;7699:26:193;553:1407:107;2059:4:197;553:1407:107;7699:26:193;:::i;:::-;2059:4:197;553:1407:107;;;;;;7735:6:193;553:1407:107;;;;;7735:29:193;553:1407:107;;;7735:29:193;:::i;:::-;553:1407:107;;7779:38:193;553:1407:107;;7779:38:193;;;;;:::i;:::-;;;;2059:4:197;553:1407:107;;;;;;;;;;;2585:113:197;2675:11;2668:4;;2621:13;;2675:11;:::i;:::-;2585:113;;553:1407:107;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;941:19:75;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;553:1407:107;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2466:103:13;;:::i;:::-;9425:6:193;;;:::i;:::-;553:1407:107;;;;;2982:35:197;;;553:1407:107;;;;;3027:13:197;3062:11;3027:13;;;3062:11;:::i;:::-;9520:16:193;;553:1407:107;;;;;;;;9596:6:193;553:1407:107;;;;;;9628:28:193;;;553:1407:107;;;;9889:44:193;553:1407:107;;;;;9596:6:193;553:1407:107;;;;;;;;9838:26:193;553:1407:107;;9838:26:193;553:1407:107;9889:44:193;553:1407:107;;9889:44:193;;;;;:::i;553:1407:107:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;740:37:197;553:1407:107;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;;;:::i;553:1407:107:-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;553:1407:107;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;553:1407:107;6009:97:193;5929:184;553:1407:107;;-1:-1:-1;553:1407:107;6010:6:193;553:1407:107;;6010:76:193;553:1407:107;-1:-1:-1;553:1407:107;;6029:56:193;:21;;:::i;:::-;553:1407:107;-1:-1:-1;553:1407:107;6053:23:193;553:1407:107;;;-1:-1:-1;553:1407:107;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;553:1407:107;-1:-1:-1;553:1407:107;6090:7:193;553:1407:107;;;-1:-1:-1;553:1407:107;;6009:97:193;;:::i;:::-;5929:184;:::o;553:1407:107:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;553:1407:107;;;;;-1:-1:-1;553:1407:107;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;5307:338:193;5407:11;553:1407:107;5432:23:193;;5428:86;;5530:108;553:1407:107;5559:78:193;5530:25;553:1407:107;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;553:1407:107;5561:40:193;;:::i;:::-;5605:10;553:1407:107;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;553:1407:107;5478:25:193;553:1407:107;5471:32:193;:::o;553:1407:107:-;;;;;;;;-1:-1:-1;;553:1407:107;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;1002:301:75:-;553:1407:107;1146:19:75;553:1407:107;1146:53:75;;;1142:96;;553:1407:107;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;553:1407:107;1215:12:75;:::o;553:1407:107:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;4919:231:193:-;5028:15;553:1407:107;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;1359:340:59:-;553:1407:107;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;553:1407:107;500:10:59;553:1407:107;500:10:59;;;;553:1407:107;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;553:1407:107;1528:12:59;:::o;553:1407:107:-;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;553:1407:107;4419:15:193;553:1407:107;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;553:1407:107;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;553:1407:107;-1:-1:-1;553:1407:107;4641:7:193;553:1407:107;;;-1:-1:-1;553:1407:107;;4337:49:193;553:1407:107;;-1:-1:-1;553:1407:107;4689:23:193;553:1407:107;;;-1:-1:-1;553:1407:107;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;553:1407:107;4396:195:193;;4400:54;553:1407:107;4438:11:193;553:1407:107;4438:16:193;;4400:54;;553:1407:107;;;;;;;;;;:::o;2575:307:13:-;1899:1;2702:7;553:1407:107;2702:18:13;2698:86;;1899:1;2702:7;553:1407:107;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;907:917:76;553:1407:107;1029:19:76;553:1407:107;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;553:1407:107;;;1676:74:76;;553:1407:107;;;1676:74:76;;;553:1407:107;1327:10:76;553:1407:107;;;;1744:4:76;553:1407:107;;;;;-1:-1:-1;1676:74:76;;553:1407:107;;;;;;1676:74:76;;;;;;;553:1407:107;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;;;:::i;:::-;;;553:1407:107;;;;;;;:::i;:::-;1676:74:76;;;;;;-1:-1:-1;1676:74:76;;;553:1407:107;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1219:160:8;1328:43;1219:160;553:1407:107;;;1328:43:8;553:1407:107;1328:43:8;;;;553:1407:107;1328:43:8;;;553:1407:107;;;;;;1328:43:8;;;;;;:::i;:::-;;:::i;:::-;1219:160::o;1618:188::-;553:1407:107;;;1745:53:8;;;;553:1407:107;;;;1745:53:8;;;553:1407:107;;;;;;;;;;;;;;;;;1745:53:8;;;;;;553:1407:107;;1745:53:8;:::i;1938:939:76:-;553:1407:107;2065:19:76;553:1407:107;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;553:1407:107;720:8:80;553:1407:107;720:8:80;;553:1407:107;;;;2115:1:76;2802:32;;:::o;2624:153::-;553:1407:107;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;553:1407:107;2361:10:76;553:1407:107;;;;2771:4:76;553:1407:107;;;;;-1:-1:-1;2682:95:76;;553:1407:107;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;;;:::i;:::-;;;553:1407:107;;;;;;;:::i;:::-;2682:95:76;;;;;;-1:-1:-1;2682:95:76;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;8370:720:8;;-1:-1:-1;8507:421:8;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:8;;8942:15;;553:1407:107;;;;8960:26:8;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;553:1407:107;9033:40:8;;-1:-1:-1;9033:40:8;553:1407:107;9033:40:8;553:1407:107;;-1:-1:-1;9033:40:8;8942:68;9009:1;8994:16;;8942:68;"},"gasEstimates":{"creation":{"codeDepositCost":"2326000","executionCost":"infinite","totalCost":"infinite"},"external":{"REWARDER_ROLE()":"567","REWARD_TOKEN()":"infinite","SCALING_FACTOR()":"infinite","STAKING_TOKEN()":"infinite","__msgData()":"infinite","addReward(uint256,uint256)":"infinite","claim(bytes)":"infinite","distributionEnd()":"2956","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2944","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2684","lastUpdated()":"2890","onERC20Received(address,address,uint256,bytes)":"infinite","owner()":"2722","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardHolder()":"2500","rewardPerStakePoint()":"11162","rewardPerStakePointPaid(address)":"2973","rewardPerStakePointStored()":"2802","rewardRate()":"2604","rewards(address)":"2445","setRewardHolder(address)":"infinite","stake(bytes)":"infinite","staked(address)":"2885","supportsInterface(bytes4)":"2463","totalStaked()":"2648","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","REWARD_TOKEN()":"99248ea7","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","__msgData()":"31e66e1e","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC20Received(address,address,uint256,bytes)":"4fc35859","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardHolder()":"569c93d2","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","setRewardHolder(address)":"6806cc93","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"stakingToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recoverable\",\"type\":\"uint256\"}],\"name\":\"InvalidRecoveryAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"}],\"name\":\"RewardHolderSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC20Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardHolder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardHolder_\",\"type\":\"address\"}],\"name\":\"setRewardHolder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC20Received(address,address,uint256,bytes)\":{\"details\":\"Reverts  with {InvalidToken} if the sender is not the staking token.\",\"params\":{\"from\":\"The address of the sender.\",\"value\":\"The amount of tokens received.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"setRewardHolder(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.\",\"params\":{\"rewardHolder_\":\"The address of the reward holder.\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as (uint256 value)\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC20Received(address,address,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"setRewardHolder(address)\":{\"notice\":\"Sets the reward holder address.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol\":\"ERC20StakingERC20RewardsLinearPoolMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {ERC20StakingLinearPool} from \\\"./../../../staking/linear/stake/ERC20StakingLinearPool.sol\\\";\\nimport {LinearPool_ERC20Rewards} from \\\"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract ERC20StakingERC20RewardsLinearPoolMock is ERC20StakingLinearPool, LinearPool_ERC20Rewards {\\n    constructor(\\n        IERC20 stakingToken,\\n        IERC20 rewardToken,\\n        address rewardHolder,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\\n\\n    function _computeClaim(\\n        address staker,\\n        uint256 claimable,\\n        bytes calldata claimData\\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\\n        return LinearPool._msgSender();\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\\n        return LinearPool._msgData();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd08af7b8a1e172b252b8e9ecf35e5ae4ec522a1fb99a679c93a8a22856c983c5\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/// @title LinearPool_ERC20Rewards\\n/// @notice A linear pool that allows for ERC20 rewards distribution.\\n// solhint-disable-next-line contract-name-capwords\\nabstract contract LinearPool_ERC20Rewards is ContractOwnership {\\n    using SafeERC20 for IERC20;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    IERC20 public immutable REWARD_TOKEN;\\n\\n    address public rewardHolder;\\n\\n    event RewardHolderSet(address indexed rewardHolder);\\n\\n    /// @dev Emits a {RewardHolderSet} event with the initial reward holder address.\\n    /// @param rewardToken The ERC20 token used for rewards.\\n    /// @param rewardHolder_ The address that holds the rewards.\\n    constructor(IERC20 rewardToken, address rewardHolder_) {\\n        REWARD_TOKEN = rewardToken;\\n        rewardHolder = rewardHolder_;\\n        emit RewardHolderSet(rewardHolder_);\\n    }\\n\\n    /// @notice Sets the reward holder address.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\\n    /// @param rewardHolder_ The address of the reward holder.\\n    function setRewardHolder(address rewardHolder_) external {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        if (rewardHolder_ != rewardHolder) {\\n            rewardHolder = rewardHolder_;\\n            emit RewardHolderSet(rewardHolder_);\\n        }\\n    }\\n\\n    /// @notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\\n    /// @param staker The address of the staker.\\n    /// @param claimable The amount of REWARD_TOKEN to be transferred.\\n    /// @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\\n    /// @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0.\\n    function _computeClaim(address staker, uint256 claimable, bytes calldata) internal virtual returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 0;\\n        REWARD_TOKEN.safeTransferFrom(rewardHolder, staker, claimable);\\n    }\\n\\n    /// @notice Computes the reward for a staker.\\n    /// @dev This function is empty since the rewards do not need to be transferred to this contract.\\n    function _computeAddReward(address, uint256) internal virtual {}\\n}\\n\",\"keccak256\":\"0x0c8dc711b3c8cb7f9ea2a1e8f6f956c821b0d7b56fe7a6839b5dfe3874c436ad\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC20StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC20Receiver} from \\\"./../../../token/ERC20/ERC20Receiver.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n/// @title ERC20StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC20 tokens.\\n/// @notice WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens.\\nabstract contract ERC20StakingLinearPool is LinearPool, ERC20Receiver {\\n    using SafeERC20 for IERC20;\\n\\n    IERC20 public immutable STAKING_TOKEN;\\n\\n    error InvalidToken();\\n    error InvalidRecoveryAmount(uint256 requested, uint256 recoverable);\\n\\n    constructor(\\n        IERC20 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\\n    /// @dev Reverts  with {InvalidToken} if the sender is not the staking token.\\n    /// @param from The address of the sender.\\n    /// @param value The amount of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC20Received(address, address from, uint256 value, bytes calldata) external virtual override returns (bytes4) {\\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n        bool requiresTransfer = false;\\n        _stake(from, abi.encode(requiresTransfer, abi.encode(value)));\\n        return this.onERC20Received.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (uint256 value)\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes data) where data is (uint256 value).\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        stakePoints = abi.decode(data, (uint256));\\n        if (requiresTransfer) {\\n            STAKING_TOKEN.safeTransferFrom(staker, address(this), stakePoints);\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param withdrawData The data to be used for withdrawing, encoded as (uint256 value)\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(withdrawData, (uint256));\\n        STAKING_TOKEN.safeTransfer(staker, stakePoints);\\n    }\\n\\n    /// @inheritdoc TokenRecoveryBase\\n    /// @dev Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual override {\\n        uint256 stakingTokenRecoveryAmount;\\n        for (uint256 i; i < tokens.length; ++i) {\\n            if (tokens[i] == STAKING_TOKEN) {\\n                stakingTokenRecoveryAmount += amounts[i];\\n            }\\n        }\\n        if (stakingTokenRecoveryAmount != 0) {\\n            uint256 recoverable = STAKING_TOKEN.balanceOf(address(this)) - totalStaked;\\n            if (stakingTokenRecoveryAmount > recoverable) {\\n                revert InvalidRecoveryAmount(stakingTokenRecoveryAmount, recoverable);\\n            }\\n        }\\n        super.recoverERC20s(accounts, tokens, amounts);\\n    }\\n}\\n\",\"keccak256\":\"0xfc584f2099066de626d70905a101ebef7d59dbdc610781ad1c4125a3f9c09264\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Receiver} from \\\"./interfaces/IERC20Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Receiver is IERC20Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xfcf1a39ddedf6c5bc3fa134f389b98cdb17d33df14903239fe0e1c7120ec7c16\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"},{"astId":21081,"contract":"contracts/mocks/staking/linear/ERC20StakingERC20RewardsLinearPoolMock.sol:ERC20StakingERC20RewardsLinearPoolMock","label":"rewardHolder","offset":0,"slot":"9","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC20Received(address,address,uint256,bytes)":{"notice":"Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"setRewardHolder(address)":{"notice":"Sets the reward holder address."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol":{"ERC721StakingERC20RewardsLinearPoolMock":{"abi":[{"inputs":[{"internalType":"contract IERC721","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"address","name":"rewardHolder","type":"address"},{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"InvalidRecoveryToken","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"NotTheTokenOwner","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardHolder","type":"address"}],"name":"RewardHolderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardHolder_","type":"address"}],"name":"setRewardHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":"tokenId","type":"uint256"}],"name":"tokenOwners","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC721Received(address,address,uint256,bytes)":{"details":"Reverts with {InvalidToken} if the sender is not the staking token.","params":{"from":"The address of the sender.","tokenId":"The ID of the token received."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"setRewardHolder(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.","params":{"rewardHolder_":"The address of the reward holder."}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as   (bool batch, uint256 tokenId) where batch is false, or   (bool batch, uint256[] tokenIds) where batch is true."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"6101003461027357601f61385138819003918201601f19168301916001600160401b038311848410176102785780849260a0946040528339810103126102735780516001600160a01b0381168103610273576020820151906001600160a01b03821682036102735760408301516001600160a01b03811693908490036102735760608101519060ff82168092036102735760800151906001600160a01b03821682036102735733610214575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d916307f5828d60e41b600052826020526040600020600160ff198254161790556001600055608052604d81101561020357604d81116101ed57600a0a60a052630a85bd0160e11b6000526020526040600020600160ff1982541617905560c05260e0528060018060a01b0319600a541617600a55604051907f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d29600080a26135c2908161028f823960805181818161200701528181612eb50152818161326801526133b7015260a0518181816105c2015281816108560152611316015260c051818181610a6c01528181611c7601528181611edb015281816120a6015281816125c00152818161288e01526129f1015260e0518181816108f20152610e4c0152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100ab565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c80628cc26214612a7d57806301ffc9a714612a155780630479d644146129a65780630700037d146129435780630968f264146124d5578063150b7a021461202b5780632b4c9f1614611fbc5780632c9d0b8014611f835780632d1e0c0214611af55780632f2ff15d1461194d57806331e66e1e146118fb578063569c93d2146118a9578063572b6c051461185d5780636806cc931461174c57806373c8a9581461161057806375c93bb9146112585780637b0a47ee1461121c57806380faa57d146111db578063817b1cd21461119f5780638580cf76146111465780638bb9c5bf14610fdc5780638da5cb5b14610f6a57806391d1485414610ed357806398807d8414610e7057806399248ea714610e015780639d696e3614610dc5578063c3666c3614610a54578063c5c8f770146109f1578063c63ff8dd146107d0578063d0b06f5d14610794578063d547741f146105e5578063ef4cadc51461058c578063efa90b5414610550578063f2fde38b1461042a578063f7ba94bd146102085763f8a14f46146101a857600080fd5b346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260098452205416604051908152f35b80fd5b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657610258903690600401612b77565b60243567ffffffffffffffff811161042257610278903690600401612b77565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102b9613251565b92541691169081036103f557508181036103cd57845b8181106102da578580f35b6102e5818387612f3c565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103c95761030f828587612f3c565b3590814710610399578780809381935af13d15610391573d9061033182612d7f565b9161033f6040519384612d0f565b82523d88602084013e5b1561035757506001016102cf565b80518790156103695750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b606090610349565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b5080fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557610462612abf565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061048c613251565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610525575073ffffffffffffffffffffffffffffffffffffffff16918282036104d2578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600554604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435610620612ae7565b610628613251565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036103f557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166106da578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b93610789918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600254604051908152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657610820903690600401612b0a565b919061082a6130ec565b610832613251565b9061083c82613067565b61084582612ca5565b9384610854575b836001815580f35b7f000000000000000000000000000000000000000000000000000000000000000061087f8187612e1f565b9080156109c457600a546040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9182166024820152908616604482015260648082018490528152610916906108f0608482612d0f565b7f0000000000000000000000000000000000000000000000000000000000000000613501565b856109975760009606939573ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca959697169586825260076020526040822055610980604051948594606086526060860191612b38565b91602084015260408301520390a28038808061084c565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff610a43612abf565b168152600883522054604051908152f35b503461020557610a6336612ba8565b929490939092917f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16875b828103610d285750507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610aeb613251565b92541691169081036103f55750808214801590610d1e575b610cf657865b828110610b14578780f35b73ffffffffffffffffffffffffffffffffffffffff610b3c610b3783858b612f3c565b612f7b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ceb578a91610cae575b5015610c8357508773ffffffffffffffffffffffffffffffffffffffff610bcb610b3784868c612f3c565b16610bda610b3784878a612f3c565b610be584888b612f3c565b35823b15610422576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529082908290606490829084905af18015610c7857610c5f575b5050600101610b09565b81610c6991612d0f565b610c74578738610c55565b8780fd5b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610ce3575b81610cc860209383612d0f565b81010312610cdf57610cd990613127565b38610ba0565b8980fd5b3d9150610cbb565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415610b03565b8173ffffffffffffffffffffffffffffffffffffffff610d4c610b3784878d612f3c565b1614610d61575b610d5c90612f0f565b610aa3565b610d6c818689612f3c565b35808a52600960205273ffffffffffffffffffffffffffffffffffffffff60408b205416610d9a5750610d53565b7f38c4e116000000000000000000000000000000000000000000000000000000008a52600452602489fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600454604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff610ec2612abf565b168152600683522054604051908152f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055773ffffffffffffffffffffffffffffffffffffffff6040610f22612ae7565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611039613251565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611100578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600154604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612efd565b604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435602435611291613251565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156115aa57821561158257801561155a577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156115325761134e612e58565b6004556005544210801590611527575b611517575b600554906113718342612c98565b914281116113da5750928273ffffffffffffffffffffffffffffffffffffffff926113bf6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497612e1f565b6003556005555b42600255835195865260208601521692a280f35b916003939193546113f46113ee4286612c3b565b82612c77565b850194851094851502946114ef57838211611463575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749260409261145b61145473ffffffffffffffffffffffffffffffffffffffff944290612c3b565b8092612e1f565b6003556113c6565b916114719193508094612e1f565b908082106114c157509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556113c6565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61151f612efd565b600255611363565b50600154151561135e565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346102055761161f36612ba8565b92939186959195507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611666613251565b92541691169081036103f55750808314801590611742575b610cf657865b83811061168f578780f35b61169a818388612f3c565b359073ffffffffffffffffffffffffffffffffffffffff8216820361173e576117386001926116cd610b37848989612f3c565b906116d9848a8d612f3c565b3573ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252611733606483612d0f565b613501565b01611684565b8880fd5b508383141561167e565b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557611784612abf565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806117c3613251565b92541691169081036103f5575073ffffffffffffffffffffffffffffffffffffffff600a5491169073ffffffffffffffffffffffffffffffffffffffff8116820361180c578280f35b7fffffffffffffffffffffffff0000000000000000000000000000000000000000168117600a557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602061189f61189a612abf565b612e9e565b6040519015158152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576119326133a0565b611949604051928392602084526020840191612b38565b0390f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435611988612ae7565b611990613251565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036103f557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611a43578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d93610789918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657611b40903690600401612b0a565b611b48613251565b60405192611b9b84611b6f6020820193600185526040830196604088526060840191612b38565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612d0f565b611ba36130ec565b611bac82613067565b84928451850191604086602085019403126103c957611bca90613127565b905167ffffffffffffffff81116103c95785019082603f830112156103c957602082015191611bf883612d7f565b92611c066040519485612d0f565b80845260208401946040838301011161173e57846040611c269301612db9565b868251830160208482031261042657611c3e85613127565b15611e565750505090602082611c5793510101906131a9565b905084815191819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169073ffffffffffffffffffffffffffffffffffffffff8616925b858103611d67575050505050505b8115611d3f579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611d0883600154612c98565b6001551692838552600660205260408520611d24838254612c98565b9055611d356040519283928361304b565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611daf611d74828461323d565b5198898752600960205260408720867fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612c8a565b97833b15611e52576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891660048201523060248201526044810191909152858160648183885af1908115611e47578691611e2e575b5050611e2990612f0f565b611cb0565b81611e3891612d0f565b611e43578438611e1e565b8480fd5b6040513d88823e3d90fd5b8580fd5b60209194929650611e6993500190613134565b809150825260096020526040822073ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600193611ec4575b5050611cbe565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15611f7f576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152306024820152604481019290925282908290606490829084905af18015610c785715611ebd5781611f7491612d0f565b610422578338611ebd565b8280fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612e58565b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557612063612abf565b5061206c612ae7565b9060643567ffffffffffffffff81116104265761208d903690600401612b0a565b505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168033036124ad57604051928260208501526044356040850152604084526120ee606085612d0f565b604051916020830184815261211384611b6f604082019860408a526060830190612ddc565b61211b6130ec565b61212483613067565b84958451850191604086602085019403126103c95761214290613127565b905167ffffffffffffffff81116103c95785019082603f830112156103c957602082015161216f81612d7f565b9261217d6040519485612d0f565b81845260208401946040828401011161173e579084604061219e9301612db9565b81518201602083820312610c74576121b584613127565b156123ad575050906020826121cd93510101906131a9565b80519273ffffffffffffffffffffffffffffffffffffffff8516925090865b8481036122c65750505050505b831561229e578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e926122446001978854612c98565b8755169283855260066020526040852061225f838254612c98565b90556122706040519283928361304b565b0390a25560206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b61230e6122d3828461323d565b51998a8a52600960205260408a20867fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612c8a565b98833b1561173e576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201523060248201526044810191909152888160648183885af180156123a25790899161238d575b505061238890612f0f565b6121ec565b8161239791612d0f565b610c7457873861237d565b6040513d8b823e3d90fd5b60209198506123bf9392500190613134565b809150855260096020526040852073ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560019561241a575b50506121f9565b813b15611e43576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015230602482015260448101919091529084908290606490829084905af180156124a25790849115612413578161249791612d0f565b611f7f578238612413565b6040513d86823e3d90fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657612525903690600401612b0a565b61252d613251565b8361253783612d7f565b936125456040519586612d0f565b83855260208501933681830111611f7f57806020928637850101526125686130ec565b61257181613067565b839183518401602085820312611e525761258a82613127565b156127e957506125a19060208551860101906131a9565b905084815191819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169073ffffffffffffffffffffffffffffffffffffffff8616925b8581036126df575050505050505b81156126b75773ffffffffffffffffffffffffffffffffffffffff1691828452600660205260408420548281106126835790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611d356040519283928361304b565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b6127556126ec828461323d565b5198898752600960205261271e73ffffffffffffffffffffffffffffffffffffffff6040892054168b8b828a14613151565b8987526009602052604087207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055612c8a565b97833b15611e52576040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff891660248201526044810191909152858160648183885af1908115611e475786916127d4575b50506127cf90612f0f565b6125fa565b816127de91612d0f565b611e435784386127c4565b6127f892935060200190613134565b809291508452600960205261284173ffffffffffffffffffffffffffffffffffffffff60408620541683838273ffffffffffffffffffffffffffffffffffffffff821614613151565b8184526009602052604084207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558360019273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690813b15611f7f576040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff85166024820152604481019190915291908290606490829084905af1801561293857612924575b50612608565b8461293191959295612d0f565b923861291e565b6040513d87823e3d90fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff612995612abf565b168152600783522054604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361020557602061189f83612f9c565b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612aba612abf565b612ca5565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612ae257565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203612ae257565b9181601f84011215612ae25782359167ffffffffffffffff8311612ae25760208381860195010111612ae257565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215612ae25782359167ffffffffffffffff8311612ae2576020808501948460051b010111612ae257565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112612ae25760043567ffffffffffffffff8111612ae25781612bf191600401612b77565b9290929160243567ffffffffffffffff8111612ae25781612c1491600401612b77565b929092916044359067ffffffffffffffff8211612ae257612c3791600401612b77565b9091565b91908203918211612c4857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810292918115918404141715612c4857565b9060018201809211612c4857565b91908201809211612c4857565b73ffffffffffffffffffffffffffffffffffffffff612d0c9116806000526006602052612cf7604060002054612cf1612cdc612e58565b84600052600860205260406000205490612c3b565b90612c77565b90600052600760205260406000205490612c98565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612d5057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612d5057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612dcc5750506000910152565b8181015183820152602001612dbc565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612e1881518092818752878088019101612db9565b0116010190565b8115612e29570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015612e9757612d0c90612e9160045491612e8c612e83612e7a612efd565b60025490612c3b565b60035490612c77565b612e1f565b90612c98565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612ef65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014612d0c57504290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612c485760010190565b9190811015612f4c5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612ae25790565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613045577f01ffc9a700000000000000000000000000000000000000000000000000000000811461303f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b929190613062602091604086526040860190612ddc565b930152565b61306f612e58565b60045560055442108015906130e1575b6130d1575b73ffffffffffffffffffffffffffffffffffffffff811690816130a5575050565b6130ae90612ca5565b816000526007602052604060002055600454906000526008602052604060002055565b6130d9612efd565b600255613084565b50600154151561307f565b6002600054146130fd576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b51908115158203612ae257565b9190826040910312612ae257602061314b83613127565b92015190565b1561315b57505050565b73ffffffffffffffffffffffffffffffffffffffff935083907f964ebadd00000000000000000000000000000000000000000000000000000000600052166004526024521660445260646000fd5b9190604083820312612ae2576131be83613127565b9260208101519067ffffffffffffffff8211612ae257019080601f83011215612ae25781519167ffffffffffffffff8311612d50578260051b90604051936132096020840186612d0f565b8452602080850192820101928311612ae257602001905b82821061322d5750505090565b8151815260209182019101613220565b8051821015612f4c5760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613391573233148015613396575b613391577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156132d9575b50612d0c57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156133855760009161334b575b50386132cf565b90506020813d60201161337d575b8161336660209383612d0f565b81010312612ae25761337790613127565b38613344565b3d9150613359565b6040513d6000823e3d90fd5b503390565b5060183610613298565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156134ef5732331480156134f7575b6134ef57803314908115613433575b50613402576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211612ae25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115613385576000916134b5575b50386133f6565b90506020813d6020116134e7575b816134d060209383612d0f565b81010312612ae2576134e190613127565b386134ae565b3d91506134c3565b506000903690565b50601836106133e7565b906000602091828151910182855af115613385576000513d613583575073ffffffffffffffffffffffffffffffffffffffff81163b155b61353f5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6001141561353856fea264697066735822122097c315d55a106cb221950b168ed0604a66be171153fc5d2e2e6a1d37a0f5973664736f6c634300081e0033","opcodes":"PUSH2 0x100 CALLVALUE PUSH2 0x273 JUMPI PUSH1 0x1F PUSH2 0x3851 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x278 JUMPI DUP1 DUP5 SWAP3 PUSH1 0xA0 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x273 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x273 JUMPI PUSH1 0x20 DUP3 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x273 JUMPI PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP4 SWAP1 DUP5 SWAP1 SUB PUSH2 0x273 JUMPI PUSH1 0x60 DUP2 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x273 JUMPI PUSH1 0x80 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x273 JUMPI CALLER PUSH2 0x214 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D SWAP2 PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x0 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x203 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x1ED JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0xC0 MSTORE PUSH1 0xE0 MSTORE DUP1 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB NOT PUSH1 0xA SLOAD AND OR PUSH1 0xA SSTORE PUSH1 0x40 MLOAD SWAP1 PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 PUSH1 0x0 DUP1 LOG2 PUSH2 0x35C2 SWAP1 DUP2 PUSH2 0x28F DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2007 ADD MSTORE DUP2 DUP2 PUSH2 0x2EB5 ADD MSTORE DUP2 DUP2 PUSH2 0x3268 ADD MSTORE PUSH2 0x33B7 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x5C2 ADD MSTORE DUP2 DUP2 PUSH2 0x856 ADD MSTORE PUSH2 0x1316 ADD MSTORE PUSH1 0xC0 MLOAD DUP2 DUP2 DUP2 PUSH2 0xA6C ADD MSTORE DUP2 DUP2 PUSH2 0x1C76 ADD MSTORE DUP2 DUP2 PUSH2 0x1EDB ADD MSTORE DUP2 DUP2 PUSH2 0x20A6 ADD MSTORE DUP2 DUP2 PUSH2 0x25C0 ADD MSTORE DUP2 DUP2 PUSH2 0x288E ADD MSTORE PUSH2 0x29F1 ADD MSTORE PUSH1 0xE0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x8F2 ADD MSTORE PUSH2 0xE4C ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xAB JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x2A7D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2A15 JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x29A6 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2943 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x24D5 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x202B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1FBC JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1F83 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1AF5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x194D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x18FB JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x18A9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x185D JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x174C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1610 JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1258 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x121C JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x11DB JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0x119F JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0x1146 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xFDC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xF6A JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xED3 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xE70 JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0xE01 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xDC5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA54 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x7D0 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x794 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x550 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0xF7BA94BD EQ PUSH2 0x208 JUMPI PUSH4 0xF8A14F46 EQ PUSH2 0x1A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x9 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x258 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x422 JUMPI PUSH2 0x278 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2B9 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP2 DUP2 SUB PUSH2 0x3CD JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DA JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x2E5 DUP2 DUP4 DUP8 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x3C9 JUMPI PUSH2 0x30F DUP3 DUP6 DUP8 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x399 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x391 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x331 DUP3 PUSH2 0x2D7F JUMP JUMPDEST SWAP2 PUSH2 0x33F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2D0F JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x357 JUMPI POP PUSH1 0x1 ADD PUSH2 0x2CF JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x369 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x349 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x462 PUSH2 0x2ABF JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x48C PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x525 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4D2 JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x620 PUSH2 0x2AE7 JUMP JUMPDEST PUSH2 0x628 PUSH2 0x3251 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x6DA JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x789 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x820 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x82A PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x832 PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH2 0x83C DUP3 PUSH2 0x3067 JUMP JUMPDEST PUSH2 0x845 DUP3 PUSH2 0x2CA5 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0x854 JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0x87F DUP2 DUP8 PUSH2 0x2E1F JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0x9C4 JUMPI PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 DUP7 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP2 MSTORE PUSH2 0x916 SWAP1 PUSH2 0x8F0 PUSH1 0x84 DUP3 PUSH2 0x2D0F JUMP JUMPDEST PUSH32 0x0 PUSH2 0x3501 JUMP JUMPDEST DUP6 PUSH2 0x997 JUMPI PUSH1 0x0 SWAP7 MOD SWAP4 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 SWAP7 SWAP8 AND SWAP6 DUP7 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0x980 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0x84C JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA43 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH2 0xA63 CALLDATASIZE PUSH2 0x2BA8 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 JUMPDEST DUP3 DUP2 SUB PUSH2 0xD28 JUMPI POP POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xAEB PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xD1E JUMPI JUMPDEST PUSH2 0xCF6 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0xB14 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB3C PUSH2 0xB37 DUP4 DUP6 DUP12 PUSH2 0x2F3C JUMP JUMPDEST PUSH2 0x2F7B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCEB JUMPI DUP11 SWAP2 PUSH2 0xCAE JUMPI JUMPDEST POP ISZERO PUSH2 0xC83 JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xBCB PUSH2 0xB37 DUP5 DUP7 DUP13 PUSH2 0x2F3C JUMP JUMPDEST AND PUSH2 0xBDA PUSH2 0xB37 DUP5 DUP8 DUP11 PUSH2 0x2F3C JUMP JUMPDEST PUSH2 0xBE5 DUP5 DUP9 DUP12 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x422 JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0xC78 JUMPI PUSH2 0xC5F JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xB09 JUMP JUMPDEST DUP2 PUSH2 0xC69 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0xC74 JUMPI DUP8 CODESIZE PUSH2 0xC55 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0xCE3 JUMPI JUMPDEST DUP2 PUSH2 0xCC8 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCDF JUMPI PUSH2 0xCD9 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0xBA0 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xCBB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xB03 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD4C PUSH2 0xB37 DUP5 DUP8 DUP14 PUSH2 0x2F3C JUMP JUMPDEST AND EQ PUSH2 0xD61 JUMPI JUMPDEST PUSH2 0xD5C SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0xAA3 JUMP JUMPDEST PUSH2 0xD6C DUP2 DUP7 DUP10 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD DUP1 DUP11 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP12 KECCAK256 SLOAD AND PUSH2 0xD9A JUMPI POP PUSH2 0xD53 JUMP JUMPDEST PUSH32 0x38C4E11600000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP10 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xEC2 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0xF22 PUSH2 0x2AE7 JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1039 PUSH2 0x3251 JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1100 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1291 PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x15AA JUMPI DUP3 ISZERO PUSH2 0x1582 JUMPI DUP1 ISZERO PUSH2 0x155A JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x1532 JUMPI PUSH2 0x134E PUSH2 0x2E58 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1527 JUMPI JUMPDEST PUSH2 0x1517 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1371 DUP4 TIMESTAMP PUSH2 0x2C98 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x13DA JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x13BF PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x13F4 PUSH2 0x13EE TIMESTAMP DUP7 PUSH2 0x2C3B JUMP JUMPDEST DUP3 PUSH2 0x2C77 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x14EF JUMPI DUP4 DUP3 GT PUSH2 0x1463 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x145B PUSH2 0x1454 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2C3B JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x13C6 JUMP JUMPDEST SWAP2 PUSH2 0x1471 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x2E1F JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x14C1 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x13C6 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x151F PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1363 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x135E JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH2 0x161F CALLDATASIZE PUSH2 0x2BA8 JUMP JUMPDEST SWAP3 SWAP4 SWAP2 DUP7 SWAP6 SWAP2 SWAP6 POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1666 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1742 JUMPI JUMPDEST PUSH2 0xCF6 JUMPI DUP7 JUMPDEST DUP4 DUP2 LT PUSH2 0x168F JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH2 0x169A DUP2 DUP4 DUP9 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x173E JUMPI PUSH2 0x1738 PUSH1 0x1 SWAP3 PUSH2 0x16CD PUSH2 0xB37 DUP5 DUP10 DUP10 PUSH2 0x2F3C JUMP JUMPDEST SWAP1 PUSH2 0x16D9 DUP5 DUP11 DUP14 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x1733 PUSH1 0x64 DUP4 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x3501 JUMP JUMPDEST ADD PUSH2 0x1684 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST POP DUP4 DUP4 EQ ISZERO PUSH2 0x167E JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x1784 PUSH2 0x2ABF JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x17C3 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x180C JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0xA SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x189F PUSH2 0x189A PUSH2 0x2ABF JUMP JUMPDEST PUSH2 0x2E9E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x1932 PUSH2 0x33A0 JUMP JUMPDEST PUSH2 0x1949 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1988 PUSH2 0x2AE7 JUMP JUMPDEST PUSH2 0x1990 PUSH2 0x3251 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1A43 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x789 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x1B40 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST PUSH2 0x1B48 PUSH2 0x3251 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x1B9B DUP5 PUSH2 0x1B6F PUSH1 0x20 DUP3 ADD SWAP4 PUSH1 0x1 DUP6 MSTORE PUSH1 0x40 DUP4 ADD SWAP7 PUSH1 0x40 DUP9 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1BA3 PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x1BAC DUP3 PUSH2 0x3067 JUMP JUMPDEST DUP5 SWAP3 DUP5 MLOAD DUP6 ADD SWAP2 PUSH1 0x40 DUP7 PUSH1 0x20 DUP6 ADD SWAP5 SUB SLT PUSH2 0x3C9 JUMPI PUSH2 0x1BCA SWAP1 PUSH2 0x3127 JUMP JUMPDEST SWAP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3C9 JUMPI DUP6 ADD SWAP1 DUP3 PUSH1 0x3F DUP4 ADD SLT ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x20 DUP3 ADD MLOAD SWAP2 PUSH2 0x1BF8 DUP4 PUSH2 0x2D7F JUMP JUMPDEST SWAP3 PUSH2 0x1C06 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2D0F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0x173E JUMPI DUP5 PUSH1 0x40 PUSH2 0x1C26 SWAP4 ADD PUSH2 0x2DB9 JUMP JUMPDEST DUP7 DUP3 MLOAD DUP4 ADD PUSH1 0x20 DUP5 DUP3 SUB SLT PUSH2 0x426 JUMPI PUSH2 0x1C3E DUP6 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x1E56 JUMPI POP POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x1C57 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 MLOAD SWAP2 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 JUMPDEST DUP6 DUP2 SUB PUSH2 0x1D67 JUMPI POP POP POP POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x1D3F JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1D08 DUP4 PUSH1 0x1 SLOAD PUSH2 0x2C98 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1D24 DUP4 DUP3 SLOAD PUSH2 0x2C98 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1D35 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1DAF PUSH2 0x1D74 DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP9 DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP8 DUP4 EXTCODESIZE ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP6 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1E47 JUMPI DUP7 SWAP2 PUSH2 0x1E2E JUMPI JUMPDEST POP POP PUSH2 0x1E29 SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x1CB0 JUMP JUMPDEST DUP2 PUSH2 0x1E38 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1E43 JUMPI DUP5 CODESIZE PUSH2 0x1E1E JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP9 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP5 SWAP3 SWAP7 POP PUSH2 0x1E69 SWAP4 POP ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP2 POP DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 SWAP4 PUSH2 0x1EC4 JUMPI JUMPDEST POP POP PUSH2 0x1CBE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x1F7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0xC78 JUMPI ISZERO PUSH2 0x1EBD JUMPI DUP2 PUSH2 0x1F74 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x422 JUMPI DUP4 CODESIZE PUSH2 0x1EBD JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2E58 JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x2063 PUSH2 0x2ABF JUMP JUMPDEST POP PUSH2 0x206C PUSH2 0x2AE7 JUMP JUMPDEST SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x208D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 CALLER SUB PUSH2 0x24AD JUMPI PUSH1 0x40 MLOAD SWAP3 DUP3 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x40 DUP5 MSTORE PUSH2 0x20EE PUSH1 0x60 DUP6 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD DUP5 DUP2 MSTORE PUSH2 0x2113 DUP5 PUSH2 0x1B6F PUSH1 0x40 DUP3 ADD SWAP9 PUSH1 0x40 DUP11 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2DDC JUMP JUMPDEST PUSH2 0x211B PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x2124 DUP4 PUSH2 0x3067 JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP2 PUSH1 0x40 DUP7 PUSH1 0x20 DUP6 ADD SWAP5 SUB SLT PUSH2 0x3C9 JUMPI PUSH2 0x2142 SWAP1 PUSH2 0x3127 JUMP JUMPDEST SWAP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3C9 JUMPI DUP6 ADD SWAP1 DUP3 PUSH1 0x3F DUP4 ADD SLT ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x216F DUP2 PUSH2 0x2D7F JUMP JUMPDEST SWAP3 PUSH2 0x217D PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2D0F JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0x173E JUMPI SWAP1 DUP5 PUSH1 0x40 PUSH2 0x219E SWAP4 ADD PUSH2 0x2DB9 JUMP JUMPDEST DUP2 MLOAD DUP3 ADD PUSH1 0x20 DUP4 DUP3 SUB SLT PUSH2 0xC74 JUMPI PUSH2 0x21B5 DUP5 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x23AD JUMPI POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x21CD SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST DUP1 MLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP3 POP SWAP1 DUP7 JUMPDEST DUP5 DUP2 SUB PUSH2 0x22C6 JUMPI POP POP POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x229E JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x2244 PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x2C98 JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x225F DUP4 DUP3 SLOAD PUSH2 0x2C98 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x2270 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x230E PUSH2 0x22D3 DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP10 DUP11 DUP11 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP9 DUP4 EXTCODESIZE ISZERO PUSH2 0x173E JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL DUP1 ISZERO PUSH2 0x23A2 JUMPI SWAP1 DUP10 SWAP2 PUSH2 0x238D JUMPI JUMPDEST POP POP PUSH2 0x2388 SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x21EC JUMP JUMPDEST DUP2 PUSH2 0x2397 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0xC74 JUMPI DUP8 CODESIZE PUSH2 0x237D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP12 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP9 POP PUSH2 0x23BF SWAP4 SWAP3 POP ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP2 POP DUP6 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 SWAP6 PUSH2 0x241A JUMPI JUMPDEST POP POP PUSH2 0x21F9 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x1E43 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP5 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x24A2 JUMPI SWAP1 DUP5 SWAP2 ISZERO PUSH2 0x2413 JUMPI DUP2 PUSH2 0x2497 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1F7F JUMPI DUP3 CODESIZE PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP7 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x2525 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST PUSH2 0x252D PUSH2 0x3251 JUMP JUMPDEST DUP4 PUSH2 0x2537 DUP4 PUSH2 0x2D7F JUMP JUMPDEST SWAP4 PUSH2 0x2545 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2D0F JUMP JUMPDEST DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0x1F7F JUMPI DUP1 PUSH1 0x20 SWAP3 DUP7 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x2568 PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x2571 DUP2 PUSH2 0x3067 JUMP JUMPDEST DUP4 SWAP2 DUP4 MLOAD DUP5 ADD PUSH1 0x20 DUP6 DUP3 SUB SLT PUSH2 0x1E52 JUMPI PUSH2 0x258A DUP3 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x27E9 JUMPI POP PUSH2 0x25A1 SWAP1 PUSH1 0x20 DUP6 MLOAD DUP7 ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 MLOAD SWAP2 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 JUMPDEST DUP6 DUP2 SUB PUSH2 0x26DF JUMPI POP POP POP POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x26B7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x2683 JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1D35 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x2755 PUSH2 0x26EC DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP9 DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH2 0x271E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP10 KECCAK256 SLOAD AND DUP12 DUP12 DUP3 DUP11 EQ PUSH2 0x3151 JUMP JUMPDEST DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP8 DUP4 EXTCODESIZE ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP6 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1E47 JUMPI DUP7 SWAP2 PUSH2 0x27D4 JUMPI JUMPDEST POP POP PUSH2 0x27CF SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x25FA JUMP JUMPDEST DUP2 PUSH2 0x27DE SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1E43 JUMPI DUP5 CODESIZE PUSH2 0x27C4 JUMP JUMPDEST PUSH2 0x27F8 SWAP3 SWAP4 POP PUSH1 0x20 ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP3 SWAP2 POP DUP5 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH2 0x2841 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND DUP4 DUP4 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ PUSH2 0x3151 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE DUP4 PUSH1 0x1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 EXTCODESIZE ISZERO PUSH2 0x1F7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x2938 JUMPI PUSH2 0x2924 JUMPI JUMPDEST POP PUSH2 0x2608 JUMP JUMPDEST DUP5 PUSH2 0x2931 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x2D0F JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x291E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2995 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x189F DUP4 PUSH2 0x2F9C JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2ABA PUSH2 0x2ABF JUMP JUMPDEST PUSH2 0x2CA5 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2AE2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2AE2 JUMPI DUP2 PUSH2 0x2BF1 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2AE2 JUMPI DUP2 PUSH2 0x2C14 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2AE2 JUMPI PUSH2 0x2C37 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x2C48 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D0C SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x2CF7 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2CF1 PUSH2 0x2CDC PUSH2 0x2E58 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2C3B JUMP JUMPDEST SWAP1 PUSH2 0x2C77 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2C98 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2D50 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D50 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2DCC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2DBC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2E18 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2DB9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2E29 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2E97 JUMPI PUSH2 0x2D0C SWAP1 PUSH2 0x2E91 PUSH1 0x4 SLOAD SWAP2 PUSH2 0x2E8C PUSH2 0x2E83 PUSH2 0x2E7A PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2C3B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x2C77 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST SWAP1 PUSH2 0x2C98 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2EF6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2D0C JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x2C48 JUMPI PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2F4C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2AE2 JUMPI SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3045 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x303F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3062 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2DDC JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x306F PUSH2 0x2E58 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x30E1 JUMPI JUMPDEST PUSH2 0x30D1 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x30A5 JUMPI POP POP JUMP JUMPDEST PUSH2 0x30AE SWAP1 PUSH2 0x2CA5 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x30D9 PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x3084 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x307F JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x30FD JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 PUSH1 0x40 SWAP2 SUB SLT PUSH2 0x2AE2 JUMPI PUSH1 0x20 PUSH2 0x314B DUP4 PUSH2 0x3127 JUMP JUMPDEST SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x315B JUMPI POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 POP DUP4 SWAP1 PUSH32 0x964EBADD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE AND PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x31BE DUP4 PUSH2 0x3127 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2AE2 JUMPI ADD SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP2 MLOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2D50 JUMPI DUP3 PUSH1 0x5 SHL SWAP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x3209 PUSH1 0x20 DUP5 ADD DUP7 PUSH2 0x2D0F JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP3 DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x322D JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3220 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2F4C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3391 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3396 JUMPI JUMPDEST PUSH2 0x3391 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x32D9 JUMPI JUMPDEST POP PUSH2 0x2D0C JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x334B JUMPI JUMPDEST POP CODESIZE PUSH2 0x32CF JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x337D JUMPI JUMPDEST DUP2 PUSH2 0x3366 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x3377 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0x3344 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3359 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3298 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x34EF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x34F7 JUMPI JUMPDEST PUSH2 0x34EF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3433 JUMPI JUMPDEST POP PUSH2 0x3402 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2AE2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x34B5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x33F6 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x34E7 JUMPI JUMPDEST DUP2 PUSH2 0x34D0 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x34E1 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0x34AE JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x34C3 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x33E7 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x3583 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x353F JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x3538 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP8 0xC3 ISZERO 0xD5 GAS LT PUSH13 0xB221950B168ED0604A66BE1711 MSTORE8 0xFC TSTORE 0x2E 0x2E PUSH11 0x1D37A0F5973664736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"627:1521:108:-:0;;;;;;;;;;;;;-1:-1:-1;;627:1521:108;;;;-1:-1:-1;;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;627:1521:108;;;;;;;;;;;-1:-1:-1;;;;;627:1521:108;;;;;;;;;;-1:-1:-1;;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;627:1521:108;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;627:1521:108;881:35:59;1863:25:42;;;-1:-1:-1;500:10:59;;627:1521:108;500:10:59;627:1521:108;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;990:1:42;-1:-1:-1;1857:1:13;627:1521:108;745:39:76;4180:2:193;4156:26;;627:1521:108;;;4180:2:193;627:1521:108;;;;;;;4221:44:193;807:33:294;;;-1:-1:-1;500:10:59;627:1521:108;500:10:59;627:1521:108;-1:-1:-1;500:10:59;990:1:42;500:10:59;;;;;;;;1058:28:198;;1065:26:195;;627:1521:108;;;;;;;;;;;;;;;1144:30:195;;-1:-1:-1;1144:30:195;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1058:28:198;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1065:26:195;627:1521:108;;;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;;;-1:-1:-1;627:1521:108;;;;;-1:-1:-1;627:1521:108;;-1:-1:-1;627:1521:108;1645:152:42;627:1521:108;;;-1:-1:-1;;;;;;627:1521:108;4082:10:193;627:1521:108;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;627:1521:108;-1:-1:-1;627:1521:108;;;;;;-1:-1:-1;627:1521:108;;;;;-1:-1:-1;627:1521:108"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":10943,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":11127,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11176,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_bool_fromMemory":{"entryPoint":12583,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_boolt_array_uint256_dyn_fromMemory":{"entryPoint":12713,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_boolt_uint256_fromMemory":{"entryPoint":12596,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes_calldata":{"entryPoint":11018,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":10983,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes":{"entryPoint":11740,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":11064,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":12363,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11647,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC721_dyn_calldata":{"entryPoint":12092,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":11416,"id":null,"parameterSlots":2,"returnSlots":1},"checked_add_uint256_20744":{"entryPoint":11402,"id":null,"parameterSlots":1,"returnSlots":1},"checked_div_uint256":{"entryPoint":11807,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":11383,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":11323,"id":null,"parameterSlots":2,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":11705,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11535,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOptionalReturn":{"entryPoint":13569,"id":874,"parameterSlots":2,"returnSlots":0},"fun_earned":{"entryPoint":11429,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":11934,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":12029,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgData":{"entryPoint":13216,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":12881,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":12524,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":11864,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":12188,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":12391,"id":20469,"parameterSlots":1,"returnSlots":0},"increment_uint256":{"entryPoint":12047,"id":null,"parameterSlots":1,"returnSlots":1},"memory_array_index_access_uint256_dyn":{"entryPoint":12861,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_contract_IERC721":{"entryPoint":12155,"id":null,"parameterSlots":1,"returnSlots":1},"require_helper_error_NotTheTokenOwner_address_uint256_address":{"entryPoint":12625,"id":null,"parameterSlots":4,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8199},{"length":32,"start":11957},{"length":32,"start":12904},{"length":32,"start":13239}],"20300":[{"length":32,"start":1474},{"length":32,"start":2134},{"length":32,"start":4886}],"21079":[{"length":32,"start":2290},{"length":32,"start":3660}],"22075":[{"length":32,"start":2668},{"length":32,"start":7286},{"length":32,"start":7899},{"length":32,"start":8358},{"length":32,"start":9664},{"length":32,"start":10382},{"length":32,"start":10737}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c80628cc26214612a7d57806301ffc9a714612a155780630479d644146129a65780630700037d146129435780630968f264146124d5578063150b7a021461202b5780632b4c9f1614611fbc5780632c9d0b8014611f835780632d1e0c0214611af55780632f2ff15d1461194d57806331e66e1e146118fb578063569c93d2146118a9578063572b6c051461185d5780636806cc931461174c57806373c8a9581461161057806375c93bb9146112585780637b0a47ee1461121c57806380faa57d146111db578063817b1cd21461119f5780638580cf76146111465780638bb9c5bf14610fdc5780638da5cb5b14610f6a57806391d1485414610ed357806398807d8414610e7057806399248ea714610e015780639d696e3614610dc5578063c3666c3614610a54578063c5c8f770146109f1578063c63ff8dd146107d0578063d0b06f5d14610794578063d547741f146105e5578063ef4cadc51461058c578063efa90b5414610550578063f2fde38b1461042a578063f7ba94bd146102085763f8a14f46146101a857600080fd5b346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260098452205416604051908152f35b80fd5b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657610258903690600401612b77565b60243567ffffffffffffffff811161042257610278903690600401612b77565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102b9613251565b92541691169081036103f557508181036103cd57845b8181106102da578580f35b6102e5818387612f3c565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103c95761030f828587612f3c565b3590814710610399578780809381935af13d15610391573d9061033182612d7f565b9161033f6040519384612d0f565b82523d88602084013e5b1561035757506001016102cf565b80518790156103695750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b606090610349565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b5080fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557610462612abf565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061048c613251565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610525575073ffffffffffffffffffffffffffffffffffffffff16918282036104d2578380f35b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a33880808380f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600554604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435610620612ae7565b610628613251565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036103f557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166106da578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b93610789918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600254604051908152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657610820903690600401612b0a565b919061082a6130ec565b610832613251565b9061083c82613067565b61084582612ca5565b9384610854575b836001815580f35b7f000000000000000000000000000000000000000000000000000000000000000061087f8187612e1f565b9080156109c457600a546040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015273ffffffffffffffffffffffffffffffffffffffff9182166024820152908616604482015260648082018490528152610916906108f0608482612d0f565b7f0000000000000000000000000000000000000000000000000000000000000000613501565b856109975760009606939573ffffffffffffffffffffffffffffffffffffffff7f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca959697169586825260076020526040822055610980604051948594606086526060860191612b38565b91602084015260408301520390a28038808061084c565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff610a43612abf565b168152600883522054604051908152f35b503461020557610a6336612ba8565b929490939092917f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16875b828103610d285750507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610aeb613251565b92541691169081036103f55750808214801590610d1e575b610cf657865b828110610b14578780f35b73ffffffffffffffffffffffffffffffffffffffff610b3c610b3783858b612f3c565b612f7b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ceb578a91610cae575b5015610c8357508773ffffffffffffffffffffffffffffffffffffffff610bcb610b3784868c612f3c565b16610bda610b3784878a612f3c565b610be584888b612f3c565b35823b15610422576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529082908290606490829084905af18015610c7857610c5f575b5050600101610b09565b81610c6991612d0f565b610c74578738610c55565b8780fd5b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b90506020813d8211610ce3575b81610cc860209383612d0f565b81010312610cdf57610cd990613127565b38610ba0565b8980fd5b3d9150610cbb565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415610b03565b8173ffffffffffffffffffffffffffffffffffffffff610d4c610b3784878d612f3c565b1614610d61575b610d5c90612f0f565b610aa3565b610d6c818689612f3c565b35808a52600960205273ffffffffffffffffffffffffffffffffffffffff60408b205416610d9a5750610d53565b7f38c4e116000000000000000000000000000000000000000000000000000000008a52600452602489fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600454604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff610ec2612abf565b168152600683522054604051908152f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055773ffffffffffffffffffffffffffffffffffffffff6040610f22612ae7565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611039613251565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611100578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600154604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612efd565b604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435602435611291613251565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156115aa57821561158257801561155a577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156115325761134e612e58565b6004556005544210801590611527575b611517575b600554906113718342612c98565b914281116113da5750928273ffffffffffffffffffffffffffffffffffffffff926113bf6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497612e1f565b6003556005555b42600255835195865260208601521692a280f35b916003939193546113f46113ee4286612c3b565b82612c77565b850194851094851502946114ef57838211611463575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749260409261145b61145473ffffffffffffffffffffffffffffffffffffffff944290612c3b565b8092612e1f565b6003556113c6565b916114719193508094612e1f565b908082106114c157509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556113c6565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61151f612efd565b600255611363565b50600154151561135e565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346102055761161f36612ba8565b92939186959195507fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611666613251565b92541691169081036103f55750808314801590611742575b610cf657865b83811061168f578780f35b61169a818388612f3c565b359073ffffffffffffffffffffffffffffffffffffffff8216820361173e576117386001926116cd610b37848989612f3c565b906116d9848a8d612f3c565b3573ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252611733606483612d0f565b613501565b01611684565b8880fd5b508383141561167e565b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557611784612abf565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806117c3613251565b92541691169081036103f5575073ffffffffffffffffffffffffffffffffffffffff600a5491169073ffffffffffffffffffffffffffffffffffffffff8116820361180c578280f35b7fffffffffffffffffffffffff0000000000000000000000000000000000000000168117600a557f92c047df6e363693ec05d0bd21ac0dbc9951c94b023c16966a58dd78f0e27d298280a238808280f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602061189f61189a612abf565b612e9e565b6040519015158152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576119326133a0565b611949604051928392602084526020840191612b38565b0390f35b50346102055760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435611988612ae7565b611990613251565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036103f557507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611a43578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d93610789918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657611b40903690600401612b0a565b611b48613251565b60405192611b9b84611b6f6020820193600185526040830196604088526060840191612b38565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101865285612d0f565b611ba36130ec565b611bac82613067565b84928451850191604086602085019403126103c957611bca90613127565b905167ffffffffffffffff81116103c95785019082603f830112156103c957602082015191611bf883612d7f565b92611c066040519485612d0f565b80845260208401946040838301011161173e57846040611c269301612db9565b868251830160208482031261042657611c3e85613127565b15611e565750505090602082611c5793510101906131a9565b905084815191819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169073ffffffffffffffffffffffffffffffffffffffff8616925b858103611d67575050505050505b8115611d3f579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611d0883600154612c98565b6001551692838552600660205260408520611d24838254612c98565b9055611d356040519283928361304b565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b611daf611d74828461323d565b5198898752600960205260408720867fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612c8a565b97833b15611e52576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891660048201523060248201526044810191909152858160648183885af1908115611e47578691611e2e575b5050611e2990612f0f565b611cb0565b81611e3891612d0f565b611e43578438611e1e565b8480fd5b6040513d88823e3d90fd5b8580fd5b60209194929650611e6993500190613134565b809150825260096020526040822073ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600193611ec4575b5050611cbe565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15611f7f576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152306024820152604481019290925282908290606490829084905af18015610c785715611ebd5781611f7491612d0f565b610422578338611ebd565b8280fd5b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612e58565b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557612063612abf565b5061206c612ae7565b9060643567ffffffffffffffff81116104265761208d903690600401612b0a565b505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168033036124ad57604051928260208501526044356040850152604084526120ee606085612d0f565b604051916020830184815261211384611b6f604082019860408a526060830190612ddc565b61211b6130ec565b61212483613067565b84958451850191604086602085019403126103c95761214290613127565b905167ffffffffffffffff81116103c95785019082603f830112156103c957602082015161216f81612d7f565b9261217d6040519485612d0f565b81845260208401946040828401011161173e579084604061219e9301612db9565b81518201602083820312610c74576121b584613127565b156123ad575050906020826121cd93510101906131a9565b80519273ffffffffffffffffffffffffffffffffffffffff8516925090865b8481036122c65750505050505b831561229e578373ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e926122446001978854612c98565b8755169283855260066020526040852061225f838254612c98565b90556122706040519283928361304b565b0390a25560206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b6004837f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b61230e6122d3828461323d565b51998a8a52600960205260408a20867fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612c8a565b98833b1561173e576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201523060248201526044810191909152888160648183885af180156123a25790899161238d575b505061238890612f0f565b6121ec565b8161239791612d0f565b610c7457873861237d565b6040513d8b823e3d90fd5b60209198506123bf9392500190613134565b809150855260096020526040852073ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560019561241a575b50506121f9565b813b15611e43576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015230602482015260448101919091529084908290606490829084905af180156124a25790849115612413578161249791612d0f565b611f7f578238612413565b6040513d86823e3d90fd5b6004827fc1ab6dc1000000000000000000000000000000000000000000000000000000008152fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102055760043567ffffffffffffffff811161042657612525903690600401612b0a565b61252d613251565b8361253783612d7f565b936125456040519586612d0f565b83855260208501933681830111611f7f57806020928637850101526125686130ec565b61257181613067565b839183518401602085820312611e525761258a82613127565b156127e957506125a19060208551860101906131a9565b905084815191819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169073ffffffffffffffffffffffffffffffffffffffff8616925b8581036126df575050505050505b81156126b75773ffffffffffffffffffffffffffffffffffffffff1691828452600660205260408420548281106126835790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611d356040519283928361304b565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b6127556126ec828461323d565b5198898752600960205261271e73ffffffffffffffffffffffffffffffffffffffff6040892054168b8b828a14613151565b8987526009602052604087207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055612c8a565b97833b15611e52576040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff891660248201526044810191909152858160648183885af1908115611e475786916127d4575b50506127cf90612f0f565b6125fa565b816127de91612d0f565b611e435784386127c4565b6127f892935060200190613134565b809291508452600960205261284173ffffffffffffffffffffffffffffffffffffffff60408620541683838273ffffffffffffffffffffffffffffffffffffffff821614613151565b8184526009602052604084207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558360019273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690813b15611f7f576040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff85166024820152604481019190915291908290606490829084905af1801561293857612924575b50612608565b8461293191959295612d0f565b923861291e565b6040513d87823e3d90fd5b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557604060209173ffffffffffffffffffffffffffffffffffffffff612995612abf565b168152600783522054604051908152f35b503461020557807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020557600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361020557602061189f83612f9c565b50346102055760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610205576020611214612aba612abf565b612ca5565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612ae257565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203612ae257565b9181601f84011215612ae25782359167ffffffffffffffff8311612ae25760208381860195010111612ae257565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215612ae25782359167ffffffffffffffff8311612ae2576020808501948460051b010111612ae257565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112612ae25760043567ffffffffffffffff8111612ae25781612bf191600401612b77565b9290929160243567ffffffffffffffff8111612ae25781612c1491600401612b77565b929092916044359067ffffffffffffffff8211612ae257612c3791600401612b77565b9091565b91908203918211612c4857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810292918115918404141715612c4857565b9060018201809211612c4857565b91908201809211612c4857565b73ffffffffffffffffffffffffffffffffffffffff612d0c9116806000526006602052612cf7604060002054612cf1612cdc612e58565b84600052600860205260406000205490612c3b565b90612c77565b90600052600760205260406000205490612c98565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612d5057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612d5057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612dcc5750506000910152565b8181015183820152602001612dbc565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612e1881518092818752878088019101612db9565b0116010190565b8115612e29570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015612e9757612d0c90612e9160045491612e8c612e83612e7a612efd565b60025490612c3b565b60035490612c77565b612e1f565b90612c98565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612ef65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014612d0c57504290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612c485760010190565b9190811015612f4c5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612ae25790565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613045577f01ffc9a700000000000000000000000000000000000000000000000000000000811461303f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b929190613062602091604086526040860190612ddc565b930152565b61306f612e58565b60045560055442108015906130e1575b6130d1575b73ffffffffffffffffffffffffffffffffffffffff811690816130a5575050565b6130ae90612ca5565b816000526007602052604060002055600454906000526008602052604060002055565b6130d9612efd565b600255613084565b50600154151561307f565b6002600054146130fd576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b51908115158203612ae257565b9190826040910312612ae257602061314b83613127565b92015190565b1561315b57505050565b73ffffffffffffffffffffffffffffffffffffffff935083907f964ebadd00000000000000000000000000000000000000000000000000000000600052166004526024521660445260646000fd5b9190604083820312612ae2576131be83613127565b9260208101519067ffffffffffffffff8211612ae257019080601f83011215612ae25781519167ffffffffffffffff8311612d50578260051b90604051936132096020840186612d0f565b8452602080850192820101928311612ae257602001905b82821061322d5750505090565b8151815260209182019101613220565b8051821015612f4c5760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613391573233148015613396575b613391577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156132d9575b50612d0c57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156133855760009161334b575b50386132cf565b90506020813d60201161337d575b8161336660209383612d0f565b81010312612ae25761337790613127565b38613344565b3d9150613359565b6040513d6000823e3d90fd5b503390565b5060183610613298565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156134ef5732331480156134f7575b6134ef57803314908115613433575b50613402576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211612ae25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115613385576000916134b5575b50386133f6565b90506020813d6020116134e7575b816134d060209383612d0f565b81010312612ae2576134e190613127565b386134ae565b3d91506134c3565b506000903690565b50601836106133e7565b906000602091828151910182855af115613385576000513d613583575073ffffffffffffffffffffffffffffffffffffffff81163b155b61353f5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6001141561353856fea264697066735822122097c315d55a106cb221950b168ed0604a66be171153fc5d2e2e6a1d37a0f5973664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x2A7D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2A15 JUMPI DUP1 PUSH4 0x479D644 EQ PUSH2 0x29A6 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x2943 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x24D5 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x202B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1FBC JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1F83 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1AF5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x194D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x18FB JUMPI DUP1 PUSH4 0x569C93D2 EQ PUSH2 0x18A9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x185D JUMPI DUP1 PUSH4 0x6806CC93 EQ PUSH2 0x174C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1610 JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1258 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x121C JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x11DB JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0x119F JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0x1146 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xFDC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xF6A JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xED3 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xE70 JUMPI DUP1 PUSH4 0x99248EA7 EQ PUSH2 0xE01 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xDC5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA54 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x7D0 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x794 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x550 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0xF7BA94BD EQ PUSH2 0x208 JUMPI PUSH4 0xF8A14F46 EQ PUSH2 0x1A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x9 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x258 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x422 JUMPI PUSH2 0x278 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2B9 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP2 DUP2 SUB PUSH2 0x3CD JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DA JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x2E5 DUP2 DUP4 DUP8 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x3C9 JUMPI PUSH2 0x30F DUP3 DUP6 DUP8 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x399 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x391 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x331 DUP3 PUSH2 0x2D7F JUMP JUMPDEST SWAP2 PUSH2 0x33F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2D0F JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x357 JUMPI POP PUSH1 0x1 ADD PUSH2 0x2CF JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x369 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x349 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x462 PUSH2 0x2ABF JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x48C PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x525 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4D2 JUMPI DUP4 DUP1 RETURN JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x620 PUSH2 0x2AE7 JUMP JUMPDEST PUSH2 0x628 PUSH2 0x3251 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x6DA JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x789 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x820 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x82A PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x832 PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH2 0x83C DUP3 PUSH2 0x3067 JUMP JUMPDEST PUSH2 0x845 DUP3 PUSH2 0x2CA5 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0x854 JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0x87F DUP2 DUP8 PUSH2 0x2E1F JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0x9C4 JUMPI PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 DUP7 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP2 MSTORE PUSH2 0x916 SWAP1 PUSH2 0x8F0 PUSH1 0x84 DUP3 PUSH2 0x2D0F JUMP JUMPDEST PUSH32 0x0 PUSH2 0x3501 JUMP JUMPDEST DUP6 PUSH2 0x997 JUMPI PUSH1 0x0 SWAP7 MOD SWAP4 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 SWAP7 SWAP8 AND SWAP6 DUP7 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0x980 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0x84C JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA43 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH2 0xA63 CALLDATASIZE PUSH2 0x2BA8 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 JUMPDEST DUP3 DUP2 SUB PUSH2 0xD28 JUMPI POP POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xAEB PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xD1E JUMPI JUMPDEST PUSH2 0xCF6 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0xB14 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB3C PUSH2 0xB37 DUP4 DUP6 DUP12 PUSH2 0x2F3C JUMP JUMPDEST PUSH2 0x2F7B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCEB JUMPI DUP11 SWAP2 PUSH2 0xCAE JUMPI JUMPDEST POP ISZERO PUSH2 0xC83 JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xBCB PUSH2 0xB37 DUP5 DUP7 DUP13 PUSH2 0x2F3C JUMP JUMPDEST AND PUSH2 0xBDA PUSH2 0xB37 DUP5 DUP8 DUP11 PUSH2 0x2F3C JUMP JUMPDEST PUSH2 0xBE5 DUP5 DUP9 DUP12 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD DUP3 EXTCODESIZE ISZERO PUSH2 0x422 JUMPI PUSH1 0x40 MLOAD PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0xC78 JUMPI PUSH2 0xC5F JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xB09 JUMP JUMPDEST DUP2 PUSH2 0xC69 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0xC74 JUMPI DUP8 CODESIZE PUSH2 0xC55 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0xCE3 JUMPI JUMPDEST DUP2 PUSH2 0xCC8 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCDF JUMPI PUSH2 0xCD9 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0xBA0 JUMP JUMPDEST DUP10 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xCBB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xB03 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD4C PUSH2 0xB37 DUP5 DUP8 DUP14 PUSH2 0x2F3C JUMP JUMPDEST AND EQ PUSH2 0xD61 JUMPI JUMPDEST PUSH2 0xD5C SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0xAA3 JUMP JUMPDEST PUSH2 0xD6C DUP2 DUP7 DUP10 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD DUP1 DUP11 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP12 KECCAK256 SLOAD AND PUSH2 0xD9A JUMPI POP PUSH2 0xD53 JUMP JUMPDEST PUSH32 0x38C4E11600000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP10 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xEC2 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0xF22 PUSH2 0x2AE7 JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1039 PUSH2 0x3251 JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1100 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1291 PUSH2 0x3251 JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x15AA JUMPI DUP3 ISZERO PUSH2 0x1582 JUMPI DUP1 ISZERO PUSH2 0x155A JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x1532 JUMPI PUSH2 0x134E PUSH2 0x2E58 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1527 JUMPI JUMPDEST PUSH2 0x1517 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1371 DUP4 TIMESTAMP PUSH2 0x2C98 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x13DA JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x13BF PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x13F4 PUSH2 0x13EE TIMESTAMP DUP7 PUSH2 0x2C3B JUMP JUMPDEST DUP3 PUSH2 0x2C77 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x14EF JUMPI DUP4 DUP3 GT PUSH2 0x1463 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x145B PUSH2 0x1454 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2C3B JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x13C6 JUMP JUMPDEST SWAP2 PUSH2 0x1471 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x2E1F JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x14C1 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x13C6 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x151F PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1363 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x135E JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH2 0x161F CALLDATASIZE PUSH2 0x2BA8 JUMP JUMPDEST SWAP3 SWAP4 SWAP2 DUP7 SWAP6 SWAP2 SWAP6 POP PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1666 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1742 JUMPI JUMPDEST PUSH2 0xCF6 JUMPI DUP7 JUMPDEST DUP4 DUP2 LT PUSH2 0x168F JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH2 0x169A DUP2 DUP4 DUP9 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x173E JUMPI PUSH2 0x1738 PUSH1 0x1 SWAP3 PUSH2 0x16CD PUSH2 0xB37 DUP5 DUP10 DUP10 PUSH2 0x2F3C JUMP JUMPDEST SWAP1 PUSH2 0x16D9 DUP5 DUP11 DUP14 PUSH2 0x2F3C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP4 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x44 DUP3 MSTORE PUSH2 0x1733 PUSH1 0x64 DUP4 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x3501 JUMP JUMPDEST ADD PUSH2 0x1684 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST POP DUP4 DUP4 EQ ISZERO PUSH2 0x167E JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x1784 PUSH2 0x2ABF JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x17C3 PUSH2 0x3251 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD SWAP2 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 SUB PUSH2 0x180C JUMPI DUP3 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 OR PUSH1 0xA SSTORE PUSH32 0x92C047DF6E363693EC05D0BD21AC0DBC9951C94B023C16966A58DD78F0E27D29 DUP3 DUP1 LOG2 CODESIZE DUP1 DUP3 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x189F PUSH2 0x189A PUSH2 0x2ABF JUMP JUMPDEST PUSH2 0x2E9E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x1932 PUSH2 0x33A0 JUMP JUMPDEST PUSH2 0x1949 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1988 PUSH2 0x2AE7 JUMP JUMPDEST PUSH2 0x1990 PUSH2 0x3251 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x3F5 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1A43 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x789 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x1B40 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST PUSH2 0x1B48 PUSH2 0x3251 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP3 PUSH2 0x1B9B DUP5 PUSH2 0x1B6F PUSH1 0x20 DUP3 ADD SWAP4 PUSH1 0x1 DUP6 MSTORE PUSH1 0x40 DUP4 ADD SWAP7 PUSH1 0x40 DUP9 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 PUSH2 0x2B38 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP7 MSTORE DUP6 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1BA3 PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x1BAC DUP3 PUSH2 0x3067 JUMP JUMPDEST DUP5 SWAP3 DUP5 MLOAD DUP6 ADD SWAP2 PUSH1 0x40 DUP7 PUSH1 0x20 DUP6 ADD SWAP5 SUB SLT PUSH2 0x3C9 JUMPI PUSH2 0x1BCA SWAP1 PUSH2 0x3127 JUMP JUMPDEST SWAP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3C9 JUMPI DUP6 ADD SWAP1 DUP3 PUSH1 0x3F DUP4 ADD SLT ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x20 DUP3 ADD MLOAD SWAP2 PUSH2 0x1BF8 DUP4 PUSH2 0x2D7F JUMP JUMPDEST SWAP3 PUSH2 0x1C06 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2D0F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x40 DUP4 DUP4 ADD ADD GT PUSH2 0x173E JUMPI DUP5 PUSH1 0x40 PUSH2 0x1C26 SWAP4 ADD PUSH2 0x2DB9 JUMP JUMPDEST DUP7 DUP3 MLOAD DUP4 ADD PUSH1 0x20 DUP5 DUP3 SUB SLT PUSH2 0x426 JUMPI PUSH2 0x1C3E DUP6 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x1E56 JUMPI POP POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x1C57 SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 MLOAD SWAP2 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 JUMPDEST DUP6 DUP2 SUB PUSH2 0x1D67 JUMPI POP POP POP POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x1D3F JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1D08 DUP4 PUSH1 0x1 SLOAD PUSH2 0x2C98 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1D24 DUP4 DUP3 SLOAD PUSH2 0x2C98 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1D35 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x1DAF PUSH2 0x1D74 DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP9 DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP8 DUP4 EXTCODESIZE ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP6 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1E47 JUMPI DUP7 SWAP2 PUSH2 0x1E2E JUMPI JUMPDEST POP POP PUSH2 0x1E29 SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x1CB0 JUMP JUMPDEST DUP2 PUSH2 0x1E38 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1E43 JUMPI DUP5 CODESIZE PUSH2 0x1E1E JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP9 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP5 SWAP3 SWAP7 POP PUSH2 0x1E69 SWAP4 POP ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP2 POP DUP3 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 SWAP4 PUSH2 0x1EC4 JUMPI JUMPDEST POP POP PUSH2 0x1CBE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x1F7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0xC78 JUMPI ISZERO PUSH2 0x1EBD JUMPI DUP2 PUSH2 0x1F74 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x422 JUMPI DUP4 CODESIZE PUSH2 0x1EBD JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2E58 JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH2 0x2063 PUSH2 0x2ABF JUMP JUMPDEST POP PUSH2 0x206C PUSH2 0x2AE7 JUMP JUMPDEST SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x208D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 CALLER SUB PUSH2 0x24AD JUMPI PUSH1 0x40 MLOAD SWAP3 DUP3 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x44 CALLDATALOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x40 DUP5 MSTORE PUSH2 0x20EE PUSH1 0x60 DUP6 PUSH2 0x2D0F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD DUP5 DUP2 MSTORE PUSH2 0x2113 DUP5 PUSH2 0x1B6F PUSH1 0x40 DUP3 ADD SWAP9 PUSH1 0x40 DUP11 MSTORE PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2DDC JUMP JUMPDEST PUSH2 0x211B PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x2124 DUP4 PUSH2 0x3067 JUMP JUMPDEST DUP5 SWAP6 DUP5 MLOAD DUP6 ADD SWAP2 PUSH1 0x40 DUP7 PUSH1 0x20 DUP6 ADD SWAP5 SUB SLT PUSH2 0x3C9 JUMPI PUSH2 0x2142 SWAP1 PUSH2 0x3127 JUMP JUMPDEST SWAP1 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3C9 JUMPI DUP6 ADD SWAP1 DUP3 PUSH1 0x3F DUP4 ADD SLT ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x216F DUP2 PUSH2 0x2D7F JUMP JUMPDEST SWAP3 PUSH2 0x217D PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2D0F JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x40 DUP3 DUP5 ADD ADD GT PUSH2 0x173E JUMPI SWAP1 DUP5 PUSH1 0x40 PUSH2 0x219E SWAP4 ADD PUSH2 0x2DB9 JUMP JUMPDEST DUP2 MLOAD DUP3 ADD PUSH1 0x20 DUP4 DUP3 SUB SLT PUSH2 0xC74 JUMPI PUSH2 0x21B5 DUP5 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x23AD JUMPI POP POP SWAP1 PUSH1 0x20 DUP3 PUSH2 0x21CD SWAP4 MLOAD ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST DUP1 MLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP3 POP SWAP1 DUP7 JUMPDEST DUP5 DUP2 SUB PUSH2 0x22C6 JUMPI POP POP POP POP POP JUMPDEST DUP4 ISZERO PUSH2 0x229E JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x2244 PUSH1 0x1 SWAP8 DUP9 SLOAD PUSH2 0x2C98 JUMP JUMPDEST DUP8 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x225F DUP4 DUP3 SLOAD PUSH2 0x2C98 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x2270 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SUB SWAP1 LOG2 SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 DUP4 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x230E PUSH2 0x22D3 DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP10 DUP11 DUP11 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 DUP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP9 DUP4 EXTCODESIZE ISZERO PUSH2 0x173E JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL DUP1 ISZERO PUSH2 0x23A2 JUMPI SWAP1 DUP10 SWAP2 PUSH2 0x238D JUMPI JUMPDEST POP POP PUSH2 0x2388 SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x21EC JUMP JUMPDEST DUP2 PUSH2 0x2397 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0xC74 JUMPI DUP8 CODESIZE PUSH2 0x237D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP12 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP9 POP PUSH2 0x23BF SWAP4 SWAP3 POP ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP2 POP DUP6 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x1 SWAP6 PUSH2 0x241A JUMPI JUMPDEST POP POP PUSH2 0x21F9 JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x1E43 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP5 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x24A2 JUMPI SWAP1 DUP5 SWAP2 ISZERO PUSH2 0x2413 JUMPI DUP2 PUSH2 0x2497 SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1F7F JUMPI DUP3 CODESIZE PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP7 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP3 PUSH32 0xC1AB6DC100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x426 JUMPI PUSH2 0x2525 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B0A JUMP JUMPDEST PUSH2 0x252D PUSH2 0x3251 JUMP JUMPDEST DUP4 PUSH2 0x2537 DUP4 PUSH2 0x2D7F JUMP JUMPDEST SWAP4 PUSH2 0x2545 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2D0F JUMP JUMPDEST DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 CALLDATASIZE DUP2 DUP4 ADD GT PUSH2 0x1F7F JUMPI DUP1 PUSH1 0x20 SWAP3 DUP7 CALLDATACOPY DUP6 ADD ADD MSTORE PUSH2 0x2568 PUSH2 0x30EC JUMP JUMPDEST PUSH2 0x2571 DUP2 PUSH2 0x3067 JUMP JUMPDEST DUP4 SWAP2 DUP4 MLOAD DUP5 ADD PUSH1 0x20 DUP6 DUP3 SUB SLT PUSH2 0x1E52 JUMPI PUSH2 0x258A DUP3 PUSH2 0x3127 JUMP JUMPDEST ISZERO PUSH2 0x27E9 JUMPI POP PUSH2 0x25A1 SWAP1 PUSH1 0x20 DUP6 MLOAD DUP7 ADD ADD SWAP1 PUSH2 0x31A9 JUMP JUMPDEST SWAP1 POP DUP5 DUP2 MLOAD SWAP2 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 JUMPDEST DUP6 DUP2 SUB PUSH2 0x26DF JUMPI POP POP POP POP POP POP JUMPDEST DUP2 ISZERO PUSH2 0x26B7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x2683 JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1D35 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x304B JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x2755 PUSH2 0x26EC DUP3 DUP5 PUSH2 0x323D JUMP JUMPDEST MLOAD SWAP9 DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH2 0x271E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP10 KECCAK256 SLOAD AND DUP12 DUP12 DUP3 DUP11 EQ PUSH2 0x3151 JUMP JUMPDEST DUP10 DUP8 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE PUSH2 0x2C8A JUMP JUMPDEST SWAP8 DUP4 EXTCODESIZE ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP6 DUP2 PUSH1 0x64 DUP2 DUP4 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1E47 JUMPI DUP7 SWAP2 PUSH2 0x27D4 JUMPI JUMPDEST POP POP PUSH2 0x27CF SWAP1 PUSH2 0x2F0F JUMP JUMPDEST PUSH2 0x25FA JUMP JUMPDEST DUP2 PUSH2 0x27DE SWAP2 PUSH2 0x2D0F JUMP JUMPDEST PUSH2 0x1E43 JUMPI DUP5 CODESIZE PUSH2 0x27C4 JUMP JUMPDEST PUSH2 0x27F8 SWAP3 SWAP4 POP PUSH1 0x20 ADD SWAP1 PUSH2 0x3134 JUMP JUMPDEST DUP1 SWAP3 SWAP2 POP DUP5 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH2 0x2841 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND DUP4 DUP4 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ PUSH2 0x3151 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE DUP4 PUSH1 0x1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 EXTCODESIZE ISZERO PUSH2 0x1F7F JUMPI PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 DUP5 SWAP1 GAS CALL DUP1 ISZERO PUSH2 0x2938 JUMPI PUSH2 0x2924 JUMPI JUMPDEST POP PUSH2 0x2608 JUMP JUMPDEST DUP5 PUSH2 0x2931 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x2D0F JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x291E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2995 PUSH2 0x2ABF JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x189F DUP4 PUSH2 0x2F9C JUMP JUMPDEST POP CALLVALUE PUSH2 0x205 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x205 JUMPI PUSH1 0x20 PUSH2 0x1214 PUSH2 0x2ABA PUSH2 0x2ABF JUMP JUMPDEST PUSH2 0x2CA5 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2AE2 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2AE2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2AE2 JUMPI DUP2 PUSH2 0x2BF1 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2AE2 JUMPI DUP2 PUSH2 0x2C14 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2AE2 JUMPI PUSH2 0x2C37 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B77 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x2C48 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2C48 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D0C SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x2CF7 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2CF1 PUSH2 0x2CDC PUSH2 0x2E58 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2C3B JUMP JUMPDEST SWAP1 PUSH2 0x2C77 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2C98 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2D50 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D50 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2DCC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2DBC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2E18 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2DB9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2E29 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2E97 JUMPI PUSH2 0x2D0C SWAP1 PUSH2 0x2E91 PUSH1 0x4 SLOAD SWAP2 PUSH2 0x2E8C PUSH2 0x2E83 PUSH2 0x2E7A PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2C3B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x2C77 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST SWAP1 PUSH2 0x2C98 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2EF6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2D0C JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 EQ PUSH2 0x2C48 JUMPI PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2F4C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2AE2 JUMPI SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3045 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x303F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3062 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2DDC JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x306F PUSH2 0x2E58 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x30E1 JUMPI JUMPDEST PUSH2 0x30D1 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x30A5 JUMPI POP POP JUMP JUMPDEST PUSH2 0x30AE SWAP1 PUSH2 0x2CA5 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x30D9 PUSH2 0x2EFD JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x3084 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x307F JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x30FD JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x2AE2 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 PUSH1 0x40 SWAP2 SUB SLT PUSH2 0x2AE2 JUMPI PUSH1 0x20 PUSH2 0x314B DUP4 PUSH2 0x3127 JUMP JUMPDEST SWAP3 ADD MLOAD SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x315B JUMPI POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 POP DUP4 SWAP1 PUSH32 0x964EBADD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE AND PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x31BE DUP4 PUSH2 0x3127 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2AE2 JUMPI ADD SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x2AE2 JUMPI DUP2 MLOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2D50 JUMPI DUP3 PUSH1 0x5 SHL SWAP1 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x3209 PUSH1 0x20 DUP5 ADD DUP7 PUSH2 0x2D0F JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP3 DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x2AE2 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x322D JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3220 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2F4C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3391 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3396 JUMPI JUMPDEST PUSH2 0x3391 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x32D9 JUMPI JUMPDEST POP PUSH2 0x2D0C JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x334B JUMPI JUMPDEST POP CODESIZE PUSH2 0x32CF JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x337D JUMPI JUMPDEST DUP2 PUSH2 0x3366 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x3377 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0x3344 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3359 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3298 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x34EF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x34F7 JUMPI JUMPDEST PUSH2 0x34EF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3433 JUMPI JUMPDEST POP PUSH2 0x3402 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2AE2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x34B5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x33F6 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x34E7 JUMPI JUMPDEST DUP2 PUSH2 0x34D0 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2D0F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AE2 JUMPI PUSH2 0x34E1 SWAP1 PUSH2 0x3127 JUMP JUMPDEST CODESIZE PUSH2 0x34AE JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x34C3 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x33E7 JUMP JUMPDEST SWAP1 PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 DUP2 MLOAD SWAP2 ADD DUP3 DUP6 GAS CALL ISZERO PUSH2 0x3385 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x3583 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND EXTCODESIZE ISZERO JUMPDEST PUSH2 0x353F JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x3538 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP8 0xC3 ISZERO 0xD5 GAS LT PUSH13 0xB221950B168ED0604A66BE1711 MSTORE8 0xFC TSTORE 0x2E 0x2E PUSH11 0x1D37A0F5973664736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"627:1521:108:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;645:60:198;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;627:1521:108;;16306:41:193;;;:::i;:::-;627:1521:108;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1834:9;1845:10;;;;;;627:1521:108;;;1857:3:192;1876:11;;;;;:::i;:::-;627:1521:108;;;;;;;;;1898:10:192;;;;;:::i;:::-;627:1521:108;1375:21:9;;;:30;1371:125;;1548:33;;;;;;;;627:1521:108;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;627:1521:108;;1834:9:192;;1591:58:9;627:1521:108;;;;5690:21:9;:17;;5815:105;627:1521:108;5815:105:9;;;;;5686:301;5957:19;;627:1521:108;5957:19:9;;;627:1521:108;;;;;1371:125:9;627:1521:108;1455:21:9;;;1428:57;;;627:1521:108;;;;1428:57:9;627:1521:108;;;;1756:63:192;627:1521:108;1793:26:192;;;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;627:1521:108;;-1:-1:-1;4538:25:42;627:1521:108;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;;:::i;:::-;627:1521:108;;;;;;;;3205:23:42;;;3201:60;;627:1521:108;;;3275:25:42;;;;3271:146;;627:1521:108;;;3271:146:42;627:1521:108;;;;;;;;3361:45:42;;;;3271:146;;;627:1521:108;;;3201:60:42;3237:24;;;627:1521:108;;;3237:24:42;;627:1521:108;;;;;;;;;;;;;2158:30:193;627:1521:108;;;;;;;;;;;;;;;;;;;;;;1971:39:193;627:1521:108;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;627:1521:108;;;;;;;4503:26:42;;;4499:64;;4464:19:41;627:1521:108;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;500:10:59;627:1521:108;-1:-1:-1;627:1521:108;500:10:59;;1880:140:41;;627:1521:108;;;1880:140:41;1973:36;627:1521:108;1973:36:41;627:1521:108;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;;-1:-1:-1;627:1521:108;;;;;;;;;1973:36:41;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;;;1880:140;;;;627:1521:108;;;;;;;;;;;;;;;;2049:26:193;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;627:1521:108;;1857:1:13;627:1521:108;;;;10393:466:193;10453:14;10444:23;;;;:::i;:::-;627:1521:108;;;;;2396:12:195;627:1521:108;;;;;1745:53:8;;;627:1521:108;;;;1745:53:8;;;627:1521:108;;;;;;;;;;;;;;;1745:53:8;;;;;627:1521:108;;1745:53:8;:::i;:::-;2366:12:195;1745:53:8;:::i;:::-;627:1521:108;;;-1:-1:-1;;627:1521:108;;;;10802:46:193;627:1521:108;;;;;;;;10732:7:193;627:1521:108;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10802:46:193;;;10393:466;;;;;;627:1521:108;1745:53:8;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;627:1521:108;;;;;;;;;;;;;;;;;;:::i;:::-;5385:9:198;;;;;;;5458:13;627:1521:108;;5385:9:198;5396:21;;;;;;5148:19:42;;627:1521:108;;16306:41:193;;;:::i;:::-;627:1521:108;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;5380:257:198;3852:94:192;;3961:9;3972:10;;;;;;627:1521:108;;;3984:3:192;627:1521:108;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;627:1521:108;;;;4058:76:192;;4108:25;627:1521:108;4058:76:192;;627:1521:108;4058:76:192;;;;;;;;;;;;;;;;3984:3;4057:77;;4053:173;;4239:12;;627:1521:108;4239:12:192;;;;;;:::i;:::-;627:1521:108;4284:11:192;;;;;;:::i;:::-;4297;;;;;:::i;:::-;627:1521:108;4239:70:192;;;;;627:1521:108;;;4239:70:192;;4277:4;627:1521:108;4239:70:192;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;4239:70:192;;;;;;;;3984:3;;;627:1521:108;;3961:9:192;;4239:70;;;;;:::i;:::-;627:1521:108;;4239:70:192;;;;627:1521:108;;;;4239:70:192;627:1521:108;;;;;;;;;4053:173:192;4161:50;;;627:1521:108;;4058:76:192;4161:50;;4058:76;;;;;;;;;;;;;;;;;:::i;:::-;;;627:1521:108;;;;;;;:::i;:::-;4058:76:192;;;627:1521:108;;;;4058:76:192;;;-1:-1:-1;4058:76:192;;;627:1521:108;;;;;;;;;3852:94:192;627:1521:108;3920:26:192;;;;;3856:55;3886:25;;;;;3856:55;;5419:3:198;5442:12;627:1521:108;5442:12:198;;;;;;:::i;:::-;627:1521:108;5442:29:198;5438:189;;5419:3;;;;:::i;:::-;5385:9;;5438:189;5509:11;;;;;:::i;:::-;627:1521:108;;;;5546:11:198;627:1521:108;;;;;;;;;;5438:189:198;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:36:195;627:1521:108;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;627:1521:108;;;;;;;;2800:22:41;627:1521:108;-1:-1:-1;627:1521:108;;;;500:10:59;627:1521:108;-1:-1:-1;627:1521:108;500:10:59;;627:1521:108;;;;;;;;;;;;;;;;;;;;912:80:42;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;627:1521:108;16306:41:193;;:::i;:::-;627:1521:108;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;500:10:59;627:1521:108;-1:-1:-1;627:1521:108;500:10:59;;3741:25:41;3737:66;;627:1521:108;;;;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;627:1521:108;;2455:33:41;627:1521:108;;3737:66:41;3775:28;627:1521:108;3775:28:41;627:1521:108;3775:28:41;;;;627:1521:108;;;;;3775:28:41;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;627:1521:108;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2081:25:193;627:1521:108;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;4464:19:41;627:1521:108;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;500:10:59;627:1521:108;-1:-1:-1;627:1521:108;500:10:59;;3741:25:41;3737:66;;12172:11:193;;627:1521:108;;12225:13:193;;627:1521:108;;12321:14:193;627:1521:108;;;2570:213:20;;;;;627:1521:108;;;34863:71:21;;627:1521:108;;4365:21:193;;:::i;:::-;627:1521:108;;4419:15:193;627:1521:108;4400:15:193;:34;;;:54;;;627:1521:108;4396:195:193;;627:1521:108;4419:15:193;627:1521:108;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;627:1521:108;12664:22:193;;627:1521:108;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;627:1521:108;4419:15:193;627:1521:108;12551:1311:193;4400:15;13871:29;627:1521:108;;;;;;;;;;;13962:39:193;;627:1521:108;;12551:1311:193;627:1521:108;12795:10:193;627:1521:108;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;627:1521:108;;1859:6:20;;;;;;627:1521:108;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;627:1521:108;4400:15:193;13357:22;13286:40;627:1521:108;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;627:1521:108;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;627:1521:108;;;;;;;;13962:39:193;627:1521:108;12795:10:193;627:1521:108;4419:15:193;627:1521:108;12551:1311:193;;627:1521:108;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;627:1521:108;4396:195:193;;4400:54;627:1521:108;4438:11:193;627:1521:108;4438:16:193;;4400:54;;627:1521:108;;;;;;;;;;;;;;;;;;;;;3737:66:41;627:1521:108;3775:28:41;627:1521:108;3775:28:41;;;;627:1521:108;;;;;;3775:28:41;627:1521:108;;;;;;;;:::i;:::-;5148:19:42;;;;;;;912:80;627:1521:108;;16306:41:193;;;:::i;:::-;627:1521:108;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;627:1521:108;2776:90:192;;2881:9;2892:10;;;;;;627:1521:108;;;2904:3:192;2923:9;;;;;:::i;:::-;627:1521:108;;;;;;;;;1328:43:8;627:1521:108;2946:11:192;;;;;;;:::i;:::-;2959:10;;;;;;:::i;:::-;627:1521:108;;;;1328:43:8;627:1521:108;1328:43:8;;;;627:1521:108;1328:43:8;;;627:1521:108;1328:43:8;627:1521:108;;;1328:43:8;;;;;;;:::i;:::-;;:::i;:::-;627:1521:108;2881:9:192;;627:1521:108;;;;2780:51:192;2807:24;;;;;2780:51;;627:1521:108;;;;;;;;;;;;;;:::i;:::-;;;16306:41:193;;;:::i;:::-;627:1521:108;;;;;4503:26:42;;;4499:64;;627:1521:108;;1638:12:195;627:1521:108;;;;;;;1621:29:195;;1617:137;;627:1521:108;;;1617:137:195;627:1521:108;;;;1638:12:195;627:1521:108;1713:30:195;;;;1617:137;;627:1521:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;697:27:195;627:1521:108;;;;;;;;;;;;;;;;;;;;16541:39:193;;:::i;:::-;627:1521:108;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;627:1521:108;;;;;;;4503:26:42;;;4499:64;;4464:19:41;627:1521:108;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;500:10:59;627:1521:108;-1:-1:-1;627:1521:108;500:10:59;;1254:25:41;1250:140;;627:1521:108;;;1250:140:41;1343:36;627:1521:108;1343:36:41;627:1521:108;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;;-1:-1:-1;627:1521:108;;;;;;;;;;;1343:36:41;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;627:1521:108;;2226:39:198;;;627:1521:108;;2226:39:198;;627:1521:108;2191:4:198;627:1521:108;;;;;;;;;;;;;;:::i;:::-;2226:39:198;;;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;2666:19:198;627:1521:108;;;2742:36:198;;;627:1521:108;2742:36:198;627:1521:108;2742:36:198;;627:1521:108;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2801:24:198;;627:1521:108;;;;;;;;;;:::i;:::-;;;;;;;;;;2892:35:198;627:1521:108;;2892:35:198;;;;:::i;:::-;627:1521:108;;;;;2991:9:198;;3239:13;627:1521:108;3239:13:198;627:1521:108;;;;;2986:326:198;3002:10;;;;;;2835:790;;;;;;;7650:16:193;;627:1521:108;;;;7779:38:193;627:1521:108;7699:26:193;627:1521:108;2191:4:198;627:1521:108;7699:26:193;:::i;:::-;2191:4:198;627:1521:108;;;;;;7735:6:193;627:1521:108;;;;;7735:29:193;627:1521:108;;;7735:29:193;:::i;:::-;627:1521:108;;7779:38:193;627:1521:108;;7779:38:193;;;;;:::i;:::-;;;;2191:4:198;627:1521:108;;;;;;;;;;;3014:3:198;3131:35;3055:11;;;;:::i;:::-;627:1521:108;;;;;3084:11:198;627:1521:108;;;;;;;;;;;;;3131:35:198;:::i;:::-;3239:58;;;;;;627:1521:108;;;3239:58:198;;627:1521:108;;;;3239:58:198;;627:1521:108;3282:4:198;627:1521:108;;;;;;;;;;;;;;;;3239:58:198;;;;;;;;;;;;3014:3;;;;;;:::i;:::-;2991:9;;3239:58;;;;;:::i;:::-;627:1521:108;;3239:58:198;;;;627:1521:108;;;;3239:58:198;627:1521:108;;;;;;;;;3239:58:198;627:1521:108;;;2835:790:198;627:1521:108;2801:24:198;;;;;3364:33;2801:24;;;3364:33;;:::i;:::-;627:1521:108;;;;;3411:11:198;627:1521:108;;;;;;;;;;;;;;;2191:4:198;3502:113;;;2835:790;;;;;3502:113;627:1521:108;3542:13:198;627:1521:108;3542:58:198;;;;;627:1521:108;;;3542:58:198;;627:1521:108;;;;3542:58:198;;627:1521:108;3585:4:198;627:1521:108;;;;;;;;;;;;;;;;;;;;;3542:58:198;;;;;;;3502:113;3542:58;;;;;:::i;:::-;627:1521:108;;3542:58:198;;3502:113;;3542:58;627:1521:108;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;941:19:75;627:1521:108;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1611:13:198;;627:1521:108;1611:13:198;627:1521:108;1589:10:198;;:36;1585:63;;627:1521:108;;1767:26:198;;627:1521:108;1767:26:198;;627:1521:108;;;;;;;;1767:26:198;;;627:1521:108;1767:26:198;;:::i;:::-;627:1521:108;;1738:56:198;627:1521:108;1738:56:198;;627:1521:108;;;1738:56:198;627:1521:108;;;;;;;;;;;;;;:::i;1738:56:198:-;2466:103:13;;:::i;:::-;7561:6:193;;;:::i;:::-;2666:19:198;627:1521:108;;;2742:36:198;;;627:1521:108;2742:36:198;627:1521:108;2742:36:198;;627:1521:108;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2801:24:198;;627:1521:108;;;;;;;;;;:::i;:::-;;;;;;;;;2892:35:198;627:1521:108;;2892:35:198;;;;:::i;:::-;627:1521:108;;;;;;;-1:-1:-1;2991:9:198;;3002:10;;;;;;2835:790;;;;;;7650:16:193;;627:1521:108;;;;7779:38:193;627:1521:108;7699:26:193;627:1521:108;;;;7699:26:193;:::i;:::-;627:1521:108;;;;;;;7735:6:193;627:1521:108;;;;;7735:29:193;627:1521:108;;;7735:29:193;:::i;:::-;627:1521:108;;7779:38:193;627:1521:108;;7779:38:193;;;;;:::i;:::-;;;;627:1521:108;;;;;;;;;;;;;;;3014:3:198;3131:35;3055:11;;;;:::i;:::-;627:1521:108;;;;;3084:11:198;627:1521:108;;;;;;;;;;;;;3131:35:198;:::i;:::-;3239:58;;;;;;627:1521:108;;;3239:58:198;;627:1521:108;;;;3239:58:198;;627:1521:108;3282:4:198;627:1521:108;;;;;;;;;;;;;;;;3239:58:198;;;;;;;;;;;;3014:3;;;;;;:::i;:::-;2991:9;;3239:58;;;;;:::i;:::-;627:1521:108;;3239:58:198;;;;;627:1521:108;;;;;;;;;2835:790:198;627:1521:108;2801:24:198;;;3364:33;2801:24;;;;3364:33;;:::i;:::-;627:1521:108;;;;;3411:11:198;627:1521:108;;;;;;;;;;;;;;;;3502:113:198;;;2835:790;;;;;3502:113;3542:58;;;;;627:1521:108;;;3542:58:198;;627:1521:108;;;;3542:58:198;;627:1521:108;3585:4:198;627:1521:108;;;;;;;;;;;;;;;;;;;;;;3542:58:198;;;;;;;;;;3502:113;3542:58;;;;;:::i;:::-;627:1521:108;;3542:58:198;;3502:113;;3542:58;627:1521:108;;;;;;;;;1585:63:198;627:1521:108;1634:14:198;;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;627:1521:108;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2466:103:13;;:::i;:::-;9425:6:193;;;:::i;:::-;3977:19:198;627:1521:108;;;4021:32:198;;627:1521:108;;;;;;;;;;:::i;:::-;;;;;4120:43:198;627:1521:108;;;;4120:43:198;;;;;:::i;:::-;627:1521:108;;;;;4227:9:198;;4571:13;627:1521:108;4571:13:198;627:1521:108;;;;;4222:422:198;4238:10;;;;;;4063:991;;;;;;;9520:16:193;;627:1521:108;;;;;;;;9596:6:193;627:1521:108;;;;;;9628:28:193;;;627:1521:108;;;;9889:44:193;627:1521:108;;;;;9596:6:193;627:1521:108;;;;;;;;9838:26:193;627:1521:108;;9838:26:193;627:1521:108;9889:44:193;627:1521:108;;9889:44:193;;;;;:::i;627:1521:108:-;;;;;;;;;;;;;;;;;;;;;;;4250:3:198;4518:35;4291:11;;;;:::i;:::-;627:1521:108;;;;;4341:11:198;627:1521:108;;4379:76:198;627:1521:108;;;;;;4387:20:198;;;;;4379:76;:::i;:::-;627:1521:108;;;4341:11:198;627:1521:108;;;;;;;;;;;4518:35:198;:::i;:::-;4571:58;;;;;;627:1521:108;;;4571:58:198;;4606:4;627:1521:108;4571:58:198;;627:1521:108;;;;;;;;;;;;;;;;;;;;4571:58:198;;;;;;;;;;;;4250:3;;;;;;:::i;:::-;4227:9;;4571:58;;;;;:::i;:::-;627:1521:108;;4571:58:198;;;;4063:991;4696:41;4021:32;;;627:1521:108;4021:32:198;4696:41;;:::i;:::-;627:1521:108;;;;;;4772:11:198;627:1521:108;;4806:76:198;627:1521:108;;;;;;;;;;;;4814:20:198;4806:76;:::i;:::-;627:1521:108;;;4772:11:198;627:1521:108;;;;;;;;;;;4937:34:198;1683:1:108;4985:13:198;627:1521:108;4985:13:198;627:1521:108;4985:58:198;;;;;;627:1521:108;;;4985:58:198;;5020:4;627:1521:108;4985:58:198;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;4985:58:198;;;;;;;;4063:991;;;;4985:58;;;;;;;;:::i;:::-;;;;;;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;600:38:198;627:1521:108;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;;;:::i;627:1521:108:-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;627:1521:108;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;1683:1;627:1521;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;627:1521:108;6009:97:193;5929:184;627:1521:108;;-1:-1:-1;627:1521:108;6010:6:193;627:1521:108;;6010:76:193;627:1521:108;-1:-1:-1;627:1521:108;;6029:56:193;:21;;:::i;:::-;627:1521:108;-1:-1:-1;627:1521:108;6053:23:193;627:1521:108;;;-1:-1:-1;627:1521:108;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;627:1521:108;-1:-1:-1;627:1521:108;6090:7:193;627:1521:108;;;-1:-1:-1;627:1521:108;;6009:97:193;;:::i;:::-;5929:184;:::o;627:1521:108:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;627:1521:108;;;;;-1:-1:-1;627:1521:108;;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;627:1521:108;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;5307:338:193;5407:11;627:1521:108;5432:23:193;;5428:86;;5530:108;627:1521:108;5559:78:193;5530:25;627:1521:108;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;627:1521:108;5561:40:193;;:::i;:::-;5605:10;627:1521:108;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;627:1521:108;5478:25:193;627:1521:108;5471:32:193;:::o;1002:301:75:-;627:1521:108;1146:19:75;627:1521:108;1146:53:75;;;1142:96;;627:1521:108;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;627:1521:108;1215:12:75;:::o;4919:231:193:-;5028:15;627:1521:108;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;627:1521:108:-;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;1359:340:59:-;627:1521:108;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;627:1521:108;500:10:59;627:1521:108;500:10:59;;;;627:1521:108;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;627:1521:108;1528:12:59;:::o;627:1521:108:-;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;627:1521:108;4419:15:193;627:1521:108;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;627:1521:108;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;627:1521:108;-1:-1:-1;627:1521:108;4641:7:193;627:1521:108;;;-1:-1:-1;627:1521:108;;4337:49:193;627:1521:108;;-1:-1:-1;627:1521:108;4689:23:193;627:1521:108;;;-1:-1:-1;627:1521:108;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;627:1521:108;4396:195:193;;4400:54;627:1521:108;4438:11:193;627:1521:108;4438:16:193;;4400:54;;2575:307:13;1899:1;2702:7;627:1521:108;2702:18:13;2698:86;;1899:1;2702:7;627:1521:108;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;627:1521:108;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;627:1521:108;1029:19:76;627:1521:108;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;627:1521:108;;;1676:74:76;;627:1521:108;;;1676:74:76;;;627:1521:108;1327:10:76;627:1521:108;;;;1744:4:76;627:1521:108;;;;;-1:-1:-1;1676:74:76;;627:1521:108;;;;;;1676:74:76;;;;;;;627:1521:108;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;;;:::i;:::-;;;627:1521:108;;;;;;;:::i;:::-;1676:74:76;;;;;;-1:-1:-1;1676:74:76;;;627:1521:108;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;627:1521:108;2065:19:76;627:1521:108;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;627:1521:108;720:8:80;627:1521:108;720:8:80;;627:1521:108;;;;2115:1:76;2802:32;;:::o;2624:153::-;627:1521:108;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;627:1521:108;2361:10:76;627:1521:108;;;;2771:4:76;627:1521:108;;;;;-1:-1:-1;2682:95:76;;627:1521:108;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;;;:::i;:::-;;;627:1521:108;;;;;;;:::i;:::-;2682:95:76;;;;;;-1:-1:-1;2682:95:76;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;8370:720:8;;-1:-1:-1;8507:421:8;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:8;;8942:15;;627:1521:108;;;;8960:26:8;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;627:1521:108;9033:40:8;;-1:-1:-1;9033:40:8;627:1521:108;9033:40:8;627:1521:108;;-1:-1:-1;9033:40:8;8942:68;9009:1;8994:16;;8942:68;"},"gasEstimates":{"creation":{"codeDepositCost":"2752400","executionCost":"infinite","totalCost":"infinite"},"external":{"REWARDER_ROLE()":"567","REWARD_TOKEN()":"infinite","SCALING_FACTOR()":"infinite","STAKING_TOKEN()":"infinite","__msgData()":"infinite","addReward(uint256,uint256)":"infinite","claim(bytes)":"infinite","distributionEnd()":"2956","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2944","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2684","lastUpdated()":"2890","onERC721Received(address,address,uint256,bytes)":"infinite","owner()":"2722","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardHolder()":"2500","rewardPerStakePoint()":"11184","rewardPerStakePointPaid(address)":"2973","rewardPerStakePointStored()":"2802","rewardRate()":"2604","rewards(address)":"2445","setRewardHolder(address)":"infinite","stake(bytes)":"infinite","staked(address)":"2885","supportsInterface(bytes4)":"2463","tokenOwners(uint256)":"3089","totalStaked()":"2648","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_msgData()":"infinite","_msgSender()":"infinite","_tokenValue(uint256)":"infinite"}},"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","REWARD_TOKEN()":"99248ea7","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","__msgData()":"31e66e1e","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardHolder()":"569c93d2","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","setRewardHolder(address)":"6806cc93","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","tokenOwners(uint256)":"f8a14f46","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC721\",\"name\":\"stakingToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"InvalidRecoveryToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NotTheTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewardHolder\",\"type\":\"address\"}],\"name\":\"RewardHolderSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARD_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC721\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardHolder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardHolder_\",\"type\":\"address\"}],\"name\":\"setRewardHolder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Reverts with {InvalidToken} if the sender is not the staking token.\",\"params\":{\"from\":\"The address of the sender.\",\"tokenId\":\"The ID of the token received.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"setRewardHolder(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.\",\"params\":{\"rewardHolder_\":\"The address of the reward holder.\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as   (bool batch, uint256 tokenId) where batch is false, or   (bool batch, uint256[] tokenIds) where batch is true.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"setRewardHolder(address)\":{\"notice\":\"Sets the reward holder address.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol\":\"ERC721StakingERC20RewardsLinearPoolMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {ERC721StakingLinearPool} from \\\"./../../../staking/linear/stake/ERC721StakingLinearPool.sol\\\";\\nimport {LinearPool_ERC20Rewards} from \\\"./../../../staking/linear/reward/LinearPool_ERC20Rewards.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract ERC721StakingERC20RewardsLinearPoolMock is ERC721StakingLinearPool, LinearPool_ERC20Rewards {\\n    constructor(\\n        IERC721 stakingToken,\\n        IERC20 rewardToken,\\n        address rewardHolder,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC721StakingLinearPool(stakingToken, scalingFactorDecimals, forwarderRegistry) LinearPool_ERC20Rewards(rewardToken, rewardHolder) {}\\n\\n    function _computeClaim(\\n        address staker,\\n        uint256 claimable,\\n        bytes calldata claimData\\n    ) internal virtual override(LinearPool, LinearPool_ERC20Rewards) returns (uint256 claimed, uint256 unclaimed) {\\n        return LinearPool_ERC20Rewards._computeClaim(staker, claimable, claimData);\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override(LinearPool, LinearPool_ERC20Rewards) {\\n        LinearPool_ERC20Rewards._computeAddReward(rewarder, reward);\\n    }\\n\\n    function _tokenValue(uint256) internal view virtual override returns (uint256) {\\n        return 1;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgSender() internal view virtual override(Context, LinearPool) returns (address) {\\n        return LinearPool._msgSender();\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    function _msgData() internal view virtual override(Context, LinearPool) returns (bytes calldata) {\\n        return LinearPool._msgData();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xafdfdeaba5af316d586b39c9291f519883c7079674ad5e54feb0eef5c515e5f7\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/// @title LinearPool_ERC20Rewards\\n/// @notice A linear pool that allows for ERC20 rewards distribution.\\n// solhint-disable-next-line contract-name-capwords\\nabstract contract LinearPool_ERC20Rewards is ContractOwnership {\\n    using SafeERC20 for IERC20;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    IERC20 public immutable REWARD_TOKEN;\\n\\n    address public rewardHolder;\\n\\n    event RewardHolderSet(address indexed rewardHolder);\\n\\n    /// @dev Emits a {RewardHolderSet} event with the initial reward holder address.\\n    /// @param rewardToken The ERC20 token used for rewards.\\n    /// @param rewardHolder_ The address that holds the rewards.\\n    constructor(IERC20 rewardToken, address rewardHolder_) {\\n        REWARD_TOKEN = rewardToken;\\n        rewardHolder = rewardHolder_;\\n        emit RewardHolderSet(rewardHolder_);\\n    }\\n\\n    /// @notice Sets the reward holder address.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\\n    /// @param rewardHolder_ The address of the reward holder.\\n    function setRewardHolder(address rewardHolder_) external {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        if (rewardHolder_ != rewardHolder) {\\n            rewardHolder = rewardHolder_;\\n            emit RewardHolderSet(rewardHolder_);\\n        }\\n    }\\n\\n    /// @notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\\n    /// @param staker The address of the staker.\\n    /// @param claimable The amount of REWARD_TOKEN to be transferred.\\n    /// @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\\n    /// @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0.\\n    function _computeClaim(address staker, uint256 claimable, bytes calldata) internal virtual returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 0;\\n        REWARD_TOKEN.safeTransferFrom(rewardHolder, staker, claimable);\\n    }\\n\\n    /// @notice Computes the reward for a staker.\\n    /// @dev This function is empty since the rewards do not need to be transferred to this contract.\\n    function _computeAddReward(address, uint256) internal virtual {}\\n}\\n\",\"keccak256\":\"0x0c8dc711b3c8cb7f9ea2a1e8f6f956c821b0d7b56fe7a6839b5dfe3874c436ad\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC721StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC721Receiver} from \\\"./../../../token/ERC721/ERC721Receiver.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {IERC721} from \\\"./../../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n/// @title ERC721StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC721 tokens.\\nabstract contract ERC721StakingLinearPool is LinearPool, ERC721Receiver {\\n    IERC721 public immutable STAKING_TOKEN;\\n\\n    mapping(uint256 tokenId => address owner) public tokenOwners;\\n\\n    error InvalidToken();\\n    error NotTheTokenOwner(address staker, uint256 tokenId, address owner);\\n    error InvalidRecoveryToken(uint256 tokenId);\\n\\n    constructor(\\n        IERC721 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\\n    /// @param from The address of the sender.\\n    /// @param tokenId The ID of the token received.\\n    /// @return bytes4 The function selector of the callback.\\n    /// @dev Reverts with {InvalidToken} if the sender is not the staking token.\\n    function onERC721Received(address, address from, uint256 tokenId, bytes calldata) external virtual override returns (bytes4) {\\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n        bool requiresTransfer = false;\\n        bool batch = false;\\n        _stake(from, abi.encode(requiresTransfer, abi.encode(batch, tokenId)));\\n        return this.onERC721Received.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        bool batch = abi.decode(data, (bool));\\n        if (batch) {\\n            (, uint256[] memory tokenIds) = abi.decode(data, (bool, uint256[]));\\n            uint256 count = tokenIds.length;\\n            for (uint256 i; i != count; ++i) {\\n                uint256 tokenId = tokenIds[i];\\n                tokenOwners[tokenId] = staker;\\n                stakePoints += _tokenValue(tokenId);\\n                // batch case always requires transfer\\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\\n            }\\n        } else {\\n            (, uint256 tokenId) = abi.decode(data, (bool, uint256));\\n            tokenOwners[tokenId] = staker;\\n            stakePoints = _tokenValue(tokenId);\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\\n            }\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param withdrawData The data to be used for withdrawing, encoded as\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        bool batch = abi.decode(withdrawData, (bool));\\n        if (batch) {\\n            (, uint256[] memory tokenIds) = abi.decode(withdrawData, (bool, uint256[]));\\n            uint256 count = tokenIds.length;\\n            for (uint256 i; i != count; ++i) {\\n                uint256 tokenId = tokenIds[i];\\n                address tokenOwner = tokenOwners[tokenId];\\n                require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\\n                delete tokenOwners[tokenId];\\n                stakePoints += _tokenValue(tokenId);\\n                STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\\n            }\\n        } else {\\n            (, uint256 tokenId) = abi.decode(withdrawData, (bool, uint256));\\n            address tokenOwner = tokenOwners[tokenId];\\n            require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\\n            delete tokenOwners[tokenId];\\n            stakePoints = _tokenValue(tokenId);\\n            STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\\n        }\\n    }\\n\\n    /// @inheritdoc TokenRecoveryBase\\n    /// @dev Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual override {\\n        for (uint256 i; i != contracts.length; ++i) {\\n            if (contracts[i] == STAKING_TOKEN) {\\n                uint256 tokenId = tokenIds[i];\\n                require(tokenOwners[tokenId] == address(0), InvalidRecoveryToken(tokenId));\\n            }\\n        }\\n        super.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n\\n    /// @notice Computes the stake points for a given token ID.\\n    /// @param tokenId The ID of the token.\\n    /// @return stakePoints The stake points for the token.\\n    function _tokenValue(uint256 tokenId) internal view virtual returns (uint256 stakePoints);\\n}\\n\",\"keccak256\":\"0x9f1a764c34875019343fe6949bf5954b1555f52b72ea5fb42203b9c504161ffe\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Receiver} from \\\"./interfaces/IERC721Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Receiver is IERC721Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0x63a2d3363c5e74e4dbc670fcf947ffdfbe12c6059a9300432a3c46e0eb9c1235\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"},{"astId":22079,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"tokenOwners","offset":0,"slot":"9","type":"t_mapping(t_uint256,t_address)"},{"astId":21081,"contract":"contracts/mocks/staking/linear/ERC721StakingERC20RewardsLinearPoolMock.sol:ERC721StakingERC20RewardsLinearPoolMock","label":"rewardHolder","offset":0,"slot":"10","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_address)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => address)","numberOfBytes":"32","value":"t_address"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC721Received(address,address,uint256,bytes)":{"notice":"Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"setRewardHolder(address)":{"notice":"Sets the reward holder address."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol":{"LinearPoolClaimRemainderMock":{"abi":[{"inputs":[{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredReward","type":"uint256"}],"name":"ClaimTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for the stake (encoding freely determined by the deriving contracts)."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c0346101a457601f6124e238819003918201601f19168301916001600160401b038311848410176101a95780849260409485528339810103126101a45780519060ff82168092036101a457602001516001600160a01b03811681036101a45733610145575b6307f5828d60e41b60009081527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff191660019081179091559055608052604d81101561013457604d811161011e57600a0a60a05260405161232290816101c0823960805181818161191d01528181611f0e01526121d2015260a0518181816105150152818161076a01526110bc0152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610065565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c80628cc26214611b1157806301ffc9a714611aa95780630700037d14611a465780630968f264146119415780632b4c9f16146118d25780632c9d0b80146118995780632d1e0c02146117b55780632f2ff15d146115e6578063572b6c051461159a57806373c8a958146113b657806375c93bb9146110005780637b0a47ee14610fc457806380faa57d14610f83578063817b1cd214610f475780638580cf7614610eee5780638bb9c5bf14610d895780638da5cb5b14610d1757806391d1485414610c8557806398807d8414610c225780639d696e3614610be6578063c3666c361461093d578063c5c8f770146108da578063c63ff8dd14610723578063d0b06f5d146106e7578063d547741f14610538578063ef4cadc5146104df578063efa90b54146104a3578063f2fde38b1461037d5763f7ba94bd1461015b57600080fd5b3461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760043567ffffffffffffffff8111610378576101aa903690600401611c0d565b60243567ffffffffffffffff8111610374576101ca903690600401611c0d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020b6121bb565b9254169116908103610347575081810361031f57845b81811061022c578580f35b610237818387612083565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031b57610261828587612083565b35908147106102eb578780809381935af13d156102e3573d9061028382611e07565b916102916040519384611d97565b82523d88602084013e5b156102a95750600101610221565b80518790156102bb5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b60609061029b565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576103b5611b53565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103de6121bb565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610478575073ffffffffffffffffffffffffffffffffffffffff1692838303610426578480f35b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a3388080808480f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008652600452602485fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600554604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435610573611b7b565b61057b6121bb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661062d578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b936106dc918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600254604051908152f35b503461037a5761073236611b9e565b61073a612180565b6107426121bb565b9061074c826120e3565b61075582611d2d565b9283610764575b846001815580f35b909192937f00000000000000000000000000000000000000000000000000000000000000006107938187611e78565b9181156108ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830192808411610880578560809473ffffffffffffffffffffffffffffffffffffffff610835867f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9a999787601f977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09950509d06611d20565b9916988960005260076020526040600020556040519687956060875281606088015287870137600086838701015260208501526001604085015201168101030190a23880808061075c565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff61092c611b53565b168152600883522054604051908152f35b503461037a5761094c36611c3e565b9294939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109916121bb565b9254169116908103610bbb5750808214801590610bb1575b610b8957865b8281106109ba578780f35b73ffffffffffffffffffffffffffffffffffffffff6109e26109dd83858b612083565b6120c2565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610b7e578a91610b50575b5015610b25575073ffffffffffffffffffffffffffffffffffffffff610a706109dd83858b612083565b169088610a816109dd83878b612083565b610a8c83888a612083565b3593803b15610b215773ffffffffffffffffffffffffffffffffffffffff918360649260405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191898315610b1557600193610b05575b5050016109af565b610b0e91611d97565b3889610afd565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b610b71915060203d8111610b77575b610b698183611d97565b810190612168565b38610a46565b503d610b5f565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109a9565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600454604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff610c74611b53565b168152600683522054604051908152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760ff6040602092610cc4611b7b565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610de66121bb565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610ea8578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600154604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611f56565b604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576004356024356110396121bb565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff60408520541615611350578215611328578015611300577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156112d8576110f4611eb1565b60045560055442108015906112cd575b6112bd575b600554906111178342611d20565b914281116111805750928273ffffffffffffffffffffffffffffffffffffffff926111656040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497611e78565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461119a6111944286611cd1565b82611d0d565b8501948510948515029461129557838211611209575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112016111fa73ffffffffffffffffffffffffffffffffffffffff944290611cd1565b8092611e78565b60035561116c565b916112179193508094611e78565b9080821061126757509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749560035560055561116c565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b6112c5611f56565b600255611109565b506001541515611104565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b503461037a576113c536611c3e565b929594939290917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061140b6121bb565b925416911690810361156f5750808414801590611565575b61153d57855b848110611434578680f35b61143f81838a612083565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361153957886020916114716109dd868b8d612083565b8261147d878a8c612083565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526114d8606482611d97565b51925af11561152e5787513d6115255750803b155b6114fa5750600101611429565b7f5274afe7000000000000000000000000000000000000000000000000000000008852600452602487fd5b600114156114ed565b6040513d89823e3d90fd5b8880fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b5081841415611423565b7f2ef4875e000000000000000000000000000000000000000000000000000000008752600452602486fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206115dc6115d7611b53565b611ef7565b6040519015158152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435611621611b7b565b6116296121bb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361178a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff604086205416156116da578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d936106dc918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b506117d46117c236611b9e565b91906117cc6121bb565b923691611e41565b906117dd612180565b6117e6816120e3565b6117ef826122d8565b908115611871579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261183a83600154611d20565b6001551692838552600660205260408520611856838254611d20565b905561186760405192839283612017565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611eb1565b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461037a576119536117c236611b9e565b9061195c612180565b611965816120e3565b61196e826122d8565b908115611a1e5773ffffffffffffffffffffffffffffffffffffffff1691828452600660205260408420548281106119ea5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e93928587526006602052036040862055816001540360015561186760405192839283612017565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff611a98611b53565b168152600783522054604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361037a5760206115dc83611f68565b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611b4e611b53565b611d2d565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611b7657565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611b7657565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112611b765760043567ffffffffffffffff8111611b765782602382011215611b765780600401359267ffffffffffffffff8411611b765760248483010111611b76576024019190565b9181601f84011215611b765782359167ffffffffffffffff8311611b76576020808501948460051b010111611b7657565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112611b765760043567ffffffffffffffff8111611b765781611c8791600401611c0d565b9290929160243567ffffffffffffffff8111611b765781611caa91600401611c0d565b929092916044359067ffffffffffffffff8211611b7657611ccd91600401611c0d565b9091565b91908203918211611cde57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810292918115918404141715611cde57565b91908201809211611cde57565b73ffffffffffffffffffffffffffffffffffffffff611d949116806000526006602052611d7f604060002054611d79611d64611eb1565b84600052600860205260406000205490611cd1565b90611d0d565b90600052600760205260406000205490611d20565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611dd857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611dd857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192611e4d82611e07565b91611e5b6040519384611d97565b829481845281830111611b76578281602093846000960137010152565b8115611e82570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015611ef057611d9490611eea60045491611ee5611edc611ed3611f56565b60025490611cd1565b60035490611d0d565b611e78565b90611d20565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611f4f5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014611d9457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612011577f01ffc9a700000000000000000000000000000000000000000000000000000000811461200b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9291906040845280519081604086015260005b82811061206d57505060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000846020968a0101520116850101930152565b806020809284010151606082890101520161202a565b91908110156120935760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103611b765790565b6120eb611eb1565b600455600554421080159061215d575b61214d575b73ffffffffffffffffffffffffffffffffffffffff81169081612121575050565b61212a90611d2d565b816000526007602052604060002055600454906000526008602052604060002055565b612155611f56565b600255612100565b5060015415156120fb565b90816020910312611b7657518015158103611b765790565b600260005414612191576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156122c95732331480156122ce575b6122c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612243575b50611d9457503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156122bd5760009161229e575b5038612239565b6122b7915060203d602011610b7757610b698183611d97565b38612297565b6040513d6000823e3d90fd5b503390565b5060183610612202565b602081805181010312611b7657602001519056fea264697066735822122015a8fb031f0ee4ef18ee9b15cbc9adba2fc93515dfb67552c64a19b531a05af864736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0x1A4 JUMPI PUSH1 0x1F PUSH2 0x24E2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1A9 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1A4 JUMPI DUP1 MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x1A4 JUMPI PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x1A4 JUMPI CALLER PUSH2 0x145 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x134 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x11E JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x2322 SWAP1 DUP2 PUSH2 0x1C0 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x191D ADD MSTORE DUP2 DUP2 PUSH2 0x1F0E ADD MSTORE PUSH2 0x21D2 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x515 ADD MSTORE DUP2 DUP2 PUSH2 0x76A ADD MSTORE PUSH2 0x10BC ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x65 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x1B11 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1AA9 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x1A46 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1941 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x18D2 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1899 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x17B5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x15E6 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x159A JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x13B6 JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1000 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0xFC4 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0xF83 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xF47 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xEEE JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xD89 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD17 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xC85 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xC22 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xBE6 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x93D JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x8DA JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x723 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x6E7 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4DF JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37D JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x378 JUMPI PUSH2 0x1AA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x374 JUMPI PUSH2 0x1CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20B PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x347 JUMPI POP DUP2 DUP2 SUB PUSH2 0x31F JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x22C JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x237 DUP2 DUP4 DUP8 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31B JUMPI PUSH2 0x261 DUP3 DUP6 DUP8 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EB JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x283 DUP3 PUSH2 0x1E07 JUMP JUMPDEST SWAP2 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1D97 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x221 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2BB JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH2 0x3B5 PUSH2 0x1B53 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3DE PUSH2 0x21BB JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x478 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x426 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP6 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x573 PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0x57B PUSH2 0x21BB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x347 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x62D JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x6DC SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x732 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST PUSH2 0x73A PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x742 PUSH2 0x21BB JUMP JUMPDEST SWAP1 PUSH2 0x74C DUP3 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x755 DUP3 PUSH2 0x1D2D JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x764 JUMPI JUMPDEST DUP5 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH32 0x0 PUSH2 0x793 DUP2 DUP8 PUSH2 0x1E78 JUMP JUMPDEST SWAP2 DUP2 ISZERO PUSH2 0x8AD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 ADD SWAP3 DUP1 DUP5 GT PUSH2 0x880 JUMPI DUP6 PUSH1 0x80 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x835 DUP7 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP11 SWAP10 SWAP8 DUP8 PUSH1 0x1F SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP10 POP POP SWAP14 MOD PUSH2 0x1D20 JUMP JUMPDEST SWAP10 AND SWAP9 DUP10 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 PUSH1 0x60 DUP8 MSTORE DUP2 PUSH1 0x60 DUP9 ADD MSTORE DUP8 DUP8 ADD CALLDATACOPY PUSH1 0x0 DUP7 DUP4 DUP8 ADD ADD MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG2 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x75C JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x92C PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x94C CALLDATASIZE PUSH2 0x1C3E JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x991 PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xBBB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xBB1 JUMPI JUMPDEST PUSH2 0xB89 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x9BA JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E2 PUSH2 0x9DD DUP4 DUP6 DUP12 PUSH2 0x2083 JUMP JUMPDEST PUSH2 0x20C2 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB7E JUMPI DUP11 SWAP2 PUSH2 0xB50 JUMPI JUMPDEST POP ISZERO PUSH2 0xB25 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA70 PUSH2 0x9DD DUP4 DUP6 DUP12 PUSH2 0x2083 JUMP JUMPDEST AND SWAP1 DUP9 PUSH2 0xA81 PUSH2 0x9DD DUP4 DUP8 DUP12 PUSH2 0x2083 JUMP JUMPDEST PUSH2 0xA8C DUP4 DUP9 DUP11 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD SWAP4 DUP1 EXTCODESIZE ISZERO PUSH2 0xB21 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 PUSH1 0x64 SWAP3 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP10 DUP4 ISZERO PUSH2 0xB15 JUMPI PUSH1 0x1 SWAP4 PUSH2 0xB05 JUMPI JUMPDEST POP POP ADD PUSH2 0x9AF JUMP JUMPDEST PUSH2 0xB0E SWAP2 PUSH2 0x1D97 JUMP JUMPDEST CODESIZE DUP10 PUSH2 0xAFD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST PUSH2 0xB71 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xB77 JUMPI JUMPDEST PUSH2 0xB69 DUP2 DUP4 PUSH2 0x1D97 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2168 JUMP JUMPDEST CODESIZE PUSH2 0xA46 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x9A9 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC74 PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0xFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH2 0xCC4 PUSH2 0x1B7B JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP4 MSTORE DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xDE6 PUSH2 0x21BB JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP5 KECCAK256 SLOAD AND ISZERO PUSH2 0xEA8 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND DUP1 DUP6 MSTORE SWAP3 DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1039 PUSH2 0x21BB JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP6 KECCAK256 SLOAD AND ISZERO PUSH2 0x1350 JUMPI DUP3 ISZERO PUSH2 0x1328 JUMPI DUP1 ISZERO PUSH2 0x1300 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x12D8 JUMPI PUSH2 0x10F4 PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x12CD JUMPI JUMPDEST PUSH2 0x12BD JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1117 DUP4 TIMESTAMP PUSH2 0x1D20 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1180 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1165 PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x1E78 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x119A PUSH2 0x1194 TIMESTAMP DUP7 PUSH2 0x1CD1 JUMP JUMPDEST DUP3 PUSH2 0x1D0D JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x1295 JUMPI DUP4 DUP3 GT PUSH2 0x1209 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1201 PUSH2 0x11FA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x1E78 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x116C JUMP JUMPDEST SWAP2 PUSH2 0x1217 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x1E78 JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x1267 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x116C JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x12C5 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1104 JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x13C5 CALLDATASIZE PUSH2 0x1C3E JUMP JUMPDEST SWAP3 SWAP6 SWAP5 SWAP4 SWAP3 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x140B PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x156F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1565 JUMPI JUMPDEST PUSH2 0x153D JUMPI DUP6 JUMPDEST DUP5 DUP2 LT PUSH2 0x1434 JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH2 0x143F DUP2 DUP4 DUP11 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x1539 JUMPI DUP9 PUSH1 0x20 SWAP2 PUSH2 0x1471 PUSH2 0x9DD DUP7 DUP12 DUP14 PUSH2 0x2083 JUMP JUMPDEST DUP3 PUSH2 0x147D DUP8 DUP11 DUP13 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x14D8 PUSH1 0x64 DUP3 PUSH2 0x1D97 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x152E JUMPI DUP8 MLOAD RETURNDATASIZE PUSH2 0x1525 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x14FA JUMPI POP PUSH1 0x1 ADD PUSH2 0x1429 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x14ED JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP10 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP2 DUP5 EQ ISZERO PUSH2 0x1423 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0x15DC PUSH2 0x15D7 PUSH2 0x1B53 JUMP JUMPDEST PUSH2 0x1EF7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1621 PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0x1629 PUSH2 0x21BB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x178A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND ISZERO PUSH2 0x16DA JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x6DC SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP PUSH2 0x17D4 PUSH2 0x17C2 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x17CC PUSH2 0x21BB JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x1E41 JUMP JUMPDEST SWAP1 PUSH2 0x17DD PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x17E6 DUP2 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x17EF DUP3 PUSH2 0x22D8 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1871 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x183A DUP4 PUSH1 0x1 SLOAD PUSH2 0x1D20 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1856 DUP4 DUP3 SLOAD PUSH2 0x1D20 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1867 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2017 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1EB1 JUMP JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x1953 PUSH2 0x17C2 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST SWAP1 PUSH2 0x195C PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x1965 DUP2 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x196E DUP3 PUSH2 0x22D8 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1A1E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x19EA JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1867 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2017 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1A98 PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0x15DC DUP4 PUSH2 0x1F68 JUMP JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1B4E PUSH2 0x1B53 JUMP JUMPDEST PUSH2 0x1D2D JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B76 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B76 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x1B76 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1B76 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1B76 JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x1B76 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1B76 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1B76 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1B76 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x1B76 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP2 PUSH2 0x1C87 SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP2 PUSH2 0x1CAA SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B76 JUMPI PUSH2 0x1CCD SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x1CDE JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x1CDE JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x1CDE JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1D94 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x1D7F PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1D79 PUSH2 0x1D64 PUSH2 0x1EB1 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST SWAP1 PUSH2 0x1D0D JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1DD8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1DD8 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1E4D DUP3 PUSH2 0x1E07 JUMP JUMPDEST SWAP2 PUSH2 0x1E5B PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1D97 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1B76 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x1E82 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x1EF0 JUMPI PUSH2 0x1D94 SWAP1 PUSH2 0x1EEA PUSH1 0x4 SLOAD SWAP2 PUSH2 0x1EE5 PUSH2 0x1EDC PUSH2 0x1ED3 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1D0D JUMP JUMPDEST PUSH2 0x1E78 JUMP JUMPDEST SWAP1 PUSH2 0x1D20 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1F4F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x1D94 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2011 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x200B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH1 0x40 DUP5 MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x206D JUMPI POP POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 DUP5 PUSH1 0x20 SWAP7 DUP11 ADD ADD MSTORE ADD AND DUP6 ADD ADD SWAP4 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP10 ADD ADD MSTORE ADD PUSH2 0x202A JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2093 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B76 JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x20EB PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x215D JUMPI JUMPDEST PUSH2 0x214D JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x2121 JUMPI POP POP JUMP JUMPDEST PUSH2 0x212A SWAP1 PUSH2 0x1D2D JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x2155 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x2100 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x20FB JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B76 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B76 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2191 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x22C9 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x22CE JUMPI JUMPDEST PUSH2 0x22C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2243 JUMPI JUMPDEST POP PUSH2 0x1D94 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x22BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x229E JUMPI JUMPDEST POP CODESIZE PUSH2 0x2239 JUMP JUMPDEST PUSH2 0x22B7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB77 JUMPI PUSH2 0xB69 DUP2 DUP4 PUSH2 0x1D97 JUMP JUMPDEST CODESIZE PUSH2 0x2297 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2202 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP1 MLOAD DUP2 ADD SUB SLT PUSH2 0x1B76 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ISZERO 0xA8 EXTSTATICCALL SUB 0x1F 0xE RETF 0xEF XOR RETURNCONTRACT 0x9B ISZERO 0xCB 0xC9 0xAD 0xBA 0x2F 0xC9 CALLDATALOAD ISZERO 0xDF 0xB6 PUSH22 0x52C64A19B531A05AF864736F6C634300081E00330000 ","sourceMap":"215:944:109:-:0;;;;;;;;;;;;;-1:-1:-1;;215:944:109;;;;-1:-1:-1;;;;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;215:944:109;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;;;;;500:10:59;;;215:944:109;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;;;;1857:1:13;;745:39:76;;4180:2:193;4156:26;;215:944:109;;;4180:2:193;215:944:109;;;;;;4221:44:193;;215:944:109;;;;;;;;745:39:76;215:944:109;;;;;;;;;;;;;;;4221:44:193;215:944:109;;;;;;;;;;;;;;;;;;;;-1:-1:-1;215:944:109;;;;;-1:-1:-1;215:944:109;;;;;-1:-1:-1;215:944:109;;-1:-1:-1;215:944:109;1645:152:42;215:944:109;;;-1:-1:-1;;;;;;215:944:109;4082:10:193;215:944:109;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;215:944:109;-1:-1:-1;215:944:109;;;;;;-1:-1:-1;215:944:109;;;;;-1:-1:-1;215:944:109"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6995,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":7181,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":7230,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_available_length_bytes":{"entryPoint":7745,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":8552,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":7070,"id":null,"parameterSlots":1,"returnSlots":2},"abi_decode_t_address":{"entryPoint":7035,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":8215,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":7687,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":8323,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":7456,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_uint256":{"entryPoint":7800,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":7437,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":7377,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":7575,"id":null,"parameterSlots":2,"returnSlots":0},"fun_computeWithdraw":{"entryPoint":8920,"id":15563,"parameterSlots":1,"returnSlots":1},"fun_earned":{"entryPoint":7469,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":7927,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":8022,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgSender":{"entryPoint":8635,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":8576,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":7857,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":8040,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":8419,"id":20469,"parameterSlots":1,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":8386,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":6429},{"length":32,"start":7950},{"length":32,"start":8658}],"20300":[{"length":32,"start":1301},{"length":32,"start":1898},{"length":32,"start":4284}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c80628cc26214611b1157806301ffc9a714611aa95780630700037d14611a465780630968f264146119415780632b4c9f16146118d25780632c9d0b80146118995780632d1e0c02146117b55780632f2ff15d146115e6578063572b6c051461159a57806373c8a958146113b657806375c93bb9146110005780637b0a47ee14610fc457806380faa57d14610f83578063817b1cd214610f475780638580cf7614610eee5780638bb9c5bf14610d895780638da5cb5b14610d1757806391d1485414610c8557806398807d8414610c225780639d696e3614610be6578063c3666c361461093d578063c5c8f770146108da578063c63ff8dd14610723578063d0b06f5d146106e7578063d547741f14610538578063ef4cadc5146104df578063efa90b54146104a3578063f2fde38b1461037d5763f7ba94bd1461015b57600080fd5b3461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760043567ffffffffffffffff8111610378576101aa903690600401611c0d565b60243567ffffffffffffffff8111610374576101ca903690600401611c0d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020b6121bb565b9254169116908103610347575081810361031f57845b81811061022c578580f35b610237818387612083565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031b57610261828587612083565b35908147106102eb578780809381935af13d156102e3573d9061028382611e07565b916102916040519384611d97565b82523d88602084013e5b156102a95750600101610221565b80518790156102bb5750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b60609061029b565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576103b5611b53565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103de6121bb565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610478575073ffffffffffffffffffffffffffffffffffffffff1692838303610426578480f35b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a3388080808480f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008652600452602485fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600554604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435610573611b7b565b61057b6121bb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661062d578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b936106dc918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600254604051908152f35b503461037a5761073236611b9e565b61073a612180565b6107426121bb565b9061074c826120e3565b61075582611d2d565b9283610764575b846001815580f35b909192937f00000000000000000000000000000000000000000000000000000000000000006107938187611e78565b9181156108ad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830192808411610880578560809473ffffffffffffffffffffffffffffffffffffffff610835867f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca9a999787601f977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09950509d06611d20565b9916988960005260076020526040600020556040519687956060875281606088015287870137600086838701015260208501526001604085015201168101030190a23880808061075c565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526012600452fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff61092c611b53565b168152600883522054604051908152f35b503461037a5761094c36611c3e565b9294939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806109916121bb565b9254169116908103610bbb5750808214801590610bb1575b610b8957865b8281106109ba578780f35b73ffffffffffffffffffffffffffffffffffffffff6109e26109dd83858b612083565b6120c2565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610b7e578a91610b50575b5015610b25575073ffffffffffffffffffffffffffffffffffffffff610a706109dd83858b612083565b169088610a816109dd83878b612083565b610a8c83888a612083565b3593803b15610b215773ffffffffffffffffffffffffffffffffffffffff918360649260405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191898315610b1557600193610b05575b5050016109af565b610b0e91611d97565b3889610afd565b604051903d90823e3d90fd5b8280fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b610b71915060203d8111610b77575b610b698183611d97565b810190612168565b38610a46565b503d610b5f565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b50828214156109a9565b7f2ef4875e000000000000000000000000000000000000000000000000000000008852600452602487fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600454604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff610c74611b53565b168152600683522054604051908152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760ff6040602092610cc4611b7b565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358352855273ffffffffffffffffffffffffffffffffffffffff8383209116825284522054166040519015158152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610de66121bb565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff8316845260205260ff60408420541615610ea8578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931680855292825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600154604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611f56565b604051908152f35b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576004356024356110396121bb565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff8316855260205260ff60408520541615611350578215611328578015611300577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156112d8576110f4611eb1565b60045560055442108015906112cd575b6112bd575b600554906111178342611d20565b914281116111805750928273ffffffffffffffffffffffffffffffffffffffff926111656040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497611e78565b6003556005555b42600255835195865260208601521692a280f35b9160039391935461119a6111944286611cd1565b82611d0d565b8501948510948515029461129557838211611209575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112016111fa73ffffffffffffffffffffffffffffffffffffffff944290611cd1565b8092611e78565b60035561116c565b916112179193508094611e78565b9080821061126757509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749560035560055561116c565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b6112c5611f56565b600255611109565b506001541515611104565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b503461037a576113c536611c3e565b929594939290917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061140b6121bb565b925416911690810361156f5750808414801590611565575b61153d57855b848110611434578680f35b61143f81838a612083565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361153957886020916114716109dd868b8d612083565b8261147d878a8c612083565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526114d8606482611d97565b51925af11561152e5787513d6115255750803b155b6114fa5750600101611429565b7f5274afe7000000000000000000000000000000000000000000000000000000008852600452602487fd5b600114156114ed565b6040513d89823e3d90fd5b8880fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b5081841415611423565b7f2ef4875e000000000000000000000000000000000000000000000000000000008752600452602486fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a5760206115dc6115d7611b53565b611ef7565b6040519015158152f35b503461037a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435611621611b7b565b6116296121bb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361178a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff8416865260205260ff604086205416156116da578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d936106dc918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851687526020526040862060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b7f2ef4875e000000000000000000000000000000000000000000000000000000008552600452602484fd5b506117d46117c236611b9e565b91906117cc6121bb565b923691611e41565b906117dd612180565b6117e6816120e3565b6117ef826122d8565b908115611871579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e9261183a83600154611d20565b6001551692838552600660205260408520611856838254611d20565b905561186760405192839283612017565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611eb1565b503461037a57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461037a576119536117c236611b9e565b9061195c612180565b611965816120e3565b61196e826122d8565b908115611a1e5773ffffffffffffffffffffffffffffffffffffffff1691828452600660205260408420548281106119ea5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e93928587526006602052036040862055816001540360015561186760405192839283612017565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57604060209173ffffffffffffffffffffffffffffffffffffffff611a98611b53565b168152600783522054604051908152f35b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a57600435907fffffffff000000000000000000000000000000000000000000000000000000008216820361037a5760206115dc83611f68565b503461037a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261037a576020610fbc611b4e611b53565b611d2d565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611b7657565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611b7657565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112611b765760043567ffffffffffffffff8111611b765782602382011215611b765780600401359267ffffffffffffffff8411611b765760248483010111611b76576024019190565b9181601f84011215611b765782359167ffffffffffffffff8311611b76576020808501948460051b010111611b7657565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112611b765760043567ffffffffffffffff8111611b765781611c8791600401611c0d565b9290929160243567ffffffffffffffff8111611b765781611caa91600401611c0d565b929092916044359067ffffffffffffffff8211611b7657611ccd91600401611c0d565b9091565b91908203918211611cde57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810292918115918404141715611cde57565b91908201809211611cde57565b73ffffffffffffffffffffffffffffffffffffffff611d949116806000526006602052611d7f604060002054611d79611d64611eb1565b84600052600860205260406000205490611cd1565b90611d0d565b90600052600760205260406000205490611d20565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611dd857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611dd857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192611e4d82611e07565b91611e5b6040519384611d97565b829481845281830111611b76578281602093846000960137010152565b8115611e82570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015611ef057611d9490611eea60045491611ee5611edc611ed3611f56565b60025490611cd1565b60035490611d0d565b611e78565b90611d20565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611f4f5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014611d9457504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612011577f01ffc9a700000000000000000000000000000000000000000000000000000000811461200b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9291906040845280519081604086015260005b82811061206d57505060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000846020968a0101520116850101930152565b806020809284010151606082890101520161202a565b91908110156120935760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103611b765790565b6120eb611eb1565b600455600554421080159061215d575b61214d575b73ffffffffffffffffffffffffffffffffffffffff81169081612121575050565b61212a90611d2d565b816000526007602052604060002055600454906000526008602052604060002055565b612155611f56565b600255612100565b5060015415156120fb565b90816020910312611b7657518015158103611b765790565b600260005414612191576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156122c95732331480156122ce575b6122c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612243575b50611d9457503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156122bd5760009161229e575b5038612239565b6122b7915060203d602011610b7757610b698183611d97565b38612297565b6040513d6000823e3d90fd5b503390565b5060183610612202565b602081805181010312611b7657602001519056fea264697066735822122015a8fb031f0ee4ef18ee9b15cbc9adba2fc93515dfb67552c64a19b531a05af864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x1B11 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1AA9 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x1A46 JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1941 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x18D2 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1899 JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x17B5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x15E6 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x159A JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x13B6 JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x1000 JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0xFC4 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0xF83 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xF47 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xEEE JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xD89 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD17 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xC85 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xC22 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xBE6 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x93D JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x8DA JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x723 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x6E7 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4DF JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37D JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x378 JUMPI PUSH2 0x1AA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x374 JUMPI PUSH2 0x1CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20B PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x347 JUMPI POP DUP2 DUP2 SUB PUSH2 0x31F JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x22C JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x237 DUP2 DUP4 DUP8 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31B JUMPI PUSH2 0x261 DUP3 DUP6 DUP8 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EB JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x283 DUP3 PUSH2 0x1E07 JUMP JUMPDEST SWAP2 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1D97 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x221 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2BB JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH2 0x3B5 PUSH2 0x1B53 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3DE PUSH2 0x21BB JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x478 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x426 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP6 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x573 PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0x57B PUSH2 0x21BB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x347 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x62D JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x6DC SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x732 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST PUSH2 0x73A PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x742 PUSH2 0x21BB JUMP JUMPDEST SWAP1 PUSH2 0x74C DUP3 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x755 DUP3 PUSH2 0x1D2D JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x764 JUMPI JUMPDEST DUP5 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH32 0x0 PUSH2 0x793 DUP2 DUP8 PUSH2 0x1E78 JUMP JUMPDEST SWAP2 DUP2 ISZERO PUSH2 0x8AD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 ADD SWAP3 DUP1 DUP5 GT PUSH2 0x880 JUMPI DUP6 PUSH1 0x80 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x835 DUP7 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP11 SWAP10 SWAP8 DUP8 PUSH1 0x1F SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP10 POP POP SWAP14 MOD PUSH2 0x1D20 JUMP JUMPDEST SWAP10 AND SWAP9 DUP10 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 PUSH1 0x60 DUP8 MSTORE DUP2 PUSH1 0x60 DUP9 ADD MSTORE DUP8 DUP8 ADD CALLDATACOPY PUSH1 0x0 DUP7 DUP4 DUP8 ADD ADD MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG2 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x75C JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x92C PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x94C CALLDATASIZE PUSH2 0x1C3E JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x991 PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0xBBB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xBB1 JUMPI JUMPDEST PUSH2 0xB89 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0x9BA JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E2 PUSH2 0x9DD DUP4 DUP6 DUP12 PUSH2 0x2083 JUMP JUMPDEST PUSH2 0x20C2 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB7E JUMPI DUP11 SWAP2 PUSH2 0xB50 JUMPI JUMPDEST POP ISZERO PUSH2 0xB25 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA70 PUSH2 0x9DD DUP4 DUP6 DUP12 PUSH2 0x2083 JUMP JUMPDEST AND SWAP1 DUP9 PUSH2 0xA81 PUSH2 0x9DD DUP4 DUP8 DUP12 PUSH2 0x2083 JUMP JUMPDEST PUSH2 0xA8C DUP4 DUP9 DUP11 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD SWAP4 DUP1 EXTCODESIZE ISZERO PUSH2 0xB21 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 PUSH1 0x64 SWAP3 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP10 DUP4 ISZERO PUSH2 0xB15 JUMPI PUSH1 0x1 SWAP4 PUSH2 0xB05 JUMPI JUMPDEST POP POP ADD PUSH2 0x9AF JUMP JUMPDEST PUSH2 0xB0E SWAP2 PUSH2 0x1D97 JUMP JUMPDEST CODESIZE DUP10 PUSH2 0xAFD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST PUSH2 0xB71 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xB77 JUMPI JUMPDEST PUSH2 0xB69 DUP2 DUP4 PUSH2 0x1D97 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2168 JUMP JUMPDEST CODESIZE PUSH2 0xA46 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x9A9 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xC74 PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0xFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH2 0xCC4 PUSH2 0x1B7B JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP4 MSTORE DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP4 KECCAK256 SWAP2 AND DUP3 MSTORE DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xDE6 PUSH2 0x21BB JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP5 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP5 KECCAK256 SLOAD AND ISZERO PUSH2 0xEA8 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND DUP1 DUP6 MSTORE SWAP3 DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1039 PUSH2 0x21BB JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP6 KECCAK256 SLOAD AND ISZERO PUSH2 0x1350 JUMPI DUP3 ISZERO PUSH2 0x1328 JUMPI DUP1 ISZERO PUSH2 0x1300 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x12D8 JUMPI PUSH2 0x10F4 PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x12CD JUMPI JUMPDEST PUSH2 0x12BD JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x1117 DUP4 TIMESTAMP PUSH2 0x1D20 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1180 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x1165 PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x1E78 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x119A PUSH2 0x1194 TIMESTAMP DUP7 PUSH2 0x1CD1 JUMP JUMPDEST DUP3 PUSH2 0x1D0D JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x1295 JUMPI DUP4 DUP3 GT PUSH2 0x1209 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1201 PUSH2 0x11FA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x1E78 JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x116C JUMP JUMPDEST SWAP2 PUSH2 0x1217 SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x1E78 JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x1267 JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x116C JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x12C5 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1104 JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x13C5 CALLDATASIZE PUSH2 0x1C3E JUMP JUMPDEST SWAP3 SWAP6 SWAP5 SWAP4 SWAP3 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x140B PUSH2 0x21BB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x156F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1565 JUMPI JUMPDEST PUSH2 0x153D JUMPI DUP6 JUMPDEST DUP5 DUP2 LT PUSH2 0x1434 JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH2 0x143F DUP2 DUP4 DUP11 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x1539 JUMPI DUP9 PUSH1 0x20 SWAP2 PUSH2 0x1471 PUSH2 0x9DD DUP7 DUP12 DUP14 PUSH2 0x2083 JUMP JUMPDEST DUP3 PUSH2 0x147D DUP8 DUP11 DUP13 PUSH2 0x2083 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x14D8 PUSH1 0x64 DUP3 PUSH2 0x1D97 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x152E JUMPI DUP8 MLOAD RETURNDATASIZE PUSH2 0x1525 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x14FA JUMPI POP PUSH1 0x1 ADD PUSH2 0x1429 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x14ED JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP10 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP2 DUP5 EQ ISZERO PUSH2 0x1423 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0x15DC PUSH2 0x15D7 PUSH2 0x1B53 JUMP JUMPDEST PUSH2 0x1EF7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1621 PUSH2 0x1B7B JUMP JUMPDEST PUSH2 0x1629 PUSH2 0x21BB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x178A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP7 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 DUP7 KECCAK256 SLOAD AND ISZERO PUSH2 0x16DA JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x6DC SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP5 REVERT JUMPDEST POP PUSH2 0x17D4 PUSH2 0x17C2 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x17CC PUSH2 0x21BB JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x1E41 JUMP JUMPDEST SWAP1 PUSH2 0x17DD PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x17E6 DUP2 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x17EF DUP3 PUSH2 0x22D8 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1871 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x183A DUP4 PUSH1 0x1 SLOAD PUSH2 0x1D20 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1856 DUP4 DUP3 SLOAD PUSH2 0x1D20 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1867 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2017 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1EB1 JUMP JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH2 0x1953 PUSH2 0x17C2 CALLDATASIZE PUSH2 0x1B9E JUMP JUMPDEST SWAP1 PUSH2 0x195C PUSH2 0x2180 JUMP JUMPDEST PUSH2 0x1965 DUP2 PUSH2 0x20E3 JUMP JUMPDEST PUSH2 0x196E DUP3 PUSH2 0x22D8 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1A1E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x19EA JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1867 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2017 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1A98 PUSH2 0x1B53 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0x15DC DUP4 PUSH2 0x1F68 JUMP JUMPDEST POP CALLVALUE PUSH2 0x37A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x37A JUMPI PUSH1 0x20 PUSH2 0xFBC PUSH2 0x1B4E PUSH2 0x1B53 JUMP JUMPDEST PUSH2 0x1D2D JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B76 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1B76 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x1B76 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1B76 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1B76 JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x1B76 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1B76 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1B76 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1B76 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x1B76 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP2 PUSH2 0x1C87 SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B76 JUMPI DUP2 PUSH2 0x1CAA SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B76 JUMPI PUSH2 0x1CCD SWAP2 PUSH1 0x4 ADD PUSH2 0x1C0D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x1CDE JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x1CDE JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x1CDE JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1D94 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x1D7F PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1D79 PUSH2 0x1D64 PUSH2 0x1EB1 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST SWAP1 PUSH2 0x1D0D JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1DD8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1DD8 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1E4D DUP3 PUSH2 0x1E07 JUMP JUMPDEST SWAP2 PUSH2 0x1E5B PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1D97 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1B76 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x1E82 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x1EF0 JUMPI PUSH2 0x1D94 SWAP1 PUSH2 0x1EEA PUSH1 0x4 SLOAD SWAP2 PUSH2 0x1EE5 PUSH2 0x1EDC PUSH2 0x1ED3 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1CD1 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1D0D JUMP JUMPDEST PUSH2 0x1E78 JUMP JUMPDEST SWAP1 PUSH2 0x1D20 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1F4F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x1D94 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2011 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x200B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH1 0x40 DUP5 MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x206D JUMPI POP POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 DUP5 PUSH1 0x20 SWAP7 DUP11 ADD ADD MSTORE ADD AND DUP6 ADD ADD SWAP4 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP10 ADD ADD MSTORE ADD PUSH2 0x202A JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2093 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B76 JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x20EB PUSH2 0x1EB1 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x215D JUMPI JUMPDEST PUSH2 0x214D JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x2121 JUMPI POP POP JUMP JUMPDEST PUSH2 0x212A SWAP1 PUSH2 0x1D2D JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x2155 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x2100 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x20FB JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1B76 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1B76 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2191 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x22C9 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x22CE JUMPI JUMPDEST PUSH2 0x22C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2243 JUMPI JUMPDEST POP PUSH2 0x1D94 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x22BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x229E JUMPI JUMPDEST POP CODESIZE PUSH2 0x2239 JUMP JUMPDEST PUSH2 0x22B7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB77 JUMPI PUSH2 0xB69 DUP2 DUP4 PUSH2 0x1D97 JUMP JUMPDEST CODESIZE PUSH2 0x2297 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2202 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP1 MLOAD DUP2 ADD SUB SLT PUSH2 0x1B76 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ISZERO 0xA8 EXTSTATICCALL SUB 0x1F 0xE RETF 0xEF XOR RETURNCONTRACT 0x9B ISZERO 0xCB 0xC9 0xAD 0xBA 0x2F 0xC9 CALLDATALOAD ISZERO 0xDF 0xB6 PUSH22 0x52C64A19B531A05AF864736F6C634300081E00330000 ","sourceMap":"215:944:109:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;215:944:109;;16306:41:193;;;:::i;:::-;215:944:109;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1834:9;1845:10;;;;;;215:944:109;;;1857:3:192;1876:11;;;;;:::i;:::-;215:944:109;;;;;;;;;1898:10:192;;;;;:::i;:::-;215:944:109;1375:21:9;;;:30;1371:125;;1548:33;;;;;;;;215:944:109;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;215:944:109;;1834:9:192;;1591:58:9;215:944:109;;;;5690:21:9;:17;;5815:105;215:944:109;5815:105:9;;;;;5686:301;5957:19;;215:944:109;5957:19:9;;;215:944:109;;;;;1371:125:9;215:944:109;1455:21:9;;;1428:57;;;215:944:109;;;;1428:57:9;215:944:109;;;;1756:63:192;215:944:109;1793:26:192;;;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;215:944:109;;-1:-1:-1;4538:25:42;215:944:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;:::i;:::-;215:944:109;;;;;;;;;;3205:23:42;;;3201:60;;215:944:109;;;3275:25:42;;;;3271:146;;215:944:109;;;3271:146:42;215:944:109;;;;;;3361:45:42;;;;3271:146;;;;215:944:109;;;3201:60:42;3237:24;;;215:944:109;;;3237:24:42;;215:944:109;;;;;;;;;;;;;2158:30:193;215:944:109;;;;;;;;;;;;;;;;;;;;;;1971:39:193;215:944:109;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;215:944:109;;;;;;;4503:26:42;;;4499:64;;4464:19:41;215:944:109;;;;;;;;;;;;;-1:-1:-1;215:944:109;;;500:10:59;215:944:109;-1:-1:-1;215:944:109;500:10:59;;1880:140:41;;215:944:109;;;1880:140:41;1973:36;215:944:109;1973:36:41;215:944:109;;;;;;;;;;;;-1:-1:-1;215:944:109;;;;-1:-1:-1;215:944:109;;;;;;;;;1973:36:41;;;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;;;1880:140;;;;215:944:109;;;;;;;;;;;;;;;;2049:26:193;215:944:109;;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;215:944:109;;1857:1:13;215:944:109;;;;10393:466:193;10453:14;;;;;10444:23;;;;:::i;:::-;215:944:109;;;;;;;;;;;;;;10637:19:193;215:944:109;10637:19:193;215:944:109;10750:33:193;10637:19;10802:46;10637:19;;;;215:944:109;10637:19:193;215:944:109;10637:19:193;215:944:109;;;;10750:33:193;:::i;:::-;215:944:109;;;;-1:-1:-1;215:944:109;10732:7:193;215:944:109;;;-1:-1:-1;215:944:109;;;;;;;;;;;;;;;;;;;-1:-1:-1;215:944:109;;;;;;;;;;1031:1;215:944;;;;;;;;10802:46:193;;;;10393:466;;;;;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;215:944:109;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;215:944:109;;;16306:41:193;;:::i;:::-;215:944:109;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;215:944:109;3852:94:192;;3961:9;3972:10;;;;;;215:944:109;;;3984:3:192;215:944:109;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;215:944:109;;;;4058:76:192;;4108:25;215:944:109;4058:76:192;;215:944:109;4058:76:192;;;;;;;;;;;;;;;;3984:3;4057:77;;4053:173;;4239:12;215:944:109;4239:12:192;;;;;;:::i;:::-;215:944:109;4284:11:192;;;;;;;;:::i;:::-;4297;;;;;:::i;:::-;215:944:109;4239:70:192;;;;;;215:944:109;;;4239:70:192;215:944:109;;;4239:70:192;;;;;215:944:109;4239:70:192;;4277:4;215:944:109;4239:70:192;;215:944:109;;4058:76:192;215:944:109;;;;;;;4239:70:192;;;;;;;;215:944:109;4239:70:192;;;3984:3;;;215:944:109;3961:9:192;;4239:70;;;;:::i;:::-;;;;;;215:944:109;;;;;;;;;;4239:70:192;215:944:109;;;4053:173:192;4161:50;;;215:944:109;;4058:76:192;4161:50;;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;215:944:109;;;;;;;;;3852:94:192;215:944:109;3920:26:192;;;;;3856:55;3886:25;;;;;3856:55;;4499:64:42;4538:25;;;;215:944:109;;4538:25:42;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;215:944:109;;;;;;;;;;;;;;;;;;;;;;500:10:59;215:944:109;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;215:944:109;;;;;;500:10:59;;215:944:109;;;;;;;;;;;;;;;;;;;;912:80:42;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;215:944:109;16306:41:193;;:::i;:::-;215:944:109;;;;;;;;;;;;;;;;;500:10:59;215:944:109;;;500:10:59;;3741:25:41;3737:66;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;215:944:109;;2455:33:41;215:944:109;;3737:66:41;3775:28;215:944:109;3775:28:41;215:944:109;3775:28:41;;;;215:944:109;;;;;3775:28:41;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;215:944:109;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2081:25:193;215:944:109;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;4464:19:41;215:944:109;;;;;;;;;;;;;;;;500:10:59;215:944:109;;;500:10:59;;3741:25:41;3737:66;;12172:11:193;;215:944:109;;12225:13:193;;215:944:109;;12321:14:193;215:944:109;;;2570:213:20;;;;;215:944:109;;;34863:71:21;;215:944:109;;4365:21:193;;:::i;:::-;215:944:109;;4419:15:193;215:944:109;4400:15:193;:34;;;:54;;;215:944:109;4396:195:193;;215:944:109;4419:15:193;215:944:109;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;215:944:109;12664:22:193;;215:944:109;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;215:944:109;4419:15:193;215:944:109;12551:1311:193;4400:15;13871:29;215:944:109;;;;;;;;;;;13962:39:193;;215:944:109;;12551:1311:193;215:944:109;12795:10:193;215:944:109;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;215:944:109;;1859:6:20;;;;;;215:944:109;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;215:944:109;4400:15:193;13357:22;13286:40;215:944:109;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;215:944:109;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;215:944:109;;;;;;;;13962:39:193;215:944:109;12795:10:193;215:944:109;4419:15:193;215:944:109;12551:1311:193;;215:944:109;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;215:944:109;4396:195:193;;4400:54;215:944:109;4438:11:193;215:944:109;4438:16:193;;4400:54;;215:944:109;;;;;;;;;;;;;;;;;;;;;3737:66:41;215:944:109;3775:28:41;215:944:109;3775:28:41;;;;215:944:109;;;;;;3775:28:41;215:944:109;;;;;;;;:::i;:::-;5148:19:42;;;;;;;215:944:109;;;16306:41:193;;:::i;:::-;215:944:109;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;215:944:109;2776:90:192;;2881:9;2892:10;;;;;;215:944:109;;;2904:3:192;2923:9;;;;;:::i;:::-;215:944:109;;;;;;;;;;2946:11:192;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;;;;;;:::i;:::-;215:944:109;;;1328:43:8;215:944:109;1328:43:8;;;;215:944:109;1328:43:8;;215:944:109;1328:43:8;;;215:944:109;1328:43:8;215:944:109;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;;;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;215:944:109;;2881:9:192;;8938:146:8;9033:40;;;215:944:109;;1328:43:8;9033:40;;8942:68;215:944:109;8994:16:8;;8942:68;;8507:421;215:944:109;8507:421:8;;;;;;;;215:944:109;;;;2776:90:192;215:944:109;2840:26:192;;;;;2780:51;2807:24;;;;;2780:51;;4499:64:42;4538:25;;;;215:944:109;;4538:25:42;;215:944:109;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;215:944:109;;;;;;;4503:26:42;;;4499:64;;4464:19:41;215:944:109;;;;;;;;;;;;;;;;;500:10:59;215:944:109;;;500:10:59;;1254:25:41;1250:140;;215:944:109;;;1250:140:41;1343:36;215:944:109;1343:36:41;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;;;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;4499:64:42;4538:25;;;;215:944:109;;4538:25:42;;215:944:109;;;;;;:::i;:::-;16306:41:193;;;;:::i;:::-;215:944:109;;;;:::i;:::-;2466:103:13;;;:::i;:::-;7561:6:193;;;:::i;:::-;7600:32;;;:::i;:::-;7650:16;;;215:944:109;;;;7779:38:193;215:944:109;7699:26:193;215:944:109;7699:26:193;215:944:109;7699:26:193;:::i;:::-;;215:944:109;;;;;;7735:6:193;215:944:109;;;;;7735:29:193;215:944:109;;;7735:29:193;:::i;:::-;215:944:109;;7779:38:193;215:944:109;;7779:38:193;;;;;:::i;:::-;;;;7699:26;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;941:19:75;215:944:109;;;;;;;;;;;;;:::i;:::-;2466:103:13;;;:::i;:::-;9425:6:193;;;:::i;:::-;9464:38;;;:::i;:::-;9520:16;;;215:944:109;;;;;;;;9596:6:193;215:944:109;;;;;;9628:28:193;;;215:944:109;;;;9889:44:193;215:944:109;;;;;9596:6:193;215:944:109;;;;;;;;9838:26:193;215:944:109;;9838:26:193;215:944:109;9889:44:193;215:944:109;;9889:44:193;;;;;:::i;215:944:109:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;215:944:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;;;:::i;215:944:109:-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;215:944:109;6009:97:193;5929:184;215:944:109;;-1:-1:-1;215:944:109;6010:6:193;215:944:109;;6010:76:193;215:944:109;-1:-1:-1;215:944:109;;6029:56:193;:21;;:::i;:::-;215:944:109;-1:-1:-1;215:944:109;6053:23:193;215:944:109;;;-1:-1:-1;215:944:109;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;215:944:109;-1:-1:-1;215:944:109;6090:7:193;215:944:109;;;-1:-1:-1;215:944:109;;6009:97:193;;:::i;:::-;5929:184;:::o;215:944:109:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;215:944:109;;;;;-1:-1:-1;215:944:109;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;215:944:109;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;5307:338:193;5407:11;215:944:109;5432:23:193;;5428:86;;5530:108;215:944:109;5559:78:193;5530:25;215:944:109;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;215:944:109;5561:40:193;;:::i;:::-;5605:10;215:944:109;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;215:944:109;5478:25:193;215:944:109;5471:32:193;:::o;1002:301:75:-;215:944:109;1146:19:75;215:944:109;1146:53:75;;;1142:96;;215:944:109;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;215:944:109;1215:12:75;:::o;4919:231:193:-;5028:15;215:944:109;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;1359:340:59:-;215:944:109;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;215:944:109;500:10:59;215:944:109;500:10:59;;;;215:944:109;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;215:944:109;1528:12:59;:::o;215:944:109:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;215:944:109;4419:15:193;215:944:109;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;215:944:109;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;215:944:109;-1:-1:-1;215:944:109;4641:7:193;215:944:109;;;-1:-1:-1;215:944:109;;4337:49:193;215:944:109;;-1:-1:-1;215:944:109;4689:23:193;215:944:109;;;-1:-1:-1;215:944:109;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;215:944:109;4396:195:193;;4400:54;215:944:109;4438:11:193;215:944:109;4438:16:193;;4400:54;;215:944:109;;;;;;;;;;;;;;;;;;:::o;2575:307:13:-;1899:1;2702:7;215:944:109;2702:18:13;2698:86;;1899:1;2702:7;215:944:109;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;907:917:76;215:944:109;1029:19:76;215:944:109;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;1676:74;215:944:109;;;;;;1676:74:76;;;;215:944:109;1676:74:76;;;;;;215:944:109;1327:10:76;215:944:109;;;;1744:4:76;215:944:109;;;;1676:74:76;;;;;;;215:944:109;1676:74:76;;;1630:120;;;;;1676:74;;;;215:944:109;1676:74:76;215:944:109;1676:74:76;;;;;;;:::i;:::-;;;;;215:944:109;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;671:184:109;813:35;215:944;;;813:35;;215:944;;;;813:35;;215:944;671:184;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"1798800","executionCost":"infinite","totalCost":"infinite"},"external":{"REWARDER_ROLE()":"457","SCALING_FACTOR()":"infinite","addReward(uint256,uint256)":"infinite","claim(bytes)":"infinite","distributionEnd()":"2824","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2834","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2574","lastUpdated()":"2758","owner()":"2612","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardPerStakePoint()":"11140","rewardPerStakePointPaid(address)":"2841","rewardPerStakePointStored()":"2670","rewardRate()":"2494","rewards(address)":"2423","stake(bytes)":"infinite","staked(address)":"2775","supportsInterface(bytes4)":"2463","totalStaked()":"2538","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_computeStake(address,bytes memory)":"infinite","_computeWithdraw(address,bytes memory)":"infinite"}},"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"transferredReward\",\"type\":\"uint256\"}],\"name\":\"ClaimTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for the stake (encoding freely determined by the deriving contracts).\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol\":\"LinearPoolClaimRemainderMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract LinearPoolClaimRemainderMock is LinearPool {\\n    event ClaimTransferred(uint256 totalReward, uint256 transferredReward);\\n\\n    constructor(uint8 scalingFactorDecimals, IForwarderRegistry forwarderRegistry) LinearPool(scalingFactorDecimals, forwarderRegistry) {}\\n\\n    function _computeStake(address, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(stakeData, (uint256));\\n    }\\n\\n    function _computeWithdraw(address, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(withdrawData, (uint256));\\n    }\\n\\n    function _computeClaim(address, uint256 claimable, bytes calldata) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable - 1;\\n        unclaimed = 1;\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {}\\n}\\n\",\"keccak256\":\"0xede37bde86aa8aa232815b1369327ba9ccc71452cb3e0e3ebd88874cc0f3e2b6\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/LinearPoolClaimRemainderMock.sol:LinearPoolClaimRemainderMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol":{"LinearPoolInvalidClaimSumMock":{"abi":[{"inputs":[{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferredReward","type":"uint256"}],"name":"ClaimTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for the stake (encoding freely determined by the deriving contracts)."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c0346101a457601f6122fb38819003918201601f19168301916001600160401b038311848410176101a95780849260409485528339810103126101a45780519060ff82168092036101a457602001516001600160a01b03811681036101a45733610145575b6307f5828d60e41b60009081527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff191660019081179091559055608052604d81101561013457604d811161011e57600a0a60a05260405161213b90816101c0823960805181818161179f01528181611d330152611ff7015260a0518181816104dd0152818161070601526110010152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610065565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80628cc2621461199a57806301ffc9a7146119345780630700037d146118cf5780630968f264146117c35780632b4c9f16146117545780632c9d0b801461171b5780632d1e0c02146116365780632f2ff15d146114aa578063572b6c051461145f57806373c8a958146112dc57806375c93bb914610f6b5780637b0a47ee14610f2f57806380faa57d14610eee578063817b1cd214610eb25780638580cf7614610e595780638bb9c5bf14610cea5780638da5cb5b14610c7957806391d1485414610be157806398807d8414610b7c5780639d696e3614610b40578063c3666c36146108f7578063c5c8f77014610892578063c63ff8dd146106c5578063d0b06f5d14610689578063d547741f14610500578063ef4cadc5146104a7578063efa90b541461046b578063f2fde38b146103785763f7ba94bd1461015a57600080fd5b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760043567ffffffffffffffff811161031c576101a9903690600401611a90565b60243567ffffffffffffffff811161031c576101c9903690600401611a90565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020a611fe0565b925416911690810361034b57508181036103215760005b81811061022a57005b610235818387611ea8565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031c5761025f828587611ea8565b35908147106102ea57600080809381935af13d156102e2573d9061028282611c5b565b916102906040519384611beb565b82523d6000602084013e5b156102a95750600101610221565b8051156102b857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576103af6119db565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103d8611fe0565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361034b575073ffffffffffffffffffffffffffffffffffffffff169283830361041e57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600554604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760043561053a6119fe565b610542611fe0565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166105f457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600254604051908152f35b3461031c576106d336611a21565b6106db611fa5565b6106e3611fe0565b906106ed82611f08565b6106f682611b81565b9283610704575b6001600055005b7f000000000000000000000000000000000000000000000000000000000000000061072f8186611ccc565b94811561086357600186018087116108345786036107fd57601f847f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca969773ffffffffffffffffffffffffffffffffffffffff6107b286608098977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09706611b74565b9916988960005260076020526040600020556040519687956060875281606088015287870137600086838701015260208501526001604085015201168101030190a2808080806106fd565b857f2367721e0000000000000000000000000000000000000000000000000000000060005280600452602452600160445260646000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff6108de6119db565b1660005260086020526020604060002054604051908152f35b3461031c5761090536611ac1565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061094a611fe0565b925416911690810361034b5750808214801590610b36575b6103215760005b82811061097257005b73ffffffffffffffffffffffffffffffffffffffff61099a61099583858a611ea8565b611ee7565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610acf57600091610b08575b5015610adb575073ffffffffffffffffffffffffffffffffffffffff610a2961099583858a611ea8565b1690610a39610995828689611ea8565b91610a4582878b611ea8565b3592813b1561031c57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610acf57600192610abe575b5001610969565b6000610ac991611beb565b88610ab7565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610b29915060203d8111610b2f575b610b218183611beb565b810190611f8d565b896109ff565b503d610b17565b5082821415610962565b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600454604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff610bc86119db565b1660005260066020526020604060002054604051908152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57610c186119fe565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610d45611fe0565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610e115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610684565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600154604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f27611d7b565b604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600354604051908152f35b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57600435602435610fa3611fe0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f15154e2fdb60fe5988478ff62f03d0369c5abf7e6b3abdef601ee67fdf7120c9602052604090205490919060ff161561127457821561124a578015611220577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156111db57611039611cd6565b6004556005544210801590611215575b611205575b6005549061105c8342611b74565b914281116110c45750928273ffffffffffffffffffffffffffffffffffffffff926110aa6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497611ccc565b6003556005555b42600255835195865260208601521692a2005b916003939193546110de6110d84286611b54565b82611b61565b850194851094851502946111db5783821161114d575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749260409261114561113e73ffffffffffffffffffffffffffffffffffffffff944290611b54565b8092611ccc565b6003556110b1565b9161115b9193508094611ccc565b908082106111ab57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556110b1565b7f19e2447d0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f500820650000000000000000000000000000000000000000000000000000000060005260046000fd5b61120d611d7b565b60025561104e565b506001541515611049565b7f761664010000000000000000000000000000000000000000000000000000000060005260046000fd5b7f385398650000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f7aa72882000000000000000000000000000000000000000000000000000000006000527f72657761726465720000000000000000000000000000000000000000000000006004521660245260446000fd5b3461031c576112ea36611ac1565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061132d611fe0565b925416911690810361034b5750808314801590611455575b6103215760005b83811061135557005b611360818388611ea8565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031c5760006020918a826113a18761139a610995828f8f90611ea8565b938b611ea8565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526113fc606482611beb565b51925af115610acf576000513d61144c5750803b155b61141f575060010161134c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611412565b5085831415611345565b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206114a061149b6119db565b611d1c565b6040519015158152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576004356114e46119fe565b6114ec611fe0565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561159f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610684565b61165461164236611a21565b919061164c611fe0565b923691611c95565b9061165d611fa5565b61166681611f08565b61166f826120f1565b80156116f15773ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e926116b883600154611b74565b600155169283600052600660205260406000206116d6838254611b74565b90556116e760405192839283611e3c565b0390a26001600055005b7f040ef8ec0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f27611cd6565b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031c576117d461164236611a21565b906117dd611fa5565b6117e681611f08565b6117ef826120f1565b9081156118a55773ffffffffffffffffffffffffffffffffffffffff16908160005260066020526040600020549281841061186f578183947faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e9460005260066020520360406000205581600154036001556116e760405192839283611e3c565b5091907f2b6a77580000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdb73cdf00000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff61191b6119db565b1660005260076020526020604060002054604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031c576114a0602091611d8d565b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f276119d66119db565b611b81565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031c57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031c57565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261031c5760043567ffffffffffffffff811161031c578260238201121561031c5780600401359267ffffffffffffffff841161031c576024848301011161031c576024019190565b9181601f8401121561031c5782359167ffffffffffffffff831161031c576020808501948460051b01011161031c57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031c5760043567ffffffffffffffff811161031c5781611b0a91600401611a90565b9290929160243567ffffffffffffffff811161031c5781611b2d91600401611a90565b929092916044359067ffffffffffffffff821161031c57611b5091600401611a90565b9091565b9190820391821161083457565b8181029291811591840414171561083457565b9190820180921161083457565b73ffffffffffffffffffffffffffffffffffffffff611be89116806000526006602052611bd3604060002054611bcd611bb8611cd6565b84600052600860205260406000205490611b54565b90611b61565b90600052600760205260406000205490611b74565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c2c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611c2c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192611ca182611c5b565b91611caf6040519384611beb565b82948184528183011161031c578281602093846000960137010152565b8115610863570490565b6001548015611d1557611be890611d0f60045491611d0a611d01611cf8611d7b565b60025490611b54565b60035490611b61565b611ccc565b90611b74565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611d745773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014611be857504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611e36577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611e30576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9291906040845280519081604086015260005b828110611e9257505060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000846020968a0101520116850101930152565b8060208092840101516060828901015201611e4f565b9190811015611eb85760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361031c5790565b611f10611cd6565b6004556005544210801590611f82575b611f72575b73ffffffffffffffffffffffffffffffffffffffff81169081611f46575050565b611f4f90611b81565b816000526007602052604060002055600454906000526008602052604060002055565b611f7a611d7b565b600255611f25565b506001541515611f20565b9081602091031261031c5751801515810361031c5790565b600260005414611fb6576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156120e25732331480156120e7575b6120e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612068575b50611be857503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610acf576000916120c3575b503861205e565b6120dc915060203d602011610b2f57610b218183611beb565b386120bc565b503390565b5060183610612027565b60208180518101031261031c57602001519056fea264697066735822122036522dfaf817c59dec260ea77e80249b9e6e50bdd256a5a7b1a8057f8329138364736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0x1A4 JUMPI PUSH1 0x1F PUSH2 0x22FB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1A9 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1A4 JUMPI DUP1 MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x1A4 JUMPI PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x1A4 JUMPI CALLER PUSH2 0x145 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x134 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x11E JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x213B SWAP1 DUP2 PUSH2 0x1C0 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x179F ADD MSTORE DUP2 DUP2 PUSH2 0x1D33 ADD MSTORE PUSH2 0x1FF7 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x4DD ADD MSTORE DUP2 DUP2 PUSH2 0x706 ADD MSTORE PUSH2 0x1001 ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x65 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x199A JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1934 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x18CF JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x17C3 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1754 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x171B JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1636 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x14AA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x145F JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x12DC JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0xF6B JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0xF2F JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0xEEE JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xEB2 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xE59 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xCEA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xC79 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xBE1 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xB7C JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xB40 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x8F7 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x892 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x6C5 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x500 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x46B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x378 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI PUSH2 0x1A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI PUSH2 0x1C9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20A PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP2 DUP2 SUB PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22A JUMPI STOP JUMPDEST PUSH2 0x235 DUP2 DUP4 DUP8 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31C JUMPI PUSH2 0x25F DUP3 DUP6 DUP8 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EA JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E2 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x282 DUP3 PUSH2 0x1C5B JUMP JUMPDEST SWAP2 PUSH2 0x290 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1BEB JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x221 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2B8 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH2 0x3AF PUSH2 0x19DB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3D8 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x41E JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x53A PUSH2 0x19FE JUMP JUMPDEST PUSH2 0x542 PUSH2 0x1FE0 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x5F4 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x6D3 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST PUSH2 0x6DB PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x6E3 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 PUSH2 0x6ED DUP3 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x6F6 DUP3 PUSH2 0x1B81 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x704 JUMPI JUMPDEST PUSH1 0x1 PUSH1 0x0 SSTORE STOP JUMPDEST PUSH32 0x0 PUSH2 0x72F DUP2 DUP7 PUSH2 0x1CCC JUMP JUMPDEST SWAP5 DUP2 ISZERO PUSH2 0x863 JUMPI PUSH1 0x1 DUP7 ADD DUP1 DUP8 GT PUSH2 0x834 JUMPI DUP7 SUB PUSH2 0x7FD JUMPI PUSH1 0x1F DUP5 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP7 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7B2 DUP7 PUSH1 0x80 SWAP9 SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP8 MOD PUSH2 0x1B74 JUMP JUMPDEST SWAP10 AND SWAP9 DUP10 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 PUSH1 0x60 DUP8 MSTORE DUP2 PUSH1 0x60 DUP9 ADD MSTORE DUP8 DUP8 ADD CALLDATACOPY PUSH1 0x0 DUP7 DUP4 DUP8 ADD ADD MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG2 DUP1 DUP1 DUP1 DUP1 PUSH2 0x6FD JUMP JUMPDEST DUP6 PUSH32 0x2367721E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x1 PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x8DE PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x905 CALLDATASIZE PUSH2 0x1AC1 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x94A PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xB36 JUMPI JUMPDEST PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x972 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x99A PUSH2 0x995 DUP4 DUP6 DUP11 PUSH2 0x1EA8 JUMP JUMPDEST PUSH2 0x1EE7 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB08 JUMPI JUMPDEST POP ISZERO PUSH2 0xADB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA29 PUSH2 0x995 DUP4 DUP6 DUP11 PUSH2 0x1EA8 JUMP JUMPDEST AND SWAP1 PUSH2 0xA39 PUSH2 0x995 DUP3 DUP7 DUP10 PUSH2 0x1EA8 JUMP JUMPDEST SWAP2 PUSH2 0xA45 DUP3 DUP8 DUP12 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31C JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xACF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xABE JUMPI JUMPDEST POP ADD PUSH2 0x969 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAC9 SWAP2 PUSH2 0x1BEB JUMP JUMPDEST DUP9 PUSH2 0xAB7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xB29 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xB2F JUMPI JUMPDEST PUSH2 0xB21 DUP2 DUP4 PUSH2 0x1BEB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F8D JUMP JUMPDEST DUP10 PUSH2 0x9FF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB17 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x962 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xBC8 PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH2 0xC18 PUSH2 0x19FE JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xD45 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xE11 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x684 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0xFA3 PUSH2 0x1FE0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x15154E2FDB60FE5988478FF62F03D0369C5ABF7E6B3ABDEF601EE67FDF7120C9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1274 JUMPI DUP3 ISZERO PUSH2 0x124A JUMPI DUP1 ISZERO PUSH2 0x1220 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x11DB JUMPI PUSH2 0x1039 PUSH2 0x1CD6 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1215 JUMPI JUMPDEST PUSH2 0x1205 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x105C DUP4 TIMESTAMP PUSH2 0x1B74 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x10C4 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x10AA PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x1CCC JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 STOP JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x10DE PUSH2 0x10D8 TIMESTAMP DUP7 PUSH2 0x1B54 JUMP JUMPDEST DUP3 PUSH2 0x1B61 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x11DB JUMPI DUP4 DUP3 GT PUSH2 0x114D JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1145 PUSH2 0x113E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x1B54 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x1CCC JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x10B1 JUMP JUMPDEST SWAP2 PUSH2 0x115B SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x1CCC JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x11AB JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x10B1 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x120D PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x104E JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1049 JUMP JUMPDEST PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x12EA CALLDATASIZE PUSH2 0x1AC1 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x132D PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1455 JUMPI JUMPDEST PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1355 JUMPI STOP JUMPDEST PUSH2 0x1360 DUP2 DUP4 DUP9 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31C JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x13A1 DUP8 PUSH2 0x139A PUSH2 0x995 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1EA8 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x13FC PUSH1 0x64 DUP3 PUSH2 0x1BEB JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x144C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x141F JUMPI POP PUSH1 0x1 ADD PUSH2 0x134C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1412 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1345 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0x14A0 PUSH2 0x149B PUSH2 0x19DB JUMP JUMPDEST PUSH2 0x1D1C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x14E4 PUSH2 0x19FE JUMP JUMPDEST PUSH2 0x14EC PUSH2 0x1FE0 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x159F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x684 JUMP JUMPDEST PUSH2 0x1654 PUSH2 0x1642 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x164C PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x1C95 JUMP JUMPDEST SWAP1 PUSH2 0x165D PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x1666 DUP2 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x166F DUP3 PUSH2 0x20F1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x16F1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x16B8 DUP4 PUSH1 0x1 SLOAD PUSH2 0x1B74 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x16D6 DUP4 DUP3 SLOAD PUSH2 0x1B74 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x16E7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x1E3C JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 PUSH1 0x0 SSTORE STOP JUMPDEST PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x1CD6 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x17D4 PUSH2 0x1642 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST SWAP1 PUSH2 0x17DD PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x17E6 DUP2 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x17EF DUP3 PUSH2 0x20F1 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x18A5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 DUP2 DUP5 LT PUSH2 0x186F JUMPI DUP2 DUP4 SWAP5 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP5 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x16E7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x1E3C JUMP JUMPDEST POP SWAP2 SWAP1 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x191B PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31C JUMPI PUSH2 0x14A0 PUSH1 0x20 SWAP2 PUSH2 0x1D8D JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x19D6 PUSH2 0x19DB JUMP JUMPDEST PUSH2 0x1B81 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31C JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x31C JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x31C JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x31C JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31C JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP2 PUSH2 0x1B0A SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP2 PUSH2 0x1B2D SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31C JUMPI PUSH2 0x1B50 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x834 JUMPI JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x834 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x834 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1BE8 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x1BD3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1BCD PUSH2 0x1BB8 PUSH2 0x1CD6 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1B54 JUMP JUMPDEST SWAP1 PUSH2 0x1B61 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1B74 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1C2C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C2C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1CA1 DUP3 PUSH2 0x1C5B JUMP JUMPDEST SWAP2 PUSH2 0x1CAF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1BEB JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31C JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x863 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x1D15 JUMPI PUSH2 0x1BE8 SWAP1 PUSH2 0x1D0F PUSH1 0x4 SLOAD SWAP2 PUSH2 0x1D0A PUSH2 0x1D01 PUSH2 0x1CF8 PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1B54 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1CCC JUMP JUMPDEST SWAP1 PUSH2 0x1B74 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1D74 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x1BE8 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1E36 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1E30 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH1 0x40 DUP5 MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1E92 JUMPI POP POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 DUP5 PUSH1 0x20 SWAP7 DUP11 ADD ADD MSTORE ADD AND DUP6 ADD ADD SWAP4 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP10 ADD ADD MSTORE ADD PUSH2 0x1E4F JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1EB8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31C JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1F10 PUSH2 0x1CD6 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1F82 JUMPI JUMPDEST PUSH2 0x1F72 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x1F46 JUMPI POP POP JUMP JUMPDEST PUSH2 0x1F4F SWAP1 PUSH2 0x1B81 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1F7A PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1F25 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1F20 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31C JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x1FB6 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x20E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x20E7 JUMPI JUMPDEST PUSH2 0x20E2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2068 JUMPI JUMPDEST POP PUSH2 0x1BE8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x20C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x205E JUMP JUMPDEST PUSH2 0x20DC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB2F JUMPI PUSH2 0xB21 DUP2 DUP4 PUSH2 0x1BEB JUMP JUMPDEST CODESIZE PUSH2 0x20BC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2027 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP1 MLOAD DUP2 ADD SUB SLT PUSH2 0x31C JUMPI PUSH1 0x20 ADD MLOAD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATASIZE MSTORE 0x2D STATICCALL EXTCALL OR 0xC5 SWAP14 EOFCREATE 0x26 0xE 0xA7 PUSH31 0x80249B9E6E50BDD256A5A7B1A8057F8329138364736F6C634300081E003300 ","sourceMap":"215:941:110:-:0;;;;;;;;;;;;;-1:-1:-1;;215:941:110;;;;-1:-1:-1;;;;;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;215:941:110;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;;;;;500:10:59;;;215:941:110;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;;;;1857:1:13;;745:39:76;;4180:2:193;4156:26;;215:941:110;;;4180:2:193;215:941:110;;;;;;4221:44:193;;215:941:110;;;;;;;;745:39:76;215:941:110;;;;;;;;;;;;;;;4221:44:193;215:941:110;;;;;;;;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;;;-1:-1:-1;215:941:110;;;;;-1:-1:-1;215:941:110;;-1:-1:-1;215:941:110;1645:152:42;215:941:110;;;-1:-1:-1;;;;;;215:941:110;4082:10:193;215:941:110;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;215:941:110;-1:-1:-1;215:941:110;;;;;;-1:-1:-1;215:941:110;;;;;-1:-1:-1;215:941:110"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6654,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":6800,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6849,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_available_length_bytes":{"entryPoint":7317,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":8077,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6689,"id":null,"parameterSlots":1,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6619,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":7740,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":7259,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":7848,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":7028,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_uint256":{"entryPoint":7372,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":7009,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":6996,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":7147,"id":null,"parameterSlots":2,"returnSlots":0},"fun_computeWithdraw":{"entryPoint":8433,"id":15667,"parameterSlots":1,"returnSlots":1},"fun_earned":{"entryPoint":7041,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":7452,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":7547,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgSender":{"entryPoint":8160,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":8101,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":7382,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7565,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":7944,"id":20469,"parameterSlots":1,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":7911,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":6047},{"length":32,"start":7475},{"length":32,"start":8183}],"20300":[{"length":32,"start":1245},{"length":32,"start":1798},{"length":32,"start":4097}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80628cc2621461199a57806301ffc9a7146119345780630700037d146118cf5780630968f264146117c35780632b4c9f16146117545780632c9d0b801461171b5780632d1e0c02146116365780632f2ff15d146114aa578063572b6c051461145f57806373c8a958146112dc57806375c93bb914610f6b5780637b0a47ee14610f2f57806380faa57d14610eee578063817b1cd214610eb25780638580cf7614610e595780638bb9c5bf14610cea5780638da5cb5b14610c7957806391d1485414610be157806398807d8414610b7c5780639d696e3614610b40578063c3666c36146108f7578063c5c8f77014610892578063c63ff8dd146106c5578063d0b06f5d14610689578063d547741f14610500578063ef4cadc5146104a7578063efa90b541461046b578063f2fde38b146103785763f7ba94bd1461015a57600080fd5b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760043567ffffffffffffffff811161031c576101a9903690600401611a90565b60243567ffffffffffffffff811161031c576101c9903690600401611a90565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020a611fe0565b925416911690810361034b57508181036103215760005b81811061022a57005b610235818387611ea8565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031c5761025f828587611ea8565b35908147106102ea57600080809381935af13d156102e2573d9061028282611c5b565b916102906040519384611beb565b82523d6000602084013e5b156102a95750600101610221565b8051156102b857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576103af6119db565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103d8611fe0565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361034b575073ffffffffffffffffffffffffffffffffffffffff169283830361041e57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600554604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760043561053a6119fe565b610542611fe0565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166105f457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600254604051908152f35b3461031c576106d336611a21565b6106db611fa5565b6106e3611fe0565b906106ed82611f08565b6106f682611b81565b9283610704575b6001600055005b7f000000000000000000000000000000000000000000000000000000000000000061072f8186611ccc565b94811561086357600186018087116108345786036107fd57601f847f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca969773ffffffffffffffffffffffffffffffffffffffff6107b286608098977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09706611b74565b9916988960005260076020526040600020556040519687956060875281606088015287870137600086838701015260208501526001604085015201168101030190a2808080806106fd565b857f2367721e0000000000000000000000000000000000000000000000000000000060005280600452602452600160445260646000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff6108de6119db565b1660005260086020526020604060002054604051908152f35b3461031c5761090536611ac1565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061094a611fe0565b925416911690810361034b5750808214801590610b36575b6103215760005b82811061097257005b73ffffffffffffffffffffffffffffffffffffffff61099a61099583858a611ea8565b611ee7565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610acf57600091610b08575b5015610adb575073ffffffffffffffffffffffffffffffffffffffff610a2961099583858a611ea8565b1690610a39610995828689611ea8565b91610a4582878b611ea8565b3592813b1561031c57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610acf57600192610abe575b5001610969565b6000610ac991611beb565b88610ab7565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610b29915060203d8111610b2f575b610b218183611beb565b810190611f8d565b896109ff565b503d610b17565b5082821415610962565b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600454604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff610bc86119db565b1660005260066020526020604060002054604051908152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57610c186119fe565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610d45611fe0565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610e115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610684565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600154604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f27611d7b565b604051908152f35b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020600354604051908152f35b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57600435602435610fa3611fe0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527f15154e2fdb60fe5988478ff62f03d0369c5abf7e6b3abdef601ee67fdf7120c9602052604090205490919060ff161561127457821561124a578015611220577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156111db57611039611cd6565b6004556005544210801590611215575b611205575b6005549061105c8342611b74565b914281116110c45750928273ffffffffffffffffffffffffffffffffffffffff926110aa6040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec847497611ccc565b6003556005555b42600255835195865260208601521692a2005b916003939193546110de6110d84286611b54565b82611b61565b850194851094851502946111db5783821161114d575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec84749260409261114561113e73ffffffffffffffffffffffffffffffffffffffff944290611b54565b8092611ccc565b6003556110b1565b9161115b9193508094611ccc565b908082106111ab57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556110b1565b7f19e2447d0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f500820650000000000000000000000000000000000000000000000000000000060005260046000fd5b61120d611d7b565b60025561104e565b506001541515611049565b7f761664010000000000000000000000000000000000000000000000000000000060005260046000fd5b7f385398650000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f7aa72882000000000000000000000000000000000000000000000000000000006000527f72657761726465720000000000000000000000000000000000000000000000006004521660245260446000fd5b3461031c576112ea36611ac1565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061132d611fe0565b925416911690810361034b5750808314801590611455575b6103215760005b83811061135557005b611360818388611ea8565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031c5760006020918a826113a18761139a610995828f8f90611ea8565b938b611ea8565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526113fc606482611beb565b51925af115610acf576000513d61144c5750803b155b61141f575060010161134c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611412565b5085831415611345565b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5760206114a061149b6119db565b611d1c565b6040519015158152f35b3461031c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576004356114e46119fe565b6114ec611fe0565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561159f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610684565b61165461164236611a21565b919061164c611fe0565b923691611c95565b9061165d611fa5565b61166681611f08565b61166f826120f1565b80156116f15773ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e926116b883600154611b74565b600155169283600052600660205260406000206116d6838254611b74565b90556116e760405192839283611e3c565b0390a26001600055005b7f040ef8ec0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f27611cd6565b3461031c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031c576117d461164236611a21565b906117dd611fa5565b6117e681611f08565b6117ef826120f1565b9081156118a55773ffffffffffffffffffffffffffffffffffffffff16908160005260066020526040600020549281841061186f578183947faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e9460005260066020520360406000205581600154036001556116e760405192839283611e3c565b5091907f2b6a77580000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdb73cdf00000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c5773ffffffffffffffffffffffffffffffffffffffff61191b6119db565b1660005260076020526020604060002054604051908152f35b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031c576114a0602091611d8d565b3461031c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031c576020610f276119d66119db565b611b81565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031c57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031c57565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261031c5760043567ffffffffffffffff811161031c578260238201121561031c5780600401359267ffffffffffffffff841161031c576024848301011161031c576024019190565b9181601f8401121561031c5782359167ffffffffffffffff831161031c576020808501948460051b01011161031c57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031c5760043567ffffffffffffffff811161031c5781611b0a91600401611a90565b9290929160243567ffffffffffffffff811161031c5781611b2d91600401611a90565b929092916044359067ffffffffffffffff821161031c57611b5091600401611a90565b9091565b9190820391821161083457565b8181029291811591840414171561083457565b9190820180921161083457565b73ffffffffffffffffffffffffffffffffffffffff611be89116806000526006602052611bd3604060002054611bcd611bb8611cd6565b84600052600860205260406000205490611b54565b90611b61565b90600052600760205260406000205490611b74565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c2c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611c2c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192611ca182611c5b565b91611caf6040519384611beb565b82948184528183011161031c578281602093846000960137010152565b8115610863570490565b6001548015611d1557611be890611d0f60045491611d0a611d01611cf8611d7b565b60025490611b54565b60035490611b61565b611ccc565b90611b74565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611d745773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b600554804210600014611be857504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611e36577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611e30576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b9291906040845280519081604086015260005b828110611e9257505060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000846020968a0101520116850101930152565b8060208092840101516060828901015201611e4f565b9190811015611eb85760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361031c5790565b611f10611cd6565b6004556005544210801590611f82575b611f72575b73ffffffffffffffffffffffffffffffffffffffff81169081611f46575050565b611f4f90611b81565b816000526007602052604060002055600454906000526008602052604060002055565b611f7a611d7b565b600255611f25565b506001541515611f20565b9081602091031261031c5751801515810361031c5790565b600260005414611fb6576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156120e25732331480156120e7575b6120e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612068575b50611be857503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610acf576000916120c3575b503861205e565b6120dc915060203d602011610b2f57610b218183611beb565b386120bc565b503390565b5060183610612027565b60208180518101031261031c57602001519056fea264697066735822122036522dfaf817c59dec260ea77e80249b9e6e50bdd256a5a7b1a8057f8329138364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x199A JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1934 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x18CF JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x17C3 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1754 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x171B JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1636 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x14AA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x145F JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x12DC JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0xF6B JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0xF2F JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0xEEE JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xEB2 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xE59 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xCEA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xC79 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xBE1 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xB7C JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xB40 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x8F7 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x892 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x6C5 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x500 JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4A7 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x46B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x378 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI PUSH2 0x1A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI PUSH2 0x1C9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20A PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP2 DUP2 SUB PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22A JUMPI STOP JUMPDEST PUSH2 0x235 DUP2 DUP4 DUP8 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31C JUMPI PUSH2 0x25F DUP3 DUP6 DUP8 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EA JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E2 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x282 DUP3 PUSH2 0x1C5B JUMP JUMPDEST SWAP2 PUSH2 0x290 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1BEB JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A9 JUMPI POP PUSH1 0x1 ADD PUSH2 0x221 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2B8 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH2 0x3AF PUSH2 0x19DB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3D8 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x41E JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x53A PUSH2 0x19FE JUMP JUMPDEST PUSH2 0x542 PUSH2 0x1FE0 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x5F4 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x6D3 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST PUSH2 0x6DB PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x6E3 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 PUSH2 0x6ED DUP3 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x6F6 DUP3 PUSH2 0x1B81 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x704 JUMPI JUMPDEST PUSH1 0x1 PUSH1 0x0 SSTORE STOP JUMPDEST PUSH32 0x0 PUSH2 0x72F DUP2 DUP7 PUSH2 0x1CCC JUMP JUMPDEST SWAP5 DUP2 ISZERO PUSH2 0x863 JUMPI PUSH1 0x1 DUP7 ADD DUP1 DUP8 GT PUSH2 0x834 JUMPI DUP7 SUB PUSH2 0x7FD JUMPI PUSH1 0x1F DUP5 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP7 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7B2 DUP7 PUSH1 0x80 SWAP9 SWAP8 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP8 MOD PUSH2 0x1B74 JUMP JUMPDEST SWAP10 AND SWAP9 DUP10 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 PUSH1 0x60 DUP8 MSTORE DUP2 PUSH1 0x60 DUP9 ADD MSTORE DUP8 DUP8 ADD CALLDATACOPY PUSH1 0x0 DUP7 DUP4 DUP8 ADD ADD MSTORE PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x40 DUP6 ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG2 DUP1 DUP1 DUP1 DUP1 PUSH2 0x6FD JUMP JUMPDEST DUP6 PUSH32 0x2367721E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x1 PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x8DE PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x905 CALLDATASIZE PUSH2 0x1AC1 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x94A PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xB36 JUMPI JUMPDEST PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x972 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x99A PUSH2 0x995 DUP4 DUP6 DUP11 PUSH2 0x1EA8 JUMP JUMPDEST PUSH2 0x1EE7 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB08 JUMPI JUMPDEST POP ISZERO PUSH2 0xADB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA29 PUSH2 0x995 DUP4 DUP6 DUP11 PUSH2 0x1EA8 JUMP JUMPDEST AND SWAP1 PUSH2 0xA39 PUSH2 0x995 DUP3 DUP7 DUP10 PUSH2 0x1EA8 JUMP JUMPDEST SWAP2 PUSH2 0xA45 DUP3 DUP8 DUP12 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31C JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xACF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xABE JUMPI JUMPDEST POP ADD PUSH2 0x969 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAC9 SWAP2 PUSH2 0x1BEB JUMP JUMPDEST DUP9 PUSH2 0xAB7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xB29 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xB2F JUMPI JUMPDEST PUSH2 0xB21 DUP2 DUP4 PUSH2 0x1BEB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F8D JUMP JUMPDEST DUP10 PUSH2 0x9FF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB17 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x962 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xBC8 PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH2 0xC18 PUSH2 0x19FE JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xD45 PUSH2 0x1FE0 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xE11 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x684 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0xFA3 PUSH2 0x1FE0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x15154E2FDB60FE5988478FF62F03D0369C5ABF7E6B3ABDEF601EE67FDF7120C9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1274 JUMPI DUP3 ISZERO PUSH2 0x124A JUMPI DUP1 ISZERO PUSH2 0x1220 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x11DB JUMPI PUSH2 0x1039 PUSH2 0x1CD6 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1215 JUMPI JUMPDEST PUSH2 0x1205 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x105C DUP4 TIMESTAMP PUSH2 0x1B74 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x10C4 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x10AA PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x1CCC JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 STOP JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x10DE PUSH2 0x10D8 TIMESTAMP DUP7 PUSH2 0x1B54 JUMP JUMPDEST DUP3 PUSH2 0x1B61 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x11DB JUMPI DUP4 DUP3 GT PUSH2 0x114D JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x1145 PUSH2 0x113E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x1B54 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x1CCC JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x10B1 JUMP JUMPDEST SWAP2 PUSH2 0x115B SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x1CCC JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x11AB JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x10B1 JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x120D PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x104E JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1049 JUMP JUMPDEST PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x12EA CALLDATASIZE PUSH2 0x1AC1 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x132D PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1455 JUMPI JUMPDEST PUSH2 0x321 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1355 JUMPI STOP JUMPDEST PUSH2 0x1360 DUP2 DUP4 DUP9 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31C JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x13A1 DUP8 PUSH2 0x139A PUSH2 0x995 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1EA8 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1EA8 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x13FC PUSH1 0x64 DUP3 PUSH2 0x1BEB JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x144C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x141F JUMPI POP PUSH1 0x1 ADD PUSH2 0x134C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1412 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1345 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0x14A0 PUSH2 0x149B PUSH2 0x19DB JUMP JUMPDEST PUSH2 0x1D1C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x14E4 PUSH2 0x19FE JUMP JUMPDEST PUSH2 0x14EC PUSH2 0x1FE0 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x159F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x684 JUMP JUMPDEST PUSH2 0x1654 PUSH2 0x1642 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x164C PUSH2 0x1FE0 JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x1C95 JUMP JUMPDEST SWAP1 PUSH2 0x165D PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x1666 DUP2 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x166F DUP3 PUSH2 0x20F1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x16F1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x16B8 DUP4 PUSH1 0x1 SLOAD PUSH2 0x1B74 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x16D6 DUP4 DUP3 SLOAD PUSH2 0x1B74 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x16E7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x1E3C JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 PUSH1 0x0 SSTORE STOP JUMPDEST PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x1CD6 JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH2 0x17D4 PUSH2 0x1642 CALLDATASIZE PUSH2 0x1A21 JUMP JUMPDEST SWAP1 PUSH2 0x17DD PUSH2 0x1FA5 JUMP JUMPDEST PUSH2 0x17E6 DUP2 PUSH2 0x1F08 JUMP JUMPDEST PUSH2 0x17EF DUP3 PUSH2 0x20F1 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x18A5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 DUP2 DUP5 LT PUSH2 0x186F JUMPI DUP2 DUP4 SWAP5 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP5 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x16E7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x1E3C JUMP JUMPDEST POP SWAP2 SWAP1 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x191B PUSH2 0x19DB JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31C JUMPI PUSH2 0x14A0 PUSH1 0x20 SWAP2 PUSH2 0x1D8D JUMP JUMPDEST CALLVALUE PUSH2 0x31C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31C JUMPI PUSH1 0x20 PUSH2 0xF27 PUSH2 0x19D6 PUSH2 0x19DB JUMP JUMPDEST PUSH2 0x1B81 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31C JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x31C JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x31C JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x31C JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31C JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP2 PUSH2 0x1B0A SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C JUMPI DUP2 PUSH2 0x1B2D SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31C JUMPI PUSH2 0x1B50 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A90 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x834 JUMPI JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x834 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x834 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1BE8 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x1BD3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1BCD PUSH2 0x1BB8 PUSH2 0x1CD6 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1B54 JUMP JUMPDEST SWAP1 PUSH2 0x1B61 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1B74 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1C2C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1C2C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1CA1 DUP3 PUSH2 0x1C5B JUMP JUMPDEST SWAP2 PUSH2 0x1CAF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1BEB JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31C JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x863 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x1D15 JUMPI PUSH2 0x1BE8 SWAP1 PUSH2 0x1D0F PUSH1 0x4 SLOAD SWAP2 PUSH2 0x1D0A PUSH2 0x1D01 PUSH2 0x1CF8 PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1B54 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1CCC JUMP JUMPDEST SWAP1 PUSH2 0x1B74 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1D74 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x1BE8 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1E36 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1E30 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH1 0x40 DUP5 MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1E92 JUMPI POP POP PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 DUP5 PUSH1 0x20 SWAP7 DUP11 ADD ADD MSTORE ADD AND DUP6 ADD ADD SWAP4 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP10 ADD ADD MSTORE ADD PUSH2 0x1E4F JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1EB8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31C JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1F10 PUSH2 0x1CD6 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x1F82 JUMPI JUMPDEST PUSH2 0x1F72 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x1F46 JUMPI POP POP JUMP JUMPDEST PUSH2 0x1F4F SWAP1 PUSH2 0x1B81 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x1F7A PUSH2 0x1D7B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1F25 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1F20 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31C JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x1FB6 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x20E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x20E7 JUMPI JUMPDEST PUSH2 0x20E2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2068 JUMPI JUMPDEST POP PUSH2 0x1BE8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x20C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x205E JUMP JUMPDEST PUSH2 0x20DC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB2F JUMPI PUSH2 0xB21 DUP2 DUP4 PUSH2 0x1BEB JUMP JUMPDEST CODESIZE PUSH2 0x20BC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2027 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP1 MLOAD DUP2 ADD SUB SLT PUSH2 0x31C JUMPI PUSH1 0x20 ADD MLOAD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLDATASIZE MSTORE 0x2D STATICCALL EXTCALL OR 0xC5 SWAP14 EOFCREATE 0x26 0xE 0xA7 PUSH31 0x80249B9E6E50BDD256A5A7B1A8057F8329138364736F6C634300081E003300 ","sourceMap":"215:941:110:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;215:941:110;;16306:41:193;;;:::i;:::-;215:941:110;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;215:941:110;1845:10:192;;;;;;215:941:110;1857:3:192;1876:11;;;;;:::i;:::-;215:941:110;;;;;;;;;1898:10:192;;;;;:::i;:::-;215:941:110;1375:21:9;;;:30;1371:125;;215:941:110;1548:33:9;;;;;;;215:941:110;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;215:941:110;;1834:9:192;;1591:58:9;215:941:110;;5690:21:9;:17;;215:941:110;5815:105:9;;;;;5686:301;5957:19;215:941:110;5957:19:9;215:941:110;;5957:19:9;215:941:110;;;;;1371:125:9;1455:21;;1428:57;215:941:110;1428:57:9;215:941:110;;;;;;1428:57:9;215:941:110;;;;1756:63:192;1793:26;215:941:110;1793:26:192;215:941:110;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;215:941:110;;-1:-1:-1;4538:25:42;215:941:110;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;:::i;:::-;215:941:110;;;;;;;;;;3205:23:42;;;3201:60;;215:941:110;;;3275:25:42;;;;3271:146;;215:941:110;3271:146:42;215:941:110;;;;;;3361:45:42;215:941:110;;3361:45:42;215:941:110;;;;;;;;;;;;;2158:30:193;215:941:110;;;;;;;;;;;;;;;;;;;;;1971:39:193;215:941:110;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;215:941:110;;;;;;;4503:26:42;;;4499:64;;4464:19:41;215:941:110;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;500:10:59;215:941:110;-1:-1:-1;215:941:110;500:10:59;;1880:140:41;;215:941:110;1880:140:41;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;215:941:110;;;;1973:36:41;;;;215:941:110;;;;;;;;;;;;;2049:26:193;215:941:110;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;215:941:110;1857:1:13;215:941:110;;;10393:466:193;10453:14;10444:23;;;;:::i;:::-;215:941:110;;;;;1051:1;215:941;;;;;;;10637:32:193;;215:941:110;;;10757:26:193;10802:46;10757:26;;215:941:110;10750:33:193;10757:26;215:941:110;10757:26:193;;215:941:110;10757:26:193;215:941:110;10750:33:193;:::i;:::-;215:941:110;;;;-1:-1:-1;215:941:110;10732:7:193;215:941:110;;;-1:-1:-1;215:941:110;;;;;;;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;;;;;;;;1051:1;215:941;;;;;;;;10802:46:193;;;;10393:466;;;;;;215:941:110;;;;;;;;;;1051:1;215:941;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;215:941:110;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;215:941:110;;;16306:41:193;;:::i;:::-;215:941:110;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;215:941:110;3852:94:192;;215:941:110;3972:10:192;;;;;;215:941:110;3984:3:192;215:941:110;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;215:941:110;;;;4058:76:192;;4108:25;215:941:110;4058:76:192;;215:941:110;4058:76:192;;;;;;;;;;;;215:941:110;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;215:941:110;4239:12:192;;;;;;:::i;:::-;215:941:110;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;215:941:110;4239:70:192;;;;;;;215:941:110;;;;;;;4239:70:192;;;;;215:941:110;4239:70:192;;4277:4;215:941:110;4239:70:192;;215:941:110;;4058:76:192;215:941:110;;;;;;;4239:70:192;;;;;;;215:941:110;4239:70:192;;;3984:3;;215:941:110;3961:9:192;;4239:70;215:941:110;4239:70:192;;;:::i;:::-;;;;;215:941:110;;;;;;;;;4053:173:192;4161:50;215:941:110;4161:50:192;215:941:110;;4058:76:192;215:941:110;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;215:941:110;-1:-1:-1;215:941:110;;;;500:10:59;215:941:110;-1:-1:-1;215:941:110;500:10:59;;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;215:941:110;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;500:10:59;215:941:110;-1:-1:-1;215:941:110;500:10:59;;3741:25:41;3737:66;;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;215:941:110;;;;2455:33:41;215:941:110;3737:66:41;215:941:110;3775:28:41;;;215:941:110;3775:28:41;215:941:110;;;;;;;3775:28:41;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;215:941:110;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2081:25:193;215:941:110;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;215:941:110;;;;;;;;;;;;;500:10:59;4464:19:41;;;500:10:59;;3741:25:41;3737:66;;12172:11:193;;215:941:110;;12225:13:193;;215:941:110;;12321:14:193;215:941:110;;;2570:213:20;;;;;215:941:110;;;34863:71:21;;215:941:110;;4365:21:193;;:::i;:::-;215:941:110;;4419:15:193;215:941:110;4400:15:193;:34;;;:54;;;215:941:110;4396:195:193;;215:941:110;4419:15:193;215:941:110;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;215:941:110;12664:22:193;;215:941:110;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;215:941:110;4419:15:193;215:941:110;12551:1311:193;4400:15;13871:29;215:941:110;;;;;;;;;;;13962:39:193;;215:941:110;12551:1311:193;215:941:110;12795:10:193;215:941:110;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;215:941:110;;1859:6:20;;;;;;215:941:110;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;215:941:110;4400:15:193;13357:22;13286:40;215:941:110;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;215:941:110;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;215:941:110;;;;;;;;13962:39:193;215:941:110;12795:10:193;215:941:110;4419:15:193;215:941:110;12551:1311:193;;215:941:110;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;215:941:110;4396:195:193;;4400:54;215:941:110;4438:11:193;215:941:110;4438:16:193;;4400:54;;215:941:110;;;;;;;;;;;;;;3737:66:41;215:941:110;3775:28:41;;215:941:110;3775:28:41;215:941:110;;;;;;;;3775:28:41;215:941:110;;;;;;;:::i;:::-;5148:19:42;;;;215:941:110;;16306:41:193;;;:::i;:::-;215:941:110;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;215:941:110;2776:90:192;;215:941:110;2892:10:192;;;;;;215:941:110;2904:3:192;2923:9;;;;;:::i;:::-;215:941:110;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;215:941:110;;;1328:43:8;215:941:110;1328:43:8;;;;215:941:110;1328:43:8;;215:941:110;1328:43:8;;;215:941:110;1328:43:8;215:941:110;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;215:941:110;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;215:941:110;;2881:9:192;;8938:146:8;9033:40;215:941:110;9033:40:8;215:941:110;;1328:43:8;215:941:110;9033:40:8;8942:68;215:941:110;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;215:941:110;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;215:941:110;;;;;;;4503:26:42;;;4499:64;;4464:19:41;215:941:110;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;500:10:59;215:941:110;-1:-1:-1;215:941:110;500:10:59;;1254:25:41;1250:140;;215:941:110;1250:140:41;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;215:941:110;;;;1343:36:41;215:941:110;;;;;;:::i;:::-;16306:41:193;;;;:::i;:::-;215:941:110;;;;:::i;:::-;2466:103:13;;;:::i;:::-;7561:6:193;;;:::i;:::-;7600:32;;;:::i;:::-;7650:16;;215:941:110;;;7779:38:193;215:941:110;7699:26:193;215:941:110;7699:26:193;215:941:110;7699:26:193;:::i;:::-;;215:941:110;;;;;;7735:6:193;215:941:110;;;;;7735:29:193;215:941:110;;;7735:29:193;:::i;:::-;215:941:110;;7779:38:193;215:941:110;;7779:38:193;;;;;:::i;:::-;;;;7699:26;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;941:19:75;215:941:110;;;;;;;;;;;;:::i;:::-;2466:103:13;;;:::i;:::-;9425:6:193;;;:::i;:::-;9464:38;;;:::i;:::-;9520:16;;;215:941:110;;;;;;;;9596:6:193;215:941:110;;;;;;9628:28:193;;;;215:941:110;;;;;9889:44:193;215:941:110;;;9596:6:193;215:941:110;;;;;;;;9838:26:193;215:941:110;;9838:26:193;215:941:110;9889:44:193;215:941:110;;9889:44:193;;;;;:::i;215:941:110:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;215:941:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;215:941:110;635:65:55;;:::i;215:941:110:-;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;215:941:110;6009:97:193;5929:184;215:941:110;;-1:-1:-1;215:941:110;6010:6:193;215:941:110;;6010:76:193;215:941:110;-1:-1:-1;215:941:110;;6029:56:193;:21;;:::i;:::-;215:941:110;-1:-1:-1;215:941:110;6053:23:193;215:941:110;;;-1:-1:-1;215:941:110;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;215:941:110;-1:-1:-1;215:941:110;6090:7:193;215:941:110;;;-1:-1:-1;215:941:110;;6009:97:193;;:::i;:::-;5929:184;:::o;215:941:110:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;215:941:110;;;;;-1:-1:-1;215:941:110;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;215:941:110;;;;;;:::o;:::-;;;;;;;:::o;5307:338:193:-;5407:11;215:941:110;5432:23:193;;5428:86;;5530:108;215:941:110;5559:78:193;5530:25;215:941:110;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;215:941:110;5561:40:193;;:::i;:::-;5605:10;215:941:110;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;215:941:110;5478:25:193;215:941:110;5471:32:193;:::o;1002:301:75:-;215:941:110;1146:19:75;215:941:110;1146:53:75;;;1142:96;;215:941:110;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;215:941:110;1215:12:75;:::o;4919:231:193:-;5028:15;215:941:110;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;1359:340:59:-;215:941:110;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;215:941:110;500:10:59;215:941:110;500:10:59;;;;215:941:110;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;215:941:110;1528:12:59;:::o;215:941:110:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;215:941:110;4419:15:193;215:941:110;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;215:941:110;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;215:941:110;-1:-1:-1;215:941:110;4641:7:193;215:941:110;;;-1:-1:-1;215:941:110;;4337:49:193;215:941:110;;-1:-1:-1;215:941:110;4689:23:193;215:941:110;;;-1:-1:-1;215:941:110;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;215:941:110;4396:195:193;;4400:54;215:941:110;4438:11:193;215:941:110;4438:16:193;;4400:54;;215:941:110;;;;;;;;;;;;;;;;;;:::o;2575:307:13:-;1899:1;2702:7;215:941:110;2702:18:13;2698:86;;1899:1;2702:7;215:941:110;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;907:917:76;215:941:110;1029:19:76;215:941:110;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;1676:74;215:941:110;;;;;;1676:74:76;;;;215:941:110;1676:74:76;;;;;;215:941:110;1327:10:76;215:941:110;;;;1744:4:76;215:941:110;;;;1676:74:76;;;;;;;215:941:110;1676:74:76;;;1630:120;;;;;1676:74;;;;215:941:110;1676:74:76;215:941:110;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;672:184:110;814:35;215:941;;;814:35;;215:941;;;;814:35;;215:941;672:184;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"1701400","executionCost":"infinite","totalCost":"infinite"},"external":{"REWARDER_ROLE()":"452","SCALING_FACTOR()":"infinite","addReward(uint256,uint256)":"infinite","claim(bytes)":"infinite","distributionEnd()":"2819","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2829","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2569","lastUpdated()":"2753","owner()":"2605","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardPerStakePoint()":"11135","rewardPerStakePointPaid(address)":"2836","rewardPerStakePointStored()":"2665","rewardRate()":"2489","rewards(address)":"2418","stake(bytes)":"infinite","staked(address)":"2770","supportsInterface(bytes4)":"2455","totalStaked()":"2533","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_computeStake(address,bytes memory)":"infinite","_computeWithdraw(address,bytes memory)":"infinite"}},"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalReward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"transferredReward\",\"type\":\"uint256\"}],\"name\":\"ClaimTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for the stake (encoding freely determined by the deriving contracts).\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol\":\"LinearPoolInvalidClaimSumMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract LinearPoolInvalidClaimSumMock is LinearPool {\\n    event ClaimTransferred(uint256 totalReward, uint256 transferredReward);\\n\\n    constructor(uint8 scalingFactorDecimals, IForwarderRegistry forwarderRegistry) LinearPool(scalingFactorDecimals, forwarderRegistry) {}\\n\\n    function _computeStake(address, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(stakeData, (uint256));\\n    }\\n\\n    function _computeWithdraw(address, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(withdrawData, (uint256));\\n    }\\n\\n    function _computeClaim(address, uint256 claimable, bytes calldata) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 1;\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {}\\n}\\n\",\"keccak256\":\"0xbe69fc80ed0915384c834b88d47acfde26d22e6b33f8cd3893a6570d99d13f61\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/LinearPoolInvalidClaimSumMock.sol:LinearPoolInvalidClaimSumMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/LinearPoolMock.sol":{"LinearPoolMock":{"abi":[{"inputs":[{"internalType":"contract LinearPoolReentrancyAttacker","name":"reentrancyAttacker","type":"address"},{"internalType":"uint8","name":"scalingFactorDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ComputeAddRewardCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimable","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"ComputeClaimCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"ComputeStakeCalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"ComputeWithdrawCalled","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REENTRANCY_ATTACKER","outputs":[{"internalType":"contract LinearPoolReentrancyAttacker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for the stake (encoding freely determined by the deriving contracts)."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60e0346101e357601f612a2938819003918201601f19168301916001600160401b038311848410176101e8578084926060946040528339810103126101e3578051906001600160a01b03821682036101e35760208101519060ff82168092036101e357604001516001600160a01b03811681036101e35733610184575b6307f5828d60e41b60009081527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff191660019081179091559055608052604d81101561017357604d811161015d57600a0a60a05260c05260405161282a90816101ff8239608051818181611b73015281816122910152818161256401526126c5015260a05181818161052b0152818161077e015261114b015260c0518181816107c501528181611705015281816119860152611be60152f35b634e487b7160e01b600052601160045260246000fd5b63a54ad6c560e01b60005260046000fd5b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a361007c565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c80628cc26214611e5557806301ffc9a714611ded5780630700037d14611d8a5780630968f26414611b975780632b4c9f1614611b285780632c9d0b8014611aef5780632d1e0c02146119235780632f2ff15d1461177b57806331e66e1e1461172957806352880f35146116ba578063572b6c051461166e57806373c8a9581461148d57806375c93bb91461108d5780637b0a47ee1461105157806380faa57d14611010578063817b1cd214610fd45780638580cf7614610f7b5780638bb9c5bf14610e115780638da5cb5b14610d9f57806391d1485414610d0857806398807d8414610ca55780639d696e3614610c69578063c3666c36146109e9578063c5c8f77014610986578063c63ff8dd14610739578063d0b06f5d146106fd578063d547741f1461054e578063ef4cadc5146104f5578063efa90b54146104b9578063f2fde38b146103935763f7ba94bd1461017157600080fd5b346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760043567ffffffffffffffff811161038e576101c0903690600401611f90565b60243567ffffffffffffffff811161038a576101e0903690600401611f90565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022161254d565b925416911690810361035d575081810361033557845b818110610242578580f35b61024d818387612415565b3573ffffffffffffffffffffffffffffffffffffffff811680910361033157610277828587612415565b3590814710610301578780809381935af13d156102f9573d906102998261218a565b916102a7604051938461211a565b82523d88602084013e5b156102bf5750600101610237565b80518790156102d15750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102b1565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576103cb611e97565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103f461254d565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361048e575073ffffffffffffffffffffffffffffffffffffffff169283830361043c578480f35b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a3388080808480f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008652600452602485fd5b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600554604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435610589611ebf565b61059161254d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610643578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b936106f2918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600254604051908152f35b50346103905761074836611ee2565b9190610752612512565b61075a61254d565b9061076482612475565b61076d826120b0565b938461077c575b836001815580f35b7f00000000000000000000000000000000000000000000000000000000000000006107a781876121fb565b9080156109595773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15610331578660405180927fc63ff8dd0000000000000000000000000000000000000000000000000000000082526020600483015281838161082d602482018b8d611f51565b03925af1801561094e57908791610935575b50507f9a3288933ffcc8b186ccc9c2882353ccd8904216bf0bedbc6cefb5fc16ab09ed73ffffffffffffffffffffffffffffffffffffffff604051961695868152836020820152606060408201528061089c606082018789611f51565b0390a1856109085760009606958495967f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca958252600760205260408220556108f1604051948594606086526060860191611f51565b91602084015260408301520390a280388080610774565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8161093f9161211a565b61094a57853861083f565b8580fd5b6040513d89823e3d90fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff6109d8611e97565b168152600883522054604051908152f35b5034610390576109f836611fc1565b9294939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a3d61254d565b925416911690810361035d5750808214801590610c5f575b610c3757865b828110610a66578780f35b73ffffffffffffffffffffffffffffffffffffffff610a8e610a8983858b612415565b612454565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c2c578a91610bfe575b5015610bd357508773ffffffffffffffffffffffffffffffffffffffff610b1d610a8984868c612415565b16610b2c610a8984878b612415565b90610b3884888a612415565b3591813b1561038a57606473ffffffffffffffffffffffffffffffffffffffff9185809460405196879586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af18015610bc857610baf575b5050600101610a5b565b81610bb99161211a565b610bc4578738610ba5565b8780fd5b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b610c1f915060203d8111610c25575b610c17818361211a565b8101906124fa565b38610af2565b503d610c0d565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415610a55565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600454604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff610cf7611e97565b168152600683522054604051908152f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905773ffffffffffffffffffffffffffffffffffffffff6040610d57611ebf565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e6e61254d565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610f35578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600154604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206110496122d9565b604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576004356024356110c661254d565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114275782156113ff5780156113d7577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156113af57611183612234565b60045560055442108015906113a4575b611394575b600554906111a683426120a3565b914281116112575750928273ffffffffffffffffffffffffffffffffffffffff926111f46040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976121fb565b6003556005555b42600255835173ffffffffffffffffffffffffffffffffffffffff83168152602081018790527f5ec3e451d22b879ea6838eff0b038773ea3bfcf4bb51a4c4e2f168333f489b9090604090a1835195865260208601521692a280f35b9160039391935461127161126b4286612054565b82612090565b8501948510948515029461136c578382116112e0575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112d86112d173ffffffffffffffffffffffffffffffffffffffff944290612054565b80926121fb565b6003556111fb565b916112ee91935080946121fb565b9080821061133e57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556111fb565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61139c6122d9565b600255611198565b506001541515611193565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103905761149c36611fc1565b929594939290917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114e261254d565b925416911690810361035d5750808414801590611664575b61163c57855b84811061150b578680f35b61151681838a612415565b3573ffffffffffffffffffffffffffffffffffffffff811690818103611638578860209187826115b66115e261155e898f8f610a898f92611558928591612415565b96612415565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261211a565b51925af11561094e5787513d61162f5750803b155b6116045750600101611500565b7f5274afe7000000000000000000000000000000000000000000000000000000008852600452602487fd5b600114156115f7565b8880fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b50818414156114fa565b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206116b06116ab611e97565b61227a565b6040519015158152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576117606126ae565b611777604051928392602084526020840191611f51565b0390f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576004356117b6611ebf565b6117be61254d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611871578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d936106f2918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5061194261193036611ee2565b919061193a61254d565b9236916121c4565b9061194b612512565b61195481612475565b81516020830190602082816000938701010312610390575051908373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b1561038e578160405180927f2d1e0c02000000000000000000000000000000000000000000000000000000008252602060048301528183816119ed602482018c61239a565b03925af18015610bc857611ada575b50507f8939976db42d3930b780581daf935c63f4b2b954a86929d714db0ac546958b7f60405180611a2e868583612681565b0390a18115611ab2579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a7b836001546120a3565b6001551692838552600660205260408520611a978382546120a3565b9055611aa8604051928392836123f9565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b81611ae49161211a565b61038a5783386119fc565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020611049612234565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461039057611ba961193036611ee2565b90611bb2612512565b611bbb81612475565b815160208381019184018490031261038a57519073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15611d86578460405180927f0968f26400000000000000000000000000000000000000000000000000000000825260206004830152818381611c4d602482018b61239a565b03925af18015611d7b57611d67575b507f36a2ea31c4d4156a140674bc8c3400a4e5c09f48aeb6fcee2b3d04962eeebc2060405180611c8d868583612681565b0390a18115611d3f5773ffffffffffffffffffffffffffffffffffffffff169182845260066020526040842054828110611d0b5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611aa8604051928392836123f9565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b84611d749195929561211a565b9238611c5c565b6040513d87823e3d90fd5b8480fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff611ddc611e97565b168152600783522054604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103905760206116b0836122eb565b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020611049611e92611e97565b6120b0565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611eba57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611eba57565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112611eba5760043567ffffffffffffffff8111611eba5782602382011215611eba5780600401359267ffffffffffffffff8411611eba5760248483010111611eba576024019190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215611eba5782359167ffffffffffffffff8311611eba576020808501948460051b010111611eba57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112611eba5760043567ffffffffffffffff8111611eba578161200a91600401611f90565b9290929160243567ffffffffffffffff8111611eba578161202d91600401611f90565b929092916044359067ffffffffffffffff8211611eba5761205091600401611f90565b9091565b9190820391821161206157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561206157565b9190820180921161206157565b73ffffffffffffffffffffffffffffffffffffffff61211791168060005260066020526121026040600020546120fc6120e7612234565b84600052600860205260406000205490612054565b90612090565b906000526007602052604060002054906120a3565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761215b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161215b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926121d08261218a565b916121de604051938461211a565b829481845281830111611eba578281602093846000960137010152565b8115612205570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015612273576121179061226d6004549161226861225f6122566122d9565b60025490612054565b60035490612090565b6121fb565b906120a3565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156122d25773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b60055480421060001461211757504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612394577f01ffc9a700000000000000000000000000000000000000000000000000000000811461238e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b919082519283825260005b8481106123e45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016123a5565b92919061241060209160408652604086019061239a565b930152565b91908110156124255760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103611eba5790565b61247d612234565b60045560055442108015906124ef575b6124df575b73ffffffffffffffffffffffffffffffffffffffff811690816124b3575050565b6124bc906120b0565b816000526007602052604060002055600454906000526008602052604060002055565b6124e76122d9565b600255612492565b50600154151561248d565b90816020910312611eba57518015158103611eba5790565b600260005414612523576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612672573233148015612677575b612672577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156125d5575b5061211757503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561266657600091612647575b50386125cb565b612660915060203d602011610c2557610c17818361211a565b38612640565b6040513d6000823e3d90fd5b503390565b5060183610612594565b60409073ffffffffffffffffffffffffffffffffffffffff6121179493168152816020820152019061239a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156127e25732331480156127ea575b6127e257803314908115612741575b50612710576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211611eba5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612666576000916127c3575b5038612704565b6127dc915060203d602011610c2557610c17818361211a565b386127bc565b506000903690565b50601836106126f556fea26469706673582212208da9f17450c6b268cf3bcf20ec6c47e43686c0b33ed304b1f03904dba0900fd864736f6c634300081e0033","opcodes":"PUSH1 0xE0 CALLVALUE PUSH2 0x1E3 JUMPI PUSH1 0x1F PUSH2 0x2A29 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1E8 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x60 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1E3 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x1E3 JUMPI PUSH1 0x20 DUP2 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x1E3 JUMPI PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x1E3 JUMPI CALLER PUSH2 0x184 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x4D DUP2 LT ISZERO PUSH2 0x173 JUMPI PUSH1 0x4D DUP2 GT PUSH2 0x15D JUMPI PUSH1 0xA EXP PUSH1 0xA0 MSTORE PUSH1 0xC0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x282A SWAP1 DUP2 PUSH2 0x1FF DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x1B73 ADD MSTORE DUP2 DUP2 PUSH2 0x2291 ADD MSTORE DUP2 DUP2 PUSH2 0x2564 ADD MSTORE PUSH2 0x26C5 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x52B ADD MSTORE DUP2 DUP2 PUSH2 0x77E ADD MSTORE PUSH2 0x114B ADD MSTORE PUSH1 0xC0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x7C5 ADD MSTORE DUP2 DUP2 PUSH2 0x1705 ADD MSTORE DUP2 DUP2 PUSH2 0x1986 ADD MSTORE PUSH2 0x1BE6 ADD MSTORE RETURN JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0xA54AD6C5 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x7C JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x1E55 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1DED JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x1D8A JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1B97 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1B28 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1AEF JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1923 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x177B JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1729 JUMPI DUP1 PUSH4 0x52880F35 EQ PUSH2 0x16BA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x166E JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x148D JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x108D JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x1051 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1010 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xFD4 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xF7B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xE11 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD9F JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xD08 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xCA5 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xC69 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x986 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x739 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x6FD JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x54E JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4F5 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4B9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x393 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x38E JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x38A JUMPI PUSH2 0x1E0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x221 PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP2 DUP2 SUB PUSH2 0x335 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x242 JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x24D DUP2 DUP4 DUP8 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x331 JUMPI PUSH2 0x277 DUP3 DUP6 DUP8 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x301 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x299 DUP3 PUSH2 0x218A JUMP JUMPDEST SWAP2 PUSH2 0x2A7 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x211A JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2BF JUMPI POP PUSH1 0x1 ADD PUSH2 0x237 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2D1 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B1 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH2 0x3CB PUSH2 0x1E97 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3F4 PUSH2 0x254D JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x48E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x43C JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP6 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x589 PUSH2 0x1EBF JUMP JUMPDEST PUSH2 0x591 PUSH2 0x254D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x643 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x6F2 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x748 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x752 PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x75A PUSH2 0x254D JUMP JUMPDEST SWAP1 PUSH2 0x764 DUP3 PUSH2 0x2475 JUMP JUMPDEST PUSH2 0x76D DUP3 PUSH2 0x20B0 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0x77C JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0x7A7 DUP2 DUP8 PUSH2 0x21FB JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0x959 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x331 JUMPI DUP7 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0xC63FF8DD00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x82D PUSH1 0x24 DUP3 ADD DUP12 DUP14 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x94E JUMPI SWAP1 DUP8 SWAP2 PUSH2 0x935 JUMPI JUMPDEST POP POP PUSH32 0x9A3288933FFCC8B186CCC9C2882353CCD8904216BF0BEDBC6CEFB5FC16AB09ED PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP7 AND SWAP6 DUP7 DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP1 PUSH2 0x89C PUSH1 0x60 DUP3 ADD DUP8 DUP10 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP1 LOG1 DUP6 PUSH2 0x908 JUMPI PUSH1 0x0 SWAP7 MOD SWAP6 DUP5 SWAP6 SWAP7 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0x8F1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x1F51 JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0x774 JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x93F SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0x94A JUMPI DUP6 CODESIZE PUSH2 0x83F JUMP JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP10 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9D8 PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x9F8 CALLDATASIZE PUSH2 0x1FC1 JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA3D PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC5F JUMPI JUMPDEST PUSH2 0xC37 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0xA66 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8E PUSH2 0xA89 DUP4 DUP6 DUP12 PUSH2 0x2415 JUMP JUMPDEST PUSH2 0x2454 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC2C JUMPI DUP11 SWAP2 PUSH2 0xBFE JUMPI JUMPDEST POP ISZERO PUSH2 0xBD3 JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB1D PUSH2 0xA89 DUP5 DUP7 DUP13 PUSH2 0x2415 JUMP JUMPDEST AND PUSH2 0xB2C PUSH2 0xA89 DUP5 DUP8 DUP12 PUSH2 0x2415 JUMP JUMPDEST SWAP1 PUSH2 0xB38 DUP5 DUP9 DUP11 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD SWAP2 DUP2 EXTCODESIZE ISZERO PUSH2 0x38A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP6 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL DUP1 ISZERO PUSH2 0xBC8 JUMPI PUSH2 0xBAF JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xA5B JUMP JUMPDEST DUP2 PUSH2 0xBB9 SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0xBC4 JUMPI DUP8 CODESIZE PUSH2 0xBA5 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST PUSH2 0xC1F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC25 JUMPI JUMPDEST PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x24FA JUMP JUMPDEST CODESIZE PUSH2 0xAF2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC0D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA55 JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xCF7 PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0xD57 PUSH2 0x1EBF JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xE6E PUSH2 0x254D JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xF35 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x10C6 PUSH2 0x254D JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1427 JUMPI DUP3 ISZERO PUSH2 0x13FF JUMPI DUP1 ISZERO PUSH2 0x13D7 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x13AF JUMPI PUSH2 0x1183 PUSH2 0x2234 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x13A4 JUMPI JUMPDEST PUSH2 0x1394 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x11A6 DUP4 TIMESTAMP PUSH2 0x20A3 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1257 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x11F4 PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x21FB JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP8 SWAP1 MSTORE PUSH32 0x5EC3E451D22B879EA6838EFF0B038773EA3BFCF4BB51A4C4E2F168333F489B90 SWAP1 PUSH1 0x40 SWAP1 LOG1 DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1271 PUSH2 0x126B TIMESTAMP DUP7 PUSH2 0x2054 JUMP JUMPDEST DUP3 PUSH2 0x2090 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x136C JUMPI DUP4 DUP3 GT PUSH2 0x12E0 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x12D8 PUSH2 0x12D1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2054 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x21FB JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x11FB JUMP JUMPDEST SWAP2 PUSH2 0x12EE SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x21FB JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x133E JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x11FB JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x139C PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1198 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1193 JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x149C CALLDATASIZE PUSH2 0x1FC1 JUMP JUMPDEST SWAP3 SWAP6 SWAP5 SWAP4 SWAP3 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14E2 PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1664 JUMPI JUMPDEST PUSH2 0x163C JUMPI DUP6 JUMPDEST DUP5 DUP2 LT PUSH2 0x150B JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH2 0x1516 DUP2 DUP4 DUP11 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x1638 JUMPI DUP9 PUSH1 0x20 SWAP2 DUP8 DUP3 PUSH2 0x15B6 PUSH2 0x15E2 PUSH2 0x155E DUP10 DUP16 DUP16 PUSH2 0xA89 DUP16 SWAP3 PUSH2 0x1558 SWAP3 DUP6 SWAP2 PUSH2 0x2415 JUMP JUMPDEST SWAP7 PUSH2 0x2415 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x211A JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x94E JUMPI DUP8 MLOAD RETURNDATASIZE PUSH2 0x162F JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1604 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1500 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x15F7 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP2 DUP5 EQ ISZERO PUSH2 0x14FA JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x16B0 PUSH2 0x16AB PUSH2 0x1E97 JUMP JUMPDEST PUSH2 0x227A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH2 0x1760 PUSH2 0x26AE JUMP JUMPDEST PUSH2 0x1777 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x17B6 PUSH2 0x1EBF JUMP JUMPDEST PUSH2 0x17BE PUSH2 0x254D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1871 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x6F2 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH2 0x1942 PUSH2 0x1930 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x193A PUSH2 0x254D JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x21C4 JUMP JUMPDEST SWAP1 PUSH2 0x194B PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x1954 DUP2 PUSH2 0x2475 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 DUP2 PUSH1 0x0 SWAP4 DUP8 ADD ADD SUB SLT PUSH2 0x390 JUMPI POP MLOAD SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x38E JUMPI DUP2 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0x2D1E0C0200000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x19ED PUSH1 0x24 DUP3 ADD DUP13 PUSH2 0x239A JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xBC8 JUMPI PUSH2 0x1ADA JUMPI JUMPDEST POP POP PUSH32 0x8939976DB42D3930B780581DAF935C63F4B2B954A86929D714DB0AC546958B7F PUSH1 0x40 MLOAD DUP1 PUSH2 0x1A2E DUP7 DUP6 DUP4 PUSH2 0x2681 JUMP JUMPDEST SUB SWAP1 LOG1 DUP2 ISZERO PUSH2 0x1AB2 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1A7B DUP4 PUSH1 0x1 SLOAD PUSH2 0x20A3 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1A97 DUP4 DUP3 SLOAD PUSH2 0x20A3 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1AA8 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x23F9 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x1AE4 SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0x38A JUMPI DUP4 CODESIZE PUSH2 0x19FC JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x2234 JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x1BA9 PUSH2 0x1930 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP1 PUSH2 0x1BB2 PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x1BBB DUP2 PUSH2 0x2475 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 DUP5 ADD DUP5 SWAP1 SUB SLT PUSH2 0x38A JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x1D86 JUMPI DUP5 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0x968F26400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x1C4D PUSH1 0x24 DUP3 ADD DUP12 PUSH2 0x239A JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1D7B JUMPI PUSH2 0x1D67 JUMPI JUMPDEST POP PUSH32 0x36A2EA31C4D4156A140674BC8C3400A4E5C09F48AEB6FCEE2B3D04962EEEBC20 PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C8D DUP7 DUP6 DUP4 PUSH2 0x2681 JUMP JUMPDEST SUB SWAP1 LOG1 DUP2 ISZERO PUSH2 0x1D3F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x1D0B JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1AA8 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x23F9 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 PUSH2 0x1D74 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x211A JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x1C5C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1DDC PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x16B0 DUP4 PUSH2 0x22EB JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x1E92 PUSH2 0x1E97 JUMP JUMPDEST PUSH2 0x20B0 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1EBA JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1EBA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x1EBA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1EBA JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1EBA JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x1EBA JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1EBA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1EBA JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1EBA JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x1EBA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP2 PUSH2 0x200A SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP2 PUSH2 0x202D SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1EBA JUMPI PUSH2 0x2050 SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x2061 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x2061 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2061 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2117 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x2102 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x20FC PUSH2 0x20E7 PUSH2 0x2234 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2054 JUMP JUMPDEST SWAP1 PUSH2 0x2090 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x20A3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x215B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x215B JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x21D0 DUP3 PUSH2 0x218A JUMP JUMPDEST SWAP2 PUSH2 0x21DE PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x211A JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1EBA JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2205 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2273 JUMPI PUSH2 0x2117 SWAP1 PUSH2 0x226D PUSH1 0x4 SLOAD SWAP2 PUSH2 0x2268 PUSH2 0x225F PUSH2 0x2256 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x2090 JUMP JUMPDEST PUSH2 0x21FB JUMP JUMPDEST SWAP1 PUSH2 0x20A3 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x22D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2117 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2394 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x238E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23E4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x23A5 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2410 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x239A JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2425 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1EBA JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x247D PUSH2 0x2234 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x24EF JUMPI JUMPDEST PUSH2 0x24DF JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x24B3 JUMPI POP POP JUMP JUMPDEST PUSH2 0x24BC SWAP1 PUSH2 0x20B0 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x24E7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x2492 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x248D JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1EBA JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1EBA JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2523 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2672 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2677 JUMPI JUMPDEST PUSH2 0x2672 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x25D5 JUMPI JUMPDEST POP PUSH2 0x2117 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2666 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2647 JUMPI JUMPDEST POP CODESIZE PUSH2 0x25CB JUMP JUMPDEST PUSH2 0x2660 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC25 JUMPI PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST CODESIZE PUSH2 0x2640 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2594 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2117 SWAP5 SWAP4 AND DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x239A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x27E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x27EA JUMPI JUMPDEST PUSH2 0x27E2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2741 JUMPI JUMPDEST POP PUSH2 0x2710 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1EBA JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2666 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2704 JUMP JUMPDEST PUSH2 0x27DC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC25 JUMPI PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST CODESIZE PUSH2 0x27BC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x26F5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xA9 CALL PUSH21 0x50C6B268CF3BCF20EC6C47E43686C0B33ED304B1F0 CODECOPY DIV 0xDB LOG0 SWAP1 0xF 0xD8 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"296:1876:111:-:0;;;;;;;;;;;;;-1:-1:-1;;296:1876:111;;;;-1:-1:-1;;;;;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;296:1876:111;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;296:1876:111;;;;;;4082:10:193;1645:152:42;;-1:-1:-1;;;;;500:10:59;;;296:1876:111;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;;;;1857:1:13;;745:39:76;;4180:2:193;4156:26;;296:1876:111;;;4180:2:193;296:1876:111;;;;;;4221:44:193;;916:40:111;;296:1876;;;;;;;;745:39:76;296:1876:111;;;;;;;;;;;;;;;;;;;;4221:44:193;296:1876:111;;;;;;;;;;;;;;;916:40;296:1876;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;;-1:-1:-1;296:1876:111;;;;;-1:-1:-1;296:1876:111;;-1:-1:-1;296:1876:111;1645:152:42;296:1876:111;;;-1:-1:-1;;;;;;296:1876:111;4082:10:193;296:1876:111;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;296:1876:111;-1:-1:-1;296:1876:111;;;;;;-1:-1:-1;296:1876:111;;;;;-1:-1:-1;296:1876:111"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":7871,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":8080,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":8129,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_available_length_bytes":{"entryPoint":8644,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":9466,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":7906,"id":null,"parameterSlots":1,"returnSlots":2},"abi_decode_t_address":{"entryPoint":7831,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_bytes":{"entryPoint":9857,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":9114,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":8017,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes_uint256":{"entryPoint":9209,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":8586,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":9237,"id":null,"parameterSlots":3,"returnSlots":1},"checked_add_uint256":{"entryPoint":8355,"id":null,"parameterSlots":2,"returnSlots":1},"checked_div_uint256":{"entryPoint":8699,"id":null,"parameterSlots":2,"returnSlots":1},"checked_mul_uint256":{"entryPoint":8336,"id":null,"parameterSlots":2,"returnSlots":1},"checked_sub_uint256":{"entryPoint":8276,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":8474,"id":null,"parameterSlots":2,"returnSlots":0},"fun_earned":{"entryPoint":8368,"id":20547,"parameterSlots":1,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":8826,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_lastTimeRewardApplicable":{"entryPoint":8921,"id":20489,"parameterSlots":0,"returnSlots":1},"fun_msgData":{"entryPoint":9902,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":9549,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_nonReentrantBefore":{"entryPoint":9490,"id":1329,"parameterSlots":0,"returnSlots":0},"fun_rewardPerStakePoint":{"entryPoint":8756,"id":20521,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":8939,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_updateReward":{"entryPoint":9333,"id":20469,"parameterSlots":1,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":9300,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":7027},{"length":32,"start":8849},{"length":32,"start":9572},{"length":32,"start":9925}],"15713":[{"length":32,"start":1989},{"length":32,"start":5893},{"length":32,"start":6534},{"length":32,"start":7142}],"20300":[{"length":32,"start":1323},{"length":32,"start":1918},{"length":32,"start":4427}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c80628cc26214611e5557806301ffc9a714611ded5780630700037d14611d8a5780630968f26414611b975780632b4c9f1614611b285780632c9d0b8014611aef5780632d1e0c02146119235780632f2ff15d1461177b57806331e66e1e1461172957806352880f35146116ba578063572b6c051461166e57806373c8a9581461148d57806375c93bb91461108d5780637b0a47ee1461105157806380faa57d14611010578063817b1cd214610fd45780638580cf7614610f7b5780638bb9c5bf14610e115780638da5cb5b14610d9f57806391d1485414610d0857806398807d8414610ca55780639d696e3614610c69578063c3666c36146109e9578063c5c8f77014610986578063c63ff8dd14610739578063d0b06f5d146106fd578063d547741f1461054e578063ef4cadc5146104f5578063efa90b54146104b9578063f2fde38b146103935763f7ba94bd1461017157600080fd5b346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760043567ffffffffffffffff811161038e576101c0903690600401611f90565b60243567ffffffffffffffff811161038a576101e0903690600401611f90565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022161254d565b925416911690810361035d575081810361033557845b818110610242578580f35b61024d818387612415565b3573ffffffffffffffffffffffffffffffffffffffff811680910361033157610277828587612415565b3590814710610301578780809381935af13d156102f9573d906102998261218a565b916102a7604051938461211a565b82523d88602084013e5b156102bf5750600101610237565b80518790156102d15750602081519101fd5b807fd6bda2750000000000000000000000000000000000000000000000000000000060049252fd5b6060906102b1565b60448883477fcf479181000000000000000000000000000000000000000000000000000000008352600452602452fd5b8680fd5b6004857f65825336000000000000000000000000000000000000000000000000000000008152fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8380fd5b505b80fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576103cb611e97565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103f461254d565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361048e575073ffffffffffffffffffffffffffffffffffffffff169283830361043c578480f35b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a3388080808480f35b7f2ef4875e000000000000000000000000000000000000000000000000000000008652600452602485fd5b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600554604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435610589611ebf565b61059161254d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610643578480f35b7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b936106f2918387526020526040862073ffffffffffffffffffffffffffffffffffffffff851660005260205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b0390a1388080808480f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600254604051908152f35b50346103905761074836611ee2565b9190610752612512565b61075a61254d565b9061076482612475565b61076d826120b0565b938461077c575b836001815580f35b7f00000000000000000000000000000000000000000000000000000000000000006107a781876121fb565b9080156109595773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15610331578660405180927fc63ff8dd0000000000000000000000000000000000000000000000000000000082526020600483015281838161082d602482018b8d611f51565b03925af1801561094e57908791610935575b50507f9a3288933ffcc8b186ccc9c2882353ccd8904216bf0bedbc6cefb5fc16ab09ed73ffffffffffffffffffffffffffffffffffffffff604051961695868152836020820152606060408201528061089c606082018789611f51565b0390a1856109085760009606958495967f019eda09011e476781de26947e4b78ee0a834e7182f5ff2eb62bcf8c523f42ca958252600760205260408220556108f1604051948594606086526060860191611f51565b91602084015260408301520390a280388080610774565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8161093f9161211a565b61094a57853861083f565b8580fd5b6040513d89823e3d90fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff6109d8611e97565b168152600883522054604051908152f35b5034610390576109f836611fc1565b9294939092917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a3d61254d565b925416911690810361035d5750808214801590610c5f575b610c3757865b828110610a66578780f35b73ffffffffffffffffffffffffffffffffffffffff610a8e610a8983858b612415565b612454565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c2c578a91610bfe575b5015610bd357508773ffffffffffffffffffffffffffffffffffffffff610b1d610a8984868c612415565b16610b2c610a8984878b612415565b90610b3884888a612415565b3591813b1561038a57606473ffffffffffffffffffffffffffffffffffffffff9185809460405196879586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af18015610bc857610baf575b5050600101610a5b565b81610bb99161211a565b610bc4578738610ba5565b8780fd5b6040513d84823e3d90fd5b7f986b9f1f000000000000000000000000000000000000000000000000000000008952600452602488fd5b610c1f915060203d8111610c25575b610c17818361211a565b8101906124fa565b38610af2565b503d610c0d565b6040513d8c823e3d90fd5b6004877f65825336000000000000000000000000000000000000000000000000000000008152fd5b5082821415610a55565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600454604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff610cf7611e97565b168152600683522054604051908152f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905773ffffffffffffffffffffffffffffffffffffffff6040610d57611ebf565b927fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004358252602052209116600052602052602060ff604060002054166040519015158152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905750602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610e6e61254d565b90838352806020526040832073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610f35578383526020908152604080842073ffffffffffffffffffffffffffffffffffffffff9390931660008181529383529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051948552908401829052830152907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90606090a180f35b5073ffffffffffffffffffffffffffffffffffffffff906044937f7aa7288200000000000000000000000000000000000000000000000000000000845260045216602452fd5b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206040517f72657761726465720000000000000000000000000000000000000000000000008152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600154604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206110496122d9565b604051908152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020600354604051908152f35b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576004356024356110c661254d565b907fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b227f726577617264657200000000000000000000000000000000000000000000000085526020526040842073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114275782156113ff5780156113d7577f0000000000000000000000000000000000000000000000000000000000000000808402908482041480910290156113af57611183612234565b60045560055442108015906113a4575b611394575b600554906111a683426120a3565b914281116112575750928273ffffffffffffffffffffffffffffffffffffffff926111f46040957f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474976121fb565b6003556005555b42600255835173ffffffffffffffffffffffffffffffffffffffff83168152602081018790527f5ec3e451d22b879ea6838eff0b038773ea3bfcf4bb51a4c4e2f168333f489b9090604090a1835195865260208601521692a280f35b9160039391935461127161126b4286612054565b82612090565b8501948510948515029461136c578382116112e0575050507f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474926040926112d86112d173ffffffffffffffffffffffffffffffffffffffff944290612054565b80926121fb565b6003556111fb565b916112ee91935080946121fb565b9080821061133e57509260409273ffffffffffffffffffffffffffffffffffffffff927f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474956003556005556111fb565b7f19e2447d000000000000000000000000000000000000000000000000000000008752600452602452604485fd5b6004887f50082065000000000000000000000000000000000000000000000000000000008152fd5b61139c6122d9565b600255611198565b506001541515611193565b6004857f50082065000000000000000000000000000000000000000000000000000000008152fd5b6004847f76166401000000000000000000000000000000000000000000000000000000008152fd5b6004847f38539865000000000000000000000000000000000000000000000000000000008152fd5b60448473ffffffffffffffffffffffffffffffffffffffff847f7aa728820000000000000000000000000000000000000000000000000000000083527f726577617264657200000000000000000000000000000000000000000000000060045216602452fd5b50346103905761149c36611fc1565b929594939290917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114e261254d565b925416911690810361035d5750808414801590611664575b61163c57855b84811061150b578680f35b61151681838a612415565b3573ffffffffffffffffffffffffffffffffffffffff811690818103611638578860209187826115b66115e261155e898f8f610a898f92611558928591612415565b96612415565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261211a565b51925af11561094e5787513d61162f5750803b155b6116045750600101611500565b7f5274afe7000000000000000000000000000000000000000000000000000000008852600452602487fd5b600114156115f7565b8880fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b50818414156114fa565b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103905760206116b06116ab611e97565b61227a565b6040519015158152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576117606126ae565b611777604051928392602084526020840191611f51565b0390f35b50346103905760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576004356117b6611ebf565b6117be61254d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22818552806020526040852073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611871578480f35b7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d936106f2918387526020526040862073ffffffffffffffffffffffffffffffffffffffff8516600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556040519384938491604091949373ffffffffffffffffffffffffffffffffffffffff80926060860197865216602085015216910152565b5061194261193036611ee2565b919061193a61254d565b9236916121c4565b9061194b612512565b61195481612475565b81516020830190602082816000938701010312610390575051908373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b1561038e578160405180927f2d1e0c02000000000000000000000000000000000000000000000000000000008252602060048301528183816119ed602482018c61239a565b03925af18015610bc857611ada575b50507f8939976db42d3930b780581daf935c63f4b2b954a86929d714db0ac546958b7f60405180611a2e868583612681565b0390a18115611ab2579073ffffffffffffffffffffffffffffffffffffffff7ff4679d394f1f97f1a3df1d73e193866ec5a813168ad5fa6958f9be21b10a594e92611a7b836001546120a3565b6001551692838552600660205260408520611a978382546120a3565b9055611aa8604051928392836123f9565b0390a26001815580f35b6004847f040ef8ec000000000000000000000000000000000000000000000000000000008152fd5b81611ae49161211a565b61038a5783386119fc565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020611049612234565b503461039057807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461039057611ba961193036611ee2565b90611bb2612512565b611bbb81612475565b815160208381019184018490031261038a57519073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b15611d86578460405180927f0968f26400000000000000000000000000000000000000000000000000000000825260206004830152818381611c4d602482018b61239a565b03925af18015611d7b57611d67575b507f36a2ea31c4d4156a140674bc8c3400a4e5c09f48aeb6fcee2b3d04962eeebc2060405180611c8d868583612681565b0390a18115611d3f5773ffffffffffffffffffffffffffffffffffffffff169182845260066020526040842054828110611d0b5790827faae638dec0d864ccb08558c28981bcfaee41330f57c4911cbe2d8432d0fb729e939285875260066020520360408620558160015403600155611aa8604051928392836123f9565b905083927f2b6a77580000000000000000000000000000000000000000000000000000000060649552600452602452604452fd5b6004847fdb73cdf0000000000000000000000000000000000000000000000000000000008152fd5b84611d749195929561211a565b9238611c5c565b6040513d87823e3d90fd5b8480fd5b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057604060209173ffffffffffffffffffffffffffffffffffffffff611ddc611e97565b168152600783522054604051908152f35b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039057600435907fffffffff00000000000000000000000000000000000000000000000000000000821682036103905760206116b0836122eb565b50346103905760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610390576020611049611e92611e97565b6120b0565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611eba57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611eba57565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112611eba5760043567ffffffffffffffff8111611eba5782602382011215611eba5780600401359267ffffffffffffffff8411611eba5760248483010111611eba576024019190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f84011215611eba5782359167ffffffffffffffff8311611eba576020808501948460051b010111611eba57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112611eba5760043567ffffffffffffffff8111611eba578161200a91600401611f90565b9290929160243567ffffffffffffffff8111611eba578161202d91600401611f90565b929092916044359067ffffffffffffffff8211611eba5761205091600401611f90565b9091565b9190820391821161206157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561206157565b9190820180921161206157565b73ffffffffffffffffffffffffffffffffffffffff61211791168060005260066020526121026040600020546120fc6120e7612234565b84600052600860205260406000205490612054565b90612090565b906000526007602052604060002054906120a3565b90565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761215b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161215b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926121d08261218a565b916121de604051938461211a565b829481845281830111611eba578281602093846000960137010152565b8115612205570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6001548015612273576121179061226d6004549161226861225f6122566122d9565b60025490612054565b60035490612090565b6121fb565b906120a3565b5060045490565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156122d25773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b60055480421060001461211757504290565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612394577f01ffc9a700000000000000000000000000000000000000000000000000000000811461238e576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b919082519283825260005b8481106123e45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016123a5565b92919061241060209160408652604086019061239a565b930152565b91908110156124255760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103611eba5790565b61247d612234565b60045560055442108015906124ef575b6124df575b73ffffffffffffffffffffffffffffffffffffffff811690816124b3575050565b6124bc906120b0565b816000526007602052604060002055600454906000526008602052604060002055565b6124e76122d9565b600255612492565b50600154151561248d565b90816020910312611eba57518015158103611eba5790565b600260005414612523576002600055565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612672573233148015612677575b612672577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156125d5575b5061211757503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561266657600091612647575b50386125cb565b612660915060203d602011610c2557610c17818361211a565b38612640565b6040513d6000823e3d90fd5b503390565b5060183610612594565b60409073ffffffffffffffffffffffffffffffffffffffff6121179493168152816020820152019061239a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156127e25732331480156127ea575b6127e257803314908115612741575b50612710576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec360190368211611eba5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115612666576000916127c3575b5038612704565b6127dc915060203d602011610c2557610c17818361211a565b386127bc565b506000903690565b50601836106126f556fea26469706673582212208da9f17450c6b268cf3bcf20ec6c47e43686c0b33ed304b1f03904dba0900fd864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0x8CC262 EQ PUSH2 0x1E55 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1DED JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x1D8A JUMPI DUP1 PUSH4 0x968F264 EQ PUSH2 0x1B97 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1B28 JUMPI DUP1 PUSH4 0x2C9D0B80 EQ PUSH2 0x1AEF JUMPI DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1923 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x177B JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1729 JUMPI DUP1 PUSH4 0x52880F35 EQ PUSH2 0x16BA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x166E JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x148D JUMPI DUP1 PUSH4 0x75C93BB9 EQ PUSH2 0x108D JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x1051 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x1010 JUMPI DUP1 PUSH4 0x817B1CD2 EQ PUSH2 0xFD4 JUMPI DUP1 PUSH4 0x8580CF76 EQ PUSH2 0xF7B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xE11 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD9F JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xD08 JUMPI DUP1 PUSH4 0x98807D84 EQ PUSH2 0xCA5 JUMPI DUP1 PUSH4 0x9D696E36 EQ PUSH2 0xC69 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xC5C8F770 EQ PUSH2 0x986 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0x739 JUMPI DUP1 PUSH4 0xD0B06F5D EQ PUSH2 0x6FD JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x54E JUMPI DUP1 PUSH4 0xEF4CADC5 EQ PUSH2 0x4F5 JUMPI DUP1 PUSH4 0xEFA90B54 EQ PUSH2 0x4B9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x393 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x38E JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x38A JUMPI PUSH2 0x1E0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x221 PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP2 DUP2 SUB PUSH2 0x335 JUMPI DUP5 JUMPDEST DUP2 DUP2 LT PUSH2 0x242 JUMPI DUP6 DUP1 RETURN JUMPDEST PUSH2 0x24D DUP2 DUP4 DUP8 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x331 JUMPI PUSH2 0x277 DUP3 DUP6 DUP8 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x301 JUMPI DUP8 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x299 DUP3 PUSH2 0x218A JUMP JUMPDEST SWAP2 PUSH2 0x2A7 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x211A JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE DUP9 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2BF JUMPI POP PUSH1 0x1 ADD PUSH2 0x237 JUMP JUMPDEST DUP1 MLOAD DUP8 SWAP1 ISZERO PUSH2 0x2D1 JUMPI POP PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST DUP1 PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x4 SWAP3 MSTORE REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B1 JUMP JUMPDEST PUSH1 0x44 DUP9 DUP4 SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST POP JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH2 0x3CB PUSH2 0x1E97 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3F4 PUSH2 0x254D JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x48E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x43C JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP4 DUP1 LOG3 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP6 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x0 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x589 PUSH2 0x1EBF JUMP JUMPDEST PUSH2 0x591 PUSH2 0x254D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x643 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP4 PUSH2 0x6F2 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST SUB SWAP1 LOG1 CODESIZE DUP1 DUP1 DUP1 DUP5 DUP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x748 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x752 PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x75A PUSH2 0x254D JUMP JUMPDEST SWAP1 PUSH2 0x764 DUP3 PUSH2 0x2475 JUMP JUMPDEST PUSH2 0x76D DUP3 PUSH2 0x20B0 JUMP JUMPDEST SWAP4 DUP5 PUSH2 0x77C JUMPI JUMPDEST DUP4 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH32 0x0 PUSH2 0x7A7 DUP2 DUP8 PUSH2 0x21FB JUMP JUMPDEST SWAP1 DUP1 ISZERO PUSH2 0x959 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x331 JUMPI DUP7 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0xC63FF8DD00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x82D PUSH1 0x24 DUP3 ADD DUP12 DUP14 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x94E JUMPI SWAP1 DUP8 SWAP2 PUSH2 0x935 JUMPI JUMPDEST POP POP PUSH32 0x9A3288933FFCC8B186CCC9C2882353CCD8904216BF0BEDBC6CEFB5FC16AB09ED PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP7 AND SWAP6 DUP7 DUP2 MSTORE DUP4 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE DUP1 PUSH2 0x89C PUSH1 0x60 DUP3 ADD DUP8 DUP10 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP1 LOG1 DUP6 PUSH2 0x908 JUMPI PUSH1 0x0 SWAP7 MOD SWAP6 DUP5 SWAP6 SWAP7 PUSH32 0x19EDA09011E476781DE26947E4B78EE0A834E7182F5FF2EB62BCF8C523F42CA SWAP6 DUP3 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SSTORE PUSH2 0x8F1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH1 0x60 DUP7 MSTORE PUSH1 0x60 DUP7 ADD SWAP2 PUSH2 0x1F51 JUMP JUMPDEST SWAP2 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE SUB SWAP1 LOG2 DUP1 CODESIZE DUP1 DUP1 PUSH2 0x774 JUMP JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x93F SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0x94A JUMPI DUP6 CODESIZE PUSH2 0x83F JUMP JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP10 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9D8 PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x8 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x9F8 CALLDATASIZE PUSH2 0x1FC1 JUMP JUMPDEST SWAP3 SWAP5 SWAP4 SWAP1 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA3D PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC5F JUMPI JUMPDEST PUSH2 0xC37 JUMPI DUP7 JUMPDEST DUP3 DUP2 LT PUSH2 0xA66 JUMPI DUP8 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8E PUSH2 0xA89 DUP4 DUP6 DUP12 PUSH2 0x2415 JUMP JUMPDEST PUSH2 0x2454 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC2C JUMPI DUP11 SWAP2 PUSH2 0xBFE JUMPI JUMPDEST POP ISZERO PUSH2 0xBD3 JUMPI POP DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB1D PUSH2 0xA89 DUP5 DUP7 DUP13 PUSH2 0x2415 JUMP JUMPDEST AND PUSH2 0xB2C PUSH2 0xA89 DUP5 DUP8 DUP12 PUSH2 0x2415 JUMP JUMPDEST SWAP1 PUSH2 0xB38 DUP5 DUP9 DUP11 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD SWAP2 DUP2 EXTCODESIZE ISZERO PUSH2 0x38A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP6 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL DUP1 ISZERO PUSH2 0xBC8 JUMPI PUSH2 0xBAF JUMPI JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xA5B JUMP JUMPDEST DUP2 PUSH2 0xBB9 SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0xBC4 JUMPI DUP8 CODESIZE PUSH2 0xBA5 JUMP JUMPDEST DUP8 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 DUP10 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP9 REVERT JUMPDEST PUSH2 0xC1F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC25 JUMPI JUMPDEST PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x24FA JUMP JUMPDEST CODESIZE PUSH2 0xAF2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC0D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP13 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP8 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA55 JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xCF7 PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x6 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH2 0xD57 PUSH2 0x1EBF JUMP JUMPDEST SWAP3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xE6E PUSH2 0x254D JUMP JUMPDEST SWAP1 DUP4 DUP4 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xF35 JUMPI DUP4 DUP4 MSTORE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 SWAP1 SWAP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE SWAP4 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE SWAP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP4 ADD MSTORE SWAP1 PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 PUSH1 0x60 SWAP1 LOG1 DUP1 RETURN JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x44 SWAP4 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x10C6 PUSH2 0x254D JUMP JUMPDEST SWAP1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1427 JUMPI DUP3 ISZERO PUSH2 0x13FF JUMPI DUP1 ISZERO PUSH2 0x13D7 JUMPI PUSH32 0x0 DUP1 DUP5 MUL SWAP1 DUP5 DUP3 DIV EQ DUP1 SWAP2 MUL SWAP1 ISZERO PUSH2 0x13AF JUMPI PUSH2 0x1183 PUSH2 0x2234 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x13A4 JUMPI JUMPDEST PUSH2 0x1394 JUMPI JUMPDEST PUSH1 0x5 SLOAD SWAP1 PUSH2 0x11A6 DUP4 TIMESTAMP PUSH2 0x20A3 JUMP JUMPDEST SWAP2 TIMESTAMP DUP2 GT PUSH2 0x1257 JUMPI POP SWAP3 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH2 0x11F4 PUSH1 0x40 SWAP6 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP8 PUSH2 0x21FB JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE JUMPDEST TIMESTAMP PUSH1 0x2 SSTORE DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP8 SWAP1 MSTORE PUSH32 0x5EC3E451D22B879EA6838EFF0B038773EA3BFCF4BB51A4C4E2F168333F489B90 SWAP1 PUSH1 0x40 SWAP1 LOG1 DUP4 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD MSTORE AND SWAP3 LOG2 DUP1 RETURN JUMPDEST SWAP2 PUSH1 0x3 SWAP4 SWAP2 SWAP4 SLOAD PUSH2 0x1271 PUSH2 0x126B TIMESTAMP DUP7 PUSH2 0x2054 JUMP JUMPDEST DUP3 PUSH2 0x2090 JUMP JUMPDEST DUP6 ADD SWAP5 DUP6 LT SWAP5 DUP6 ISZERO MUL SWAP5 PUSH2 0x136C JUMPI DUP4 DUP3 GT PUSH2 0x12E0 JUMPI POP POP POP PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP3 PUSH1 0x40 SWAP3 PUSH2 0x12D8 PUSH2 0x12D1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 TIMESTAMP SWAP1 PUSH2 0x2054 JUMP JUMPDEST DUP1 SWAP3 PUSH2 0x21FB JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x11FB JUMP JUMPDEST SWAP2 PUSH2 0x12EE SWAP2 SWAP4 POP DUP1 SWAP5 PUSH2 0x21FB JUMP JUMPDEST SWAP1 DUP1 DUP3 LT PUSH2 0x133E JUMPI POP SWAP3 PUSH1 0x40 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 PUSH32 0x6A6F77044107A33658235D41BEDBBAF2FE9CCDCEB313143C947A5E76E1EC8474 SWAP6 PUSH1 0x3 SSTORE PUSH1 0x5 SSTORE PUSH2 0x11FB JUMP JUMPDEST PUSH32 0x19E2447D00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 DUP6 REVERT JUMPDEST PUSH1 0x4 DUP9 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH2 0x139C PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x1198 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x1193 JUMP JUMPDEST PUSH1 0x4 DUP6 PUSH32 0x5008206500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7616640100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x3853986500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x44 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH32 0x7265776172646572000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x149C CALLDATASIZE PUSH2 0x1FC1 JUMP JUMPDEST SWAP3 SWAP6 SWAP5 SWAP4 SWAP3 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14E2 PUSH2 0x254D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1664 JUMPI JUMPDEST PUSH2 0x163C JUMPI DUP6 JUMPDEST DUP5 DUP2 LT PUSH2 0x150B JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH2 0x1516 DUP2 DUP4 DUP11 PUSH2 0x2415 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x1638 JUMPI DUP9 PUSH1 0x20 SWAP2 DUP8 DUP3 PUSH2 0x15B6 PUSH2 0x15E2 PUSH2 0x155E DUP10 DUP16 DUP16 PUSH2 0xA89 DUP16 SWAP3 PUSH2 0x1558 SWAP3 DUP6 SWAP2 PUSH2 0x2415 JUMP JUMPDEST SWAP7 PUSH2 0x2415 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x211A JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x94E JUMPI DUP8 MLOAD RETURNDATASIZE PUSH2 0x162F JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1604 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1500 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 DUP9 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP8 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x15F7 JUMP JUMPDEST DUP9 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP2 DUP5 EQ ISZERO PUSH2 0x14FA JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x16B0 PUSH2 0x16AB PUSH2 0x1E97 JUMP JUMPDEST PUSH2 0x227A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH2 0x1760 PUSH2 0x26AE JUMP JUMPDEST PUSH2 0x1777 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x1F51 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x17B6 PUSH2 0x1EBF JUMP JUMPDEST PUSH2 0x17BE PUSH2 0x254D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x35D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 DUP6 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1871 JUMPI DUP5 DUP1 RETURN JUMPDEST PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP4 PUSH2 0x6F2 SWAP2 DUP4 DUP8 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP7 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 DUP5 SWAP2 PUSH1 0x40 SWAP2 SWAP5 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP3 PUSH1 0x60 DUP7 ADD SWAP8 DUP7 MSTORE AND PUSH1 0x20 DUP6 ADD MSTORE AND SWAP2 ADD MSTORE JUMP JUMPDEST POP PUSH2 0x1942 PUSH2 0x1930 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x193A PUSH2 0x254D JUMP JUMPDEST SWAP3 CALLDATASIZE SWAP2 PUSH2 0x21C4 JUMP JUMPDEST SWAP1 PUSH2 0x194B PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x1954 DUP2 PUSH2 0x2475 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 DUP2 PUSH1 0x0 SWAP4 DUP8 ADD ADD SUB SLT PUSH2 0x390 JUMPI POP MLOAD SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x38E JUMPI DUP2 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0x2D1E0C0200000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x19ED PUSH1 0x24 DUP3 ADD DUP13 PUSH2 0x239A JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xBC8 JUMPI PUSH2 0x1ADA JUMPI JUMPDEST POP POP PUSH32 0x8939976DB42D3930B780581DAF935C63F4B2B954A86929D714DB0AC546958B7F PUSH1 0x40 MLOAD DUP1 PUSH2 0x1A2E DUP7 DUP6 DUP4 PUSH2 0x2681 JUMP JUMPDEST SUB SWAP1 LOG1 DUP2 ISZERO PUSH2 0x1AB2 JUMPI SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xF4679D394F1F97F1A3DF1D73E193866EC5A813168AD5FA6958F9BE21B10A594E SWAP3 PUSH2 0x1A7B DUP4 PUSH1 0x1 SLOAD PUSH2 0x20A3 JUMP JUMPDEST PUSH1 0x1 SSTORE AND SWAP3 DUP4 DUP6 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP6 KECCAK256 PUSH2 0x1A97 DUP4 DUP3 SLOAD PUSH2 0x20A3 JUMP JUMPDEST SWAP1 SSTORE PUSH2 0x1AA8 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x23F9 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH1 0x1 DUP2 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x40EF8EC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 PUSH2 0x1AE4 SWAP2 PUSH2 0x211A JUMP JUMPDEST PUSH2 0x38A JUMPI DUP4 CODESIZE PUSH2 0x19FC JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x2234 JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH2 0x1BA9 PUSH2 0x1930 CALLDATASIZE PUSH2 0x1EE2 JUMP JUMPDEST SWAP1 PUSH2 0x1BB2 PUSH2 0x2512 JUMP JUMPDEST PUSH2 0x1BBB DUP2 PUSH2 0x2475 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 DUP2 ADD SWAP2 DUP5 ADD DUP5 SWAP1 SUB SLT PUSH2 0x38A JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 EXTCODESIZE ISZERO PUSH2 0x1D86 JUMPI DUP5 PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH32 0x968F26400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x20 PUSH1 0x4 DUP4 ADD MSTORE DUP2 DUP4 DUP2 PUSH2 0x1C4D PUSH1 0x24 DUP3 ADD DUP12 PUSH2 0x239A JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1D7B JUMPI PUSH2 0x1D67 JUMPI JUMPDEST POP PUSH32 0x36A2EA31C4D4156A140674BC8C3400A4E5C09F48AEB6FCEE2B3D04962EEEBC20 PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C8D DUP7 DUP6 DUP4 PUSH2 0x2681 JUMP JUMPDEST SUB SWAP1 LOG1 DUP2 ISZERO PUSH2 0x1D3F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP5 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SLOAD DUP3 DUP2 LT PUSH2 0x1D0B JUMPI SWAP1 DUP3 PUSH32 0xAAE638DEC0D864CCB08558C28981BCFAEE41330F57C4911CBE2D8432D0FB729E SWAP4 SWAP3 DUP6 DUP8 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE SUB PUSH1 0x40 DUP7 KECCAK256 SSTORE DUP2 PUSH1 0x1 SLOAD SUB PUSH1 0x1 SSTORE PUSH2 0x1AA8 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x23F9 JUMP JUMPDEST SWAP1 POP DUP4 SWAP3 PUSH32 0x2B6A775800000000000000000000000000000000000000000000000000000000 PUSH1 0x64 SWAP6 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0xDB73CDF000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 PUSH2 0x1D74 SWAP2 SWAP6 SWAP3 SWAP6 PUSH2 0x211A JUMP JUMPDEST SWAP3 CODESIZE PUSH2 0x1C5C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP8 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x40 PUSH1 0x20 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1DDC PUSH2 0x1E97 JUMP JUMPDEST AND DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x16B0 DUP4 PUSH2 0x22EB JUMP JUMPDEST POP CALLVALUE PUSH2 0x390 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x390 JUMPI PUSH1 0x20 PUSH2 0x1049 PUSH2 0x1E92 PUSH2 0x1E97 JUMP JUMPDEST PUSH2 0x20B0 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1EBA JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1EBA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x1EBA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1EBA JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x1EBA JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x1EBA JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1EBA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1EBA JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1EBA JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x1EBA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP2 PUSH2 0x200A SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1EBA JUMPI DUP2 PUSH2 0x202D SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1EBA JUMPI PUSH2 0x2050 SWAP2 PUSH1 0x4 ADD PUSH2 0x1F90 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP3 SUB SWAP2 DUP3 GT PUSH2 0x2061 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x2061 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP3 ADD DUP1 SWAP3 GT PUSH2 0x2061 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2117 SWAP2 AND DUP1 PUSH1 0x0 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH2 0x2102 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x20FC PUSH2 0x20E7 PUSH2 0x2234 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x2054 JUMP JUMPDEST SWAP1 PUSH2 0x2090 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x20A3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x215B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x215B JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x21D0 DUP3 PUSH2 0x218A JUMP JUMPDEST SWAP2 PUSH2 0x21DE PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x211A JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x1EBA JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST DUP2 ISZERO PUSH2 0x2205 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP1 ISZERO PUSH2 0x2273 JUMPI PUSH2 0x2117 SWAP1 PUSH2 0x226D PUSH1 0x4 SLOAD SWAP2 PUSH2 0x2268 PUSH2 0x225F PUSH2 0x2256 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x2090 JUMP JUMPDEST PUSH2 0x21FB JUMP JUMPDEST SWAP1 PUSH2 0x20A3 JUMP JUMPDEST POP PUSH1 0x4 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x22D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x5 SLOAD DUP1 TIMESTAMP LT PUSH1 0x0 EQ PUSH2 0x2117 JUMPI POP TIMESTAMP SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2394 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x238E JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23E4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x23A5 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2410 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x239A JUMP JUMPDEST SWAP4 ADD MSTORE JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2425 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1EBA JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x247D PUSH2 0x2234 JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x5 SLOAD TIMESTAMP LT DUP1 ISZERO SWAP1 PUSH2 0x24EF JUMPI JUMPDEST PUSH2 0x24DF JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 PUSH2 0x24B3 JUMPI POP POP JUMP JUMPDEST PUSH2 0x24BC SWAP1 PUSH2 0x20B0 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x4 SLOAD SWAP1 PUSH1 0x0 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE JUMP JUMPDEST PUSH2 0x24E7 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0x2492 JUMP JUMPDEST POP PUSH1 0x1 SLOAD ISZERO ISZERO PUSH2 0x248D JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x1EBA JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x1EBA JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SLOAD EQ PUSH2 0x2523 JUMPI PUSH1 0x2 PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH32 0x3EE5AEB500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2672 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2677 JUMPI JUMPDEST PUSH2 0x2672 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x25D5 JUMPI JUMPDEST POP PUSH2 0x2117 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2666 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2647 JUMPI JUMPDEST POP CODESIZE PUSH2 0x25CB JUMP JUMPDEST PUSH2 0x2660 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC25 JUMPI PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST CODESIZE PUSH2 0x2640 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2594 JUMP JUMPDEST PUSH1 0x40 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2117 SWAP5 SWAP4 AND DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE ADD SWAP1 PUSH2 0x239A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x27E2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x27EA JUMPI JUMPDEST PUSH2 0x27E2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2741 JUMPI JUMPDEST POP PUSH2 0x2710 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1EBA JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2666 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2704 JUMP JUMPDEST PUSH2 0x27DC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC25 JUMPI PUSH2 0xC17 DUP2 DUP4 PUSH2 0x211A JUMP JUMPDEST CODESIZE PUSH2 0x27BC JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x26F5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xA9 CALL PUSH21 0x50C6B268CF3BCF20EC6C47E43686C0B33ED304B1F0 CODECOPY DIV 0xDB LOG0 SWAP1 0xF 0xD8 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"296:1876:111:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;296:1876:111;;16306:41:193;;;:::i;:::-;296:1876:111;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1834:9;1845:10;;;;;;296:1876:111;;;1857:3:192;1876:11;;;;;:::i;:::-;296:1876:111;;;;;;;;;1898:10:192;;;;;:::i;:::-;296:1876:111;1375:21:9;;;:30;1371:125;;1548:33;;;;;;;;296:1876:111;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;296:1876:111;;1834:9:192;;1591:58:9;296:1876:111;;;;5690:21:9;:17;;5815:105;296:1876:111;5815:105:9;;;;;5686:301;5957:19;;296:1876:111;5957:19:9;;;296:1876:111;;;;;1371:125:9;296:1876:111;1455:21:9;;;1428:57;;;296:1876:111;;;;1428:57:9;296:1876:111;;;;1756:63:192;296:1876:111;1793:26:192;;;;;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;296:1876:111;;-1:-1:-1;4538:25:42;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16306:41:193;;:::i;:::-;296:1876:111;;;;;;;;;;3205:23:42;;;3201:60;;296:1876:111;;;3275:25:42;;;;3271:146;;296:1876:111;;;3271:146:42;296:1876:111;;;;;;3361:45:42;;;;3271:146;;;;296:1876:111;;;3201:60:42;3237:24;;;296:1876:111;;;3237:24:42;;296:1876:111;;;;;;;;;;;;;2158:30:193;296:1876:111;;;;;;;;;;;;;;;;;;;;;;1971:39:193;296:1876:111;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;296:1876:111;;;;;;;4503:26:42;;;4499:64;;4464:19:41;296:1876:111;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;500:10:59;296:1876:111;-1:-1:-1;296:1876:111;500:10:59;;1880:140:41;;296:1876:111;;;1880:140:41;1973:36;296:1876:111;1973:36:41;296:1876:111;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;-1:-1:-1;296:1876:111;;;;;;;;;1973:36:41;;;;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;;;1880:140;;;;296:1876:111;;;;;;;;;;;;;;;;2049:26:193;296:1876:111;;;;;;;;;;;;;;;:::i;:::-;2466:103:13;;;;:::i;:::-;16306:41:193;;:::i;:::-;10335:6;;;;:::i;:::-;10369:14;;;:::i;:::-;10397:11;;10393:466;;296:1876:111;;1857:1:13;296:1876:111;;;;10393:466:193;10453:14;10444:23;;;;:::i;:::-;296:1876:111;;;;;;1809:19;296:1876;1809:36;;;;;296:1876;;;1809:36;;296:1876;1809:36;;296:1876;;1809:36;;296:1876;;;;;;;;;;;:::i;:::-;1809:36;;;;;;;;;;;;;10393:466:193;296:1876:111;;1860:48;296:1876;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1860:48;;;296:1876;;;-1:-1:-1;;296:1876:111;;;;;10802:46:193;296:1876:111;;;10732:7:193;296:1876:111;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10802:46:193;;;10393:466;;;;;;296:1876:111;;;;;;;;;;1809:36;;;;;:::i;:::-;296:1876;;1809:36;;;;296:1876;;;;1809:36;296:1876;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2323:70:193;296:1876:111;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;296:1876:111;;;16306:41:193;;:::i;:::-;296:1876:111;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;296:1876:111;3852:94:192;;3961:9;3972:10;;;;;;296:1876:111;;;3984:3:192;296:1876:111;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;296:1876:111;;;;4058:76:192;;4108:25;296:1876:111;4058:76:192;;296:1876:111;4058:76:192;;;;;;;;;;;;;;;;3984:3;4057:77;;4053:173;;4239:12;;296:1876:111;4239:12:192;;;;;;:::i;:::-;296:1876:111;4284:11:192;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;296:1876:111;4239:70:192;;;;;;;296:1876:111;;;;;;;4239:70:192;;;;;296:1876:111;4239:70:192;;4277:4;296:1876:111;4239:70:192;;296:1876:111;;4058:76:192;296:1876:111;;;;;;;4239:70:192;;;;;;;;3984:3;;;296:1876:111;;3961:9:192;;4239:70;;;;;:::i;:::-;296:1876:111;;4239:70:192;;;;296:1876:111;;;;4239:70:192;296:1876:111;;;;;;;;;4053:173:192;4161:50;;;296:1876:111;;4058:76:192;4161:50;;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;296:1876:111;;;;;;;;;3852:94:192;296:1876:111;3920:26:192;;;;;3856:55;3886:25;;;;;3856:55;;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2195:60:193;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;296:1876:111;;;;;;;;2800:22:41;296:1876:111;-1:-1:-1;296:1876:111;;;;500:10:59;296:1876:111;-1:-1:-1;296:1876:111;500:10:59;;296:1876:111;;;;;;;;;;;;;;;;;;;;912:80:42;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;296:1876:111;16306:41:193;;:::i;:::-;296:1876:111;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;500:10:59;296:1876:111;-1:-1:-1;296:1876:111;500:10:59;;3741:25:41;3737:66;;296:1876:111;;;;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;296:1876:111;;2455:33:41;296:1876:111;;3737:66:41;3775:28;296:1876:111;3775:28:41;296:1876:111;3775:28:41;;;;296:1876:111;;;;;3775:28:41;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:26:193;296:1876:111;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2081:25:193;296:1876:111;;;;;;;;;;;;;;;;;;;;16306:41:193;;:::i;:::-;4464:19:41;296:1876:111;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;500:10:59;296:1876:111;-1:-1:-1;296:1876:111;500:10:59;;3741:25:41;3737:66;;12172:11:193;;296:1876:111;;12225:13:193;;296:1876:111;;12321:14:193;296:1876:111;;;2570:213:20;;;;;296:1876:111;;;34863:71:21;;296:1876:111;;4365:21:193;;:::i;:::-;296:1876:111;;4419:15:193;296:1876:111;4400:15:193;:34;;;:54;;;296:1876:111;4396:195:193;;296:1876:111;4419:15:193;296:1876:111;4400:15:193;12514:26;4400:15;;12514:26;:::i;:::-;4400:15;;12555:41;-1:-1:-1;12555:41:193;;12664:22;;;296:1876:111;12664:22:193;;296:1876:111;12664:22:193;13962:39;12664:22;;:::i;:::-;12651:35;296:1876:111;4419:15:193;296:1876:111;12551:1311:193;4400:15;13871:29;296:1876:111;;;;;;;;;;;;;;2023:40;;296:1876;;2023:40;296:1876;;;;;;;;;;13962:39:193;;296:1876:111;;12551:1311:193;296:1876:111;12795:10:193;296:1876:111;;;;12845:62:193;12866:40;4400:15;12866:40;;:::i;:::-;12845:62;;:::i;:::-;296:1876:111;;1859:6:20;;;;;;296:1876:111;;;;13048:44:193;;;;;4400:15;;;13962:39;4400:15;296:1876:111;4400:15:193;13357:22;13286:40;296:1876:111;4400:15:193;;13286:40;;:::i;:::-;13357:22;;;:::i;:::-;12795:10;296:1876:111;12551:1311:193;;13044:808;13606:22;;;;;;;;:::i;:::-;13654:34;;;;296:1876:111;;;;;;;;13962:39:193;296:1876:111;12795:10:193;296:1876:111;4419:15:193;296:1876:111;12551:1311:193;;296:1876:111;;;;;;;;;;;;;;;;;;4396:195:193;4554:26;;:::i;:::-;4540:40;296:1876:111;4396:195:193;;4400:54;296:1876:111;4438:11:193;296:1876:111;4438:16:193;;4400:54;;296:1876:111;;;;;;;;;;;;;;;;;;;;;3737:66:41;296:1876:111;3775:28:41;296:1876:111;3775:28:41;;;;296:1876:111;;;;;;3775:28:41;296:1876:111;;;;;;;;:::i;:::-;5148:19:42;;;;;;;296:1876:111;;;16306:41:193;;:::i;:::-;296:1876:111;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;296:1876:111;2776:90:192;;2881:9;2892:10;;;;;;296:1876:111;;;2904:3:192;2923:9;;;;;:::i;:::-;296:1876:111;;;;;;;;;;2946:11:192;1328:43:8;2946:11:192;;;1328:43:8;;2959:10:192;2946:11;;;;;;;;;;;:::i;:::-;2959:10;;:::i;:::-;296:1876:111;;;1328:43:8;;;;;;296:1876:111;;;;1328:43:8;;;296:1876:111;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;;;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;296:1876:111;;2881:9:192;;8938:146:8;9033:40;;;296:1876:111;;1328:43:8;9033:40;;8942:68;296:1876:111;8994:16:8;;8942:68;;296:1876:111;;;;2776:90:192;296:1876:111;2840:26:192;;;;;2780:51;2807:24;;;;;2780:51;;296:1876:111;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;340:65;296:1876;;;;;;;;;;;;;;;;16541:39:193;;:::i;:::-;296:1876:111;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;:::i;:::-;5148:19:42;296:1876:111;;;;;;;4503:26:42;;;4499:64;;4464:19:41;296:1876:111;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;500:10:59;296:1876:111;-1:-1:-1;296:1876:111;500:10:59;;1254:25:41;1250:140;;296:1876:111;;;1250:140:41;1343:36;296:1876:111;1343:36:41;296:1876:111;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;1343:36:41;;;;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16306:41:193;;;;:::i;:::-;296:1876:111;;;;:::i;:::-;2466:103:13;;;:::i;:::-;7561:6:193;;;:::i;:::-;296:1876:111;;1112:32;;;;296:1876;1112:32;;-1:-1:-1;1112:32:111;;;;296:1876;;;;;;1154:19;;296:1876;1154:19;296:1876;1154:36;;;;;296:1876;;;1154:36;;296:1876;1154:36;;1112:32;296:1876;1154:36;;296:1876;;;;;;;;;;:::i;:::-;1154:36;;;;;;;;;;296:1876;;;1205:37;296:1876;;1205:37;;;;;;:::i;:::-;;;;7650:16:193;;296:1876:111;;;;7779:38:193;296:1876:111;7699:26:193;296:1876:111;7699:26:193;296:1876:111;7699:26:193;:::i;:::-;;296:1876:111;;;;;;7735:6:193;1112:32:111;296:1876;;;;7735:29:193;296:1876:111;;;7735:29:193;:::i;:::-;296:1876:111;;7779:38:193;296:1876:111;;7779:38:193;;;;;:::i;:::-;;;;7699:26;296:1876:111;;;;;;;;;;;1154:36;;;;;:::i;:::-;296:1876;;1154:36;;;;296:1876;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;941:19:75;296:1876:111;;;;;;;;;;;;;:::i;:::-;2466:103:13;;;:::i;:::-;9425:6:193;;;:::i;:::-;296:1876:111;;1404:35;;;;;;;296:1876;;;;;;;1449:19;296:1876;1449:19;296:1876;1449:42;;;;;296:1876;;;1449:42;;296:1876;1449:42;;1404:35;296:1876;1449:42;;296:1876;;;;;;;;;;:::i;:::-;1449:42;;;;;;;;;;296:1876;;1506:43;296:1876;;1506:43;;;;;;:::i;:::-;;;;9520:16:193;;296:1876:111;;;;;;;;9596:6:193;1404:35:111;296:1876;;;;;9628:28:193;;;296:1876:111;;;;9889:44:193;296:1876:111;;;;;9596:6:193;1404:35:111;296:1876;;;;;;;9838:26:193;296:1876:111;;9838:26:193;296:1876:111;9889:44:193;296:1876:111;;9889:44:193;;;;;:::i;296:1876:111:-;;;;;;;;;;;;;;;;;;;;;;;1449:42;;;;;;;;:::i;:::-;;;;;;296:1876;;;;;;;;;1449:42;296:1876;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2261:56:193;296:1876:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;;;:::i;296:1876:111:-;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;5929:184:193:-;296:1876:111;6009:97:193;5929:184;296:1876:111;;-1:-1:-1;296:1876:111;6010:6:193;296:1876:111;;6010:76:193;296:1876:111;-1:-1:-1;296:1876:111;;6029:56:193;:21;;:::i;:::-;296:1876:111;-1:-1:-1;296:1876:111;6053:23:193;296:1876:111;;;-1:-1:-1;296:1876:111;;6029:56:193;;:::i;:::-;6010:76;;:::i;:::-;296:1876:111;-1:-1:-1;296:1876:111;6090:7:193;296:1876:111;;;-1:-1:-1;296:1876:111;;6009:97:193;;:::i;:::-;5929:184;:::o;296:1876:111:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;296:1876:111;;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;5307:338:193;5407:11;296:1876:111;5432:23:193;;5428:86;;5530:108;296:1876:111;5559:78:193;5530:25;296:1876:111;5561:26:193;5560:55;5561:40;:26;;:::i;:::-;5590:11;296:1876:111;5561:40:193;;:::i;:::-;5605:10;296:1876:111;5560:55:193;;:::i;:::-;5559:78;:::i;:::-;5530:108;;:::i;5428:86::-;296:1876:111;5478:25:193;296:1876:111;5471:32:193;:::o;1002:301:75:-;296:1876:111;1146:19:75;296:1876:111;1146:53:75;;;1142:96;;296:1876:111;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;296:1876:111;1215:12:75;:::o;4919:231:193:-;5028:15;296:1876:111;5060:15:193;;:40;:83;:40;;;:15;;4919:231;:::o;1359:340:59:-;296:1876:111;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;296:1876:111;500:10:59;296:1876:111;500:10:59;;;;296:1876:111;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;296:1876:111;1528:12:59;:::o;296:1876:111:-;;;;;;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;-1:-1:-1;296:1876:111;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;4278:488:193:-;4365:21;;:::i;:::-;4337:49;296:1876:111;4419:15:193;296:1876:111;4400:15:193;:34;;;:54;;;4278:488;4396:195;;4278:488;296:1876:111;;;4604:21:193;;4600:160;;4278:488;;:::o;4600:160::-;4660:15;;;:::i;:::-;296:1876:111;-1:-1:-1;296:1876:111;4641:7:193;296:1876:111;;;-1:-1:-1;296:1876:111;;4337:49:193;296:1876:111;;-1:-1:-1;296:1876:111;4689:23:193;296:1876:111;;;-1:-1:-1;296:1876:111;;4278:488:193:o;4396:195::-;4554:26;;:::i;:::-;4540:40;296:1876:111;4396:195:193;;4400:54;296:1876:111;4438:11:193;296:1876:111;4438:16:193;;4400:54;;296:1876:111;;;;;;;;;;;;;;;;;;:::o;2575:307:13:-;1899:1;2702:7;296:1876:111;2702:18:13;2698:86;;1899:1;2702:7;296:1876:111;2575:307:13:o;2698:86::-;2743:30;2702:7;2743:30;;2702:7;2743:30;907:917:76;296:1876:111;1029:19:76;296:1876:111;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;296:1876:111;;;1676:74:76;;296:1876:111;;;1676:74:76;;;296:1876:111;1327:10:76;296:1876:111;;;;1744:4:76;296:1876:111;;;;;-1:-1:-1;1676:74:76;;296:1876:111;;;;;;1676:74:76;;;;;;;296:1876:111;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;;296:1876:111;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;296:1876:111;;;;;;;;;;;;;;;;;;:::i;1938:939:76:-;296:1876:111;2065:19:76;296:1876:111;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;296:1876:111;720:8:80;296:1876:111;720:8:80;;296:1876:111;;;;2115:1:76;2802:32;;:::o;2624:153::-;296:1876:111;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;296:1876:111;2361:10:76;296:1876:111;;;;2771:4:76;296:1876:111;;;;;-1:-1:-1;2682:95:76;;296:1876:111;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"2056400","executionCost":"infinite","totalCost":"infinite"},"external":{"REENTRANCY_ATTACKER()":"infinite","REWARDER_ROLE()":"501","SCALING_FACTOR()":"infinite","__msgData()":"infinite","addReward(uint256,uint256)":"infinite","claim(bytes)":"infinite","distributionEnd()":"2868","earned(address)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2878","isTrustedForwarder(address)":"infinite","lastTimeRewardApplicable()":"2618","lastUpdated()":"2802","owner()":"2656","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","rewardPerStakePoint()":"11140","rewardPerStakePointPaid(address)":"2885","rewardPerStakePointStored()":"2714","rewardRate()":"2538","rewards(address)":"2423","stake(bytes)":"infinite","staked(address)":"2819","supportsInterface(bytes4)":"2463","totalStaked()":"2582","transferOwnership(address)":"infinite","withdraw(bytes)":"infinite"},"internal":{"_computeAddReward(address,uint256)":"infinite","_computeClaim(address,uint256,bytes calldata)":"infinite","_computeStake(address,bytes memory)":"infinite","_computeWithdraw(address,bytes memory)":"infinite"}},"methodIdentifiers":{"REENTRANCY_ATTACKER()":"52880f35","REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","__msgData()":"31e66e1e","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract LinearPoolReentrancyAttacker\",\"name\":\"reentrancyAttacker\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"scalingFactorDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"ComputeAddRewardCalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"ComputeClaimCalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"ComputeStakeCalled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"ComputeWithdrawCalled\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REENTRANCY_ATTACKER\",\"outputs\":[{\"internalType\":\"contract LinearPoolReentrancyAttacker\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for the stake (encoding freely determined by the deriving contracts).\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/LinearPoolMock.sol\":\"LinearPoolMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/LinearPoolMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../../../staking/linear/LinearPool.sol\\\";\\nimport {LinearPoolReentrancyAttacker} from \\\"./LinearPoolReentrancyAttacker.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\ncontract LinearPoolMock is LinearPool {\\n    LinearPoolReentrancyAttacker public immutable REENTRANCY_ATTACKER;\\n\\n    event ComputeStakeCalled(address staker, bytes stakeData);\\n    event ComputeWithdrawCalled(address staker, bytes withdrawData);\\n    event ComputeClaimCalled(address staker, uint256 claimable, bytes claimData);\\n    event ComputeAddRewardCalled(address rewarder, uint256 reward);\\n\\n    constructor(\\n        LinearPoolReentrancyAttacker reentrancyAttacker,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        REENTRANCY_ATTACKER = reentrancyAttacker;\\n    }\\n\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(stakeData, (uint256));\\n        REENTRANCY_ATTACKER.stake(stakeData);\\n        emit ComputeStakeCalled(staker, stakeData);\\n    }\\n\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(withdrawData, (uint256));\\n        REENTRANCY_ATTACKER.withdraw(withdrawData);\\n        emit ComputeWithdrawCalled(staker, withdrawData);\\n    }\\n\\n    function _computeClaim(\\n        address staker,\\n        uint256 claimable,\\n        bytes calldata claimData\\n    ) internal virtual override returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 0;\\n        REENTRANCY_ATTACKER.claim(claimData);\\n        emit ComputeClaimCalled(staker, claimable, claimData);\\n    }\\n\\n    function _computeAddReward(address rewarder, uint256 reward) internal virtual override {\\n        emit ComputeAddRewardCalled(rewarder, reward);\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc7fd7b217ba066dbea5e95d0dd662ccdf9056ef13d4a55a17b2db2ae1e735cbe\",\"license\":\"MIT\"},\"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ILinearPool} from \\\"./../../../staking/linear/interfaces/ILinearPool.sol\\\";\\n\\ncontract LinearPoolReentrancyAttacker {\\n    ILinearPool public target;\\n\\n    function setTarget(address targetAddress) external {\\n        target = ILinearPool(targetAddress);\\n    }\\n\\n    function stake(bytes calldata stakeData) external {\\n        if (address(target) != address(0)) {\\n            target.stake(stakeData);\\n        }\\n    }\\n\\n    function withdraw(bytes calldata withdrawData) external {\\n        if (address(target) != address(0)) {\\n            target.withdraw(withdrawData);\\n        }\\n    }\\n\\n    function claim(bytes calldata claimData) external {\\n        if (address(target) != address(0)) {\\n            target.claim(claimData);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x0b00680bf2e1914f717ae84f3a4580b12cd108b1fe3dd70e2dd4149b7937943b\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/mocks/staking/linear/LinearPoolMock.sol:LinearPoolMock","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"version":1}}},"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol":{"LinearPoolReentrancyAttacker":{"abi":[{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"setTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"target","outputs":[{"internalType":"contract ILinearPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610451908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c9081630968f2641461024a575080632d1e0c02146101d3578063776d1a0114610154578063c63ff8dd146100ab5763d4b839921461005857600080fd5b346100a857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a85773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b80fd5b50346100a857806100bb366102f1565b9073ffffffffffffffffffffffffffffffffffffffff83541691826100df57505050f35b823b1561014f57610122928492836040518096819582947fc63ff8dd000000000000000000000000000000000000000000000000000000008452600484016103d5565b03925af18015610144576101335750f35b8161013d91610365565b6100a85780f35b6040513d84823e3d90fd5b505050fd5b50346100a85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a85760043573ffffffffffffffffffffffffffffffffffffffff81168091036101cf577fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b5080fd5b50346100a857806101e3366102f1565b9073ffffffffffffffffffffffffffffffffffffffff835416918261020757505050f35b823b1561014f57610122928492836040518096819582947f2d1e0c02000000000000000000000000000000000000000000000000000000008452600484016103d5565b9050346101cf578161025b366102f1565b9073ffffffffffffffffffffffffffffffffffffffff8354168061027d578380f35b803b156102ed578484816102ba829682967f0968f264000000000000000000000000000000000000000000000000000000008452600484016103d5565b03925af180156102e0576102d0575b8180808380f35b6102d991610365565b38816102c9565b50604051903d90823e3d90fd5b8380fd5b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103605760043567ffffffffffffffff811161036057826023820112156103605780600401359267ffffffffffffffff84116103605760248483010111610360576024019190565b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103a657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09360208652816020870152868601376000858286010152011601019056fea26469706673582212206692750fad8aa01e1f167f60b4ffdf8b4ef76b2608fe9b8577e363a86d48d3de64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x451 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x968F264 EQ PUSH2 0x24A JUMPI POP DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x776D1A01 EQ PUSH2 0x154 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0xAB JUMPI PUSH4 0xD4B83992 EQ PUSH2 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP2 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH2 0xBB CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND SWAP2 DUP3 PUSH2 0xDF JUMPI POP POP POP RETURN JUMPDEST DUP3 EXTCODESIZE ISZERO PUSH2 0x14F JUMPI PUSH2 0x122 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0xC63FF8DD00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x144 JUMPI PUSH2 0x133 JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x13D SWAP2 PUSH2 0x365 JUMP JUMPDEST PUSH2 0xA8 JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP POP REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA8 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR DUP2 SSTORE DUP1 RETURN JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH2 0x1E3 CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND SWAP2 DUP3 PUSH2 0x207 JUMPI POP POP POP RETURN JUMPDEST DUP3 EXTCODESIZE ISZERO PUSH2 0x14F JUMPI PUSH2 0x122 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2D1E0C0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SWAP1 POP CALLVALUE PUSH2 0x1CF JUMPI DUP2 PUSH2 0x25B CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND DUP1 PUSH2 0x27D JUMPI DUP4 DUP1 RETURN JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x2ED JUMPI DUP5 DUP5 DUP2 PUSH2 0x2BA DUP3 SWAP7 DUP3 SWAP7 PUSH32 0x968F26400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x2E0 JUMPI PUSH2 0x2D0 JUMPI JUMPDEST DUP2 DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH2 0x2D9 SWAP2 PUSH2 0x365 JUMP JUMPDEST CODESIZE DUP2 PUSH2 0x2C9 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x360 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x360 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x360 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x360 JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x360 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3A6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH7 0x92750FAD8AA01E 0x1F AND PUSH32 0x60B4FFDF8B4EF76B2608FE9B8577E363A86D48D3DE64736F6C634300081E0033 ","sourceMap":"140:658:112:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_bytes_calldata":{"entryPoint":753,"id":null,"parameterSlots":1,"returnSlots":2},"abi_encode_bytes_calldata":{"entryPoint":981,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":869,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b600090813560e01c9081630968f2641461024a575080632d1e0c02146101d3578063776d1a0114610154578063c63ff8dd146100ab5763d4b839921461005857600080fd5b346100a857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a85773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b80fd5b50346100a857806100bb366102f1565b9073ffffffffffffffffffffffffffffffffffffffff83541691826100df57505050f35b823b1561014f57610122928492836040518096819582947fc63ff8dd000000000000000000000000000000000000000000000000000000008452600484016103d5565b03925af18015610144576101335750f35b8161013d91610365565b6100a85780f35b6040513d84823e3d90fd5b505050fd5b50346100a85760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a85760043573ffffffffffffffffffffffffffffffffffffffff81168091036101cf577fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b5080fd5b50346100a857806101e3366102f1565b9073ffffffffffffffffffffffffffffffffffffffff835416918261020757505050f35b823b1561014f57610122928492836040518096819582947f2d1e0c02000000000000000000000000000000000000000000000000000000008452600484016103d5565b9050346101cf578161025b366102f1565b9073ffffffffffffffffffffffffffffffffffffffff8354168061027d578380f35b803b156102ed578484816102ba829682967f0968f264000000000000000000000000000000000000000000000000000000008452600484016103d5565b03925af180156102e0576102d0575b8180808380f35b6102d991610365565b38816102c9565b50604051903d90823e3d90fd5b8380fd5b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103605760043567ffffffffffffffff811161036057826023820112156103605780600401359267ffffffffffffffff84116103605760248483010111610360576024019190565b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103a657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09360208652816020870152868601376000858286010152011601019056fea26469706673582212206692750fad8aa01e1f167f60b4ffdf8b4ef76b2608fe9b8577e363a86d48d3de64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x968F264 EQ PUSH2 0x24A JUMPI POP DUP1 PUSH4 0x2D1E0C02 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x776D1A01 EQ PUSH2 0x154 JUMPI DUP1 PUSH4 0xC63FF8DD EQ PUSH2 0xAB JUMPI PUSH4 0xD4B83992 EQ PUSH2 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP2 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH2 0xBB CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND SWAP2 DUP3 PUSH2 0xDF JUMPI POP POP POP RETURN JUMPDEST DUP3 EXTCODESIZE ISZERO PUSH2 0x14F JUMPI PUSH2 0x122 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0xC63FF8DD00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x144 JUMPI PUSH2 0x133 JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x13D SWAP2 PUSH2 0x365 JUMP JUMPDEST PUSH2 0xA8 JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP POP REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA8 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x1CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR DUP2 SSTORE DUP1 RETURN JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xA8 JUMPI DUP1 PUSH2 0x1E3 CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND SWAP2 DUP3 PUSH2 0x207 JUMPI POP POP POP RETURN JUMPDEST DUP3 EXTCODESIZE ISZERO PUSH2 0x14F JUMPI PUSH2 0x122 SWAP3 DUP5 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP7 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x2D1E0C0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SWAP1 POP CALLVALUE PUSH2 0x1CF JUMPI DUP2 PUSH2 0x25B CALLDATASIZE PUSH2 0x2F1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 SLOAD AND DUP1 PUSH2 0x27D JUMPI DUP4 DUP1 RETURN JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x2ED JUMPI DUP5 DUP5 DUP2 PUSH2 0x2BA DUP3 SWAP7 DUP3 SWAP7 PUSH32 0x968F26400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x3D5 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x2E0 JUMPI PUSH2 0x2D0 JUMPI JUMPDEST DUP2 DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH2 0x2D9 SWAP2 PUSH2 0x365 JUMP JUMPDEST CODESIZE DUP2 PUSH2 0x2C9 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x360 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x360 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x360 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x360 JUMPI PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0x360 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3A6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH7 0x92750FAD8AA01E 0x1F AND PUSH32 0x60B4FFDF8B4EF76B2608FE9B8577E363A86D48D3DE64736F6C634300081E0033 ","sourceMap":"140:658:112:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;711:29;;707:83;;140:658;;;;707:83;756:23;;;;;;140:658;;;;;;756:23;;;;;;140:658;756:23;;140:658;756:23;;;:::i;:::-;;;;;;;;;;;140:658;;756:23;;;;;:::i;:::-;140:658;;756:23;140:658;756:23;140:658;;;;;;;;;756:23;140:658;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;389:29;;385:83;;140:658;;;;385:83;434:23;;;;;;140:658;;;;;;434:23;;;;;;140:658;434:23;;140:658;434:23;;;:::i;140:658::-;;;;;;;;;;:::i;:::-;;;;;;550:29;546:89;;140:658;;;546:89;595:29;;;;;;;;;;;;;140:658;595:29;;140:658;595:29;;;:::i;:::-;;;;;;;;;;;546:89;;;;140:658;;;595:29;;;;:::i;:::-;;;;;;140:658;;;;;;;;;;;595:29;140:658;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;140:658:112;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;140:658:112;;;;;-1:-1:-1;140:658:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"221000","executionCost":"269","totalCost":"221269"},"external":{"claim(bytes)":"infinite","setTarget(address)":"24435","stake(bytes)":"infinite","target()":"2352","withdraw(bytes)":"infinite"}},"methodIdentifiers":{"claim(bytes)":"c63ff8dd","setTarget(address)":"776d1a01","stake(bytes)":"2d1e0c02","target()":"d4b83992","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetAddress\",\"type\":\"address\"}],\"name\":\"setTarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"target\",\"outputs\":[{\"internalType\":\"contract ILinearPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol\":\"LinearPoolReentrancyAttacker\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ILinearPool} from \\\"./../../../staking/linear/interfaces/ILinearPool.sol\\\";\\n\\ncontract LinearPoolReentrancyAttacker {\\n    ILinearPool public target;\\n\\n    function setTarget(address targetAddress) external {\\n        target = ILinearPool(targetAddress);\\n    }\\n\\n    function stake(bytes calldata stakeData) external {\\n        if (address(target) != address(0)) {\\n            target.stake(stakeData);\\n        }\\n    }\\n\\n    function withdraw(bytes calldata withdrawData) external {\\n        if (address(target) != address(0)) {\\n            target.withdraw(withdrawData);\\n        }\\n    }\\n\\n    function claim(bytes calldata claimData) external {\\n        if (address(target) != address(0)) {\\n            target.claim(claimData);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x0b00680bf2e1914f717ae84f3a4580b12cd108b1fe3dd70e2dd4149b7937943b\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":15889,"contract":"contracts/mocks/staking/linear/LinearPoolReentrancyAttacker.sol:LinearPoolReentrancyAttacker","label":"target","offset":0,"slot":"0","type":"t_contract(ILinearPool)21056"}],"types":{"t_contract(ILinearPool)21056":{"encoding":"inplace","label":"contract ILinearPool","numberOfBytes":"20"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol":{"ERC1155TokenReceiverMock":{"abi":[{"inputs":[{"internalType":"bool","name":"accept1155","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"WrongToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC1155BatchReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC1155Received","type":"event"},{"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":{"kind":"dev","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"reverts if the sender is not the supported ERC1155 contract.","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":"`0xbc197c81` to accept the transfer, or any other value to reject it."}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"reverts if the sender is not the supported ERC1155 contract.","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":"`0xf23a6e61` to accept the transfer, or any other value to reject it."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC1155 Receiver Mock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c0346100ee57601f6107fe38819003918201601f19168301916001600160401b038311848410176100f35780849260409485528339810103126100ee5780519081151582036100ee5760200151906001600160a01b03821682036100ee57630271189760e51b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f02ede217e020be0db8f85fc7aee9b04b38d4c34fd9b136ea62e8626e4f419e11805460ff1916600117905560805260a0526040516106f4908161010a82396080518181816104100152610553015260a0518181816103e8015261052b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610192578063bc197c81146100e15763f23a6e611461003d57600080fd5b346100dc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc57610074610202565b61007c610225565b906084359067ffffffffffffffff82116100dc576020926100a46100b2933690600401610279565b916064359160443591610511565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b346100dc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc57610118610202565b610120610225565b9060443567ffffffffffffffff81116100dc57610141903690600401610248565b60649291923567ffffffffffffffff81116100dc57610164903690600401610248565b916084359467ffffffffffffffff86116100dc5760209661018c6100b2973690600401610279565b956103ca565b346100dc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036100dc576101f860209161060f565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100dc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100dc57565b9181601f840112156100dc5782359167ffffffffffffffff83116100dc576020808501948460051b0101116100dc57565b81601f820112156100dc5780359067ffffffffffffffff82116102ff57604051927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8601160116840184811067ffffffffffffffff8211176102ff57604052828452602083830101116100dc57816000926020809301838601378301015290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100dc5760209260051b809284830137010190565b919082519283825260005b8481106103b55750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610376565b9395919290949573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036104e7577f0000000000000000000000000000000000000000000000000000000000000000156104db577f2360e6b28d144bcde27ca99baa660f822a59e919f243c01dfaec5a55986df5f5966104986104b4956104a69473ffffffffffffffffffffffffffffffffffffffff809a6040519b8c9b168b521660208a015260a060408a015260a089019161032e565b91868303606088015261032e565b90838203608085015261036b565b0390a17fbc197c810000000000000000000000000000000000000000000000000000000090565b50505050505050600090565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b91929373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036104e7577f000000000000000000000000000000000000000000000000000000000000000015610605577f01109c91bca177ae1324bc2fc89be4b2573d2e59ad0cc75b1f3d3aa807814d369473ffffffffffffffffffffffffffffffffffffffff94856105de946040519788971687521660208601526040850152606084015260a0608084015260a083019061036b565b0390a17ff23a6e610000000000000000000000000000000000000000000000000000000090565b5050505050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146106b8577f01ffc9a70000000000000000000000000000000000000000000000000000000081146106b2576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220f5db58a05f373e1337992d478e99998d18bcf584755518ce0cdf81f55350305d64736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0xEE JUMPI PUSH1 0x1F PUSH2 0x7FE CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0xF3 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0xEE JUMPI DUP1 MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xEE JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0xEE JUMPI PUSH4 0x2711897 PUSH1 0xE5 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x2EDE217E020BE0DB8F85FC7AEE9B04B38D4C34FD9B136EA62E8626E4F419E11 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x6F4 SWAP1 DUP2 PUSH2 0x10A DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x410 ADD MSTORE PUSH2 0x553 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x3E8 ADD MSTORE PUSH2 0x52B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x192 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0xE1 JUMPI PUSH4 0xF23A6E61 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH2 0x74 PUSH2 0x202 JUMP JUMPDEST PUSH2 0x7C PUSH2 0x225 JUMP JUMPDEST SWAP1 PUSH1 0x84 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP3 PUSH2 0xA4 PUSH2 0xB2 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x279 JUMP JUMPDEST SWAP2 PUSH1 0x64 CALLDATALOAD SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x511 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH2 0x118 PUSH2 0x202 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x225 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDC JUMPI PUSH2 0x141 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x248 JUMP JUMPDEST PUSH1 0x64 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDC JUMPI PUSH2 0x164 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x248 JUMP JUMPDEST SWAP2 PUSH1 0x84 CALLDATALOAD SWAP5 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP7 PUSH2 0x18C PUSH2 0xB2 SWAP8 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x279 JUMP JUMPDEST SWAP6 PUSH2 0x3CA JUMP JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xDC JUMPI PUSH2 0x1F8 PUSH1 0x20 SWAP2 PUSH2 0x60F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xDC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xDC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xDC JUMPI JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xDC JUMPI DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FF JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP7 ADD AND ADD AND DUP5 ADD DUP5 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2FF JUMPI PUSH1 0x40 MSTORE DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0xDC JUMPI DUP2 PUSH1 0x0 SWAP3 PUSH1 0x20 DUP1 SWAP4 ADD DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x3B5 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x376 JUMP JUMPDEST SWAP4 SWAP6 SWAP2 SWAP3 SWAP1 SWAP5 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x4E7 JUMPI PUSH32 0x0 ISZERO PUSH2 0x4DB JUMPI PUSH32 0x2360E6B28D144BCDE27CA99BAA660F822A59E919F243C01DFAEC5A55986DF5F5 SWAP7 PUSH2 0x498 PUSH2 0x4B4 SWAP6 PUSH2 0x4A6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP11 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP12 AND DUP12 MSTORE AND PUSH1 0x20 DUP11 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP11 ADD MSTORE PUSH1 0xA0 DUP10 ADD SWAP2 PUSH2 0x32E JUMP JUMPDEST SWAP2 DUP7 DUP4 SUB PUSH1 0x60 DUP9 ADD MSTORE PUSH2 0x32E JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x36B JUMP JUMPDEST SUB SWAP1 LOG1 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST POP POP POP POP POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x4E7 JUMPI PUSH32 0x0 ISZERO PUSH2 0x605 JUMPI PUSH32 0x1109C91BCA177AE1324BC2FC89BE4B2573D2E59AD0CC75B1F3D3AA807814D36 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 PUSH2 0x5DE SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 AND DUP8 MSTORE AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD SWAP1 PUSH2 0x36B JUMP JUMPDEST SUB SWAP1 LOG1 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST POP POP POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x6B8 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x6B2 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0xDB PC LOG0 PUSH0 CALLDATACOPY RETURNDATACOPY SGT CALLDATACOPY SWAP10 0x2D SELFBALANCE DUP15 SWAP10 SWAP10 DUP14 XOR 0xBC CREATE2 DUP5 PUSH22 0x5518CE0CDF81F55350305D64736F6C634300081E0033 ","sourceMap":"366:1880:113:-:0;;;;;;;;;;;;;-1:-1:-1;;366:1880:113;;;;-1:-1:-1;;;;;366:1880:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;366:1880:113;;;;;;-1:-1:-1;;;;500:10:59;366:1880:113;;500:10:59;;;;-1:-1:-1;;500:10:59;443:1;500:10;;;818:24:113;;852:34;;366:1880;;;;;;;;818:24;366:1880;;;;;;;;;;852:34;366:1880;;;;;;;;;;;;-1:-1:-1;366:1880:113;;;;;;-1:-1:-1;366:1880:113;;;;;-1:-1:-1;366:1880:113"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":549,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":584,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bytes":{"entryPoint":633,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":514,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":814,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":875,"id":null,"parameterSlots":2,"returnSlots":1},"fun_onERC1155BatchReceived":{"entryPoint":970,"id":16118,"parameterSlots":7,"returnSlots":1},"fun_onERC1155Received":{"entryPoint":1297,"id":16073,"parameterSlots":5,"returnSlots":1},"fun_supportsInterface":{"entryPoint":1551,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"15984":[{"length":32,"start":1040},{"length":32,"start":1363}],"15986":[{"length":32,"start":1000},{"length":32,"start":1323}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610192578063bc197c81146100e15763f23a6e611461003d57600080fd5b346100dc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc57610074610202565b61007c610225565b906084359067ffffffffffffffff82116100dc576020926100a46100b2933690600401610279565b916064359160443591610511565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b346100dc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc57610118610202565b610120610225565b9060443567ffffffffffffffff81116100dc57610141903690600401610248565b60649291923567ffffffffffffffff81116100dc57610164903690600401610248565b916084359467ffffffffffffffff86116100dc5760209661018c6100b2973690600401610279565b956103ca565b346100dc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100dc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036100dc576101f860209161060f565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100dc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100dc57565b9181601f840112156100dc5782359167ffffffffffffffff83116100dc576020808501948460051b0101116100dc57565b81601f820112156100dc5780359067ffffffffffffffff82116102ff57604051927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8601160116840184811067ffffffffffffffff8211176102ff57604052828452602083830101116100dc57816000926020809301838601378301015290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100dc5760209260051b809284830137010190565b919082519283825260005b8481106103b55750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610376565b9395919290949573ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036104e7577f0000000000000000000000000000000000000000000000000000000000000000156104db577f2360e6b28d144bcde27ca99baa660f822a59e919f243c01dfaec5a55986df5f5966104986104b4956104a69473ffffffffffffffffffffffffffffffffffffffff809a6040519b8c9b168b521660208a015260a060408a015260a089019161032e565b91868303606088015261032e565b90838203608085015261036b565b0390a17fbc197c810000000000000000000000000000000000000000000000000000000090565b50505050505050600090565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b91929373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036104e7577f000000000000000000000000000000000000000000000000000000000000000015610605577f01109c91bca177ae1324bc2fc89be4b2573d2e59ad0cc75b1f3d3aa807814d369473ffffffffffffffffffffffffffffffffffffffff94856105de946040519788971687521660208601526040850152606084015260a0608084015260a083019061036b565b0390a17ff23a6e610000000000000000000000000000000000000000000000000000000090565b5050505050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146106b8577f01ffc9a70000000000000000000000000000000000000000000000000000000081146106b2576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220f5db58a05f373e1337992d478e99998d18bcf584755518ce0cdf81f55350305d64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x192 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0xE1 JUMPI PUSH4 0xF23A6E61 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH2 0x74 PUSH2 0x202 JUMP JUMPDEST PUSH2 0x7C PUSH2 0x225 JUMP JUMPDEST SWAP1 PUSH1 0x84 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP3 PUSH2 0xA4 PUSH2 0xB2 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x279 JUMP JUMPDEST SWAP2 PUSH1 0x64 CALLDATALOAD SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x511 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH2 0x118 PUSH2 0x202 JUMP JUMPDEST PUSH2 0x120 PUSH2 0x225 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDC JUMPI PUSH2 0x141 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x248 JUMP JUMPDEST PUSH1 0x64 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDC JUMPI PUSH2 0x164 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x248 JUMP JUMPDEST SWAP2 PUSH1 0x84 CALLDATALOAD SWAP5 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP7 PUSH2 0x18C PUSH2 0xB2 SWAP8 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x279 JUMP JUMPDEST SWAP6 PUSH2 0x3CA JUMP JUMPDEST CALLVALUE PUSH2 0xDC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xDC JUMPI PUSH2 0x1F8 PUSH1 0x20 SWAP2 PUSH2 0x60F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xDC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xDC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xDC JUMPI JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xDC JUMPI DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FF JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP7 ADD AND ADD AND DUP5 ADD DUP5 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2FF JUMPI PUSH1 0x40 MSTORE DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0xDC JUMPI DUP2 PUSH1 0x0 SWAP3 PUSH1 0x20 DUP1 SWAP4 ADD DUP4 DUP7 ADD CALLDATACOPY DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDC JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x3B5 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x376 JUMP JUMPDEST SWAP4 SWAP6 SWAP2 SWAP3 SWAP1 SWAP5 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x4E7 JUMPI PUSH32 0x0 ISZERO PUSH2 0x4DB JUMPI PUSH32 0x2360E6B28D144BCDE27CA99BAA660F822A59E919F243C01DFAEC5A55986DF5F5 SWAP7 PUSH2 0x498 PUSH2 0x4B4 SWAP6 PUSH2 0x4A6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP11 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP12 AND DUP12 MSTORE AND PUSH1 0x20 DUP11 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP11 ADD MSTORE PUSH1 0xA0 DUP10 ADD SWAP2 PUSH2 0x32E JUMP JUMPDEST SWAP2 DUP7 DUP4 SUB PUSH1 0x60 DUP9 ADD MSTORE PUSH2 0x32E JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x36B JUMP JUMPDEST SUB SWAP1 LOG1 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST POP POP POP POP POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x4E7 JUMPI PUSH32 0x0 ISZERO PUSH2 0x605 JUMPI PUSH32 0x1109C91BCA177AE1324BC2FC89BE4B2573D2E59AD0CC75B1F3D3AA807814D36 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 PUSH2 0x5DE SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 AND DUP8 MSTORE AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD SWAP1 PUSH2 0x36B JUMP JUMPDEST SUB SWAP1 LOG1 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST POP POP POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x6B8 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x6B2 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0xDB PC LOG0 PUSH0 CALLDATACOPY RETURNDATACOPY SGT CALLDATACOPY SWAP10 0x2D SELFBALANCE DUP15 SWAP10 SWAP10 DUP14 XOR 0xBC CREATE2 DUP5 PUSH22 0x5518CE0CDF81F55350305D64736F6C634300081E0033 ","sourceMap":"366:1880:113:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;366:1880:113;635:65:55;;:::i;:::-;366:1880:113;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:1880:113;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;366:1880:113;;;;;-1:-1:-1;366:1880:113;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;366:1880:113;;;;;;;;;;;-1:-1:-1;366:1880:113;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;1738:506;;;;;;;;366:1880;1987:19;366:1880;1973:10;:33;1969:58;;2041:11;;;;2073:55;366:1880;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;2073:55;;;1878:53:228;2142:44:113;:::o;2037:201::-;2217:10;;;;;;;366:1880;2217:10;:::o;1969:58::-;2015:12;366:1880;2015:12;;366:1880;2015:12;1145:471;;;;366:1880;1365:19;366:1880;1351:10;:33;1347:58;;1419:11;;;;1451:48;366:1880;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1451:48;;;1774::228;1513:45:113;:::o;1415:195::-;1589:10;;;;;366:1880;1589:10;:::o;1359:340:59:-;366:1880:113;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;366:1880:113;500:10:59;366:1880:113;500:10:59;;;;366:1880:113;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;366:1880:113;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"356000","executionCost":"infinite","totalCost":"infinite"},"external":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"infinite","onERC1155Received(address,address,uint256,uint256,bytes)":"infinite","supportsInterface(bytes4)":"2433"}},"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"accept1155\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ERC1155BatchReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ERC1155Received\",\"type\":\"event\"},{\"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\":{\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"reverts if the sender is not the supported ERC1155 contract.\",\"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\":\"`0xbc197c81` to accept the transfer, or any other value to reject it.\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"reverts if the sender is not the supported ERC1155 contract.\",\"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\":\"`0xf23a6e61` to accept the transfer, or any other value to reject it.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC1155 Receiver Mock\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol\":\"ERC1155TokenReceiverMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/ERC1155TokenReceiverMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC1155TokenReceiver} from \\\"./../../../token/ERC1155/interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../../token/ERC1155/libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155TokenReceiver} from \\\"./../../../token/ERC1155/ERC1155TokenReceiver.sol\\\";\\n\\n/// @title ERC1155 Receiver Mock\\ncontract ERC1155TokenReceiverMock is ERC1155TokenReceiver {\\n    bool internal immutable ACCEPT_1155;\\n    address internal immutable _TOKEN_ADDRESS_1155;\\n\\n    event ERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data);\\n    event ERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data);\\n\\n    error WrongToken();\\n\\n    constructor(bool accept1155, address tokenAddress) {\\n        ACCEPT_1155 = accept1155;\\n        _TOKEN_ADDRESS_1155 = tokenAddress;\\n    }\\n\\n    //=================================================== ERC1155Receiver ====================================================//\\n\\n    /// @inheritdoc IERC1155TokenReceiver\\n    /// @dev reverts if the sender is not the supported ERC1155 contract.\\n    function onERC1155Received(\\n        address operator,\\n        address from,\\n        uint256 id,\\n        uint256 value,\\n        bytes memory data\\n    ) public virtual override returns (bytes4) {\\n        if (msg.sender != _TOKEN_ADDRESS_1155) revert WrongToken();\\n        if (ACCEPT_1155) {\\n            emit ERC1155Received(operator, from, id, value, data);\\n            return ERC1155Storage.ERC1155_SINGLE_RECEIVED;\\n        } else {\\n            return 0x0;\\n        }\\n    }\\n\\n    /// @inheritdoc IERC1155TokenReceiver\\n    /// @dev reverts if the sender is not the supported ERC1155 contract.\\n    function onERC1155BatchReceived(\\n        address operator,\\n        address from,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes memory data\\n    ) public virtual override returns (bytes4) {\\n        if (msg.sender != _TOKEN_ADDRESS_1155) revert WrongToken();\\n        if (ACCEPT_1155) {\\n            emit ERC1155BatchReceived(operator, from, ids, values, data);\\n            return ERC1155Storage.ERC1155_BATCH_RECEIVED;\\n        } else {\\n            return 0x0;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xd340ffd027617ff0c903fd5a231634133c4b5d014fbf339c38a25940deddd4a1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155TokenReceiver} from \\\"./interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, Token Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155TokenReceiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xaa801a5fe8512813bf7bfa2de627c8649e26ac732b0588604e26a0e8e9e111cf\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol":{"ERC1155WithoutOperatorFiltererMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461017e57601f61251738819003918201601f19168301916001600160401b038311848410176101835780849260209460405283398101031261017e57516001600160a01b038116810361017e57636cdb3d1360e11b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a805460ff191660011790553361011f575b6307f5828d60e41b600052806020526040600020600160ff19825416179055631464324b60e21b6000526020526040600020600160ff1982541617905560805260405161237d908161019a82396080518181816114d701528181611a3001528181611d2101526122180152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b2565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461179957806301ffc9a7146117335780630d6a5bbb146114fb5780632b4c9f161461148c5780632eb2c2d6146110b55780632f2ff15d14610f2957806331e66e1e14610ea65780634e1273f414610d1f578063572b6c0514610cd45780635cfa929714610b145780638bb9c5bf146109a55780638da5cb5b1461093457806391d148541461089c578063a22cb46514610771578063d539139314610718578063d547741f1461058f578063e985e9c5146104db578063f242432a146102115763f2fde38b146100ec57600080fd5b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610123611807565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61014c611d0a565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036101df575073ffffffffffffffffffffffffffffffffffffffff169283830361019257005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461020c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610248611807565b61025061182a565b604435906064359260843567ffffffffffffffff811161020c5761027890369060040161187e565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936102a3611d0a565b73ffffffffffffffffffffffffffffffffffffffff83169586156104b1576102cc828783611fb9565b156104675773ffffffffffffffffffffffffffffffffffffffff916102f58a8a878a8796612039565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61033257005b6020926103409136916119b4565b9261039660405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190611f5a565b03816000865af190811561045b577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161042c575b5016036103f957005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61044e915060203d602011610454575b61044681836118e0565b810190611f22565b866103f0565b503d61043c565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610512611807565b73ffffffffffffffffffffffffffffffffffffffff61052f61182a565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576004356105c961182a565b6105d1611d0a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101df57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661068357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576107a8611807565b6024359081151580920361020c5773ffffffffffffffffffffffffffffffffffffffff806107d4611d0a565b1691169181831461086e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576108d361182a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610a00611d0a565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610acc5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610713565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461020c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610b4b611807565b6024356044359160643567ffffffffffffffff811161020c57610b7290369060040161187e565b9091610bd3610b7f611d0a565b93610baa857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611ba0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129336916119b4565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610caa57610c1387878573ffffffffffffffffffffffffffffffffffffffff95611e45565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b610c4f57005b6103969160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190611f5a565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576020610d15610d10611807565b611a19565b6040519015158152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760043567ffffffffffffffff811161020c57610d6e90369060040161184d565b60243567ffffffffffffffff811161020c57610d8e90369060040161184d565b92907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861293808403610e7c57610dc284611950565b93610dd060405195866118e0565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610dfd82611950565b0136602087013760005b818110610e285760405160208082528190610e24908201896118ac565b0390f35b610e33818387611ca5565b359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57610e6b600192610e63838789611ca5565b35908a611a78565b610e758289611c62565b5201610e07565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576040610edf612201565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57600435610f6361182a565b610f6b611d0a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101df57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561101e57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610713565b3461020c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576110ec611807565b6110f461182a565b60443567ffffffffffffffff811161020c5761111490369060040161184d565b929060643567ffffffffffffffff811161020c5761113690369060040161184d565b9360843567ffffffffffffffff811161020c5761115790369060040161187e565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861295611184611d0a565b73ffffffffffffffffffffffffffffffffffffffff83169788156104b157898b03610e7c576111b4828483611fb9565b156114425760005b8b8110611413575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b92169889936112386040519283926040845261122a8d60408601908d611cb5565b918483036020860152611cb5565b0390a43b61124257005b60209461125761125f92611267953691611968565b993691611968565b9536916119b4565b9261131760405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526112e76112b760a485018b6118ac565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886118ac565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152611f5a565b03816000875af190811561045b577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916113f4575b50160361137a57005b6113f0906113c06040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906118ac565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526118ac565b0390fd5b61140d915060203d6020116104545761044681836118e0565b86611371565b8061143c8c6114328f9461142a816001978d611ca5565b35928d611ca5565b3590888887612039565b016111bc565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461020c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57611532611807565b60243567ffffffffffffffff811161020c5761155290369060040161184d565b909160443567ffffffffffffffff811161020c5761157490369060040161184d565b93909160643567ffffffffffffffff811161020c576116089361159e61161092369060040161187e565b9590916116006115ac611d0a565b966115d7887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611ba0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691611968565b983691611968565b9436916119b4565b9173ffffffffffffffffffffffffffffffffffffffff8216948515610caa5786519085518203610e7c5760005b8281106117095750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806116aa61169c8d60408401906118ac565b82810360208401528b6118ac565b0390a43b6116b457005b6113179160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526112e76112b760a485018b6118ac565b8061172d6117196001938c611c62565b51611724838b611c62565b51908886611e45565b0161163d565b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361020c57610d15602091611af1565b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760206117ff6117d5611807565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612611a78565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020808501948460051b01011161020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020838186019501011161020c57565b906020808351928381520192019060005b8181106118ca5750505090565b82518452602093840193909201916001016118bd565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761192157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116119215760051b60200190565b92919061197481611950565b9361198260405195866118e0565b602085838152019160051b810192831161020c57905b8282106119a457505050565b8135815260209182019101611998565b92919267ffffffffffffffff821161192157604051916119fc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846118e0565b82948184528183011161020c578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611a715773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b909173ffffffffffffffffffffffffffffffffffffffff831615611ac75760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611b9a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611b94576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615611bfa5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015611c765760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c765760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161020c5760209260051b809284830137010190565b9081602091031261020c5751801515810361020c5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611e36573233148015611e3b575b611e36577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611d95575b50611d9257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561045b57600091611e07575b5038611d88565b611e29915060203d602011611e2f575b611e2181836118e0565b810190611cf2565b38611e00565b503d611e17565b503390565b5060183610611d51565b909183611e53575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115611ec957505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080611e4d565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261020c57517fffffffff000000000000000000000000000000000000000000000000000000008116810361020c5790565b919082519283825260005b848110611fa45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611f65565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611fe4575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611fde565b91929084612049575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156121a5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff8216036120c1575b50612042565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561214757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806120bb565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561233557323314801561233d575b61233557803314908115612294575b50612263576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161020c5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561045b57600091612316575b5038612257565b61232f915060203d602011611e2f57611e2181836118e0565b3861230f565b506000903690565b506018361061224856fea2646970667358221220e0ad798dd2466ddc4fb355cb591530d35ce3c0e8b2253cdb739fd6a1577d57b564736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x17E JUMPI PUSH1 0x1F PUSH2 0x2517 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x183 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x17E JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x17E JUMPI PUSH4 0x6CDB3D13 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE CALLER PUSH2 0x11F JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH4 0x1464324B PUSH1 0xE2 SHL PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x237D SWAP1 DUP2 PUSH2 0x19A DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x14D7 ADD MSTORE DUP2 DUP2 PUSH2 0x1A30 ADD MSTORE DUP2 DUP2 PUSH2 0x1D21 ADD MSTORE PUSH2 0x2218 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x1799 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1733 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x14FB JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x148C JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x10B5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0xF29 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0xEA6 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0xD1F JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0xCD4 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0xB14 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x934 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x89C JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x771 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x718 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x58F JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x211 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x123 PUSH2 0x1807 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x14C PUSH2 0x1D0A JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x192 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x248 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x250 PUSH2 0x182A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x278 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x2A3 PUSH2 0x1D0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x4B1 JUMPI PUSH2 0x2CC DUP3 DUP8 DUP4 PUSH2 0x1FB9 JUMP JUMPDEST ISZERO PUSH2 0x467 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x2F5 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x2039 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x332 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x340 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP3 PUSH2 0x396 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x1F5A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x42C JUMPI JUMPDEST POP AND SUB PUSH2 0x3F9 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x44E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x454 JUMPI JUMPDEST PUSH2 0x446 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F22 JUMP JUMPDEST DUP7 PUSH2 0x3F0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x43C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x512 PUSH2 0x1807 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x52F PUSH2 0x182A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x5C9 PUSH2 0x182A JUMP JUMPDEST PUSH2 0x5D1 PUSH2 0x1D0A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x683 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x7A8 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x20C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x7D4 PUSH2 0x1D0A JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x86E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x8D3 PUSH2 0x182A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xA00 PUSH2 0x1D0A JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xACC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x713 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0xB4B PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xB72 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xBD3 PUSH2 0xB7F PUSH2 0x1D0A JUMP JUMPDEST SWAP4 PUSH2 0xBAA DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1BA0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xCAA JUMPI PUSH2 0xC13 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x1E45 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0xC4F JUMPI STOP JUMPDEST PUSH2 0x396 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x1F5A JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH2 0xD15 PUSH2 0xD10 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x1A19 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xD6E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xD8E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP3 SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 DUP1 DUP5 SUB PUSH2 0xE7C JUMPI PUSH2 0xDC2 DUP5 PUSH2 0x1950 JUMP JUMPDEST SWAP4 PUSH2 0xDD0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x18E0 JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xDFD DUP3 PUSH2 0x1950 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP8 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xE28 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE24 SWAP1 DUP3 ADD DUP10 PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0xE33 DUP2 DUP4 DUP8 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI PUSH2 0xE6B PUSH1 0x1 SWAP3 PUSH2 0xE63 DUP4 DUP8 DUP10 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP11 PUSH2 0x1A78 JUMP JUMPDEST PUSH2 0xE75 DUP3 DUP10 PUSH2 0x1C62 JUMP JUMPDEST MSTORE ADD PUSH2 0xE07 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x40 PUSH2 0xEDF PUSH2 0x2201 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xF63 PUSH2 0x182A JUMP JUMPDEST PUSH2 0xF6B PUSH2 0x1D0A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x101E JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x713 JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x10EC PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x10F4 PUSH2 0x182A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1114 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1136 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1157 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x1184 PUSH2 0x1D0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x4B1 JUMPI DUP10 DUP12 SUB PUSH2 0xE7C JUMPI PUSH2 0x11B4 DUP3 DUP5 DUP4 PUSH2 0x1FB9 JUMP JUMPDEST ISZERO PUSH2 0x1442 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x1413 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1238 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x122A DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x1CB5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x1CB5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1242 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1257 PUSH2 0x125F SWAP3 PUSH2 0x1267 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP3 PUSH2 0x1317 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x12E7 PUSH2 0x12B7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x18AC JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x18AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x1F5A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x13F4 JUMPI JUMPDEST POP AND SUB PUSH2 0x137A JUMPI STOP JUMPDEST PUSH2 0x13F0 SWAP1 PUSH2 0x13C0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x18AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x140D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x454 JUMPI PUSH2 0x446 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP7 PUSH2 0x1371 JUMP JUMPDEST DUP1 PUSH2 0x143C DUP13 PUSH2 0x1432 DUP16 SWAP5 PUSH2 0x142A DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x2039 JUMP JUMPDEST ADD PUSH2 0x11BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x1532 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1552 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1574 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1608 SWAP4 PUSH2 0x159E PUSH2 0x1610 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x1600 PUSH2 0x15AC PUSH2 0x1D0A JUMP JUMPDEST SWAP7 PUSH2 0x15D7 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1BA0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0xCAA JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0xE7C JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1709 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x16AA PUSH2 0x169C DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x18AC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x16B4 JUMPI STOP JUMPDEST PUSH2 0x1317 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x12E7 PUSH2 0x12B7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x18AC JUMP JUMPDEST DUP1 PUSH2 0x172D PUSH2 0x1719 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x1C62 JUMP JUMPDEST MLOAD PUSH2 0x1724 DUP4 DUP12 PUSH2 0x1C62 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x1E45 JUMP JUMPDEST ADD PUSH2 0x163D JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x20C JUMPI PUSH2 0xD15 PUSH1 0x20 SWAP2 PUSH2 0x1AF1 JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH2 0x17FF PUSH2 0x17D5 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x1A78 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x20C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x20C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x18CA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x18BD JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1921 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1921 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1974 DUP2 PUSH2 0x1950 JUMP JUMPDEST SWAP4 PUSH2 0x1982 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x18E0 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x20C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x19A4 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1998 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1921 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x19FC PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x18E0 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x20C JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1A71 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x1AC7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1B9A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1B94 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1BFA JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1C76 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1C76 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x20C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x20C JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1E36 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1E3B JUMPI JUMPDEST PUSH2 0x1E36 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1D95 JUMPI JUMPDEST POP PUSH2 0x1D92 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1E07 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1D88 JUMP JUMPDEST PUSH2 0x1E29 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1E2F JUMPI JUMPDEST PUSH2 0x1E21 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1CF2 JUMP JUMPDEST CODESIZE PUSH2 0x1E00 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1E17 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1D51 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x1E53 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x1EC9 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x1E4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x20C JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x20C JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1FA4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1F65 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1FE4 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1FDE JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x2049 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x21A5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20C1 JUMPI JUMPDEST POP PUSH2 0x2042 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x2147 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x20BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2335 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x233D JUMPI JUMPDEST PUSH2 0x2335 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2294 JUMPI JUMPDEST POP PUSH2 0x2263 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x20C JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2316 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2257 JUMP JUMPDEST PUSH2 0x232F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1E2F JUMPI PUSH2 0x1E21 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST CODESIZE PUSH2 0x230F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2248 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RJUMP 0xAD79 DUP14 0xD2 CHAINID PUSH14 0xDC4FB355CB591530D35CE3C0E8B2 0x25 EXTCODECOPY 0xDB PUSH20 0x9FD6A1577D57B564736F6C634300081E00330000 ","sourceMap":"619:795:114:-:0;;;;;;;;;;;;;-1:-1:-1;;619:795:114;;;;-1:-1:-1;;;;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;619:795:114;;;;;;-1:-1:-1;;;;500:10:59;619:795:114;;500:10:59;;;;;;-1:-1:-1;;500:10:59;2137:4:228;500:10:59;;;791::114;1645:152:42;;-1:-1:-1;1863:25:42;;;-1:-1:-1;500:10:59;;619:795:114;500:10:59;619:795:114;-1:-1:-1;500:10:59;2137:4:228;500:10:59;;;;;;;;2606:34:228;;;-1:-1:-1;500:10:59;619:795:114;500:10:59;619:795:114;-1:-1:-1;500:10:59;2137:4:228;500:10:59;;;;;;;;745:39:76;;619:795:114;;;;;;;;745:39:76;619:795:114;;;;;;;;;;;;;;;;;;;;;1645:152:42;619:795:114;;;-1:-1:-1;;;;;;619:795:114;791:10;619:795;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;619:795:114;-1:-1:-1;619:795:114;;;;;;-1:-1:-1;619:795:114;;;;;-1:-1:-1;619:795:114"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6186,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":6221,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":6504,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":6580,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":7410,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":7970,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6270,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6151,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":6316,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":7349,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":8026,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":6480,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":7333,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":6368,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":6776,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_enforceHasRole":{"entryPoint":7072,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":8121,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":6681,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":7749,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":8705,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":7434,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":6897,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferToken":{"entryPoint":8249,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":7266,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5335},{"length":32,"start":6704},{"length":32,"start":7457},{"length":32,"start":8728}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461179957806301ffc9a7146117335780630d6a5bbb146114fb5780632b4c9f161461148c5780632eb2c2d6146110b55780632f2ff15d14610f2957806331e66e1e14610ea65780634e1273f414610d1f578063572b6c0514610cd45780635cfa929714610b145780638bb9c5bf146109a55780638da5cb5b1461093457806391d148541461089c578063a22cb46514610771578063d539139314610718578063d547741f1461058f578063e985e9c5146104db578063f242432a146102115763f2fde38b146100ec57600080fd5b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610123611807565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61014c611d0a565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036101df575073ffffffffffffffffffffffffffffffffffffffff169283830361019257005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461020c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610248611807565b61025061182a565b604435906064359260843567ffffffffffffffff811161020c5761027890369060040161187e565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936102a3611d0a565b73ffffffffffffffffffffffffffffffffffffffff83169586156104b1576102cc828783611fb9565b156104675773ffffffffffffffffffffffffffffffffffffffff916102f58a8a878a8796612039565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61033257005b6020926103409136916119b4565b9261039660405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190611f5a565b03816000865af190811561045b577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161042c575b5016036103f957005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61044e915060203d602011610454575b61044681836118e0565b810190611f22565b866103f0565b503d61043c565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610512611807565b73ffffffffffffffffffffffffffffffffffffffff61052f61182a565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576004356105c961182a565b6105d1611d0a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101df57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661068357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576107a8611807565b6024359081151580920361020c5773ffffffffffffffffffffffffffffffffffffffff806107d4611d0a565b1691169181831461086e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576108d361182a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610a00611d0a565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610acc5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610713565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461020c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57610b4b611807565b6024356044359160643567ffffffffffffffff811161020c57610b7290369060040161187e565b9091610bd3610b7f611d0a565b93610baa857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611ba0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129336916119b4565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610caa57610c1387878573ffffffffffffffffffffffffffffffffffffffff95611e45565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b610c4f57005b6103969160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190611f5a565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576020610d15610d10611807565b611a19565b6040519015158152f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760043567ffffffffffffffff811161020c57610d6e90369060040161184d565b60243567ffffffffffffffff811161020c57610d8e90369060040161184d565b92907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861293808403610e7c57610dc284611950565b93610dd060405195866118e0565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610dfd82611950565b0136602087013760005b818110610e285760405160208082528190610e24908201896118ac565b0390f35b610e33818387611ca5565b359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57610e6b600192610e63838789611ca5565b35908a611a78565b610e758289611c62565b5201610e07565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576040610edf612201565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57600435610f6361182a565b610f6b611d0a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101df57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561101e57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610713565b3461020c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576110ec611807565b6110f461182a565b60443567ffffffffffffffff811161020c5761111490369060040161184d565b929060643567ffffffffffffffff811161020c5761113690369060040161184d565b9360843567ffffffffffffffff811161020c5761115790369060040161187e565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861295611184611d0a565b73ffffffffffffffffffffffffffffffffffffffff83169788156104b157898b03610e7c576111b4828483611fb9565b156114425760005b8b8110611413575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b92169889936112386040519283926040845261122a8d60408601908d611cb5565b918483036020860152611cb5565b0390a43b61124257005b60209461125761125f92611267953691611968565b993691611968565b9536916119b4565b9261131760405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526112e76112b760a485018b6118ac565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886118ac565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152611f5a565b03816000875af190811561045b577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916113f4575b50160361137a57005b6113f0906113c06040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906118ac565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526118ac565b0390fd5b61140d915060203d6020116104545761044681836118e0565b86611371565b8061143c8c6114328f9461142a816001978d611ca5565b35928d611ca5565b3590888887612039565b016111bc565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461020c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461020c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c57611532611807565b60243567ffffffffffffffff811161020c5761155290369060040161184d565b909160443567ffffffffffffffff811161020c5761157490369060040161184d565b93909160643567ffffffffffffffff811161020c576116089361159e61161092369060040161187e565b9590916116006115ac611d0a565b966115d7887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611ba0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691611968565b983691611968565b9436916119b4565b9173ffffffffffffffffffffffffffffffffffffffff8216948515610caa5786519085518203610e7c5760005b8281106117095750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806116aa61169c8d60408401906118ac565b82810360208401528b6118ac565b0390a43b6116b457005b6113179160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526112e76112b760a485018b6118ac565b8061172d6117196001938c611c62565b51611724838b611c62565b51908886611e45565b0161163d565b3461020c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361020c57610d15602091611af1565b3461020c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020c5760206117ff6117d5611807565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612611a78565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020808501948460051b01011161020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020838186019501011161020c57565b906020808351928381520192019060005b8181106118ca5750505090565b82518452602093840193909201916001016118bd565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761192157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116119215760051b60200190565b92919061197481611950565b9361198260405195866118e0565b602085838152019160051b810192831161020c57905b8282106119a457505050565b8135815260209182019101611998565b92919267ffffffffffffffff821161192157604051916119fc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846118e0565b82948184528183011161020c578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611a715773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b909173ffffffffffffffffffffffffffffffffffffffff831615611ac75760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611b9a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611b94576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615611bfa5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015611c765760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c765760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161020c5760209260051b809284830137010190565b9081602091031261020c5751801515810361020c5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611e36573233148015611e3b575b611e36577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611d95575b50611d9257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561045b57600091611e07575b5038611d88565b611e29915060203d602011611e2f575b611e2181836118e0565b810190611cf2565b38611e00565b503d611e17565b503390565b5060183610611d51565b909183611e53575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115611ec957505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080611e4d565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261020c57517fffffffff000000000000000000000000000000000000000000000000000000008116810361020c5790565b919082519283825260005b848110611fa45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611f65565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611fe4575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611fde565b91929084612049575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156121a5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff8216036120c1575b50612042565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561214757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806120bb565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561233557323314801561233d575b61233557803314908115612294575b50612263576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161020c5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561045b57600091612316575b5038612257565b61232f915060203d602011611e2f57611e2181836118e0565b3861230f565b506000903690565b506018361061224856fea2646970667358221220e0ad798dd2466ddc4fb355cb591530d35ce3c0e8b2253cdb739fd6a1577d57b564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x1799 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1733 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x14FB JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x148C JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x10B5 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0xF29 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0xEA6 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0xD1F JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0xCD4 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0xB14 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x934 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x89C JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x771 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x718 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x58F JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x211 JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x123 PUSH2 0x1807 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x14C PUSH2 0x1D0A JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x192 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x248 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x250 PUSH2 0x182A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x278 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x2A3 PUSH2 0x1D0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x4B1 JUMPI PUSH2 0x2CC DUP3 DUP8 DUP4 PUSH2 0x1FB9 JUMP JUMPDEST ISZERO PUSH2 0x467 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x2F5 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x2039 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x332 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x340 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP3 PUSH2 0x396 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x1F5A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x42C JUMPI JUMPDEST POP AND SUB PUSH2 0x3F9 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x44E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x454 JUMPI JUMPDEST PUSH2 0x446 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F22 JUMP JUMPDEST DUP7 PUSH2 0x3F0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x43C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x512 PUSH2 0x1807 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x52F PUSH2 0x182A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x5C9 PUSH2 0x182A JUMP JUMPDEST PUSH2 0x5D1 PUSH2 0x1D0A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x683 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x7A8 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x20C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x7D4 PUSH2 0x1D0A JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x86E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x8D3 PUSH2 0x182A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xA00 PUSH2 0x1D0A JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xACC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x713 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0xB4B PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xB72 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xBD3 PUSH2 0xB7F PUSH2 0x1D0A JUMP JUMPDEST SWAP4 PUSH2 0xBAA DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1BA0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xCAA JUMPI PUSH2 0xC13 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x1E45 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0xC4F JUMPI STOP JUMPDEST PUSH2 0x396 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x1F5A JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH2 0xD15 PUSH2 0xD10 PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x1A19 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xD6E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0xD8E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP3 SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 DUP1 DUP5 SUB PUSH2 0xE7C JUMPI PUSH2 0xDC2 DUP5 PUSH2 0x1950 JUMP JUMPDEST SWAP4 PUSH2 0xDD0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x18E0 JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0xDFD DUP3 PUSH2 0x1950 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP8 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xE28 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE24 SWAP1 DUP3 ADD DUP10 PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0xE33 DUP2 DUP4 DUP8 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI PUSH2 0xE6B PUSH1 0x1 SWAP3 PUSH2 0xE63 DUP4 DUP8 DUP10 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP11 PUSH2 0x1A78 JUMP JUMPDEST PUSH2 0xE75 DUP3 DUP10 PUSH2 0x1C62 JUMP JUMPDEST MSTORE ADD PUSH2 0xE07 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x40 PUSH2 0xEDF PUSH2 0x2201 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xF63 PUSH2 0x182A JUMP JUMPDEST PUSH2 0xF6B PUSH2 0x1D0A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1DF JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x101E JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x713 JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x10EC PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x10F4 PUSH2 0x182A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1114 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1136 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1157 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x1184 PUSH2 0x1D0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x4B1 JUMPI DUP10 DUP12 SUB PUSH2 0xE7C JUMPI PUSH2 0x11B4 DUP3 DUP5 DUP4 PUSH2 0x1FB9 JUMP JUMPDEST ISZERO PUSH2 0x1442 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x1413 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1238 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x122A DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x1CB5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x1CB5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1242 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1257 PUSH2 0x125F SWAP3 PUSH2 0x1267 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP3 PUSH2 0x1317 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x12E7 PUSH2 0x12B7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x18AC JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x18AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x1F5A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x13F4 JUMPI JUMPDEST POP AND SUB PUSH2 0x137A JUMPI STOP JUMPDEST PUSH2 0x13F0 SWAP1 PUSH2 0x13C0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x18AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x140D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x454 JUMPI PUSH2 0x446 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP7 PUSH2 0x1371 JUMP JUMPDEST DUP1 PUSH2 0x143C DUP13 PUSH2 0x1432 DUP16 SWAP5 PUSH2 0x142A DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x1CA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x2039 JUMP JUMPDEST ADD PUSH2 0x11BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH2 0x1532 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1552 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1574 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x184D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x20C JUMPI PUSH2 0x1608 SWAP4 PUSH2 0x159E PUSH2 0x1610 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x187E JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x1600 PUSH2 0x15AC PUSH2 0x1D0A JUMP JUMPDEST SWAP7 PUSH2 0x15D7 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1BA0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x1968 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x19B4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0xCAA JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0xE7C JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1709 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x16AA PUSH2 0x169C DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x18AC JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x18AC JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x16B4 JUMPI STOP JUMPDEST PUSH2 0x1317 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x12E7 PUSH2 0x12B7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x18AC JUMP JUMPDEST DUP1 PUSH2 0x172D PUSH2 0x1719 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x1C62 JUMP JUMPDEST MLOAD PUSH2 0x1724 DUP4 DUP12 PUSH2 0x1C62 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x1E45 JUMP JUMPDEST ADD PUSH2 0x163D JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x20C JUMPI PUSH2 0xD15 PUSH1 0x20 SWAP2 PUSH2 0x1AF1 JUMP JUMPDEST CALLVALUE PUSH2 0x20C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x20C JUMPI PUSH1 0x20 PUSH2 0x17FF PUSH2 0x17D5 PUSH2 0x1807 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x1A78 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x20C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x20C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x20C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x18CA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x18BD JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1921 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1921 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1974 DUP2 PUSH2 0x1950 JUMP JUMPDEST SWAP4 PUSH2 0x1982 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x18E0 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x20C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x19A4 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1998 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1921 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x19FC PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x18E0 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x20C JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1A71 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x1AC7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1B9A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1B94 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1BFA JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1C76 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1C76 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x20C JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x20C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x20C JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1E36 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1E3B JUMPI JUMPDEST PUSH2 0x1E36 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1D95 JUMPI JUMPDEST POP PUSH2 0x1D92 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1E07 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1D88 JUMP JUMPDEST PUSH2 0x1E29 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1E2F JUMPI JUMPDEST PUSH2 0x1E21 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1CF2 JUMP JUMPDEST CODESIZE PUSH2 0x1E00 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1E17 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1D51 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x1E53 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x1EC9 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x1E4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x20C JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x20C JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1FA4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1F65 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1FE4 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1FDE JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x2049 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x21A5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20C1 JUMPI JUMPDEST POP PUSH2 0x2042 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x2147 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x20BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2335 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x233D JUMPI JUMPDEST PUSH2 0x2335 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2294 JUMPI JUMPDEST POP PUSH2 0x2263 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x20C JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2316 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2257 JUMP JUMPDEST PUSH2 0x232F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1E2F JUMPI PUSH2 0x1E21 DUP2 DUP4 PUSH2 0x18E0 JUMP JUMPDEST CODESIZE PUSH2 0x230F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2248 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RJUMP 0xAD79 DUP14 0xD2 CHAINID PUSH14 0xDC4FB355CB591530D35CE3C0E8B2 0x25 EXTCODECOPY 0xDB PUSH20 0x9FD6A1577D57B564736F6C634300081E00330000 ","sourceMap":"619:795:114:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1131:41;;:::i;:::-;619:795;;;;;;;;;;3205:23:42;;;3201:60;;619:795:114;;;3275:25:42;;;;3271:146;;619:795:114;3271:146:42;619:795:114;;;;;;3361:45:42;619:795:114;;3361:45:42;619:795:114;3201:60:42;3237:24;619:795:114;3237:24:42;619:795:114;;;;3237:24:42;619:795:114;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;619:795:114;1131:41;;;:::i;:::-;619:795;;;4536:16:228;;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;619:795:114;4720:5:228;;;;;;;;;:::i;:::-;619:795:114;;;;;;;4742:43:228;619:795:114;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;619:795:114;4796:104:228;619:795:114;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;619:795:114;19356:74:228;;619:795:114;19356:74:228;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;619:795:114;19356:74:228;;;;;;;;619:795:114;19356:74:228;619:795:114;19356:74:228;619:795:114;19356:74:228;;;4796:104;619:795:114;;19356:101:228;19352:168;;619:795:114;19352:168:228;19478:42;619:795:114;19478:42:228;619:795:114;;;;;;;;19478:42:228;19356:74;;;;619:795:114;19356:74:228;619:795:114;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;619:795:114;;;;;;;;;4601:76:228;619:795:114;4645:32:228;;;;619:795:114;4645:32:228;619:795:114;;;;;;;;4645:32:228;4532:59;4561:30;619:795:114;4561:30:228;619:795:114;;4561:30:228;619:795:114;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;619:795:114;-1:-1:-1;619:795:114;14847:11:228;619:795:114;;;;-1:-1:-1;619:795:114;14847:28:228;619:795:114;-1:-1:-1;619:795:114;;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1131:41;;:::i;:::-;5148:19:42;619:795:114;;;;;;;4503:26:42;;;4499:64;;4464:19:41;619:795:114;;;;;;;;;;;;;-1:-1:-1;619:795:114;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;1880:140:41;;619:795:114;1880:140:41;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;619:795:114;;;;1973:36:41;;;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1131:41;;;:::i;:::-;619:795;;;14276:18:228;;;;14272:64;;619:795:114;14401:42:228;14346:19;619:795:114;-1:-1:-1;619:795:114;14346:11:228;619:795:114;;;-1:-1:-1;619:795:114;;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;;;;;;;;;;;;;;14401:42:228;619:795:114;14272:64:228;14303:33;;619:795:114;14303:33:228;619:795:114;;;;14303:33:228;619:795:114;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;619:795:114;-1:-1:-1;619:795:114;;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1131:41;;:::i;:::-;619:795;;;;;;;;;;;;;-1:-1:-1;619:795:114;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;3741:25:41;3737:66;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;619:795:114;;;;2455:33:41;619:795:114;3737:66:41;619:795:114;3775:28:41;;;619:795:114;3775:28:41;619:795:114;;;;;;;3775:28:41;619:795:114;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;1131:41;;619:795;1131:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;619:795:114;1221:6:210;:::i;:::-;619:795:114;;;;;:::i;:::-;;;;;8152:16:228;;;8148:55;;8236:5;;;;619:795:114;8236:5:228;;:::i;:::-;619:795:114;;;;;8258:49:228;619:795:114;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;619:795:114;8318:110:228;619:795:114;;;;;;19356:74:228;;;;;619:795:114;19356:74:228;;619:795:114;19356:74:228;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8148:55:228:-;8177:26;619:795:114;8177:26:228;619:795:114;;8177:26:228;619:795:114;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;619:795:114;16129:20:228;;;;16125:59;;619:795:114;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;619:795:114;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;619:795:114;;;;;;;;;16306:30:228;619:795:114;16329:6:228;;;;;;:::i;:::-;619:795:114;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;619:795:114;;16250:9:228;;16125:59;16158:26;619:795:114;16158:26:228;619:795:114;;16158:26:228;619:795:114;;;;;;;;;;;;1366:39;;:::i;:::-;619:795;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1131:41;;:::i;:::-;5148:19:42;619:795:114;;;;;;;4503:26:42;;;4499:64;;4464:19:41;619:795:114;;;;;;;;;;;;;-1:-1:-1;619:795:114;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;1254:25:41;1250:140;;619:795:114;1250:140:41;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;619:795:114;;;;1343:36:41;619:795:114;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;619:795:114;1131:41;;;:::i;:::-;619:795;;;6523:16:228;;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;619:795:114;6801:10:228;;;;;;619:795:114;;;;;;;;;;6904:44:228;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;619:795:114;6959:111:228;619:795:114;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;619:795:114;20263:81:228;;619:795:114;20263:81:228;;619:795:114;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;619:795:114;20263:81:228;;;;;;;;619:795:114;20263:81:228;619:795:114;20263:81:228;619:795:114;20263:81:228;;;6959:111;619:795:114;;20263:107:228;20259:181;;619:795:114;20259:181:228;1878:53;619:795:114;1878:53:228;619:795:114;;20391:49:228;;;;;;619:795:114;20391:49:228;;619:795:114;;;1878:53:228;;;619:795:114;1878:53:228;;;;:::i;:::-;;619:795:114;1878:53:228;;;;619:795:114;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;619:795:114;20263:81:228;619:795:114;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;619:795:114;6860:6:228;;;:::i;:::-;619:795:114;6868:9:228;;;:::i;:::-;619:795:114;6868:9:228;;;;;:::i;:::-;619:795:114;6790:9:228;;6698:76;619:795:114;6742:32:228;;;;619:795:114;6742:32:228;619:795:114;;;;;;;;6742:32:228;619:795:114;;;;;;;;;;;;;;;941:19:75;619:795:114;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1131:41;;;619:795;1131:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;619:795:114;1669:6:210;:::i;:::-;619:795:114;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;619:795:114;;;;;9777:23:228;;9773:62;;619:795:114;9862:10:228;;;;;;619:795:114;;;;;;;;;9955:50:228;619:795:114;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;619:795:114;10016:117:228;619:795:114;;;;;;20263:81:228;;;;;619:795:114;20263:81:228;;619:795:114;20263:81:228;;619:795:114;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;619:795:114;9911:6:228;;;:::i;:::-;619:795:114;9919:9:228;;;;:::i;:::-;619:795:114;9919:9:228;;;;:::i;:::-;619:795:114;9851:9:228;;619:795:114;;;;;;;;;;;;;;;;;;;;635:65:55;619:795:114;635:65:55;;:::i;619:795:114:-;;;;;;;;;;;;1730:44:206;619:795:114;;:::i;:::-;;;;;1730:44:206;:::i;:::-;619:795:114;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;619:795:114;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;619:795:114;;;;;-1:-1:-1;619:795:114;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;619:795:114;;;;;;:::o;1002:301:75:-;619:795:114;1146:19:75;619:795:114;1146:53:75;;;1142:96;;619:795:114;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;619:795:114;1215:12:75;:::o;15240:220:228:-;;;619:795:114;;;15358:19:228;15354:61;;15375:1;619:795:114;;;;;15375:1:228;619:795:114;15432:21:228;619:795:114;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;619:795:114;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;619:795:114;500:10:59;619:795:114;500:10:59;;;;619:795:114;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;619:795:114;1528:12:59;:::o;3640:170:41:-;619:795:114;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;619:795:114;3775:28:41;;-1:-1:-1;3775:28:41;619:795:114;3775:28:41;619:795:114;;;;;-1:-1:-1;3775:28:41;619:795:114;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;619:795:114;1029:19:76;619:795:114;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;619:795:114;;;1676:74:76;;619:795:114;;;1676:74:76;;;619:795:114;1327:10:76;619:795:114;;;;1744:4:76;619:795:114;;;;;-1:-1:-1;1676:74:76;;619:795:114;;;;;;1676:74:76;;;;;;;619:795:114;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;619:795:114;17966:1:228;619:795:114;;;;;17966:1:228;619:795:114;;;;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;;;;18123:21:228;;;;;18119:80;;619:795:114;;17966:1:228;619:795:114;;;;;17966:1:228;619:795:114;18217:18:228;619:795:114;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;17953:320:228;;;;;;18119:80;619:795:114;;18153:46:228;;;619:795:114;;;18153:46:228;;;619:795:114;;;;;;;;;;;;;;;;;;20391:49:228;619:795:114;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;619:795:114;;;;;;;;;;;-1:-1:-1;619:795:114;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;16846:185:228;619:795:114;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;619:795:114;;-1:-1:-1;619:795:114;16997:11:228;619:795:114;;;;-1:-1:-1;619:795:114;16997:27:228;619:795:114;-1:-1:-1;619:795:114;;;500:10:59;619:795:114;-1:-1:-1;619:795:114;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;619:795:114;17163:1:228;619:795:114;;;;;17163:1:228;619:795:114;;;;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;;;;17330:29:228;;;;;17326:98;;619:795:114;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;619:795:114;17163:1:228;619:795:114;;;;;17163:1:228;619:795:114;;;;-1:-1:-1;619:795:114;;;;-1:-1:-1;619:795:114;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;619:795:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;619:795:114;;17640:48:228;;;619:795:114;;;17640:48:228;;;619:795:114;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;619:795:114;;17368:56:228;;;619:795:114;;;;;17368:56:228;;;619:795:114;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;619:795:114;2065:19:76;619:795:114;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;619:795:114;720:8:80;619:795:114;720:8:80;;619:795:114;;;;2115:1:76;2802:32;;:::o;2624:153::-;619:795:114;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;619:795:114;2361:10:76;619:795:114;;;;2771:4:76;619:795:114;;;;;-1:-1:-1;2682:95:76;;619:795:114;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"1817000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"452","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2719","isApprovedForAll(address,address)":"2871","isTrustedForwarder(address)":"infinite","owner()":"2495","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","supportsInterface(bytes4)":"2455","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol\":\"ERC1155WithoutOperatorFiltererMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/ERC1155WithoutOperatorFiltererMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155} from \\\"./../../../token/ERC1155/ERC1155.sol\\\";\\nimport {ERC1155Mintable} from \\\"./../../../token/ERC1155/ERC1155Mintable.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155WithoutOperatorFiltererMock is ERC1155, ERC1155Mintable, ForwarderRegistryContext {\\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x7355ea4c7505f0c88ba80ceb821156c580d886c3750862f8b9e68a57d876ebd1\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155Base} from \\\"./base/ERC1155Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155 is ERC1155Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    constructor() {\\n        ERC1155Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0cc8e6bb595c468c7b2f51d67b00b30e3ada7e0ab54a3de0c39b03832043a5c7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol":{"ERC1155BurnableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC1155BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"initERC1155BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC1155BurnableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610aff38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610a769081610089823960805181818161066d01526109110152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063124d91e5146103e357806331e66e1e14610360578063641ff7d9146102265763805349341461004857600080fd5b346102215760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761007f6104fe565b60243567ffffffffffffffff81116102215761009f903690600401610521565b60449291923567ffffffffffffffff8111610221576100c2903690600401610521565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100ef610656565b948683036101f75761010286838361079d565b156101ad5760005b8381106101815750509061017c7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb939260009773ffffffffffffffffffffffffffffffffffffffff8061016a604051978897604089526040890191610591565b93868503602088015216981696610591565b0390a4005b806101a76101926001938789610552565b3561019e838c8b610552565b3590868661081d565b0161010a565b73ffffffffffffffffffffffffffffffffffffffff8281887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102215760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761025d610656565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610333577f921ed8d1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102215760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215760406103996108fa565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102215760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761041a6104fe565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435610449610656565b9261045584868361079d565b156104b45773ffffffffffffffffffffffffffffffffffffffff8086846104a37fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861081d565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361022157565b9181601f840112156102215782359167ffffffffffffffff8311610221576020808501948460051b01011161022157565b91908110156105625760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102215760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761060f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610221575180151581036102215790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561078e573233148015610793575b61078e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106e1575b506106de57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561078257600091610753575b50386106d4565b610775915060203d60201161077b575b61076d81836105ce565b81019061063e565b3861074c565b503d610763565b6040513d6000823e3d90fd5b503390565b506018361061069d565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156107c8575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806107c2565b90918361082b575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156108a157505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610825565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f03dee4c5000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a2e573233148015610a36575b610a2e5780331490811561098d575b5061095c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102215760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561078257600091610a0f575b5038610950565b610a28915060203d60201161077b5761076d81836105ce565b38610a08565b506000903690565b506018361061094156fea2646970667358221220da0469d78ce7d76f451d52ddceaef94866de97e1277bde5dd09f5276986dab3864736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xAFF CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xA76 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x66D ADD MSTORE PUSH2 0x911 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x3E3 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x641FF7D9 EQ PUSH2 0x226 JUMPI PUSH4 0x80534934 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x7F PUSH2 0x4FE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x221 JUMPI PUSH2 0x9F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x521 JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x221 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x521 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xEF PUSH2 0x656 JUMP JUMPDEST SWAP5 DUP7 DUP4 SUB PUSH2 0x1F7 JUMPI PUSH2 0x102 DUP7 DUP4 DUP4 PUSH2 0x79D JUMP JUMPDEST ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x181 JUMPI POP POP SWAP1 PUSH2 0x17C PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 SWAP3 PUSH1 0x0 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16A PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 PUSH1 0x40 DUP10 MSTORE PUSH1 0x40 DUP10 ADD SWAP2 PUSH2 0x591 JUMP JUMPDEST SWAP4 DUP7 DUP6 SUB PUSH1 0x20 DUP9 ADD MSTORE AND SWAP9 AND SWAP7 PUSH2 0x591 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1A7 PUSH2 0x192 PUSH1 0x1 SWAP4 DUP8 DUP10 PUSH2 0x552 JUMP JUMPDEST CALLDATALOAD PUSH2 0x19E DUP4 DUP13 DUP12 PUSH2 0x552 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 DUP7 PUSH2 0x81D JUMP JUMPDEST ADD PUSH2 0x10A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x25D PUSH2 0x656 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x333 JUMPI PUSH32 0x921ED8D100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH1 0x40 PUSH2 0x399 PUSH2 0x8FA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x41A PUSH2 0x4FE JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x449 PUSH2 0x656 JUMP JUMPDEST SWAP3 PUSH2 0x455 DUP5 DUP7 DUP4 PUSH2 0x79D JUMP JUMPDEST ISZERO PUSH2 0x4B4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x4A3 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x81D JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x221 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x221 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x221 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x221 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x562 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x221 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x60F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x221 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x221 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x78E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x793 JUMPI JUMPDEST PUSH2 0x78E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6E1 JUMPI JUMPDEST POP PUSH2 0x6DE JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x753 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6D4 JUMP JUMPDEST PUSH2 0x775 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x77B JUMPI JUMPDEST PUSH2 0x76D DUP2 DUP4 PUSH2 0x5CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x63E JUMP JUMPDEST CODESIZE PUSH2 0x74C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x763 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x69D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x7C8 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x7C2 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x82B JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x8A1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x825 JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA2E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA36 JUMPI JUMPDEST PUSH2 0xA2E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI JUMPDEST POP PUSH2 0x95C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x221 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA0F JUMPI JUMPDEST POP CODESIZE PUSH2 0x950 JUMP JUMPDEST PUSH2 0xA28 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x77B JUMPI PUSH2 0x76D DUP2 DUP4 PUSH2 0x5CE JUMP JUMPDEST CODESIZE PUSH2 0xA08 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x941 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDA DIV PUSH10 0xD78CE7D76F451D52DDCE 0xAE EXTDELEGATECALL BASEFEE PUSH7 0xDE97E1277BDE5D 0xD0 SWAP16 MSTORE PUSH23 0x986DAB3864736F6C634300081E00330000000000000000 ","sourceMap":"283:258:115:-:0;;;;;;;;;;;;;-1:-1:-1;;283:258:115;;;;-1:-1:-1;;;;;283:258:115;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;283:258:115;;;;;;745:39:76;;283:258:115;;;;;;;;745:39:76;283:258:115;;;;;;;;;;;;-1:-1:-1;283:258:115;;;;;;-1:-1:-1;283:258:115;;;;;-1:-1:-1;283:258:115"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1278,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":1313,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":1598,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":1425,"id":null,"parameterSlots":3,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":1362,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":1486,"id":null,"parameterSlots":2,"returnSlots":0},"fun_burnToken":{"entryPoint":2077,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_isOperatable":{"entryPoint":1949,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":2298,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1622,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1645},{"length":32,"start":2321}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063124d91e5146103e357806331e66e1e14610360578063641ff7d9146102265763805349341461004857600080fd5b346102215760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761007f6104fe565b60243567ffffffffffffffff81116102215761009f903690600401610521565b60449291923567ffffffffffffffff8111610221576100c2903690600401610521565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100ef610656565b948683036101f75761010286838361079d565b156101ad5760005b8381106101815750509061017c7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb939260009773ffffffffffffffffffffffffffffffffffffffff8061016a604051978897604089526040890191610591565b93868503602088015216981696610591565b0390a4005b806101a76101926001938789610552565b3561019e838c8b610552565b3590868661081d565b0161010a565b73ffffffffffffffffffffffffffffffffffffffff8281887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102215760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761025d610656565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610333577f921ed8d1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102215760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215760406103996108fa565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102215760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102215761041a6104fe565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435610449610656565b9261045584868361079d565b156104b45773ffffffffffffffffffffffffffffffffffffffff8086846104a37fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861081d565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361022157565b9181601f840112156102215782359167ffffffffffffffff8311610221576020808501948460051b01011161022157565b91908110156105625760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102215760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761060f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610221575180151581036102215790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561078e573233148015610793575b61078e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106e1575b506106de57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561078257600091610753575b50386106d4565b610775915060203d60201161077b575b61076d81836105ce565b81019061063e565b3861074c565b503d610763565b6040513d6000823e3d90fd5b503390565b506018361061069d565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156107c8575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806107c2565b90918361082b575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156108a157505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610825565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f03dee4c5000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a2e573233148015610a36575b610a2e5780331490811561098d575b5061095c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102215760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561078257600091610a0f575b5038610950565b610a28915060203d60201161077b5761076d81836105ce565b38610a08565b506000903690565b506018361061094156fea2646970667358221220da0469d78ce7d76f451d52ddceaef94866de97e1277bde5dd09f5276986dab3864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x3E3 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x641FF7D9 EQ PUSH2 0x226 JUMPI PUSH4 0x80534934 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x7F PUSH2 0x4FE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x221 JUMPI PUSH2 0x9F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x521 JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x221 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x521 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xEF PUSH2 0x656 JUMP JUMPDEST SWAP5 DUP7 DUP4 SUB PUSH2 0x1F7 JUMPI PUSH2 0x102 DUP7 DUP4 DUP4 PUSH2 0x79D JUMP JUMPDEST ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x181 JUMPI POP POP SWAP1 PUSH2 0x17C PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 SWAP3 PUSH1 0x0 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16A PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 PUSH1 0x40 DUP10 MSTORE PUSH1 0x40 DUP10 ADD SWAP2 PUSH2 0x591 JUMP JUMPDEST SWAP4 DUP7 DUP6 SUB PUSH1 0x20 DUP9 ADD MSTORE AND SWAP9 AND SWAP7 PUSH2 0x591 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1A7 PUSH2 0x192 PUSH1 0x1 SWAP4 DUP8 DUP10 PUSH2 0x552 JUMP JUMPDEST CALLDATALOAD PUSH2 0x19E DUP4 DUP13 DUP12 PUSH2 0x552 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 DUP7 PUSH2 0x81D JUMP JUMPDEST ADD PUSH2 0x10A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x25D PUSH2 0x656 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x333 JUMPI PUSH32 0x921ED8D100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH1 0x40 PUSH2 0x399 PUSH2 0x8FA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x221 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x221 JUMPI PUSH2 0x41A PUSH2 0x4FE JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x449 PUSH2 0x656 JUMP JUMPDEST SWAP3 PUSH2 0x455 DUP5 DUP7 DUP4 PUSH2 0x79D JUMP JUMPDEST ISZERO PUSH2 0x4B4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x4A3 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x81D JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x221 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x221 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x221 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x221 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x562 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x221 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x60F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x221 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x221 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x78E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x793 JUMPI JUMPDEST PUSH2 0x78E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6E1 JUMPI JUMPDEST POP PUSH2 0x6DE JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x753 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6D4 JUMP JUMPDEST PUSH2 0x775 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x77B JUMPI JUMPDEST PUSH2 0x76D DUP2 DUP4 PUSH2 0x5CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x63E JUMP JUMPDEST CODESIZE PUSH2 0x74C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x763 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x69D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x7C8 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x7C2 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x82B JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x8A1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x825 JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA2E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA36 JUMPI JUMPDEST PUSH2 0xA2E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI JUMPDEST POP PUSH2 0x95C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x221 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA0F JUMPI JUMPDEST POP CODESIZE PUSH2 0x950 JUMP JUMPDEST PUSH2 0xA28 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x77B JUMPI PUSH2 0x76D DUP2 DUP4 PUSH2 0x5CE JUMP JUMPDEST CODESIZE PUSH2 0xA08 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x941 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDA DIV PUSH10 0xD78CE7D76F451D52DDCE 0xAE EXTDELEGATECALL BASEFEE PUSH7 0xDE97E1277BDE5D 0xD0 SWAP16 MSTORE PUSH23 0x986DAB3864736F6C634300081E00330000000000000000 ","sourceMap":"283:258:115:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;283:258:115;1609:41:215;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;283:258:115;13625:10:228;;;;;;283:258:115;;;;13720:52:228;283:258:115;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13720:52:228;;;283:258:115;13637:3:228;13676:6;13684:9;13676:6;283:258:115;13676:6:228;;;;:::i;:::-;283:258:115;13684:9:228;;;;;:::i;:::-;283:258:115;13684:9:228;;;;:::i;:::-;283:258:115;13614:9:228;;13522:76;283:258:115;13566:32:228;;;;283:258:115;13566:32:228;283:258:115;;;;;;;;13566:32:228;13450:62;13486:26;283:258:115;13486:26:228;283:258:115;;13486:26:228;283:258:115;;;;;;;;;;;;;;;1609:41:215;;:::i;:::-;283:258:115;;;;;;;3174:18:180;;;3170:53;;3111:34:228;283:258:115;500:10:59;283:258:115;500:10:59;;;;;;;636:1:180;500:10:59;;;283:258:115;3170:53:180;3201:22;283:258:115;3201:22:180;283:258:115;;;;3201:22:180;283:258:115;;;;;;;;;;;;1844:39:215;;:::i;:::-;283:258:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;1609:41:215;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;283:258:115;12560:5:228;;;;12581:51;12560:5;;283:258:115;12560:5:228;283:258:115;12560:5:228;;:::i;:::-;283:258:115;;;;;;;;;;;;12581:51:228;;283:258:115;12450:76:228;283:258:115;12494:32:228;;;;283:258:115;12494:32:228;283:258:115;;;;;;;;12494:32:228;283:258:115;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;283:258:115;;;;;-1:-1:-1;283:258:115;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;283:258:115;1029:19:76;283:258:115;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;283:258:115;;;1676:74:76;;283:258:115;;;1676:74:76;;;283:258:115;1327:10:76;283:258:115;;;;1744:4:76;283:258:115;;;;;-1:-1:-1;1676:74:76;;283:258:115;;;;;;1676:74:76;;;;;;;283:258:115;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;283:258:115;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;16846:185:228;283:258:115;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;283:258:115;;-1:-1:-1;283:258:115;16997:11:228;283:258:115;;;;-1:-1:-1;283:258:115;16997:27:228;283:258:115;-1:-1:-1;283:258:115;;;;;-1:-1:-1;283:258:115;;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;;:::o;18382:326::-;283:258:115;18395:1:228;283:258:115;;;;;18395:1:228;283:258:115;;;;-1:-1:-1;283:258:115;;;;-1:-1:-1;283:258:115;;;;;;18550:21:228;;;;;18546:86;;283:258:115;;18395:1:228;283:258:115;;;;;18395:1:228;283:258:115;18650:20:228;283:258:115;-1:-1:-1;283:258:115;;;;-1:-1:-1;283:258:115;;18382:326:228;;;;;;18546:86;18580:52;283:258:115;;;;;;;18580:52:228;;;;283:258:115;18580:52:228;;;283:258:115;;;;;;;;;;;;;18580:52:228;1938:939:76;283:258:115;2065:19:76;283:258:115;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;283:258:115;720:8:80;283:258:115;720:8:80;;283:258:115;;;;2115:1:76;2802:32;;:::o;2624:153::-;283:258:115;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;283:258:115;2361:10:76;283:258:115;;;;2771:4:76;283:258:115;;;;;-1:-1:-1;2682:95:76;;283:258:115;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"535600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchBurnFrom(address,uint256[],uint256[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","initERC1155BurnableStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchBurnFrom(address,uint256[],uint256[])":"80534934","burnFrom(address,uint256,uint256)":"124d91e5","initERC1155BurnableStorage()":"641ff7d9"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC1155BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"initERC1155BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC1155BurnableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"initERC1155BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol\":\"ERC1155BurnableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155BurnableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155BurnableFacet} from \\\"./../../../../token/ERC1155/facets/ERC1155BurnableFacet.sol\\\";\\n\\n/// @title ERC1155BurnableFacetMock\\ncontract ERC1155BurnableFacetMock is ERC1155BurnableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155BurnableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xb3ddb0cb8949b8570d1c646a743a8b1b30d29f539179ae49063d672b8808e614\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./../base/ERC1155BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155BurnableFacet is ERC1155BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x630d76de99015fbc4d1e090d47cb500ef94eebdd2ed761f5c98eda2db5766ef0\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"initERC1155BurnableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Burnable."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol":{"ERC1155DeliverableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC1155DeliverableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"initERC1155DeliverableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}}},"title":"ERC1155DeliverableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610cd238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610c499081610089823960805181818161099d0152610aff0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146107a3578063ba92ca2a146106695763e8ab9ccc1461003d57600080fd5b346105fc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc5760043567ffffffffffffffff81116105fc5761008c903690600401610826565b60243567ffffffffffffffff81116105fc576100ac903690600401610826565b60443567ffffffffffffffff81116105fc576100cc903690600401610826565b90946064359367ffffffffffffffff85116105fc57366023860112156105fc5784600401359367ffffffffffffffff85116105fc5736602486880101116105fc57610115610ae8565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205490979060ff16156106015761016e816108c7565b9361017c6040519586610857565b818552602085019160051b8101903682116105fc57915b8183106105cf57505050966101b06101b8926020989936916108df565b9336916108df565b926000958187926024604051986101f6857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018b610857565b828a52018389013786010152805190825182148015906105c4575b61059c57909573ffffffffffffffffffffffffffffffffffffffff1690855b87811061023b578680f35b73ffffffffffffffffffffffffffffffffffffffff61025a828461092b565b5116610266828661092b565b51610271838861092b565b519180156105745782610487575b808a877fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260408051878152886020820152a4803b6102c3575b505050600101610230565b6040517ff23a6e610000000000000000000000000000000000000000000000000000000081528660048201528a602482015282604482015283606482015260a0608482015289518060a4830152818c805b8d84821061046c5750508160c4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f87868560209a8601015201168101030191865af1908115610461578b916103e3575b507fffffffff000000000000000000000000000000000000000000000000000000007ff23a6e6100000000000000000000000000000000000000000000000000000000911603156102b8577f40f39d38000000000000000000000000000000000000000000000000000000008a52600452602452604452606487fd5b90506020813d8211610459575b816103fd60209383610857565b8101031261045557517fffffffff0000000000000000000000000000000000000000000000000000000081168103610455577fffffffff00000000000000000000000000000000000000000000000000000000610367565b8a80fd5b3d91506103f0565b6040513d8d823e3d90fd5b810160209081015186830160c401528593508f925001610314565b818a527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408a2073ffffffffffffffffffffffffffffffffffffffff82168b5260205260408a205483810190808211156105315750828b527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408b2073ffffffffffffffffffffffffffffffffffffffff83168c5260205260408b205561027f565b849150608493604051937f42fb00bc0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b60048a7f021149bd000000000000000000000000000000000000000000000000000000008152fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b508351821415610211565b823573ffffffffffffffffffffffffffffffffffffffff811681036105fc57815260209283019201610193565b600080fd5b73ffffffffffffffffffffffffffffffffffffffff887f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346105fc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc576106a0610ae8565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610776577fe8ab9ccc000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346105fc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc5760406107dc610986565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156105fc5782359167ffffffffffffffff83116105fc576020808501948460051b0101116105fc57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761089857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116108985760051b60200190565b9291906108eb816108c7565b936108f96040519586610857565b602085838152019160051b81019283116105fc57905b82821061091b57505050565b813581526020918201910161090f565b805182101561093f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908160209103126105fc575180151581036105fc5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ad6573233148015610ade575b610ad657803314908115610a19575b506109e8576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116105fc5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610aca57600091610a9b575b50386109dc565b610abd915060203d602011610ac3575b610ab58183610857565b81019061096e565b38610a94565b503d610aab565b6040513d6000823e3d90fd5b506000903690565b50601836106109cd565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c04573233148015610c09575b610c04577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610b73575b50610b7057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610aca57600091610be5575b5038610b66565b610bfe915060203d602011610ac357610ab58183610857565b38610bde565b503390565b5060183610610b2f56fea2646970667358221220d5565781b107a2e6610ded9bf977bfa0706d0fac3d847a6133465a4c9b9da30664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xCD2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xC49 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x99D ADD MSTORE PUSH2 0xAFF ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7A3 JUMPI DUP1 PUSH4 0xBA92CA2A EQ PUSH2 0x669 JUMPI PUSH4 0xE8AB9CCC EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0x8C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0xAC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0xCC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST SWAP1 SWAP5 PUSH1 0x64 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5FC JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x5FC JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5FC JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP9 ADD ADD GT PUSH2 0x5FC JUMPI PUSH2 0x115 PUSH2 0xAE8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP8 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x601 JUMPI PUSH2 0x16E DUP2 PUSH2 0x8C7 JUMP JUMPDEST SWAP4 PUSH2 0x17C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x857 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5FC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5CF JUMPI POP POP POP SWAP7 PUSH2 0x1B0 PUSH2 0x1B8 SWAP3 PUSH1 0x20 SWAP9 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP6 DUP2 DUP8 SWAP3 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP9 PUSH2 0x1F6 DUP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD DUP12 PUSH2 0x857 JUMP JUMPDEST DUP3 DUP11 MSTORE ADD DUP4 DUP10 ADD CALLDATACOPY DUP7 ADD ADD MSTORE DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x5C4 JUMPI JUMPDEST PUSH2 0x59C JUMPI SWAP1 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x23B JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x25A DUP3 DUP5 PUSH2 0x92B JUMP JUMPDEST MLOAD AND PUSH2 0x266 DUP3 DUP7 PUSH2 0x92B JUMP JUMPDEST MLOAD PUSH2 0x271 DUP4 DUP9 PUSH2 0x92B JUMP JUMPDEST MLOAD SWAP2 DUP1 ISZERO PUSH2 0x574 JUMPI DUP3 PUSH2 0x487 JUMPI JUMPDEST DUP1 DUP11 DUP8 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP8 DUP2 MSTORE DUP9 PUSH1 0x20 DUP3 ADD MSTORE LOG4 DUP1 EXTCODESIZE PUSH2 0x2C3 JUMPI JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0x230 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP7 PUSH1 0x4 DUP3 ADD MSTORE DUP11 PUSH1 0x24 DUP3 ADD MSTORE DUP3 PUSH1 0x44 DUP3 ADD MSTORE DUP4 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE DUP10 MLOAD DUP1 PUSH1 0xA4 DUP4 ADD MSTORE DUP2 DUP13 DUP1 JUMPDEST DUP14 DUP5 DUP3 LT PUSH2 0x46C JUMPI POP POP DUP2 PUSH1 0xC4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP8 DUP7 DUP6 PUSH1 0x20 SWAP11 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x461 JUMPI DUP12 SWAP2 PUSH2 0x3E3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB ISZERO PUSH2 0x2B8 JUMPI PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 DUP8 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x459 JUMPI JUMPDEST DUP2 PUSH2 0x3FD PUSH1 0x20 SWAP4 DUP4 PUSH2 0x857 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x455 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x455 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x367 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3F0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP14 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 ADD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP7 DUP4 ADD PUSH1 0xC4 ADD MSTORE DUP6 SWAP4 POP DUP16 SWAP3 POP ADD PUSH2 0x314 JUMP JUMPDEST DUP2 DUP11 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SLOAD DUP4 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x531 JUMPI POP DUP3 DUP12 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP13 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SSTORE PUSH2 0x27F JUMP JUMPDEST DUP5 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x4 DUP11 PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP4 MLOAD DUP3 EQ ISZERO PUSH2 0x211 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x5FC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x193 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH2 0x6A0 PUSH2 0xAE8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x776 JUMPI PUSH32 0xE8AB9CCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH1 0x40 PUSH2 0x7DC PUSH2 0x986 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x5FC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x5FC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x5FC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x898 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x898 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x8EB DUP2 PUSH2 0x8C7 JUMP JUMPDEST SWAP4 PUSH2 0x8F9 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x5FC JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x91B JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x90F JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x93F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x5FC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x5FC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAD6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xADE JUMPI JUMPDEST PUSH2 0xAD6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA19 JUMPI JUMPDEST POP PUSH2 0x9E8 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5FC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA9B JUMPI JUMPDEST POP CODESIZE PUSH2 0x9DC JUMP JUMPDEST PUSH2 0xABD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xAC3 JUMPI JUMPDEST PUSH2 0xAB5 DUP2 DUP4 PUSH2 0x857 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x96E JUMP JUMPDEST CODESIZE PUSH2 0xA94 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xAAB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9CD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC04 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC09 JUMPI JUMPDEST PUSH2 0xC04 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB73 JUMPI JUMPDEST POP PUSH2 0xB70 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE5 JUMPI JUMPDEST POP CODESIZE PUSH2 0xB66 JUMP JUMPDEST PUSH2 0xBFE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xAC3 JUMPI PUSH2 0xAB5 DUP2 DUP4 PUSH2 0x857 JUMP JUMPDEST CODESIZE PUSH2 0xBDE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB2F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 JUMP JUMPI DUP2 0xB1 SMOD LOG2 DUPN 0x61 0xD 0xED SWAP12 EXTDELEGATECALL PUSH24 0xBFA0706D0FAC3D847A6133465A4C9B9DA30664736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"292:267:116:-:0;;;;;;;;;;;;;-1:-1:-1;;292:267:116;;;;-1:-1:-1;;;;;292:267:116;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;292:267:116;;;;;;745:39:76;;292:267:116;;;;;;;;745:39:76;292:267:116;;;;;;;;;;;;-1:-1:-1;292:267:116;;;;;;-1:-1:-1;292:267:116;;;;;-1:-1:-1;292:267:116"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":2086,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":2271,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2414,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":2247,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2135,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2438,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2792,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":2347,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2461},{"length":32,"start":2815}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146107a3578063ba92ca2a146106695763e8ab9ccc1461003d57600080fd5b346105fc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc5760043567ffffffffffffffff81116105fc5761008c903690600401610826565b60243567ffffffffffffffff81116105fc576100ac903690600401610826565b60443567ffffffffffffffff81116105fc576100cc903690600401610826565b90946064359367ffffffffffffffff85116105fc57366023860112156105fc5784600401359367ffffffffffffffff85116105fc5736602486880101116105fc57610115610ae8565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205490979060ff16156106015761016e816108c7565b9361017c6040519586610857565b818552602085019160051b8101903682116105fc57915b8183106105cf57505050966101b06101b8926020989936916108df565b9336916108df565b926000958187926024604051986101f6857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018b610857565b828a52018389013786010152805190825182148015906105c4575b61059c57909573ffffffffffffffffffffffffffffffffffffffff1690855b87811061023b578680f35b73ffffffffffffffffffffffffffffffffffffffff61025a828461092b565b5116610266828661092b565b51610271838861092b565b519180156105745782610487575b808a877fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260408051878152886020820152a4803b6102c3575b505050600101610230565b6040517ff23a6e610000000000000000000000000000000000000000000000000000000081528660048201528a602482015282604482015283606482015260a0608482015289518060a4830152818c805b8d84821061046c5750508160c4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f87868560209a8601015201168101030191865af1908115610461578b916103e3575b507fffffffff000000000000000000000000000000000000000000000000000000007ff23a6e6100000000000000000000000000000000000000000000000000000000911603156102b8577f40f39d38000000000000000000000000000000000000000000000000000000008a52600452602452604452606487fd5b90506020813d8211610459575b816103fd60209383610857565b8101031261045557517fffffffff0000000000000000000000000000000000000000000000000000000081168103610455577fffffffff00000000000000000000000000000000000000000000000000000000610367565b8a80fd5b3d91506103f0565b6040513d8d823e3d90fd5b810160209081015186830160c401528593508f925001610314565b818a527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408a2073ffffffffffffffffffffffffffffffffffffffff82168b5260205260408a205483810190808211156105315750828b527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408b2073ffffffffffffffffffffffffffffffffffffffff83168c5260205260408b205561027f565b849150608493604051937f42fb00bc0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b60048a7f021149bd000000000000000000000000000000000000000000000000000000008152fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b508351821415610211565b823573ffffffffffffffffffffffffffffffffffffffff811681036105fc57815260209283019201610193565b600080fd5b73ffffffffffffffffffffffffffffffffffffffff887f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346105fc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc576106a0610ae8565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610776577fe8ab9ccc000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346105fc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105fc5760406107dc610986565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156105fc5782359167ffffffffffffffff83116105fc576020808501948460051b0101116105fc57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761089857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116108985760051b60200190565b9291906108eb816108c7565b936108f96040519586610857565b602085838152019160051b81019283116105fc57905b82821061091b57505050565b813581526020918201910161090f565b805182101561093f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b908160209103126105fc575180151581036105fc5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ad6573233148015610ade575b610ad657803314908115610a19575b506109e8576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116105fc5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610aca57600091610a9b575b50386109dc565b610abd915060203d602011610ac3575b610ab58183610857565b81019061096e565b38610a94565b503d610aab565b6040513d6000823e3d90fd5b506000903690565b50601836106109cd565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c04573233148015610c09575b610c04577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610b73575b50610b7057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610aca57600091610be5575b5038610b66565b610bfe915060203d602011610ac357610ab58183610857565b38610bde565b503390565b5060183610610b2f56fea2646970667358221220d5565781b107a2e6610ded9bf977bfa0706d0fac3d847a6133465a4c9b9da30664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7A3 JUMPI DUP1 PUSH4 0xBA92CA2A EQ PUSH2 0x669 JUMPI PUSH4 0xE8AB9CCC EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0x8C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0xAC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FC JUMPI PUSH2 0xCC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x826 JUMP JUMPDEST SWAP1 SWAP5 PUSH1 0x64 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5FC JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x5FC JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5FC JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP9 ADD ADD GT PUSH2 0x5FC JUMPI PUSH2 0x115 PUSH2 0xAE8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP8 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x601 JUMPI PUSH2 0x16E DUP2 PUSH2 0x8C7 JUMP JUMPDEST SWAP4 PUSH2 0x17C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x857 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5FC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5CF JUMPI POP POP POP SWAP7 PUSH2 0x1B0 PUSH2 0x1B8 SWAP3 PUSH1 0x20 SWAP9 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP6 DUP2 DUP8 SWAP3 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP9 PUSH2 0x1F6 DUP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD DUP12 PUSH2 0x857 JUMP JUMPDEST DUP3 DUP11 MSTORE ADD DUP4 DUP10 ADD CALLDATACOPY DUP7 ADD ADD MSTORE DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x5C4 JUMPI JUMPDEST PUSH2 0x59C JUMPI SWAP1 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x23B JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x25A DUP3 DUP5 PUSH2 0x92B JUMP JUMPDEST MLOAD AND PUSH2 0x266 DUP3 DUP7 PUSH2 0x92B JUMP JUMPDEST MLOAD PUSH2 0x271 DUP4 DUP9 PUSH2 0x92B JUMP JUMPDEST MLOAD SWAP2 DUP1 ISZERO PUSH2 0x574 JUMPI DUP3 PUSH2 0x487 JUMPI JUMPDEST DUP1 DUP11 DUP8 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP8 DUP2 MSTORE DUP9 PUSH1 0x20 DUP3 ADD MSTORE LOG4 DUP1 EXTCODESIZE PUSH2 0x2C3 JUMPI JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0x230 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP7 PUSH1 0x4 DUP3 ADD MSTORE DUP11 PUSH1 0x24 DUP3 ADD MSTORE DUP3 PUSH1 0x44 DUP3 ADD MSTORE DUP4 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE DUP10 MLOAD DUP1 PUSH1 0xA4 DUP4 ADD MSTORE DUP2 DUP13 DUP1 JUMPDEST DUP14 DUP5 DUP3 LT PUSH2 0x46C JUMPI POP POP DUP2 PUSH1 0xC4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP8 DUP7 DUP6 PUSH1 0x20 SWAP11 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x461 JUMPI DUP12 SWAP2 PUSH2 0x3E3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB ISZERO PUSH2 0x2B8 JUMPI PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 DUP8 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x459 JUMPI JUMPDEST DUP2 PUSH2 0x3FD PUSH1 0x20 SWAP4 DUP4 PUSH2 0x857 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x455 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x455 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x367 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3F0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP14 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 ADD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP7 DUP4 ADD PUSH1 0xC4 ADD MSTORE DUP6 SWAP4 POP DUP16 SWAP3 POP ADD PUSH2 0x314 JUMP JUMPDEST DUP2 DUP11 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SLOAD DUP4 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x531 JUMPI POP DUP3 DUP12 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP13 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SSTORE PUSH2 0x27F JUMP JUMPDEST DUP5 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x4 DUP11 PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP4 MLOAD DUP3 EQ ISZERO PUSH2 0x211 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x5FC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x193 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH2 0x6A0 PUSH2 0xAE8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x776 JUMPI PUSH32 0xE8AB9CCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5FC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5FC JUMPI PUSH1 0x40 PUSH2 0x7DC PUSH2 0x986 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x5FC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x5FC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x5FC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x898 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x898 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x8EB DUP2 PUSH2 0x8C7 JUMP JUMPDEST SWAP4 PUSH2 0x8F9 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x5FC JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x91B JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x90F JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x93F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x5FC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x5FC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAD6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xADE JUMPI JUMPDEST PUSH2 0xAD6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA19 JUMPI JUMPDEST POP PUSH2 0x9E8 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5FC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA9B JUMPI JUMPDEST POP CODESIZE PUSH2 0x9DC JUMP JUMPDEST PUSH2 0xABD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xAC3 JUMPI JUMPDEST PUSH2 0xAB5 DUP2 DUP4 PUSH2 0x857 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x96E JUMP JUMPDEST CODESIZE PUSH2 0xA94 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xAAB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9CD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC04 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC09 JUMPI JUMPDEST PUSH2 0xC04 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB73 JUMPI JUMPDEST POP PUSH2 0xB70 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xACA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE5 JUMPI JUMPDEST POP CODESIZE PUSH2 0xB66 JUMP JUMPDEST PUSH2 0xBFE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xAC3 JUMPI PUSH2 0xAB5 DUP2 DUP4 PUSH2 0x857 JUMP JUMPDEST CODESIZE PUSH2 0xBDE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB2F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 JUMP JUMPI DUP2 0xB1 SMOD LOG2 DUPN 0x61 0xD 0xED SWAP12 EXTDELEGATECALL PUSH24 0xBFA0706D0FAC3D847A6133465A4C9B9DA30664736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"292:267:116:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:41:216;;:::i;:::-;974:8:208;;;292:267:116;;;;;;;;;;;;;;;;3741:25:41;3737:66;;974:8:208;;;:::i;:::-;292:267:116;974:8:208;292:267:116;;974:8:208;;;:::i;:::-;;;;292:267:116;974:8:208;;;;;;;292:267:116;;974:8:208;;;;;;;;;;;292:267:116;;;;974:8:208;;292:267:116;;;;;974:8:208;;:::i;:::-;292:267:116;;974:8:208;;:::i;:::-;;292:267:116;;;;;;;;;974:8:208;292:267:116;;;;;;974:8:208;;;:::i;:::-;;;;292:267:116;974:8:208;;;292:267:116;;;;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;11717:9;;974:8:208;;;11717:9:228;11728:10;;;;;;292:267:116;;;11740:3:228;974:8:208;11778:13:228;;;;:::i;:::-;292:267:116;974:8:208;11793:6:228;;;;:::i;:::-;292:267:116;11801:9:228;;;;:::i;:::-;292:267:116;8152:16:228;;;8148:55;;17957:10;17953:320;;11740:3;292:267:116;;;8258:49:228;292:267:116;;;;;;;;;;;8258:49:228;376:58:354;;8318:110:228;;11740:3;;;;762:1:41;292:267:116;11717:9:228;;8318:110;292:267:116;;;19356:74:228;;;292:267:116;19356:74:228;;292:267:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19356:74:228;;;;;;;;;;;;;;;292:267:116;;;;;;19356:101:228;19352:168;8318:110;19352:168;19478:42;;;292:267:116;;;;;;;19478:42:228;;19356:74;;;292:267:116;19356:74:228;;;;;;;;;292:267:116;19356:74:228;;;:::i;:::-;;;292:267:116;;;;;;;;;;;;;19356:74:228;;292:267:116;;;;19356:74:228;;;-1:-1:-1;19356:74:228;;;292:267:116;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;292:267:116;;-1:-1:-1;292:267:116;;;17953:320:228;292:267:116;;;;;;;;;974:8:208;;;292:267:116;;;;;;;;;;;18123:21:228;;;;;18119:80;;292:267:116;;;;;;;;;;974:8:208;;;292:267:116;;;;;;;;17953:320:228;;18119:80;292:267:116;;;18153:46:228;292:267:116;;;18153:46:228;;;;292:267:116;18153:46:228;;292:267:116;;;;;;;;;;;;;18153:46:228;8148:55;292:267:116;8177:26:228;;;;;11616:86;292:267:116;11676:26:228;;;;;11620:47;292:267:116;;;11644:23:228;;;11620:47;;974:8:208;;;;;;;;;;;;292:267:116;974:8:208;;;;;;;;292:267:116;974:8:208;;3737:66:41;974:8:208;3775:28:41;;292:267:116;3775:28:41;292:267:116;;;974:8:208;292:267:116;;;;3775:28:41;292:267:116;;;;;;;;;;;1633:41:216;;:::i;:::-;974:8:208;292:267:116;;;974:8:208;;;3174:18:180;;;3170:53;;2860:37:228;292:267:116;500:10:59;292:267:116;500:10:59;;;;;;;636:1:180;500:10:59;;;292:267:116;3170:53:180;3201:22;292:267:116;3201:22:180;292:267:116;;;;3201:22:180;292:267:116;;;;;;;;;;;;1868:39:216;;:::i;:::-;292:267:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;974:8:208:-;;292:267:116;;974:8:208;292:267:116;;974:8:208;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;974:8:208;;;;;-1:-1:-1;974:8:208;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;292:267:116;974:8:208;292:267:116;;974:8:208;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;292:267:116;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;974:8:208;2065:19:76;974:8:208;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;292:267:116;720:8:80;292:267:116;720:8:80;;292:267:116;;;;2115:1:76;2802:32;;:::o;2624:153::-;292:267:116;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;292:267:116;2361:10:76;292:267:116;;;;2771:4:76;292:267:116;;;;;-1:-1:-1;2682:95:76;;292:267:116;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;292:267:116;;;2115:1:76;292:267:116;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;974:8:208;1029:19:76;974:8:208;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;292:267:116;;;1676:74:76;;974:8:208;;;1676:74:76;;;292:267:116;1327:10:76;292:267:116;;;;1744:4:76;292:267:116;;;;;-1:-1:-1;1676:74:76;;292:267:116;;;;;;1676:74:76;;;;;;;292:267:116;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"629000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initERC1155DeliverableStorage()":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initERC1155DeliverableStorage()":"ba92ca2a","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC1155DeliverableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC1155DeliverableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}}},\"title\":\"ERC1155DeliverableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"initERC1155DeliverableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol\":\"ERC1155DeliverableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155DeliverableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155DeliverableFacet} from \\\"./../../../../token/ERC1155/facets/ERC1155DeliverableFacet.sol\\\";\\n\\n/// @title ERC1155DeliverableFacetMock\\ncontract ERC1155DeliverableFacetMock is ERC1155DeliverableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155DeliverableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd8d5fc9e75e53124a7d288a22c08d0f11fa97b72d2c90d8e14b9fbe92e61b918\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../base/ERC1155DeliverableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155DeliverableFacet is ERC1155DeliverableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155DeliverableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x62902659d29ea676a988f45b5b8c8ed16e1470b11f1b61e82809789371ff8458\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"initERC1155DeliverableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Deliverable."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol":{"ERC1155FacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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":"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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"initERC1155Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"initERC1155Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155FacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6115f038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d5760805260405161156790816100898239608051818181610fe801526114020152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610c735780632eb2c2d61461089c57806331e66e1e146108195780634e1273f41461065b578063a22cb46514610530578063c34106c8146103f6578063e985e9c5146103425763f242432a1461007357600080fd5b3461033d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576100aa610ce1565b6100b2610d04565b604435906064359260843567ffffffffffffffff811161033d576100da903690600401610d58565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861293610105610fd1565b73ffffffffffffffffffffffffffffffffffffffff83169586156103135761012e82878361110c565b156102c95773ffffffffffffffffffffffffffffffffffffffff916101578a8a878a879661118c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61019457005b6020926101a2913691610f54565b926101f860405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061138c565b03816000865af19081156102bd577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161028e575b50160361025b57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102b0915060203d6020116102b6575b6102a88183610e80565b810190611354565b38610252565b503d61029e565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d57610379610ce1565b73ffffffffffffffffffffffffffffffffffffffff610396610d04565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461033d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5761042d610fd1565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610503577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d57610567610ce1565b6024359081151580920361033d5773ffffffffffffffffffffffffffffffffffffffff80610593610fd1565b1691169181831461062d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5760043567ffffffffffffffff811161033d576106aa903690600401610d27565b9060243567ffffffffffffffff811161033d576106cb903690600401610d27565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036107ef576106fd85610ef0565b9461070b6040519687610e80565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061073882610ef0565b0136602088013760005b818110610763576040516020808252819061075f9082018a610d86565b0390f35b61076e818388610e33565b3573ffffffffffffffffffffffffffffffffffffffff8116810361033d576107a39061079b838689610e33565b359086610dba565b9087518110156107c05760019160208260051b8a01015201610742565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461033d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5760406108526113eb565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461033d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576108d3610ce1565b6108db610d04565b60443567ffffffffffffffff811161033d576108fb903690600401610d27565b929060643567ffffffffffffffff811161033d5761091d903690600401610d27565b9360843567ffffffffffffffff811161033d5761093e903690600401610d58565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129561096b610fd1565b73ffffffffffffffffffffffffffffffffffffffff831697881561031357898b036107ef5761099b82848361110c565b15610c295760005b8b8110610bfa575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610a1f60405192839260408452610a118d60408601908d610e43565b918483036020860152610e43565b0390a43b610a2957005b602094610a3e610a4692610a4e953691610f08565b993691610f08565b953691610f54565b92610afe60405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610ace610a9e60a485018b610d86565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610d86565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261138c565b03816000875af19081156102bd577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610bdb575b501603610b6157005b610bd790610ba76040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610d86565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610d86565b0390fd5b610bf4915060203d6020116102b6576102a88183610e80565b86610b58565b80610c238c610c198f94610c11816001978d610e33565b35928d610e33565b359088888761118c565b016109a3565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576020610cd9610caf610ce1565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610dba565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033d57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033d57565b9181601f8401121561033d5782359167ffffffffffffffff831161033d576020808501948460051b01011161033d57565b9181601f8401121561033d5782359167ffffffffffffffff831161033d576020838186019501011161033d57565b906020808351928381520192019060005b818110610da45750505090565b8251845260209384019390920191600101610d97565b909173ffffffffffffffffffffffffffffffffffffffff831615610e095760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156107c05760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161033d5760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ec157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ec15760051b60200190565b929190610f1481610ef0565b93610f226040519586610e80565b602085838152019160051b810192831161033d57905b828210610f4457505050565b8135815260209182019101610f38565b92919267ffffffffffffffff8211610ec15760405191610f9c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610e80565b82948184528183011161033d578281602093846000960137010152565b9081602091031261033d5751801515810361033d5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156110fd573233148015611102575b6110fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561105c575b5061105957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156102bd576000916110ce575b503861104f565b6110f0915060203d6020116110f6575b6110e88183610e80565b810190610fb9565b386110c7565b503d6110de565b503390565b5060183610611018565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611137575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611131565b9192908461119c575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156112f8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603611214575b50611195565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561129a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061120e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261033d57517fffffffff000000000000000000000000000000000000000000000000000000008116810361033d5790565b919082519283825260005b8481106113d65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611397565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561151f573233148015611527575b61151f5780331490811561147e575b5061144d576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161033d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156102bd57600091611500575b5038611441565b611519915060203d6020116110f6576110e88183610e80565b386114f9565b506000903690565b506018361061143256fea2646970667358221220b1f1b51cf83265e856d6d5274c6c3d79cc70f6e618c3bfa1f1c0608f066173f964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x15F0 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1567 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xFE8 ADD MSTORE PUSH2 0x1402 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x89C JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x819 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x65B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x530 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x3F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x342 JUMPI PUSH4 0xF242432A EQ PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0xAA PUSH2 0xCE1 JUMP JUMPDEST PUSH2 0xB2 PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0xDA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD58 JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x105 PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x313 JUMPI PUSH2 0x12E DUP3 DUP8 DUP4 PUSH2 0x110C JUMP JUMPDEST ISZERO PUSH2 0x2C9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x157 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x118C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x194 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1A2 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xF54 JUMP JUMPDEST SWAP3 PUSH2 0x1F8 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x138C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x28E JUMPI JUMPDEST POP AND SUB PUSH2 0x25B JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2B0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2B6 JUMPI JUMPDEST PUSH2 0x2A8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1354 JUMP JUMPDEST CODESIZE PUSH2 0x252 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x29E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x379 PUSH2 0xCE1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x396 PUSH2 0xD04 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x42D PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x503 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x567 PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x33D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x593 PUSH2 0xFD1 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x62D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x6AA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x6CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x7EF JUMPI PUSH2 0x6FD DUP6 PUSH2 0xEF0 JUMP JUMPDEST SWAP5 PUSH2 0x70B PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xE80 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x738 DUP3 PUSH2 0xEF0 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x763 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x75F SWAP1 DUP3 ADD DUP11 PUSH2 0xD86 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x76E DUP2 DUP4 DUP9 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x33D JUMPI PUSH2 0x7A3 SWAP1 PUSH2 0x79B DUP4 DUP7 DUP10 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xDBA JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x7C0 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x742 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x40 PUSH2 0x852 PUSH2 0x13EB JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x8D3 PUSH2 0xCE1 JUMP JUMPDEST PUSH2 0x8DB PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x8FB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x91D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x93E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD58 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x96B PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x313 JUMPI DUP10 DUP12 SUB PUSH2 0x7EF JUMPI PUSH2 0x99B DUP3 DUP5 DUP4 PUSH2 0x110C JUMP JUMPDEST ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xBFA JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xA1F PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xA11 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xE43 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xE43 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xA29 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xA3E PUSH2 0xA46 SWAP3 PUSH2 0xA4E SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF08 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xF08 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF54 JUMP JUMPDEST SWAP3 PUSH2 0xAFE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xACE PUSH2 0xA9E PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xD86 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xD86 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x138C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xBDB JUMPI JUMPDEST POP AND SUB PUSH2 0xB61 JUMPI STOP JUMPDEST PUSH2 0xBD7 SWAP1 PUSH2 0xBA7 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xD86 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xD86 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xBF4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2B6 JUMPI PUSH2 0x2A8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP7 PUSH2 0xB58 JUMP JUMPDEST DUP1 PUSH2 0xC23 DUP13 PUSH2 0xC19 DUP16 SWAP5 PUSH2 0xC11 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x118C JUMP JUMPDEST ADD PUSH2 0x9A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x20 PUSH2 0xCD9 PUSH2 0xCAF PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xDBA JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x33D JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x33D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x33D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xDA4 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD97 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xE09 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7C0 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xEC1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xEC1 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xF14 DUP2 PUSH2 0xEF0 JUMP JUMPDEST SWAP4 PUSH2 0xF22 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xE80 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x33D JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xF44 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF38 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEC1 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xF9C PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xE80 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x33D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x33D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x33D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x10FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1102 JUMPI JUMPDEST PUSH2 0x10FD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x105C JUMPI JUMPDEST POP PUSH2 0x1059 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x104F JUMP JUMPDEST PUSH2 0x10F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10F6 JUMPI JUMPDEST PUSH2 0x10E8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFB9 JUMP JUMPDEST CODESIZE PUSH2 0x10C7 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10DE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1018 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1137 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1131 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x119C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x12F8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1214 JUMPI JUMPDEST POP PUSH2 0x1195 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x129A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x120E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x33D JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x33D JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x13D6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1397 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x151F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1527 JUMPI JUMPDEST PUSH2 0x151F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x147E JUMPI JUMPDEST POP PUSH2 0x144D JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x33D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1500 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1441 JUMP JUMPDEST PUSH2 0x1519 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10F6 JUMPI PUSH2 0x10E8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST CODESIZE PUSH2 0x14F9 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1432 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 CALL 0xB5 SHR EXTCALL ORIGIN PUSH6 0xE856D6D5274C PUSH13 0x3D79CC70F6E618C3BFA1F1C060 DUP16 MOD PUSH2 0x73F9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:234:117:-:0;;;;;;;;;;;;;-1:-1:-1;;259:234:117;;;;-1:-1:-1;;;;;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;259:234:117;;;;;;745:39:76;;259:234:117;;;;;;;;745:39:76;259:234:117;;;;;;;;;;;;-1:-1:-1;259:234:117;;;;;;-1:-1:-1;259:234:117;;;;;-1:-1:-1;259:234:117"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3297,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3367,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":3848,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":3924,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":4025,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":4948,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":3416,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":3332,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":3462,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":3651,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":5004,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":3824,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":3635,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3712,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":3514,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_isOperatable":{"entryPoint":4364,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":5099,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":4049,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferToken":{"entryPoint":4492,"id":25299,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4072},{"length":32,"start":5122}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610c735780632eb2c2d61461089c57806331e66e1e146108195780634e1273f41461065b578063a22cb46514610530578063c34106c8146103f6578063e985e9c5146103425763f242432a1461007357600080fd5b3461033d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576100aa610ce1565b6100b2610d04565b604435906064359260843567ffffffffffffffff811161033d576100da903690600401610d58565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861293610105610fd1565b73ffffffffffffffffffffffffffffffffffffffff83169586156103135761012e82878361110c565b156102c95773ffffffffffffffffffffffffffffffffffffffff916101578a8a878a879661118c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61019457005b6020926101a2913691610f54565b926101f860405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061138c565b03816000865af19081156102bd577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161028e575b50160361025b57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102b0915060203d6020116102b6575b6102a88183610e80565b810190611354565b38610252565b503d61029e565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d57610379610ce1565b73ffffffffffffffffffffffffffffffffffffffff610396610d04565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461033d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5761042d610fd1565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610503577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d57610567610ce1565b6024359081151580920361033d5773ffffffffffffffffffffffffffffffffffffffff80610593610fd1565b1691169181831461062d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5760043567ffffffffffffffff811161033d576106aa903690600401610d27565b9060243567ffffffffffffffff811161033d576106cb903690600401610d27565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036107ef576106fd85610ef0565b9461070b6040519687610e80565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061073882610ef0565b0136602088013760005b818110610763576040516020808252819061075f9082018a610d86565b0390f35b61076e818388610e33565b3573ffffffffffffffffffffffffffffffffffffffff8116810361033d576107a39061079b838689610e33565b359086610dba565b9087518110156107c05760019160208260051b8a01015201610742565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461033d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d5760406108526113eb565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461033d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576108d3610ce1565b6108db610d04565b60443567ffffffffffffffff811161033d576108fb903690600401610d27565b929060643567ffffffffffffffff811161033d5761091d903690600401610d27565b9360843567ffffffffffffffff811161033d5761093e903690600401610d58565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129561096b610fd1565b73ffffffffffffffffffffffffffffffffffffffff831697881561031357898b036107ef5761099b82848361110c565b15610c295760005b8b8110610bfa575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610a1f60405192839260408452610a118d60408601908d610e43565b918483036020860152610e43565b0390a43b610a2957005b602094610a3e610a4692610a4e953691610f08565b993691610f08565b953691610f54565b92610afe60405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610ace610a9e60a485018b610d86565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610d86565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261138c565b03816000875af19081156102bd577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610bdb575b501603610b6157005b610bd790610ba76040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610d86565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610d86565b0390fd5b610bf4915060203d6020116102b6576102a88183610e80565b86610b58565b80610c238c610c198f94610c11816001978d610e33565b35928d610e33565b359088888761118c565b016109a3565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461033d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033d576020610cd9610caf610ce1565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610dba565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033d57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033d57565b9181601f8401121561033d5782359167ffffffffffffffff831161033d576020808501948460051b01011161033d57565b9181601f8401121561033d5782359167ffffffffffffffff831161033d576020838186019501011161033d57565b906020808351928381520192019060005b818110610da45750505090565b8251845260209384019390920191600101610d97565b909173ffffffffffffffffffffffffffffffffffffffff831615610e095760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156107c05760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161033d5760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ec157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ec15760051b60200190565b929190610f1481610ef0565b93610f226040519586610e80565b602085838152019160051b810192831161033d57905b828210610f4457505050565b8135815260209182019101610f38565b92919267ffffffffffffffff8211610ec15760405191610f9c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610e80565b82948184528183011161033d578281602093846000960137010152565b9081602091031261033d5751801515810361033d5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156110fd573233148015611102575b6110fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561105c575b5061105957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156102bd576000916110ce575b503861104f565b6110f0915060203d6020116110f6575b6110e88183610e80565b810190610fb9565b386110c7565b503d6110de565b503390565b5060183610611018565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611137575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611131565b9192908461119c575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156112f8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603611214575b50611195565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561129a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061120e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261033d57517fffffffff000000000000000000000000000000000000000000000000000000008116810361033d5790565b919082519283825260005b8481106113d65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611397565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561151f573233148015611527575b61151f5780331490811561147e575b5061144d576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161033d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156102bd57600091611500575b5038611441565b611519915060203d6020116110f6576110e88183610e80565b386114f9565b506000903690565b506018361061143256fea2646970667358221220b1f1b51cf83265e856d6d5274c6c3d79cc70f6e618c3bfa1f1c0608f066173f964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x89C JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x819 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x65B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x530 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x3F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x342 JUMPI PUSH4 0xF242432A EQ PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0xAA PUSH2 0xCE1 JUMP JUMPDEST PUSH2 0xB2 PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0xDA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD58 JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x105 PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x313 JUMPI PUSH2 0x12E DUP3 DUP8 DUP4 PUSH2 0x110C JUMP JUMPDEST ISZERO PUSH2 0x2C9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x157 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x118C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x194 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1A2 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xF54 JUMP JUMPDEST SWAP3 PUSH2 0x1F8 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x138C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x28E JUMPI JUMPDEST POP AND SUB PUSH2 0x25B JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2B0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2B6 JUMPI JUMPDEST PUSH2 0x2A8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1354 JUMP JUMPDEST CODESIZE PUSH2 0x252 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x29E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x379 PUSH2 0xCE1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x396 PUSH2 0xD04 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x42D PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x503 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x567 PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x33D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x593 PUSH2 0xFD1 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x62D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x6AA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x6CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x7EF JUMPI PUSH2 0x6FD DUP6 PUSH2 0xEF0 JUMP JUMPDEST SWAP5 PUSH2 0x70B PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xE80 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x738 DUP3 PUSH2 0xEF0 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x763 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x75F SWAP1 DUP3 ADD DUP11 PUSH2 0xD86 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x76E DUP2 DUP4 DUP9 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x33D JUMPI PUSH2 0x7A3 SWAP1 PUSH2 0x79B DUP4 DUP7 DUP10 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xDBA JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x7C0 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x742 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x40 PUSH2 0x852 PUSH2 0x13EB JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH2 0x8D3 PUSH2 0xCE1 JUMP JUMPDEST PUSH2 0x8DB PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x8FB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x91D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD27 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33D JUMPI PUSH2 0x93E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD58 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x96B PUSH2 0xFD1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x313 JUMPI DUP10 DUP12 SUB PUSH2 0x7EF JUMPI PUSH2 0x99B DUP3 DUP5 DUP4 PUSH2 0x110C JUMP JUMPDEST ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xBFA JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xA1F PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xA11 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xE43 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xE43 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xA29 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xA3E PUSH2 0xA46 SWAP3 PUSH2 0xA4E SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF08 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xF08 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF54 JUMP JUMPDEST SWAP3 PUSH2 0xAFE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xACE PUSH2 0xA9E PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xD86 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xD86 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x138C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xBDB JUMPI JUMPDEST POP AND SUB PUSH2 0xB61 JUMPI STOP JUMPDEST PUSH2 0xBD7 SWAP1 PUSH2 0xBA7 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xD86 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xD86 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xBF4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2B6 JUMPI PUSH2 0x2A8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP7 PUSH2 0xB58 JUMP JUMPDEST DUP1 PUSH2 0xC23 DUP13 PUSH2 0xC19 DUP16 SWAP5 PUSH2 0xC11 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xE33 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x118C JUMP JUMPDEST ADD PUSH2 0x9A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x33D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x33D JUMPI PUSH1 0x20 PUSH2 0xCD9 PUSH2 0xCAF PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xDBA JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x33D JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x33D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x33D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x33D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xDA4 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD97 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xE09 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7C0 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x33D JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xEC1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xEC1 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xF14 DUP2 PUSH2 0xEF0 JUMP JUMPDEST SWAP4 PUSH2 0xF22 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xE80 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x33D JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xF44 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF38 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEC1 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xF9C PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xE80 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x33D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x33D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x33D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x10FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1102 JUMPI JUMPDEST PUSH2 0x10FD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x105C JUMPI JUMPDEST POP PUSH2 0x1059 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x104F JUMP JUMPDEST PUSH2 0x10F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10F6 JUMPI JUMPDEST PUSH2 0x10E8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFB9 JUMP JUMPDEST CODESIZE PUSH2 0x10C7 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10DE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1018 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1137 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1131 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x119C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x12F8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1214 JUMPI JUMPDEST POP PUSH2 0x1195 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x129A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x120E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x33D JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x33D JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x13D6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1397 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x151F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1527 JUMPI JUMPDEST PUSH2 0x151F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x147E JUMPI JUMPDEST POP PUSH2 0x144D JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x33D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2BD JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1500 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1441 JUMP JUMPDEST PUSH2 0x1519 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10F6 JUMPI PUSH2 0x10E8 DUP2 DUP4 PUSH2 0xE80 JUMP JUMPDEST CODESIZE PUSH2 0x14F9 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1432 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 CALL 0xB5 SHR EXTCALL ORIGIN PUSH6 0xE856D6D5274C PUSH13 0x3D79CC70F6E618C3BFA1F1C060 DUP16 MOD PUSH2 0x73F9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:234:117:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;259:234:117;1516:41:217;;;:::i;:::-;259:234:117;;;4536:16:228;;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;259:234:117;4720:5:228;;;;;;;;;:::i;:::-;259:234:117;;;;;;;4742:43:228;259:234:117;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;259:234:117;4796:104:228;259:234:117;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;259:234:117;19356:74:228;;259:234:117;19356:74:228;;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;259:234:117;19356:74:228;;;;;;;;259:234:117;19356:74:228;259:234:117;19356:74:228;259:234:117;19356:74:228;;;4796:104;259:234:117;;19356:101:228;19352:168;;259:234:117;19352:168:228;19478:42;259:234:117;19478:42:228;259:234:117;;;;;;;;19478:42:228;19356:74;;;;259:234:117;19356:74:228;259:234:117;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;259:234:117;;;;;;;;;4601:76:228;259:234:117;4645:32:228;;;;259:234:117;4645:32:228;259:234:117;;;;;;;;4645:32:228;4532:59;4561:30;259:234:117;4561:30:228;259:234:117;;4561:30:228;259:234:117;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;259:234:117;-1:-1:-1;259:234:117;14847:11:228;259:234:117;;;;-1:-1:-1;259:234:117;14847:28:228;259:234:117;-1:-1:-1;259:234:117;;;;;;-1:-1:-1;259:234:117;;;;;;;;;;;;;;;;;;;;;;1516:41:217;;:::i;:::-;259:234:117;;;;;;;3174:18:180;;;3170:53;;2109:26:228;259:234:117;500:10:59;259:234:117;500:10:59;;;259:234:117;;;;636:1:180;259:234:117;;;;3170:53:180;3201:22;259:234:117;3201:22:180;259:234:117;;;;3201:22:180;259:234:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1516:41:217;;;:::i;:::-;259:234:117;;;14276:18:228;;;;14272:64;;259:234:117;14401:42:228;14346:19;259:234:117;-1:-1:-1;259:234:117;14346:11:228;259:234:117;;;-1:-1:-1;259:234:117;;-1:-1:-1;259:234:117;;;;-1:-1:-1;259:234:117;;;;;;;;;;;;;;;;14401:42:228;259:234:117;14272:64:228;14303:33;;259:234:117;14303:33:228;259:234:117;;;;14303:33:228;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;16129:20:228;;;;16125:59;;259:234:117;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;259:234:117;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;259:234:117;;;;;;;;16306:30:228;16329:6;;;;;;:::i;:::-;259:234:117;16306:30:228;;;:::i;:::-;259:234:117;;;;;;;;;;;;;;;;;;;16250:9:228;;259:234:117;;;;;;;;;;16125:59:228;16158:26;259:234:117;16158:26:228;259:234:117;;16158:26:228;259:234:117;;;;;;;;;;;;1751:39:217;;:::i;:::-;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;259:234:117;1516:41:217;;;:::i;:::-;259:234:117;;;6523:16:228;;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;259:234:117;6801:10:228;;;;;;259:234:117;;;;;;;;;;6904:44:228;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;259:234:117;6959:111:228;259:234:117;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;259:234:117;20263:81:228;;259:234:117;20263:81:228;;259:234:117;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;259:234:117;20263:81:228;;;;;;;;259:234:117;20263:81:228;259:234:117;20263:81:228;259:234:117;20263:81:228;;;6959:111;259:234:117;;20263:107:228;20259:181;;259:234:117;20259:181:228;1878:53;259:234:117;1878:53:228;259:234:117;;20391:49:228;;;;;;259:234:117;20391:49:228;;259:234:117;;;1878:53:228;;;259:234:117;1878:53:228;;;;:::i;:::-;;259:234:117;1878:53:228;;;;259:234:117;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;259:234:117;20263:81:228;259:234:117;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;259:234:117;6860:6:228;;;:::i;:::-;259:234:117;6868:9:228;;;:::i;:::-;259:234:117;6868:9:228;;;;;:::i;:::-;259:234:117;6790:9:228;;6698:76;259:234:117;6742:32:228;;;;259:234:117;6742:32:228;259:234:117;;;;;;;;6742:32:228;259:234:117;;;;;;;;;;;;1730:44:206;259:234:117;;:::i;:::-;;;;;1730:44:206;:::i;:::-;259:234:117;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;259:234:117;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;15240:220:228;;;259:234:117;;;15358:19:228;15354:61;;15375:1;259:234:117;;;;;15375:1:228;259:234:117;15432:21:228;259:234:117;-1:-1:-1;259:234:117;;;;-1:-1:-1;259:234:117;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;259:234:117;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;259:234:117;;;;;-1:-1:-1;259:234:117;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;259:234:117;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;259:234:117;1029:19:76;259:234:117;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;259:234:117;;;1676:74:76;;259:234:117;;;1676:74:76;;;259:234:117;1327:10:76;259:234:117;;;;1744:4:76;259:234:117;;;;;-1:-1:-1;1676:74:76;;259:234:117;;;;;;1676:74:76;;;;;;;259:234:117;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;16846:185:228;259:234:117;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;259:234:117;;-1:-1:-1;259:234:117;16997:11:228;259:234:117;;;;-1:-1:-1;259:234:117;16997:27:228;259:234:117;-1:-1:-1;259:234:117;;;;;-1:-1:-1;259:234:117;;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;259:234:117;17163:1:228;259:234:117;;;;;17163:1:228;259:234:117;;;;-1:-1:-1;259:234:117;;;;-1:-1:-1;259:234:117;;;;;;17330:29:228;;;;;17326:98;;259:234:117;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;259:234:117;17163:1:228;259:234:117;;;;;17163:1:228;259:234:117;;;;-1:-1:-1;259:234:117;;;;-1:-1:-1;259:234:117;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;259:234:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;259:234:117;;17640:48:228;;;259:234:117;;;17640:48:228;;;259:234:117;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;259:234:117;;17368:56:228;;;259:234:117;;;;;17368:56:228;;;259:234:117;;;;;;;;;;;;;;;;;;;20391:49:228;259:234:117;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;259:234:117;;;;;;;;;;;-1:-1:-1;259:234:117;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;1938:939:76;259:234:117;2065:19:76;259:234:117;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;259:234:117;720:8:80;259:234:117;720:8:80;;259:234:117;;;;2115:1:76;2802:32;;:::o;2624:153::-;259:234:117;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;259:234:117;2361:10:76;259:234:117;;;;2771:4:76;259:234:117;;;;;-1:-1:-1;2682:95:76;;259:234:117;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"1095800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","initERC1155Storage()":"infinite","isApprovedForAll(address,address)":"2651","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","initERC1155Storage()":"c34106c8","isApprovedForAll(address,address)":"e985e9c5","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\":\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"initERC1155Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"initERC1155Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155FacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"initERC1155Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol\":\"ERC1155FacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155FacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Facet} from \\\"./../../../../token/ERC1155/facets/ERC1155Facet.sol\\\";\\n\\n/// @title ERC1155FacetMock\\ncontract ERC1155FacetMock is ERC1155Facet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155Facet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x055cc08f6c94d18de4d6e8d3e1ac04a7ffad9e1ede24bb2488f65370db6df0de\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155Base} from \\\"./../base/ERC1155Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155Facet is ERC1155Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x01e1c09bd9a1b50ef61550582b437738d5ddc921d1510f2427e1305587083689\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"initERC1155Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol":{"ERC1155MetadataFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"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":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"}],"name":"initERC1155MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"initERC1155MetadataStorage(string,string,address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155MetadataFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61129038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d5760805260405161120790816100898239608051818181610f6701526110bd0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610c7c5780630e89341c14610acb578063162094c4146109fb57806331e66e1e146109ad578063345c14ad146103495780636706467b1461015557806395d89b41146100ea5763a0c76f621461007457600080fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b600080fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576101516101457f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e76565b60405191829182610cfa565b0390f35b346100e55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760043567ffffffffffffffff81116100e5576101a4903690600401610db1565b60243567ffffffffffffffff81116100e5576101c4903690600401610db1565b9182810361031f5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102f157916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301915b848110156102ef57818110156102c0578060051b9081850135848112156100e557850180359067ffffffffffffffff82116100e5576020019281360384136100e5576001937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916102b7604051928392602084528d0135956020840191610d72565b0390a201610235565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100e55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760043567ffffffffffffffff81116100e557610398903690600401610d44565b60243567ffffffffffffffff81116100e5576103b8903690600401610d44565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036100e5576103e46110a6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361098057507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf5854600181101561094e575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161081f5781906104b48454610de2565b601f81116108fb575b50600090601f83116001146108595760009261084e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161081f5761053f7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610de2565b601f811161079b575b506000601f82116001146106a057819293600092610695575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f0e89341c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590508380610561565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b868110610783575083600195961061074b575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556105b3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061071e565b9092602060018192868601358155019401910161070b565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610815575b601f0160051c01905b8181106108095750610548565b600081556001016107fc565b90915081906107f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905086806104d4565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106108e357509084600195949392106108ab575b505050811b019055610506565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905586808061089e565b91936020600181928787013581550195019201610888565b909150836000526020600020601f840160051c81019160208510610944575b90601f859493920160051c01905b81811061093557506104bd565b60008155849350600101610928565b909150819061091a565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576109e4610f50565b610151604051928392602084526020840191610d72565b346100e55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760243567ffffffffffffffff81116100e557610a4a903690600401610d44565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102f157610ac67f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191610d72565b0390a2005b346100e55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576044600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051928380927ff724dad700000000000000000000000000000000000000000000000000000000825230600483015260043560248301525afa908115610c7057600091610b8d575b604051806101518482610cfa565b3d8083833e610b9c8183610e35565b810190602081830312610c685780519067ffffffffffffffff8211610c6c570181601f82011215610c685780519267ffffffffffffffff8411610c3b5760405192610c0f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610e35565b84845260208584010111610c38575061015192610c329160208085019101610cd7565b90610b7f565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576101516101457f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e76565b60005b838110610cea5750506000910152565b8181015183820152602001610cda565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610d3d8151809281602088015260208888019101610cd7565b0116010190565b9181601f840112156100e55782359167ffffffffffffffff83116100e557602083818601950101116100e557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156100e55782359167ffffffffffffffff83116100e5576020808501948460051b0101116100e557565b90600182811c92168015610e2b575b6020831014610dfc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610df1565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761081f57604052565b9060405191826000825492610e8a84610de2565b8084529360018116908115610ef85750600114610eb1575b50610eaf92500383610e35565b565b90506000929192526020600020906000915b818310610edc575050906020610eaf9282010138610ea2565b6020919350806001915483858901015201910190918492610ec3565b60209350610eaf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610ea2565b908160209103126100e5575180151581036100e55790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561109457323314801561109c575b61109457803314908115610fe3575b50610fb2576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100e55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c7057600091611065575b5038610fa6565b611087915060203d60201161108d575b61107f8183610e35565b810190610f38565b3861105e565b503d611075565b506000903690565b5060183610610f97565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156111c25732331480156111c7575b6111c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611131575b5061112e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c70576000916111a3575b5038611124565b6111bc915060203d60201161108d5761107f8183610e35565b3861119c565b503390565b50601836106110ed56fea2646970667358221220737bbf320c2467f4412a888d3d7fc65af3d60c0cb5fc04489a3fe1c3e736f3d364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x1290 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1207 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xF67 ADD MSTORE PUSH2 0x10BD ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xC7C JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0xACB JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x9FB JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x9AD JUMPI DUP1 PUSH4 0x345C14AD EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xEA JUMPI PUSH4 0xA0C76F62 EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x151 PUSH2 0x145 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xCFA JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x1A4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDB1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x1C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDB1 JUMP JUMPDEST SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2F1 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP4 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2EF JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP6 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xE5 JUMPI DUP6 ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE5 JUMPI PUSH1 0x20 ADD SWAP3 DUP2 CALLDATASIZE SUB DUP5 SGT PUSH2 0xE5 JUMPI PUSH1 0x1 SWAP4 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH2 0x2B7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE DUP14 ADD CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x235 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x398 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x3B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xE5 JUMPI PUSH2 0x3E4 PUSH2 0x10A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x980 JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x94E JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x81F JUMPI DUP2 SWAP1 PUSH2 0x4B4 DUP5 SLOAD PUSH2 0xDE2 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x8FB JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x859 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x84E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x81F JUMPI PUSH2 0x53F PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xDE2 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x79B JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x6A0 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x695 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0xE89341C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x561 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x783 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x74B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x5B3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x71E JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x815 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x809 JUMPI POP PUSH2 0x548 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x7FC JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x7F3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP7 DUP1 PUSH2 0x4D4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x8E3 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x8AB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x506 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP7 DUP1 DUP1 PUSH2 0x89E JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x888 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x944 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x935 JUMPI POP PUSH2 0x4BD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x928 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x91A JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x9E4 PUSH2 0xF50 JUMP JUMPDEST PUSH2 0x151 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0xA4A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2F1 JUMPI PUSH2 0xAC6 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x44 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB8D JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x151 DUP5 DUP3 PUSH2 0xCFA JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xB9C DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC68 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6C JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC68 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xC3B JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0xC0F PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xE35 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC38 JUMPI POP PUSH2 0x151 SWAP3 PUSH2 0xC32 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xCD7 JUMP JUMPDEST SWAP1 PUSH2 0xB7F JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x151 PUSH2 0x145 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE76 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xCEA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCDA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xD3D DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xCD7 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xE5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE5 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xE5 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xE5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xE5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xE2B JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xDFC JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xDF1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x81F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE8A DUP5 PUSH2 0xDE2 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xEF8 JUMPI POP PUSH1 0x1 EQ PUSH2 0xEB1 JUMPI JUMPDEST POP PUSH2 0xEAF SWAP3 POP SUB DUP4 PUSH2 0xE35 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xEDC JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xEAF SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xEA2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xEC3 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xEAF SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xEA2 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xE5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xE5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1094 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x109C JUMPI JUMPDEST PUSH2 0x1094 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xFE3 JUMPI JUMPDEST POP PUSH2 0xFB2 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xE5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1065 JUMPI JUMPDEST POP CODESIZE PUSH2 0xFA6 JUMP JUMPDEST PUSH2 0x1087 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x108D JUMPI JUMPDEST PUSH2 0x107F DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xF38 JUMP JUMPDEST CODESIZE PUSH2 0x105E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1075 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF97 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x11C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x11C7 JUMPI JUMPDEST PUSH2 0x11C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1131 JUMPI JUMPDEST POP PUSH2 0x112E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11A3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1124 JUMP JUMPDEST PUSH2 0x11BC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x108D JUMPI PUSH2 0x107F DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST CODESIZE PUSH2 0x119C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH20 0x7BBF320C2467F4412A888D3D7FC65AF3D60C0CB5 0xFC DIV BASEFEE SWAP11 EXTCODEHASH RJUMPI 0xC3E7 CALLDATASIZE RETURN 0xD3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"283:258:118:-:0;;;;;;;;;;;;;-1:-1:-1;;283:258:118;;;;-1:-1:-1;;;;;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;283:258:118;;;;;;745:39:76;;283:258:118;;;;;;;;745:39:76;283:258:118;;;;;;;;;;;;-1:-1:-1;283:258:118;;;;;;-1:-1:-1;283:258:118;;;;;-1:-1:-1;283:258:118"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3505,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":3896,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":3396,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":3442,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":3322,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":3702,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":3287,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":3554,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3637,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":3920,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":4262,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3943},{"length":32,"start":4285}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610c7c5780630e89341c14610acb578063162094c4146109fb57806331e66e1e146109ad578063345c14ad146103495780636706467b1461015557806395d89b41146100ea5763a0c76f621461007457600080fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b600080fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576101516101457f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e76565b60405191829182610cfa565b0390f35b346100e55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760043567ffffffffffffffff81116100e5576101a4903690600401610db1565b60243567ffffffffffffffff81116100e5576101c4903690600401610db1565b9182810361031f5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102f157916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301915b848110156102ef57818110156102c0578060051b9081850135848112156100e557850180359067ffffffffffffffff82116100e5576020019281360384136100e5576001937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916102b7604051928392602084528d0135956020840191610d72565b0390a201610235565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100e55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760043567ffffffffffffffff81116100e557610398903690600401610d44565b60243567ffffffffffffffff81116100e5576103b8903690600401610d44565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036100e5576103e46110a6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361098057507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf5854600181101561094e575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161081f5781906104b48454610de2565b601f81116108fb575b50600090601f83116001146108595760009261084e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161081f5761053f7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610de2565b601f811161079b575b506000601f82116001146106a057819293600092610695575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f0e89341c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590508380610561565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b868110610783575083600195961061074b575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556105b3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061071e565b9092602060018192868601358155019401910161070b565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610815575b601f0160051c01905b8181106108095750610548565b600081556001016107fc565b90915081906107f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905086806104d4565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106108e357509084600195949392106108ab575b505050811b019055610506565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905586808061089e565b91936020600181928787013581550195019201610888565b909150836000526020600020601f840160051c81019160208510610944575b90601f859493920160051c01905b81811061093557506104bd565b60008155849350600101610928565b909150819061091a565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576109e4610f50565b610151604051928392602084526020840191610d72565b346100e55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e55760243567ffffffffffffffff81116100e557610a4a903690600401610d44565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102f157610ac67f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191610d72565b0390a2005b346100e55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576044600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051928380927ff724dad700000000000000000000000000000000000000000000000000000000825230600483015260043560248301525afa908115610c7057600091610b8d575b604051806101518482610cfa565b3d8083833e610b9c8183610e35565b810190602081830312610c685780519067ffffffffffffffff8211610c6c570181601f82011215610c685780519267ffffffffffffffff8411610c3b5760405192610c0f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610e35565b84845260208584010111610c38575061015192610c329160208085019101610cd7565b90610b7f565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346100e55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e5576101516101457f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e76565b60005b838110610cea5750506000910152565b8181015183820152602001610cda565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610d3d8151809281602088015260208888019101610cd7565b0116010190565b9181601f840112156100e55782359167ffffffffffffffff83116100e557602083818601950101116100e557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9181601f840112156100e55782359167ffffffffffffffff83116100e5576020808501948460051b0101116100e557565b90600182811c92168015610e2b575b6020831014610dfc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610df1565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761081f57604052565b9060405191826000825492610e8a84610de2565b8084529360018116908115610ef85750600114610eb1575b50610eaf92500383610e35565b565b90506000929192526020600020906000915b818310610edc575050906020610eaf9282010138610ea2565b6020919350806001915483858901015201910190918492610ec3565b60209350610eaf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610ea2565b908160209103126100e5575180151581036100e55790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561109457323314801561109c575b61109457803314908115610fe3575b50610fb2576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100e55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c7057600091611065575b5038610fa6565b611087915060203d60201161108d575b61107f8183610e35565b810190610f38565b3861105e565b503d611075565b506000903690565b5060183610610f97565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156111c25732331480156111c7575b6111c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611131575b5061112e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c70576000916111a3575b5038611124565b6111bc915060203d60201161108d5761107f8183610e35565b3861119c565b503390565b50601836106110ed56fea2646970667358221220737bbf320c2467f4412a888d3d7fc65af3d60c0cb5fc04489a3fe1c3e736f3d364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xC7C JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0xACB JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x9FB JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x9AD JUMPI DUP1 PUSH4 0x345C14AD EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xEA JUMPI PUSH4 0xA0C76F62 EQ PUSH2 0x74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x151 PUSH2 0x145 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE76 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xCFA JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x1A4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDB1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x1C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDB1 JUMP JUMPDEST SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2F1 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP4 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2EF JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP6 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xE5 JUMPI DUP6 ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE5 JUMPI PUSH1 0x20 ADD SWAP3 DUP2 CALLDATASIZE SUB DUP5 SGT PUSH2 0xE5 JUMPI PUSH1 0x1 SWAP4 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH2 0x2B7 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE DUP14 ADD CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x235 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x398 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0x3B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xE5 JUMPI PUSH2 0x3E4 PUSH2 0x10A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x980 JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x94E JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x81F JUMPI DUP2 SWAP1 PUSH2 0x4B4 DUP5 SLOAD PUSH2 0xDE2 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x8FB JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x859 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x84E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x81F JUMPI PUSH2 0x53F PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xDE2 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x79B JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x6A0 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x695 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0xE89341C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x561 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x783 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x74B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x5B3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x71E JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x815 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x809 JUMPI POP PUSH2 0x548 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x7FC JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x7F3 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP7 DUP1 PUSH2 0x4D4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x8E3 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x8AB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x506 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP7 DUP1 DUP1 PUSH2 0x89E JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x888 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x944 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x935 JUMPI POP PUSH2 0x4BD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x928 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x91A JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x9E4 PUSH2 0xF50 JUMP JUMPDEST PUSH2 0x151 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE5 JUMPI PUSH2 0xA4A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD44 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2F1 JUMPI PUSH2 0xAC6 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0xD72 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH1 0x44 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB8D JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x151 DUP5 DUP3 PUSH2 0xCFA JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xB9C DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC68 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6C JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC68 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xC3B JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0xC0F PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xE35 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC38 JUMPI POP PUSH2 0x151 SWAP3 PUSH2 0xC32 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xCD7 JUMP JUMPDEST SWAP1 PUSH2 0xB7F JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE5 JUMPI PUSH2 0x151 PUSH2 0x145 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE76 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xCEA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCDA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xD3D DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xCD7 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xE5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE5 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xE5 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xE5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xE5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xE2B JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xDFC JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xDF1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x81F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE8A DUP5 PUSH2 0xDE2 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xEF8 JUMPI POP PUSH1 0x1 EQ PUSH2 0xEB1 JUMPI JUMPDEST POP PUSH2 0xEAF SWAP3 POP SUB DUP4 PUSH2 0xE35 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xEDC JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xEAF SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xEA2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xEC3 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xEAF SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xEA2 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xE5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xE5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1094 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x109C JUMPI JUMPDEST PUSH2 0x1094 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xFE3 JUMPI JUMPDEST POP PUSH2 0xFB2 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xE5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1065 JUMPI JUMPDEST POP CODESIZE PUSH2 0xFA6 JUMP JUMPDEST PUSH2 0x1087 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x108D JUMPI JUMPDEST PUSH2 0x107F DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xF38 JUMP JUMPDEST CODESIZE PUSH2 0x105E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1075 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF97 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x11C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x11C7 JUMPI JUMPDEST PUSH2 0x11C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1131 JUMPI JUMPDEST POP PUSH2 0x112E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC70 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11A3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1124 JUMP JUMPDEST PUSH2 0x11BC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x108D JUMPI PUSH2 0x107F DUP2 DUP4 PUSH2 0xE35 JUMP JUMPDEST CODESIZE PUSH2 0x119C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH20 0x7BBF320C2467F4412A888D3D7FC65AF3D60C0CB5 0xFC DIV BASEFEE SWAP11 EXTCODEHASH RJUMPI 0xC3E7 CALLDATASIZE RETURN 0xD3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"283:258:118:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2991:23:341;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;;2688:13:341;283:258:118;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2380:35:209;;;;2376:74;;283:258:118;2991:23:341;283:258:118;;2464:10:209;:71;2460:115;;2591:9;283:258:118;;;;;;;2586:102:209;2623:3;2602:19;;;;;;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;283:258:118;;;;;;;;;;;;;;;;;;;:::i;:::-;2647:30:209;;;283:258:118;2591:9:209;;283:258:118;;;;;;;;;;2602:19:209;283:258:118;2460:115:209;2544:31;283:258:118;2544:31:209;2464:10;283:258:118;;;;2544:31:209;2376:74;2424:26;283:258:118;2424:26:209;283:258:118;;2424:26:209;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2141:12:218;;:::i;:::-;283:258:118;;;;;;;3174:18:180;;;3170:53;;3529:19:341;283:258:118;;;;636:1:180;900:21:181;;;896:88;;283:258:118;636:1:180;283:258:118;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;283:258:118;583:77:341;283:258:118;583:77:341;;;;;;;;283:258:118;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;283:258:118;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;283:258:118;583:77:341;;;;;;;;;;283:258:118;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;2159:13;583:77;;;2196:23;583:77;;;2196:23;583:77;2355:37:228;283:258:118;500:10:59;283:258:118;;500:10:59;283:258:118;;500:10:59;636:1:180;500:10:59;;;;;;;283:258:118;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;283:258:118;;583:77:341;;;;283:258:118;;;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;283:258:118;636:1:180;583:77:341;;;;;;;;;;;;;;;;2159:13;283:258:118;;;583:77:341;;;;;;;;283:258:118;583:77:341;;;;;;;;;;;;;;;;;;;;;283:258:118;583:77:341;;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;283:258:118;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;283:258:118;;;;;;;583:77:341;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;283:258:118;636:1:180;583:77:341;;;;;;;;;;;;;;;;283:258:118;;;;;;;;;583:77:341;;;;;;;;283:258:118;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;283:258:118;583:77:341;;;;-1:-1:-1;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;896:88:181;930:54;283:258:118;930:54:181;283:258:118;;636:1:180;283:258:118;;;;930:54:181;3170:53:180;3201:22;283:258:118;3201:22:180;283:258:118;;;;3201:22:180;283:258:118;;;;;;;;;;;522:10;;:::i;:::-;283:258;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3529:19:341;283:258:118;2991:23:341;283:258:118;;1716:10:209;:71;1712:115;;283:258:118;1842:22:209;283:258:118;;;;;;;;;;;;;;;;;:::i;:::-;1842:22:209;;;283:258:118;;;;;;;;;;;;3364:64:341;283:258:118;;3364:23:341;283:258:118;;;;3364:64:341;;;;283:258:118;3364:64:341;;1306:4:209;283:258:118;3364:64:341;;283:258:118;;;;;;;3364:64:341;;;;;;;283:258:118;3364:64:341;;;283:258:118;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;283:258:118;;;;;;;;;;;;;;;;;;;;;3364:64:341;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;283:258:118;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;283:258:118;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;283:258:118;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;283:258:118;;;;;-1:-1:-1;283:258:118;;-1:-1:-1;283:258:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;283:258:118;2065:19:76;283:258:118;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;283:258:118;720:8:80;283:258:118;720:8:80;;283:258:118;;;;2115:1:76;2802:32;;:::o;2624:153::-;283:258:118;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;283:258:118;2361:10:76;283:258:118;;;;2771:4:76;283:258:118;;;;;-1:-1:-1;2682:95:76;;283:258:118;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;283:258:118;1029:19:76;283:258:118;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;283:258:118;;;1676:74:76;;283:258:118;;;1676:74:76;;;283:258:118;1327:10:76;283:258:118;;;;1744:4:76;283:258:118;;;;;-1:-1:-1;1676:74:76;;283:258:118;;;;;;1676:74:76;;;;;;;283:258:118;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"923000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","initERC1155MetadataStorage(string,string,address)":"infinite","metadataResolver()":"2404","name()":"infinite","setTokenURI(uint256,string)":"infinite","symbol()":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchSetTokenURI(uint256[],string[])":"6706467b","initERC1155MetadataStorage(string,string,address)":"345c14ad","metadataResolver()":"a0c76f62","name()":"06fdde03","setTokenURI(uint256,string)":"162094c4","symbol()":"95d89b41","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"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\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"}],\"name\":\"initERC1155MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"initERC1155MetadataStorage(string,string,address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155MetadataFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"initERC1155MetadataStorage(string,string,address)\":{\"notice\":\"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol\":\"ERC1155MetadataFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155MetadataFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155MetadataFacet} from \\\"./../../../../token/ERC1155/facets/ERC1155MetadataFacet.sol\\\";\\n\\n/// @title ERC1155MetadataFacetMock\\ncontract ERC1155MetadataFacetMock is ERC1155MetadataFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155MetadataFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x177cdc22c0b0a3e8d0b6daff2342c6847aa1c708b2b761fe63ec1faeec02bf01\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../base/ERC1155MetadataBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (facet version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC1155MetadataFacet is ERC1155MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the contract metadata.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    function initERC1155MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0xe3d3070f792deac4baa9b8e88e88f446748e44f91fa4ec923258305e2ab4b9fa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"initERC1155MetadataStorage(string,string,address)":{"notice":"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC1155MetadataURI."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol":{"ERC1155MintableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC1155MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"initERC1155MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}}},"title":"ERC1155MintableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61106f38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610fe690816100898239608051818181610bd20152610e810152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630d6a5bbb146104ff57806331e66e1e1461047c5780635cfa9297146101eb57806389511ecd146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576100e8610bbb565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101be577f5190c92c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ac5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576102226108bd565b6024356044359160643567ffffffffffffffff81116100ac57610249903690600401610911565b90916102aa610256610bbb565b93610281857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610a6a565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691610a05565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610452576102ea87878573ffffffffffffffffffffffffffffffffffffffff95610cf6565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61032657005b6103819160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190610e0b565b03816000865af1908115610446577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610417575b5016036103e457005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610439915060203d60201161043f575b610431818361093f565b810190610dd3565b866103db565b503d610427565b6040513d6000823e3d90fd5b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760406104b5610e6a565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100ac5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576105366108bd565b60243567ffffffffffffffff81116100ac576105569036906004016108e0565b909160443567ffffffffffffffff81116100ac576105789036906004016108e0565b93909160643567ffffffffffffffff81116100ac5761060c936105a2610614923690600401610911565b9590916106046105b0610bbb565b966105db887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610a6a565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916109af565b9836916109af565b943691610a05565b9173ffffffffffffffffffffffffffffffffffffffff821694851561045257865190855182036108935760005b8281106108695750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806106ae6106a08d6040840190610b6f565b82810360208401528b610b6f565b0390a43b6106b857005b61076d9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a0604484015261073d61070d60a485018b610b6f565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610b6f565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152610e0b565b03816000875af1908115610446577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161084a575b5016036107d057005b610846906108166040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610b6f565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610b6f565b0390fd5b610863915060203d60201161043f57610431818361093f565b866107c7565b8061088d6108796001938c610b2c565b51610884838b610b2c565b51908886610cf6565b01610641565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100ac57565b9181601f840112156100ac5782359167ffffffffffffffff83116100ac576020808501948460051b0101116100ac57565b9181601f840112156100ac5782359167ffffffffffffffff83116100ac57602083818601950101116100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761098057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9291909267ffffffffffffffff8411610980578360051b9060206040516109d88285018261093f565b80968152019181019283116100ac57905b8282106109f557505050565b81358152602091820191016109e9565b92919267ffffffffffffffff82116109805760405191610a4d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461093f565b8294818452818301116100ac578281602093846000960137010152565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610ac45750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015610b405760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906020808351928381520192019060005b818110610b8d5750505090565b8251845260209384019390920191600101610b80565b908160209103126100ac575180151581036100ac5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ce7573233148015610cec575b610ce7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c46575b50610c4357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561044657600091610cb8575b5038610c39565b610cda915060203d602011610ce0575b610cd2818361093f565b810190610ba3565b38610cb1565b503d610cc8565b503390565b5060183610610c02565b909183610d04575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115610d7a57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610cfe565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f42fb00bc000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b908160209103126100ac57517fffffffff00000000000000000000000000000000000000000000000000000000811681036100ac5790565b919082519283825260005b848110610e555750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e16565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610f9e573233148015610fa6575b610f9e57803314908115610efd575b50610ecc576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100ac5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561044657600091610f7f575b5038610ec0565b610f98915060203d602011610ce057610cd2818361093f565b38610f78565b506000903690565b5060183610610eb156fea26469706673582212207002abdb24b29b5f0450f8f353b50bdd48ec873f9f7f7b439747eb008bb116dc64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x106F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xFE6 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xBD2 ADD MSTORE PUSH2 0xE81 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x4FF JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x47C JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x89511ECD EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0xE8 PUSH2 0xBBB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1BE JUMPI PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x222 PUSH2 0x8BD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x249 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x911 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x2AA PUSH2 0x256 PUSH2 0xBBB JUMP JUMPDEST SWAP4 PUSH2 0x281 DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xA6A JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0xA05 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x452 JUMPI PUSH2 0x2EA DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0xCF6 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x326 JUMPI STOP JUMPDEST PUSH2 0x381 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0xE0B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x417 JUMPI JUMPDEST POP AND SUB PUSH2 0x3E4 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x439 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43F JUMPI JUMPDEST PUSH2 0x431 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xDD3 JUMP JUMPDEST DUP7 PUSH2 0x3DB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x427 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x40 PUSH2 0x4B5 PUSH2 0xE6A JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x536 PUSH2 0x8BD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x556 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8E0 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x578 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8E0 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x60C SWAP4 PUSH2 0x5A2 PUSH2 0x614 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x911 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x604 PUSH2 0x5B0 PUSH2 0xBBB JUMP JUMPDEST SWAP7 PUSH2 0x5DB DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xA6A JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x9AF JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x9AF JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0xA05 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x452 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x893 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x869 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x6AE PUSH2 0x6A0 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0xB6F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0xB6F JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x6B8 JUMPI STOP JUMPDEST PUSH2 0x76D SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x73D PUSH2 0x70D PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xB6F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xB6F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0xE0B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x84A JUMPI JUMPDEST POP AND SUB PUSH2 0x7D0 JUMPI STOP JUMPDEST PUSH2 0x846 SWAP1 PUSH2 0x816 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xB6F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xB6F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x863 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43F JUMPI PUSH2 0x431 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP7 PUSH2 0x7C7 JUMP JUMPDEST DUP1 PUSH2 0x88D PUSH2 0x879 PUSH1 0x1 SWAP4 DUP13 PUSH2 0xB2C JUMP JUMPDEST MLOAD PUSH2 0x884 DUP4 DUP12 PUSH2 0xB2C JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0xCF6 JUMP JUMPDEST ADD PUSH2 0x641 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x980 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x980 JUMPI DUP4 PUSH1 0x5 SHL SWAP1 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH2 0x9D8 DUP3 DUP6 ADD DUP3 PUSH2 0x93F JUMP JUMPDEST DUP1 SWAP7 DUP2 MSTORE ADD SWAP2 DUP2 ADD SWAP3 DUP4 GT PUSH2 0xAC JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x9F5 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9E9 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x980 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xA4D PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x93F JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xAC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xAC4 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xB40 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xB8D JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xB80 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCE7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCEC JUMPI JUMPDEST PUSH2 0xCE7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC46 JUMPI JUMPDEST POP PUSH2 0xC43 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB8 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC39 JUMP JUMPDEST PUSH2 0xCDA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE0 JUMPI JUMPDEST PUSH2 0xCD2 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xBA3 JUMP JUMPDEST CODESIZE PUSH2 0xCB1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCC8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC02 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0xD04 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0xD7A JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0xCFE JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xE55 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xE16 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xF9E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFA6 JUMPI JUMPDEST PUSH2 0xF9E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xEFD JUMPI JUMPDEST POP PUSH2 0xECC JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF7F JUMPI JUMPDEST POP CODESIZE PUSH2 0xEC0 JUMP JUMPDEST PUSH2 0xF98 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE0 JUMPI PUSH2 0xCD2 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST CODESIZE PUSH2 0xF78 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEB1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH17 0x2ABDB24B29B5F0450F8F353B50BDD48EC DUP8 EXTCODEHASH SWAP16 PUSH32 0x7B439747EB008BB116DC64736F6C634300081E00330000000000000000000000 ","sourceMap":"283:258:119:-:0;;;;;;;;;;;;;-1:-1:-1;;283:258:119;;;;-1:-1:-1;;;;;283:258:119;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;283:258:119;;;;;;745:39:76;;283:258:119;;;;;;;;745:39:76;283:258:119;;;;;;;;;;;;-1:-1:-1;283:258:119;;;;;;-1:-1:-1;283:258:119;;;;;-1:-1:-1;283:258:119"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2237,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":2272,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":2479,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":2565,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2979,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":3539,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":2321,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":2927,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":3595,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":2367,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2666,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mintToken":{"entryPoint":3318,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":3690,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3003,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_uint256_dyn":{"entryPoint":2860,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3026},{"length":32,"start":3713}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80630d6a5bbb146104ff57806331e66e1e1461047c5780635cfa9297146101eb57806389511ecd146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576100e8610bbb565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101be577f5190c92c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ac5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576102226108bd565b6024356044359160643567ffffffffffffffff81116100ac57610249903690600401610911565b90916102aa610256610bbb565b93610281857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610a6a565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691610a05565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610452576102ea87878573ffffffffffffffffffffffffffffffffffffffff95610cf6565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61032657005b6103819160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190610e0b565b03816000865af1908115610446577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610417575b5016036103e457005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610439915060203d60201161043f575b610431818361093f565b810190610dd3565b866103db565b503d610427565b6040513d6000823e3d90fd5b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760406104b5610e6a565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100ac5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576105366108bd565b60243567ffffffffffffffff81116100ac576105569036906004016108e0565b909160443567ffffffffffffffff81116100ac576105789036906004016108e0565b93909160643567ffffffffffffffff81116100ac5761060c936105a2610614923690600401610911565b9590916106046105b0610bbb565b966105db887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610a6a565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916109af565b9836916109af565b943691610a05565b9173ffffffffffffffffffffffffffffffffffffffff821694851561045257865190855182036108935760005b8281106108695750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806106ae6106a08d6040840190610b6f565b82810360208401528b610b6f565b0390a43b6106b857005b61076d9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a0604484015261073d61070d60a485018b610b6f565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610b6f565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152610e0b565b03816000875af1908115610446577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161084a575b5016036107d057005b610846906108166040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610b6f565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610b6f565b0390fd5b610863915060203d60201161043f57610431818361093f565b866107c7565b8061088d6108796001938c610b2c565b51610884838b610b2c565b51908886610cf6565b01610641565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100ac57565b9181601f840112156100ac5782359167ffffffffffffffff83116100ac576020808501948460051b0101116100ac57565b9181601f840112156100ac5782359167ffffffffffffffff83116100ac57602083818601950101116100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761098057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9291909267ffffffffffffffff8411610980578360051b9060206040516109d88285018261093f565b80968152019181019283116100ac57905b8282106109f557505050565b81358152602091820191016109e9565b92919267ffffffffffffffff82116109805760405191610a4d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461093f565b8294818452818301116100ac578281602093846000960137010152565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610ac45750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015610b405760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906020808351928381520192019060005b818110610b8d5750505090565b8251845260209384019390920191600101610b80565b908160209103126100ac575180151581036100ac5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ce7573233148015610cec575b610ce7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c46575b50610c4357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561044657600091610cb8575b5038610c39565b610cda915060203d602011610ce0575b610cd2818361093f565b810190610ba3565b38610cb1565b503d610cc8565b503390565b5060183610610c02565b909183610d04575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115610d7a57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610cfe565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f42fb00bc000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b908160209103126100ac57517fffffffff00000000000000000000000000000000000000000000000000000000811681036100ac5790565b919082519283825260005b848110610e555750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e16565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610f9e573233148015610fa6575b610f9e57803314908115610efd575b50610ecc576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100ac5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561044657600091610f7f575b5038610ec0565b610f98915060203d602011610ce057610cd2818361093f565b38610f78565b506000903690565b5060183610610eb156fea26469706673582212207002abdb24b29b5f0450f8f353b50bdd48ec873f9f7f7b439747eb008bb116dc64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x4FF JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x47C JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x89511ECD EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0xE8 PUSH2 0xBBB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1BE JUMPI PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x222 PUSH2 0x8BD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x249 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x911 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x2AA PUSH2 0x256 PUSH2 0xBBB JUMP JUMPDEST SWAP4 PUSH2 0x281 DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xA6A JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0xA05 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x452 JUMPI PUSH2 0x2EA DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0xCF6 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x326 JUMPI STOP JUMPDEST PUSH2 0x381 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0xE0B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x417 JUMPI JUMPDEST POP AND SUB PUSH2 0x3E4 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x439 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43F JUMPI JUMPDEST PUSH2 0x431 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xDD3 JUMP JUMPDEST DUP7 PUSH2 0x3DB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x427 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x40 PUSH2 0x4B5 PUSH2 0xE6A JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x536 PUSH2 0x8BD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x556 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8E0 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x578 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8E0 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x60C SWAP4 PUSH2 0x5A2 PUSH2 0x614 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x911 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x604 PUSH2 0x5B0 PUSH2 0xBBB JUMP JUMPDEST SWAP7 PUSH2 0x5DB DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xA6A JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x9AF JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x9AF JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0xA05 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x452 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x893 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x869 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x6AE PUSH2 0x6A0 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0xB6F JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0xB6F JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x6B8 JUMPI STOP JUMPDEST PUSH2 0x76D SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x73D PUSH2 0x70D PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xB6F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xB6F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0xE0B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x84A JUMPI JUMPDEST POP AND SUB PUSH2 0x7D0 JUMPI STOP JUMPDEST PUSH2 0x846 SWAP1 PUSH2 0x816 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xB6F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xB6F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x863 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43F JUMPI PUSH2 0x431 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP7 PUSH2 0x7C7 JUMP JUMPDEST DUP1 PUSH2 0x88D PUSH2 0x879 PUSH1 0x1 SWAP4 DUP13 PUSH2 0xB2C JUMP JUMPDEST MLOAD PUSH2 0x884 DUP4 DUP12 PUSH2 0xB2C JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0xCF6 JUMP JUMPDEST ADD PUSH2 0x641 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x980 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x980 JUMPI DUP4 PUSH1 0x5 SHL SWAP1 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH2 0x9D8 DUP3 DUP6 ADD DUP3 PUSH2 0x93F JUMP JUMPDEST DUP1 SWAP7 DUP2 MSTORE ADD SWAP2 DUP2 ADD SWAP3 DUP4 GT PUSH2 0xAC JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x9F5 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9E9 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x980 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xA4D PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x93F JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xAC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xAC4 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xB40 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xB8D JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xB80 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCE7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCEC JUMPI JUMPDEST PUSH2 0xCE7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC46 JUMPI JUMPDEST POP PUSH2 0xC43 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB8 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC39 JUMP JUMPDEST PUSH2 0xCDA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE0 JUMPI JUMPDEST PUSH2 0xCD2 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xBA3 JUMP JUMPDEST CODESIZE PUSH2 0xCB1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCC8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC02 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0xD04 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0xD7A JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0xCFE JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xE55 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xE16 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xF9E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFA6 JUMPI JUMPDEST PUSH2 0xF9E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xEFD JUMPI JUMPDEST POP PUSH2 0xECC JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x446 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF7F JUMPI JUMPDEST POP CODESIZE PUSH2 0xEC0 JUMP JUMPDEST PUSH2 0xF98 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE0 JUMPI PUSH2 0xCD2 DUP2 DUP4 PUSH2 0x93F JUMP JUMPDEST CODESIZE PUSH2 0xF78 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEB1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH17 0x2ABDB24B29B5F0450F8F353B50BDD48EC DUP8 EXTCODEHASH SWAP16 PUSH32 0x7B439747EB008BB116DC64736F6C634300081E00330000000000000000000000 ","sourceMap":"283:258:119:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1609:41:219;;:::i;:::-;283:258:119;;;;;;;3174:18:180;;;3170:53;;2606:34:228;283:258:119;500:10:59;283:258:119;500:10:59;;;;;;;636:1:180;500:10:59;;;283:258:119;3170:53:180;3201:22;283:258:119;3201:22:180;283:258:119;;;;3201:22:180;283:258:119;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;1609:41:219;;283:258:119;1609:41:219;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;283:258:119;1221:6:210;:::i;:::-;283:258:119;;;;;:::i;:::-;;;;;8152:16:228;;;8148:55;;8236:5;;;;283:258:119;8236:5:228;;:::i;:::-;283:258:119;;;;;8258:49:228;283:258:119;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;283:258:119;8318:110:228;283:258:119;;;;;;19356:74:228;;;;;283:258:119;19356:74:228;;283:258:119;19356:74:228;;283:258:119;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;283:258:119;19356:74:228;;;;;;;;283:258:119;19356:74:228;283:258:119;19356:74:228;283:258:119;19356:74:228;;;8318:110;283:258:119;;19356:101:228;19352:168;;283:258:119;19352:168:228;19478:42;283:258:119;19478:42:228;283:258:119;;;;;;;;19478:42:228;19356:74;;;;283:258:119;19356:74:228;283:258:119;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;283:258:119;;;;;;;;;8148:55:228;8177:26;283:258:119;8177:26:228;283:258:119;;8177:26:228;283:258:119;;;;;;;;;;;;1844:39:219;;:::i;:::-;283:258:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1609:41:219;;;283:258:119;1609:41:219;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;283:258:119;1669:6:210;:::i;:::-;283:258:119;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;283:258:119;;;;;9777:23:228;;9773:62;;283:258:119;9862:10:228;;;;;;283:258:119;;;;;;;;;9955:50:228;283:258:119;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;283:258:119;10016:117:228;283:258:119;;;;;;20263:81:228;;;;;283:258:119;20263:81:228;;283:258:119;20263:81:228;;283:258:119;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;283:258:119;20263:81:228;;;;;;;;283:258:119;20263:81:228;283:258:119;20263:81:228;283:258:119;20263:81:228;;;10016:117;283:258:119;;20263:107:228;20259:181;;283:258:119;20259:181:228;1878:53;283:258:119;1878:53:228;283:258:119;;20391:49:228;;;;;;283:258:119;20391:49:228;;283:258:119;;;1878:53:228;;;283:258:119;1878:53:228;;;;:::i;:::-;;283:258:119;1878:53:228;;;;283:258:119;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;283:258:119;20263:81:228;283:258:119;20263:81:228;;;;;;;:::i;:::-;;;;9874:3;9911:6;9919:9;9911:6;283:258:119;9911:6:228;;;:::i;:::-;283:258:119;9919:9:228;;;;:::i;:::-;283:258:119;9919:9:228;;;;:::i;:::-;283:258:119;9851:9:228;;9773:62;9809:26;283:258:119;9809:26:228;283:258:119;;9809:26:228;283:258:119;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;283:258:119;;;;;-1:-1:-1;283:258:119;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;283:258:119;;;;;;:::o;3640:170:41:-;283:258:119;-1:-1:-1;283:258:119;;;;-1:-1:-1;283:258:119;;;;-1:-1:-1;283:258:119;;;;;-1:-1:-1;283:258:119;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;283:258:119;3775:28:41;;-1:-1:-1;3775:28:41;283:258:119;3775:28:41;283:258:119;;;;;-1:-1:-1;3775:28:41;283:258:119;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;283:258:119;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;283:258:119;1029:19:76;283:258:119;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;283:258:119;;;1676:74:76;;283:258:119;;;1676:74:76;;;283:258:119;1327:10:76;283:258:119;;;;1744:4:76;283:258:119;;;;;-1:-1:-1;1676:74:76;;283:258:119;;;;;;1676:74:76;;;;;;;283:258:119;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;283:258:119;17966:1:228;283:258:119;;;;;17966:1:228;283:258:119;;;;-1:-1:-1;283:258:119;;;;-1:-1:-1;283:258:119;;;;;;18123:21:228;;;;;18119:80;;283:258:119;;17966:1:228;283:258:119;;;;;17966:1:228;283:258:119;18217:18:228;283:258:119;-1:-1:-1;283:258:119;;;;-1:-1:-1;283:258:119;;17953:320:228;;;;;;18119:80;18153:46;283:258:119;;;;;;;18153:46:228;;;;283:258:119;18153:46:228;;;283:258:119;;;;;;;;;;;;;18153:46:228;283:258:119;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;283:258:119;;;;;;;;;;;-1:-1:-1;283:258:119;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;1938:939:76;283:258:119;2065:19:76;283:258:119;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;283:258:119;720:8:80;283:258:119;720:8:80;;283:258:119;;;;2115:1:76;2802:32;;:::o;2624:153::-;283:258:119;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;283:258:119;2361:10:76;283:258:119;;;;2771:4:76;283:258:119;;;;;-1:-1:-1;2682:95:76;;283:258:119;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"814000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"229","__msgData()":"infinite","initERC1155MintableStorage()":"infinite","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","initERC1155MintableStorage()":"89511ecd","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeMint(address,uint256,uint256,bytes)":"5cfa9297"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC1155MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC1155MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}}},\"title\":\"ERC1155MintableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"initERC1155MintableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Mintable.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol\":\"ERC1155MintableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155MintableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155MintableFacet} from \\\"./../../../../token/ERC1155/facets/ERC1155MintableFacet.sol\\\";\\n\\n/// @title ERC1155MintableFacetMock\\ncontract ERC1155MintableFacetMock is ERC1155MintableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155MintableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xbccae9407857060567b49d27ff769aebc194a65d8dcb9c965477a4732e5cd8f2\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../base/ERC1155MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155MintableFacet is ERC1155MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x7c0148e6ed6ff8e8758116a533ee4cc9702bc587b2411543b961865cc268aac8\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"initERC1155MintableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Mintable."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."}},"version":1}}},"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol":{"ERC1155WithOperatorFiltererFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"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"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"initERC1155Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"initERC1155Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155FacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6117e038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051611757908161008982396080518181816110ed01526115f20152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610d785780632eb2c2d61461093957806331e66e1e146108b65780634e1273f4146106f8578063a22cb46514610598578063c34106c81461045e578063e985e9c5146103aa5763f242432a1461007357600080fd5b346103a55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576100aa610de6565b6100b2610e09565b604435906064359260843567ffffffffffffffff81116103a5576100da903690600401610e5d565b926100e36110d6565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610395575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561036b576101868287836112fc565b156103215773ffffffffffffffffffffffffffffffffffffffff916101af8a8a878a879661137c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6101ec57005b6020926101fa913691611059565b9261025060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061157c565b03816000865af1908115610315577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916102e6575b5016036102b357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610308915060203d60201161030e575b6103008183610f85565b810190611544565b386102aa565b503d6102f6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61039e91611211565b388561013a565b600080fd5b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576103e1610de6565b73ffffffffffffffffffffffffffffffffffffffff6103fe610e09565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576104956110d6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361056b577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576105cf610de6565b60243590811515918281036103a5576106c9575b73ffffffffffffffffffffffffffffffffffffffff806106016110d6565b1691169181831461069b5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6106f3817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30611211565b6105e3565b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a55760043567ffffffffffffffff81116103a557610747903690600401610e2c565b9060243567ffffffffffffffff81116103a557610768903690600401610e2c565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129080850361088c5761079a85610ff5565b946107a86040519687610f85565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06107d582610ff5565b0136602088013760005b81811061080057604051602080825281906107fc9082018a610e8b565b0390f35b61080b818388610f38565b3573ffffffffffffffffffffffffffffffffffffffff811681036103a55761084090610838838689610f38565b359086610ebf565b90875181101561085d5760019160208260051b8a010152016107df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346103a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a55760406108ef6115db565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103a55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a557610970610de6565b610978610e09565b60443567ffffffffffffffff81116103a557610998903690600401610e2c565b929060643567ffffffffffffffff81116103a5576109ba903690600401610e2c565b9360843567ffffffffffffffff81116103a5576109db903690600401610e5d565b9390916109e66110d6565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603610d68575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561036b57898b0361088c57610a908284836112fc565b15610d1e5760005b8b8110610cef575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610b1460405192839260408452610b068d60408601908d610f48565b918483036020860152610f48565b0390a43b610b1e57005b602094610b33610b3b92610b4395369161100d565b99369161100d565b953691611059565b92610bf360405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610bc3610b9360a485018b610e8b565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610e8b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261157c565b03816000875af1908115610315577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610cd0575b501603610c5657005b610ccc90610c9c6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e8b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610e8b565b0390fd5b610ce9915060203d60201161030e576103008183610f85565b86610c4d565b80610d188c610d0e8f94610d06816001978d610f38565b35928d610f38565b359088888761137c565b01610a98565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b610d7191611211565b8987610a3d565b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576020610dde610db4610de6565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610ebf565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103a557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103a557565b9181601f840112156103a55782359167ffffffffffffffff83116103a5576020808501948460051b0101116103a557565b9181601f840112156103a55782359167ffffffffffffffff83116103a557602083818601950101116103a557565b906020808351928381520192019060005b818110610ea95750505090565b8251845260209384019390920191600101610e9c565b909173ffffffffffffffffffffffffffffffffffffffff831615610f0e5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b919081101561085d5760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103a55760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610fc657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610fc65760051b60200190565b92919061101981610ff5565b936110276040519586610f85565b602085838152019160051b81019283116103a557905b82821061104957505050565b813581526020918201910161103d565b92919267ffffffffffffffff8211610fc657604051916110a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610f85565b8294818452818301116103a5578281602093846000960137010152565b908160209103126103a5575180151581036103a55790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611202573233148015611207575b611202577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611161575b5061115e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610315576000916111d3575b5038611154565b6111f5915060203d6020116111fb575b6111ed8183610f85565b8101906110be565b386111cc565b503d6111e3565b503390565b506018361061111d565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806112f2575b61123a575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610315576000916112d3575b50156112a65750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6112ec915060203d6020116111fb576111ed8183610f85565b3861129d565b50813b1515611232565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611327575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611321565b9192908461138c575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156114e8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603611404575b50611385565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561148a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806113fe565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b908160209103126103a557517fffffffff00000000000000000000000000000000000000000000000000000000811681036103a55790565b919082519283825260005b8481106115c65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611587565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561170f573233148015611717575b61170f5780331490811561166e575b5061163d576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103a55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610315576000916116f0575b5038611631565b611709915060203d6020116111fb576111ed8183610f85565b386116e9565b506000903690565b506018361061162256fea264697066735822122094f2bbef010086623efc36ef60dff7f4275fe6c05486911fbd38311bc3016c2764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x17E0 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1757 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x10ED ADD MSTORE PUSH2 0x15F2 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xD78 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x939 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x8B6 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x6F8 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x3AA JUMPI PUSH4 0xF242432A EQ PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0xAA PUSH2 0xDE6 JUMP JUMPDEST PUSH2 0xB2 PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0xDA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE5D JUMP JUMPDEST SWAP3 PUSH2 0xE3 PUSH2 0x10D6 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x395 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x36B JUMPI PUSH2 0x186 DUP3 DUP8 DUP4 PUSH2 0x12FC JUMP JUMPDEST ISZERO PUSH2 0x321 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x1AF DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x137C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x1EC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1FA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1059 JUMP JUMPDEST SWAP3 PUSH2 0x250 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x157C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2E6 JUMPI JUMPDEST POP AND SUB PUSH2 0x2B3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x308 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x30E JUMPI JUMPDEST PUSH2 0x300 DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1544 JUMP JUMPDEST CODESIZE PUSH2 0x2AA JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2F6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x39E SWAP2 PUSH2 0x1211 JUMP JUMPDEST CODESIZE DUP6 PUSH2 0x13A JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x3E1 PUSH2 0xDE6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3FE PUSH2 0xE09 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x495 PUSH2 0x10D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x56B JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x5CF PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x3A5 JUMPI PUSH2 0x6C9 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x601 PUSH2 0x10D6 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x69B JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F3 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x1211 JUMP JUMPDEST PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x747 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x768 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x88C JUMPI PUSH2 0x79A DUP6 PUSH2 0xFF5 JUMP JUMPDEST SWAP5 PUSH2 0x7A8 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xF85 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x7D5 DUP3 PUSH2 0xFF5 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x800 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x7FC SWAP1 DUP3 ADD DUP11 PUSH2 0xE8B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x80B DUP2 DUP4 DUP9 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x3A5 JUMPI PUSH2 0x840 SWAP1 PUSH2 0x838 DUP4 DUP7 DUP10 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xEBF JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x85D JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x7DF JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH2 0x8EF PUSH2 0x15DB JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x970 PUSH2 0xDE6 JUMP JUMPDEST PUSH2 0x978 PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x998 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x9BA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x9DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE5D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x9E6 PUSH2 0x10D6 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xD68 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x36B JUMPI DUP10 DUP12 SUB PUSH2 0x88C JUMPI PUSH2 0xA90 DUP3 DUP5 DUP4 PUSH2 0x12FC JUMP JUMPDEST ISZERO PUSH2 0xD1E JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xCEF JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xB14 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xB06 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xF48 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xF48 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xB1E JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xB33 PUSH2 0xB3B SWAP3 PUSH2 0xB43 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x100D JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x100D JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1059 JUMP JUMPDEST SWAP3 PUSH2 0xBF3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xBC3 PUSH2 0xB93 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xE8B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x157C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xCD0 JUMPI JUMPDEST POP AND SUB PUSH2 0xC56 JUMPI STOP JUMPDEST PUSH2 0xCCC SWAP1 PUSH2 0xC9C PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xE8B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xE8B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xCE9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x30E JUMPI PUSH2 0x300 DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP7 PUSH2 0xC4D JUMP JUMPDEST DUP1 PUSH2 0xD18 DUP13 PUSH2 0xD0E DUP16 SWAP5 PUSH2 0xD06 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x137C JUMP JUMPDEST ADD PUSH2 0xA98 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xD71 SWAP2 PUSH2 0x1211 JUMP JUMPDEST DUP10 DUP8 PUSH2 0xA3D JUMP JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x20 PUSH2 0xDDE PUSH2 0xDB4 PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xEBF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3A5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3A5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xEA9 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xE9C JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xF0E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x85D JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xFC6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xFC6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1019 DUP2 PUSH2 0xFF5 JUMP JUMPDEST SWAP4 PUSH2 0x1027 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xF85 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x3A5 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x1049 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x103D JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xFC6 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x10A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xF85 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x3A5 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x3A5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x3A5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1202 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1207 JUMPI JUMPDEST PUSH2 0x1202 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1161 JUMPI JUMPDEST POP PUSH2 0x115E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11D3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1154 JUMP JUMPDEST PUSH2 0x11F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI JUMPDEST PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x10BE JUMP JUMPDEST CODESIZE PUSH2 0x11CC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x11E3 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x111D JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x12F2 JUMPI JUMPDEST PUSH2 0x123A JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12D3 JUMPI JUMPDEST POP ISZERO PUSH2 0x12A6 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x12EC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST CODESIZE PUSH2 0x129D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x1232 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1327 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1321 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x138C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x14E8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1404 JUMPI JUMPDEST POP PUSH2 0x1385 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x148A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x3A5 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x3A5 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15C6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1587 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x170F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1717 JUMPI JUMPDEST PUSH2 0x170F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x166E JUMPI JUMPDEST POP PUSH2 0x163D JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x3A5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x16F0 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1631 JUMP JUMPDEST PUSH2 0x1709 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST CODESIZE PUSH2 0x16E9 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1622 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 CALLCODE 0xBB 0xEF ADD STOP DUP7 PUSH3 0x3EFC36 0xEF PUSH1 0xDF 0xF7 DELEGATECALL 0x27 PUSH0 DUPN 0xC0 SLOAD DUP7 SWAP2 0x1F 0xBD CODESIZE BALANCE SHL 0xC3 ADD PUSH13 0x2764736F6C634300081E003300 ","sourceMap":"299:294:120:-:0;;;;;;;;;;;;;-1:-1:-1;;299:294:120;;;;-1:-1:-1;;;;;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;299:294:120;;;;;;745:39:76;;299:294:120;;;;;;;;745:39:76;299:294:120;;;;;;;;;;;;-1:-1:-1;299:294:120;;;;;;-1:-1:-1;299:294:120;;;;;-1:-1:-1;299:294:120"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3558,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3628,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":4109,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":4185,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":4286,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":5444,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":3677,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":3593,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":3723,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":3912,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":5500,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":4085,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":3896,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3973,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":3775,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":4625,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":4860,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":5595,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":4310,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferToken":{"entryPoint":4988,"id":25299,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4333},{"length":32,"start":5618}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610d785780632eb2c2d61461093957806331e66e1e146108b65780634e1273f4146106f8578063a22cb46514610598578063c34106c81461045e578063e985e9c5146103aa5763f242432a1461007357600080fd5b346103a55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576100aa610de6565b6100b2610e09565b604435906064359260843567ffffffffffffffff81116103a5576100da903690600401610e5d565b926100e36110d6565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610395575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561036b576101868287836112fc565b156103215773ffffffffffffffffffffffffffffffffffffffff916101af8a8a878a879661137c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6101ec57005b6020926101fa913691611059565b9261025060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061157c565b03816000865af1908115610315577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916102e6575b5016036102b357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610308915060203d60201161030e575b6103008183610f85565b810190611544565b386102aa565b503d6102f6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61039e91611211565b388561013a565b600080fd5b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576103e1610de6565b73ffffffffffffffffffffffffffffffffffffffff6103fe610e09565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576104956110d6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361056b577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576105cf610de6565b60243590811515918281036103a5576106c9575b73ffffffffffffffffffffffffffffffffffffffff806106016110d6565b1691169181831461069b5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6106f3817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30611211565b6105e3565b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a55760043567ffffffffffffffff81116103a557610747903690600401610e2c565b9060243567ffffffffffffffff81116103a557610768903690600401610e2c565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129080850361088c5761079a85610ff5565b946107a86040519687610f85565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06107d582610ff5565b0136602088013760005b81811061080057604051602080825281906107fc9082018a610e8b565b0390f35b61080b818388610f38565b3573ffffffffffffffffffffffffffffffffffffffff811681036103a55761084090610838838689610f38565b359086610ebf565b90875181101561085d5760019160208260051b8a010152016107df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346103a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a55760406108ef6115db565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103a55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a557610970610de6565b610978610e09565b60443567ffffffffffffffff81116103a557610998903690600401610e2c565b929060643567ffffffffffffffff81116103a5576109ba903690600401610e2c565b9360843567ffffffffffffffff81116103a5576109db903690600401610e5d565b9390916109e66110d6565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603610d68575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561036b57898b0361088c57610a908284836112fc565b15610d1e5760005b8b8110610cef575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610b1460405192839260408452610b068d60408601908d610f48565b918483036020860152610f48565b0390a43b610b1e57005b602094610b33610b3b92610b4395369161100d565b99369161100d565b953691611059565b92610bf360405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610bc3610b9360a485018b610e8b565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610e8b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261157c565b03816000875af1908115610315577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610cd0575b501603610c5657005b610ccc90610c9c6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e8b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610e8b565b0390fd5b610ce9915060203d60201161030e576103008183610f85565b86610c4d565b80610d188c610d0e8f94610d06816001978d610f38565b35928d610f38565b359088888761137c565b01610a98565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b610d7191611211565b8987610a3d565b346103a55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103a5576020610dde610db4610de6565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610ebf565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103a557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103a557565b9181601f840112156103a55782359167ffffffffffffffff83116103a5576020808501948460051b0101116103a557565b9181601f840112156103a55782359167ffffffffffffffff83116103a557602083818601950101116103a557565b906020808351928381520192019060005b818110610ea95750505090565b8251845260209384019390920191600101610e9c565b909173ffffffffffffffffffffffffffffffffffffffff831615610f0e5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b919081101561085d5760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103a55760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610fc657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610fc65760051b60200190565b92919061101981610ff5565b936110276040519586610f85565b602085838152019160051b81019283116103a557905b82821061104957505050565b813581526020918201910161103d565b92919267ffffffffffffffff8211610fc657604051916110a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610f85565b8294818452818301116103a5578281602093846000960137010152565b908160209103126103a5575180151581036103a55790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611202573233148015611207575b611202577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611161575b5061115e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610315576000916111d3575b5038611154565b6111f5915060203d6020116111fb575b6111ed8183610f85565b8101906110be565b386111cc565b503d6111e3565b503390565b506018361061111d565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806112f2575b61123a575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610315576000916112d3575b50156112a65750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6112ec915060203d6020116111fb576111ed8183610f85565b3861129d565b50813b1515611232565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611327575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611321565b9192908461138c575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156114e8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603611404575b50611385565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561148a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806113fe565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b908160209103126103a557517fffffffff00000000000000000000000000000000000000000000000000000000811681036103a55790565b919082519283825260005b8481106115c65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611587565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561170f573233148015611717575b61170f5780331490811561166e575b5061163d576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103a55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610315576000916116f0575b5038611631565b611709915060203d6020116111fb576111ed8183610f85565b386116e9565b506000903690565b506018361061162256fea264697066735822122094f2bbef010086623efc36ef60dff7f4275fe6c05486911fbd38311bc3016c2764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xD78 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x939 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x8B6 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x6F8 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x598 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x3AA JUMPI PUSH4 0xF242432A EQ PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0xAA PUSH2 0xDE6 JUMP JUMPDEST PUSH2 0xB2 PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0xDA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE5D JUMP JUMPDEST SWAP3 PUSH2 0xE3 PUSH2 0x10D6 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x395 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x36B JUMPI PUSH2 0x186 DUP3 DUP8 DUP4 PUSH2 0x12FC JUMP JUMPDEST ISZERO PUSH2 0x321 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x1AF DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x137C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x1EC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1FA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1059 JUMP JUMPDEST SWAP3 PUSH2 0x250 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x157C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2E6 JUMPI JUMPDEST POP AND SUB PUSH2 0x2B3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x308 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x30E JUMPI JUMPDEST PUSH2 0x300 DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1544 JUMP JUMPDEST CODESIZE PUSH2 0x2AA JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2F6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x39E SWAP2 PUSH2 0x1211 JUMP JUMPDEST CODESIZE DUP6 PUSH2 0x13A JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x3E1 PUSH2 0xDE6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3FE PUSH2 0xE09 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x495 PUSH2 0x10D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x56B JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x5CF PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x3A5 JUMPI PUSH2 0x6C9 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x601 PUSH2 0x10D6 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x69B JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F3 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x1211 JUMP JUMPDEST PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x747 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x768 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x88C JUMPI PUSH2 0x79A DUP6 PUSH2 0xFF5 JUMP JUMPDEST SWAP5 PUSH2 0x7A8 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xF85 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x7D5 DUP3 PUSH2 0xFF5 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x800 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x7FC SWAP1 DUP3 ADD DUP11 PUSH2 0xE8B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x80B DUP2 DUP4 DUP9 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x3A5 JUMPI PUSH2 0x840 SWAP1 PUSH2 0x838 DUP4 DUP7 DUP10 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xEBF JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x85D JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x7DF JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH2 0x8EF PUSH2 0x15DB JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH2 0x970 PUSH2 0xDE6 JUMP JUMPDEST PUSH2 0x978 PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x998 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x9BA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE2C JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A5 JUMPI PUSH2 0x9DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xE5D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x9E6 PUSH2 0x10D6 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xD68 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x36B JUMPI DUP10 DUP12 SUB PUSH2 0x88C JUMPI PUSH2 0xA90 DUP3 DUP5 DUP4 PUSH2 0x12FC JUMP JUMPDEST ISZERO PUSH2 0xD1E JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xCEF JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xB14 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xB06 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xF48 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xF48 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xB1E JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xB33 PUSH2 0xB3B SWAP3 PUSH2 0xB43 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x100D JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x100D JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1059 JUMP JUMPDEST SWAP3 PUSH2 0xBF3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xBC3 PUSH2 0xB93 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xE8B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xE8B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x157C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xCD0 JUMPI JUMPDEST POP AND SUB PUSH2 0xC56 JUMPI STOP JUMPDEST PUSH2 0xCCC SWAP1 PUSH2 0xC9C PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xE8B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xE8B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xCE9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x30E JUMPI PUSH2 0x300 DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP7 PUSH2 0xC4D JUMP JUMPDEST DUP1 PUSH2 0xD18 DUP13 PUSH2 0xD0E DUP16 SWAP5 PUSH2 0xD06 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xF38 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x137C JUMP JUMPDEST ADD PUSH2 0xA98 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xD71 SWAP2 PUSH2 0x1211 JUMP JUMPDEST DUP10 DUP8 PUSH2 0xA3D JUMP JUMPDEST CALLVALUE PUSH2 0x3A5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x3A5 JUMPI PUSH1 0x20 PUSH2 0xDDE PUSH2 0xDB4 PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xEBF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3A5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x3A5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x3A5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xEA9 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xE9C JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xF0E JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x85D JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x3A5 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xFC6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xFC6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1019 DUP2 PUSH2 0xFF5 JUMP JUMPDEST SWAP4 PUSH2 0x1027 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xF85 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x3A5 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x1049 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x103D JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xFC6 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x10A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xF85 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x3A5 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x3A5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x3A5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1202 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1207 JUMPI JUMPDEST PUSH2 0x1202 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1161 JUMPI JUMPDEST POP PUSH2 0x115E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11D3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1154 JUMP JUMPDEST PUSH2 0x11F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI JUMPDEST PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x10BE JUMP JUMPDEST CODESIZE PUSH2 0x11CC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x11E3 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x111D JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x12F2 JUMPI JUMPDEST PUSH2 0x123A JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12D3 JUMPI JUMPDEST POP ISZERO PUSH2 0x12A6 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x12EC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST CODESIZE PUSH2 0x129D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x1232 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1327 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1321 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x138C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x14E8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1404 JUMPI JUMPDEST POP PUSH2 0x1385 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x148A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x3A5 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x3A5 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15C6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1587 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x170F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1717 JUMPI JUMPDEST PUSH2 0x170F JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x166E JUMPI JUMPDEST POP PUSH2 0x163D JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x3A5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x16F0 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1631 JUMP JUMPDEST PUSH2 0x1709 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11FB JUMPI PUSH2 0x11ED DUP2 DUP4 PUSH2 0xF85 JUMP JUMPDEST CODESIZE PUSH2 0x16E9 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1622 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 CALLCODE 0xBB 0xEF ADD STOP DUP7 PUSH3 0x3EFC36 0xEF PUSH1 0xDF 0xF7 DELEGATECALL 0x27 PUSH0 DUPN 0xC0 SLOAD DUP7 SWAP2 0x1F 0xBD CODESIZE BALANCE SHL 0xC3 ADD PUSH13 0x2764736F6C634300081E003300 ","sourceMap":"299:294:120:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1643:41:220;;;:::i;:::-;3179:19:352;299:294:120;;;;;;;;2616:14:352;2612:76;;299:294:120;-1:-1:-1;;299:294:120;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;299:294:120;4720:5:228;;;;;;;;;:::i;:::-;299:294:120;;;;;;;4742:43:228;299:294:120;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;299:294:120;4796:104:228;299:294:120;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;299:294:120;19356:74:228;;299:294:120;19356:74:228;;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;299:294:120;19356:74:228;;;;;;;;299:294:120;19356:74:228;299:294:120;19356:74:228;299:294:120;19356:74:228;;;4796:104;299:294:120;;19356:101:228;19352:168;;299:294:120;19352:168:228;19478:42;299:294:120;19478:42:228;299:294:120;;;;;;;;19478:42:228;19356:74;;;;299:294:120;19356:74:228;299:294:120;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;299:294:120;;;;;;;;;4601:76:228;299:294:120;4645:32:228;;;;299:294:120;4645:32:228;299:294:120;;;;;;;;4645:32:228;4532:59;4561:30;299:294:120;4561:30:228;299:294:120;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;299:294:120;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;299:294:120;-1:-1:-1;299:294:120;14847:11:228;299:294:120;;;;-1:-1:-1;299:294:120;14847:28:228;299:294:120;-1:-1:-1;299:294:120;;;;;;-1:-1:-1;299:294:120;;;;;;;;;;;;;;;;;;;;;;1643:41:220;;:::i;:::-;299:294:120;;;;;;;3174:18:180;;;3170:53;;2109:26:228;299:294:120;500:10:59;299:294:120;500:10:59;;;299:294:120;;;;636:1:180;299:294:120;;;;3170:53:180;3201:22;299:294:120;3201:22:180;299:294:120;;;;3201:22:180;299:294:120;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;299:294:120;;1643:41:220;;;:::i;:::-;299:294:120;;;14276:18:228;;;;14272:64;;299:294:120;14401:42:228;14346:19;299:294:120;-1:-1:-1;299:294:120;14346:11:228;299:294:120;;;-1:-1:-1;299:294:120;;-1:-1:-1;299:294:120;;;;-1:-1:-1;299:294:120;;;;;;;;;;;;;;;;14401:42:228;299:294:120;14272:64:228;14303:33;;299:294:120;14303:33:228;299:294:120;;;;14303:33:228;2071:115:211;2931:8:352;668:81;299:294:120;2931:8:352;:::i;:::-;2071:115:211;;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;16129:20:228;;;;16125:59;;299:294:120;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;299:294:120;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;299:294:120;;;;;;;;16306:30:228;16329:6;;;;;;:::i;:::-;299:294:120;16306:30:228;;;:::i;:::-;299:294:120;;;;;;;;;;;;;;;;;;;16250:9:228;;299:294:120;;;;;;;;;;16125:59:228;16158:26;299:294:120;16158:26:228;299:294:120;;16158:26:228;299:294:120;;;;;;;;;;;;1878:39:220;;:::i;:::-;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1643:41:220;;;;;:::i;:::-;3179:19:352;299:294:120;;;;;;;;2616:14:352;2612:76;;299:294:120;-1:-1:-1;;299:294:120;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;299:294:120;6801:10:228;;;;;;299:294:120;;;;;;;;;;6904:44:228;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;299:294:120;6959:111:228;299:294:120;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;299:294:120;20263:81:228;;299:294:120;20263:81:228;;299:294:120;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;299:294:120;20263:81:228;;;;;;;;299:294:120;20263:81:228;299:294:120;20263:81:228;299:294:120;20263:81:228;;;6959:111;299:294:120;;20263:107:228;20259:181;;299:294:120;20259:181:228;1878:53;299:294:120;1878:53:228;299:294:120;;20391:49:228;;;;;;299:294:120;20391:49:228;;299:294:120;;;1878:53:228;;;299:294:120;1878:53:228;;;;:::i;:::-;;299:294:120;1878:53:228;;;;299:294:120;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;299:294:120;20263:81:228;299:294:120;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;299:294:120;6860:6:228;;;:::i;:::-;299:294:120;6868:9:228;;;:::i;:::-;299:294:120;6868:9:228;;;;;:::i;:::-;299:294:120;6790:9:228;;6698:76;299:294:120;6742:32:228;;;;299:294:120;6742:32:228;299:294:120;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;299:294:120;;;;;;;;;;;;2650:44:211;299:294:120;;:::i;:::-;;;;;2650:44:211;:::i;:::-;299:294:120;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;299:294:120;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;15240:220:228;;;299:294:120;;;15358:19:228;15354:61;;15375:1;299:294:120;;;;;15375:1:228;299:294:120;15432:21:228;299:294:120;-1:-1:-1;299:294:120;;;;-1:-1:-1;299:294:120;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;299:294:120;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;299:294:120;;;;;-1:-1:-1;299:294:120;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;299:294:120;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;299:294:120;1029:19:76;299:294:120;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;299:294:120;;;1676:74:76;;299:294:120;;;1676:74:76;;;299:294:120;1327:10:76;299:294:120;;;;1744:4:76;299:294:120;;;;;-1:-1:-1;1676:74:76;;299:294:120;;;;;;1676:74:76;;;;;;;299:294:120;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;3271:479:352;299:294:120;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;299:294:120;;;3613:51:352;299:294:120;;3613:51:352;;;;299:294:120;3613:51:352;;3648:4;3613:51;;;299:294:120;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;299:294:120;;-1:-1:-1;3691:28:352;3613:51;;;;299:294:120;3613:51:352;299:294:120;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;299:294:120;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;299:294:120;;-1:-1:-1;299:294:120;16997:11:228;299:294:120;;;;-1:-1:-1;299:294:120;16997:27:228;299:294:120;-1:-1:-1;299:294:120;;;;;-1:-1:-1;299:294:120;;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;299:294:120;17163:1:228;299:294:120;;;;;17163:1:228;299:294:120;;;;-1:-1:-1;299:294:120;;;;-1:-1:-1;299:294:120;;;;;;17330:29:228;;;;;17326:98;;299:294:120;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;299:294:120;17163:1:228;299:294:120;;;;;17163:1:228;299:294:120;;;;-1:-1:-1;299:294:120;;;;-1:-1:-1;299:294:120;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;299:294:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;299:294:120;;17640:48:228;;;299:294:120;;;17640:48:228;;;299:294:120;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;299:294:120;;17368:56:228;;;299:294:120;;;;;17368:56:228;;;299:294:120;;;;;;;;;;;;;;;;;;;20391:49:228;299:294:120;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;299:294:120;;;;;;;;;;;-1:-1:-1;299:294:120;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;1938:939:76;299:294:120;2065:19:76;299:294:120;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;299:294:120;720:8:80;299:294:120;720:8:80;;299:294:120;;;;2115:1:76;2802:32;;:::o;2624:153::-;299:294:120;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;299:294:120;2361:10:76;299:294:120;;;;2771:4:76;299:294:120;;;;;-1:-1:-1;2682:95:76;;299:294:120;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"1195000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","initERC1155Storage()":"infinite","isApprovedForAll(address,address)":"2651","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","initERC1155Storage()":"c34106c8","isApprovedForAll(address,address)":"e985e9c5","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"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\":\"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\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"initERC1155Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"initERC1155Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155FacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"initERC1155Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol\":\"ERC1155WithOperatorFiltererFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/facets/ERC1155WithOperatorFiltererFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155WithOperatorFiltererFacet} from \\\"./../../../../token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol\\\";\\n\\n/// @title ERC1155FacetMock\\ncontract ERC1155WithOperatorFiltererFacetMock is ERC1155WithOperatorFiltererFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155WithOperatorFiltererFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xe61f3189ffc3dabeb375bc07223b8e4f3050aec4545e3c30223bb95759a2dacc\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\\ncontract ERC1155WithOperatorFiltererFacet is ERC1155WithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x303f02536cb38a6898ab94e7f84049fa5569e598fd4e6671af8ad374d254e6e6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"initERC1155Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol":{"ERC1155FullBurnMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155FullBurnMock","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1570,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1533,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105f85761441680380380610019816105fd565b928339810160a0828203126105f85781516001600160401b0381116105f85781610044918401610622565b602083015190916001600160401b0382116105f857610064918401610622565b60408301519092906001600160a01b038116908190036105f85760608201516001600160a01b03811692908390036105f85760800151926001600160a01b03841684036105f85733610599575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff199081166001908117909255636cdb3d1360e11b6000527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a805490911690911790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b0319169094179093558051906001600160401b03821161046f576000805160206143d68339815191525490600182811c9216801561058f575b602083101461044f5781601f849311610512575b50602090601f831160011461049057600092610485575b50508160011b916000199060031b1c1916176000805160206143d6833981519152555b83516001600160401b03811161046f576000805160206143f683398151915254600181811c91168015610465575b602082101461044f57601f81116103dd575b50602094601f821160011461035c57948192939495600092610351575b50508160011b916000199060031b1c1916176000805160206143f6833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b0319169190911790556303a24d0760e21b60009081526020919091526040808220805460ff199081166001908117909255631464324b60e21b84528284208054821683179055633a2ae73360e21b8452828420805482168317905563921ed8d160e01b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613d48908161068e823960805181818161231701528181612fd9015281816135980152613be30152f35b01519050388061024c565b601f198216956000805160206143f6833981519152600052806000209160005b8881106103c5575083600195969798106103ac575b505050811b016000805160206143f68339815191525561026f565b015160001960f88460031b161c19169055388080610391565b9192602060018192868501518155019401920161037c565b6000805160206143f68339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610445575b601f0160051c01905b818110610439575061022f565b6000815560010161042c565b9091508190610423565b634e487b7160e01b600052602260045260246000fd5b90607f169061021d565b634e487b7160e01b600052604160045260246000fd5b0151905038806101cc565b6000805160206143d683398151915260009081528281209350601f198516905b8181106104fa57509084600195949392106104e1575b505050811b016000805160206143d6833981519152556101ef565b015160001960f88460031b161c191690553880806104c6565b929360206001819287860151815501950193016104b0565b6000805160206143d68339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c81019160208510610585575b90601f859493920160051c01905b81811061057657506101b5565b60008155849350600101610569565b909150819061055b565b91607f16916101a1565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761046f57604052565b81601f820112156105f8578051906001600160401b03821161046f57610651601f8301601f19166020016105fd565b92828452602083830101116105f85760005b82811061067857505060206000918301015290565b8060208092840101518282870101520161066356fe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14612b9257806301ffc9a714612b2c57806306fdde0314612ad15780630d6a5bbb1461286f5780630e89341c14612718578063114ba8ee14612619578063124d91e5146124fe578063162094c41461242e5780632a55205a1461233b5780632b4c9f16146122cc5780632eb2c2d614611ea65780632f2ff15d14611d1a57806331e66e1e14611ccc5780634e1273f414611bee578063572b6c0514611ba35780635cfa929714611ad957806361ba27da146119bd5780636706467b1461184c57806373c8a9581461169c578063805349341461150a5780638bb9c5bf1461139b5780638da5cb5b1461132a5780638dc251e3146111fd57806391d148541461116557806395d89b41146110f2578063a0c76f6214611081578063a22cb46514610f21578063b0ccc31e14610eb0578063c3666c3614610c73578063d539139314610c1a578063d547741f14610a91578063e1a8bf2c14610a55578063e8ab9ccc14610849578063e985e9c514610795578063f242432a14610463578063f2fde38b1461036f5763f7ba94bd146101b257600080fd5b34610313576101c036612d4a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610201613581565b925416911690810361034257508181036103185760005b81811061022157005b61022c818387613021565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031357610256828587613021565b35908147106102e157600080809381935af13d156102d9573d9061027982612f51565b916102876040519384612e7d565b82523d6000602084013e5b156102a05750600101610218565b8051156102af57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610292565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576103a6612c00565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103d0613581565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610342575073ffffffffffffffffffffffffffffffffffffffff169182820361041457005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761049a612c00565b6104a2612c23565b604435906064359260843567ffffffffffffffff8111610313576104ca903690600401612cdd565b926104d3613581565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610785575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561075b576105768287836137be565b156107115773ffffffffffffffffffffffffffffffffffffffff9161059f8a8a878a8796613a05565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105dc57005b6020926105ea913691612f8b565b9261064060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612c69565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106d6575b5016036106a357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106f8915060203d6020116106fe575b6106f08183612e7d565b810190613786565b8661069a565b503d6106e6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078e9161391a565b878561052a565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576107cc612c00565b73ffffffffffffffffffffffffffffffffffffffff6107e9612c23565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff811161031357610898903690600401612cac565b60243567ffffffffffffffff8111610313576108b8903690600401612cac565b929060443567ffffffffffffffff8111610313576108da903690600401612cac565b93909160643567ffffffffffffffff8111610313576108fd903690600401612cdd565b939091610908613581565b97610933897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095e81612eed565b9761096c604051998a612e7d565b818952602089019160051b81019036821161031357915b818310610a2857505050916109a16109a9926109b195943691612f05565b973691612f05565b933691612f8b565b9183519480518614801590610a1d575b6103185760005b8681106109d157005b80610a178673ffffffffffffffffffffffffffffffffffffffff6109f76001958b613322565b5116610a038487613322565b51610a0e8589613322565b51918d8a613400565b016109c8565b5081518614156109c1565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031357815260209283019201610983565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020604051620186a08152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435610acb612c23565b610ad3613581565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b8557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031357610c8136612dee565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc6613581565b92541691169081036103425750808214801590610ea6575b6103185760005b828110610cee57005b73ffffffffffffffffffffffffffffffffffffffff610d16610d1183858a613021565b6133df565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561070557600091610e78575b5015610e4b575073ffffffffffffffffffffffffffffffffffffffff610da5610d1183858a613021565b1690610db5610d11828689613021565b91610dc182878b613021565b3592813b1561031357606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561070557600192610e3a575b5001610ce5565b6000610e4591612e7d565b88610e33565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e99915060203d8111610e9f575b610e918183612e7d565b810190613569565b89610d7b565b503d610e87565b5082821415610cde565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357610f58612c00565b602435908115159182810361031357611052575b73ffffffffffffffffffffffffffffffffffffffff80610f8a613581565b169116918183146110245760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61107c817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061391a565b610f6c565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613159565b604051918291602083526020830190612c69565b0390f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761119c612c23565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611234612c00565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611273613581565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156113005773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113f6613581565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114c25760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c15565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611541612c00565b60243567ffffffffffffffff811161031357611561903690600401612cac565b9060443567ffffffffffffffff811161031357611582903690600401612cac565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115ad613581565b94838203610318576115c08688836137be565b156116525760005b828110611626575050946116217f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff936000988560405196879616991697856133b5565b0390a4005b8061164c611637600193868a613021565b35611643838989613021565b35908b8661383e565b016115c8565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b34610313576116aa36612dee565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116ed613581565b92541691169081036103425750808414801590611842575b6103185760005b84811061171557005b611720818388613021565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610313576000602091611753610d11868b8e613021565b826117bd6117e9611765898d8d613021565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612e7d565b51925af115610705576000513d6118395750803b155b61180c575060010161170c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117ff565b5082841415611705565b346103135761185a36612d4a565b8083949293036103185773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198f57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118d657005b84811015611960578060051b820135838112156103135782019081359167ffffffffffffffff831161031357602001918036038313610313577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361193e848b8a613021565b3592611957604051928392602084526020840191612d0b565b0390a2016118cd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a2e613581565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611aac57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611b10612c00565b6064359067ffffffffffffffff821161031357611b34611ba1923690600401612cdd565b611b93611b3f613581565b92611b6a847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612f8b565b926044359260243592613400565b005b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020611be4611bdf612c00565b612fc2565b6040519015158152f35b3461031357611bfc36612d4a565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361031857611c3285612eed565b94611c406040519687612e7d565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c6d82612eed565b0136602088013760005b818110611c9457604051602080825281906111619082018a612dba565b80611cbb611ca8610d11600194868b613021565b611cb3838789613021565b359088613031565b611cc5828a613322565b5201611c77565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611d03613bcc565b611161604051928392602084526020840191612d0b565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435611d54612c23565b611d5c613581565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611e0f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c15565b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611edd612c00565b611ee5612c23565b60443567ffffffffffffffff811161031357611f05903690600401612cac565b929060643567ffffffffffffffff811161031357611f27903690600401612cac565b9360843567ffffffffffffffff811161031357611f48903690600401612cdd565b939091611f53613581565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036122bc575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075b57898b0361031857611ffd8284836137be565b156122725760005b8b8110612243575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61206899169a8b92169889936040519182918d8c8b856133b5565b0390a43b61207257005b60209461208761208f92612097953691612f05565b993691612f05565b953691612f8b565b9261214760405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526121176120e760a485018b612dba565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612dba565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612c69565b03816000875af1908115610705577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612224575b5016036121aa57005b612220906121f06040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612dba565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612dba565b0390fd5b61223d915060203d6020116106fe576106f08183612e7d565b866121a1565b8061226c8c6122628f9461225a816001978d613021565b35928d613021565b3590888887613a05565b01612005565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122c59161391a565b8987611faa565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612426575b156123f057505061116160005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116191620186a08210156124135761240d90620186a092613336565b046123c0565b620186a06124219204613336565b6123c0565b5081156123b3565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760243567ffffffffffffffff81116103135761247d903690600401612cdd565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198f576124f97f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191612d0b565b0390a2005b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357612535612c00565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435612564613581565b926125708486836137be565b156125cf5773ffffffffffffffffffffffffffffffffffffffff8086846125be7fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861383e565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043573ffffffffffffffffffffffffffffffffffffffff81168103610313577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806126a7613581565b9254169116908103610342575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115610705576000916127e7575b6040516020808252819061116190820185612c69565b3d8083833e6127f68183612e7d565b8101906020818303126128675780519067ffffffffffffffff821161286b570181601f820112156128675780519261282d84612f51565b9261283b6040519485612e7d565b8484526020858401011161286457506111619261285e9160208085019101612c46565b906127d1565b80fd5b8280fd5b8380fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576128a6612c00565b60243567ffffffffffffffff8111610313576128c6903690600401612cac565b909160443567ffffffffffffffff8111610313576128e8903690600401612cac565b93909160643567ffffffffffffffff81116103135761297c93612912612984923690600401612cdd565b959091612974612920613581565b9661294b887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612f05565b983691612f05565b943691612f8b565b9173ffffffffffffffffffffffffffffffffffffffff8216948515612aa757865190855182036103185760005b828110612a7d5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612a1e612a108d6040840190612dba565b82810360208401528b612dba565b0390a43b612a2857005b6121479160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526121176120e760a485018b612dba565b80612aa1612a8d6001938c613322565b51612a98838b613322565b519088866136a9565b016129b1565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613159565b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031357611be46020916130aa565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020612bf8612bce612c00565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612613031565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b60005b838110612c595750506000910152565b8181015183820152602001612c49565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ca581518092818752878088019101612c46565b0116010190565b9181601f840112156103135782359167ffffffffffffffff8311610313576020808501948460051b01011161031357565b9181601f840112156103135782359167ffffffffffffffff8311610313576020838186019501011161031357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff81116103135781612d9391600401612cac565b929092916024359067ffffffffffffffff821161031357612db691600401612cac565b9091565b906020808351928381520192019060005b818110612dd85750505090565b8251845260209384019390920191600101612dcb565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff81116103135781612e3791600401612cac565b9290929160243567ffffffffffffffff81116103135781612e5a91600401612cac565b929092916044359067ffffffffffffffff821161031357612db691600401612cac565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612ebe57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612ebe5760051b60200190565b929190612f1181612eed565b93612f1f6040519586612e7d565b602085838152019160051b810192831161031357905b828210612f4157505050565b8135815260209182019101612f35565b67ffffffffffffffff8111612ebe57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612f9782612f51565b91612fa56040519384612e7d565b829481845281830111610313578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561301a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156119605760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156130805760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613153577f01ffc9a700000000000000000000000000000000000000000000000000000000811461314d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015613256575b602085108114613229578487528693929181156131e957506001146131a2575b506131a092500383612e7d565b565b90506000929192526020600020906000915b8183106131cd5750509060206131a09282010138613193565b60209193508060019154838589010152019101909184926131b4565b602093506131a09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613193565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613173565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156132ba5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156119605760209160051b010190565b8181029291811591840414171561334957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103135760209260051b809284830137010190565b92906133ce906133dc9593604086526040860191613378565b926020818503910152613378565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103135790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415612aa75761344587878573ffffffffffffffffffffffffffffffffffffffff956136a9565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613487575b5050505050565b6134e29160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612c69565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161354a575b5016036106a3578080613480565b613563915060203d6020116106fe576106f08183612e7d565b3861353c565b90816020910312610313575180151581036103135790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561369a57323314801561369f575b61369a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613609575b506133dc57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107055760009161367b575b50386135ff565b613694915060203d602011610e9f57610e918183612e7d565b38613674565b503390565b50601836106135c8565b9091836136b7575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561372d57505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806136b1565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031357517fffffffff00000000000000000000000000000000000000000000000000000000811681036103135790565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156137e9575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806137e3565b90918361384b5750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156138c157505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806136b1565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff1690811515806139fb575b613943575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610705576000916139dc575b50156139af5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6139f5915060203d602011610e9f57610e918183612e7d565b386139a6565b50813b151561393b565b91929084613a14575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613b70575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613a8c575b50613480565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613b1257505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613a86565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613d00573233148015613d08575b613d0057803314908115613c5f575b50613c2e576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103135760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561070557600091613ce1575b5038613c22565b613cfa915060203d602011610e9f57610e918183612e7d565b38613cda565b506000903690565b5060183610613c1356fea2646970667358221220720af6b517ff81854080d6c38a0daaca07f835ff1fe373d7fb2dfe00577b86fb64736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5F8 JUMPI PUSH2 0x4416 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5FD JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x5F8 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5F8 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x622 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5F8 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x622 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x5F8 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x5F8 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x5F8 JUMPI CALLER PUSH2 0x599 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x6CDB3D13 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x46F JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x58F JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x44F JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x512 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x490 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x485 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x46F JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43F6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x465 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x44F JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3DD JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x35C JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x351 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43F6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x3A24D07 PUSH1 0xE2 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x1464324B PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x3A2AE733 PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x921ED8D1 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3D48 SWAP1 DUP2 PUSH2 0x68E DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2317 ADD MSTORE DUP2 DUP2 PUSH2 0x2FD9 ADD MSTORE DUP2 DUP2 PUSH2 0x3598 ADD MSTORE PUSH2 0x3BE3 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24C JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43F6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3C5 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3AC JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43F6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x26F JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x391 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x37C JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43F6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x445 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x439 JUMPI POP PUSH2 0x22F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x42C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x423 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x21D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4FA JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4E1 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x1EF JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4C6 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4B0 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x585 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x576 JUMPI POP PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x569 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x55B JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1A1 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x46F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5F8 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x46F JUMPI PUSH2 0x651 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5FD JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5F8 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x678 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x663 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2B92 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2B2C JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2AD1 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x286F JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2718 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2619 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x24FE JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x242E JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x233B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22CC JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1EA6 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1D1A JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1CCC JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BEE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BA3 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AD9 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19BD JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x184C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x150A JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x139B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x132A JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11FD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1165 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1081 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF21 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEB0 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA91 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA55 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x849 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x463 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x36F JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1C0 CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x201 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP2 DUP2 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x221 JUMPI STOP JUMPDEST PUSH2 0x22C DUP2 DUP4 DUP8 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x313 JUMPI PUSH2 0x256 DUP3 DUP6 DUP8 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2D9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x279 DUP3 PUSH2 0x2F51 JUMP JUMPDEST SWAP2 PUSH2 0x287 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E7D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x218 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2AF JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x292 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x3A6 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3D0 PUSH2 0x3581 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x414 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x49A PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x4A2 PUSH2 0x2C23 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x4CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP3 PUSH2 0x4D3 PUSH2 0x3581 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x785 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x75B JUMPI PUSH2 0x576 DUP3 DUP8 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x711 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x59F DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3A05 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5DC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5EA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH2 0x640 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6D6 JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI JUMPDEST PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3786 JUMP JUMPDEST DUP7 PUSH2 0x69A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x78E SWAP2 PUSH2 0x391A JUMP JUMPDEST DUP8 DUP6 PUSH2 0x52A JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x7CC PUSH2 0x2C00 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7E9 PUSH2 0x2C23 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x898 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8FD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x908 PUSH2 0x3581 JUMP JUMPDEST SWAP8 PUSH2 0x933 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x95E DUP2 PUSH2 0x2EED JUMP JUMPDEST SWAP8 PUSH2 0x96C PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2E7D JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA28 JUMPI POP POP POP SWAP2 PUSH2 0x9A1 PUSH2 0x9A9 SWAP3 PUSH2 0x9B1 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA1D JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9D1 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA17 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F7 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3322 JUMP JUMPDEST MLOAD AND PUSH2 0xA03 DUP5 DUP8 PUSH2 0x3322 JUMP JUMPDEST MLOAD PUSH2 0xA0E DUP6 DUP10 PUSH2 0x3322 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3400 JUMP JUMPDEST ADD PUSH2 0x9C8 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9C1 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xACB PUSH2 0x2C23 JUMP JUMPDEST PUSH2 0xAD3 PUSH2 0x3581 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB85 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0xC81 CALLDATASIZE PUSH2 0x2DEE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC6 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD16 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x3021 JUMP JUMPDEST PUSH2 0x33DF JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE78 JUMPI JUMPDEST POP ISZERO PUSH2 0xE4B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA5 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x3021 JUMP JUMPDEST AND SWAP1 PUSH2 0xDB5 PUSH2 0xD11 DUP3 DUP7 DUP10 PUSH2 0x3021 JUMP JUMPDEST SWAP2 PUSH2 0xDC1 DUP3 DUP8 DUP12 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x313 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x705 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE3A JUMPI JUMPDEST POP ADD PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE45 SWAP2 PUSH2 0x2E7D JUMP JUMPDEST DUP9 PUSH2 0xE33 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE99 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9F JUMPI JUMPDEST PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3569 JUMP JUMPDEST DUP10 PUSH2 0xD7B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE87 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDE JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0xF58 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1052 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8A PUSH2 0x3581 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1024 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x107C DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x391A JUMP JUMPDEST PUSH2 0xF6C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3159 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x119C PUSH2 0x2C23 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1234 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1273 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1300 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F6 PUSH2 0x3581 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14C2 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1541 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1561 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15AD PUSH2 0x3581 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x318 JUMPI PUSH2 0x15C0 DUP7 DUP9 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1626 JUMPI POP POP SWAP5 PUSH2 0x1621 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x164C PUSH2 0x1637 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH2 0x1643 DUP4 DUP10 DUP10 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x383E JUMP JUMPDEST ADD PUSH2 0x15C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x16AA CALLDATASIZE PUSH2 0x2DEE JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16ED PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1842 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1715 JUMPI STOP JUMPDEST PUSH2 0x1720 DUP2 DUP4 DUP9 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x313 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1753 PUSH2 0xD11 DUP7 DUP12 DUP15 PUSH2 0x3021 JUMP JUMPDEST DUP3 PUSH2 0x17BD PUSH2 0x17E9 PUSH2 0x1765 DUP10 DUP14 DUP14 PUSH2 0x3021 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2E7D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1839 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x180C JUMPI POP PUSH1 0x1 ADD PUSH2 0x170C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17FF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1705 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x185A CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x318 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x198F JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18D6 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1960 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x313 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x313 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x193E DUP5 DUP12 DUP11 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1957 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18CD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A2E PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AAC JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1B10 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x1B34 PUSH2 0x1BA1 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST PUSH2 0x1B93 PUSH2 0x1B3F PUSH2 0x3581 JUMP JUMPDEST SWAP3 PUSH2 0x1B6A DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3400 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x1BE4 PUSH2 0x1BDF PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x2FC2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1BFC CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x318 JUMPI PUSH2 0x1C32 DUP6 PUSH2 0x2EED JUMP JUMPDEST SWAP5 PUSH2 0x1C40 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2E7D JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C6D DUP3 PUSH2 0x2EED JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C94 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP11 PUSH2 0x2DBA JUMP JUMPDEST DUP1 PUSH2 0x1CBB PUSH2 0x1CA8 PUSH2 0xD11 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x3021 JUMP JUMPDEST PUSH2 0x1CB3 DUP4 DUP8 DUP10 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x3031 JUMP JUMPDEST PUSH2 0x1CC5 DUP3 DUP11 PUSH2 0x3322 JUMP JUMPDEST MSTORE ADD PUSH2 0x1C77 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1D03 PUSH2 0x3BCC JUMP JUMPDEST PUSH2 0x1161 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1D54 PUSH2 0x2C23 JUMP JUMPDEST PUSH2 0x1D5C PUSH2 0x3581 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E0F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1EDD PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x1EE5 PUSH2 0x2C23 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F05 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F27 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F48 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1F53 PUSH2 0x3581 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22BC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x75B JUMPI DUP10 DUP12 SUB PUSH2 0x318 JUMPI PUSH2 0x1FFD DUP3 DUP5 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x2272 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x2243 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2068 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2072 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2087 PUSH2 0x208F SWAP3 PUSH2 0x2097 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH2 0x2147 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2117 PUSH2 0x20E7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2DBA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2DBA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2224 JUMPI JUMPDEST POP AND SUB PUSH2 0x21AA JUMPI STOP JUMPDEST PUSH2 0x2220 SWAP1 PUSH2 0x21F0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2DBA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2DBA JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x223D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP7 PUSH2 0x21A1 JUMP JUMPDEST DUP1 PUSH2 0x226C DUP13 PUSH2 0x2262 DUP16 SWAP5 PUSH2 0x225A DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3A05 JUMP JUMPDEST ADD PUSH2 0x2005 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x22C5 SWAP2 PUSH2 0x391A JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1FAA JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2426 JUMPI JUMPDEST ISZERO PUSH2 0x23F0 JUMPI POP POP PUSH2 0x1161 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1161 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2413 JUMPI PUSH2 0x240D SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3336 JUMP JUMPDEST DIV PUSH2 0x23C0 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2421 SWAP3 DIV PUSH2 0x3336 JUMP JUMPDEST PUSH2 0x23C0 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23B3 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x247D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x198F JUMPI PUSH2 0x24F9 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x2535 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x2564 PUSH2 0x3581 JUMP JUMPDEST SWAP3 PUSH2 0x2570 DUP5 DUP7 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x25CF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x25BE PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x383E JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x26A7 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27E7 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP6 PUSH2 0x2C69 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x27F6 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2867 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x286B JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2867 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x282D DUP5 PUSH2 0x2F51 JUMP JUMPDEST SWAP3 PUSH2 0x283B PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E7D JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2864 JUMPI POP PUSH2 0x1161 SWAP3 PUSH2 0x285E SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2C46 JUMP JUMPDEST SWAP1 PUSH2 0x27D1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x28A6 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x28C6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x28E8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x297C SWAP4 PUSH2 0x2912 PUSH2 0x2984 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2974 PUSH2 0x2920 PUSH2 0x3581 JUMP JUMPDEST SWAP7 PUSH2 0x294B DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2AA7 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2A7D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2A1E PUSH2 0x2A10 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2DBA JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2DBA JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2A28 JUMPI STOP JUMPDEST PUSH2 0x2147 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2117 PUSH2 0x20E7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2DBA JUMP JUMPDEST DUP1 PUSH2 0x2AA1 PUSH2 0x2A8D PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3322 JUMP JUMPDEST MLOAD PUSH2 0x2A98 DUP4 DUP12 PUSH2 0x3322 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x36A9 JUMP JUMPDEST ADD PUSH2 0x29B1 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3159 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1BE4 PUSH1 0x20 SWAP2 PUSH2 0x30AA JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x2BF8 PUSH2 0x2BCE PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x3031 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2C59 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2C49 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2CA5 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2C46 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2D93 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x2DB6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DD8 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2DCB JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2E37 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2E5A SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x2DB6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2EBE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2EBE JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2F11 DUP2 PUSH2 0x2EED JUMP JUMPDEST SWAP4 PUSH2 0x2F1F PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2E7D JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x313 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2F41 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F35 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2EBE JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2F97 DUP3 PUSH2 0x2F51 JUMP JUMPDEST SWAP2 PUSH2 0x2FA5 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E7D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x313 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x301A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x3080 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3153 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x314D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3256 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3229 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x31E9 JUMPI POP PUSH1 0x1 EQ PUSH2 0x31A2 JUMPI JUMPDEST POP PUSH2 0x31A0 SWAP3 POP SUB DUP4 PUSH2 0x2E7D JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x31CD JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x31A0 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3193 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x31B4 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x31A0 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3193 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3173 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x32BA JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3349 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x33CE SWAP1 PUSH2 0x33DC SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3378 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3378 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2AA7 JUMPI PUSH2 0x3445 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x36A9 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3487 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x34E2 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x354A JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI DUP1 DUP1 PUSH2 0x3480 JUMP JUMPDEST PUSH2 0x3563 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x353C JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x369A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x369F JUMPI JUMPDEST PUSH2 0x369A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3609 JUMPI JUMPDEST POP PUSH2 0x33DC JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x367B JUMPI JUMPDEST POP CODESIZE PUSH2 0x35FF JUMP JUMPDEST PUSH2 0x3694 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x3674 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x35C8 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x36B7 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x372D JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x36B1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x37E9 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x37E3 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x384B JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x38C1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x36B1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x39FB JUMPI JUMPDEST PUSH2 0x3943 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x39DC JUMPI JUMPDEST POP ISZERO PUSH2 0x39AF JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x39F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x39A6 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x393B JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3A14 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3B70 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3A8C JUMPI JUMPDEST POP PUSH2 0x3480 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3B12 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A86 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3D00 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3D08 JUMPI JUMPDEST PUSH2 0x3D00 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3C5F JUMPI JUMPDEST POP PUSH2 0x3C2E JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3CE1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3C22 JUMP JUMPDEST PUSH2 0x3CFA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x3CDA JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3C13 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH19 0xAF6B517FF81854080D6C38A0DAACA07F835FF 0x1F CALLF 0x73D7 EXTSTATICCALL 0x2D INVALID STOP JUMPI PUSH28 0x86FB64736F6C634300081E00337EA68FD2DCF1C056B94DB6A0A537AA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A47EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A50000 ","sourceMap":"483:480:121:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;1582:10:230;1645:152:42;;-1:-1:-1;483:480:121;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;;483:480:121;;;-1:-1:-1;;;;;;483:480:121;;;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;-1:-1:-1;;;;;;;;;;;483:480:121;;990:1:42;483:480:121;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;990:1:42;483:480:121;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;483:480:121;;;;-1:-1:-1;;;;;483:480:121;;;;-1:-1:-1;;;;;;;;;;;483:480:121;990:1:42;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;990:1:42;483:480:121;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;483:480:121;;1289:23:341;483:480:121;;-1:-1:-1;;;;;;483:480:121;;;;;;;-1:-1:-1;;;;500:10:59;;;483:480:121;500:10:59;;;;483:480:121;500:10:59;;;;;-1:-1:-1;;500:10:59;;;483:480:121;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;483:480:121;745:39:76;;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;483:480:121;;-1:-1:-1;483:480:121;;-1:-1:-1;483:480:121;;;;;;;;990:1:42;483:480:121;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;483:480:121;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;990:1:42;483:480:121;;;;;;-1:-1:-1;483:480:121;;;;;;;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;;;;;;;;;;;;483:480:121;;;;;;;-1:-1:-1;;;483:480:121;;;;;;;;;;;;990:1:42;483:480:121;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;483:480:121;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;483:480:121;;;-1:-1:-1;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;990:1:42;483:480:121;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;1645:152:42;483:480:121;;;-1:-1:-1;;;;;;483:480:121;1582:10:230;483:480:121;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;483:480:121;-1:-1:-1;483:480:121;;;;;;;;;-1:-1:-1;;483:480:121;;;-1:-1:-1;;;;;483:480:121;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;483:480:121;;;;;;;;-1:-1:-1;;483:480:121;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;-1:-1:-1;483:480:121;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":11299,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11758,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11594,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":11436,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":12037,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":12171,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13673,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":14214,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11485,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":11264,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":11706,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":13176,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata_array_uint256_dyn_calldata":{"entryPoint":13237,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":11531,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":11369,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":12013,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":12113,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":12321,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":13110,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":12633,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":11334,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11901,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":12337,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_burnToken":{"entryPoint":14398,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":14618,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12896,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":14270,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":12226,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":13993,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":15308,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":13697,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":13312,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":12458,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferToken":{"entryPoint":14853,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":13090,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":13279,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8983},{"length":32,"start":12249},{"length":32,"start":13720},{"length":32,"start":15331}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14612b9257806301ffc9a714612b2c57806306fdde0314612ad15780630d6a5bbb1461286f5780630e89341c14612718578063114ba8ee14612619578063124d91e5146124fe578063162094c41461242e5780632a55205a1461233b5780632b4c9f16146122cc5780632eb2c2d614611ea65780632f2ff15d14611d1a57806331e66e1e14611ccc5780634e1273f414611bee578063572b6c0514611ba35780635cfa929714611ad957806361ba27da146119bd5780636706467b1461184c57806373c8a9581461169c578063805349341461150a5780638bb9c5bf1461139b5780638da5cb5b1461132a5780638dc251e3146111fd57806391d148541461116557806395d89b41146110f2578063a0c76f6214611081578063a22cb46514610f21578063b0ccc31e14610eb0578063c3666c3614610c73578063d539139314610c1a578063d547741f14610a91578063e1a8bf2c14610a55578063e8ab9ccc14610849578063e985e9c514610795578063f242432a14610463578063f2fde38b1461036f5763f7ba94bd146101b257600080fd5b34610313576101c036612d4a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610201613581565b925416911690810361034257508181036103185760005b81811061022157005b61022c818387613021565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031357610256828587613021565b35908147106102e157600080809381935af13d156102d9573d9061027982612f51565b916102876040519384612e7d565b82523d6000602084013e5b156102a05750600101610218565b8051156102af57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610292565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576103a6612c00565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103d0613581565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610342575073ffffffffffffffffffffffffffffffffffffffff169182820361041457005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761049a612c00565b6104a2612c23565b604435906064359260843567ffffffffffffffff8111610313576104ca903690600401612cdd565b926104d3613581565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610785575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561075b576105768287836137be565b156107115773ffffffffffffffffffffffffffffffffffffffff9161059f8a8a878a8796613a05565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105dc57005b6020926105ea913691612f8b565b9261064060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612c69565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106d6575b5016036106a357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106f8915060203d6020116106fe575b6106f08183612e7d565b810190613786565b8661069a565b503d6106e6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078e9161391a565b878561052a565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576107cc612c00565b73ffffffffffffffffffffffffffffffffffffffff6107e9612c23565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff811161031357610898903690600401612cac565b60243567ffffffffffffffff8111610313576108b8903690600401612cac565b929060443567ffffffffffffffff8111610313576108da903690600401612cac565b93909160643567ffffffffffffffff8111610313576108fd903690600401612cdd565b939091610908613581565b97610933897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095e81612eed565b9761096c604051998a612e7d565b818952602089019160051b81019036821161031357915b818310610a2857505050916109a16109a9926109b195943691612f05565b973691612f05565b933691612f8b565b9183519480518614801590610a1d575b6103185760005b8681106109d157005b80610a178673ffffffffffffffffffffffffffffffffffffffff6109f76001958b613322565b5116610a038487613322565b51610a0e8589613322565b51918d8a613400565b016109c8565b5081518614156109c1565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031357815260209283019201610983565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020604051620186a08152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435610acb612c23565b610ad3613581565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b8557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031357610c8136612dee565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc6613581565b92541691169081036103425750808214801590610ea6575b6103185760005b828110610cee57005b73ffffffffffffffffffffffffffffffffffffffff610d16610d1183858a613021565b6133df565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561070557600091610e78575b5015610e4b575073ffffffffffffffffffffffffffffffffffffffff610da5610d1183858a613021565b1690610db5610d11828689613021565b91610dc182878b613021565b3592813b1561031357606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561070557600192610e3a575b5001610ce5565b6000610e4591612e7d565b88610e33565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e99915060203d8111610e9f575b610e918183612e7d565b810190613569565b89610d7b565b503d610e87565b5082821415610cde565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357610f58612c00565b602435908115159182810361031357611052575b73ffffffffffffffffffffffffffffffffffffffff80610f8a613581565b169116918183146110245760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61107c817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061391a565b610f6c565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613159565b604051918291602083526020830190612c69565b0390f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761119c612c23565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611234612c00565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611273613581565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156113005773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113f6613581565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114c25760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c15565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611541612c00565b60243567ffffffffffffffff811161031357611561903690600401612cac565b9060443567ffffffffffffffff811161031357611582903690600401612cac565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115ad613581565b94838203610318576115c08688836137be565b156116525760005b828110611626575050946116217f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff936000988560405196879616991697856133b5565b0390a4005b8061164c611637600193868a613021565b35611643838989613021565b35908b8661383e565b016115c8565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b34610313576116aa36612dee565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116ed613581565b92541691169081036103425750808414801590611842575b6103185760005b84811061171557005b611720818388613021565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610313576000602091611753610d11868b8e613021565b826117bd6117e9611765898d8d613021565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612e7d565b51925af115610705576000513d6118395750803b155b61180c575060010161170c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117ff565b5082841415611705565b346103135761185a36612d4a565b8083949293036103185773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198f57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118d657005b84811015611960578060051b820135838112156103135782019081359167ffffffffffffffff831161031357602001918036038313610313577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361193e848b8a613021565b3592611957604051928392602084526020840191612d0b565b0390a2016118cd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a2e613581565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611aac57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611b10612c00565b6064359067ffffffffffffffff821161031357611b34611ba1923690600401612cdd565b611b93611b3f613581565b92611b6a847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612f8b565b926044359260243592613400565b005b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020611be4611bdf612c00565b612fc2565b6040519015158152f35b3461031357611bfc36612d4a565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361031857611c3285612eed565b94611c406040519687612e7d565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c6d82612eed565b0136602088013760005b818110611c9457604051602080825281906111619082018a612dba565b80611cbb611ca8610d11600194868b613021565b611cb3838789613021565b359088613031565b611cc5828a613322565b5201611c77565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611d03613bcc565b611161604051928392602084526020840191612d0b565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435611d54612c23565b611d5c613581565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611e0f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c15565b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611edd612c00565b611ee5612c23565b60443567ffffffffffffffff811161031357611f05903690600401612cac565b929060643567ffffffffffffffff811161031357611f27903690600401612cac565b9360843567ffffffffffffffff811161031357611f48903690600401612cdd565b939091611f53613581565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036122bc575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075b57898b0361031857611ffd8284836137be565b156122725760005b8b8110612243575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61206899169a8b92169889936040519182918d8c8b856133b5565b0390a43b61207257005b60209461208761208f92612097953691612f05565b993691612f05565b953691612f8b565b9261214760405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526121176120e760a485018b612dba565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612dba565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612c69565b03816000875af1908115610705577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612224575b5016036121aa57005b612220906121f06040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612dba565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612dba565b0390fd5b61223d915060203d6020116106fe576106f08183612e7d565b866121a1565b8061226c8c6122628f9461225a816001978d613021565b35928d613021565b3590888887613a05565b01612005565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122c59161391a565b8987611faa565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612426575b156123f057505061116160005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116191620186a08210156124135761240d90620186a092613336565b046123c0565b620186a06124219204613336565b6123c0565b5081156123b3565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760243567ffffffffffffffff81116103135761247d903690600401612cdd565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198f576124f97f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191612d0b565b0390a2005b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357612535612c00565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435612564613581565b926125708486836137be565b156125cf5773ffffffffffffffffffffffffffffffffffffffff8086846125be7fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861383e565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043573ffffffffffffffffffffffffffffffffffffffff81168103610313577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806126a7613581565b9254169116908103610342575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115610705576000916127e7575b6040516020808252819061116190820185612c69565b3d8083833e6127f68183612e7d565b8101906020818303126128675780519067ffffffffffffffff821161286b570181601f820112156128675780519261282d84612f51565b9261283b6040519485612e7d565b8484526020858401011161286457506111619261285e9160208085019101612c46565b906127d1565b80fd5b8280fd5b8380fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576128a6612c00565b60243567ffffffffffffffff8111610313576128c6903690600401612cac565b909160443567ffffffffffffffff8111610313576128e8903690600401612cac565b93909160643567ffffffffffffffff81116103135761297c93612912612984923690600401612cdd565b959091612974612920613581565b9661294b887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613260565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612f05565b983691612f05565b943691612f8b565b9173ffffffffffffffffffffffffffffffffffffffff8216948515612aa757865190855182036103185760005b828110612a7d5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612a1e612a108d6040840190612dba565b82810360208401528b612dba565b0390a43b612a2857005b6121479160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526121176120e760a485018b612dba565b80612aa1612a8d6001938c613322565b51612a98838b613322565b519088866136a9565b016129b1565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613159565b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031357611be46020916130aa565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020612bf8612bce612c00565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612613031565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b60005b838110612c595750506000910152565b8181015183820152602001612c49565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ca581518092818752878088019101612c46565b0116010190565b9181601f840112156103135782359167ffffffffffffffff8311610313576020808501948460051b01011161031357565b9181601f840112156103135782359167ffffffffffffffff8311610313576020838186019501011161031357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff81116103135781612d9391600401612cac565b929092916024359067ffffffffffffffff821161031357612db691600401612cac565b9091565b906020808351928381520192019060005b818110612dd85750505090565b8251845260209384019390920191600101612dcb565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff81116103135781612e3791600401612cac565b9290929160243567ffffffffffffffff81116103135781612e5a91600401612cac565b929092916044359067ffffffffffffffff821161031357612db691600401612cac565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612ebe57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612ebe5760051b60200190565b929190612f1181612eed565b93612f1f6040519586612e7d565b602085838152019160051b810192831161031357905b828210612f4157505050565b8135815260209182019101612f35565b67ffffffffffffffff8111612ebe57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612f9782612f51565b91612fa56040519384612e7d565b829481845281830111610313578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561301a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156119605760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156130805760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613153577f01ffc9a700000000000000000000000000000000000000000000000000000000811461314d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015613256575b602085108114613229578487528693929181156131e957506001146131a2575b506131a092500383612e7d565b565b90506000929192526020600020906000915b8183106131cd5750509060206131a09282010138613193565b60209193508060019154838589010152019101909184926131b4565b602093506131a09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613193565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613173565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156132ba5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156119605760209160051b010190565b8181029291811591840414171561334957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103135760209260051b809284830137010190565b92906133ce906133dc9593604086526040860191613378565b926020818503910152613378565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103135790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415612aa75761344587878573ffffffffffffffffffffffffffffffffffffffff956136a9565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613487575b5050505050565b6134e29160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612c69565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161354a575b5016036106a3578080613480565b613563915060203d6020116106fe576106f08183612e7d565b3861353c565b90816020910312610313575180151581036103135790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561369a57323314801561369f575b61369a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613609575b506133dc57503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107055760009161367b575b50386135ff565b613694915060203d602011610e9f57610e918183612e7d565b38613674565b503390565b50601836106135c8565b9091836136b7575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561372d57505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806136b1565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031357517fffffffff00000000000000000000000000000000000000000000000000000000811681036103135790565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156137e9575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806137e3565b90918361384b5750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156138c157505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806136b1565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff1690811515806139fb575b613943575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610705576000916139dc575b50156139af5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6139f5915060203d602011610e9f57610e918183612e7d565b386139a6565b50813b151561393b565b91929084613a14575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613b70575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613a8c575b50613480565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613b1257505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613a86565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613d00573233148015613d08575b613d0057803314908115613c5f575b50613c2e576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103135760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561070557600091613ce1575b5038613c22565b613cfa915060203d602011610e9f57610e918183612e7d565b38613cda565b506000903690565b5060183610613c1356fea2646970667358221220720af6b517ff81854080d6c38a0daaca07f835ff1fe373d7fb2dfe00577b86fb64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2B92 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2B2C JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2AD1 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x286F JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2718 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2619 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x24FE JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x242E JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x233B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22CC JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1EA6 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1D1A JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1CCC JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BEE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BA3 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AD9 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19BD JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x184C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x150A JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x139B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x132A JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11FD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1165 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1081 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF21 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEB0 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA91 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA55 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x849 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x463 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x36F JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1C0 CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x201 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP2 DUP2 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x221 JUMPI STOP JUMPDEST PUSH2 0x22C DUP2 DUP4 DUP8 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x313 JUMPI PUSH2 0x256 DUP3 DUP6 DUP8 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2D9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x279 DUP3 PUSH2 0x2F51 JUMP JUMPDEST SWAP2 PUSH2 0x287 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E7D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x218 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2AF JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x292 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x3A6 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3D0 PUSH2 0x3581 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x414 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x49A PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x4A2 PUSH2 0x2C23 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x4CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP3 PUSH2 0x4D3 PUSH2 0x3581 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x785 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x75B JUMPI PUSH2 0x576 DUP3 DUP8 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x711 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x59F DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3A05 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5DC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5EA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH2 0x640 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6D6 JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI JUMPDEST PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3786 JUMP JUMPDEST DUP7 PUSH2 0x69A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x78E SWAP2 PUSH2 0x391A JUMP JUMPDEST DUP8 DUP6 PUSH2 0x52A JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x7CC PUSH2 0x2C00 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7E9 PUSH2 0x2C23 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x898 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8FD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x908 PUSH2 0x3581 JUMP JUMPDEST SWAP8 PUSH2 0x933 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x95E DUP2 PUSH2 0x2EED JUMP JUMPDEST SWAP8 PUSH2 0x96C PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2E7D JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA28 JUMPI POP POP POP SWAP2 PUSH2 0x9A1 PUSH2 0x9A9 SWAP3 PUSH2 0x9B1 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA1D JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9D1 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA17 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F7 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3322 JUMP JUMPDEST MLOAD AND PUSH2 0xA03 DUP5 DUP8 PUSH2 0x3322 JUMP JUMPDEST MLOAD PUSH2 0xA0E DUP6 DUP10 PUSH2 0x3322 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3400 JUMP JUMPDEST ADD PUSH2 0x9C8 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9C1 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xACB PUSH2 0x2C23 JUMP JUMPDEST PUSH2 0xAD3 PUSH2 0x3581 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB85 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0xC81 CALLDATASIZE PUSH2 0x2DEE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC6 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD16 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x3021 JUMP JUMPDEST PUSH2 0x33DF JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE78 JUMPI JUMPDEST POP ISZERO PUSH2 0xE4B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA5 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x3021 JUMP JUMPDEST AND SWAP1 PUSH2 0xDB5 PUSH2 0xD11 DUP3 DUP7 DUP10 PUSH2 0x3021 JUMP JUMPDEST SWAP2 PUSH2 0xDC1 DUP3 DUP8 DUP12 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x313 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x705 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE3A JUMPI JUMPDEST POP ADD PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE45 SWAP2 PUSH2 0x2E7D JUMP JUMPDEST DUP9 PUSH2 0xE33 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE99 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9F JUMPI JUMPDEST PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3569 JUMP JUMPDEST DUP10 PUSH2 0xD7B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE87 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDE JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0xF58 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1052 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8A PUSH2 0x3581 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1024 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x107C DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x391A JUMP JUMPDEST PUSH2 0xF6C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3159 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x119C PUSH2 0x2C23 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1234 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1273 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1300 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F6 PUSH2 0x3581 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14C2 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1541 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1561 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15AD PUSH2 0x3581 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x318 JUMPI PUSH2 0x15C0 DUP7 DUP9 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1626 JUMPI POP POP SWAP5 PUSH2 0x1621 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x164C PUSH2 0x1637 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH2 0x1643 DUP4 DUP10 DUP10 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x383E JUMP JUMPDEST ADD PUSH2 0x15C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x16AA CALLDATASIZE PUSH2 0x2DEE JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16ED PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1842 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1715 JUMPI STOP JUMPDEST PUSH2 0x1720 DUP2 DUP4 DUP9 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x313 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1753 PUSH2 0xD11 DUP7 DUP12 DUP15 PUSH2 0x3021 JUMP JUMPDEST DUP3 PUSH2 0x17BD PUSH2 0x17E9 PUSH2 0x1765 DUP10 DUP14 DUP14 PUSH2 0x3021 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2E7D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1839 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x180C JUMPI POP PUSH1 0x1 ADD PUSH2 0x170C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17FF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1705 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x185A CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x318 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x198F JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18D6 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1960 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x313 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x313 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x193E DUP5 DUP12 DUP11 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1957 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18CD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A2E PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AAC JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1B10 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x1B34 PUSH2 0x1BA1 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST PUSH2 0x1B93 PUSH2 0x1B3F PUSH2 0x3581 JUMP JUMPDEST SWAP3 PUSH2 0x1B6A DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3400 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x1BE4 PUSH2 0x1BDF PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x2FC2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1BFC CALLDATASIZE PUSH2 0x2D4A JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x318 JUMPI PUSH2 0x1C32 DUP6 PUSH2 0x2EED JUMP JUMPDEST SWAP5 PUSH2 0x1C40 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2E7D JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C6D DUP3 PUSH2 0x2EED JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C94 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP11 PUSH2 0x2DBA JUMP JUMPDEST DUP1 PUSH2 0x1CBB PUSH2 0x1CA8 PUSH2 0xD11 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x3021 JUMP JUMPDEST PUSH2 0x1CB3 DUP4 DUP8 DUP10 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x3031 JUMP JUMPDEST PUSH2 0x1CC5 DUP3 DUP11 PUSH2 0x3322 JUMP JUMPDEST MSTORE ADD PUSH2 0x1C77 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1D03 PUSH2 0x3BCC JUMP JUMPDEST PUSH2 0x1161 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1D54 PUSH2 0x2C23 JUMP JUMPDEST PUSH2 0x1D5C PUSH2 0x3581 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E0F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1EDD PUSH2 0x2C00 JUMP JUMPDEST PUSH2 0x1EE5 PUSH2 0x2C23 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F05 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F27 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1F48 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1F53 PUSH2 0x3581 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22BC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x75B JUMPI DUP10 DUP12 SUB PUSH2 0x318 JUMPI PUSH2 0x1FFD DUP3 DUP5 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x2272 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x2243 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2068 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2072 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2087 PUSH2 0x208F SWAP3 PUSH2 0x2097 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP3 PUSH2 0x2147 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2117 PUSH2 0x20E7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2DBA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2DBA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2224 JUMPI JUMPDEST POP AND SUB PUSH2 0x21AA JUMPI STOP JUMPDEST PUSH2 0x2220 SWAP1 PUSH2 0x21F0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2DBA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2DBA JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x223D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP7 PUSH2 0x21A1 JUMP JUMPDEST DUP1 PUSH2 0x226C DUP13 PUSH2 0x2262 DUP16 SWAP5 PUSH2 0x225A DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x3021 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3A05 JUMP JUMPDEST ADD PUSH2 0x2005 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x22C5 SWAP2 PUSH2 0x391A JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1FAA JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2426 JUMPI JUMPDEST ISZERO PUSH2 0x23F0 JUMPI POP POP PUSH2 0x1161 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1161 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2413 JUMPI PUSH2 0x240D SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3336 JUMP JUMPDEST DIV PUSH2 0x23C0 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2421 SWAP3 DIV PUSH2 0x3336 JUMP JUMPDEST PUSH2 0x23C0 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23B3 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x247D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x198F JUMPI PUSH2 0x24F9 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2D0B JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x2535 PUSH2 0x2C00 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x2564 PUSH2 0x3581 JUMP JUMPDEST SWAP3 PUSH2 0x2570 DUP5 DUP7 DUP4 PUSH2 0x37BE JUMP JUMPDEST ISZERO PUSH2 0x25CF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x25BE PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x383E JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x26A7 PUSH2 0x3581 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27E7 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP6 PUSH2 0x2C69 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x27F6 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2867 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x286B JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2867 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x282D DUP5 PUSH2 0x2F51 JUMP JUMPDEST SWAP3 PUSH2 0x283B PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E7D JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2864 JUMPI POP PUSH2 0x1161 SWAP3 PUSH2 0x285E SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2C46 JUMP JUMPDEST SWAP1 PUSH2 0x27D1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x28A6 PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x28C6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x28E8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x297C SWAP4 PUSH2 0x2912 PUSH2 0x2984 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2CDD JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2974 PUSH2 0x2920 PUSH2 0x3581 JUMP JUMPDEST SWAP7 PUSH2 0x294B DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3260 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2F05 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2F8B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2AA7 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2A7D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2A1E PUSH2 0x2A10 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2DBA JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2DBA JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2A28 JUMPI STOP JUMPDEST PUSH2 0x2147 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2117 PUSH2 0x20E7 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2DBA JUMP JUMPDEST DUP1 PUSH2 0x2AA1 PUSH2 0x2A8D PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3322 JUMP JUMPDEST MLOAD PUSH2 0x2A98 DUP4 DUP12 PUSH2 0x3322 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x36A9 JUMP JUMPDEST ADD PUSH2 0x29B1 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3159 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1BE4 PUSH1 0x20 SWAP2 PUSH2 0x30AA JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x2BF8 PUSH2 0x2BCE PUSH2 0x2C00 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x3031 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2C59 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2C49 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2CA5 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2C46 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2D93 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x2DB6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DD8 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2DCB JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2E37 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x2E5A SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x2DB6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2CAC JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2EBE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2EBE JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2F11 DUP2 PUSH2 0x2EED JUMP JUMPDEST SWAP4 PUSH2 0x2F1F PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2E7D JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x313 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2F41 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F35 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2EBE JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2F97 DUP3 PUSH2 0x2F51 JUMP JUMPDEST SWAP2 PUSH2 0x2FA5 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E7D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x313 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x301A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x3080 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3153 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x314D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3256 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3229 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x31E9 JUMPI POP PUSH1 0x1 EQ PUSH2 0x31A2 JUMPI JUMPDEST POP PUSH2 0x31A0 SWAP3 POP SUB DUP4 PUSH2 0x2E7D JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x31CD JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x31A0 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3193 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x31B4 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x31A0 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3193 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3173 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x32BA JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3349 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x33CE SWAP1 PUSH2 0x33DC SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3378 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3378 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2AA7 JUMPI PUSH2 0x3445 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x36A9 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3487 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x34E2 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2C69 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x354A JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI DUP1 DUP1 PUSH2 0x3480 JUMP JUMPDEST PUSH2 0x3563 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x353C JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x369A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x369F JUMPI JUMPDEST PUSH2 0x369A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3609 JUMPI JUMPDEST POP PUSH2 0x33DC JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x367B JUMPI JUMPDEST POP CODESIZE PUSH2 0x35FF JUMP JUMPDEST PUSH2 0x3694 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x3674 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x35C8 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x36B7 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x372D JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x36B1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x37E9 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x37E3 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x384B JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x38C1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x36B1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x39FB JUMPI JUMPDEST PUSH2 0x3943 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x39DC JUMPI JUMPDEST POP ISZERO PUSH2 0x39AF JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x39F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x39A6 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x393B JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3A14 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3B70 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3A8C JUMPI JUMPDEST POP PUSH2 0x3480 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3B12 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A86 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3D00 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3D08 JUMPI JUMPDEST PUSH2 0x3D00 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3C5F JUMPI JUMPDEST POP PUSH2 0x3C2E JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3CE1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3C22 JUMP JUMPDEST PUSH2 0x3CFA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x2E7D JUMP JUMPDEST CODESIZE PUSH2 0x3CDA JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3C13 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH19 0xAF6B517FF81854080D6C38A0DAACA07F835FF 0x1F CALLF 0x73D7 EXTSTATICCALL 0x2D INVALID STOP JUMPI PUSH28 0x86FB64736F6C634300081E0033000000000000000000000000000000 ","sourceMap":"483:480:121:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;483:480:121;;1952:41:230;;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;483:480:121;1845:10:192;;;;;;483:480:121;1857:3:192;1876:11;;;;;:::i;:::-;483:480:121;;;;;;;;;1898:10:192;;;;;:::i;:::-;483:480:121;1375:21:9;;;:30;1371:125;;483:480:121;1548:33:9;;;;;;;483:480:121;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;483:480:121;;1834:9:192;;1591:58:9;483:480:121;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;483:480:121;5957:19:9;483:480:121;;5957:19:9;483:480:121;;;;;1371:125:9;1455:21;;1428:57;483:480:121;1428:57:9;483:480:121;;;;;;1428:57:9;483:480:121;;;;1756:63:192;1793:26;483:480:121;1793:26:192;483:480:121;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;483:480:121;;-1:-1:-1;4538:25:42;483:480:121;;;;;;;;;;;;;:::i;:::-;;1952:41:230;;;:::i;:::-;483:480:121;;;;;;;;3205:23:42;;;3201:60;;483:480:121;;;3275:25:42;;;;3271:146;;483:480:121;3271:146:42;483:480:121;;;;;;;;3361:45:42;483:480:121;3361:45:42;;483:480:121;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;;:::i;:::-;3179:19:352;483:480:121;;;;;;;;2616:14:352;2612:76;;483:480:121;-1:-1:-1;;483:480:121;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;483:480:121;4720:5:228;;;;;;;;;:::i;:::-;483:480:121;;;;;;;4742:43:228;483:480:121;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;483:480:121;4796:104:228;483:480:121;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;483:480:121;19356:74:228;;483:480:121;19356:74:228;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;483:480:121;19356:74:228;;;;;;;;483:480:121;19356:74:228;483:480:121;19356:74:228;483:480:121;19356:74:228;;;4796:104;483:480:121;;19356:101:228;19352:168;;483:480:121;19352:168:228;19478:42;483:480:121;19478:42:228;483:480:121;;;;;;;;19478:42:228;19356:74;;;;483:480:121;19356:74:228;483:480:121;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;483:480:121;;;;;;;;;4601:76:228;483:480:121;4645:32:228;;;;483:480:121;4645:32:228;483:480:121;;;;;;;;4645:32:228;4532:59;4561:30;483:480:121;4561:30:228;483:480:121;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;483:480:121;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;483:480:121;-1:-1:-1;483:480:121;14847:11:228;483:480:121;;;;-1:-1:-1;483:480:121;14847:28:228;483:480:121;-1:-1:-1;483:480:121;;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;483:480:121;1367:6:208;:::i;:::-;483:480:121;974:8:208;;;;:::i;:::-;483:480:121;;;;;;;:::i;:::-;974:8:208;;;483:480:121;974:8:208;;;;;;;483:480:121;;974:8:208;;;;;;;;;;;483:480:121;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;483:480:121;11728:10:228;;;;;;483:480:121;11740:3:228;11778:13;11812:4;11778:13;483:480:121;11778:13:228;483:480:121;11778:13:228;;;:::i;:::-;483:480:121;;11793:6:228;;;;:::i;:::-;483:480:121;11801:9:228;;;;:::i;:::-;483:480:121;11812:4:228;;;;:::i;:::-;483:480:121;11717:9:228;;11620:47;483:480:121;;;11644:23:228;;;11620:47;;974:8:208;483:480:121;;;;;;;;;974:8:208;;483:480:121;974:8:208;;;;;;;483:480:121;;;;;;;;;;;;;;713:6:351;483:480:121;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;:::i;:::-;5148:19:42;483:480:121;;;;;;;4503:26:42;;;4499:64;;4464:19:41;483:480:121;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;1880:140:41;;483:480:121;1880:140:41;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;483:480:121;;;;1973:36:41;;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;483:480:121;;;1952:41:230;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;483:480:121;3852:94:192;;483:480:121;3972:10:192;;;;;;483:480:121;3984:3:192;483:480:121;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;483:480:121;;;;4058:76:192;;4108:25;483:480:121;4058:76:192;;483:480:121;4058:76:192;;;;;;;;;;;;483:480:121;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;483:480:121;4239:12:192;;;;;;:::i;:::-;483:480:121;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;483:480:121;4239:70:192;;;;;;;483:480:121;;;;;;;4239:70:192;;;;;483:480:121;4239:70:192;;4277:4;483:480:121;4239:70:192;;483:480:121;;4058:76:192;483:480:121;;;;;;;4239:70:192;;;;;;;483:480:121;4239:70:192;;;3984:3;;483:480:121;3961:9:192;;4239:70;483:480:121;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;483:480:121;4161:50:192;483:480:121;;4058:76:192;483:480:121;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;483:480:121;;1952:41:230;;;:::i;:::-;483:480:121;;;14276:18:228;;;;14272:64;;483:480:121;14401:42:228;14346:19;483:480:121;-1:-1:-1;483:480:121;14346:11:228;483:480:121;;;-1:-1:-1;483:480:121;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;;;;;;;;;;;;;14401:42:228;483:480:121;14272:64:228;14303:33;;483:480:121;14303:33:228;483:480:121;;;;14303:33:228;2071:115:211;2931:8:352;668:81;483:480:121;2931:8:352;:::i;:::-;2071:115:211;;483:480:121;;;;;;;;;;;;;2991:23:341;483:480:121;;;;;;;;;;;;;;;;;;;;;2688:13:341;483:480:121;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;483:480:121;-1:-1:-1;483:480:121;;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;483:480:121;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1952:41:230;;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;2976:19:351;483:480:121;;;;;1732:22:351;1728:93;;483:480:121;;;;;;;;;;;;1728:93:351;1777:33;483:480:121;1777:33:351;483:480:121;;1777:33:351;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:41:230;;:::i;:::-;483:480:121;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;3741:25:41;3737:66;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;483:480:121;;;;2455:33:41;483:480:121;3737:66:41;483:480:121;3775:28:41;;;483:480:121;3775:28:41;483:480:121;;;;;;;3775:28:41;483:480:121;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;483:480:121;1952:41:230;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;483:480:121;13625:10:228;;;;;;483:480:121;;;13720:52:228;;483:480:121;;;;;;;;;;;;;;13720:52:228;;;:::i;:::-;;;;483:480:121;13637:3:228;13676:6;13684:9;13676:6;483:480:121;13676:6:228;;;;:::i;:::-;483:480:121;13684:9:228;;;;;:::i;:::-;483:480:121;13684:9:228;;;;:::i;:::-;483:480:121;13614:9:228;;13522:76;483:480:121;13566:32:228;;;;483:480:121;13566:32:228;483:480:121;;;;;;;;13566:32:228;483:480:121;;;;;;;:::i;:::-;5148:19:42;;;;483:480:121;;;1952:41:230;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;483:480:121;2776:90:192;;483:480:121;2892:10:192;;;;;;483:480:121;2904:3:192;2923:9;;;;;:::i;:::-;483:480:121;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;483:480:121;;;1328:43:8;;;;;;483:480:121;;;;1328:43:8;;;483:480:121;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;483:480:121;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;483:480:121;;2881:9:192;;8938:146:8;9033:40;483:480:121;9033:40:8;483:480:121;;1328:43:8;483:480:121;9033:40:8;8942:68;483:480:121;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;483:480:121;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;483:480:121;2991:23:341;483:480:121;;2464:10:209;:71;2460:115;;2591:9;483:480:121;;;;;;;2586:102:209;2602:19;;;;;;483:480:121;2623:3:209;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;483:480:121;2665:11:209;;;;;;:::i;:::-;483:480:121;;;;;;;;;;;;;;;;:::i;:::-;2647:30:209;;;483:480:121;2591:9:209;;483:480:121;;;;;;;;;;2460:115:209;2544:31;483:480:121;2544:31:209;2464:10;483:480:121;;;;2544:31:209;483:480:121;;;;;;;;;;;;;;;1952:41:230;;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;2976:19:351;483:480:121;1281:36:351;713:6;1281:36;;1277:119;;483:480:121;;;;;;;;;;;;;;;1277:119:351;1340:45;483:480:121;1340:45:351;483:480:121;;;;1340:45:351;483:480:121;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;483:480:121;;;;;;:::i;:::-;;1952:41:230;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;483:480:121;1221:6:210;:::i;:::-;483:480:121;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;483:480:121;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;483:480:121;;16447:19:228;16129:20;;;16125:59;;483:480:121;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;483:480:121;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;483:480:121;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;483:480:121;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;483:480:121;;16250:9:228;;483:480:121;;;;;;;;;;;2187:39:230;;:::i;:::-;483:480:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;:::i;:::-;5148:19:42;483:480:121;;;;;;;4503:26:42;;;4499:64;;4464:19:41;483:480:121;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;1254:25:41;1250:140;;483:480:121;1250:140:41;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;483:480:121;;;;1343:36:41;483:480:121;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;;;;:::i;:::-;3179:19:352;483:480:121;;;;;;;;2616:14:352;2612:76;;483:480:121;-1:-1:-1;;483:480:121;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;483:480:121;6801:10:228;;;;;;483:480:121;;;;;;;;;;;6904:44:228;483:480:121;6904:44:228;483:480:121;;;;;;;;;;;6904:44:228;;;;;;;;:::i;:::-;;;;376:58:354;6959:111:228;;483:480:121;6959:111:228;483:480:121;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;483:480:121;20263:81:228;;483:480:121;20263:81:228;;483:480:121;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;483:480:121;20263:81:228;;;;;;;;483:480:121;20263:81:228;483:480:121;20263:81:228;483:480:121;20263:81:228;;;6959:111;483:480:121;;20263:107:228;20259:181;;483:480:121;20259:181:228;1878:53;483:480:121;1878:53:228;483:480:121;;20391:49:228;;;;;;483:480:121;20391:49:228;;483:480:121;;;1878:53:228;;;483:480:121;1878:53:228;;;;:::i;:::-;;483:480:121;1878:53:228;;;;483:480:121;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;483:480:121;20263:81:228;483:480:121;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;483:480:121;6860:6:228;;;:::i;:::-;483:480:121;6868:9:228;;;:::i;:::-;483:480:121;6868:9:228;;;;;:::i;:::-;483:480:121;6790:9:228;;6698:76;483:480:121;6742:32:228;;;;483:480:121;6742:32:228;483:480:121;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;483:480:121;;;;;;;;;;;;;;;941:19:75;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;483:480:121;2499:377:351;;;2559:17;;483:480:121;;2499:377:351;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;483:480:121;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;483:480:121;2499:377:351;;2607:259;713:6;2794:57;483:480:121;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3529:19:341;483:480:121;2991:23:341;483:480:121;;1716:10:209;:71;1712:115;;483:480:121;1842:22:209;483:480:121;;;;;;;;;;;;;;;;;:::i;:::-;1842:22:209;;;483:480:121;;;;;;;;;;;;;;:::i;:::-;;;;;;1952:41:230;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;483:480:121;12560:5:228;;;;12581:51;12560:5;;483:480:121;12560:5:228;483:480:121;12560:5:228;;:::i;:::-;483:480:121;;;;;;;;;;;;12581:51:228;;483:480:121;12450:76:228;483:480:121;12494:32:228;;;;483:480:121;12494:32:228;483:480:121;;;;;;;;12494:32:228;483:480:121;;;;;;;;;;;;;;;;;;;;;;1952:41:230;;;:::i;:::-;483:480:121;;;;;4503:26:42;;;4499:64;;3179:19:352;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;3364:23:341;483:480:121;;;;3364:64:341;;1306:4:209;483:480:121;3364:64:341;;;483:480:121;;;;;;;;;;-1:-1:-1;;483:480:121;;;;;;;;3364:64:341;;;;;;;483:480:121;3364:64:341;;;483:480:121;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41:230;;;483:480:121;1952:41:230;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;483:480:121;1669:6:210;:::i;:::-;483:480:121;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;483:480:121;;;;;9777:23:228;;9773:62;;483:480:121;9862:10:228;;;;;;483:480:121;;;;;;;;;9955:50:228;483:480:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;483:480:121;10016:117:228;483:480:121;;;;;;20263:81:228;;;;;483:480:121;20263:81:228;;483:480:121;20263:81:228;;483:480:121;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;483:480:121;9911:6:228;;;:::i;:::-;483:480:121;9919:9:228;;;;:::i;:::-;483:480:121;9919:9:228;;;;:::i;:::-;483:480:121;9851:9:228;;9671:55;9700:26;483:480:121;9700:26:228;483:480:121;;9700:26:228;483:480:121;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;483:480:121;635:65:55;;:::i;483:480:121:-;;;;;;;;;;;;2650:44:211;483:480:121;;:::i;:::-;;;;;2650:44:211;:::i;:::-;483:480:121;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;483:480:121;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;483:480:121;;;;;;:::o;1002:301:75:-;483:480:121;1146:19:75;483:480:121;1146:53:75;;;1142:96;;483:480:121;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;483:480:121;1215:12:75;:::o;483:480:121:-;;;;;;;;;;;;:::o;15240:220:228:-;;;483:480:121;;;15358:19:228;15354:61;;15375:1;483:480:121;;;;;15375:1:228;483:480:121;15432:21:228;483:480:121;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;483:480:121;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;483:480:121;500:10:59;483:480:121;500:10:59;;;;483:480:121;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;483:480:121;1528:12:59;:::o;483:480:121:-;;;;;-1:-1:-1;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;483:480:121;;;;;-1:-1:-1;483:480:121;;-1:-1:-1;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;483:480:121;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;483:480:121;3775:28:41;;-1:-1:-1;3775:28:41;483:480:121;3775:28:41;483:480:121;;;;;-1:-1:-1;3775:28:41;483:480:121;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;483:480:121;;;8152:16:228;;;8148:55;;8236:5;;;;483:480:121;8236:5:228;;:::i;:::-;483:480:121;;;8166:1:228;483:480:121;8258:49:228;483:480:121;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;483:480:121;;;;;;19356:74:228;;;;;483:480:121;19356:74:228;;;;;483:480:121;8166:1:228;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;483:480:121;19356:74:228;483:480:121;19356:74:228;8166:1;19356:74;;;8318:110;483:480:121;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;483:480:121;19356:74:228;483:480:121;19356:74:228;;;;;;;:::i;:::-;;;;483:480:121;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;483:480:121;1029:19:76;483:480:121;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;483:480:121;;;1676:74:76;;483:480:121;;;1676:74:76;;;483:480:121;1327:10:76;483:480:121;;;;1744:4:76;483:480:121;;;;;-1:-1:-1;1676:74:76;;483:480:121;;;;;;1676:74:76;;;;;;;483:480:121;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;483:480:121;17966:1:228;483:480:121;;;;;17966:1:228;483:480:121;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;;;18123:21:228;;;;;18119:80;;483:480:121;;17966:1:228;483:480:121;;;;;17966:1:228;483:480:121;18217:18:228;483:480:121;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;17953:320:228;;;;;;18119:80;483:480:121;;18153:46:228;;;483:480:121;;;18153:46:228;;;483:480:121;;;;;;;;;;;;;;;;;;20391:49:228;483:480:121;;;;;;;;;;;;;;;;;;:::o;16846:185:228:-;483:480:121;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;483:480:121;;-1:-1:-1;483:480:121;16997:11:228;483:480:121;;;;-1:-1:-1;483:480:121;16997:27:228;483:480:121;-1:-1:-1;483:480:121;;;500:10:59;483:480:121;-1:-1:-1;483:480:121;500:10:59;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;:::o;18382:326::-;483:480:121;18395:1:228;483:480:121;;;;;18395:1:228;483:480:121;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;;;18550:21:228;;;;;18546:86;;483:480:121;;18395:1:228;483:480:121;;;;;18395:1:228;483:480:121;18650:20:228;483:480:121;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;18382:326:228;;;;;;18546:86;483:480:121;;18580:52:228;;;483:480:121;;;18580:52:228;;;483:480:121;;;;;;;;;;;;;;;;;;20391:49:228;3271:479:352;483:480:121;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;483:480:121;;;3613:51:352;483:480:121;;3613:51:352;;;;483:480:121;3613:51:352;;3648:4;3613:51;;;483:480:121;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;483:480:121;;-1:-1:-1;3691:28:352;3613:51;;;;483:480:121;3613:51:352;483:480:121;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;17037:815:228;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;483:480:121;17163:1:228;483:480:121;;;;;17163:1:228;483:480:121;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;;;17330:29:228;;;;;17326:98;;483:480:121;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;483:480:121;17163:1:228;483:480:121;;;;;17163:1:228;483:480:121;;;;-1:-1:-1;483:480:121;;;;-1:-1:-1;483:480:121;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;483:480:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;483:480:121;;17640:48:228;;;483:480:121;;;17640:48:228;;;483:480:121;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;483:480:121;;17368:56:228;;;483:480:121;;;;;17368:56:228;;;483:480:121;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;483:480:121;2065:19:76;483:480:121;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;483:480:121;720:8:80;483:480:121;720:8:80;;483:480:121;;;;2115:1:76;2802:32;;:::o;2624:153::-;483:480:121;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;483:480:121;2361:10:76;483:480:121;;;;2771:4:76;483:480:121;;;;;-1:-1:-1;2682:95:76;;483:480:121;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"3137600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"782","ROYALTY_FEE_DENOMINATOR()":"826","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchBurnFrom(address,uint256[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","isApprovedForAll(address,address)":"3245","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2715","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2716","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2455","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchBurnFrom(address,uint256[],uint256[])":"80534934","batchSetTokenURI(uint256[],string[])":"6706467b","burnFrom(address,uint256,uint256)":"124d91e5","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155FullBurnMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol\":\"ERC1155FullBurnMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/preset/ERC1155FullBurnMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ERC1155FullBurn} from \\\"./../../../../token/ERC1155/preset/ERC1155FullBurn.sol\\\";\\n\\n/// @title ERC1155FullBurnMock\\ncontract ERC1155FullBurnMock is ERC1155FullBurn {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC1155FullBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xf269df93f957b3c2b2e0d54578fe90bf20fce124209995a9c3d606f0371ec3ed\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./base/ERC1155BurnableBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Burnable is ERC1155BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable\\n    constructor() {\\n        ERC1155Storage.initERC1155Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0x3a83ffae95480cf133b1bdc247455b5c5e812ea66be6092e27f738b11e4951fa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./base/ERC1155DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\\n    constructor() {\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x66d13c9e643f22c8bebea5c0266b175a4b4868616453832c5a1ca819c560f389\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./base/ERC1155MetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0x0fb7629855ad3af8c8e677fffc7b32c891b9346a2cb86986a0be8ab045fa88a4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC1155Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xb9ba2417238c386a02e193f03882682ab0f043bb84eff39287985c11fc2c1bed\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/ERC1155FullBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155WithOperatorFilterer} from \\\"./../ERC1155WithOperatorFilterer.sol\\\";\\nimport {ERC1155Metadata} from \\\"./../ERC1155Metadata.sol\\\";\\nimport {ERC1155Mintable} from \\\"./../ERC1155Mintable.sol\\\";\\nimport {ERC1155Deliverable} from \\\"./../ERC1155Deliverable.sol\\\";\\nimport {ERC1155Burnable} from \\\"./../ERC1155Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullBurn is\\n    ERC1155WithOperatorFilterer,\\n    ERC1155Metadata,\\n    ERC1155Mintable,\\n    ERC1155Deliverable,\\n    ERC1155Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC1155WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd2ff6a780dbc2048a7cb5d57fecff50f0b777c72d1e3eced787ba55f7233fa09\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol":{"ERC1155FullMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155FullMock","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1549,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1512,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105e35761405480380380610019816105e8565b928339810160a0828203126105e35781516001600160401b0381116105e3578161004491840161060d565b602083015190916001600160401b0382116105e35761006491840161060d565b60408301519092906001600160a01b038116908190036105e35760608201516001600160a01b03811692908390036105e35760800151926001600160a01b03841684036105e35733610584575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff199081166001908117909255636cdb3d1360e11b6000527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a805490911690911790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b0319169094179093558051906001600160401b03821161045a576000805160206140148339815191525490600182811c9216801561057a575b602083101461043a5781601f8493116104fd575b50602090601f831160011461047b57600092610470575b50508160011b916000199060031b1c191617600080516020614014833981519152555b83516001600160401b03811161045a5760008051602061403483398151915254600181811c91168015610450575b602082101461043a57601f81116103c8575b50602094601f82116001146103475794819293949560009261033c575b50508160011b916000199060031b1c191617600080516020614034833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b0319169190911790556303a24d0760e21b60009081526020919091526040808220805460ff199081166001908117909255631464324b60e21b84528284208054821683179055633a2ae73360e21b8452828420805482168317905563152a902d60e11b8452928290208054909316179091556080919091525161399b9081610679823960805181818161218801528181612d2f015281816132c401526138360152f35b01519050388061024c565b601f19821695600080516020614034833981519152600052806000209160005b8881106103b057508360019596979810610397575b505050811b016000805160206140348339815191525561026f565b015160001960f88460031b161c1916905538808061037c565b91926020600181928685015181550194019201610367565b6000805160206140348339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610430575b601f0160051c01905b818110610424575061022f565b60008155600101610417565b909150819061040e565b634e487b7160e01b600052602260045260246000fd5b90607f169061021d565b634e487b7160e01b600052604160045260246000fd5b0151905038806101cc565b60008051602061401483398151915260009081528281209350601f198516905b8181106104e557509084600195949392106104cc575b505050811b01600080516020614014833981519152556101ef565b015160001960f88460031b161c191690553880806104b1565b9293602060018192878601518155019501930161049b565b6000805160206140148339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c81019160208510610570575b90601f859493920160051c01905b81811061056157506101b5565b60008155849350600101610554565b9091508190610546565b91607f16916101a1565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761045a57604052565b81601f820112156105e3578051906001600160401b03821161045a5761063c601f8301601f19166020016105e8565b92828452602083830101116105e35760005b82811061066357505060206000918301015290565b8060208092840101518282870101520161064e56fe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146128e857806301ffc9a71461288257806306fdde03146128275780630d6a5bbb146125c55780630e89341c1461246e578063114ba8ee1461236f578063162094c41461229f5780632a55205a146121ac5780632b4c9f161461213d5780632eb2c2d614611cfe5780632f2ff15d14611b7257806331e66e1e14611b245780634e1273f414611a46578063572b6c05146119fb5780635cfa92971461193157806361ba27da146118155780636706467b146116a457806373c8a958146114f45780638bb9c5bf146113855780638da5cb5b146113145780638dc251e3146111e757806391d148541461114f57806395d89b41146110dc578063a0c76f621461106b578063a22cb46514610f0b578063b0ccc31e14610e9a578063c3666c3614610c5d578063d539139314610c04578063d547741f14610a7b578063e1a8bf2c14610a3f578063e8ab9ccc14610833578063e985e9c51461077f578063f242432a1461044d578063f2fde38b146103595763f7ba94bd1461019c57600080fd5b346102fd576101aa36612aa0565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101eb6132ad565b925416911690810361032c57508181036103025760005b81811061020b57005b610216818387612d77565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102fd57610240828587612d77565b35908147106102cb57600080809381935af13d156102c3573d9061026382612ca7565b916102716040519384612bd3565b82523d6000602084013e5b1561028a5750600101610202565b80511561029957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061027c565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610390612956565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103ba6132ad565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361032c575073ffffffffffffffffffffffffffffffffffffffff16918282036103fe57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610484612956565b61048c612979565b604435906064359260843567ffffffffffffffff81116102fd576104b4903690600401612a33565b926104bd6132ad565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361076f575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86128615610745576105608287836135d8565b156106fb5773ffffffffffffffffffffffffffffffffffffffff916105898a8a878a8796613658565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105c657005b6020926105d4913691612ce1565b9261062a60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906129bf565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106c0575b50160361068d57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106e2915060203d6020116106e8575b6106da8183612bd3565b8101906134b5565b86610684565b503d6106d0565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b610778916134ed565b8785610514565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576107b6612956565b73ffffffffffffffffffffffffffffffffffffffff6107d3612979565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd57610882903690600401612a02565b60243567ffffffffffffffff81116102fd576108a2903690600401612a02565b929060443567ffffffffffffffff81116102fd576108c4903690600401612a02565b93909160643567ffffffffffffffff81116102fd576108e7903690600401612a33565b9390916108f26132ad565b9761091d897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461094881612c43565b97610956604051998a612bd3565b818952602089019160051b8101903682116102fd57915b818310610a12575050509161098b6109939261099b95943691612c5b565b973691612c5b565b933691612ce1565b9183519480518614801590610a07575b6103025760005b8681106109bb57005b80610a018673ffffffffffffffffffffffffffffffffffffffff6109e16001958b613078565b51166109ed8487613078565b516109f88589613078565b51918d8a61312c565b016109b2565b5081518614156109ab565b823573ffffffffffffffffffffffffffffffffffffffff811681036102fd5781526020928301920161096d565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020604051620186a08152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435610ab5612979565b610abd6132ad565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102fd57610c6b36612b44565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cb06132ad565b925416911690810361032c5750808214801590610e90575b6103025760005b828110610cd857005b73ffffffffffffffffffffffffffffffffffffffff610d00610cfb83858a612d77565b61310b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106ef57600091610e62575b5015610e35575073ffffffffffffffffffffffffffffffffffffffff610d8f610cfb83858a612d77565b1690610d9f610cfb828689612d77565b91610dab82878b612d77565b3592813b156102fd57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106ef57600192610e24575b5001610ccf565b6000610e2f91612bd3565b88610e1d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e83915060203d8111610e89575b610e7b8183612bd3565b810190613295565b89610d65565b503d610e71565b5082821415610cc8565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610f42612956565b60243590811515918281036102fd5761103c575b73ffffffffffffffffffffffffffffffffffffffff80610f746132ad565b1691169181831461100e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611066817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134ed565b610f56565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5612eaf565b6040519182916020835260208301906129bf565b0390f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611186612979565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761121e612956565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061125d6132ad565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112ea5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113e06132ad565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114ac5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bff565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102fd5761150236612b44565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115456132ad565b925416911690810361032c575080841480159061169a575b6103025760005b84811061156d57005b611578818388612d77565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102fd5760006020916115ab610cfb868b8e612d77565b826116156116416115bd898d8d612d77565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612bd3565b51925af1156106ef576000513d6116915750803b155b6116645750600101611564565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611657565b508284141561155d565b346102fd576116b236612aa0565b8083949293036103025773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117e757916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172e57005b848110156117b8578060051b820135838112156102fd5782019081359167ffffffffffffffff83116102fd576020019180360383136102fd577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611796848b8a612d77565b35926117af604051928392602084526020840191612a61565b0390a201611725565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118866132ad565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161190457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611968612956565b6064359067ffffffffffffffff82116102fd5761198c6119f9923690600401612a33565b6119eb6119976132ad565b926119c2847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612ce1565b92604435926024359261312c565b005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020611a3c611a37612956565b612d18565b6040519015158152f35b346102fd57611a5436612aa0565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030257611a8a85612c43565b94611a986040519687612bd3565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ac582612c43565b0136602088013760005b818110611aec576040516020808252819061114b9082018a612b10565b80611b13611b00610cfb600194868b612d77565b611b0b838789612d77565b359088612d87565b611b1d828a613078565b5201611acf565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611b5b61381f565b61114b604051928392602084526020840191612a61565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435611bac612979565b611bb46132ad565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c6757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bff565b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611d35612956565b611d3d612979565b60443567ffffffffffffffff81116102fd57611d5d903690600401612a02565b929060643567ffffffffffffffff81116102fd57611d7f903690600401612a02565b9360843567ffffffffffffffff81116102fd57611da0903690600401612a33565b939091611dab6132ad565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff82160361212d575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561074557898b0361030257611e558284836135d8565b156120e35760005b8b81106120b4575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611ed960405192839260408452611ecb8d60408601908d6130ce565b9184830360208601526130ce565b0390a43b611ee357005b602094611ef8611f0092611f08953691612c5b565b993691612c5b565b953691612ce1565b92611fb860405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f88611f5860a485018b612b10565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612b10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526129bf565b03816000875af19081156106ef577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612095575b50160361201b57005b612091906120616040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612b10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612b10565b0390fd5b6120ae915060203d6020116106e8576106da8183612bd3565b86612012565b806120dd8c6120d38f946120cb816001978d612d77565b35928d612d77565b3590888887613658565b01611e5d565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b612136916134ed565b8987611e02565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612297575b1561226157505061114b60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114b91620186a08210156122845761227e90620186a09261308c565b04612231565b620186a0612292920461308c565b612231565b508115612224565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760243567ffffffffffffffff81116102fd576122ee903690600401612a33565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117e75761236a7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191612a61565b0390a2005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043573ffffffffffffffffffffffffffffffffffffffff811681036102fd577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123fd6132ad565b925416911690810361032c575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106ef5760009161253d575b6040516020808252819061114b908201856129bf565b3d8083833e61254c8183612bd3565b8101906020818303126125bd5780519067ffffffffffffffff82116125c1570181601f820112156125bd5780519261258384612ca7565b926125916040519485612bd3565b848452602085840101116125ba575061114b926125b4916020808501910161299c565b90612527565b80fd5b8280fd5b8380fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576125fc612956565b60243567ffffffffffffffff81116102fd5761261c903690600401612a02565b909160443567ffffffffffffffff81116102fd5761263e903690600401612a02565b93909160643567ffffffffffffffff81116102fd576126d2936126686126da923690600401612a33565b9590916126ca6126766132ad565b966126a1887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612c5b565b983691612c5b565b943691612ce1565b9173ffffffffffffffffffffffffffffffffffffffff82169485156127fd57865190855182036103025760005b8281106127d35750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806127746127668d6040840190612b10565b82810360208401528b612b10565b0390a43b61277e57005b611fb89160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f88611f5860a485018b612b10565b806127f76127e36001938c613078565b516127ee838b613078565b519088866133d8565b01612707565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4612eaf565b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd57611a3c602091612e00565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602061294e612924612956565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612d87565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b60005b8381106129af5750506000910152565b818101518382015260200161299f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936129fb8151809281875287808801910161299c565b0116010190565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd576020808501948460051b0101116102fd57565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd57602083818601950101116102fd57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd5781612ae991600401612a02565b929092916024359067ffffffffffffffff82116102fd57612b0c91600401612a02565b9091565b906020808351928381520192019060005b818110612b2e5750505090565b8251845260209384019390920191600101612b21565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd5781612b8d91600401612a02565b9290929160243567ffffffffffffffff81116102fd5781612bb091600401612a02565b929092916044359067ffffffffffffffff82116102fd57612b0c91600401612a02565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c1457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612c145760051b60200190565b929190612c6781612c43565b93612c756040519586612bd3565b602085838152019160051b81019283116102fd57905b828210612c9757505050565b8135815260209182019101612c8b565b67ffffffffffffffff8111612c1457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612ced82612ca7565b91612cfb6040519384612bd3565b8294818452818301116102fd578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d705773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117b85760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff831615612dd65760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ea9577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612ea3576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015612fac575b602085108114612f7f57848752869392918115612f3f5750600114612ef8575b50612ef692500383612bd3565b565b90506000929192526020600020906000915b818310612f23575050906020612ef69282010138612ee9565b6020919350806001915483858901015201910190918492612f0a565b60209350612ef69592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee9565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693612ec9565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156130105750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117b85760209160051b010190565b8181029291811591840414171561309f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102fd5760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102fd5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156127fd5761317187878573ffffffffffffffffffffffffffffffffffffffff956133d8565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b6131b3575b5050505050565b61320e9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906129bf565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613276575b50160361068d5780806131ac565b61328f915060203d6020116106e8576106da8183612bd3565b38613268565b908160209103126102fd575180151581036102fd5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156133c95732331480156133ce575b6133c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613338575b5061333557503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106ef576000916133aa575b503861332b565b6133c3915060203d602011610e8957610e7b8183612bd3565b386133a3565b503390565b50601836106132f4565b9091836133e6575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561345c57505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806133e0565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102fd57517fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd5790565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806135ce575b613516575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106ef576000916135af575b50156135825750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135c8915060203d602011610e8957610e7b8183612bd3565b38613579565b50813b151561350e565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613603575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806135fd565b91929084613667575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156137c3575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff8216036136df575b506131ac565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561376557505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806136d9565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561395357323314801561395b575b613953578033149081156138b2575b50613881576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102fd5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156106ef57600091613934575b5038613875565b61394d915060203d602011610e8957610e7b8183612bd3565b3861392d565b506000903690565b506018361061386656fea2646970667358221220ddfb3f399e37e2392720998d8e941bcc1aee18c592ae446c7cc10f4c5bdb027564736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5E3 JUMPI PUSH2 0x4054 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5E8 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x5E3 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5E3 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x60D JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5E3 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x60D JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x5E3 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x5E3 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x5E3 JUMPI CALLER PUSH2 0x584 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x6CDB3D13 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x45A JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4014 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x57A JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x43A JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x4FD JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x47B JUMPI PUSH1 0x0 SWAP3 PUSH2 0x470 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4014 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x45A JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4034 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x450 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x43A JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3C8 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x347 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x33C JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4034 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x3A24D07 PUSH1 0xE2 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x1464324B PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x3A2AE733 PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x399B SWAP1 DUP2 PUSH2 0x679 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2188 ADD MSTORE DUP2 DUP2 PUSH2 0x2D2F ADD MSTORE DUP2 DUP2 PUSH2 0x32C4 ADD MSTORE PUSH2 0x3836 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24C JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4034 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3B0 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x397 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4034 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x26F JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x37C JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x367 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4034 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x430 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x424 JUMPI POP PUSH2 0x22F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x417 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x40E JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x21D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4014 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4E5 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4CC JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4014 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x1EF JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4B1 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x49B JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4014 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x570 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x561 JUMPI POP PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x554 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x546 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1A1 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x45A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5E3 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x45A JUMPI PUSH2 0x63C PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5E8 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5E3 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x663 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x64E JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x28E8 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2882 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2827 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x25C5 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x246E JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x236F JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x229F JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x21AC JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x213D JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1CFE JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B72 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B24 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A46 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19FB JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1931 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1815 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16A4 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14F4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1385 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1314 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11E7 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x114F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10DC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x106B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF0B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE9A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC5D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC04 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA7B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA3F JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x833 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x44D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x359 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1AA CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EB PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP2 DUP2 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x20B JUMPI STOP JUMPDEST PUSH2 0x216 DUP2 DUP4 DUP8 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x240 DUP3 DUP6 DUP8 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2C3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x263 DUP3 PUSH2 0x2CA7 JUMP JUMPDEST SWAP2 PUSH2 0x271 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BD3 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x28A JUMPI POP PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x299 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x27C JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x390 PUSH2 0x2956 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3BA PUSH2 0x32AD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3FE JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x484 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x48C PUSH2 0x2979 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x4B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP3 PUSH2 0x4BD PUSH2 0x32AD JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x76F JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x745 JUMPI PUSH2 0x560 DUP3 DUP8 DUP4 PUSH2 0x35D8 JUMP JUMPDEST ISZERO PUSH2 0x6FB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x589 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3658 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5C6 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5D4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH2 0x62A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6C0 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI JUMPDEST PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x34B5 JUMP JUMPDEST DUP7 PUSH2 0x684 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x778 SWAP2 PUSH2 0x34ED JUMP JUMPDEST DUP8 DUP6 PUSH2 0x514 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x7B6 PUSH2 0x2956 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D3 PUSH2 0x2979 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x882 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8A2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8E7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8F2 PUSH2 0x32AD JUMP JUMPDEST SWAP8 PUSH2 0x91D DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x948 DUP2 PUSH2 0x2C43 JUMP JUMPDEST SWAP8 PUSH2 0x956 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA12 JUMPI POP POP POP SWAP2 PUSH2 0x98B PUSH2 0x993 SWAP3 PUSH2 0x99B SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA07 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9BB JUMPI STOP JUMPDEST DUP1 PUSH2 0xA01 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E1 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3078 JUMP JUMPDEST MLOAD AND PUSH2 0x9ED DUP5 DUP8 PUSH2 0x3078 JUMP JUMPDEST MLOAD PUSH2 0x9F8 DUP6 DUP10 PUSH2 0x3078 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x312C JUMP JUMPDEST ADD PUSH2 0x9B2 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9AB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAB5 PUSH2 0x2979 JUMP JUMPDEST PUSH2 0xABD PUSH2 0x32AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB6F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0xC6B CALLDATASIZE PUSH2 0x2B44 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCB0 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE90 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCD8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD00 PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x2D77 JUMP JUMPDEST PUSH2 0x310B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE62 JUMPI JUMPDEST POP ISZERO PUSH2 0xE35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD8F PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x2D77 JUMP JUMPDEST AND SWAP1 PUSH2 0xD9F PUSH2 0xCFB DUP3 DUP7 DUP10 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 PUSH2 0xDAB DUP3 DUP8 DUP12 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2FD JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE24 JUMPI JUMPDEST POP ADD PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE2F SWAP2 PUSH2 0x2BD3 JUMP JUMPDEST DUP9 PUSH2 0xE1D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE83 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE89 JUMPI JUMPDEST PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3295 JUMP JUMPDEST DUP10 PUSH2 0xD65 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE71 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCC8 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0xF42 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x103C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF74 PUSH2 0x32AD JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x100E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1066 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34ED JUMP JUMPDEST PUSH2 0xF56 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x2EAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1186 PUSH2 0x2979 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x121E PUSH2 0x2956 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x125D PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12EA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13E0 PUSH2 0x32AD JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14AC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1502 CALLDATASIZE PUSH2 0x2B44 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1545 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x169A JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x156D JUMPI STOP JUMPDEST PUSH2 0x1578 DUP2 DUP4 DUP9 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15AB PUSH2 0xCFB DUP7 DUP12 DUP15 PUSH2 0x2D77 JUMP JUMPDEST DUP3 PUSH2 0x1615 PUSH2 0x1641 PUSH2 0x15BD DUP10 DUP14 DUP14 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2BD3 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1691 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1664 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1564 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1657 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x155D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x16B2 CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x302 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17E7 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x172E JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17B8 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2FD JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x2FD JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1796 DUP5 DUP12 DUP11 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17AF PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1725 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1886 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1904 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1968 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x198C PUSH2 0x19F9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST PUSH2 0x19EB PUSH2 0x1997 PUSH2 0x32AD JUMP JUMPDEST SWAP3 PUSH2 0x19C2 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x312C JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x1A3C PUSH2 0x1A37 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x2D18 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1A54 CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x302 JUMPI PUSH2 0x1A8A DUP6 PUSH2 0x2C43 JUMP JUMPDEST SWAP5 PUSH2 0x1A98 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2BD3 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AC5 DUP3 PUSH2 0x2C43 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AEC JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP11 PUSH2 0x2B10 JUMP JUMPDEST DUP1 PUSH2 0x1B13 PUSH2 0x1B00 PUSH2 0xCFB PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2D77 JUMP JUMPDEST PUSH2 0x1B0B DUP4 DUP8 DUP10 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x1B1D DUP3 DUP11 PUSH2 0x3078 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ACF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1B5B PUSH2 0x381F JUMP JUMPDEST PUSH2 0x114B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BAC PUSH2 0x2979 JUMP JUMPDEST PUSH2 0x1BB4 PUSH2 0x32AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C67 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1D35 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x1D3D PUSH2 0x2979 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D5D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D7F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1DA0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1DAB PUSH2 0x32AD JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x212D JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x745 JUMPI DUP10 DUP12 SUB PUSH2 0x302 JUMPI PUSH2 0x1E55 DUP3 DUP5 DUP4 PUSH2 0x35D8 JUMP JUMPDEST ISZERO PUSH2 0x20E3 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x20B4 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1ED9 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1ECB DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x30CE JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x30CE JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1EE3 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1EF8 PUSH2 0x1F00 SWAP3 PUSH2 0x1F08 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH2 0x1FB8 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F88 PUSH2 0x1F58 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2B10 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2B10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2095 JUMPI JUMPDEST POP AND SUB PUSH2 0x201B JUMPI STOP JUMPDEST PUSH2 0x2091 SWAP1 PUSH2 0x2061 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2B10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2B10 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x20AE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP7 PUSH2 0x2012 JUMP JUMPDEST DUP1 PUSH2 0x20DD DUP13 PUSH2 0x20D3 DUP16 SWAP5 PUSH2 0x20CB DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3658 JUMP JUMPDEST ADD PUSH2 0x1E5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2136 SWAP2 PUSH2 0x34ED JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1E02 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2297 JUMPI JUMPDEST ISZERO PUSH2 0x2261 JUMPI POP POP PUSH2 0x114B PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x114B SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2284 JUMPI PUSH2 0x227E SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x308C JUMP JUMPDEST DIV PUSH2 0x2231 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2292 SWAP3 DIV PUSH2 0x308C JUMP JUMPDEST PUSH2 0x2231 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2224 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x22EE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17E7 JUMPI PUSH2 0x236A PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23FD PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x253D JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP6 PUSH2 0x29BF JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x254C DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x25BD JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25C1 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x25BD JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2583 DUP5 PUSH2 0x2CA7 JUMP JUMPDEST SWAP3 PUSH2 0x2591 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2BD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x25BA JUMPI POP PUSH2 0x114B SWAP3 PUSH2 0x25B4 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x299C JUMP JUMPDEST SWAP1 PUSH2 0x2527 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x25FC PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x261C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x263E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x26D2 SWAP4 PUSH2 0x2668 PUSH2 0x26DA SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x26CA PUSH2 0x2676 PUSH2 0x32AD JUMP JUMPDEST SWAP7 PUSH2 0x26A1 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x27FD JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x27D3 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2774 PUSH2 0x2766 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2B10 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2B10 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x277E JUMPI STOP JUMPDEST PUSH2 0x1FB8 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F88 PUSH2 0x1F58 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2B10 JUMP JUMPDEST DUP1 PUSH2 0x27F7 PUSH2 0x27E3 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3078 JUMP JUMPDEST MLOAD PUSH2 0x27EE DUP4 DUP12 PUSH2 0x3078 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x33D8 JUMP JUMPDEST ADD PUSH2 0x2707 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x2EAF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x1A3C PUSH1 0x20 SWAP2 PUSH2 0x2E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x294E PUSH2 0x2924 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x29AF JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x299F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x29FB DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x299C JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2AE9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x2B0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2B2E JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2B21 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2B8D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2BB0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x2B0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C14 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C14 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2C67 DUP2 PUSH2 0x2C43 JUMP JUMPDEST SWAP4 PUSH2 0x2C75 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2BD3 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2FD JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2C97 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2C8B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C14 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2CED DUP3 PUSH2 0x2CA7 JUMP JUMPDEST SWAP2 PUSH2 0x2CFB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BD3 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2FD JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D70 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17B8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x2DD6 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2EA9 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2EA3 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x2FAC JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x2F7F JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x2F3F JUMPI POP PUSH1 0x1 EQ PUSH2 0x2EF8 JUMPI JUMPDEST POP PUSH2 0x2EF6 SWAP3 POP SUB DUP4 PUSH2 0x2BD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2F23 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2EF6 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2F0A JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2EF6 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x2EC9 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3010 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17B8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x309F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x27FD JUMPI PUSH2 0x3171 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x33D8 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x31B3 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x320E SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3276 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI DUP1 DUP1 PUSH2 0x31AC JUMP JUMPDEST PUSH2 0x328F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x3268 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x33C9 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x33CE JUMPI JUMPDEST PUSH2 0x33C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3338 JUMPI JUMPDEST POP PUSH2 0x3335 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x33AA JUMPI JUMPDEST POP CODESIZE PUSH2 0x332B JUMP JUMPDEST PUSH2 0x33C3 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x33A3 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x32F4 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x33E6 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x345C JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x33E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x35CE JUMPI JUMPDEST PUSH2 0x3516 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x35AF JUMPI JUMPDEST POP ISZERO PUSH2 0x3582 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35C8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x3579 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x350E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3603 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x35FD JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3667 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x37C3 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x36DF JUMPI JUMPDEST POP PUSH2 0x31AC JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3765 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x36D9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3953 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x395B JUMPI JUMPDEST PUSH2 0x3953 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x38B2 JUMPI JUMPDEST POP PUSH2 0x3881 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3934 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3875 JUMP JUMPDEST PUSH2 0x394D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x392D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3866 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD EXTSTATICCALL EXTCODEHASH CODECOPY SWAP15 CALLDATACOPY 0xE2 CODECOPY 0x27 KECCAK256 SWAP10 DUP14 DUP15 SWAP5 SHL 0xCC BYTE RETURNCONTRACT 0x18 0xC5 SWAP3 0xAE PREVRANDAO PUSH13 0x7CC10F4C5BDB027564736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 ","sourceMap":"471:468:122:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;1499:10:229;1645:152:42;;-1:-1:-1;471:468:122;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;;471:468:122;;;-1:-1:-1;;;;;;471:468:122;;;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;-1:-1:-1;;;;;;;;;;;471:468:122;;990:1:42;471:468:122;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;990:1:42;471:468:122;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;471:468:122;;;;-1:-1:-1;;;;;471:468:122;;;;-1:-1:-1;;;;;;;;;;;471:468:122;990:1:42;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;990:1:42;471:468:122;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;471:468:122;;1289:23:341;471:468:122;;-1:-1:-1;;;;;;471:468:122;;;;;;;-1:-1:-1;;;;500:10:59;;;471:468:122;500:10:59;;;;471:468:122;500:10:59;;;;;-1:-1:-1;;500:10:59;;;471:468:122;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;471:468:122;745:39:76;;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;471:468:122;;-1:-1:-1;471:468:122;;-1:-1:-1;471:468:122;;;;;;;;990:1:42;471:468:122;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;471:468:122;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;990:1:42;471:468:122;;;;;;-1:-1:-1;471:468:122;;;;;;;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;;;;;;;;;;;;471:468:122;;;;;;;-1:-1:-1;;;471:468:122;;;;;;;;;;;;990:1:42;471:468:122;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;471:468:122;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;471:468:122;;;-1:-1:-1;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;-1:-1:-1;990:1:42;471:468:122;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;1645:152:42;471:468:122;;;-1:-1:-1;;;;;;471:468:122;1499:10:229;471:468:122;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;471:468:122;-1:-1:-1;471:468:122;;;;;;;;;-1:-1:-1;;471:468:122;;;-1:-1:-1;;;;;471:468:122;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;471:468:122;;;;;;;;-1:-1:-1;;471:468:122;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;-1:-1:-1;471:468:122;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":10617,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11076,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":10912,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":10754,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":11355,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":11489,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":12949,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":13493,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":10803,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":10582,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":11024,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":12494,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":10849,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":10687,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":11331,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11431,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":11639,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":12428,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":11951,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":10652,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11219,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":11655,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":13549,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12214,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":13784,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":11544,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":13272,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":14367,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":12973,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":12588,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":11776,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferToken":{"entryPoint":13912,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":12408,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":12555,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8584},{"length":32,"start":11567},{"length":32,"start":12996},{"length":32,"start":14390}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146128e857806301ffc9a71461288257806306fdde03146128275780630d6a5bbb146125c55780630e89341c1461246e578063114ba8ee1461236f578063162094c41461229f5780632a55205a146121ac5780632b4c9f161461213d5780632eb2c2d614611cfe5780632f2ff15d14611b7257806331e66e1e14611b245780634e1273f414611a46578063572b6c05146119fb5780635cfa92971461193157806361ba27da146118155780636706467b146116a457806373c8a958146114f45780638bb9c5bf146113855780638da5cb5b146113145780638dc251e3146111e757806391d148541461114f57806395d89b41146110dc578063a0c76f621461106b578063a22cb46514610f0b578063b0ccc31e14610e9a578063c3666c3614610c5d578063d539139314610c04578063d547741f14610a7b578063e1a8bf2c14610a3f578063e8ab9ccc14610833578063e985e9c51461077f578063f242432a1461044d578063f2fde38b146103595763f7ba94bd1461019c57600080fd5b346102fd576101aa36612aa0565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101eb6132ad565b925416911690810361032c57508181036103025760005b81811061020b57005b610216818387612d77565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102fd57610240828587612d77565b35908147106102cb57600080809381935af13d156102c3573d9061026382612ca7565b916102716040519384612bd3565b82523d6000602084013e5b1561028a5750600101610202565b80511561029957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061027c565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610390612956565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103ba6132ad565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361032c575073ffffffffffffffffffffffffffffffffffffffff16918282036103fe57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610484612956565b61048c612979565b604435906064359260843567ffffffffffffffff81116102fd576104b4903690600401612a33565b926104bd6132ad565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361076f575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86128615610745576105608287836135d8565b156106fb5773ffffffffffffffffffffffffffffffffffffffff916105898a8a878a8796613658565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105c657005b6020926105d4913691612ce1565b9261062a60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906129bf565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106c0575b50160361068d57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106e2915060203d6020116106e8575b6106da8183612bd3565b8101906134b5565b86610684565b503d6106d0565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b610778916134ed565b8785610514565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576107b6612956565b73ffffffffffffffffffffffffffffffffffffffff6107d3612979565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd57610882903690600401612a02565b60243567ffffffffffffffff81116102fd576108a2903690600401612a02565b929060443567ffffffffffffffff81116102fd576108c4903690600401612a02565b93909160643567ffffffffffffffff81116102fd576108e7903690600401612a33565b9390916108f26132ad565b9761091d897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461094881612c43565b97610956604051998a612bd3565b818952602089019160051b8101903682116102fd57915b818310610a12575050509161098b6109939261099b95943691612c5b565b973691612c5b565b933691612ce1565b9183519480518614801590610a07575b6103025760005b8681106109bb57005b80610a018673ffffffffffffffffffffffffffffffffffffffff6109e16001958b613078565b51166109ed8487613078565b516109f88589613078565b51918d8a61312c565b016109b2565b5081518614156109ab565b823573ffffffffffffffffffffffffffffffffffffffff811681036102fd5781526020928301920161096d565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020604051620186a08152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435610ab5612979565b610abd6132ad565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102fd57610c6b36612b44565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cb06132ad565b925416911690810361032c5750808214801590610e90575b6103025760005b828110610cd857005b73ffffffffffffffffffffffffffffffffffffffff610d00610cfb83858a612d77565b61310b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106ef57600091610e62575b5015610e35575073ffffffffffffffffffffffffffffffffffffffff610d8f610cfb83858a612d77565b1690610d9f610cfb828689612d77565b91610dab82878b612d77565b3592813b156102fd57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106ef57600192610e24575b5001610ccf565b6000610e2f91612bd3565b88610e1d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e83915060203d8111610e89575b610e7b8183612bd3565b810190613295565b89610d65565b503d610e71565b5082821415610cc8565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610f42612956565b60243590811515918281036102fd5761103c575b73ffffffffffffffffffffffffffffffffffffffff80610f746132ad565b1691169181831461100e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611066817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134ed565b610f56565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5612eaf565b6040519182916020835260208301906129bf565b0390f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611186612979565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761121e612956565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061125d6132ad565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112ea5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113e06132ad565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114ac5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bff565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102fd5761150236612b44565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115456132ad565b925416911690810361032c575080841480159061169a575b6103025760005b84811061156d57005b611578818388612d77565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102fd5760006020916115ab610cfb868b8e612d77565b826116156116416115bd898d8d612d77565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612bd3565b51925af1156106ef576000513d6116915750803b155b6116645750600101611564565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611657565b508284141561155d565b346102fd576116b236612aa0565b8083949293036103025773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117e757916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172e57005b848110156117b8578060051b820135838112156102fd5782019081359167ffffffffffffffff83116102fd576020019180360383136102fd577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611796848b8a612d77565b35926117af604051928392602084526020840191612a61565b0390a201611725565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118866132ad565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161190457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611968612956565b6064359067ffffffffffffffff82116102fd5761198c6119f9923690600401612a33565b6119eb6119976132ad565b926119c2847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612ce1565b92604435926024359261312c565b005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020611a3c611a37612956565b612d18565b6040519015158152f35b346102fd57611a5436612aa0565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030257611a8a85612c43565b94611a986040519687612bd3565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ac582612c43565b0136602088013760005b818110611aec576040516020808252819061114b9082018a612b10565b80611b13611b00610cfb600194868b612d77565b611b0b838789612d77565b359088612d87565b611b1d828a613078565b5201611acf565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611b5b61381f565b61114b604051928392602084526020840191612a61565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435611bac612979565b611bb46132ad565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c6757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bff565b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611d35612956565b611d3d612979565b60443567ffffffffffffffff81116102fd57611d5d903690600401612a02565b929060643567ffffffffffffffff81116102fd57611d7f903690600401612a02565b9360843567ffffffffffffffff81116102fd57611da0903690600401612a33565b939091611dab6132ad565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff82160361212d575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561074557898b0361030257611e558284836135d8565b156120e35760005b8b81106120b4575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611ed960405192839260408452611ecb8d60408601908d6130ce565b9184830360208601526130ce565b0390a43b611ee357005b602094611ef8611f0092611f08953691612c5b565b993691612c5b565b953691612ce1565b92611fb860405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f88611f5860a485018b612b10565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612b10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526129bf565b03816000875af19081156106ef577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612095575b50160361201b57005b612091906120616040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612b10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612b10565b0390fd5b6120ae915060203d6020116106e8576106da8183612bd3565b86612012565b806120dd8c6120d38f946120cb816001978d612d77565b35928d612d77565b3590888887613658565b01611e5d565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b612136916134ed565b8987611e02565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612297575b1561226157505061114b60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114b91620186a08210156122845761227e90620186a09261308c565b04612231565b620186a0612292920461308c565b612231565b508115612224565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760243567ffffffffffffffff81116102fd576122ee903690600401612a33565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117e75761236a7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191612a61565b0390a2005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043573ffffffffffffffffffffffffffffffffffffffff811681036102fd577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123fd6132ad565b925416911690810361032c575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106ef5760009161253d575b6040516020808252819061114b908201856129bf565b3d8083833e61254c8183612bd3565b8101906020818303126125bd5780519067ffffffffffffffff82116125c1570181601f820112156125bd5780519261258384612ca7565b926125916040519485612bd3565b848452602085840101116125ba575061114b926125b4916020808501910161299c565b90612527565b80fd5b8280fd5b8380fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576125fc612956565b60243567ffffffffffffffff81116102fd5761261c903690600401612a02565b909160443567ffffffffffffffff81116102fd5761263e903690600401612a02565b93909160643567ffffffffffffffff81116102fd576126d2936126686126da923690600401612a33565b9590916126ca6126766132ad565b966126a1887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612fb6565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612c5b565b983691612c5b565b943691612ce1565b9173ffffffffffffffffffffffffffffffffffffffff82169485156127fd57865190855182036103025760005b8281106127d35750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806127746127668d6040840190612b10565b82810360208401528b612b10565b0390a43b61277e57005b611fb89160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f88611f5860a485018b612b10565b806127f76127e36001938c613078565b516127ee838b613078565b519088866133d8565b01612707565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4612eaf565b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd57611a3c602091612e00565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602061294e612924612956565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612d87565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b60005b8381106129af5750506000910152565b818101518382015260200161299f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936129fb8151809281875287808801910161299c565b0116010190565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd576020808501948460051b0101116102fd57565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd57602083818601950101116102fd57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd5781612ae991600401612a02565b929092916024359067ffffffffffffffff82116102fd57612b0c91600401612a02565b9091565b906020808351928381520192019060005b818110612b2e5750505090565b8251845260209384019390920191600101612b21565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd5781612b8d91600401612a02565b9290929160243567ffffffffffffffff81116102fd5781612bb091600401612a02565b929092916044359067ffffffffffffffff82116102fd57612b0c91600401612a02565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c1457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612c145760051b60200190565b929190612c6781612c43565b93612c756040519586612bd3565b602085838152019160051b81019283116102fd57905b828210612c9757505050565b8135815260209182019101612c8b565b67ffffffffffffffff8111612c1457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612ced82612ca7565b91612cfb6040519384612bd3565b8294818452818301116102fd578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d705773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117b85760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff831615612dd65760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ea9577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612ea3576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015612fac575b602085108114612f7f57848752869392918115612f3f5750600114612ef8575b50612ef692500383612bd3565b565b90506000929192526020600020906000915b818310612f23575050906020612ef69282010138612ee9565b6020919350806001915483858901015201910190918492612f0a565b60209350612ef69592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee9565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693612ec9565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156130105750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117b85760209160051b010190565b8181029291811591840414171561309f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102fd5760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102fd5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156127fd5761317187878573ffffffffffffffffffffffffffffffffffffffff956133d8565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b6131b3575b5050505050565b61320e9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906129bf565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613276575b50160361068d5780806131ac565b61328f915060203d6020116106e8576106da8183612bd3565b38613268565b908160209103126102fd575180151581036102fd5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156133c95732331480156133ce575b6133c9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613338575b5061333557503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106ef576000916133aa575b503861332b565b6133c3915060203d602011610e8957610e7b8183612bd3565b386133a3565b503390565b50601836106132f4565b9091836133e6575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561345c57505060005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052604060002055388080806133e0565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102fd57517fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd5790565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806135ce575b613516575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106ef576000916135af575b50156135825750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135c8915060203d602011610e8957610e7b8183612bd3565b38613579565b50813b151561350e565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613603575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806135fd565b91929084613667575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156137c3575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff8216036136df575b506131ac565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561376557505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806136d9565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561395357323314801561395b575b613953578033149081156138b2575b50613881576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102fd5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156106ef57600091613934575b5038613875565b61394d915060203d602011610e8957610e7b8183612bd3565b3861392d565b506000903690565b506018361061386656fea2646970667358221220ddfb3f399e37e2392720998d8e941bcc1aee18c592ae446c7cc10f4c5bdb027564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x28E8 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2882 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2827 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x25C5 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x246E JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x236F JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x229F JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x21AC JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x213D JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1CFE JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B72 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B24 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A46 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19FB JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1931 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1815 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16A4 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14F4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1385 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1314 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11E7 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x114F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10DC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x106B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF0B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE9A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC5D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC04 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA7B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA3F JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x833 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x44D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x359 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1AA CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EB PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP2 DUP2 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x20B JUMPI STOP JUMPDEST PUSH2 0x216 DUP2 DUP4 DUP8 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x240 DUP3 DUP6 DUP8 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2C3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x263 DUP3 PUSH2 0x2CA7 JUMP JUMPDEST SWAP2 PUSH2 0x271 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BD3 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x28A JUMPI POP PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x299 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x27C JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x390 PUSH2 0x2956 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3BA PUSH2 0x32AD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3FE JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x484 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x48C PUSH2 0x2979 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x4B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP3 PUSH2 0x4BD PUSH2 0x32AD JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x76F JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x745 JUMPI PUSH2 0x560 DUP3 DUP8 DUP4 PUSH2 0x35D8 JUMP JUMPDEST ISZERO PUSH2 0x6FB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x589 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3658 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5C6 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5D4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH2 0x62A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6C0 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI JUMPDEST PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x34B5 JUMP JUMPDEST DUP7 PUSH2 0x684 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x778 SWAP2 PUSH2 0x34ED JUMP JUMPDEST DUP8 DUP6 PUSH2 0x514 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x7B6 PUSH2 0x2956 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D3 PUSH2 0x2979 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x882 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8A2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8E7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8F2 PUSH2 0x32AD JUMP JUMPDEST SWAP8 PUSH2 0x91D DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x948 DUP2 PUSH2 0x2C43 JUMP JUMPDEST SWAP8 PUSH2 0x956 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA12 JUMPI POP POP POP SWAP2 PUSH2 0x98B PUSH2 0x993 SWAP3 PUSH2 0x99B SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA07 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9BB JUMPI STOP JUMPDEST DUP1 PUSH2 0xA01 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E1 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3078 JUMP JUMPDEST MLOAD AND PUSH2 0x9ED DUP5 DUP8 PUSH2 0x3078 JUMP JUMPDEST MLOAD PUSH2 0x9F8 DUP6 DUP10 PUSH2 0x3078 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x312C JUMP JUMPDEST ADD PUSH2 0x9B2 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9AB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAB5 PUSH2 0x2979 JUMP JUMPDEST PUSH2 0xABD PUSH2 0x32AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB6F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0xC6B CALLDATASIZE PUSH2 0x2B44 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCB0 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE90 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCD8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD00 PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x2D77 JUMP JUMPDEST PUSH2 0x310B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE62 JUMPI JUMPDEST POP ISZERO PUSH2 0xE35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD8F PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x2D77 JUMP JUMPDEST AND SWAP1 PUSH2 0xD9F PUSH2 0xCFB DUP3 DUP7 DUP10 PUSH2 0x2D77 JUMP JUMPDEST SWAP2 PUSH2 0xDAB DUP3 DUP8 DUP12 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2FD JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE24 JUMPI JUMPDEST POP ADD PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE2F SWAP2 PUSH2 0x2BD3 JUMP JUMPDEST DUP9 PUSH2 0xE1D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE83 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE89 JUMPI JUMPDEST PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3295 JUMP JUMPDEST DUP10 PUSH2 0xD65 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE71 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCC8 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0xF42 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x103C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF74 PUSH2 0x32AD JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x100E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1066 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34ED JUMP JUMPDEST PUSH2 0xF56 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x2EAF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1186 PUSH2 0x2979 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x121E PUSH2 0x2956 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x125D PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12EA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13E0 PUSH2 0x32AD JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14AC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1502 CALLDATASIZE PUSH2 0x2B44 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1545 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x169A JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x156D JUMPI STOP JUMPDEST PUSH2 0x1578 DUP2 DUP4 DUP9 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15AB PUSH2 0xCFB DUP7 DUP12 DUP15 PUSH2 0x2D77 JUMP JUMPDEST DUP3 PUSH2 0x1615 PUSH2 0x1641 PUSH2 0x15BD DUP10 DUP14 DUP14 PUSH2 0x2D77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2BD3 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1691 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1664 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1564 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1657 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x155D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x16B2 CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x302 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17E7 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x172E JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17B8 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2FD JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x2FD JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1796 DUP5 DUP12 DUP11 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17AF PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1725 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1886 PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1904 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1968 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x198C PUSH2 0x19F9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST PUSH2 0x19EB PUSH2 0x1997 PUSH2 0x32AD JUMP JUMPDEST SWAP3 PUSH2 0x19C2 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x312C JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x1A3C PUSH2 0x1A37 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x2D18 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1A54 CALLDATASIZE PUSH2 0x2AA0 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x302 JUMPI PUSH2 0x1A8A DUP6 PUSH2 0x2C43 JUMP JUMPDEST SWAP5 PUSH2 0x1A98 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2BD3 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AC5 DUP3 PUSH2 0x2C43 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AEC JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP11 PUSH2 0x2B10 JUMP JUMPDEST DUP1 PUSH2 0x1B13 PUSH2 0x1B00 PUSH2 0xCFB PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2D77 JUMP JUMPDEST PUSH2 0x1B0B DUP4 DUP8 DUP10 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x1B1D DUP3 DUP11 PUSH2 0x3078 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ACF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1B5B PUSH2 0x381F JUMP JUMPDEST PUSH2 0x114B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BAC PUSH2 0x2979 JUMP JUMPDEST PUSH2 0x1BB4 PUSH2 0x32AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C67 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1D35 PUSH2 0x2956 JUMP JUMPDEST PUSH2 0x1D3D PUSH2 0x2979 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D5D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D7F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1DA0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1DAB PUSH2 0x32AD JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x212D JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x745 JUMPI DUP10 DUP12 SUB PUSH2 0x302 JUMPI PUSH2 0x1E55 DUP3 DUP5 DUP4 PUSH2 0x35D8 JUMP JUMPDEST ISZERO PUSH2 0x20E3 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x20B4 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1ED9 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1ECB DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x30CE JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x30CE JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1EE3 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1EF8 PUSH2 0x1F00 SWAP3 PUSH2 0x1F08 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP3 PUSH2 0x1FB8 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F88 PUSH2 0x1F58 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2B10 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2B10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2095 JUMPI JUMPDEST POP AND SUB PUSH2 0x201B JUMPI STOP JUMPDEST PUSH2 0x2091 SWAP1 PUSH2 0x2061 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2B10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2B10 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x20AE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP7 PUSH2 0x2012 JUMP JUMPDEST DUP1 PUSH2 0x20DD DUP13 PUSH2 0x20D3 DUP16 SWAP5 PUSH2 0x20CB DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2D77 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3658 JUMP JUMPDEST ADD PUSH2 0x1E5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2136 SWAP2 PUSH2 0x34ED JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1E02 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2297 JUMPI JUMPDEST ISZERO PUSH2 0x2261 JUMPI POP POP PUSH2 0x114B PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x114B SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2284 JUMPI PUSH2 0x227E SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x308C JUMP JUMPDEST DIV PUSH2 0x2231 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2292 SWAP3 DIV PUSH2 0x308C JUMP JUMPDEST PUSH2 0x2231 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2224 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x22EE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17E7 JUMPI PUSH2 0x236A PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x2A61 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23FD PUSH2 0x32AD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x253D JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP6 PUSH2 0x29BF JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x254C DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x25BD JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25C1 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x25BD JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2583 DUP5 PUSH2 0x2CA7 JUMP JUMPDEST SWAP3 PUSH2 0x2591 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2BD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x25BA JUMPI POP PUSH2 0x114B SWAP3 PUSH2 0x25B4 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x299C JUMP JUMPDEST SWAP1 PUSH2 0x2527 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x25FC PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x261C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x263E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x26D2 SWAP4 PUSH2 0x2668 PUSH2 0x26DA SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A33 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x26CA PUSH2 0x2676 PUSH2 0x32AD JUMP JUMPDEST SWAP7 PUSH2 0x26A1 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2FB6 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2C5B JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2CE1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x27FD JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x27D3 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2774 PUSH2 0x2766 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2B10 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2B10 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x277E JUMPI STOP JUMPDEST PUSH2 0x1FB8 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F88 PUSH2 0x1F58 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2B10 JUMP JUMPDEST DUP1 PUSH2 0x27F7 PUSH2 0x27E3 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3078 JUMP JUMPDEST MLOAD PUSH2 0x27EE DUP4 DUP12 PUSH2 0x3078 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x33D8 JUMP JUMPDEST ADD PUSH2 0x2707 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x2EAF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x1A3C PUSH1 0x20 SWAP2 PUSH2 0x2E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x294E PUSH2 0x2924 PUSH2 0x2956 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x29AF JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x299F JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x29FB DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x299C JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2AE9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x2B0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2B2E JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2B21 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2B8D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x2BB0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x2B0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C14 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C14 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2C67 DUP2 PUSH2 0x2C43 JUMP JUMPDEST SWAP4 PUSH2 0x2C75 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2BD3 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2FD JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2C97 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2C8B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C14 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2CED DUP3 PUSH2 0x2CA7 JUMP JUMPDEST SWAP2 PUSH2 0x2CFB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BD3 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2FD JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D70 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17B8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x2DD6 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2EA9 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2EA3 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x2FAC JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x2F7F JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x2F3F JUMPI POP PUSH1 0x1 EQ PUSH2 0x2EF8 JUMPI JUMPDEST POP PUSH2 0x2EF6 SWAP3 POP SUB DUP4 PUSH2 0x2BD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2F23 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2EF6 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2F0A JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2EF6 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x2EC9 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3010 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17B8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x309F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x27FD JUMPI PUSH2 0x3171 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x33D8 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x31B3 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x320E SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x29BF JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3276 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI DUP1 DUP1 PUSH2 0x31AC JUMP JUMPDEST PUSH2 0x328F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x3268 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x33C9 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x33CE JUMPI JUMPDEST PUSH2 0x33C9 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3338 JUMPI JUMPDEST POP PUSH2 0x3335 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x33AA JUMPI JUMPDEST POP CODESIZE PUSH2 0x332B JUMP JUMPDEST PUSH2 0x33C3 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x33A3 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x32F4 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x33E6 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x345C JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x33E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x35CE JUMPI JUMPDEST PUSH2 0x3516 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x35AF JUMPI JUMPDEST POP ISZERO PUSH2 0x3582 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35C8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x3579 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x350E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3603 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x35FD JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3667 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x37C3 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x36DF JUMPI JUMPDEST POP PUSH2 0x31AC JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3765 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x36D9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3953 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x395B JUMPI JUMPDEST PUSH2 0x3953 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x38B2 JUMPI JUMPDEST POP PUSH2 0x3881 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3934 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3875 JUMP JUMPDEST PUSH2 0x394D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x2BD3 JUMP JUMPDEST CODESIZE PUSH2 0x392D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3866 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDD EXTSTATICCALL EXTCODEHASH CODECOPY SWAP15 CALLDATACOPY 0xE2 CODECOPY 0x27 KECCAK256 SWAP10 DUP14 DUP15 SWAP5 SHL 0xCC BYTE RETURNCONTRACT 0x18 0xC5 SWAP3 0xAE PREVRANDAO PUSH13 0x7CC10F4C5BDB027564736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"471:468:122:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;471:468:122;;1869:41:229;;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;471:468:122;1845:10:192;;;;;;471:468:122;1857:3:192;1876:11;;;;;:::i;:::-;471:468:122;;;;;;;;;1898:10:192;;;;;:::i;:::-;471:468:122;1375:21:9;;;:30;1371:125;;471:468:122;1548:33:9;;;;;;;471:468:122;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;471:468:122;;1834:9:192;;1591:58:9;471:468:122;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;471:468:122;5957:19:9;471:468:122;;5957:19:9;471:468:122;;;;;1371:125:9;1455:21;;1428:57;471:468:122;1428:57:9;471:468:122;;;;;;1428:57:9;471:468:122;;;;1756:63:192;1793:26;471:468:122;1793:26:192;471:468:122;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;471:468:122;;-1:-1:-1;4538:25:42;471:468:122;;;;;;;;;;;;;:::i;:::-;;1869:41:229;;;:::i;:::-;471:468:122;;;;;;;;3205:23:42;;;3201:60;;471:468:122;;;3275:25:42;;;;3271:146;;471:468:122;3271:146:42;471:468:122;;;;;;;;3361:45:42;471:468:122;3361:45:42;;471:468:122;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;;:::i;:::-;3179:19:352;471:468:122;;;;;;;;2616:14:352;2612:76;;471:468:122;-1:-1:-1;;471:468:122;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;471:468:122;4720:5:228;;;;;;;;;:::i;:::-;471:468:122;;;;;;;4742:43:228;471:468:122;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;471:468:122;4796:104:228;471:468:122;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;471:468:122;19356:74:228;;471:468:122;19356:74:228;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;471:468:122;19356:74:228;;;;;;;;471:468:122;19356:74:228;471:468:122;19356:74:228;471:468:122;19356:74:228;;;4796:104;471:468:122;;19356:101:228;19352:168;;471:468:122;19352:168:228;19478:42;471:468:122;19478:42:228;471:468:122;;;;;;;;19478:42:228;19356:74;;;;471:468:122;19356:74:228;471:468:122;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;471:468:122;;;;;;;;;4601:76:228;471:468:122;4645:32:228;;;;471:468:122;4645:32:228;471:468:122;;;;;;;;4645:32:228;4532:59;4561:30;471:468:122;4561:30:228;471:468:122;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;471:468:122;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;471:468:122;-1:-1:-1;471:468:122;14847:11:228;471:468:122;;;;-1:-1:-1;471:468:122;14847:28:228;471:468:122;-1:-1:-1;471:468:122;;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;471:468:122;1367:6:208;:::i;:::-;471:468:122;974:8:208;;;;:::i;:::-;471:468:122;;;;;;;:::i;:::-;974:8:208;;;471:468:122;974:8:208;;;;;;;471:468:122;;974:8:208;;;;;;;;;;;471:468:122;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;471:468:122;11728:10:228;;;;;;471:468:122;11740:3:228;11778:13;11812:4;11778:13;471:468:122;11778:13:228;471:468:122;11778:13:228;;;:::i;:::-;471:468:122;;11793:6:228;;;;:::i;:::-;471:468:122;11801:9:228;;;;:::i;:::-;471:468:122;11812:4:228;;;;:::i;:::-;471:468:122;11717:9:228;;11620:47;471:468:122;;;11644:23:228;;;11620:47;;974:8:208;471:468:122;;;;;;;;;974:8:208;;471:468:122;974:8:208;;;;;;;471:468:122;;;;;;;;;;;;;;713:6:351;471:468:122;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;:::i;:::-;5148:19:42;471:468:122;;;;;;;4503:26:42;;;4499:64;;4464:19:41;471:468:122;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;1880:140:41;;471:468:122;1880:140:41;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;471:468:122;;;;1973:36:41;;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;471:468:122;;;1869:41:229;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;471:468:122;3852:94:192;;471:468:122;3972:10:192;;;;;;471:468:122;3984:3:192;471:468:122;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;471:468:122;;;;4058:76:192;;4108:25;471:468:122;4058:76:192;;471:468:122;4058:76:192;;;;;;;;;;;;471:468:122;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;471:468:122;4239:12:192;;;;;;:::i;:::-;471:468:122;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;471:468:122;4239:70:192;;;;;;;471:468:122;;;;;;;4239:70:192;;;;;471:468:122;4239:70:192;;4277:4;471:468:122;4239:70:192;;471:468:122;;4058:76:192;471:468:122;;;;;;;4239:70:192;;;;;;;471:468:122;4239:70:192;;;3984:3;;471:468:122;3961:9:192;;4239:70;471:468:122;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;471:468:122;4161:50:192;471:468:122;;4058:76:192;471:468:122;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;471:468:122;;1869:41:229;;;:::i;:::-;471:468:122;;;14276:18:228;;;;14272:64;;471:468:122;14401:42:228;14346:19;471:468:122;-1:-1:-1;471:468:122;14346:11:228;471:468:122;;;-1:-1:-1;471:468:122;;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;;;;;;;;;;;;;;14401:42:228;471:468:122;14272:64:228;14303:33;;471:468:122;14303:33:228;471:468:122;;;;14303:33:228;2071:115:211;2931:8:352;668:81;471:468:122;2931:8:352;:::i;:::-;2071:115:211;;471:468:122;;;;;;;;;;;;;2991:23:341;471:468:122;;;;;;;;;;;;;;;;;;;;;2688:13:341;471:468:122;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;471:468:122;-1:-1:-1;471:468:122;;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;471:468:122;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1869:41:229;;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;2976:19:351;471:468:122;;;;;1732:22:351;1728:93;;471:468:122;;;;;;;;;;;;1728:93:351;1777:33;471:468:122;1777:33:351;471:468:122;;1777:33:351;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1869:41:229;;:::i;:::-;471:468:122;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;3741:25:41;3737:66;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;471:468:122;;;;2455:33:41;471:468:122;3737:66:41;471:468:122;3775:28:41;;;471:468:122;3775:28:41;471:468:122;;;;;;;3775:28:41;471:468:122;;;;;;;:::i;:::-;5148:19:42;;;;471:468:122;;;1869:41:229;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;471:468:122;2776:90:192;;471:468:122;2892:10:192;;;;;;471:468:122;2904:3:192;2923:9;;;;;:::i;:::-;471:468:122;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;471:468:122;;;1328:43:8;;;;;;471:468:122;;;;1328:43:8;;;471:468:122;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;471:468:122;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;471:468:122;;2881:9:192;;8938:146:8;9033:40;471:468:122;9033:40:8;471:468:122;;1328:43:8;471:468:122;9033:40:8;8942:68;471:468:122;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;471:468:122;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;471:468:122;2991:23:341;471:468:122;;2464:10:209;:71;2460:115;;2591:9;471:468:122;;;;;;;2586:102:209;2602:19;;;;;;471:468:122;2623:3:209;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;471:468:122;2665:11:209;;;;;;:::i;:::-;471:468:122;;;;;;;;;;;;;;;;:::i;:::-;2647:30:209;;;471:468:122;2591:9:209;;471:468:122;;;;;;;;;;2460:115:209;2544:31;471:468:122;2544:31:209;2464:10;471:468:122;;;;2544:31:209;471:468:122;;;;;;;;;;;;;;;1869:41:229;;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;2976:19:351;471:468:122;1281:36:351;713:6;1281:36;;1277:119;;471:468:122;;;;;;;;;;;;;;;1277:119:351;1340:45;471:468:122;1340:45:351;471:468:122;;;;1340:45:351;471:468:122;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;471:468:122;;;;;;:::i;:::-;;1869:41:229;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;471:468:122;1221:6:210;:::i;:::-;471:468:122;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;471:468:122;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;471:468:122;;16447:19:228;16129:20;;;16125:59;;471:468:122;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;471:468:122;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;471:468:122;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;471:468:122;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;471:468:122;;16250:9:228;;471:468:122;;;;;;;;;;;2104:39:229;;:::i;:::-;471:468:122;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;:::i;:::-;5148:19:42;471:468:122;;;;;;;4503:26:42;;;4499:64;;4464:19:41;471:468:122;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;1254:25:41;1250:140;;471:468:122;1250:140:41;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;471:468:122;;;;1343:36:41;471:468:122;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;;;;:::i;:::-;3179:19:352;471:468:122;;;;;;;;2616:14:352;2612:76;;471:468:122;-1:-1:-1;;471:468:122;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;471:468:122;6801:10:228;;;;;;471:468:122;;;;;;;;;;6904:44:228;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;471:468:122;6959:111:228;471:468:122;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;471:468:122;20263:81:228;;471:468:122;20263:81:228;;471:468:122;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;471:468:122;20263:81:228;;;;;;;;471:468:122;20263:81:228;471:468:122;20263:81:228;471:468:122;20263:81:228;;;6959:111;471:468:122;;20263:107:228;20259:181;;471:468:122;20259:181:228;1878:53;471:468:122;1878:53:228;471:468:122;;20391:49:228;;;;;;471:468:122;20391:49:228;;471:468:122;;;1878:53:228;;;471:468:122;1878:53:228;;;;:::i;:::-;;471:468:122;1878:53:228;;;;471:468:122;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;471:468:122;20263:81:228;471:468:122;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;471:468:122;6860:6:228;;;:::i;:::-;471:468:122;6868:9:228;;;:::i;:::-;471:468:122;6868:9:228;;;;;:::i;:::-;471:468:122;6790:9:228;;6698:76;471:468:122;6742:32:228;;;;471:468:122;6742:32:228;471:468:122;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;471:468:122;;;;;;;;;;;;;;;941:19:75;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;471:468:122;2499:377:351;;;2559:17;;471:468:122;;2499:377:351;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;471:468:122;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;471:468:122;2499:377:351;;2607:259;713:6;2794:57;471:468:122;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3529:19:341;471:468:122;2991:23:341;471:468:122;;1716:10:209;:71;1712:115;;471:468:122;1842:22:209;471:468:122;;;;;;;;;;;;;;;;;:::i;:::-;1842:22:209;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;1869:41:229;;;:::i;:::-;471:468:122;;;;;4503:26:42;;;4499:64;;3179:19:352;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;3364:23:341;471:468:122;;;;3364:64:341;;1306:4:209;471:468:122;3364:64:341;;;471:468:122;;;;;;;;;;-1:-1:-1;;471:468:122;;;;;;;;3364:64:341;;;;;;;471:468:122;3364:64:341;;;471:468:122;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41:229;;;471:468:122;1869:41:229;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;471:468:122;1669:6:210;:::i;:::-;471:468:122;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;471:468:122;;;;;9777:23:228;;9773:62;;471:468:122;9862:10:228;;;;;;471:468:122;;;;;;;;;9955:50:228;471:468:122;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;471:468:122;10016:117:228;471:468:122;;;;;;20263:81:228;;;;;471:468:122;20263:81:228;;471:468:122;20263:81:228;;471:468:122;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;471:468:122;9911:6:228;;;:::i;:::-;471:468:122;9919:9:228;;;;:::i;:::-;471:468:122;9919:9:228;;;;:::i;:::-;471:468:122;9851:9:228;;9671:55;9700:26;471:468:122;9700:26:228;471:468:122;;9700:26:228;471:468:122;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;471:468:122;635:65:55;;:::i;471:468:122:-;;;;;;;;;;;;2650:44:211;471:468:122;;:::i;:::-;;;;;2650:44:211;:::i;:::-;471:468:122;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;471:468:122;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;471:468:122;;;;;;:::o;1002:301:75:-;471:468:122;1146:19:75;471:468:122;1146:53:75;;;1142:96;;471:468:122;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;471:468:122;1215:12:75;:::o;471:468:122:-;;;;;;;;;;;;:::o;15240:220:228:-;;;471:468:122;;;15358:19:228;15354:61;;15375:1;471:468:122;;;;;15375:1:228;471:468:122;15432:21:228;471:468:122;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;471:468:122;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;471:468:122;500:10:59;471:468:122;500:10:59;;;;471:468:122;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;471:468:122;1528:12:59;:::o;471:468:122:-;;;;;-1:-1:-1;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;471:468:122;;;;;-1:-1:-1;471:468:122;;-1:-1:-1;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;471:468:122;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;471:468:122;3775:28:41;;-1:-1:-1;3775:28:41;471:468:122;3775:28:41;471:468:122;;;;;-1:-1:-1;3775:28:41;471:468:122;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;471:468:122;;;8152:16:228;;;8148:55;;8236:5;;;;471:468:122;8236:5:228;;:::i;:::-;471:468:122;;;8166:1:228;471:468:122;8258:49:228;471:468:122;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;471:468:122;;;;;;19356:74:228;;;;;471:468:122;19356:74:228;;;;;471:468:122;8166:1:228;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;471:468:122;19356:74:228;471:468:122;19356:74:228;8166:1;19356:74;;;8318:110;471:468:122;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;471:468:122;19356:74:228;471:468:122;19356:74:228;;;;;;;:::i;:::-;;;;471:468:122;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;471:468:122;1029:19:76;471:468:122;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;471:468:122;;;1676:74:76;;471:468:122;;;1676:74:76;;;471:468:122;1327:10:76;471:468:122;;;;1744:4:76;471:468:122;;;;;-1:-1:-1;1676:74:76;;471:468:122;;;;;;1676:74:76;;;;;;;471:468:122;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;471:468:122;17966:1:228;471:468:122;;;;;17966:1:228;471:468:122;;;;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;;;;18123:21:228;;;;;18119:80;;471:468:122;;17966:1:228;471:468:122;;;;;17966:1:228;471:468:122;18217:18:228;471:468:122;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;17953:320:228;;;;;;18119:80;471:468:122;;18153:46:228;;;471:468:122;;;18153:46:228;;;471:468:122;;;;;;;;;;;;;;;;;;20391:49:228;471:468:122;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;471:468:122;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;471:468:122;;;3613:51:352;471:468:122;;3613:51:352;;;;471:468:122;3613:51:352;;3648:4;3613:51;;;471:468:122;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;471:468:122;;-1:-1:-1;3691:28:352;3613:51;;;;471:468:122;3613:51:352;471:468:122;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;471:468:122;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;471:468:122;;-1:-1:-1;471:468:122;16997:11:228;471:468:122;;;;-1:-1:-1;471:468:122;16997:27:228;471:468:122;-1:-1:-1;471:468:122;;;500:10:59;471:468:122;-1:-1:-1;471:468:122;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;471:468:122;17163:1:228;471:468:122;;;;;17163:1:228;471:468:122;;;;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;;;;17330:29:228;;;;;17326:98;;471:468:122;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;471:468:122;17163:1:228;471:468:122;;;;;17163:1:228;471:468:122;;;;-1:-1:-1;471:468:122;;;;-1:-1:-1;471:468:122;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;471:468:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;471:468:122;;17640:48:228;;;471:468:122;;;17640:48:228;;;471:468:122;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;471:468:122;;17368:56:228;;;471:468:122;;;;;17368:56:228;;;471:468:122;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;471:468:122;2065:19:76;471:468:122;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;471:468:122;720:8:80;471:468:122;720:8:80;;471:468:122;;;;2115:1:76;2802:32;;:::o;2624:153::-;471:468:122;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;471:468:122;2361:10:76;471:468:122;;;;2771:4:76;471:468:122;;;;;-1:-1:-1;2682:95:76;;471:468:122;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"2949400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"738","ROYALTY_FEE_DENOMINATOR()":"782","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2917","isApprovedForAll(address,address)":"3201","isTrustedForwarder(address)":"infinite","metadataResolver()":"2759","name()":"infinite","operatorFilterRegistry()":"2803","owner()":"2671","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2455","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchSetTokenURI(uint256[],string[])":"6706467b","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155FullMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol\":\"ERC1155FullMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/preset/ERC1155FullMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ERC1155Full} from \\\"./../../../../token/ERC1155/preset/ERC1155Full.sol\\\";\\n\\n/// @title ERC1155FullMock\\ncontract ERC1155FullMock is ERC1155Full {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC1155Full(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x88e9a17149ede2a9b8bee04b90ae576d519eda37f6fbad4f8c4317d6346f3055\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./base/ERC1155DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\\n    constructor() {\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x66d13c9e643f22c8bebea5c0266b175a4b4868616453832c5a1ca819c560f389\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./base/ERC1155MetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0x0fb7629855ad3af8c8e677fffc7b32c891b9346a2cb86986a0be8ab045fa88a4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC1155Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xb9ba2417238c386a02e193f03882682ab0f043bb84eff39287985c11fc2c1bed\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/ERC1155Full.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155WithOperatorFilterer} from \\\"./../ERC1155WithOperatorFilterer.sol\\\";\\nimport {ERC1155Metadata} from \\\"./../ERC1155Metadata.sol\\\";\\nimport {ERC1155Mintable} from \\\"./../ERC1155Mintable.sol\\\";\\nimport {ERC1155Deliverable} from \\\"./../ERC1155Deliverable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155Full is\\n    ERC1155WithOperatorFilterer,\\n    ERC1155Metadata,\\n    ERC1155Mintable,\\n    ERC1155Deliverable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC1155WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x61da94d134dcee6a05efd8b202450f914ad5c39e0b3e1376db64bd6bf42b0b41\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol":{"ERC1155FullBurnProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61466b38819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f576080526040516145d0908161009b82396080518181816123220152818161387801528181613e20015261446b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461346057806301ffc9a7146133d957806306fdde031461337e5780630d6a5bbb1461311c5780630e07f854146128625780630e89341c1461270b578063114ba8ee14612624578063124d91e514612509578063162094c4146124395780632a55205a146123465780632b4c9f16146122d75780632eb2c2d614611eb15780632f2ff15d14611d2557806331e66e1e14611cd75780634e1273f414611bf9578063572b6c0514611bae5780635cfa929714611ae457806361ba27da146119c85780636706467b1461185757806373c8a958146116a757806380534934146115155780638bb9c5bf146113a65780638da5cb5b146113355780638dc251e31461120857806391d148541461117057806395d89b41146110fd578063a0c76f621461108c578063a22cb46514610f2c578063b0ccc31e14610ebb578063c3666c3614610c7e578063d539139314610c25578063d547741f14610a9c578063e1a8bf2c14610a60578063e8ab9ccc14610854578063e985e9c5146107a0578063f242432a1461046e578063f2fde38b1461037a5763f7ba94bd146101bd57600080fd5b3461031e576101cb36613618565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020c613e09565b925416911690810361034d57508181036103235760005b81811061022c57005b6102378183876138c0565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031e576102618285876138c0565b35908147106102ec57600080809381935af13d156102e4573d90610284826137f0565b91610292604051938461374b565b82523d6000602084013e5b156102ab5750600101610223565b8051156102ba57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029d565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576103b16134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103db613e09565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034d575073ffffffffffffffffffffffffffffffffffffffff169182820361041f57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576104a56134ce565b6104ad6134f1565b604435906064359260843567ffffffffffffffff811161031e576104d59036906004016135ab565b926104de613e09565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610790575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561076657610581828783614046565b1561071c5773ffffffffffffffffffffffffffffffffffffffff916105aa8a8a878a879661428d565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105e757005b6020926105f591369161382a565b9261064b60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190613537565b03816000865af1908115610710577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106e1575b5016036106ae57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610703915060203d602011610709575b6106fb818361374b565b81019061400e565b866106a5565b503d6106f1565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b610799916141a2565b8785610535565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576107d76134ce565b73ffffffffffffffffffffffffffffffffffffffff6107f46134f1565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760043567ffffffffffffffff811161031e576108a390369060040161357a565b60243567ffffffffffffffff811161031e576108c390369060040161357a565b929060443567ffffffffffffffff811161031e576108e590369060040161357a565b93909160643567ffffffffffffffff811161031e576109089036906004016135ab565b939091610913613e09565b9761093e897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612946109698161378c565b97610977604051998a61374b565b818952602089019160051b81019036821161031e57915b818310610a3357505050916109ac6109b4926109bc959436916137a4565b9736916137a4565b93369161382a565b9183519480518614801590610a28575b6103235760005b8681106109dc57005b80610a228673ffffffffffffffffffffffffffffffffffffffff610a026001958b613baa565b5116610a0e8487613baa565b51610a198589613baa565b51918d8a613c88565b016109d3565b5081518614156109cc565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031e5781526020928301920161098e565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576020604051620186a08152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57600435610ad66134f1565b610ade613e09565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b9057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031e57610c8c366136bc565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd1613e09565b925416911690810361034d5750808214801590610eb1575b6103235760005b828110610cf957005b73ffffffffffffffffffffffffffffffffffffffff610d21610d1c83858a6138c0565b613c67565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561071057600091610e83575b5015610e56575073ffffffffffffffffffffffffffffffffffffffff610db0610d1c83858a6138c0565b1690610dc0610d1c8286896138c0565b91610dcc82878b6138c0565b3592813b1561031e57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561071057600192610e45575b5001610cf0565b6000610e509161374b565b88610e3e565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea4915060203d8111610eaa575b610e9c818361374b565b810190613df1565b89610d86565b503d610e92565b5082821415610ce9565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57610f636134ce565b602435908115159182810361031e5761105d575b73ffffffffffffffffffffffffffffffffffffffff80610f95613e09565b1691169181831461102f5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611087817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306141a2565b610f77565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761116c6111587f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613a26565b604051918291602083526020830190613537565b0390f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576111a76134f1565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761123f6134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061127e613e09565b925416911690810361034d57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561130b5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611401613e09565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114cd5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c20565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761154c6134ce565b60243567ffffffffffffffff811161031e5761156c90369060040161357a565b9060443567ffffffffffffffff811161031e5761158d90369060040161357a565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115b8613e09565b94838203610323576115cb868883614046565b1561165d5760005b8281106116315750509461162c7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613c3d565b0390a4005b80611657611642600193868a6138c0565b3561164e8389896138c0565b35908b866140c6565b016115d3565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461031e576116b5366136bc565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116f8613e09565b925416911690810361034d575080841480159061184d575b6103235760005b84811061172057005b61172b8183886138c0565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031e57600060209161175e610d1c868b8e6138c0565b826117c86117f4611770898d8d6138c0565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261374b565b51925af115610710576000513d6118445750803b155b6118175750600101611717565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561180a565b5082841415611710565b3461031e5761186536613618565b8083949293036103235773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361199a57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118e157005b8481101561196b578060051b8201358381121561031e5782019081359167ffffffffffffffff831161031e5760200191803603831361031e577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611949848b8a6138c0565b35926119626040519283926020845260208401916135d9565b0390a2016118d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a39613e09565b925416911690810361034d57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611ab757815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611b1b6134ce565b6064359067ffffffffffffffff821161031e57611b3f611bac9236906004016135ab565b611b9e611b4a613e09565b92611b75847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861292369161382a565b926044359260243592613c88565b005b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576020611bef611bea6134ce565b613861565b6040519015158152f35b3461031e57611c0736613618565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361032357611c3d8561378c565b94611c4b604051968761374b565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c788261378c565b0136602088013760005b818110611c9f576040516020808252819061116c9082018a613688565b80611cc6611cb3610d1c600194868b6138c0565b611cbe8387896138c0565b3590886138d0565b611cd0828a613baa565b5201611c82565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611d0e614454565b61116c6040519283926020845260208401916135d9565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57600435611d5f6134f1565b611d67613e09565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611e1a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c20565b3461031e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611ee86134ce565b611ef06134f1565b60443567ffffffffffffffff811161031e57611f1090369060040161357a565b929060643567ffffffffffffffff811161031e57611f3290369060040161357a565b9360843567ffffffffffffffff811161031e57611f539036906004016135ab565b939091611f5e613e09565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036122c7575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561076657898b0361032357612008828483614046565b1561227d5760005b8b811061224e575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61207399169a8b92169889936040519182918d8c8b85613c3d565b0390a43b61207d57005b60209461209261209a926120a29536916137a4565b9936916137a4565b95369161382a565b9261215260405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526121226120f260a485018b613688565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288613688565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152613537565b03816000875af1908115610710577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161222f575b5016036121b557005b61222b906121fb6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190613688565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152613688565b0390fd5b612248915060203d602011610709576106fb818361374b565b866121ac565b806122778c61226d8f94612265816001978d6138c0565b35928d6138c0565b359088888761428d565b01612010565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122d0916141a2565b8987611fb5565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612431575b156123fb57505061116c60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116c91620186a082101561241e5761241890620186a092613bbe565b046123cb565b620186a061242c9204613bbe565b6123cb565b5081156123be565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760243567ffffffffffffffff811161031e576124889036906004016135ab565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361199a576125047f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b91604051918291602083526004359560208401916135d9565b0390a2005b3461031e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576125406134ce565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260243560443561256f613e09565b9261257b848683614046565b156125da5773ffffffffffffffffffffffffffffffffffffffff8086846125c97fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b6040986140c6565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761265b6134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061269a613e09565b925416911690810361034d575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115610710576000916127da575b6040516020808252819061116c90820185613537565b3d8083833e6127e9818361374b565b81019060208183031261285a5780519067ffffffffffffffff821161285e570181601f8201121561285a57805192612820846137f0565b9261282e604051948561374b565b84845260208584010111612857575061116c926128519160208085019101613514565b906127c4565b80fd5b8280fd5b8380fd5b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760043567ffffffffffffffff811161031e576128b19036906004016135ab565b60243567ffffffffffffffff811161031e576128d19036906004016135ab565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361031e576064359373ffffffffffffffffffffffffffffffffffffffff8516850361031e577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61293f613e09565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612ddb575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816130c7575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612ddb575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612f98578190612bc784546139d3565b601f8111613074575b50600090601f8311600114612fd257600092612fc7575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612f9857612c527f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5546139d3565b601f8111612f14575b506000601f8211600114612e185781929394600092612e0d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612ddb575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612c75565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612efc575083600195969710612ec4575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612cc7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612e97565b90926020600181928686013581550194019101612e83565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612f8e575b601f0160051c01905b818110612f825750612c5b565b60008155600101612f75565b9091508190612f6c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612be7565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061305c5750908460019594939210613024575b505050811b019055612c19565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613017565b91936020600181928787013581550195019201613001565b909150836000526020600020601f840160051c810191602085106130bd575b90601f859493920160051c01905b8181106130ae5750612bd0565b600081558493506001016130a1565b9091508190613093565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a386806129ac565b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576131536134ce565b60243567ffffffffffffffff811161031e5761317390369060040161357a565b909160443567ffffffffffffffff811161031e5761319590369060040161357a565b93909160643567ffffffffffffffff811161031e57613229936131bf6132319236906004016135ab565b9590916132216131cd613e09565b966131f8887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916137a4565b9836916137a4565b94369161382a565b9173ffffffffffffffffffffffffffffffffffffffff821694851561335457865190855182036103235760005b82811061332a5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806132cb6132bd8d6040840190613688565b82810360208401528b613688565b0390a43b6132d557005b6121529160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526121226120f260a485018b613688565b8061334e61333a6001938c613baa565b51613345838b613baa565b51908886613f31565b0161325e565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761116c6111587f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613a26565b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031e57611bef6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613949565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760206134c661349c6134ce565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126138d0565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031e57565b60005b8381106135275750506000910152565b8181015183820152602001613517565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361357381518092818752878088019101613514565b0116010190565b9181601f8401121561031e5782359167ffffffffffffffff831161031e576020808501948460051b01011161031e57565b9181601f8401121561031e5782359167ffffffffffffffff831161031e576020838186019501011161031e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031e5760043567ffffffffffffffff811161031e57816136619160040161357a565b929092916024359067ffffffffffffffff821161031e576136849160040161357a565b9091565b906020808351928381520192019060005b8181106136a65750505090565b8251845260209384019390920191600101613699565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031e5760043567ffffffffffffffff811161031e57816137059160040161357a565b9290929160243567ffffffffffffffff811161031e57816137289160040161357a565b929092916044359067ffffffffffffffff821161031e576136849160040161357a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612f9857604052565b67ffffffffffffffff8111612f985760051b60200190565b9291906137b08161378c565b936137be604051958661374b565b602085838152019160051b810192831161031e57905b8282106137e057505050565b81358152602091820191016137d4565b67ffffffffffffffff8111612f9857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613836826137f0565b91613844604051938461374b565b82948184528183011161031e578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156138b95773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b919081101561196b5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561391f5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146138b9577f01ffc9a70000000000000000000000000000000000000000000000000000000081146139cc5760005260205260ff6040600020541690565b5050600190565b90600182811c92168015613a1c575b60208310146139ed57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916139e2565b9060405191826000825492613a3a846139d3565b8084529360018116908115613aa85750600114613a61575b50613a5f9250038361374b565b565b90506000929192526020600020906000915b818310613a8c575050906020613a5f9282010138613a52565b6020919350806001915483858901015201910190918492613a73565b60209350613a5f9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613a52565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613b425750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561196b5760209160051b010190565b81810292918115918404141715613bd157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161031e5760209260051b809284830137010190565b9290613c5690613c649593604086526040860191613c00565b926020818503910152613c00565b90565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031e5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff821693841561335457613ccd87878573ffffffffffffffffffffffffffffffffffffffff95613f31565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613d0f575b5050505050565b613d6a9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190613537565b03816000865af1908115610710577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613dd2575b5016036106ae578080613d08565b613deb915060203d602011610709576106fb818361374b565b38613dc4565b9081602091031261031e5751801515810361031e5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613f22573233148015613f27575b613f22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e91575b50613c6457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561071057600091613f03575b5038613e87565b613f1c915060203d602011610eaa57610e9c818361374b565b38613efc565b503390565b5060183610613e50565b909183613f3f575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613fb557505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613f39565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031e57517fffffffff000000000000000000000000000000000000000000000000000000008116810361031e5790565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614071575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061406b565b9091836140d35750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808503948086101561414957505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613f39565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580614283575b6141cb575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561071057600091614264575b50156142375750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61427d915060203d602011610eaa57610e9c818361374b565b3861422e565b50813b15156141c3565b9192908461429c575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156143f8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603614314575b50613d08565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561439a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061430e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614588573233148015614590575b614588578033149081156144e7575b506144b6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161031e5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561071057600091614569575b50386144aa565b614582915060203d602011610eaa57610e9c818361374b565b38614562565b506000903690565b506018361061449b56fea26469706673582212205635112d647481f0d971c061ecf7f589428fd1ee599fa837ce5adc8b729d87e064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x466B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x45D0 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2322 ADD MSTORE DUP2 DUP2 PUSH2 0x3878 ADD MSTORE DUP2 DUP2 PUSH2 0x3E20 ADD MSTORE PUSH2 0x446B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x3460 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x33D9 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x337E JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x311C JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2862 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x270B JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2624 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x2509 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x2439 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2346 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22D7 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1EB1 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1D25 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1CD7 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BF9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BAE JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AE4 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19C8 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1857 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x16A7 JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x1515 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x13A6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1335 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1208 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1170 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10FD JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x108C JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF2C JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEBB JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7E JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC25 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA9C JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA60 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x854 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7A0 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x46E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37A JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1CB CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20C PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP2 DUP2 SUB PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22C JUMPI STOP JUMPDEST PUSH2 0x237 DUP2 DUP4 DUP8 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31E JUMPI PUSH2 0x261 DUP3 DUP6 DUP8 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E4 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x284 DUP3 PUSH2 0x37F0 JUMP JUMPDEST SWAP2 PUSH2 0x292 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x374B JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AB JUMPI POP PUSH1 0x1 ADD PUSH2 0x223 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BA JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29D JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x3B1 PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3DB PUSH2 0x3E09 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x41F JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x4A5 PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x4AD PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x4D5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP3 PUSH2 0x4DE PUSH2 0x3E09 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x790 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x766 JUMPI PUSH2 0x581 DUP3 DUP8 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x71C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x5AA DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x428D JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5E7 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5F5 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH2 0x64B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6E1 JUMPI JUMPDEST POP AND SUB PUSH2 0x6AE JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x703 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI JUMPDEST PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x400E JUMP JUMPDEST DUP7 PUSH2 0x6A5 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6F1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x799 SWAP2 PUSH2 0x41A2 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x535 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x7D7 PUSH2 0x34CE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7F4 PUSH2 0x34F1 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8A3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8C3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8E5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x908 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x913 PUSH2 0x3E09 JUMP JUMPDEST SWAP8 PUSH2 0x93E DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x969 DUP2 PUSH2 0x378C JUMP JUMPDEST SWAP8 PUSH2 0x977 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x374B JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31E JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA33 JUMPI POP POP POP SWAP2 PUSH2 0x9AC PUSH2 0x9B4 SWAP3 PUSH2 0x9BC SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA28 JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9DC JUMPI STOP JUMPDEST DUP1 PUSH2 0xA22 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA02 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3BAA JUMP JUMPDEST MLOAD AND PUSH2 0xA0E DUP5 DUP8 PUSH2 0x3BAA JUMP JUMPDEST MLOAD PUSH2 0xA19 DUP6 DUP10 PUSH2 0x3BAA JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3C88 JUMP JUMPDEST ADD PUSH2 0x9D3 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9CC JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x98E JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAD6 PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0xADE PUSH2 0x3E09 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB90 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0xC8C CALLDATASIZE PUSH2 0x36BC JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD1 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB1 JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD21 PUSH2 0xD1C DUP4 DUP6 DUP11 PUSH2 0x38C0 JUMP JUMPDEST PUSH2 0x3C67 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE83 JUMPI JUMPDEST POP ISZERO PUSH2 0xE56 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB0 PUSH2 0xD1C DUP4 DUP6 DUP11 PUSH2 0x38C0 JUMP JUMPDEST AND SWAP1 PUSH2 0xDC0 PUSH2 0xD1C DUP3 DUP7 DUP10 PUSH2 0x38C0 JUMP JUMPDEST SWAP2 PUSH2 0xDCC DUP3 DUP8 DUP12 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31E JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x710 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE45 JUMPI JUMPDEST POP ADD PUSH2 0xCF0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE50 SWAP2 PUSH2 0x374B JUMP JUMPDEST DUP9 PUSH2 0xE3E JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEAA JUMPI JUMPDEST PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3DF1 JUMP JUMPDEST DUP10 PUSH2 0xD86 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE92 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE9 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0xF63 PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31E JUMPI PUSH2 0x105D JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF95 PUSH2 0x3E09 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x102F JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1087 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x41A2 JUMP JUMPDEST PUSH2 0xF77 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x116C PUSH2 0x1158 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3A26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x11A7 PUSH2 0x34F1 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x123F PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x127E PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x130B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1401 PUSH2 0x3E09 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14CD JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x154C PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x156C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x158D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15B8 PUSH2 0x3E09 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x323 JUMPI PUSH2 0x15CB DUP7 DUP9 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x165D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1631 JUMPI POP POP SWAP5 PUSH2 0x162C PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3C3D JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1657 PUSH2 0x1642 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH2 0x164E DUP4 DUP10 DUP10 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x40C6 JUMP JUMPDEST ADD PUSH2 0x15D3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x16B5 CALLDATASIZE PUSH2 0x36BC JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16F8 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x184D JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1720 JUMPI STOP JUMPDEST PUSH2 0x172B DUP2 DUP4 DUP9 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31E JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x175E PUSH2 0xD1C DUP7 DUP12 DUP15 PUSH2 0x38C0 JUMP JUMPDEST DUP3 PUSH2 0x17C8 PUSH2 0x17F4 PUSH2 0x1770 DUP10 DUP14 DUP14 PUSH2 0x38C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x374B JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1844 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1817 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1717 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x180A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1710 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1865 CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x323 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x199A JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18E1 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x196B JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x31E JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x31E JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1949 DUP5 DUP12 DUP11 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1962 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18D8 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A39 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AB7 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1B1B PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x1B3F PUSH2 0x1BAC SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH2 0x1B9E PUSH2 0x1B4A PUSH2 0x3E09 JUMP JUMPDEST SWAP3 PUSH2 0x1B75 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3C88 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH2 0x1BEF PUSH2 0x1BEA PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x3861 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1C07 CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x323 JUMPI PUSH2 0x1C3D DUP6 PUSH2 0x378C JUMP JUMPDEST SWAP5 PUSH2 0x1C4B PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x374B JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C78 DUP3 PUSH2 0x378C JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C9F JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x116C SWAP1 DUP3 ADD DUP11 PUSH2 0x3688 JUMP JUMPDEST DUP1 PUSH2 0x1CC6 PUSH2 0x1CB3 PUSH2 0xD1C PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x38C0 JUMP JUMPDEST PUSH2 0x1CBE DUP4 DUP8 DUP10 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x38D0 JUMP JUMPDEST PUSH2 0x1CD0 DUP3 DUP11 PUSH2 0x3BAA JUMP JUMPDEST MSTORE ADD PUSH2 0x1C82 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1D0E PUSH2 0x4454 JUMP JUMPDEST PUSH2 0x116C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1D5F PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x1D67 PUSH2 0x3E09 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E1A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC20 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1EE8 PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x1EF0 PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F10 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F32 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F53 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1F5E PUSH2 0x3E09 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22C7 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x766 JUMPI DUP10 DUP12 SUB PUSH2 0x323 JUMPI PUSH2 0x2008 DUP3 DUP5 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x227D JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x224E JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2073 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3C3D JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x207D JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2092 PUSH2 0x209A SWAP3 PUSH2 0x20A2 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH2 0x2152 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2122 PUSH2 0x20F2 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x3688 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x3688 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x222F JUMPI JUMPDEST POP AND SUB PUSH2 0x21B5 JUMPI STOP JUMPDEST PUSH2 0x222B SWAP1 PUSH2 0x21FB PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x3688 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x3688 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2248 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP7 PUSH2 0x21AC JUMP JUMPDEST DUP1 PUSH2 0x2277 DUP13 PUSH2 0x226D DUP16 SWAP5 PUSH2 0x2265 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x428D JUMP JUMPDEST ADD PUSH2 0x2010 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x22D0 SWAP2 PUSH2 0x41A2 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1FB5 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2431 JUMPI JUMPDEST ISZERO PUSH2 0x23FB JUMPI POP POP PUSH2 0x116C PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x116C SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x241E JUMPI PUSH2 0x2418 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3BBE JUMP JUMPDEST DIV PUSH2 0x23CB JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x242C SWAP3 DIV PUSH2 0x3BBE JUMP JUMPDEST PUSH2 0x23CB JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23BE JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x2488 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x199A JUMPI PUSH2 0x2504 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x2540 PUSH2 0x34CE JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x256F PUSH2 0x3E09 JUMP JUMPDEST SWAP3 PUSH2 0x257B DUP5 DUP7 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x25DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x25C9 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x40C6 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x265B PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x269A PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27DA JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x116C SWAP1 DUP3 ADD DUP6 PUSH2 0x3537 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x27E9 DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x285A JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x285E JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x285A JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2820 DUP5 PUSH2 0x37F0 JUMP JUMPDEST SWAP3 PUSH2 0x282E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x374B JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2857 JUMPI POP PUSH2 0x116C SWAP3 PUSH2 0x2851 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3514 JUMP JUMPDEST SWAP1 PUSH2 0x27C4 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x28B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x28D1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x31E JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x31E JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x293F PUSH2 0x3E09 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x30C7 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F98 JUMPI DUP2 SWAP1 PUSH2 0x2BC7 DUP5 SLOAD PUSH2 0x39D3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3074 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2FD2 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2FC7 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH2 0x2C52 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x39D3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2F14 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2E18 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2E0D JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2C75 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2EFC JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2EC4 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2CC7 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2E97 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2E83 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2F8E JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2F82 JUMPI POP PUSH2 0x2C5B JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2F75 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F6C JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2BE7 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x305C JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x3024 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2C19 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3017 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x3001 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x30BD JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x30AE JUMPI POP PUSH2 0x2BD0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x30A1 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3093 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x29AC JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x3153 PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3173 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3195 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3229 SWAP4 PUSH2 0x31BF PUSH2 0x3231 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x3221 PUSH2 0x31CD PUSH2 0x3E09 JUMP JUMPDEST SWAP7 PUSH2 0x31F8 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3354 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x332A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x32CB PUSH2 0x32BD DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x3688 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x3688 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x32D5 JUMPI STOP JUMPDEST PUSH2 0x2152 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2122 PUSH2 0x20F2 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x3688 JUMP JUMPDEST DUP1 PUSH2 0x334E PUSH2 0x333A PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3BAA JUMP JUMPDEST MLOAD PUSH2 0x3345 DUP4 DUP12 PUSH2 0x3BAA JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3F31 JUMP JUMPDEST ADD PUSH2 0x325E JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x116C PUSH2 0x1158 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3A26 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI PUSH2 0x1BEF PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3949 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH2 0x34C6 PUSH2 0x349C PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x38D0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3527 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3517 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3573 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3514 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31E JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3661 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x3684 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x36A6 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x3699 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3705 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3728 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x3684 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2F98 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x37B0 DUP2 PUSH2 0x378C JUMP JUMPDEST SWAP4 PUSH2 0x37BE PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x374B JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31E JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x37E0 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x37D4 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3836 DUP3 PUSH2 0x37F0 JUMP JUMPDEST SWAP2 PUSH2 0x3844 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x374B JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31E JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x38B9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x196B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x391F JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x38B9 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x39CC JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3A1C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x39ED JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x39E2 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3A3A DUP5 PUSH2 0x39D3 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3AA8 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3A61 JUMPI JUMPDEST POP PUSH2 0x3A5F SWAP3 POP SUB DUP4 PUSH2 0x374B JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3A8C JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3A5F SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3A52 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3A73 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3A5F SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3A52 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3B42 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x196B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3BD1 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x3C56 SWAP1 PUSH2 0x3C64 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3C00 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3C00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3354 JUMPI PUSH2 0x3CCD DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3F31 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3D0F JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3D6A SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3DD2 JUMPI JUMPDEST POP AND SUB PUSH2 0x6AE JUMPI DUP1 DUP1 PUSH2 0x3D08 JUMP JUMPDEST PUSH2 0x3DEB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x3DC4 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3F22 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3F27 JUMPI JUMPDEST PUSH2 0x3F22 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E91 JUMPI JUMPDEST POP PUSH2 0x3C64 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F03 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E87 JUMP JUMPDEST PUSH2 0x3F1C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x3EFC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3E50 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3F3F JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3FB5 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31E JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4071 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x406B JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x40D3 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x4149 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4283 JUMPI JUMPDEST PUSH2 0x41CB JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4264 JUMPI JUMPDEST POP ISZERO PUSH2 0x4237 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x427D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x422E JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x41C3 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x429C JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x43F8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x4314 JUMPI JUMPDEST POP PUSH2 0x3D08 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x439A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x430E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4588 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4590 JUMPI JUMPDEST PUSH2 0x4588 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x44E7 JUMPI JUMPDEST POP PUSH2 0x44B6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31E JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4569 JUMPI JUMPDEST POP CODESIZE PUSH2 0x44AA JUMP JUMPDEST PUSH2 0x4582 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x4562 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x449B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMP CALLDATALOAD GT 0x2D PUSH5 0x7481F0D971 0xC0 PUSH2 0xECF7 CREATE2 DUP10 TIMESTAMP DUP16 DATALOADN 0xEE59 SWAP16 0xA8 CALLDATACOPY 0xCE GAS 0xDC DUP12 PUSH19 0x9D87E064736F6C634300081E00330000000000 ","sourceMap":"265:264:123:-:0;;;;;;;;;;;;;-1:-1:-1;;265:264:123;;;;-1:-1:-1;;;;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;265:264:123;;;;;;745:39:76;;265:264:123;;;;;;;;745:39:76;265:264:123;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;;;;-1:-1:-1;265:264:123;;;;;-1:-1:-1;265:264:123"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":13518,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":14012,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13848,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":13690,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":14244,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":14378,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15857,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":16398,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":13739,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":13553,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":13960,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":15360,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata_array_uint256_dyn_calldata":{"entryPoint":15421,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":13785,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":13623,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":14220,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":14320,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":14528,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":15294,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14886,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":13588,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":14803,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":14155,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":14544,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_burnToken":{"entryPoint":16582,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":16802,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":15080,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":16454,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":14433,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":16177,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":17492,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":15881,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":15496,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":14665,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferToken":{"entryPoint":17037,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":15274,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":15463,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8994},{"length":32,"start":14456},{"length":32,"start":15904},{"length":32,"start":17515}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461346057806301ffc9a7146133d957806306fdde031461337e5780630d6a5bbb1461311c5780630e07f854146128625780630e89341c1461270b578063114ba8ee14612624578063124d91e514612509578063162094c4146124395780632a55205a146123465780632b4c9f16146122d75780632eb2c2d614611eb15780632f2ff15d14611d2557806331e66e1e14611cd75780634e1273f414611bf9578063572b6c0514611bae5780635cfa929714611ae457806361ba27da146119c85780636706467b1461185757806373c8a958146116a757806380534934146115155780638bb9c5bf146113a65780638da5cb5b146113355780638dc251e31461120857806391d148541461117057806395d89b41146110fd578063a0c76f621461108c578063a22cb46514610f2c578063b0ccc31e14610ebb578063c3666c3614610c7e578063d539139314610c25578063d547741f14610a9c578063e1a8bf2c14610a60578063e8ab9ccc14610854578063e985e9c5146107a0578063f242432a1461046e578063f2fde38b1461037a5763f7ba94bd146101bd57600080fd5b3461031e576101cb36613618565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020c613e09565b925416911690810361034d57508181036103235760005b81811061022c57005b6102378183876138c0565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031e576102618285876138c0565b35908147106102ec57600080809381935af13d156102e4573d90610284826137f0565b91610292604051938461374b565b82523d6000602084013e5b156102ab5750600101610223565b8051156102ba57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029d565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576103b16134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103db613e09565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034d575073ffffffffffffffffffffffffffffffffffffffff169182820361041f57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576104a56134ce565b6104ad6134f1565b604435906064359260843567ffffffffffffffff811161031e576104d59036906004016135ab565b926104de613e09565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610790575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561076657610581828783614046565b1561071c5773ffffffffffffffffffffffffffffffffffffffff916105aa8a8a878a879661428d565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105e757005b6020926105f591369161382a565b9261064b60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190613537565b03816000865af1908115610710577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106e1575b5016036106ae57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610703915060203d602011610709575b6106fb818361374b565b81019061400e565b866106a5565b503d6106f1565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b610799916141a2565b8785610535565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576107d76134ce565b73ffffffffffffffffffffffffffffffffffffffff6107f46134f1565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760043567ffffffffffffffff811161031e576108a390369060040161357a565b60243567ffffffffffffffff811161031e576108c390369060040161357a565b929060443567ffffffffffffffff811161031e576108e590369060040161357a565b93909160643567ffffffffffffffff811161031e576109089036906004016135ab565b939091610913613e09565b9761093e897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612946109698161378c565b97610977604051998a61374b565b818952602089019160051b81019036821161031e57915b818310610a3357505050916109ac6109b4926109bc959436916137a4565b9736916137a4565b93369161382a565b9183519480518614801590610a28575b6103235760005b8681106109dc57005b80610a228673ffffffffffffffffffffffffffffffffffffffff610a026001958b613baa565b5116610a0e8487613baa565b51610a198589613baa565b51918d8a613c88565b016109d3565b5081518614156109cc565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031e5781526020928301920161098e565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576020604051620186a08152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57600435610ad66134f1565b610ade613e09565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b9057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031e57610c8c366136bc565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd1613e09565b925416911690810361034d5750808214801590610eb1575b6103235760005b828110610cf957005b73ffffffffffffffffffffffffffffffffffffffff610d21610d1c83858a6138c0565b613c67565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561071057600091610e83575b5015610e56575073ffffffffffffffffffffffffffffffffffffffff610db0610d1c83858a6138c0565b1690610dc0610d1c8286896138c0565b91610dcc82878b6138c0565b3592813b1561031e57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561071057600192610e45575b5001610cf0565b6000610e509161374b565b88610e3e565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea4915060203d8111610eaa575b610e9c818361374b565b810190613df1565b89610d86565b503d610e92565b5082821415610ce9565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57610f636134ce565b602435908115159182810361031e5761105d575b73ffffffffffffffffffffffffffffffffffffffff80610f95613e09565b1691169181831461102f5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611087817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306141a2565b610f77565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761116c6111587f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613a26565b604051918291602083526020830190613537565b0390f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576111a76134f1565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761123f6134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061127e613e09565b925416911690810361034d57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561130b5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611401613e09565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114cd5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c20565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761154c6134ce565b60243567ffffffffffffffff811161031e5761156c90369060040161357a565b9060443567ffffffffffffffff811161031e5761158d90369060040161357a565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115b8613e09565b94838203610323576115cb868883614046565b1561165d5760005b8281106116315750509461162c7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613c3d565b0390a4005b80611657611642600193868a6138c0565b3561164e8389896138c0565b35908b866140c6565b016115d3565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461031e576116b5366136bc565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116f8613e09565b925416911690810361034d575080841480159061184d575b6103235760005b84811061172057005b61172b8183886138c0565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031e57600060209161175e610d1c868b8e6138c0565b826117c86117f4611770898d8d6138c0565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261374b565b51925af115610710576000513d6118445750803b155b6118175750600101611717565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561180a565b5082841415611710565b3461031e5761186536613618565b8083949293036103235773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361199a57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118e157005b8481101561196b578060051b8201358381121561031e5782019081359167ffffffffffffffff831161031e5760200191803603831361031e577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611949848b8a6138c0565b35926119626040519283926020845260208401916135d9565b0390a2016118d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a39613e09565b925416911690810361034d57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611ab757815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611b1b6134ce565b6064359067ffffffffffffffff821161031e57611b3f611bac9236906004016135ab565b611b9e611b4a613e09565b92611b75847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861292369161382a565b926044359260243592613c88565b005b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576020611bef611bea6134ce565b613861565b6040519015158152f35b3461031e57611c0736613618565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361032357611c3d8561378c565b94611c4b604051968761374b565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c788261378c565b0136602088013760005b818110611c9f576040516020808252819061116c9082018a613688565b80611cc6611cb3610d1c600194868b6138c0565b611cbe8387896138c0565b3590886138d0565b611cd0828a613baa565b5201611c82565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611d0e614454565b61116c6040519283926020845260208401916135d9565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57600435611d5f6134f1565b611d67613e09565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611e1a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c20565b3461031e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57611ee86134ce565b611ef06134f1565b60443567ffffffffffffffff811161031e57611f1090369060040161357a565b929060643567ffffffffffffffff811161031e57611f3290369060040161357a565b9360843567ffffffffffffffff811161031e57611f539036906004016135ab565b939091611f5e613e09565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036122c7575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561076657898b0361032357612008828483614046565b1561227d5760005b8b811061224e575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61207399169a8b92169889936040519182918d8c8b85613c3d565b0390a43b61207d57005b60209461209261209a926120a29536916137a4565b9936916137a4565b95369161382a565b9261215260405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526121226120f260a485018b613688565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288613688565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152613537565b03816000875af1908115610710577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161222f575b5016036121b557005b61222b906121fb6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190613688565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152613688565b0390fd5b612248915060203d602011610709576106fb818361374b565b866121ac565b806122778c61226d8f94612265816001978d6138c0565b35928d6138c0565b359088888761428d565b01612010565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122d0916141a2565b8987611fb5565b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612431575b156123fb57505061116c60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116c91620186a082101561241e5761241890620186a092613bbe565b046123cb565b620186a061242c9204613bbe565b6123cb565b5081156123be565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760243567ffffffffffffffff811161031e576124889036906004016135ab565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361199a576125047f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b91604051918291602083526004359560208401916135d9565b0390a2005b3461031e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576125406134ce565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260243560443561256f613e09565b9261257b848683614046565b156125da5773ffffffffffffffffffffffffffffffffffffffff8086846125c97fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b6040986140c6565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761265b6134ce565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061269a613e09565b925416911690810361034d575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115610710576000916127da575b6040516020808252819061116c90820185613537565b3d8083833e6127e9818361374b565b81019060208183031261285a5780519067ffffffffffffffff821161285e570181601f8201121561285a57805192612820846137f0565b9261282e604051948561374b565b84845260208584010111612857575061116c926128519160208085019101613514565b906127c4565b80fd5b8280fd5b8380fd5b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760043567ffffffffffffffff811161031e576128b19036906004016135ab565b60243567ffffffffffffffff811161031e576128d19036906004016135ab565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361031e576064359373ffffffffffffffffffffffffffffffffffffffff8516850361031e577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61293f613e09565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612ddb575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816130c7575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612ddb575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612f98578190612bc784546139d3565b601f8111613074575b50600090601f8311600114612fd257600092612fc7575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612f9857612c527f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5546139d3565b601f8111612f14575b506000601f8211600114612e185781929394600092612e0d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612ddb575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612c75565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612efc575083600195969710612ec4575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612cc7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612e97565b90926020600181928686013581550194019101612e83565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612f8e575b601f0160051c01905b818110612f825750612c5b565b60008155600101612f75565b9091508190612f6c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612be7565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061305c5750908460019594939210613024575b505050811b019055612c19565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613017565b91936020600181928787013581550195019201613001565b909150836000526020600020601f840160051c810191602085106130bd575b90601f859493920160051c01905b8181106130ae5750612bd0565b600081558493506001016130a1565b9091508190613093565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a386806129ac565b3461031e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576131536134ce565b60243567ffffffffffffffff811161031e5761317390369060040161357a565b909160443567ffffffffffffffff811161031e5761319590369060040161357a565b93909160643567ffffffffffffffff811161031e57613229936131bf6132319236906004016135ab565b9590916132216131cd613e09565b966131f8887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613ae8565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916137a4565b9836916137a4565b94369161382a565b9173ffffffffffffffffffffffffffffffffffffffff821694851561335457865190855182036103235760005b82811061332a5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806132cb6132bd8d6040840190613688565b82810360208401528b613688565b0390a43b6132d557005b6121529160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526121226120f260a485018b613688565b8061334e61333a6001938c613baa565b51613345838b613baa565b51908886613f31565b0161325e565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5761116c6111587f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613a26565b3461031e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031e57611bef6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613949565b3461031e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031e5760206134c661349c6134ce565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126138d0565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031e57565b60005b8381106135275750506000910152565b8181015183820152602001613517565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361357381518092818752878088019101613514565b0116010190565b9181601f8401121561031e5782359167ffffffffffffffff831161031e576020808501948460051b01011161031e57565b9181601f8401121561031e5782359167ffffffffffffffff831161031e576020838186019501011161031e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031e5760043567ffffffffffffffff811161031e57816136619160040161357a565b929092916024359067ffffffffffffffff821161031e576136849160040161357a565b9091565b906020808351928381520192019060005b8181106136a65750505090565b8251845260209384019390920191600101613699565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031e5760043567ffffffffffffffff811161031e57816137059160040161357a565b9290929160243567ffffffffffffffff811161031e57816137289160040161357a565b929092916044359067ffffffffffffffff821161031e576136849160040161357a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612f9857604052565b67ffffffffffffffff8111612f985760051b60200190565b9291906137b08161378c565b936137be604051958661374b565b602085838152019160051b810192831161031e57905b8282106137e057505050565b81358152602091820191016137d4565b67ffffffffffffffff8111612f9857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613836826137f0565b91613844604051938461374b565b82948184528183011161031e578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156138b95773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b919081101561196b5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561391f5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146138b9577f01ffc9a70000000000000000000000000000000000000000000000000000000081146139cc5760005260205260ff6040600020541690565b5050600190565b90600182811c92168015613a1c575b60208310146139ed57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916139e2565b9060405191826000825492613a3a846139d3565b8084529360018116908115613aa85750600114613a61575b50613a5f9250038361374b565b565b90506000929192526020600020906000915b818310613a8c575050906020613a5f9282010138613a52565b6020919350806001915483858901015201910190918492613a73565b60209350613a5f9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613a52565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613b425750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561196b5760209160051b010190565b81810292918115918404141715613bd157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161031e5760209260051b809284830137010190565b9290613c5690613c649593604086526040860191613c00565b926020818503910152613c00565b90565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031e5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff821693841561335457613ccd87878573ffffffffffffffffffffffffffffffffffffffff95613f31565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613d0f575b5050505050565b613d6a9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190613537565b03816000865af1908115610710577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613dd2575b5016036106ae578080613d08565b613deb915060203d602011610709576106fb818361374b565b38613dc4565b9081602091031261031e5751801515810361031e5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613f22573233148015613f27575b613f22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e91575b50613c6457503390565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561071057600091613f03575b5038613e87565b613f1c915060203d602011610eaa57610e9c818361374b565b38613efc565b503390565b5060183610613e50565b909183613f3f575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613fb557505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613f39565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031e57517fffffffff000000000000000000000000000000000000000000000000000000008116810361031e5790565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614071575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061406b565b9091836140d35750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808503948086101561414957505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613f39565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580614283575b6141cb575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561071057600091614264575b50156142375750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61427d915060203d602011610eaa57610e9c818361374b565b3861422e565b50813b15156141c3565b9192908461429c575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156143f8575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603614314575b50613d08565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561439a57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061430e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614588573233148015614590575b614588578033149081156144e7575b506144b6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161031e5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561071057600091614569575b50386144aa565b614582915060203d602011610eaa57610e9c818361374b565b38614562565b506000903690565b506018361061449b56fea26469706673582212205635112d647481f0d971c061ecf7f589428fd1ee599fa837ce5adc8b729d87e064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x3460 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x33D9 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x337E JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x311C JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2862 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x270B JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2624 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x2509 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x2439 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2346 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22D7 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1EB1 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1D25 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1CD7 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BF9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BAE JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AE4 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19C8 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1857 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x16A7 JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x1515 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x13A6 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1335 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1208 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1170 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10FD JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x108C JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF2C JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEBB JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7E JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC25 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA9C JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA60 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x854 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7A0 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x46E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37A JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1CB CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20C PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP2 DUP2 SUB PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22C JUMPI STOP JUMPDEST PUSH2 0x237 DUP2 DUP4 DUP8 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31E JUMPI PUSH2 0x261 DUP3 DUP6 DUP8 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2EC JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E4 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x284 DUP3 PUSH2 0x37F0 JUMP JUMPDEST SWAP2 PUSH2 0x292 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x374B JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AB JUMPI POP PUSH1 0x1 ADD PUSH2 0x223 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BA JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29D JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x3B1 PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3DB PUSH2 0x3E09 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x41F JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x4A5 PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x4AD PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x4D5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP3 PUSH2 0x4DE PUSH2 0x3E09 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x790 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x766 JUMPI PUSH2 0x581 DUP3 DUP8 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x71C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x5AA DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x428D JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5E7 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5F5 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH2 0x64B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6E1 JUMPI JUMPDEST POP AND SUB PUSH2 0x6AE JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x703 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI JUMPDEST PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x400E JUMP JUMPDEST DUP7 PUSH2 0x6A5 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6F1 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x799 SWAP2 PUSH2 0x41A2 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x535 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x7D7 PUSH2 0x34CE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7F4 PUSH2 0x34F1 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8A3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8C3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x8E5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x908 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x913 PUSH2 0x3E09 JUMP JUMPDEST SWAP8 PUSH2 0x93E DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x969 DUP2 PUSH2 0x378C JUMP JUMPDEST SWAP8 PUSH2 0x977 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x374B JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31E JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA33 JUMPI POP POP POP SWAP2 PUSH2 0x9AC PUSH2 0x9B4 SWAP3 PUSH2 0x9BC SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA28 JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9DC JUMPI STOP JUMPDEST DUP1 PUSH2 0xA22 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA02 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3BAA JUMP JUMPDEST MLOAD AND PUSH2 0xA0E DUP5 DUP8 PUSH2 0x3BAA JUMP JUMPDEST MLOAD PUSH2 0xA19 DUP6 DUP10 PUSH2 0x3BAA JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3C88 JUMP JUMPDEST ADD PUSH2 0x9D3 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9CC JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x98E JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAD6 PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0xADE PUSH2 0x3E09 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB90 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0xC8C CALLDATASIZE PUSH2 0x36BC JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD1 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB1 JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD21 PUSH2 0xD1C DUP4 DUP6 DUP11 PUSH2 0x38C0 JUMP JUMPDEST PUSH2 0x3C67 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE83 JUMPI JUMPDEST POP ISZERO PUSH2 0xE56 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB0 PUSH2 0xD1C DUP4 DUP6 DUP11 PUSH2 0x38C0 JUMP JUMPDEST AND SWAP1 PUSH2 0xDC0 PUSH2 0xD1C DUP3 DUP7 DUP10 PUSH2 0x38C0 JUMP JUMPDEST SWAP2 PUSH2 0xDCC DUP3 DUP8 DUP12 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31E JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x710 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE45 JUMPI JUMPDEST POP ADD PUSH2 0xCF0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE50 SWAP2 PUSH2 0x374B JUMP JUMPDEST DUP9 PUSH2 0xE3E JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEAA JUMPI JUMPDEST PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3DF1 JUMP JUMPDEST DUP10 PUSH2 0xD86 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE92 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE9 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0xF63 PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31E JUMPI PUSH2 0x105D JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF95 PUSH2 0x3E09 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x102F JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1087 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x41A2 JUMP JUMPDEST PUSH2 0xF77 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x116C PUSH2 0x1158 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3A26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x11A7 PUSH2 0x34F1 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x123F PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x127E PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x130B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1401 PUSH2 0x3E09 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14CD JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x154C PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x156C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x158D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15B8 PUSH2 0x3E09 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x323 JUMPI PUSH2 0x15CB DUP7 DUP9 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x165D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1631 JUMPI POP POP SWAP5 PUSH2 0x162C PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3C3D JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1657 PUSH2 0x1642 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH2 0x164E DUP4 DUP10 DUP10 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x40C6 JUMP JUMPDEST ADD PUSH2 0x15D3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x16B5 CALLDATASIZE PUSH2 0x36BC JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16F8 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x184D JUMPI JUMPDEST PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1720 JUMPI STOP JUMPDEST PUSH2 0x172B DUP2 DUP4 DUP9 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31E JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x175E PUSH2 0xD1C DUP7 DUP12 DUP15 PUSH2 0x38C0 JUMP JUMPDEST DUP3 PUSH2 0x17C8 PUSH2 0x17F4 PUSH2 0x1770 DUP10 DUP14 DUP14 PUSH2 0x38C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x374B JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1844 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1817 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1717 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x180A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1710 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1865 CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x323 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x199A JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18E1 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x196B JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x31E JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x31E JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1949 DUP5 DUP12 DUP11 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1962 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18D8 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A39 PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AB7 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1B1B PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x1B3F PUSH2 0x1BAC SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH2 0x1B9E PUSH2 0x1B4A PUSH2 0x3E09 JUMP JUMPDEST SWAP3 PUSH2 0x1B75 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3C88 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH2 0x1BEF PUSH2 0x1BEA PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x3861 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH2 0x1C07 CALLDATASIZE PUSH2 0x3618 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x323 JUMPI PUSH2 0x1C3D DUP6 PUSH2 0x378C JUMP JUMPDEST SWAP5 PUSH2 0x1C4B PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x374B JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C78 DUP3 PUSH2 0x378C JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C9F JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x116C SWAP1 DUP3 ADD DUP11 PUSH2 0x3688 JUMP JUMPDEST DUP1 PUSH2 0x1CC6 PUSH2 0x1CB3 PUSH2 0xD1C PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x38C0 JUMP JUMPDEST PUSH2 0x1CBE DUP4 DUP8 DUP10 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x38D0 JUMP JUMPDEST PUSH2 0x1CD0 DUP3 DUP11 PUSH2 0x3BAA JUMP JUMPDEST MSTORE ADD PUSH2 0x1C82 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1D0E PUSH2 0x4454 JUMP JUMPDEST PUSH2 0x116C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1D5F PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x1D67 PUSH2 0x3E09 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E1A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC20 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x1EE8 PUSH2 0x34CE JUMP JUMPDEST PUSH2 0x1EF0 PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F10 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F32 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x1F53 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1F5E PUSH2 0x3E09 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22C7 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x766 JUMPI DUP10 DUP12 SUB PUSH2 0x323 JUMPI PUSH2 0x2008 DUP3 DUP5 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x227D JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x224E JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2073 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3C3D JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x207D JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2092 PUSH2 0x209A SWAP3 PUSH2 0x20A2 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP3 PUSH2 0x2152 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2122 PUSH2 0x20F2 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x3688 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x3688 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x222F JUMPI JUMPDEST POP AND SUB PUSH2 0x21B5 JUMPI STOP JUMPDEST PUSH2 0x222B SWAP1 PUSH2 0x21FB PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x3688 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x3688 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2248 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP7 PUSH2 0x21AC JUMP JUMPDEST DUP1 PUSH2 0x2277 DUP13 PUSH2 0x226D DUP16 SWAP5 PUSH2 0x2265 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x38C0 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x428D JUMP JUMPDEST ADD PUSH2 0x2010 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x22D0 SWAP2 PUSH2 0x41A2 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1FB5 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2431 JUMPI JUMPDEST ISZERO PUSH2 0x23FB JUMPI POP POP PUSH2 0x116C PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x116C SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x241E JUMPI PUSH2 0x2418 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3BBE JUMP JUMPDEST DIV PUSH2 0x23CB JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x242C SWAP3 DIV PUSH2 0x3BBE JUMP JUMPDEST PUSH2 0x23CB JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23BE JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x2488 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x199A JUMPI PUSH2 0x2504 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x35D9 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x2540 PUSH2 0x34CE JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x256F PUSH2 0x3E09 JUMP JUMPDEST SWAP3 PUSH2 0x257B DUP5 DUP7 DUP4 PUSH2 0x4046 JUMP JUMPDEST ISZERO PUSH2 0x25DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x25C9 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x40C6 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x265B PUSH2 0x34CE JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x269A PUSH2 0x3E09 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x27DA JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x116C SWAP1 DUP3 ADD DUP6 PUSH2 0x3537 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x27E9 DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x285A JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x285E JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x285A JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2820 DUP5 PUSH2 0x37F0 JUMP JUMPDEST SWAP3 PUSH2 0x282E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x374B JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2857 JUMPI POP PUSH2 0x116C SWAP3 PUSH2 0x2851 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3514 JUMP JUMPDEST SWAP1 PUSH2 0x27C4 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x28B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x28D1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x31E JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x31E JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x293F PUSH2 0x3E09 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x30C7 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F98 JUMPI DUP2 SWAP1 PUSH2 0x2BC7 DUP5 SLOAD PUSH2 0x39D3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3074 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2FD2 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2FC7 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH2 0x2C52 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x39D3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2F14 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2E18 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2E0D JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2DDB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2C75 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2EFC JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2EC4 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2CC7 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2E97 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2E83 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2F8E JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2F82 JUMPI POP PUSH2 0x2C5B JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2F75 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F6C JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2BE7 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x305C JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x3024 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2C19 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3017 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x3001 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x30BD JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x30AE JUMPI POP PUSH2 0x2BD0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x30A1 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3093 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x29AC JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x3153 PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3173 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3195 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI PUSH2 0x3229 SWAP4 PUSH2 0x31BF PUSH2 0x3231 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x35AB JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x3221 PUSH2 0x31CD PUSH2 0x3E09 JUMP JUMPDEST SWAP7 PUSH2 0x31F8 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3AE8 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x37A4 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x382A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3354 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x323 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x332A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x32CB PUSH2 0x32BD DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x3688 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x3688 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x32D5 JUMPI STOP JUMPDEST PUSH2 0x2152 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x2122 PUSH2 0x20F2 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x3688 JUMP JUMPDEST DUP1 PUSH2 0x334E PUSH2 0x333A PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3BAA JUMP JUMPDEST MLOAD PUSH2 0x3345 DUP4 DUP12 PUSH2 0x3BAA JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3F31 JUMP JUMPDEST ADD PUSH2 0x325E JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH2 0x116C PUSH2 0x1158 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3A26 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI PUSH2 0x1BEF PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3949 JUMP JUMPDEST CALLVALUE PUSH2 0x31E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31E JUMPI PUSH1 0x20 PUSH2 0x34C6 PUSH2 0x349C PUSH2 0x34CE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x38D0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3527 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3517 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3573 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3514 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31E JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31E JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3661 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x3684 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x36A6 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x3699 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31E JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3705 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31E JUMPI DUP2 PUSH2 0x3728 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31E JUMPI PUSH2 0x3684 SWAP2 PUSH1 0x4 ADD PUSH2 0x357A JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2F98 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x37B0 DUP2 PUSH2 0x378C JUMP JUMPDEST SWAP4 PUSH2 0x37BE PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x374B JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31E JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x37E0 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x37D4 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F98 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3836 DUP3 PUSH2 0x37F0 JUMP JUMPDEST SWAP2 PUSH2 0x3844 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x374B JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31E JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x38B9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x196B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x391F JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x38B9 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x39CC JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3A1C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x39ED JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x39E2 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3A3A DUP5 PUSH2 0x39D3 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3AA8 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3A61 JUMPI JUMPDEST POP PUSH2 0x3A5F SWAP3 POP SUB DUP4 PUSH2 0x374B JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3A8C JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3A5F SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3A52 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3A73 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3A5F SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3A52 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3B42 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x196B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3BD1 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31E JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x3C56 SWAP1 PUSH2 0x3C64 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3C00 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3C00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3354 JUMPI PUSH2 0x3CCD DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3F31 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3D0F JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3D6A SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3537 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3DD2 JUMPI JUMPDEST POP AND SUB PUSH2 0x6AE JUMPI DUP1 DUP1 PUSH2 0x3D08 JUMP JUMPDEST PUSH2 0x3DEB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x709 JUMPI PUSH2 0x6FB DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x3DC4 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3F22 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3F27 JUMPI JUMPDEST PUSH2 0x3F22 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E91 JUMPI JUMPDEST POP PUSH2 0x3C64 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F03 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E87 JUMP JUMPDEST PUSH2 0x3F1C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x3EFC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3E50 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3F3F JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3FB5 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31E JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31E JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4071 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x406B JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x40D3 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x4149 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4283 JUMPI JUMPDEST PUSH2 0x41CB JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4264 JUMPI JUMPDEST POP ISZERO PUSH2 0x4237 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x427D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x422E JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x41C3 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x429C JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x43F8 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x4314 JUMPI JUMPDEST POP PUSH2 0x3D08 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x439A JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x430E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4588 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4590 JUMPI JUMPDEST PUSH2 0x4588 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x44E7 JUMPI JUMPDEST POP PUSH2 0x44B6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31E JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4569 JUMPI JUMPDEST POP CODESIZE PUSH2 0x44AA JUMP JUMPDEST PUSH2 0x4582 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAA JUMPI PUSH2 0xE9C DUP2 DUP4 PUSH2 0x374B JUMP JUMPDEST CODESIZE PUSH2 0x4562 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x449B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMP CALLDATALOAD GT 0x2D PUSH5 0x7481F0D971 0xC0 PUSH2 0xECF7 CREATE2 DUP10 TIMESTAMP DUP16 DATALOADN 0xEE59 SWAP16 0xA8 CALLDATACOPY 0xCE GAS 0xDC DUP12 PUSH19 0x9D87E064736F6C634300081E00330000000000 ","sourceMap":"265:264:123:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;265:264:123;;3478:41:231;;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;265:264:123;1845:10:192;;;;;;265:264:123;1857:3:192;1876:11;;;;;:::i;:::-;265:264:123;;;;;;;;;1898:10:192;;;;;:::i;:::-;265:264:123;1375:21:9;;;:30;1371:125;;265:264:123;1548:33:9;;;;;;;265:264:123;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;265:264:123;;1834:9:192;;1591:58:9;265:264:123;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;265:264:123;5957:19:9;265:264:123;;5957:19:9;265:264:123;;;;;1371:125:9;1455:21;;1428:57;265:264:123;1428:57:9;265:264:123;;;;;;1428:57:9;265:264:123;;;;1756:63:192;1793:26;265:264:123;1793:26:192;265:264:123;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;265:264:123;;-1:-1:-1;4538:25:42;265:264:123;;;;;;;;;;;;;:::i;:::-;;3478:41:231;;;:::i;:::-;265:264:123;;;;;;;;3205:23:42;;;3201:60;;265:264:123;;;3275:25:42;;;;3271:146;;265:264:123;3271:146:42;583:77:341;;;;;;;;3361:45:42;265:264:123;3361:45:42;;265:264:123;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;;:::i;:::-;3179:19:352;265:264:123;;;;;;;;2616:14:352;2612:76;;265:264:123;-1:-1:-1;;265:264:123;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;265:264:123;4720:5:228;;;;;;;;;:::i;:::-;265:264:123;;;;;;;4742:43:228;265:264:123;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;265:264:123;4796:104:228;265:264:123;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;265:264:123;19356:74:228;;265:264:123;19356:74:228;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;265:264:123;19356:74:228;;;;;;;;265:264:123;19356:74:228;265:264:123;19356:74:228;265:264:123;19356:74:228;;;4796:104;265:264:123;;19356:101:228;19352:168;;265:264:123;19352:168:228;19478:42;265:264:123;19478:42:228;265:264:123;;;;;;;;19478:42:228;19356:74;;;;265:264:123;19356:74:228;265:264:123;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;265:264:123;;;;;;;;;4601:76:228;265:264:123;4645:32:228;;;;265:264:123;4645:32:228;265:264:123;;;;;;;;4645:32:228;4532:59;4561:30;265:264:123;4561:30:228;265:264:123;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;265:264:123;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;265:264:123;-1:-1:-1;265:264:123;14847:11:228;265:264:123;;;;-1:-1:-1;265:264:123;14847:28:228;265:264:123;-1:-1:-1;265:264:123;;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;265:264:123;1367:6:208;:::i;:::-;265:264:123;974:8:208;;;;:::i;:::-;265:264:123;;;;;;;:::i;:::-;974:8:208;;;265:264:123;974:8:208;;;;;;;265:264:123;;974:8:208;;;;;;;;;;;265:264:123;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;265:264:123;11728:10:228;;;;;;265:264:123;11740:3:228;11778:13;11812:4;11778:13;265:264:123;11778:13:228;265:264:123;11778:13:228;;;:::i;:::-;265:264:123;;11793:6:228;;;;:::i;:::-;265:264:123;11801:9:228;;;;:::i;:::-;265:264:123;11812:4:228;;;;:::i;:::-;265:264:123;11717:9:228;;11620:47;265:264:123;;;11644:23:228;;;11620:47;;974:8:208;265:264:123;;;;;;;;;974:8:208;;265:264:123;974:8:208;;;;;;;265:264:123;;;;;;;;;;;;;;713:6:351;265:264:123;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;:::i;:::-;5148:19:42;265:264:123;;;;;;;4503:26:42;;;4499:64;;4464:19:41;265:264:123;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;1880:140:41;;265:264:123;1880:140:41;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;265:264:123;;;;1973:36:41;;;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;265:264:123;;;3478:41:231;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;265:264:123;3852:94:192;;265:264:123;3972:10:192;;;;;;265:264:123;3984:3:192;265:264:123;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;265:264:123;;;;4058:76:192;;4108:25;265:264:123;4058:76:192;;265:264:123;4058:76:192;;;;;;;;;;;;265:264:123;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;265:264:123;4239:12:192;;;;;;:::i;:::-;265:264:123;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;265:264:123;4239:70:192;;;;;;;265:264:123;;;;;;;4239:70:192;;;;;265:264:123;4239:70:192;;4277:4;265:264:123;4239:70:192;;265:264:123;;4058:76:192;265:264:123;;;;;;;4239:70:192;;;;;;;265:264:123;4239:70:192;;;3984:3;;265:264:123;3961:9:192;;4239:70;265:264:123;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;265:264:123;4161:50:192;265:264:123;;4058:76:192;265:264:123;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;265:264:123;;3478:41:231;;;:::i;:::-;265:264:123;;;14276:18:228;;;;14272:64;;265:264:123;14401:42:228;14346:19;265:264:123;-1:-1:-1;265:264:123;14346:11:228;265:264:123;;;-1:-1:-1;265:264:123;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;;;;;;;;;;;;;14401:42:228;265:264:123;14272:64:228;14303:33;;265:264:123;14303:33:228;265:264:123;;;;14303:33:228;2071:115:211;2931:8:352;668:81;265:264:123;2931:8:352;:::i;:::-;2071:115:211;;265:264:123;;;;;;;;;;;;;2991:23:341;265:264:123;;;;;;;;;;;;;;;;;;;;;2688:13:341;265:264:123;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;265:264:123;-1:-1:-1;265:264:123;;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;265:264:123;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3478:41:231;;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;2976:19:351;265:264:123;;;;;1732:22:351;1728:93;;265:264:123;;583:77:341;;;;;;;265:264:123;;;1728:93:351;1777:33;265:264:123;1777:33:351;265:264:123;;1777:33:351;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3478:41:231;;:::i;:::-;265:264:123;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;3741:25:41;3737:66;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;265:264:123;;;;2455:33:41;265:264:123;3737:66:41;265:264:123;3775:28:41;;;265:264:123;3775:28:41;265:264:123;;;;;;;3775:28:41;265:264:123;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;265:264:123;3478:41:231;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;265:264:123;13625:10:228;;;;;;265:264:123;;;13720:52:228;;265:264:123;;;;;;;;;;;;;;13720:52:228;;;:::i;:::-;;;;265:264:123;13637:3:228;13676:6;13684:9;13676:6;265:264:123;13676:6:228;;;;:::i;:::-;265:264:123;13684:9:228;;;;;:::i;:::-;265:264:123;13684:9:228;;;;:::i;:::-;265:264:123;13614:9:228;;13522:76;265:264:123;13566:32:228;;;;265:264:123;13566:32:228;265:264:123;;;;;;;;13566:32:228;265:264:123;;;;;;;:::i;:::-;5148:19:42;;;;265:264:123;;;3478:41:231;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;265:264:123;2776:90:192;;265:264:123;2892:10:192;;;;;;265:264:123;2904:3:192;2923:9;;;;;:::i;:::-;265:264:123;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;265:264:123;;;1328:43:8;;;;;;265:264:123;;;;1328:43:8;;;265:264:123;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;265:264:123;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;265:264:123;;2881:9:192;;8938:146:8;9033:40;265:264:123;9033:40:8;265:264:123;;1328:43:8;265:264:123;9033:40:8;8942:68;265:264:123;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;265:264:123;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;265:264:123;2991:23:341;265:264:123;;2464:10:209;:71;2460:115;;2591:9;265:264:123;;;;;;;2586:102:209;2602:19;;;;;;265:264:123;2623:3:209;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;265:264:123;2665:11:209;;;;;;:::i;:::-;265:264:123;;;;;;;;;;;;;;;;:::i;:::-;2647:30:209;;;265:264:123;2591:9:209;;265:264:123;;;;;;;;;;2460:115:209;2544:31;265:264:123;2544:31:209;2464:10;265:264:123;;;;2544:31:209;265:264:123;;;;;;;;;;;;;;;3478:41:231;;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;2976:19:351;265:264:123;1281:36:351;713:6;1281:36;;1277:119;;265:264:123;;;;;;;;;;;;;;;1277:119:351;1340:45;265:264:123;1340:45:351;265:264:123;;;;1340:45:351;265:264:123;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;265:264:123;;;;;;:::i;:::-;;3478:41:231;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;265:264:123;1221:6:210;:::i;:::-;265:264:123;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;265:264:123;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;265:264:123;;16447:19:228;16129:20;;;16125:59;;265:264:123;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;265:264:123;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;265:264:123;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;265:264:123;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;265:264:123;;16250:9:228;;265:264:123;;;;;;;;;;;3713:39:231;;:::i;:::-;265:264:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;:::i;:::-;5148:19:42;265:264:123;;;;;;;4503:26:42;;;4499:64;;4464:19:41;265:264:123;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;1254:25:41;1250:140;;265:264:123;1250:140:41;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;265:264:123;;;;1343:36:41;265:264:123;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;;;;:::i;:::-;3179:19:352;265:264:123;;;;;;;;2616:14:352;2612:76;;265:264:123;-1:-1:-1;;265:264:123;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;265:264:123;6801:10:228;;;;;;265:264:123;;;;;;;;;;;6904:44:228;265:264:123;6904:44:228;265:264:123;;;;;;;;;;;6904:44:228;;;;;;;;:::i;:::-;;;;376:58:354;6959:111:228;;265:264:123;6959:111:228;265:264:123;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;265:264:123;20263:81:228;;265:264:123;20263:81:228;;265:264:123;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;265:264:123;20263:81:228;;;;;;;;265:264:123;20263:81:228;265:264:123;20263:81:228;265:264:123;20263:81:228;;;6959:111;265:264:123;;20263:107:228;20259:181;;265:264:123;20259:181:228;1878:53;265:264:123;1878:53:228;265:264:123;;20391:49:228;;;;;;265:264:123;20391:49:228;;265:264:123;;;1878:53:228;;;265:264:123;1878:53:228;;;;:::i;:::-;;265:264:123;1878:53:228;;;;265:264:123;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;265:264:123;20263:81:228;265:264:123;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;265:264:123;6860:6:228;;;:::i;:::-;265:264:123;6868:9:228;;;:::i;:::-;265:264:123;6868:9:228;;;;;:::i;:::-;265:264:123;6790:9:228;;6698:76;265:264:123;6742:32:228;;;;265:264:123;6742:32:228;265:264:123;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;265:264:123;;;;;;;;;;;;;;;941:19:75;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;265:264:123;2499:377:351;;;2559:17;;265:264:123;;2499:377:351;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;265:264:123;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;265:264:123;2499:377:351;;2607:259;713:6;2794:57;265:264:123;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3529:19:341;265:264:123;2991:23:341;265:264:123;;1716:10:209;:71;1712:115;;265:264:123;1842:22:209;265:264:123;;;;;;;;;;;;;;;;;:::i;:::-;1842:22:209;;;265:264:123;;;;;;;;;;;;;;:::i;:::-;;;;;;3478:41:231;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;265:264:123;12560:5:228;;;;12581:51;12560:5;;265:264:123;12560:5:228;265:264:123;12560:5:228;;:::i;:::-;265:264:123;;;;;;;;;;;;12581:51:228;;265:264:123;12450:76:228;265:264:123;12494:32:228;;;;265:264:123;12494:32:228;265:264:123;;;;;;;;12494:32:228;265:264:123;;;;;;;;;;;;;:::i;:::-;;;3478:41:231;;;:::i;:::-;265:264:123;;;;;4503:26:42;;;4499:64;;3179:19:352;265:264:123;;;;583:77:341;;;;;;;265:264:123;;;;;;;;;;;;;;3364:23:341;265:264:123;;;;3364:64:341;;1306:4:209;265:264:123;3364:64:341;;;265:264:123;;;;;;;;;;-1:-1:-1;;265:264:123;;;;;;;;3364:64:341;;;;;;;265:264:123;3364:64:341;;;265:264:123;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3478:41:231;;:::i;:::-;265:264:123;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;265:264:123;;;;;;1645:152:42;;265:264:123;-1:-1:-1;;265:264:123;;500:10:59;;265:264:123;;1124:1:42;265:264:123;;;;;;;;;500:10:59;265:264:123;;;;;;;;500:10:59;265:264:123;;;;;;;;500:10:59;265:264:123;;;;;;;;500:10:59;265:264:123;;;;;;;;500:10:59;265:264:123;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;265:264:123;;;;;;;;;;;;;;900:21:181;;;896:88;;265:264:123;1124:1:42;265:264:123;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;265:264:123;583:77:341;265:264:123;583:77:341;;;;;;;;265:264:123;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;265:264:123;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;265:264:123;583:77:341;;;;;;;;;;;265:264:123;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;265:264:123;2196:23:341;265:264:123;;583:77:341;;;;;;;265:264:123;;;;1124:1:42;900:21:181;;;896:88;;265:264:123;;;1124:1:42;265:264:123;;;583:77:341;;;;;;;265:264:123;;;896:88:181;930:54;265:264:123;930:54:181;265:264:123;;1124:1:42;265:264:123;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;265:264:123;;583:77:341;;;;265:264:123;;;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;265:264:123;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;265:264:123;;;583:77:341;;;;;;;;265:264:123;583:77:341;;;;;;;;;;;;;;;;;;;;;265:264:123;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;265:264:123;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;265:264:123;;;;;;;583:77:341;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;265:264:123;1124:1:42;583:77:341;;;;;;;;;;;;;;;;265:264:123;;;;;;;;;583:77:341;;;;;;;;265:264:123;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;265:264:123;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;583:77:341;;;;;;;;265:264:123;1740:46:42;;;;1645:152;;;;265:264:123;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41:231;;;265:264:123;3478:41:231;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;265:264:123;1669:6:210;:::i;:::-;265:264:123;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;265:264:123;;;;;9777:23:228;;9773:62;;265:264:123;9862:10:228;;;;;;265:264:123;;;;;;;;;9955:50:228;265:264:123;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;265:264:123;10016:117:228;265:264:123;;;;;;20263:81:228;;;;;265:264:123;20263:81:228;;265:264:123;20263:81:228;;265:264:123;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;265:264:123;9911:6:228;;;:::i;:::-;265:264:123;9919:9:228;;;;:::i;:::-;265:264:123;9919:9:228;;;;:::i;:::-;265:264:123;9851:9:228;;9671:55;9700:26;265:264:123;9700:26:228;265:264:123;;9700:26:228;265:264:123;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;265:264:123;1793:19:59;265:264:123;635:65:55;:::i;265:264:123:-;;;;;;;;;;;;2650:44:211;265:264:123;;:::i;:::-;;;;;2650:44:211;:::i;:::-;265:264:123;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;265:264:123;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;;;;:::o;1002:301:75:-;265:264:123;1146:19:75;265:264:123;1146:53:75;;;1142:96;;265:264:123;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;265:264:123;1215:12:75;:::o;265:264:123:-;;;;;;;;;;;;:::o;15240:220:228:-;;;265:264:123;;;15358:19:228;15354:61;;15375:1;265:264:123;;;;;15375:1:228;265:264:123;15432:21:228;265:264:123;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;;265:264:123;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;265:264:123;500:10:59;;;;;265:264:123;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;265:264:123:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;265:264:123;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;265:264:123;;;;;-1:-1:-1;265:264:123;;-1:-1:-1;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;265:264:123;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;265:264:123;3775:28:41;;-1:-1:-1;3775:28:41;265:264:123;3775:28:41;265:264:123;;;;;-1:-1:-1;3775:28:41;265:264:123;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;265:264:123;;;8152:16:228;;;8148:55;;8236:5;;;;265:264:123;8236:5:228;;:::i;:::-;265:264:123;;;8166:1:228;265:264:123;8258:49:228;265:264:123;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;265:264:123;;;;;;19356:74:228;;;;;265:264:123;19356:74:228;;;;;265:264:123;8166:1:228;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;265:264:123;19356:74:228;265:264:123;19356:74:228;8166:1;19356:74;;;8318:110;265:264:123;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;265:264:123;19356:74:228;265:264:123;19356:74:228;;;;;;;:::i;:::-;;;;265:264:123;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;265:264:123;1029:19:76;265:264:123;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;265:264:123;;;1676:74:76;;265:264:123;;;1676:74:76;;;265:264:123;1327:10:76;265:264:123;;;;1744:4:76;265:264:123;;;;;-1:-1:-1;1676:74:76;;265:264:123;;;;;;1676:74:76;;;;;;;265:264:123;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;265:264:123;17966:1:228;265:264:123;;;;;17966:1:228;265:264:123;;;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;;;18123:21:228;;;;;18119:80;;265:264:123;;17966:1:228;265:264:123;;;;;17966:1:228;265:264:123;18217:18:228;265:264:123;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;17953:320:228;;;;;;18119:80;265:264:123;;18153:46:228;;;265:264:123;;;18153:46:228;;;265:264:123;;;;;;;;;;;;;;;;;;20391:49:228;265:264:123;;;;;;;;;;;;;;;;;;:::o;16846:185:228:-;265:264:123;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;265:264:123;;-1:-1:-1;265:264:123;16997:11:228;265:264:123;;;;-1:-1:-1;265:264:123;16997:27:228;265:264:123;-1:-1:-1;265:264:123;;;500:10:59;265:264:123;-1:-1:-1;265:264:123;500:10:59;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;:::o;18382:326::-;265:264:123;18395:1:228;265:264:123;;;;;18395:1:228;265:264:123;;;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;;;18550:21:228;;;;;18546:86;;265:264:123;;18395:1:228;265:264:123;;;;;18395:1:228;265:264:123;18650:20:228;265:264:123;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;18382:326:228;;;;;;18546:86;265:264:123;;18580:52:228;;;265:264:123;;;18580:52:228;;;265:264:123;;;;;;;;;;;;;;;;;;20391:49:228;3271:479:352;265:264:123;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;265:264:123;;;3613:51:352;265:264:123;;3613:51:352;;;;265:264:123;3613:51:352;;3648:4;3613:51;;;265:264:123;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;265:264:123;;-1:-1:-1;3691:28:352;3613:51;;;;265:264:123;3613:51:352;265:264:123;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;17037:815:228;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;265:264:123;17163:1:228;265:264:123;;;;;17163:1:228;265:264:123;;;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;;;17330:29:228;;;;;17326:98;;265:264:123;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;265:264:123;17163:1:228;265:264:123;;;;;17163:1:228;265:264:123;;;;-1:-1:-1;265:264:123;;;;-1:-1:-1;265:264:123;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;265:264:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;265:264:123;;17640:48:228;;;265:264:123;;;17640:48:228;;;265:264:123;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;265:264:123;;17368:56:228;;;265:264:123;;;;;17368:56:228;;;265:264:123;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;265:264:123;2065:19:76;265:264:123;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;265:264:123;720:8:80;265:264:123;720:8:80;;265:264:123;;;;2115:1:76;2802:32;;:::o;2624:153::-;265:264:123;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;265:264:123;2361:10:76;265:264:123;;;;2771:4:76;265:264:123;;;;;-1:-1:-1;2682:95:76;;265:264:123;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"3574400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"804","ROYALTY_FEE_DENOMINATOR()":"848","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchBurnFrom(address,uint256[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2983","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3267","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2737","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2738","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2458","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchBurnFrom(address,uint256[],uint256[])":"80534934","batchSetTokenURI(uint256[],string[])":"6706467b","burnFrom(address,uint256,uint256)":"124d91e5","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol\":\"ERC1155FullBurnProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullBurnProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155FullBurnProxied} from \\\"./../../../../../token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol\\\";\\n\\ncontract ERC1155FullBurnProxiedMock is ERC1155FullBurnProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155FullBurnProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3cd57d1806db483b3c49952ecffa7e63e255d7401e5fbf430e57ab0a64f2fe9f\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../libraries/ERC1155Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../../base/ERC1155MetadataBase.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../../base/ERC1155MintableBase.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../../base/ERC1155DeliverableBase.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./../../base/ERC1155BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullBurnProxied is\\n    ERC1155WithOperatorFiltererBase,\\n    ERC1155MetadataBase,\\n    ERC1155MintableBase,\\n    ERC1155DeliverableBase,\\n    ERC1155BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC1155Storage.init();\\n        ERC1155Storage.initERC1155MetadataURI();\\n        ERC1155Storage.initERC1155Mintable();\\n        ERC1155Storage.initERC1155Deliverable();\\n        ERC1155Storage.initERC1155Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x558d874299a6ed7827690ec53ebb60ab3054095ab07efd08eebe1b7f7c7dd60e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol":{"ERC1155FullProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61429538819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f576080526040516141fa908161009b8239608051818181612193015281816135a501528181613b2301526140950152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461318d57806301ffc9a71461310657806306fdde03146130ab5780630d6a5bbb14612e495780630e07f854146125b85780630e89341c14612461578063114ba8ee1461237a578063162094c4146122aa5780632a55205a146121b75780632b4c9f16146121485780632eb2c2d614611d095780632f2ff15d14611b7d57806331e66e1e14611b2f5780634e1273f414611a51578063572b6c0514611a065780635cfa92971461193c57806361ba27da146118205780636706467b146116af57806373c8a958146114ff5780638bb9c5bf146113905780638da5cb5b1461131f5780638dc251e3146111f257806391d148541461115a57806395d89b41146110e7578063a0c76f6214611076578063a22cb46514610f16578063b0ccc31e14610ea5578063c3666c3614610c68578063d539139314610c0f578063d547741f14610a86578063e1a8bf2c14610a4a578063e8ab9ccc1461083e578063e985e9c51461078a578063f242432a14610458578063f2fde38b146103645763f7ba94bd146101a757600080fd5b34610308576101b536613345565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101f6613b0c565b9254169116908103610337575081810361030d5760005b81811061021657005b6102218183876135ed565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103085761024b8285876135ed565b35908147106102d657600080809381935af13d156102ce573d9061026e8261351d565b9161027c6040519384613478565b82523d6000602084013e5b15610295575060010161020d565b8051156102a457602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610287565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761039b6131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103c5613b0c565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610337575073ffffffffffffffffffffffffffffffffffffffff169182820361040957005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761048f6131fb565b61049761321e565b604435906064359260843567ffffffffffffffff8111610308576104bf9036906004016132d8565b926104c8613b0c565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361077a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156107505761056b828783613e37565b156107065773ffffffffffffffffffffffffffffffffffffffff916105948a8a878a8796613eb7565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105d157005b6020926105df913691613557565b9261063560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190613264565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106cb575b50160361069857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106ed915060203d6020116106f3575b6106e58183613478565b810190613d14565b8661068f565b503d6106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078391613d4c565b878561051f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576107c16131fb565b73ffffffffffffffffffffffffffffffffffffffff6107de61321e565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff81116103085761088d9036906004016132a7565b60243567ffffffffffffffff8111610308576108ad9036906004016132a7565b929060443567ffffffffffffffff8111610308576108cf9036906004016132a7565b93909160643567ffffffffffffffff8111610308576108f29036906004016132d8565b9390916108fd613b0c565b97610928897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861294610953816134b9565b97610961604051998a613478565b818952602089019160051b81019036821161030857915b818310610a1d575050509161099661099e926109a6959436916134d1565b9736916134d1565b933691613557565b9183519480518614801590610a12575b61030d5760005b8681106109c657005b80610a0c8673ffffffffffffffffffffffffffffffffffffffff6109ec6001958b6138d7565b51166109f884876138d7565b51610a0385896138d7565b51918d8a61398b565b016109bd565b5081518614156109b6565b823573ffffffffffffffffffffffffffffffffffffffff8116810361030857815260209283019201610978565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020604051620186a08152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435610ac061321e565b610ac8613b0c565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b7a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461030857610c76366133e9565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cbb613b0c565b92541691169081036103375750808214801590610e9b575b61030d5760005b828110610ce357005b73ffffffffffffffffffffffffffffffffffffffff610d0b610d0683858a6135ed565b61396a565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106fa57600091610e6d575b5015610e40575073ffffffffffffffffffffffffffffffffffffffff610d9a610d0683858a6135ed565b1690610daa610d068286896135ed565b91610db682878b6135ed565b3592813b1561030857606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106fa57600192610e2f575b5001610cda565b6000610e3a91613478565b88610e28565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e8e915060203d8111610e94575b610e868183613478565b810190613af4565b89610d70565b503d610e7c565b5082821415610cd3565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857610f4d6131fb565b602435908115159182810361030857611047575b73ffffffffffffffffffffffffffffffffffffffff80610f7f613b0c565b169116918183146110195760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611071817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d4c565b610f61565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613753565b604051918291602083526020830190613264565b0390f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761119161321e565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576112296131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611268613b0c565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112f55773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113eb613b0c565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114b75760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c0a565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103085761150d366133e9565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611550613b0c565b925416911690810361033757508084148015906116a5575b61030d5760005b84811061157857005b6115838183886135ed565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036103085760006020916115b6610d06868b8e6135ed565b8261162061164c6115c8898d8d6135ed565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613478565b51925af1156106fa576000513d61169c5750803b155b61166f575060010161156f565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611662565b5082841415611568565b34610308576116bd36613345565b80839492930361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117f257916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061173957005b848110156117c3578060051b820135838112156103085782019081359167ffffffffffffffff831161030857602001918036038313610308577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6001936117a1848b8a6135ed565b35926117ba604051928392602084526020840191613306565b0390a201611730565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611891613b0c565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161190f57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576119736131fb565b6064359067ffffffffffffffff821161030857611997611a049236906004016132d8565b6119f66119a2613b0c565b926119cd847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691613557565b92604435926024359261398b565b005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020611a47611a426131fb565b61358e565b6040519015158152f35b3461030857611a5f36613345565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030d57611a95856134b9565b94611aa36040519687613478565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ad0826134b9565b0136602088013760005b818110611af757604051602080825281906111569082018a6133b5565b80611b1e611b0b610d06600194868b6135ed565b611b168387896135ed565b3590886135fd565b611b28828a6138d7565b5201611ada565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611b6661407e565b611156604051928392602084526020840191613306565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435611bb761321e565b611bbf613b0c565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c7257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c0a565b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611d406131fb565b611d4861321e565b60443567ffffffffffffffff811161030857611d689036906004016132a7565b929060643567ffffffffffffffff811161030857611d8a9036906004016132a7565b9360843567ffffffffffffffff811161030857611dab9036906004016132d8565b939091611db6613b0c565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603612138575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075057898b0361030d57611e60828483613e37565b156120ee5760005b8b81106120bf575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611ee460405192839260408452611ed68d60408601908d61392d565b91848303602086015261392d565b0390a43b611eee57005b602094611f03611f0b92611f139536916134d1565b9936916134d1565b953691613557565b92611fc360405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f93611f6360a485018b6133b5565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886133b5565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152613264565b03816000875af19081156106fa577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916120a0575b50160361202657005b61209c9061206c6040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906133b5565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526133b5565b0390fd5b6120b9915060203d6020116106f3576106e58183613478565b8661201d565b806120e88c6120de8f946120d6816001978d6135ed565b35928d6135ed565b3590888887613eb7565b01611e68565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b61214191613d4c565b8987611e0d565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156122a2575b1561226c57505061115660005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61115691620186a082101561228f5761228990620186a0926138eb565b0461223c565b620186a061229d92046138eb565b61223c565b50811561222f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760243567ffffffffffffffff8111610308576122f99036906004016132d8565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117f2576123757f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191613306565b0390a2005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576123b16131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123f0613b0c565b9254169116908103610337575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106fa57600091612530575b6040516020808252819061115690820185613264565b3d8083833e61253f8183613478565b8101906020818303126125b05780519067ffffffffffffffff82116125b4570181601f820112156125b0578051926125768461351d565b926125846040519485613478565b848452602085840101116125ad5750611156926125a79160208085019101613241565b9061251a565b80fd5b8280fd5b8380fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff8111610308576126079036906004016132d8565b60243567ffffffffffffffff8111610308576126279036906004016132d8565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610308576064359373ffffffffffffffffffffffffffffffffffffffff85168503610308577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612695613b0c565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612b08575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612df4575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612b08575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612cc55781906128f48454613700565b601f8111612da1575b50600090601f8311600114612cff57600092612cf4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612cc55761297f7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613700565b601f8111612c41575b506000601f8211600114612b455781929394600092612b3a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612b08575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806129a2565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612c29575083600195969710612bf1575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556129f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612bc4565b90926020600181928686013581550194019101612bb0565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612cbb575b601f0160051c01905b818110612caf5750612988565b60008155600101612ca2565b9091508190612c99565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612914565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612d895750908460019594939210612d51575b505050811b019055612946565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612d44565b91936020600181928787013581550195019201612d2e565b909150836000526020600020601f840160051c81019160208510612dea575b90601f859493920160051c01905b818110612ddb57506128fd565b60008155849350600101612dce565b9091508190612dc0565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612702565b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857612e806131fb565b60243567ffffffffffffffff811161030857612ea09036906004016132a7565b909160443567ffffffffffffffff811161030857612ec29036906004016132a7565b93909160643567ffffffffffffffff811161030857612f5693612eec612f5e9236906004016132d8565b959091612f4e612efa613b0c565b96612f25887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916134d1565b9836916134d1565b943691613557565b9173ffffffffffffffffffffffffffffffffffffffff8216948515613081578651908551820361030d5760005b8281106130575750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612ff8612fea8d60408401906133b5565b82810360208401528b6133b5565b0390a43b61300257005b611fc39160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f93611f6360a485018b6133b5565b8061307b6130676001938c6138d7565b51613072838b6138d7565b51908886613c37565b01612f8b565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613753565b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361030857611a476020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613676565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206131f36131c96131fb565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126135fd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b60005b8381106132545750506000910152565b8181015183820152602001613244565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936132a081518092818752878088019101613241565b0116010190565b9181601f840112156103085782359167ffffffffffffffff8311610308576020808501948460051b01011161030857565b9181601f840112156103085782359167ffffffffffffffff8311610308576020838186019501011161030857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff8111610308578161338e916004016132a7565b929092916024359067ffffffffffffffff8211610308576133b1916004016132a7565b9091565b906020808351928381520192019060005b8181106133d35750505090565b82518452602093840193909201916001016133c6565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781613432916004016132a7565b9290929160243567ffffffffffffffff81116103085781613455916004016132a7565b929092916044359067ffffffffffffffff8211610308576133b1916004016132a7565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cc557604052565b67ffffffffffffffff8111612cc55760051b60200190565b9291906134dd816134b9565b936134eb6040519586613478565b602085838152019160051b810192831161030857905b82821061350d57505050565b8135815260209182019101613501565b67ffffffffffffffff8111612cc557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926135638261351d565b916135716040519384613478565b829481845281830111610308578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135e65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117c35760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561364c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135e6577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136f95760005260205260ff6040600020541690565b5050600190565b90600182811c92168015613749575b602083101461371a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161370f565b906040519182600082549261376784613700565b80845293600181169081156137d5575060011461378e575b5061378c92500383613478565b565b90506000929192526020600020906000915b8183106137b957505090602061378c928201013861377f565b60209193508060019154838589010152019101909184926137a0565b6020935061378c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861377f565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561386f5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117c35760209160051b010190565b818102929181159184041417156138fe57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103085760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103085790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415613081576139d087878573ffffffffffffffffffffffffffffffffffffffff95613c37565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613a12575b5050505050565b613a6d9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190613264565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613ad5575b501603610698578080613a0b565b613aee915060203d6020116106f3576106e58183613478565b38613ac7565b90816020910312610308575180151581036103085790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613c28573233148015613c2d575b613c28577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b97575b50613b9457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106fa57600091613c09575b5038613b8a565b613c22915060203d602011610e9457610e868183613478565b38613c02565b503390565b5060183610613b53565b909183613c45575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613cbb57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613c3f565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261030857517fffffffff00000000000000000000000000000000000000000000000000000000811681036103085790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613e2d575b613d75575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106fa57600091613e0e575b5015613de15750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613e27915060203d602011610e9457610e868183613478565b38613dd8565b50813b1515613d6d565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613e62575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613e5c565b91929084613ec6575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015614022575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613f3e575b50613a0b565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613fc457505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613f38565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156141b25732331480156141ba575b6141b257803314908115614111575b506140e0576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103085760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156106fa57600091614193575b50386140d4565b6141ac915060203d602011610e9457610e868183613478565b3861418c565b506000903690565b50601836106140c556fea26469706673582212201ffeb232aba325dc0d2fe2bff23ed6622453aaf98baabad24dab6961165e57fb64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x4295 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x41FA SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2193 ADD MSTORE DUP2 DUP2 PUSH2 0x35A5 ADD MSTORE DUP2 DUP2 PUSH2 0x3B23 ADD MSTORE PUSH2 0x4095 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x318D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3106 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x30AB JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2E49 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x25B8 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2461 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x237A JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x22AA JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x21B7 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2148 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1D09 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B7D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B2F JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A51 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1A06 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x193C JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1820 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16AF JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14FF JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1390 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131F JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11F2 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x115A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1076 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF16 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEA5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC68 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC0F JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA86 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA4A JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x83E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x78A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x364 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1B5 CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1F6 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP2 DUP2 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x216 JUMPI STOP JUMPDEST PUSH2 0x221 DUP2 DUP4 DUP8 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x308 JUMPI PUSH2 0x24B DUP3 DUP6 DUP8 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2CE JUMPI RETURNDATASIZE SWAP1 PUSH2 0x26E DUP3 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH2 0x27C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3478 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x295 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x287 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x39B PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3C5 PUSH2 0x3B0C JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x409 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x48F PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x497 PUSH2 0x321E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x4BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP3 PUSH2 0x4C8 PUSH2 0x3B0C JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x77A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x750 JUMPI PUSH2 0x56B DUP3 DUP8 DUP4 PUSH2 0x3E37 JUMP JUMPDEST ISZERO PUSH2 0x706 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x594 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3EB7 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5D1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5DF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH2 0x635 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6CB JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI JUMPDEST PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3D14 JUMP JUMPDEST DUP7 PUSH2 0x68F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x783 SWAP2 PUSH2 0x3D4C JUMP JUMPDEST DUP8 DUP6 PUSH2 0x51F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x7C1 PUSH2 0x31FB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DE PUSH2 0x321E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x88D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8CF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8F2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8FD PUSH2 0x3B0C JUMP JUMPDEST SWAP8 PUSH2 0x928 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x953 DUP2 PUSH2 0x34B9 JUMP JUMPDEST SWAP8 PUSH2 0x961 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x3478 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA1D JUMPI POP POP POP SWAP2 PUSH2 0x996 PUSH2 0x99E SWAP3 PUSH2 0x9A6 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA12 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9C6 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA0C DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9EC PUSH1 0x1 SWAP6 DUP12 PUSH2 0x38D7 JUMP JUMPDEST MLOAD AND PUSH2 0x9F8 DUP5 DUP8 PUSH2 0x38D7 JUMP JUMPDEST MLOAD PUSH2 0xA03 DUP6 DUP10 PUSH2 0x38D7 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x398B JUMP JUMPDEST ADD PUSH2 0x9BD JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9B6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAC0 PUSH2 0x321E JUMP JUMPDEST PUSH2 0xAC8 PUSH2 0x3B0C JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB7A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0xC76 CALLDATASIZE PUSH2 0x33E9 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCBB PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCE3 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0B PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x35ED JUMP JUMPDEST PUSH2 0x396A JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE6D JUMPI JUMPDEST POP ISZERO PUSH2 0xE40 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD9A PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x35ED JUMP JUMPDEST AND SWAP1 PUSH2 0xDAA PUSH2 0xD06 DUP3 DUP7 DUP10 PUSH2 0x35ED JUMP JUMPDEST SWAP2 PUSH2 0xDB6 DUP3 DUP8 DUP12 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x308 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE2F JUMPI JUMPDEST POP ADD PUSH2 0xCDA JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3A SWAP2 PUSH2 0x3478 JUMP JUMPDEST DUP9 PUSH2 0xE28 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE8E SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE94 JUMPI JUMPDEST PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AF4 JUMP JUMPDEST DUP10 PUSH2 0xD70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE7C JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCD3 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0xF4D PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1047 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF7F PUSH2 0x3B0C JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1019 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1071 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D4C JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3753 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1191 PUSH2 0x321E JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1229 PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1268 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12F5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13EB PUSH2 0x3B0C JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x150D CALLDATASIZE PUSH2 0x33E9 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1550 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x16A5 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1578 JUMPI STOP JUMPDEST PUSH2 0x1583 DUP2 DUP4 DUP9 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x308 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15B6 PUSH2 0xD06 DUP7 DUP12 DUP15 PUSH2 0x35ED JUMP JUMPDEST DUP3 PUSH2 0x1620 PUSH2 0x164C PUSH2 0x15C8 DUP10 DUP14 DUP14 PUSH2 0x35ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3478 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x169C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x166F JUMPI POP PUSH1 0x1 ADD PUSH2 0x156F JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1662 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1568 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x16BD CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17F2 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x1739 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17C3 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x308 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x308 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x17A1 DUP5 DUP12 DUP11 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17BA PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1730 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1891 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x190F JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1973 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x1997 PUSH2 0x1A04 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH2 0x19F6 PUSH2 0x19A2 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 PUSH2 0x19CD DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x398B JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x1A47 PUSH2 0x1A42 PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x358E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1A5F CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x30D JUMPI PUSH2 0x1A95 DUP6 PUSH2 0x34B9 JUMP JUMPDEST SWAP5 PUSH2 0x1AA3 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3478 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AD0 DUP3 PUSH2 0x34B9 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AF7 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP11 PUSH2 0x33B5 JUMP JUMPDEST DUP1 PUSH2 0x1B1E PUSH2 0x1B0B PUSH2 0xD06 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x35ED JUMP JUMPDEST PUSH2 0x1B16 DUP4 DUP8 DUP10 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x35FD JUMP JUMPDEST PUSH2 0x1B28 DUP3 DUP11 PUSH2 0x38D7 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ADA JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1B66 PUSH2 0x407E JUMP JUMPDEST PUSH2 0x1156 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BB7 PUSH2 0x321E JUMP JUMPDEST PUSH2 0x1BBF PUSH2 0x3B0C JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C72 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1D40 PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x1D48 PUSH2 0x321E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1D68 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1D8A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1DAB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1DB6 PUSH2 0x3B0C JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2138 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x750 JUMPI DUP10 DUP12 SUB PUSH2 0x30D JUMPI PUSH2 0x1E60 DUP3 DUP5 DUP4 PUSH2 0x3E37 JUMP JUMPDEST ISZERO PUSH2 0x20EE JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x20BF JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1EE4 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1ED6 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x392D JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x392D JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1EEE JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1F03 PUSH2 0x1F0B SWAP3 PUSH2 0x1F13 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH2 0x1FC3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F93 PUSH2 0x1F63 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x33B5 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x33B5 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x20A0 JUMPI JUMPDEST POP AND SUB PUSH2 0x2026 JUMPI STOP JUMPDEST PUSH2 0x209C SWAP1 PUSH2 0x206C PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x33B5 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x20B9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP7 PUSH2 0x201D JUMP JUMPDEST DUP1 PUSH2 0x20E8 DUP13 PUSH2 0x20DE DUP16 SWAP5 PUSH2 0x20D6 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3EB7 JUMP JUMPDEST ADD PUSH2 0x1E68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2141 SWAP2 PUSH2 0x3D4C JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1E0D JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x22A2 JUMPI JUMPDEST ISZERO PUSH2 0x226C JUMPI POP POP PUSH2 0x1156 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1156 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x228F JUMPI PUSH2 0x2289 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x38EB JUMP JUMPDEST DIV PUSH2 0x223C JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x229D SWAP3 DIV PUSH2 0x38EB JUMP JUMPDEST PUSH2 0x223C JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x222F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x22F9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17F2 JUMPI PUSH2 0x2375 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x23B1 PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23F0 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2530 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP6 PUSH2 0x3264 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x253F DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x25B0 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25B4 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x25B0 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2576 DUP5 PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x2584 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3478 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x25AD JUMPI POP PUSH2 0x1156 SWAP3 PUSH2 0x25A7 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3241 JUMP JUMPDEST SWAP1 PUSH2 0x251A JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2607 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2627 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x308 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x308 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2695 PUSH2 0x3B0C JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2DF4 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2CC5 JUMPI DUP2 SWAP1 PUSH2 0x28F4 DUP5 SLOAD PUSH2 0x3700 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2DA1 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2CFF JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2CF4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH2 0x297F PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3700 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2C41 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2B45 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2B3A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x29A2 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2C29 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2BF1 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x29F4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2BC4 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2BB0 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2CBB JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CAF JUMPI POP PUSH2 0x2988 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2CA2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2C99 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2914 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D89 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2D51 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2946 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2D44 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2D2E JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2DEA JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DDB JUMPI POP PUSH2 0x28FD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2DCE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2DC0 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2702 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x2E80 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2EA0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2EC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2F56 SWAP4 PUSH2 0x2EEC PUSH2 0x2F5E SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2F4E PUSH2 0x2EFA PUSH2 0x3B0C JUMP JUMPDEST SWAP7 PUSH2 0x2F25 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3081 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x3057 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2FF8 PUSH2 0x2FEA DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x33B5 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x3002 JUMPI STOP JUMPDEST PUSH2 0x1FC3 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F93 PUSH2 0x1F63 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x33B5 JUMP JUMPDEST DUP1 PUSH2 0x307B PUSH2 0x3067 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x38D7 JUMP JUMPDEST MLOAD PUSH2 0x3072 DUP4 DUP12 PUSH2 0x38D7 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3C37 JUMP JUMPDEST ADD PUSH2 0x2F8B JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3753 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1A47 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3676 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x31F3 PUSH2 0x31C9 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x35FD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3254 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3244 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x32A0 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3241 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x338E SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x33B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x33D3 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x33C6 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x3432 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x3455 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x33B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CC5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x34DD DUP2 PUSH2 0x34B9 JUMP JUMPDEST SWAP4 PUSH2 0x34EB PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3478 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x308 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x350D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3501 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3563 DUP3 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH2 0x3571 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3478 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x308 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x35E6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17C3 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x364C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35E6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x36F9 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3749 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x371A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x370F JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3767 DUP5 PUSH2 0x3700 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x37D5 JUMPI POP PUSH1 0x1 EQ PUSH2 0x378E JUMPI JUMPDEST POP PUSH2 0x378C SWAP3 POP SUB DUP4 PUSH2 0x3478 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x37B9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x378C SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x377F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x37A0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x378C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x377F JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x386F JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17C3 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x38FE JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3081 JUMPI PUSH2 0x39D0 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3C37 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3A12 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3A6D SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3AD5 JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI DUP1 DUP1 PUSH2 0x3A0B JUMP JUMPDEST PUSH2 0x3AEE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3AC7 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3C28 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3C2D JUMPI JUMPDEST PUSH2 0x3C28 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B97 JUMPI JUMPDEST POP PUSH2 0x3B94 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3C09 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B8A JUMP JUMPDEST PUSH2 0x3C22 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3C02 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3B53 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3C45 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3CBB JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3C3F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3E2D JUMPI JUMPDEST PUSH2 0x3D75 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E0E JUMPI JUMPDEST POP ISZERO PUSH2 0x3DE1 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3E27 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3DD8 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3E62 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3E5C JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3EC6 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x4022 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3F3E JUMPI JUMPDEST POP PUSH2 0x3A0B JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3FC4 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3F38 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x41B2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x41BA JUMPI JUMPDEST PUSH2 0x41B2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4111 JUMPI JUMPDEST POP PUSH2 0x40E0 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4193 JUMPI JUMPDEST POP CODESIZE PUSH2 0x40D4 JUMP JUMPDEST PUSH2 0x41AC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x418C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x40C5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1F INVALID 0xB2 ORIGIN 0xAB LOG3 0x25 0xDC 0xD 0x2F 0xE2 0xBF CALLCODE RETURNDATACOPY 0xD6 PUSH3 0x2453AA EXTDELEGATECALL DUP12 0xAA 0xBA 0xD2 0x4D 0xAB PUSH10 0x61165E57FB64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"257:252:124:-:0;;;;;;;;;;;;;-1:-1:-1;;257:252:124;;;;-1:-1:-1;;;;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;257:252:124;;;;;;745:39:76;;257:252:124;;;;;;;;745:39:76;257:252:124;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;;;;-1:-1:-1;257:252:124;;;;;-1:-1:-1;257:252:124"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12795,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13289,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13125,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12967,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13521,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13655,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15092,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":15636,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":13016,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12830,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":13237,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":14637,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":13062,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_string":{"entryPoint":12900,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13497,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13597,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":13805,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14571,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14163,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":12865,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":14080,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":13432,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":13821,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":15692,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14357,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":15927,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13710,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":15415,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":16510,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":15116,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":14731,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":13942,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferToken":{"entryPoint":16055,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14551,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":14698,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8595},{"length":32,"start":13733},{"length":32,"start":15139},{"length":32,"start":16533}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461318d57806301ffc9a71461310657806306fdde03146130ab5780630d6a5bbb14612e495780630e07f854146125b85780630e89341c14612461578063114ba8ee1461237a578063162094c4146122aa5780632a55205a146121b75780632b4c9f16146121485780632eb2c2d614611d095780632f2ff15d14611b7d57806331e66e1e14611b2f5780634e1273f414611a51578063572b6c0514611a065780635cfa92971461193c57806361ba27da146118205780636706467b146116af57806373c8a958146114ff5780638bb9c5bf146113905780638da5cb5b1461131f5780638dc251e3146111f257806391d148541461115a57806395d89b41146110e7578063a0c76f6214611076578063a22cb46514610f16578063b0ccc31e14610ea5578063c3666c3614610c68578063d539139314610c0f578063d547741f14610a86578063e1a8bf2c14610a4a578063e8ab9ccc1461083e578063e985e9c51461078a578063f242432a14610458578063f2fde38b146103645763f7ba94bd146101a757600080fd5b34610308576101b536613345565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101f6613b0c565b9254169116908103610337575081810361030d5760005b81811061021657005b6102218183876135ed565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103085761024b8285876135ed565b35908147106102d657600080809381935af13d156102ce573d9061026e8261351d565b9161027c6040519384613478565b82523d6000602084013e5b15610295575060010161020d565b8051156102a457602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610287565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761039b6131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103c5613b0c565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610337575073ffffffffffffffffffffffffffffffffffffffff169182820361040957005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761048f6131fb565b61049761321e565b604435906064359260843567ffffffffffffffff8111610308576104bf9036906004016132d8565b926104c8613b0c565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361077a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156107505761056b828783613e37565b156107065773ffffffffffffffffffffffffffffffffffffffff916105948a8a878a8796613eb7565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105d157005b6020926105df913691613557565b9261063560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190613264565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106cb575b50160361069857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106ed915060203d6020116106f3575b6106e58183613478565b810190613d14565b8661068f565b503d6106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078391613d4c565b878561051f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576107c16131fb565b73ffffffffffffffffffffffffffffffffffffffff6107de61321e565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff81116103085761088d9036906004016132a7565b60243567ffffffffffffffff8111610308576108ad9036906004016132a7565b929060443567ffffffffffffffff8111610308576108cf9036906004016132a7565b93909160643567ffffffffffffffff8111610308576108f29036906004016132d8565b9390916108fd613b0c565b97610928897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861294610953816134b9565b97610961604051998a613478565b818952602089019160051b81019036821161030857915b818310610a1d575050509161099661099e926109a6959436916134d1565b9736916134d1565b933691613557565b9183519480518614801590610a12575b61030d5760005b8681106109c657005b80610a0c8673ffffffffffffffffffffffffffffffffffffffff6109ec6001958b6138d7565b51166109f884876138d7565b51610a0385896138d7565b51918d8a61398b565b016109bd565b5081518614156109b6565b823573ffffffffffffffffffffffffffffffffffffffff8116810361030857815260209283019201610978565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020604051620186a08152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435610ac061321e565b610ac8613b0c565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b7a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461030857610c76366133e9565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cbb613b0c565b92541691169081036103375750808214801590610e9b575b61030d5760005b828110610ce357005b73ffffffffffffffffffffffffffffffffffffffff610d0b610d0683858a6135ed565b61396a565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106fa57600091610e6d575b5015610e40575073ffffffffffffffffffffffffffffffffffffffff610d9a610d0683858a6135ed565b1690610daa610d068286896135ed565b91610db682878b6135ed565b3592813b1561030857606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106fa57600192610e2f575b5001610cda565b6000610e3a91613478565b88610e28565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e8e915060203d8111610e94575b610e868183613478565b810190613af4565b89610d70565b503d610e7c565b5082821415610cd3565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857610f4d6131fb565b602435908115159182810361030857611047575b73ffffffffffffffffffffffffffffffffffffffff80610f7f613b0c565b169116918183146110195760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611071817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d4c565b610f61565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613753565b604051918291602083526020830190613264565b0390f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761119161321e565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576112296131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611268613b0c565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112f55773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113eb613b0c565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114b75760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c0a565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103085761150d366133e9565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611550613b0c565b925416911690810361033757508084148015906116a5575b61030d5760005b84811061157857005b6115838183886135ed565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036103085760006020916115b6610d06868b8e6135ed565b8261162061164c6115c8898d8d6135ed565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613478565b51925af1156106fa576000513d61169c5750803b155b61166f575060010161156f565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611662565b5082841415611568565b34610308576116bd36613345565b80839492930361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117f257916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061173957005b848110156117c3578060051b820135838112156103085782019081359167ffffffffffffffff831161030857602001918036038313610308577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6001936117a1848b8a6135ed565b35926117ba604051928392602084526020840191613306565b0390a201611730565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611891613b0c565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161190f57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576119736131fb565b6064359067ffffffffffffffff821161030857611997611a049236906004016132d8565b6119f66119a2613b0c565b926119cd847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691613557565b92604435926024359261398b565b005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020611a47611a426131fb565b61358e565b6040519015158152f35b3461030857611a5f36613345565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030d57611a95856134b9565b94611aa36040519687613478565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ad0826134b9565b0136602088013760005b818110611af757604051602080825281906111569082018a6133b5565b80611b1e611b0b610d06600194868b6135ed565b611b168387896135ed565b3590886135fd565b611b28828a6138d7565b5201611ada565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611b6661407e565b611156604051928392602084526020840191613306565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435611bb761321e565b611bbf613b0c565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c7257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c0a565b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611d406131fb565b611d4861321e565b60443567ffffffffffffffff811161030857611d689036906004016132a7565b929060643567ffffffffffffffff811161030857611d8a9036906004016132a7565b9360843567ffffffffffffffff811161030857611dab9036906004016132d8565b939091611db6613b0c565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603612138575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075057898b0361030d57611e60828483613e37565b156120ee5760005b8b81106120bf575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611ee460405192839260408452611ed68d60408601908d61392d565b91848303602086015261392d565b0390a43b611eee57005b602094611f03611f0b92611f139536916134d1565b9936916134d1565b953691613557565b92611fc360405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f93611f6360a485018b6133b5565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886133b5565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152613264565b03816000875af19081156106fa577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916120a0575b50160361202657005b61209c9061206c6040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906133b5565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526133b5565b0390fd5b6120b9915060203d6020116106f3576106e58183613478565b8661201d565b806120e88c6120de8f946120d6816001978d6135ed565b35928d6135ed565b3590888887613eb7565b01611e68565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b61214191613d4c565b8987611e0d565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156122a2575b1561226c57505061115660005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61115691620186a082101561228f5761228990620186a0926138eb565b0461223c565b620186a061229d92046138eb565b61223c565b50811561222f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760243567ffffffffffffffff8111610308576122f99036906004016132d8565b9073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117f2576123757f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160208352600435956020840191613306565b0390a2005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576123b16131fb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123f0613b0c565b9254169116908103610337575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106fa57600091612530575b6040516020808252819061115690820185613264565b3d8083833e61253f8183613478565b8101906020818303126125b05780519067ffffffffffffffff82116125b4570181601f820112156125b0578051926125768461351d565b926125846040519485613478565b848452602085840101116125ad5750611156926125a79160208085019101613241565b9061251a565b80fd5b8280fd5b8380fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff8111610308576126079036906004016132d8565b60243567ffffffffffffffff8111610308576126279036906004016132d8565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610308576064359373ffffffffffffffffffffffffffffffffffffffff85168503610308577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612695613b0c565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612b08575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612df4575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612b08575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612cc55781906128f48454613700565b601f8111612da1575b50600090601f8311600114612cff57600092612cf4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612cc55761297f7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613700565b601f8111612c41575b506000601f8211600114612b455781929394600092612b3a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612b08575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806129a2565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612c29575083600195969710612bf1575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556129f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612bc4565b90926020600181928686013581550194019101612bb0565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612cbb575b601f0160051c01905b818110612caf5750612988565b60008155600101612ca2565b9091508190612c99565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612914565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612d895750908460019594939210612d51575b505050811b019055612946565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612d44565b91936020600181928787013581550195019201612d2e565b909150836000526020600020601f840160051c81019160208510612dea575b90601f859493920160051c01905b818110612ddb57506128fd565b60008155849350600101612dce565b9091508190612dc0565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612702565b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857612e806131fb565b60243567ffffffffffffffff811161030857612ea09036906004016132a7565b909160443567ffffffffffffffff811161030857612ec29036906004016132a7565b93909160643567ffffffffffffffff811161030857612f5693612eec612f5e9236906004016132d8565b959091612f4e612efa613b0c565b96612f25887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613815565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916134d1565b9836916134d1565b943691613557565b9173ffffffffffffffffffffffffffffffffffffffff8216948515613081578651908551820361030d5760005b8281106130575750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612ff8612fea8d60408401906133b5565b82810360208401528b6133b5565b0390a43b61300257005b611fc39160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f93611f6360a485018b6133b5565b8061307b6130676001938c6138d7565b51613072838b6138d7565b51908886613c37565b01612f8b565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613753565b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361030857611a476020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613676565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206131f36131c96131fb565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126135fd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b60005b8381106132545750506000910152565b8181015183820152602001613244565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936132a081518092818752878088019101613241565b0116010190565b9181601f840112156103085782359167ffffffffffffffff8311610308576020808501948460051b01011161030857565b9181601f840112156103085782359167ffffffffffffffff8311610308576020838186019501011161030857565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff8111610308578161338e916004016132a7565b929092916024359067ffffffffffffffff8211610308576133b1916004016132a7565b9091565b906020808351928381520192019060005b8181106133d35750505090565b82518452602093840193909201916001016133c6565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781613432916004016132a7565b9290929160243567ffffffffffffffff81116103085781613455916004016132a7565b929092916044359067ffffffffffffffff8211610308576133b1916004016132a7565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cc557604052565b67ffffffffffffffff8111612cc55760051b60200190565b9291906134dd816134b9565b936134eb6040519586613478565b602085838152019160051b810192831161030857905b82821061350d57505050565b8135815260209182019101613501565b67ffffffffffffffff8111612cc557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926135638261351d565b916135716040519384613478565b829481845281830111610308578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135e65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117c35760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561364c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135e6577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136f95760005260205260ff6040600020541690565b5050600190565b90600182811c92168015613749575b602083101461371a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161370f565b906040519182600082549261376784613700565b80845293600181169081156137d5575060011461378e575b5061378c92500383613478565b565b90506000929192526020600020906000915b8183106137b957505090602061378c928201013861377f565b60209193508060019154838589010152019101909184926137a0565b6020935061378c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861377f565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561386f5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117c35760209160051b010190565b818102929181159184041417156138fe57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103085760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103085790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415613081576139d087878573ffffffffffffffffffffffffffffffffffffffff95613c37565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613a12575b5050505050565b613a6d9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190613264565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613ad5575b501603610698578080613a0b565b613aee915060203d6020116106f3576106e58183613478565b38613ac7565b90816020910312610308575180151581036103085790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613c28573233148015613c2d575b613c28577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b97575b50613b9457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156106fa57600091613c09575b5038613b8a565b613c22915060203d602011610e9457610e868183613478565b38613c02565b503390565b5060183610613b53565b909183613c45575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613cbb57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613c3f565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261030857517fffffffff00000000000000000000000000000000000000000000000000000000811681036103085790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613e2d575b613d75575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106fa57600091613e0e575b5015613de15750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613e27915060203d602011610e9457610e868183613478565b38613dd8565b50813b1515613d6d565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613e62575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613e5c565b91929084613ec6575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015614022575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613f3e575b50613a0b565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613fc457505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613f38565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156141b25732331480156141ba575b6141b257803314908115614111575b506140e0576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103085760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156106fa57600091614193575b50386140d4565b6141ac915060203d602011610e9457610e868183613478565b3861418c565b506000903690565b50601836106140c556fea26469706673582212201ffeb232aba325dc0d2fe2bff23ed6622453aaf98baabad24dab6961165e57fb64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x318D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3106 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x30AB JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2E49 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x25B8 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2461 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x237A JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x22AA JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x21B7 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2148 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1D09 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B7D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1B2F JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A51 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1A06 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x193C JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1820 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16AF JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14FF JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1390 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131F JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11F2 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x115A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1076 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF16 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEA5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC68 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC0F JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA86 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA4A JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x83E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x78A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x364 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1B5 CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1F6 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP2 DUP2 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x216 JUMPI STOP JUMPDEST PUSH2 0x221 DUP2 DUP4 DUP8 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x308 JUMPI PUSH2 0x24B DUP3 DUP6 DUP8 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2CE JUMPI RETURNDATASIZE SWAP1 PUSH2 0x26E DUP3 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH2 0x27C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3478 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x295 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x287 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x39B PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3C5 PUSH2 0x3B0C JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x409 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x48F PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x497 PUSH2 0x321E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x4BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP3 PUSH2 0x4C8 PUSH2 0x3B0C JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x77A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x750 JUMPI PUSH2 0x56B DUP3 DUP8 DUP4 PUSH2 0x3E37 JUMP JUMPDEST ISZERO PUSH2 0x706 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x594 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3EB7 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5D1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5DF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH2 0x635 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6CB JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI JUMPDEST PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3D14 JUMP JUMPDEST DUP7 PUSH2 0x68F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x783 SWAP2 PUSH2 0x3D4C JUMP JUMPDEST DUP8 DUP6 PUSH2 0x51F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x7C1 PUSH2 0x31FB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DE PUSH2 0x321E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x88D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8CF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8F2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8FD PUSH2 0x3B0C JUMP JUMPDEST SWAP8 PUSH2 0x928 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x953 DUP2 PUSH2 0x34B9 JUMP JUMPDEST SWAP8 PUSH2 0x961 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x3478 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA1D JUMPI POP POP POP SWAP2 PUSH2 0x996 PUSH2 0x99E SWAP3 PUSH2 0x9A6 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA12 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9C6 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA0C DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9EC PUSH1 0x1 SWAP6 DUP12 PUSH2 0x38D7 JUMP JUMPDEST MLOAD AND PUSH2 0x9F8 DUP5 DUP8 PUSH2 0x38D7 JUMP JUMPDEST MLOAD PUSH2 0xA03 DUP6 DUP10 PUSH2 0x38D7 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x398B JUMP JUMPDEST ADD PUSH2 0x9BD JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9B6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAC0 PUSH2 0x321E JUMP JUMPDEST PUSH2 0xAC8 PUSH2 0x3B0C JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB7A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0xC76 CALLDATASIZE PUSH2 0x33E9 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCBB PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCE3 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0B PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x35ED JUMP JUMPDEST PUSH2 0x396A JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE6D JUMPI JUMPDEST POP ISZERO PUSH2 0xE40 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD9A PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x35ED JUMP JUMPDEST AND SWAP1 PUSH2 0xDAA PUSH2 0xD06 DUP3 DUP7 DUP10 PUSH2 0x35ED JUMP JUMPDEST SWAP2 PUSH2 0xDB6 DUP3 DUP8 DUP12 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x308 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE2F JUMPI JUMPDEST POP ADD PUSH2 0xCDA JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3A SWAP2 PUSH2 0x3478 JUMP JUMPDEST DUP9 PUSH2 0xE28 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE8E SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE94 JUMPI JUMPDEST PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AF4 JUMP JUMPDEST DUP10 PUSH2 0xD70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE7C JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCD3 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0xF4D PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1047 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF7F PUSH2 0x3B0C JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1019 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1071 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D4C JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3753 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1191 PUSH2 0x321E JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1229 PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1268 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12F5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13EB PUSH2 0x3B0C JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x150D CALLDATASIZE PUSH2 0x33E9 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1550 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x16A5 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1578 JUMPI STOP JUMPDEST PUSH2 0x1583 DUP2 DUP4 DUP9 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x308 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15B6 PUSH2 0xD06 DUP7 DUP12 DUP15 PUSH2 0x35ED JUMP JUMPDEST DUP3 PUSH2 0x1620 PUSH2 0x164C PUSH2 0x15C8 DUP10 DUP14 DUP14 PUSH2 0x35ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3478 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x169C JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x166F JUMPI POP PUSH1 0x1 ADD PUSH2 0x156F JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1662 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1568 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x16BD CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17F2 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x1739 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17C3 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x308 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 ADD SWAP2 DUP1 CALLDATASIZE SUB DUP4 SGT PUSH2 0x308 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x17A1 DUP5 DUP12 DUP11 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17BA PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1730 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1891 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x190F JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1973 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x1997 PUSH2 0x1A04 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH2 0x19F6 PUSH2 0x19A2 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 PUSH2 0x19CD DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x398B JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x1A47 PUSH2 0x1A42 PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x358E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1A5F CALLDATASIZE PUSH2 0x3345 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x30D JUMPI PUSH2 0x1A95 DUP6 PUSH2 0x34B9 JUMP JUMPDEST SWAP5 PUSH2 0x1AA3 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3478 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AD0 DUP3 PUSH2 0x34B9 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AF7 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP11 PUSH2 0x33B5 JUMP JUMPDEST DUP1 PUSH2 0x1B1E PUSH2 0x1B0B PUSH2 0xD06 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x35ED JUMP JUMPDEST PUSH2 0x1B16 DUP4 DUP8 DUP10 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x35FD JUMP JUMPDEST PUSH2 0x1B28 DUP3 DUP11 PUSH2 0x38D7 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ADA JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1B66 PUSH2 0x407E JUMP JUMPDEST PUSH2 0x1156 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x20 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1BB7 PUSH2 0x321E JUMP JUMPDEST PUSH2 0x1BBF PUSH2 0x3B0C JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C72 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1D40 PUSH2 0x31FB JUMP JUMPDEST PUSH2 0x1D48 PUSH2 0x321E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1D68 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1D8A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1DAB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1DB6 PUSH2 0x3B0C JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2138 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x750 JUMPI DUP10 DUP12 SUB PUSH2 0x30D JUMPI PUSH2 0x1E60 DUP3 DUP5 DUP4 PUSH2 0x3E37 JUMP JUMPDEST ISZERO PUSH2 0x20EE JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x20BF JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1EE4 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1ED6 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x392D JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x392D JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1EEE JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1F03 PUSH2 0x1F0B SWAP3 PUSH2 0x1F13 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP3 PUSH2 0x1FC3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F93 PUSH2 0x1F63 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x33B5 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x33B5 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x20A0 JUMPI JUMPDEST POP AND SUB PUSH2 0x2026 JUMPI STOP JUMPDEST PUSH2 0x209C SWAP1 PUSH2 0x206C PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x33B5 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x20B9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP7 PUSH2 0x201D JUMP JUMPDEST DUP1 PUSH2 0x20E8 DUP13 PUSH2 0x20DE DUP16 SWAP5 PUSH2 0x20D6 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x35ED JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3EB7 JUMP JUMPDEST ADD PUSH2 0x1E68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2141 SWAP2 PUSH2 0x3D4C JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1E0D JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x22A2 JUMPI JUMPDEST ISZERO PUSH2 0x226C JUMPI POP POP PUSH2 0x1156 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1156 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x228F JUMPI PUSH2 0x2289 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x38EB JUMP JUMPDEST DIV PUSH2 0x223C JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x229D SWAP3 DIV PUSH2 0x38EB JUMP JUMPDEST PUSH2 0x223C JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x222F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x22F9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17F2 JUMPI PUSH2 0x2375 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x4 CALLDATALOAD SWAP6 PUSH1 0x20 DUP5 ADD SWAP2 PUSH2 0x3306 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x23B1 PUSH2 0x31FB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23F0 PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2530 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP6 PUSH2 0x3264 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x253F DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x25B0 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25B4 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x25B0 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2576 DUP5 PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x2584 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3478 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x25AD JUMPI POP PUSH2 0x1156 SWAP3 PUSH2 0x25A7 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3241 JUMP JUMPDEST SWAP1 PUSH2 0x251A JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2607 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2627 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x308 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x308 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2695 PUSH2 0x3B0C JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2DF4 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2CC5 JUMPI DUP2 SWAP1 PUSH2 0x28F4 DUP5 SLOAD PUSH2 0x3700 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2DA1 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2CFF JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2CF4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH2 0x297F PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3700 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2C41 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2B45 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2B3A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B08 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x29A2 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2C29 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2BF1 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x29F4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2BC4 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2BB0 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2CBB JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CAF JUMPI POP PUSH2 0x2988 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2CA2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2C99 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2914 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D89 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2D51 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2946 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2D44 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2D2E JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2DEA JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DDB JUMPI POP PUSH2 0x28FD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2DCE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2DC0 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2702 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x2E80 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2EA0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2EC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2F56 SWAP4 PUSH2 0x2EEC PUSH2 0x2F5E SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32D8 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2F4E PUSH2 0x2EFA PUSH2 0x3B0C JUMP JUMPDEST SWAP7 PUSH2 0x2F25 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3815 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x34D1 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3557 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3081 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x3057 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2FF8 PUSH2 0x2FEA DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x33B5 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x33B5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x3002 JUMPI STOP JUMPDEST PUSH2 0x1FC3 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F93 PUSH2 0x1F63 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x33B5 JUMP JUMPDEST DUP1 PUSH2 0x307B PUSH2 0x3067 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x38D7 JUMP JUMPDEST MLOAD PUSH2 0x3072 DUP4 DUP12 PUSH2 0x38D7 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3C37 JUMP JUMPDEST ADD PUSH2 0x2F8B JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3753 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1A47 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3676 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x31F3 PUSH2 0x31C9 PUSH2 0x31FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x35FD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3254 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3244 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x32A0 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3241 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x338E SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x33B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x33D3 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x33C6 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x3432 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x3455 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x33B1 SWAP2 PUSH1 0x4 ADD PUSH2 0x32A7 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CC5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x34DD DUP2 PUSH2 0x34B9 JUMP JUMPDEST SWAP4 PUSH2 0x34EB PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3478 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x308 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x350D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3501 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CC5 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3563 DUP3 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH2 0x3571 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3478 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x308 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x35E6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17C3 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x364C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35E6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x36F9 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3749 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x371A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x370F JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3767 DUP5 PUSH2 0x3700 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x37D5 JUMPI POP PUSH1 0x1 EQ PUSH2 0x378E JUMPI JUMPDEST POP PUSH2 0x378C SWAP3 POP SUB DUP4 PUSH2 0x3478 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x37B9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x378C SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x377F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x37A0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x378C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x377F JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x386F JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17C3 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x38FE JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3081 JUMPI PUSH2 0x39D0 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3C37 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3A12 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3A6D SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x3264 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3AD5 JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI DUP1 DUP1 PUSH2 0x3A0B JUMP JUMPDEST PUSH2 0x3AEE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3AC7 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3C28 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3C2D JUMPI JUMPDEST PUSH2 0x3C28 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B97 JUMPI JUMPDEST POP PUSH2 0x3B94 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3C09 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B8A JUMP JUMPDEST PUSH2 0x3C22 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3C02 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3B53 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3C45 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3CBB JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3C3F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3E2D JUMPI JUMPDEST PUSH2 0x3D75 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E0E JUMPI JUMPDEST POP ISZERO PUSH2 0x3DE1 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3E27 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x3DD8 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3E62 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3E5C JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3EC6 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x4022 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3F3E JUMPI JUMPDEST POP PUSH2 0x3A0B JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3FC4 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3F38 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x41B2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x41BA JUMPI JUMPDEST PUSH2 0x41B2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4111 JUMPI JUMPDEST POP PUSH2 0x40E0 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4193 JUMPI JUMPDEST POP CODESIZE PUSH2 0x40D4 JUMP JUMPDEST PUSH2 0x41AC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x3478 JUMP JUMPDEST CODESIZE PUSH2 0x418C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x40C5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1F INVALID 0xB2 ORIGIN 0xAB LOG3 0x25 0xDC 0xD 0x2F 0xE2 0xBF CALLCODE RETURNDATACOPY 0xD6 PUSH3 0x2453AA EXTDELEGATECALL DUP12 0xAA 0xBA 0xD2 0x4D 0xAB PUSH10 0x61165E57FB64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"257:252:124:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;257:252:124;;3329:41:232;;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;257:252:124;1845:10:192;;;;;;257:252:124;1857:3:192;1876:11;;;;;:::i;:::-;257:252:124;;;;;;;;;1898:10:192;;;;;:::i;:::-;257:252:124;1375:21:9;;;:30;1371:125;;257:252:124;1548:33:9;;;;;;;257:252:124;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;257:252:124;;1834:9:192;;1591:58:9;257:252:124;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;257:252:124;5957:19:9;257:252:124;;5957:19:9;257:252:124;;;;;1371:125:9;1455:21;;1428:57;257:252:124;1428:57:9;257:252:124;;;;;;1428:57:9;257:252:124;;;;1756:63:192;1793:26;257:252:124;1793:26:192;257:252:124;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;257:252:124;;-1:-1:-1;4538:25:42;257:252:124;;;;;;;;;;;;;:::i;:::-;;3329:41:232;;;:::i;:::-;257:252:124;;;;;;;;3205:23:42;;;3201:60;;257:252:124;;;3275:25:42;;;;3271:146;;257:252:124;3271:146:42;583:77:341;;;;;;;;3361:45:42;257:252:124;3361:45:42;;257:252:124;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;;:::i;:::-;3179:19:352;257:252:124;;;;;;;;2616:14:352;2612:76;;257:252:124;-1:-1:-1;;257:252:124;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;257:252:124;4720:5:228;;;;;;;;;:::i;:::-;257:252:124;;;;;;;4742:43:228;257:252:124;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;257:252:124;4796:104:228;257:252:124;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;257:252:124;19356:74:228;;257:252:124;19356:74:228;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;257:252:124;19356:74:228;;;;;;;;257:252:124;19356:74:228;257:252:124;19356:74:228;257:252:124;19356:74:228;;;4796:104;257:252:124;;19356:101:228;19352:168;;257:252:124;19352:168:228;19478:42;257:252:124;19478:42:228;257:252:124;;;;;;;;19478:42:228;19356:74;;;;257:252:124;19356:74:228;257:252:124;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;257:252:124;;;;;;;;;4601:76:228;257:252:124;4645:32:228;;;;257:252:124;4645:32:228;257:252:124;;;;;;;;4645:32:228;4532:59;4561:30;257:252:124;4561:30:228;257:252:124;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;257:252:124;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;257:252:124;-1:-1:-1;257:252:124;14847:11:228;257:252:124;;;;-1:-1:-1;257:252:124;14847:28:228;257:252:124;-1:-1:-1;257:252:124;;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;257:252:124;1367:6:208;:::i;:::-;257:252:124;974:8:208;;;;:::i;:::-;257:252:124;;;;;;;:::i;:::-;974:8:208;;;257:252:124;974:8:208;;;;;;;257:252:124;;974:8:208;;;;;;;;;;;257:252:124;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;257:252:124;11728:10:228;;;;;;257:252:124;11740:3:228;11778:13;11812:4;11778:13;257:252:124;11778:13:228;257:252:124;11778:13:228;;;:::i;:::-;257:252:124;;11793:6:228;;;;:::i;:::-;257:252:124;11801:9:228;;;;:::i;:::-;257:252:124;11812:4:228;;;;:::i;:::-;257:252:124;11717:9:228;;11620:47;257:252:124;;;11644:23:228;;;11620:47;;974:8:208;257:252:124;;;;;;;;;974:8:208;;257:252:124;974:8:208;;;;;;;257:252:124;;;;;;;;;;;;;;713:6:351;257:252:124;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;:::i;:::-;5148:19:42;257:252:124;;;;;;;4503:26:42;;;4499:64;;4464:19:41;257:252:124;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;1880:140:41;;257:252:124;1880:140:41;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;257:252:124;;;;1973:36:41;;;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;257:252:124;;;3329:41:232;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;257:252:124;3852:94:192;;257:252:124;3972:10:192;;;;;;257:252:124;3984:3:192;257:252:124;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;257:252:124;;;;4058:76:192;;4108:25;257:252:124;4058:76:192;;257:252:124;4058:76:192;;;;;;;;;;;;257:252:124;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;257:252:124;4239:12:192;;;;;;:::i;:::-;257:252:124;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;257:252:124;4239:70:192;;;;;;;257:252:124;;;;;;;4239:70:192;;;;;257:252:124;4239:70:192;;4277:4;257:252:124;4239:70:192;;257:252:124;;4058:76:192;257:252:124;;;;;;;4239:70:192;;;;;;;257:252:124;4239:70:192;;;3984:3;;257:252:124;3961:9:192;;4239:70;257:252:124;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;257:252:124;4161:50:192;257:252:124;;4058:76:192;257:252:124;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;257:252:124;;3329:41:232;;;:::i;:::-;257:252:124;;;14276:18:228;;;;14272:64;;257:252:124;14401:42:228;14346:19;257:252:124;-1:-1:-1;257:252:124;14346:11:228;257:252:124;;;-1:-1:-1;257:252:124;;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;;;;;;;;;;;;;;14401:42:228;257:252:124;14272:64:228;14303:33;;257:252:124;14303:33:228;257:252:124;;;;14303:33:228;2071:115:211;2931:8:352;668:81;257:252:124;2931:8:352;:::i;:::-;2071:115:211;;257:252:124;;;;;;;;;;;;;2991:23:341;257:252:124;;;;;;;;;;;;;;;;;;;;;2688:13:341;257:252:124;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;257:252:124;-1:-1:-1;257:252:124;;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;257:252:124;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3329:41:232;;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;2976:19:351;257:252:124;;;;;1732:22:351;1728:93;;257:252:124;;583:77:341;;;;;;;257:252:124;;;1728:93:351;1777:33;257:252:124;1777:33:351;257:252:124;;1777:33:351;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3329:41:232;;:::i;:::-;257:252:124;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;3741:25:41;3737:66;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;257:252:124;;;;2455:33:41;257:252:124;3737:66:41;257:252:124;3775:28:41;;;257:252:124;3775:28:41;257:252:124;;;;;;;3775:28:41;257:252:124;;;;;;;:::i;:::-;5148:19:42;;;;257:252:124;;;3329:41:232;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;257:252:124;2776:90:192;;257:252:124;2892:10:192;;;;;;257:252:124;2904:3:192;2923:9;;;;;:::i;:::-;257:252:124;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;257:252:124;;;1328:43:8;;;;;;257:252:124;;;;1328:43:8;;;257:252:124;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;257:252:124;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;257:252:124;;2881:9:192;;8938:146:8;9033:40;257:252:124;9033:40:8;257:252:124;;1328:43:8;257:252:124;9033:40:8;8942:68;257:252:124;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;257:252:124;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;257:252:124;2991:23:341;257:252:124;;2464:10:209;:71;2460:115;;2591:9;257:252:124;;;;;;;2586:102:209;2602:19;;;;;;257:252:124;2623:3:209;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;257:252:124;2665:11:209;;;;;;:::i;:::-;257:252:124;;;;;;;;;;;;;;;;:::i;:::-;2647:30:209;;;257:252:124;2591:9:209;;257:252:124;;;;;;;;;;2460:115:209;2544:31;257:252:124;2544:31:209;2464:10;257:252:124;;;;2544:31:209;257:252:124;;;;;;;;;;;;;;;3329:41:232;;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;2976:19:351;257:252:124;1281:36:351;713:6;1281:36;;1277:119;;257:252:124;;;;;;;;;;;;;;;1277:119:351;1340:45;257:252:124;1340:45:351;257:252:124;;;;1340:45:351;257:252:124;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;257:252:124;;;;;;:::i;:::-;;3329:41:232;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;257:252:124;1221:6:210;:::i;:::-;257:252:124;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;257:252:124;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;257:252:124;;16447:19:228;16129:20;;;16125:59;;257:252:124;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;257:252:124;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;257:252:124;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;257:252:124;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;257:252:124;;16250:9:228;;257:252:124;;;;;;;;;;;3564:39:232;;:::i;:::-;257:252:124;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;:::i;:::-;5148:19:42;257:252:124;;;;;;;4503:26:42;;;4499:64;;4464:19:41;257:252:124;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;1254:25:41;1250:140;;257:252:124;1250:140:41;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;257:252:124;;;;1343:36:41;257:252:124;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;;;;:::i;:::-;3179:19:352;257:252:124;;;;;;;;2616:14:352;2612:76;;257:252:124;-1:-1:-1;;257:252:124;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;257:252:124;6801:10:228;;;;;;257:252:124;;;;;;;;;;6904:44:228;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;257:252:124;6959:111:228;257:252:124;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;257:252:124;20263:81:228;;257:252:124;20263:81:228;;257:252:124;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;257:252:124;20263:81:228;;;;;;;;257:252:124;20263:81:228;257:252:124;20263:81:228;257:252:124;20263:81:228;;;6959:111;257:252:124;;20263:107:228;20259:181;;257:252:124;20259:181:228;1878:53;257:252:124;1878:53:228;257:252:124;;20391:49:228;;;;;;257:252:124;20391:49:228;;257:252:124;;;1878:53:228;;;257:252:124;1878:53:228;;;;:::i;:::-;;257:252:124;1878:53:228;;;;257:252:124;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;257:252:124;20263:81:228;257:252:124;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;257:252:124;6860:6:228;;;:::i;:::-;257:252:124;6868:9:228;;;:::i;:::-;257:252:124;6868:9:228;;;;;:::i;:::-;257:252:124;6790:9:228;;6698:76;257:252:124;6742:32:228;;;;257:252:124;6742:32:228;257:252:124;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;257:252:124;;;;;;;;;;;;;;;941:19:75;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;257:252:124;2499:377:351;;;2559:17;;257:252:124;;2499:377:351;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;257:252:124;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;257:252:124;2499:377:351;;2607:259;713:6;2794:57;257:252:124;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3529:19:341;257:252:124;2991:23:341;257:252:124;;1716:10:209;:71;1712:115;;257:252:124;1842:22:209;257:252:124;;;;;;;;;;;;;;;;;:::i;:::-;1842:22:209;;;257:252:124;;;;;;;;;;;;;;:::i;:::-;;;3329:41:232;;;:::i;:::-;257:252:124;;;;;4503:26:42;;;4499:64;;3179:19:352;257:252:124;;;;583:77:341;;;;;;;257:252:124;;;;;;;;;;;;;;3364:23:341;257:252:124;;;;3364:64:341;;1306:4:209;257:252:124;3364:64:341;;;257:252:124;;;;;;;;;;-1:-1:-1;;257:252:124;;;;;;;;3364:64:341;;;;;;;257:252:124;3364:64:341;;;257:252:124;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3329:41:232;;:::i;:::-;257:252:124;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;257:252:124;;;;;;1645:152:42;;257:252:124;-1:-1:-1;;257:252:124;;500:10:59;;257:252:124;;1124:1:42;257:252:124;;;;;;;;;500:10:59;257:252:124;;;;;;;;500:10:59;257:252:124;;;;;;;;500:10:59;257:252:124;;;;;;;;500:10:59;257:252:124;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;257:252:124;;;;;;;;;;;;;;900:21:181;;;896:88;;257:252:124;1124:1:42;257:252:124;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;257:252:124;583:77:341;257:252:124;583:77:341;;;;;;;;257:252:124;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;257:252:124;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;257:252:124;583:77:341;;;;;;;;;;;257:252:124;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;257:252:124;2196:23:341;257:252:124;;583:77:341;;;;;;;257:252:124;;;;1124:1:42;900:21:181;;;896:88;;257:252:124;;;1124:1:42;257:252:124;;;583:77:341;;;;;;;257:252:124;;;896:88:181;930:54;257:252:124;930:54:181;257:252:124;;1124:1:42;257:252:124;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;257:252:124;;583:77:341;;;;257:252:124;;;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;257:252:124;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;257:252:124;;;583:77:341;;;;;;;;257:252:124;583:77:341;;;;;;;;;;;;;;;;;;;;;257:252:124;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;257:252:124;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;257:252:124;;;;;;;583:77:341;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;257:252:124;1124:1:42;583:77:341;;;;;;;;;;;;;;;;257:252:124;;;;;;;;;583:77:341;;;;;;;;257:252:124;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;257:252:124;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;583:77:341;;;;;;;;257:252:124;1740:46:42;;;;1645:152;;;;257:252:124;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41:232;;;257:252:124;3329:41:232;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;257:252:124;1669:6:210;:::i;:::-;257:252:124;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;257:252:124;;;;;9777:23:228;;9773:62;;257:252:124;9862:10:228;;;;;;257:252:124;;;;;;;;;9955:50:228;257:252:124;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;257:252:124;10016:117:228;257:252:124;;;;;;20263:81:228;;;;;257:252:124;20263:81:228;;257:252:124;20263:81:228;;257:252:124;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;257:252:124;9911:6:228;;;:::i;:::-;257:252:124;9919:9:228;;;;:::i;:::-;257:252:124;9919:9:228;;;;:::i;:::-;257:252:124;9851:9:228;;9671:55;9700:26;257:252:124;9700:26:228;257:252:124;;9700:26:228;257:252:124;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;257:252:124;1793:19:59;257:252:124;635:65:55;:::i;257:252:124:-;;;;;;;;;;;;2650:44:211;257:252:124;;:::i;:::-;;;;;2650:44:211;:::i;:::-;257:252:124;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;257:252:124;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;;;;:::o;1002:301:75:-;257:252:124;1146:19:75;257:252:124;1146:53:75;;;1142:96;;257:252:124;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;257:252:124;1215:12:75;:::o;257:252:124:-;;;;;;;;;;;;:::o;15240:220:228:-;;;257:252:124;;;15358:19:228;15354:61;;15375:1;257:252:124;;;;;15375:1:228;257:252:124;15432:21:228;257:252:124;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;;257:252:124;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;257:252:124;500:10:59;;;;;257:252:124;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;257:252:124:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;257:252:124;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;257:252:124;;;;;-1:-1:-1;257:252:124;;-1:-1:-1;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;257:252:124;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;257:252:124;3775:28:41;;-1:-1:-1;3775:28:41;257:252:124;3775:28:41;257:252:124;;;;;-1:-1:-1;3775:28:41;257:252:124;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;257:252:124;;;8152:16:228;;;8148:55;;8236:5;;;;257:252:124;8236:5:228;;:::i;:::-;257:252:124;;;8166:1:228;257:252:124;8258:49:228;257:252:124;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;257:252:124;;;;;;19356:74:228;;;;;257:252:124;19356:74:228;;;;;257:252:124;8166:1:228;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;257:252:124;19356:74:228;257:252:124;19356:74:228;8166:1;19356:74;;;8318:110;257:252:124;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;257:252:124;19356:74:228;257:252:124;19356:74:228;;;;;;;:::i;:::-;;;;257:252:124;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;257:252:124;1029:19:76;257:252:124;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;257:252:124;;;1676:74:76;;257:252:124;;;1676:74:76;;;257:252:124;1327:10:76;257:252:124;;;;1744:4:76;257:252:124;;;;;-1:-1:-1;1676:74:76;;257:252:124;;;;;;1676:74:76;;;;;;;257:252:124;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;257:252:124;17966:1:228;257:252:124;;;;;17966:1:228;257:252:124;;;;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;;;;18123:21:228;;;;;18119:80;;257:252:124;;17966:1:228;257:252:124;;;;;17966:1:228;257:252:124;18217:18:228;257:252:124;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;17953:320:228;;;;;;18119:80;257:252:124;;18153:46:228;;;257:252:124;;;18153:46:228;;;257:252:124;;;;;;;;;;;;;;;;;;20391:49:228;257:252:124;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;257:252:124;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;257:252:124;;;3613:51:352;257:252:124;;3613:51:352;;;;257:252:124;3613:51:352;;3648:4;3613:51;;;257:252:124;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;257:252:124;;-1:-1:-1;3691:28:352;3613:51;;;;257:252:124;3613:51:352;257:252:124;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;257:252:124;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;257:252:124;;-1:-1:-1;257:252:124;16997:11:228;257:252:124;;;;-1:-1:-1;257:252:124;16997:27:228;257:252:124;-1:-1:-1;257:252:124;;;500:10:59;257:252:124;-1:-1:-1;257:252:124;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;257:252:124;17163:1:228;257:252:124;;;;;17163:1:228;257:252:124;;;;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;;;;17330:29:228;;;;;17326:98;;257:252:124;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;257:252:124;17163:1:228;257:252:124;;;;;17163:1:228;257:252:124;;;;-1:-1:-1;257:252:124;;;;-1:-1:-1;257:252:124;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;257:252:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;257:252:124;;17640:48:228;;;257:252:124;;;17640:48:228;;;257:252:124;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;257:252:124;;17368:56:228;;;257:252:124;;;;;17368:56:228;;;257:252:124;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;257:252:124;2065:19:76;257:252:124;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;257:252:124;720:8:80;257:252:124;720:8:80;;257:252:124;;;;2115:1:76;2802:32;;:::o;2624:153::-;257:252:124;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;257:252:124;2361:10:76;257:252:124;;;;2771:4:76;257:252:124;;;;;-1:-1:-1;2682:95:76;;257:252:124;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"3378000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"760","ROYALTY_FEE_DENOMINATOR()":"804","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3223","isTrustedForwarder(address)":"infinite","metadataResolver()":"2781","name()":"infinite","operatorFilterRegistry()":"2825","owner()":"2693","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2716","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2458","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchSetTokenURI(uint256[],string[])":"6706467b","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol\":\"ERC1155FullProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/preset/proxied/ERC1155FullProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155FullProxied} from \\\"./../../../../../token/ERC1155/preset/proxied/ERC1155FullProxied.sol\\\";\\n\\ncontract ERC1155FullProxiedMock is ERC1155FullProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC1155FullProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xe9f4eb4041bb8b9b28dab715f1a0c279a315d38a942e7a46a1adff9032bcfc90\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../libraries/ERC1155Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../../base/ERC1155MetadataBase.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../../base/ERC1155MintableBase.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../../base/ERC1155DeliverableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullProxied is\\n    ERC1155WithOperatorFiltererBase,\\n    ERC1155MetadataBase,\\n    ERC1155MintableBase,\\n    ERC1155DeliverableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC1155Storage.init();\\n        ERC1155Storage.initERC1155MetadataURI();\\n        ERC1155Storage.initERC1155Mintable();\\n        ERC1155Storage.initERC1155Deliverable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xce01be5d1572ea6ad633a3388bb2cf816e819a0247102aa7e92405a3e2c3833f\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol":{"ERC1155WithoutOperatorFiltererProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61265838819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f576080526040516125bd908161009b823960805181818161171b01528181611c9501528181611f6101526124580152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146119fe57806301ffc9a7146119775780630d6a5bbb1461173f5780632b4c9f16146116d05780632eb2c2d6146112f95780632f2ff15d1461116d57806331e66e1e146110ea5780634e1273f414610f63578063572b6c0514610f185780635cfa929714610d585780638bb9c5bf14610be95780638da5cb5b14610b7857806391d1485414610ae0578063a22cb465146109b5578063d53913931461095c578063d547741f146107d3578063e1c7392a1461059b578063e985e9c5146104e7578063f242432a1461021d5763f2fde38b146100f757600080fd5b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185761012e611a6c565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610158611f4a565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036101eb575073ffffffffffffffffffffffffffffffffffffffff169182820361019c57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102185760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610254611a6c565b61025c611a8f565b604435906064359260843567ffffffffffffffff811161021857610284903690600401611ae3565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936102af611f4a565b73ffffffffffffffffffffffffffffffffffffffff83169586156104bd576102d88287836121f9565b156104735773ffffffffffffffffffffffffffffffffffffffff916103018a8a878a8796612279565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61033e57005b60209261034c913691611c19565b926103a260405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061219a565b03816000865af1908115610467577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610438575b50160361040557005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61045a915060203d602011610460575b6104528183611b45565b810190612162565b866103fc565b503d610448565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185761051e611a6c565b73ffffffffffffffffffffffffffffffffffffffff61053b611a8f565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6105f3611f4a565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835460018110156107a1575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161074c575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f5190c92c000000000000000000000000000000000000000000000000000000006000527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80549091169091179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610660565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760043561080d611a8f565b610815611f4a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101eb57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166108c757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576109ec611a6c565b602435908115158092036102185773ffffffffffffffffffffffffffffffffffffffff80610a18611f4a565b16911691818314610ab25760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610b17611a8f565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610c44611f4a565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610d105760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610957565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102185760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610d8f611a6c565b6024356044359160643567ffffffffffffffff811161021857610db6903690600401611ae3565b9091610e17610dc3611f4a565b93610dee857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611de0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691611c19565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610eee57610e5787878573ffffffffffffffffffffffffffffffffffffffff95612085565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b610e9357005b6103a29160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a483019061219a565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576020610f59610f54611a6c565b611c7e565b6040519015158152f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760043567ffffffffffffffff811161021857610fb2903690600401611ab2565b60243567ffffffffffffffff811161021857610fd2903690600401611ab2565b92907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612938084036110c05761100684611bb5565b936110146040519586611b45565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061104182611bb5565b0136602087013760005b81811061106c576040516020808252819061106890820189611b11565b0390f35b611077818387611ee5565b359073ffffffffffffffffffffffffffffffffffffffff82168203610218576110af6001926110a7838789611ee5565b35908a611cdd565b6110b98289611ea2565b520161104b565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576040611123612441565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576004356111a7611a8f565b6111af611f4a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101eb57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561126257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610957565b346102185760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857611330611a6c565b611338611a8f565b60443567ffffffffffffffff811161021857611358903690600401611ab2565b929060643567ffffffffffffffff81116102185761137a903690600401611ab2565b9360843567ffffffffffffffff81116102185761139b903690600401611ae3565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612956113c8611f4a565b73ffffffffffffffffffffffffffffffffffffffff83169788156104bd57898b036110c0576113f88284836121f9565b156116865760005b8b8110611657575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b921698899361147c6040519283926040845261146e8d60408601908d611ef5565b918483036020860152611ef5565b0390a43b61148657005b60209461149b6114a3926114ab953691611bcd565b993691611bcd565b953691611c19565b9261155b60405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a0604484015261152b6114fb60a485018b611b11565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288611b11565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261219a565b03816000875af1908115610467577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091611638575b5016036115be57005b611634906116046040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190611b11565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152611b11565b0390fd5b611651915060203d602011610460576104528183611b45565b866115b5565b806116808c6116768f9461166e816001978d611ee5565b35928d611ee5565b3590888887612279565b01611400565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102185760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857611776611a6c565b60243567ffffffffffffffff811161021857611796903690600401611ab2565b909160443567ffffffffffffffff8111610218576117b8903690600401611ab2565b93909160643567ffffffffffffffff81116102185761184c936117e2611854923690600401611ae3565b9590916118446117f0611f4a565b9661181b887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611de0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691611bcd565b983691611bcd565b943691611c19565b9173ffffffffffffffffffffffffffffffffffffffff8216948515610eee57865190855182036110c05760005b82811061194d5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806118ee6118e08d6040840190611b11565b82810360208401528b611b11565b0390a43b6118f857005b61155b9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a0604484015261152b6114fb60a485018b611b11565b8061197161195d6001938c611ea2565b51611968838b611ea2565b51908886612085565b01611881565b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361021857610f596020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d611d56565b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576020611a64611a3a611a6c565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612611cdd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361021857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361021857565b9181601f840112156102185782359167ffffffffffffffff8311610218576020808501948460051b01011161021857565b9181601f840112156102185782359167ffffffffffffffff8311610218576020838186019501011161021857565b906020808351928381520192019060005b818110611b2f5750505090565b8251845260209384019390920191600101611b22565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611b8657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611b865760051b60200190565b929190611bd981611bb5565b93611be76040519586611b45565b602085838152019160051b810192831161021857905b828210611c0957505050565b8135815260209182019101611bfd565b92919267ffffffffffffffff8211611b865760405191611c6160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611b45565b829481845281830111610218578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611cd65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b909173ffffffffffffffffffffffffffffffffffffffff831615611d2c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611cd6577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611dd95760005260205260ff6040600020541690565b5050600190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615611e3a5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015611eb65760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611eb65760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102185760209260051b809284830137010190565b90816020910312610218575180151581036102185790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561207657323314801561207b575b612076577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611fd5575b50611fd257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561046757600091612047575b5038611fc8565b612069915060203d60201161206f575b6120618183611b45565b810190611f32565b38612040565b503d612057565b503390565b5060183610611f91565b909183612093575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561210957505060005260205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020553880808061208d565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261021857517fffffffff00000000000000000000000000000000000000000000000000000000811681036102185790565b919082519283825260005b8481106121e45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016121a5565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315612224575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061221e565b91929084612289575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156123e5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603612301575b50612282565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561238757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806122fb565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561257557323314801561257d575b612575578033149081156124d4575b506124a3576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561046757600091612556575b5038612497565b61256f915060203d60201161206f576120618183611b45565b3861254f565b506000903690565b506018361061248856fea26469706673582212205278422fade25763de2025eed3bf130d3f5fbd98ac4372f62078f3692d13766964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x2658 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x25BD SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x171B ADD MSTORE DUP2 DUP2 PUSH2 0x1C95 ADD MSTORE DUP2 DUP2 PUSH2 0x1F61 ADD MSTORE PUSH2 0x2458 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x19FE JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1977 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x173F JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x16D0 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x12F9 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x116D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x10EA JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0xF63 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0xF18 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0xD58 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xBE9 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xB78 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xAE0 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x9B5 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x95C JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x7D3 JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x59B JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4E7 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x21D JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x12E PUSH2 0x1A6C JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x158 PUSH2 0x1F4A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x19C JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x254 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x25C PUSH2 0x1A8F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x284 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x2AF PUSH2 0x1F4A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x4BD JUMPI PUSH2 0x2D8 DUP3 DUP8 DUP4 PUSH2 0x21F9 JUMP JUMPDEST ISZERO PUSH2 0x473 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x301 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x2279 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x33E JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x34C SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP3 PUSH2 0x3A2 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x219A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x438 JUMPI JUMPDEST POP AND SUB PUSH2 0x405 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x45A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x460 JUMPI JUMPDEST PUSH2 0x452 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2162 JUMP JUMPDEST DUP7 PUSH2 0x3FC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x448 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x51E PUSH2 0x1A6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x53B PUSH2 0x1A8F JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x5F3 PUSH2 0x1F4A JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x7A1 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x74C JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x660 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x80D PUSH2 0x1A8F JUMP JUMPDEST PUSH2 0x815 PUSH2 0x1F4A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x8C7 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x9EC PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x218 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA18 PUSH2 0x1F4A JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0xAB2 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0xB17 PUSH2 0x1A8F JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xC44 PUSH2 0x1F4A JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x957 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0xD8F PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xDB6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xE17 PUSH2 0xDC3 PUSH2 0x1F4A JUMP JUMPDEST SWAP4 PUSH2 0xDEE DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1DE0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xE57 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x2085 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0xE93 JUMPI STOP JUMPDEST PUSH2 0x3A2 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x219A JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH2 0xF59 PUSH2 0xF54 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x1C7E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xFB2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xFD2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP3 SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 DUP1 DUP5 SUB PUSH2 0x10C0 JUMPI PUSH2 0x1006 DUP5 PUSH2 0x1BB5 JUMP JUMPDEST SWAP4 PUSH2 0x1014 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x1B45 JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1041 DUP3 PUSH2 0x1BB5 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP8 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x106C JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1068 SWAP1 DUP3 ADD DUP10 PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x1077 DUP2 DUP4 DUP8 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI PUSH2 0x10AF PUSH1 0x1 SWAP3 PUSH2 0x10A7 DUP4 DUP8 DUP10 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP11 PUSH2 0x1CDD JUMP JUMPDEST PUSH2 0x10B9 DUP3 DUP10 PUSH2 0x1EA2 JUMP JUMPDEST MSTORE ADD PUSH2 0x104B JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x40 PUSH2 0x1123 PUSH2 0x2441 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x11A7 PUSH2 0x1A8F JUMP JUMPDEST PUSH2 0x11AF PUSH2 0x1F4A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1262 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x957 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x1330 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x1338 PUSH2 0x1A8F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x1358 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x137A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x139B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x13C8 PUSH2 0x1F4A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x4BD JUMPI DUP10 DUP12 SUB PUSH2 0x10C0 JUMPI PUSH2 0x13F8 DUP3 DUP5 DUP4 PUSH2 0x21F9 JUMP JUMPDEST ISZERO PUSH2 0x1686 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x1657 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x147C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x146E DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x1EF5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x1EF5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1486 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x149B PUSH2 0x14A3 SWAP3 PUSH2 0x14AB SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP3 PUSH2 0x155B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x152B PUSH2 0x14FB PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x1B11 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x1B11 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x219A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x1638 JUMPI JUMPDEST POP AND SUB PUSH2 0x15BE JUMPI STOP JUMPDEST PUSH2 0x1634 SWAP1 PUSH2 0x1604 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x1B11 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1651 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x460 JUMPI PUSH2 0x452 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP7 PUSH2 0x15B5 JUMP JUMPDEST DUP1 PUSH2 0x1680 DUP13 PUSH2 0x1676 DUP16 SWAP5 PUSH2 0x166E DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x2279 JUMP JUMPDEST ADD PUSH2 0x1400 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x1776 PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x1796 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x17B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x184C SWAP4 PUSH2 0x17E2 PUSH2 0x1854 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x1844 PUSH2 0x17F0 PUSH2 0x1F4A JUMP JUMPDEST SWAP7 PUSH2 0x181B DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1DE0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0xEEE JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x10C0 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x194D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x18EE PUSH2 0x18E0 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x1B11 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH2 0x155B SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x152B PUSH2 0x14FB PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x1B11 JUMP JUMPDEST DUP1 PUSH2 0x1971 PUSH2 0x195D PUSH1 0x1 SWAP4 DUP13 PUSH2 0x1EA2 JUMP JUMPDEST MLOAD PUSH2 0x1968 DUP4 DUP12 PUSH2 0x1EA2 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x2085 JUMP JUMPDEST ADD PUSH2 0x1881 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x218 JUMPI PUSH2 0xF59 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1D56 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH2 0x1A64 PUSH2 0x1A3A PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x1CDD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x218 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x218 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1B2F JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1B86 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B86 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1BD9 DUP2 PUSH2 0x1BB5 JUMP JUMPDEST SWAP4 PUSH2 0x1BE7 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x1B45 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x218 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x1C09 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1BFD JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B86 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1C61 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x1B45 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x218 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1CD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x1D2C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1CD6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DD9 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E3A JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1EB6 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1EB6 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x218 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x218 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2076 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x207B JUMPI JUMPDEST PUSH2 0x2076 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1FD5 JUMPI JUMPDEST POP PUSH2 0x1FD2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2047 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1FC8 JUMP JUMPDEST PUSH2 0x2069 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x206F JUMPI JUMPDEST PUSH2 0x2061 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F32 JUMP JUMPDEST CODESIZE PUSH2 0x2040 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2057 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1F91 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x2093 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x2109 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x208D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x218 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x218 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x21E4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x21A5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x2224 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x221E JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x2289 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x23E5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2301 JUMPI JUMPDEST POP PUSH2 0x2282 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x2387 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x22FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2575 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x257D JUMPI JUMPDEST PUSH2 0x2575 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x24D4 JUMPI JUMPDEST POP PUSH2 0x24A3 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x218 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2556 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2497 JUMP JUMPDEST PUSH2 0x256F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x206F JUMPI PUSH2 0x2061 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST CODESIZE PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2488 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE PUSH25 0x422FADE25763DE2025EED3BF130D3F5FBD98AC4372F62078F3 PUSH10 0x2D13766964736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1148:1195:125:-:0;;;;;;;;;;;;;-1:-1:-1;;1148:1195:125;;;;-1:-1:-1;;;;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1148:1195:125;;;;;;745:39:76;;1148:1195:125;;;;;;;;745:39:76;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;;;;-1:-1:-1;1148:1195:125;;;;;-1:-1:-1;1148:1195:125"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6799,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":6834,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":7117,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":7193,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":7986,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":8546,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6883,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6764,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":6929,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":7925,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":8602,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":7093,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":7909,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":6981,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":7389,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_enforceHasRole":{"entryPoint":7648,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":8697,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":7294,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":8325,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":9281,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":8010,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7510,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferToken":{"entryPoint":8825,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":7842,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5915},{"length":32,"start":7317},{"length":32,"start":8033},{"length":32,"start":9304}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146119fe57806301ffc9a7146119775780630d6a5bbb1461173f5780632b4c9f16146116d05780632eb2c2d6146112f95780632f2ff15d1461116d57806331e66e1e146110ea5780634e1273f414610f63578063572b6c0514610f185780635cfa929714610d585780638bb9c5bf14610be95780638da5cb5b14610b7857806391d1485414610ae0578063a22cb465146109b5578063d53913931461095c578063d547741f146107d3578063e1c7392a1461059b578063e985e9c5146104e7578063f242432a1461021d5763f2fde38b146100f757600080fd5b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185761012e611a6c565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610158611f4a565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036101eb575073ffffffffffffffffffffffffffffffffffffffff169182820361019c57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102185760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610254611a6c565b61025c611a8f565b604435906064359260843567ffffffffffffffff811161021857610284903690600401611ae3565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936102af611f4a565b73ffffffffffffffffffffffffffffffffffffffff83169586156104bd576102d88287836121f9565b156104735773ffffffffffffffffffffffffffffffffffffffff916103018a8a878a8796612279565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61033e57005b60209261034c913691611c19565b926103a260405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a483019061219a565b03816000865af1908115610467577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610438575b50160361040557005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61045a915060203d602011610460575b6104528183611b45565b810190612162565b866103fc565b503d610448565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185761051e611a6c565b73ffffffffffffffffffffffffffffffffffffffff61053b611a8f565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6105f3611f4a565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835460018110156107a1575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161074c575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f5190c92c000000000000000000000000000000000000000000000000000000006000527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80549091169091179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38080610660565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760043561080d611a8f565b610815611f4a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101eb57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166108c757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576109ec611a6c565b602435908115158092036102185773ffffffffffffffffffffffffffffffffffffffff80610a18611f4a565b16911691818314610ab25760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610b17611a8f565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610c44611f4a565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610d105760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610957565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102185760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857610d8f611a6c565b6024356044359160643567ffffffffffffffff811161021857610db6903690600401611ae3565b9091610e17610dc3611f4a565b93610dee857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611de0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691611c19565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610eee57610e5787878573ffffffffffffffffffffffffffffffffffffffff95612085565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b610e9357005b6103a29160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a483019061219a565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576020610f59610f54611a6c565b611c7e565b6040519015158152f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102185760043567ffffffffffffffff811161021857610fb2903690600401611ab2565b60243567ffffffffffffffff811161021857610fd2903690600401611ab2565b92907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612938084036110c05761100684611bb5565b936110146040519586611b45565b8085527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061104182611bb5565b0136602087013760005b81811061106c576040516020808252819061106890820189611b11565b0390f35b611077818387611ee5565b359073ffffffffffffffffffffffffffffffffffffffff82168203610218576110af6001926110a7838789611ee5565b35908a611cdd565b6110b98289611ea2565b520161104b565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576040611123612441565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576004356111a7611a8f565b6111af611f4a565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff84169081036101eb57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561126257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610957565b346102185760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857611330611a6c565b611338611a8f565b60443567ffffffffffffffff811161021857611358903690600401611ab2565b929060643567ffffffffffffffff81116102185761137a903690600401611ab2565b9360843567ffffffffffffffff81116102185761139b903690600401611ae3565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612956113c8611f4a565b73ffffffffffffffffffffffffffffffffffffffff83169788156104bd57898b036110c0576113f88284836121f9565b156116865760005b8b8110611657575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b921698899361147c6040519283926040845261146e8d60408601908d611ef5565b918483036020860152611ef5565b0390a43b61148657005b60209461149b6114a3926114ab953691611bcd565b993691611bcd565b953691611c19565b9261155b60405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a0604484015261152b6114fb60a485018b611b11565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288611b11565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301608485015261219a565b03816000875af1908115610467577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091611638575b5016036115be57005b611634906116046040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190611b11565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152611b11565b0390fd5b611651915060203d602011610460576104528183611b45565b866115b5565b806116808c6116768f9461166e816001978d611ee5565b35928d611ee5565b3590888887612279565b01611400565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346102185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102185760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021857611776611a6c565b60243567ffffffffffffffff811161021857611796903690600401611ab2565b909160443567ffffffffffffffff8111610218576117b8903690600401611ab2565b93909160643567ffffffffffffffff81116102185761184c936117e2611854923690600401611ae3565b9590916118446117f0611f4a565b9661181b887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611de0565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691611bcd565b983691611bcd565b943691611c19565b9173ffffffffffffffffffffffffffffffffffffffff8216948515610eee57865190855182036110c05760005b82811061194d5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806118ee6118e08d6040840190611b11565b82810360208401528b611b11565b0390a43b6118f857005b61155b9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a0604484015261152b6114fb60a485018b611b11565b8061197161195d6001938c611ea2565b51611968838b611ea2565b51908886612085565b01611881565b346102185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361021857610f596020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d611d56565b346102185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610218576020611a64611a3a611a6c565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612611cdd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361021857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361021857565b9181601f840112156102185782359167ffffffffffffffff8311610218576020808501948460051b01011161021857565b9181601f840112156102185782359167ffffffffffffffff8311610218576020838186019501011161021857565b906020808351928381520192019060005b818110611b2f5750505090565b8251845260209384019390920191600101611b22565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611b8657604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111611b865760051b60200190565b929190611bd981611bb5565b93611be76040519586611b45565b602085838152019160051b810192831161021857905b828210611c0957505050565b8135815260209182019101611bfd565b92919267ffffffffffffffff8211611b865760405191611c6160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611b45565b829481845281830111610218578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611cd65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b909173ffffffffffffffffffffffffffffffffffffffff831615611d2c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611cd6577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611dd95760005260205260ff6040600020541690565b5050600190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615611e3a5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015611eb65760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611eb65760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102185760209260051b809284830137010190565b90816020910312610218575180151581036102185790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561207657323314801561207b575b612076577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611fd5575b50611fd257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561046757600091612047575b5038611fc8565b612069915060203d60201161206f575b6120618183611b45565b810190611f32565b38612040565b503d612057565b503390565b5060183610611f91565b909183612093575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808501948086111561210957505060005260205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020553880808061208d565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261021857517fffffffff00000000000000000000000000000000000000000000000000000000811681036102185790565b919082519283825260005b8481106121e45750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016121a5565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315612224575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061221e565b91929084612289575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff82166000526020526040600020549085820391808310156123e5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603612301575b50612282565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561238757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff9283168552808652818520939093559416825290915220553880808080806122fb565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561257557323314801561257d575b612575578033149081156124d4575b506124a3576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561046757600091612556575b5038612497565b61256f915060203d60201161206f576120618183611b45565b3861254f565b506000903690565b506018361061248856fea26469706673582212205278422fade25763de2025eed3bf130d3f5fbd98ac4372f62078f3692d13766964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x19FE JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1977 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x173F JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x16D0 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x12F9 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x116D JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x10EA JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0xF63 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0xF18 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0xD58 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xBE9 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xB78 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xAE0 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x9B5 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x95C JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x7D3 JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x59B JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4E7 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x21D JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x12E PUSH2 0x1A6C JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x158 PUSH2 0x1F4A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x19C JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x254 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x25C PUSH2 0x1A8F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x284 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x2AF PUSH2 0x1F4A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x4BD JUMPI PUSH2 0x2D8 DUP3 DUP8 DUP4 PUSH2 0x21F9 JUMP JUMPDEST ISZERO PUSH2 0x473 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x301 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x2279 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x33E JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x34C SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP3 PUSH2 0x3A2 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x219A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x438 JUMPI JUMPDEST POP AND SUB PUSH2 0x405 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x45A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x460 JUMPI JUMPDEST PUSH2 0x452 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2162 JUMP JUMPDEST DUP7 PUSH2 0x3FC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x448 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x51E PUSH2 0x1A6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x53B PUSH2 0x1A8F JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x5F3 PUSH2 0x1F4A JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x7A1 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x74C JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x660 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x80D PUSH2 0x1A8F JUMP JUMPDEST PUSH2 0x815 PUSH2 0x1F4A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x8C7 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x9EC PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x218 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA18 PUSH2 0x1F4A JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0xAB2 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0xB17 PUSH2 0x1A8F JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xC44 PUSH2 0x1F4A JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x957 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0xD8F PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xDB6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xE17 PUSH2 0xDC3 PUSH2 0x1F4A JUMP JUMPDEST SWAP4 PUSH2 0xDEE DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1DE0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xE57 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x2085 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0xE93 JUMPI STOP JUMPDEST PUSH2 0x3A2 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x219A JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH2 0xF59 PUSH2 0xF54 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x1C7E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xFB2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0xFD2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP3 SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 DUP1 DUP5 SUB PUSH2 0x10C0 JUMPI PUSH2 0x1006 DUP5 PUSH2 0x1BB5 JUMP JUMPDEST SWAP4 PUSH2 0x1014 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x1B45 JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1041 DUP3 PUSH2 0x1BB5 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP8 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x106C JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1068 SWAP1 DUP3 ADD DUP10 PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x1077 DUP2 DUP4 DUP8 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI PUSH2 0x10AF PUSH1 0x1 SWAP3 PUSH2 0x10A7 DUP4 DUP8 DUP10 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP11 PUSH2 0x1CDD JUMP JUMPDEST PUSH2 0x10B9 DUP3 DUP10 PUSH2 0x1EA2 JUMP JUMPDEST MSTORE ADD PUSH2 0x104B JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x40 PUSH2 0x1123 PUSH2 0x2441 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x11A7 PUSH2 0x1A8F JUMP JUMPDEST PUSH2 0x11AF PUSH2 0x1F4A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x1EB JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1262 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x957 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x1330 PUSH2 0x1A6C JUMP JUMPDEST PUSH2 0x1338 PUSH2 0x1A8F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x1358 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x137A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x139B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x13C8 PUSH2 0x1F4A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x4BD JUMPI DUP10 DUP12 SUB PUSH2 0x10C0 JUMPI PUSH2 0x13F8 DUP3 DUP5 DUP4 PUSH2 0x21F9 JUMP JUMPDEST ISZERO PUSH2 0x1686 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x1657 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x147C PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x146E DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x1EF5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x1EF5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1486 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x149B PUSH2 0x14A3 SWAP3 PUSH2 0x14AB SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP3 PUSH2 0x155B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x152B PUSH2 0x14FB PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x1B11 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x1B11 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x219A JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x1638 JUMPI JUMPDEST POP AND SUB PUSH2 0x15BE JUMPI STOP JUMPDEST PUSH2 0x1634 SWAP1 PUSH2 0x1604 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x1B11 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1651 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x460 JUMPI PUSH2 0x452 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP7 PUSH2 0x15B5 JUMP JUMPDEST DUP1 PUSH2 0x1680 DUP13 PUSH2 0x1676 DUP16 SWAP5 PUSH2 0x166E DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x1EE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x2279 JUMP JUMPDEST ADD PUSH2 0x1400 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH2 0x1776 PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x1796 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x17B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AB2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x218 JUMPI PUSH2 0x184C SWAP4 PUSH2 0x17E2 PUSH2 0x1854 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1AE3 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x1844 PUSH2 0x17F0 PUSH2 0x1F4A JUMP JUMPDEST SWAP7 PUSH2 0x181B DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1DE0 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x1BCD JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x1C19 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0xEEE JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x10C0 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x194D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x18EE PUSH2 0x18E0 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x1B11 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x1B11 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH2 0x155B SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x152B PUSH2 0x14FB PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x1B11 JUMP JUMPDEST DUP1 PUSH2 0x1971 PUSH2 0x195D PUSH1 0x1 SWAP4 DUP13 PUSH2 0x1EA2 JUMP JUMPDEST MLOAD PUSH2 0x1968 DUP4 DUP12 PUSH2 0x1EA2 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x2085 JUMP JUMPDEST ADD PUSH2 0x1881 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x218 JUMPI PUSH2 0xF59 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1D56 JUMP JUMPDEST CALLVALUE PUSH2 0x218 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x218 JUMPI PUSH1 0x20 PUSH2 0x1A64 PUSH2 0x1A3A PUSH2 0x1A6C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x1CDD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x218 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x218 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x218 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1B2F JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1B86 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1B86 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x1BD9 DUP2 PUSH2 0x1BB5 JUMP JUMPDEST SWAP4 PUSH2 0x1BE7 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x1B45 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x218 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x1C09 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1BFD JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1B86 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1C61 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x1B45 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x218 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1CD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x1D2C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1CD6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DD9 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1E3A JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1EB6 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1EB6 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x218 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x218 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x218 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2076 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x207B JUMPI JUMPDEST PUSH2 0x2076 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1FD5 JUMPI JUMPDEST POP PUSH2 0x1FD2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2047 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1FC8 JUMP JUMPDEST PUSH2 0x2069 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x206F JUMPI JUMPDEST PUSH2 0x2061 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1F32 JUMP JUMPDEST CODESIZE PUSH2 0x2040 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2057 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1F91 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x2093 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x2109 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x208D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x218 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x218 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x21E4 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x21A5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x2224 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x221E JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x2289 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x23E5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2301 JUMPI JUMPDEST POP PUSH2 0x2282 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x2387 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x22FB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2575 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x257D JUMPI JUMPDEST PUSH2 0x2575 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x24D4 JUMPI JUMPDEST POP PUSH2 0x24A3 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x218 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2556 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2497 JUMP JUMPDEST PUSH2 0x256F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x206F JUMPI PUSH2 0x2061 DUP2 DUP4 PUSH2 0x1B45 JUMP JUMPDEST CODESIZE PUSH2 0x254F JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2488 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE PUSH25 0x422FADE25763DE2025EED3BF130D3F5FBD98AC4372F62078F3 PUSH10 0x2D13766964736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1148:1195:125:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2060:41;;;:::i;:::-;1148:1195;;;;;;;;3205:23:42;;;3201:60;;1148:1195:125;;;3275:25:42;;;;3271:146;;1148:1195:125;3271:146:42;1148:1195:125;;;;;;;;3361:45:42;1148:1195:125;3361:45:42;;1148:1195:125;3201:60:42;3237:24;1148:1195:125;3237:24:42;1148:1195:125;;;;3237:24:42;1148:1195:125;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;1148:1195:125;2060:41;;;:::i;:::-;1148:1195;;;4536:16:228;;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;1148:1195:125;4720:5:228;;;;;;;;;:::i;:::-;1148:1195:125;;;;;;;4742:43:228;1148:1195:125;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;1148:1195:125;4796:104:228;1148:1195:125;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;1148:1195:125;19356:74:228;;1148:1195:125;19356:74:228;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;1148:1195:125;19356:74:228;;;;;;;;1148:1195:125;19356:74:228;1148:1195:125;19356:74:228;1148:1195:125;19356:74:228;;;4796:104;1148:1195:125;;19356:101:228;19352:168;;1148:1195:125;19352:168:228;19478:42;1148:1195:125;19478:42:228;1148:1195:125;;;;;;;;19478:42:228;19356:74;;;;1148:1195:125;19356:74:228;1148:1195:125;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1148:1195:125;;;;;;;;;4601:76:228;1148:1195:125;4645:32:228;;;;1148:1195:125;4645:32:228;1148:1195:125;;;;;;;;4645:32:228;4532:59;4561:30;1148:1195:125;4561:30:228;1148:1195:125;;4561:30:228;1148:1195:125;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;1148:1195:125;-1:-1:-1;1148:1195:125;14847:11:228;1148:1195:125;;;;-1:-1:-1;1148:1195:125;14847:28:228;1148:1195:125;-1:-1:-1;1148:1195:125;;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;1148:1195:125;;;;;;;;;;;;;;;;;;;;2060:41;;:::i;:::-;1148:1195;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1148:1195:125;;;;;;1645:152:42;;1148:1195:125;;500:10:59;;;1148:1195:125;;1124:1:42;1148:1195:125;;;;;;;;;500:10:59;1148:1195:125;;;;;;;;2606:34:228;-1:-1:-1;500:10:59;;1148:1195:125;;;;;;;;;;;1645:152:42;1148:1195:125;;;;;;;;;1740:46:42;;;;1645:152;;;;896:88:181;930:54;1148:1195:125;930:54:181;1148:1195:125;;1124:1:42;1148:1195:125;;;;930:54:181;1148:1195:125;;;;;;;;;;;;;;;:::i;:::-;2060:41;;:::i;:::-;5148:19:42;1148:1195:125;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1148:1195:125;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;1880:140:41;;1148:1195:125;1880:140:41;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1148:1195:125;;;;1973:36:41;;;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2060:41;;;:::i;:::-;1148:1195;;;14276:18:228;;;;14272:64;;1148:1195:125;14401:42:228;14346:19;1148:1195:125;-1:-1:-1;1148:1195:125;14346:11:228;1148:1195:125;;;-1:-1:-1;1148:1195:125;;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;;;;;;;;;;;;;14401:42:228;1148:1195:125;14272:64:228;14303:33;;1148:1195:125;14303:33:228;1148:1195:125;;;;14303:33:228;1148:1195:125;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1148:1195:125;-1:-1:-1;1148:1195:125;;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2060:41;;:::i;:::-;1148:1195;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;3741:25:41;3737:66;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1148:1195:125;;;;2455:33:41;1148:1195:125;3737:66:41;1148:1195:125;3775:28:41;;;1148:1195:125;3775:28:41;1148:1195:125;;;;;;;3775:28:41;1148:1195:125;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;2060:41;;1148:1195;2060:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;1148:1195:125;1221:6:210;:::i;:::-;1148:1195:125;;;;;:::i;:::-;;;;;8152:16:228;;;8148:55;;8236:5;;;;1148:1195:125;8236:5:228;;:::i;:::-;1148:1195:125;;;;;8258:49:228;1148:1195:125;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;1148:1195:125;8318:110:228;1148:1195:125;;;;;;19356:74:228;;;;;1148:1195:125;19356:74:228;;1148:1195:125;19356:74:228;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8148:55:228:-;8177:26;1148:1195:125;8177:26:228;1148:1195:125;;8177:26:228;1148:1195:125;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;1148:1195:125;16129:20:228;;;;16125:59;;1148:1195:125;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;1148:1195:125;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;1148:1195:125;;;;;;;;;16306:30:228;1148:1195:125;16329:6:228;;;;;;:::i;:::-;1148:1195:125;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;1148:1195:125;;16250:9:228;;16125:59;16158:26;1148:1195:125;16158:26:228;1148:1195:125;;16158:26:228;1148:1195:125;;;;;;;;;;;;2295:39;;:::i;:::-;1148:1195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2060:41;;:::i;:::-;5148:19:42;1148:1195:125;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1148:1195:125;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;1254:25:41;1250:140;;1148:1195:125;1250:140:41;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1148:1195:125;;;;1343:36:41;1148:1195:125;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;1148:1195:125;2060:41;;;:::i;:::-;1148:1195;;;6523:16:228;;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;1148:1195:125;6801:10:228;;;;;;1148:1195:125;;;;;;;;;;6904:44:228;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;1148:1195:125;6959:111:228;1148:1195:125;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;1148:1195:125;20263:81:228;;1148:1195:125;20263:81:228;;1148:1195:125;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;1148:1195:125;20263:81:228;;;;;;;;1148:1195:125;20263:81:228;1148:1195:125;20263:81:228;1148:1195:125;20263:81:228;;;6959:111;1148:1195:125;;20263:107:228;20259:181;;1148:1195:125;20259:181:228;1878:53;1148:1195:125;1878:53:228;1148:1195:125;;20391:49:228;;;;;;1148:1195:125;20391:49:228;;1148:1195:125;;;1878:53:228;;;1148:1195:125;1878:53:228;;;;:::i;:::-;;1148:1195:125;1878:53:228;;;;1148:1195:125;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;1148:1195:125;20263:81:228;1148:1195:125;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;1148:1195:125;6860:6:228;;;:::i;:::-;1148:1195:125;6868:9:228;;;:::i;:::-;1148:1195:125;6868:9:228;;;;;:::i;:::-;1148:1195:125;6790:9:228;;6698:76;1148:1195:125;6742:32:228;;;;1148:1195:125;6742:32:228;1148:1195:125;;;;;;;;6742:32:228;1148:1195:125;;;;;;;;;;;;;;;941:19:75;1148:1195:125;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2060:41;;;1148:1195;2060:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;1148:1195:125;1669:6:210;:::i;:::-;1148:1195:125;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;1148:1195:125;;;;;9777:23:228;;9773:62;;1148:1195:125;9862:10:228;;;;;;1148:1195:125;;;;;;;;;9955:50:228;1148:1195:125;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;1148:1195:125;10016:117:228;1148:1195:125;;;;;;20263:81:228;;;;;1148:1195:125;20263:81:228;;1148:1195:125;20263:81:228;;1148:1195:125;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;1148:1195:125;9911:6:228;;;:::i;:::-;1148:1195:125;9919:9:228;;;;:::i;:::-;1148:1195:125;9919:9:228;;;;:::i;:::-;1148:1195:125;9851:9:228;;1148:1195:125;;;;;;;;;;;;;;;;;;;;635:65:55;1148:1195:125;1793:19:59;1148:1195:125;635:65:55;:::i;1148:1195:125:-;;;;;;;;;;;;1730:44:206;1148:1195:125;;:::i;:::-;;;;;1730:44:206;:::i;:::-;1148:1195:125;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1148:1195:125;;;;;-1:-1:-1;1148:1195:125;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;;;;:::o;1002:301:75:-;1148:1195:125;1146:19:75;1148:1195:125;1146:53:75;;;1142:96;;1148:1195:125;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1148:1195:125;1215:12:75;:::o;15240:220:228:-;;;1148:1195:125;;;15358:19:228;15354:61;;15375:1;1148:1195:125;;;;;15375:1:228;1148:1195:125;15432:21:228;1148:1195:125;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;;1148:1195:125;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1148:1195:125;500:10:59;;;;;1148:1195:125;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;3640:170:41:-;1148:1195:125;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1148:1195:125;3775:28:41;;-1:-1:-1;3775:28:41;1148:1195:125;3775:28:41;1148:1195:125;;;;;-1:-1:-1;3775:28:41;1148:1195:125;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1148:1195:125;1029:19:76;1148:1195:125;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1148:1195:125;;;1676:74:76;;1148:1195:125;;;1676:74:76;;;1148:1195:125;1327:10:76;1148:1195:125;;;;1744:4:76;1148:1195:125;;;;;-1:-1:-1;1676:74:76;;1148:1195:125;;;;;;1676:74:76;;;;;;;1148:1195:125;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;1148:1195:125;17966:1:228;1148:1195:125;;;;;17966:1:228;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;;;18123:21:228;;;;;18119:80;;1148:1195:125;;17966:1:228;1148:1195:125;;;;;17966:1:228;1148:1195:125;18217:18:228;1148:1195:125;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;17953:320:228;;;;;;18119:80;1148:1195:125;;18153:46:228;;;1148:1195:125;;;18153:46:228;;;1148:1195:125;;;;;;;;;;;;;;;;;;20391:49:228;1148:1195:125;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;1148:1195:125;;;;;;;;;;;-1:-1:-1;1148:1195:125;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;16846:185:228;1148:1195:125;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;1148:1195:125;;-1:-1:-1;1148:1195:125;16997:11:228;1148:1195:125;;;;-1:-1:-1;1148:1195:125;16997:27:228;1148:1195:125;-1:-1:-1;1148:1195:125;;;500:10:59;1148:1195:125;-1:-1:-1;1148:1195:125;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;1148:1195:125;17163:1:228;1148:1195:125;;;;;17163:1:228;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;;;17330:29:228;;;;;17326:98;;1148:1195:125;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;1148:1195:125;17163:1:228;1148:1195:125;;;;;17163:1:228;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;-1:-1:-1;1148:1195:125;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;1148:1195:125;;17640:48:228;;;1148:1195:125;;;17640:48:228;;;1148:1195:125;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;1148:1195:125;;17368:56:228;;;1148:1195:125;;;;;17368:56:228;;;1148:1195:125;;;;;;;;;;;;;;;;;;;20391:49:228;1938:939:76;1148:1195:125;2065:19:76;1148:1195:125;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;1148:1195:125;720:8:80;1148:1195:125;720:8:80;;1148:1195:125;;;;2115:1:76;2802:32;;:::o;2624:153::-;1148:1195:125;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;1148:1195:125;2361:10:76;1148:1195:125;;;;2771:4:76;1148:1195:125;;;;;-1:-1:-1;2682:95:76;;1148:1195:125;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"1932200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"452","__msgData()":"infinite","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2719","init()":"infinite","isApprovedForAll(address,address)":"2893","isTrustedForwarder(address)":"infinite","owner()":"2495","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","supportsInterface(bytes4)":"2458","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init()":"e1c7392a","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol\":\"ERC1155WithoutOperatorFiltererProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC1155/proxied/ERC1155WithoutOperatorFiltererProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../../../token/ERC1155/libraries/ERC1155Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {ERC1155Base} from \\\"./../../../../token/ERC1155/base/ERC1155Base.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../../../../token/ERC1155/base/ERC1155MintableBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155WithoutOperatorFiltererProxiedMock is\\n    ERC1155Base,\\n    ERC1155MintableBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init() external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC1155Storage.init();\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xac6b6926cf99c5d1b4c96c660ec08de69c245a119df47c3c86a8c50450b09d12\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol":{"ERC20ReceiverMock":{"abi":[{"inputs":[{"internalType":"bool","name":"accept","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"WrongToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20Received","type":"event"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC20Received","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":{"kind":"dev","methods":{"onERC20Received(address,address,uint256,bytes)":{"details":"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.","params":{"data":"Optional additional data with no specified format.","from":"The previous tokens owner.","operator":"The initiator of the safe transfer.","value":"The amount of tokens transferred."},"returns":{"_0":"`bytes4(keccak256(\"onERC20Received(address,address,uint256,bytes)\"))` (`0x4fc35859`) to accept, any other value to refuse."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC20 Receiver Mock.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c0346100e057601f61056b38819003918201601f19168301916001600160401b038311848410176100e55780849260409485528339810103126100e05780519081151582036100e05760200151906001600160a01b03821682036100e057634fc3585960e01b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fe65694af8bc898f30b0dd47956ad372c47424e060a94ef47c1bbc9231c44a84b805460ff1916600117905560805260a05260405161046f90816100fc82396080518161025b015260a051816102330152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101a757634fc358591461003257600080fd5b346101735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101735760043573ffffffffffffffffffffffffffffffffffffffff811681036101735760243573ffffffffffffffffffffffffffffffffffffffff81168103610173576064359067ffffffffffffffff821161017357366023830112156101735781600401359267ffffffffffffffff841161017857604051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8801160116830183811067ffffffffffffffff821117610178576040528483523660248686010111610173576000602086819760246101499801838801378501015260443591610217565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610173576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101735761020d60209161038a565b6040519015158152f35b919093929373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610360577f0000000000000000000000000000000000000000000000000000000000000000156103575773ffffffffffffffffffffffffffffffffffffffff90816040519416845216602083015260408201526080606082015282519283608083015260005b84811061034157505060a0817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f866000857faf27e222a631278dbe6529e0dbf9fca686cfc255d167f9f68192a8e30ba6fa6298998601015201168101030190a17f4fc358590000000000000000000000000000000000000000000000000000000090565b80602080928401015160a08286010152016102bb565b50600093505050565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610433577f01ffc9a700000000000000000000000000000000000000000000000000000000811461042d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea26469706673582212202dd524751b9e7dd156cb4d081136e6182d506b2a3bd9f2298fe45635964e8b4964736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x1F PUSH2 0x56B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0xE5 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0xE0 JUMPI DUP1 MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xE0 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0xE0 JUMPI PUSH4 0x4FC35859 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xE65694AF8BC898F30B0DD47956AD372C47424E060A94EF47C1BBC9231C44A84B DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x46F SWAP1 DUP2 PUSH2 0xFC DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x25B ADD MSTORE PUSH1 0xA0 MLOAD DUP2 PUSH2 0x233 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A7 JUMPI PUSH4 0x4FC35859 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x173 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x173 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x178 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP9 ADD AND ADD AND DUP4 ADD DUP4 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x178 JUMPI PUSH1 0x40 MSTORE DUP5 DUP4 MSTORE CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x173 JUMPI PUSH1 0x0 PUSH1 0x20 DUP7 DUP2 SWAP8 PUSH1 0x24 PUSH2 0x149 SWAP9 ADD DUP4 DUP9 ADD CALLDATACOPY DUP6 ADD ADD MSTORE PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x217 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH2 0x20D PUSH1 0x20 SWAP2 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 SWAP4 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x360 JUMPI PUSH32 0x0 ISZERO PUSH2 0x357 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH1 0x40 MLOAD SWAP5 AND DUP5 MSTORE AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP3 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x341 JUMPI POP POP PUSH1 0xA0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x0 DUP6 PUSH32 0xAF27E222A631278DBE6529E0DBF9FCA686CFC255D167F9F68192A8E30BA6FA62 SWAP9 SWAP10 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0xA0 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BB JUMP JUMPDEST POP PUSH1 0x0 SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x433 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x42D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2D 0xD5 0x24 PUSH22 0x1B9E7DD156CB4D081136E6182D506B2A3BD9F2298FE4 JUMP CALLDATALOAD SWAP7 0x4E DUP12 BLOBHASH PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"327:918:126:-:0;;;;;;;;;;;;;-1:-1:-1;;327:918:126;;;;-1:-1:-1;;;;;327:918:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;327:918:126;;;;;;-1:-1:-1;;;;500:10:59;327:918:126;;500:10:59;;;;-1:-1:-1;;500:10:59;443:1;500:10;;;628:17:126;;655:29;;327:918;;;;;;;;628:17;327:918;;;;;655:29;327:918;;;;;;;-1:-1:-1;327:918:126;;;;;;-1:-1:-1;327:918:126;;;;;-1:-1:-1;327:918:126"},"deployedBytecode":{"functionDebugData":{"fun_onERC20Received":{"entryPoint":535,"id":16717,"parameterSlots":4,"returnSlots":1},"fun_supportsInterface":{"entryPoint":906,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"16647":[{"length":32,"start":603}],"16649":[{"length":32,"start":563}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101a757634fc358591461003257600080fd5b346101735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101735760043573ffffffffffffffffffffffffffffffffffffffff811681036101735760243573ffffffffffffffffffffffffffffffffffffffff81168103610173576064359067ffffffffffffffff821161017357366023830112156101735781600401359267ffffffffffffffff841161017857604051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8801160116830183811067ffffffffffffffff821117610178576040528483523660248686010111610173576000602086819760246101499801838801378501015260443591610217565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610173576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101735761020d60209161038a565b6040519015158152f35b919093929373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610360577f0000000000000000000000000000000000000000000000000000000000000000156103575773ffffffffffffffffffffffffffffffffffffffff90816040519416845216602083015260408201526080606082015282519283608083015260005b84811061034157505060a0817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f866000857faf27e222a631278dbe6529e0dbf9fca686cfc255d167f9f68192a8e30ba6fa6298998601015201168101030190a17f4fc358590000000000000000000000000000000000000000000000000000000090565b80602080928401015160a08286010152016102bb565b50600093505050565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610433577f01ffc9a700000000000000000000000000000000000000000000000000000000811461042d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea26469706673582212202dd524751b9e7dd156cb4d081136e6182d506b2a3bd9f2298fe45635964e8b4964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A7 JUMPI PUSH4 0x4FC35859 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x173 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x173 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x178 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP9 ADD AND ADD AND DUP4 ADD DUP4 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x178 JUMPI PUSH1 0x40 MSTORE DUP5 DUP4 MSTORE CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x173 JUMPI PUSH1 0x0 PUSH1 0x20 DUP7 DUP2 SWAP8 PUSH1 0x24 PUSH2 0x149 SWAP9 ADD DUP4 DUP9 ADD CALLDATACOPY DUP6 ADD ADD MSTORE PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x217 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH2 0x20D PUSH1 0x20 SWAP2 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 SWAP4 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x360 JUMPI PUSH32 0x0 ISZERO PUSH2 0x357 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH1 0x40 MLOAD SWAP5 AND DUP5 MSTORE AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP3 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x341 JUMPI POP POP PUSH1 0xA0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x0 DUP6 PUSH32 0xAF27E222A631278DBE6529E0DBF9FCA686CFC255D167F9F68192A8E30BA6FA62 SWAP9 SWAP10 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0xA0 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BB JUMP JUMPDEST POP PUSH1 0x0 SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x433 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x42D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2D 0xD5 0x24 PUSH22 0x1B9E7DD156CB4D081136E6182D506B2A3BD9F2298FE4 JUMP CALLDATALOAD SWAP7 0x4E DUP12 BLOBHASH PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"327:918:126:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;327:918:126;635:65:55;;:::i;:::-;327:918:126;;;;;;;;861:382;;;;;;327:918;1019:14;327:918;1005:10;:28;1001:53;;1068:8;;;;327:918;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1097:40;327:918;;;;;;;;;;1097:40;;;;2175:39:280;1151:34:126;:::o;327:918::-;;;;;;;;;;;;;;;;;;1064:173;-1:-1:-1;327:918:126;;-1:-1:-1;;;1216:10:126:o;1001:53::-;1042:12;327:918;1042:12;;327:918;1042:12;1359:340:59;327:918:126;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;327:918:126;500:10:59;327:918:126;500:10:59;;;;327:918:126;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;327:918:126;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"227000","executionCost":"infinite","totalCost":"infinite"},"external":{"onERC20Received(address,address,uint256,bytes)":"infinite","supportsInterface(bytes4)":"2433"}},"methodIdentifiers":{"onERC20Received(address,address,uint256,bytes)":"4fc35859","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"accept\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ERC20Received\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC20Received\",\"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\":{\"kind\":\"dev\",\"methods\":{\"onERC20Received(address,address,uint256,bytes)\":{\"details\":\"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous tokens owner.\",\"operator\":\"The initiator of the safe transfer.\",\"value\":\"The amount of tokens transferred.\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC20 Receiver Mock.\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"onERC20Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of ERC20 tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol\":\"ERC20ReceiverMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/ERC20ReceiverMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC20Receiver} from \\\"./../../../token/ERC20/interfaces/IERC20Receiver.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20Receiver} from \\\"./../../../token/ERC20/ERC20Receiver.sol\\\";\\n\\n/// @title ERC20 Receiver Mock.\\ncontract ERC20ReceiverMock is ERC20Receiver {\\n    bool internal immutable _ACCCEPT;\\n    address internal immutable _TOKEN_ADDRESS;\\n\\n    event ERC20Received(address sender, address from, uint256 value, bytes data);\\n\\n    error WrongToken();\\n\\n    constructor(bool accept, address tokenAddress) {\\n        _ACCCEPT = accept;\\n        _TOKEN_ADDRESS = tokenAddress;\\n    }\\n\\n    //==================================================== ERC20Receiver ====================================================//\\n\\n    /// @inheritdoc IERC20Receiver\\n    function onERC20Received(address sender, address from, uint256 value, bytes memory data) public virtual override returns (bytes4) {\\n        if (msg.sender != _TOKEN_ADDRESS) revert WrongToken();\\n        if (_ACCCEPT) {\\n            emit ERC20Received(sender, from, value, data);\\n            return ERC20Storage.ERC20_RECEIVED;\\n        } else {\\n            return 0x0;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb438e57f1c46925e5b6275b981d9cb70c77a989bce9ef5a61298b9a3310a1d41\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Receiver} from \\\"./interfaces/IERC20Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Receiver is IERC20Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xfcf1a39ddedf6c5bc3fa134f389b98cdb17d33df14903239fe0e1c7120ec7c16\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"onERC20Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of ERC20 tokens."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/mocks/token/ERC20/ERC677Mock.sol":{"ERC677Mock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1730,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1693,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1837,"id":null,"parameterSlots":1,"returnSlots":1},"fun_batchMint":{"entryPoint":1902,"id":29811,"parameterSlots":2,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":1860,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346106685761359a803803806100198161069d565b928339810160c0828203126106685781516001600160401b03811161066857816100449184016106c2565b60208301519092906001600160401b03811161066857826100669183016106c2565b9260408201519060ff82168092036106685760608301516001600160401b0381116106685783019284601f850112156106685783516100ac6100a78261072d565b61069d565b9460208087848152019260051b8201019087821161066857602001915b81831061067d5750505060808101516001600160401b0381116106685781019480601f870112156106685785516101026100a78261072d565b9660208089848152019260051b82010192831161066857602001905b82821061066d5750505060a00151916001600160a01b0383168303610668577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f8054600160ff199182168117909255634e83a8c360e11b6000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680549091169091179055825190926001600160401b03821161053e5760008051602061355a8339815191525490600182811c9216801561065e575b602083101461051e5781601f8493116105e1575b50602090601f831160011461055f57600092610554575b50508160011b916000199060031b1c19161760008051602061355a833981519152555b85516001600160401b03811161053e5760008051602061351a83398151915254600181811c91168015610534575b602082101461051e57601f81116104ac575b506020601f82116001146104275781906103979860009261041c575b50508160011b916000199060031b1c19161760008051602061351a833981519152555b60ff1960008051602061357a83398151915254161760008051602061357a8339815191525563a219a02560e01b600052806020526040600020600160ff19825416179055336103bd575b6307f5828d60e41b600090815260209190915260408082208054600160ff1991821681179092556303c130d960e41b84528284208054821683179055634ec7fbed60e11b845282842080548216831790556353f41a9760e01b8452828420805482168317905563602993f360e11b8452919092208054909116909117905560805261076e565b604051612c5390816108c7823960805181818161165701528181611cb601526129a20152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610311565b0151905038806102a4565b601f1982169760008051602061351a833981519152600052816000209860005b818110610494575091610397999184600195941061047b575b505050811b0160008051602061351a833981519152556102c7565b015160001960f88460031b161c19169055388080610460565b838301518b556001909a019960209384019301610447565b60008051602061351a8339815191526000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610514575b601f0160051c01905b8181106105085750610288565b600081556001016104fb565b90915081906104f2565b634e487b7160e01b600052602260045260246000fd5b90607f1690610276565b634e487b7160e01b600052604160045260246000fd5b015190503880610225565b60008051602061355a83398151915260009081528281209350601f198516905b8181106105c957509084600195949392106105b0575b505050811b0160008051602061355a83398151915255610248565b015160001960f88460031b161c19169055388080610595565b9293602060018192878601518155019501930161057f565b60008051602061355a8339815191526000529091507fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa428601f840160051c81019160208510610654575b90601f859493920160051c01905b818110610645575061020e565b60008155849350600101610638565b909150819061062a565b91607f16916101fa565b600080fd5b815181526020918201910161011e565b82516001600160a01b0381168103610668578152602092830192016100c9565b6040519190601f01601f191682016001600160401b0381118382101761053e57604052565b81601f82011215610668578051906001600160401b03821161053e576106f1601f8301601f191660200161069d565b92828452602083830101116106685760005b82811061071857505060206000918301015290565b80602080928401015182828701015201610703565b6001600160401b03811161053e5760051b60200190565b80518210156107585760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815190805182036108b55781156108b05760009260005b8381106107e15750505050806107995750565b60008051602061353a833981519152549080820191808311156107ca57505060008051602061353a83398151915255565b6301b352fb60e11b60005260045260245260446000fd5b6001600160a01b036107f38284610744565b5116801561089f576108058285610744565b5180610843575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301610786565b9591908683019283111561088e5760008181527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee60205260409020805488019055919590919061080c565b631550ab9f60e21b60005260046000fd5b6392fd9c8f60e01b60005260046000fd5b505050565b6332c1299b60e11b60005260046000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461185d57806306fdde0314611802578063095ea7b31461179557806318160ddd1461173a57806323b872dd1461167b5780632b4c9f161461160c578063313ce567146115ae5780633644e5151461156d578063395093511461133d5780633c130d90146112e25780634000aea0146112c65780634885b25414611218578063572b6c05146111cd57806370a082311461114857806373c8a95814610fc55780637ecebe0014610f4057806388d695b214610efc5780638da5cb5b14610e8b57806395d89b4114610e18578063a457c2d714610dab578063a9059cbb14610d3e578063b88d4fde14610c2e578063c3666c36146109f1578063d505accf1461077e578063dd62ed3e146106cf578063e0df5b6f14610484578063eb7955491461040b578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc5761016936611ac8565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa61298b565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d58183876121cf565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff8285876121cf565b359081471061028a57600080809381935af13d15610282573d906102228261291a565b916102306040519384611b34565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f611922565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61037861298b565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102eb575073ffffffffffffffffffffffffffffffffffffffff16928383036103be57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5761041936611996565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610452838361044b61298b565b809761202e565b813b610464575b602060405160018152f35b61047a94610473913691612954565b9280612a9c565b8080808080610459565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc576104d3903690600401611968565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061051261298b565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106a05761055a8254611dad565b601f8111610658575b506000601f82116001146105bd578192936000926105b2575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b01359050838061057c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106405750836001959610610608575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806105fe565b909260206001819286860135815501940191016105eb565b826000526020600020601f830160051c81019160208410610696575b601f0160051c01905b81811061068a5750610563565b6000815560010161067d565b9091508190610674565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610706611922565b73ffffffffffffffffffffffffffffffffffffffff610723611945565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576107b5611922565b6107bd611945565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d83156109c757814211610999576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c0815261089f60e082611b34565b5190206108aa611f87565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526108ef606282611b34565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561098d5773ffffffffffffffffffffffffffffffffffffffff600051160361096357610961927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ec2565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc576109ff36611a39565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a4461298b565b92541691169081036102eb5750808214801590610c24575b6102c15760005b828110610a6c57005b73ffffffffffffffffffffffffffffffffffffffff610a94610a8f83858a6121cf565b61220e565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561098d57600091610bf6575b5015610bc9575073ffffffffffffffffffffffffffffffffffffffff610b23610a8f83858a6121cf565b1690610b33610a8f8286896121cf565b91610b3f82878b6121cf565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561098d57600192610bb8575b5001610a63565b6000610bc391611b34565b88610bb1565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c17915060203d8111610c1d575b610c0f8183611b34565b810190611b75565b89610af9565b503d610c05565b5082821415610a5c565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610c65611922565b610c6d611945565b60443560643567ffffffffffffffff81116102bc57610c90903690600401611968565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610cfc848484610cc361298b565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d2d5761202e565b823b610d0d57602060405160018152f35b610d2295610d1c913691612954565b93612a9c565b808080808080610459565b610d39848b848461273c565b61202e565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610459610d78611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610da561298b565b9061202e565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610459610de5611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e1261298b565b9061273c565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611e00565b6040519182916020835260208301906118c3565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc57610459610f0d36611ac8565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f3a61298b565b906124db565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610f77611922565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc57610fd336611a39565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061101661298b565b92541691169081036102eb575080831480159061113e575b6102c15760005b83811061103e57005b6110498183886121cf565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a8261108a87611083610a8f828f8f906121cf565b938b6121cf565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526110e5606482611b34565b51925af11561098d576000513d6111355750803b155b6111085750600101611035565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156110fb565b508583141561102e565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761117f611922565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602061120e611209611922565b611c9f565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761124f611922565b60243567ffffffffffffffff81116102bc5761126f903690600401611a08565b916044359267ffffffffffffffff84116102bc57611294610459943690600401611a08565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6112c061298b565b9061222f565b346102bc57602061120e6112d936611996565b92919091611b8d565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611e00565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611374611922565b60243561137f61298b565b9073ffffffffffffffffffffffffffffffffffffffff83169283156115295773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611444575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114ce57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506113f5565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760206115a6611f87565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104596116b5611922565b6116bd611945565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916116e761298b565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611728575b505061202e565b61173391848461273c565b8584611721565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104596117cf611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6117fc61298b565b90611ec2565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611e00565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc5761120e602091611cfe565b919082519283825260005b84811061190d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016118ce565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043573ffffffffffffffffffffffffffffffffffffffff811681036102bc5791602435916044359067ffffffffffffffff82116102bc57611a0491600401611968565b9091565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611a8291600401611a08565b9290929160243567ffffffffffffffff81116102bc5781611aa591600401611a08565b929092916044359067ffffffffffffffff82116102bc57611a0491600401611a08565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611b1191600401611a08565b929092916024359067ffffffffffffffff82116102bc57611a0491600401611a08565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106a057604052565b908160209103126102bc575180151581036102bc5790565b929192611b9861298b565b611bc48383837f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61202e565b813b15611c9557600073ffffffffffffffffffffffffffffffffffffffff608481937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8960209a6040519c8d9b8c9a8b977fa4c0ed36000000000000000000000000000000000000000000000000000000008952166004880152602487015260606044870152816064870152868601378685828601015201168101030193165af190811561098d57600091611c79575090565b611c92915060203d602011610c1d57610c0f8183611b34565b90565b5050505050600190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611cf75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611da7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611da1576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611df6575b6020831014611dc757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611dbc565b9060405191826000825492611e1484611dad565b8084529360018116908115611e825750600114611e3b575b50611e3992500383611b34565b565b90506000929192526020600020906000915b818310611e66575050906020611e399282010138611e2c565b6020919350806001915483858901015201910190918492611e4d565b60209350611e399592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611e2c565b929173ffffffffffffffffffffffffffffffffffffffff16928315611f435773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611fb07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611e00565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261202860c082611b34565b51902090565b929173ffffffffffffffffffffffffffffffffffffffff1692831561218b5782612098575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561213f57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603612118575b5050925050612053565b8383166000528185526040600020558660005283526040600020858154019055388061210e565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156121df5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c15780156124d25773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106122cb575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036122b9575b50505050565b6122c29361273c565b388080806122b3565b73ffffffffffffffffffffffffffffffffffffffff6122ee610a8f83858b6121cf565b16801561248e576123008285876121cf565b35806123ca575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806123c0575b612364575b50600101612271565b8a8703908782101561238a57600090815260208d9052604090209086019055600161235b565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612356565b9a8b810190811115612464579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146124165750906040602093926000908482528552208181540190555b909150612307565b9050888298921161242e57509086602092019661240e565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c15784156127345773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106125cd575050505050801515806125c3575b61253c575b5050505050565b808503948086101561257957505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612535565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612530565b73ffffffffffffffffffffffffffffffffffffffff6125f0610a8f8385896121cf565b1680156126f0576126028285876121cf565b3580612656575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161251b565b9687810190811115612464579673ffffffffffffffffffffffffffffffffffffffff89168281146126a357509060019291604060008381528c602052208181540190555b90919250612609565b8c829c92116126ba5750908a60019392019a61269a565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff81169384156128d6576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806128cd575b612809575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156128725750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926127c1565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156127bc565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106a057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926129608261291a565b9161296e6040519384611b34565b8294818452818301116102bc578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a8d573233148015612a92575b612a8d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612a13575b50611c9257503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561098d57600091612a6e575b5038612a09565b612a87915060203d602011610c1d57610c0f8183611b34565b38612a67565b503390565b50601836106129d2565b612b0b73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906118c3565b03816000865af190811561098d57600091612b9b575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612b6e5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612c15575b81612bb460209383611b34565b81010312612c115751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612c0e57507fffffffff00000000000000000000000000000000000000000000000000000000612b21565b80fd5b5080fd5b3d9150612ba756fea2646970667358221220a3d978971f4f723470d89d6c6351cebd54c699f889631c35b82a7cc7eb7e757564736f6c634300081e0033335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a821da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x668 JUMPI PUSH2 0x359A DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x69D JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xC0 DUP3 DUP3 SUB SLT PUSH2 0x668 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP3 PUSH2 0x66 SWAP2 DUP4 ADD PUSH2 0x6C2 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x668 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP4 ADD SWAP3 DUP5 PUSH1 0x1F DUP6 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP4 MLOAD PUSH2 0xAC PUSH2 0xA7 DUP3 PUSH2 0x72D JUMP JUMPDEST PUSH2 0x69D JUMP JUMPDEST SWAP5 PUSH1 0x20 DUP1 DUP8 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP8 DUP3 GT PUSH2 0x668 JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x67D JUMPI POP POP POP PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP2 ADD SWAP5 DUP1 PUSH1 0x1F DUP8 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP6 MLOAD PUSH2 0x102 PUSH2 0xA7 DUP3 PUSH2 0x72D JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP1 DUP10 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x668 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x66D JUMPI POP POP POP PUSH1 0xA0 ADD MLOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP4 SUB PUSH2 0x668 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x4E83A8C3 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE DUP3 MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x53E JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x355A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x65E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x51E JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x5E1 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x55F JUMPI PUSH1 0x0 SWAP3 PUSH2 0x554 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x355A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x53E JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x351A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x534 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x51E JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x4AC JUMPI JUMPDEST POP PUSH1 0x20 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x427 JUMPI DUP2 SWAP1 PUSH2 0x397 SWAP9 PUSH1 0x0 SWAP3 PUSH2 0x41C JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x351A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x357A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x357A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH4 0xA219A025 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE CALLER PUSH2 0x3BD JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x3C130D9 PUSH1 0xE4 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4EC7FBED PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x53F41A97 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x602993F3 PUSH1 0xE1 SHL DUP5 MSTORE SWAP2 SWAP1 SWAP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH2 0x76E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2C53 SWAP1 DUP2 PUSH2 0x8C7 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x1657 ADD MSTORE DUP2 DUP2 PUSH2 0x1CB6 ADD MSTORE PUSH2 0x29A2 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x311 JUMP JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x2A4 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP8 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x351A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP2 PUSH1 0x0 KECCAK256 SWAP9 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x494 JUMPI POP SWAP2 PUSH2 0x397 SWAP10 SWAP2 DUP5 PUSH1 0x1 SWAP6 SWAP5 LT PUSH2 0x47B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x351A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x2C7 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x460 JUMP JUMPDEST DUP4 DUP4 ADD MLOAD DUP12 SSTORE PUSH1 0x1 SWAP1 SWAP11 ADD SWAP10 PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x447 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x351A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x514 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x508 JUMPI POP PUSH2 0x288 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4FB JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4F2 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x276 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x355A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x5C9 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5B0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x355A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x248 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x595 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x57F JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x355A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x654 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x645 JUMPI POP PUSH2 0x20E JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x638 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x62A JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1FA JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x668 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x53E JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x53E JUMPI PUSH2 0x6F1 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x69D JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x668 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x718 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x703 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x53E JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x8B5 JUMPI DUP2 ISZERO PUSH2 0x8B0 JUMPI PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x7E1 JUMPI POP POP POP POP DUP1 PUSH2 0x799 JUMPI POP JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x353A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 DUP1 DUP3 ADD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0x7CA JUMPI POP POP PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x353A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMP JUMPDEST PUSH4 0x1B352FB PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x7F3 DUP3 DUP5 PUSH2 0x744 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x89F JUMPI PUSH2 0x805 DUP3 DUP6 PUSH2 0x744 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x843 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x786 JUMP JUMPDEST SWAP6 SWAP2 SWAP1 DUP7 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x88E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP2 SWAP6 SWAP1 SWAP2 SWAP1 PUSH2 0x80C JUMP JUMPDEST PUSH4 0x1550AB9F PUSH1 0xE2 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x92FD9C8F PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x32C1299B PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x185D JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1802 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1795 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x173A JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x167B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x160C JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x15AE JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x156D JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x133D JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x12E2 JUMPI DUP1 PUSH4 0x4000AEA0 EQ PUSH2 0x12C6 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1218 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x11CD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1148 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0xFC5 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF40 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xEFC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xE8B JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE18 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDAB JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD3E JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC2E JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x77E JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x6CF JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x1AC8 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x291A JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1B34 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x1922 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x378 PUSH2 0x298B JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3BE JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x419 CALLDATASIZE PUSH2 0x1996 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x452 DUP4 DUP4 PUSH2 0x44B PUSH2 0x298B JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x202E JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x464 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x47A SWAP5 PUSH2 0x473 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2954 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2A9C JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x459 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x4D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x512 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A0 JUMPI PUSH2 0x55A DUP3 SLOAD PUSH2 0x1DAD JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x658 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5BD JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5B2 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x57C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x640 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x608 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x5FE JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x5EB JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x696 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x68A JUMPI POP PUSH2 0x563 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x67D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x674 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x706 PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x723 PUSH2 0x1945 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x7B5 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x7BD PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x9C7 JUMPI DUP2 TIMESTAMP GT PUSH2 0x999 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x89F PUSH1 0xE0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8AA PUSH2 0x1F87 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x8EF PUSH1 0x62 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x98D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x963 JUMPI PUSH2 0x961 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1EC2 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x9FF CALLDATASIZE PUSH2 0x1A39 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA44 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC24 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xA6C JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA94 PUSH2 0xA8F DUP4 DUP6 DUP11 PUSH2 0x21CF JUMP JUMPDEST PUSH2 0x220E JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBF6 JUMPI JUMPDEST POP ISZERO PUSH2 0xBC9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB23 PUSH2 0xA8F DUP4 DUP6 DUP11 PUSH2 0x21CF JUMP JUMPDEST AND SWAP1 PUSH2 0xB33 PUSH2 0xA8F DUP3 DUP7 DUP10 PUSH2 0x21CF JUMP JUMPDEST SWAP2 PUSH2 0xB3F DUP3 DUP8 DUP12 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x98D JUMPI PUSH1 0x1 SWAP3 PUSH2 0xBB8 JUMPI JUMPDEST POP ADD PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBC3 SWAP2 PUSH2 0x1B34 JUMP JUMPDEST DUP9 PUSH2 0xBB1 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC17 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC1D JUMPI JUMPDEST PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1B75 JUMP JUMPDEST DUP10 PUSH2 0xAF9 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC05 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA5C JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xC65 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0xC6D PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xC90 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xCFC DUP5 DUP5 DUP5 PUSH2 0xCC3 PUSH2 0x298B JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD2D JUMPI PUSH2 0x202E JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD0D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD22 SWAP6 PUSH2 0xD1C SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2954 JUMP JUMPDEST SWAP4 PUSH2 0x2A9C JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x459 JUMP JUMPDEST PUSH2 0xD39 DUP5 DUP12 DUP5 DUP5 PUSH2 0x273C JUMP JUMPDEST PUSH2 0x202E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xD78 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDA5 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x202E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xDE5 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE12 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x273C JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1E00 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x18C3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xF0D CALLDATASIZE PUSH2 0x1AC8 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF3A PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x24DB JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xF77 PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xFD3 CALLDATASIZE PUSH2 0x1A39 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1016 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x113E JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x103E JUMPI STOP JUMPDEST PUSH2 0x1049 DUP2 DUP4 DUP9 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x108A DUP8 PUSH2 0x1083 PUSH2 0xA8F DUP3 DUP16 DUP16 SWAP1 PUSH2 0x21CF JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x10E5 PUSH1 0x64 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1135 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1108 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1035 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x10FB JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x102E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x117F PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x120E PUSH2 0x1209 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x1C9F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x124F PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x126F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x1294 PUSH2 0x459 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x12C0 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x222F JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x120E PUSH2 0x12D9 CALLDATASIZE PUSH2 0x1996 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x1B8D JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1374 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x137F PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1529 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1444 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14CE JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x15A6 PUSH2 0x1F87 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0x16B5 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x16BD PUSH2 0x1945 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x16E7 PUSH2 0x298B JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1728 JUMPI JUMPDEST POP POP PUSH2 0x202E JUMP JUMPDEST PUSH2 0x1733 SWAP2 DUP5 DUP5 PUSH2 0x273C JUMP JUMPDEST DUP6 DUP5 PUSH2 0x1721 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0x17CF PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x17FC PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x1EC2 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x120E PUSH1 0x20 SWAP2 PUSH2 0x1CFE JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x190D JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x18CE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1A82 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1AA5 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1B11 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6A0 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1B98 PUSH2 0x298B JUMP JUMPDEST PUSH2 0x1BC4 DUP4 DUP4 DUP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x202E JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x1C95 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x84 DUP2 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP10 PUSH1 0x20 SWAP11 PUSH1 0x40 MLOAD SWAP13 DUP14 SWAP12 DUP13 SWAP11 DUP12 SWAP8 PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP10 MSTORE AND PUSH1 0x4 DUP9 ADD MSTORE PUSH1 0x24 DUP8 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP8 ADD MSTORE DUP2 PUSH1 0x64 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY DUP7 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP4 AND GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1C79 JUMPI POP SWAP1 JUMP JUMPDEST PUSH2 0x1C92 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC1D JUMPI PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1CF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DA7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DA1 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1DF6 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1DC7 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1DBC JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1E14 DUP5 PUSH2 0x1DAD JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1E82 JUMPI POP PUSH1 0x1 EQ PUSH2 0x1E3B JUMPI JUMPDEST POP PUSH2 0x1E39 SWAP3 POP SUB DUP4 PUSH2 0x1B34 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1E66 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1E39 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1E2C JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1E4D JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1E39 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1E2C JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1F43 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1FB0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1E00 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2028 PUSH1 0xC0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x218B JUMPI DUP3 PUSH2 0x2098 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x213F JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x2118 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x2053 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x210E JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x21DF JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x24D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22CB JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22B9 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x22C2 SWAP4 PUSH2 0x273C JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x22B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22EE PUSH2 0xA8F DUP4 DUP6 DUP12 PUSH2 0x21CF JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x248E JUMPI PUSH2 0x2300 DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x23CA JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x23C0 JUMPI JUMPDEST PUSH2 0x2364 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2271 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x238A JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x235B JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2356 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2464 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2416 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2307 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x242E JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x240E JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x2734 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x25CD JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x25C3 JUMPI JUMPDEST PUSH2 0x253C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2579 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2535 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2530 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x25F0 PUSH2 0xA8F DUP4 DUP6 DUP10 PUSH2 0x21CF JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x26F0 JUMPI PUSH2 0x2602 DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2656 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x251B JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2464 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x26A3 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2609 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x26BA JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x269A JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x28D6 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x28CD JUMPI JUMPDEST PUSH2 0x2809 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x2872 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x27C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x27BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A0 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2960 DUP3 PUSH2 0x291A JUMP JUMPDEST SWAP2 PUSH2 0x296E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1B34 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2A8D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2A92 JUMPI JUMPDEST PUSH2 0x2A8D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2A13 JUMPI JUMPDEST POP PUSH2 0x1C92 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A6E JUMPI JUMPDEST POP CODESIZE PUSH2 0x2A09 JUMP JUMPDEST PUSH2 0x2A87 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC1D JUMPI PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST CODESIZE PUSH2 0x2A67 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x29D2 JUMP JUMPDEST PUSH2 0x2B0B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x18C3 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2B9B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2B6E JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2C15 JUMPI JUMPDEST DUP2 PUSH2 0x2BB4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2C11 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2C0E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2B21 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2BA7 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 0xD9 PUSH25 0x971F4F723470D89D6C6351CEBD54C699F889631C35B82A7CC7 0xEB PUSH31 0x757564736F6C634300081E0033335DF4119BBB04F056B33EBA33B826D35291 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x821DA92899D3DA68BF9787 DUP3 NUMBER DUP9 LOG3 PUSH31 0xA2BFA79780BCEF91B9716C390EEC8ECBF0335DF4119BBB04F056B33EBA33B8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x81335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x8300000000000000000000 ","sourceMap":"533:829:127:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;533:829:127;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;533:829:127;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;500:10:59;;;;;;2510:4:280;-1:-1:-1;;533:829:127;;;;;500:10:59;;;-1:-1:-1;;;;500:10:59;;;;533:829:127;;;;;;500:10:59;;533:829:127;;;;-1:-1:-1;;;;;533:829:127;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;2510:4:280;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;;2510:4:280;533:829:127;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;;;-1:-1:-1;;;;;533:829:127;;;;-1:-1:-1;;;;;;;;;;;533:829:127;2510:4:280;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:11:281;533:829:127;-1:-1:-1;533:829:127;;;;;;;2510:4:280;533:829:127;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;;-1:-1:-1;;;;;;;;;;;533:829:127;1598:32:277;;;-1:-1:-1;500:10:59;;533:829:127;500:10:59;533:829:127;-1:-1:-1;500:10:59;2510:4:280;533:829:127;;500:10:59;;533:829:127;;500:10:59;;1641::281;1645:152:42;;533:829:127;-1:-1:-1;;;;500:10:59;;;533:829:127;500:10:59;;;;533:829:127;500:10:59;;;;;2510:4:280;-1:-1:-1;;533:829:127;;;;;500:10:59;;;-1:-1:-1;;;500:10:59;;;;;;;533:829:127;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;533:829:127;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;533:829:127;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;;533:829:127;;;;;;500:10:59;;533:829:127;745:39:76;1704:11:281;:::i;:::-;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;1645:152:42;533:829:127;;;-1:-1:-1;;;;;;533:829:127;1641:10:281;533:829:127;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;533:829:127;;;;-1:-1:-1;533:829:127;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;533:829:127;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;;;;;1704:11:281;533:829:127;;;2510:4:280;533:829:127;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;533:829:127;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;2510:4:280;533:829:127;;;;;;-1:-1:-1;533:829:127;;;;;;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;;;;;;;;;;;;533:829:127;;;;;;;-1:-1:-1;;;533:829:127;;;;;;;;;;;;2510:4:280;533:829:127;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;533:829:127;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;533:829:127;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;-1:-1:-1;2510:4:280;533:829:127;;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;533:829:127;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;-1:-1:-1;;533:829:127;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;;;;-1:-1:-1;533:829:127;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;533:829:127;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;20857:1233:280;;533:829:127;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;:::o;21782:302::-;-1:-1:-1;;;;;;;;;;;533:829:127;;;;;21949:19:280;;;;;21945:76;;533:829:127;;-1:-1:-1;;;;;;;;;;;533:829:127;20857:1233:280:o;21945:76::-;21977:44;;;-1:-1:-1;21977:44:280;;533:829:127;;;;-1:-1:-1;21977:44:280;21174:3;-1:-1:-1;;;;;21206:13:280;;;;:::i;:::-;533:829:127;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;533:829:127;21344:10:280;21340:372;;21174:3;533:829:127;-1:-1:-1;21730:31:280;533:829:127;;;;;;;;;21730:31:280;533:829:127;21151:9:280;;21340:372;533:829:127;;;;;;21474:27:280;;;;21470:70;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;21562:26:280;;21340:372;;533:829:127;21340:372:280;;21470:70;21510:30;;;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;;;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;21084;21101:7;;;:::o;21011:62::-;21047:26;;;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6469,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_uint256t_bytes_calldata":{"entryPoint":6550,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_address_dyn_calldata":{"entryPoint":6664,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6713,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6856,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":10580,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":7029,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6504,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6434,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_string":{"entryPoint":6339,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":10522,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":8655,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":7680,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":7597,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":6964,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":8071,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":7874,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchTransfer":{"entryPoint":9435,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":8751,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":10908,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":10044,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":7327,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgSender":{"entryPoint":10635,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7422,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transfer":{"entryPoint":8238,"id":29123,"parameterSlots":4,"returnSlots":0},"fun_transferAndCall":{"entryPoint":7053,"id":16813,"parameterSlots":4,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":8718,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5719},{"length":32,"start":7350},{"length":32,"start":10658}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461185d57806306fdde0314611802578063095ea7b31461179557806318160ddd1461173a57806323b872dd1461167b5780632b4c9f161461160c578063313ce567146115ae5780633644e5151461156d578063395093511461133d5780633c130d90146112e25780634000aea0146112c65780634885b25414611218578063572b6c05146111cd57806370a082311461114857806373c8a95814610fc55780637ecebe0014610f4057806388d695b214610efc5780638da5cb5b14610e8b57806395d89b4114610e18578063a457c2d714610dab578063a9059cbb14610d3e578063b88d4fde14610c2e578063c3666c36146109f1578063d505accf1461077e578063dd62ed3e146106cf578063e0df5b6f14610484578063eb7955491461040b578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc5761016936611ac8565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa61298b565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d58183876121cf565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff8285876121cf565b359081471061028a57600080809381935af13d15610282573d906102228261291a565b916102306040519384611b34565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f611922565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61037861298b565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102eb575073ffffffffffffffffffffffffffffffffffffffff16928383036103be57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5761041936611996565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610452838361044b61298b565b809761202e565b813b610464575b602060405160018152f35b61047a94610473913691612954565b9280612a9c565b8080808080610459565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc576104d3903690600401611968565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061051261298b565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106a05761055a8254611dad565b601f8111610658575b506000601f82116001146105bd578192936000926105b2575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b01359050838061057c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106405750836001959610610608575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806105fe565b909260206001819286860135815501940191016105eb565b826000526020600020601f830160051c81019160208410610696575b601f0160051c01905b81811061068a5750610563565b6000815560010161067d565b9091508190610674565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610706611922565b73ffffffffffffffffffffffffffffffffffffffff610723611945565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576107b5611922565b6107bd611945565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d83156109c757814211610999576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c0815261089f60e082611b34565b5190206108aa611f87565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526108ef606282611b34565b519020906040519182528482015260a435604082015260c435606082015282805260015afa1561098d5773ffffffffffffffffffffffffffffffffffffffff600051160361096357610961927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ec2565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc576109ff36611a39565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a4461298b565b92541691169081036102eb5750808214801590610c24575b6102c15760005b828110610a6c57005b73ffffffffffffffffffffffffffffffffffffffff610a94610a8f83858a6121cf565b61220e565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561098d57600091610bf6575b5015610bc9575073ffffffffffffffffffffffffffffffffffffffff610b23610a8f83858a6121cf565b1690610b33610a8f8286896121cf565b91610b3f82878b6121cf565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561098d57600192610bb8575b5001610a63565b6000610bc391611b34565b88610bb1565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c17915060203d8111610c1d575b610c0f8183611b34565b810190611b75565b89610af9565b503d610c05565b5082821415610a5c565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610c65611922565b610c6d611945565b60443560643567ffffffffffffffff81116102bc57610c90903690600401611968565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610cfc848484610cc361298b565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d2d5761202e565b823b610d0d57602060405160018152f35b610d2295610d1c913691612954565b93612a9c565b808080808080610459565b610d39848b848461273c565b61202e565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610459610d78611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610da561298b565b9061202e565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610459610de5611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e1261298b565b9061273c565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611e00565b6040519182916020835260208301906118c3565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc57610459610f0d36611ac8565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f3a61298b565b906124db565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610f77611922565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc57610fd336611a39565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061101661298b565b92541691169081036102eb575080831480159061113e575b6102c15760005b83811061103e57005b6110498183886121cf565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a8261108a87611083610a8f828f8f906121cf565b938b6121cf565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526110e5606482611b34565b51925af11561098d576000513d6111355750803b155b6111085750600101611035565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156110fb565b508583141561102e565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761117f611922565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602061120e611209611922565b611c9f565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761124f611922565b60243567ffffffffffffffff81116102bc5761126f903690600401611a08565b916044359267ffffffffffffffff84116102bc57611294610459943690600401611a08565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6112c061298b565b9061222f565b346102bc57602061120e6112d936611996565b92919091611b8d565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611e00565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611374611922565b60243561137f61298b565b9073ffffffffffffffffffffffffffffffffffffffff83169283156115295773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611444575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114ce57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506113f5565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760206115a6611f87565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104596116b5611922565b6116bd611945565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916116e761298b565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611728575b505061202e565b61173391848461273c565b8584611721565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104596117cf611922565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6117fc61298b565b90611ec2565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610e87610e737f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611e00565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc5761120e602091611cfe565b919082519283825260005b84811061190d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016118ce565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043573ffffffffffffffffffffffffffffffffffffffff811681036102bc5791602435916044359067ffffffffffffffff82116102bc57611a0491600401611968565b9091565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611a8291600401611a08565b9290929160243567ffffffffffffffff81116102bc5781611aa591600401611a08565b929092916044359067ffffffffffffffff82116102bc57611a0491600401611a08565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611b1191600401611a08565b929092916024359067ffffffffffffffff82116102bc57611a0491600401611a08565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106a057604052565b908160209103126102bc575180151581036102bc5790565b929192611b9861298b565b611bc48383837f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61202e565b813b15611c9557600073ffffffffffffffffffffffffffffffffffffffff608481937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8960209a6040519c8d9b8c9a8b977fa4c0ed36000000000000000000000000000000000000000000000000000000008952166004880152602487015260606044870152816064870152868601378685828601015201168101030193165af190811561098d57600091611c79575090565b611c92915060203d602011610c1d57610c0f8183611b34565b90565b5050505050600190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611cf75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611da7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611da1576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611df6575b6020831014611dc757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611dbc565b9060405191826000825492611e1484611dad565b8084529360018116908115611e825750600114611e3b575b50611e3992500383611b34565b565b90506000929192526020600020906000915b818310611e66575050906020611e399282010138611e2c565b6020919350806001915483858901015201910190918492611e4d565b60209350611e399592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611e2c565b929173ffffffffffffffffffffffffffffffffffffffff16928315611f435773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611fb07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611e00565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261202860c082611b34565b51902090565b929173ffffffffffffffffffffffffffffffffffffffff1692831561218b5782612098575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561213f57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603612118575b5050925050612053565b8383166000528185526040600020558660005283526040600020858154019055388061210e565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156121df5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c15780156124d25773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106122cb575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036122b9575b50505050565b6122c29361273c565b388080806122b3565b73ffffffffffffffffffffffffffffffffffffffff6122ee610a8f83858b6121cf565b16801561248e576123008285876121cf565b35806123ca575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806123c0575b612364575b50600101612271565b8a8703908782101561238a57600090815260208d9052604090209086019055600161235b565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612356565b9a8b810190811115612464579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146124165750906040602093926000908482528552208181540190555b909150612307565b9050888298921161242e57509086602092019661240e565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c15784156127345773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106125cd575050505050801515806125c3575b61253c575b5050505050565b808503948086101561257957505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612535565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612530565b73ffffffffffffffffffffffffffffffffffffffff6125f0610a8f8385896121cf565b1680156126f0576126028285876121cf565b3580612656575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161251b565b9687810190811115612464579673ffffffffffffffffffffffffffffffffffffffff89168281146126a357509060019291604060008381528c602052208181540190555b90919250612609565b8c829c92116126ba5750908a60019392019a61269a565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff81169384156128d6576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806128cd575b612809575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156128725750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926127c1565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156127bc565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106a057601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926129608261291a565b9161296e6040519384611b34565b8294818452818301116102bc578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612a8d573233148015612a92575b612a8d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612a13575b50611c9257503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561098d57600091612a6e575b5038612a09565b612a87915060203d602011610c1d57610c0f8183611b34565b38612a67565b503390565b50601836106129d2565b612b0b73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906118c3565b03816000865af190811561098d57600091612b9b575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612b6e5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612c15575b81612bb460209383611b34565b81010312612c115751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612c0e57507fffffffff00000000000000000000000000000000000000000000000000000000612b21565b80fd5b5080fd5b3d9150612ba756fea2646970667358221220a3d978971f4f723470d89d6c6351cebd54c699f889631c35b82a7cc7eb7e757564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x185D JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1802 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1795 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x173A JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x167B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x160C JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x15AE JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x156D JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x133D JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x12E2 JUMPI DUP1 PUSH4 0x4000AEA0 EQ PUSH2 0x12C6 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1218 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x11CD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1148 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0xFC5 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF40 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xEFC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xE8B JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE18 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDAB JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD3E JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC2E JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x77E JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x6CF JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x1AC8 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x291A JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1B34 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x1922 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x378 PUSH2 0x298B JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3BE JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x419 CALLDATASIZE PUSH2 0x1996 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x452 DUP4 DUP4 PUSH2 0x44B PUSH2 0x298B JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x202E JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x464 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x47A SWAP5 PUSH2 0x473 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2954 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2A9C JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x459 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x4D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x512 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A0 JUMPI PUSH2 0x55A DUP3 SLOAD PUSH2 0x1DAD JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x658 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5BD JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5B2 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x57C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x640 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x608 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x5FE JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x5EB JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x696 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x68A JUMPI POP PUSH2 0x563 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x67D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x674 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x706 PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x723 PUSH2 0x1945 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x7B5 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x7BD PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x9C7 JUMPI DUP2 TIMESTAMP GT PUSH2 0x999 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x89F PUSH1 0xE0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8AA PUSH2 0x1F87 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x8EF PUSH1 0x62 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x98D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x963 JUMPI PUSH2 0x961 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1EC2 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x9FF CALLDATASIZE PUSH2 0x1A39 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA44 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC24 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xA6C JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA94 PUSH2 0xA8F DUP4 DUP6 DUP11 PUSH2 0x21CF JUMP JUMPDEST PUSH2 0x220E JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBF6 JUMPI JUMPDEST POP ISZERO PUSH2 0xBC9 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB23 PUSH2 0xA8F DUP4 DUP6 DUP11 PUSH2 0x21CF JUMP JUMPDEST AND SWAP1 PUSH2 0xB33 PUSH2 0xA8F DUP3 DUP7 DUP10 PUSH2 0x21CF JUMP JUMPDEST SWAP2 PUSH2 0xB3F DUP3 DUP8 DUP12 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x98D JUMPI PUSH1 0x1 SWAP3 PUSH2 0xBB8 JUMPI JUMPDEST POP ADD PUSH2 0xA63 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBC3 SWAP2 PUSH2 0x1B34 JUMP JUMPDEST DUP9 PUSH2 0xBB1 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC17 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC1D JUMPI JUMPDEST PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1B75 JUMP JUMPDEST DUP10 PUSH2 0xAF9 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC05 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA5C JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xC65 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0xC6D PUSH2 0x1945 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xC90 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xCFC DUP5 DUP5 DUP5 PUSH2 0xCC3 PUSH2 0x298B JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD2D JUMPI PUSH2 0x202E JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD0D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD22 SWAP6 PUSH2 0xD1C SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2954 JUMP JUMPDEST SWAP4 PUSH2 0x2A9C JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x459 JUMP JUMPDEST PUSH2 0xD39 DUP5 DUP12 DUP5 DUP5 PUSH2 0x273C JUMP JUMPDEST PUSH2 0x202E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xD78 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDA5 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x202E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xDE5 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE12 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x273C JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1E00 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x18C3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0xF0D CALLDATASIZE PUSH2 0x1AC8 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF3A PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x24DB JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xF77 PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xFD3 CALLDATASIZE PUSH2 0x1A39 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1016 PUSH2 0x298B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x113E JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x103E JUMPI STOP JUMPDEST PUSH2 0x1049 DUP2 DUP4 DUP9 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x108A DUP8 PUSH2 0x1083 PUSH2 0xA8F DUP3 DUP16 DUP16 SWAP1 PUSH2 0x21CF JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x10E5 PUSH1 0x64 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1135 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1108 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1035 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x10FB JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x102E JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x117F PUSH2 0x1922 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x120E PUSH2 0x1209 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x1C9F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x124F PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x126F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x1294 PUSH2 0x459 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x12C0 PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x222F JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x120E PUSH2 0x12D9 CALLDATASIZE PUSH2 0x1996 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x1B8D JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1374 PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x137F PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1529 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1444 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14CE JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x15A6 PUSH2 0x1F87 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0x16B5 PUSH2 0x1922 JUMP JUMPDEST PUSH2 0x16BD PUSH2 0x1945 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x16E7 PUSH2 0x298B JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1728 JUMPI JUMPDEST POP POP PUSH2 0x202E JUMP JUMPDEST PUSH2 0x1733 SWAP2 DUP5 DUP5 PUSH2 0x273C JUMP JUMPDEST DUP6 DUP5 PUSH2 0x1721 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x459 PUSH2 0x17CF PUSH2 0x1922 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x17FC PUSH2 0x298B JUMP JUMPDEST SWAP1 PUSH2 0x1EC2 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xE87 PUSH2 0xE73 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1E00 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x120E PUSH1 0x20 SWAP2 PUSH2 0x1CFE JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x190D JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x18CE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1968 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1A82 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1AA5 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1B11 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1A04 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A08 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6A0 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x1B98 PUSH2 0x298B JUMP JUMPDEST PUSH2 0x1BC4 DUP4 DUP4 DUP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x202E JUMP JUMPDEST DUP2 EXTCODESIZE ISZERO PUSH2 0x1C95 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x84 DUP2 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP10 PUSH1 0x20 SWAP11 PUSH1 0x40 MLOAD SWAP13 DUP14 SWAP12 DUP13 SWAP11 DUP12 SWAP8 PUSH32 0xA4C0ED3600000000000000000000000000000000000000000000000000000000 DUP10 MSTORE AND PUSH1 0x4 DUP9 ADD MSTORE PUSH1 0x24 DUP8 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP8 ADD MSTORE DUP2 PUSH1 0x64 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY DUP7 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP4 AND GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1C79 JUMPI POP SWAP1 JUMP JUMPDEST PUSH2 0x1C92 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC1D JUMPI PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP POP POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1CF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DA7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1DA1 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1DF6 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1DC7 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1DBC JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1E14 DUP5 PUSH2 0x1DAD JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1E82 JUMPI POP PUSH1 0x1 EQ PUSH2 0x1E3B JUMPI JUMPDEST POP PUSH2 0x1E39 SWAP3 POP SUB DUP4 PUSH2 0x1B34 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1E66 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1E39 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1E2C JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1E4D JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1E39 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1E2C JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1F43 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1FB0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1E00 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2028 PUSH1 0xC0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x218B JUMPI DUP3 PUSH2 0x2098 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x213F JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x2118 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x2053 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x210E JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x21DF JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x24D2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22CB JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x22B9 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x22C2 SWAP4 PUSH2 0x273C JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x22B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22EE PUSH2 0xA8F DUP4 DUP6 DUP12 PUSH2 0x21CF JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x248E JUMPI PUSH2 0x2300 DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x23CA JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x23C0 JUMPI JUMPDEST PUSH2 0x2364 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2271 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x238A JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x235B JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2356 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2464 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2416 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2307 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x242E JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x240E JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x2734 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x25CD JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x25C3 JUMPI JUMPDEST PUSH2 0x253C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2579 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2535 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2530 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x25F0 PUSH2 0xA8F DUP4 DUP6 DUP10 PUSH2 0x21CF JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x26F0 JUMPI PUSH2 0x2602 DUP3 DUP6 DUP8 PUSH2 0x21CF JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2656 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x251B JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2464 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x26A3 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2609 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x26BA JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x269A JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x28D6 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x28CD JUMPI JUMPDEST PUSH2 0x2809 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x2872 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x27C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x27BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A0 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2960 DUP3 PUSH2 0x291A JUMP JUMPDEST SWAP2 PUSH2 0x296E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1B34 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2A8D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2A92 JUMPI JUMPDEST PUSH2 0x2A8D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2A13 JUMPI JUMPDEST POP PUSH2 0x1C92 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A6E JUMPI JUMPDEST POP CODESIZE PUSH2 0x2A09 JUMP JUMPDEST PUSH2 0x2A87 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC1D JUMPI PUSH2 0xC0F DUP2 DUP4 PUSH2 0x1B34 JUMP JUMPDEST CODESIZE PUSH2 0x2A67 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x29D2 JUMP JUMPDEST PUSH2 0x2B0B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x18C3 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x98D JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2B9B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2B6E JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2C15 JUMPI JUMPDEST DUP2 PUSH2 0x2BB4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B34 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2C11 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2C0E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2B21 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2BA7 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 0xD9 PUSH25 0x971F4F723470D89D6C6351CEBD54C699F889631C35B82A7CC7 0xEB PUSH31 0x757564736F6C634300081E0033000000000000000000000000000000000000 ","sourceMap":"533:829:127:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;533:829:127;;1905:41:281;;;:::i;:::-;533:829:127;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;533:829:127;1845:10:192;;;;;;533:829:127;1857:3:192;1876:11;;;;;:::i;:::-;533:829:127;;;;;;;;;1898:10:192;;;;;:::i;:::-;533:829:127;1375:21:9;;;:30;1371:125;;533:829:127;1548:33:9;;;;;;;533:829:127;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;533:829:127;;1834:9:192;;1591:58:9;533:829:127;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;533:829:127;5957:19:9;533:829:127;;5957:19:9;533:829:127;;;;;1371:125:9;1455:21;;1428:57;533:829:127;1428:57:9;533:829:127;;;;;;1428:57:9;533:829:127;;;;1756:63:192;1793:26;533:829:127;1793:26:192;533:829:127;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;533:829:127;;-1:-1:-1;4538:25:42;533:829:127;;;;;;;;;;;;;:::i;:::-;;1905:41:281;;:::i;:::-;533:829:127;;;;;;;;;;3205:23:42;;;3201:60;;533:829:127;;;3275:25:42;;;;3271:146;;533:829:127;3271:146:42;533:829:127;;;;;;3361:45:42;533:829:127;;3361:45:42;533:829:127;;;;;;;;:::i;:::-;27705:19:280;;;533:829:127;1905:41:281;17093:5:280;1905:41:281;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;533:829:127;;;;878:4:249;533:829:127;;;17109:96:280;17145:49;533:829:127;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1905:41:281;;;:::i;:::-;533:829:127;;;;;4503:26:42;;;4499:64;;1283:19:278;533:829:127;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;533:829:127;-1:-1:-1;533:829:127;27576:12:280;533:829:127;;;;-1:-1:-1;533:829:127;27576:28:280;533:829:127;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;533:829:127;2653:23:279;533:829:127;2653:23:279;533:829:127;2653:23:279;533:829:127;;;;;;;;;;;;;;;;;;;2602:87:279;;;;533:829:127;1021:95:279;533:829:127;;1021:95:279;533:829:127;1021:95:279;;533:829:127;;;;;1021:95:279;;533:829:127;1021:95:279;;;;533:829:127;;1021:95:279;;533:829:127;;1021:95:279;;533:829:127;;2602:87:279;;;533:829:127;2602:87:279;;:::i;:::-;533:829:127;2592:98:279;;2758:18;;:::i;:::-;533:829:127;;;2729:60:279;;;;1021:95;;;;;;;533:829:127;1021:95:279;;;533:829:127;1021:95:279;2729:60;;;;;;:::i;:::-;533:829:127;2719:71:279;;533:829:127;;;;;;1021:95:279;;;533:829:127;;;;1021:95:279;;533:829:127;;;;1021:95:279;;533:829:127;2821:24:279;;;533:829:127;2821:24:279;;;;;533:829:127;;2821:24:279;533:829:127;2863:15:279;2859:57;;2982:5;27705:19:280;533:829:127;2982:5:279;:::i;:::-;533:829:127;2859:57:279;2887:29;533:829:127;2887:29:279;533:829:127;;2887:29:279;2821:24;533:829:127;;;;;;;;;2470:67:279;2509:28;;533:829:127;2509:28:279;533:829:127;;;;2509:28:279;2400:60;2432:28;533:829:127;2432:28:279;533:829:127;;2432:28:279;533:829:127;;;;;;;:::i;:::-;5148:19:42;;;;;;533:829:127;;;1905:41:281;;:::i;:::-;533:829:127;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;533:829:127;3852:94:192;;533:829:127;3972:10:192;;;;;;533:829:127;3984:3:192;533:829:127;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;533:829:127;;;;4058:76:192;;4108:25;533:829:127;4058:76:192;;533:829:127;4058:76:192;;;;;;;;;;;;533:829:127;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;533:829:127;4239:12:192;;;;;;:::i;:::-;533:829:127;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;533:829:127;4239:70:192;;;;;;;533:829:127;;;;;;;4239:70:192;;;;;533:829:127;4239:70:192;;4277:4;533:829:127;4239:70:192;;533:829:127;;4058:76:192;533:829:127;;;;;;;4239:70:192;;;;;;;533:829:127;4239:70:192;;;3984:3;;533:829:127;3961:9:192;;4239:70;533:829:127;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;533:829:127;4161:50:192;533:829:127;;4058:76:192;533:829:127;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;533:829:127;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;533:829:127;1905:41:281;9818:5:280;1905:41:281;;;;;:::i;:::-;533:829:127;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;533:829:127;;;;;;;18723:98:280;18759:51;533:829:127;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;533:829:127:-;;;;;;;;;;;1036:5:242;533:829:127;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;1036:5:242;;:::i;533:829:127:-;;;;;;;;;;;1788:15:242;533:829:127;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;1788:15:242;;:::i;533:829:127:-;;;;;;;;;;;;;3091:13:277;533:829:127;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:6:243;533:829:127;;;:::i;:::-;27705:19:280;;;;533:829:127;1905:41:281;;:::i;:::-;875:6:243;;:::i;533:829:127:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;533:829:127;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;533:829:127;;1905:41:281;;;:::i;:::-;533:829:127;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;533:829:127;2776:90:192;;533:829:127;2892:10:192;;;;;;533:829:127;2904:3:192;2923:9;;;;;:::i;:::-;533:829:127;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;533:829:127;;;1328:43:8;533:829:127;1328:43:8;;;;533:829:127;1328:43:8;;533:829:127;1328:43:8;;;533:829:127;1328:43:8;533:829:127;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;533:829:127;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;533:829:127;;2881:9:192;;8938:146:8;9033:40;533:829:127;9033:40:8;533:829:127;;1328:43:8;533:829:127;9033:40:8;8942:68;533:829:127;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;533:829:127;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;533:829:127;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;533:829:127;;;;;;:::i;:::-;27705:19:280;;;533:829:127;1905:41:281;;:::i;:::-;1170:6:243;;:::i;533:829:127:-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;1905:41:281;;:::i;:::-;533:829:127;;;;5455:21:280;;;5451:67;;533:829:127;;;-1:-1:-1;533:829:127;5555:12:280;533:829:127;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;-1:-1:-1;533:829:127;;5597:10:280;;5593:366;;533:829:127;;;5973:42:280;533:829:127;;;;;;;;;5973:42:280;;533:829:127;;;;;;;5593:366:280;533:829:127;;;5720:32:280;;;;;5716:108;;5842:19;;;533:829:127;;5973:42:280;5842:19;533:829:127;;;-1:-1:-1;533:829:127;5555:12:280;533:829:127;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;5593:366:280;;;;5716:108;533:829:127;;5761:63:280;;;533:829:127;;;;;5761:63:280;;533:829:127;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;533:829:127;5485:33:280;;533:829:127;5485:33:280;533:829:127;;;;;5485:33:280;533:829:127;;;;;;;;;;;;1284:37:248;;:::i;:::-;533:829:127;;;;;;;;;;;;;;;;;;;3732:15:277;533:829:127;;;;;;;;;;;;;;;;;;;;;;;941:19:75;533:829:127;;;;;;;;;;;;;;;9818:5:280;533:829:127;;:::i;:::-;;;:::i;:::-;;1905:41:281;;;:::i;:::-;533:829:127;;;;;;;;;;;9707:14:280;9703:85;;533:829:127;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;533:829:127;;;;;;;;;;;;26654:8:280;533:829:127;;;;;;;;;;;;;;;;;;826:5:242;533:829:127;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;826:5:242;;:::i;533:829:127:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;533:829:127;635:65:55;;:::i;533:829:127:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;1006:354::-;;;;1905:41:281;;:::i;:::-;1216:6:127;1926:73:280;;;533:829:127;1216:6;:::i;:::-;376:58:354;;450:9;1233:40:127;;533:829;;;;;;;;;;;;1290:63;;;;;;;533:829;1290:63;;533:829;1290:63;;;533:829;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1290:63;;533:829;;1290:63;;;;;;;533:829;1290:63;;;1283:70;1006:354;:::o;1290:63::-;;;;533:829;1290:63;533:829;1290:63;;;;;;;:::i;:::-;1006:354;:::o;1233:40::-;1262:11;;;;;1269:4;1262:11;:::o;1002:301:75:-;533:829:127;1146:19:75;533:829:127;1146:53:75;;;1142:96;;533:829:127;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;533:829:127;1215:12:75;:::o;1359:340:59:-;533:829:127;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;533:829:127;500:10:59;533:829:127;500:10:59;;533:829:127;500:10:59;533:829:127;500:10:59;;533:829:127;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;533:829:127;1528:12:59;:::o;533:829:127:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;533:829:127;;4533:21:280;;;4529:67;;533:829:127;4657:31:280;4606:19;:12;533:829:127;4606:19:280;533:829:127;;;-1:-1:-1;533:829:127;4606:12:280;533:829:127;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;533:829:127;4563:33:280;;4552:1;4563:33;533:829:127;4563:33:280;533:829:127;;4552:1:280;4563:33;4317:545:279;533:829:127;;;:::i;:::-;;;;;;4669:54:279;533:829:127;;;4520:321:279;;533:829:127;4552:95:279;533:829:127;;;;;;4745:14:279;533:829:127;;;;4412:53:279;533:829:127;;;;4818:4:279;533:829:127;;;;;4520:321:279;;;;;;:::i;:::-;533:829:127;4493:362:279;;4317:545;:::o;8105:628:280:-;;;533:829:127;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;533:829:127;;;8701:25:280;533:829:127;;;;;;;8701:25:280;;8105:628::o;8273:413::-;533:829:127;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;;;8437:21:280;;;;;8433:80;;533:829:127;;;;;;;;8701:25:280;533:829:127;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;533:829:127;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;;-1:-1:-1;533:829:127;;;;-1:-1:-1;533:829:127;;;;;;;8531:131:280;;;;8433:80;8467:46;;533:829:127;8467:46:280;;8219:1;8467:46;533:829:127;8467:46:280;533:829:127;;;;;;8219:1:280;8467:46;8201:61;533:829:127;8230:32:280;;8219:1;8230:32;533:829:127;8230:32:280;533:829:127;;8219:1:280;8230:32;533:829:127;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;533:829:127;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;533:829:127;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;533:829:127;14325:13:280;;;;;;:::i;:::-;533:829:127;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;533:829:127;14472:10:280;14468:656;;14293:3;533:829:127;;;15143:25:280;533:829:127;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;533:829:127;;14270:9:280;;15183:500;533:829:127;;;15437:21:280;;;;;15433:85;;-1:-1:-1;533:829:127;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;533:829:127;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;533:829:127;;;;14602:27:280;;;;14598:74;;533:829:127;;;;;14746:10:280;;;;;14784:14;;533:829:127;;14784:14:280;;-1:-1:-1;533:829:127;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;533:829:127;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;533:829:127;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;533:829:127;14381:32:280;;14132:1;14381:32;533:829:127;14381:32:280;533:829:127;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;10853:1796::-;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;533:829:127;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;533:829:127;;;12409:21:280;;;;;12405:85;;12508:16;;533:829:127;;-1:-1:-1;533:829:127;;;;-1:-1:-1;533:829:127;;;;;12171:472:280;;;;;;;12405:85;533:829:127;12439:51:280;;11116:1;12439:51;533:829:127;12439:51:280;533:829:127;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;533:829:127;11309:13:280;;;;;;:::i;:::-;533:829:127;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;533:829:127;11455:10:280;11451:656;;11277:3;533:829:127;;;;;;;;;12125:25:280;533:829:127;;;;12125:25:280;;533:829:127;11254:9:280;;11451:656;533:829:127;;;;11585:27:280;;;;11581:74;;533:829:127;;;;11729:10:280;;;;;11767:14;;533:829:127;11767:14:280;;533:829:127;-1:-1:-1;533:829:127;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;533:829:127;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;533:829:127;;;;;;11116:1:280;11873:46;11336:61;533:829:127;11365:32:280;;11116:1;11365:32;533:829:127;11365:32:280;533:829:127;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;6693:851::-;;;;533:829:127;;;6808:21:280;;;6804:67;;6908:12;;:19;533:829:127;;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;-1:-1:-1;533:829:127;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;533:829:127;;;;;;7495:42:280;533:829:127;;;;;;;7495:42:280;;6693:851::o;6947:534::-;533:829:127;;;7238:32:280;;;;;7234:112;;7364:19;;;533:829:127;7495:42:280;7364:19;533:829:127;7364:19:280;533:829:127;;;-1:-1:-1;533:829:127;;;;-1:-1:-1;533:829:127;;-1:-1:-1;533:829:127;;;;;-1:-1:-1;533:829:127;;6947:534:280;;;7234:112;533:829:127;;7279:67:280;;;533:829:127;;;;7279:67:280;;;533:829:127;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;533:829:127;6838:33:280;;6827:1;6838:33;533:829:127;6838:33:280;533:829:127;;6827:1:280;6838:33;533:829:127;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;533:829:127;;;;;;:::o;907:917:76:-;533:829:127;1029:19:76;533:829:127;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;1676:74;533:829:127;;;;;;1676:74:76;;;;533:829:127;1676:74:76;;;;;;533:829:127;1327:10:76;533:829:127;;;;1744:4:76;533:829:127;;;;1676:74:76;;;;;;;533:829:127;1676:74:76;;;1630:120;;;;;1676:74;;;;533:829:127;1676:74:76;533:829:127;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;533:829:127;;28229:252:280;;;;533:829:127;28229:252:280;533:829:127;;;;;28357:61:280;;;;;533:829:127;28357:61:280;;533:829:127;28357:61:280;;;533:829:127;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;533:829:127;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;533:829:127;;-1:-1:-1;28445:29:280;28357:61;533:829:127;28357:61:280;;533:829:127;28357:61:280;;;;;;533:829:127;28357:61:280;;;:::i;:::-;;;533:829:127;;;;;;;;;;;;;28357:61:280;533:829:127;28357:61:280;;533:829:127;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2269400","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","allowance(address,address)":"3035","approve(address,uint256)":"infinite","balanceOf(address)":"2663","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","decimals()":"2385","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","increaseAllowance(address,uint256)":"infinite","isTrustedForwarder(address)":"infinite","name()":"infinite","nonces(address)":"2707","owner()":"2627","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferAndCall(address,uint256,bytes)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","increaseAllowance(address,uint256)":"39509351","isTrustedForwarder(address)":"572b6c05","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferAndCall(address,uint256,bytes)":"4000aea0","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"holders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"allocations\",\"type\":\"uint256[]\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/ERC677Mock.sol\":\"ERC677Mock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/ERC677Mock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC677} from \\\"./../../../token/ERC20/interfaces/IERC677.sol\\\";\\nimport {IERC677Receiver} from \\\"./../../../token/ERC20/interfaces/IERC677Receiver.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ERC20FixedSupply} from \\\"./../../../token/ERC20/preset/ERC20FixedSupply.sol\\\";\\n\\ncontract ERC677Mock is ERC20FixedSupply, IERC677 {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using Address for address;\\n\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] memory holders,\\n        uint256[] memory allocations,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20FixedSupply(tokenName, tokenSymbol, tokenDecimals, holders, allocations, forwarderRegistry) {}\\n\\n    function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success) {\\n        address sender = _msgSender();\\n        ERC20Storage.layout().transfer(sender, receiver, amount);\\n        if (!receiver.hasBytecode()) return true;\\n        return IERC677Receiver(receiver).onTokenTransfer(sender, amount, data);\\n    }\\n}\\n\",\"keccak256\":\"0x9927d7ceadc214bc52ae6f6ade708f71f89a7a4b6bdf4bf996d12355cdf5b8a9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC677.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC677 transferAndCall Token Standard, basic interface.\\n/// @dev See https://github.com/ethereum/EIPs/issues/677\\ninterface IERC677 {\\n    function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xed79ca04cc24f42596c4c6fcfa3e3add4cdef9302015b0e5e3f3ede7c4956671\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC677Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC677 transferAndCall Token Standard, receiver interface.\\n/// @dev See https://github.com/ethereum/EIPs/issues/677\\ninterface IERC677Receiver {\\n    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool success);\\n}\\n\",\"keccak256\":\"0x6622734f4dd330da397e8c05807073796a15024c82105e014ee5920dc29fa968\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/ERC20FixedSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20} from \\\"./../ERC20.sol\\\";\\nimport {ERC20Detailed} from \\\"./../ERC20Detailed.sol\\\";\\nimport {ERC20Metadata} from \\\"./../ERC20Metadata.sol\\\";\\nimport {ERC20Permit} from \\\"./../ERC20Permit.sol\\\";\\nimport {ERC20SafeTransfers} from \\\"./../ERC20SafeTransfers.sol\\\";\\nimport {ERC20BatchTransfers} from \\\"./../ERC20BatchTransfers.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).\\ncontract ERC20FixedSupply is\\n    ERC20,\\n    ERC20Detailed,\\n    ERC20Metadata,\\n    ERC20Permit,\\n    ERC20SafeTransfers,\\n    ERC20BatchTransfers,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] memory holders,\\n        uint256[] memory allocations,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {\\n        ERC20Storage.layout().batchMint(holders, allocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1944f12c439c1942890c32c0d12723dd7e2b65076072b3383d33f21bbfa9dee7\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol":{"ERC20BatchTransfersFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20BatchTransfersStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"initERC20BatchTransfersStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610ece38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610e4590816100898239608051818181610b990152610cfb0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146102fd5780634885b2541461023757806388d695b2146101875763c30f1be11461004857600080fd5b346101825760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825761007f610ce4565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610155577fc05327e6000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101825760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825760043567ffffffffffffffff8111610182576101d6903690600401610380565b6024359167ffffffffffffffff8311610182576101fa61022c933690600401610380565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610226610ce4565b90610899565b602060405160018152f35b346101825760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825760043573ffffffffffffffffffffffffffffffffffffffff811681036101825760243567ffffffffffffffff8111610182576102a6903690600401610380565b916044359267ffffffffffffffff8411610182576102cb61022c943690600401610380565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102f7610ce4565b90610411565b346101825760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610182576040610336610b82565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b91908110156103c15760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036101825790565b94909291959384810361086f5780156108665773ffffffffffffffffffffffffffffffffffffffff8716600052856020526040600020549160009560009260005b8181106105dd575050505050505073ffffffffffffffffffffffffffffffffffffffff809116931691838303610489575b50505050565b83156105af576001018260005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415806105a6575b610512575b505060207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591604051908152a338808080610483565b80830392808410156105635750507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591602091846000528252604060002085600052825280604060002055916104dc565b608491859187604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508015156104d7565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff61060561060083858b6103b1565b6103f0565b168015610822576106178285876103b1565b358c816106e2575b907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff6020949316938492604051908152a3891515806106d8575b61067c575b50600101610452565b89870390878210156106a257600090815260208c90526040902090860190556001610673565b878b917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858a141561066e565b50998a8101908111156107f857998c8c73ffffffffffffffffffffffffffffffffffffffff821684811461076a575073ffffffffffffffffffffffffffffffffffffffff602094939260407fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936000908782528852208481540190555b92939450505061061f565b915050888293949596979892116107c25750810195949392916020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8f61075f565b8891507fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff8c7f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361086f578415610af25773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061098b57505050505080151580610981575b6108fa575b5050505050565b808503948086101561093757505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806108f3565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156108ee565b73ffffffffffffffffffffffffffffffffffffffff6109ae6106008385896103b1565b168015610aae576109c08285876103b1565b3580610a14575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a3016108d9565b96878101908111156107f8579673ffffffffffffffffffffffffffffffffffffffff8916828114610a6157509060019291604060008381528c602052208181540190555b909192506109c7565b8c829c9211610a785750908a60019392019a610a58565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b3b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610182575180151581036101825790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610cd2573233148015610cda575b610cd257803314908115610c15575b50610be4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101825760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610cc657600091610c97575b5038610bd8565b610cb9915060203d602011610cbf575b610cb18183610afa565b810190610b6a565b38610c90565b503d610ca7565b6040513d6000823e3d90fd5b506000903690565b5060183610610bc9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e00573233148015610e05575b610e00577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d6f575b50610d6c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610cc657600091610de1575b5038610d62565b610dfa915060203d602011610cbf57610cb18183610afa565b38610dda565b503390565b5060183610610d2b56fea2646970667358221220c9fb5c5cd5c5e8578066cad4b6979e3671f1d7688b40fe1eaa11931032553e5b64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xECE CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xE45 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xB99 ADD MSTORE PUSH2 0xCFB ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x187 JUMPI PUSH4 0xC30F1BE1 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH2 0x7F PUSH2 0xCE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x155 JUMPI PUSH32 0xC05327E600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x182 JUMPI PUSH2 0x1D6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x182 JUMPI PUSH2 0x1FA PUSH2 0x22C SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x226 PUSH2 0xCE4 JUMP JUMPDEST SWAP1 PUSH2 0x899 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x182 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x182 JUMPI PUSH2 0x2A6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x182 JUMPI PUSH2 0x2CB PUSH2 0x22C SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2F7 PUSH2 0xCE4 JUMP JUMPDEST SWAP1 PUSH2 0x411 JUMP JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x40 PUSH2 0x336 PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x182 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x182 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x182 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3C1 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x182 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP1 SWAP3 SWAP2 SWAP6 SWAP4 DUP5 DUP2 SUB PUSH2 0x86F JUMPI DUP1 ISZERO PUSH2 0x866 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x5DD JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP4 AND SWAP2 DUP4 DUP4 SUB PUSH2 0x489 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP4 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x1 ADD DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x5A6 JUMPI JUMPDEST PUSH2 0x512 JUMPI JUMPDEST POP POP PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x483 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x563 JUMPI POP POP PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x20 SWAP2 DUP5 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP2 PUSH2 0x4DC JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x4D7 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x605 PUSH2 0x600 DUP4 DUP6 DUP12 PUSH2 0x3B1 JUMP JUMPDEST PUSH2 0x3F0 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x822 JUMPI PUSH2 0x617 DUP3 DUP6 DUP8 PUSH2 0x3B1 JUMP JUMPDEST CALLDATALOAD DUP13 DUP2 PUSH2 0x6E2 JUMPI JUMPDEST SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP10 ISZERO ISZERO DUP1 PUSH2 0x6D8 JUMPI JUMPDEST PUSH2 0x67C JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x452 JUMP JUMPDEST DUP10 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x6A2 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP13 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x673 JUMP JUMPDEST DUP8 DUP12 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP11 EQ ISZERO PUSH2 0x66E JUMP JUMPDEST POP SWAP10 DUP11 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x7F8 JUMPI SWAP10 DUP13 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP5 DUP2 EQ PUSH2 0x76A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 SWAP3 PUSH1 0x40 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP4 PUSH1 0x0 SWAP1 DUP8 DUP3 MSTORE DUP9 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP3 SWAP4 SWAP5 POP POP POP PUSH2 0x61F JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 SWAP4 SWAP5 SWAP6 SWAP7 SWAP8 SWAP9 SWAP3 GT PUSH2 0x7C2 JUMPI POP DUP2 ADD SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP16 PUSH2 0x75F JUMP JUMPDEST DUP9 SWAP2 POP PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x86F JUMPI DUP5 ISZERO PUSH2 0xAF2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x98B JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x981 JUMPI JUMPDEST PUSH2 0x8FA JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x937 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x8F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x8EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9AE PUSH2 0x600 DUP4 DUP6 DUP10 PUSH2 0x3B1 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0xAAE JUMPI PUSH2 0x9C0 DUP3 DUP6 DUP8 PUSH2 0x3B1 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0xA14 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x8D9 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x7F8 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0xA61 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x9C7 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0xA78 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0xA58 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xB3B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x182 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x182 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCD2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCDA JUMPI JUMPDEST PUSH2 0xCD2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC15 JUMPI JUMPDEST POP PUSH2 0xBE4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x182 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC97 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBD8 JUMP JUMPDEST PUSH2 0xCB9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCBF JUMPI JUMPDEST PUSH2 0xCB1 DUP2 DUP4 PUSH2 0xAFA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST CODESIZE PUSH2 0xC90 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCA7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBC9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE00 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE05 JUMPI JUMPDEST PUSH2 0xE00 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD6F JUMPI JUMPDEST POP PUSH2 0xD6C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDE1 JUMPI JUMPDEST POP CODESIZE PUSH2 0xD62 JUMP JUMPDEST PUSH2 0xDFA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCBF JUMPI PUSH2 0xCB1 DUP2 DUP4 PUSH2 0xAFA JUMP JUMPDEST CODESIZE PUSH2 0xDDA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD2B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC9 EXTSTATICCALL TLOAD TLOAD 0xD5 0xC5 0xE8 JUMPI DUP1 PUSH7 0xCAD4B6979E3671 CALL 0xD7 PUSH9 0x8B40FE1EAA11931032 SSTORE RETURNDATACOPY JUMPDEST PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"253:270:128:-:0;;;;;;;;;;;;;-1:-1:-1;;253:270:128;;;;-1:-1:-1;;;;;253:270:128;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;253:270:128;;;;;;745:39:76;;253:270:128;;;;;;;;745:39:76;253:270:128;;;;;;;;;;;;-1:-1:-1;253:270:128;;;;;;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":896,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":2922,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":945,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":2810,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchTransfer":{"entryPoint":2201,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":1041,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_msgData":{"entryPoint":2946,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3300,"id":13231,"parameterSlots":0,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":1008,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2969},{"length":32,"start":3323}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146102fd5780634885b2541461023757806388d695b2146101875763c30f1be11461004857600080fd5b346101825760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825761007f610ce4565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610155577fc05327e6000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101825760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825760043567ffffffffffffffff8111610182576101d6903690600401610380565b6024359167ffffffffffffffff8311610182576101fa61022c933690600401610380565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610226610ce4565b90610899565b602060405160018152f35b346101825760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101825760043573ffffffffffffffffffffffffffffffffffffffff811681036101825760243567ffffffffffffffff8111610182576102a6903690600401610380565b916044359267ffffffffffffffff8411610182576102cb61022c943690600401610380565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102f7610ce4565b90610411565b346101825760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610182576040610336610b82565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b91908110156103c15760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036101825790565b94909291959384810361086f5780156108665773ffffffffffffffffffffffffffffffffffffffff8716600052856020526040600020549160009560009260005b8181106105dd575050505050505073ffffffffffffffffffffffffffffffffffffffff809116931691838303610489575b50505050565b83156105af576001018260005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415806105a6575b610512575b505060207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591604051908152a338808080610483565b80830392808410156105635750507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591602091846000528252604060002085600052825280604060002055916104dc565b608491859187604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508015156104d7565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff61060561060083858b6103b1565b6103f0565b168015610822576106178285876103b1565b358c816106e2575b907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff6020949316938492604051908152a3891515806106d8575b61067c575b50600101610452565b89870390878210156106a257600090815260208c90526040902090860190556001610673565b878b917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858a141561066e565b50998a8101908111156107f857998c8c73ffffffffffffffffffffffffffffffffffffffff821684811461076a575073ffffffffffffffffffffffffffffffffffffffff602094939260407fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936000908782528852208481540190555b92939450505061061f565b915050888293949596979892116107c25750810195949392916020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8f61075f565b8891507fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff8c7f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361086f578415610af25773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061098b57505050505080151580610981575b6108fa575b5050505050565b808503948086101561093757505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806108f3565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156108ee565b73ffffffffffffffffffffffffffffffffffffffff6109ae6106008385896103b1565b168015610aae576109c08285876103b1565b3580610a14575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a3016108d9565b96878101908111156107f8579673ffffffffffffffffffffffffffffffffffffffff8916828114610a6157509060019291604060008381528c602052208181540190555b909192506109c7565b8c829c9211610a785750908a60019392019a610a58565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b3b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610182575180151581036101825790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610cd2573233148015610cda575b610cd257803314908115610c15575b50610be4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101825760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610cc657600091610c97575b5038610bd8565b610cb9915060203d602011610cbf575b610cb18183610afa565b810190610b6a565b38610c90565b503d610ca7565b6040513d6000823e3d90fd5b506000903690565b5060183610610bc9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e00573233148015610e05575b610e00577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d6f575b50610d6c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610cc657600091610de1575b5038610d62565b610dfa915060203d602011610cbf57610cb18183610afa565b38610dda565b503390565b5060183610610d2b56fea2646970667358221220c9fb5c5cd5c5e8578066cad4b6979e3671f1d7688b40fe1eaa11931032553e5b64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x187 JUMPI PUSH4 0xC30F1BE1 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH2 0x7F PUSH2 0xCE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x155 JUMPI PUSH32 0xC05327E600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x182 JUMPI PUSH2 0x1D6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x182 JUMPI PUSH2 0x1FA PUSH2 0x22C SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x226 PUSH2 0xCE4 JUMP JUMPDEST SWAP1 PUSH2 0x899 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x182 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x182 JUMPI PUSH2 0x2A6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x182 JUMPI PUSH2 0x2CB PUSH2 0x22C SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x380 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2F7 PUSH2 0xCE4 JUMP JUMPDEST SWAP1 PUSH2 0x411 JUMP JUMPDEST CALLVALUE PUSH2 0x182 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x182 JUMPI PUSH1 0x40 PUSH2 0x336 PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x182 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x182 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x182 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3C1 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x182 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP1 SWAP3 SWAP2 SWAP6 SWAP4 DUP5 DUP2 SUB PUSH2 0x86F JUMPI DUP1 ISZERO PUSH2 0x866 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x5DD JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP4 AND SWAP2 DUP4 DUP4 SUB PUSH2 0x489 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP4 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x1 ADD DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x5A6 JUMPI JUMPDEST PUSH2 0x512 JUMPI JUMPDEST POP POP PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x483 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x563 JUMPI POP POP PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x20 SWAP2 DUP5 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP2 PUSH2 0x4DC JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x4D7 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x605 PUSH2 0x600 DUP4 DUP6 DUP12 PUSH2 0x3B1 JUMP JUMPDEST PUSH2 0x3F0 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x822 JUMPI PUSH2 0x617 DUP3 DUP6 DUP8 PUSH2 0x3B1 JUMP JUMPDEST CALLDATALOAD DUP13 DUP2 PUSH2 0x6E2 JUMPI JUMPDEST SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP10 ISZERO ISZERO DUP1 PUSH2 0x6D8 JUMPI JUMPDEST PUSH2 0x67C JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x452 JUMP JUMPDEST DUP10 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x6A2 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP13 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x673 JUMP JUMPDEST DUP8 DUP12 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP11 EQ ISZERO PUSH2 0x66E JUMP JUMPDEST POP SWAP10 DUP11 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x7F8 JUMPI SWAP10 DUP13 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP5 DUP2 EQ PUSH2 0x76A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 SWAP3 PUSH1 0x40 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP4 PUSH1 0x0 SWAP1 DUP8 DUP3 MSTORE DUP9 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP3 SWAP4 SWAP5 POP POP POP PUSH2 0x61F JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 SWAP4 SWAP5 SWAP6 SWAP7 SWAP8 SWAP9 SWAP3 GT PUSH2 0x7C2 JUMPI POP DUP2 ADD SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP16 PUSH2 0x75F JUMP JUMPDEST DUP9 SWAP2 POP PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x86F JUMPI DUP5 ISZERO PUSH2 0xAF2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x98B JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x981 JUMPI JUMPDEST PUSH2 0x8FA JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x937 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x8F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x8EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9AE PUSH2 0x600 DUP4 DUP6 DUP10 PUSH2 0x3B1 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0xAAE JUMPI PUSH2 0x9C0 DUP3 DUP6 DUP8 PUSH2 0x3B1 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0xA14 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x8D9 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x7F8 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0xA61 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x9C7 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0xA78 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0xA58 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xB3B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x182 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x182 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCD2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCDA JUMPI JUMPDEST PUSH2 0xCD2 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC15 JUMPI JUMPDEST POP PUSH2 0xBE4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x182 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC97 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBD8 JUMP JUMPDEST PUSH2 0xCB9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCBF JUMPI JUMPDEST PUSH2 0xCB1 DUP2 DUP4 PUSH2 0xAFA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST CODESIZE PUSH2 0xC90 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCA7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBC9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE00 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE05 JUMPI JUMPDEST PUSH2 0xE00 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD6F JUMPI JUMPDEST POP PUSH2 0xD6C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDE1 JUMPI JUMPDEST POP CODESIZE PUSH2 0xD62 JUMP JUMPDEST PUSH2 0xDFA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCBF JUMPI PUSH2 0xCB1 DUP2 DUP4 PUSH2 0xAFA JUMP JUMPDEST CODESIZE PUSH2 0xDDA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD2B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC9 EXTSTATICCALL TLOAD TLOAD 0xD5 0xC5 0xE8 JUMPI DUP1 PUSH7 0xCAD4B6979E3671 CALL 0xD7 PUSH9 0x8B40FE1EAA11931032 SSTORE RETURNDATACOPY JUMPDEST PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"253:270:128:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1640:41:257;;:::i;:::-;253:270:128;;;;;;;3174:18:180;;;3170:53;;3173:38:280;253:270:128;500:10:59;253:270:128;500:10:59;;;;;;;636:1:180;500:10:59;;;253:270:128;3170:53:180;3201:22;253:270:128;3201:22:180;253:270:128;;;;3201:22:180;253:270:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;875:6:243;253:270:128;;;;;;:::i;:::-;27705:19:280;;;253:270:128;1640:41:257;;:::i;:::-;875:6:243;;:::i;:::-;253:270:128;;;899:4:243;253:270:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;253:270:128;;;;;;:::i;:::-;27705:19:280;;;253:270:128;1640:41:257;;:::i;:::-;1170:6:243;;:::i;253:270:128:-;;;;;;;;;;;;1875:39:257;;:::i;:::-;253:270:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;253:270:128;;;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;253:270:128;;;;;;;;;;;;;15707:14:280;;;;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;6808:21;;6804:67;;253:270:128;6908:12:280;253:270:128;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128;;-1:-1:-1;253:270:128;;;;-1:-1:-1;253:270:128;;6951:37:280;6971:17;6951:37;;;:51;;;15703:90;6947:534;;15703:90;253:270:128;;;7495:42:280;253:270:128;;;;;;7495:42:280;15703:90;;;;;;6947:534;253:270:128;;;7238:32:280;;;;;7234:112;;7364:19;;7495:42;7364:19;253:270:128;7364:19:280;253:270:128;-1:-1:-1;253:270:128;;;;-1:-1:-1;253:270:128;;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128;;6947:534:280;;;7234:112;7279:67;253:270:128;;;;;;7279:67:280;;;;;;;253:270:128;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;6838:33;;14132:1;6838:33;;253:270:128;;14132:1:280;6838:33;14293:3;253:270:128;14325:13:280;;;;;;:::i;:::-;;:::i;:::-;253:270:128;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;253:270:128;14472:10:280;;14468:656;;14293:3;253:270:128;15143:25:280;253:270:128;;;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;253:270:128;;14270:9:280;;15183:500;253:270:128;;;15437:21:280;;;;;15433:85;;-1:-1:-1;253:270:128;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;253:270:128;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;253:270:128;;;;;14602:27:280;;;;14598:74;;253:270:128;;;;;;14746:10:280;;;;;14784:14;253:270:128;;14784:14:280;;;253:270:128;15143:25:280;14784:14;-1:-1:-1;253:270:128;;;;;;;;;;;;;14742:350:280;14468:656;;;;;;;;14742:350;14866:15;;;;;;;;;;;;;14862:74;;-1:-1:-1;253:270:128;;;;;;;;;15143:25:280;253:270:128;;14742:350:280;;14862:74;14890:46;;;;14132:1;14890:46;;253:270:128;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;253:270:128;14381:32:280;;14132:1;14381:32;253:270:128;14381:32:280;253:270:128;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;14045:62::-;14081:26;;;;;;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;253:270:128;;;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;253:270:128;;;12409:21:280;;;;;12405:85;;12508:16;;253:270:128;;-1:-1:-1;253:270:128;;;;-1:-1:-1;253:270:128;;;;;12171:472:280;;;;;;;12405:85;253:270:128;12439:51:280;;11116:1;12439:51;253:270:128;12439:51:280;253:270:128;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;253:270:128;11309:13:280;;;;;;:::i;:::-;253:270:128;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;253:270:128;11455:10:280;11451:656;;11277:3;253:270:128;;;;;;;;;12125:25:280;253:270:128;;;;12125:25:280;;253:270:128;11254:9:280;;11451:656;253:270:128;;;;11585:27:280;;;;11581:74;;253:270:128;;;;11729:10:280;;;;;11767:14;;253:270:128;11767:14:280;;253:270:128;-1:-1:-1;253:270:128;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;253:270:128;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;253:270:128;;;;;;11116:1:280;11873:46;11336:61;253:270:128;11365:32:280;;11116:1;11365:32;253:270:128;11365:32:280;253:270:128;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;253:270:128:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;253:270:128;;;;;-1:-1:-1;253:270:128;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;253:270:128;2065:19:76;253:270:128;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;253:270:128;720:8:80;253:270:128;720:8:80;;253:270:128;;;;2115:1:76;2802:32;;:::o;2624:153::-;253:270:128;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;253:270:128;2361:10:76;253:270:128;;;;2771:4:76;253:270:128;;;;;-1:-1:-1;2682:95:76;;253:270:128;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;253:270:128;;;2115:1:76;253:270:128;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;253:270:128;1029:19:76;253:270:128;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;253:270:128;;;1676:74:76;;253:270:128;;;1676:74:76;;;253:270:128;1327:10:76;253:270:128;;;;1744:4:76;253:270:128;;;;;-1:-1:-1;1676:74:76;;253:270:128;;;;;;1676:74:76;;;;;;;253:270:128;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"730600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","initERC20BatchTransfersStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","initERC20BatchTransfersStorage()":"c30f1be1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20BatchTransfersStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"initERC20BatchTransfersStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"initERC20BatchTransfersStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol\":\"ERC20BatchTransfersFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20BatchTransfersFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20BatchTransfersFacet} from \\\"./../../../../token/ERC20/facets/ERC20BatchTransfersFacet.sol\\\";\\n\\ncontract ERC20BatchTransfersFacetMock is ERC20BatchTransfersFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20BatchTransfersFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1158d4f75e0ed8517be17d9570803c240d640d6215764d81e85173ae07d66773\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../base/ERC20BatchTransfersBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20BatchTransfersFacet is ERC20BatchTransfersBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20BatchTransfersStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x08b4875c774ccc3935f876026eaa72b246d0ee773d6e69f974c826b549dfdfa5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"initERC20BatchTransfersStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol":{"ERC20BurnableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"initERC20BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610c7738819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610bee9081610089823960805181818161078e0152610a890152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80631b9a75291461033e57806331e66e1e146102bb57806342966c6814610257578063751ec2d31461011d576379cc67901461005357600080fd5b346101185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760043573ffffffffffffffffffffffffffffffffffffffff8116808203610118576100fb91602435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90836100d6610777565b9173ffffffffffffffffffffffffffffffffffffffff831603610106575b50506105ce565b602060405160018152f35b6101119184846108be565b38836100f4565b600080fd5b346101185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011857610154610777565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361022a577f20c07ed1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610118576100fb6004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102b5610777565b906105ce565b346101185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760406102f4610a72565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760043567ffffffffffffffff81116101185761038d9036906004016103e3565b6024359167ffffffffffffffff8311610118576103b16100fb9336906004016103e3565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6103dd610777565b90610453565b9181601f840112156101185782359167ffffffffffffffff8311610118576020808501948460051b01011161011857565b91908110156104245760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b939092948086036105a457851561059c5760009560005b81811061048b5750505050505081610480575050565b600201908154039055565b610496818387610414565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610118576104c1838688610414565b3590818973ffffffffffffffffffffffffffffffffffffffff8116850361058a575b509050610522575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a30161046a565b98604060008381528a60205220548a810390808210156105545750600083815260208b905260409020558901986104eb565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610594928c6108be565b3881896104e3565b505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b8261061c575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156106a3575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6105d4565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761073057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610118575180151581036101185790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108af5732331480156108b4575b6108af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610802575b506107ff57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108a357600091610874575b50386107f5565b610896915060203d60201161089c575b61088e81836106ef565b81019061075f565b3861086d565b503d610884565b6040513d6000823e3d90fd5b503390565b50601836106107be565b92909173ffffffffffffffffffffffffffffffffffffffff16928315610a2e5760010173ffffffffffffffffffffffffffffffffffffffff831660005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141580610a25575b610988575b505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80830392808410156109cc57505073ffffffffffffffffffffffffffffffffffffffff83811660009081526020928352604080822087835284529020839055610941565b60849185918773ffffffffffffffffffffffffffffffffffffffff604051947f137ad6ab000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b5080151561093c565b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba6573233148015610bae575b610ba657803314908115610b05575b50610ad4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156108a357600091610b87575b5038610ac8565b610ba0915060203d60201161089c5761088e81836106ef565b38610b80565b506000903690565b5060183610610ab956fea26469706673582212202a15d08de1c97543cad52ce44b16b09a42600ed19261035499efa46bc037cd7364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xC77 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xBEE SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x78E ADD MSTORE PUSH2 0xA89 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x33E JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0x751EC2D3 EQ PUSH2 0x11D JUMPI PUSH4 0x79CC6790 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x118 JUMPI PUSH2 0xFB SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 DUP4 PUSH2 0xD6 PUSH2 0x777 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x106 JUMPI JUMPDEST POP POP PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x111 SWAP2 DUP5 DUP5 PUSH2 0x8BE JUMP JUMPDEST CODESIZE DUP4 PUSH2 0xF4 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH2 0x154 PUSH2 0x777 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x22A JUMPI PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH2 0xFB PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B5 PUSH2 0x777 JUMP JUMPDEST SWAP1 PUSH2 0x5CE JUMP JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x40 PUSH2 0x2F4 PUSH2 0xA72 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x118 JUMPI PUSH2 0x38D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3E3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x118 JUMPI PUSH2 0x3B1 PUSH2 0xFB SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x3DD PUSH2 0x777 JUMP JUMPDEST SWAP1 PUSH2 0x453 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x118 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x118 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x118 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x424 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP4 SWAP1 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x5A4 JUMPI DUP6 ISZERO PUSH2 0x59C JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x48B JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x480 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x496 DUP2 DUP4 DUP8 PUSH2 0x414 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x118 JUMPI PUSH2 0x4C1 DUP4 DUP7 DUP9 PUSH2 0x414 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x58A JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x522 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x46A JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x554 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x4EB JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x594 SWAP3 DUP13 PUSH2 0x8BE JUMP JUMPDEST CODESIZE DUP2 DUP10 PUSH2 0x4E3 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x61C JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x6A3 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x5D4 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x730 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x118 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x118 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8AF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8B4 JUMPI JUMPDEST PUSH2 0x8AF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI JUMPDEST POP PUSH2 0x7FF JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x874 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x896 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x89C JUMPI JUMPDEST PUSH2 0x88E DUP2 DUP4 PUSH2 0x6EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x75F JUMP JUMPDEST CODESIZE PUSH2 0x86D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x884 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7BE JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xA2E JUMPI PUSH1 0x1 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0xA25 JUMPI JUMPDEST PUSH2 0x988 JUMPI JUMPDEST POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x9CC JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP8 DUP4 MSTORE DUP5 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x941 JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x93C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBAE JUMPI JUMPDEST PUSH2 0xBA6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB05 JUMPI JUMPDEST POP PUSH2 0xAD4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x118 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB87 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAC8 JUMP JUMPDEST PUSH2 0xBA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x89C JUMPI PUSH2 0x88E DUP2 DUP4 PUSH2 0x6EF JUMP JUMPDEST CODESIZE PUSH2 0xB80 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2A ISZERO 0xD0 DUP14 RJUMPI 0xC975 NUMBER 0xCA 0xD5 0x2C RETF 0x4B AND 0xB0 SWAP11 TIMESTAMP PUSH1 0xE DATALOADN 0x9261 SUB SLOAD SWAP10 0xEF LOG4 PUSH12 0xC037CD7364736F6C63430008 0x1E STOP CALLER ","sourceMap":"241:252:129:-:0;;;;;;;;;;;;;-1:-1:-1;;241:252:129;;;;-1:-1:-1;;;;;241:252:129;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;241:252:129;;;;;;745:39:76;;241:252:129;;;;;;;;745:39:76;241:252:129;;;;;;;;;;;;-1:-1:-1;241:252:129;;;;;;-1:-1:-1;241:252:129;;;;;-1:-1:-1;241:252:129"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":995,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":1887,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":1044,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":1775,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchBurnFrom":{"entryPoint":1107,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_burn":{"entryPoint":1486,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":2238,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_msgData":{"entryPoint":2674,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1911,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1934},{"length":32,"start":2697}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80631b9a75291461033e57806331e66e1e146102bb57806342966c6814610257578063751ec2d31461011d576379cc67901461005357600080fd5b346101185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760043573ffffffffffffffffffffffffffffffffffffffff8116808203610118576100fb91602435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90836100d6610777565b9173ffffffffffffffffffffffffffffffffffffffff831603610106575b50506105ce565b602060405160018152f35b6101119184846108be565b38836100f4565b600080fd5b346101185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011857610154610777565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361022a577f20c07ed1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101185760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610118576100fb6004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102b5610777565b906105ce565b346101185760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760406102f4610a72565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101185760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101185760043567ffffffffffffffff81116101185761038d9036906004016103e3565b6024359167ffffffffffffffff8311610118576103b16100fb9336906004016103e3565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6103dd610777565b90610453565b9181601f840112156101185782359167ffffffffffffffff8311610118576020808501948460051b01011161011857565b91908110156104245760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b939092948086036105a457851561059c5760009560005b81811061048b5750505050505081610480575050565b600201908154039055565b610496818387610414565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610118576104c1838688610414565b3590818973ffffffffffffffffffffffffffffffffffffffff8116850361058a575b509050610522575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a30161046a565b98604060008381528a60205220548a810390808210156105545750600083815260208b905260409020558901986104eb565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610594928c6108be565b3881896104e3565b505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b8261061c575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156106a3575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6105d4565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761073057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610118575180151581036101185790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108af5732331480156108b4575b6108af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610802575b506107ff57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108a357600091610874575b50386107f5565b610896915060203d60201161089c575b61088e81836106ef565b81019061075f565b3861086d565b503d610884565b6040513d6000823e3d90fd5b503390565b50601836106107be565b92909173ffffffffffffffffffffffffffffffffffffffff16928315610a2e5760010173ffffffffffffffffffffffffffffffffffffffff831660005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141580610a25575b610988575b505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80830392808410156109cc57505073ffffffffffffffffffffffffffffffffffffffff83811660009081526020928352604080822087835284529020839055610941565b60849185918773ffffffffffffffffffffffffffffffffffffffff604051947f137ad6ab000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b5080151561093c565b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba6573233148015610bae575b610ba657803314908115610b05575b50610ad4576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101185760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156108a357600091610b87575b5038610ac8565b610ba0915060203d60201161089c5761088e81836106ef565b38610b80565b506000903690565b5060183610610ab956fea26469706673582212202a15d08de1c97543cad52ce44b16b09a42600ed19261035499efa46bc037cd7364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x33E JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x257 JUMPI DUP1 PUSH4 0x751EC2D3 EQ PUSH2 0x11D JUMPI PUSH4 0x79CC6790 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x118 JUMPI PUSH2 0xFB SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 DUP4 PUSH2 0xD6 PUSH2 0x777 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x106 JUMPI JUMPDEST POP POP PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x111 SWAP2 DUP5 DUP5 PUSH2 0x8BE JUMP JUMPDEST CODESIZE DUP4 PUSH2 0xF4 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH2 0x154 PUSH2 0x777 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x22A JUMPI PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH2 0xFB PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B5 PUSH2 0x777 JUMP JUMPDEST SWAP1 PUSH2 0x5CE JUMP JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x40 PUSH2 0x2F4 PUSH2 0xA72 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x118 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x118 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x118 JUMPI PUSH2 0x38D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3E3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x118 JUMPI PUSH2 0x3B1 PUSH2 0xFB SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x3DD PUSH2 0x777 JUMP JUMPDEST SWAP1 PUSH2 0x453 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x118 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x118 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x118 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x424 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP4 SWAP1 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x5A4 JUMPI DUP6 ISZERO PUSH2 0x59C JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x48B JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x480 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x496 DUP2 DUP4 DUP8 PUSH2 0x414 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x118 JUMPI PUSH2 0x4C1 DUP4 DUP7 DUP9 PUSH2 0x414 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x58A JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x522 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x46A JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x554 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x4EB JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x594 SWAP3 DUP13 PUSH2 0x8BE JUMP JUMPDEST CODESIZE DUP2 DUP10 PUSH2 0x4E3 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x61C JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x6A3 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x5D4 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x730 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x118 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x118 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8AF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8B4 JUMPI JUMPDEST PUSH2 0x8AF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI JUMPDEST POP PUSH2 0x7FF JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x874 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7F5 JUMP JUMPDEST PUSH2 0x896 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x89C JUMPI JUMPDEST PUSH2 0x88E DUP2 DUP4 PUSH2 0x6EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x75F JUMP JUMPDEST CODESIZE PUSH2 0x86D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x884 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7BE JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xA2E JUMPI PUSH1 0x1 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0xA25 JUMPI JUMPDEST PUSH2 0x988 JUMPI JUMPDEST POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x9CC JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP8 DUP4 MSTORE DUP5 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x941 JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x93C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBAE JUMPI JUMPDEST PUSH2 0xBA6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB05 JUMPI JUMPDEST POP PUSH2 0xAD4 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x118 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB87 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAC8 JUMP JUMPDEST PUSH2 0xBA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x89C JUMPI PUSH2 0x88E DUP2 DUP4 PUSH2 0x6EF JUMP JUMPDEST CODESIZE PUSH2 0xB80 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2A ISZERO 0xD0 DUP14 RJUMPI 0xC975 NUMBER 0xCA 0xD5 0x2C RETF 0x4B AND 0xB0 SWAP11 TIMESTAMP PUSH1 0xE DATALOADN 0x9261 SUB SLOAD SWAP10 0xEF LOG4 PUSH12 0xC037CD7364736F6C63430008 0x1E STOP CALLER ","sourceMap":"241:252:129:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24144:5:280;241:252:129;;;27705:19:280;241:252:129;1591:41:258;;;;:::i;:::-;241:252:129;;;;24041:14:280;24037:85;;241:252:129;24144:5:280;;;:::i;:::-;241:252:129;;;;;;;24037:85:280;24105:5;;;;;:::i;:::-;24037:85;;;;241:252:129;;;;;;;;;;;;;;;1591:41:258;;:::i;:::-;241:252:129;;;;;;;3174:18:180;;;3170:53;;3920:32:280;241:252:129;500:10:59;241:252:129;500:10:59;;;;;;;636:1:180;500:10:59;;;241:252:129;3170:53:180;3201:22;241:252:129;3201:22:180;241:252:129;;;;3201:22:180;241:252:129;;;;;;;;;;;765:5:244;241:252:129;;;1591:41:258;;:::i;:::-;765:5:244;;:::i;241:252:129:-;;;;;;;;;;;;1826:39:258;;:::i;:::-;241:252:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1232:6:244;241:252:129;;;;;;:::i;:::-;27705:19:280;;;241:252:129;1591:41:258;;:::i;:::-;1232:6:244;;:::i;241:252:129:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;25152:1242:280;;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;241:252:129;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;:::i;:::-;241:252:129;;;;;;;;;;25558:9:280;;;;;:::i;:::-;241:252:129;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;241:252:129;;;26163:33:280;241:252:129;25409:1:280;241:252:129;;;;;;26163:33:280;241:252:129;25462:9:280;;25689:455;25741:16;241:252:129;-1:-1:-1;241:252:129;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;241:252:129;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;241:252:129;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;25322:62::-;25358:26;;;;;;22659:524;22743:10;22739:389;;22659:524;241:252:129;;23143:33:280;241:252:129;;22752:1:280;241:252:129;;;;;;;23143:33:280;;22659:524::o;22739:389::-;241:252:129;;;-1:-1:-1;241:252:129;;;;;-1:-1:-1;241:252:129;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;241:252:129;;;22752:1:280;241:252:129;;;;;;;;;;;23044:8:280;;241:252:129;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;241:252:129;22933:46:280;;22752:1;22933:46;241:252:129;22933:46:280;241:252:129;;;;;;22752:1:280;22933:46;241:252:129;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;241:252:129;;;;;-1:-1:-1;241:252:129;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;241:252:129;1029:19:76;241:252:129;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;241:252:129;;;1676:74:76;;241:252:129;;;1676:74:76;;;241:252:129;1327:10:76;241:252:129;;;;1744:4:76;241:252:129;;;;;-1:-1:-1;1676:74:76;;241:252:129;;;;;;1676:74:76;;;;;;;241:252:129;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;241:252:129;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;6693:851:280;;;;241:252:129;;6808:21:280;;;6804:67;;6908:12;;241:252:129;;;-1:-1:-1;241:252:129;;;;;-1:-1:-1;241:252:129;;-1:-1:-1;241:252:129;;;;-1:-1:-1;241:252:129;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;241:252:129;;;;;7495:42:280;241:252:129;;;;;;;7495:42:280;;6693:851::o;6947:534::-;241:252:129;;;7238:32:280;;;;;7234:112;;-1:-1:-1;;241:252:129;;;;-1:-1:-1;241:252:129;;;;;;;;;;;;;;;;;;;;;6947:534:280;;7234:112;7279:67;241:252:129;;;;;;;7279:67:280;;;;241:252:129;7279:67:280;;;241:252:129;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;241:252:129;6838:33:280;;6827:1;6838:33;241:252:129;6838:33:280;241:252:129;;6827:1:280;6838:33;1938:939:76;241:252:129;2065:19:76;241:252:129;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;241:252:129;720:8:80;241:252:129;720:8:80;;241:252:129;;;;2115:1:76;2802:32;;:::o;2624:153::-;241:252:129;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;241:252:129;2361:10:76;241:252:129;;;;2771:4:76;241:252:129;;;;;-1:-1:-1;2682:95:76;;241:252:129;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"610800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchBurnFrom(address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","initERC20BurnableStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchBurnFrom(address[],uint256[])":"1b9a7529","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","initERC20BurnableStorage()":"751ec2d3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"initERC20BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"initERC20BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol\":\"ERC20BurnableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20BurnableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20BurnableFacet} from \\\"./../../../../token/ERC20/facets/ERC20BurnableFacet.sol\\\";\\n\\ncontract ERC20BurnableFacetMock is ERC20BurnableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20BurnableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x885ff6f6e9ed4e5c99348062f8620d8551d4cbe3e0369d2e5058d5d83edd03eb\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./../base/ERC20BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20BurnableFacet is ERC20BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xdcb63788435fc859e6c25ecaf185c86e9b63f25937be03eb3e8f381a2ecc8407\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"initERC20BurnableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Burnable."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol":{"ERC20DetailedFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"initERC20DetailedStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"initERC20DetailedStorage(string,string,uint8)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"tokenDecimals":"The token decimals.","tokenName":"The token name.","tokenSymbol":"The token symbol."}},"name()":{"returns":{"_0":"The name of the token."}},"symbol()":{"returns":{"_0":"The symbol of the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610da038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610d1790816100898239608051818181610a6b0152610bcd0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146107f5578063313ce5671461079757806331e66e1e1461071457806395d89b41146106a95763ef9612791461005357600080fd5b346106a45760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a45760043567ffffffffffffffff81116106a4576100a29036906004016108b8565b60243567ffffffffffffffff81116106a4576100c29036906004016108b8565b90926044359260ff84168094036106a4576100db610bb6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361067757507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81917fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb74546001811015610645575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116105165781906101ab84546108e6565b601f81116105f2575b50600090601f831160011461055057600092610545575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610516576102367f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82546108e6565b601f8111610492575b506000601f82116001146103975781929360009261038c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a025000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590503880610258565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b86811061047a5750836001959610610442575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556102aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610415565b90926020600181928686013581550194019101610402565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c8101916020841061050c575b601f0160051c01905b818110610500575061023f565b600081556001016104f3565b90915081906104ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101cb565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105da57509084600195949392106105a2575b505050811b0190556101fd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610595565b9193602060018192878701358155019501920161057f565b909150836000526020600020601f840160051c8101916020851061063b575b90601f859493920160051c01905b81811061062c57506101b4565b6000815584935060010161061f565b9091508190610611565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a4576107106107047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8261097a565b60405191829182610850565b0390f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a457604061074d610a54565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a457602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a4576107106107047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8161097a565b9190916020815282519283602083015260005b8481106108a25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610863565b9181601f840112156106a45782359167ffffffffffffffff83116106a457602083818601950101116106a457565b90600182811c9216801561092f575b602083101461090057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108f5565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761051657604052565b906040519182600082549261098e846108e6565b80845293600181169081156109fc57506001146109b5575b506109b392500383610939565b565b90506000929192526020600020906000915b8183106109e05750509060206109b392820101386109a6565b60209193508060019154838589010152019101909184926109c7565b602093506109b39592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386109a6565b908160209103126106a4575180151581036106a45790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba4573233148015610bac575b610ba457803314908115610ae7575b50610ab6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116106a45760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610b9857600091610b69575b5038610aaa565b610b8b915060203d602011610b91575b610b838183610939565b810190610a3c565b38610b62565b503d610b79565b6040513d6000823e3d90fd5b506000903690565b5060183610610a9b565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610cd2573233148015610cd7575b610cd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c41575b50610c3e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610b9857600091610cb3575b5038610c34565b610ccc915060203d602011610b9157610b838183610939565b38610cac565b503390565b5060183610610bfd56fea26469706673582212209582b189d02e039e34f1b962ada6100e12bf4fc9bf8eff3625547078213835b564736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xDA0 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD17 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xA6B ADD MSTORE PUSH2 0xBCD ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x797 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x6A9 JUMPI PUSH4 0xEF961279 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A4 JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A4 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8B8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0xFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6A4 JUMPI PUSH2 0xDB PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x677 JUMPI POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP2 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x645 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x516 JUMPI DUP2 SWAP1 PUSH2 0x1AB DUP5 SLOAD PUSH2 0x8E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5F2 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x550 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x545 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x516 JUMPI PUSH2 0x236 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x8E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x492 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x397 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x38C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x258 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x47A JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x442 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x2AA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x415 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x402 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x50C JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x500 JUMPI POP PUSH2 0x23F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4F3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4EA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5DA JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5A2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x1FD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x595 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x57F JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x63B JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x62C JUMPI POP PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x61F JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x611 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH2 0x710 PUSH2 0x704 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x97A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x850 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x40 PUSH2 0x74D PUSH2 0xA54 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH2 0x710 PUSH2 0x704 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x97A JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x8A2 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x863 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6A4 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6A4 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6A4 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x92F JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x900 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8F5 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x516 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x98E DUP5 PUSH2 0x8E6 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x9FC JUMPI POP PUSH1 0x1 EQ PUSH2 0x9B5 JUMPI JUMPDEST POP PUSH2 0x9B3 SWAP3 POP SUB DUP4 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x9E0 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x9B3 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x9C7 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x9B3 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x9A6 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x6A4 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x6A4 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBAC JUMPI JUMPDEST PUSH2 0xBA4 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAE7 JUMPI JUMPDEST POP PUSH2 0xAB6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x6A4 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB98 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB69 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAAA JUMP JUMPDEST PUSH2 0xB8B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB91 JUMPI JUMPDEST PUSH2 0xB83 DUP2 DUP4 PUSH2 0x939 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA3C JUMP JUMPDEST CODESIZE PUSH2 0xB62 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCD2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCD7 JUMPI JUMPDEST PUSH2 0xCD2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC41 JUMPI JUMPDEST POP PUSH2 0xC3E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB98 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB3 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC34 JUMP JUMPDEST PUSH2 0xCCC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB91 JUMPI PUSH2 0xB83 DUP2 DUP4 PUSH2 0x939 JUMP JUMPDEST CODESIZE PUSH2 0xCAC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBFD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP6 DUP3 0xB1 DUP10 0xD0 0x2E SUB SWAP15 CALLVALUE CALL 0xB9 PUSH3 0xADA610 0xE SLT 0xBF 0x4F 0xC9 0xBF DUP15 SELFDESTRUCT CALLDATASIZE 0x25 SLOAD PUSH17 0x78213835B564736F6C634300081E003300 ","sourceMap":"241:252:130:-:0;;;;;;;;;;;;;-1:-1:-1;;241:252:130;;;;-1:-1:-1;;;;;241:252:130;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;241:252:130;;;;;;745:39:76;;241:252:130;;;;;;;;745:39:76;241:252:130;;;;;;;;;;;;-1:-1:-1;241:252:130;;;;;;-1:-1:-1;241:252:130;;;;;-1:-1:-1;241:252:130"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":2620,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":2232,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":2128,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":2426,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":2278,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2361,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2644,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2998,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2667},{"length":32,"start":3021}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde03146107f5578063313ce5671461079757806331e66e1e1461071457806395d89b41146106a95763ef9612791461005357600080fd5b346106a45760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a45760043567ffffffffffffffff81116106a4576100a29036906004016108b8565b60243567ffffffffffffffff81116106a4576100c29036906004016108b8565b90926044359260ff84168094036106a4576100db610bb6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361067757507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81917fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb74546001811015610645575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116105165781906101ab84546108e6565b601f81116105f2575b50600090601f831160011461055057600092610545575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610516576102367f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82546108e6565b601f8111610492575b506000601f82116001146103975781929360009261038c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a025000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590503880610258565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b86811061047a5750836001959610610442575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556102aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610415565b90926020600181928686013581550194019101610402565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c8101916020841061050c575b601f0160051c01905b818110610500575061023f565b600081556001016104f3565b90915081906104ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101cb565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105da57509084600195949392106105a2575b505050811b0190556101fd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610595565b9193602060018192878701358155019501920161057f565b909150836000526020600020601f840160051c8101916020851061063b575b90601f859493920160051c01905b81811061062c57506101b4565b6000815584935060010161061f565b9091508190610611565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a4576107106107047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8261097a565b60405191829182610850565b0390f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a457604061074d610a54565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a457602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346106a45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106a4576107106107047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8161097a565b9190916020815282519283602083015260005b8481106108a25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610863565b9181601f840112156106a45782359167ffffffffffffffff83116106a457602083818601950101116106a457565b90600182811c9216801561092f575b602083101461090057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108f5565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761051657604052565b906040519182600082549261098e846108e6565b80845293600181169081156109fc57506001146109b5575b506109b392500383610939565b565b90506000929192526020600020906000915b8183106109e05750509060206109b392820101386109a6565b60209193508060019154838589010152019101909184926109c7565b602093506109b39592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386109a6565b908160209103126106a4575180151581036106a45790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ba4573233148015610bac575b610ba457803314908115610ae7575b50610ab6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116106a45760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610b9857600091610b69575b5038610aaa565b610b8b915060203d602011610b91575b610b838183610939565b810190610a3c565b38610b62565b503d610b79565b6040513d6000823e3d90fd5b506000903690565b5060183610610a9b565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610cd2573233148015610cd7575b610cd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610c41575b50610c3e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610b9857600091610cb3575b5038610c34565b610ccc915060203d602011610b9157610b838183610939565b38610cac565b503390565b5060183610610bfd56fea26469706673582212209582b189d02e039e34f1b962ada6100e12bf4fc9bf8eff3625547078213835b564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x797 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x6A9 JUMPI PUSH4 0xEF961279 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A4 JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6A4 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x8B8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0xFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6A4 JUMPI PUSH2 0xDB PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x677 JUMPI POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP2 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x645 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x516 JUMPI DUP2 SWAP1 PUSH2 0x1AB DUP5 SLOAD PUSH2 0x8E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5F2 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x550 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x545 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x516 JUMPI PUSH2 0x236 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x8E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x492 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x397 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x38C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x258 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x47A JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x442 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x2AA JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x415 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x402 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x50C JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x500 JUMPI POP PUSH2 0x23F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4F3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4EA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5DA JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5A2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x1FD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x595 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x57F JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x63B JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x62C JUMPI POP PUSH2 0x1B4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x61F JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x611 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH2 0x710 PUSH2 0x704 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x97A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x850 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x40 PUSH2 0x74D PUSH2 0xA54 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6A4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6A4 JUMPI PUSH2 0x710 PUSH2 0x704 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x97A JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x8A2 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x863 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6A4 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6A4 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6A4 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x92F JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x900 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8F5 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x516 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x98E DUP5 PUSH2 0x8E6 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x9FC JUMPI POP PUSH1 0x1 EQ PUSH2 0x9B5 JUMPI JUMPDEST POP PUSH2 0x9B3 SWAP3 POP SUB DUP4 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x9E0 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x9B3 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x9C7 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x9B3 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x9A6 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x6A4 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x6A4 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xBA4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xBAC JUMPI JUMPDEST PUSH2 0xBA4 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAE7 JUMPI JUMPDEST POP PUSH2 0xAB6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x6A4 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB98 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB69 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAAA JUMP JUMPDEST PUSH2 0xB8B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB91 JUMPI JUMPDEST PUSH2 0xB83 DUP2 DUP4 PUSH2 0x939 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xA3C JUMP JUMPDEST CODESIZE PUSH2 0xB62 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xB79 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCD2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCD7 JUMPI JUMPDEST PUSH2 0xCD2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC41 JUMPI JUMPDEST POP PUSH2 0xC3E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB98 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB3 JUMPI JUMPDEST POP CODESIZE PUSH2 0xC34 JUMP JUMPDEST PUSH2 0xCCC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB91 JUMPI PUSH2 0xB83 DUP2 DUP4 PUSH2 0x939 JUMP JUMPDEST CODESIZE PUSH2 0xCAC JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBFD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP6 DUP3 0xB1 DUP10 0xD0 0x2E SUB SWAP15 CALLVALUE CALL 0xB9 PUSH3 0xADA610 0xE SLT 0xBF 0x4F 0xC9 0xBF DUP15 SELFDESTRUCT CALLDATASIZE 0x25 SLOAD PUSH17 0x78213835B564736F6C634300081E003300 ","sourceMap":"241:252:130:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;1814:12:259;;:::i;:::-;241:252:130;;;;;;;3174:18:180;;;3170:53;;3848:19:277;241:252:130;;;;636:1:180;900:21:181;;;896:88;;241:252:130;636:1:180;241:252:130;;;791:79:277;;;;;;;;;;:::i;:::-;;;;;;241:252:130;791:79:277;241:252:130;791:79:277;;;;;;;;241:252:130;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;241:252:130;791:79:277;;;;;2461:13;791:79;;:::i;:::-;;;;;;;;241:252:130;791:79:277;;;;;;;;;;241:252:130;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;2461:13;791:79;;;2498:15;791:79;;;2498:15;791:79;2596:32;241:252:130;500:10:59;241:252:130;;500:10:59;241:252:130;;500:10:59;636:1:180;791:79:277;500:10:59;;791:79:277;;500:10:59;;241:252:130;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;2461:13;241:252:130;;791:79:277;;;;241:252:130;;;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;;2461:13;791:79;;;;;;;;;;;;;;;;;;;;;;;;;;241:252:130;636:1:180;791:79:277;;;;;;;;;;;;;;;;2461:13;241:252:130;;;791:79:277;;;;;;;;241:252:130;791:79:277;;;;;;;;;;;;;;;;;;;;;241:252:130;791:79:277;;636:1:180;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;;241:252:130;;;;;;;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;;;;;241:252:130;;;;;;;791:79:277;;;;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;241:252:130;636:1:180;791:79:277;;;;;;;;;;;;;;;;241:252:130;;;;;;;;;791:79:277;;;;;;;;241:252:130;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;241:252:130;791:79:277;;;;-1:-1:-1;636:1:180;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;896:88:181;930:54;241:252:130;930:54:181;241:252:130;;636:1:180;241:252:130;;;;930:54:181;3170:53:180;3201:22;241:252:130;3201:22:180;241:252:130;;;;3201:22:180;241:252:130;;;;;;;;;;;;;;;;;3091:13:277;241:252:130;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;474:10;;:::i;:::-;241:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3732:15:277;241:252:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;241:252:130;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;241:252:130;;;;;-1:-1:-1;241:252:130;;-1:-1:-1;241:252:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;241:252:130;2065:19:76;241:252:130;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;241:252:130;720:8:80;241:252:130;720:8:80;;241:252:130;;;;2115:1:76;2802:32;;:::o;2624:153::-;241:252:130;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;241:252:130;2361:10:76;241:252:130;;;;2771:4:76;241:252:130;;;;;-1:-1:-1;2682:95:76;;241:252:130;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;241:252:130;;;2115:1:76;241:252:130;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;241:252:130;1029:19:76;241:252:130;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;241:252:130;;;1676:74:76;;241:252:130;;;1676:74:76;;;241:252:130;1327:10:76;241:252:130;;;;1744:4:76;241:252:130;;;;;-1:-1:-1;1676:74:76;;241:252:130;;;;;;1676:74:76;;;;;;;241:252:130;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"670200","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","decimals()":"2275","initERC20DetailedStorage(string,string,uint8)":"infinite","name()":"infinite","symbol()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","decimals()":"313ce567","initERC20DetailedStorage(string,string,uint8)":"ef961279","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initERC20DetailedStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"initERC20DetailedStorage(string,string,uint8)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"tokenDecimals\":\"The token decimals.\",\"tokenName\":\"The token name.\",\"tokenSymbol\":\"The token symbol.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"initERC20DetailedStorage(string,string,uint8)\":{\"notice\":\"Initializes the storage with the token details.Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC20Detailed.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol\":\"ERC20DetailedFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20DetailedFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20DetailedFacet} from \\\"./../../../../token/ERC20/facets/ERC20DetailedFacet.sol\\\";\\n\\ncontract ERC20DetailedFacetMock is ERC20DetailedFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20DetailedFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8187e140c8b4b1aa4813de16e3b0de71f862872ab6c6421b2fe98d927559df3d\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20DetailedFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../base/ERC20DetailedBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20DetailedFacet is ERC20DetailedBase, ForwarderRegistryContextBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function initERC20DetailedStorage(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0xe7cbcd2286aea25da2b1584cca758da8eec4e89539884e7bd01831e9953022cb\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"initERC20DetailedStorage(string,string,uint8)":{"notice":"Initializes the storage with the token details.Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC20Detailed."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol":{"ERC20FacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"initialHolders","type":"address[]"},{"internalType":"uint256[]","name":"initialAllocations","type":"uint256[]"}],"name":"initERC20StorageWithAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"initERC20Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"initERC20StorageWithAllocations(address[],uint256[])":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6115bc38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516115339081610089823960805181818161109a01526111e10152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063095ea7b314610ac157806318160ddd14610a6657806323b872dd146109a957806331e66e1e1461092657806339509351146106f657806370a0823114610671578063a457c2d714610604578063a9059cbb1461058c578063c8342b1d146102b4578063dd62ed3e146102055763fb33f6081461009557600080fd5b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610103611083565b92541691169081036101d3577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790555b005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005761023c610bed565b73ffffffffffffffffffffffffffffffffffffffff610259610c10565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005760043567ffffffffffffffff811161020057610303903690600401610c33565b60243567ffffffffffffffff811161020057610323903690600401610c33565b917fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610363611083565b92541691169081036101d3575061037981610cd4565b936103876040519586610c64565b818552602085019160051b81019036821161020057915b81831061055f575050506103b182610cd4565b916103bf6040519384610c64565b808352602083019060051b82019136831161020057905b82821061054f575050507f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749905491600183101561051c5760017f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749908190557fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811683179091557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790556101d192507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611353565b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b81358152602091820191016103d6565b823573ffffffffffffffffffffffffffffffffffffffff811681036102005781526020928301920161039e565b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f96105c6610bed565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6105f3611083565b90610eca565b602060405160018152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f961063e610bed565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61066b611083565b90610cec565b346102005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576106a8610bed565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005761072d610bed565b602435610738611083565b9073ffffffffffffffffffffffffffffffffffffffff83169283156108e25773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205260406000208460005260205260406000205491806107fd575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561088757505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506107ae565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020057604061095f6111ca565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102005760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f96109e3610bed565b6109eb610c10565b604435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610a18611083565b8473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603610a54575b5050610eca565b610a5f918484610cec565b8584610a4d565b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020057610af8610bed565b60243573ffffffffffffffffffffffffffffffffffffffff610b18611083565b9216918215610ba957602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928181166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352846040600020556040519485521692a3602060405160018152f35b73ffffffffffffffffffffffffffffffffffffffff907ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361020057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361020057565b9181601f840112156102005782359167ffffffffffffffff8311610200576020808501948460051b01011161020057565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ca557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ca55760051b60200190565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415610e86576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580610e7d575b610db9575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015610e225750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592610d71565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515610d6c565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156110275782610f34575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610fdb57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610fb4575b5050925050610eef565b83831660005281855260406000205586600052835260406000208581540190553880610faa565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b90816020910312610200575180151581036102005790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156111bb5732331480156111c0575b6111bb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561110e575b5061110b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156111af57600091611180575b5038611101565b6111a2915060203d6020116111a8575b61119a8183610c64565b81019061106b565b38611179565b503d611190565b6040513d6000823e3d90fd5b503390565b50601836106110ca565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156112fe573233148015611306575b6112fe5780331490811561125d575b5061122c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102005760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156111af576000916112df575b5038611220565b6112f8915060203d6020116111a85761119a8183610c64565b386112d8565b506000903690565b5060183610611211565b80518210156113245760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036114d35781156114cd5760009360005b8381106113c7575050505081611380575050565b600201805491808301928084111561139757505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff6113e68284611310565b511680156114a3576113f88285611310565b5180611436575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161136c565b969190878301928311156114795773ffffffffffffffffffffffffffffffffffffffff8116600090815260208890526040902080548901905591969091906113ff565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220310964f3b4861fe367398b9b3bc2dceaa64453c46034719cc9ae8c67327c7e4e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x15BC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1533 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x109A ADD MSTORE PUSH2 0x11E1 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xAC1 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xA66 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x9A9 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x926 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x6F6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x671 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x604 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0xC8342B1D EQ PUSH2 0x2B4 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x205 JUMPI PUSH4 0xFB33F608 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x103 PUSH2 0x1083 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1D3 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x23C PUSH2 0xBED JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x259 PUSH2 0xC10 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x200 JUMPI PUSH2 0x303 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC33 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x200 JUMPI PUSH2 0x323 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC33 JUMP JUMPDEST SWAP2 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x363 PUSH2 0x1083 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1D3 JUMPI POP PUSH2 0x379 DUP2 PUSH2 0xCD4 JUMP JUMPDEST SWAP4 PUSH2 0x387 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xC64 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x200 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x55F JUMPI POP POP POP PUSH2 0x3B1 DUP3 PUSH2 0xCD4 JUMP JUMPDEST SWAP2 PUSH2 0x3BF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0xC64 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x200 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x54F JUMPI POP POP POP PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 SLOAD SWAP2 PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x1 PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 DUP2 SWAP1 SSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND DUP4 OR SWAP1 SWAP2 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1D1 SWAP3 POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1353 JUMP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x200 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x39E JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x5C6 PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x5F3 PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH2 0xECA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x63E PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x66B PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH2 0xCEC JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x6A8 PUSH2 0xBED JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x72D PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x738 PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x8E2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x7FD JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x887 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x7AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x40 PUSH2 0x95F PUSH2 0x11CA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x9E3 PUSH2 0xBED JUMP JUMPDEST PUSH2 0x9EB PUSH2 0xC10 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xA18 PUSH2 0x1083 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0xA54 JUMPI JUMPDEST POP POP PUSH2 0xECA JUMP JUMPDEST PUSH2 0xA5F SWAP2 DUP5 DUP5 PUSH2 0xCEC JUMP JUMPDEST DUP6 DUP5 PUSH2 0xA4D JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0xAF8 PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB18 PUSH2 0x1083 JUMP JUMPDEST SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0xBA9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x200 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x200 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x200 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x200 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x200 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xCA5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xCA5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xE86 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0xE7D JUMPI JUMPDEST PUSH2 0xDB9 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0xE22 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0xD71 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0xD6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1027 JUMPI DUP3 PUSH2 0xF34 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xFDB JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xFB4 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xEEF JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xFAA JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x200 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x200 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x11BB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x11C0 JUMPI JUMPDEST PUSH2 0x11BB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x110E JUMPI JUMPDEST POP PUSH2 0x110B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1180 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1101 JUMP JUMPDEST PUSH2 0x11A2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11A8 JUMPI JUMPDEST PUSH2 0x119A DUP2 DUP4 PUSH2 0xC64 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x106B JUMP JUMPDEST CODESIZE PUSH2 0x1179 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10CA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x12FE JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1306 JUMPI JUMPDEST PUSH2 0x12FE JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x125D JUMPI JUMPDEST POP PUSH2 0x122C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x200 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12DF JUMPI JUMPDEST POP CODESIZE PUSH2 0x1220 JUMP JUMPDEST PUSH2 0x12F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11A8 JUMPI PUSH2 0x119A DUP2 DUP4 PUSH2 0xC64 JUMP JUMPDEST CODESIZE PUSH2 0x12D8 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1211 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1324 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x14D3 JUMPI DUP2 ISZERO PUSH2 0x14CD JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x13C7 JUMPI POP POP POP POP DUP2 PUSH2 0x1380 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1397 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x13E6 DUP3 DUP5 PUSH2 0x1310 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x14A3 JUMPI PUSH2 0x13F8 DUP3 DUP6 PUSH2 0x1310 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x1436 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x136C JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x1479 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x13FF JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BALANCE MULMOD PUSH5 0xF3B4861FE3 PUSH8 0x398B9B3BC2DCEAA6 PREVRANDAO MSTORE8 0xC4 PUSH1 0x34 PUSH18 0x9CC9AE8C67327C7E4E64736F6C634300081E STOP CALLER ","sourceMap":"225:228:131:-:0;;;;;;;;;;;;;-1:-1:-1;;225:228:131;;;;-1:-1:-1;;;;;225:228:131;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;225:228:131;;;;;;745:39:76;;225:228:131;;;;;;;;745:39:76;225:228:131;;;;;;;;;;;;-1:-1:-1;225:228:131;;;;;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3053,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":3123,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":4203,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":3088,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":3284,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3172,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchMint":{"entryPoint":4947,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":3308,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_init":{"entryPoint":null,"id":28743,"parameterSlots":0,"returnSlots":0},"fun_msgData":{"entryPoint":4554,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":4227,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transfer":{"entryPoint":3786,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":4880,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4250},{"length":32,"start":4577}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063095ea7b314610ac157806318160ddd14610a6657806323b872dd146109a957806331e66e1e1461092657806339509351146106f657806370a0823114610671578063a457c2d714610604578063a9059cbb1461058c578063c8342b1d146102b4578063dd62ed3e146102055763fb33f6081461009557600080fd5b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610103611083565b92541691169081036101d3577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790555b005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005761023c610bed565b73ffffffffffffffffffffffffffffffffffffffff610259610c10565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005760043567ffffffffffffffff811161020057610303903690600401610c33565b60243567ffffffffffffffff811161020057610323903690600401610c33565b917fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610363611083565b92541691169081036101d3575061037981610cd4565b936103876040519586610c64565b818552602085019160051b81019036821161020057915b81831061055f575050506103b182610cd4565b916103bf6040519384610c64565b808352602083019060051b82019136831161020057905b82821061054f575050507f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749905491600183101561051c5760017f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749908190557fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811683179091557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790556101d192507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611353565b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b81358152602091820191016103d6565b823573ffffffffffffffffffffffffffffffffffffffff811681036102005781526020928301920161039e565b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f96105c6610bed565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6105f3611083565b90610eca565b602060405160018152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f961063e610bed565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61066b611083565b90610cec565b346102005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576106a8610bed565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005761072d610bed565b602435610738611083565b9073ffffffffffffffffffffffffffffffffffffffff83169283156108e25773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205260406000208460005260205260406000205491806107fd575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561088757505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506107ae565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020057604061095f6111ca565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102005760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610200576105f96109e3610bed565b6109eb610c10565b604435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610a18611083565b8473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603610a54575b5050610eca565b610a5f918484610cec565b8584610a4d565b346102005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102005760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020057610af8610bed565b60243573ffffffffffffffffffffffffffffffffffffffff610b18611083565b9216918215610ba957602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928181166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352846040600020556040519485521692a3602060405160018152f35b73ffffffffffffffffffffffffffffffffffffffff907ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361020057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361020057565b9181601f840112156102005782359167ffffffffffffffff8311610200576020808501948460051b01011161020057565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ca557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610ca55760051b60200190565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415610e86576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580610e7d575b610db9575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015610e225750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592610d71565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515610d6c565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156110275782610f34575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610fdb57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610fb4575b5050925050610eef565b83831660005281855260406000205586600052835260406000208581540190553880610faa565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b90816020910312610200575180151581036102005790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156111bb5732331480156111c0575b6111bb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561110e575b5061110b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156111af57600091611180575b5038611101565b6111a2915060203d6020116111a8575b61119a8183610c64565b81019061106b565b38611179565b503d611190565b6040513d6000823e3d90fd5b503390565b50601836106110ca565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156112fe573233148015611306575b6112fe5780331490811561125d575b5061122c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102005760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156111af576000916112df575b5038611220565b6112f8915060203d6020116111a85761119a8183610c64565b386112d8565b506000903690565b5060183610611211565b80518210156113245760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036114d35781156114cd5760009360005b8381106113c7575050505081611380575050565b600201805491808301928084111561139757505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff6113e68284611310565b511680156114a3576113f88285611310565b5180611436575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161136c565b969190878301928311156114795773ffffffffffffffffffffffffffffffffffffffff8116600090815260208890526040902080548901905591969091906113ff565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220310964f3b4861fe367398b9b3bc2dceaa64453c46034719cc9ae8c67327c7e4e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xAC1 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xA66 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x9A9 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x926 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x6F6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x671 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x604 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0xC8342B1D EQ PUSH2 0x2B4 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x205 JUMPI PUSH4 0xFB33F608 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x103 PUSH2 0x1083 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1D3 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x23C PUSH2 0xBED JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x259 PUSH2 0xC10 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x200 JUMPI PUSH2 0x303 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC33 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x200 JUMPI PUSH2 0x323 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC33 JUMP JUMPDEST SWAP2 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x363 PUSH2 0x1083 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1D3 JUMPI POP PUSH2 0x379 DUP2 PUSH2 0xCD4 JUMP JUMPDEST SWAP4 PUSH2 0x387 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xC64 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x200 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x55F JUMPI POP POP POP PUSH2 0x3B1 DUP3 PUSH2 0xCD4 JUMP JUMPDEST SWAP2 PUSH2 0x3BF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0xC64 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x200 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x54F JUMPI POP POP POP PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 SLOAD SWAP2 PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x51C JUMPI PUSH1 0x1 PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 DUP2 SWAP1 SSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND DUP4 OR SWAP1 SWAP2 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1D1 SWAP3 POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1353 JUMP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x200 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x39E JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x5C6 PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x5F3 PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH2 0xECA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x63E PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x66B PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH2 0xCEC JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x6A8 PUSH2 0xBED JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x72D PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x738 PUSH2 0x1083 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x8E2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x7FD JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x887 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x7AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x40 PUSH2 0x95F PUSH2 0x11CA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0x5F9 PUSH2 0x9E3 PUSH2 0xBED JUMP JUMPDEST PUSH2 0x9EB PUSH2 0xC10 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xA18 PUSH2 0x1083 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0xA54 JUMPI JUMPDEST POP POP PUSH2 0xECA JUMP JUMPDEST PUSH2 0xA5F SWAP2 DUP5 DUP5 PUSH2 0xCEC JUMP JUMPDEST DUP6 DUP5 PUSH2 0xA4D JUMP JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x200 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x200 JUMPI PUSH2 0xAF8 PUSH2 0xBED JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB18 PUSH2 0x1083 JUMP JUMPDEST SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0xBA9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x200 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x200 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x200 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x200 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x200 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xCA5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xCA5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xE86 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0xE7D JUMPI JUMPDEST PUSH2 0xDB9 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0xE22 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0xD71 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0xD6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1027 JUMPI DUP3 PUSH2 0xF34 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xFDB JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xFB4 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xEEF JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xFAA JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x200 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x200 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x11BB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x11C0 JUMPI JUMPDEST PUSH2 0x11BB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x110E JUMPI JUMPDEST POP PUSH2 0x110B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1180 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1101 JUMP JUMPDEST PUSH2 0x11A2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11A8 JUMPI JUMPDEST PUSH2 0x119A DUP2 DUP4 PUSH2 0xC64 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x106B JUMP JUMPDEST CODESIZE PUSH2 0x1179 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10CA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x12FE JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1306 JUMPI JUMPDEST PUSH2 0x12FE JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x125D JUMPI JUMPDEST POP PUSH2 0x122C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x200 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x11AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12DF JUMPI JUMPDEST POP CODESIZE PUSH2 0x1220 JUMP JUMPDEST PUSH2 0x12F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x11A8 JUMPI PUSH2 0x119A DUP2 DUP4 PUSH2 0xC64 JUMP JUMPDEST CODESIZE PUSH2 0x12D8 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1211 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1324 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x14D3 JUMPI DUP2 ISZERO PUSH2 0x14CD JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x13C7 JUMPI POP POP POP POP DUP2 PUSH2 0x1380 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1397 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x13E6 DUP3 DUP5 PUSH2 0x1310 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x14A3 JUMPI PUSH2 0x13F8 DUP3 DUP6 PUSH2 0x1310 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x1436 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x136C JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x1479 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x13FF JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BALANCE MULMOD PUSH5 0xF3B4861FE3 PUSH8 0x398B9B3BC2DCEAA6 PREVRANDAO MSTORE8 0xC4 PUSH1 0x34 PUSH18 0x9CC9AE8C67327C7E4E64736F6C634300081E STOP CALLER ","sourceMap":"225:228:131:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2022:41:260;;;:::i;:::-;225:228:131;;;;;3174:18:180;;;3170:53;;225:228:131;500:10:59;;;;;443:1;500:10;;;;;;;;;2560:33:280;-1:-1:-1;500:10:59;;;;;;;;;;;;1356:12:260;225:228:131;3170:53:180;3201:22;-1:-1:-1;3201:22:180;;225:228:131;;-1:-1:-1;3201:22:180;225:228:131;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;225:228:131;-1:-1:-1;225:228:131;27576:12:280;225:228:131;;;;-1:-1:-1;225:228:131;27576:28:280;225:228:131;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3324:19:180;225:228:131;;2022:41:260;;;:::i;:::-;225:228:131;;;;;3174:18:180;;;3170:53;;225:228:131;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;900:21:181;2124:1:280;900:21:181;;;896:88;;2124:1:280;225:228:131;;;;;500:10:59;;;;;;;;;;;;;;2560:33:280;-1:-1:-1;500:10:59;;;;;;;;;;;;2939:18:280;;-1:-1:-1;225:228:131;2939:18:280;:::i;896:88:181:-;930:54;;225:228:131;930:54:181;225:228:131;;2124:1:280;225:228:131;;;;930:54:181;225:228:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1036:5:242;225:228:131;;:::i;:::-;;;;;2022:41:260;;:::i;:::-;1036:5:242;;:::i;:::-;225:228:131;;;;;;;;;;;;;;;;;;1788:15:242;225:228:131;;:::i;:::-;;;;;2022:41:260;;:::i;:::-;1788:15:242;;:::i;225:228:131:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;225:228:131;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2022:41:260;;:::i;:::-;225:228:131;;;;5455:21:280;;;5451:67;;225:228:131;;;-1:-1:-1;225:228:131;5555:12:280;225:228:131;;;-1:-1:-1;225:228:131;;-1:-1:-1;225:228:131;;;;-1:-1:-1;225:228:131;;5597:10:280;;5593:366;;225:228:131;;;5973:42:280;225:228:131;;;;;;;;;5973:42:280;;225:228:131;;;;;;;5593:366:280;225:228:131;;;5720:32:280;;;;;5716:108;;5842:19;;;225:228:131;;5973:42:280;5842:19;225:228:131;;;-1:-1:-1;225:228:131;5555:12:280;225:228:131;;;-1:-1:-1;225:228:131;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;5593:366:280;;;;5716:108;225:228:131;;5761:63:280;;;225:228:131;;;;;5761:63:280;;225:228:131;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;225:228:131;5485:33:280;;225:228:131;5485:33:280;225:228:131;;;;;5485:33:280;225:228:131;;;;;;;;;;;;2257:39:260;;:::i;:::-;225:228:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9818:5:280;225:228:131;;:::i;:::-;;;:::i;:::-;;;27705:19:280;225:228:131;2022:41:260;;:::i;:::-;225:228:131;;;;;;;9707:14:280;9703:85;;225:228:131;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;225:228:131;;;;;;;;;;;;26654:8:280;225:228:131;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2022:41:260;;:::i;:::-;225:228:131;;4533:21:280;;;4529:67;;225:228:131;;4657:31:280;4606:19;225:228:131;;;-1:-1:-1;225:228:131;4606:12:280;225:228:131;;;-1:-1:-1;225:228:131;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;;;;;;4657:31:280;;225:228:131;;;;;;;4529:67:280;225:228:131;4563:33:280;;225:228:131;4563:33:280;225:228:131;;;;;4563:33:280;225:228:131;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;;;;;;;;;;:::o;6693:851:280:-;;;;225:228:131;;;6808:21:280;;;6804:67;;6908:12;;:19;225:228:131;;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;-1:-1:-1;225:228:131;;;;-1:-1:-1;225:228:131;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;225:228:131;;;;;;7495:42:280;225:228:131;;;;;;;7495:42:280;;6693:851::o;6947:534::-;225:228:131;;;7238:32:280;;;;;7234:112;;7364:19;;;225:228:131;7495:42:280;7364:19;225:228:131;7364:19:280;225:228:131;;;-1:-1:-1;225:228:131;;;;-1:-1:-1;225:228:131;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;6947:534:280;;;7234:112;225:228:131;;7279:67:280;;;225:228:131;;;;7279:67:280;;;225:228:131;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;225:228:131;6838:33:280;;6827:1;6838:33;225:228:131;6838:33:280;225:228:131;;6827:1:280;6838:33;8105:628;;;225:228:131;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;225:228:131;;;8701:25:280;225:228:131;;;;;;;8701:25:280;;8105:628::o;8273:413::-;225:228:131;;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;;;8437:21:280;;;;;8433:80;;225:228:131;;;;;;;;8701:25:280;225:228:131;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;225:228:131;;;-1:-1:-1;225:228:131;;;;;-1:-1:-1;225:228:131;;;-1:-1:-1;225:228:131;;;;-1:-1:-1;225:228:131;;;;;;;8531:131:280;;;;8433:80;8467:46;;225:228:131;8467:46:280;;8219:1;8467:46;225:228:131;8467:46:280;225:228:131;;;;;;8219:1:280;8467:46;8201:61;225:228:131;8230:32:280;;8219:1;8230:32;225:228:131;8230:32:280;225:228:131;;8219:1:280;8230:32;225:228:131;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;225:228:131;1029:19:76;225:228:131;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;225:228:131;;;1676:74:76;;225:228:131;;;1676:74:76;;;225:228:131;1327:10:76;225:228:131;;;;1744:4:76;225:228:131;;;;;-1:-1:-1;1676:74:76;;225:228:131;;;;;;1676:74:76;;;;;;;225:228:131;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;225:228:131;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;225:228:131;2065:19:76;225:228:131;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;225:228:131;720:8:80;225:228:131;720:8:80;;225:228:131;;;;2115:1:76;2802:32;;:::o;2624:153::-;225:228:131;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;225:228:131;2361:10:76;225:228:131;;;;2771:4:76;225:228:131;;;;;-1:-1:-1;2682:95:76;;225:228:131;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;225:228:131;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;20857:1233:280;;;225:228:131;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;225:228:131;;;;;;21949:19:280;;;;;21945:76;;225:228:131;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;225:228:131;;;;-1:-1:-1;21977:44:280;21174:3;225:228:131;21206:13:280;;;;:::i;:::-;225:228:131;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;225:228:131;21344:10:280;21340:372;;21174:3;225:228:131;-1:-1:-1;21730:31:280;225:228:131;;;;;;;;;21730:31:280;225:228:131;21151:9:280;;21340:372;225:228:131;;;;;;21474:27:280;;;;21470:70;;225:228:131;;;-1:-1:-1;225:228:131;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;225:228:131;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;21084;21101:7;;;;:::o;21011:62::-;21047:26;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280"},"gasEstimates":{"creation":{"codeDepositCost":"1085400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","allowance(address,address)":"2705","approve(address,uint256)":"infinite","balanceOf(address)":"2487","decreaseAllowance(address,uint256)":"infinite","increaseAllowance(address,uint256)":"infinite","initERC20Storage()":"infinite","initERC20StorageWithAllocations(address[],uint256[])":"infinite","totalSupply()":"2269","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","initERC20Storage()":"fb33f608","initERC20StorageWithAllocations(address[],uint256[])":"c8342b1d","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialHolders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"initialAllocations\",\"type\":\"uint256[]\"}],\"name\":\"initERC20StorageWithAllocations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"initERC20Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"initERC20StorageWithAllocations(address[],uint256[])\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"initERC20Storage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\"},\"initERC20StorageWithAllocations(address[],uint256[])\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol\":\"ERC20FacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20FacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Facet} from \\\"./../../../../token/ERC20/facets/ERC20Facet.sol\\\";\\n\\ncontract ERC20FacetMock is ERC20Facet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20Facet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3898148cf813e40b32f4661cfcf2fceb801f81fea3463f4a16dbda331e06aa7d\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../base/ERC20Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20Facet is ERC20Base, ForwarderRegistryContextBase {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.init();\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20StorageWithAllocations(address[] calldata initialHolders, uint256[] calldata initialAllocations) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initWithAllocations(initialHolders, initialAllocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xcbab9ebe31aa02741092114f157f022aa8cdca24e97b73d2aa9176d939fae665\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"initERC20Storage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"initERC20StorageWithAllocations(address[],uint256[])":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol":{"ERC20MetadataFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC20MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610a0a38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610981908161008982396080518181816106d501526108370152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146105605780633c130d90146103e4578063529eec47146102aa5763e0df5b6f1461004857600080fd5b346102a55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a55760043567ffffffffffffffff81116102a557366023820112156102a557806004013567ffffffffffffffff81116102a55736602482840101116102a5576100bc610820565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361027857507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea60009161012d82546105e3565b601f8111610233575b5082601f821160011461019057839482939492610182575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b60249250010135388061014e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b8781106102185750836001959697106101dd575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690553880806101d2565b909260206001819260248787010135815501940191016101be565b82845260208420601f830160051c8101916020841061026e575b601f0160051c01905b8181106102635750610136565b848155600101610256565b909150819061024d565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a5576102e1610820565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103b7577f3c130d90000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f7fe8ee7f2d313a16678eef7035aac3e7ad68d287fc547fab9e84f1ec0f7db44d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a5577ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea60405190816000825492610447846105e3565b808452936001811690811561052057506001146104d9575b5061046c92500382610636565b60405190602082528181519182602083015260005b8381106104c15750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610481565b90506000929192526020600020906000915b81831061050457505090602061046c928201018461045f565b60209193508060019154838588010152019101909183926104eb565b6020935061046c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201018461045f565b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a55760406105996106be565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90600182811c9216801561062c575b60208310146105fd57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916105f2565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761067757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126102a5575180151581036102a55790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561080e573233148015610816575b61080e57803314908115610751575b50610720576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102a55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610802576000916107d3575b5038610714565b6107f5915060203d6020116107fb575b6107ed8183610636565b8101906106a6565b386107cc565b503d6107e3565b6040513d6000823e3d90fd5b506000903690565b5060183610610705565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561093c573233148015610941575b61093c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108ab575b506108a857503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108025760009161091d575b503861089e565b610936915060203d6020116107fb576107ed8183610636565b38610916565b503390565b506018361061086756fea26469706673582212200078d77f7074598229041d66d2e4c2b67dbcd47f1c2cafe49f172e196c86b4dd64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xA0A CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x981 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x6D5 ADD MSTORE PUSH2 0x837 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x560 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x3E4 JUMPI DUP1 PUSH4 0x529EEC47 EQ PUSH2 0x2AA JUMPI PUSH4 0xE0DF5B6F EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x2A5 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI CALLDATASIZE PUSH1 0x24 DUP3 DUP5 ADD ADD GT PUSH2 0x2A5 JUMPI PUSH2 0xBC PUSH2 0x820 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x278 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x0 SWAP2 PUSH2 0x12D DUP3 SLOAD PUSH2 0x5E3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x233 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x190 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x182 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x14E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x218 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x1DD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1D2 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x1BE JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x26E JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x263 JUMPI POP PUSH2 0x136 JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x256 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x24D JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH2 0x2E1 PUSH2 0x820 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3B7 JUMPI PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x7FE8EE7F2D313A16678EEF7035AAC3E7AD68D287FC547FAB9E84F1EC0F7DB44D DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x40 MLOAD SWAP1 DUP2 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x447 DUP5 PUSH2 0x5E3 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x520 JUMPI POP PUSH1 0x1 EQ PUSH2 0x4D9 JUMPI JUMPDEST POP PUSH2 0x46C SWAP3 POP SUB DUP3 PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP3 MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4C1 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x481 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x504 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x46C SWAP3 DUP3 ADD ADD DUP5 PUSH2 0x45F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x4EB JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x46C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD DUP5 PUSH2 0x45F JUMP JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH1 0x40 PUSH2 0x599 PUSH2 0x6BE JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x62C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x5FD JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x5F2 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x677 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2A5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2A5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x80E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x816 JUMPI JUMPDEST PUSH2 0x80E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x751 JUMPI JUMPDEST POP PUSH2 0x720 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2A5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7D3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x714 JUMP JUMPDEST PUSH2 0x7F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7FB JUMPI JUMPDEST PUSH2 0x7ED DUP2 DUP4 PUSH2 0x636 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6A6 JUMP JUMPDEST CODESIZE PUSH2 0x7CC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7E3 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x93C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x941 JUMPI JUMPDEST PUSH2 0x93C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8AB JUMPI JUMPDEST POP PUSH2 0x8A8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x91D JUMPI JUMPDEST POP CODESIZE PUSH2 0x89E JUMP JUMPDEST PUSH2 0x936 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7FB JUMPI PUSH2 0x7ED DUP2 DUP4 PUSH2 0x636 JUMP JUMPDEST CODESIZE PUSH2 0x916 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x867 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP PUSH25 0xD77F7074598229041D66D2E4C2B67DBCD47F1C2CAFE49F172E NOT PUSH13 0x86B4DD64736F6C634300081E00 CALLER ","sourceMap":"241:252:132:-:0;;;;;;;;;;;;;-1:-1:-1;;241:252:132;;;;-1:-1:-1;;;;;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;241:252:132;;;;;;745:39:76;;241:252:132;;;;;;;;745:39:76;241:252:132;;;;;;;;;;;;-1:-1:-1;241:252:132;;;;;;-1:-1:-1;241:252:132;;;;;-1:-1:-1;241:252:132"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1702,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"extract_byte_array_length":{"entryPoint":1507,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1590,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1726,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2080,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1749},{"length":32,"start":2103}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146105605780633c130d90146103e4578063529eec47146102aa5763e0df5b6f1461004857600080fd5b346102a55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a55760043567ffffffffffffffff81116102a557366023820112156102a557806004013567ffffffffffffffff81116102a55736602482840101116102a5576100bc610820565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361027857507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea60009161012d82546105e3565b601f8111610233575b5082601f821160011461019057839482939492610182575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b60249250010135388061014e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b8781106102185750836001959697106101dd575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690553880806101d2565b909260206001819260248787010135815501940191016101be565b82845260208420601f830160051c8101916020841061026e575b601f0160051c01905b8181106102635750610136565b848155600101610256565b909150819061024d565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a5576102e1610820565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103b7577f3c130d90000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f7fe8ee7f2d313a16678eef7035aac3e7ad68d287fc547fab9e84f1ec0f7db44d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a5577ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea60405190816000825492610447846105e3565b808452936001811690811561052057506001146104d9575b5061046c92500382610636565b60405190602082528181519182602083015260005b8381106104c15750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610481565b90506000929192526020600020906000915b81831061050457505090602061046c928201018461045f565b60209193508060019154838588010152019101909183926104eb565b6020935061046c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201018461045f565b346102a55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102a55760406105996106be565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90600182811c9216801561062c575b60208310146105fd57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916105f2565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761067757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126102a5575180151581036102a55790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561080e573233148015610816575b61080e57803314908115610751575b50610720576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102a55760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610802576000916107d3575b5038610714565b6107f5915060203d6020116107fb575b6107ed8183610636565b8101906106a6565b386107cc565b503d6107e3565b6040513d6000823e3d90fd5b506000903690565b5060183610610705565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561093c573233148015610941575b61093c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108ab575b506108a857503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108025760009161091d575b503861089e565b610936915060203d6020116107fb576107ed8183610636565b38610916565b503390565b506018361061086756fea26469706673582212200078d77f7074598229041d66d2e4c2b67dbcd47f1c2cafe49f172e196c86b4dd64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x560 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x3E4 JUMPI DUP1 PUSH4 0x529EEC47 EQ PUSH2 0x2AA JUMPI PUSH4 0xE0DF5B6F EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x2A5 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI CALLDATASIZE PUSH1 0x24 DUP3 DUP5 ADD ADD GT PUSH2 0x2A5 JUMPI PUSH2 0xBC PUSH2 0x820 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x278 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x0 SWAP2 PUSH2 0x12D DUP3 SLOAD PUSH2 0x5E3 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x233 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x190 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x182 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x14E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x218 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x1DD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1D2 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x1BE JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x26E JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x263 JUMPI POP PUSH2 0x136 JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x256 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x24D JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH2 0x2E1 PUSH2 0x820 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3B7 JUMPI PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x7FE8EE7F2D313A16678EEF7035AAC3E7AD68D287FC547FAB9E84F1EC0F7DB44D DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x40 MLOAD SWAP1 DUP2 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x447 DUP5 PUSH2 0x5E3 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x520 JUMPI POP PUSH1 0x1 EQ PUSH2 0x4D9 JUMPI JUMPDEST POP PUSH2 0x46C SWAP3 POP SUB DUP3 PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP3 MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4C1 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x481 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x504 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x46C SWAP3 DUP3 ADD ADD DUP5 PUSH2 0x45F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x4EB JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x46C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD DUP5 PUSH2 0x45F JUMP JUMPDEST CALLVALUE PUSH2 0x2A5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2A5 JUMPI PUSH1 0x40 PUSH2 0x599 PUSH2 0x6BE JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x62C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x5FD JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x5F2 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x677 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2A5 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2A5 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x80E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x816 JUMPI JUMPDEST PUSH2 0x80E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x751 JUMPI JUMPDEST POP PUSH2 0x720 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2A5 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7D3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x714 JUMP JUMPDEST PUSH2 0x7F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7FB JUMPI JUMPDEST PUSH2 0x7ED DUP2 DUP4 PUSH2 0x636 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6A6 JUMP JUMPDEST CODESIZE PUSH2 0x7CC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7E3 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x93C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x941 JUMPI JUMPDEST PUSH2 0x93C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8AB JUMPI JUMPDEST POP PUSH2 0x8A8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x802 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x91D JUMPI JUMPDEST POP CODESIZE PUSH2 0x89E JUMP JUMPDEST PUSH2 0x936 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7FB JUMPI PUSH2 0x7ED DUP2 DUP4 PUSH2 0x636 JUMP JUMPDEST CODESIZE PUSH2 0x916 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x867 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP PUSH25 0xD77F7074598229041D66D2E4C2B67DBCD47F1C2CAFE49F172E NOT PUSH13 0x86B4DD64736F6C634300081E00 CALLER ","sourceMap":"241:252:132:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1548:41:261;;:::i;:::-;241:252:132;;;;;;;4503:26:42;;;4499:64;;1283:19:278;241:252:132;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;241:252:132;;;;;;-1:-1:-1;241:252:132;;;;4499:64:42;4538:25;241:252:132;4538:25:42;241:252:132;;;;4538:25:42;241:252:132;;;;;;;;;;;;;;;1548:41:261;;:::i;:::-;241:252:132;;;;;;;3174:18:180;;;3170:53;;768:32:278;241:252:132;500:10:59;241:252:132;500:10:59;;;;;;;636:1:180;500:10:59;;;241:252:132;3170:53:180;3201:22;241:252:132;3201:22:180;241:252:132;;;;3201:22:180;241:252:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1783:39:261;;:::i;:::-;241:252:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;241:252:132;;;;;-1:-1:-1;241:252:132;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;241:252:132;2065:19:76;241:252:132;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;241:252:132;720:8:80;241:252:132;720:8:80;;241:252:132;;;;2115:1:76;2802:32;;:::o;2624:153::-;241:252:132;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;241:252:132;2361:10:76;241:252:132;;;;2771:4:76;241:252:132;;;;;-1:-1:-1;2682:95:76;;241:252:132;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;241:252:132;;;2115:1:76;241:252:132;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;241:252:132;1029:19:76;241:252:132;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;241:252:132;;;1676:74:76;;241:252:132;;;1676:74:76;;;241:252:132;1327:10:76;241:252:132;;;;1744:4:76;241:252:132;;;;;-1:-1:-1;1676:74:76;;241:252:132;;;;;;1676:74:76;;;;;;;241:252:132;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"486600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initERC20MetadataStorage()":"infinite","setTokenURI(string)":"infinite","tokenURI()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initERC20MetadataStorage()":"529eec47","setTokenURI(string)":"e0df5b6f","tokenURI()":"3c130d90"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC20MetadataStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Metadata.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol\":\"ERC20MetadataFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20MetadataFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MetadataFacet} from \\\"./../../../../token/ERC20/facets/ERC20MetadataFacet.sol\\\";\\n\\ncontract ERC20MetadataFacetMock is ERC20MetadataFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MetadataFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xfa7a1d18d9a9e2fb47a9b4030487543d494f08d31407ca2d2ab345d614983cdc\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../base/ERC20MetadataBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20MetadataFacet is ERC20MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function initERC20MetadataStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20MetadataStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xdbe77f1801db43493c19704f259a28a8fd9c9531bd993276e136629e433500ec\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC20MetadataStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"setTokenURI(string)":{"notice":"Sets the token URI."},"tokenURI()":{"notice":"Gets the token metadata URI."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol":{"ERC20MintableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"initERC20MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610c5238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610bc99081610089823960805181818161091d0152610a640152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806311e60a3e1461047657806331e66e1e146103f357806340c10f191461022f57806368573107146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760043567ffffffffffffffff81116100ac576101009036906004016105b0565b60243567ffffffffffffffff81116100ac576101209036906004016105b0565b9290916101557fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261014f610906565b90610669565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061018081610651565b9261018e60405194856105e1565b818452602084019160051b8101903682116100ac57915b818310610202575050506101b884610651565b926101c660405194856105e1565b848452602084019460051b8101903682116100ac57945b8186106101f25750506101f0935061076e565b005b85358152602095860195016101dd565b823573ffffffffffffffffffffffffffffffffffffffff811681036100ac578152602092830192016101a5565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ac576024356102ae7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261014f610906565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee82156103c9578161030b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054828101908082111561039757507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6102db565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac57604061042c610a4d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576104ad610906565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610583577f28963e1e000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156100ac5782359167ffffffffffffffff83116100ac576020808501948460051b0101116100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106225760051b60200190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156106c35750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561073f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036108c45781156108be5760009360005b8381106107e257505050508161079b575050565b60020180549180830192808411156107b257505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff610801828461072b565b511680156103c957610813828561072b565b5180610851575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301610787565b969190878301928311156108945773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061081a565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100ac575180151581036100ac5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a3e573233148015610a43575b610a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610991575b5061098e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610a3257600091610a03575b5038610984565b610a25915060203d602011610a2b575b610a1d81836105e1565b8101906108ee565b386109fc565b503d610a13565b6040513d6000823e3d90fd5b503390565b506018361061094d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b81573233148015610b89575b610b8157803314908115610ae0575b50610aaf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100ac5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610a3257600091610b62575b5038610aa3565b610b7b915060203d602011610a2b57610a1d81836105e1565b38610b5b565b506000903690565b5060183610610a9456fea2646970667358221220de4006a863840774c3f8337d8fc88475e0ae7221b81b77b407d8c5269e16d4e664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xC52 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xBC9 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x91D ADD MSTORE PUSH2 0xA64 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11E60A3E EQ PUSH2 0x476 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x22F JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x100 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x120 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5B0 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x155 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x14F PUSH2 0x906 JUMP JUMPDEST SWAP1 PUSH2 0x669 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x180 DUP2 PUSH2 0x651 JUMP JUMPDEST SWAP3 PUSH2 0x18E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5E1 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x202 JUMPI POP POP POP PUSH2 0x1B8 DUP5 PUSH2 0x651 JUMP JUMPDEST SWAP3 PUSH2 0x1C6 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5E1 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1F2 JUMPI POP POP PUSH2 0x1F0 SWAP4 POP PUSH2 0x76E JUMP JUMPDEST STOP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1DD JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xAC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1A5 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAC JUMPI PUSH1 0x24 CALLDATALOAD PUSH2 0x2AE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x14F PUSH2 0x906 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE DUP3 ISZERO PUSH2 0x3C9 JUMPI DUP2 PUSH2 0x30B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x397 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2DB JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x40 PUSH2 0x42C PUSH2 0xA4D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x4AD PUSH2 0x906 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x583 JUMPI PUSH32 0x28963E1E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x622 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x622 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x6C3 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x73F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x8C4 JUMPI DUP2 ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x7E2 JUMPI POP POP POP POP DUP2 PUSH2 0x79B JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x7B2 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x801 DUP3 DUP5 PUSH2 0x72B JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x3C9 JUMPI PUSH2 0x813 DUP3 DUP6 PUSH2 0x72B JUMP JUMPDEST MLOAD DUP1 PUSH2 0x851 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x787 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x894 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x81A JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA3E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA43 JUMPI JUMPDEST PUSH2 0xA3E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x991 JUMPI JUMPDEST POP PUSH2 0x98E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA32 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA03 JUMPI JUMPDEST POP CODESIZE PUSH2 0x984 JUMP JUMPDEST PUSH2 0xA25 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA2B JUMPI JUMPDEST PUSH2 0xA1D DUP2 DUP4 PUSH2 0x5E1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x8EE JUMP JUMPDEST CODESIZE PUSH2 0x9FC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA13 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x94D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB81 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB89 JUMPI JUMPDEST PUSH2 0xB81 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAE0 JUMPI JUMPDEST POP PUSH2 0xAAF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA32 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB62 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAA3 JUMP JUMPDEST PUSH2 0xB7B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA2B JUMPI PUSH2 0xA1D DUP2 DUP4 PUSH2 0x5E1 JUMP JUMPDEST CODESIZE PUSH2 0xB5B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA94 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE BLOCKHASH MOD 0xA8 PUSH4 0x840774C3 EXTCALL CALLER PUSH30 0x8FC88475E0AE7221B81B77B407D8C5269E16D4E664736F6C634300081E00 CALLER ","sourceMap":"241:252:133:-:0;;;;;;;;;;;;;-1:-1:-1;;241:252:133;;;;-1:-1:-1;;;;;241:252:133;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;241:252:133;;;;;;745:39:76;;241:252:133;;;;;;;;745:39:76;241:252:133;;;;;;;;;;;;-1:-1:-1;241:252:133;;;;;;-1:-1:-1;241:252:133;;;;;-1:-1:-1;241:252:133"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1456,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":2286,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1617,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1505,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchMint":{"entryPoint":1902,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":1641,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2637,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2310,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1835,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2333},{"length":32,"start":2660}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806311e60a3e1461047657806331e66e1e146103f357806340c10f191461022f57806368573107146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760043567ffffffffffffffff81116100ac576101009036906004016105b0565b60243567ffffffffffffffff81116100ac576101209036906004016105b0565b9290916101557fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261014f610906565b90610669565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061018081610651565b9261018e60405194856105e1565b818452602084019160051b8101903682116100ac57915b818310610202575050506101b884610651565b926101c660405194856105e1565b848452602084019460051b8101903682116100ac57945b8186106101f25750506101f0935061076e565b005b85358152602095860195016101dd565b823573ffffffffffffffffffffffffffffffffffffffff811681036100ac578152602092830192016101a5565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ac576024356102ae7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261014f610906565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee82156103c9578161030b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054828101908082111561039757507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6102db565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac57604061042c610a4d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576104ad610906565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610583577f28963e1e000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156100ac5782359167ffffffffffffffff83116100ac576020808501948460051b0101116100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106225760051b60200190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156106c35750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561073f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036108c45781156108be5760009360005b8381106107e257505050508161079b575050565b60020180549180830192808411156107b257505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff610801828461072b565b511680156103c957610813828561072b565b5180610851575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301610787565b969190878301928311156108945773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061081a565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100ac575180151581036100ac5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a3e573233148015610a43575b610a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610991575b5061098e57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610a3257600091610a03575b5038610984565b610a25915060203d602011610a2b575b610a1d81836105e1565b8101906108ee565b386109fc565b503d610a13565b6040513d6000823e3d90fd5b503390565b506018361061094d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b81573233148015610b89575b610b8157803314908115610ae0575b50610aaf576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100ac5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610a3257600091610b62575b5038610aa3565b610b7b915060203d602011610a2b57610a1d81836105e1565b38610b5b565b506000903690565b5060183610610a9456fea2646970667358221220de4006a863840774c3f8337d8fc88475e0ae7221b81b77b407d8c5269e16d4e664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11E60A3E EQ PUSH2 0x476 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x22F JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x100 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x120 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5B0 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x155 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x14F PUSH2 0x906 JUMP JUMPDEST SWAP1 PUSH2 0x669 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x180 DUP2 PUSH2 0x651 JUMP JUMPDEST SWAP3 PUSH2 0x18E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5E1 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x202 JUMPI POP POP POP PUSH2 0x1B8 DUP5 PUSH2 0x651 JUMP JUMPDEST SWAP3 PUSH2 0x1C6 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5E1 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1F2 JUMPI POP POP PUSH2 0x1F0 SWAP4 POP PUSH2 0x76E JUMP JUMPDEST STOP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1DD JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xAC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1A5 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAC JUMPI PUSH1 0x24 CALLDATALOAD PUSH2 0x2AE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x14F PUSH2 0x906 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE DUP3 ISZERO PUSH2 0x3C9 JUMPI DUP2 PUSH2 0x30B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x397 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2DB JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x40 PUSH2 0x42C PUSH2 0xA4D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x4AD PUSH2 0x906 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x583 JUMPI PUSH32 0x28963E1E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x622 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x622 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x6C3 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x73F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x8C4 JUMPI DUP2 ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x7E2 JUMPI POP POP POP POP DUP2 PUSH2 0x79B JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x7B2 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x801 DUP3 DUP5 PUSH2 0x72B JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x3C9 JUMPI PUSH2 0x813 DUP3 DUP6 PUSH2 0x72B JUMP JUMPDEST MLOAD DUP1 PUSH2 0x851 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x787 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x894 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x81A JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xAC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xAC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA3E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA43 JUMPI JUMPDEST PUSH2 0xA3E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x991 JUMPI JUMPDEST POP PUSH2 0x98E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA32 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA03 JUMPI JUMPDEST POP CODESIZE PUSH2 0x984 JUMP JUMPDEST PUSH2 0xA25 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA2B JUMPI JUMPDEST PUSH2 0xA1D DUP2 DUP4 PUSH2 0x5E1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x8EE JUMP JUMPDEST CODESIZE PUSH2 0x9FC JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA13 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x94D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB81 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB89 JUMPI JUMPDEST PUSH2 0xB81 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAE0 JUMPI JUMPDEST POP PUSH2 0xAAF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xAC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA32 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB62 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAA3 JUMP JUMPDEST PUSH2 0xB7B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA2B JUMPI PUSH2 0xA1D DUP2 DUP4 PUSH2 0x5E1 JUMP JUMPDEST CODESIZE PUSH2 0xB5B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA94 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE BLOCKHASH MOD 0xA8 PUSH4 0x840774C3 EXTCALL CALLER PUSH30 0x8FC88475E0AE7221B81B77B407D8C5269E16D4E664736F6C634300081E00 CALLER ","sourceMap":"241:252:133:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;241:252:133;1639:41:262;;:::i;:::-;1488:12:247;;:::i;:::-;241:252:133;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;:::-;241:252:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:12:247;241:252:133;1639:41:262;;:::i;1129:12:247:-;241:252:133;19546:16:280;;19542:53;;19609:10;19605:370;;241:252:133;;19989:31:280;241:252:133;;;;;;;;19989:31:280;241:252:133;19605:370:280;19652:8;241:252:133;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;241:252:133;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;241:252:133;19786:39:280;241:252:133;;;;;;19786:39:280;19542:53;19571:24;241:252:133;19571:24:280;241:252:133;;19571:24:280;241:252:133;;;;;;;;;;;;1874:39:262;;:::i;:::-;241:252:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1639:41:262;;:::i;:::-;241:252:133;;;;;;;3174:18:180;;;3170:53;;3678:32:280;241:252:133;500:10:59;241:252:133;500:10:59;;;;;;;636:1:180;500:10:59;;;241:252:133;3170:53:180;3201:22;241:252:133;3201:22:180;241:252:133;;;;3201:22:180;241:252:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;241:252:133;;;;;-1:-1:-1;241:252:133;;;;;;;;;;;;:::o;3640:170:41:-;241:252:133;-1:-1:-1;241:252:133;;;;-1:-1:-1;241:252:133;;;;-1:-1:-1;241:252:133;;;;;-1:-1:-1;241:252:133;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;241:252:133;3775:28:41;;-1:-1:-1;3775:28:41;241:252:133;3775:28:41;241:252:133;;;;;-1:-1:-1;3775:28:41;241:252:133;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;20857:1233:280;;;241:252:133;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;241:252:133;;;;;;21949:19:280;;;;;21945:76;;241:252:133;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;241:252:133;;;;-1:-1:-1;21977:44:280;21174:3;241:252:133;21206:13:280;;;;:::i;:::-;241:252:133;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;241:252:133;21344:10:280;21340:372;;21174:3;241:252:133;-1:-1:-1;21730:31:280;241:252:133;;;;;;;;;21730:31:280;241:252:133;21151:9:280;;21340:372;241:252:133;;;;;;21474:27:280;;;;21470:70;;241:252:133;;;-1:-1:-1;241:252:133;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;241:252:133;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21084:24;21101:7;;;;:::o;21011:62::-;21047:26;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280;241:252:133;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;241:252:133;1029:19:76;241:252:133;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;241:252:133;;;1676:74:76;;241:252:133;;;1676:74:76;;;241:252:133;1327:10:76;241:252:133;;;;1744:4:76;241:252:133;;;;;-1:-1:-1;1676:74:76;;241:252:133;;;;;;1676:74:76;;;;;;;241:252:133;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;241:252:133;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;241:252:133;2065:19:76;241:252:133;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;241:252:133;720:8:80;241:252:133;720:8:80;;241:252:133;;;;2115:1:76;2802:32;;:::o;2624:153::-;241:252:133;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;241:252:133;2361:10:76;241:252:133;;;;2771:4:76;241:252:133;;;;;-1:-1:-1;2682:95:76;;241:252:133;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"603400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"229","__msgData()":"infinite","batchMint(address[],uint256[])":"infinite","initERC20MintableStorage()":"infinite","mint(address,uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","batchMint(address[],uint256[])":"68573107","initERC20MintableStorage()":"11e60a3e","mint(address,uint256)":"40c10f19"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"initERC20MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"initERC20MintableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol\":\"ERC20MintableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20MintableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MintableFacet} from \\\"./../../../../token/ERC20/facets/ERC20MintableFacet.sol\\\";\\n\\ncontract ERC20MintableFacetMock is ERC20MintableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MintableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xfbb519c92c47c6030459ee118d0e0722cddfa3608d4eec2c15aac53d8d90ac55\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20MintableBase} from \\\"./../base/ERC20MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC20MintableFacet is ERC20MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4d0a5b65e861f1813504c967eb8537411278999586ad2384d825e953fef7eeeb\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"initERC20MintableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Mintable."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol":{"ERC20PermitFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC20PermitStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"initERC20PermitStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610b8038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610af79081610089823960805181818161085701526109920152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80631de5d8441461048757806331e66e1e146104045780633644e515146103c35780637ecebe001461033e5763d505accf1461005357600080fd5b346103395760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103395761008a6105c1565b6024359073ffffffffffffffffffffffffffffffffffffffff8216809203610339576044356064356084359060ff82168092036103395773ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d941693841561030f578142116102e1576020926000926080928785528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528960408401528a6060840152888684015260a083015260c082015260c0815261017860e0826105e4565b519020610183610654565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526101c86062826105e4565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156102d5578173ffffffffffffffffffffffffffffffffffffffff60005116036102ab57821561027d5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055604051908152a3005b507ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346103395760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610339576103756105c1565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103395760206103fc610654565b604051908152f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033957604061043d61097b565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610339576104be610840565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610594577f9d8ff7da000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fe136d7b577e24834119bec976c568a497f54cf7b8bef8b9534f1ac7a342834a080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033957565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516000907f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8154918260011c906001841693841561081e575b6020831085146107f157828452602084019484929181156107b75750600114610738575b6106be925003826105e4565b51902060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261073260c0826105e4565b51902090565b507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81600090815290917fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa4285b81831061079b5750509060206106be928201016106b2565b6020919350806001915483858801015201910190918392610783565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168652506106be92151560051b820160200190506106b2565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f169161068e565b90816020910312610339575180151581036103395790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561096c573233148015610971575b61096c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108cb575b506108c857503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156102d55760009161093d575b50386108be565b61095f915060203d602011610965575b61095781836105e4565b810190610828565b38610936565b503d61094d565b503390565b5060183610610887565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610aaf573233148015610ab7575b610aaf57803314908115610a0e575b506109dd576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103395760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156102d557600091610a90575b50386109d1565b610aa9915060203d6020116109655761095781836105e4565b38610a89565b506000903690565b50601836106109c256fea2646970667358221220b1d54b2a39957d7ad6c8566d151c949b3fc78ba01637803f6d04eeb45d97164e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xB80 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xAF7 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x857 ADD MSTORE PUSH2 0x992 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1DE5D844 EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x3C3 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x33E JUMPI PUSH4 0xD505ACCF EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x8A PUSH2 0x5C1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x339 JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x339 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP5 AND SWAP4 DUP5 ISZERO PUSH2 0x30F JUMPI DUP2 TIMESTAMP GT PUSH2 0x2E1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP8 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP10 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE DUP9 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x178 PUSH1 0xE0 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x183 PUSH2 0x654 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1C8 PUSH1 0x62 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x2D5 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x2AB JUMPI DUP3 ISZERO PUSH2 0x27D JUMPI PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x375 PUSH2 0x5C1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH1 0x20 PUSH2 0x3FC PUSH2 0x654 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH1 0x40 PUSH2 0x43D PUSH2 0x97B JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x4BE PUSH2 0x840 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x594 JUMPI PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xE136D7B577E24834119BEC976C568A497F54CF7B8BEF8B9534F1AC7A342834A0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x339 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x625 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP1 PUSH1 0x1 DUP5 AND SWAP4 DUP5 ISZERO PUSH2 0x81E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT DUP6 EQ PUSH2 0x7F1 JUMPI DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 DUP5 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x7B7 JUMPI POP PUSH1 0x1 EQ PUSH2 0x738 JUMPI JUMPDEST PUSH2 0x6BE SWAP3 POP SUB DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x732 PUSH1 0xC0 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 SWAP2 PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 JUMPDEST DUP2 DUP4 LT PUSH2 0x79B JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x6BE SWAP3 DUP3 ADD ADD PUSH2 0x6B2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x783 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 MSTORE POP PUSH2 0x6BE SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD PUSH1 0x20 ADD SWAP1 POP PUSH2 0x6B2 JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x68E JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x339 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x339 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x96C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x971 JUMPI JUMPDEST PUSH2 0x96C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8CB JUMPI JUMPDEST POP PUSH2 0x8C8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x93D JUMPI JUMPDEST POP CODESIZE PUSH2 0x8BE JUMP JUMPDEST PUSH2 0x95F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x965 JUMPI JUMPDEST PUSH2 0x957 DUP2 DUP4 PUSH2 0x5E4 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x828 JUMP JUMPDEST CODESIZE PUSH2 0x936 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x94D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x887 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAAF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAB7 JUMPI JUMPDEST PUSH2 0xAAF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA0E JUMPI JUMPDEST POP PUSH2 0x9DD JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x339 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA90 JUMPI JUMPDEST POP CODESIZE PUSH2 0x9D1 JUMP JUMPDEST PUSH2 0xAA9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x965 JUMPI PUSH2 0x957 DUP2 DUP4 PUSH2 0x5E4 JUMP JUMPDEST CODESIZE PUSH2 0xA89 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9C2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 0xD5 0x4B 0x2A CODECOPY SWAP6 PUSH30 0x7AD6C8566D151C949B3FC78BA01637803F6D04EEB45D97164E64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"237:246:134:-:0;;;;;;;;;;;;;-1:-1:-1;;237:246:134;;;;-1:-1:-1;;;;;237:246:134;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:246:134;;;;;;745:39:76;;237:246:134;;;;;;;;745:39:76;237:246:134;;;;;;;;;;;;-1:-1:-1;237:246:134;;;;;;-1:-1:-1;237:246:134;;;;;-1:-1:-1;237:246:134"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1473,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2088,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1508,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":1620,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_msgData":{"entryPoint":2427,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2112,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2135},{"length":32,"start":2450}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80631de5d8441461048757806331e66e1e146104045780633644e515146103c35780637ecebe001461033e5763d505accf1461005357600080fd5b346103395760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103395761008a6105c1565b6024359073ffffffffffffffffffffffffffffffffffffffff8216809203610339576044356064356084359060ff82168092036103395773ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d941693841561030f578142116102e1576020926000926080928785528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528960408401528a6060840152888684015260a083015260c082015260c0815261017860e0826105e4565b519020610183610654565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526101c86062826105e4565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156102d5578173ffffffffffffffffffffffffffffffffffffffff60005116036102ab57821561027d5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055604051908152a3005b507ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346103395760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610339576103756105c1565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103395760206103fc610654565b604051908152f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033957604061043d61097b565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103395760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610339576104be610840565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610594577f9d8ff7da000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fe136d7b577e24834119bec976c568a497f54cf7b8bef8b9534f1ac7a342834a080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033957565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516000907f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8154918260011c906001841693841561081e575b6020831085146107f157828452602084019484929181156107b75750600114610738575b6106be925003826105e4565b51902060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261073260c0826105e4565b51902090565b507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81600090815290917fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa4285b81831061079b5750509060206106be928201016106b2565b6020919350806001915483858801015201910190918392610783565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168652506106be92151560051b820160200190506106b2565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f169161068e565b90816020910312610339575180151581036103395790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561096c573233148015610971575b61096c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108cb575b506108c857503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156102d55760009161093d575b50386108be565b61095f915060203d602011610965575b61095781836105e4565b810190610828565b38610936565b503d61094d565b503390565b5060183610610887565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610aaf573233148015610ab7575b610aaf57803314908115610a0e575b506109dd576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103395760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156102d557600091610a90575b50386109d1565b610aa9915060203d6020116109655761095781836105e4565b38610a89565b506000903690565b50601836106109c256fea2646970667358221220b1d54b2a39957d7ad6c8566d151c949b3fc78ba01637803f6d04eeb45d97164e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1DE5D844 EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x3C3 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x33E JUMPI PUSH4 0xD505ACCF EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x8A PUSH2 0x5C1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x339 JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x339 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP5 AND SWAP4 DUP5 ISZERO PUSH2 0x30F JUMPI DUP2 TIMESTAMP GT PUSH2 0x2E1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP8 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP10 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE DUP9 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x178 PUSH1 0xE0 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x183 PUSH2 0x654 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1C8 PUSH1 0x62 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x2D5 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x2AB JUMPI DUP3 ISZERO PUSH2 0x27D JUMPI PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x375 PUSH2 0x5C1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH1 0x20 PUSH2 0x3FC PUSH2 0x654 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH1 0x40 PUSH2 0x43D PUSH2 0x97B JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x339 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x339 JUMPI PUSH2 0x4BE PUSH2 0x840 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x594 JUMPI PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xE136D7B577E24834119BEC976C568A497F54CF7B8BEF8B9534F1AC7A342834A0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x339 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x625 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP1 PUSH1 0x1 DUP5 AND SWAP4 DUP5 ISZERO PUSH2 0x81E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT DUP6 EQ PUSH2 0x7F1 JUMPI DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 DUP5 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x7B7 JUMPI POP PUSH1 0x1 EQ PUSH2 0x738 JUMPI JUMPDEST PUSH2 0x6BE SWAP3 POP SUB DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x732 PUSH1 0xC0 DUP3 PUSH2 0x5E4 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 SWAP2 PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 JUMPDEST DUP2 DUP4 LT PUSH2 0x79B JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x6BE SWAP3 DUP3 ADD ADD PUSH2 0x6B2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x783 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 MSTORE POP PUSH2 0x6BE SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD PUSH1 0x20 ADD SWAP1 POP PUSH2 0x6B2 JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x68E JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x339 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x339 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x96C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x971 JUMPI JUMPDEST PUSH2 0x96C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8CB JUMPI JUMPDEST POP PUSH2 0x8C8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x93D JUMPI JUMPDEST POP CODESIZE PUSH2 0x8BE JUMP JUMPDEST PUSH2 0x95F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x965 JUMPI JUMPDEST PUSH2 0x957 DUP2 DUP4 PUSH2 0x5E4 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x828 JUMP JUMPDEST CODESIZE PUSH2 0x936 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x94D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x887 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAAF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAB7 JUMPI JUMPDEST PUSH2 0xAAF JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA0E JUMPI JUMPDEST POP PUSH2 0x9DD JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x339 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2D5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA90 JUMPI JUMPDEST POP CODESIZE PUSH2 0x9D1 JUMP JUMPDEST PUSH2 0xAA9 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x965 JUMPI PUSH2 0x957 DUP2 DUP4 PUSH2 0x5E4 JUMP JUMPDEST CODESIZE PUSH2 0xA89 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9C2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 0xD5 0x4B 0x2A CODECOPY SWAP6 PUSH30 0x7AD6C8566D151C949B3FC78BA01637803F6D04EEB45D97164E64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"237:246:134:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2404:19:279;;;2400:60;;2474:15;;:26;2470:67;;237:246:134;2653:23:279;237:246:134;2653:23:279;237:246:134;2653:23:279;237:246:134;;;;;;;;;;;1021:95:279;237:246:134;1021:95:279;;;;237:246:134;;2602:87:279;;;;237:246:134;1021:95:279;237:246:134;;1021:95:279;237:246:134;1021:95:279;;237:246:134;1021:95:279;237:246:134;1021:95:279;;237:246:134;1021:95:279;;;;237:246:134;;1021:95:279;;237:246:134;;1021:95:279;;237:246:134;;2602:87:279;;;237:246:134;2602:87:279;;:::i;:::-;237:246:134;2592:98:279;;2758:18;;:::i;:::-;237:246:134;;;2729:60:279;;;;1021:95;;;;;;;237:246:134;1021:95:279;;;237:246:134;1021:95:279;2729:60;;;;;;:::i;:::-;237:246:134;2719:71:279;;237:246:134;;;;;;1021:95:279;;;;237:246:134;;;1021:95:279;;237:246:134;;;;1021:95:279;;237:246:134;2821:24:279;;;237:246:134;2821:24:279;;;;;;237:246:134;;2821:24:279;237:246:134;2863:15:279;2859:57;;4533:21:280;;4529:67;;237:246:134;4657:31:280;4606:19;237:246:134;;;4606:12:280;237:246:134;;;;;;-1:-1:-1;237:246:134;;;;;-1:-1:-1;237:246:134;1021:95:279;237:246:134;;;;;4657:31:280;237:246:134;4529:67:280;4563:33;;237:246:134;4563:33:280;237:246:134;;;;4563:33:280;2859:57:279;2887:29;237:246:134;2887:29:279;237:246:134;;2887:29:279;2821:24;237:246:134;;1021:95:279;237:246:134;1021:95:279;;;;;2470:67;2509:28;;237:246:134;2509:28:279;237:246:134;;;;2509:28:279;2400:60;2432:28;237:246:134;2432:28:279;237:246:134;;2432:28:279;237:246:134;;;;;;;;;;;;;;;;;:::i;:::-;;;3281:22:279;237:246:134;-1:-1:-1;237:246:134;;;;;-1:-1:-1;237:246:134;;;;;;;;;;;;;;;;;;;;1284:37:248;;:::i;:::-;237:246:134;;;;;;;;;;;;;;;;;;1899:39:263;;:::i;:::-;237:246:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1664:41:263;;:::i;:::-;237:246:134;;;;;;;3174:18:180;;;3170:53;;1298:30:279;237:246:134;500:10:59;237:246:134;500:10:59;;;;;;;636:1:180;500:10:59;;;237:246:134;3170:53:180;3201:22;237:246:134;3201:22:180;237:246:134;;;;3201:22:180;237:246:134;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;237:246:134;;;;;-1:-1:-1;237:246:134;4317:545:279;237:246:134;;-1:-1:-1;237:246:134;;;;;733:1:277;237:246:134;;733:1:277;237:246:134;;;;;;;4317:545:279;237:246:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4669:54:279;;237:246:134;;;4520:321:279;;237:246:134;4552:95:279;237:246:134;;;;;;4745:14:279;237:246:134;;;;4412:53:279;237:246:134;;;;4818:4:279;237:246:134;;;;;4520:321:279;;;;;;:::i;:::-;237:246:134;4493:362:279;;4317:545;:::o;237:246:134:-;-1:-1:-1;237:246:134;-1:-1:-1;237:246:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;733:1:277;237:246:134;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:246:134;;;;;;;;;;;-1:-1:-1;237:246:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;237:246:134;1029:19:76;237:246:134;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;237:246:134;;;1676:74:76;;237:246:134;;;1676:74:76;;;237:246:134;1327:10:76;237:246:134;;;;1744:4:76;237:246:134;;;;;-1:-1:-1;1676:74:76;;237:246:134;;;;;;1676:74:76;;;;;;;237:246:134;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;237:246:134;2065:19:76;237:246:134;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;237:246:134;720:8:80;237:246:134;720:8:80;;237:246:134;;;;2115:1:76;2802:32;;:::o;2624:153::-;237:246:134;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;237:246:134;2361:10:76;237:246:134;;;;2771:4:76;237:246:134;;;;;-1:-1:-1;2682:95:76;;237:246:134;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"561400","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","__msgData()":"infinite","initERC20PermitStorage()":"infinite","nonces(address)":"2443","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","__msgData()":"31e66e1e","initERC20PermitStorage()":"1de5d844","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20PermitStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"initERC20PermitStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"initERC20PermitStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Permit.\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol\":\"ERC20PermitFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20PermitFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20PermitFacet} from \\\"./../../../../token/ERC20/facets/ERC20PermitFacet.sol\\\";\\n\\ncontract ERC20PermitFacetMock is ERC20PermitFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20PermitFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xdba164d56f8044c835e3f9a044a97ac5de2f134f5009fb2bcbcb350870508b82\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20PermitFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../base/ERC20PermitBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}.\\ncontract ERC20PermitFacet is ERC20PermitBase, ForwarderRegistryContextBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20PermitStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20PermitStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x056fa03def6ad26ffde135a453cc0d1fcd2ae27a72ee64a5132f45da2008e676\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"initERC20PermitStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Permit."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"}},"version":1}}},"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol":{"ERC20SafeTransfersFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC20SafeTransfersStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"initERC20SafeTransfersStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610d9638819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610d0d908161008982396080518181816106ed015261084f0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e14610515578063b88d4fde1461024c578063d294f8eb146101125763eb7955491461004857600080fd5b3461010d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5761007f610598565b60243560443567ffffffffffffffff811161010d576100a29036906004016105bb565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926100db83836100d4610838565b8097610b36565b813b6100ed575b602060405160018152f35b610103946100fc913691610659565b9280610963565b38808080806100e2565b600080fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610149610838565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021f577f53f41a97000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610283610598565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361010d5760443560643567ffffffffffffffff811161010d576102c69036906004016105bb565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee936102f3610838565b9484848473ffffffffffffffffffffffffffffffffffffffff89169373ffffffffffffffffffffffffffffffffffffffff82169480860361036b575b5061033a9450610b36565b823b61034b57602060405160018152f35b6103609561035a913691610659565b93610963565b8080808080806100e2565b925092505080156104e7578487928792856000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002081600052602052604060002054957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871415806104de575b610419575b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602061033a98604051908152a38b61032f565b935093909480925003908082101561049b575061033a93889388937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560208a95836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055985050506103e5565b889150608493604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508515156103e0565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57604061054e6106d6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010d57565b9181601f8401121561010d5782359167ffffffffffffffff831161010d576020838186019501011161010d57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b92919267ffffffffffffffff821161062a57604051916106a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846105e9565b82948184528183011161010d578281602093846000960137010152565b9081602091031261010d5751801515810361010d5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561082657323314801561082e575b61082657803314908115610769575b50610738576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161010d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561081a576000916107eb575b503861072c565b61080d915060203d602011610813575b61080581836105e9565b8101906106be565b386107e4565b503d6107fb565b6040513d6000823e3d90fd5b506000903690565b506018361061071d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610954573233148015610959575b610954577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108c3575b506108c057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561081a57600091610935575b50386108b6565b61094e915060203d6020116108135761080581836105e9565b3861092e565b503390565b506018361061087f565b9290939173ffffffffffffffffffffffffffffffffffffffff8091169481604051957f4fc358590000000000000000000000000000000000000000000000000000000087521660048601521660248401526044830152608060648301528181519182608483015260005b838110610b1e57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561081a57600091610a9c575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603610a6f5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011610b16575b81610ab5602093836105e9565b81010312610b125751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610b0f57507fffffffff00000000000000000000000000000000000000000000000000000000610a22565b80fd5b5080fd5b3d9150610aa8565b602082820181015160a48784010152859350016109cd565b929173ffffffffffffffffffffffffffffffffffffffff16928315610c935782610ba0575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610c4757508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610c20575b5050925050610b5b565b83831660005281855260406000205586600052835260406000208581540190553880610c16565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220a684e5a464bb0aa5a2bf17e47ec30c0c052c1b8f153c4945f26048370d8a6a8464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xD96 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD0D SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x6ED ADD MSTORE PUSH2 0x84F ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x24C JUMPI DUP1 PUSH4 0xD294F8EB EQ PUSH2 0x112 JUMPI PUSH4 0xEB795549 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x7F PUSH2 0x598 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BB JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xDB DUP4 DUP4 PUSH2 0xD4 PUSH2 0x838 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xB36 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xED JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x103 SWAP5 PUSH2 0xFC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x659 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x963 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0xE2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x149 PUSH2 0x838 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21F JUMPI PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x283 PUSH2 0x598 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x10D JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0x2C6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x2F3 PUSH2 0x838 JUMP JUMPDEST SWAP5 DUP5 DUP5 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP1 DUP7 SUB PUSH2 0x36B JUMPI JUMPDEST POP PUSH2 0x33A SWAP5 POP PUSH2 0xB36 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x360 SWAP6 PUSH2 0x35A SWAP2 CALLDATASIZE SWAP2 PUSH2 0x659 JUMP JUMPDEST SWAP4 PUSH2 0x963 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE2 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP DUP1 ISZERO PUSH2 0x4E7 JUMPI DUP5 DUP8 SWAP3 DUP8 SWAP3 DUP6 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 EQ ISZERO DUP1 PUSH2 0x4DE JUMPI JUMPDEST PUSH2 0x419 JUMPI JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH2 0x33A SWAP9 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP12 PUSH2 0x32F JUMP JUMPDEST SWAP4 POP SWAP4 SWAP1 SWAP5 DUP1 SWAP3 POP SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x49B JUMPI POP PUSH2 0x33A SWAP4 DUP9 SWAP4 DUP9 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 DUP11 SWAP6 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP9 POP POP POP PUSH2 0x3E5 JUMP JUMPDEST DUP9 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP6 ISZERO ISZERO PUSH2 0x3E0 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x40 PUSH2 0x54E PUSH2 0x6D6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x10D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x62A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x62A JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x6A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x5E9 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x10D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x10D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x10D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x826 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x82E JUMPI JUMPDEST PUSH2 0x826 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x769 JUMPI JUMPDEST POP PUSH2 0x738 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x10D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7EB JUMPI JUMPDEST POP CODESIZE PUSH2 0x72C JUMP JUMPDEST PUSH2 0x80D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x813 JUMPI JUMPDEST PUSH2 0x805 DUP2 DUP4 PUSH2 0x5E9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6BE JUMP JUMPDEST CODESIZE PUSH2 0x7E4 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7FB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x71D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x954 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x959 JUMPI JUMPDEST PUSH2 0x954 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8C3 JUMPI JUMPDEST POP PUSH2 0x8C0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x935 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B6 JUMP JUMPDEST PUSH2 0x94E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x813 JUMPI PUSH2 0x805 DUP2 DUP4 PUSH2 0x5E9 JUMP JUMPDEST CODESIZE PUSH2 0x92E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87F JUMP JUMPDEST SWAP3 SWAP1 SWAP4 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP5 DUP2 PUSH1 0x40 MLOAD SWAP6 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xB1E JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA9C JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xA6F JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB16 JUMPI JUMPDEST DUP2 PUSH2 0xAB5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x5E9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xB12 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xB0F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xA22 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x9CD JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xC93 JUMPI DUP3 PUSH2 0xBA0 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xC47 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xC20 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xB5B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xC16 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA6 DUP5 JUMPF 0xA464 0xBB EXP 0xA5 LOG2 0xBF OR RETF PUSH31 0xC30C0C052C1B8F153C4945F26048370D8A6A8464736F6C634300081E003300 ","sourceMap":"251:267:135:-:0;;;;;;;;;;;;;-1:-1:-1;;251:267:135;;;;-1:-1:-1;;;;;251:267:135;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;251:267:135;;;;;;745:39:76;;251:267:135;;;;;;;;745:39:76;251:267:135;;;;;;;;;;;;-1:-1:-1;251:267:135;;;;;;-1:-1:-1;251:267:135;;;;;-1:-1:-1;251:267:135"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1432,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":1625,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":1726,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":1467,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1513,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":2403,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_msgData":{"entryPoint":1750,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2104,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transfer":{"entryPoint":2870,"id":29123,"parameterSlots":4,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1773},{"length":32,"start":2127}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e14610515578063b88d4fde1461024c578063d294f8eb146101125763eb7955491461004857600080fd5b3461010d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5761007f610598565b60243560443567ffffffffffffffff811161010d576100a29036906004016105bb565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926100db83836100d4610838565b8097610b36565b813b6100ed575b602060405160018152f35b610103946100fc913691610659565b9280610963565b38808080806100e2565b600080fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610149610838565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021f577f53f41a97000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610283610598565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361010d5760443560643567ffffffffffffffff811161010d576102c69036906004016105bb565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee936102f3610838565b9484848473ffffffffffffffffffffffffffffffffffffffff89169373ffffffffffffffffffffffffffffffffffffffff82169480860361036b575b5061033a9450610b36565b823b61034b57602060405160018152f35b6103609561035a913691610659565b93610963565b8080808080806100e2565b925092505080156104e7578487928792856000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002081600052602052604060002054957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871415806104de575b610419575b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602061033a98604051908152a38b61032f565b935093909480925003908082101561049b575061033a93889388937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560208a95836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055985050506103e5565b889150608493604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508515156103e0565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57604061054e6106d6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010d57565b9181601f8401121561010d5782359167ffffffffffffffff831161010d576020838186019501011161010d57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b92919267ffffffffffffffff821161062a57604051916106a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846105e9565b82948184528183011161010d578281602093846000960137010152565b9081602091031261010d5751801515810361010d5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561082657323314801561082e575b61082657803314908115610769575b50610738576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161010d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561081a576000916107eb575b503861072c565b61080d915060203d602011610813575b61080581836105e9565b8101906106be565b386107e4565b503d6107fb565b6040513d6000823e3d90fd5b506000903690565b506018361061071d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610954573233148015610959575b610954577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108c3575b506108c057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561081a57600091610935575b50386108b6565b61094e915060203d6020116108135761080581836105e9565b3861092e565b503390565b506018361061087f565b9290939173ffffffffffffffffffffffffffffffffffffffff8091169481604051957f4fc358590000000000000000000000000000000000000000000000000000000087521660048601521660248401526044830152608060648301528181519182608483015260005b838110610b1e57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561081a57600091610a9c575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603610a6f5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011610b16575b81610ab5602093836105e9565b81010312610b125751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610b0f57507fffffffff00000000000000000000000000000000000000000000000000000000610a22565b80fd5b5080fd5b3d9150610aa8565b602082820181015160a48784010152859350016109cd565b929173ffffffffffffffffffffffffffffffffffffffff16928315610c935782610ba0575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610c4757508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610c20575b5050925050610b5b565b83831660005281855260406000205586600052835260406000208581540190553880610c16565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220a684e5a464bb0aa5a2bf17e47ec30c0c052c1b8f153c4945f26048370d8a6a8464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x24C JUMPI DUP1 PUSH4 0xD294F8EB EQ PUSH2 0x112 JUMPI PUSH4 0xEB795549 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x7F PUSH2 0x598 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BB JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xDB DUP4 DUP4 PUSH2 0xD4 PUSH2 0x838 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xB36 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xED JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x103 SWAP5 PUSH2 0xFC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x659 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x963 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0xE2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x149 PUSH2 0x838 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21F JUMPI PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x283 PUSH2 0x598 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x10D JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0x2C6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x2F3 PUSH2 0x838 JUMP JUMPDEST SWAP5 DUP5 DUP5 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP1 DUP7 SUB PUSH2 0x36B JUMPI JUMPDEST POP PUSH2 0x33A SWAP5 POP PUSH2 0xB36 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x360 SWAP6 PUSH2 0x35A SWAP2 CALLDATASIZE SWAP2 PUSH2 0x659 JUMP JUMPDEST SWAP4 PUSH2 0x963 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE2 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP DUP1 ISZERO PUSH2 0x4E7 JUMPI DUP5 DUP8 SWAP3 DUP8 SWAP3 DUP6 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 EQ ISZERO DUP1 PUSH2 0x4DE JUMPI JUMPDEST PUSH2 0x419 JUMPI JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH2 0x33A SWAP9 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP12 PUSH2 0x32F JUMP JUMPDEST SWAP4 POP SWAP4 SWAP1 SWAP5 DUP1 SWAP3 POP SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x49B JUMPI POP PUSH2 0x33A SWAP4 DUP9 SWAP4 DUP9 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 DUP11 SWAP6 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP9 POP POP POP PUSH2 0x3E5 JUMP JUMPDEST DUP9 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP6 ISZERO ISZERO PUSH2 0x3E0 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x40 PUSH2 0x54E PUSH2 0x6D6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x10D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x62A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x62A JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x6A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x5E9 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x10D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x10D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x10D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x826 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x82E JUMPI JUMPDEST PUSH2 0x826 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x769 JUMPI JUMPDEST POP PUSH2 0x738 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x10D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7EB JUMPI JUMPDEST POP CODESIZE PUSH2 0x72C JUMP JUMPDEST PUSH2 0x80D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x813 JUMPI JUMPDEST PUSH2 0x805 DUP2 DUP4 PUSH2 0x5E9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6BE JUMP JUMPDEST CODESIZE PUSH2 0x7E4 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7FB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x71D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x954 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x959 JUMPI JUMPDEST PUSH2 0x954 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8C3 JUMPI JUMPDEST POP PUSH2 0x8C0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x935 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B6 JUMP JUMPDEST PUSH2 0x94E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x813 JUMPI PUSH2 0x805 DUP2 DUP4 PUSH2 0x5E9 JUMP JUMPDEST CODESIZE PUSH2 0x92E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87F JUMP JUMPDEST SWAP3 SWAP1 SWAP4 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP5 DUP2 PUSH1 0x40 MLOAD SWAP6 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xB1E JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x81A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA9C JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xA6F JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB16 JUMPI JUMPDEST DUP2 PUSH2 0xAB5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x5E9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xB12 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xB0F JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xA22 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x9CD JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xC93 JUMPI DUP3 PUSH2 0xBA0 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xC47 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xC20 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xB5B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xC16 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA6 DUP5 JUMPF 0xA464 0xBB EXP 0xA5 LOG2 0xBF OR RETF PUSH31 0xC30C0C052C1B8F153C4945F26048370D8A6A8464736F6C634300081E003300 ","sourceMap":"251:267:135:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;251:267:135;1633:41:264;17093:5:280;1633:41:264;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;251:267:135;;;;;;;;17109:96:280;17145:49;251:267:135;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;251:267:135;;;;;;;;;;;;;;;1633:41:264;;:::i;:::-;251:267:135;;;;;;;3174:18:180;;;3170:53;;3431:37:280;251:267:135;500:10:59;251:267:135;500:10:59;;;;;;;636:1:180;500:10:59;;;251:267:135;3170:53:180;3201:22;251:267:135;3201:22:180;251:267:135;;;;3201:22:180;251:267:135;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;251:267:135;1633:41:264;;;:::i;:::-;251:267:135;;;;;;;;;;;9707:14:280;;;;9703:85;;251:267:135;9818:5:280;;;;;:::i;:::-;376:58:354;;18723:98:280;;251:267:135;;;;;;;18723:98:280;18759:51;251:267:135;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;6808:21;;;;;;;6804:67;;6908:19;;;;;251:267:135;-1:-1:-1;251:267:135;6908:12:280;251:267:135;;;-1:-1:-1;251:267:135;;-1:-1:-1;251:267:135;;;;-1:-1:-1;251:267:135;;6951:37:280;6971:17;6951:37;;;:51;;;9703:85;6947:534;;9703:85;7495:42;251:267:135;9818:5:280;251:267:135;;;;;;7495:42:280;9703:85;;;6947:534;251:267:135;;;;;;;;;7238:32:280;;;;;7234:112;;7364:19;9818:5;7364:19;;;;;7495:42;251:267:135;7364:19:280;;251:267:135;-1:-1:-1;251:267:135;6908:12:280;251:267:135;;;-1:-1:-1;251:267:135;;-1:-1:-1;251:267:135;;;;;-1:-1:-1;251:267:135;;6947:534:280;;;;;;7234:112;251:267:135;;;7279:67:280;251:267:135;;;7279:67:280;;;;251:267:135;7279:67:280;;251:267:135;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;6838:33;;251:267:135;6838:33:280;251:267:135;;;;6838:33:280;251:267:135;;;;;;;;;;;;1868:39:264;;:::i;:::-;251:267:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;251:267:135;;;;;-1:-1:-1;251:267:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;251:267:135;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;251:267:135;2065:19:76;251:267:135;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;251:267:135;720:8:80;251:267:135;720:8:80;;251:267:135;;;;2115:1:76;2802:32;;:::o;2624:153::-;251:267:135;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;251:267:135;2361:10:76;251:267:135;;;;2771:4:76;251:267:135;;;;;-1:-1:-1;2682:95:76;;251:267:135;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;251:267:135;;;2115:1:76;251:267:135;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;251:267:135;1029:19:76;251:267:135;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;251:267:135;;;1676:74:76;;251:267:135;;;1676:74:76;;;251:267:135;1327:10:76;251:267:135;;;;1744:4:76;251:267:135;;;;;-1:-1:-1;1676:74:76;;251:267:135;;;;;;1676:74:76;;;;;;;251:267:135;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;;;;;251:267:135;28229:252:280;;251:267:135;;;;;28357:61:280;251:267:135;28357:61:280;;251:267:135;28357:61:280;;;251:267:135;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;251:267:135;;;;;;;;;;;;;-1:-1:-1;251:267:135;;;;;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;251:267:135;;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;251:267:135;;-1:-1:-1;28445:29:280;28357:61;251:267:135;28357:61:280;;251:267:135;28357:61:280;;;;;;251:267:135;28357:61:280;;;:::i;:::-;;;251:267:135;;;;;;;;;;;;;28357:61:280;251:267:135;28357:61:280;;251:267:135;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;;251:267:135;;;;;;;;;;;;;;;;-1:-1:-1;251:267:135;;;8105:628:280;;;251:267:135;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;251:267:135;;;8701:25:280;251:267:135;;;;;;;8701:25:280;;8105:628::o;8273:413::-;251:267:135;;;-1:-1:-1;251:267:135;;;;;-1:-1:-1;251:267:135;;;;;8437:21:280;;;;;8433:80;;251:267:135;;;;;;;;8701:25:280;251:267:135;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;251:267:135;;;-1:-1:-1;251:267:135;;;;;-1:-1:-1;251:267:135;;;-1:-1:-1;251:267:135;;;;-1:-1:-1;251:267:135;;;;;;;8531:131:280;;;;8433:80;8467:46;;251:267:135;8467:46:280;;8219:1;8467:46;251:267:135;8467:46:280;251:267:135;;;;;;8219:1:280;8467:46;8201:61;251:267:135;8230:32:280;;8219:1;8230:32;251:267:135;8230:32:280;251:267:135;;8219:1:280;8230:32"},"gasEstimates":{"creation":{"codeDepositCost":"668200","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initERC20SafeTransfersStorage()":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initERC20SafeTransfersStorage()":"d294f8eb","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20SafeTransfersStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC20SafeTransfersStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"initERC20SafeTransfersStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol\":\"ERC20SafeTransfersFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/facets/ERC20SafeTransfersFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20SafeTransfersFacet} from \\\"./../../../../token/ERC20/facets/ERC20SafeTransfersFacet.sol\\\";\\n\\ncontract ERC20SafeTransfersFacetMock is ERC20SafeTransfersFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20SafeTransfersFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x78ad7426ca3d0d1c07288df309c0e2107a386804c6ce928cb835e054ea6dce97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../base/ERC20SafeTransfersBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20SafeTransfersFacet is ERC20SafeTransfersBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20SafeTransfersStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x233dbea2002b2ebdba3c0a0a255adf92ead39f6fd7fb2547e3840c4c5e97c11b\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"initERC20SafeTransfersStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."}},"version":1}}},"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol":{"ERC20FixedSupplyMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1737,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1700,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1844,"id":null,"parameterSlots":1,"returnSlots":1},"fun_batchMint":{"entryPoint":1909,"id":29811,"parameterSlots":2,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":1867,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a06040523461066f5761363480380380610019816106a4565b928339810160c08282031261066f5781516001600160401b03811161066f57816100449184016106c9565b60208301519092906001600160401b03811161066f57826100669183016106c9565b9260408201519060ff821680920361066f5760608301516001600160401b03811161066f5783019284601f8501121561066f5783516100ac6100a782610734565b6106a4565b9460208087848152019260051b8201019087821161066f57602001915b8183106106845750505060808101516001600160401b03811161066f5781019480601f8701121561066f5785516101026100a782610734565b9660208089848152019260051b82010192831161066f57602001905b8282106106745750505060a00151916001600160a01b038316830361066f577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f8054600160ff199182168117909255634e83a8c360e11b6000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680549091169091179055825190926001600160401b038211610545576000805160206135f48339815191525490600182811c92168015610665575b60208310146105255781601f8493116105e8575b50602090601f83116001146105665760009261055b575b50508160011b916000199060031b1c1916176000805160206135f4833981519152555b85516001600160401b038111610545576000805160206135b483398151915254600181811c9116801561053b575b602082101461052557601f81116104b3575b506020601f821160011461042e57819061039798600092610423575b50508160011b916000199060031b1c1916176000805160206135b4833981519152555b60ff196000805160206136148339815191525416176000805160206136148339815191525563a219a02560e01b600052806020526040600020600160ff19825416179055336103c4575b6307f5828d60e41b600090815260209190915260408082208054600160ff1991821681179092556303c130d960e41b84528284208054821683179055634ec7fbed60e11b845282842080548216831790556353f41a9760e01b8452828420805482168317905563602993f360e11b84529190922080549091169091179055608052610775565b604051612ce690816108ce823960805181818161170a01528181611b90015281816128d50152612a000152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610311565b0151905038806102a4565b601f198216976000805160206135b4833981519152600052816000209860005b81811061049b5750916103979991846001959410610482575b505050811b016000805160206135b4833981519152556102c7565b015160001960f88460031b161c19169055388080610467565b838301518b556001909a01996020938401930161044e565b6000805160206135b48339815191526000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c8101916020841061051b575b601f0160051c01905b81811061050f5750610288565b60008155600101610502565b90915081906104f9565b634e487b7160e01b600052602260045260246000fd5b90607f1690610276565b634e487b7160e01b600052604160045260246000fd5b015190503880610225565b6000805160206135f483398151915260009081528281209350601f198516905b8181106105d057509084600195949392106105b7575b505050811b016000805160206135f483398151915255610248565b015160001960f88460031b161c1916905538808061059c565b92936020600181928786015181550195019301610586565b6000805160206135f48339815191526000529091507fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa428601f840160051c8101916020851061065b575b90601f859493920160051c01905b81811061064c575061020e565b6000815584935060010161063f565b9091508190610631565b91607f16916101fa565b600080fd5b815181526020918201910161011e565b82516001600160a01b038116810361066f578152602092830192016100c9565b6040519190601f01601f191682016001600160401b0381118382101761054557604052565b81601f8201121561066f578051906001600160401b038211610545576106f8601f8301601f19166020016106a4565b928284526020838301011161066f5760005b82811061071f57505060206000918301015290565b8060208092840101518282870101520161070a565b6001600160401b0381116105455760051b60200190565b805182101561075f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815190805182036108bc5781156108b75760009260005b8381106107e85750505050806107a05750565b6000805160206135d4833981519152549080820191808311156107d15750506000805160206135d483398151915255565b6301b352fb60e11b60005260045260245260446000fd5b6001600160a01b036107fa828461074b565b511680156108a65761080c828561074b565b518061084a575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161078d565b959190868301928311156108955760008181527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee602052604090208054880190559195909190610813565b631550ab9f60e21b60005260046000fd5b6392fd9c8f60e01b60005260046000fd5b505050565b6332c1299b60e11b60005260046000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461191057806306fdde03146118b5578063095ea7b31461184857806318160ddd146117ed57806323b872dd1461172e5780632b4c9f16146116bf578063313ce5671461166157806331e66e1e146115de5780633644e5151461159d578063395093511461136d5780633c130d90146113125780634885b25414611264578063572b6c051461121957806370a082311461119457806373c8a958146110115780637ecebe0014610f8c57806388d695b214610f485780638da5cb5b14610ed757806395d89b4114610e64578063a457c2d714610df7578063a9059cbb14610d8a578063b88d4fde14610c7a578063c3666c3614610a3d578063d505accf146107ca578063dd62ed3e1461071b578063e0df5b6f146104d0578063eb7955491461040b578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc5761016936611adf565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa6128be565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d5818387611f49565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff828587611f49565b359081471061028a57600080809381935af13d15610282573d9061022282612835565b916102306040519384611cda565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f6119d5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103786128be565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102eb575073ffffffffffffffffffffffffffffffffffffffff16928383036103be57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104426119d5565b60243560443567ffffffffffffffff81116102bc57610465903690600401611b4b565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261049e83836104976128be565b8097612694565b813b6104b0575b602060405160018152f35b6104c6946104bf91369161286f565b9280612b2f565b80808080806104a5565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc5761051f903690600401611b4b565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055e6128be565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106ec576105a68254611c87565b601f81116106a4575b506000601f8211600114610609578192936000926105fe575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b86811061068c5750836001959610610654575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061064a565b90926020600181928686013581550194019101610637565b826000526020600020601f830160051c810191602084106106e2575b601f0160051c01905b8181106106d657506105af565b600081556001016106c9565b90915081906106c0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576107526119d5565b73ffffffffffffffffffffffffffffffffffffffff61076f6119f8565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576108016119d5565b6108096119f8565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a13578142116109e5576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108eb60e082611cda565b5190206108f6611ea2565b9060405190868201927f19010000000000000000000000000000000000000000000000000000000000008452602283015260428201526042815261093b606282611cda565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109d95773ffffffffffffffffffffffffffffffffffffffff60005116036109af576109ad927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ddd565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc57610a4b36611a4c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a906128be565b92541691169081036102eb5750808214801590610c70575b6102c15760005b828110610ab857005b73ffffffffffffffffffffffffffffffffffffffff610ae0610adb83858a611f49565b611f88565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109d957600091610c42575b5015610c15575073ffffffffffffffffffffffffffffffffffffffff610b6f610adb83858a611f49565b1690610b7f610adb828689611f49565b91610b8b82878b611f49565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109d957600192610c04575b5001610aaf565b6000610c0f91611cda565b88610bfd565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c63915060203d8111610c69575b610c5b8183611cda565b8101906128a6565b89610b45565b503d610c51565b5082821415610aa8565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610cb16119d5565b610cb96119f8565b60443560643567ffffffffffffffff81116102bc57610cdc903690600401611b4b565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d48848484610d0f6128be565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d7957612694565b823b610d5957602060405160018152f35b610d6e95610d6891369161286f565b93612b2f565b8080808080806104a5565b610d85848b84846124b6565b612694565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a5610dc46119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610df16128be565b90612694565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a5610e316119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e5e6128be565b906124b6565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611d1b565b604051918291602083526020830190611976565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc576104a5610f5936611adf565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f866128be565b90612255565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610fc36119d5565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc5761101f36611a4c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806110626128be565b92541691169081036102eb575080831480159061118a575b6102c15760005b83811061108a57005b611095818388611f49565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a826110d6876110cf610adb828f8f90611f49565b938b611f49565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611131606482611cda565b51925af1156109d9576000513d6111815750803b155b6111545750600101611081565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611147565b508583141561107a565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576111cb6119d5565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602061125a6112556119d5565b611b79565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761129b6119d5565b60243567ffffffffffffffff81116102bc576112bb903690600401611a1b565b916044359267ffffffffffffffff84116102bc576112e06104a5943690600401611a1b565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61130c6128be565b90611fa9565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611d1b565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576113a46119d5565b6024356113af6128be565b9073ffffffffffffffffffffffffffffffffffffffff83169283156115595773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611474575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114fe57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611425565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760206115d6611ea2565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760406116176129e9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a56117686119d5565b6117706119f8565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9161179a6128be565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036117db575b5050612694565b6117e69184846124b6565b85846117d4565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a56118826119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6118af6128be565b90611ddd565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611d1b565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc5761125a602091611bd8565b919082519283825260005b8481106119c05750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611981565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611a9591600401611a1b565b9290929160243567ffffffffffffffff81116102bc5781611ab891600401611a1b565b929092916044359067ffffffffffffffff82116102bc57611adb91600401611a1b565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611b2891600401611a1b565b929092916024359067ffffffffffffffff82116102bc57611adb91600401611a1b565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611bd15773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611c81577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611c7b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611cd0575b6020831014611ca157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611c96565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106ec57604052565b9060405191826000825492611d2f84611c87565b8084529360018116908115611d9d5750600114611d56575b50611d5492500383611cda565b565b90506000929192526020600020906000915b818310611d81575050906020611d549282010138611d47565b6020919350806001915483858901015201910190918492611d68565b60209350611d549592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611d47565b929173ffffffffffffffffffffffffffffffffffffffff16928315611e5e5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611d1b565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152611f4360c082611cda565b51902090565b9190811015611f595760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c157801561224c5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612045575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612033575b50505050565b61203c936124b6565b3880808061202d565b73ffffffffffffffffffffffffffffffffffffffff612068610adb83858b611f49565b1680156122085761207a828587611f49565b3580612144575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a15158061213a575b6120de575b50600101611feb565b8a8703908782101561210457600090815260208d905260409020908601905560016120d5565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156120d0565b9a8b8101908111156121de579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146121905750906040602093926000908482528552208181540190555b909150612081565b905088829892116121a8575090866020920196612188565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c15784156124ae5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106123475750505050508015158061233d575b6122b6575b5050505050565b80850394808610156122f357505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806122af565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156122aa565b73ffffffffffffffffffffffffffffffffffffffff61236a610adb838589611f49565b16801561246a5761237c828587611f49565b35806123d0575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612295565b96878101908111156121de579673ffffffffffffffffffffffffffffffffffffffff891682811461241d57509060019291604060008381528c602052208181540190555b90919250612383565b8c829c92116124345750908a60019392019a612414565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415612650576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580612647575b612583575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156125ec5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260209282861660005283526040600020866000528352806040600020559261253b565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515612536565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156127f157826126fe575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156127a557508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361277e575b50509250506126b9565b83831660005281855260406000205586600052835260406000208581540190553880612774565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106ec57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261287b82612835565b916128896040519384611cda565b8294818452818301116102bc578281602093846000960137010152565b908160209103126102bc575180151581036102bc5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156129da5732331480156129df575b6129da577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612949575b5061294657503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109d9576000916129bb575b503861293c565b6129d4915060203d602011610c6957610c5b8183611cda565b386129b4565b503390565b5060183610612905565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612b1d573233148015612b25575b612b1d57803314908115612a7c575b50612a4b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102bc5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109d957600091612afe575b5038612a3f565b612b17915060203d602011610c6957610c5b8183611cda565b38612af7565b506000903690565b5060183610612a30565b612b9e73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190611976565b03816000865af19081156109d957600091612c2e575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612c015750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612ca8575b81612c4760209383611cda565b81010312612ca45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612ca157507fffffffff00000000000000000000000000000000000000000000000000000000612bb4565b80fd5b5080fd5b3d9150612c3a56fea26469706673582212209e8f868bd5737c0b2fad5c278bcd90f962d9c945de40af8af037f2c4731e6f7c64736f6c634300081e0033335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a821da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x66F JUMPI PUSH2 0x3634 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x6A4 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xC0 DUP3 DUP3 SUB SLT PUSH2 0x66F JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x66F JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x6C9 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x66F JUMPI DUP3 PUSH2 0x66 SWAP2 DUP4 ADD PUSH2 0x6C9 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x66F JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x66F JUMPI DUP4 ADD SWAP3 DUP5 PUSH1 0x1F DUP6 ADD SLT ISZERO PUSH2 0x66F JUMPI DUP4 MLOAD PUSH2 0xAC PUSH2 0xA7 DUP3 PUSH2 0x734 JUMP JUMPDEST PUSH2 0x6A4 JUMP JUMPDEST SWAP5 PUSH1 0x20 DUP1 DUP8 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP8 DUP3 GT PUSH2 0x66F JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x684 JUMPI POP POP POP PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x66F JUMPI DUP2 ADD SWAP5 DUP1 PUSH1 0x1F DUP8 ADD SLT ISZERO PUSH2 0x66F JUMPI DUP6 MLOAD PUSH2 0x102 PUSH2 0xA7 DUP3 PUSH2 0x734 JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP1 DUP10 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x66F JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x674 JUMPI POP POP POP PUSH1 0xA0 ADD MLOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP4 SUB PUSH2 0x66F JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x4E83A8C3 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE DUP3 MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x545 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35F4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x665 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x525 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x5E8 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x566 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x55B JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35F4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x545 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35B4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x53B JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x525 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x4B3 JUMPI JUMPDEST POP PUSH1 0x20 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x42E JUMPI DUP2 SWAP1 PUSH2 0x397 SWAP9 PUSH1 0x0 SWAP3 PUSH2 0x423 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35B4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3614 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3614 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH4 0xA219A025 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE CALLER PUSH2 0x3C4 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x3C130D9 PUSH1 0xE4 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4EC7FBED PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x53F41A97 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x602993F3 PUSH1 0xE1 SHL DUP5 MSTORE SWAP2 SWAP1 SWAP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH2 0x775 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2CE6 SWAP1 DUP2 PUSH2 0x8CE DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x170A ADD MSTORE DUP2 DUP2 PUSH2 0x1B90 ADD MSTORE DUP2 DUP2 PUSH2 0x28D5 ADD MSTORE PUSH2 0x2A00 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x311 JUMP JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x2A4 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP8 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35B4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP2 PUSH1 0x0 KECCAK256 SWAP9 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x49B JUMPI POP SWAP2 PUSH2 0x397 SWAP10 SWAP2 DUP5 PUSH1 0x1 SWAP6 SWAP5 LT PUSH2 0x482 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35B4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x2C7 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x467 JUMP JUMPDEST DUP4 DUP4 ADD MLOAD DUP12 SSTORE PUSH1 0x1 SWAP1 SWAP11 ADD SWAP10 PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x44E JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35B4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x51B JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x50F JUMPI POP PUSH2 0x288 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x502 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4F9 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x276 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35F4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x5D0 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5B7 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35F4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x248 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x59C JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x586 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35F4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x65B JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x64C JUMPI POP PUSH2 0x20E JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x63F JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x631 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1FA JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x66F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x545 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x66F JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x545 JUMPI PUSH2 0x6F8 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x6A4 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x66F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x71F JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x70A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x545 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x75F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x8BC JUMPI DUP2 ISZERO PUSH2 0x8B7 JUMPI PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x7E8 JUMPI POP POP POP POP DUP1 PUSH2 0x7A0 JUMPI POP JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35D4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 DUP1 DUP3 ADD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0x7D1 JUMPI POP POP PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x35D4 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMP JUMPDEST PUSH4 0x1B352FB PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x7FA DUP3 DUP5 PUSH2 0x74B JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x8A6 JUMPI PUSH2 0x80C DUP3 DUP6 PUSH2 0x74B JUMP JUMPDEST MLOAD DUP1 PUSH2 0x84A JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x78D JUMP JUMPDEST SWAP6 SWAP2 SWAP1 DUP7 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP2 SWAP6 SWAP1 SWAP2 SWAP1 PUSH2 0x813 JUMP JUMPDEST PUSH4 0x1550AB9F PUSH1 0xE2 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x92FD9C8F PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x32C1299B PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1910 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x18B5 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1848 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x17ED JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x172E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x16BF JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1661 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x15DE JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x159D JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x136D JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1312 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1264 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1219 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1194 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1011 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF8C JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xF48 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xED7 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE64 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDF7 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD8A JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA3D JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7CA JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x71B JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x1ADF JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x2835 JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1CDA JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x19D5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x378 PUSH2 0x28BE JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3BE JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x442 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x465 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x49E DUP4 DUP4 PUSH2 0x497 PUSH2 0x28BE JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x2694 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4B0 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4C6 SWAP5 PUSH2 0x4BF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x286F JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2B2F JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A5 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x51F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55E PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6EC JUMPI PUSH2 0x5A6 DUP3 SLOAD PUSH2 0x1C87 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6A4 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x609 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5FE JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x68C JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x654 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x64A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x637 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6E2 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6D6 JUMPI POP PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6C9 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6C0 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x752 PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x76F PUSH2 0x19F8 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x801 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x809 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA13 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9E5 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8EB PUSH1 0xE0 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8F6 PUSH2 0x1EA2 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x93B PUSH1 0x62 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9D9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9AF JUMPI PUSH2 0x9AD SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1DDD JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xA4B CALLDATASIZE PUSH2 0x1A4C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA90 PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC70 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAB8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAE0 PUSH2 0xADB DUP4 DUP6 DUP11 PUSH2 0x1F49 JUMP JUMPDEST PUSH2 0x1F88 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC42 JUMPI JUMPDEST POP ISZERO PUSH2 0xC15 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB6F PUSH2 0xADB DUP4 DUP6 DUP11 PUSH2 0x1F49 JUMP JUMPDEST AND SWAP1 PUSH2 0xB7F PUSH2 0xADB DUP3 DUP7 DUP10 PUSH2 0x1F49 JUMP JUMPDEST SWAP2 PUSH2 0xB8B DUP3 DUP8 DUP12 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC04 JUMPI JUMPDEST POP ADD PUSH2 0xAAF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC0F SWAP2 PUSH2 0x1CDA JUMP JUMPDEST DUP9 PUSH2 0xBFD JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC63 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC69 JUMPI JUMPDEST PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x28A6 JUMP JUMPDEST DUP10 PUSH2 0xB45 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC51 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAA8 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xCB1 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0xCB9 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xCDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD48 DUP5 DUP5 DUP5 PUSH2 0xD0F PUSH2 0x28BE JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD79 JUMPI PUSH2 0x2694 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD59 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD6E SWAP6 PUSH2 0xD68 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x286F JUMP JUMPDEST SWAP4 PUSH2 0x2B2F JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A5 JUMP JUMPDEST PUSH2 0xD85 DUP5 DUP12 DUP5 DUP5 PUSH2 0x24B6 JUMP JUMPDEST PUSH2 0x2694 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xDC4 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDF1 PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x2694 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xE31 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE5E PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x24B6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1D1B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x1976 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xF59 CALLDATASIZE PUSH2 0x1ADF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF86 PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x2255 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xFC3 PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x101F CALLDATASIZE PUSH2 0x1A4C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1062 PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x118A JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x108A JUMPI STOP JUMPDEST PUSH2 0x1095 DUP2 DUP4 DUP9 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x10D6 DUP8 PUSH2 0x10CF PUSH2 0xADB DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1F49 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1131 PUSH1 0x64 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1181 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1154 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1081 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1147 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x107A JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x11CB PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x125A PUSH2 0x1255 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x1B79 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x129B PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x12BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x12E0 PUSH2 0x4A5 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x130C PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x1FA9 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1D1B JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x13A4 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x13AF PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1559 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1474 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14FE JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x15D6 PUSH2 0x1EA2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH2 0x1617 PUSH2 0x29E9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0x1768 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x1770 PUSH2 0x19F8 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x179A PUSH2 0x28BE JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x17DB JUMPI JUMPDEST POP POP PUSH2 0x2694 JUMP JUMPDEST PUSH2 0x17E6 SWAP2 DUP5 DUP5 PUSH2 0x24B6 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x17D4 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0x1882 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x18AF PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x1DDD JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1D1B JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x125A PUSH1 0x20 SWAP2 PUSH2 0x1BD8 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x19C0 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1981 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1A95 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1AB8 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1ADB SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1B28 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1ADB SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1BD1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1C81 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1C7B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1CD0 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1CA1 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C96 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6EC JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1D2F DUP5 PUSH2 0x1C87 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1D9D JUMPI POP PUSH1 0x1 EQ PUSH2 0x1D56 JUMPI JUMPDEST POP PUSH2 0x1D54 SWAP3 POP SUB DUP4 PUSH2 0x1CDA JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1D81 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1D54 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1D47 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1D68 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1D54 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1D47 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1E5E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1ECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1D1B JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x1F43 PUSH1 0xC0 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1F59 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x224C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2045 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2033 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x203C SWAP4 PUSH2 0x24B6 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x202D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2068 PUSH2 0xADB DUP4 DUP6 DUP12 PUSH2 0x1F49 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2208 JUMPI PUSH2 0x207A DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2144 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x213A JUMPI JUMPDEST PUSH2 0x20DE JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1FEB JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2104 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x20D5 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x20D0 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x21DE JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2190 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2081 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x21A8 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2188 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x24AE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2347 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x233D JUMPI JUMPDEST PUSH2 0x22B6 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x22F3 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x22AF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x22AA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x236A PUSH2 0xADB DUP4 DUP6 DUP10 PUSH2 0x1F49 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x246A JUMPI PUSH2 0x237C DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x23D0 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2295 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x21DE JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x241D JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2383 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2434 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2414 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2650 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x2647 JUMPI JUMPDEST PUSH2 0x2583 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x25EC JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x253B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x2536 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x27F1 JUMPI DUP3 PUSH2 0x26FE JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x27A5 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x277E JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x26B9 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x2774 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6EC JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x287B DUP3 PUSH2 0x2835 JUMP JUMPDEST SWAP2 PUSH2 0x2889 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1CDA JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x29DA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x29DF JUMPI JUMPDEST PUSH2 0x29DA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2949 JUMPI JUMPDEST POP PUSH2 0x2946 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x29BB JUMPI JUMPDEST POP CODESIZE PUSH2 0x293C JUMP JUMPDEST PUSH2 0x29D4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC69 JUMPI PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST CODESIZE PUSH2 0x29B4 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2905 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2B1D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2B25 JUMPI JUMPDEST PUSH2 0x2B1D JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2A7C JUMPI JUMPDEST POP PUSH2 0x2A4B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2AFE JUMPI JUMPDEST POP CODESIZE PUSH2 0x2A3F JUMP JUMPDEST PUSH2 0x2B17 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC69 JUMPI PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST CODESIZE PUSH2 0x2AF7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2A30 JUMP JUMPDEST PUSH2 0x2B9E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x1976 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2C2E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2C01 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2CA8 JUMPI JUMPDEST DUP2 PUSH2 0x2C47 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1CDA JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2CA4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2CA1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BB4 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2C3A JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP15 DUP16 DUP7 DUP12 0xD5 PUSH20 0x7C0B2FAD5C278BCD90F962D9C945DE40AF8AF037 CALLCODE 0xC4 PUSH20 0x1E6F7C64736F6C634300081E0033335DF4119BBB DIV CREATE JUMP 0xB3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x821DA92899D3DA68BF9787 DUP3 NUMBER DUP9 LOG3 PUSH31 0xA2BFA79780BCEF91B9716C390EEC8ECBF0335DF4119BBB04F056B33EBA33B8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x81335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x8300000000000000000000 ","sourceMap":"237:490:136:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;237:490:136;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;237:490:136;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;500:10:59;;;;;;2510:4:280;-1:-1:-1;;237:490:136;;;;;500:10:59;;;-1:-1:-1;;;;500:10:59;;;;237:490:136;;;;;;500:10:59;;237:490:136;;;;-1:-1:-1;;;;;237:490:136;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;2510:4:280;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;;2510:4:280;237:490:136;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;;;-1:-1:-1;;;;;237:490:136;;;;-1:-1:-1;;;;;;;;;;;237:490:136;2510:4:280;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:11:281;237:490:136;-1:-1:-1;237:490:136;;;;;;;2510:4:280;237:490:136;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;;-1:-1:-1;;;;;;;;;;;237:490:136;1598:32:277;;;-1:-1:-1;500:10:59;;237:490:136;500:10:59;237:490:136;-1:-1:-1;500:10:59;2510:4:280;237:490:136;;500:10:59;;237:490:136;;500:10:59;;1641::281;1645:152:42;;237:490:136;-1:-1:-1;;;;500:10:59;;;237:490:136;500:10:59;;;;237:490:136;500:10:59;;;;;2510:4:280;-1:-1:-1;;237:490:136;;;;;500:10:59;;;-1:-1:-1;;;500:10:59;;;;;;;237:490:136;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;237:490:136;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;237:490:136;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;;237:490:136;;;;;;500:10:59;;237:490:136;745:39:76;1704:11:281;:::i;:::-;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1645:152:42;237:490:136;;;-1:-1:-1;;;;;;237:490:136;1641:10:281;237:490:136;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;237:490:136;;;;-1:-1:-1;237:490:136;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;237:490:136;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;;;;;1704:11:281;237:490:136;;;2510:4:280;237:490:136;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;237:490:136;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;2510:4:280;237:490:136;;;;;;-1:-1:-1;237:490:136;;;;;;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;;;;;;;;;;;;237:490:136;;;;;;;-1:-1:-1;;;237:490:136;;;;;;;;;;;;2510:4:280;237:490:136;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;237:490:136;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;237:490:136;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;-1:-1:-1;2510:4:280;237:490:136;;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;237:490:136;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;-1:-1:-1;;237:490:136;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;;;;-1:-1:-1;237:490:136;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:490:136;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;20857:1233:280;;237:490:136;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;:::o;21782:302::-;-1:-1:-1;;;;;;;;;;;237:490:136;;;;;21949:19:280;;;;;21945:76;;237:490:136;;-1:-1:-1;;;;;;;;;;;237:490:136;20857:1233:280:o;21945:76::-;21977:44;;;-1:-1:-1;21977:44:280;;237:490:136;;;;-1:-1:-1;21977:44:280;21174:3;-1:-1:-1;;;;;21206:13:280;;;;:::i;:::-;237:490:136;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;237:490:136;21344:10:280;21340:372;;21174:3;237:490:136;-1:-1:-1;21730:31:280;237:490:136;;;;;;;;;21730:31:280;237:490:136;21151:9:280;;21340:372;237:490:136;;;;;;21474:27:280;;;;21470:70;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;21562:26:280;;21340:372;;237:490:136;21340:372:280;;21470:70;21510:30;;;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;;;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;21084;21101:7;;;:::o;21011:62::-;21047:26;;;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6648,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":6683,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6732,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6879,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":10351,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":10406,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6987,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6613,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_string":{"entryPoint":6518,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":10293,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":8009,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":7451,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":7303,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":7386,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":7842,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":7645,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchTransfer":{"entryPoint":8789,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":8105,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":11055,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":9398,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":7033,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":10729,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":10430,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7128,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transfer":{"entryPoint":9876,"id":29123,"parameterSlots":4,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":8072,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5898},{"length":32,"start":7056},{"length":32,"start":10453},{"length":32,"start":10752}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461191057806306fdde03146118b5578063095ea7b31461184857806318160ddd146117ed57806323b872dd1461172e5780632b4c9f16146116bf578063313ce5671461166157806331e66e1e146115de5780633644e5151461159d578063395093511461136d5780633c130d90146113125780634885b25414611264578063572b6c051461121957806370a082311461119457806373c8a958146110115780637ecebe0014610f8c57806388d695b214610f485780638da5cb5b14610ed757806395d89b4114610e64578063a457c2d714610df7578063a9059cbb14610d8a578063b88d4fde14610c7a578063c3666c3614610a3d578063d505accf146107ca578063dd62ed3e1461071b578063e0df5b6f146104d0578063eb7955491461040b578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc5761016936611adf565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa6128be565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d5818387611f49565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff828587611f49565b359081471061028a57600080809381935af13d15610282573d9061022282612835565b916102306040519384611cda565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f6119d5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103786128be565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102eb575073ffffffffffffffffffffffffffffffffffffffff16928383036103be57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104426119d5565b60243560443567ffffffffffffffff81116102bc57610465903690600401611b4b565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261049e83836104976128be565b8097612694565b813b6104b0575b602060405160018152f35b6104c6946104bf91369161286f565b9280612b2f565b80808080806104a5565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc5761051f903690600401611b4b565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055e6128be565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106ec576105a68254611c87565b601f81116106a4575b506000601f8211600114610609578192936000926105fe575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b86811061068c5750836001959610610654575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061064a565b90926020600181928686013581550194019101610637565b826000526020600020601f830160051c810191602084106106e2575b601f0160051c01905b8181106106d657506105af565b600081556001016106c9565b90915081906106c0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576107526119d5565b73ffffffffffffffffffffffffffffffffffffffff61076f6119f8565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576108016119d5565b6108096119f8565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a13578142116109e5576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108eb60e082611cda565b5190206108f6611ea2565b9060405190868201927f19010000000000000000000000000000000000000000000000000000000000008452602283015260428201526042815261093b606282611cda565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109d95773ffffffffffffffffffffffffffffffffffffffff60005116036109af576109ad927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ddd565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc57610a4b36611a4c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a906128be565b92541691169081036102eb5750808214801590610c70575b6102c15760005b828110610ab857005b73ffffffffffffffffffffffffffffffffffffffff610ae0610adb83858a611f49565b611f88565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109d957600091610c42575b5015610c15575073ffffffffffffffffffffffffffffffffffffffff610b6f610adb83858a611f49565b1690610b7f610adb828689611f49565b91610b8b82878b611f49565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109d957600192610c04575b5001610aaf565b6000610c0f91611cda565b88610bfd565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c63915060203d8111610c69575b610c5b8183611cda565b8101906128a6565b89610b45565b503d610c51565b5082821415610aa8565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610cb16119d5565b610cb96119f8565b60443560643567ffffffffffffffff81116102bc57610cdc903690600401611b4b565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d48848484610d0f6128be565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d7957612694565b823b610d5957602060405160018152f35b610d6e95610d6891369161286f565b93612b2f565b8080808080806104a5565b610d85848b84846124b6565b612694565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a5610dc46119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610df16128be565b90612694565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a5610e316119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e5e6128be565b906124b6565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611d1b565b604051918291602083526020830190611976565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc576104a5610f5936611adf565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f866128be565b90612255565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610fc36119d5565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc5761101f36611a4c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806110626128be565b92541691169081036102eb575080831480159061118a575b6102c15760005b83811061108a57005b611095818388611f49565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a826110d6876110cf610adb828f8f90611f49565b938b611f49565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611131606482611cda565b51925af1156109d9576000513d6111815750803b155b6111545750600101611081565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611147565b508583141561107a565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576111cb6119d5565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602061125a6112556119d5565b611b79565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761129b6119d5565b60243567ffffffffffffffff81116102bc576112bb903690600401611a1b565b916044359267ffffffffffffffff84116102bc576112e06104a5943690600401611a1b565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61130c6128be565b90611fa9565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611d1b565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576113a46119d5565b6024356113af6128be565b9073ffffffffffffffffffffffffffffffffffffffff83169283156115595773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611474575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114fe57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611425565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760206115d6611ea2565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760406116176129e9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a56117686119d5565b6117706119f8565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9161179a6128be565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036117db575b5050612694565b6117e69184846124b6565b85846117d4565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a56118826119d5565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6118af6128be565b90611ddd565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed3610ebf7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611d1b565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc5761125a602091611bd8565b919082519283825260005b8481106119c05750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611981565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611a9591600401611a1b565b9290929160243567ffffffffffffffff81116102bc5781611ab891600401611a1b565b929092916044359067ffffffffffffffff82116102bc57611adb91600401611a1b565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc5781611b2891600401611a1b565b929092916024359067ffffffffffffffff82116102bc57611adb91600401611a1b565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611bd15773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611c81577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611c7b576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611cd0575b6020831014611ca157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611c96565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106ec57604052565b9060405191826000825492611d2f84611c87565b8084529360018116908115611d9d5750600114611d56575b50611d5492500383611cda565b565b90506000929192526020600020906000915b818310611d81575050906020611d549282010138611d47565b6020919350806001915483858901015201910190918492611d68565b60209350611d549592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611d47565b929173ffffffffffffffffffffffffffffffffffffffff16928315611e5e5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611d1b565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152611f4360c082611cda565b51902090565b9190811015611f595760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c157801561224c5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612045575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612033575b50505050565b61203c936124b6565b3880808061202d565b73ffffffffffffffffffffffffffffffffffffffff612068610adb83858b611f49565b1680156122085761207a828587611f49565b3580612144575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a15158061213a575b6120de575b50600101611feb565b8a8703908782101561210457600090815260208d905260409020908601905560016120d5565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156120d0565b9a8b8101908111156121de579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146121905750906040602093926000908482528552208181540190555b909150612081565b905088829892116121a8575090866020920196612188565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c15784156124ae5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106123475750505050508015158061233d575b6122b6575b5050505050565b80850394808610156122f357505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806122af565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156122aa565b73ffffffffffffffffffffffffffffffffffffffff61236a610adb838589611f49565b16801561246a5761237c828587611f49565b35806123d0575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612295565b96878101908111156121de579673ffffffffffffffffffffffffffffffffffffffff891682811461241d57509060019291604060008381528c602052208181540190555b90919250612383565b8c829c92116124345750908a60019392019a612414565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415612650576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580612647575b612583575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156125ec5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260209282861660005283526040600020866000528352806040600020559261253b565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515612536565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156127f157826126fe575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156127a557508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361277e575b50509250506126b9565b83831660005281855260406000205586600052835260406000208581540190553880612774565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106ec57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261287b82612835565b916128896040519384611cda565b8294818452818301116102bc578281602093846000960137010152565b908160209103126102bc575180151581036102bc5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156129da5732331480156129df575b6129da577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612949575b5061294657503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109d9576000916129bb575b503861293c565b6129d4915060203d602011610c6957610c5b8183611cda565b386129b4565b503390565b5060183610612905565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015612b1d573233148015612b25575b612b1d57803314908115612a7c575b50612a4b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102bc5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109d957600091612afe575b5038612a3f565b612b17915060203d602011610c6957610c5b8183611cda565b38612af7565b506000903690565b5060183610612a30565b612b9e73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190611976565b03816000865af19081156109d957600091612c2e575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612c015750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612ca8575b81612c4760209383611cda565b81010312612ca45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612ca157507fffffffff00000000000000000000000000000000000000000000000000000000612bb4565b80fd5b5080fd5b3d9150612c3a56fea26469706673582212209e8f868bd5737c0b2fad5c278bcd90f962d9c945de40af8af037f2c4731e6f7c64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1910 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x18B5 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1848 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x17ED JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x172E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x16BF JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1661 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x15DE JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x159D JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x136D JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1312 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1264 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1219 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1194 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1011 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF8C JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xF48 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xED7 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE64 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDF7 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD8A JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA3D JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7CA JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x71B JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x1ADF JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x2835 JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1CDA JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x19D5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x378 PUSH2 0x28BE JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3BE JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x442 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x465 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x49E DUP4 DUP4 PUSH2 0x497 PUSH2 0x28BE JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x2694 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4B0 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4C6 SWAP5 PUSH2 0x4BF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x286F JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2B2F JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A5 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x51F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55E PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6EC JUMPI PUSH2 0x5A6 DUP3 SLOAD PUSH2 0x1C87 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6A4 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x609 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5FE JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x68C JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x654 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x64A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x637 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6E2 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6D6 JUMPI POP PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6C9 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6C0 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x752 PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x76F PUSH2 0x19F8 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x801 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x809 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA13 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9E5 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8EB PUSH1 0xE0 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8F6 PUSH2 0x1EA2 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x93B PUSH1 0x62 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9D9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9AF JUMPI PUSH2 0x9AD SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1DDD JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xA4B CALLDATASIZE PUSH2 0x1A4C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA90 PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC70 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAB8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAE0 PUSH2 0xADB DUP4 DUP6 DUP11 PUSH2 0x1F49 JUMP JUMPDEST PUSH2 0x1F88 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC42 JUMPI JUMPDEST POP ISZERO PUSH2 0xC15 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB6F PUSH2 0xADB DUP4 DUP6 DUP11 PUSH2 0x1F49 JUMP JUMPDEST AND SWAP1 PUSH2 0xB7F PUSH2 0xADB DUP3 DUP7 DUP10 PUSH2 0x1F49 JUMP JUMPDEST SWAP2 PUSH2 0xB8B DUP3 DUP8 DUP12 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC04 JUMPI JUMPDEST POP ADD PUSH2 0xAAF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC0F SWAP2 PUSH2 0x1CDA JUMP JUMPDEST DUP9 PUSH2 0xBFD JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC63 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC69 JUMPI JUMPDEST PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x28A6 JUMP JUMPDEST DUP10 PUSH2 0xB45 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC51 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAA8 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xCB1 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0xCB9 PUSH2 0x19F8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xCDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B4B JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD48 DUP5 DUP5 DUP5 PUSH2 0xD0F PUSH2 0x28BE JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD79 JUMPI PUSH2 0x2694 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD59 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD6E SWAP6 PUSH2 0xD68 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x286F JUMP JUMPDEST SWAP4 PUSH2 0x2B2F JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A5 JUMP JUMPDEST PUSH2 0xD85 DUP5 DUP12 DUP5 DUP5 PUSH2 0x24B6 JUMP JUMPDEST PUSH2 0x2694 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xDC4 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDF1 PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x2694 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xE31 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE5E PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x24B6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1D1B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x1976 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0xF59 CALLDATASIZE PUSH2 0x1ADF JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF86 PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x2255 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xFC3 PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x101F CALLDATASIZE PUSH2 0x1A4C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1062 PUSH2 0x28BE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x118A JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x108A JUMPI STOP JUMPDEST PUSH2 0x1095 DUP2 DUP4 DUP9 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x10D6 DUP8 PUSH2 0x10CF PUSH2 0xADB DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1F49 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1131 PUSH1 0x64 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1181 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1154 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1081 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1147 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x107A JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x11CB PUSH2 0x19D5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x125A PUSH2 0x1255 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x1B79 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x129B PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x12BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x12E0 PUSH2 0x4A5 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x130C PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x1FA9 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1D1B JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x13A4 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x13AF PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1559 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1474 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14FE JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1425 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x15D6 PUSH2 0x1EA2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH2 0x1617 PUSH2 0x29E9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0x1768 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x1770 PUSH2 0x19F8 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x179A PUSH2 0x28BE JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x17DB JUMPI JUMPDEST POP POP PUSH2 0x2694 JUMP JUMPDEST PUSH2 0x17E6 SWAP2 DUP5 DUP5 PUSH2 0x24B6 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x17D4 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A5 PUSH2 0x1882 PUSH2 0x19D5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x18AF PUSH2 0x28BE JUMP JUMPDEST SWAP1 PUSH2 0x1DDD JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED3 PUSH2 0xEBF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1D1B JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x125A PUSH1 0x20 SWAP2 PUSH2 0x1BD8 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x19C0 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1981 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1A95 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1AB8 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1ADB SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x1B28 SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x1ADB SWAP2 PUSH1 0x4 ADD PUSH2 0x1A1B JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1BD1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1C81 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1C7B JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1CD0 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1CA1 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C96 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6EC JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1D2F DUP5 PUSH2 0x1C87 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1D9D JUMPI POP PUSH1 0x1 EQ PUSH2 0x1D56 JUMPI JUMPDEST POP PUSH2 0x1D54 SWAP3 POP SUB DUP4 PUSH2 0x1CDA JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1D81 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1D54 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1D47 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1D68 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1D54 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1D47 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1E5E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1ECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1D1B JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x1F43 PUSH1 0xC0 DUP3 PUSH2 0x1CDA JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1F59 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x224C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2045 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2033 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x203C SWAP4 PUSH2 0x24B6 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x202D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2068 PUSH2 0xADB DUP4 DUP6 DUP12 PUSH2 0x1F49 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2208 JUMPI PUSH2 0x207A DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2144 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x213A JUMPI JUMPDEST PUSH2 0x20DE JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1FEB JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2104 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x20D5 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x20D0 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x21DE JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2190 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2081 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x21A8 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2188 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x24AE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2347 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x233D JUMPI JUMPDEST PUSH2 0x22B6 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x22F3 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x22AF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x22AA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x236A PUSH2 0xADB DUP4 DUP6 DUP10 PUSH2 0x1F49 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x246A JUMPI PUSH2 0x237C DUP3 DUP6 DUP8 PUSH2 0x1F49 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x23D0 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2295 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x21DE JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x241D JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2383 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2434 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2414 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2650 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x2647 JUMPI JUMPDEST PUSH2 0x2583 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x25EC JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x253B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x2536 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x27F1 JUMPI DUP3 PUSH2 0x26FE JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x27A5 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x277E JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x26B9 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x2774 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6EC JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x287B DUP3 PUSH2 0x2835 JUMP JUMPDEST SWAP2 PUSH2 0x2889 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1CDA JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x29DA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x29DF JUMPI JUMPDEST PUSH2 0x29DA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2949 JUMPI JUMPDEST POP PUSH2 0x2946 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x29BB JUMPI JUMPDEST POP CODESIZE PUSH2 0x293C JUMP JUMPDEST PUSH2 0x29D4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC69 JUMPI PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST CODESIZE PUSH2 0x29B4 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2905 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2B1D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x2B25 JUMPI JUMPDEST PUSH2 0x2B1D JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2A7C JUMPI JUMPDEST POP PUSH2 0x2A4B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2AFE JUMPI JUMPDEST POP CODESIZE PUSH2 0x2A3F JUMP JUMPDEST PUSH2 0x2B17 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC69 JUMPI PUSH2 0xC5B DUP2 DUP4 PUSH2 0x1CDA JUMP JUMPDEST CODESIZE PUSH2 0x2AF7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2A30 JUMP JUMPDEST PUSH2 0x2B9E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x1976 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9D9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2C2E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2C01 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2CA8 JUMPI JUMPDEST DUP2 PUSH2 0x2C47 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1CDA JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2CA4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2CA1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BB4 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2C3A JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP15 DUP16 DUP7 DUP12 0xD5 PUSH20 0x7C0B2FAD5C278BCD90F962D9C945DE40AF8AF037 CALLCODE 0xC4 PUSH20 0x1E6F7C64736F6C634300081E0033000000000000 ","sourceMap":"237:490:136:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;237:490:136;;1905:41:281;;;:::i;:::-;237:490:136;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;237:490:136;1845:10:192;;;;;;237:490:136;1857:3:192;1876:11;;;;;:::i;:::-;237:490:136;;;;;;;;;1898:10:192;;;;;:::i;:::-;237:490:136;1375:21:9;;;:30;1371:125;;237:490:136;1548:33:9;;;;;;;237:490:136;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;237:490:136;;1834:9:192;;1591:58:9;237:490:136;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;237:490:136;5957:19:9;237:490:136;;5957:19:9;237:490:136;;;;;1371:125:9;1455:21;;1428:57;237:490:136;1428:57:9;237:490:136;;;;;;1428:57:9;237:490:136;;;;1756:63:192;1793:26;237:490:136;1793:26:192;237:490:136;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;237:490:136;;-1:-1:-1;4538:25:42;237:490:136;;;;;;;;;;;;;:::i;:::-;;1905:41:281;;:::i;:::-;237:490:136;;;;;;;;;;3205:23:42;;;3201:60;;237:490:136;;;3275:25:42;;;;3271:146;;237:490:136;3271:146:42;237:490:136;;;;;;3361:45:42;237:490:136;;3361:45:42;237:490:136;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;237:490:136;1905:41:281;17093:5:280;1905:41:281;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;237:490:136;;;;;;;;17109:96:280;17145:49;237:490:136;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1905:41:281;;;:::i;:::-;237:490:136;;;;;4503:26:42;;;4499:64;;1283:19:278;237:490:136;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;237:490:136;-1:-1:-1;237:490:136;27576:12:280;237:490:136;;;;-1:-1:-1;237:490:136;27576:28:280;237:490:136;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;237:490:136;2653:23:279;237:490:136;2653:23:279;237:490:136;2653:23:279;237:490:136;;;;;;;;;;;;;;;;;;;2602:87:279;;;;237:490:136;1021:95:279;237:490:136;;1021:95:279;237:490:136;1021:95:279;;237:490:136;;;;;1021:95:279;;237:490:136;1021:95:279;;;;237:490:136;;1021:95:279;;237:490:136;;1021:95:279;;237:490:136;;2602:87:279;;;237:490:136;2602:87:279;;:::i;:::-;237:490:136;2592:98:279;;2758:18;;:::i;:::-;237:490:136;;;2729:60:279;;;;1021:95;;;;;;;237:490:136;1021:95:279;;;237:490:136;1021:95:279;2729:60;;;;;;:::i;:::-;237:490:136;2719:71:279;;237:490:136;;;;;;1021:95:279;;;237:490:136;;;;1021:95:279;;237:490:136;;;;1021:95:279;;237:490:136;2821:24:279;;;237:490:136;2821:24:279;;;;;237:490:136;;2821:24:279;237:490:136;2863:15:279;2859:57;;2982:5;27705:19:280;237:490:136;2982:5:279;:::i;:::-;237:490:136;2859:57:279;2887:29;237:490:136;2887:29:279;237:490:136;;2887:29:279;2821:24;237:490:136;;;;;;;;;2470:67:279;2509:28;;237:490:136;2509:28:279;237:490:136;;;;2509:28:279;2400:60;2432:28;237:490:136;2432:28:279;237:490:136;;2432:28:279;237:490:136;;;;;;;:::i;:::-;5148:19:42;;;;;;237:490:136;;;1905:41:281;;:::i;:::-;237:490:136;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;237:490:136;3852:94:192;;237:490:136;3972:10:192;;;;;;237:490:136;3984:3:192;237:490:136;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;237:490:136;;;;4058:76:192;;4108:25;237:490:136;4058:76:192;;237:490:136;4058:76:192;;;;;;;;;;;;237:490:136;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;237:490:136;4239:12:192;;;;;;:::i;:::-;237:490:136;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;237:490:136;4239:70:192;;;;;;;237:490:136;;;;;;;4239:70:192;;;;;237:490:136;4239:70:192;;4277:4;237:490:136;4239:70:192;;237:490:136;;4058:76:192;237:490:136;;;;;;;4239:70:192;;;;;;;237:490:136;4239:70:192;;;3984:3;;237:490:136;3961:9:192;;4239:70;237:490:136;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;237:490:136;4161:50:192;237:490:136;;4058:76:192;237:490:136;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;237:490:136;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;237:490:136;1905:41:281;9818:5:280;1905:41:281;;;;;:::i;:::-;237:490:136;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;237:490:136;;;;;;;18723:98:280;18759:51;237:490:136;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;237:490:136:-;;;;;;;;;;;1036:5:242;237:490:136;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;1036:5:242;;:::i;237:490:136:-;;;;;;;;;;;1788:15:242;237:490:136;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;1788:15:242;;:::i;237:490:136:-;;;;;;;;;;;;;3091:13:277;237:490:136;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:6:243;237:490:136;;;:::i;:::-;27705:19:280;;;;237:490:136;1905:41:281;;:::i;:::-;875:6:243;;:::i;237:490:136:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;237:490:136;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;237:490:136;;1905:41:281;;;:::i;:::-;237:490:136;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;237:490:136;2776:90:192;;237:490:136;2892:10:192;;;;;;237:490:136;2904:3:192;2923:9;;;;;:::i;:::-;237:490:136;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;237:490:136;;;1328:43:8;237:490:136;1328:43:8;;;;237:490:136;1328:43:8;;237:490:136;1328:43:8;;;237:490:136;1328:43:8;237:490:136;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;237:490:136;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;237:490:136;;2881:9:192;;8938:146:8;9033:40;237:490:136;9033:40:8;237:490:136;;1328:43:8;237:490:136;9033:40:8;8942:68;237:490:136;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;237:490:136;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;237:490:136;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;237:490:136;;;;;;:::i;:::-;27705:19:280;;;237:490:136;1905:41:281;;:::i;:::-;1170:6:243;;:::i;237:490:136:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;1905:41:281;;:::i;:::-;237:490:136;;;;5455:21:280;;;5451:67;;237:490:136;;;-1:-1:-1;237:490:136;5555:12:280;237:490:136;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;-1:-1:-1;237:490:136;;5597:10:280;;5593:366;;237:490:136;;;5973:42:280;237:490:136;;;;;;;;;5973:42:280;;237:490:136;;;;;;;5593:366:280;237:490:136;;;5720:32:280;;;;;5716:108;;5842:19;;;237:490:136;;5973:42:280;5842:19;237:490:136;;;-1:-1:-1;237:490:136;5555:12:280;237:490:136;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;5593:366:280;;;;5716:108;237:490:136;;5761:63:280;;;237:490:136;;;;;5761:63:280;;237:490:136;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;237:490:136;5485:33:280;;237:490:136;5485:33:280;237:490:136;;;;;5485:33:280;237:490:136;;;;;;;;;;;;1284:37:248;;:::i;:::-;237:490:136;;;;;;;;;;;;;;;;;;2140:39:281;;:::i;:::-;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3732:15:277;237:490:136;;;;;;;;;;;;;;;;;;;;;;;941:19:75;237:490:136;;;;;;;;;;;;;;;9818:5:280;237:490:136;;:::i;:::-;;;:::i;:::-;;1905:41:281;;;:::i;:::-;237:490:136;;;;;;;;;;;9707:14:280;9703:85;;237:490:136;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;237:490:136;;;;;;;;;;;;26654:8:280;237:490:136;;;;;;;;;;;;;;;;;;826:5:242;237:490:136;;:::i;:::-;;;;;1905:41:281;;:::i;:::-;826:5:242;;:::i;237:490:136:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;237:490:136;635:65:55;;:::i;237:490:136:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;237:490:136;1146:19:75;237:490:136;1146:53:75;;;1142:96;;237:490:136;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;237:490:136;1215:12:75;:::o;1359:340:59:-;237:490:136;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;237:490:136;500:10:59;237:490:136;500:10:59;;237:490:136;500:10:59;237:490:136;500:10:59;;237:490:136;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;237:490:136;1528:12:59;:::o;237:490:136:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;237:490:136;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;237:490:136;;4533:21:280;;;4529:67;;237:490:136;4657:31:280;4606:19;:12;237:490:136;4606:19:280;237:490:136;;;-1:-1:-1;237:490:136;4606:12:280;237:490:136;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;237:490:136;4563:33:280;;4552:1;4563:33;237:490:136;4563:33:280;237:490:136;;4552:1:280;4563:33;4317:545:279;237:490:136;;;:::i;:::-;;;;;;4669:54:279;237:490:136;;;4520:321:279;;237:490:136;4552:95:279;237:490:136;;;;;;4745:14:279;237:490:136;;;;4412:53:279;237:490:136;;;;4818:4:279;237:490:136;;;;;4520:321:279;;;;;;:::i;:::-;237:490:136;4493:362:279;;4317:545;:::o;237:490:136:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;237:490:136;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;237:490:136;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;237:490:136;14325:13:280;;;;;;:::i;:::-;237:490:136;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;237:490:136;14472:10:280;14468:656;;14293:3;237:490:136;;;15143:25:280;237:490:136;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;237:490:136;;14270:9:280;;15183:500;237:490:136;;;15437:21:280;;;;;15433:85;;-1:-1:-1;237:490:136;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;237:490:136;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;237:490:136;;;;14602:27:280;;;;14598:74;;237:490:136;;;;;14746:10:280;;;;;14784:14;;237:490:136;;14784:14:280;;-1:-1:-1;237:490:136;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;237:490:136;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;237:490:136;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;237:490:136;14381:32:280;;14132:1;14381:32;237:490:136;14381:32:280;237:490:136;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;10853:1796::-;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;237:490:136;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;237:490:136;;;12409:21:280;;;;;12405:85;;12508:16;;237:490:136;;-1:-1:-1;237:490:136;;;;-1:-1:-1;237:490:136;;;;;12171:472:280;;;;;;;12405:85;237:490:136;12439:51:280;;11116:1;12439:51;237:490:136;12439:51:280;237:490:136;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;237:490:136;11309:13:280;;;;;;:::i;:::-;237:490:136;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;237:490:136;11455:10:280;11451:656;;11277:3;237:490:136;;;;;;;;;12125:25:280;237:490:136;;;;12125:25:280;;237:490:136;11254:9:280;;11451:656;237:490:136;;;;11585:27:280;;;;11581:74;;237:490:136;;;;11729:10:280;;;;;11767:14;;237:490:136;11767:14:280;;237:490:136;-1:-1:-1;237:490:136;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;237:490:136;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;237:490:136;;;;;;11116:1:280;11873:46;11336:61;237:490:136;11365:32:280;;11116:1;11365:32;237:490:136;11365:32:280;237:490:136;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;6693:851::-;;;;237:490:136;;;6808:21:280;;;6804:67;;6908:12;;:19;237:490:136;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;-1:-1:-1;237:490:136;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;237:490:136;;;;;;7495:42:280;237:490:136;;;;;;;7495:42:280;;6693:851::o;6947:534::-;237:490:136;;;7238:32:280;;;;;7234:112;;7364:19;;;237:490:136;7495:42:280;7364:19;237:490:136;7364:19:280;237:490:136;;;-1:-1:-1;237:490:136;;;;-1:-1:-1;237:490:136;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;6947:534:280;;;7234:112;237:490:136;;7279:67:280;;;237:490:136;;;;7279:67:280;;;237:490:136;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;237:490:136;6838:33:280;;6827:1;6838:33;237:490:136;6838:33:280;237:490:136;;6827:1:280;6838:33;8105:628;;;237:490:136;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;237:490:136;;;8701:25:280;237:490:136;;;;;;;8701:25:280;;8105:628::o;8273:413::-;237:490:136;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;;;8437:21:280;;;;;8433:80;;237:490:136;;;;;;;;8701:25:280;237:490:136;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;237:490:136;;;-1:-1:-1;237:490:136;;;;;-1:-1:-1;237:490:136;;;-1:-1:-1;237:490:136;;;;-1:-1:-1;237:490:136;;;;;;;8531:131:280;;;;8433:80;8467:46;;237:490:136;8467:46:280;;8219:1;8467:46;237:490:136;8467:46:280;237:490:136;;;;;;8219:1:280;8467:46;8201:61;237:490:136;8230:32:280;;8219:1;8230:32;237:490:136;8230:32:280;237:490:136;;8219:1:280;8230:32;237:490:136;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;237:490:136;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;237:490:136;1029:19:76;237:490:136;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;237:490:136;;;1676:74:76;;237:490:136;;;1676:74:76;;;237:490:136;1327:10:76;237:490:136;;;;1744:4:76;237:490:136;;;;;-1:-1:-1;1676:74:76;;237:490:136;;;;;;1676:74:76;;;;;;;237:490:136;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;237:490:136;2065:19:76;237:490:136;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;237:490:136;720:8:80;237:490:136;720:8:80;;237:490:136;;;;2115:1:76;2802:32;;:::o;2624:153::-;237:490:136;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;237:490:136;2361:10:76;237:490:136;;;;2771:4:76;237:490:136;;;;;-1:-1:-1;2682:95:76;;237:490:136;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;28229:252:280;237:490:136;;28229:252:280;;;;237:490:136;28229:252:280;237:490:136;;;;;28357:61:280;;;;;237:490:136;28357:61:280;;237:490:136;28357:61:280;;;237:490:136;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;237:490:136;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;237:490:136;;-1:-1:-1;28445:29:280;28357:61;237:490:136;28357:61:280;;237:490:136;28357:61:280;;;;;;237:490:136;28357:61:280;;;:::i;:::-;;;237:490:136;;;;;;;;;;;;;28357:61:280;237:490:136;28357:61:280;;237:490:136;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2298800","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","__msgData()":"infinite","allowance(address,address)":"3035","approve(address,uint256)":"infinite","balanceOf(address)":"2663","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","decimals()":"2385","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","increaseAllowance(address,uint256)":"infinite","isTrustedForwarder(address)":"infinite","name()":"infinite","nonces(address)":"2707","owner()":"2627","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","__msgData()":"31e66e1e","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","increaseAllowance(address,uint256)":"39509351","isTrustedForwarder(address)":"572b6c05","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"holders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"allocations\",\"type\":\"uint256[]\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol\":\"ERC20FixedSupplyMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/preset/ERC20FixedSupplyMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20FixedSupply} from \\\"./../../../../token/ERC20/preset/ERC20FixedSupply.sol\\\";\\n\\ncontract ERC20FixedSupplyMock is ERC20FixedSupply {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] memory holders,\\n        uint256[] memory allocations,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20FixedSupply(tokenName, tokenSymbol, tokenDecimals, holders, allocations, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x25f2a9d079eb1d341e78fdfc9a2f2db89f109739fb289847da885e4dc226dc53\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/ERC20FixedSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20} from \\\"./../ERC20.sol\\\";\\nimport {ERC20Detailed} from \\\"./../ERC20Detailed.sol\\\";\\nimport {ERC20Metadata} from \\\"./../ERC20Metadata.sol\\\";\\nimport {ERC20Permit} from \\\"./../ERC20Permit.sol\\\";\\nimport {ERC20SafeTransfers} from \\\"./../ERC20SafeTransfers.sol\\\";\\nimport {ERC20BatchTransfers} from \\\"./../ERC20BatchTransfers.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).\\ncontract ERC20FixedSupply is\\n    ERC20,\\n    ERC20Detailed,\\n    ERC20Metadata,\\n    ERC20Permit,\\n    ERC20SafeTransfers,\\n    ERC20BatchTransfers,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] memory holders,\\n        uint256[] memory allocations,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {\\n        ERC20Storage.layout().batchMint(holders, allocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1944f12c439c1942890c32c0d12723dd7e2b65076072b3383d33f21bbfa9dee7\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol":{"ERC20MintBurnMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1546,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1509,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105e05761422f80380380610019816105e5565b9283398101906080818303126105e05780516001600160401b0381116105e0578261004591830161060a565b602082015190926001600160401b0382116105e05761006591830161060a565b9160408201519160ff83168093036105e05760600151916001600160a01b03831683036105e0577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f8054600160ff199182168117909255634e83a8c360e11b6000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680549091169091179055825190926001600160401b0382116104b6576000805160206141ef8339815191525490600182811c921680156105d6575b60208310146104965781601f849311610559575b50602090601f83116001146104d7576000926104cc575b50508160011b916000199060031b1c1916176000805160206141ef833981519152555b83516001600160401b0381116104b6576000805160206141cf83398151915254600181811c911680156104ac575b602082101461049657601f8111610424575b50602094601f82116001146103a357948192939495600092610398575b50508160011b916000199060031b1c1916176000805160206141cf833981519152555b60ff1960008051602061420f83398151915254161760008051602061420f8339815191525563a219a02560e01b600052806020526040600020600160ff1982541617905533610339575b6307f5828d60e41b600090815260209190915260408082208054600160ff1991821681179092556303c130d960e41b84528284208054821683179055634ec7fbed60e11b845282842080548216831790556353f41a9760e01b8452828420805482168317905563602993f360e11b8452828420805482168317905563144b1f0f60e11b845282842080548216831790556320c07ed160e01b84529282902080549093161790915560809190915251613b59908161067682396080518181816120e4015281816125ae0152818161374801526138730152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610261565b0151905038806101f4565b601f198216956000805160206141cf833981519152600052806000209160005b88811061040c575083600195969798106103f3575b505050811b016000805160206141cf83398151915255610217565b015160001960f88460031b161c191690553880806103d8565b919260206001819286850151815501940192016103c3565b6000805160206141cf8339815191526000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c8101916020841061048c575b601f0160051c01905b81811061048057506101d7565b60008155600101610473565b909150819061046a565b634e487b7160e01b600052602260045260246000fd5b90607f16906101c5565b634e487b7160e01b600052604160045260246000fd5b015190503880610174565b6000805160206141ef83398151915260009081528281209350601f198516905b8181106105415750908460019594939210610528575b505050811b016000805160206141ef83398151915255610197565b015160001960f88460031b161c1916905538808061050d565b929360206001819287860151815501950193016104f7565b6000805160206141ef8339815191526000529091507fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa428601f840160051c810191602085106105cc575b90601f859493920160051c01905b8181106105bd575061015d565b600081558493506001016105b0565b90915081906105a2565b91607f1691610149565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176104b657604052565b81601f820112156105e0578051906001600160401b0382116104b657610639601f8301601f19166020016105e5565b92828452602083830101116105e05760005b82811061066057505060206000918301015290565b8060208092840101518282870101520161064b56fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461232e57806306fdde03146122d3578063095ea7b31461226657806318160ddd1461220b5780631b9a7529146121c757806323b872dd146121085780632b4c9f16146120995780632f2ff15d14611f0d578063313ce56714611eaf57806331e66e1e14611e2c5780633644e51514611deb5780633950935114611bbb5780633c130d9014611b6057806340c10f191461199d57806342966c68146119395780634885b2541461188b578063572b6c0514611840578063685731071461172557806370a08231146116a057806373c8a9581461151d57806379cc6790146114685780637ecebe00146113e357806388d695b21461139f5780638bb9c5bf146112305780638da5cb5b146111bf57806391d148541461112757806395d89b41146110b4578063a457c2d714611047578063a9059cbb14610fda578063b88d4fde14610eca578063c3666c3614610c8d578063d505accf14610a1a578063d5391393146109c1578063d547741f14610838578063dd62ed3e14610789578063e0df5b6f1461053e578063eb79554914610479578063f2fde38b146103865763f7ba94bd146101c957600080fd5b3461032a576101d73661246a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613731565b9254169116908103610359575081810361032f5760005b81811061023857005b6102438183876128d8565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d8285876128d8565b35908147106102f857600080809381935af13d156102f0573d90610290826136a8565b9161029e60405193846125f6565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd6123f3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103e6613731565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610359575073ffffffffffffffffffffffffffffffffffffffff169283830361042c57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576104b06123f3565b60243560443567ffffffffffffffff811161032a576104d3903690600401612569565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261050c8383610505613731565b8097613553565b813b61051e575b602060405160018152f35b6105349461052d9136916136e2565b92806139a2565b8080808080610513565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a5761058d903690600401612569565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105cc613731565b925416911690810361035957507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff811161075a5761061482546126fe565b601f8111610712575b506000601f82116001146106775781929360009261066c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610636565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106fa57508360019596106106c2575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806106b8565b909260206001819286860135815501940191016106a5565b826000526020600020601f830160051c81019160208410610750575b601f0160051c01905b818110610744575061061d565b60008155600101610737565b909150819061072e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576107c06123f3565b73ffffffffffffffffffffffffffffffffffffffff6107dd612416565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435610872612416565b61087a613731565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661092c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610a516123f3565b610a59612416565b6044359060643560843560ff811680910361032a5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610c6357814211610c35576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c08152610b3b60e0826125f6565b519020610b46612a82565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610b8b6062826125f6565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610c295773ffffffffffffffffffffffffffffffffffffffff6000511603610bff57610bfd927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612813565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a57610c9b366124da565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ce0613731565b92541691169081036103595750808214801590610ec0575b61032f5760005b828110610d0857005b73ffffffffffffffffffffffffffffffffffffffff610d30610d2b83858a6128d8565b612917565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c2957600091610e92575b5015610e65575073ffffffffffffffffffffffffffffffffffffffff610dbf610d2b83858a6128d8565b1690610dcf610d2b8286896128d8565b91610ddb82878b6128d8565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c2957600192610e54575b5001610cff565b6000610e5f916125f6565b88610e4d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610eb3915060203d8111610eb9575b610eab81836125f6565b810190613719565b89610d95565b503d610ea1565b5082821415610cf8565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610f016123f3565b610f09612416565b60443560643567ffffffffffffffff811161032a57610f2c903690600401612569565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610f98848484610f5f613731565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610fc957613553565b823b610fa957602060405160018152f35b610fbe95610fb89136916136e2565b936139a2565b808080808080610513565b610fd5848b8484613375565b613553565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136110146123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611041613731565b90613553565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136110816123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110ae613731565b90613375565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612751565b604051918291602083526020830190612394565b0390f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761115e612416565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561128b613731565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156113575760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016109bc565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a576105136113b03661246a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6113dd613731565b9061311c565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761141a6123f3565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136114a26123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6114cf613731565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff85160361150b575b5050612beb565b611516918484613375565b8483611504565b3461032a5761152b366124da565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061156e613731565b92541691169081036103595750808314801590611696575b61032f5760005b83811061159657005b6115a18183886128d8565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a5760006020918a826115e2876115db610d2b828f8f906128d8565b938b6128d8565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261163d6064826125f6565b51925af115610c29576000513d61168d5750803b155b611660575060010161158d565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611653565b5085831415611586565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576116d76123f3565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461032a576117333661246a565b9290916117687fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611762613731565b90612b29565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061179381612637565b926117a160405194856125f6565b818452602084019160051b81019036821161032a57915b818310611813575050506117cb84612637565b926117d960405194856125f6565b848452602084019460051b81019036821161032a57945b818610611803575050610bfd9350612fcc565b85358152602095860195016117f0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016117b8565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061188161187c6123f3565b612597565b6040519015158152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576118c26123f3565b60243567ffffffffffffffff811161032a576118e2903690600401612439565b916044359267ffffffffffffffff841161032a57611907610513943690600401612439565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611933613731565b90612d0c565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611997613731565b90612beb565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119d46123f3565b602435611a037fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611762613731565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9216918215611b365781611a78575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0548281019080821115611b0457507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611a48565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612751565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611bf26123f3565b602435611bfd613731565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611da75773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611cc2575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611d4c57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611c73565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611e24612a82565b604051908152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576040611e6561385c565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435611f47612416565b611f4f613731565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561200257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016109bc565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136121426123f3565b61214a612416565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91612174613731565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036121b5575b5050613553565b6121c0918484613375565b85846121ae565b3461032a576105136121d83661246a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612205613731565b90612938565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136122a06123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6122cd613731565b90612813565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612751565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a5761188160209161264f565b919082519283825260005b8481106123de5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161239f565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816124b391600401612439565b929092916024359067ffffffffffffffff821161032a576124d691600401612439565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161252391600401612439565b9290929160243567ffffffffffffffff811161032a578161254691600401612439565b929092916044359067ffffffffffffffff821161032a576124d691600401612439565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156125ef5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761075a57604052565b67ffffffffffffffff811161075a5760051b60200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146126f8577f01ffc9a70000000000000000000000000000000000000000000000000000000081146126f2576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015612747575b602083101461271857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161270d565b9060405191826000825492612765846126fe565b80845293600181169081156127d3575060011461278c575b5061278a925003836125f6565b565b90506000929192526020600020906000915b8183106127b757505090602061278a928201013861277d565b602091935080600191548385890101520191019091849261279e565b6020935061278a9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861277d565b929173ffffffffffffffffffffffffffffffffffffffff169283156128945773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156128e85760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b93929480860361032f578515612a7a5760009560005b81811061296f5750505050505081612964575050565b600201908154039055565b61297d610d2b8284886128d8565b6129888285896128d8565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff81168503612a68575b509050612a00575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a30161294e565b98604060008381528a60205220548a81039080821015612a325750600083815260208b905260409020558901986129c9565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b612a72928c613375565b3881876129c1565b505050505050565b612aab7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612751565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612b2360c0826125f6565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612b835750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b82612c39575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612cc0575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612bf1565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361032f578015612faf5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612da8575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612d96575b50505050565b612d9f93613375565b38808080612d90565b73ffffffffffffffffffffffffffffffffffffffff612dcb610d2b83858b6128d8565b168015612f6b57612ddd8285876128d8565b3580612ea7575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612e9d575b612e41575b50600101612d4e565b8a87039087821015612e6757600090815260208d90526040902090860190556001612e38565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612e33565b9a8b810190811115612f41579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612ef35750906040602093926000908482528552208181540190555b909150612de4565b90508882989211612f0b575090866020920196612eeb565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b80518210156128e85760209160051b010190565b90918251908051820361032f578115612d905760009360005b838110613040575050505081612ff9575050565b600201805491808301928084111561301057505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff61305f8284612fb8565b51168015611b36576130718285612fb8565b51806130af575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612fe5565b969190878301928311156130f25773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190613078565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361032f578415612a7a5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061320e57505050505080151580613204575b61317d575b5050505050565b80850394808610156131ba57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080613176565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415613171565b73ffffffffffffffffffffffffffffffffffffffff613231610d2b8385896128d8565b168015613331576132438285876128d8565b3580613297575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161315c565b9687810190811115612f41579673ffffffffffffffffffffffffffffffffffffffff89168281146132e457509060019291604060008381528c602052208181540190555b9091925061324a565b8c829c92116132fb5750908a60019392019a6132db565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff811693841561350f576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613506575b613442575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156134ab5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926133fa565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156133f5565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561366457826135bd575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612cc057508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361363d575b5050925050613578565b83831660005281855260406000205586600052835260406000208581540190553880613633565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161075a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136ee826136a8565b916136fc60405193846125f6565b82948184528183011161032a578281602093846000960137010152565b9081602091031261032a5751801515810361032a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561384d573233148015613852575b61384d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156137bc575b506137b957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c295760009161382e575b50386137af565b613847915060203d602011610eb957610eab81836125f6565b38613827565b503390565b5060183610613778565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613990573233148015613998575b613990578033149081156138ef575b506138be576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c2957600091613971575b50386138b2565b61398a915060203d602011610eb957610eab81836125f6565b3861396a565b506000903690565b50601836106138a3565b613a1173ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612394565b03816000865af1908115610c2957600091613aa1575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603613a745750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011613b1b575b81613aba602093836125f6565b81010312613b175751907fffffffff0000000000000000000000000000000000000000000000000000000082168203613b1457507fffffffff00000000000000000000000000000000000000000000000000000000613a27565b80fd5b5080fd5b3d9150613aad56fea2646970667358221220c752618e56d76f4fd0fd334c30e4d96c7048f507884a39ad5c04bec19f9fe0dd64736f6c634300081e0033335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5E0 JUMPI PUSH2 0x422F DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5E5 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SLT PUSH2 0x5E0 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5E0 JUMPI DUP3 PUSH2 0x45 SWAP2 DUP4 ADD PUSH2 0x60A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5E0 JUMPI PUSH2 0x65 SWAP2 DUP4 ADD PUSH2 0x60A JUMP JUMPDEST SWAP2 PUSH1 0x40 DUP3 ADD MLOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x5E0 JUMPI PUSH1 0x60 ADD MLOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP4 SUB PUSH2 0x5E0 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x4E83A8C3 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE DUP3 MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x4B6 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41EF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5D6 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x496 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x559 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4D7 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4CC JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41EF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x4B6 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41CF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x4AC JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x496 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x424 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3A3 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x398 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41CF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH4 0xA219A025 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE CALLER PUSH2 0x339 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x3C130D9 PUSH1 0xE4 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4EC7FBED PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x53F41A97 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x602993F3 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x144B1F0F PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x20C07ED1 PUSH1 0xE0 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3B59 SWAP1 DUP2 PUSH2 0x676 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x20E4 ADD MSTORE DUP2 DUP2 PUSH2 0x25AE ADD MSTORE DUP2 DUP2 PUSH2 0x3748 ADD MSTORE PUSH2 0x3873 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x261 JUMP JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41CF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x40C JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3F3 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41CF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3D8 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41CF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x48C JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x480 JUMPI POP PUSH2 0x1D7 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x473 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x46A JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x1C5 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x174 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41EF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x541 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x528 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41EF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x197 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x50D JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4F7 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x41EF DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5CC JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x5BD JUMPI POP PUSH2 0x15D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x5B0 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x5A2 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x149 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x4B6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5E0 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x4B6 JUMPI PUSH2 0x639 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5E5 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5E0 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x660 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x64B JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x232E JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x22D3 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2266 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x220B JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x21C7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2108 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2099 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1F0D JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EAF JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1E2C JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1DEB JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1BBB JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1B60 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x199D JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x1939 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x188B JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1840 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1725 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x16A0 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x151D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1468 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x13E3 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x139F JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1230 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11BF JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1127 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10B4 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x1047 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xFDA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xECA JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC8D JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0xA1A JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x9C1 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x838 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x789 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x53E JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x36A8 JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x25F6 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x23F3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3E6 PUSH2 0x3731 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x42C JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x4B0 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x4D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x50C DUP4 DUP4 PUSH2 0x505 PUSH2 0x3731 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3553 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x51E JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x534 SWAP5 PUSH2 0x52D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x39A2 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x513 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x58D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5CC PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH2 0x614 DUP3 SLOAD PUSH2 0x26FE JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x712 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x677 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x66C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x636 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x6FA JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x6C2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x6B8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x6A5 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x750 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x744 JUMPI POP PUSH2 0x61D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x737 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x7C0 PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DD PUSH2 0x2416 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x872 PUSH2 0x2416 JUMP JUMPDEST PUSH2 0x87A PUSH2 0x3731 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x92C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xA51 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0xA59 PUSH2 0x2416 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xC63 JUMPI DUP2 TIMESTAMP GT PUSH2 0xC35 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xB3B PUSH1 0xE0 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0xB46 PUSH2 0x2A82 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0xB8B PUSH1 0x62 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0xC29 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0xBFF JUMPI PUSH2 0xBFD SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2813 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xC9B CALLDATASIZE PUSH2 0x24DA JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCE0 PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEC0 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xD08 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD30 PUSH2 0xD2B DUP4 DUP6 DUP11 PUSH2 0x28D8 JUMP JUMPDEST PUSH2 0x2917 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE92 JUMPI JUMPDEST POP ISZERO PUSH2 0xE65 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDBF PUSH2 0xD2B DUP4 DUP6 DUP11 PUSH2 0x28D8 JUMP JUMPDEST AND SWAP1 PUSH2 0xDCF PUSH2 0xD2B DUP3 DUP7 DUP10 PUSH2 0x28D8 JUMP JUMPDEST SWAP2 PUSH2 0xDDB DUP3 DUP8 DUP12 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE54 JUMPI JUMPDEST POP ADD PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE5F SWAP2 PUSH2 0x25F6 JUMP JUMPDEST DUP9 PUSH2 0xE4D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEB3 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEB9 JUMPI JUMPDEST PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3719 JUMP JUMPDEST DUP10 PUSH2 0xD95 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xEA1 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCF8 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xF01 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0xF09 PUSH2 0x2416 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xF2C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xF98 DUP5 DUP5 DUP5 PUSH2 0xF5F PUSH2 0x3731 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFC9 JUMPI PUSH2 0x3553 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFA9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xFBE SWAP6 PUSH2 0xFB8 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP4 PUSH2 0x39A2 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x513 JUMP JUMPDEST PUSH2 0xFD5 DUP5 DUP12 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST PUSH2 0x3553 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x1014 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1041 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x3553 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x1081 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x10AE PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x3375 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2751 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x115E PUSH2 0x2416 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x128B PUSH2 0x3731 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x13B0 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x13DD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x311C JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x141A PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x14A2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x14CF PUSH2 0x3731 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x150B JUMPI JUMPDEST POP POP PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x1516 SWAP2 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1504 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x152B CALLDATASIZE PUSH2 0x24DA JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x156E PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1696 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1596 JUMPI STOP JUMPDEST PUSH2 0x15A1 DUP2 DUP4 DUP9 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x15E2 DUP8 PUSH2 0x15DB PUSH2 0xD2B DUP3 DUP16 DUP16 SWAP1 PUSH2 0x28D8 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x163D PUSH1 0x64 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x168D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1660 JUMPI POP PUSH1 0x1 ADD PUSH2 0x158D JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1653 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1586 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x16D7 PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1733 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x1768 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1762 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2B29 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1793 DUP2 PUSH2 0x2637 JUMP JUMPDEST SWAP3 PUSH2 0x17A1 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x25F6 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1813 JUMPI POP POP POP PUSH2 0x17CB DUP5 PUSH2 0x2637 JUMP JUMPDEST SWAP3 PUSH2 0x17D9 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x25F6 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1803 JUMPI POP POP PUSH2 0xBFD SWAP4 POP PUSH2 0x2FCC JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x17F0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x17B8 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1881 PUSH2 0x187C PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0x2597 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x18C2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x18E2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x32A JUMPI PUSH2 0x1907 PUSH2 0x513 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1933 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2D0C JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1997 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2BEB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19D4 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1A03 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1762 PUSH2 0x3731 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x1B36 JUMPI DUP2 PUSH2 0x1A78 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1B04 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x1A48 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2751 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1BF2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1BFD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1DA7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1CC2 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1D4C JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1C73 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1E24 PUSH2 0x2A82 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x40 PUSH2 0x1E65 PUSH2 0x385C JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1F47 PUSH2 0x2416 JUMP JUMPDEST PUSH2 0x1F4F PUSH2 0x3731 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2002 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9BC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x2142 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0x214A PUSH2 0x2416 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2174 PUSH2 0x3731 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x21B5 JUMPI JUMPDEST POP POP PUSH2 0x3553 JUMP JUMPDEST PUSH2 0x21C0 SWAP2 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x21AE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x21D8 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2205 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2938 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x22A0 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x22CD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2813 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2751 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1881 PUSH1 0x20 SWAP2 PUSH2 0x264F JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23DE JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x239F JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x24B3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x24D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2523 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2546 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x24D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x25EF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x75A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26F8 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26F2 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x2747 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2718 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x270D JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x2765 DUP5 PUSH2 0x26FE JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x27D3 JUMPI POP PUSH1 0x1 EQ PUSH2 0x278C JUMPI JUMPDEST POP PUSH2 0x278A SWAP3 POP SUB DUP4 PUSH2 0x25F6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x27B7 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x278A SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x277D JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x279E JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x278A SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x277D JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2894 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x28E8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x32F JUMPI DUP6 ISZERO PUSH2 0x2A7A JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x296F JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x2964 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x297D PUSH2 0xD2B DUP3 DUP5 DUP9 PUSH2 0x28D8 JUMP JUMPDEST PUSH2 0x2988 DUP3 DUP6 DUP10 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x2A68 JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x2A00 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x294E JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2A32 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x29C9 JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2A72 SWAP3 DUP13 PUSH2 0x3375 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x29C1 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2AAB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2751 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2B23 PUSH1 0xC0 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2B83 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x2C39 JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2CC0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2BF1 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x32F JUMPI DUP1 ISZERO PUSH2 0x2FAF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DA8 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2D96 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2D9F SWAP4 PUSH2 0x3375 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DCB PUSH2 0xD2B DUP4 DUP6 DUP12 PUSH2 0x28D8 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2F6B JUMPI PUSH2 0x2DDD DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2EA7 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2E9D JUMPI JUMPDEST PUSH2 0x2E41 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2D4E JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2E67 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2E38 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2E33 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2F41 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2EF3 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2DE4 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2F0B JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2EEB JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x28E8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x32F JUMPI DUP2 ISZERO PUSH2 0x2D90 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3040 JUMPI POP POP POP POP DUP2 PUSH2 0x2FF9 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x3010 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x305F DUP3 DUP5 PUSH2 0x2FB8 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1B36 JUMPI PUSH2 0x3071 DUP3 DUP6 PUSH2 0x2FB8 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x30AF JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2FE5 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x30F2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x3078 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x32F JUMPI DUP5 ISZERO PUSH2 0x2A7A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x320E JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3204 JUMPI JUMPDEST PUSH2 0x317D JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x31BA JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x3176 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x3171 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3231 PUSH2 0xD2B DUP4 DUP6 DUP10 PUSH2 0x28D8 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3331 JUMPI PUSH2 0x3243 DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3297 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x315C JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2F41 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x32E4 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x324A JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x32FB JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x32DB JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x350F JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3506 JUMPI JUMPDEST PUSH2 0x3442 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x34AB JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x33FA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x33F5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3664 JUMPI DUP3 PUSH2 0x35BD JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2CC0 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x363D JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3578 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3633 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x36EE DUP3 PUSH2 0x36A8 JUMP JUMPDEST SWAP2 PUSH2 0x36FC PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x25F6 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x384D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3852 JUMPI JUMPDEST PUSH2 0x384D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x37BC JUMPI JUMPDEST POP PUSH2 0x37B9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x382E JUMPI JUMPDEST POP CODESIZE PUSH2 0x37AF JUMP JUMPDEST PUSH2 0x3847 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB9 JUMPI PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST CODESIZE PUSH2 0x3827 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3778 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3990 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3998 JUMPI JUMPDEST PUSH2 0x3990 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x38EF JUMPI JUMPDEST POP PUSH2 0x38BE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3971 JUMPI JUMPDEST POP CODESIZE PUSH2 0x38B2 JUMP JUMPDEST PUSH2 0x398A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB9 JUMPI PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST CODESIZE PUSH2 0x396A JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x38A3 JUMP JUMPDEST PUSH2 0x3A11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2394 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3AA1 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3A74 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3B1B JUMPI JUMPDEST DUP2 PUSH2 0x3ABA PUSH1 0x20 SWAP4 DUP4 PUSH2 0x25F6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3B17 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3B14 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3A27 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3AAD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 MSTORE PUSH2 0x8E56 0xD7 PUSH16 0x4FD0FD334C30E4D96C7048F507884A39 0xAD TLOAD DIV 0xBE 0xC1 SWAP16 SWAP16 RJUMP 0xDD64 PUSH20 0x6F6C634300081E0033335DF4119BBB04F056B33E 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x82335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x81335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x8300000000000000000000 ","sourceMap":"231:387:137:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;231:387:137;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;231:387:137;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;231:387:137;;;;;;;;500:10:59;;;;;;2510:4:280;-1:-1:-1;;231:387:137;;;;;500:10:59;;;-1:-1:-1;;;;500:10:59;;;;231:387:137;;;;;;500:10:59;;231:387:137;;;;-1:-1:-1;;;;;231:387:137;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;2510:4:280;231:387:137;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;;;-1:-1:-1;;;;;231:387:137;;;;-1:-1:-1;;;;;;;;;;;231:387:137;2510:4:280;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;;-1:-1:-1;;;;;;;;;;;231:387:137;1598:32:277;;;-1:-1:-1;500:10:59;;231:387:137;500:10:59;231:387:137;-1:-1:-1;500:10:59;2510:4:280;231:387:137;;500:10:59;;231:387:137;;500:10:59;;1592::282;1645:152:42;;231:387:137;-1:-1:-1;;;;500:10:59;;;231:387:137;500:10:59;;;;231:387:137;500:10:59;;;;;2510:4:280;-1:-1:-1;;231:387:137;;;;;500:10:59;;;-1:-1:-1;;;500:10:59;;;;;;;231:387:137;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;231:387:137;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;231:387:137;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;231:387:137;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;231:387:137;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;;231:387:137;;;;500:10:59;;;231:387:137;745:39:76;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1645:152:42;231:387:137;;;-1:-1:-1;;;;;;231:387:137;1592:10:282;231:387:137;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;231:387:137;;;;-1:-1:-1;231:387:137;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;231:387:137;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;2510:4:280;231:387:137;;;;;;-1:-1:-1;231:387:137;;;;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;;;;;;;;;;;;231:387:137;;;;;;;-1:-1:-1;;;231:387:137;;;;;;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;231:387:137;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;231:387:137;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;-1:-1:-1;2510:4:280;231:387:137;;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;-1:-1:-1;;231:387:137;;;-1:-1:-1;;;;;231:387:137;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;231:387:137;;;;;;;;-1:-1:-1;;231:387:137;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;-1:-1:-1;231:387:137;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":9203,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":9273,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9434,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9322,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":14050,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":14105,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":9577,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":9238,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":9108,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":9783,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13992,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":10456,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":10065,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":9982,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":9718,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":10882,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":10259,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchBurnFrom":{"entryPoint":10552,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_batchMint":{"entryPoint":12236,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":12572,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":11532,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_burn":{"entryPoint":11243,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":14754,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":13173,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":11049,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":9623,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":14428,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":14129,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":9807,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transfer":{"entryPoint":13651,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":12216,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":10519,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8420},{"length":32,"start":9646},{"length":32,"start":14152},{"length":32,"start":14451}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461232e57806306fdde03146122d3578063095ea7b31461226657806318160ddd1461220b5780631b9a7529146121c757806323b872dd146121085780632b4c9f16146120995780632f2ff15d14611f0d578063313ce56714611eaf57806331e66e1e14611e2c5780633644e51514611deb5780633950935114611bbb5780633c130d9014611b6057806340c10f191461199d57806342966c68146119395780634885b2541461188b578063572b6c0514611840578063685731071461172557806370a08231146116a057806373c8a9581461151d57806379cc6790146114685780637ecebe00146113e357806388d695b21461139f5780638bb9c5bf146112305780638da5cb5b146111bf57806391d148541461112757806395d89b41146110b4578063a457c2d714611047578063a9059cbb14610fda578063b88d4fde14610eca578063c3666c3614610c8d578063d505accf14610a1a578063d5391393146109c1578063d547741f14610838578063dd62ed3e14610789578063e0df5b6f1461053e578063eb79554914610479578063f2fde38b146103865763f7ba94bd146101c957600080fd5b3461032a576101d73661246a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613731565b9254169116908103610359575081810361032f5760005b81811061023857005b6102438183876128d8565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d8285876128d8565b35908147106102f857600080809381935af13d156102f0573d90610290826136a8565b9161029e60405193846125f6565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd6123f3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103e6613731565b9080549273ffffffffffffffffffffffffffffffffffffffff8085169316838103610359575073ffffffffffffffffffffffffffffffffffffffff169283830361042c57005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576104b06123f3565b60243560443567ffffffffffffffff811161032a576104d3903690600401612569565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261050c8383610505613731565b8097613553565b813b61051e575b602060405160018152f35b6105349461052d9136916136e2565b92806139a2565b8080808080610513565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a5761058d903690600401612569565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105cc613731565b925416911690810361035957507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff811161075a5761061482546126fe565b601f8111610712575b506000601f82116001146106775781929360009261066c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610636565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106fa57508360019596106106c2575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806106b8565b909260206001819286860135815501940191016106a5565b826000526020600020601f830160051c81019160208410610750575b601f0160051c01905b818110610744575061061d565b60008155600101610737565b909150819061072e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576107c06123f3565b73ffffffffffffffffffffffffffffffffffffffff6107dd612416565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435610872612416565b61087a613731565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661092c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610a516123f3565b610a59612416565b6044359060643560843560ff811680910361032a5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610c6357814211610c35576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c08152610b3b60e0826125f6565b519020610b46612a82565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610b8b6062826125f6565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610c295773ffffffffffffffffffffffffffffffffffffffff6000511603610bff57610bfd927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612813565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a57610c9b366124da565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ce0613731565b92541691169081036103595750808214801590610ec0575b61032f5760005b828110610d0857005b73ffffffffffffffffffffffffffffffffffffffff610d30610d2b83858a6128d8565b612917565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c2957600091610e92575b5015610e65575073ffffffffffffffffffffffffffffffffffffffff610dbf610d2b83858a6128d8565b1690610dcf610d2b8286896128d8565b91610ddb82878b6128d8565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c2957600192610e54575b5001610cff565b6000610e5f916125f6565b88610e4d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610eb3915060203d8111610eb9575b610eab81836125f6565b810190613719565b89610d95565b503d610ea1565b5082821415610cf8565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610f016123f3565b610f09612416565b60443560643567ffffffffffffffff811161032a57610f2c903690600401612569565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610f98848484610f5f613731565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610fc957613553565b823b610fa957602060405160018152f35b610fbe95610fb89136916136e2565b936139a2565b808080808080610513565b610fd5848b8484613375565b613553565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136110146123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611041613731565b90613553565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136110816123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110ae613731565b90613375565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612751565b604051918291602083526020830190612394565b0390f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761115e612416565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561128b613731565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156113575760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016109bc565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a576105136113b03661246a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6113dd613731565b9061311c565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761141a6123f3565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136114a26123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6114cf613731565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff85160361150b575b5050612beb565b611516918484613375565b8483611504565b3461032a5761152b366124da565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061156e613731565b92541691169081036103595750808314801590611696575b61032f5760005b83811061159657005b6115a18183886128d8565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a5760006020918a826115e2876115db610d2b828f8f906128d8565b938b6128d8565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261163d6064826125f6565b51925af115610c29576000513d61168d5750803b155b611660575060010161158d565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611653565b5085831415611586565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576116d76123f3565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461032a576117333661246a565b9290916117687fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611762613731565b90612b29565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061179381612637565b926117a160405194856125f6565b818452602084019160051b81019036821161032a57915b818310611813575050506117cb84612637565b926117d960405194856125f6565b848452602084019460051b81019036821161032a57945b818610611803575050610bfd9350612fcc565b85358152602095860195016117f0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016117b8565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061188161187c6123f3565b612597565b6040519015158152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576118c26123f3565b60243567ffffffffffffffff811161032a576118e2903690600401612439565b916044359267ffffffffffffffff841161032a57611907610513943690600401612439565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611933613731565b90612d0c565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611997613731565b90612beb565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119d46123f3565b602435611a037fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611762613731565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9216918215611b365781611a78575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0548281019080821115611b0457507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611a48565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612751565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611bf26123f3565b602435611bfd613731565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611da75773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611cc2575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611d4c57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611c73565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611e24612a82565b604051908152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576040611e6561385c565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435611f47612416565b611f4f613731565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561200257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016109bc565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136121426123f3565b61214a612416565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91612174613731565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036121b5575b5050613553565b6121c0918484613375565b85846121ae565b3461032a576105136121d83661246a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612205613731565b90612938565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576105136122a06123f3565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6122cd613731565b90612813565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761112361110f7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612751565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a5761188160209161264f565b919082519283825260005b8481106123de5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161239f565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816124b391600401612439565b929092916024359067ffffffffffffffff821161032a576124d691600401612439565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161252391600401612439565b9290929160243567ffffffffffffffff811161032a578161254691600401612439565b929092916044359067ffffffffffffffff821161032a576124d691600401612439565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156125ef5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761075a57604052565b67ffffffffffffffff811161075a5760051b60200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146126f8577f01ffc9a70000000000000000000000000000000000000000000000000000000081146126f2576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015612747575b602083101461271857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161270d565b9060405191826000825492612765846126fe565b80845293600181169081156127d3575060011461278c575b5061278a925003836125f6565b565b90506000929192526020600020906000915b8183106127b757505090602061278a928201013861277d565b602091935080600191548385890101520191019091849261279e565b6020935061278a9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861277d565b929173ffffffffffffffffffffffffffffffffffffffff169283156128945773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156128e85760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b93929480860361032f578515612a7a5760009560005b81811061296f5750505050505081612964575050565b600201908154039055565b61297d610d2b8284886128d8565b6129888285896128d8565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff81168503612a68575b509050612a00575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a30161294e565b98604060008381528a60205220548a81039080821015612a325750600083815260208b905260409020558901986129c9565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b612a72928c613375565b3881876129c1565b505050505050565b612aab7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612751565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612b2360c0826125f6565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612b835750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b82612c39575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612cc0575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612bf1565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361032f578015612faf5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612da8575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612d96575b50505050565b612d9f93613375565b38808080612d90565b73ffffffffffffffffffffffffffffffffffffffff612dcb610d2b83858b6128d8565b168015612f6b57612ddd8285876128d8565b3580612ea7575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612e9d575b612e41575b50600101612d4e565b8a87039087821015612e6757600090815260208d90526040902090860190556001612e38565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612e33565b9a8b810190811115612f41579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612ef35750906040602093926000908482528552208181540190555b909150612de4565b90508882989211612f0b575090866020920196612eeb565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b80518210156128e85760209160051b010190565b90918251908051820361032f578115612d905760009360005b838110613040575050505081612ff9575050565b600201805491808301928084111561301057505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff61305f8284612fb8565b51168015611b36576130718285612fb8565b51806130af575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612fe5565b969190878301928311156130f25773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190613078565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361032f578415612a7a5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061320e57505050505080151580613204575b61317d575b5050505050565b80850394808610156131ba57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080613176565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415613171565b73ffffffffffffffffffffffffffffffffffffffff613231610d2b8385896128d8565b168015613331576132438285876128d8565b3580613297575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161315c565b9687810190811115612f41579673ffffffffffffffffffffffffffffffffffffffff89168281146132e457509060019291604060008381528c602052208181540190555b9091925061324a565b8c829c92116132fb5750908a60019392019a6132db565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff811693841561350f576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613506575b613442575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156134ab5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926133fa565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156133f5565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561366457826135bd575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612cc057508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361363d575b5050925050613578565b83831660005281855260406000205586600052835260406000208581540190553880613633565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161075a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136ee826136a8565b916136fc60405193846125f6565b82948184528183011161032a578281602093846000960137010152565b9081602091031261032a5751801515810361032a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561384d573233148015613852575b61384d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156137bc575b506137b957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c295760009161382e575b50386137af565b613847915060203d602011610eb957610eab81836125f6565b38613827565b503390565b5060183610613778565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613990573233148015613998575b613990578033149081156138ef575b506138be576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c2957600091613971575b50386138b2565b61398a915060203d602011610eb957610eab81836125f6565b3861396a565b506000903690565b50601836106138a3565b613a1173ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612394565b03816000865af1908115610c2957600091613aa1575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603613a745750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011613b1b575b81613aba602093836125f6565b81010312613b175751907fffffffff0000000000000000000000000000000000000000000000000000000082168203613b1457507fffffffff00000000000000000000000000000000000000000000000000000000613a27565b80fd5b5080fd5b3d9150613aad56fea2646970667358221220c752618e56d76f4fd0fd334c30e4d96c7048f507884a39ad5c04bec19f9fe0dd64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x232E JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x22D3 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2266 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x220B JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x21C7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2108 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2099 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1F0D JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EAF JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1E2C JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1DEB JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1BBB JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1B60 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x199D JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x1939 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x188B JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1840 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1725 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x16A0 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x151D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1468 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x13E3 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x139F JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1230 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11BF JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1127 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10B4 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x1047 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xFDA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xECA JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC8D JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0xA1A JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x9C1 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x838 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x789 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x53E JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x36A8 JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x25F6 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x23F3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3E6 PUSH2 0x3731 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x42C JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x4B0 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x4D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x50C DUP4 DUP4 PUSH2 0x505 PUSH2 0x3731 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3553 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x51E JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x534 SWAP5 PUSH2 0x52D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x39A2 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x513 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x58D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5CC PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH2 0x614 DUP3 SLOAD PUSH2 0x26FE JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x712 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x677 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x66C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x636 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x6FA JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x6C2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x6B8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x6A5 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x750 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x744 JUMPI POP PUSH2 0x61D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x737 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x72E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x7C0 PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DD PUSH2 0x2416 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x872 PUSH2 0x2416 JUMP JUMPDEST PUSH2 0x87A PUSH2 0x3731 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x92C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xA51 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0xA59 PUSH2 0x2416 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xC63 JUMPI DUP2 TIMESTAMP GT PUSH2 0xC35 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xB3B PUSH1 0xE0 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0xB46 PUSH2 0x2A82 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0xB8B PUSH1 0x62 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0xC29 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0xBFF JUMPI PUSH2 0xBFD SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2813 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xC9B CALLDATASIZE PUSH2 0x24DA JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCE0 PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEC0 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xD08 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD30 PUSH2 0xD2B DUP4 DUP6 DUP11 PUSH2 0x28D8 JUMP JUMPDEST PUSH2 0x2917 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE92 JUMPI JUMPDEST POP ISZERO PUSH2 0xE65 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDBF PUSH2 0xD2B DUP4 DUP6 DUP11 PUSH2 0x28D8 JUMP JUMPDEST AND SWAP1 PUSH2 0xDCF PUSH2 0xD2B DUP3 DUP7 DUP10 PUSH2 0x28D8 JUMP JUMPDEST SWAP2 PUSH2 0xDDB DUP3 DUP8 DUP12 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE54 JUMPI JUMPDEST POP ADD PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE5F SWAP2 PUSH2 0x25F6 JUMP JUMPDEST DUP9 PUSH2 0xE4D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEB3 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEB9 JUMPI JUMPDEST PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3719 JUMP JUMPDEST DUP10 PUSH2 0xD95 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xEA1 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCF8 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xF01 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0xF09 PUSH2 0x2416 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xF2C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2569 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xF98 DUP5 DUP5 DUP5 PUSH2 0xF5F PUSH2 0x3731 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFC9 JUMPI PUSH2 0x3553 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFA9 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xFBE SWAP6 PUSH2 0xFB8 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP4 PUSH2 0x39A2 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x513 JUMP JUMPDEST PUSH2 0xFD5 DUP5 DUP12 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST PUSH2 0x3553 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x1014 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1041 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x3553 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x1081 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x10AE PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x3375 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2751 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x115E PUSH2 0x2416 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x128B PUSH2 0x3731 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1357 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x13B0 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x13DD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x311C JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x141A PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x14A2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x14CF PUSH2 0x3731 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x150B JUMPI JUMPDEST POP POP PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x1516 SWAP2 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1504 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x152B CALLDATASIZE PUSH2 0x24DA JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x156E PUSH2 0x3731 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1696 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1596 JUMPI STOP JUMPDEST PUSH2 0x15A1 DUP2 DUP4 DUP9 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x15E2 DUP8 PUSH2 0x15DB PUSH2 0xD2B DUP3 DUP16 DUP16 SWAP1 PUSH2 0x28D8 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x163D PUSH1 0x64 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x168D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1660 JUMPI POP PUSH1 0x1 ADD PUSH2 0x158D JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1653 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1586 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x16D7 PUSH2 0x23F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1733 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x1768 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1762 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2B29 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1793 DUP2 PUSH2 0x2637 JUMP JUMPDEST SWAP3 PUSH2 0x17A1 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x25F6 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1813 JUMPI POP POP POP PUSH2 0x17CB DUP5 PUSH2 0x2637 JUMP JUMPDEST SWAP3 PUSH2 0x17D9 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x25F6 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1803 JUMPI POP POP PUSH2 0xBFD SWAP4 POP PUSH2 0x2FCC JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x17F0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x17B8 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1881 PUSH2 0x187C PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0x2597 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x18C2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x18E2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x32A JUMPI PUSH2 0x1907 PUSH2 0x513 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1933 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2D0C JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1997 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2BEB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19D4 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1A03 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1762 PUSH2 0x3731 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x1B36 JUMPI DUP2 PUSH2 0x1A78 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1B04 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x1A48 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2751 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1BF2 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1BFD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1DA7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1CC2 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1D4C JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1C73 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1E24 PUSH2 0x2A82 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x40 PUSH2 0x1E65 PUSH2 0x385C JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1F47 PUSH2 0x2416 JUMP JUMPDEST PUSH2 0x1F4F PUSH2 0x3731 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2002 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9BC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x2142 PUSH2 0x23F3 JUMP JUMPDEST PUSH2 0x214A PUSH2 0x2416 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2174 PUSH2 0x3731 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x21B5 JUMPI JUMPDEST POP POP PUSH2 0x3553 JUMP JUMPDEST PUSH2 0x21C0 SWAP2 DUP5 DUP5 PUSH2 0x3375 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x21AE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x21D8 CALLDATASIZE PUSH2 0x246A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2205 PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2938 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x513 PUSH2 0x22A0 PUSH2 0x23F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x22CD PUSH2 0x3731 JUMP JUMPDEST SWAP1 PUSH2 0x2813 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1123 PUSH2 0x110F PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2751 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1881 PUSH1 0x20 SWAP2 PUSH2 0x264F JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23DE JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x239F JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x24B3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x24D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2523 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2546 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x24D6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2439 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x25EF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x75A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26F8 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x26F2 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x2747 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2718 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x270D JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x2765 DUP5 PUSH2 0x26FE JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x27D3 JUMPI POP PUSH1 0x1 EQ PUSH2 0x278C JUMPI JUMPDEST POP PUSH2 0x278A SWAP3 POP SUB DUP4 PUSH2 0x25F6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x27B7 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x278A SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x277D JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x279E JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x278A SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x277D JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2894 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x28E8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x32F JUMPI DUP6 ISZERO PUSH2 0x2A7A JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x296F JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x2964 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x297D PUSH2 0xD2B DUP3 DUP5 DUP9 PUSH2 0x28D8 JUMP JUMPDEST PUSH2 0x2988 DUP3 DUP6 DUP10 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x2A68 JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x2A00 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x294E JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2A32 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x29C9 JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2A72 SWAP3 DUP13 PUSH2 0x3375 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x29C1 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2AAB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2751 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2B23 PUSH1 0xC0 DUP3 PUSH2 0x25F6 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2B83 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x2C39 JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2CC0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2BF1 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x32F JUMPI DUP1 ISZERO PUSH2 0x2FAF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DA8 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2D96 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2D9F SWAP4 PUSH2 0x3375 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x2D90 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DCB PUSH2 0xD2B DUP4 DUP6 DUP12 PUSH2 0x28D8 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2F6B JUMPI PUSH2 0x2DDD DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2EA7 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2E9D JUMPI JUMPDEST PUSH2 0x2E41 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2D4E JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2E67 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2E38 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2E33 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2F41 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2EF3 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2DE4 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2F0B JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2EEB JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x28E8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x32F JUMPI DUP2 ISZERO PUSH2 0x2D90 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3040 JUMPI POP POP POP POP DUP2 PUSH2 0x2FF9 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x3010 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x305F DUP3 DUP5 PUSH2 0x2FB8 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1B36 JUMPI PUSH2 0x3071 DUP3 DUP6 PUSH2 0x2FB8 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x30AF JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2FE5 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x30F2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x3078 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x32F JUMPI DUP5 ISZERO PUSH2 0x2A7A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x320E JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3204 JUMPI JUMPDEST PUSH2 0x317D JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x31BA JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x3176 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x3171 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3231 PUSH2 0xD2B DUP4 DUP6 DUP10 PUSH2 0x28D8 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3331 JUMPI PUSH2 0x3243 DUP3 DUP6 DUP8 PUSH2 0x28D8 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3297 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x315C JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2F41 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x32E4 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x324A JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x32FB JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x32DB JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x350F JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3506 JUMPI JUMPDEST PUSH2 0x3442 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x34AB JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x33FA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x33F5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3664 JUMPI DUP3 PUSH2 0x35BD JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2CC0 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x363D JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3578 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3633 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x75A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x36EE DUP3 PUSH2 0x36A8 JUMP JUMPDEST SWAP2 PUSH2 0x36FC PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x25F6 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x384D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3852 JUMPI JUMPDEST PUSH2 0x384D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x37BC JUMPI JUMPDEST POP PUSH2 0x37B9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x382E JUMPI JUMPDEST POP CODESIZE PUSH2 0x37AF JUMP JUMPDEST PUSH2 0x3847 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB9 JUMPI PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST CODESIZE PUSH2 0x3827 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3778 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3990 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3998 JUMPI JUMPDEST PUSH2 0x3990 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x38EF JUMPI JUMPDEST POP PUSH2 0x38BE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3971 JUMPI JUMPDEST POP CODESIZE PUSH2 0x38B2 JUMP JUMPDEST PUSH2 0x398A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB9 JUMPI PUSH2 0xEAB DUP2 DUP4 PUSH2 0x25F6 JUMP JUMPDEST CODESIZE PUSH2 0x396A JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x38A3 JUMP JUMPDEST PUSH2 0x3A11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2394 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3AA1 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3A74 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3B1B JUMPI JUMPDEST DUP2 PUSH2 0x3ABA PUSH1 0x20 SWAP4 DUP4 PUSH2 0x25F6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x3B17 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3B14 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3A27 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3AAD JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 MSTORE PUSH2 0x8E56 0xD7 PUSH16 0x4FD0FD334C30E4D96C7048F507884A39 0xAD TLOAD DIV 0xBE 0xC1 SWAP16 SWAP16 RJUMP 0xDD64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"231:387:137:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;231:387:137;;1788:41:282;;;:::i;:::-;231:387:137;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;231:387:137;1845:10:192;;;;;;231:387:137;1857:3:192;1876:11;;;;;:::i;:::-;231:387:137;;;;;;;;;1898:10:192;;;;;:::i;:::-;231:387:137;1375:21:9;;;:30;1371:125;;231:387:137;1548:33:9;;;;;;;231:387:137;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;231:387:137;;1834:9:192;;1591:58:9;231:387:137;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;231:387:137;5957:19:9;231:387:137;;5957:19:9;231:387:137;;;;;1371:125:9;1455:21;;1428:57;231:387:137;1428:57:9;231:387:137;;;;;;1428:57:9;231:387:137;;;;1756:63:192;1793:26;231:387:137;1793:26:192;231:387:137;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;231:387:137;;-1:-1:-1;4538:25:42;231:387:137;;;;;;;;;;;;;:::i;:::-;;1788:41:282;;:::i;:::-;231:387:137;;;;;;;;;;3205:23:42;;;3201:60;;231:387:137;;;3275:25:42;;;;3271:146;;231:387:137;3271:146:42;231:387:137;;;;;;3361:45:42;231:387:137;;3361:45:42;231:387:137;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;231:387:137;1788:41:282;17093:5:280;1788:41:282;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;231:387:137;;;;;;;;17109:96:280;17145:49;231:387:137;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1788:41:282;;;:::i;:::-;231:387:137;;;;;4503:26:42;;;4499:64;;1283:19:278;231:387:137;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;231:387:137;-1:-1:-1;231:387:137;27576:12:280;231:387:137;;;;-1:-1:-1;231:387:137;27576:28:280;231:387:137;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1788:41:282;;:::i;:::-;5148:19:42;231:387:137;;;;;;;4503:26:42;;;4499:64;;4464:19:41;231:387:137;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;500:10:59;231:387:137;1880:140:41;;231:387:137;1880:140:41;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;231:387:137;;;;1973:36:41;;;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;231:387:137;2653:23:279;231:387:137;2653:23:279;231:387:137;2653:23:279;231:387:137;;;;;;;;;;;;;;;;;;;2602:87:279;;;;231:387:137;1021:95:279;231:387:137;;1021:95:279;231:387:137;1021:95:279;;231:387:137;;;;;1021:95:279;;231:387:137;1021:95:279;;;;231:387:137;;1021:95:279;;231:387:137;;1021:95:279;;231:387:137;;2602:87:279;;;231:387:137;2602:87:279;;:::i;:::-;231:387:137;2592:98:279;;2758:18;;:::i;:::-;231:387:137;;;2729:60:279;;;;1021:95;;;;;;;231:387:137;1021:95:279;;;231:387:137;1021:95:279;2729:60;;;;;;:::i;:::-;231:387:137;2719:71:279;;231:387:137;;;;;;1021:95:279;;;231:387:137;;;;1021:95:279;;231:387:137;;;;1021:95:279;;231:387:137;2821:24:279;;;231:387:137;2821:24:279;;;;;231:387:137;;2821:24:279;231:387:137;2863:15:279;2859:57;;2982:5;27705:19:280;231:387:137;2982:5:279;:::i;:::-;231:387:137;2859:57:279;2887:29;231:387:137;2887:29:279;231:387:137;;2887:29:279;2821:24;231:387:137;;;;;;;;;2470:67:279;2509:28;;231:387:137;2509:28:279;231:387:137;;;;2509:28:279;2400:60;2432:28;231:387:137;2432:28:279;231:387:137;;2432:28:279;231:387:137;;;;;;;:::i;:::-;5148:19:42;;;;;;231:387:137;;;1788:41:282;;:::i;:::-;231:387:137;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;231:387:137;3852:94:192;;231:387:137;3972:10:192;;;;;;231:387:137;3984:3:192;231:387:137;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;231:387:137;;;;4058:76:192;;4108:25;231:387:137;4058:76:192;;231:387:137;4058:76:192;;;;;;;;;;;;231:387:137;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;231:387:137;4239:12:192;;;;;;:::i;:::-;231:387:137;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;231:387:137;4239:70:192;;;;;;;231:387:137;;;;;;;4239:70:192;;;;;231:387:137;4239:70:192;;4277:4;231:387:137;4239:70:192;;231:387:137;;4058:76:192;231:387:137;;;;;;;4239:70:192;;;;;;;231:387:137;4239:70:192;;;3984:3;;231:387:137;3961:9:192;;4239:70;231:387:137;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;231:387:137;4161:50:192;231:387:137;;4058:76:192;231:387:137;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;231:387:137;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;231:387:137;1788:41:282;9818:5:280;1788:41:282;;;;;:::i;:::-;231:387:137;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;231:387:137;;;;;;;18723:98:280;18759:51;231:387:137;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;231:387:137:-;;;;;;;;;;;1036:5:242;231:387:137;;:::i;:::-;;;;;1788:41:282;;:::i;:::-;1036:5:242;;:::i;231:387:137:-;;;;;;;;;;;1788:15:242;231:387:137;;:::i;:::-;;;;;1788:41:282;;:::i;:::-;:15:242;;:::i;231:387:137:-;;;;;;;;;;;;;3091:13:277;231:387:137;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;231:387:137;-1:-1:-1;231:387:137;;;;;;-1:-1:-1;231:387:137;500:10:59;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1788:41:282;;:::i;:::-;231:387:137;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;500:10:59;231:387:137;3741:25:41;3737:66;;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;231:387:137;;;;2455:33:41;231:387:137;3737:66:41;231:387:137;3775:28:41;;;231:387:137;3775:28:41;231:387:137;;;;;;;3775:28:41;231:387:137;;;;875:6:243;231:387:137;;;:::i;:::-;27705:19:280;;;;231:387:137;1788:41:282;;:::i;:::-;875:6:243;;:::i;231:387:137:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;231:387:137;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;24144:5:280;231:387:137;;:::i;:::-;;;27705:19:280;231:387:137;1788:41:282;;:::i;:::-;231:387:137;;;;;;;24041:14:280;24037:85;;231:387:137;24144:5:280;;;:::i;24037:85::-;24105:5;;;;;:::i;:::-;24037:85;;;;231:387:137;;;;;;;:::i;:::-;5148:19:42;;;;231:387:137;;1788:41:282;;;:::i;:::-;231:387:137;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;231:387:137;2776:90:192;;231:387:137;2892:10:192;;;;;;231:387:137;2904:3:192;2923:9;;;;;:::i;:::-;231:387:137;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;231:387:137;;;1328:43:8;231:387:137;1328:43:8;;;;231:387:137;1328:43:8;;231:387:137;1328:43:8;;;231:387:137;1328:43:8;231:387:137;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;231:387:137;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;231:387:137;;2881:9:192;;8938:146:8;9033:40;231:387:137;9033:40:8;231:387:137;;1328:43:8;231:387:137;9033:40:8;8942:68;231:387:137;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;231:387:137;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;231:387:137;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;231:387:137;1788:41:282;;:::i;:::-;1488:12:247;;:::i;:::-;231:387:137;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;231:387:137:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;231:387:137;;;;;;:::i;:::-;27705:19:280;;;231:387:137;1788:41:282;;:::i;:::-;1170:6:243;;:::i;231:387:137:-;;;;;;;;;;;765:5:244;231:387:137;;;1788:41:282;;:::i;:::-;765:5:244;;:::i;231:387:137:-;;;;;;;;;;;;;:::i;:::-;;;1129:12:247;231:387:137;1788:41:282;;:::i;1129:12:247:-;231:387:137;;;;19546:16:280;;;19542:53;;19609:10;19605:370;;231:387:137;;19989:31:280;231:387:137;;;;;;;;19989:31:280;231:387:137;19605:370:280;19652:8;231:387:137;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;231:387:137;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;231:387:137;19786:39:280;231:387:137;;;;;;19786:39:280;19542:53;19571:24;231:387:137;19571:24:280;231:387:137;;19571:24:280;231:387:137;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;1788:41:282;;:::i;:::-;231:387:137;;;;5455:21:280;;;5451:67;;231:387:137;;;-1:-1:-1;231:387:137;5555:12:280;231:387:137;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;5597:10:280;;5593:366;;231:387:137;;;5973:42:280;231:387:137;;;;;;;;;5973:42:280;;231:387:137;;;;;;;5593:366:280;231:387:137;;;5720:32:280;;;;;5716:108;;5842:19;;;231:387:137;;5973:42:280;5842:19;231:387:137;;;-1:-1:-1;231:387:137;5555:12:280;231:387:137;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;5593:366:280;;;;5716:108;231:387:137;;5761:63:280;;;231:387:137;;;;;5761:63:280;;231:387:137;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;231:387:137;5485:33:280;;231:387:137;5485:33:280;231:387:137;;;;;5485:33:280;231:387:137;;;;;;;;;;;;1284:37:248;;:::i;:::-;231:387:137;;;;;;;;;;;;;;;;;;2023:39:282;;:::i;:::-;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3732:15:277;231:387:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1788:41:282;;:::i;:::-;5148:19:42;231:387:137;;;;;;;4503:26:42;;;4499:64;;4464:19:41;231:387:137;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;500:10:59;231:387:137;1254:25:41;1250:140;;231:387:137;1250:140:41;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;231:387:137;;;;1343:36:41;231:387:137;;;;;;;;;;;;;;;;941:19:75;231:387:137;;;;;;;;;;;;;;;9818:5:280;231:387:137;;:::i;:::-;;;:::i;:::-;;1788:41:282;;;:::i;:::-;231:387:137;;;;;;;;;;;9707:14:280;9703:85;;231:387:137;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;231:387:137;;;;1232:6:244;231:387:137;;;:::i;:::-;27705:19:280;;;;231:387:137;1788:41:282;;:::i;:::-;1232:6:244;;:::i;231:387:137:-;;;;;;;;;;;;26654:8:280;231:387:137;;;;;;;;;;;;;;;;;;826:5:242;231:387:137;;:::i;:::-;;;;;1788:41:282;;:::i;:::-;826:5:242;;:::i;231:387:137:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;231:387:137;635:65:55;;:::i;231:387:137:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;231:387:137;1146:19:75;231:387:137;1146:53:75;;;1142:96;;231:387:137;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;231:387:137;1215:12:75;:::o;231:387:137:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;231:387:137;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;231:387:137;500:10:59;231:387:137;500:10:59;;231:387:137;500:10:59;231:387:137;500:10:59;;231:387:137;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;231:387:137;1528:12:59;:::o;231:387:137:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;231:387:137;;4533:21:280;;;4529:67;;231:387:137;4657:31:280;4606:19;:12;231:387:137;4606:19:280;231:387:137;;;-1:-1:-1;231:387:137;4606:12:280;231:387:137;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;231:387:137;4563:33:280;;4552:1;4563:33;231:387:137;4563:33:280;231:387:137;;4552:1:280;4563:33;231:387:137;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;25152:1242:280:-;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;231:387:137;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;;:::i;:::-;25558;;;;;:::i;:::-;231:387:137;;;;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;231:387:137;;;26163:33:280;231:387:137;25409:1:280;231:387:137;;;;;;26163:33:280;231:387:137;25462:9:280;;25689:455;25741:16;231:387:137;-1:-1:-1;231:387:137;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;231:387:137;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;231:387:137;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;4317:545:279:-;231:387:137;;;:::i;:::-;;;;;;4669:54:279;231:387:137;;;4520:321:279;;231:387:137;4552:95:279;231:387:137;;;;;;4745:14:279;231:387:137;;;;4412:53:279;231:387:137;;;;4818:4:279;231:387:137;;;;;4520:321:279;;;;;;:::i;:::-;231:387:137;4493:362:279;;4317:545;:::o;3640:170:41:-;231:387:137;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;500:10:59;231:387:137;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;231:387:137;3775:28:41;;-1:-1:-1;3775:28:41;231:387:137;3775:28:41;231:387:137;;;;;-1:-1:-1;3775:28:41;22659:524:280;22743:10;22739:389;;22659:524;231:387:137;;23143:33:280;231:387:137;;22752:1:280;231:387:137;;;;;;;23143:33:280;;22659:524::o;22739:389::-;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;231:387:137;;;22752:1:280;231:387:137;;;;;;;;;;;23044:8:280;;231:387:137;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;231:387:137;22933:46:280;;22752:1;22933:46;231:387:137;22933:46:280;231:387:137;;;;;;22752:1:280;22933:46;13849:1950;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;231:387:137;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;231:387:137;14325:13:280;;;;;;:::i;:::-;231:387:137;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;231:387:137;14472:10:280;14468:656;;14293:3;231:387:137;;;15143:25:280;231:387:137;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;231:387:137;;14270:9:280;;15183:500;231:387:137;;;15437:21:280;;;;;15433:85;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;231:387:137;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;231:387:137;;;;14602:27:280;;;;14598:74;;231:387:137;;;;;14746:10:280;;;;;14784:14;;231:387:137;;14784:14:280;;-1:-1:-1;231:387:137;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;231:387:137;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;231:387:137;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;231:387:137;14381:32:280;;14132:1;14381:32;231:387:137;14381:32:280;231:387:137;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;231:387:137:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;231:387:137;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;231:387:137;;;;;;21949:19:280;;;;;21945:76;;231:387:137;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;231:387:137;;;;-1:-1:-1;21977:44:280;21174:3;231:387:137;21206:13:280;;;;:::i;:::-;231:387:137;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;231:387:137;21344:10:280;21340:372;;21174:3;231:387:137;-1:-1:-1;21730:31:280;231:387:137;;;;;;;;;21730:31:280;231:387:137;21151:9:280;;21340:372;231:387:137;;;;;;21474:27:280;;;;21470:70;;231:387:137;;;-1:-1:-1;231:387:137;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;231:387:137;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;231:387:137;;;12409:21:280;;;;;12405:85;;12508:16;;231:387:137;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;;;;12171:472:280;;;;;;;12405:85;231:387:137;12439:51:280;;11116:1;12439:51;231:387:137;12439:51:280;231:387:137;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;231:387:137;11309:13:280;;;;;;:::i;:::-;231:387:137;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;231:387:137;11455:10:280;11451:656;;11277:3;231:387:137;;;;;;;;;12125:25:280;231:387:137;;;;12125:25:280;;231:387:137;11254:9:280;;11451:656;231:387:137;;;;11585:27:280;;;;11581:74;;231:387:137;;;;11729:10:280;;;;;11767:14;;231:387:137;11767:14:280;;231:387:137;-1:-1:-1;231:387:137;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;231:387:137;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;231:387:137;;;;;;11116:1:280;11873:46;11336:61;231:387:137;11365:32:280;;11116:1;11365:32;231:387:137;11365:32:280;231:387:137;;11116:1:280;11365:32;6693:851;;;;231:387:137;;;6808:21:280;;;6804:67;;6908:12;;:19;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;231:387:137;;;;;;7495:42:280;231:387:137;;;;;;;7495:42:280;;6693:851::o;6947:534::-;231:387:137;;;7238:32:280;;;;;7234:112;;7364:19;;;231:387:137;7495:42:280;7364:19;231:387:137;7364:19:280;231:387:137;;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;6947:534:280;;;7234:112;231:387:137;;7279:67:280;;;231:387:137;;;;7279:67:280;;;231:387:137;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;231:387:137;6838:33:280;;6827:1;6838:33;231:387:137;6838:33:280;231:387:137;;6827:1:280;6838:33;8105:628;;;231:387:137;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;231:387:137;;;8701:25:280;231:387:137;;;;;;;8701:25:280;;8105:628::o;8273:413::-;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;;;8437:21:280;;;;;8433:80;;231:387:137;;;;;;;;8701:25:280;231:387:137;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;231:387:137;;;-1:-1:-1;231:387:137;;;;;-1:-1:-1;231:387:137;;;-1:-1:-1;231:387:137;;;;-1:-1:-1;231:387:137;;;;;;;8531:131:280;;;;8201:61;231:387:137;8230:32:280;;8219:1;8230:32;231:387:137;8230:32:280;231:387:137;;8219:1:280;8230:32;231:387:137;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;231:387:137;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;231:387:137;1029:19:76;231:387:137;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;231:387:137;;;1676:74:76;;231:387:137;;;1676:74:76;;;231:387:137;1327:10:76;231:387:137;;;;1744:4:76;231:387:137;;;;;-1:-1:-1;1676:74:76;;231:387:137;;;;;;1676:74:76;;;;;;;231:387:137;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;231:387:137;2065:19:76;231:387:137;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;231:387:137;720:8:80;231:387:137;720:8:80;;231:387:137;;;;2115:1:76;2802:32;;:::o;2624:153::-;231:387:137;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;231:387:137;2361:10:76;231:387:137;;;;2771:4:76;231:387:137;;;;;-1:-1:-1;2682:95:76;;231:387:137;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;28229:252:280;231:387:137;;28229:252:280;;;;231:387:137;28229:252:280;231:387:137;;;;;28357:61:280;;;;;231:387:137;28357:61:280;;231:387:137;28357:61:280;;;231:387:137;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;231:387:137;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;231:387:137;;-1:-1:-1;28445:29:280;28357:61;231:387:137;28357:61:280;;231:387:137;28357:61:280;;;;;;231:387:137;28357:61:280;;;:::i;:::-;;;231:387:137;;;;;;;;;;;;;28357:61:280;231:387:137;28357:61:280;;231:387:137;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"3038600","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","MINTER_ROLE()":"848","__msgData()":"infinite","allowance(address,address)":"3255","approve(address,uint256)":"infinite","balanceOf(address)":"2773","batchBurnFrom(address[],uint256[])":"infinite","batchMint(address[],uint256[])":"infinite","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","decimals()":"2429","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"3005","increaseAllowance(address,uint256)":"infinite","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","name()":"infinite","nonces(address)":"2839","owner()":"2781","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address[],uint256[])":"1b9a7529","batchMint(address[],uint256[])":"68573107","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","increaseAllowance(address,uint256)":"39509351","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol\":\"ERC20MintBurnMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/preset/ERC20MintBurnMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MintBurn} from \\\"./../../../../token/ERC20/preset/ERC20MintBurn.sol\\\";\\n\\ncontract ERC20MintBurnMock is ERC20MintBurn {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20MintBurn(tokenName, tokenSymbol, tokenDecimals, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0ac0d2903d496a4e84f1223ae38b9bbbe35371c288a57d99a69583f3912c8939\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./base/ERC20BurnableBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Burnable is ERC20BurnableBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    constructor() {\\n        ERC20Storage.initERC20Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xc0155d693e6d3884f65f53877fb50d0678e7113f494cb71989def75115009e73\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20MintableBase} from \\\"./base/ERC20MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Mintable is ERC20MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    constructor() {\\n        ERC20Storage.initERC20Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x41ab17a82891d788d675cf9f92a26eada93fc2cab87469098030c409527f3875\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/ERC20MintBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20} from \\\"./../ERC20.sol\\\";\\nimport {ERC20Detailed} from \\\"./../ERC20Detailed.sol\\\";\\nimport {ERC20Metadata} from \\\"./../ERC20Metadata.sol\\\";\\nimport {ERC20Permit} from \\\"./../ERC20Permit.sol\\\";\\nimport {ERC20SafeTransfers} from \\\"./../ERC20SafeTransfers.sol\\\";\\nimport {ERC20BatchTransfers} from \\\"./../ERC20BatchTransfers.sol\\\";\\nimport {ERC20Mintable} from \\\"./../ERC20Mintable.sol\\\";\\nimport {ERC20Burnable} from \\\"./../ERC20Burnable.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version).\\ncontract ERC20MintBurn is\\n    ERC20,\\n    ERC20Detailed,\\n    ERC20Metadata,\\n    ERC20Permit,\\n    ERC20SafeTransfers,\\n    ERC20BatchTransfers,\\n    ERC20Mintable,\\n    ERC20Burnable,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc77047ab10062df1f0da1b0a09be6160b61b78faacd9e0ae9d899eaa59deb812\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol":{"ERC20FixedSupplyProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f6138bb38819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f57608052604051613820908161009b82396080518181816120a2015281816125490152818161340f015261353a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146122a857806306fdde031461224d578063095ea7b3146121e057806318160ddd1461218557806323b872dd146120c65780632b4c9f1614612057578063313ce56714611ff957806331e66e1e14611f765780633644e51514611f355780633950935114611d055780633c130d9014611caa5780634885b25414611bfc578063572b6c0514611bb157806370a0823114611b2c57806373c8a958146119a95780637ecebe001461192457806388d695b2146118e05780638a6d57b614610f545780638da5cb5b14610ee357806395d89b4114610e70578063a457c2d714610e03578063a9059cbb14610d96578063b88d4fde14610c86578063c3666c3614610a49578063d505accf146107d6578063dd62ed3e14610727578063e0df5b6f146104dc578063eb79554914610417578063f2fde38b146103235763f7ba94bd1461016657600080fd5b346102c75761017436612498565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101b56133f8565b92541691169081036102f657508181036102cc5760005b8181106101d557005b6101e08183876128f5565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102c75761020a8285876128f5565b359081471061029557600080809381935af13d1561028d573d9061022d8261336f565b9161023b6040519384612591565b82523d6000602084013e5b1561025457506001016101cc565b80511561026357602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610246565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761035a61238e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103846133f8565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036102f6575073ffffffffffffffffffffffffffffffffffffffff16918282036103c857005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761044e61238e565b60243560443567ffffffffffffffff81116102c757610471903690600401612504565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926104aa83836104a36133f8565b80976131ce565b813b6104bc575b602060405160018152f35b6104d2946104cb9136916133a9565b9280613669565b80808080806104b1565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760043567ffffffffffffffff81116102c75761052b903690600401612504565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061056a6133f8565b92541691169081036102f657507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106f8576105b28254612674565b601f81116106b0575b506000601f82116001146106155781929360009261060a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105d4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106985750836001959610610660575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610656565b90926020600181928686013581550194019101610643565b826000526020600020601f830160051c810191602084106106ee575b601f0160051c01905b8181106106e257506105bb565b600081556001016106d5565b90915081906106cc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761075e61238e565b73ffffffffffffffffffffffffffffffffffffffff61077b6123b1565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102c75760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761080d61238e565b6108156123b1565b6044359060643560843560ff81168091036102c75773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a1f578142116109f1576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108f760e082612591565b51902061090261284e565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610947606282612591565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109e55773ffffffffffffffffffffffffffffffffffffffff60005116036109bb576109b9927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612789565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102c757610a5736612405565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a9c6133f8565b92541691169081036102f65750808214801590610c7c575b6102cc5760005b828110610ac457005b73ffffffffffffffffffffffffffffffffffffffff610aec610ae783858a6128f5565b612934565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109e557600091610c4e575b5015610c21575073ffffffffffffffffffffffffffffffffffffffff610b7b610ae783858a6128f5565b1690610b8b610ae78286896128f5565b91610b9782878b6128f5565b3592813b156102c757606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109e557600192610c10575b5001610abb565b6000610c1b91612591565b88610c09565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c6f915060203d8111610c75575b610c678183612591565b8101906133e0565b89610b51565b503d610c5d565b5082821415610ab4565b346102c75760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610cbd61238e565b610cc56123b1565b60443560643567ffffffffffffffff81116102c757610ce8903690600401612504565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d54848484610d1b6133f8565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d85576131ce565b823b610d6557602060405160018152f35b610d7a95610d749136916133a9565b93613669565b8080808080806104b1565b610d91848b8484612ff0565b6131ce565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b1610dd061238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610dfd6133f8565b906131ce565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b1610e3d61238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e6a6133f8565b90612ff0565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826126c7565b60405191829160208352602083019061232f565b0390f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102c75760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760043567ffffffffffffffff81116102c757610fa3903690600401612504565b9060243567ffffffffffffffff81116102c757610fc4903690600401612504565b90926044359060ff82168092036102c75760643567ffffffffffffffff81116102c757610ff59036906004016123d4565b92909360843567ffffffffffffffff81116102c7576110189036906004016123d4565b9790967fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6110446133f8565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015611859575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161188b575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f53f41a97000000000000000000000000000000000000000000000000000000006000527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a98054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491967f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015611859575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116106f85781906112818454612674565b601f8111611806575b50600090601f831160011461176457600092611759575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff82116106f857819061130e7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612674565b601f81116116ca575b50600090601f83116001146115cb576000926115c0575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90611513816125d2565b926115216040519485612591565b818452602084019160051b8101903682116102c757915b8183106115935750505061154b846125d2565b926115596040519485612591565b848452602084019460051b8101903682116102c757945b8186106115835750506109b99350612e76565b8535815260209586019501611570565b823573ffffffffffffffffffffffffffffffffffffffff811681036102c757815260209283019201611538565b01359050888061132e565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8282527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef929091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016815b8181106116b2575090846001959493921061167a575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8255611380565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905588808061164d565b91936020600181928787013581550195019201611637565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000529091507f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f840160051c8101916020851061174f575b90601f859493920160051c01905b8181106117405750611317565b60008155849350600101611733565b9091508190611725565b013590508b806112a1565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106117ee57509084600195949392106117b6575b505050811b0190556112d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558b80806117a9565b91936020600181928787013581550195019201611793565b909150836000526020600020601f840160051c8101916020851061184f575b90601f859493920160051c01905b818110611840575061128a565b60008155849350600101611833565b9091508190611825565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a389806110b1565b346102c7576104b16118f136612498565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61191e6133f8565b90612c01565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761195b61238e565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102c7576119b736612405565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119fa6133f8565b92541691169081036102f65750808314801590611b22575b6102cc5760005b838110611a2257005b611a2d8183886128f5565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102c75760006020918a82611a6e87611a67610ae7828f8f906128f5565b938b6128f5565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611ac9606482612591565b51925af1156109e5576000513d611b195750803b155b611aec5750600101611a19565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611adf565b5085831415611a12565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611b6361238e565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576020611bf2611bed61238e565b612532565b6040519015158152f35b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611c3361238e565b60243567ffffffffffffffff81116102c757611c539036906004016123d4565b916044359267ffffffffffffffff84116102c757611c786104b19436906004016123d4565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ca46133f8565b90612955565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6126c7565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611d3c61238e565b602435611d476133f8565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611ef15773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611e0c575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611e9657505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611dbd565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576020611f6e61284e565b604051908152f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576040611faf613523565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b161210061238e565b6121086123b1565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916121326133f8565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612173575b50506131ce565b61217e918484612ff0565b858461216c565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b161221a61238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6122476133f8565b90612789565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c7565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102c757611bf26020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6125ea565b919082519283825260005b8481106123795750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161233a565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102c757565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102c757565b9181601f840112156102c75782359167ffffffffffffffff83116102c7576020808501948460051b0101116102c757565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c75760043567ffffffffffffffff81116102c7578161244e916004016123d4565b9290929160243567ffffffffffffffff81116102c75781612471916004016123d4565b929092916044359067ffffffffffffffff82116102c757612494916004016123d4565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c75760043567ffffffffffffffff81116102c757816124e1916004016123d4565b929092916024359067ffffffffffffffff82116102c757612494916004016123d4565b9181601f840112156102c75782359167ffffffffffffffff83116102c757602083818601950101116102c757565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561258a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106f857604052565b67ffffffffffffffff81116106f85760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461258a577f01ffc9a700000000000000000000000000000000000000000000000000000000811461266d5760005260205260ff6040600020541690565b5050600190565b90600182811c921680156126bd575b602083101461268e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612683565b90604051918260008254926126db84612674565b80845293600181169081156127495750600114612702575b5061270092500383612591565b565b90506000929192526020600020906000915b81831061272d57505090602061270092820101386126f3565b6020919350806001915483858901015201910190918492612714565b602093506127009592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386126f3565b929173ffffffffffffffffffffffffffffffffffffffff1692831561280a5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6128777f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c7565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526128ef60c082612591565b51902090565b91908110156129055760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102c75790565b959490939291928581036102cc578015612bf85773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106129f1575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036129df575b50505050565b6129e893612ff0565b388080806129d9565b73ffffffffffffffffffffffffffffffffffffffff612a14610ae783858b6128f5565b168015612bb457612a268285876128f5565b3580612af0575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612ae6575b612a8a575b50600101612997565b8a87039087821015612ab057600090815260208d90526040902090860190556001612a81565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612a7c565b9a8b810190811115612b8a579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612b3c5750906040602093926000908482528552208181540190555b909150612a2d565b90508882989211612b54575090866020920196612b34565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102cc578415612e5a5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110612cf357505050505080151580612ce9575b612c62575b5050505050565b8085039480861015612c9f57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612c5b565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612c56565b73ffffffffffffffffffffffffffffffffffffffff612d16610ae78385896128f5565b168015612e1657612d288285876128f5565b3580612d7c575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612c41565b9687810190811115612b8a579673ffffffffffffffffffffffffffffffffffffffff8916828114612dc957509060019291604060008381528c602052208181540190555b90919250612d2f565b8c829c9211612de05750908a60019392019a612dc0565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b80518210156129055760209160051b010190565b9091825190805182036102cc5781156129d95760009360005b838110612eea575050505081612ea3575050565b6002018054918083019280841115612eba57505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612f098284612e62565b51168015612fc657612f1b8285612e62565b5180612f59575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612e8f565b96919087830192831115612f9c5773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612f22565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b92909173ffffffffffffffffffffffffffffffffffffffff811693841561318a576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613181575b6130bd575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156131265750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613075565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613070565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561332b5782613238575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156132df57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036132b8575b50509250506131f3565b838316600052818552604060002055866000528352604060002085815401905538806132ae565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106f857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926133b58261336f565b916133c36040519384612591565b8294818452818301116102c7578281602093846000960137010152565b908160209103126102c7575180151581036102c75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613514573233148015613519575b613514577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613483575b5061348057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109e5576000916134f5575b5038613476565b61350e915060203d602011610c7557610c678183612591565b386134ee565b503390565b506018361061343f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561365757323314801561365f575b613657578033149081156135b6575b50613585576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102c75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109e557600091613638575b5038613579565b613651915060203d602011610c7557610c678183612591565b38613631565b506000903690565b506018361061356a565b6136d873ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc35859000000000000000000000000000000000000000000000000000000008852166004870152166024850152604484015260806064840152608483019061232f565b03816000865af19081156109e557600091613768575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361373b5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116137e2575b8161378160209383612591565b810103126137de5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036137db57507fffffffff000000000000000000000000000000000000000000000000000000006136ee565b80fd5b5080fd5b3d915061377456fea2646970667358221220deff7f5b3490b724cb0b1e031559e0a3dc3e11bbf1f14c1cb6cb026e6215210264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x38BB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3820 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x20A2 ADD MSTORE DUP2 DUP2 PUSH2 0x2549 ADD MSTORE DUP2 DUP2 PUSH2 0x340F ADD MSTORE PUSH2 0x353A ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x22A8 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x224D JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x21E0 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2185 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x20C6 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2057 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FF9 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1F76 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1F35 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1D05 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1CAA JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1BFC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BB1 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B2C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A9 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1924 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x18E0 JUMPI DUP1 PUSH4 0x8A6D57B6 EQ PUSH2 0xF54 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xEE3 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE70 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xE03 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD96 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC86 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA49 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7D6 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x727 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x417 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x323 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x166 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x174 CALLDATASIZE PUSH2 0x2498 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1B5 PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1D5 JUMPI STOP JUMPDEST PUSH2 0x1E0 DUP2 DUP4 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2C7 JUMPI PUSH2 0x20A DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x28D JUMPI RETURNDATASIZE SWAP1 PUSH2 0x22D DUP3 PUSH2 0x336F JUMP JUMPDEST SWAP2 PUSH2 0x23B PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2591 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x254 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1CC JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x263 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x246 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x35A PUSH2 0x238E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x384 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x2F6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3C8 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x44E PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x471 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x4AA DUP4 DUP4 PUSH2 0x4A3 PUSH2 0x33F8 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x31CE JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4BC JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4D2 SWAP5 PUSH2 0x4CB SWAP2 CALLDATASIZE SWAP2 PUSH2 0x33A9 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x3669 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4B1 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x52B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x56A PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH2 0x5B2 DUP3 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6B0 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x615 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x60A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5D4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x698 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x660 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x656 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x643 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6EE JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6E2 JUMPI POP PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6D5 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6CC JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x75E PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x77B PUSH2 0x23B1 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x80D PUSH2 0x238E JUMP JUMPDEST PUSH2 0x815 PUSH2 0x23B1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2C7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA1F JUMPI DUP2 TIMESTAMP GT PUSH2 0x9F1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8F7 PUSH1 0xE0 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x902 PUSH2 0x284E JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x947 PUSH1 0x62 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9E5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9BB JUMPI PUSH2 0x9B9 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2789 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0xA57 CALLDATASIZE PUSH2 0x2405 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA9C PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC7C JUMPI JUMPDEST PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAC4 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAEC PUSH2 0xAE7 DUP4 DUP6 DUP11 PUSH2 0x28F5 JUMP JUMPDEST PUSH2 0x2934 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC4E JUMPI JUMPDEST POP ISZERO PUSH2 0xC21 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB7B PUSH2 0xAE7 DUP4 DUP6 DUP11 PUSH2 0x28F5 JUMP JUMPDEST AND SWAP1 PUSH2 0xB8B PUSH2 0xAE7 DUP3 DUP7 DUP10 PUSH2 0x28F5 JUMP JUMPDEST SWAP2 PUSH2 0xB97 DUP3 DUP8 DUP12 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC10 JUMPI JUMPDEST POP ADD PUSH2 0xABB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC1B SWAP2 PUSH2 0x2591 JUMP JUMPDEST DUP9 PUSH2 0xC09 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC6F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC75 JUMPI JUMPDEST PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x33E0 JUMP JUMPDEST DUP10 PUSH2 0xB51 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC5D JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAB4 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xCBD PUSH2 0x238E JUMP JUMPDEST PUSH2 0xCC5 PUSH2 0x23B1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xCE8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD54 DUP5 DUP5 DUP5 PUSH2 0xD1B PUSH2 0x33F8 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD85 JUMPI PUSH2 0x31CE JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD65 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD7A SWAP6 PUSH2 0xD74 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x33A9 JUMP JUMPDEST SWAP4 PUSH2 0x3669 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4B1 JUMP JUMPDEST PUSH2 0xD91 DUP5 DUP12 DUP5 DUP5 PUSH2 0x2FF0 JUMP JUMPDEST PUSH2 0x31CE JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0xDD0 PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDFD PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x31CE JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0xE3D PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE6A PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2FF0 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x26C7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x232F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFA3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFC4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x2C7 JUMPI PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFF5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x1018 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x1044 PUSH2 0x33F8 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1859 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x188B JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP7 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0x1859 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6F8 JUMPI DUP2 SWAP1 PUSH2 0x1281 DUP5 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x1806 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1764 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x1759 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6F8 JUMPI DUP2 SWAP1 PUSH2 0x130E PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x16CA JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x15CB JUMPI PUSH1 0x0 SWAP3 PUSH2 0x15C0 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1513 DUP2 PUSH2 0x25D2 JUMP JUMPDEST SWAP3 PUSH2 0x1521 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2591 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1593 JUMPI POP POP POP PUSH2 0x154B DUP5 PUSH2 0x25D2 JUMP JUMPDEST SWAP3 PUSH2 0x1559 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2591 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1583 JUMPI POP POP PUSH2 0x9B9 SWAP4 POP PUSH2 0x2E76 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1570 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1538 JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP9 DUP1 PUSH2 0x132E JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP3 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x16B2 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x167A JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x1380 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP9 DUP1 DUP1 PUSH2 0x164D JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1637 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x174F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1740 JUMPI POP PUSH2 0x1317 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1733 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1725 JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP12 DUP1 PUSH2 0x12A1 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x17EE JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x17B6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x12D3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x17A9 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1793 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x184F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1840 JUMPI POP PUSH2 0x128A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1833 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1825 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP10 DUP1 PUSH2 0x10B1 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x18F1 CALLDATASIZE PUSH2 0x2498 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x191E PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2C01 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x195B PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x19B7 CALLDATASIZE PUSH2 0x2405 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19FA PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B22 JUMPI JUMPDEST PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1A22 JUMPI STOP JUMPDEST PUSH2 0x1A2D DUP2 DUP4 DUP9 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1A6E DUP8 PUSH2 0x1A67 PUSH2 0xAE7 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x28F5 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1AC9 PUSH1 0x64 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B19 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1AEC JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A19 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1ADF JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1A12 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1B63 PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH2 0x1BF2 PUSH2 0x1BED PUSH2 0x238E JUMP JUMPDEST PUSH2 0x2532 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1C33 PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x1C53 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2C7 JUMPI PUSH2 0x1C78 PUSH2 0x4B1 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1CA4 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2955 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x26C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1D3C PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1D47 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1EF1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1E0C JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1E96 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1DBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH2 0x1F6E PUSH2 0x284E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH2 0x1FAF PUSH2 0x3523 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x2100 PUSH2 0x238E JUMP JUMPDEST PUSH2 0x2108 PUSH2 0x23B1 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2132 PUSH2 0x33F8 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2173 JUMPI JUMPDEST POP POP PUSH2 0x31CE JUMP JUMPDEST PUSH2 0x217E SWAP2 DUP5 DUP5 PUSH2 0x2FF0 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x216C JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x221A PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2247 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2789 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI PUSH2 0x1BF2 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x25EA JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2379 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x233A JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2C7 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2C7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x244E SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x2471 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C7 JUMPI PUSH2 0x2494 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x24E1 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C7 JUMPI PUSH2 0x2494 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2C7 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x258A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6F8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x258A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x266D JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x26BD JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x268E JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2683 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x26DB DUP5 PUSH2 0x2674 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2749 JUMPI POP PUSH1 0x1 EQ PUSH2 0x2702 JUMPI JUMPDEST POP PUSH2 0x2700 SWAP3 POP SUB DUP4 PUSH2 0x2591 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x272D JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2700 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x26F3 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2714 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2700 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x26F3 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x280A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2877 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C7 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x28EF PUSH1 0xC0 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2905 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2CC JUMPI DUP1 ISZERO PUSH2 0x2BF8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x29F1 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29DF JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x29E8 SWAP4 PUSH2 0x2FF0 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x29D9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2A14 PUSH2 0xAE7 DUP4 DUP6 DUP12 PUSH2 0x28F5 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2BB4 JUMPI PUSH2 0x2A26 DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2AF0 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2AE6 JUMPI JUMPDEST PUSH2 0x2A8A JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2997 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2AB0 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2A81 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2A7C JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2B8A JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2B3C JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2A2D JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2B54 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2B34 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2CC JUMPI DUP5 ISZERO PUSH2 0x2E5A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CF3 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x2CE9 JUMPI JUMPDEST PUSH2 0x2C62 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2C9F JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2C5B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2C56 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D16 PUSH2 0xAE7 DUP4 DUP6 DUP10 PUSH2 0x28F5 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2E16 JUMPI PUSH2 0x2D28 DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2D7C JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2B8A JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x2DC9 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2D2F JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2DE0 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2DC0 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2905 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x2CC JUMPI DUP2 ISZERO PUSH2 0x29D9 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2EEA JUMPI POP POP POP POP DUP2 PUSH2 0x2EA3 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2EBA JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2F09 DUP3 DUP5 PUSH2 0x2E62 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x2FC6 JUMPI PUSH2 0x2F1B DUP3 DUP6 PUSH2 0x2E62 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x2F59 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2E8F JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x2F9C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2F22 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x318A JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3181 JUMPI JUMPDEST PUSH2 0x30BD JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3126 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3075 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3070 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x332B JUMPI DUP3 PUSH2 0x3238 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x32DF JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x32B8 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x31F3 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x32AE JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x33B5 DUP3 PUSH2 0x336F JUMP JUMPDEST SWAP2 PUSH2 0x33C3 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2591 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2C7 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2C7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2C7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3514 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3519 JUMPI JUMPDEST PUSH2 0x3514 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3483 JUMPI JUMPDEST POP PUSH2 0x3480 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x34F5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3476 JUMP JUMPDEST PUSH2 0x350E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC75 JUMPI PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST CODESIZE PUSH2 0x34EE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x343F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3657 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x365F JUMPI JUMPDEST PUSH2 0x3657 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35B6 JUMPI JUMPDEST POP PUSH2 0x3585 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3638 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3579 JUMP JUMPDEST PUSH2 0x3651 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC75 JUMPI PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST CODESIZE PUSH2 0x3631 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x356A JUMP JUMPDEST PUSH2 0x36D8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x232F JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3768 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x373B JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x37E2 JUMPI JUMPDEST DUP2 PUSH2 0x3781 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2591 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x37DE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x37DB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x36EE JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3774 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE SELFDESTRUCT PUSH32 0x5B3490B724CB0B1E031559E0A3DC3E11BBF1F14C1CB6CB026E6215210264736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"265:267:138:-:0;;;;;;;;;;;;;-1:-1:-1;;265:267:138;;;;-1:-1:-1;;;;;265:267:138;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;265:267:138;;;;;;745:39:76;;265:267:138;;;;;;;;745:39:76;265:267:138;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;265:267:138;;;;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":9137,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":9172,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9221,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9368,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":13225,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13280,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":9476,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":9102,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_string":{"entryPoint":9007,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":9682,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13167,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":10485,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":9927,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":9844,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":9617,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":10318,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":10121,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchMint":{"entryPoint":11894,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":11265,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":10581,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":13929,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":12272,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":9522,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":13603,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":13304,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":9706,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transfer":{"entryPoint":12750,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":11874,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":10548,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8354},{"length":32,"start":9545},{"length":32,"start":13327},{"length":32,"start":13626}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146122a857806306fdde031461224d578063095ea7b3146121e057806318160ddd1461218557806323b872dd146120c65780632b4c9f1614612057578063313ce56714611ff957806331e66e1e14611f765780633644e51514611f355780633950935114611d055780633c130d9014611caa5780634885b25414611bfc578063572b6c0514611bb157806370a0823114611b2c57806373c8a958146119a95780637ecebe001461192457806388d695b2146118e05780638a6d57b614610f545780638da5cb5b14610ee357806395d89b4114610e70578063a457c2d714610e03578063a9059cbb14610d96578063b88d4fde14610c86578063c3666c3614610a49578063d505accf146107d6578063dd62ed3e14610727578063e0df5b6f146104dc578063eb79554914610417578063f2fde38b146103235763f7ba94bd1461016657600080fd5b346102c75761017436612498565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101b56133f8565b92541691169081036102f657508181036102cc5760005b8181106101d557005b6101e08183876128f5565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102c75761020a8285876128f5565b359081471061029557600080809381935af13d1561028d573d9061022d8261336f565b9161023b6040519384612591565b82523d6000602084013e5b1561025457506001016101cc565b80511561026357602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610246565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761035a61238e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103846133f8565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036102f6575073ffffffffffffffffffffffffffffffffffffffff16918282036103c857005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761044e61238e565b60243560443567ffffffffffffffff81116102c757610471903690600401612504565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926104aa83836104a36133f8565b80976131ce565b813b6104bc575b602060405160018152f35b6104d2946104cb9136916133a9565b9280613669565b80808080806104b1565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760043567ffffffffffffffff81116102c75761052b903690600401612504565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061056a6133f8565b92541691169081036102f657507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106f8576105b28254612674565b601f81116106b0575b506000601f82116001146106155781929360009261060a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105d4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106985750836001959610610660575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610656565b90926020600181928686013581550194019101610643565b826000526020600020601f830160051c810191602084106106ee575b601f0160051c01905b8181106106e257506105bb565b600081556001016106d5565b90915081906106cc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761075e61238e565b73ffffffffffffffffffffffffffffffffffffffff61077b6123b1565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102c75760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761080d61238e565b6108156123b1565b6044359060643560843560ff81168091036102c75773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a1f578142116109f1576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108f760e082612591565b51902061090261284e565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610947606282612591565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109e55773ffffffffffffffffffffffffffffffffffffffff60005116036109bb576109b9927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612789565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102c757610a5736612405565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a9c6133f8565b92541691169081036102f65750808214801590610c7c575b6102cc5760005b828110610ac457005b73ffffffffffffffffffffffffffffffffffffffff610aec610ae783858a6128f5565b612934565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109e557600091610c4e575b5015610c21575073ffffffffffffffffffffffffffffffffffffffff610b7b610ae783858a6128f5565b1690610b8b610ae78286896128f5565b91610b9782878b6128f5565b3592813b156102c757606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109e557600192610c10575b5001610abb565b6000610c1b91612591565b88610c09565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c6f915060203d8111610c75575b610c678183612591565b8101906133e0565b89610b51565b503d610c5d565b5082821415610ab4565b346102c75760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610cbd61238e565b610cc56123b1565b60443560643567ffffffffffffffff81116102c757610ce8903690600401612504565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d54848484610d1b6133f8565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d85576131ce565b823b610d6557602060405160018152f35b610d7a95610d749136916133a9565b93613669565b8080808080806104b1565b610d91848b8484612ff0565b6131ce565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b1610dd061238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610dfd6133f8565b906131ce565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b1610e3d61238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e6a6133f8565b90612ff0565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826126c7565b60405191829160208352602083019061232f565b0390f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102c75760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760043567ffffffffffffffff81116102c757610fa3903690600401612504565b9060243567ffffffffffffffff81116102c757610fc4903690600401612504565b90926044359060ff82168092036102c75760643567ffffffffffffffff81116102c757610ff59036906004016123d4565b92909360843567ffffffffffffffff81116102c7576110189036906004016123d4565b9790967fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6110446133f8565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015611859575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161188b575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f53f41a97000000000000000000000000000000000000000000000000000000006000527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a98054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491967f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015611859575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116106f85781906112818454612674565b601f8111611806575b50600090601f831160011461176457600092611759575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff82116106f857819061130e7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612674565b601f81116116ca575b50600090601f83116001146115cb576000926115c0575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90611513816125d2565b926115216040519485612591565b818452602084019160051b8101903682116102c757915b8183106115935750505061154b846125d2565b926115596040519485612591565b848452602084019460051b8101903682116102c757945b8186106115835750506109b99350612e76565b8535815260209586019501611570565b823573ffffffffffffffffffffffffffffffffffffffff811681036102c757815260209283019201611538565b01359050888061132e565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8282527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef929091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016815b8181106116b2575090846001959493921061167a575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8255611380565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905588808061164d565b91936020600181928787013581550195019201611637565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000529091507f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f840160051c8101916020851061174f575b90601f859493920160051c01905b8181106117405750611317565b60008155849350600101611733565b9091508190611725565b013590508b806112a1565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106117ee57509084600195949392106117b6575b505050811b0190556112d3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558b80806117a9565b91936020600181928787013581550195019201611793565b909150836000526020600020601f840160051c8101916020851061184f575b90601f859493920160051c01905b818110611840575061128a565b60008155849350600101611833565b9091508190611825565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a389806110b1565b346102c7576104b16118f136612498565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61191e6133f8565b90612c01565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75761195b61238e565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102c7576119b736612405565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119fa6133f8565b92541691169081036102f65750808314801590611b22575b6102cc5760005b838110611a2257005b611a2d8183886128f5565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102c75760006020918a82611a6e87611a67610ae7828f8f906128f5565b938b6128f5565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611ac9606482612591565b51925af1156109e5576000513d611b195750803b155b611aec5750600101611a19565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611adf565b5085831415611a12565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611b6361238e565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576020611bf2611bed61238e565b612532565b6040519015158152f35b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611c3361238e565b60243567ffffffffffffffff81116102c757611c539036906004016123d4565b916044359267ffffffffffffffff84116102c757611c786104b19436906004016123d4565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ca46133f8565b90612955565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6126c7565b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757611d3c61238e565b602435611d476133f8565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611ef15773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611e0c575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611e9657505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611dbd565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576020611f6e61284e565b604051908152f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576040611faf613523565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102c75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b161210061238e565b6121086123b1565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916121326133f8565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612173575b50506131ce565b61217e918484612ff0565b858461216c565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c75760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102c75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576104b161221a61238e565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6122476133f8565b90612789565b346102c75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c757610edf610ecb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c7565b346102c75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102c7576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102c757611bf26020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6125ea565b919082519283825260005b8481106123795750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161233a565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102c757565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102c757565b9181601f840112156102c75782359167ffffffffffffffff83116102c7576020808501948460051b0101116102c757565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c75760043567ffffffffffffffff81116102c7578161244e916004016123d4565b9290929160243567ffffffffffffffff81116102c75781612471916004016123d4565b929092916044359067ffffffffffffffff82116102c757612494916004016123d4565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102c75760043567ffffffffffffffff81116102c757816124e1916004016123d4565b929092916024359067ffffffffffffffff82116102c757612494916004016123d4565b9181601f840112156102c75782359167ffffffffffffffff83116102c757602083818601950101116102c757565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561258a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106f857604052565b67ffffffffffffffff81116106f85760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461258a577f01ffc9a700000000000000000000000000000000000000000000000000000000811461266d5760005260205260ff6040600020541690565b5050600190565b90600182811c921680156126bd575b602083101461268e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612683565b90604051918260008254926126db84612674565b80845293600181169081156127495750600114612702575b5061270092500383612591565b565b90506000929192526020600020906000915b81831061272d57505090602061270092820101386126f3565b6020919350806001915483858901015201910190918492612714565b602093506127009592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386126f3565b929173ffffffffffffffffffffffffffffffffffffffff1692831561280a5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6128777f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c7565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526128ef60c082612591565b51902090565b91908110156129055760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102c75790565b959490939291928581036102cc578015612bf85773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106129f1575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036129df575b50505050565b6129e893612ff0565b388080806129d9565b73ffffffffffffffffffffffffffffffffffffffff612a14610ae783858b6128f5565b168015612bb457612a268285876128f5565b3580612af0575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612ae6575b612a8a575b50600101612997565b8a87039087821015612ab057600090815260208d90526040902090860190556001612a81565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612a7c565b9a8b810190811115612b8a579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612b3c5750906040602093926000908482528552208181540190555b909150612a2d565b90508882989211612b54575090866020920196612b34565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102cc578415612e5a5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110612cf357505050505080151580612ce9575b612c62575b5050505050565b8085039480861015612c9f57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612c5b565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612c56565b73ffffffffffffffffffffffffffffffffffffffff612d16610ae78385896128f5565b168015612e1657612d288285876128f5565b3580612d7c575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612c41565b9687810190811115612b8a579673ffffffffffffffffffffffffffffffffffffffff8916828114612dc957509060019291604060008381528c602052208181540190555b90919250612d2f565b8c829c9211612de05750908a60019392019a612dc0565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b80518210156129055760209160051b010190565b9091825190805182036102cc5781156129d95760009360005b838110612eea575050505081612ea3575050565b6002018054918083019280841115612eba57505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612f098284612e62565b51168015612fc657612f1b8285612e62565b5180612f59575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612e8f565b96919087830192831115612f9c5773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612f22565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b92909173ffffffffffffffffffffffffffffffffffffffff811693841561318a576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613181575b6130bd575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156131265750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613075565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613070565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561332b5782613238575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156132df57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036132b8575b50509250506131f3565b838316600052818552604060002055866000528352604060002085815401905538806132ae565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106f857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926133b58261336f565b916133c36040519384612591565b8294818452818301116102c7578281602093846000960137010152565b908160209103126102c7575180151581036102c75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613514573233148015613519575b613514577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613483575b5061348057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156109e5576000916134f5575b5038613476565b61350e915060203d602011610c7557610c678183612591565b386134ee565b503390565b506018361061343f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561365757323314801561365f575b613657578033149081156135b6575b50613585576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116102c75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156109e557600091613638575b5038613579565b613651915060203d602011610c7557610c678183612591565b38613631565b506000903690565b506018361061356a565b6136d873ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc35859000000000000000000000000000000000000000000000000000000008852166004870152166024850152604484015260806064840152608483019061232f565b03816000865af19081156109e557600091613768575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361373b5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116137e2575b8161378160209383612591565b810103126137de5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036137db57507fffffffff000000000000000000000000000000000000000000000000000000006136ee565b80fd5b5080fd5b3d915061377456fea2646970667358221220deff7f5b3490b724cb0b1e031559e0a3dc3e11bbf1f14c1cb6cb026e6215210264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x22A8 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x224D JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x21E0 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2185 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x20C6 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2057 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FF9 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1F76 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1F35 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1D05 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1CAA JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1BFC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BB1 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B2C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A9 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1924 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x18E0 JUMPI DUP1 PUSH4 0x8A6D57B6 EQ PUSH2 0xF54 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xEE3 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE70 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xE03 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD96 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC86 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA49 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7D6 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x727 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x417 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x323 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x166 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x174 CALLDATASIZE PUSH2 0x2498 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1B5 PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1D5 JUMPI STOP JUMPDEST PUSH2 0x1E0 DUP2 DUP4 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2C7 JUMPI PUSH2 0x20A DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x28D JUMPI RETURNDATASIZE SWAP1 PUSH2 0x22D DUP3 PUSH2 0x336F JUMP JUMPDEST SWAP2 PUSH2 0x23B PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2591 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x254 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1CC JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x263 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x246 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x35A PUSH2 0x238E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x384 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x2F6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3C8 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x44E PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x471 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x4AA DUP4 DUP4 PUSH2 0x4A3 PUSH2 0x33F8 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x31CE JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4BC JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4D2 SWAP5 PUSH2 0x4CB SWAP2 CALLDATASIZE SWAP2 PUSH2 0x33A9 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x3669 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4B1 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x52B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x56A PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH2 0x5B2 DUP3 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6B0 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x615 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x60A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5D4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x698 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x660 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x656 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x643 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6EE JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6E2 JUMPI POP PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6D5 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6CC JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x75E PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x77B PUSH2 0x23B1 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x80D PUSH2 0x238E JUMP JUMPDEST PUSH2 0x815 PUSH2 0x23B1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2C7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA1F JUMPI DUP2 TIMESTAMP GT PUSH2 0x9F1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8F7 PUSH1 0xE0 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x902 PUSH2 0x284E JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x947 PUSH1 0x62 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9E5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9BB JUMPI PUSH2 0x9B9 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2789 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0xA57 CALLDATASIZE PUSH2 0x2405 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA9C PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC7C JUMPI JUMPDEST PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAC4 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAEC PUSH2 0xAE7 DUP4 DUP6 DUP11 PUSH2 0x28F5 JUMP JUMPDEST PUSH2 0x2934 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC4E JUMPI JUMPDEST POP ISZERO PUSH2 0xC21 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB7B PUSH2 0xAE7 DUP4 DUP6 DUP11 PUSH2 0x28F5 JUMP JUMPDEST AND SWAP1 PUSH2 0xB8B PUSH2 0xAE7 DUP3 DUP7 DUP10 PUSH2 0x28F5 JUMP JUMPDEST SWAP2 PUSH2 0xB97 DUP3 DUP8 DUP12 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC10 JUMPI JUMPDEST POP ADD PUSH2 0xABB JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC1B SWAP2 PUSH2 0x2591 JUMP JUMPDEST DUP9 PUSH2 0xC09 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC6F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC75 JUMPI JUMPDEST PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x33E0 JUMP JUMPDEST DUP10 PUSH2 0xB51 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC5D JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAB4 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xCBD PUSH2 0x238E JUMP JUMPDEST PUSH2 0xCC5 PUSH2 0x23B1 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xCE8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD54 DUP5 DUP5 DUP5 PUSH2 0xD1B PUSH2 0x33F8 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD85 JUMPI PUSH2 0x31CE JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD65 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD7A SWAP6 PUSH2 0xD74 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x33A9 JUMP JUMPDEST SWAP4 PUSH2 0x3669 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4B1 JUMP JUMPDEST PUSH2 0xD91 DUP5 DUP12 DUP5 DUP5 PUSH2 0x2FF0 JUMP JUMPDEST PUSH2 0x31CE JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0xDD0 PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDFD PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x31CE JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0xE3D PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE6A PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2FF0 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x26C7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x232F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFA3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFC4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2504 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x2C7 JUMPI PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0xFF5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x1018 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x1044 PUSH2 0x33F8 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1859 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x188B JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP7 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0x1859 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6F8 JUMPI DUP2 SWAP1 PUSH2 0x1281 DUP5 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x1806 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1764 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x1759 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6F8 JUMPI DUP2 SWAP1 PUSH2 0x130E PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2674 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x16CA JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x15CB JUMPI PUSH1 0x0 SWAP3 PUSH2 0x15C0 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1513 DUP2 PUSH2 0x25D2 JUMP JUMPDEST SWAP3 PUSH2 0x1521 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2591 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1593 JUMPI POP POP POP PUSH2 0x154B DUP5 PUSH2 0x25D2 JUMP JUMPDEST SWAP3 PUSH2 0x1559 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2591 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1583 JUMPI POP POP PUSH2 0x9B9 SWAP4 POP PUSH2 0x2E76 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1570 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1538 JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP9 DUP1 PUSH2 0x132E JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP3 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x16B2 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x167A JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x1380 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP9 DUP1 DUP1 PUSH2 0x164D JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1637 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x174F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1740 JUMPI POP PUSH2 0x1317 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1733 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1725 JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP12 DUP1 PUSH2 0x12A1 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x17EE JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x17B6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x12D3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x17A9 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1793 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x184F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1840 JUMPI POP PUSH2 0x128A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1833 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1825 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP10 DUP1 PUSH2 0x10B1 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x18F1 CALLDATASIZE PUSH2 0x2498 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x191E PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2C01 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x195B PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH2 0x19B7 CALLDATASIZE PUSH2 0x2405 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19FA PUSH2 0x33F8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F6 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B22 JUMPI JUMPDEST PUSH2 0x2CC JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1A22 JUMPI STOP JUMPDEST PUSH2 0x1A2D DUP2 DUP4 DUP9 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1A6E DUP8 PUSH2 0x1A67 PUSH2 0xAE7 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x28F5 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1AC9 PUSH1 0x64 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B19 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1AEC JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A19 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1ADF JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1A12 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1B63 PUSH2 0x238E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH2 0x1BF2 PUSH2 0x1BED PUSH2 0x238E JUMP JUMPDEST PUSH2 0x2532 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1C33 PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI PUSH2 0x1C53 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2C7 JUMPI PUSH2 0x1C78 PUSH2 0x4B1 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1CA4 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2955 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x26C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x1D3C PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1D47 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1EF1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1E0C JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1E96 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1DBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH2 0x1F6E PUSH2 0x284E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH2 0x1FAF PUSH2 0x3523 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x2100 PUSH2 0x238E JUMP JUMPDEST PUSH2 0x2108 PUSH2 0x23B1 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2132 PUSH2 0x33F8 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2173 JUMPI JUMPDEST POP POP PUSH2 0x31CE JUMP JUMPDEST PUSH2 0x217E SWAP2 DUP5 DUP5 PUSH2 0x2FF0 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x216C JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0x4B1 PUSH2 0x221A PUSH2 0x238E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2247 PUSH2 0x33F8 JUMP JUMPDEST SWAP1 PUSH2 0x2789 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH2 0xEDF PUSH2 0xECB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2C7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI PUSH2 0x1BF2 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x25EA JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2379 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x233A JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2C7 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2C7 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x244E SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x2471 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C7 JUMPI PUSH2 0x2494 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2C7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C7 JUMPI DUP2 PUSH2 0x24E1 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C7 JUMPI PUSH2 0x2494 SWAP2 PUSH1 0x4 ADD PUSH2 0x23D4 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2C7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2C7 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2C7 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x258A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6F8 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x258A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x266D JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x26BD JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x268E JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2683 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x26DB DUP5 PUSH2 0x2674 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2749 JUMPI POP PUSH1 0x1 EQ PUSH2 0x2702 JUMPI JUMPDEST POP PUSH2 0x2700 SWAP3 POP SUB DUP4 PUSH2 0x2591 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x272D JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2700 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x26F3 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2714 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2700 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x26F3 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x280A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2877 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C7 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x28EF PUSH1 0xC0 DUP3 PUSH2 0x2591 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2905 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2C7 JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2CC JUMPI DUP1 ISZERO PUSH2 0x2BF8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x29F1 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29DF JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x29E8 SWAP4 PUSH2 0x2FF0 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x29D9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2A14 PUSH2 0xAE7 DUP4 DUP6 DUP12 PUSH2 0x28F5 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2BB4 JUMPI PUSH2 0x2A26 DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2AF0 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2AE6 JUMPI JUMPDEST PUSH2 0x2A8A JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2997 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2AB0 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2A81 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2A7C JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2B8A JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2B3C JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2A2D JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2B54 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2B34 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2CC JUMPI DUP5 ISZERO PUSH2 0x2E5A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CF3 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x2CE9 JUMPI JUMPDEST PUSH2 0x2C62 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2C9F JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2C5B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2C56 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D16 PUSH2 0xAE7 DUP4 DUP6 DUP10 PUSH2 0x28F5 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2E16 JUMPI PUSH2 0x2D28 DUP3 DUP6 DUP8 PUSH2 0x28F5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2D7C JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2B8A JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x2DC9 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2D2F JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2DE0 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2DC0 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2905 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x2CC JUMPI DUP2 ISZERO PUSH2 0x29D9 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2EEA JUMPI POP POP POP POP DUP2 PUSH2 0x2EA3 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2EBA JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2F09 DUP3 DUP5 PUSH2 0x2E62 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x2FC6 JUMPI PUSH2 0x2F1B DUP3 DUP6 PUSH2 0x2E62 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x2F59 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2E8F JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x2F9C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2F22 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x318A JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3181 JUMPI JUMPDEST PUSH2 0x30BD JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3126 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3075 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3070 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x332B JUMPI DUP3 PUSH2 0x3238 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x32DF JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x32B8 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x31F3 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x32AE JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6F8 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x33B5 DUP3 PUSH2 0x336F JUMP JUMPDEST SWAP2 PUSH2 0x33C3 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2591 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2C7 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2C7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2C7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3514 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3519 JUMPI JUMPDEST PUSH2 0x3514 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3483 JUMPI JUMPDEST POP PUSH2 0x3480 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x34F5 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3476 JUMP JUMPDEST PUSH2 0x350E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC75 JUMPI PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST CODESIZE PUSH2 0x34EE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x343F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3657 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x365F JUMPI JUMPDEST PUSH2 0x3657 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35B6 JUMPI JUMPDEST POP PUSH2 0x3585 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2C7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3638 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3579 JUMP JUMPDEST PUSH2 0x3651 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC75 JUMPI PUSH2 0xC67 DUP2 DUP4 PUSH2 0x2591 JUMP JUMPDEST CODESIZE PUSH2 0x3631 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x356A JUMP JUMPDEST PUSH2 0x36D8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x232F JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3768 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x373B JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x37E2 JUMPI JUMPDEST DUP2 PUSH2 0x3781 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2591 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x37DE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x37DB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x36EE JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3774 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE SELFDESTRUCT PUSH32 0x5B3490B724CB0B1E031559E0A3DC3E11BBF1F14C1CB6CB026E6215210264736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"265:267:138:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;265:267:138;;3046:41:283;;;:::i;:::-;265:267:138;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;265:267:138;1845:10:192;;;;;;265:267:138;1857:3:192;1876:11;;;;;:::i;:::-;265:267:138;;;;;;;;;1898:10:192;;;;;:::i;:::-;265:267:138;1375:21:9;;;:30;1371:125;;265:267:138;1548:33:9;;;;;;;265:267:138;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;265:267:138;;1834:9:192;;1591:58:9;265:267:138;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;265:267:138;5957:19:9;265:267:138;;5957:19:9;265:267:138;;;;;1371:125:9;1455:21;;1428:57;265:267:138;1428:57:9;265:267:138;;;;;;1428:57:9;265:267:138;;;;1756:63:192;1793:26;265:267:138;1793:26:192;265:267:138;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;265:267:138;;-1:-1:-1;4538:25:42;265:267:138;;;;;;;;;;;;;:::i;:::-;;3046:41:283;;;:::i;:::-;265:267:138;;;;;;;;3205:23:42;;;3201:60;;265:267:138;;;3275:25:42;;;;3271:146;;265:267:138;3271:146:42;265:267:138;;;;;;;;3361:45:42;265:267:138;3361:45:42;;265:267:138;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;265:267:138;3046:41:283;17093:5:280;3046:41:283;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;265:267:138;;;;;;;;17109:96:280;17145:49;265:267:138;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;265:267:138;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3046:41:283;;;:::i;:::-;265:267:138;;;;;4503:26:42;;;4499:64;;1283:19:278;265:267:138;791:79:277;265:267:138;791:79:277;;;;;;;;:::i;:::-;;;;;;265:267:138;791:79:277;265:267:138;791:79:277;;;;;;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;;;265:267:138;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;;;;265:267:138;;;;;;;791:79:277;;;;;;;;;;;;;;;;;-1:-1:-1;;;791:79:277;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;;;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;265:267:138;;;;;;791:79:277;;;;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;;;;;265:267:138;791:79:277;;;;;;;;;-1:-1:-1;791:79:277;;;;;265:267:138;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;265:267:138;-1:-1:-1;265:267:138;27576:12:280;265:267:138;;;;-1:-1:-1;265:267:138;27576:28:280;265:267:138;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;265:267:138;2653:23:279;265:267:138;2653:23:279;265:267:138;2653:23:279;265:267:138;;;;;;;;;;;;;;;;;;;2602:87:279;;;;265:267:138;1021:95:279;265:267:138;;1021:95:279;265:267:138;1021:95:279;;265:267:138;;;;;1021:95:279;;265:267:138;1021:95:279;;;;265:267:138;;1021:95:279;;265:267:138;;1021:95:279;;265:267:138;;2602:87:279;;;265:267:138;2602:87:279;;:::i;:::-;265:267:138;2592:98:279;;2758:18;;:::i;:::-;265:267:138;;;2729:60:279;;;;1021:95;;;;;;;265:267:138;1021:95:279;;;265:267:138;1021:95:279;2729:60;;;;;;:::i;:::-;265:267:138;2719:71:279;;265:267:138;;;;;;1021:95:279;;;265:267:138;;;;1021:95:279;;265:267:138;;;;1021:95:279;;265:267:138;2821:24:279;;;265:267:138;2821:24:279;;;;;265:267:138;;2821:24:279;265:267:138;2863:15:279;2859:57;;2982:5;27705:19:280;265:267:138;2982:5:279;:::i;:::-;265:267:138;2859:57:279;2887:29;265:267:138;2887:29:279;265:267:138;;2887:29:279;2821:24;265:267:138;;;;;;;;;2470:67:279;2509:28;;265:267:138;2509:28:279;265:267:138;;;;2509:28:279;2400:60;2432:28;265:267:138;2432:28:279;265:267:138;;2432:28:279;265:267:138;;;;;;;:::i;:::-;5148:19:42;;;;;;265:267:138;;;3046:41:283;;:::i;:::-;265:267:138;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;265:267:138;3852:94:192;;265:267:138;3972:10:192;;;;;;265:267:138;3984:3:192;265:267:138;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;265:267:138;;;;4058:76:192;;4108:25;265:267:138;4058:76:192;;265:267:138;4058:76:192;;;;;;;;;;;;265:267:138;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;265:267:138;4239:12:192;;;;;;:::i;:::-;265:267:138;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;265:267:138;4239:70:192;;;;;;;265:267:138;;;;;;;4239:70:192;;;;;265:267:138;4239:70:192;;4277:4;265:267:138;4239:70:192;;265:267:138;;4058:76:192;265:267:138;;;;;;;4239:70:192;;;;;;;265:267:138;4239:70:192;;;3984:3;;265:267:138;3961:9:192;;4239:70;265:267:138;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;265:267:138;4161:50:192;265:267:138;;4058:76:192;265:267:138;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;265:267:138;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;265:267:138;3046:41:283;9818:5:280;3046:41:283;;;;;:::i;:::-;265:267:138;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;265:267:138;;;;;;;18723:98:280;18759:51;265:267:138;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;265:267:138:-;;;;;;;;;;;1036:5:242;265:267:138;;:::i;:::-;;;;;3046:41:283;;:::i;:::-;1036:5:242;;:::i;265:267:138:-;;;;;;;;;;;1788:15:242;265:267:138;;:::i;:::-;;;;;3046:41:283;;:::i;:::-;1788:15:242;;:::i;265:267:138:-;;;;;;;;;;;;;3091:13:277;265:267:138;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;265:267:138;3046:41:283;;:::i;:::-;265:267:138;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;265:267:138;;;;;;1645:152:42;;265:267:138;-1:-1:-1;;265:267:138;;500:10:59;;;;265:267:138;;1124:1:42;791:79:277;;;;;;265:267:138;;;500:10:59;265:267:138;;791:79:277;;;;265:267:138;;500:10:59;265:267:138;;791:79:277;;;;265:267:138;;500:10:59;265:267:138;;791:79:277;;;;265:267:138;;3431:37:280;-1:-1:-1;500:10:59;;265:267:138;;791:79:277;;;;;265:267:138;;;;;;;;;;;;900:21:181;;;896:88;;265:267:138;1124:1:42;265:267:138;;;791:79:277;;;;;;;;;;:::i;:::-;;;;;;265:267:138;791:79:277;265:267:138;791:79:277;;;;;;;;265:267:138;791:79:277;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;265:267:138;791:79:277;;;;;;;2461:13;791:79;;:::i;:::-;;;;;;;;265:267:138;791:79:277;;;;;;;;265:267:138;791:79:277;;;;;;;;1124:1:42;791:79:277;;;;;;;;2461:13;791:79;;;2498:15;791:79;;;2498:15;791:79;2596:32;265:267:138;500:10:59;;265:267:138;500:10:59;265:267:138;;500:10:59;1124:1:42;791:79:277;265:267:138;;791:79:277;;265:267:138;;768:32:278;265:267:138;500:10:59;;265:267:138;500:10:59;265:267:138;;500:10:59;1124:1:42;791:79:277;265:267:138;;791:79:277;;265:267:138;;1298:30:279;265:267:138;500:10:59;265:267:138;500:10:59;265:267:138;;500:10:59;1124:1:42;791:79:277;265:267:138;;791:79:277;;265:267:138;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2804:53:283;;;;;;:::i;265:267:138:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;2461:13;265:267:138;;;;791:79:277;;;;;;;;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;;;;2461:13;791:79;;;;;;;;;;;;;;;;;;;;;;;;;;265:267:138;1124:1:42;791:79:277;;;;;;;;;;;;;;;;2461:13;265:267:138;;;;-1:-1:-1;265:267:138;791:79:277;;;;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;265:267:138;791:79:277;;;;-1:-1:-1;1124:1:42;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;;;;;-1:-1:-1;791:79:277;;;;;;;;;265:267:138;;;;;;;791:79:277;;;;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;265:267:138;1124:1:42;791:79:277;;;;;;;;;;;;;;;;265:267:138;;;;;;;;;791:79:277;;;;;;;;265:267:138;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;265:267:138;791:79:277;;;;-1:-1:-1;1124:1:42;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;896:88:181;930:54;265:267:138;930:54:181;265:267:138;;1124:1:42;265:267:138;;;;930:54:181;1645:152:42;265:267:138;;;;;;;;;1740:46:42;;;;1645:152;;;;265:267:138;;;;875:6:243;265:267:138;;;:::i;:::-;27705:19:280;;;;265:267:138;3046:41:283;;:::i;:::-;875:6:243;;:::i;265:267:138:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;265:267:138;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;265:267:138;;3046:41:283;;;:::i;:::-;265:267:138;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;265:267:138;2776:90:192;;265:267:138;2892:10:192;;;;;;265:267:138;2904:3:192;2923:9;;;;;:::i;:::-;265:267:138;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;265:267:138;;;1328:43:8;265:267:138;1328:43:8;;;;265:267:138;1328:43:8;;265:267:138;1328:43:8;;;265:267:138;1328:43:8;265:267:138;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;265:267:138;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;265:267:138;;2881:9:192;;8938:146:8;9033:40;265:267:138;9033:40:8;265:267:138;;1328:43:8;265:267:138;9033:40:8;8942:68;265:267:138;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;265:267:138;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;265:267:138;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;265:267:138;;;;;;:::i;:::-;27705:19:280;;;265:267:138;3046:41:283;;:::i;:::-;1170:6:243;;:::i;265:267:138:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;3046:41:283;;:::i;:::-;265:267:138;;;;5455:21:280;;;5451:67;;265:267:138;;;-1:-1:-1;265:267:138;5555:12:280;265:267:138;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;-1:-1:-1;265:267:138;;5597:10:280;;5593:366;;265:267:138;;;5973:42:280;265:267:138;;;;;;;;;5973:42:280;;265:267:138;;;;;;;5593:366:280;265:267:138;;;5720:32:280;;;;;5716:108;;5842:19;;;265:267:138;;5973:42:280;5842:19;265:267:138;;;-1:-1:-1;265:267:138;5555:12:280;265:267:138;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;5593:366:280;;;;5716:108;265:267:138;;5761:63:280;;;265:267:138;;;;;5761:63:280;;265:267:138;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;265:267:138;5485:33:280;;265:267:138;5485:33:280;265:267:138;;;;;5485:33:280;265:267:138;;;;;;;;;;;;1284:37:248;;:::i;:::-;265:267:138;;;;;;;;;;;;;;;;;;3281:39:283;;:::i;:::-;265:267:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3732:15:277;265:267:138;;;;;;;;;;;;;;;;;;;;;;;941:19:75;265:267:138;;;;;;;;;;;;;;;9818:5:280;265:267:138;;:::i;:::-;;;:::i;:::-;;3046:41:283;;;:::i;:::-;265:267:138;;;;;;;;;;;9707:14:280;9703:85;;265:267:138;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;265:267:138;;;;;;;;;;;;26654:8:280;265:267:138;;;;;;;;;;;;;;;;;;826:5:242;265:267:138;;:::i;:::-;;;;;3046:41:283;;:::i;:::-;826:5:242;;:::i;265:267:138:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;265:267:138;1793:19:59;265:267:138;635:65:55;:::i;265:267:138:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;265:267:138;1146:19:75;265:267:138;1146:53:75;;;1142:96;;265:267:138;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;265:267:138;1215:12:75;:::o;265:267:138:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;;265:267:138;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;265:267:138;500:10:59;;;265:267:138;500:10:59;265:267:138;500:10:59;;265:267:138;1359:340:59;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;265:267:138:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;265:267:138;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428::280;;;265::138;;4533:21:280;;;4529:67;;265:267:138;4657:31:280;4606:19;:12;265:267:138;4606:19:280;265:267:138;;;-1:-1:-1;265:267:138;4606:12:280;265:267:138;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;265:267:138;4563:33:280;;4552:1;4563:33;265:267:138;4563:33:280;265:267:138;;4552:1:280;4563:33;4317:545:279;265:267:138;;;:::i;:::-;;;;;;4669:54:279;265:267:138;;;4520:321:279;;265:267:138;4552:95:279;265:267:138;;;;;;4745:14:279;265:267:138;;;;4412:53:279;265:267:138;;;;4818:4:279;265:267:138;;;;;4520:321:279;;;;;;:::i;:::-;265:267:138;4493:362:279;;4317:545;:::o;265:267:138:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;265:267:138;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;265:267:138;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;265:267:138;14325:13:280;;;;;;:::i;:::-;265:267:138;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;265:267:138;14472:10:280;14468:656;;14293:3;265:267:138;;;15143:25:280;265:267:138;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;265:267:138;;14270:9:280;;15183:500;265:267:138;;;15437:21:280;;;;;15433:85;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;265:267:138;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;265:267:138;;;;14602:27:280;;;;14598:74;;265:267:138;;;;;14746:10:280;;;;;14784:14;;265:267:138;;14784:14:280;;-1:-1:-1;265:267:138;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;265:267:138;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;265:267:138;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;265:267:138;14381:32:280;;14132:1;14381:32;265:267:138;14381:32:280;265:267:138;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;10853:1796::-;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;265:267:138;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;265:267:138;;;12409:21:280;;;;;12405:85;;12508:16;;265:267:138;;-1:-1:-1;265:267:138;;;;-1:-1:-1;265:267:138;;;;;12171:472:280;;;;;;;12405:85;265:267:138;12439:51:280;;11116:1;12439:51;265:267:138;12439:51:280;265:267:138;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;265:267:138;11309:13:280;;;;;;:::i;:::-;265:267:138;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;265:267:138;11455:10:280;11451:656;;11277:3;265:267:138;;;;;;;;;12125:25:280;265:267:138;;;;12125:25:280;;265:267:138;11254:9:280;;11451:656;265:267:138;;;;11585:27:280;;;;11581:74;;265:267:138;;;;11729:10:280;;;;;11767:14;;265:267:138;11767:14:280;;265:267:138;-1:-1:-1;265:267:138;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;265:267:138;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;265:267:138;;;;;;11116:1:280;11873:46;11336:61;265:267:138;11365:32:280;;11116:1;11365:32;265:267:138;11365:32:280;265:267:138;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;265:267:138:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;265:267:138;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;265:267:138;;;;;;21949:19:280;;;;;21945:76;;265:267:138;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;265:267:138;;;;-1:-1:-1;21977:44:280;21174:3;265:267:138;21206:13:280;;;;:::i;:::-;265:267:138;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;265:267:138;21344:10:280;21340:372;;21174:3;265:267:138;-1:-1:-1;21730:31:280;265:267:138;;;;;;;;;21730:31:280;265:267:138;21151:9:280;;21340:372;265:267:138;;;;;;21474:27:280;;;;21470:70;;265:267:138;;;-1:-1:-1;265:267:138;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;265:267:138;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;6693:851;;;;265:267:138;;;6808:21:280;;;6804:67;;6908:12;;:19;265:267:138;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;-1:-1:-1;265:267:138;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;265:267:138;;;;;;7495:42:280;265:267:138;;;;;;;7495:42:280;;6693:851::o;6947:534::-;265:267:138;;;7238:32:280;;;;;7234:112;;7364:19;;;265:267:138;7495:42:280;7364:19;265:267:138;7364:19:280;265:267:138;;;-1:-1:-1;265:267:138;;;;-1:-1:-1;265:267:138;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;6947:534:280;;;7234:112;265:267:138;;7279:67:280;;;265:267:138;;;;7279:67:280;;;265:267:138;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;265:267:138;6838:33:280;;6827:1;6838:33;265:267:138;6838:33:280;265:267:138;;6827:1:280;6838:33;8105:628;;;265:267:138;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;265:267:138;;;8701:25:280;265:267:138;;;;;;;8701:25:280;;8105:628::o;8273:413::-;265:267:138;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;;;8437:21:280;;;;;8433:80;;265:267:138;;;;;;;;8701:25:280;265:267:138;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;265:267:138;;;-1:-1:-1;265:267:138;;;;;-1:-1:-1;265:267:138;;;-1:-1:-1;265:267:138;;;;-1:-1:-1;265:267:138;;;;;;;8531:131:280;;;;8433:80;8467:46;;265:267:138;8467:46:280;;8219:1;8467:46;265:267:138;8467:46:280;265:267:138;;;;;;8219:1:280;8467:46;8201:61;265:267:138;8230:32:280;;8219:1;8230:32;265:267:138;8230:32:280;265:267:138;;8219:1:280;8230:32;265:267:138;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;265:267:138;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;265:267:138;1029:19:76;265:267:138;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;265:267:138;;;1676:74:76;;265:267:138;;;1676:74:76;;;265:267:138;1327:10:76;265:267:138;;;;1744:4:76;265:267:138;;;;;-1:-1:-1;1676:74:76;;265:267:138;;;;;;1676:74:76;;;;;;;265:267:138;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;265:267:138;2065:19:76;265:267:138;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;265:267:138;720:8:80;265:267:138;720:8:80;;265:267:138;;;;2115:1:76;2802:32;;:::o;2624:153::-;265:267:138;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;265:267:138;2361:10:76;265:267:138;;;;2771:4:76;265:267:138;;;;;-1:-1:-1;2682:95:76;;265:267:138;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;28229:252:280;265:267:138;;28229:252:280;;;;265:267:138;28229:252:280;265:267:138;;;;;28357:61:280;;;;;265:267:138;28357:61:280;;265:267:138;28357:61:280;;;265:267:138;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;265:267:138;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;265:267:138;;-1:-1:-1;28445:29:280;28357:61;265:267:138;28357:61:280;;265:267:138;28357:61:280;;;;;;265:267:138;28357:61:280;;;:::i;:::-;;;265:267:138;;;;;;;;;;;;;28357:61:280;265:267:138;28357:61:280;;265:267:138;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2873600","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","__msgData()":"infinite","allowance(address,address)":"3057","approve(address,uint256)":"infinite","balanceOf(address)":"2663","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","decimals()":"2385","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","increaseAllowance(address,uint256)":"infinite","init(string,string,uint8,address[],uint256[])":"infinite","isTrustedForwarder(address)":"infinite","name()":"infinite","nonces(address)":"2707","owner()":"2649","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","__msgData()":"31e66e1e","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","increaseAllowance(address,uint256)":"39509351","init(string,string,uint8,address[],uint256[])":"8a6d57b6","isTrustedForwarder(address)":"572b6c05","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"holders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"allocations\",\"type\":\"uint256[]\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol\":\"ERC20FixedSupplyProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/preset/proxied/ERC20FixedSupplyProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20FixedSupplyProxied} from \\\"./../../../../../token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol\\\";\\n\\ncontract ERC20FixedSupplyProxiedMock is ERC20FixedSupplyProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20FixedSupplyProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa494fae031e177a470b3c949851ebf0b42885f563eac79f9a889d837d95920aa\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../../base/ERC20Base.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../../base/ERC20DetailedBase.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../../base/ERC20MetadataBase.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../../base/ERC20PermitBase.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../../base/ERC20SafeTransfersBase.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../../base/ERC20BatchTransfersBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (proxied version).\\ncontract ERC20FixedSupplyProxied is\\n    ERC20Base,\\n    ERC20DetailedBase,\\n    ERC20MetadataBase,\\n    ERC20PermitBase,\\n    ERC20SafeTransfersBase,\\n    ERC20BatchTransfersBase,\\n    InterfaceDetection,\\n    TokenRecoveryBase,\\n    ContractOwnershipBase,\\n    ForwarderRegistryContext\\n{\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] calldata holders,\\n        uint256[] calldata allocations\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC20Storage.init();\\n        ERC20Storage.initERC20BatchTransfers();\\n        ERC20Storage.initERC20SafeTransfers();\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n        ERC20MetadataStorage.init();\\n        ERC20PermitStorage.init();\\n        ERC20Storage.layout().batchMint(holders, allocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4d43b879fec24c9f3d60ad50ec6b9a5c5cbf9d8c22e1c56cc2c3aaac47877268\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol":{"ERC20MintBurnProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f6144b738819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f5760805260405161441c908161009b82396080518181816129ab01528181612e960152818161400b01526141360152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612bf557806306fdde0314612b9a578063095ea7b314612b2d57806318160ddd14612ad25780631b9a752914612a8e57806323b872dd146129cf5780632b4c9f16146129605780632f2ff15d146127d4578063313ce5671461277657806331e66e1e146126f35780633644e515146126b257806339509351146124825780633c130d901461242757806340c10f191461226457806342966c68146122005780634885b25414612152578063572b6c05146121075780636857310714611fec57806370a0823114611f6757806373c8a95814611de457806379cc679014611d2f5780637ecebe0014611caa57806388d695b214611c665780638bb9c5bf14611af75780638da5cb5b14611a8657806391d14854146119ee57806395d89b411461197b578063a457c2d71461190e578063a9059cbb146118a1578063b88d4fde14611791578063c3666c3614611554578063d505accf146112e1578063d539139314611288578063d547741f146110ff578063dd62ed3e14611050578063e0df5b6f14610e34578063eb79554914610d6f578063f2fde38b14610c7b578063f57b0182146103915763f7ba94bd146101d457600080fd5b34610335576101e236612d52565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613ff4565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e81838761319b565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103355761027882858761319b565b359081471061030357600080809381935af13d156102fb573d9061029b82613f6b565b916102a96040519384612ede565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff8111610335576103e0903690600401612e51565b60243567ffffffffffffffff811161033557610400903690600401612e51565b6000939193506044359160ff8316809303610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61043e613ff4565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610bf4575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610c26575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980548216831790557f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580548216831790557f20c07ed1000000000000000000000000000000000000000000000000000000006000527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb48054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491957f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015610bf4575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff8211610ac55781906106cd8454612fc1565b601f8111610ba1575b50600090601f8311600114610aff57600092610af4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610ac5576107587f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612fc1565b601f8111610a41575b506000601f8211600114610945578192939460009261093a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050848061077b565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b878110610a295750836001959697106109f1575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556107cd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806109c4565b909260206001819286860135815501940191016109b0565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610abb575b601f0160051c01905b818110610aaf5750610761565b60008155600101610aa2565b9091508190610a99565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806106ed565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110610b895750908460019594939210610b51575b505050811b01905561071f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080610b44565b91936020600181928787013581550195019201610b2e565b909150836000526020600020601f840160051c81019160208510610bea575b90601f859493920160051c01905b818110610bdb57506106d6565b60008155849350600101610bce565b9091508190610bc0565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a385806104ab565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610cb2612cdb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610cdc613ff4565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff1691828203610d2057005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610da6612cdb565b60243560443567ffffffffffffffff811161033557610dc9903690600401612e51565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610e028383610dfb613ff4565b8097613e16565b813b610e14575b602060405160018152f35b610e2a94610e23913691613fa5565b9280614265565b8080808080610e09565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff811161033557610e83903690600401612e51565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ec2613ff4565b925416911690810361036457507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff8111610ac557610f0a8254612fc1565b601f8111611008575b506000601f8211600114610f6d57819293600092610f62575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610f2c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b868110610ff05750836001959610610fb8575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610fae565b90926020600181928686013581550194019101610f9b565b826000526020600020601f830160051c81019160208410611046575b601f0160051c01905b81811061103a5750610f13565b6000815560010161102d565b9091508190611024565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611087612cdb565b73ffffffffffffffffffffffffffffffffffffffff6110a4612cfe565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435611139612cfe565b611141613ff4565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166111f357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611318612cdb565b611320612cfe565b6044359060643560843560ff81168091036103355773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d831561152a578142116114fc576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c0815261140260e082612ede565b51902061140d613345565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611452606282612ede565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156114f05773ffffffffffffffffffffffffffffffffffffffff60005116036114c6576114c4927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6130d6565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355761156236612dc2565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115a7613ff4565b92541691169081036103645750808214801590611787575b61033a5760005b8281106115cf57005b73ffffffffffffffffffffffffffffffffffffffff6115f76115f283858a61319b565b6131da565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156114f057600091611759575b501561172c575073ffffffffffffffffffffffffffffffffffffffff6116866115f283858a61319b565b16906116966115f282868961319b565b916116a282878b61319b565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156114f05760019261171b575b50016115c6565b600061172691612ede565b88611714565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61177a915060203d8111611780575b6117728183612ede565b810190613fdc565b8961165c565b503d611768565b50828214156115bf565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576117c8612cdb565b6117d0612cfe565b60443560643567ffffffffffffffff8111610335576117f3903690600401612e51565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9361185f848484611826613ff4565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff83160361189057613e16565b823b61187057602060405160018152f35b6118859561187f913691613fa5565b93614265565b808080808080610e09565b61189c848b8484613c38565b613e16565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e096118db612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611908613ff4565b90613e16565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09611948612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611975613ff4565b90613c38565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82613014565b604051918291602083526020830190612c7c565b0390f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611a25612cfe565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611b52613ff4565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611c1e5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101611283565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461033557610e09611c7736612d52565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ca4613ff4565b906139df565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611ce1612cdb565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09611d69612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d96613ff4565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611dd2575b50506134ae565b611ddd918484613c38565b8483611dcb565b3461033557611df236612dc2565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611e35613ff4565b92541691169081036103645750808314801590611f5d575b61033a5760005b838110611e5d57005b611e6881838861319b565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036103355760006020918a82611ea987611ea26115f2828f8f9061319b565b938b61319b565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611f04606482612ede565b51925af1156114f0576000513d611f545750803b155b611f275750600101611e54565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611f1a565b5085831415611e4d565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611f9e612cdb565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461033557611ffa36612d52565b92909161202f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612029613ff4565b906133ec565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061205a81612f1f565b926120686040519485612ede565b818452602084019160051b81019036821161033557915b8183106120da5750505061209284612f1f565b926120a06040519485612ede565b848452602084019460051b81019036821161033557945b8186106120ca5750506114c4935061388f565b85358152602095860195016120b7565b823573ffffffffffffffffffffffffffffffffffffffff811681036103355781526020928301920161207f565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020612148612143612cdb565b612e7f565b6040519015158152f35b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612189612cdb565b60243567ffffffffffffffff8111610335576121a9903690600401612d21565b916044359267ffffffffffffffff8411610335576121ce610e09943690600401612d21565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121fa613ff4565b906135cf565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e096004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61225e613ff4565b906134ae565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761229b612cdb565b6024356122ca7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612029613ff4565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92169182156123fd578161233f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf05482810190808211156123cb57507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61230f565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea613014565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576124b9612cdb565b6024356124c4613ff4565b9073ffffffffffffffffffffffffffffffffffffffff831692831561266e5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180612589575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561261357505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061253a565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206126eb613345565b604051908152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557604061272c61411f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561280e612cfe565b612816613ff4565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128c957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101611283565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09612a09612cdb565b612a11612cfe565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91612a3b613ff4565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612a7c575b5050613e16565b612a87918484613c38565b8584612a75565b3461033557610e09612a9f36612d52565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612acc613ff4565b906131fb565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09612b67612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612b94613ff4565b906130d6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81613014565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576121486020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d612f37565b919082519283825260005b848110612cc65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612c87565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff81116103355781612d9b91600401612d21565b929092916024359067ffffffffffffffff821161033557612dbe91600401612d21565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff81116103355781612e0b91600401612d21565b9290929160243567ffffffffffffffff81116103355781612e2e91600401612d21565b929092916044359067ffffffffffffffff821161033557612dbe91600401612d21565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612ed75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ac557604052565b67ffffffffffffffff8111610ac55760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ed7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612fba5760005260205260ff6040600020541690565b5050600190565b90600182811c9216801561300a575b6020831014612fdb57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612fd0565b906040519182600082549261302884612fc1565b8084529360018116908115613096575060011461304f575b5061304d92500383612ede565b565b90506000929192526020600020906000915b81831061307a57505090602061304d9282010138613040565b6020919350806001915483858901015201910190918492613061565b6020935061304d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613040565b929173ffffffffffffffffffffffffffffffffffffffff169283156131575773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156131ab5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b93929480860361033a57851561333d5760009560005b8181106132325750505050505081613227575050565b600201908154039055565b6132406115f282848861319b565b61324b82858961319b565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff8116850361332b575b5090506132c3575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a301613211565b98604060008381528a60205220548a810390808210156132f55750600083815260208b9052604090205589019861328c565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b613335928c613c38565b388187613284565b505050505050565b61336e7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81613014565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526133e660c082612ede565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156134465750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b826134fc575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015613583575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6134b4565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361033a5780156138725773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b81811061366b575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603613659575b50505050565b61366293613c38565b38808080613653565b73ffffffffffffffffffffffffffffffffffffffff61368e6115f283858b61319b565b16801561382e576136a082858761319b565b358061376a575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580613760575b613704575b50600101613611565b8a8703908782101561372a57600090815260208d905260409020908601905560016136fb565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156136f6565b9a8b810190811115613804579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146137b65750906040602093926000908482528552208181540190555b9091506136a7565b905088829892116137ce5750908660209201966137ae565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b80518210156131ab5760209160051b010190565b90918251908051820361033a5781156136535760009360005b8381106139035750505050816138bc575050565b60020180549180830192808411156138d357505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff613922828461387b565b511680156123fd57613934828561387b565b5180613972575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a3016138a8565b969190878301928311156139b55773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061393b565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361033a57841561333d5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110613ad157505050505080151580613ac7575b613a40575b5050505050565b8085039480861015613a7d57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080613a39565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415613a34565b73ffffffffffffffffffffffffffffffffffffffff613af46115f283858961319b565b168015613bf457613b0682858761319b565b3580613b5a575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301613a1f565b9687810190811115613804579673ffffffffffffffffffffffffffffffffffffffff8916828114613ba757509060019291604060008381528c602052208181540190555b90919250613b0d565b8c829c9211613bbe5750908a60019392019a613b9e565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613dd2576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613dc9575b613d05575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015613d6e5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613cbd565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613cb8565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315613f275782613e80575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561358357508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603613f00575b5050925050613e3b565b83831660005281855260406000205586600052835260406000208581540190553880613ef6565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff8111610ac557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613fb182613f6b565b91613fbf6040519384612ede565b829481845281830111610335578281602093846000960137010152565b90816020910312610335575180151581036103355790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614110573233148015614115575b614110577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561407f575b5061407c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156114f0576000916140f1575b5038614072565b61410a915060203d602011611780576117728183612ede565b386140ea565b503390565b506018361061403b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561425357323314801561425b575b614253578033149081156141b2575b50614181576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103355760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156114f057600091614234575b5038614175565b61424d915060203d602011611780576117728183612ede565b3861422d565b506000903690565b5060183610614166565b6142d473ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612c7c565b03816000865af19081156114f057600091614364575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036143375750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116143de575b8161437d60209383612ede565b810103126143da5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036143d757507fffffffff000000000000000000000000000000000000000000000000000000006142ea565b80fd5b5080fd5b3d915061437056fea264697066735822122029d0057bbf612f0c759b71b05d0f6d90a6b11497bd2a34059c6b919d585cb58664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x44B7 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x441C SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x29AB ADD MSTORE DUP2 DUP2 PUSH2 0x2E96 ADD MSTORE DUP2 DUP2 PUSH2 0x400B ADD MSTORE PUSH2 0x4136 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2BF5 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2B9A JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2B2D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2AD2 JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2A8E JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x29CF JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2960 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27D4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x2776 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x26F3 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x26B2 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x2482 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x2427 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2264 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x2200 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x2152 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2107 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1FEC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1F67 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1DE4 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1D2F JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1CAA JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1C66 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1AF7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A86 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x19EE JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x197B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x190E JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x18A1 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1791 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x1554 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x12E1 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x1288 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x10FF JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1050 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0xE34 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0xD6F JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xC7B JUMPI DUP1 PUSH4 0xF57B0182 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3F6B JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2EDE JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3E0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x400 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH1 0x0 SWAP4 SWAP2 SWAP4 POP PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x43E PUSH2 0x3FF4 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0xC26 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC5 JUMPI DUP2 SWAP1 PUSH2 0x6CD DUP5 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xBA1 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0xAFF JUMPI PUSH1 0x0 SWAP3 PUSH2 0xAF4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH2 0x758 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xA41 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x945 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x93A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x77B JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0xA29 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x9F1 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x7CD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x9C4 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x9B0 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0xABB JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xAAF JUMPI POP PUSH2 0x761 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xAA2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xA99 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x6ED JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB89 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0xB51 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x71F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0xB44 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0xB2E JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0xBEA JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xBDB JUMPI POP PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0xBCE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xBC0 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP6 DUP1 PUSH2 0x4AB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xCB2 PUSH2 0x2CDB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xCDC PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0xD20 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDA6 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0xDC9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xE02 DUP4 DUP4 PUSH2 0xDFB PUSH2 0x3FF4 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3E16 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE14 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xE2A SWAP5 PUSH2 0xE23 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3FA5 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x4265 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE09 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0xE83 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEC2 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH2 0xF0A DUP3 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x1008 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0xF6D JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0xF62 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0xF2C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0xFF0 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0xFB8 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0xFAE JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0xF9B JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x1046 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x103A JUMPI POP PUSH2 0xF13 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x102D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1024 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1087 PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10A4 PUSH2 0x2CFE JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1139 PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x1141 PUSH2 0x3FF4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x11F3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1318 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x1320 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x152A JUMPI DUP2 TIMESTAMP GT PUSH2 0x14FC JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x1402 PUSH1 0xE0 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x140D PUSH2 0x3345 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1452 PUSH1 0x62 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x14F0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x14C6 JUMPI PUSH2 0x14C4 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x30D6 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1562 CALLDATASIZE PUSH2 0x2DC2 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x15A7 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1787 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x15CF JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15F7 PUSH2 0x15F2 DUP4 DUP6 DUP11 PUSH2 0x319B JUMP JUMPDEST PUSH2 0x31DA JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1759 JUMPI JUMPDEST POP ISZERO PUSH2 0x172C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1686 PUSH2 0x15F2 DUP4 DUP6 DUP11 PUSH2 0x319B JUMP JUMPDEST AND SWAP1 PUSH2 0x1696 PUSH2 0x15F2 DUP3 DUP7 DUP10 PUSH2 0x319B JUMP JUMPDEST SWAP2 PUSH2 0x16A2 DUP3 DUP8 DUP12 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x171B JUMPI JUMPDEST POP ADD PUSH2 0x15C6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1726 SWAP2 PUSH2 0x2EDE JUMP JUMPDEST DUP9 PUSH2 0x1714 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x177A SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1780 JUMPI JUMPDEST PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3FDC JUMP JUMPDEST DUP10 PUSH2 0x165C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1768 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x15BF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x17C8 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x17D0 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x17F3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x185F DUP5 DUP5 DUP5 PUSH2 0x1826 PUSH2 0x3FF4 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x1890 JUMPI PUSH2 0x3E16 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1870 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x1885 SWAP6 PUSH2 0x187F SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3FA5 JUMP JUMPDEST SWAP4 PUSH2 0x4265 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE09 JUMP JUMPDEST PUSH2 0x189C DUP5 DUP12 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST PUSH2 0x3E16 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x18DB PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1908 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x3E16 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1948 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1975 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x3C38 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x3014 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2C7C JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1A25 PUSH2 0x2CFE JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1B52 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C1E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1283 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1C77 CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1CA4 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x39DF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1CE1 PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1D69 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D96 PUSH2 0x3FF4 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1DD2 JUMPI JUMPDEST POP POP PUSH2 0x34AE JUMP JUMPDEST PUSH2 0x1DDD SWAP2 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1DCB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1DF2 CALLDATASIZE PUSH2 0x2DC2 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E35 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1F5D JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1E5D JUMPI STOP JUMPDEST PUSH2 0x1E68 DUP2 DUP4 DUP9 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1EA9 DUP8 PUSH2 0x1EA2 PUSH2 0x15F2 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x319B JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1F04 PUSH1 0x64 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1F54 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1F27 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1E54 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1F1A JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1E4D JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1F9E PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1FFA CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x202F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2029 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x33EC JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x205A DUP2 PUSH2 0x2F1F JUMP JUMPDEST SWAP3 PUSH2 0x2068 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2EDE JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x20DA JUMPI POP POP POP PUSH2 0x2092 DUP5 PUSH2 0x2F1F JUMP JUMPDEST SWAP3 PUSH2 0x20A0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2EDE JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x20CA JUMPI POP POP PUSH2 0x14C4 SWAP4 POP PUSH2 0x388F JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x20B7 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x207F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2148 PUSH2 0x2143 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x2E7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2189 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x21A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x335 JUMPI PUSH2 0x21CE PUSH2 0xE09 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21FA PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x35CF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x225E PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x34AE JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x229B PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x22CA PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2029 PUSH2 0x3FF4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x23FD JUMPI DUP2 PUSH2 0x233F JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x23CB JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x230F JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x3014 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x24B9 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x24C4 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x266E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x2589 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2613 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x253A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x26EB PUSH2 0x3345 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x40 PUSH2 0x272C PUSH2 0x411F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x280E PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x2816 PUSH2 0x3FF4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28C9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1283 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2A09 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x2A11 PUSH2 0x2CFE JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2A3B PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2A7C JUMPI JUMPDEST POP POP PUSH2 0x3E16 JUMP JUMPDEST PUSH2 0x2A87 SWAP2 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x2A75 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2A9F CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2ACC PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x31FB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2B67 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B94 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x30D6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x3014 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x2148 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x2F37 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2CC6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2C87 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2D9B SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x2DBE SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2E0B SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2E2E SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x2DBE SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2ED7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xAC5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2FBA JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x300A JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2FDB JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2FD0 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3028 DUP5 PUSH2 0x2FC1 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3096 JUMPI POP PUSH1 0x1 EQ PUSH2 0x304F JUMPI JUMPDEST POP PUSH2 0x304D SWAP3 POP SUB DUP4 PUSH2 0x2EDE JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x307A JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x304D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3040 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3061 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x304D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3040 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3157 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x31AB JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x33A JUMPI DUP6 ISZERO PUSH2 0x333D JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3232 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3227 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x3240 PUSH2 0x15F2 DUP3 DUP5 DUP9 PUSH2 0x319B JUMP JUMPDEST PUSH2 0x324B DUP3 DUP6 DUP10 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x332B JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x32C3 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3211 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x32F5 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x328C JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3335 SWAP3 DUP13 PUSH2 0x3C38 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x3284 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x336E PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x3014 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x33E6 PUSH1 0xC0 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3446 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x34FC JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3583 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x34B4 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x33A JUMPI DUP1 ISZERO PUSH2 0x3872 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x366B JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3659 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3662 SWAP4 PUSH2 0x3C38 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3653 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x368E PUSH2 0x15F2 DUP4 DUP6 DUP12 PUSH2 0x319B JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x382E JUMPI PUSH2 0x36A0 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x376A JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x3760 JUMPI JUMPDEST PUSH2 0x3704 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3611 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x372A JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x36FB JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x36F6 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3804 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x37B6 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x36A7 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x37CE JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x37AE JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x31AB JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x33A JUMPI DUP2 ISZERO PUSH2 0x3653 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3903 JUMPI POP POP POP POP DUP2 PUSH2 0x38BC JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x38D3 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3922 DUP3 DUP5 PUSH2 0x387B JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x23FD JUMPI PUSH2 0x3934 DUP3 DUP6 PUSH2 0x387B JUMP JUMPDEST MLOAD DUP1 PUSH2 0x3972 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x38A8 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x39B5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x393B JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x33A JUMPI DUP5 ISZERO PUSH2 0x333D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3AD1 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3AC7 JUMPI JUMPDEST PUSH2 0x3A40 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x3A7D JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A39 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x3A34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3AF4 PUSH2 0x15F2 DUP4 DUP6 DUP10 PUSH2 0x319B JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3BF4 JUMPI PUSH2 0x3B06 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3B5A JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x3A1F JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3804 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3BA7 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x3B0D JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x3BBE JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x3B9E JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3DD2 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3DC9 JUMPI JUMPDEST PUSH2 0x3D05 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3D6E JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3CBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3CB8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3F27 JUMPI DUP3 PUSH2 0x3E80 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3583 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x3F00 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3E3B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3EF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3FB1 DUP3 PUSH2 0x3F6B JUMP JUMPDEST SWAP2 PUSH2 0x3FBF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2EDE JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4110 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4115 JUMPI JUMPDEST PUSH2 0x4110 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x407F JUMPI JUMPDEST POP PUSH2 0x407C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x40F1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4072 JUMP JUMPDEST PUSH2 0x410A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1780 JUMPI PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST CODESIZE PUSH2 0x40EA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x403B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4253 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x425B JUMPI JUMPDEST PUSH2 0x4253 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x41B2 JUMPI JUMPDEST POP PUSH2 0x4181 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4234 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4175 JUMP JUMPDEST PUSH2 0x424D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1780 JUMPI PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST CODESIZE PUSH2 0x422D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4166 JUMP JUMPDEST PUSH2 0x42D4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2C7C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4364 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x4337 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43DE JUMPI JUMPDEST DUP2 PUSH2 0x437D PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2EDE JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x43DA JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x43D7 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x42EA JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4370 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x29 0xD0 SDIV PUSH28 0xBF612F0C759B71B05D0F6D90A6B11497BD2A34059C6B919D585CB586 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:258:139:-:0;;;;;;;;;;;;;-1:-1:-1;;259:258:139;;;;-1:-1:-1;;;;;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;259:258:139;;;;;;745:39:76;;259:258:139;;;;;;;;745:39:76;259:258:139;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":11483,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":11553,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11714,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11602,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":16293,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":16348,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11857,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":11518,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":11388,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":12063,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":16235,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":12699,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":12308,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":12225,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":11998,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":13125,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":12502,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchBurnFrom":{"entryPoint":12795,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_batchMint":{"entryPoint":14479,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":14815,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":13775,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_burn":{"entryPoint":13486,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":16997,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":15416,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":13292,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":11903,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgData":{"entryPoint":16671,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":16372,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":12087,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transfer":{"entryPoint":15894,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":14459,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":12762,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10667},{"length":32,"start":11926},{"length":32,"start":16395},{"length":32,"start":16694}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612bf557806306fdde0314612b9a578063095ea7b314612b2d57806318160ddd14612ad25780631b9a752914612a8e57806323b872dd146129cf5780632b4c9f16146129605780632f2ff15d146127d4578063313ce5671461277657806331e66e1e146126f35780633644e515146126b257806339509351146124825780633c130d901461242757806340c10f191461226457806342966c68146122005780634885b25414612152578063572b6c05146121075780636857310714611fec57806370a0823114611f6757806373c8a95814611de457806379cc679014611d2f5780637ecebe0014611caa57806388d695b214611c665780638bb9c5bf14611af75780638da5cb5b14611a8657806391d14854146119ee57806395d89b411461197b578063a457c2d71461190e578063a9059cbb146118a1578063b88d4fde14611791578063c3666c3614611554578063d505accf146112e1578063d539139314611288578063d547741f146110ff578063dd62ed3e14611050578063e0df5b6f14610e34578063eb79554914610d6f578063f2fde38b14610c7b578063f57b0182146103915763f7ba94bd146101d457600080fd5b34610335576101e236612d52565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613ff4565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e81838761319b565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103355761027882858761319b565b359081471061030357600080809381935af13d156102fb573d9061029b82613f6b565b916102a96040519384612ede565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff8111610335576103e0903690600401612e51565b60243567ffffffffffffffff811161033557610400903690600401612e51565b6000939193506044359160ff8316809303610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61043e613ff4565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610bf4575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610c26575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980548216831790557f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580548216831790557f20c07ed1000000000000000000000000000000000000000000000000000000006000527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb48054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491957f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015610bf4575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff8211610ac55781906106cd8454612fc1565b601f8111610ba1575b50600090601f8311600114610aff57600092610af4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610ac5576107587f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612fc1565b601f8111610a41575b506000601f8211600114610945578192939460009261093a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050848061077b565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b878110610a295750836001959697106109f1575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556107cd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806109c4565b909260206001819286860135815501940191016109b0565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610abb575b601f0160051c01905b818110610aaf5750610761565b60008155600101610aa2565b9091508190610a99565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806106ed565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110610b895750908460019594939210610b51575b505050811b01905561071f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080610b44565b91936020600181928787013581550195019201610b2e565b909150836000526020600020601f840160051c81019160208510610bea575b90601f859493920160051c01905b818110610bdb57506106d6565b60008155849350600101610bce565b9091508190610bc0565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a385806104ab565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610cb2612cdb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610cdc613ff4565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff1691828203610d2057005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610da6612cdb565b60243560443567ffffffffffffffff811161033557610dc9903690600401612e51565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610e028383610dfb613ff4565b8097613e16565b813b610e14575b602060405160018152f35b610e2a94610e23913691613fa5565b9280614265565b8080808080610e09565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff811161033557610e83903690600401612e51565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ec2613ff4565b925416911690810361036457507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff8111610ac557610f0a8254612fc1565b601f8111611008575b506000601f8211600114610f6d57819293600092610f62575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610f2c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b868110610ff05750836001959610610fb8575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610fae565b90926020600181928686013581550194019101610f9b565b826000526020600020601f830160051c81019160208410611046575b601f0160051c01905b81811061103a5750610f13565b6000815560010161102d565b9091508190611024565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611087612cdb565b73ffffffffffffffffffffffffffffffffffffffff6110a4612cfe565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435611139612cfe565b611141613ff4565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166111f357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611318612cdb565b611320612cfe565b6044359060643560843560ff81168091036103355773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d831561152a578142116114fc576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c0815261140260e082612ede565b51902061140d613345565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611452606282612ede565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156114f05773ffffffffffffffffffffffffffffffffffffffff60005116036114c6576114c4927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6130d6565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355761156236612dc2565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115a7613ff4565b92541691169081036103645750808214801590611787575b61033a5760005b8281106115cf57005b73ffffffffffffffffffffffffffffffffffffffff6115f76115f283858a61319b565b6131da565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156114f057600091611759575b501561172c575073ffffffffffffffffffffffffffffffffffffffff6116866115f283858a61319b565b16906116966115f282868961319b565b916116a282878b61319b565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156114f05760019261171b575b50016115c6565b600061172691612ede565b88611714565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61177a915060203d8111611780575b6117728183612ede565b810190613fdc565b8961165c565b503d611768565b50828214156115bf565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576117c8612cdb565b6117d0612cfe565b60443560643567ffffffffffffffff8111610335576117f3903690600401612e51565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9361185f848484611826613ff4565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff83160361189057613e16565b823b61187057602060405160018152f35b6118859561187f913691613fa5565b93614265565b808080808080610e09565b61189c848b8484613c38565b613e16565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e096118db612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611908613ff4565b90613e16565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09611948612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611975613ff4565b90613c38565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82613014565b604051918291602083526020830190612c7c565b0390f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611a25612cfe565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611b52613ff4565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611c1e5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101611283565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461033557610e09611c7736612d52565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611ca4613ff4565b906139df565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611ce1612cdb565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09611d69612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d96613ff4565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611dd2575b50506134ae565b611ddd918484613c38565b8483611dcb565b3461033557611df236612dc2565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611e35613ff4565b92541691169081036103645750808314801590611f5d575b61033a5760005b838110611e5d57005b611e6881838861319b565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036103355760006020918a82611ea987611ea26115f2828f8f9061319b565b938b61319b565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611f04606482612ede565b51925af1156114f0576000513d611f545750803b155b611f275750600101611e54565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611f1a565b5085831415611e4d565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611f9e612cdb565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461033557611ffa36612d52565b92909161202f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612029613ff4565b906133ec565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061205a81612f1f565b926120686040519485612ede565b818452602084019160051b81019036821161033557915b8183106120da5750505061209284612f1f565b926120a06040519485612ede565b848452602084019460051b81019036821161033557945b8186106120ca5750506114c4935061388f565b85358152602095860195016120b7565b823573ffffffffffffffffffffffffffffffffffffffff811681036103355781526020928301920161207f565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020612148612143612cdb565b612e7f565b6040519015158152f35b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612189612cdb565b60243567ffffffffffffffff8111610335576121a9903690600401612d21565b916044359267ffffffffffffffff8411610335576121ce610e09943690600401612d21565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121fa613ff4565b906135cf565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e096004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61225e613ff4565b906134ae565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761229b612cdb565b6024356122ca7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612029613ff4565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92169182156123fd578161233f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf05482810190808211156123cb57507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61230f565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea613014565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576124b9612cdb565b6024356124c4613ff4565b9073ffffffffffffffffffffffffffffffffffffffff831692831561266e5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180612589575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561261357505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061253a565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206126eb613345565b604051908152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557604061272c61411f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561280e612cfe565b612816613ff4565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128c957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101611283565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09612a09612cdb565b612a11612cfe565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91612a3b613ff4565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612a7c575b5050613e16565b612a87918484613c38565b8584612a75565b3461033557610e09612a9f36612d52565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612acc613ff4565b906131fb565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e09612b67612cdb565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612b94613ff4565b906130d6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119ea6119d67f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81613014565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576121486020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d612f37565b919082519283825260005b848110612cc65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612c87565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff81116103355781612d9b91600401612d21565b929092916024359067ffffffffffffffff821161033557612dbe91600401612d21565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff81116103355781612e0b91600401612d21565b9290929160243567ffffffffffffffff81116103355781612e2e91600401612d21565b929092916044359067ffffffffffffffff821161033557612dbe91600401612d21565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612ed75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ac557604052565b67ffffffffffffffff8111610ac55760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ed7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612fba5760005260205260ff6040600020541690565b5050600190565b90600182811c9216801561300a575b6020831014612fdb57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612fd0565b906040519182600082549261302884612fc1565b8084529360018116908115613096575060011461304f575b5061304d92500383612ede565b565b90506000929192526020600020906000915b81831061307a57505090602061304d9282010138613040565b6020919350806001915483858901015201910190918492613061565b6020935061304d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613040565b929173ffffffffffffffffffffffffffffffffffffffff169283156131575773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91908110156131ab5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b93929480860361033a57851561333d5760009560005b8181106132325750505050505081613227575050565b600201908154039055565b6132406115f282848861319b565b61324b82858961319b565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff8116850361332b575b5090506132c3575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a301613211565b98604060008381528a60205220548a810390808210156132f55750600083815260208b9052604090205589019861328c565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b613335928c613c38565b388187613284565b505050505050565b61336e7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81613014565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526133e660c082612ede565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156134465750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b826134fc575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015613583575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6134b4565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361033a5780156138725773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b81811061366b575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603613659575b50505050565b61366293613c38565b38808080613653565b73ffffffffffffffffffffffffffffffffffffffff61368e6115f283858b61319b565b16801561382e576136a082858761319b565b358061376a575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580613760575b613704575b50600101613611565b8a8703908782101561372a57600090815260208d905260409020908601905560016136fb565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156136f6565b9a8b810190811115613804579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146137b65750906040602093926000908482528552208181540190555b9091506136a7565b905088829892116137ce5750908660209201966137ae565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b80518210156131ab5760209160051b010190565b90918251908051820361033a5781156136535760009360005b8381106139035750505050816138bc575050565b60020180549180830192808411156138d357505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff613922828461387b565b511680156123fd57613934828561387b565b5180613972575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a3016138a8565b969190878301928311156139b55773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061393b565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361033a57841561333d5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110613ad157505050505080151580613ac7575b613a40575b5050505050565b8085039480861015613a7d57505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080613a39565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415613a34565b73ffffffffffffffffffffffffffffffffffffffff613af46115f283858961319b565b168015613bf457613b0682858761319b565b3580613b5a575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301613a1f565b9687810190811115613804579673ffffffffffffffffffffffffffffffffffffffff8916828114613ba757509060019291604060008381528c602052208181540190555b90919250613b0d565b8c829c9211613bbe5750908a60019392019a613b9e565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613dd2576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613dc9575b613d05575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015613d6e5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613cbd565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613cb8565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315613f275782613e80575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561358357508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603613f00575b5050925050613e3b565b83831660005281855260406000205586600052835260406000208581540190553880613ef6565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff8111610ac557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613fb182613f6b565b91613fbf6040519384612ede565b829481845281830111610335578281602093846000960137010152565b90816020910312610335575180151581036103355790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614110573233148015614115575b614110577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561407f575b5061407c57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156114f0576000916140f1575b5038614072565b61410a915060203d602011611780576117728183612ede565b386140ea565b503390565b506018361061403b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561425357323314801561425b575b614253578033149081156141b2575b50614181576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103355760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156114f057600091614234575b5038614175565b61424d915060203d602011611780576117728183612ede565b3861422d565b506000903690565b5060183610614166565b6142d473ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612c7c565b03816000865af19081156114f057600091614364575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036143375750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116143de575b8161437d60209383612ede565b810103126143da5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036143d757507fffffffff000000000000000000000000000000000000000000000000000000006142ea565b80fd5b5080fd5b3d915061437056fea264697066735822122029d0057bbf612f0c759b71b05d0f6d90a6b11497bd2a34059c6b919d585cb58664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2BF5 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2B9A JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2B2D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2AD2 JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2A8E JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x29CF JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2960 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27D4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x2776 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x26F3 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x26B2 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x2482 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x2427 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2264 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x2200 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x2152 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2107 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1FEC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1F67 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1DE4 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1D2F JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1CAA JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1C66 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1AF7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A86 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x19EE JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x197B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x190E JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x18A1 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1791 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x1554 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x12E1 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x1288 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x10FF JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1050 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0xE34 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0xD6F JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xC7B JUMPI DUP1 PUSH4 0xF57B0182 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3F6B JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2EDE JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3E0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x400 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH1 0x0 SWAP4 SWAP2 SWAP4 POP PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x43E PUSH2 0x3FF4 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0xC26 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0xBF4 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC5 JUMPI DUP2 SWAP1 PUSH2 0x6CD DUP5 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xBA1 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0xAFF JUMPI PUSH1 0x0 SWAP3 PUSH2 0xAF4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH2 0x758 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xA41 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x945 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x93A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x77B JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0xA29 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x9F1 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x7CD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x9C4 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x9B0 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0xABB JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xAAF JUMPI POP PUSH2 0x761 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xAA2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xA99 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x6ED JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB89 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0xB51 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x71F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0xB44 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0xB2E JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0xBEA JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xBDB JUMPI POP PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0xBCE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xBC0 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP6 DUP1 PUSH2 0x4AB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xCB2 PUSH2 0x2CDB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xCDC PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0xD20 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDA6 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0xDC9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xE02 DUP4 DUP4 PUSH2 0xDFB PUSH2 0x3FF4 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3E16 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE14 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xE2A SWAP5 PUSH2 0xE23 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3FA5 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x4265 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE09 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0xE83 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEC2 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH2 0xF0A DUP3 SLOAD PUSH2 0x2FC1 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x1008 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0xF6D JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0xF62 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0xF2C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0xFF0 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0xFB8 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0xFAE JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0xF9B JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x1046 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x103A JUMPI POP PUSH2 0xF13 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x102D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1024 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1087 PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10A4 PUSH2 0x2CFE JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1139 PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x1141 PUSH2 0x3FF4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x11F3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1318 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x1320 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x152A JUMPI DUP2 TIMESTAMP GT PUSH2 0x14FC JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x1402 PUSH1 0xE0 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x140D PUSH2 0x3345 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1452 PUSH1 0x62 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x14F0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x14C6 JUMPI PUSH2 0x14C4 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x30D6 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1562 CALLDATASIZE PUSH2 0x2DC2 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x15A7 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1787 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x15CF JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15F7 PUSH2 0x15F2 DUP4 DUP6 DUP11 PUSH2 0x319B JUMP JUMPDEST PUSH2 0x31DA JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1759 JUMPI JUMPDEST POP ISZERO PUSH2 0x172C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1686 PUSH2 0x15F2 DUP4 DUP6 DUP11 PUSH2 0x319B JUMP JUMPDEST AND SWAP1 PUSH2 0x1696 PUSH2 0x15F2 DUP3 DUP7 DUP10 PUSH2 0x319B JUMP JUMPDEST SWAP2 PUSH2 0x16A2 DUP3 DUP8 DUP12 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x171B JUMPI JUMPDEST POP ADD PUSH2 0x15C6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1726 SWAP2 PUSH2 0x2EDE JUMP JUMPDEST DUP9 PUSH2 0x1714 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x177A SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1780 JUMPI JUMPDEST PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3FDC JUMP JUMPDEST DUP10 PUSH2 0x165C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1768 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x15BF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x17C8 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x17D0 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x17F3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2E51 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x185F DUP5 DUP5 DUP5 PUSH2 0x1826 PUSH2 0x3FF4 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x1890 JUMPI PUSH2 0x3E16 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1870 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x1885 SWAP6 PUSH2 0x187F SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3FA5 JUMP JUMPDEST SWAP4 PUSH2 0x4265 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xE09 JUMP JUMPDEST PUSH2 0x189C DUP5 DUP12 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST PUSH2 0x3E16 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x18DB PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1908 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x3E16 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1948 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1975 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x3C38 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x3014 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2C7C JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1A25 PUSH2 0x2CFE JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1B52 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C1E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1283 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1C77 CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1CA4 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x39DF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1CE1 PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x1D69 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D96 PUSH2 0x3FF4 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1DD2 JUMPI JUMPDEST POP POP PUSH2 0x34AE JUMP JUMPDEST PUSH2 0x1DDD SWAP2 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1DCB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1DF2 CALLDATASIZE PUSH2 0x2DC2 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E35 PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1F5D JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1E5D JUMPI STOP JUMPDEST PUSH2 0x1E68 DUP2 DUP4 DUP9 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1EA9 DUP8 PUSH2 0x1EA2 PUSH2 0x15F2 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x319B JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1F04 PUSH1 0x64 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1F54 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1F27 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1E54 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1F1A JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1E4D JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1F9E PUSH2 0x2CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1FFA CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x202F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2029 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x33EC JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x205A DUP2 PUSH2 0x2F1F JUMP JUMPDEST SWAP3 PUSH2 0x2068 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2EDE JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x20DA JUMPI POP POP POP PUSH2 0x2092 DUP5 PUSH2 0x2F1F JUMP JUMPDEST SWAP3 PUSH2 0x20A0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2EDE JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x20CA JUMPI POP POP PUSH2 0x14C4 SWAP4 POP PUSH2 0x388F JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x20B7 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x207F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2148 PUSH2 0x2143 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x2E7F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2189 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x21A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x335 JUMPI PUSH2 0x21CE PUSH2 0xE09 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21FA PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x35CF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x225E PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x34AE JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x229B PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x22CA PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2029 PUSH2 0x3FF4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x23FD JUMPI DUP2 PUSH2 0x233F JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x23CB JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x230F JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x3014 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x24B9 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x24C4 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x266E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x2589 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2613 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x253A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x26EB PUSH2 0x3345 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x40 PUSH2 0x272C PUSH2 0x411F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x280E PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x2816 PUSH2 0x3FF4 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28C9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1283 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2A09 PUSH2 0x2CDB JUMP JUMPDEST PUSH2 0x2A11 PUSH2 0x2CFE JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x2A3B PUSH2 0x3FF4 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2A7C JUMPI JUMPDEST POP POP PUSH2 0x3E16 JUMP JUMPDEST PUSH2 0x2A87 SWAP2 DUP5 DUP5 PUSH2 0x3C38 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x2A75 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2A9F CALLDATASIZE PUSH2 0x2D52 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2ACC PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x31FB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE09 PUSH2 0x2B67 PUSH2 0x2CDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B94 PUSH2 0x3FF4 JUMP JUMPDEST SWAP1 PUSH2 0x30D6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19EA PUSH2 0x19D6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x3014 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x2148 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x2F37 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2CC6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2C87 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2D9B SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x2DBE SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2E0B SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x2E2E SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x2DBE SWAP2 PUSH1 0x4 ADD PUSH2 0x2D21 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2ED7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xAC5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2FBA JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x300A JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2FDB JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2FD0 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3028 DUP5 PUSH2 0x2FC1 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3096 JUMPI POP PUSH1 0x1 EQ PUSH2 0x304F JUMPI JUMPDEST POP PUSH2 0x304D SWAP3 POP SUB DUP4 PUSH2 0x2EDE JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x307A JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x304D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3040 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3061 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x304D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3040 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3157 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x31AB JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x33A JUMPI DUP6 ISZERO PUSH2 0x333D JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3232 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3227 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x3240 PUSH2 0x15F2 DUP3 DUP5 DUP9 PUSH2 0x319B JUMP JUMPDEST PUSH2 0x324B DUP3 DUP6 DUP10 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x332B JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x32C3 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3211 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x32F5 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x328C JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3335 SWAP3 DUP13 PUSH2 0x3C38 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x3284 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x336E PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x3014 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x33E6 PUSH1 0xC0 DUP3 PUSH2 0x2EDE JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3446 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x34FC JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3583 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x34B4 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x33A JUMPI DUP1 ISZERO PUSH2 0x3872 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x366B JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3659 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3662 SWAP4 PUSH2 0x3C38 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3653 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x368E PUSH2 0x15F2 DUP4 DUP6 DUP12 PUSH2 0x319B JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x382E JUMPI PUSH2 0x36A0 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x376A JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x3760 JUMPI JUMPDEST PUSH2 0x3704 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3611 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x372A JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x36FB JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x36F6 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3804 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x37B6 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x36A7 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x37CE JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x37AE JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x31AB JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x33A JUMPI DUP2 ISZERO PUSH2 0x3653 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3903 JUMPI POP POP POP POP DUP2 PUSH2 0x38BC JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x38D3 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3922 DUP3 DUP5 PUSH2 0x387B JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x23FD JUMPI PUSH2 0x3934 DUP3 DUP6 PUSH2 0x387B JUMP JUMPDEST MLOAD DUP1 PUSH2 0x3972 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x38A8 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x39B5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x393B JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x33A JUMPI DUP5 ISZERO PUSH2 0x333D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3AD1 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3AC7 JUMPI JUMPDEST PUSH2 0x3A40 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x3A7D JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A39 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x3A34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3AF4 PUSH2 0x15F2 DUP4 DUP6 DUP10 PUSH2 0x319B JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3BF4 JUMPI PUSH2 0x3B06 DUP3 DUP6 DUP8 PUSH2 0x319B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3B5A JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x3A1F JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3804 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3BA7 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x3B0D JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x3BBE JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x3B9E JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3DD2 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3DC9 JUMPI JUMPDEST PUSH2 0x3D05 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3D6E JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3CBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3CB8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3F27 JUMPI DUP3 PUSH2 0x3E80 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3583 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x3F00 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3E3B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3EF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC5 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3FB1 DUP3 PUSH2 0x3F6B JUMP JUMPDEST SWAP2 PUSH2 0x3FBF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2EDE JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4110 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4115 JUMPI JUMPDEST PUSH2 0x4110 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x407F JUMPI JUMPDEST POP PUSH2 0x407C JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x40F1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4072 JUMP JUMPDEST PUSH2 0x410A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1780 JUMPI PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST CODESIZE PUSH2 0x40EA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x403B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4253 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x425B JUMPI JUMPDEST PUSH2 0x4253 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x41B2 JUMPI JUMPDEST POP PUSH2 0x4181 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4234 JUMPI JUMPDEST POP CODESIZE PUSH2 0x4175 JUMP JUMPDEST PUSH2 0x424D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1780 JUMPI PUSH2 0x1772 DUP2 DUP4 PUSH2 0x2EDE JUMP JUMPDEST CODESIZE PUSH2 0x422D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4166 JUMP JUMPDEST PUSH2 0x42D4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2C7C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x14F0 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4364 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x4337 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43DE JUMPI JUMPDEST DUP2 PUSH2 0x437D PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2EDE JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x43DA JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x43D7 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x42EA JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4370 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x29 0xD0 SDIV PUSH28 0xBF612F0C759B71B05D0F6D90A6B11497BD2A34059C6B919D585CB586 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:258:139:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;259:258:139;;3211:41:284;;;:::i;:::-;259:258:139;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;259:258:139;1845:10:192;;;;;;259:258:139;1857:3:192;1876:11;;;;;:::i;:::-;259:258:139;;;;;;;;;1898:10:192;;;;;:::i;:::-;259:258:139;1375:21:9;;;:30;1371:125;;259:258:139;1548:33:9;;;;;;;259:258:139;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;259:258:139;;1834:9:192;;1591:58:9;259:258:139;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;259:258:139;5957:19:9;259:258:139;;5957:19:9;259:258:139;;;;;1371:125:9;1455:21;;1428:57;259:258:139;1428:57:9;259:258:139;;;;;;1428:57:9;259:258:139;;;;1756:63:192;1793:26;259:258:139;1793:26:192;259:258:139;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;259:258:139;;-1:-1:-1;4538:25:42;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3211:41:284;;:::i;:::-;259:258:139;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;259:258:139;;;;;;1645:152:42;;259:258:139;-1:-1:-1;;259:258:139;;500:10:59;;;;259:258:139;;1124:1:42;259:258:139;;;;;;;;;500:10:59;259:258:139;;;;;;;;500:10:59;259:258:139;;;;;;;;500:10:59;259:258:139;;;;;;;;500:10:59;259:258:139;;;;;;;;500:10:59;259:258:139;;;;;;;;3920:32:280;-1:-1:-1;500:10:59;;259:258:139;;;;;;;;;;;;;;;;;;;900:21:181;;;896:88;;259:258:139;1124:1:42;259:258:139;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;;;;;;;;;;2461:13:277;259:258:139;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;2461:13:277;259:258:139;;;2498:15:277;791:79;259:258:139;;2498:15:277;791:79;2596:32;259:258:139;500:10:59;;259:258:139;500:10:59;259:258:139;;500:10:59;1124:1:42;259:258:139;;;;;;;768:32:278;259:258:139;500:10:59;;259:258:139;500:10:59;259:258:139;;500:10:59;1124:1:42;259:258:139;;;;;;;1298:30:279;259:258:139;500:10:59;259:258:139;500:10:59;259:258:139;;500:10:59;1124:1:42;259:258:139;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;2461:13:277;259:258:139;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;;;;;;2461:13:277;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;;;;;;;;;2461:13:277;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1124:1:42;259:258:139;;;;;;-1:-1:-1;259:258:139;;;;896:88:181;930:54;259:258:139;930:54:181;259:258:139;;1124:1:42;259:258:139;;;;930:54:181;1645:152:42;259:258:139;;;;;;;;;1740:46:42;;;;1645:152;;;;259:258:139;;;;;;;;;;;;;:::i;:::-;;3211:41:284;;;:::i;:::-;259:258:139;;;;;;;;3205:23:42;;;3201:60;;259:258:139;;;3275:25:42;;;;3271:146;;259:258:139;3271:146:42;259:258:139;;;;;;;;3361:45:42;259:258:139;3361:45:42;;259:258:139;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;259:258:139;3211:41:284;17093:5:280;3211:41:284;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;259:258:139;;;;;;;;17109:96:280;17145:49;259:258:139;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3211:41:284;;;:::i;:::-;259:258:139;;;;;4503:26:42;;;4499:64;;1283:19:278;259:258:139;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;259:258:139;-1:-1:-1;259:258:139;27576:12:280;259:258:139;;;;-1:-1:-1;259:258:139;27576:28:280;259:258:139;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3211:41:284;;:::i;:::-;5148:19:42;259:258:139;;;;;;;4503:26:42;;;4499:64;;4464:19:41;259:258:139;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;500:10:59;259:258:139;1880:140:41;;259:258:139;1880:140:41;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;259:258:139;;;;1973:36:41;;;;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;259:258:139;2653:23:279;259:258:139;2653:23:279;259:258:139;2653:23:279;259:258:139;;;;;;;;;;;;;;;;;;;2602:87:279;;;;259:258:139;1021:95:279;259:258:139;;1021:95:279;259:258:139;1021:95:279;;259:258:139;;;;;1021:95:279;;259:258:139;1021:95:279;;;;259:258:139;;1021:95:279;;259:258:139;;1021:95:279;;259:258:139;;2602:87:279;;;259:258:139;2602:87:279;;:::i;:::-;259:258:139;2592:98:279;;2758:18;;:::i;:::-;259:258:139;;;2729:60:279;;;;1021:95;;;;;;;259:258:139;1021:95:279;;;259:258:139;1021:95:279;2729:60;;;;;;:::i;:::-;259:258:139;2719:71:279;;259:258:139;;;;;;1021:95:279;;;259:258:139;;;;1021:95:279;;259:258:139;;;;1021:95:279;;259:258:139;2821:24:279;;;259:258:139;2821:24:279;;;;;259:258:139;;2821:24:279;259:258:139;2863:15:279;2859:57;;2982:5;27705:19:280;259:258:139;2982:5:279;:::i;:::-;259:258:139;2859:57:279;2887:29;259:258:139;2887:29:279;259:258:139;;2887:29:279;2821:24;259:258:139;;;;;;;;;2470:67:279;2509:28;;259:258:139;2509:28:279;259:258:139;;;;2509:28:279;2400:60;2432:28;259:258:139;2432:28:279;259:258:139;;2432:28:279;259:258:139;;;;;;;:::i;:::-;5148:19:42;;;;;;259:258:139;;;3211:41:284;;:::i;:::-;259:258:139;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;259:258:139;3852:94:192;;259:258:139;3972:10:192;;;;;;259:258:139;3984:3:192;259:258:139;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;259:258:139;;;;4058:76:192;;4108:25;259:258:139;4058:76:192;;259:258:139;4058:76:192;;;;;;;;;;;;259:258:139;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;259:258:139;4239:12:192;;;;;;:::i;:::-;259:258:139;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;259:258:139;4239:70:192;;;;;;;259:258:139;;;;;;;4239:70:192;;;;;259:258:139;4239:70:192;;4277:4;259:258:139;4239:70:192;;259:258:139;;4058:76:192;259:258:139;;;;;;;4239:70:192;;;;;;;259:258:139;4239:70:192;;;3984:3;;259:258:139;3961:9:192;;4239:70;259:258:139;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;259:258:139;4161:50:192;259:258:139;;4058:76:192;259:258:139;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;259:258:139;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;259:258:139;3211:41:284;9818:5:280;3211:41:284;;;;;:::i;:::-;259:258:139;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;259:258:139;;;;;;;18723:98:280;18759:51;259:258:139;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;259:258:139:-;;;;;;;;;;;1036:5:242;259:258:139;;:::i;:::-;;;;;3211:41:284;;:::i;:::-;1036:5:242;;:::i;259:258:139:-;;;;;;;;;;;1788:15:242;259:258:139;;:::i;:::-;;;;;3211:41:284;;:::i;:::-;1788:15:242;;:::i;259:258:139:-;;;;;;;;;;;;;3091:13:277;259:258:139;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;259:258:139;-1:-1:-1;259:258:139;;;;;;-1:-1:-1;259:258:139;500:10:59;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3211:41:284;;:::i;:::-;259:258:139;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;500:10:59;259:258:139;3741:25:41;3737:66;;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;259:258:139;;;;2455:33:41;259:258:139;3737:66:41;259:258:139;3775:28:41;;;259:258:139;3775:28:41;259:258:139;;;;;;;3775:28:41;259:258:139;;;;875:6:243;259:258:139;;;:::i;:::-;27705:19:280;;;;259:258:139;3211:41:284;;:::i;:::-;875:6:243;;:::i;259:258:139:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;259:258:139;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;;24144:5:280;259:258:139;;:::i;:::-;;;27705:19:280;259:258:139;3211:41:284;;:::i;:::-;259:258:139;;;;;;;24041:14:280;24037:85;;259:258:139;24144:5:280;;;:::i;24037:85::-;24105:5;;;;;:::i;:::-;24037:85;;;;259:258:139;;;;;;;:::i;:::-;5148:19:42;;;;259:258:139;;3211:41:284;;;:::i;:::-;259:258:139;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;259:258:139;2776:90:192;;259:258:139;2892:10:192;;;;;;259:258:139;2904:3:192;2923:9;;;;;:::i;:::-;259:258:139;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;259:258:139;;;1328:43:8;259:258:139;1328:43:8;;;;259:258:139;1328:43:8;;259:258:139;1328:43:8;;;259:258:139;1328:43:8;259:258:139;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;259:258:139;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;259:258:139;;2881:9:192;;8938:146:8;9033:40;259:258:139;9033:40:8;259:258:139;;1328:43:8;259:258:139;9033:40:8;8942:68;259:258:139;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;259:258:139;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;259:258:139;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;259:258:139;3211:41:284;;:::i;:::-;1488:12:247;;:::i;:::-;259:258:139;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;259:258:139:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;259:258:139;;;;;;:::i;:::-;27705:19:280;;;259:258:139;3211:41:284;;:::i;:::-;1170:6:243;;:::i;259:258:139:-;;;;;;;;;;;765:5:244;259:258:139;;;3211:41:284;;:::i;:::-;765:5:244;;:::i;259:258:139:-;;;;;;;;;;;;;:::i;:::-;;;1129:12:247;259:258:139;3211:41:284;;:::i;1129:12:247:-;259:258:139;;;;19546:16:280;;;19542:53;;19609:10;19605:370;;259:258:139;;19989:31:280;259:258:139;;;;;;;;19989:31:280;259:258:139;19605:370:280;19652:8;259:258:139;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;259:258:139;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;259:258:139;19786:39:280;259:258:139;;;;;;19786:39:280;19542:53;19571:24;259:258:139;19571:24:280;259:258:139;;19571:24:280;259:258:139;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;3211:41:284;;:::i;:::-;259:258:139;;;;5455:21:280;;;5451:67;;259:258:139;;;-1:-1:-1;259:258:139;5555:12:280;259:258:139;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;5597:10:280;;5593:366;;259:258:139;;;5973:42:280;259:258:139;;;;;;;;;5973:42:280;;259:258:139;;;;;;;5593:366:280;259:258:139;;;5720:32:280;;;;;5716:108;;5842:19;;;259:258:139;;5973:42:280;5842:19;259:258:139;;;-1:-1:-1;259:258:139;5555:12:280;259:258:139;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;5593:366:280;;;;5716:108;259:258:139;;5761:63:280;;;259:258:139;;;;;5761:63:280;;259:258:139;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;259:258:139;5485:33:280;;259:258:139;5485:33:280;259:258:139;;;;;5485:33:280;259:258:139;;;;;;;;;;;;1284:37:248;;:::i;:::-;259:258:139;;;;;;;;;;;;;;;;;;3446:39:284;;:::i;:::-;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3732:15:277;259:258:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3211:41:284;;:::i;:::-;5148:19:42;259:258:139;;;;;;;4503:26:42;;;4499:64;;4464:19:41;259:258:139;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;500:10:59;259:258:139;1254:25:41;1250:140;;259:258:139;1250:140:41;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;259:258:139;;;;1343:36:41;259:258:139;;;;;;;;;;;;;;;;941:19:75;259:258:139;;;;;;;;;;;;;;;9818:5:280;259:258:139;;:::i;:::-;;;:::i;:::-;;3211:41:284;;;:::i;:::-;259:258:139;;;;;;;;;;;9707:14:280;9703:85;;259:258:139;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;259:258:139;;;;1232:6:244;259:258:139;;;:::i;:::-;27705:19:280;;;;259:258:139;3211:41:284;;:::i;:::-;1232:6:244;;:::i;259:258:139:-;;;;;;;;;;;;26654:8:280;259:258:139;;;;;;;;;;;;;;;;;;826:5:242;259:258:139;;:::i;:::-;;;;;3211:41:284;;:::i;:::-;826:5:242;;:::i;259:258:139:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;259:258:139;1793:19:59;259:258:139;635:65:55;:::i;259:258:139:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;259:258:139;1146:19:75;259:258:139;1146:53:75;;;1142:96;;259:258:139;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;259:258:139;1215:12:75;:::o;259:258:139:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;;259:258:139;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;259:258:139;500:10:59;;;259:258:139;500:10:59;259:258:139;500:10:59;;259:258:139;1359:340:59;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;259:258:139:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;259:258:139;;4533:21:280;;;4529:67;;259:258:139;4657:31:280;4606:19;:12;259:258:139;4606:19:280;259:258:139;;;-1:-1:-1;259:258:139;4606:12:280;259:258:139;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;259:258:139;4563:33:280;;4552:1;4563:33;259:258:139;4563:33:280;259:258:139;;4552:1:280;4563:33;259:258:139;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;25152:1242:280:-;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;259:258:139;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;;:::i;:::-;25558;;;;;:::i;:::-;259:258:139;;;;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;259:258:139;;;26163:33:280;259:258:139;25409:1:280;259:258:139;;;;;;26163:33:280;259:258:139;25462:9:280;;25689:455;25741:16;259:258:139;-1:-1:-1;259:258:139;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;259:258:139;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;259:258:139;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;4317:545:279:-;259:258:139;;;:::i;:::-;;;;;;4669:54:279;259:258:139;;;4520:321:279;;259:258:139;4552:95:279;259:258:139;;;;;;4745:14:279;259:258:139;;;;4412:53:279;259:258:139;;;;4818:4:279;259:258:139;;;;;4520:321:279;;;;;;:::i;:::-;259:258:139;4493:362:279;;4317:545;:::o;3640:170:41:-;259:258:139;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;500:10:59;259:258:139;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;259:258:139;3775:28:41;;-1:-1:-1;3775:28:41;259:258:139;3775:28:41;259:258:139;;;;;-1:-1:-1;3775:28:41;22659:524:280;22743:10;22739:389;;22659:524;259:258:139;;23143:33:280;259:258:139;;22752:1:280;259:258:139;;;;;;;23143:33:280;;22659:524::o;22739:389::-;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;259:258:139;;;22752:1:280;259:258:139;;;;;;;;;;;23044:8:280;;259:258:139;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;259:258:139;22933:46:280;;22752:1;22933:46;259:258:139;22933:46:280;259:258:139;;;;;;22752:1:280;22933:46;13849:1950;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;259:258:139;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;259:258:139;14325:13:280;;;;;;:::i;:::-;259:258:139;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;259:258:139;14472:10:280;14468:656;;14293:3;259:258:139;;;15143:25:280;259:258:139;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;259:258:139;;14270:9:280;;15183:500;259:258:139;;;15437:21:280;;;;;15433:85;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;259:258:139;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;259:258:139;;;;14602:27:280;;;;14598:74;;259:258:139;;;;;14746:10:280;;;;;14784:14;;259:258:139;;14784:14:280;;-1:-1:-1;259:258:139;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;259:258:139;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;259:258:139;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;259:258:139;14381:32:280;;14132:1;14381:32;259:258:139;14381:32:280;259:258:139;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;259:258:139:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;259:258:139;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;259:258:139;;;;;;21949:19:280;;;;;21945:76;;259:258:139;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;259:258:139;;;;-1:-1:-1;21977:44:280;21174:3;259:258:139;21206:13:280;;;;:::i;:::-;259:258:139;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;259:258:139;21344:10:280;21340:372;;21174:3;259:258:139;-1:-1:-1;21730:31:280;259:258:139;;;;;;;;;21730:31:280;259:258:139;21151:9:280;;21340:372;259:258:139;;;;;;21474:27:280;;;;21470:70;;259:258:139;;;-1:-1:-1;259:258:139;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;259:258:139;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;259:258:139;;;12409:21:280;;;;;12405:85;;12508:16;;259:258:139;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;;;;12171:472:280;;;;;;;12405:85;259:258:139;12439:51:280;;11116:1;12439:51;259:258:139;12439:51:280;259:258:139;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;259:258:139;11309:13:280;;;;;;:::i;:::-;259:258:139;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;259:258:139;11455:10:280;11451:656;;11277:3;259:258:139;;;;;;;;;12125:25:280;259:258:139;;;;12125:25:280;;259:258:139;11254:9:280;;11451:656;259:258:139;;;;11585:27:280;;;;11581:74;;259:258:139;;;;11729:10:280;;;;;11767:14;;259:258:139;11767:14:280;;259:258:139;-1:-1:-1;259:258:139;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;259:258:139;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;259:258:139;;;;;;11116:1:280;11873:46;11336:61;259:258:139;11365:32:280;;11116:1;11365:32;259:258:139;11365:32:280;259:258:139;;11116:1:280;11365:32;6693:851;;;;259:258:139;;;6808:21:280;;;6804:67;;6908:12;;:19;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;259:258:139;;;;;;7495:42:280;259:258:139;;;;;;;7495:42:280;;6693:851::o;6947:534::-;259:258:139;;;7238:32:280;;;;;7234:112;;7364:19;;;259:258:139;7495:42:280;7364:19;259:258:139;7364:19:280;259:258:139;;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;6947:534:280;;;7234:112;259:258:139;;7279:67:280;;;259:258:139;;;;7279:67:280;;;259:258:139;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;259:258:139;6838:33:280;;6827:1;6838:33;259:258:139;6838:33:280;259:258:139;;6827:1:280;6838:33;8105:628;;;259:258:139;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;259:258:139;;;8701:25:280;259:258:139;;;;;;;8701:25:280;;8105:628::o;8273:413::-;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;;;8437:21:280;;;;;8433:80;;259:258:139;;;;;;;;8701:25:280;259:258:139;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;259:258:139;;;-1:-1:-1;259:258:139;;;;;-1:-1:-1;259:258:139;;;-1:-1:-1;259:258:139;;;;-1:-1:-1;259:258:139;;;;;;;8531:131:280;;;;8201:61;259:258:139;8230:32:280;;8219:1;8230:32;259:258:139;8230:32:280;259:258:139;;8219:1:280;8230:32;259:258:139;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;259:258:139;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;259:258:139;1029:19:76;259:258:139;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;259:258:139;;;1676:74:76;;259:258:139;;;1676:74:76;;;259:258:139;1327:10:76;259:258:139;;;;1744:4:76;259:258:139;;;;;-1:-1:-1;1676:74:76;;259:258:139;;;;;;1676:74:76;;;;;;;259:258:139;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;259:258:139;2065:19:76;259:258:139;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;259:258:139;720:8:80;259:258:139;720:8:80;;259:258:139;;;;2115:1:76;2802:32;;:::o;2624:153::-;259:258:139;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;259:258:139;2361:10:76;259:258:139;;;;2771:4:76;259:258:139;;;;;-1:-1:-1;2682:95:76;;259:258:139;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;28229:252:280;259:258:139;;28229:252:280;;;;259:258:139;28229:252:280;259:258:139;;;;;28357:61:280;;;;;259:258:139;28357:61:280;;259:258:139;28357:61:280;;;259:258:139;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;259:258:139;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;259:258:139;;-1:-1:-1;28445:29:280;28357:61;259:258:139;28357:61:280;;259:258:139;28357:61:280;;;;;;259:258:139;28357:61:280;;;:::i;:::-;;;259:258:139;;;;;;;;;;;;;28357:61:280;259:258:139;28357:61:280;;259:258:139;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"3487200","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","MINTER_ROLE()":"848","__msgData()":"infinite","allowance(address,address)":"3255","approve(address,uint256)":"infinite","balanceOf(address)":"2773","batchBurnFrom(address[],uint256[])":"infinite","batchMint(address[],uint256[])":"infinite","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","decimals()":"2429","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"3005","increaseAllowance(address,uint256)":"infinite","init(string,string,uint8)":"infinite","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","name()":"infinite","nonces(address)":"2839","owner()":"2781","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address[],uint256[])":"1b9a7529","batchMint(address[],uint256[])":"68573107","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","increaseAllowance(address,uint256)":"39509351","init(string,string,uint8)":"f57b0182","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol\":\"ERC20MintBurnProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC20/preset/proxied/ERC20MintBurnProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MintBurnProxied} from \\\"./../../../../../token/ERC20/preset/proxied/ERC20MintBurnProxied.sol\\\";\\n\\ncontract ERC20MintBurnProxiedMock is ERC20MintBurnProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC20MintBurnProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xb0d19585f9909939dfbeb4101b1c37801cfe310d1ef17aae9d5dbec5a38764d3\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../../base/ERC20Base.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../../base/ERC20DetailedBase.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../../base/ERC20MetadataBase.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../../base/ERC20PermitBase.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../../base/ERC20SafeTransfersBase.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../../base/ERC20BatchTransfersBase.sol\\\";\\nimport {ERC20MintableBase} from \\\"./../../base/ERC20MintableBase.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./../../base/ERC20BurnableBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version).\\ncontract ERC20MintBurnProxied is\\n    ERC20Base,\\n    ERC20DetailedBase,\\n    ERC20PermitBase,\\n    ERC20MetadataBase,\\n    ERC20SafeTransfersBase,\\n    ERC20BatchTransfersBase,\\n    ERC20MintableBase,\\n    ERC20BurnableBase,\\n    AccessControlBase,\\n    InterfaceDetection,\\n    TokenRecoveryBase,\\n    ContractOwnershipBase,\\n    ForwarderRegistryContext\\n{\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC20Storage.init();\\n        ERC20Storage.initERC20BatchTransfers();\\n        ERC20Storage.initERC20SafeTransfers();\\n        ERC20Storage.initERC20Mintable();\\n        ERC20Storage.initERC20Burnable();\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n        ERC20MetadataStorage.init();\\n        ERC20PermitStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6f2df00b1506c3e14920cd785b68d45233c7b4c0366f9fa37de01fe441cda809\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol":{"ERC721ReceiverMock":{"abi":[{"inputs":[{"internalType":"bool","name":"accept721","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"WrongToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC721Received","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","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":{"kind":"dev","methods":{"onERC721Received(address,address,uint256,bytes)":{"details":"reverts if the sender is not the supported ERC721 contract.","params":{"data":"Optional additional data with no specified format.","from":"The previous token owner.","operator":"The initiator of the safe transfer.","tokenId":"The token identifier."},"returns":{"_0":"`bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` (`0x150b7a02`) to accept, any other value to refuse."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC721 Receiver Mock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60c0346100e057601f61056b38819003918201601f19168301916001600160401b038311848410176100e55780849260409485528339810103126100e05780519081151582036100e05760200151906001600160a01b03821682036100e057630a85bd0160e11b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f5150ac3a4b241a2c278355461ba58be318ccda0e5ed270182c282b153445acb3805460ff1916600117905560805260a05260405161046f90816100fc82396080518161025b015260a051816102330152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101a75763150b7a021461003257600080fd5b346101735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101735760043573ffffffffffffffffffffffffffffffffffffffff811681036101735760243573ffffffffffffffffffffffffffffffffffffffff81168103610173576064359067ffffffffffffffff821161017357366023830112156101735781600401359267ffffffffffffffff841161017857604051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8801160116830183811067ffffffffffffffff821117610178576040528483523660248686010111610173576000602086819760246101499801838801378501015260443591610217565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610173576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101735761020d60209161038a565b6040519015158152f35b919093929373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610360577f0000000000000000000000000000000000000000000000000000000000000000156103575773ffffffffffffffffffffffffffffffffffffffff90816040519416845216602083015260408201526080606082015282519283608083015260005b84811061034157505060a0817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f866000857fa05d90f300156ad1b545bc5d8197024456f21d22a708f5af04dd293e3d60525198998601015201168101030190a17f150b7a020000000000000000000000000000000000000000000000000000000090565b80602080928401015160a08286010152016102bb565b50600093505050565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610433577f01ffc9a700000000000000000000000000000000000000000000000000000000811461042d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220b38a7dc296607821de534a2c89ae604ea29542080e9b7b33a798a773192f1b0764736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x1F PUSH2 0x56B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0xE5 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0xE0 JUMPI DUP1 MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xE0 JUMPI PUSH1 0x20 ADD MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0xE0 JUMPI PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x5150AC3A4B241A2C278355461BA58BE318CCDA0E5ED270182C282B153445ACB3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x46F SWAP1 DUP2 PUSH2 0xFC DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x25B ADD MSTORE PUSH1 0xA0 MLOAD DUP2 PUSH2 0x233 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A7 JUMPI PUSH4 0x150B7A02 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x173 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x173 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x178 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP9 ADD AND ADD AND DUP4 ADD DUP4 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x178 JUMPI PUSH1 0x40 MSTORE DUP5 DUP4 MSTORE CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x173 JUMPI PUSH1 0x0 PUSH1 0x20 DUP7 DUP2 SWAP8 PUSH1 0x24 PUSH2 0x149 SWAP9 ADD DUP4 DUP9 ADD CALLDATACOPY DUP6 ADD ADD MSTORE PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x217 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH2 0x20D PUSH1 0x20 SWAP2 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 SWAP4 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x360 JUMPI PUSH32 0x0 ISZERO PUSH2 0x357 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH1 0x40 MLOAD SWAP5 AND DUP5 MSTORE AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP3 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x341 JUMPI POP POP PUSH1 0xA0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x0 DUP6 PUSH32 0xA05D90F300156AD1B545BC5D8197024456F21D22A708F5AF04DD293E3D605251 SWAP9 SWAP10 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0xA0 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BB JUMP JUMPDEST POP PUSH1 0x0 SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x433 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x42D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB3 DUP11 PUSH30 0xC296607821DE534A2C89AE604EA29542080E9B7B33A798A773192F1B0764 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"336:1055:140:-:0;;;;;;;;;;;;;-1:-1:-1;;336:1055:140;;;;-1:-1:-1;;;;;336:1055:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;336:1055:140;;;;;;-1:-1:-1;;;;500:10:59;336:1055:140;;500:10:59;;;;-1:-1:-1;;500:10:59;443:1;500:10;;;671:23:140;;704:33;;336:1055;;;;;;;;671:23;336:1055;;;;;704:33;336:1055;;;;;;;-1:-1:-1;336:1055:140;;;;;;-1:-1:-1;336:1055:140;;;;;-1:-1:-1;336:1055:140"},"deployedBytecode":{"functionDebugData":{"fun_onERC721Received":{"entryPoint":535,"id":17261,"parameterSlots":4,"returnSlots":1},"fun_supportsInterface":{"entryPoint":906,"id":11667,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"17189":[{"length":32,"start":603}],"17191":[{"length":32,"start":563}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101a75763150b7a021461003257600080fd5b346101735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101735760043573ffffffffffffffffffffffffffffffffffffffff811681036101735760243573ffffffffffffffffffffffffffffffffffffffff81168103610173576064359067ffffffffffffffff821161017357366023830112156101735781600401359267ffffffffffffffff841161017857604051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8801160116830183811067ffffffffffffffff821117610178576040528483523660248686010111610173576000602086819760246101499801838801378501015260443591610217565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610173576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101735761020d60209161038a565b6040519015158152f35b919093929373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610360577f0000000000000000000000000000000000000000000000000000000000000000156103575773ffffffffffffffffffffffffffffffffffffffff90816040519416845216602083015260408201526080606082015282519283608083015260005b84811061034157505060a0817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f866000857fa05d90f300156ad1b545bc5d8197024456f21d22a708f5af04dd293e3d60525198998601015201168101030190a17f150b7a020000000000000000000000000000000000000000000000000000000090565b80602080928401015160a08286010152016102bb565b50600093505050565b7fa0f3feea0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610433577f01ffc9a700000000000000000000000000000000000000000000000000000000811461042d576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b5060009056fea2646970667358221220b38a7dc296607821de534a2c89ae604ea29542080e9b7b33a798a773192f1b0764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A7 JUMPI PUSH4 0x150B7A02 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x173 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x173 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x178 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x3F DUP2 PUSH1 0x1F DUP9 ADD AND ADD AND DUP4 ADD DUP4 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x178 JUMPI PUSH1 0x40 MSTORE DUP5 DUP4 MSTORE CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x173 JUMPI PUSH1 0x0 PUSH1 0x20 DUP7 DUP2 SWAP8 PUSH1 0x24 PUSH2 0x149 SWAP9 ADD DUP4 DUP9 ADD CALLDATACOPY DUP6 ADD ADD MSTORE PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0x217 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x173 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x173 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x173 JUMPI PUSH2 0x20D PUSH1 0x20 SWAP2 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST SWAP2 SWAP1 SWAP4 SWAP3 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x360 JUMPI PUSH32 0x0 ISZERO PUSH2 0x357 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 PUSH1 0x40 MLOAD SWAP5 AND DUP5 MSTORE AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x60 DUP3 ADD MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x341 JUMPI POP POP PUSH1 0xA0 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 PUSH1 0x0 DUP6 PUSH32 0xA05D90F300156AD1B545BC5D8197024456F21D22A708F5AF04DD293E3D605251 SWAP9 SWAP10 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0xA0 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BB JUMP JUMPDEST POP PUSH1 0x0 SWAP4 POP POP POP JUMP JUMPDEST PUSH32 0xA0F3FEEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x433 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x42D JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB3 DUP11 PUSH30 0xC296607821DE534A2C89AE604EA29542080E9B7B33A798A773192F1B0764 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"336:1055:140:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;336:1055:140;635:65:55;;:::i;:::-;336:1055:140;;;;;;;;988:401;;;;;;336:1055;1151:18;336:1055;1137:10;:32;1133:57;;1204:11;;;;336:1055;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1236:45;336:1055;;;;;;;;;;1236:45;;;;1983:41:327;1295:36:140;:::o;336:1055::-;;;;;;;;;;;;;;;;;;1200:183;-1:-1:-1;336:1055:140;;-1:-1:-1;;;1362:10:140:o;1133:57::-;1178:12;336:1055;1178:12;;336:1055;1178:12;1359:340:59;336:1055:140;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;336:1055:140;500:10:59;336:1055:140;500:10:59;;;;336:1055:140;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;336:1055:140;1528:12:59;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"227000","executionCost":"infinite","totalCost":"infinite"},"external":{"onERC721Received(address,address,uint256,bytes)":"infinite","supportsInterface(bytes4)":"2433"}},"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"accept721\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ERC721Received\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"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\":{\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"reverts if the sender is not the supported ERC721 contract.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous token owner.\",\"operator\":\"The initiator of the safe transfer.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC721 Receiver Mock\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of an ERC721 token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol\":\"ERC721ReceiverMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/ERC721ReceiverMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC721Receiver} from \\\"./../../../token/ERC721/interfaces/IERC721Receiver.sol\\\";\\nimport {ERC721Storage} from \\\"./../../../token/ERC721/libraries/ERC721Storage.sol\\\";\\nimport {ERC721Receiver} from \\\"./../../../token/ERC721/ERC721Receiver.sol\\\";\\n\\n/// @title ERC721 Receiver Mock\\ncontract ERC721ReceiverMock is ERC721Receiver {\\n    bool internal immutable _ACCEPT_721;\\n    address internal immutable _TOKEN_ADDRESS_721;\\n\\n    event ERC721Received(address operator, address from, uint256 tokenId, bytes data);\\n\\n    error WrongToken();\\n\\n    constructor(bool accept721, address tokenAddress) ERC721Receiver() {\\n        _ACCEPT_721 = accept721;\\n        _TOKEN_ADDRESS_721 = tokenAddress;\\n    }\\n\\n    //=================================================== ERC721Receiver ====================================================//\\n\\n    /// @inheritdoc IERC721Receiver\\n    /// @dev reverts if the sender is not the supported ERC721 contract.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public virtual override returns (bytes4) {\\n        if (msg.sender != _TOKEN_ADDRESS_721) revert WrongToken();\\n        if (_ACCEPT_721) {\\n            emit ERC721Received(operator, from, tokenId, data);\\n            return ERC721Storage.ERC721_RECEIVED;\\n        } else {\\n            return 0x0;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x231d30e2e64ff2550c370324ffea203d603c9599132dc3f90ed8fc54e8dfefd9\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Receiver} from \\\"./interfaces/IERC721Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Receiver is IERC721Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0x63a2d3363c5e74e4dbc670fcf947ffdfbe12c6059a9300432a3c46e0eb9c1235\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"onERC721Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of an ERC721 token."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol":{"ERC721WithoutOperatorFiltererMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a0346101ad57601f61283538819003918201601f19168301916001600160401b038311848410176101b2578084926020946040528339810103126101ad57516001600160a01b03811681036101ad577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec78054600160ff19918216811790925563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f805490911690911790553361014e575b6307f5828d60e41b600052806020526040600020600160ff19825416179055638e773e1360e01b6000526020526040600020600160ff1982541617905560805260405161266c90816101c982396080518181816116cc01528181611bd9015281816121aa01526123650152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100e1565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714611a04578063081812fc14611989578063095ea7b31461173157806323b872dd146116f05780632b4c9f16146116815780632f2ff15d146114f557806331e66e1e1461147257806340c10f19146113e257806342842e0e146113795780634684d7e9146110ee578063572b6c05146110a35780636352211e14610fee57806370a0823114610f245780638832e6e314610c5c5780638bb9c5bf14610aed5780638da5cb5b14610a7c57806391d14854146109e4578063a22cb465146108b9578063b88d4fde146107fe578063d5391393146107a5578063d547741f1461061c578063e985e9c514610568578063f2fde38b146104475763f3993d111461012457600080fd5b346104425760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761015b611a6a565b610163611a8d565b9060443567ffffffffffffffff811161044257610184903690600401611b22565b91907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09273ffffffffffffffffffffffffffffffffffffffff6101c5612193565b9516918215610418576101db86858794976122ce565b159373ffffffffffffffffffffffffffffffffffffffff169160005b868110156103ba5760008160051b8401359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff8116801561038e57870361035e578693929188918a61027f575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197528760205283604082205580a4016101f7565b9092939450740100000000000000000000000000000000000000009150161580156102fd575b6102b457908686939238610244565b6064918673ffffffffffffffffffffffffffffffffffffffff8c7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8b1614156102a5565b50604491867f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b868585818114158061040f575b6103cd57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156103c7565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761047e611a6a565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906104a8612193565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361053b575073ffffffffffffffffffffffffffffffffffffffff16918282036104ec57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761059f611a6a565b73ffffffffffffffffffffffffffffffffffffffff6105bc611a8d565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257600435610656611a8d565b61065e612193565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361053b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661071057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346104425760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610835611a6a565b61083d611a8d565b60443560643567ffffffffffffffff811161044257610860903690600401611b53565b9290937fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361089a848484610893612193565b8099611dd2565b823b6108a257005b6108b7956108b1913691611c21565b93612494565b005b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576108f0611a6a565b602435908115158092036104425773ffffffffffffffffffffffffffffffffffffffff8061091c612193565b169116918183146109b65760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610a1b611a8d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610b48612193565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610c145760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016107a0565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346104425760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610c93611a6a565b6024359060443567ffffffffffffffff811161044257610cb7903690600401611b53565b9091610ceb7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b90611ff7565b610d2b8482610d257fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c096610d1d612193565b963691611c21565b956120b9565b803b610d3357005b73ffffffffffffffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff604051927f150b7a0200000000000000000000000000000000000000000000000000000000845216600483015260006024830152836044830152608060648301528181519182608483015260005b838110610f0c57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610f0057600091610e7e575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603610e4e57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011610ef8575b81610e9760209383611b81565b81010312610ef45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ef157507fffffffff00000000000000000000000000000000000000000000000000000000610e02565b80fd5b5080fd5b3d9150610e8a565b6040513d6000823e3d90fd5b602082820181015160a4878401015285935001610dad565b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610f5b611a6a565b73ffffffffffffffffffffffffffffffffffffffff811615610fc45773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561107557602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206110e46110df611a6a565b611bc2565b6040519015158152f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257611125611a6a565b60243567ffffffffffffffff811161044257611145903690600401611b22565b916111727fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09167ffffffffffffffff841161134a578360051b604051946111b86020830187611b81565b8552602085019082019136831161044257905b82821061133a5750505073ffffffffffffffffffffffffffffffffffffffff169081156113105782519260005b848110611239575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b81518110156112e15760208160051b83010151806000528360205273ffffffffffffffffffffffffffffffffffffffff604060002054166112b457908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016111f8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016111cb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346104425761138736611ab0565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0916113be8282866113b7612193565b8097611dd2565b803b6113c657005b6108b793604051936113d9602086611b81565b60008552612494565b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576108b761141c611a6a565b6114487fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06120b9565b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760406114ab61234e565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760043561152f611a8d565b611537612193565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361053b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156115ea57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016107a0565b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610442576108b761170136611ab0565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061172b612193565b90611dd2565b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257611768611a6a565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090611796612193565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561195b5773ffffffffffffffffffffffffffffffffffffffff169383851461192d576117ec8185856122ce565b156118e157508361185057740100000000000000000000000000000000000000001661183c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583611813565b907401000000000000000000000000000000000000000082178092036118cd575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055611815565b846000526020526040600020558380611871565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206119e66004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611d35565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610442576110e4602091611c86565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361044257565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361044257565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126104425760043573ffffffffffffffffffffffffffffffffffffffff81168103610442579060243573ffffffffffffffffffffffffffffffffffffffff81168103610442579060443590565b9181601f840112156104425782359167ffffffffffffffff8311610442576020808501948460051b01011161044257565b9181601f840112156104425782359167ffffffffffffffff8311610442576020838186019501011161044257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134a57604052565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611c1a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b92919267ffffffffffffffff821161134a5760405191611c69601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184611b81565b829481845281830111610442578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611d2f577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611d29576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615611da457740100000000000000000000000000000000000000001615611c1a576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff1692831561041857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611fc95773ffffffffffffffffffffffffffffffffffffffff8116809503611f975782611e4691856122ce565b15611edc575b5050836000528060205282604060002055828203611e8d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538611e65565b7401000000000000000000000000000000000000000016158015611f51575b611f055780611e4c565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611efb565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156120515750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561131057826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661214d57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020910312610442575180151581036104425790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156122bf5732331480156122c4575b6122bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561221e575b5061221b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610f0057600091612290575b5038612211565b6122b2915060203d6020116122b8575b6122aa8183611b81565b81019061217b565b38612289565b503d6122a0565b503390565b50601836106121da565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156122f9575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806122f3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561248257323314801561248a575b612482578033149081156123e1575b506123b0576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116104425760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610f0057600091612463575b50386123a4565b61247c915060203d6020116122b8576122aa8183611b81565b3861245c565b506000903690565b5060183610612395565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061261e57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610f00576000916125a3575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603610e4e575050565b6020813d602011612616575b816125bc60209383611b81565b81010312610ef45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ef157507fffffffff00000000000000000000000000000000000000000000000000000000612555565b3d91506125af565b602082820181015160a487840101528593500161250056fea2646970667358221220f461d572c606d9ff7d8c392fbf1f85d9445edd8c4bf6e2c6dfd18efe8442ff5664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x1AD JUMPI PUSH1 0x1F PUSH2 0x2835 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x1B2 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x1AD JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x1AD JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE CALLER PUSH2 0x14E JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x266C SWAP1 DUP2 PUSH2 0x1C9 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x16CC ADD MSTORE DUP2 DUP2 PUSH2 0x1BD9 ADD MSTORE DUP2 DUP2 PUSH2 0x21AA ADD MSTORE PUSH2 0x2365 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xE1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A04 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1989 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1731 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x16F0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1681 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x14F5 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1472 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x13E2 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1379 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x10EE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x10A3 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0xFEE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xF24 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0xC5C JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xAED JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xA7C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x9E4 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x8B9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x7A5 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x61C JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x447 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x15B PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x163 PUSH2 0x1A8D JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x184 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1C5 PUSH2 0x2193 JUMP JUMPDEST SWAP6 AND SWAP2 DUP3 ISZERO PUSH2 0x418 JUMPI PUSH2 0x1DB DUP7 DUP6 DUP8 SWAP5 SWAP8 PUSH2 0x22CE JUMP JUMPDEST ISZERO SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3BA JUMPI PUSH1 0x0 DUP2 PUSH1 0x5 SHL DUP5 ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x38E JUMPI DUP8 SUB PUSH2 0x35E JUMPI DUP7 SWAP4 SWAP3 SWAP2 DUP9 SWAP2 DUP11 PUSH2 0x27F JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE DUP8 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x1F7 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x2FD JUMPI JUMPDEST PUSH2 0x2B4 JUMPI SWAP1 DUP7 DUP7 SWAP4 SWAP3 CODESIZE PUSH2 0x244 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND EQ ISZERO PUSH2 0x2A5 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP7 DUP6 DUP6 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x40F JUMPI JUMPDEST PUSH2 0x3CD JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x3C7 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x47E PUSH2 0x1A6A JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x4A8 PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4EC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x59F PUSH2 0x1A6A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x5BC PUSH2 0x1A8D JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x656 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x65E PUSH2 0x2193 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x710 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x835 PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x83D PUSH2 0x1A8D JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x860 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B53 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x89A DUP5 DUP5 DUP5 PUSH2 0x893 PUSH2 0x2193 JUMP JUMPDEST DUP1 SWAP10 PUSH2 0x1DD2 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x8A2 JUMPI STOP JUMPDEST PUSH2 0x8B7 SWAP6 PUSH2 0x8B1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1C21 JUMP JUMPDEST SWAP4 PUSH2 0x2494 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x8F0 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x442 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x91C PUSH2 0x2193 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x9B6 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xA1B PUSH2 0x1A8D JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xB48 PUSH2 0x2193 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xC14 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x7A0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xC93 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0xCB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B53 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xCEB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH2 0x1FF7 JUMP JUMPDEST PUSH2 0xD2B DUP5 DUP3 PUSH2 0xD25 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP7 PUSH2 0xD1D PUSH2 0x2193 JUMP JUMPDEST SWAP7 CALLDATASIZE SWAP2 PUSH2 0x1C21 JUMP JUMPDEST SWAP6 PUSH2 0x20B9 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0xD33 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xF0C JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xE4E JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEF8 JUMPI JUMPDEST DUP2 PUSH2 0xE97 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEF4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEF1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xE02 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xE8A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0xDAD JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xF5B PUSH2 0x1A6A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xFC4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x1075 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH2 0x10E4 PUSH2 0x10DF PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x1BC2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x1125 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x1145 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP2 PUSH2 0x1172 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x134A JUMPI DUP4 PUSH1 0x5 SHL PUSH1 0x40 MLOAD SWAP5 PUSH2 0x11B8 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x1B81 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x442 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x133A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1310 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1239 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x12B4 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x11F8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11CB JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH2 0x1387 CALLDATASIZE PUSH2 0x1AB0 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x13BE DUP3 DUP3 DUP7 PUSH2 0x13B7 PUSH2 0x2193 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x1DD2 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x13C6 JUMPI STOP JUMPDEST PUSH2 0x8B7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x13D9 PUSH1 0x20 DUP7 PUSH2 0x1B81 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x2494 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x8B7 PUSH2 0x141C PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x1448 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x20B9 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x40 PUSH2 0x14AB PUSH2 0x234E JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x152F PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x1537 PUSH2 0x2193 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x15EA JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x7A0 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH2 0x8B7 PUSH2 0x1701 CALLDATASIZE PUSH2 0x1AB0 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x172B PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH2 0x1DD2 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x1768 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x1796 PUSH2 0x2193 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x195B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x192D JUMPI PUSH2 0x17EC DUP2 DUP6 DUP6 PUSH2 0x22CE JUMP JUMPDEST ISZERO PUSH2 0x18E1 JUMPI POP DUP4 PUSH2 0x1850 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x183C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x1813 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x18CD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x1815 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x1871 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH2 0x19E6 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1D35 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI PUSH2 0x10E4 PUSH1 0x20 SWAP2 PUSH2 0x1C86 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x442 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x442 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x442 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x442 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x442 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x442 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x442 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x442 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x134A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1C1A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x134A JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1C69 PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD DUP5 PUSH2 0x1B81 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x442 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1D2F JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1D29 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1DA4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x1C1A JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x418 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1FC9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1F97 JUMPI DUP3 PUSH2 0x1E46 SWAP2 DUP6 PUSH2 0x22CE JUMP JUMPDEST ISZERO PUSH2 0x1EDC JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x1E8D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x1E65 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1F51 JUMPI JUMPDEST PUSH2 0x1F05 JUMPI DUP1 PUSH2 0x1E4C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1EFB JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2051 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1310 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x214D JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x442 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x442 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x22BF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x22C4 JUMPI JUMPDEST PUSH2 0x22BF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x221E JUMPI JUMPDEST POP PUSH2 0x221B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2290 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2211 JUMP JUMPDEST PUSH2 0x22B2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x22B8 JUMPI JUMPDEST PUSH2 0x22AA DUP2 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x217B JUMP JUMPDEST CODESIZE PUSH2 0x2289 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x22A0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x21DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x22F9 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x22F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2482 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x248A JUMPI JUMPDEST PUSH2 0x2482 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x23E1 JUMPI JUMPDEST POP PUSH2 0x23B0 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x442 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2463 JUMPI JUMPDEST POP CODESIZE PUSH2 0x23A4 JUMP JUMPDEST PUSH2 0x247C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x22B8 JUMPI PUSH2 0x22AA DUP2 DUP4 PUSH2 0x1B81 JUMP JUMPDEST CODESIZE PUSH2 0x245C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2395 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x261E JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x25A3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xE4E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2616 JUMPI JUMPDEST DUP2 PUSH2 0x25BC PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEF4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEF1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2555 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x25AF JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2500 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL PUSH2 0xD572 0xC6 MOD 0xD9 SELFDESTRUCT PUSH30 0x8C392FBF1F85D9445EDD8C4BF6E2C6DFD18EFE8442FF5664736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"698:813:141:-:0;;;;;;;;;;;;;-1:-1:-1;;698:813:141;;;;-1:-1:-1;;;;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;698:813:141;;;;;;;;500:10:59;;;;;;2684:4:327;-1:-1:-1;;500:10:59;;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;;888::141;1645:152:42;;-1:-1:-1;1863:25:42;;;-1:-1:-1;500:10:59;;698:813:141;500:10:59;698:813:141;-1:-1:-1;500:10:59;2684:4:327;500:10:59;;;;;;;;3399:33:327;;;-1:-1:-1;500:10:59;698:813:141;500:10:59;698:813:141;-1:-1:-1;500:10:59;2684:4:327;500:10:59;;;;;;;;745:39:76;;698:813:141;;;;;;;;745:39:76;698:813:141;;;;;;;;;;;;;;;;;;;;;1645:152:42;698:813:141;;;-1:-1:-1;;;;;;698:813:141;888:10;698:813;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;698:813:141;-1:-1:-1;698:813:141;;;;;;-1:-1:-1;698:813:141;;;;;-1:-1:-1;698:813:141"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6797,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":6832,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":6946,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_bytes":{"entryPoint":7201,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":8571,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6995,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6762,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":7041,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":9364,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":8183,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":7477,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":8910,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":7106,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":8377,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":9038,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":8595,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7302,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":7634,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5836},{"length":32,"start":7129},{"length":32,"start":8618},{"length":32,"start":9061}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714611a04578063081812fc14611989578063095ea7b31461173157806323b872dd146116f05780632b4c9f16146116815780632f2ff15d146114f557806331e66e1e1461147257806340c10f19146113e257806342842e0e146113795780634684d7e9146110ee578063572b6c05146110a35780636352211e14610fee57806370a0823114610f245780638832e6e314610c5c5780638bb9c5bf14610aed5780638da5cb5b14610a7c57806391d14854146109e4578063a22cb465146108b9578063b88d4fde146107fe578063d5391393146107a5578063d547741f1461061c578063e985e9c514610568578063f2fde38b146104475763f3993d111461012457600080fd5b346104425760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761015b611a6a565b610163611a8d565b9060443567ffffffffffffffff811161044257610184903690600401611b22565b91907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09273ffffffffffffffffffffffffffffffffffffffff6101c5612193565b9516918215610418576101db86858794976122ce565b159373ffffffffffffffffffffffffffffffffffffffff169160005b868110156103ba5760008160051b8401359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff8116801561038e57870361035e578693929188918a61027f575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197528760205283604082205580a4016101f7565b9092939450740100000000000000000000000000000000000000009150161580156102fd575b6102b457908686939238610244565b6064918673ffffffffffffffffffffffffffffffffffffffff8c7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8b1614156102a5565b50604491867f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b868585818114158061040f575b6103cd57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156103c7565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761047e611a6a565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906104a8612193565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361053b575073ffffffffffffffffffffffffffffffffffffffff16918282036104ec57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425761059f611a6a565b73ffffffffffffffffffffffffffffffffffffffff6105bc611a8d565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257600435610656611a8d565b61065e612193565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361053b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661071057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346104425760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610835611a6a565b61083d611a8d565b60443560643567ffffffffffffffff811161044257610860903690600401611b53565b9290937fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361089a848484610893612193565b8099611dd2565b823b6108a257005b6108b7956108b1913691611c21565b93612494565b005b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576108f0611a6a565b602435908115158092036104425773ffffffffffffffffffffffffffffffffffffffff8061091c612193565b169116918183146109b65760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610a1b611a8d565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610b48612193565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610c145760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016107a0565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346104425760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610c93611a6a565b6024359060443567ffffffffffffffff811161044257610cb7903690600401611b53565b9091610ceb7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b90611ff7565b610d2b8482610d257fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c096610d1d612193565b963691611c21565b956120b9565b803b610d3357005b73ffffffffffffffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff604051927f150b7a0200000000000000000000000000000000000000000000000000000000845216600483015260006024830152836044830152608060648301528181519182608483015260005b838110610f0c57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610f0057600091610e7e575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603610e4e57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011610ef8575b81610e9760209383611b81565b81010312610ef45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ef157507fffffffff00000000000000000000000000000000000000000000000000000000610e02565b80fd5b5080fd5b3d9150610e8a565b6040513d6000823e3d90fd5b602082820181015160a4878401015285935001610dad565b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257610f5b611a6a565b73ffffffffffffffffffffffffffffffffffffffff811615610fc45773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561107557602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206110e46110df611a6a565b611bc2565b6040519015158152f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257611125611a6a565b60243567ffffffffffffffff811161044257611145903690600401611b22565b916111727fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09167ffffffffffffffff841161134a578360051b604051946111b86020830187611b81565b8552602085019082019136831161044257905b82821061133a5750505073ffffffffffffffffffffffffffffffffffffffff169081156113105782519260005b848110611239575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b81518110156112e15760208160051b83010151806000528360205273ffffffffffffffffffffffffffffffffffffffff604060002054166112b457908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016111f8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016111cb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346104425761138736611ab0565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0916113be8282866113b7612193565b8097611dd2565b803b6113c657005b6108b793604051936113d9602086611b81565b60008552612494565b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576108b761141c611a6a565b6114487fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610ce5612193565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06120b9565b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760406114ab61234e565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760043561152f611a8d565b611537612193565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361053b57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156115ea57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016107a0565b346104425760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610442576108b761170136611ab0565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061172b612193565b90611dd2565b346104425760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044257611768611a6a565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090611796612193565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561195b5773ffffffffffffffffffffffffffffffffffffffff169383851461192d576117ec8185856122ce565b156118e157508361185057740100000000000000000000000000000000000000001661183c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583611813565b907401000000000000000000000000000000000000000082178092036118cd575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055611815565b846000526020526040600020558380611871565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104425760206119e66004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611d35565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346104425760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610442576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610442576110e4602091611c86565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361044257565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361044257565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126104425760043573ffffffffffffffffffffffffffffffffffffffff81168103610442579060243573ffffffffffffffffffffffffffffffffffffffff81168103610442579060443590565b9181601f840112156104425782359167ffffffffffffffff8311610442576020808501948460051b01011161044257565b9181601f840112156104425782359167ffffffffffffffff8311610442576020838186019501011161044257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134a57604052565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611c1a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b92919267ffffffffffffffff821161134a5760405191611c69601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184611b81565b829481845281830111610442578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611d2f577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611d29576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615611da457740100000000000000000000000000000000000000001615611c1a576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff1692831561041857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611fc95773ffffffffffffffffffffffffffffffffffffffff8116809503611f975782611e4691856122ce565b15611edc575b5050836000528060205282604060002055828203611e8d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538611e65565b7401000000000000000000000000000000000000000016158015611f51575b611f055780611e4c565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611efb565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156120515750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561131057826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661214d57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020910312610442575180151581036104425790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156122bf5732331480156122c4575b6122bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561221e575b5061221b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610f0057600091612290575b5038612211565b6122b2915060203d6020116122b8575b6122aa8183611b81565b81019061217b565b38612289565b503d6122a0565b503390565b50601836106121da565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156122f9575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806122f3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561248257323314801561248a575b612482578033149081156123e1575b506123b0576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116104425760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610f0057600091612463575b50386123a4565b61247c915060203d6020116122b8576122aa8183611b81565b3861245c565b506000903690565b5060183610612395565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061261e57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610f00576000916125a3575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603610e4e575050565b6020813d602011612616575b816125bc60209383611b81565b81010312610ef45751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ef157507fffffffff00000000000000000000000000000000000000000000000000000000612555565b3d91506125af565b602082820181015160a487840101528593500161250056fea2646970667358221220f461d572c606d9ff7d8c392fbf1f85d9445edd8c4bf6e2c6dfd18efe8442ff5664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1A04 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1989 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1731 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x16F0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1681 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x14F5 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x1472 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x13E2 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1379 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x10EE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x10A3 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0xFEE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xF24 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0xC5C JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xAED JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xA7C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x9E4 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x8B9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x7A5 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x61C JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x447 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x15B PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x163 PUSH2 0x1A8D JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x184 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1C5 PUSH2 0x2193 JUMP JUMPDEST SWAP6 AND SWAP2 DUP3 ISZERO PUSH2 0x418 JUMPI PUSH2 0x1DB DUP7 DUP6 DUP8 SWAP5 SWAP8 PUSH2 0x22CE JUMP JUMPDEST ISZERO SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3BA JUMPI PUSH1 0x0 DUP2 PUSH1 0x5 SHL DUP5 ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x38E JUMPI DUP8 SUB PUSH2 0x35E JUMPI DUP7 SWAP4 SWAP3 SWAP2 DUP9 SWAP2 DUP11 PUSH2 0x27F JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE DUP8 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x1F7 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x2FD JUMPI JUMPDEST PUSH2 0x2B4 JUMPI SWAP1 DUP7 DUP7 SWAP4 SWAP3 CODESIZE PUSH2 0x244 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND EQ ISZERO PUSH2 0x2A5 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP7 DUP6 DUP6 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x40F JUMPI JUMPDEST PUSH2 0x3CD JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x3C7 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x47E PUSH2 0x1A6A JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x4A8 PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4EC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x59F PUSH2 0x1A6A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x5BC PUSH2 0x1A8D JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x656 PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x65E PUSH2 0x2193 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x710 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x835 PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x83D PUSH2 0x1A8D JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x860 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B53 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x89A DUP5 DUP5 DUP5 PUSH2 0x893 PUSH2 0x2193 JUMP JUMPDEST DUP1 SWAP10 PUSH2 0x1DD2 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x8A2 JUMPI STOP JUMPDEST PUSH2 0x8B7 SWAP6 PUSH2 0x8B1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1C21 JUMP JUMPDEST SWAP4 PUSH2 0x2494 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x8F0 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x442 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x91C PUSH2 0x2193 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x9B6 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xA1B PUSH2 0x1A8D JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xB48 PUSH2 0x2193 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xC14 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x7A0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xC93 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0xCB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B53 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xCEB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH2 0x1FF7 JUMP JUMPDEST PUSH2 0xD2B DUP5 DUP3 PUSH2 0xD25 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP7 PUSH2 0xD1D PUSH2 0x2193 JUMP JUMPDEST SWAP7 CALLDATASIZE SWAP2 PUSH2 0x1C21 JUMP JUMPDEST SWAP6 PUSH2 0x20B9 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0xD33 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xF0C JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xE4E JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEF8 JUMPI JUMPDEST DUP2 PUSH2 0xE97 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEF4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEF1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0xE02 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xE8A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0xDAD JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0xF5B PUSH2 0x1A6A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xFC4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x1075 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH2 0x10E4 PUSH2 0x10DF PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x1BC2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x1125 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x442 JUMPI PUSH2 0x1145 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1B22 JUMP JUMPDEST SWAP2 PUSH2 0x1172 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x134A JUMPI DUP4 PUSH1 0x5 SHL PUSH1 0x40 MLOAD SWAP5 PUSH2 0x11B8 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x1B81 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x442 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x133A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1310 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1239 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x12B4 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x11F8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11CB JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH2 0x1387 CALLDATASIZE PUSH2 0x1AB0 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x13BE DUP3 DUP3 DUP7 PUSH2 0x13B7 PUSH2 0x2193 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x1DD2 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x13C6 JUMPI STOP JUMPDEST PUSH2 0x8B7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x13D9 PUSH1 0x20 DUP7 PUSH2 0x1B81 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x2494 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x8B7 PUSH2 0x141C PUSH2 0x1A6A JUMP JUMPDEST PUSH2 0x1448 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xCE5 PUSH2 0x2193 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x20B9 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x40 PUSH2 0x14AB PUSH2 0x234E JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x152F PUSH2 0x1A8D JUMP JUMPDEST PUSH2 0x1537 PUSH2 0x2193 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x53B JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x15EA JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x7A0 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH2 0x8B7 PUSH2 0x1701 CALLDATASIZE PUSH2 0x1AB0 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x172B PUSH2 0x2193 JUMP JUMPDEST SWAP1 PUSH2 0x1DD2 JUMP JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH2 0x1768 PUSH2 0x1A6A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x1796 PUSH2 0x2193 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x195B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x192D JUMPI PUSH2 0x17EC DUP2 DUP6 DUP6 PUSH2 0x22CE JUMP JUMPDEST ISZERO PUSH2 0x18E1 JUMPI POP DUP4 PUSH2 0x1850 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x183C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x1813 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x18CD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x1815 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x1871 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x20 PUSH2 0x19E6 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1D35 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x442 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI PUSH2 0x10E4 PUSH1 0x20 SWAP2 PUSH2 0x1C86 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x442 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x442 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x442 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x442 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x442 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x442 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x442 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x442 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x442 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x442 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x134A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1C1A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x134A JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1C69 PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD DUP5 PUSH2 0x1B81 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x442 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1D2F JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1D29 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1DA4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x1C1A JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x418 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1FC9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1F97 JUMPI DUP3 PUSH2 0x1E46 SWAP2 DUP6 PUSH2 0x22CE JUMP JUMPDEST ISZERO PUSH2 0x1EDC JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x1E8D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x1E65 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1F51 JUMPI JUMPDEST PUSH2 0x1F05 JUMPI DUP1 PUSH2 0x1E4C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1EFB JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2051 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1310 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x214D JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x442 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x442 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x22BF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x22C4 JUMPI JUMPDEST PUSH2 0x22BF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x221E JUMPI JUMPDEST POP PUSH2 0x221B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2290 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2211 JUMP JUMPDEST PUSH2 0x22B2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x22B8 JUMPI JUMPDEST PUSH2 0x22AA DUP2 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x217B JUMP JUMPDEST CODESIZE PUSH2 0x2289 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x22A0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x21DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x22F9 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x22F3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2482 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x248A JUMPI JUMPDEST PUSH2 0x2482 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x23E1 JUMPI JUMPDEST POP PUSH2 0x23B0 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x442 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2463 JUMPI JUMPDEST POP CODESIZE PUSH2 0x23A4 JUMP JUMPDEST PUSH2 0x247C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x22B8 JUMPI PUSH2 0x22AA DUP2 DUP4 PUSH2 0x1B81 JUMP JUMPDEST CODESIZE PUSH2 0x245C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2395 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x261E JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x25A3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0xE4E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2616 JUMPI JUMPDEST DUP2 PUSH2 0x25BC PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1B81 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEF4 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEF1 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2555 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x25AF JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2500 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL PUSH2 0xD572 0xC6 MOD 0xD9 SELFDESTRUCT PUSH30 0x8C392FBF1F85D9445EDD8C4BF6E2C6DFD18EFE8442FF5664736F6C634300 ADDMOD 0x1E STOP CALLER ","sourceMap":"698:813:141:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;29158:19:327;;698:813:141;1228:41;698:813;1228:41;;:::i;:::-;698:813;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12884:11;;698:813:141;;;;12606:3:327;12594:10;;;;;;698:813:141;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;698:813:141;;13125:27:327;698:813:141;;;;;;;;;;;;2220:8:327;13125:27;;698:813:141;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;698:813:141;12987:51:327;;698:813:141;12987:51:327;;;;698:813:141;;;;;;;12987:51:327;12919:59;698:813:141;;;;12958:11:327;698:813:141;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;698:813:141;12832:34:327;;;;;698:813:141;;;;12832:34:327;12715:64;698:813:141;12748:31:327;;;;;698:813:141;;12748:31:327;12594:10;;;;13177;;;;:25;;;12578:585;13173:304;;698:813:141;13173:304:327;-1:-1:-1;698:813:141;;;13323:10:327;698:813:141;;;;;;;;;;;2220:8:327;;698:813:141;;;;;;;;;2220:8:327;;698:813:141;13177:25:327;13191:11;;;;13177:25;;12409:58;12438:29;698:813:141;12438:29:327;698:813:141;;12438:29:327;698:813:141;;;;;;;;;;;;;;;;;:::i;:::-;;1228:41;;;:::i;:::-;698:813;;;;;;;;3205:23:42;;;3201:60;;698:813:141;;;3275:25:42;;;;3271:146;;698:813:141;3271:146:42;2220:8:327;;;;;;;;3361:45:42;698:813:141;3361:45:42;;698:813:141;3201:60:42;3237:24;698:813:141;3237:24:42;698:813:141;;;;3237:24:42;698:813:141;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;698:813:141;-1:-1:-1;698:813:141;28718:11:327;698:813:141;;;;-1:-1:-1;698:813:141;28718:28:327;698:813:141;-1:-1:-1;698:813:141;;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1228:41;;:::i;:::-;5148:19:42;698:813:141;;;;;;;4503:26:42;;;4499:64;;4464:19:41;698:813:141;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;1880:140:41;;698:813:141;1880:140:41;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;698:813:141;;;;1973:36:41;;;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;29158:19:327;;;698:813:141;1228:41;11217:7:327;1228:41:141;;;;;:::i;:::-;11217:7:327;;;:::i;:::-;376:58:354;;11235:101:327;;698:813:141;11235:101:327;11271:54;698:813:141;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;698:813:141;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1228:41;;;:::i;:::-;698:813;;;6339:18:327;;;;6335:63;;698:813:141;6463:42:327;6408:19;698:813:141;-1:-1:-1;698:813:141;6408:11:327;698:813:141;;;-1:-1:-1;698:813:141;;-1:-1:-1;698:813:141;;;;-1:-1:-1;698:813:141;;;;;;;;;;;;;;;;6463:42:327;698:813:141;6335:63:327;6366:32;;698:813:141;6366:32:327;698:813:141;;;;6366:32:327;698:813:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;698:813:141;-1:-1:-1;698:813:141;;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1228:41;;:::i;:::-;698:813;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;3741:25:41;3737:66;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;698:813:141;;;;2455:33:41;698:813:141;3737:66:41;698:813:141;3775:28:41;;;698:813:141;3775:28:41;698:813:141;;;;;;;3775:28:41;698:813:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1586:12:303;698:813:141;1228:41;;:::i;:::-;1586:12:303;;:::i;:::-;15560:7:327;1863:70;;698:813:141;;1228:41;;;:::i;:::-;698:813;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;698:813:141;15578:107:327;698:813:141;;;;;;29832:65:327;698:813:141;29832:65:327;;698:813:141;;29832:65:327;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;698:813:141;29832:65:327;;;;;;;;698:813:141;29832:65:327;;;698:813:141;;;;;;29832:84:327;29828:136;;698:813:141;29828:136:327;29925:39;698:813:141;29925:39:327;698:813:141;;;;;;29925:39:327;29832:65;698:813:141;29832:65:327;;698:813:141;29832:65:327;;;;;;698:813:141;29832:65:327;;;:::i;:::-;;;698:813:141;;;;;;;;;;;;;29832:65:327;698:813:141;29832:65:327;;698:813:141;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;698:813:141;;-1:-1:-1;698:813:141;26801:10:327;698:813:141;;;;-1:-1:-1;698:813:141;;;;;;;;26724:60:327;26756:28;698:813:141;26756:28:327;698:813:141;;26756:28:327;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;698:813:141;;;;;;;;27291:64:327;27324:31;;698:813:141;27324:31:327;698:813:141;;;;27324:31:327;698:813:141;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1956:12:303;698:813:141;1228:41;;:::i;1956:12:303:-;698:813:141;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16404:16:327;;;16400:54;;698:813:141;;16512:9:327;698:813:141;16523:10:327;;;;;;16821:14;;;-1:-1:-1;698:813:141;16821:10:327;698:813:141;;;-1:-1:-1;698:813:141;;;;;2220:8:327;;698:813:141;;;16535:3:327;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:72:327;;698:813:141;;;;;;;;;;;;;2220:8:327;16743:33;698:813:141;16743:33:327;;;;698:813:141;16512:9:327;;16597:72;16641:28;698:813:141;16641:28:327;698:813:141;;;;16641:28:327;698:813:141;;;;;;;;;;16400:54:327;16429:25;698:813:141;16429:25:327;698:813:141;;16429:25:327;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1228:41;9668:7:327;1228:41:141;;;;;:::i;:::-;9668:7:327;;;:::i;:::-;376:58:354;;9686:99:327;;698:813:141;9686:99:327;9722:52;698:813:141;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;698:813:141:-;;;;;;;;;;;1287:7:303;698:813:141;;:::i;:::-;1232:12:303;698:813:141;1228:41;;:::i;1232:12:303:-;698:813:141;;;;1287:7:303;:::i;698:813:141:-;;;;;;;;;;;;1463:39;;:::i;:::-;698:813;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1228:41;;:::i;:::-;5148:19:42;698:813:141;;;;;;;4503:26:42;;;4499:64;;4464:19:41;698:813:141;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;1254:25:41;1250:140;;698:813:141;1250:140:41;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;698:813:141;;;;1343:36:41;698:813:141;;;;;;;;;;;;;;;;941:19:75;698:813:141;;;;;;;;1128:7:296;698:813:141;;;:::i;:::-;29158:19:327;698:813:141;1228:41;;:::i;:::-;1128:7:296;;:::i;698:813:141:-;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;698:813:141;1228:41;;;:::i;:::-;698:813;;;;;;;;;;;;;;30700:19:327;;;4802:64;;698:813:141;;4931:18:327;;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;698:813:141;5670:35:327;;698:813:141;5157:173:327;698:813:141;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;698:813:141;;;;;5620:11:327;698:813:141;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;698:813:141;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;698:813:141;5052:59:327;;;698:813:141;5052:59:327;698:813:141;;;;;;;;;5052:59:327;4927:63;4958:32;;698:813:141;4958:32:327;698:813:141;;;;4958:32:327;4802:64;4835:31;;698:813:141;4835:31:327;698:813:141;;;;4835:31:327;698:813:141;;;;;;;;;;;;2087:43:296;698:813:141;;;2087:43:296;:::i;:::-;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;698:813:141;635:65:55;;:::i;698:813:141:-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;698:813:141;1146:19:75;698:813:141;1146:53:75;;;1142:96;;698:813:141;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;698:813:141;1215:12:75;:::o;698:813:141:-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;;;;:::o;1359:340:59:-;698:813:141;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;698:813:141;500:10:59;698:813:141;500:10:59;;;;698:813:141;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;698:813:141;1528:12:59;:::o;27798:360:327:-;698:813:141;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;698:813:141;;;28073:11:327;698:813:141;;;;;;;;28066:27:327;:::o;27948:64::-;27981:31;;698:813:141;27981:31:327;;698:813:141;;;27981:31:327;7385:956;;;698:813:141;;7507:16:327;;;7503:58;;698:813:141;7521:1:327;698:813:141;;;;;7521:1:327;698:813:141;;;;;30700:19:327;;;7615:64;;698:813:141;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;698:813:141;;;7521:1:327;698:813:141;;;;;;7521:1:327;698:813:141;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;698:813:141;-1:-1:-1;698:813:141;;;;;-1:-1:-1;698:813:141;;;;;2220:8:327;;698:813:141;-1:-1:-1;698:813:141;;;;-1:-1:-1;698:813:141;8155:10:327;698:813:141;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;698:813:141;7896:51:327;;;7521:1;7896:51;698:813:141;7896:51:327;698:813:141;;;;;;7521:1:327;7896:51;7828:59;698:813:141;;7521:1:327;698:813:141;7867:11:327;;;698:813:141;;;;7521:1:327;698:813:141;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;698:813:141;;;;7521:1:327;7728:34;7615:64;7648:31;;7521:1;7648:31;;698:813:141;;7521:1:327;7648:31;3640:170:41;698:813:141;-1:-1:-1;698:813:141;;;;-1:-1:-1;698:813:141;;;;-1:-1:-1;698:813:141;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;698:813:141;3775:28:41;;-1:-1:-1;3775:28:41;698:813:141;3775:28:41;698:813:141;;;;;-1:-1:-1;3775:28:41;14035:460:327;;698:813:141;;14119:16:327;;;14115:54;;698:813:141;14133:1:327;698:813:141;;;;;;14133:1:327;698:813:141;;;14179:72:327;;14415:10;698:813:141;;14133:1:327;698:813:141;;;;;;14133:1:327;698:813:141;2220:8:327;698:813:141;-1:-1:-1;698:813:141;14415:10:327;698:813:141;;;-1:-1:-1;698:813:141;14415:10:327;698:813:141;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;698:813:141;;14133:1:327;14223:28;698:813:141;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;698:813:141;1029:19:76;698:813:141;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;698:813:141;;;1676:74:76;;698:813:141;;;1676:74:76;;;698:813:141;1327:10:76;698:813:141;;;;1744:4:76;698:813:141;;;;;-1:-1:-1;1676:74:76;;698:813:141;;;;;;1676:74:76;;;;;;;698:813:141;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;698:813:141;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;698:813:141;;-1:-1:-1;698:813:141;30435:11:327;698:813:141;;;;-1:-1:-1;698:813:141;30435:27:327;698:813:141;-1:-1:-1;698:813:141;;;500:10:59;698:813:141;-1:-1:-1;698:813:141;500:10:59;;30413:49:327;;;;;1938:939:76;698:813:141;2065:19:76;698:813:141;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;698:813:141;720:8:80;698:813:141;720:8:80;;698:813:141;;;;2115:1:76;2802:32;;:::o;2624:153::-;698:813:141;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;698:813:141;2361:10:76;698:813:141;;;;2771:4:76;698:813:141;;;;;-1:-1:-1;2682:95:76;;698:813:141;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;;698:813:141;29701:270:327;;;;;;698:813:141;;;;;29832:65:327;698:813:141;29832:65:327;;698:813:141;29832:65:327;;;698:813:141;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;;;;;;;;;;;-1:-1:-1;698:813:141;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;698:813:141;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;698:813:141;29832:65:327;;698:813:141;29832:65:327;;;;;;698:813:141;29832:65:327;;;:::i;:::-;;;698:813:141;;;;;;;;;;;;;29832:65:327;698:813:141;29832:65:327;;;;;-1:-1:-1;29832:65:327;;698:813:141;;;;;;;;;;;;;;;;-1:-1:-1;698:813:141;;"},"gasEstimates":{"creation":{"codeDepositCost":"1967200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"562","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2663","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4596","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2807","isApprovedForAll(address,address)":"2981","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","owner()":"2583","ownerOf(uint256)":"2586","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","supportsInterface(bytes4)":"2433","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol\":\"ERC721WithoutOperatorFiltererMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/ERC721WithoutOperatorFiltererMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721} from \\\"./../../../token/ERC721/ERC721.sol\\\";\\nimport {ERC721BatchTransfer} from \\\"./../../../token/ERC721/ERC721BatchTransfer.sol\\\";\\nimport {ERC721Mintable} from \\\"./../../../token/ERC721/ERC721Mintable.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721WithoutOperatorFiltererMock is ERC721, ERC721BatchTransfer, ERC721Mintable, ForwarderRegistryContext {\\n    constructor(IForwarderRegistry forwarderRegistry) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x9f38c1b6e592a5c9b34eb31f4e3df1f20db88389a88792f1063f32bf0f29c37e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721Base} from \\\"./base/ERC721Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721 is ERC721Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    constructor() {\\n        ERC721Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0xc88d760bfb00ca968cfceeadc7f930787bec3e49d70ece9bae580dbce43e02bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferBase} from \\\"./base/ERC721BatchTransferBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransfer is ERC721BatchTransferBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xa8e3132369f1822355d3cac6ec41cc67cf04fa3587e9915cc1d79b45954abcd5\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol":{"ERC721BatchTransferFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BatchTransferStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"initERC721BatchTransferStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721BatchTransferFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6109c138819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516109389081610089823960805181818161068c01526107ee0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461056a578063684a78aa146104305763f3993d111461003d57600080fd5b3461042b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361042b5760243573ffffffffffffffffffffffffffffffffffffffff811680820361042b576044359367ffffffffffffffff851161042b573660238601121561042b57846004013567ffffffffffffffff811161042b573660248260051b8801011161042b576100f86107d7565b83156104015773ffffffffffffffffffffffffffffffffffffffff16908183149586156103bc575b9495159460005b8281101561030157600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102d55788036102a5578793929189918b6101f2575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a401610127565b90929394507401000000000000000000000000000000000000000091501615801561025a575b61022757908787939238610197565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610218565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103b3575b61031357005b61035f6103aa9273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b5082151561030d565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610120565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461042b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b576104676107d7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361053d577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461042b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b5760406105a3610675565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062e57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261042b5751801515810361042b5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107c55732331480156107cd575b6107c557803314908115610708575b506106d7576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161042b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107b95760009161078a575b50386106cb565b6107ac915060203d6020116107b2575b6107a481836105ed565b81019061065d565b38610783565b503d61079a565b6040513d6000823e3d90fd5b506000903690565b50601836106106bc565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108f35732331480156108f8575b6108f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610862575b5061085f57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107b9576000916108d4575b5038610855565b6108ed915060203d6020116107b2576107a481836105ed565b386108cd565b503390565b506018361061081e56fea26469706673582212205e13eaacd311d24951c9dee7858d681747f27a6db6468ed07c9597c6ea2da5c064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x9C1 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x938 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x68C ADD MSTORE PUSH2 0x7EE ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0x684A78AA EQ PUSH2 0x430 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x42B JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x42B JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x42B JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x42B JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x42B JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x42B JUMPI PUSH2 0xF8 PUSH2 0x7D7 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x401 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3BC JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2D5 JUMPI DUP9 SUB PUSH2 0x2A5 JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1F2 JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x127 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x25A JUMPI JUMPDEST PUSH2 0x227 JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x197 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x218 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3B3 JUMPI JUMPDEST PUSH2 0x313 JUMPI STOP JUMPDEST PUSH2 0x35F PUSH2 0x3AA SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x30D JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x120 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH2 0x467 PUSH2 0x7D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x53D JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH1 0x40 PUSH2 0x5A3 PUSH2 0x675 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x62E JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x42B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x42B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7C5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7CD JUMPI JUMPDEST PUSH2 0x7C5 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x708 JUMPI JUMPDEST POP PUSH2 0x6D7 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x42B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7B9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x78A JUMPI JUMPDEST POP CODESIZE PUSH2 0x6CB JUMP JUMPDEST PUSH2 0x7AC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7B2 JUMPI JUMPDEST PUSH2 0x7A4 DUP2 DUP4 PUSH2 0x5ED JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x65D JUMP JUMPDEST CODESIZE PUSH2 0x783 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x79A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8F3 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8F8 JUMPI JUMPDEST PUSH2 0x8F3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x862 JUMPI JUMPDEST POP PUSH2 0x85F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7B9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8D4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x855 JUMP JUMPDEST PUSH2 0x8ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7B2 JUMPI PUSH2 0x7A4 DUP2 DUP4 PUSH2 0x5ED JUMP JUMPDEST CODESIZE PUSH2 0x8CD JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x81E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MCOPY SGT 0xEA 0xAC 0xD3 GT 0xD2 BLOBHASH MLOAD 0xC9 0xDE SWAPN 0x85 DUP14 PUSH9 0x1747F27A6DB6468ED0 PUSH29 0x9597C6EA2DA5C064736F6C634300081E00330000000000000000000000 ","sourceMap":"294:270:142:-:0;;;;;;;;;;;;;-1:-1:-1;;294:270:142;;;;-1:-1:-1;;;;;294:270:142;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;294:270:142;;;;;;745:39:76;;294:270:142;;;;;;;;745:39:76;294:270:142;;;;;;;;;;;;-1:-1:-1;294:270:142;;;;;;-1:-1:-1;294:270:142;;;;;-1:-1:-1;294:270:142"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1629,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1517,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1653,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2007,"id":13231,"parameterSlots":0,"returnSlots":1},"mapping_index_access_mapping_address_uint256_of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1676},{"length":32,"start":2030}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461056a578063684a78aa146104305763f3993d111461003d57600080fd5b3461042b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361042b5760243573ffffffffffffffffffffffffffffffffffffffff811680820361042b576044359367ffffffffffffffff851161042b573660238601121561042b57846004013567ffffffffffffffff811161042b573660248260051b8801011161042b576100f86107d7565b83156104015773ffffffffffffffffffffffffffffffffffffffff16908183149586156103bc575b9495159460005b8281101561030157600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102d55788036102a5578793929189918b6101f2575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a401610127565b90929394507401000000000000000000000000000000000000000091501615801561025a575b61022757908787939238610197565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610218565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103b3575b61031357005b61035f6103aa9273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b5082151561030d565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610120565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461042b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b576104676107d7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361053d577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461042b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261042b5760406105a3610675565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761062e57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261042b5751801515810361042b5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107c55732331480156107cd575b6107c557803314908115610708575b506106d7576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161042b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107b95760009161078a575b50386106cb565b6107ac915060203d6020116107b2575b6107a481836105ed565b81019061065d565b38610783565b503d61079a565b6040513d6000823e3d90fd5b506000903690565b50601836106106bc565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108f35732331480156108f8575b6108f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610862575b5061085f57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107b9576000916108d4575b5038610855565b6108ed915060203d6020116107b2576107a481836105ed565b386108cd565b503390565b506018361061081e56fea26469706673582212205e13eaacd311d24951c9dee7858d681747f27a6db6468ed07c9597c6ea2da5c064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0x684A78AA EQ PUSH2 0x430 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x42B JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x42B JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x42B JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x42B JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x42B JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x42B JUMPI PUSH2 0xF8 PUSH2 0x7D7 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x401 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3BC JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2D5 JUMPI DUP9 SUB PUSH2 0x2A5 JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1F2 JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x127 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x25A JUMPI JUMPDEST PUSH2 0x227 JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x197 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x218 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3B3 JUMPI JUMPDEST PUSH2 0x313 JUMPI STOP JUMPDEST PUSH2 0x35F PUSH2 0x3AA SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x30D JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x120 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH2 0x467 PUSH2 0x7D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x53D JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x42B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x42B JUMPI PUSH1 0x40 PUSH2 0x5A3 PUSH2 0x675 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x62E JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x42B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x42B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7C5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7CD JUMPI JUMPDEST PUSH2 0x7C5 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x708 JUMPI JUMPDEST POP PUSH2 0x6D7 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x42B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7B9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x78A JUMPI JUMPDEST POP CODESIZE PUSH2 0x6CB JUMP JUMPDEST PUSH2 0x7AC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7B2 JUMPI JUMPDEST PUSH2 0x7A4 DUP2 DUP4 PUSH2 0x5ED JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x65D JUMP JUMPDEST CODESIZE PUSH2 0x783 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x79A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8F3 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8F8 JUMPI JUMPDEST PUSH2 0x8F3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x862 JUMPI JUMPDEST POP PUSH2 0x85F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7B9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8D4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x855 JUMP JUMPDEST PUSH2 0x8ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7B2 JUMPI PUSH2 0x7A4 DUP2 DUP4 PUSH2 0x5ED JUMP JUMPDEST CODESIZE PUSH2 0x8CD JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x81E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MCOPY SGT 0xEA 0xAC 0xD3 GT 0xD2 BLOBHASH MLOAD 0xC9 0xDE SWAPN 0x85 DUP14 PUSH9 0x1747F27A6DB6468ED0 PUSH29 0x9597C6EA2DA5C064736F6C634300081E00330000000000000000000000 ","sourceMap":"294:270:142:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1647:41:310;;:::i;:::-;12413:16:327;;12409:58;;294:270:142;;30414:16:327;;;;30413:49;;;;;294:270:142;12583:9:327;;12884:11;;294:270:142;12606:3:327;12594:10;;;;;;294:270:142;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;294:270:142;;13125:27:327;294:270:142;;1931:1:327;294:270:142;;;;;;;;;;13125:27:327;;294:270:142;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;294:270:142;12987:51:327;;;;;;294:270:142;;;;;;12987:51:327;12919:59;294:270:142;;;;12958:11:327;294:270:142;;;;;;;;12948:30:327;;;12919:59;;12793:73;12832:34;294:270:142;12832:34:327;;;;;294:270:142;;;;12832:34:327;12715:64;294:270:142;12748:31:327;;;;;294:270:142;;12748:31:327;12594:10;;;;;13177;;:25;;;12578:585;13173:304;;294:270:142;13173:304:327;13323:16;13428:14;13323:16;294:270:142;;;;13323:10:327;294:270:142;;;;;;;13323:16:327;294:270:142;;;;;;;;;;13323:10:327;294:270:142;;;;;;;13428:14:327;294:270:142;;;;;;;;13177:25:327;13191:11;;;;13177:25;;30413:49;30435:18;;294:270:142;;;30435:11:327;294:270:142;;;;;;;;;;;;;;;;30413:49:327;;;12409:58;12438:29;294:270:142;12438:29:327;294:270:142;;12438:29:327;294:270:142;;;;;;;;;;;;;;;1647:41:310;;:::i;:::-;294:270:142;;;;;;;3174:18:180;;;3170:53;;2904:38:327;294:270:142;500:10:59;294:270:142;500:10:59;;;;;;;636:1:180;500:10:59;;;294:270:142;3170:53:180;3201:22;294:270:142;3201:22:180;294:270:142;;;;3201:22:180;294:270:142;;;;;;;;;;;;1882:39:310;;:::i;:::-;294:270:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;294:270:142;;;;;-1:-1:-1;294:270:142;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;294:270:142;2065:19:76;294:270:142;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;294:270:142;720:8:80;294:270:142;720:8:80;;294:270:142;;;;2115:1:76;2802:32;;:::o;2624:153::-;294:270:142;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;294:270:142;2361:10:76;294:270:142;;;;2771:4:76;294:270:142;;;;;-1:-1:-1;2682:95:76;;294:270:142;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;294:270:142;;;2115:1:76;294:270:142;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;294:270:142;1029:19:76;294:270:142;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;294:270:142;;;1676:74:76;;294:270:142;;;1676:74:76;;;294:270:142;1327:10:76;294:270:142;;;;1744:4:76;294:270:142;;;;;-1:-1:-1;1676:74:76;;294:270:142;;;;;;1676:74:76;;;;;;;294:270:142;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"472000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","initERC721BatchTransferStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchTransferFrom(address,address,uint256[])":"f3993d11","initERC721BatchTransferStorage()":"684a78aa"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BatchTransferStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"initERC721BatchTransferStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721BatchTransferFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"initERC721BatchTransferStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol\":\"ERC721BatchTransferFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721BatchTransferFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721BatchTransferFacet} from \\\"./../../../../token/ERC721/facets/ERC721BatchTransferFacet.sol\\\";\\n\\n/// @title ERC721BatchTransferFacetMock\\ncontract ERC721BatchTransferFacetMock is ERC721BatchTransferFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BatchTransferFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc09e16c301d641b2fbbea542398291e3f01a730217ee0ef5823c63d7a555816b\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BatchTransferBase} from \\\"./../base/ERC721BatchTransferBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC721BatchTransferFacet is ERC721BatchTransferBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BatchTransferStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1ea2b147abc7ae1238867ad176a10a289c884079ca33ed732c8637f416d7d492\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"initERC721BatchTransferStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol":{"ERC721BatchTransferWithOperatorFiltererFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BatchTransferStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"initERC721BatchTransferStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721BatchTransferFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610ac438819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610a3b908161008982396080518181816107ab01526108f10152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e14610689578063684a78aa1461054f5763f3993d111461003d57600080fd5b3461054a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361054a5760243573ffffffffffffffffffffffffffffffffffffffff811680820361054a576044359367ffffffffffffffff851161054a573660238601121561054a57846004013567ffffffffffffffff811161054a573660248260051b8801011161054a5773ffffffffffffffffffffffffffffffffffffffff61010d6108da565b1690828203610433575b8315610409578183149586156103c4575b9495159460005b8281101561030957600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102dd5788036102ad578793929189918b6101fa575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a40161012f565b909293945074010000000000000000000000000000000000000000915016158015610262575b61022f5790878793923861019f565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610220565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103bb575b61031b57005b6103676103b29273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b50821515610315565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610128565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30541680151580610540575b61047f575b50610117565b6020604491604051928380927fc61711340000000000000000000000000000000000000000000000000000000082523060048301528760248301525afa90811561053457600091610505575b50156104d75738610479565b507fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610527915060203d60201161052d575b61051f818361070c565b81019061077c565b386104cb565b503d610515565b6040513d6000823e3d90fd5b50803b1515610474565b600080fd5b3461054a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a576105866108da565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361065c577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461054a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a5760406106c2610794565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761074d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261054a5751801515810361054a5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c85732331480156108d0575b6108c857803314908115610827575b506107f6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161054a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610534576000916108a9575b50386107ea565b6108c2915060203d60201161052d5761051f818361070c565b386108a2565b506000903690565b50601836106107db565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109f65732331480156109fb575b6109f6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610965575b5061096257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610534576000916109d7575b5038610958565b6109f0915060203d60201161052d5761051f818361070c565b386109d0565b503390565b506018361061092156fea2646970667358221220f710e0d91dc05a1725c3a769fc24b17533072e1a5ff3cb5566757b8edb5ffec664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xAC4 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xA3B SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x7AB ADD MSTORE PUSH2 0x8F1 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0x684A78AA EQ PUSH2 0x54F JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x54A JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x54A JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x54A JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x54A JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x54A JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x54A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10D PUSH2 0x8DA JUMP JUMPDEST AND SWAP1 DUP3 DUP3 SUB PUSH2 0x433 JUMPI JUMPDEST DUP4 ISZERO PUSH2 0x409 JUMPI DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3C4 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x309 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2DD JUMPI DUP9 SUB PUSH2 0x2AD JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1FA JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x12F JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x262 JUMPI JUMPDEST PUSH2 0x22F JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x19F JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x220 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3BB JUMPI JUMPDEST PUSH2 0x31B JUMPI STOP JUMPDEST PUSH2 0x367 PUSH2 0x3B2 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x315 JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x128 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND DUP1 ISZERO ISZERO DUP1 PUSH2 0x540 JUMPI JUMPDEST PUSH2 0x47F JUMPI JUMPDEST POP PUSH2 0x117 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x44 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE DUP8 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x505 JUMPI JUMPDEST POP ISZERO PUSH2 0x4D7 JUMPI CODESIZE PUSH2 0x479 JUMP JUMPDEST POP PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x527 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI JUMPDEST PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77C JUMP JUMPDEST CODESIZE PUSH2 0x4CB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x515 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x474 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH2 0x586 PUSH2 0x8DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x65C JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH1 0x40 PUSH2 0x6C2 PUSH2 0x794 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x74D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x54A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x54A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8D0 JUMPI JUMPDEST PUSH2 0x8C8 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x827 JUMPI JUMPDEST POP PUSH2 0x7F6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x54A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8A9 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7EA JUMP JUMPDEST PUSH2 0x8C2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST CODESIZE PUSH2 0x8A2 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7DB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9F6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9FB JUMPI JUMPDEST PUSH2 0x9F6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x965 JUMPI JUMPDEST POP PUSH2 0x962 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9D7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x958 JUMP JUMPDEST PUSH2 0x9F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST CODESIZE PUSH2 0x9D0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x921 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 LT RJUMP 0xD91D 0xC0 GAS OR 0x25 0xC3 0xA7 PUSH10 0xFC24B17533072E1A5FF3 0xCB SSTORE PUSH7 0x757B8EDB5FFEC6 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"334:330:143:-:0;;;;;;;;;;;;;-1:-1:-1;;334:330:143;;;;-1:-1:-1;;;;;334:330:143;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;334:330:143;;;;;;745:39:76;;334:330:143;;;;;;;;745:39:76;334:330:143;;;;;;;;;;;;-1:-1:-1;334:330:143;;;;;;-1:-1:-1;334:330:143;;;;;-1:-1:-1;334:330:143"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1916,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1804,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1940,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2266,"id":13231,"parameterSlots":0,"returnSlots":1},"mapping_index_access_mapping_address_uint256_of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1963},{"length":32,"start":2289}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e14610689578063684a78aa1461054f5763f3993d111461003d57600080fd5b3461054a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361054a5760243573ffffffffffffffffffffffffffffffffffffffff811680820361054a576044359367ffffffffffffffff851161054a573660238601121561054a57846004013567ffffffffffffffff811161054a573660248260051b8801011161054a5773ffffffffffffffffffffffffffffffffffffffff61010d6108da565b1690828203610433575b8315610409578183149586156103c4575b9495159460005b8281101561030957600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102dd5788036102ad578793929189918b6101fa575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a40161012f565b909293945074010000000000000000000000000000000000000000915016158015610262575b61022f5790878793923861019f565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610220565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103bb575b61031b57005b6103676103b29273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b50821515610315565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610128565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30541680151580610540575b61047f575b50610117565b6020604491604051928380927fc61711340000000000000000000000000000000000000000000000000000000082523060048301528760248301525afa90811561053457600091610505575b50156104d75738610479565b507fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610527915060203d60201161052d575b61051f818361070c565b81019061077c565b386104cb565b503d610515565b6040513d6000823e3d90fd5b50803b1515610474565b600080fd5b3461054a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a576105866108da565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361065c577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461054a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261054a5760406106c2610794565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761074d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261054a5751801515810361054a5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c85732331480156108d0575b6108c857803314908115610827575b506107f6576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161054a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610534576000916108a9575b50386107ea565b6108c2915060203d60201161052d5761051f818361070c565b386108a2565b506000903690565b50601836106107db565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156109f65732331480156109fb575b6109f6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610965575b5061096257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610534576000916109d7575b5038610958565b6109f0915060203d60201161052d5761051f818361070c565b386109d0565b503390565b506018361061092156fea2646970667358221220f710e0d91dc05a1725c3a769fc24b17533072e1a5ff3cb5566757b8edb5ffec664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0x684A78AA EQ PUSH2 0x54F JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x54A JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x54A JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x54A JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x54A JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x54A JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x54A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x10D PUSH2 0x8DA JUMP JUMPDEST AND SWAP1 DUP3 DUP3 SUB PUSH2 0x433 JUMPI JUMPDEST DUP4 ISZERO PUSH2 0x409 JUMPI DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3C4 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x309 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2DD JUMPI DUP9 SUB PUSH2 0x2AD JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1FA JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x12F JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x262 JUMPI JUMPDEST PUSH2 0x22F JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x19F JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x220 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3BB JUMPI JUMPDEST PUSH2 0x31B JUMPI STOP JUMPDEST PUSH2 0x367 PUSH2 0x3B2 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x315 JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x128 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND DUP1 ISZERO ISZERO DUP1 PUSH2 0x540 JUMPI JUMPDEST PUSH2 0x47F JUMPI JUMPDEST POP PUSH2 0x117 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x44 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE DUP8 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x505 JUMPI JUMPDEST POP ISZERO PUSH2 0x4D7 JUMPI CODESIZE PUSH2 0x479 JUMP JUMPDEST POP PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x527 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI JUMPDEST PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77C JUMP JUMPDEST CODESIZE PUSH2 0x4CB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x515 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x474 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH2 0x586 PUSH2 0x8DA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x65C JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x54A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x54A JUMPI PUSH1 0x40 PUSH2 0x6C2 PUSH2 0x794 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x74D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x54A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x54A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8D0 JUMPI JUMPDEST PUSH2 0x8C8 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x827 JUMPI JUMPDEST POP PUSH2 0x7F6 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x54A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8A9 JUMPI JUMPDEST POP CODESIZE PUSH2 0x7EA JUMP JUMPDEST PUSH2 0x8C2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST CODESIZE PUSH2 0x8A2 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7DB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x9F6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x9FB JUMPI JUMPDEST PUSH2 0x9F6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x965 JUMPI JUMPDEST POP PUSH2 0x962 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9D7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x958 JUMP JUMPDEST PUSH2 0x9F0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x52D JUMPI PUSH2 0x51F DUP2 DUP4 PUSH2 0x70C JUMP JUMPDEST CODESIZE PUSH2 0x9D0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x921 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 LT RJUMP 0xD91D 0xC0 GAS OR 0x25 0xC3 0xA7 PUSH10 0xFC24B17533072E1A5FF3 0xCB SSTORE PUSH7 0x757B8EDB5FFEC6 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"334:330:143:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1776:41:311;;:::i;:::-;334:330:143;2616:14:352;;;;2612:76;;334:330:143;12413:16:327;;12409:58;;30414:16;;;30413:49;;;;;334:330:143;12583:9:327;;12884:11;;334:330:143;12606:3:327;12594:10;;;;;;334:330:143;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;334:330:143;;13125:27:327;334:330:143;;747:1:352;334:330:143;;;;;;;;;;13125:27:327;;334:330:143;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;334:330:143;12987:51:327;;;;;;334:330:143;;;;;;12987:51:327;12919:59;334:330:143;;;;12958:11:327;334:330:143;;;;;;;;12948:30:327;;;12919:59;;12793:73;12832:34;334:330:143;12832:34:327;;;;;334:330:143;;;;12832:34:327;12715:64;334:330:143;12748:31:327;;;;;334:330:143;;12748:31:327;12594:10;;;;;13177;;:25;;;12578:585;13173:304;;334:330:143;13173:304:327;13323:16;13428:14;13323:16;334:330:143;;;;13323:10:327;334:330:143;;;;;;;13323:16:327;334:330:143;;;;;;;;;;13323:10:327;334:330:143;;;;;;;13428:14:327;334:330:143;;;;;;;;13177:25:327;13191:11;;;;13177:25;;30413:49;30435:18;;334:330:143;;;30435:11:327;334:330:143;;;;;;;;;;;;;;;;30413:49:327;;;12409:58;12438:29;334:330:143;12438:29:327;334:330:143;;12438:29:327;2612:76:352;334:330:143;;;;3524:31:352;;;:68;;;2612:76;3520:224;;2612:76;;;;3520:224;334:330:143;;;;;3613:51:352;;;;334:330:143;3613:51:352;;3648:4;334:330:143;3613:51:352;;334:330:143;;;;;;3613:51:352;;;;;;;334:330:143;3613:51:352;;;3520:224;3612:52;;3608:126;;3520:224;;;3608:126;3691:28;;334:330:143;3691:28:352;334:330:143;;;;3691:28:352;3613:51;;;;334:330:143;3613:51:352;334:330:143;3613:51:352;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;334:330:143;;;;;;;;;3524:68:352;3559:29;;;:33;;3524:68;;334:330:143;;;;;;;;;;;;;;;1776:41:311;;:::i;:::-;334:330:143;;;;;;;3174:18:180;;;3170:53;;2904:38:327;334:330:143;500:10:59;334:330:143;500:10:59;;;;;;;636:1:180;500:10:59;;;334:330:143;3170:53:180;3201:22;334:330:143;3201:22:180;334:330:143;;;;3201:22:180;334:330:143;;;;;;;;;;;;2011:39:311;;:::i;:::-;334:330:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;334:330:143;;;;;-1:-1:-1;334:330:143;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;334:330:143;2065:19:76;334:330:143;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;334:330:143;720:8:80;334:330:143;720:8:80;;334:330:143;;;;2115:1:76;2802:32;;:::o;2624:153::-;334:330:143;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;334:330:143;2361:10:76;334:330:143;;;;2771:4:76;334:330:143;;;;;-1:-1:-1;2682:95:76;;334:330:143;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;334:330:143;1029:19:76;334:330:143;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;334:330:143;;;1676:74:76;;334:330:143;;;1676:74:76;;;334:330:143;1327:10:76;334:330:143;;;;1744:4:76;334:330:143;;;;;-1:-1:-1;1676:74:76;;334:330:143;;;;;;1676:74:76;;;;;;;334:330:143;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"523800","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","initERC721BatchTransferStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchTransferFrom(address,address,uint256[])":"f3993d11","initERC721BatchTransferStorage()":"684a78aa"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BatchTransferStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"initERC721BatchTransferStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721BatchTransferFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"initERC721BatchTransferStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol\":\"ERC721BatchTransferWithOperatorFiltererFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererFacet} from \\\"./../../../../token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol\\\";\\n\\n/// @title ERC721BatchTransferFacetMock\\ncontract ERC721BatchTransferWithOperatorFiltererFacetMock is ERC721BatchTransferWithOperatorFiltererFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BatchTransferWithOperatorFiltererFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x5ce0cc5cd7659a30f9d2ca72c2e30ff878e98f77c9f9394c867c4ee51a520bbc\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}.\\ncontract ERC721BatchTransferWithOperatorFiltererFacet is ERC721BatchTransferWithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BatchTransferStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x470a1f8b65f7f5b382fed75ead4e47e682d5b17df25590fc026282bbeccddee8\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"initERC721BatchTransferStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol":{"ERC721BurnableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"initERC721BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721BurnableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610c0238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610b799081610089823960805181818161084d01526109af0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461070857806379cc67901461046a578063de815811146103305763f24729651461004857600080fd5b3461032b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b5761007f61078b565b60243567ffffffffffffffff811161032b573660238201121561032b5780600401359167ffffffffffffffff831161032b573660248460051b8401011161032b5782907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926100ec610998565b936100f8858483610ac3565b159273ffffffffffffffffffffffffffffffffffffffff169060005b858110156102eb57600060248260051b860101359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102bf57860361028f57876101bc575b509081816001949352846020527fdead0000000000000000000000000000000000000000000000000000000000006040822055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610114565b740100000000000000000000000000000000000000001615801561022e575b6101e5578961015e565b6064918573ffffffffffffffffffffffffffffffffffffffff8b7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8a1614156101db565b50604491857f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b8583816102f457005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b600080fd5b3461032b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b57610367610998565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361043d577f8b8b4ef5000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b576104a161078b565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06104ce610998565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156106da5773ffffffffffffffffffffffffffffffffffffffff81168095036106a857826105239185610ac3565b156105d1575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015610645575b6105fa5780610529565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156105f0565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b576040610741610836565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032b57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107ef57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261032b5751801515810361032b5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561098657323314801561098e575b610986578033149081156108c9575b50610898576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561097a5760009161094b575b503861088c565b61096d915060203d602011610973575b61096581836107ae565b81019061081e565b38610944565b503d61095b565b6040513d6000823e3d90fd5b506000903690565b506018361061087d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ab4573233148015610ab9575b610ab4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a23575b50610a2057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561097a57600091610a95575b5038610a16565b610aae915060203d6020116109735761096581836107ae565b38610a8e565b503390565b50601836106109df565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610aee575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610ae856fea2646970667358221220a1185010e04671182352b52bcde88ec126efe533e480ee8f17f815bb5504f5d264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xC02 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB79 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x84D ADD MSTORE PUSH2 0x9AF ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x708 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x46A JUMPI DUP1 PUSH4 0xDE815811 EQ PUSH2 0x330 JUMPI PUSH4 0xF2472965 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x7F PUSH2 0x78B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32B JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x32B JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32B JUMPI CALLDATASIZE PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP5 ADD ADD GT PUSH2 0x32B JUMPI DUP3 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0xEC PUSH2 0x998 JUMP JUMPDEST SWAP4 PUSH2 0xF8 DUP6 DUP5 DUP4 PUSH2 0xAC3 JUMP JUMPDEST ISZERO SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP7 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2BF JUMPI DUP7 SUB PUSH2 0x28F JUMPI DUP8 PUSH2 0x1BC JUMPI JUMPDEST POP SWAP1 DUP2 DUP2 PUSH1 0x1 SWAP5 SWAP4 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP6 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x114 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x22E JUMPI JUMPDEST PUSH2 0x1E5 JUMPI DUP10 PUSH2 0x15E JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND EQ ISZERO PUSH2 0x1DB JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP6 DUP4 DUP2 PUSH2 0x2F4 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x367 PUSH2 0x998 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x43D JUMPI PUSH32 0x8B8B4EF500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x4A1 PUSH2 0x78B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4CE PUSH2 0x998 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x6A8 JUMPI DUP3 PUSH2 0x523 SWAP2 DUP6 PUSH2 0xAC3 JUMP JUMPDEST ISZERO PUSH2 0x5D1 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x645 JUMPI JUMPDEST PUSH2 0x5FA JUMPI DUP1 PUSH2 0x529 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x5F0 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH1 0x40 PUSH2 0x741 PUSH2 0x836 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32B JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x7EF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x986 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x98E JUMPI JUMPDEST PUSH2 0x986 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8C9 JUMPI JUMPDEST POP PUSH2 0x898 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x97A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x94B JUMPI JUMPDEST POP CODESIZE PUSH2 0x88C JUMP JUMPDEST PUSH2 0x96D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x973 JUMPI JUMPDEST PUSH2 0x965 DUP2 DUP4 PUSH2 0x7AE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x81E JUMP JUMPDEST CODESIZE PUSH2 0x944 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x95B JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAB4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAB9 JUMPI JUMPDEST PUSH2 0xAB4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA23 JUMPI JUMPDEST POP PUSH2 0xA20 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x97A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA95 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA16 JUMP JUMPDEST PUSH2 0xAAE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x973 JUMPI PUSH2 0x965 DUP2 DUP4 PUSH2 0x7AE JUMP JUMPDEST CODESIZE PUSH2 0xA8E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xAEE JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xAE8 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG1 XOR POP LT RJUMP 0x4671 XOR 0x23 MSTORE 0xB5 0x2B 0xCD 0xE8 DUP15 0xC1 0x26 0xEF JUMPF 0x33E4 DUP1 RETURNCONTRACT 0x8F OR EXTCALL ISZERO 0xBB SSTORE DIV CREATE2 0xD2 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"279:255:144:-:0;;;;;;;;;;;;;-1:-1:-1;;279:255:144;;;;-1:-1:-1;;;;;279:255:144;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;279:255:144;;;;;;745:39:76;;279:255:144;;;;;;;;745:39:76;279:255:144;;;;;;;;;;;;-1:-1:-1;279:255:144;;;;;;-1:-1:-1;279:255:144;;;;;-1:-1:-1;279:255:144"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1931,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2078,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1966,"id":null,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":2755,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":2102,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2456,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2125},{"length":32,"start":2479}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461070857806379cc67901461046a578063de815811146103305763f24729651461004857600080fd5b3461032b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b5761007f61078b565b60243567ffffffffffffffff811161032b573660238201121561032b5780600401359167ffffffffffffffff831161032b573660248460051b8401011161032b5782907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926100ec610998565b936100f8858483610ac3565b159273ffffffffffffffffffffffffffffffffffffffff169060005b858110156102eb57600060248260051b860101359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102bf57860361028f57876101bc575b509081816001949352846020527fdead0000000000000000000000000000000000000000000000000000000000006040822055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610114565b740100000000000000000000000000000000000000001615801561022e575b6101e5578961015e565b6064918573ffffffffffffffffffffffffffffffffffffffff8b7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8a1614156101db565b50604491857f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b8583816102f457005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b600080fd5b3461032b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b57610367610998565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361043d577f8b8b4ef5000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b576104a161078b565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06104ce610998565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156106da5773ffffffffffffffffffffffffffffffffffffffff81168095036106a857826105239185610ac3565b156105d1575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015610645575b6105fa5780610529565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156105f0565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032b576040610741610836565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032b57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107ef57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261032b5751801515810361032b5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561098657323314801561098e575b610986578033149081156108c9575b50610898576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561097a5760009161094b575b503861088c565b61096d915060203d602011610973575b61096581836107ae565b81019061081e565b38610944565b503d61095b565b6040513d6000823e3d90fd5b506000903690565b506018361061087d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ab4573233148015610ab9575b610ab4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a23575b50610a2057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561097a57600091610a95575b5038610a16565b610aae915060203d6020116109735761096581836107ae565b38610a8e565b503390565b50601836106109df565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610aee575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610ae856fea2646970667358221220a1185010e04671182352b52bcde88ec126efe533e480ee8f17f815bb5504f5d264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x708 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x46A JUMPI DUP1 PUSH4 0xDE815811 EQ PUSH2 0x330 JUMPI PUSH4 0xF2472965 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x7F PUSH2 0x78B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32B JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x32B JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32B JUMPI CALLDATASIZE PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP5 ADD ADD GT PUSH2 0x32B JUMPI DUP3 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0xEC PUSH2 0x998 JUMP JUMPDEST SWAP4 PUSH2 0xF8 DUP6 DUP5 DUP4 PUSH2 0xAC3 JUMP JUMPDEST ISZERO SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP7 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2BF JUMPI DUP7 SUB PUSH2 0x28F JUMPI DUP8 PUSH2 0x1BC JUMPI JUMPDEST POP SWAP1 DUP2 DUP2 PUSH1 0x1 SWAP5 SWAP4 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP6 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x114 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x22E JUMPI JUMPDEST PUSH2 0x1E5 JUMPI DUP10 PUSH2 0x15E JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND EQ ISZERO PUSH2 0x1DB JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP6 DUP4 DUP2 PUSH2 0x2F4 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x367 PUSH2 0x998 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x43D JUMPI PUSH32 0x8B8B4EF500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH2 0x4A1 PUSH2 0x78B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4CE PUSH2 0x998 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x6A8 JUMPI DUP3 PUSH2 0x523 SWAP2 DUP6 PUSH2 0xAC3 JUMP JUMPDEST ISZERO PUSH2 0x5D1 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x645 JUMPI JUMPDEST PUSH2 0x5FA JUMPI DUP1 PUSH2 0x529 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x5F0 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32B JUMPI PUSH1 0x40 PUSH2 0x741 PUSH2 0x836 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32B JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x7EF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32B JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x986 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x98E JUMPI JUMPDEST PUSH2 0x986 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8C9 JUMPI JUMPDEST POP PUSH2 0x898 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x97A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x94B JUMPI JUMPDEST POP CODESIZE PUSH2 0x88C JUMP JUMPDEST PUSH2 0x96D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x973 JUMPI JUMPDEST PUSH2 0x965 DUP2 DUP4 PUSH2 0x7AE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x81E JUMP JUMPDEST CODESIZE PUSH2 0x944 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x95B JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAB4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAB9 JUMPI JUMPDEST PUSH2 0xAB4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA23 JUMPI JUMPDEST POP PUSH2 0xA20 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x97A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA95 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA16 JUMP JUMPDEST PUSH2 0xAAE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x973 JUMPI PUSH2 0x965 DUP2 DUP4 PUSH2 0x7AE JUMP JUMPDEST CODESIZE PUSH2 0xA8E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xAEE JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xAE8 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG1 XOR POP LT RJUMP 0x4671 XOR 0x23 MSTORE 0xB5 0x2B 0xCD 0xE8 DUP15 0xC1 0x26 0xEF JUMPF 0x33E4 DUP1 RETURNCONTRACT 0x8F OR EXTCALL ISZERO 0xBB SSTORE DIV CREATE2 0xD2 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"279:255:144:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29158:19:327;;279:255:144;1606:41:312;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25879:11;;279:255:144;;;;25601:3:327;25589:10;;;;;;279:255:144;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;279:255:144;;;;;;;;;;;2414:66:327;279:255:144;;;2414:66:327;26123:35;;;;;279:255:144;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;279:255:144;25982:51:327;;279:255:144;25982:51:327;;;;279:255:144;;;;;;;25982:51:327;25914:59;279:255:144;;;;25953:11:327;279:255:144;;;;;;;;;;;25943:30:327;;25914:59;;25788:73;25827:34;279:255:144;25827:34:327;;;;;279:255:144;;;;25827:34:327;25710:64;279:255:144;25743:31:327;;;;;279:255:144;;25743:31:327;25589:10;;;26183:11;26179:110;;279:255:144;26179:110:327;-1:-1:-1;2414:66:327;26238:10;2414:66;;;-1:-1:-1;2414:66:327;279:255:144;;;;2414:66:327;;279:255:144;;;;;;;;;;;;;;;;;;1606:41:312;;:::i;:::-;279:255:144;;;;;;;3174:18:180;;;3170:53;;3898:33:327;279:255:144;500:10:59;279:255:144;500:10:59;;;;;;;636:1:180;500:10:59;;;279:255:144;3170:53:180;3201:22;279:255:144;3201:22:180;279:255:144;;;;3201:22:180;279:255:144;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;279:255:144;1606:41:312;;:::i;:::-;279:255:144;;;;;;;;;;;;;30700:19:327;;;24121:64;;279:255:144;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;279:255:144;;;;;;;;;;2414:66:327;279:255:144;;;2414:66:327;;;;24633:10;2414:66;;;;;;279:255:144;;2414:66:327;;;24674:35;;;;279:255:144;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;279:255:144;24402:51:327;;;279:255:144;24402:51:327;279:255:144;;;;;;;;;24402:51:327;24334:59;279:255:144;;;;24373:11:327;279:255:144;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;279:255:144;24234:34:327;279:255:144;;;;;;24234:34:327;24121:64;24154:31;;279:255:144;24154:31:327;279:255:144;;;;24154:31:327;279:255:144;;;;;;;;;;;;1841:39:312;;:::i;:::-;279:255:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;279:255:144;;;;;-1:-1:-1;279:255:144;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;279:255:144;2065:19:76;279:255:144;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;279:255:144;720:8:80;279:255:144;720:8:80;;279:255:144;;;;2115:1:76;2802:32;;:::o;2624:153::-;279:255:144;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;279:255:144;2361:10:76;279:255:144;;;;2771:4:76;279:255:144;;;;;-1:-1:-1;2682:95:76;;279:255:144;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;279:255:144;;;2115:1:76;279:255:144;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;279:255:144;1029:19:76;279:255:144;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;279:255:144;;;1676:74:76;;279:255:144;;;1676:74:76;;;279:255:144;1327:10:76;279:255:144;;;;1744:4:76;279:255:144;;;;;-1:-1:-1;1676:74:76;;279:255:144;;;;;;1676:74:76;;;;;;;279:255:144;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;279:255:144;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;279:255:144;;-1:-1:-1;2414:66:327;30435:11;2414:66;;279:255:144;2414:66:327;-1:-1:-1;2414:66:327;30435:27;279:255:144;-1:-1:-1;2414:66:327;;;279:255:144;2414:66:327;-1:-1:-1;2414:66:327;279:255:144;;30413:49:327;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"587400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","batchBurnFrom(address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","initERC721BurnableStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","batchBurnFrom(address,uint256[])":"f2472965","burnFrom(address,uint256)":"79cc6790","initERC721BurnableStorage()":"de815811"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"initERC721BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721BurnableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"initERC721BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol\":\"ERC721BurnableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721BurnableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721BurnableFacet} from \\\"./../../../../token/ERC721/facets/ERC721BurnableFacet.sol\\\";\\n\\n/// @title ERC721BurnableFacetMock\\ncontract ERC721BurnableFacetMock is ERC721BurnableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721BurnableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1dc6a3e2d5f8afa51c30db78b9204b6be5354e5d1e4f87543447409d58196c5a\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../base/ERC721BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC721BurnableFacet is ERC721BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x627bb13c828abe9cf131b8be40e8a212769938de5e2b1e74a588ba383ce86bb7\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"initERC721BurnableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Burnable."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol":{"ERC721DeliverableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721DeliverableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721DeliverableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721DeliverableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6109c938819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516109409081610089823960805181818161069401526107f60152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146104e65780639da5e8321461017c5763a330f88d1461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610177576100746107df565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb903690600401610569565b9060243567ffffffffffffffff8111610177576101ec903690600401610569565b926101f56107df565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff1615610495575061024b8161060a565b92610259604051948561059a565b818452602084019160051b81019036821161017757915b818310610468575050506102838361060a565b92610291604051948561059a565b808452602084019060051b82019136831161017757905b828210610458575050508051908251820361042e5760005b8281106102c957005b73ffffffffffffffffffffffffffffffffffffffff6102e88284610622565b51166102f48286610622565b5190801561040457816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff604060002054166103d6579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102c0565b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016102a8565b823573ffffffffffffffffffffffffffffffffffffffff8116810361017757815260209283019201610270565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757604061051f61067d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105db57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105db5760051b60200190565b80518210156106365760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610177575180151581036101775790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107cd5732331480156107d5575b6107cd57803314908115610710575b506106df576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101775760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107c157600091610792575b50386106d3565b6107b4915060203d6020116107ba575b6107ac818361059a565b810190610665565b3861078b565b503d6107a2565b6040513d6000823e3d90fd5b506000903690565b50601836106106c4565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108fb573233148015610900575b6108fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561086a575b5061086757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107c1576000916108dc575b503861085d565b6108f5915060203d6020116107ba576107ac818361059a565b386108d5565b503390565b506018361061082656fea264697066735822122044e8a9ea36c2d3f4dba53aba2e1eb38f5671a29736edc110de33d03333f771fc64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x9C9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x940 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x694 ADD MSTORE PUSH2 0x7F6 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x4E6 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x17C JUMPI PUSH4 0xA330F88D EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0x7DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x569 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x569 JUMP JUMPDEST SWAP3 PUSH2 0x1F5 PUSH2 0x7DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x495 JUMPI POP PUSH2 0x24B DUP2 PUSH2 0x60A JUMP JUMPDEST SWAP3 PUSH2 0x259 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x59A JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x468 JUMPI POP POP POP PUSH2 0x283 DUP4 PUSH2 0x60A JUMP JUMPDEST SWAP3 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x59A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x177 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x458 JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x42E JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2C9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E8 DUP3 DUP5 PUSH2 0x622 JUMP JUMPDEST MLOAD AND PUSH2 0x2F4 DUP3 DUP7 PUSH2 0x622 JUMP JUMPDEST MLOAD SWAP1 DUP1 ISZERO PUSH2 0x404 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3D6 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2C0 JUMP JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A8 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x270 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x40 PUSH2 0x51F PUSH2 0x67D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5DB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5DB JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x636 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x177 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7CD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7D5 JUMPI JUMPDEST PUSH2 0x7CD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI JUMPDEST POP PUSH2 0x6DF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x792 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6D3 JUMP JUMPDEST PUSH2 0x7B4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7BA JUMPI JUMPDEST PUSH2 0x7AC DUP2 DUP4 PUSH2 0x59A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x665 JUMP JUMPDEST CODESIZE PUSH2 0x78B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7A2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6C4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8FB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x900 JUMPI JUMPDEST PUSH2 0x8FB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x86A JUMPI JUMPDEST POP PUSH2 0x867 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8DC JUMPI JUMPDEST POP CODESIZE PUSH2 0x85D JUMP JUMPDEST PUSH2 0x8F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7BA JUMPI PUSH2 0x7AC DUP2 DUP4 PUSH2 0x59A JUMP JUMPDEST CODESIZE PUSH2 0x8D5 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x826 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xE8 0xA9 0xEA CALLDATASIZE 0xC2 0xD3 DELEGATECALL 0xDB 0xA5 GASPRICE 0xBA 0x2E 0x1E 0xB3 DUP16 JUMP PUSH18 0xA29736EDC110DE33D03333F771FC64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"288:264:145:-:0;;;;;;;;;;;;;-1:-1:-1;;288:264:145;;;;-1:-1:-1;;;;;288:264:145;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;288:264:145;;;;;;745:39:76;;288:264:145;;;;;;;;745:39:76;288:264:145;;;;;;;;;;;;-1:-1:-1;288:264:145;;;;;;-1:-1:-1;288:264:145;;;;;-1:-1:-1;288:264:145"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1385,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":1637,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1546,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1434,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1661,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2015,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1570,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1684},{"length":32,"start":2038}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146104e65780639da5e8321461017c5763a330f88d1461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610177576100746107df565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb903690600401610569565b9060243567ffffffffffffffff8111610177576101ec903690600401610569565b926101f56107df565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff1615610495575061024b8161060a565b92610259604051948561059a565b818452602084019160051b81019036821161017757915b818310610468575050506102838361060a565b92610291604051948561059a565b808452602084019060051b82019136831161017757905b828210610458575050508051908251820361042e5760005b8281106102c957005b73ffffffffffffffffffffffffffffffffffffffff6102e88284610622565b51166102f48286610622565b5190801561040457816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff604060002054166103d6579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102c0565b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016102a8565b823573ffffffffffffffffffffffffffffffffffffffff8116810361017757815260209283019201610270565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757604061051f61067d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105db57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105db5760051b60200190565b80518210156106365760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610177575180151581036101775790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107cd5732331480156107d5575b6107cd57803314908115610710575b506106df576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101775760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156107c157600091610792575b50386106d3565b6107b4915060203d6020116107ba575b6107ac818361059a565b810190610665565b3861078b565b503d6107a2565b6040513d6000823e3d90fd5b506000903690565b50601836106106c4565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108fb573233148015610900575b6108fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561086a575b5061086757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156107c1576000916108dc575b503861085d565b6108f5915060203d6020116107ba576107ac818361059a565b386108d5565b503390565b506018361061082656fea264697066735822122044e8a9ea36c2d3f4dba53aba2e1eb38f5671a29736edc110de33d03333f771fc64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x4E6 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x17C JUMPI PUSH4 0xA330F88D EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0x7DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x569 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x569 JUMP JUMPDEST SWAP3 PUSH2 0x1F5 PUSH2 0x7DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x495 JUMPI POP PUSH2 0x24B DUP2 PUSH2 0x60A JUMP JUMPDEST SWAP3 PUSH2 0x259 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x59A JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x468 JUMPI POP POP POP PUSH2 0x283 DUP4 PUSH2 0x60A JUMP JUMPDEST SWAP3 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x59A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x177 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x458 JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x42E JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2C9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E8 DUP3 DUP5 PUSH2 0x622 JUMP JUMPDEST MLOAD AND PUSH2 0x2F4 DUP3 DUP7 PUSH2 0x622 JUMP JUMPDEST MLOAD SWAP1 DUP1 ISZERO PUSH2 0x404 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3D6 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2C0 JUMP JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A8 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x270 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x40 PUSH2 0x51F PUSH2 0x67D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5DB JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5DB JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x636 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x177 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7CD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7D5 JUMPI JUMPDEST PUSH2 0x7CD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x710 JUMPI JUMPDEST POP PUSH2 0x6DF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x792 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6D3 JUMP JUMPDEST PUSH2 0x7B4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7BA JUMPI JUMPDEST PUSH2 0x7AC DUP2 DUP4 PUSH2 0x59A JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x665 JUMP JUMPDEST CODESIZE PUSH2 0x78B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7A2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6C4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8FB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x900 JUMPI JUMPDEST PUSH2 0x8FB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x86A JUMPI JUMPDEST POP PUSH2 0x867 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8DC JUMPI JUMPDEST POP CODESIZE PUSH2 0x85D JUMP JUMPDEST PUSH2 0x8F5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7BA JUMPI PUSH2 0x7AC DUP2 DUP4 PUSH2 0x59A JUMP JUMPDEST CODESIZE PUSH2 0x8D5 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x826 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xE8 0xA9 0xEA CALLDATASIZE 0xC2 0xD3 DELEGATECALL 0xDB 0xA5 GASPRICE 0xBA 0x2E 0x1E 0xB3 DUP16 JUMP PUSH18 0xA29736EDC110DE33D03333F771FC64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"288:264:145:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1737:41:313;;:::i;:::-;1062:8:300;288:264:145;;;1062:8:300;;;3174:18:180;;;3170:53;;3650:36:327;288:264:145;500:10:59;288:264:145;500:10:59;;;;;;;636:1:180;500:10:59;;;288:264:145;3170:53:180;3201:22;288:264:145;3201:22:180;288:264:145;;;;3201:22:180;288:264:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1737:41:313;;;:::i;:::-;1062:8:300;;288:264:145;;;;;;;;;;;;;3741:25:41;3737:66;;1062:8:300;;;;:::i;:::-;288:264:145;1062:8:300;288:264:145;;1062:8:300;;;:::i;:::-;;;;288:264:145;1062:8:300;;;;;;;288:264:145;;1062:8:300;;;;;;;;;;;;;;;;;:::i;:::-;288:264:145;1062:8:300;288:264:145;;1062:8:300;;;:::i;:::-;;;;288:264:145;1062:8:300;;;;;;;288:264:145;;1062:8:300;;;;;;;;;;;288:264:145;;;;;;;;17796:25:327;;17792:64;;288:264:145;17882:10:327;;;;;;288:264:145;17894:3:327;1062:8:300;17920:13:327;;;;:::i;:::-;288:264:145;1062:8:300;17935:11:327;;;;:::i;:::-;288:264:145;14119:16:327;;;14115:54;;288:264:145;;;;;;1062:8:300;288:264:145;;;;1062:8:300;14179:72:327;;288:264:145;762:1:41;288:264:145;;;;;;;;;;;;;;;;;;14415:10:327;288:264:145;;;;;;;;;;14455:33:327;;;;288:264:145;17871:9:327;;14179:72;14223:28;;288:264:145;14223:28:327;288:264:145;;;;14223:28:327;14115:54;14144:25;288:264:145;14144:25:327;288:264:145;;14144:25:327;17792:64;17830:26;288:264:145;17830:26:327;288:264:145;;17830:26:327;1062:8:300;;;;;288:264:145;1062:8:300;;;;;;;;;;;;;;;;;;;288:264:145;1062:8:300;;;;;;;3737:66:41;3775:28;288:264:145;3775:28:41;288:264:145;;;;;;;3775:28:41;288:264:145;;;;;;;;;;;;1972:39:313;;:::i;:::-;288:264:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1062:8:300:-;;288:264:145;;1062:8:300;288:264:145;;1062:8:300;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1062:8:300;;;;;-1:-1:-1;1062:8:300;;;;;;;;;;;;:::o;288:264:145:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;1062:8:300;2065:19:76;1062:8:300;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;288:264:145;720:8:80;288:264:145;720:8:80;;288:264:145;;;;2115:1:76;2802:32;;:::o;2624:153::-;288:264:145;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;288:264:145;2361:10:76;288:264:145;;;;2771:4:76;288:264:145;;;;;-1:-1:-1;2682:95:76;;288:264:145;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;288:264:145;;;2115:1:76;288:264:145;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;1062:8:300;1029:19:76;1062:8:300;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;288:264:145;;;1676:74:76;;1062:8:300;;;1676:74:76;;;288:264:145;1327:10:76;288:264:145;;;;1744:4:76;288:264:145;;;;;-1:-1:-1;1676:74:76;;288:264:145;;;;;;1676:74:76;;;;;;;288:264:145;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"473600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","deliver(address[],uint256[])":"infinite","initERC721DeliverableStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","deliver(address[],uint256[])":"9da5e832","initERC721DeliverableStorage()":"a330f88d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721DeliverableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721DeliverableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721DeliverableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"initERC721DeliverableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol\":\"ERC721DeliverableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721DeliverableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721DeliverableFacet} from \\\"./../../../../token/ERC721/facets/ERC721DeliverableFacet.sol\\\";\\n\\n/// @title ERC721DeliverableFacetMock\\ncontract ERC721DeliverableFacetMock is ERC721DeliverableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721DeliverableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1e34ddc899e139eda43acbb1e63d203be0bcbe7a69e7f6ed0432328edf901878\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../base/ERC721DeliverableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721DeliverableFacet is ERC721DeliverableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721DeliverableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0ec6d420f08299aa871c44b05c864c6f0db80c80e7204a463547b83d13e02d04\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"initERC721DeliverableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol":{"ERC721DeliverableOnceFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721DeliverableOnceStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721DeliverableOnceStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721DeliverableOnceFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610a1e38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610995908161008982396080518181816106e9015261084b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461053b5780639da5e8321461017c5763c0b884681461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757610074610834565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb9036906004016105be565b9060243567ffffffffffffffff8111610177576101ec9036906004016105be565b926101f5610834565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff16156104ea575061024b8161065f565b9261025960405194856105ef565b818452602084019160051b81019036821161017757915b8183106104bd575050506102838361065f565b9261029160405194856105ef565b808452602084019060051b82019136831161017757905b8282106104ad57505050805190825182036104835760005b8281106102c957005b73ffffffffffffffffffffffffffffffffffffffff6102e88284610677565b51168015610459576102fa8286610677565b5190816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205260406000205473ffffffffffffffffffffffffffffffffffffffff811661042b577fdead000000000000000000000000000000000000000000000000000000000000146103fd579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102c0565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016102a8565b823573ffffffffffffffffffffffffffffffffffffffff8116810361017757815260209283019201610270565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760406105746106d2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761063057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106305760051b60200190565b805182101561068b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610177575180151581036101775790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561082257323314801561082a575b61082257803314908115610765575b50610734576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101775760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610816576000916107e7575b5038610728565b610809915060203d60201161080f575b61080181836105ef565b8101906106ba565b386107e0565b503d6107f7565b6040513d6000823e3d90fd5b506000903690565b5060183610610719565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610950573233148015610955575b610950577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108bf575b506108bc57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561081657600091610931575b50386108b2565b61094a915060203d60201161080f5761080181836105ef565b3861092a565b503390565b506018361061087b56fea264697066735822122081d1a121974a44973e15d032636484ca250b6fe140c4d9470aa781b7de0dd84264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xA1E CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x995 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x6E9 ADD MSTORE PUSH2 0x84B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x17C JUMPI PUSH4 0xC0B88468 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0x834 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BE JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BE JUMP JUMPDEST SWAP3 PUSH2 0x1F5 PUSH2 0x834 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x4EA JUMPI POP PUSH2 0x24B DUP2 PUSH2 0x65F JUMP JUMPDEST SWAP3 PUSH2 0x259 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5EF JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4BD JUMPI POP POP POP PUSH2 0x283 DUP4 PUSH2 0x65F JUMP JUMPDEST SWAP3 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5EF JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x177 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x4AD JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x483 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2C9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E8 DUP3 DUP5 PUSH2 0x677 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x459 JUMPI PUSH2 0x2FA DUP3 DUP7 PUSH2 0x677 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x42B JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3FD JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2C0 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A8 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x270 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x40 PUSH2 0x574 PUSH2 0x6D2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x630 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x630 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x68B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x177 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x822 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x82A JUMPI JUMPDEST PUSH2 0x822 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x765 JUMPI JUMPDEST POP PUSH2 0x734 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x728 JUMP JUMPDEST PUSH2 0x809 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x80F JUMPI JUMPDEST PUSH2 0x801 DUP2 DUP4 PUSH2 0x5EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6BA JUMP JUMPDEST CODESIZE PUSH2 0x7E0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7F7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x719 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x950 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x955 JUMPI JUMPDEST PUSH2 0x950 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8BF JUMPI JUMPDEST POP PUSH2 0x8BC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x931 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x94A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x80F JUMPI PUSH2 0x801 DUP2 DUP4 PUSH2 0x5EF JUMP JUMPDEST CODESIZE PUSH2 0x92A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 DATALOADN 0xA121 SWAP8 BLOBBASEFEE PREVRANDAO SWAP8 RETURNDATACOPY ISZERO 0xD0 ORIGIN PUSH4 0x6484CA25 SIGNEXTEND PUSH16 0xE140C4D9470AA781B7DE0DD84264736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"300:276:146:-:0;;;;;;;;;;;;;-1:-1:-1;;300:276:146;;;;-1:-1:-1;;;;;300:276:146;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;300:276:146;;;;;;745:39:76;;300:276:146;;;;;;;;745:39:76;300:276:146;;;;;;;;;;;;-1:-1:-1;300:276:146;;;;;;-1:-1:-1;300:276:146;;;;;-1:-1:-1;300:276:146"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1470,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_bool_fromMemory":{"entryPoint":1722,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1631,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1519,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1746,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":2100,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1655,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1769},{"length":32,"start":2123}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e1461053b5780639da5e8321461017c5763c0b884681461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757610074610834565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb9036906004016105be565b9060243567ffffffffffffffff8111610177576101ec9036906004016105be565b926101f5610834565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff16156104ea575061024b8161065f565b9261025960405194856105ef565b818452602084019160051b81019036821161017757915b8183106104bd575050506102838361065f565b9261029160405194856105ef565b808452602084019060051b82019136831161017757905b8282106104ad57505050805190825182036104835760005b8281106102c957005b73ffffffffffffffffffffffffffffffffffffffff6102e88284610677565b51168015610459576102fa8286610677565b5190816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205260406000205473ffffffffffffffffffffffffffffffffffffffff811661042b577fdead000000000000000000000000000000000000000000000000000000000000146103fd579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102c0565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b81358152602091820191016102a8565b823573ffffffffffffffffffffffffffffffffffffffff8116810361017757815260209283019201610270565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760406105746106d2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761063057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106305760051b60200190565b805182101561068b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610177575180151581036101775790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561082257323314801561082a575b61082257803314908115610765575b50610734576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101775760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610816576000916107e7575b5038610728565b610809915060203d60201161080f575b61080181836105ef565b8101906106ba565b386107e0565b503d6107f7565b6040513d6000823e3d90fd5b506000903690565b5060183610610719565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610950573233148015610955575b610950577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108bf575b506108bc57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561081657600091610931575b50386108b2565b61094a915060203d60201161080f5761080181836105ef565b3861092a565b503390565b506018361061087b56fea264697066735822122081d1a121974a44973e15d032636484ca250b6fe140c4d9470aa781b7de0dd84264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x53B JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x17C JUMPI PUSH4 0xC0B88468 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0x834 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BE JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1EC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x5BE JUMP JUMPDEST SWAP3 PUSH2 0x1F5 PUSH2 0x834 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x4EA JUMPI POP PUSH2 0x24B DUP2 PUSH2 0x65F JUMP JUMPDEST SWAP3 PUSH2 0x259 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5EF JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4BD JUMPI POP POP POP PUSH2 0x283 DUP4 PUSH2 0x65F JUMP JUMPDEST SWAP3 PUSH2 0x291 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x5EF JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x177 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x4AD JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x483 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2C9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E8 DUP3 DUP5 PUSH2 0x677 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x459 JUMPI PUSH2 0x2FA DUP3 DUP7 PUSH2 0x677 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x42B JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3FD JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2C0 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A8 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x270 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x40 PUSH2 0x574 PUSH2 0x6D2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x630 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x630 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x68B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x177 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x822 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x82A JUMPI JUMPDEST PUSH2 0x822 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x765 JUMPI JUMPDEST POP PUSH2 0x734 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x177 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x728 JUMP JUMPDEST PUSH2 0x809 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x80F JUMPI JUMPDEST PUSH2 0x801 DUP2 DUP4 PUSH2 0x5EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6BA JUMP JUMPDEST CODESIZE PUSH2 0x7E0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x7F7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x719 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x950 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x955 JUMPI JUMPDEST PUSH2 0x950 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8BF JUMPI JUMPDEST POP PUSH2 0x8BC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x931 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x94A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x80F JUMPI PUSH2 0x801 DUP2 DUP4 PUSH2 0x5EF JUMP JUMPDEST CODESIZE PUSH2 0x92A JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x87B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 DATALOADN 0xA121 SWAP8 BLOBBASEFEE PREVRANDAO SWAP8 RETURNDATACOPY ISZERO 0xD0 ORIGIN PUSH4 0x6484CA25 SIGNEXTEND PUSH16 0xE140C4D9470AA781B7DE0DD84264736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"300:276:146:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1760:41:314;;:::i;:::-;1072:8:301;300:276:146;;;1072:8:301;;;3174:18:180;;;3170:53;;3650:36:327;300:276:146;500:10:59;300:276:146;500:10:59;;;;;;;636:1:180;500:10:59;;;300:276:146;3170:53:180;3201:22;300:276:146;3201:22:180;300:276:146;;;;3201:22:180;300:276:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1760:41:314;;;:::i;:::-;1072:8:301;;300:276:146;;;;;;;;;;;;;3741:25:41;3737:66;;1072:8:301;;;;:::i;:::-;300:276:146;1072:8:301;300:276:146;;1072:8:301;;;:::i;:::-;;;;300:276:146;1072:8:301;;;;;;;300:276:146;;1072:8:301;;;;;;;;;;;;;;;;;:::i;:::-;300:276:146;1072:8:301;300:276:146;;1072:8:301;;;:::i;:::-;;;;300:276:146;1072:8:301;;;;;;;300:276:146;;1072:8:301;;;;;;;;;;;300:276:146;;;;;;;;22754:25:327;;22750:64;;300:276:146;22840:10:327;;;;;;300:276:146;22852:3:327;1072:8:301;22884:13:327;;;;:::i;:::-;300:276:146;1072:8:301;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;300:276:146;;;;;;;;;;;;1072:8:301;;;23070:60:327;;2414:66;30830:32;23144:59;;300:276:146;762:1:41;300:276:146;;;;;;;;;;;;;;;;;;23302:10:327;300:276:146;;;;;;;;;;23350:33:327;;;;300:276:146;22829:9:327;;23144:59;23178:25;;300:276:146;23178:25:327;300:276:146;;;;23178:25:327;23070:60;23102:28;;300:276:146;23102:28:327;300:276:146;;;;23102:28:327;22911:54;22940:25;300:276:146;22940:25:327;300:276:146;;22940:25:327;22750:64;22788:26;300:276:146;22788:26:327;300:276:146;;22788:26:327;1072:8:301;;;;;300:276:146;1072:8:301;;;;;;;;;;;;;;;;;;;300:276:146;1072:8:301;;;;;;;3737:66:41;3775:28;300:276:146;3775:28:41;300:276:146;;;;;;;3775:28:41;300:276:146;;;;;;;;;;;;1995:39:314;;:::i;:::-;300:276:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1072:8:301:-;;300:276:146;;1072:8:301;300:276:146;;1072:8:301;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1072:8:301;;;;;-1:-1:-1;1072:8:301;;;;;;;;;;;;:::o;300:276:146:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;1072:8:301;2065:19:76;1072:8:301;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;300:276:146;720:8:80;300:276:146;720:8:80;;300:276:146;;;;2115:1:76;2802:32;;:::o;2624:153::-;300:276:146;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;300:276:146;2361:10:76;300:276:146;;;;2771:4:76;300:276:146;;;;;-1:-1:-1;2682:95:76;;300:276:146;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;300:276:146;;;2115:1:76;300:276:146;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;1072:8:301;1029:19:76;1072:8:301;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;300:276:146;;;1676:74:76;;1072:8:301;;;1676:74:76;;;300:276:146;1327:10:76;300:276:146;;;;1744:4:76;300:276:146;;;;;-1:-1:-1;1676:74:76;;300:276:146;;;;;;1676:74:76;;;;;;;300:276:146;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"490600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","deliver(address[],uint256[])":"infinite","initERC721DeliverableOnceStorage()":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","deliver(address[],uint256[])":"9da5e832","initERC721DeliverableOnceStorage()":"c0b88468"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721DeliverableOnceStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721DeliverableOnceStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721DeliverableOnceFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"initERC721DeliverableOnceStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol\":\"ERC721DeliverableOnceFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721DeliverableOnceFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721DeliverableOnceFacet} from \\\"./../../../../token/ERC721/facets/ERC721DeliverableOnceFacet.sol\\\";\\n\\n/// @title ERC721DeliverableOnceFacetMock\\ncontract ERC721DeliverableOnceFacetMock is ERC721DeliverableOnceFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721DeliverableOnceFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x98a63ab5c4b563b1e191507cb6240681b05a22737884341aef575900332b9940\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./../base/ERC721DeliverableOnceBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721DeliverableOnceFacet is ERC721DeliverableOnceBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721DeliverableOnceStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa56b72ed289ddb4f9904da4a9629f12aa07a427ced22a3487b501019b7cfaa63\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"initERC721DeliverableOnceStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol":{"ERC721FacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC721Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"initERC721Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721FacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61141d38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d5760805260405161139490816100898239608051818181610e8f01526110560152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063081812fc146109ca578063095ea7b31461077257806323b872dd1461073157806331e66e1e146106ae57806342842e0e146106455780636352211e1461059057806370a08231146104c6578063a22cb4651461039b578063b1c7ee0214610261578063b88d4fde1461014e5763e985e9c51461009557600080fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576100cc610a45565b73ffffffffffffffffffffffffffffffffffffffff6100e9610a68565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b346101495760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610185610a45565b61018d610a68565b6044356064359167ffffffffffffffff831161014957366023840112156101495782600401359367ffffffffffffffff8511610149573660248686010111610149577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102058484846101fe610e78565b8095610ba1565b823b61020d57005b6000602061025f97806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116019961024e6040519b8c610df0565b828b5201838a013787010152611185565b005b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610298610e78565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361036e577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576103d2610a45565b602435908115158092036101495773ffffffffffffffffffffffffffffffffffffffff806103fe610e78565b169116918183146104985760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576104fd610a45565b73ffffffffffffffffffffffffffffffffffffffff8116156105665773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561061757602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495761065336610a8b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161068a828286610683610e78565b8097610ba1565b803b61069257005b61025f93604051936106a5602086610df0565b60008552611185565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101495760406106e761103f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101495761025f61074236610a8b565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061076c610e78565b90610ba1565b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576107a9610a45565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0906107d7610e78565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561099c5773ffffffffffffffffffffffffffffffffffffffff169383851461096e5761082d818585610fbf565b1561092257508361089157740100000000000000000000000000000000000000001661087d575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583610854565b9074010000000000000000000000000000000000000000821780920361090e575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610856565b8460005260205260406000205583806108b2565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576020610a276004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610afd565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101495760043573ffffffffffffffffffffffffffffffffffffffff81168103610149579060243573ffffffffffffffffffffffffffffffffffffffff81168103610149579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610b7357740100000000000000000000000000000000000000001615610b6c576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610dc657846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610d985773ffffffffffffffffffffffffffffffffffffffff8116809503610d665782610c159185610fbf565b15610cab575b5050836000528060205282604060002055828203610c5c575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610c34565b7401000000000000000000000000000000000000000016158015610d20575b610cd45780610c1b565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610cca565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e3157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610149575180151581036101495790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610fb0573233148015610fb5575b610fb0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610f03575b50610f0057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610fa457600091610f75575b5038610ef6565b610f97915060203d602011610f9d575b610f8f8183610df0565b810190610e60565b38610f6e565b503d610f85565b6040513d6000823e3d90fd5b503390565b5060183610610ebf565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610fea575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610fe4565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561117357323314801561117b575b611173578033149081156110d2575b506110a1576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101495760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610fa457600091611154575b5038611095565b61116d915060203d602011610f9d57610f8f8183610df0565b3861114d565b506000903690565b5060183610611086565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061134657505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610fa4576000916112c4575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611294575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161133e575b816112dd60209383610df0565b8101031261133a5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361133757507fffffffff00000000000000000000000000000000000000000000000000000000611246565b80fd5b5080fd5b3d91506112d0565b602082820181015160a48784010152859350016111f156fea2646970667358221220f9802943ec163296a8ca6d68aec818b8956a4e7f7faaf647714f2156d9b9315a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x141D CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1394 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xE8F ADD MSTORE PUSH2 0x1056 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0x9CA JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x772 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x731 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x6AE JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x645 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x590 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x4C6 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x14E JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0xCC PUSH2 0xA45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xE9 PUSH2 0xA68 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x185 PUSH2 0xA45 JUMP JUMPDEST PUSH2 0x18D PUSH2 0xA68 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x149 JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x149 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x205 DUP5 DUP5 DUP5 PUSH2 0x1FE PUSH2 0xE78 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0xBA1 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x20D JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x25F SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xDF0 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x1185 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x298 PUSH2 0xE78 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36E JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x3D2 PUSH2 0xA45 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x149 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3FE PUSH2 0xE78 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x498 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x4FD PUSH2 0xA45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x566 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x617 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x653 CALLDATASIZE PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x68A DUP3 DUP3 DUP7 PUSH2 0x683 PUSH2 0xE78 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xBA1 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x692 JUMPI STOP JUMPDEST PUSH2 0x25F SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x6A5 PUSH1 0x20 DUP7 PUSH2 0xDF0 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x1185 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x40 PUSH2 0x6E7 PUSH2 0x103F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x25F PUSH2 0x742 CALLDATASIZE PUSH2 0xA8B JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x76C PUSH2 0xE78 JUMP JUMPDEST SWAP1 PUSH2 0xBA1 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x7A9 PUSH2 0xA45 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x7D7 PUSH2 0xE78 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x99C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x96E JUMPI PUSH2 0x82D DUP2 DUP6 DUP6 PUSH2 0xFBF JUMP JUMPDEST ISZERO PUSH2 0x922 JUMPI POP DUP4 PUSH2 0x891 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x87D JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x854 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x90E JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x856 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x8B2 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x20 PUSH2 0xA27 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xAFD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xB73 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xB6C JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xDC6 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xD98 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xD66 JUMPI DUP3 PUSH2 0xC15 SWAP2 DUP6 PUSH2 0xFBF JUMP JUMPDEST ISZERO PUSH2 0xCAB JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xC5C JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xC34 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xD20 JUMPI JUMPDEST PUSH2 0xCD4 JUMPI DUP1 PUSH2 0xC1B JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xCCA JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xE31 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x149 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x149 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFB0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFB5 JUMPI JUMPDEST PUSH2 0xFB0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF03 JUMPI JUMPDEST POP PUSH2 0xF00 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF75 JUMPI JUMPDEST POP CODESIZE PUSH2 0xEF6 JUMP JUMPDEST PUSH2 0xF97 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xF9D JUMPI JUMPDEST PUSH2 0xF8F DUP2 DUP4 PUSH2 0xDF0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xE60 JUMP JUMPDEST CODESIZE PUSH2 0xF6E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xF85 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEBF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xFEA JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xFE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1173 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x117B JUMPI JUMPDEST PUSH2 0x1173 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10D2 JUMPI JUMPDEST POP PUSH2 0x10A1 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x149 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1154 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1095 JUMP JUMPDEST PUSH2 0x116D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xF9D JUMPI PUSH2 0xF8F DUP2 DUP4 PUSH2 0xDF0 JUMP JUMPDEST CODESIZE PUSH2 0x114D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1086 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1346 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12C4 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1294 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x133E JUMPI JUMPDEST DUP2 PUSH2 0x12DD PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDF0 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x133A JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x1337 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1246 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x12D0 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x11F1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTDELEGATECALL DUP1 0x29 NUMBER EOFCREATE 0x16 ORIGIN SWAP7 0xA8 0xCA PUSH14 0x68AEC818B8956A4E7F7FAAF64771 0x4F 0x21 JUMP 0xD9 0xB9 BALANCE GAS PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"255:231:147:-:0;;;;;;;;;;;;;-1:-1:-1;;255:231:147;;;;-1:-1:-1;;;;;255:231:147;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;255:231:147;;;;;;745:39:76;;255:231:147;;;;;;;;745:39:76;255:231:147;;;;;;;;;;;;-1:-1:-1;255:231:147;;;;;;-1:-1:-1;255:231:147;;;;;-1:-1:-1;255:231:147"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2629,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":2699,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_bool_fromMemory":{"entryPoint":3680,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":2664,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":3568,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":4485,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_getApproved":{"entryPoint":2813,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":4031,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":4159,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3704,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferFrom":{"entryPoint":2977,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3727},{"length":32,"start":4182}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063081812fc146109ca578063095ea7b31461077257806323b872dd1461073157806331e66e1e146106ae57806342842e0e146106455780636352211e1461059057806370a08231146104c6578063a22cb4651461039b578063b1c7ee0214610261578063b88d4fde1461014e5763e985e9c51461009557600080fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576100cc610a45565b73ffffffffffffffffffffffffffffffffffffffff6100e9610a68565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b346101495760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610185610a45565b61018d610a68565b6044356064359167ffffffffffffffff831161014957366023840112156101495782600401359367ffffffffffffffff8511610149573660248686010111610149577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102058484846101fe610e78565b8095610ba1565b823b61020d57005b6000602061025f97806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116019961024e6040519b8c610df0565b828b5201838a013787010152611185565b005b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610298610e78565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361036e577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576103d2610a45565b602435908115158092036101495773ffffffffffffffffffffffffffffffffffffffff806103fe610e78565b169116918183146104985760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576104fd610a45565b73ffffffffffffffffffffffffffffffffffffffff8116156105665773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561061757602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495761065336610a8b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161068a828286610683610e78565b8097610ba1565b803b61069257005b61025f93604051936106a5602086610df0565b60008552611185565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101495760406106e761103f565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346101495761025f61074236610a8b565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061076c610e78565b90610ba1565b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576107a9610a45565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0906107d7610e78565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561099c5773ffffffffffffffffffffffffffffffffffffffff169383851461096e5761082d818585610fbf565b1561092257508361089157740100000000000000000000000000000000000000001661087d575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583610854565b9074010000000000000000000000000000000000000000821780920361090e575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610856565b8460005260205260406000205583806108b2565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576020610a276004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610afd565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101495760043573ffffffffffffffffffffffffffffffffffffffff81168103610149579060243573ffffffffffffffffffffffffffffffffffffffff81168103610149579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610b7357740100000000000000000000000000000000000000001615610b6c576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610dc657846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610d985773ffffffffffffffffffffffffffffffffffffffff8116809503610d665782610c159185610fbf565b15610cab575b5050836000528060205282604060002055828203610c5c575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610c34565b7401000000000000000000000000000000000000000016158015610d20575b610cd45780610c1b565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610cca565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e3157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610149575180151581036101495790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610fb0573233148015610fb5575b610fb0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610f03575b50610f0057503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610fa457600091610f75575b5038610ef6565b610f97915060203d602011610f9d575b610f8f8183610df0565b810190610e60565b38610f6e565b503d610f85565b6040513d6000823e3d90fd5b503390565b5060183610610ebf565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610fea575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610fe4565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561117357323314801561117b575b611173578033149081156110d2575b506110a1576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101495760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610fa457600091611154575b5038611095565b61116d915060203d602011610f9d57610f8f8183610df0565b3861114d565b506000903690565b5060183610611086565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061134657505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610fa4576000916112c4575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611294575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161133e575b816112dd60209383610df0565b8101031261133a5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361133757507fffffffff00000000000000000000000000000000000000000000000000000000611246565b80fd5b5080fd5b3d91506112d0565b602082820181015160a48784010152859350016111f156fea2646970667358221220f9802943ec163296a8ca6d68aec818b8956a4e7f7faaf647714f2156d9b9315a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0x9CA JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x772 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x731 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x6AE JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x645 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x590 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x4C6 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x14E JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0xCC PUSH2 0xA45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xE9 PUSH2 0xA68 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x185 PUSH2 0xA45 JUMP JUMPDEST PUSH2 0x18D PUSH2 0xA68 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x149 JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x149 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x205 DUP5 DUP5 DUP5 PUSH2 0x1FE PUSH2 0xE78 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0xBA1 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x20D JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x25F SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xDF0 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x1185 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x298 PUSH2 0xE78 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36E JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x3D2 PUSH2 0xA45 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x149 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3FE PUSH2 0xE78 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x498 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x4FD PUSH2 0xA45 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x566 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x617 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x653 CALLDATASIZE PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x68A DUP3 DUP3 DUP7 PUSH2 0x683 PUSH2 0xE78 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xBA1 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x692 JUMPI STOP JUMPDEST PUSH2 0x25F SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x6A5 PUSH1 0x20 DUP7 PUSH2 0xDF0 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x1185 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x40 PUSH2 0x6E7 PUSH2 0x103F JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x25F PUSH2 0x742 CALLDATASIZE PUSH2 0xA8B JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x76C PUSH2 0xE78 JUMP JUMPDEST SWAP1 PUSH2 0xBA1 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x7A9 PUSH2 0xA45 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x7D7 PUSH2 0xE78 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x99C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x96E JUMPI PUSH2 0x82D DUP2 DUP6 DUP6 PUSH2 0xFBF JUMP JUMPDEST ISZERO PUSH2 0x922 JUMPI POP DUP4 PUSH2 0x891 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x87D JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x854 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x90E JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x856 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x8B2 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x20 PUSH2 0xA27 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xAFD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xB73 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xB6C JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xDC6 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xD98 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xD66 JUMPI DUP3 PUSH2 0xC15 SWAP2 DUP6 PUSH2 0xFBF JUMP JUMPDEST ISZERO PUSH2 0xCAB JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xC5C JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xC34 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xD20 JUMPI JUMPDEST PUSH2 0xCD4 JUMPI DUP1 PUSH2 0xC1B JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xCCA JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xE31 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x149 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x149 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFB0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xFB5 JUMPI JUMPDEST PUSH2 0xFB0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF03 JUMPI JUMPDEST POP PUSH2 0xF00 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xF75 JUMPI JUMPDEST POP CODESIZE PUSH2 0xEF6 JUMP JUMPDEST PUSH2 0xF97 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xF9D JUMPI JUMPDEST PUSH2 0xF8F DUP2 DUP4 PUSH2 0xDF0 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xE60 JUMP JUMPDEST CODESIZE PUSH2 0xF6E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xF85 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xEBF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xFEA JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xFE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1173 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x117B JUMPI JUMPDEST PUSH2 0x1173 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10D2 JUMPI JUMPDEST POP PUSH2 0x10A1 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x149 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1154 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1095 JUMP JUMPDEST PUSH2 0x116D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xF9D JUMPI PUSH2 0xF8F DUP2 DUP4 PUSH2 0xDF0 JUMP JUMPDEST CODESIZE PUSH2 0x114D JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1086 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1346 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x12C4 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1294 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x133E JUMPI JUMPDEST DUP2 PUSH2 0x12DD PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDF0 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x133A JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x1337 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1246 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x12D0 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x11F1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTDELEGATECALL DUP1 0x29 NUMBER EOFCREATE 0x16 ORIGIN SWAP7 0xA8 0xCA PUSH14 0x68AEC818B8956A4E7F7FAAF64771 0x4F 0x21 JUMP 0xD9 0xB9 BALANCE GAS PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"255:231:147:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;255:231:147;-1:-1:-1;255:231:147;28718:11:327;255:231:147;;;;-1:-1:-1;255:231:147;28718:28:327;255:231:147;-1:-1:-1;255:231:147;;;;;;-1:-1:-1;255:231:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11217:7:327;1513:41:315;;;;;:::i;:::-;11217:7:327;;;:::i;:::-;376:58:354;;11235:101:327;;255:231:147;11235:101:327;255:231:147;;11271:54:327;255:231:147;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11271:54:327;:::i;:::-;255:231:147;;;;;;;;;;;;1513:41:315;;:::i;:::-;255:231:147;;;;;;;3174:18:180;;;3170:53;;2657:25:327;255:231:147;500:10:59;255:231:147;500:10:59;;;255:231:147;;;;636:1:180;255:231:147;;;;3170:53:180;3201:22;255:231:147;3201:22:180;255:231:147;;;;3201:22:180;255:231:147;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1513:41:315;;;:::i;:::-;255:231:147;;;6339:18:327;;;;6335:63;;255:231:147;6463:42:327;6408:19;255:231:147;-1:-1:-1;255:231:147;6408:11:327;255:231:147;;;-1:-1:-1;255:231:147;;-1:-1:-1;255:231:147;;;;-1:-1:-1;255:231:147;;;;;;;;;;;;;;;;6463:42:327;255:231:147;6335:63:327;6366:32;;255:231:147;6366:32:327;255:231:147;;;;6366:32:327;255:231:147;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;255:231:147;;-1:-1:-1;255:231:147;26801:10:327;255:231:147;;;;-1:-1:-1;255:231:147;;;;;;;;26724:60:327;26756:28;255:231:147;26756:28:327;255:231:147;;26756:28:327;255:231:147;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;255:231:147;;;;;;;;27291:64:327;27324:31;;255:231:147;27324:31:327;255:231:147;;;;27324:31:327;255:231:147;;;;;;;:::i;:::-;;1513:41:315;9668:7:327;1513:41:315;;;;;:::i;:::-;9668:7:327;;;:::i;:::-;376:58:354;;9686:99:327;;255:231:147;9686:99:327;9722:52;255:231:147;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;255:231:147:-;;;;;;;;;;;;1748:39:315;;:::i;:::-;255:231:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1128:7:296;255:231:147;;;:::i;:::-;29158:19:327;255:231:147;1513:41:315;;:::i;:::-;1128:7:296;;:::i;255:231:147:-;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;255:231:147;1513:41:315;;;:::i;:::-;255:231:147;;;;;;;;;;;;;;30700:19:327;;;4802:64;;255:231:147;;4931:18:327;;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;255:231:147;5670:35:327;;255:231:147;5157:173:327;255:231:147;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;255:231:147;;;;;5620:11:327;255:231:147;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;255:231:147;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;255:231:147;5052:59:327;;;255:231:147;5052:59:327;255:231:147;;;;;;;;;5052:59:327;4927:63;4958:32;;255:231:147;4958:32:327;255:231:147;;;;4958:32:327;4802:64;4835:31;;255:231:147;4835:31:327;255:231:147;;;;4835:31:327;255:231:147;;;;;;;;;;;;2087:43:296;255:231:147;;;2087:43:296;:::i;:::-;255:231:147;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27798:360:327:-;255:231:147;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;255:231:147;;;28073:11:327;255:231:147;;;;;;;;28066:27:327;:::o;28022:130::-;28124:17;;255:231:147;28124:17:327;:::o;27948:64::-;27981:31;;255:231:147;27981:31:327;;255:231:147;;;27981:31:327;7385:956;;;255:231:147;;7507:16:327;;;7503:58;;255:231:147;7521:1:327;255:231:147;;;;;7521:1:327;255:231:147;;;;;30700:19:327;;;7615:64;;255:231:147;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;255:231:147;;;7521:1:327;255:231:147;;;;;;7521:1:327;255:231:147;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;255:231:147;-1:-1:-1;255:231:147;;;;;-1:-1:-1;255:231:147;;;;;2220:8:327;;255:231:147;-1:-1:-1;255:231:147;;;;-1:-1:-1;255:231:147;8155:10:327;255:231:147;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;255:231:147;7896:51:327;;;7521:1;7896:51;255:231:147;7896:51:327;255:231:147;;;;;;7521:1:327;7896:51;7828:59;255:231:147;;7521:1:327;255:231:147;7867:11:327;;;255:231:147;;;;7521:1:327;255:231:147;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;255:231:147;;;;7521:1:327;7728:34;7615:64;7648:31;;7521:1;7648:31;;255:231:147;;7521:1:327;7648:31;7503:58;7532:29;7521:1;7532:29;;7521:1;7532:29;255:231:147;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;255:231:147;;;;;-1:-1:-1;255:231:147;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;255:231:147;1029:19:76;255:231:147;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;255:231:147;;;1676:74:76;;255:231:147;;;1676:74:76;;;255:231:147;1327:10:76;255:231:147;;;;1744:4:76;255:231:147;;;;;-1:-1:-1;1676:74:76;;255:231:147;;;;;;1676:74:76;;;;;;;255:231:147;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;255:231:147;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;255:231:147;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;255:231:147;;-1:-1:-1;255:231:147;30435:11:327;255:231:147;;;;-1:-1:-1;255:231:147;30435:27:327;255:231:147;-1:-1:-1;255:231:147;;;;;-1:-1:-1;255:231:147;;;30413:49:327;;;;;1938:939:76;255:231:147;2065:19:76;255:231:147;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;255:231:147;720:8:80;255:231:147;720:8:80;;255:231:147;;;;2115:1:76;2802:32;;:::o;2624:153::-;255:231:147;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;255:231:147;2361:10:76;255:231:147;;;;2771:4:76;255:231:147;;;;;-1:-1:-1;2682:95:76;;255:231:147;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;;255:231:147;29701:270:327;;;;;;255:231:147;;;;;29832:65:327;255:231:147;29832:65:327;;255:231:147;29832:65:327;;;255:231:147;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;255:231:147;;;;;;;;;;;;;-1:-1:-1;255:231:147;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;255:231:147;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29828:136::-;29925:39;-1:-1:-1;29925:39:327;29832:65;255:231:147;;;;-1:-1:-1;29925:39:327;29832:65;255:231:147;29832:65:327;;255:231:147;29832:65:327;;;;;;255:231:147;29832:65:327;;;:::i;:::-;;;255:231:147;;;;;;;;;;;;;29832:65:327;255:231:147;29832:65:327;;255:231:147;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;255:231:147;;;;;;;;;;;;;;;;-1:-1:-1;255:231:147;;"},"gasEstimates":{"creation":{"codeDepositCost":"1002400","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2531","getApproved(uint256)":"4574","initERC721Storage()":"infinite","isApprovedForAll(address,address)":"2736","ownerOf(uint256)":"2454","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","transferFrom(address,address,uint256)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","initERC721Storage()":"b1c7ee02","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"initERC721Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721FacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"initERC721Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol\":\"ERC721FacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721FacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Facet} from \\\"./../../../../token/ERC721/facets/ERC721Facet.sol\\\";\\n\\n/// @title ERC721FacetMock\\ncontract ERC721FacetMock is ERC721Facet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721Facet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x2c7466cf46918ead0591338eaa32169e97c60aedb7e58b4e22d0d47b7d630df9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721Base} from \\\"./../base/ERC721Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC721Facet is ERC721Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc0a23ae73e0959fab307e0f323a45a835c55b9a4cddf156ab5857d43d069afc6\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"initERC721Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC721."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol":{"ERC721MetadataFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"}],"name":"initERC721MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initERC721MetadataStorage(string,string,address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}}},"title":"ERC721MetadataFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610ff238819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610f6990816100898239608051818181610bb40152610d0a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610a4e57806331e66e1e146109cb57806395d89b4114610964578063a0c76f62146108f3578063c87b56dd146106c75763fa6d22ca1461005e57600080fd5b346106c25760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c25760043567ffffffffffffffff81116106c2576100ad903690600401610b16565b60243567ffffffffffffffff81116106c2576100cd903690600401610b16565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036106c2576100f9610cf3565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361069557507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58546001811015610663575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116105345781906101c98454610e1e565b601f8111610610575b50600090601f831160011461056e57600092610563575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610534576102547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610e1e565b601f81116104b0575b506000601f82116001146103b5578192936000926103aa575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f5b5e139f000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590503880610276565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8681106104985750836001959610610460575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556102c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610433565b90926020600181928686013581550194019101610420565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061052a575b601f0160051c01905b81811061051e575061025d565b60008155600101610511565b9091508190610508565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101e9565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105f857509084600195949392106105c0575b505050811b01905561021b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806105b3565b9193602060018192878701358155019501920161059d565b909150836000526020600020601f840160051c81019160208510610659575b90601f859493920160051c01905b81811061064a57506101d2565b6000815584935060010161063d565b909150819061062f565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c257600435806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff60406000205416156108c657600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416916044604051809481937ff724dad700000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9081156108ba576000916107d7575b604051806107d38482610acc565b0390f35b3d8083833e6107e68183610b44565b8101906020818303126108b25780519067ffffffffffffffff82116108b6570181601f820112156108b25780519267ffffffffffffffff8411610885576040519261085960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610b44565b8484526020858401011161088257506107d39261087c9160208085019101610aa9565b906107c5565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c257602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576107d36109bf7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e71565b60405191829182610acc565b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576040610a04610b9d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576107d36109bf7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e71565b60005b838110610abc5750506000910152565b8181015183820152602001610aac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610b0f8151809281602088015260208888019101610aa9565b0116010190565b9181601f840112156106c25782359167ffffffffffffffff83116106c257602083818601950101116106c257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761053457604052565b908160209103126106c2575180151581036106c25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ce1573233148015610ce9575b610ce157803314908115610c30575b50610bff576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116106c25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156108ba57600091610cb2575b5038610bf3565b610cd4915060203d602011610cda575b610ccc8183610b44565b810190610b85565b38610cab565b503d610cc2565b506000903690565b5060183610610be4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e0f573233148015610e14575b610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d7e575b50610d7b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108ba57600091610df0575b5038610d71565b610e09915060203d602011610cda57610ccc8183610b44565b38610de9565b503390565b5060183610610d3a565b90600182811c92168015610e67575b6020831014610e3857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610e2d565b9060405191826000825492610e8584610e1e565b8084529360018116908115610ef35750600114610eac575b50610eaa92500383610b44565b565b90506000929192526020600020906000915b818310610ed7575050906020610eaa9282010138610e9d565b6020919350806001915483858901015201910190918492610ebe565b60209350610eaa9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610e9d56fea2646970667358221220c72a26fd9e989311b1c74405d29e0ce3714d9c906ae96670ab8030887af43d3164736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xFF2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xF69 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xBB4 ADD MSTORE PUSH2 0xD0A ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xA4E JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x9CB JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x964 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x8F3 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x6C7 JUMPI PUSH4 0xFA6D22CA EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6C2 JUMPI PUSH2 0xAD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xB16 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6C2 JUMPI PUSH2 0xCD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xB16 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6C2 JUMPI PUSH2 0xF9 PUSH2 0xCF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x695 JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x663 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x534 JUMPI DUP2 SWAP1 PUSH2 0x1C9 DUP5 SLOAD PUSH2 0xE1E JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x610 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x56E JUMPI PUSH1 0x0 SWAP3 PUSH2 0x563 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x534 JUMPI PUSH2 0x254 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xE1E JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x4B0 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3B5 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x3AA JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0x5B5E139F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x276 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x498 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x460 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x433 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x420 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x52A JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x51E JUMPI POP PUSH2 0x25D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x511 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x508 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1E9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5F8 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5C0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x21B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x5B3 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x59D JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x659 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x64A JUMPI POP PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x63D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x62F JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8C6 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7D7 JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x7D3 DUP5 DUP3 PUSH2 0xACC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x7E6 DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x8B2 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8B6 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x8B2 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x885 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0x859 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xB44 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x882 JUMPI POP PUSH2 0x7D3 SWAP3 PUSH2 0x87C SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP1 PUSH2 0x7C5 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH2 0x7D3 PUSH2 0x9BF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE71 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xACC JUMP JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x40 PUSH2 0xA04 PUSH2 0xB9D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH2 0x7D3 PUSH2 0x9BF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE71 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xABC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xAAC JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xB0F DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xAA9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6C2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6C2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6C2 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x534 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x6C2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x6C2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCE1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCE9 JUMPI JUMPDEST PUSH2 0xCE1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC30 JUMPI JUMPDEST POP PUSH2 0xBFF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x6C2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB2 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0xCD4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCDA JUMPI JUMPDEST PUSH2 0xCCC DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB85 JUMP JUMPDEST CODESIZE PUSH2 0xCAB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCC2 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE0F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE14 JUMPI JUMPDEST PUSH2 0xE0F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD7E JUMPI JUMPDEST POP PUSH2 0xD7B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDF0 JUMPI JUMPDEST POP CODESIZE PUSH2 0xD71 JUMP JUMPDEST PUSH2 0xE09 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCDA JUMPI PUSH2 0xCCC DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST CODESIZE PUSH2 0xDE9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD3A JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xE67 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xE38 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xE2D JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE85 DUP5 PUSH2 0xE1E JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xEF3 JUMPI POP PUSH1 0x1 EQ PUSH2 0xEAC JUMPI JUMPDEST POP PUSH2 0xEAA SWAP3 POP SUB DUP4 PUSH2 0xB44 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xED7 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xEAA SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xE9D JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xEAA SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xE9D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 0x2A 0x26 REVERT SWAP15 SWAP9 SWAP4 GT 0xB1 0xC7 PREVRANDAO SDIV 0xD2 SWAP15 0xC CALLF 0x714D SWAP13 SWAP1 PUSH11 0xE96670AB8030887AF43D31 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"279:255:148:-:0;;;;;;;;;;;;;-1:-1:-1;;279:255:148;;;;-1:-1:-1;;;;;279:255:148;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;279:255:148;;;;;;745:39:76;;279:255:148;;;;;;;;745:39:76;279:255:148;;;;;;;;;;;;-1:-1:-1;279:255:148;;;;;;-1:-1:-1;279:255:148;;;;;-1:-1:-1;279:255:148"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":2949,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":2838,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":2764,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":3697,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":2729,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":3614,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2884,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":2973,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3315,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2996},{"length":32,"start":3338}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610a4e57806331e66e1e146109cb57806395d89b4114610964578063a0c76f62146108f3578063c87b56dd146106c75763fa6d22ca1461005e57600080fd5b346106c25760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c25760043567ffffffffffffffff81116106c2576100ad903690600401610b16565b60243567ffffffffffffffff81116106c2576100cd903690600401610b16565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036106c2576100f9610cf3565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361069557507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58546001811015610663575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116105345781906101c98454610e1e565b601f8111610610575b50600090601f831160011461056e57600092610563575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610534576102547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610e1e565b601f81116104b0575b506000601f82116001146103b5578192936000926103aa575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f5b5e139f000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590503880610276565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8681106104985750836001959610610460575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556102c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610433565b90926020600181928686013581550194019101610420565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061052a575b601f0160051c01905b81811061051e575061025d565b60008155600101610511565b9091508190610508565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101e9565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105f857509084600195949392106105c0575b505050811b01905561021b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806105b3565b9193602060018192878701358155019501920161059d565b909150836000526020600020601f840160051c81019160208510610659575b90601f859493920160051c01905b81811061064a57506101d2565b6000815584935060010161063d565b909150819061062f565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c257600435806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff60406000205416156108c657600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416916044604051809481937ff724dad700000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9081156108ba576000916107d7575b604051806107d38482610acc565b0390f35b3d8083833e6107e68183610b44565b8101906020818303126108b25780519067ffffffffffffffff82116108b6570181601f820112156108b25780519267ffffffffffffffff8411610885576040519261085960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610b44565b8484526020858401011161088257506107d39261087c9160208085019101610aa9565b906107c5565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c257602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576107d36109bf7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e71565b60405191829182610acc565b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576040610a04610b9d565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346106c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106c2576107d36109bf7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e71565b60005b838110610abc5750506000910152565b8181015183820152602001610aac565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610b0f8151809281602088015260208888019101610aa9565b0116010190565b9181601f840112156106c25782359167ffffffffffffffff83116106c257602083818601950101116106c257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761053457604052565b908160209103126106c2575180151581036106c25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ce1573233148015610ce9575b610ce157803314908115610c30575b50610bff576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116106c25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156108ba57600091610cb2575b5038610bf3565b610cd4915060203d602011610cda575b610ccc8183610b44565b810190610b85565b38610cab565b503d610cc2565b506000903690565b5060183610610be4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e0f573233148015610e14575b610e0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d7e575b50610d7b57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156108ba57600091610df0575b5038610d71565b610e09915060203d602011610cda57610ccc8183610b44565b38610de9565b503390565b5060183610610d3a565b90600182811c92168015610e67575b6020831014610e3857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610e2d565b9060405191826000825492610e8584610e1e565b8084529360018116908115610ef35750600114610eac575b50610eaa92500383610b44565b565b90506000929192526020600020906000915b818310610ed7575050906020610eaa9282010138610e9d565b6020919350806001915483858901015201910190918492610ebe565b60209350610eaa9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610e9d56fea2646970667358221220c72a26fd9e989311b1c74405d29e0ce3714d9c906ae96670ab8030887af43d3164736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xA4E JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x9CB JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x964 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x8F3 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x6C7 JUMPI PUSH4 0xFA6D22CA EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6C2 JUMPI PUSH2 0xAD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xB16 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6C2 JUMPI PUSH2 0xCD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xB16 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6C2 JUMPI PUSH2 0xF9 PUSH2 0xCF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x695 JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x663 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x534 JUMPI DUP2 SWAP1 PUSH2 0x1C9 DUP5 SLOAD PUSH2 0xE1E JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x610 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x56E JUMPI PUSH1 0x0 SWAP3 PUSH2 0x563 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x534 JUMPI PUSH2 0x254 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xE1E JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x4B0 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3B5 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x3AA JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0x5B5E139F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x276 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x498 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x460 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x433 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x420 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x52A JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x51E JUMPI POP PUSH2 0x25D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x511 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x508 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1E9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5F8 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5C0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x21B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x5B3 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x59D JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x659 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x64A JUMPI POP PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x63D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x62F JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8C6 JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7D7 JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x7D3 DUP5 DUP3 PUSH2 0xACC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x7E6 DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x8B2 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8B6 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x8B2 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x885 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0x859 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xB44 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x882 JUMPI POP PUSH2 0x7D3 SWAP3 PUSH2 0x87C SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xAA9 JUMP JUMPDEST SWAP1 PUSH2 0x7C5 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH2 0x7D3 PUSH2 0x9BF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE71 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xACC JUMP JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH1 0x40 PUSH2 0xA04 PUSH2 0xB9D JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x6C2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6C2 JUMPI PUSH2 0x7D3 PUSH2 0x9BF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE71 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xABC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xAAC JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xB0F DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xAA9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6C2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6C2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6C2 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x534 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x6C2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x6C2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCE1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCE9 JUMPI JUMPDEST PUSH2 0xCE1 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xC30 JUMPI JUMPDEST POP PUSH2 0xBFF JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x6C2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xCB2 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBF3 JUMP JUMPDEST PUSH2 0xCD4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCDA JUMPI JUMPDEST PUSH2 0xCCC DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xB85 JUMP JUMPDEST CODESIZE PUSH2 0xCAB JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xCC2 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE0F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE14 JUMPI JUMPDEST PUSH2 0xE0F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD7E JUMPI JUMPDEST POP PUSH2 0xD7B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8BA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDF0 JUMPI JUMPDEST POP CODESIZE PUSH2 0xD71 JUMP JUMPDEST PUSH2 0xE09 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCDA JUMPI PUSH2 0xCCC DUP2 DUP4 PUSH2 0xB44 JUMP JUMPDEST CODESIZE PUSH2 0xDE9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD3A JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xE67 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xE38 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xE2D JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE85 DUP5 PUSH2 0xE1E JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xEF3 JUMPI POP PUSH1 0x1 EQ PUSH2 0xEAC JUMPI JUMPDEST POP PUSH2 0xEAA SWAP3 POP SUB DUP4 PUSH2 0xB44 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xED7 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xEAA SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xE9D JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xEAA SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xE9D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 0x2A 0x26 REVERT SWAP15 SWAP9 SWAP4 GT 0xB1 0xC7 PREVRANDAO SDIV 0xD2 SWAP15 0xC CALLF 0x714D SWAP13 SWAP1 PUSH11 0xE96670AB8030887AF43D31 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"279:255:148:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2136:12:316;;:::i;:::-;279:255:148;;;;;;;3174:18:180;;;3170:53;;3529:19:341;279:255:148;;;;636:1:180;900:21:181;;;896:88;;279:255:148;636:1:180;279:255:148;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;279:255:148;583:77:341;279:255:148;583:77:341;;;;;;;;279:255:148;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;279:255:148;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;279:255:148;583:77:341;;;;;;;;;;279:255:148;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;2159:13;583:77;;;2196:23;583:77;;;2196:23;583:77;3154:33:327;279:255:148;500:10:59;279:255:148;;500:10:59;279:255:148;;500:10:59;636:1:180;500:10:59;;;;;;;279:255:148;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;279:255:148;636:1:180;583:77:341;;;;;;;;;;;;;;;;2159:13;279:255:148;583:77:341;;;;;;;;;;279:255:148;583:77:341;;;;;;;;;;;;;;;;;;;;;279:255:148;583:77:341;;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;279:255:148;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;279:255:148;583:77:341;;;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;279:255:148;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;279:255:148;583:77:341;279:255:148;;583:77:341;;;;;;;;;279:255:148;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;279:255:148;583:77:341;;;;-1:-1:-1;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;896:88:181;930:54;279:255:148;930:54:181;279:255:148;;636:1:180;279:255:148;;;;930:54:181;3170:53:180;3201:22;279:255:148;3201:22:180;279:255:148;;;;3201:22:180;279:255:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;27291:64;;279:255:148;;3364:23:341;279:255:148;;;3364:64:341;279:255:148;;3364:64:341;;;;279:255:148;3364:64:341;;1603:4:302;279:255:148;3364:64:341;;279:255:148;;;;;3364:64:341;;;;;;;279:255:148;3364:64:341;;;279:255:148;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;279:255:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;279:255:148;;;;;;;;;;;;;;;;;;;;;3364:64:341;279:255:148;;;;;;;;;27291:64:327;27324:31;279:255:148;27324:31:327;279:255:148;;;;27324:31:327;279:255:148;;;;;;;;;;;;;2991:23:341;279:255:148;;;;;;;;;;;;;;;;;;;;;2688:13:341;279:255:148;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;515:10;;:::i;:::-;279:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;279:255:148;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;279:255:148;2065:19:76;279:255:148;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;279:255:148;720:8:80;279:255:148;720:8:80;;279:255:148;;;;2115:1:76;2802:32;;:::o;2624:153::-;279:255:148;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;279:255:148;2361:10:76;279:255:148;;;;2771:4:76;279:255:148;;;;;-1:-1:-1;2682:95:76;;279:255:148;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;279:255:148;1029:19:76;279:255:148;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;279:255:148;;;1676:74:76;;279:255:148;;;1676:74:76;;;279:255:148;1327:10:76;279:255:148;;;;1744:4:76;279:255:148;;;;;-1:-1:-1;1676:74:76;;279:255:148;;;;;;1676:74:76;;;;;;;279:255:148;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;583:77:341;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;279:255:148;;;;;;-1:-1:-1;279:255:148;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;279:255:148;-1:-1:-1;583:77:341;279:255:148;-1:-1:-1;279:255:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"789000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initERC721MetadataStorage(string,string,address)":"infinite","metadataResolver()":"2319","name()":"infinite","symbol()":"infinite","tokenURI(uint256)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initERC721MetadataStorage(string,string,address)":"fa6d22ca","metadataResolver()":"a0c76f62","name()":"06fdde03","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"}],\"name\":\"initERC721MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initERC721MetadataStorage(string,string,address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}}},\"title\":\"ERC721MetadataFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC721MetadataStorage(string,string,address)\":{\"notice\":\"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC721Metadata.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol\":\"ERC721MetadataFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721MetadataFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721MetadataFacet} from \\\"./../../../../token/ERC721/facets/ERC721MetadataFacet.sol\\\";\\n\\n/// @title ERC721MetadataFacetMock\\ncontract ERC721MetadataFacetMock is ERC721MetadataFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MetadataFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xf73e68a9c2f60e13afe1a60a1e9ed8267823a7522ee37fac55e5fceae4111650\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../base/ERC721MetadataBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC721MetadataFacet is ERC721MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the contract metadata.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    function initERC721MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xa1cac1f8c68601805481e2706ce8c235f0d8bb104ab3c597e3a06c7d3683fd83\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC721MetadataStorage(string,string,address)":{"notice":"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC721Metadata."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol":{"ERC721MintableFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}}},"title":"ERC721MintableFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610e2638819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610d9d90816100898239608051818181610af10152610c530152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146107fe57806340c10f191461076c5780634684d7e9146105165780638832e6e3146101f6578063a920466f146100bc5763d53913931461005e57600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576100f3610c3c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101c9577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761022d610881565b60443560243567ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b75736602484830101116100b7576024936102a37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b90610914565b61032283827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102d1610c3c565b9560208960009a8b93836040519e8f92610312837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f88011601856108a4565b848452019101378b0101526109d6565b803b61032c578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b8381106104fe57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104f3578391610474575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036104465780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d6020116104eb575b8161048f602093836108a4565b810103126104e757517fffffffff00000000000000000000000000000000000000000000000000000000811681036104e7577fffffffff000000000000000000000000000000000000000000000000000000006103f6565b8280fd5b3d9150610482565b6040513d85823e3d90fd5b602082820181015160a48784010152859350016103a4565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761054d610881565b6024359067ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b7578260051b916024838301013681116100b7576105be7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926000956105f360206040519701876108a4565b8552602401602085015b82821061075c5750505073ffffffffffffffffffffffffffffffffffffffff1690811561073457825192845b8481106106665750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107075760208160051b830101518087528360205273ffffffffffffffffffffffffffffffffffffffff6040882054166106dc57908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401610629565b7f753eceac000000000000000000000000000000000000000000000000000000008752600452602486fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105fd565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576107fc6107a6610881565b6107d27fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06109d6565b005b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576040610837610ada565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108e557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561096e5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610a9857826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416610a6a57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100b7575180151581036100b75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c2a573233148015610c32575b610c2a57803314908115610b6d575b50610b3c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c1e57600091610bef575b5038610b30565b610c11915060203d602011610c17575b610c0981836108a4565b810190610ac2565b38610be8565b503d610bff565b6040513d6000823e3d90fd5b506000903690565b5060183610610b21565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d58573233148015610d5d575b610d58577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610cc7575b50610cc457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c1e57600091610d39575b5038610cba565b610d52915060203d602011610c1757610c0981836108a4565b38610d32565b503390565b5060183610610c8356fea26469706673582212204d463e3cc728155c02d94a0e0f73d0fe48f6f472b480a5a2166d1da0c023711064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xE26 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD9D SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xAF1 ADD MSTORE PUSH2 0xC53 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x76C JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0xA920466F EQ PUSH2 0xBC JUMPI PUSH4 0xD5391393 EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0xF3 PUSH2 0xC3C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C9 JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x22D PUSH2 0x881 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xB7 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x2A3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST SWAP1 PUSH2 0x914 JUMP JUMPDEST PUSH2 0x322 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2D1 PUSH2 0xC3C JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x312 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x8A4 JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0x9D6 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x32C JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x4FE JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x4F3 JUMPI DUP4 SWAP2 PUSH2 0x474 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x446 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4EB JUMPI JUMPDEST DUP2 PUSH2 0x48F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8A4 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x4E7 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x4E7 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3F6 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x482 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x3A4 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x54D PUSH2 0x881 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xB7 JUMPI PUSH2 0x5BE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x5F3 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x8A4 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x75C JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x734 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x666 JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x707 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP9 KECCAK256 SLOAD AND PUSH2 0x6DC JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x629 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x5FD JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x7FC PUSH2 0x7A6 PUSH2 0x881 JUMP JUMPDEST PUSH2 0x7D2 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x9D6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH2 0x837 PUSH2 0xADA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xB7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8E5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x96E JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xA98 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xA6A JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC2A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC32 JUMPI JUMPDEST PUSH2 0xC2A JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB6D JUMPI JUMPDEST POP PUSH2 0xB3C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBEF JUMPI JUMPDEST POP CODESIZE PUSH2 0xB30 JUMP JUMPDEST PUSH2 0xC11 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC17 JUMPI JUMPDEST PUSH2 0xC09 DUP2 DUP4 PUSH2 0x8A4 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xAC2 JUMP JUMPDEST CODESIZE PUSH2 0xBE8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBFF JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB21 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD58 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD5D JUMPI JUMPDEST PUSH2 0xD58 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCC7 JUMPI JUMPDEST POP PUSH2 0xCC4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD39 JUMPI JUMPDEST POP CODESIZE PUSH2 0xCBA JUMP JUMPDEST PUSH2 0xD52 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC17 JUMPI PUSH2 0xC09 DUP2 DUP4 PUSH2 0x8A4 JUMP JUMPDEST CODESIZE PUSH2 0xD32 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC83 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4D CHAINID RETURNDATACOPY EXTCODECOPY 0xC7 0x28 ISZERO TLOAD MUL 0xD9 BLOBBASEFEE 0xE 0xF PUSH20 0xD0FE48F6F472B480A5A2166D1DA0C02371106473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"279:255:149:-:0;;;;;;;;;;;;;-1:-1:-1;;279:255:149;;;;-1:-1:-1;;;;;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;279:255:149;;;;;;745:39:76;;279:255:149;;;;;;;;745:39:76;279:255:149;;;;;;;;;;;;-1:-1:-1;279:255:149;;;;;;-1:-1:-1;279:255:149;;;;;-1:-1:-1;279:255:149"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2177,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":2754,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2212,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2324,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mint":{"entryPoint":2518,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":2778,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3132,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2801},{"length":32,"start":3155}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146107fe57806340c10f191461076c5780634684d7e9146105165780638832e6e3146101f6578063a920466f146100bc5763d53913931461005e57600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576100f3610c3c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101c9577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761022d610881565b60443560243567ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b75736602484830101116100b7576024936102a37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b90610914565b61032283827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102d1610c3c565b9560208960009a8b93836040519e8f92610312837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f88011601856108a4565b848452019101378b0101526109d6565b803b61032c578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b8381106104fe57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104f3578391610474575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036104465780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d6020116104eb575b8161048f602093836108a4565b810103126104e757517fffffffff00000000000000000000000000000000000000000000000000000000811681036104e7577fffffffff000000000000000000000000000000000000000000000000000000006103f6565b8280fd5b3d9150610482565b6040513d85823e3d90fd5b602082820181015160a48784010152859350016103a4565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761054d610881565b6024359067ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b7578260051b916024838301013681116100b7576105be7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926000956105f360206040519701876108a4565b8552602401602085015b82821061075c5750505073ffffffffffffffffffffffffffffffffffffffff1690811561073457825192845b8481106106665750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107075760208160051b830101518087528360205273ffffffffffffffffffffffffffffffffffffffff6040882054166106dc57908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401610629565b7f753eceac000000000000000000000000000000000000000000000000000000008752600452602486fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105fd565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576107fc6107a6610881565b6107d27fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261029d610c3c565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06109d6565b005b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576040610837610ada565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108e557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561096e5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610a9857826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416610a6a57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100b7575180151581036100b75790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c2a573233148015610c32575b610c2a57803314908115610b6d575b50610b3c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b75760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c1e57600091610bef575b5038610b30565b610c11915060203d602011610c17575b610c0981836108a4565b810190610ac2565b38610be8565b503d610bff565b6040513d6000823e3d90fd5b506000903690565b5060183610610b21565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d58573233148015610d5d575b610d58577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610cc7575b50610cc457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c1e57600091610d39575b5038610cba565b610d52915060203d602011610c1757610c0981836108a4565b38610d32565b503390565b5060183610610c8356fea26469706673582212204d463e3cc728155c02d94a0e0f73d0fe48f6f472b480a5a2166d1da0c023711064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x76C JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0xA920466F EQ PUSH2 0xBC JUMPI PUSH4 0xD5391393 EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0xF3 PUSH2 0xC3C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C9 JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x22D PUSH2 0x881 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xB7 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x2A3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST SWAP1 PUSH2 0x914 JUMP JUMPDEST PUSH2 0x322 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2D1 PUSH2 0xC3C JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x312 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x8A4 JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0x9D6 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x32C JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x4FE JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x4F3 JUMPI DUP4 SWAP2 PUSH2 0x474 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x446 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4EB JUMPI JUMPDEST DUP2 PUSH2 0x48F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8A4 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x4E7 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x4E7 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3F6 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x482 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x3A4 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x54D PUSH2 0x881 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xB7 JUMPI PUSH2 0x5BE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x5F3 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x8A4 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x75C JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x734 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x666 JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x707 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP9 KECCAK256 SLOAD AND PUSH2 0x6DC JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x629 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x5FD JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x7FC PUSH2 0x7A6 PUSH2 0x881 JUMP JUMPDEST PUSH2 0x7D2 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x29D PUSH2 0xC3C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x9D6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH2 0x837 PUSH2 0xADA JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xB7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8E5 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x96E JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xA98 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xA6A JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB7 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB7 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC2A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC32 JUMPI JUMPDEST PUSH2 0xC2A JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB6D JUMPI JUMPDEST POP PUSH2 0xB3C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB7 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBEF JUMPI JUMPDEST POP CODESIZE PUSH2 0xB30 JUMP JUMPDEST PUSH2 0xC11 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC17 JUMPI JUMPDEST PUSH2 0xC09 DUP2 DUP4 PUSH2 0x8A4 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xAC2 JUMP JUMPDEST CODESIZE PUSH2 0xBE8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xBFF JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB21 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD58 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD5D JUMPI JUMPDEST PUSH2 0xD58 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCC7 JUMPI JUMPDEST POP PUSH2 0xCC4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD39 JUMPI JUMPDEST POP CODESIZE PUSH2 0xCBA JUMP JUMPDEST PUSH2 0xD52 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC17 JUMPI PUSH2 0xC09 DUP2 DUP4 PUSH2 0x8A4 JUMP JUMPDEST CODESIZE PUSH2 0xD32 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC83 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4D CHAINID RETURNDATACOPY EXTCODECOPY 0xC7 0x28 ISZERO TLOAD MUL 0xD9 BLOBBASEFEE 0xE 0xF PUSH20 0xD0FE48F6F472B480A5A2166D1DA0C02371106473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"279:255:149:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:41:317;;:::i;:::-;279:255:149;;;;;;;3174:18:180;;;3170:53;;3399:33:327;279:255:149;500:10:59;279:255:149;500:10:59;;;;;;;636:1:180;500:10:59;;;279:255:149;3170:53:180;3201:22;279:255:149;3201:22:180;279:255:149;;;;3201:22:180;279:255:149;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;1586:12:303;279:255:149;1710:41:317;;:::i;:::-;1586:12:303;;:::i;:::-;15560:7:327;1863:70;;279:255:149;1710:41:317;;:::i;:::-;279:255:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;15560:7:327;:::i;:::-;376:58:354;;15578:107:327;;279:255:149;;;15578:107:327;279:255:149;;;;;;29832:65:327;279:255:149;29832:65:327;;279:255:149;;29832:65:327;;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;;;;;;;;;;;;;;279:255:149;;;;;;29832:84:327;29828:136;;15578:107;;279:255:149;;;29828:136:327;279:255:149;29925:39:327;;;;279:255:149;;;;29925:39:327;29832:65;;;279:255:149;29832:65:327;;279:255:149;29832:65:327;;;;;;279:255:149;29832:65:327;;;:::i;:::-;;;279:255:149;;;;;;;;;;;;;29832:65:327;;279:255:149;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;279:255:149;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1956:12:303;279:255:149;1710:41:317;;:::i;1956:12:303:-;279:255:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16404:16:327;;;16400:54;;279:255:149;;16512:9:327;;16523:10;;;;;;16821:14;;;279:255:149;;16821:10:327;279:255:149;;;;;;;;;;;;;16535:3:327;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:72:327;;279:255:149;;;;;;;;;;;;;;16743:33:327;;;;;;279:255:149;16512:9:327;;16597:72;16641:28;;;279:255:149;;;16641:28:327;;279:255:149;;;;;;;;;;16400:54:327;279:255:149;16429:25:327;;;;;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;1287:7:303;279:255:149;;:::i;:::-;1232:12:303;279:255:149;1710:41:317;;:::i;1232:12:303:-;279:255:149;;;;1287:7:303;:::i;:::-;279:255:149;;;;;;;;;;;;;1945:39:317;;:::i;:::-;279:255:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;279:255:149;;;;;-1:-1:-1;279:255:149;3640:170:41;279:255:149;-1:-1:-1;279:255:149;;;;-1:-1:-1;279:255:149;;;;-1:-1:-1;279:255:149;;;;;-1:-1:-1;279:255:149;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;279:255:149;3775:28:41;;-1:-1:-1;3775:28:41;279:255:149;3775:28:41;279:255:149;;;;;-1:-1:-1;3775:28:41;14035:460:327;;279:255:149;;14119:16:327;;;14115:54;;279:255:149;14133:1:327;279:255:149;;;;;;14133:1:327;279:255:149;;;14179:72:327;;14415:10;279:255:149;;14133:1:327;279:255:149;;;;;;14133:1:327;279:255:149;;;-1:-1:-1;279:255:149;14415:10:327;279:255:149;;;-1:-1:-1;279:255:149;14415:10:327;279:255:149;;;;;14133:1:327;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;279:255:149;;14133:1:327;14223:28;14115:54;14144:25;14133:1;14144:25;;14133:1;14144:25;279:255:149;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;279:255:149;2065:19:76;279:255:149;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;279:255:149;720:8:80;279:255:149;720:8:80;;279:255:149;;;;2115:1:76;2802:32;;:::o;2624:153::-;279:255:149;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;279:255:149;2361:10:76;279:255:149;;;;2771:4:76;279:255:149;;;;;-1:-1:-1;2682:95:76;;279:255:149;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;279:255:149;;;2115:1:76;279:255:149;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;279:255:149;1029:19:76;279:255:149;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;279:255:149;;;1676:74:76;;279:255:149;;;1676:74:76;;;279:255:149;1327:10:76;279:255:149;;;;1744:4:76;279:255:149;;;;;-1:-1:-1;1676:74:76;;279:255:149;;;;;;1676:74:76;;;;;;;279:255:149;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"697000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"251","__msgData()":"infinite","batchMint(address,uint256[])":"infinite","initERC721MintableStorage()":"infinite","mint(address,uint256)":"infinite","safeMint(address,uint256,bytes)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","batchMint(address,uint256[])":"4684d7e9","initERC721MintableStorage()":"a920466f","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}}},\"title\":\"ERC721MintableFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"initERC721MintableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol\":\"ERC721MintableFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721MintableFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721MintableFacet} from \\\"./../../../../token/ERC721/facets/ERC721MintableFacet.sol\\\";\\n\\n/// @title ERC721MintableFacetMock\\ncontract ERC721MintableFacetMock is ERC721MintableFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MintableFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1c6c873b74494562f3e88c581efdc82c81456be7c6854f1d312c2827b76fbb4a\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../base/ERC721MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721MintableFacet is ERC721MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xfe5c03dc84d91811a6909605925981ede34297df757b8589fd5cf940f0356dcd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"initERC721MintableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol":{"ERC721MintableOnceFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721MintableOnceStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721MintableOnceStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"title":"ERC721MintableOnceFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f610f6438819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d57608052604051610edb90816100898239608051818181610c2f0152610d910152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146108e757806340c10f19146108555780634684d7e9146105ac57806383b0b740146104725780638832e6e314610152578063c77c6955146100c75763d53913931461006957600080fd5b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c25760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b346100c25760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c25761018961096a565b60443560243567ffffffffffffffff82116100c257366023830112156100c25781600401359167ffffffffffffffff83116100c25736602484830101116100c2576024936101ff7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b906109fd565b61027e83827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061022d610d7a565b9560208960009a8b93836040519e8f9261026e837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f880116018561098d565b848452019101378b010152610abf565b803b610288578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b83811061045a57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af190811561044f5783916103d0575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036103a25780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d602011610447575b816103eb6020938361098d565b8101031261044357517fffffffff0000000000000000000000000000000000000000000000000000000081168103610443577fffffffff00000000000000000000000000000000000000000000000000000000610352565b8280fd5b3d91506103de565b6040513d85823e3d90fd5b602082820181015160a4878401015285935001610300565b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576104a9610d7a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361057f577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576105e361096a565b6024359067ffffffffffffffff82116100c257366023830112156100c25781600401359167ffffffffffffffff83116100c2578260051b916024838301013681116100c2576106547fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c092600095610689602060405197018761098d565b8552602401602085015b8282106108455750505073ffffffffffffffffffffffffffffffffffffffff1690811561081d57825192845b8481106106fc5750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107f05760208160051b8301015180875283602052604087205473ffffffffffffffffffffffffffffffffffffffff81166107c4577fdead0000000000000000000000000000000000000000000000000000000000001461079957908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016106bf565b7f31e8d3d5000000000000000000000000000000000000000000000000000000008752600452602486fd5b602488837f753eceac000000000000000000000000000000000000000000000000000000008252600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610693565b346100c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576108e561088f61096a565b6108bb7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610abf565b005b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576040610920610c18565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100c257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109ce57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610a575750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610bd657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610ba8577fdead00000000000000000000000000000000000000000000000000000000000014610b7a57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100c2575180151581036100c25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d68573233148015610d70575b610d6857803314908115610cab575b50610c7a576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100c25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610d5c57600091610d2d575b5038610c6e565b610d4f915060203d602011610d55575b610d47818361098d565b810190610c00565b38610d26565b503d610d3d565b6040513d6000823e3d90fd5b506000903690565b5060183610610c5f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e96573233148015610e9b575b610e96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e05575b50610e0257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610d5c57600091610e77575b5038610df8565b610e90915060203d602011610d5557610d47818361098d565b38610e70565b503390565b5060183610610dc156fea26469706673582212208da6e85a09f86055bec7136ea9dffd04b372ba3f080d769a17745ccaf5a4ccf364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0xF64 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xEDB SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0xC2F ADD MSTORE PUSH2 0xD91 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x8E7 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x855 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x5AC JUMPI DUP1 PUSH4 0x83B0B740 EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xC7 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x189 PUSH2 0x96A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC2 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xC2 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x1FF PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST SWAP1 PUSH2 0x9FD JUMP JUMPDEST PUSH2 0x27E DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x22D PUSH2 0xD7A JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x26E DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x98D JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0xABF JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x288 JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x45A JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x44F JUMPI DUP4 SWAP2 PUSH2 0x3D0 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3A2 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x447 JUMPI JUMPDEST DUP2 PUSH2 0x3EB PUSH1 0x20 SWAP4 DUP4 PUSH2 0x98D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x443 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x443 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x352 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3DE JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x300 JUMP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x4A9 PUSH2 0xD7A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x57F JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x5E3 PUSH2 0x96A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC2 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC2 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xC2 JUMPI PUSH2 0x654 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x689 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x98D JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x845 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x81D JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x6FC JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7F0 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x7C4 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x799 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x6BF JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP9 DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x693 JUMP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x8E5 PUSH2 0x88F PUSH2 0x96A JUMP JUMPDEST PUSH2 0x8BB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xABF JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH2 0x920 PUSH2 0xC18 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xC2 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x9CE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xA57 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xBD6 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xBA8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0xB7A JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xC2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xC2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD68 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD70 JUMPI JUMPDEST PUSH2 0xD68 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCAB JUMPI JUMPDEST POP PUSH2 0xC7A JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xC2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD2D JUMPI JUMPDEST POP CODESIZE PUSH2 0xC6E JUMP JUMPDEST PUSH2 0xD4F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD55 JUMPI JUMPDEST PUSH2 0xD47 DUP2 DUP4 PUSH2 0x98D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC00 JUMP JUMPDEST CODESIZE PUSH2 0xD26 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD3D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE96 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0xE96 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE05 JUMPI JUMPDEST POP PUSH2 0xE02 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE77 JUMPI JUMPDEST POP CODESIZE PUSH2 0xDF8 JUMP JUMPDEST PUSH2 0xE90 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD55 JUMPI PUSH2 0xD47 DUP2 DUP4 PUSH2 0x98D JUMP JUMPDEST CODESIZE PUSH2 0xE70 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDC1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xA6 0xE8 GAS MULMOD EXTCALL PUSH1 0x55 0xBE 0xC7 SGT PUSH15 0xA9DFFD04B372BA3F080D769A17745C 0xCA CREATE2 LOG4 0xCC RETURN PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"291:267:150:-:0;;;;;;;;;;;;;-1:-1:-1;;291:267:150;;;;-1:-1:-1;;;;;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;291:267:150;;;;;;745:39:76;;291:267:150;;;;;;;;745:39:76;291:267:150;;;;;;;;;;;;-1:-1:-1;291:267:150;;;;;;-1:-1:-1;291:267:150;;;;;-1:-1:-1;291:267:150"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2410,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":3072,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":2445,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2557,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mintOnce":{"entryPoint":2751,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":3096,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":3450,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3119},{"length":32,"start":3473}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806331e66e1e146108e757806340c10f19146108555780634684d7e9146105ac57806383b0b740146104725780638832e6e314610152578063c77c6955146100c75763d53913931461006957600080fd5b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c25760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b346100c25760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c25761018961096a565b60443560243567ffffffffffffffff82116100c257366023830112156100c25781600401359167ffffffffffffffff83116100c25736602484830101116100c2576024936101ff7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b906109fd565b61027e83827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061022d610d7a565b9560208960009a8b93836040519e8f9261026e837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f880116018561098d565b848452019101378b010152610abf565b803b610288578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b83811061045a57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af190811561044f5783916103d0575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036103a25780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d602011610447575b816103eb6020938361098d565b8101031261044357517fffffffff0000000000000000000000000000000000000000000000000000000081168103610443577fffffffff00000000000000000000000000000000000000000000000000000000610352565b8280fd5b3d91506103de565b6040513d85823e3d90fd5b602082820181015160a4878401015285935001610300565b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576104a9610d7a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361057f577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576105e361096a565b6024359067ffffffffffffffff82116100c257366023830112156100c25781600401359167ffffffffffffffff83116100c2578260051b916024838301013681116100c2576106547fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c092600095610689602060405197018761098d565b8552602401602085015b8282106108455750505073ffffffffffffffffffffffffffffffffffffffff1690811561081d57825192845b8481106106fc5750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107f05760208160051b8301015180875283602052604087205473ffffffffffffffffffffffffffffffffffffffff81166107c4577fdead0000000000000000000000000000000000000000000000000000000000001461079957908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016106bf565b7f31e8d3d5000000000000000000000000000000000000000000000000000000008752600452602486fd5b602488837f753eceac000000000000000000000000000000000000000000000000000000008252600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610693565b346100c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576108e561088f61096a565b6108bb7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101f9610d7a565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610abf565b005b346100c25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c2576040610920610c18565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100c257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109ce57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610a575750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610bd657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610ba8577fdead00000000000000000000000000000000000000000000000000000000000014610b7a57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b908160209103126100c2575180151581036100c25790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610d68573233148015610d70575b610d6857803314908115610cab575b50610c7a576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100c25760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610d5c57600091610d2d575b5038610c6e565b610d4f915060203d602011610d55575b610d47818361098d565b810190610c00565b38610d26565b503d610d3d565b6040513d6000823e3d90fd5b506000903690565b5060183610610c5f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e96573233148015610e9b575b610e96577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e05575b50610e0257503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610d5c57600091610e77575b5038610df8565b610e90915060203d602011610d5557610d47818361098d565b38610e70565b503390565b5060183610610dc156fea26469706673582212208da6e85a09f86055bec7136ea9dffd04b372ba3f080d769a17745ccaf5a4ccf364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x8E7 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x855 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x5AC JUMPI DUP1 PUSH4 0x83B0B740 EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xC7 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x189 PUSH2 0x96A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC2 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xC2 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x1FF PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST SWAP1 PUSH2 0x9FD JUMP JUMPDEST PUSH2 0x27E DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x22D PUSH2 0xD7A JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x26E DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x98D JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0xABF JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x288 JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x45A JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x44F JUMPI DUP4 SWAP2 PUSH2 0x3D0 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3A2 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x447 JUMPI JUMPDEST DUP2 PUSH2 0x3EB PUSH1 0x20 SWAP4 DUP4 PUSH2 0x98D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x443 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x443 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x352 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3DE JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x300 JUMP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x4A9 PUSH2 0xD7A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x57F JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x5E3 PUSH2 0x96A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC2 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xC2 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC2 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xC2 JUMPI PUSH2 0x654 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x689 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x98D JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x845 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x81D JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x6FC JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7F0 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x7C4 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x799 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x6BF JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP9 DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x693 JUMP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH2 0x8E5 PUSH2 0x88F PUSH2 0x96A JUMP JUMPDEST PUSH2 0x8BB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1F9 PUSH2 0xD7A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xABF JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0xC2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xC2 JUMPI PUSH1 0x40 PUSH2 0x920 PUSH2 0xC18 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xC2 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x9CE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xA57 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xBD6 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xBA8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0xB7A JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xC2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xC2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xD68 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xD70 JUMPI JUMPDEST PUSH2 0xD68 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xCAB JUMPI JUMPDEST POP PUSH2 0xC7A JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xC2 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xD2D JUMPI JUMPDEST POP CODESIZE PUSH2 0xC6E JUMP JUMPDEST PUSH2 0xD4F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD55 JUMPI JUMPDEST PUSH2 0xD47 DUP2 DUP4 PUSH2 0x98D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xC00 JUMP JUMPDEST CODESIZE PUSH2 0xD26 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD3D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xC5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE96 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0xE96 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE05 JUMPI JUMPDEST POP PUSH2 0xE02 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE77 JUMPI JUMPDEST POP CODESIZE PUSH2 0xDF8 JUMP JUMPDEST PUSH2 0xE90 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD55 JUMPI PUSH2 0xD47 DUP2 DUP4 PUSH2 0x98D JUMP JUMPDEST CODESIZE PUSH2 0xE70 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xDC1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xA6 0xE8 GAS MULMOD EXTCALL PUSH1 0x55 0xBE 0xC7 SGT PUSH15 0xA9DFFD04B372BA3F080D769A17745C 0xCA CREATE2 LOG4 0xCC RETURN PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"291:267:150:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;291:267:150;;;;30830:32:327;291:267:150;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;1766:12:304;291:267:150;1733:41:318;;:::i;:::-;1766:12:304;;:::i;:::-;20205:7:327;1863:70;;291:267:150;1733:41:318;;:::i;:::-;291:267:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;20205:7:327;:::i;:::-;376:58:354;;20223:107:327;;291:267:150;;;20223:107:327;291:267:150;;;;;;29832:65:327;291:267:150;29832:65:327;;291:267:150;;29832:65:327;;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;;;;;;;;;;;;;;291:267:150;;;;;;29832:84:327;29828:136;;20223:107;;291:267:150;;;29828:136:327;291:267:150;29925:39:327;;;;291:267:150;;;;29925:39:327;29832:65;;;291:267:150;29832:65:327;;291:267:150;29832:65:327;;;;;;291:267:150;29832:65:327;;;:::i;:::-;;;291:267:150;;;;;;;;;;;;;29832:65:327;;291:267:150;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;291:267:150;;;;;;;;;;;;;;1733:41:318;;:::i;:::-;291:267:150;;;;;;;3174:18:180;;;3170:53;;3399:33:327;291:267:150;500:10:59;291:267:150;500:10:59;;;;;;;636:1:180;500:10:59;;;291:267:150;3170:53:180;3201:22;291:267:150;3201:22:180;291:267:150;;;;3201:22:180;291:267:150;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2233:12:304;291:267:150;1733:41:318;;:::i;2233:12:304:-;291:267:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21151:16:327;;;21147:54;;291:267:150;;21259:9:327;;21270:10;;;;;;21677:14;;;291:267:150;;21677:10:327;291:267:150;;;;;;;;;;;;;21282:3:327;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;291:267:150;;;;;;;;;;;;;;21599:33:327;;;;;;291:267:150;21259:9:327;;21465:59;21499:25;;;291:267:150;;;21499:25:327;;21391:60;291:267:150;21423:28:327;;;;;291:267:150;;21423:28:327;291:267:150;;;;;;;;;;21147:54:327;291:267:150;21176:25:327;;;;;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;1382:7:304;291:267:150;;:::i;:::-;1323:12:304;291:267:150;1733:41:318;;:::i;1323:12:304:-;291:267:150;;;;1382:7:304;:::i;:::-;291:267:150;;;;;;;;;;;;;1968:39:318;;:::i;:::-;291:267:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;291:267:150;;;;;-1:-1:-1;291:267:150;3640:170:41;291:267:150;-1:-1:-1;291:267:150;;;;-1:-1:-1;291:267:150;;;;-1:-1:-1;291:267:150;;;;;-1:-1:-1;291:267:150;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;291:267:150;3775:28:41;;-1:-1:-1;3775:28:41;291:267:150;3775:28:41;291:267:150;;;;;-1:-1:-1;3775:28:41;18606:565:327;;291:267:150;;18694:16:327;;;18690:54;;291:267:150;18708:1:327;291:267:150;;;;;18708:1:327;291:267:150;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;291:267:150;;18708:1:327;291:267:150;;;;;;18708:1:327;291:267:150;;;-1:-1:-1;291:267:150;19091:10:327;291:267:150;;;-1:-1:-1;291:267:150;19091:10:327;291:267:150;;;;;18708:1:327;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;291:267:150;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;291:267:150;;18708:1:327;18830:28;18690:54;18719:25;18708:1;18719:25;;18708:1;18719:25;291:267:150;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;291:267:150;2065:19:76;291:267:150;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;291:267:150;720:8:80;291:267:150;720:8:80;;291:267:150;;;;2115:1:76;2802:32;;:::o;2624:153::-;291:267:150;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;291:267:150;2361:10:76;291:267:150;;;;2771:4:76;291:267:150;;;;;-1:-1:-1;2682:95:76;;291:267:150;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;291:267:150;;;2115:1:76;291:267:150;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;291:267:150;1029:19:76;291:267:150;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;291:267:150;;;1676:74:76;;291:267:150;;;1676:74:76;;;291:267:150;1327:10:76;291:267:150;;;;1744:4:76;291:267:150;;;;;-1:-1:-1;1676:74:76;;291:267:150;;;;;;1676:74:76;;;;;;;291:267:150;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"760600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"273","__msgData()":"infinite","batchMint(address,uint256[])":"infinite","initERC721MintableOnceStorage()":"infinite","mint(address,uint256)":"infinite","safeMint(address,uint256,bytes)":"infinite","wasBurnt(uint256)":"2429"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","batchMint(address,uint256[])":"4684d7e9","initERC721MintableOnceStorage()":"83b0b740","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721MintableOnceStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721MintableOnceStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"title\":\"ERC721MintableOnceFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"initERC721MintableOnceStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol\":\"ERC721MintableOnceFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721MintableOnceFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721MintableOnceFacet} from \\\"./../../../../token/ERC721/facets/ERC721MintableOnceFacet.sol\\\";\\n\\n/// @title ERC721MintableOnceFacetMock\\ncontract ERC721MintableOnceFacetMock is ERC721MintableOnceFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721MintableOnceFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x5453884592d5591a350cce11cafba95caff86e21f0d5c57940be5c8f8229e769\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./../base/ERC721MintableOnceBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721MintableOnceFacet is ERC721MintableOnceBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721MintableOnceStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd009a15db2b6e3e9b7054cdb8f59ef17f937ace1b921d1e94a1dc29d5adc2bbe\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"initERC721MintableOnceStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"version":1}}},"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol":{"ERC721WithOperatorFiltererFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC721Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"initERC721Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721FacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61168038819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516115f79081610089823960805181818161110e01526112b90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063081812fc14610b70578063095ea7b3146108dc57806323b872dd1461083457806331e66e1e146107b157806342842e0e146106e15780636352211e1461062c57806370a0823114610562578063a22cb46514610402578063b1c7ee02146102c8578063b88d4fde1461014e5763e985e9c51461009557600080fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576100cc610beb565b73ffffffffffffffffffffffffffffffffffffffff6100e9610c0e565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b346101495760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610185610beb565b61018d610c0e565b6044356064359167ffffffffffffffff831161014957366023840112156101495782600401359367ffffffffffffffff8511610149573660248686010111610149576101d76110f7565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036102b8575b505061025c848484847fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b823b61026457005b600060206102b697806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601996102a56040519b8c610f68565b828b5201838a0137870101526113e8565b005b6102c191610ff0565b868161022d565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576102ff6110f7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103d5577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610439610beb565b602435908115159182810361014957610533575b73ffffffffffffffffffffffffffffffffffffffff8061046b6110f7565b169116918183146105055760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61055d817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610ff0565b61044d565b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610599610beb565b73ffffffffffffffffffffffffffffffffffffffff8116156106025773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156106b357602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b34610149576106ef36610c31565b6106f76110f7565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036107a1575b505061077d828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b803b61078557005b6102b69360405193610798602086610f68565b600085526113e8565b6107aa91610ff0565b848361074e565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101495760406107ea6112a2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b34610149576102b661084536610c31565b9161084e6110f7565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036108cc575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b6108d591610ff0565b85816108a4565b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610913610beb565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115610b40575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06109636110f7565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415610b1257848614610ae4576109a3818686611222565b15610a98575015610a075774010000000000000000000000000000000000000000166109f3575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836109ca565b90740100000000000000000000000000000000000000008217809203610a84575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556109cc565b846000526020526040600020558380610a28565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610b6a907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610ff0565b83610939565b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576020610bcd6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610ca3565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101495760043573ffffffffffffffffffffffffffffffffffffffff81168103610149579060243573ffffffffffffffffffffffffffffffffffffffff81168103610149579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610d1957740100000000000000000000000000000000000000001615610d12576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610f3e57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610b125773ffffffffffffffffffffffffffffffffffffffff8116809503610f0c5782610dbb9185611222565b15610e51575b5050836000528060205282604060002055828203610e02575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610dda565b7401000000000000000000000000000000000000000016158015610ec6575b610e7a5780610dc1565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610e70565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610fa957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610149575180151581036101495790565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806110ed575b611019575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156110e1576000916110b2575b50156110855750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110d4915060203d6020116110da575b6110cc8183610f68565b810190610fd8565b3861107c565b503d6110c2565b6040513d6000823e3d90fd5b50813b1515611011565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611213573233148015611218575b611213577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611182575b5061117f57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156110e1576000916111f4575b5038611175565b61120d915060203d6020116110da576110cc8183610f68565b386111ed565b503390565b506018361061113e565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561124d575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611247565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156113d65732331480156113de575b6113d657803314908115611335575b50611304576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101495760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156110e1576000916113b7575b50386112f8565b6113d0915060203d6020116110da576110cc8183610f68565b386113b0565b506000903690565b50601836106112e9565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b8381106115a957505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af19081156110e157600091611527575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036114f7575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116115a1575b8161154060209383610f68565b8101031261159d5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361159a57507fffffffff000000000000000000000000000000000000000000000000000000006114a9565b80fd5b5080fd5b3d9150611533565b602082820181015160a487840101528593500161145456fea26469706673582212204ee31260b0e36b5f56ef3b3de268801d130dde6eed18b5911c4793238533823964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x1680 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x15F7 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x110E ADD MSTORE PUSH2 0x12B9 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0xB70 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x8DC JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x834 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7B1 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x6E1 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x62C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x402 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x14E JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0xCC PUSH2 0xBEB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xE9 PUSH2 0xC0E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x185 PUSH2 0xBEB JUMP JUMPDEST PUSH2 0x18D PUSH2 0xC0E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x149 JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x149 JUMPI PUSH2 0x1D7 PUSH2 0x10F7 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B8 JUMPI JUMPDEST POP POP PUSH2 0x25C DUP5 DUP5 DUP5 DUP5 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x264 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x2B6 SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x2A5 PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xF68 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x13E8 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2C1 SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP7 DUP2 PUSH2 0x22D JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x2FF PUSH2 0x10F7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3D5 JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x439 PUSH2 0xBEB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x149 JUMPI PUSH2 0x533 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x46B PUSH2 0x10F7 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x505 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x55D DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xFF0 JUMP JUMPDEST PUSH2 0x44D JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x599 PUSH2 0xBEB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x602 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x6B3 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x6EF CALLDATASIZE PUSH2 0xC31 JUMP JUMPDEST PUSH2 0x6F7 PUSH2 0x10F7 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x7A1 JUMPI JUMPDEST POP POP PUSH2 0x77D DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x785 JUMPI STOP JUMPDEST PUSH2 0x2B6 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x798 PUSH1 0x20 DUP7 PUSH2 0xF68 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x13E8 JUMP JUMPDEST PUSH2 0x7AA SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x74E JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x40 PUSH2 0x7EA PUSH2 0x12A2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x2B6 PUSH2 0x845 CALLDATASIZE PUSH2 0xC31 JUMP JUMPDEST SWAP2 PUSH2 0x84E PUSH2 0x10F7 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x8CC JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST PUSH2 0x8D5 SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x8A4 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x913 PUSH2 0xBEB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0xB40 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x963 PUSH2 0x10F7 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xB12 JUMPI DUP5 DUP7 EQ PUSH2 0xAE4 JUMPI PUSH2 0x9A3 DUP2 DUP7 DUP7 PUSH2 0x1222 JUMP JUMPDEST ISZERO PUSH2 0xA98 JUMPI POP ISZERO PUSH2 0xA07 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x9F3 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x9CA JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0xA84 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x9CC JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0xA28 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xB6A SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xFF0 JUMP JUMPDEST DUP4 PUSH2 0x939 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x20 PUSH2 0xBCD PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xD19 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xD12 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xF3E JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xB12 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xF0C JUMPI DUP3 PUSH2 0xDBB SWAP2 DUP6 PUSH2 0x1222 JUMP JUMPDEST ISZERO PUSH2 0xE51 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xE02 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xDDA JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xEC6 JUMPI JUMPDEST PUSH2 0xE7A JUMPI DUP1 PUSH2 0xDC1 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xE70 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xFA9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x149 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x149 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x10ED JUMPI JUMPDEST PUSH2 0x1019 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10B2 JUMPI JUMPDEST POP ISZERO PUSH2 0x1085 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10D4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI JUMPDEST PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFD8 JUMP JUMPDEST CODESIZE PUSH2 0x107C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x1011 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1213 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1218 JUMPI JUMPDEST PUSH2 0x1213 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1182 JUMPI JUMPDEST POP PUSH2 0x117F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11F4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1175 JUMP JUMPDEST PUSH2 0x120D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST CODESIZE PUSH2 0x11ED JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x113E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x124D JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1247 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x13D6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x13DE JUMPI JUMPDEST PUSH2 0x13D6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1335 JUMPI JUMPDEST POP PUSH2 0x1304 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x149 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x13B7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x12F8 JUMP JUMPDEST PUSH2 0x13D0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST CODESIZE PUSH2 0x13B0 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x12E9 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x15A9 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1527 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x14F7 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x15A1 JUMPI JUMPDEST DUP2 PUSH2 0x1540 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xF68 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x159D JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x159A JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x14A9 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1533 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1454 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4E CALLF 0x1260 0xB0 CALLF 0x6B5F JUMP 0xEF EXTCODESIZE RETURNDATASIZE 0xE2 PUSH9 0x801D130DDE6EED18B5 SWAP2 SHR SELFBALANCE SWAP4 0x23 DUP6 CALLER DUP3 CODECOPY PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"295:291:151:-:0;;;;;;;;;;;;;-1:-1:-1;;295:291:151;;;;-1:-1:-1;;;;;295:291:151;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;295:291:151;;;;;;745:39:76;;295:291:151;;;;;;;;745:39:76;295:291:151;;;;;;;;;;;;-1:-1:-1;295:291:151;;;;;;-1:-1:-1;295:291:151;;;;;-1:-1:-1;295:291:151"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3086,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":3121,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_bool_fromMemory":{"entryPoint":4056,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":3051,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":3944,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":5096,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":4080,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":3235,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":4642,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgData":{"entryPoint":4770,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":4343,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferFrom":{"entryPoint":3399,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4366},{"length":32,"start":4793}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063081812fc14610b70578063095ea7b3146108dc57806323b872dd1461083457806331e66e1e146107b157806342842e0e146106e15780636352211e1461062c57806370a0823114610562578063a22cb46514610402578063b1c7ee02146102c8578063b88d4fde1461014e5763e985e9c51461009557600080fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576100cc610beb565b73ffffffffffffffffffffffffffffffffffffffff6100e9610c0e565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b346101495760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610185610beb565b61018d610c0e565b6044356064359167ffffffffffffffff831161014957366023840112156101495782600401359367ffffffffffffffff8511610149573660248686010111610149576101d76110f7565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036102b8575b505061025c848484847fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b823b61026457005b600060206102b697806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601996102a56040519b8c610f68565b828b5201838a0137870101526113e8565b005b6102c191610ff0565b868161022d565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576102ff6110f7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103d5577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610439610beb565b602435908115159182810361014957610533575b73ffffffffffffffffffffffffffffffffffffffff8061046b6110f7565b169116918183146105055760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61055d817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610ff0565b61044d565b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610599610beb565b73ffffffffffffffffffffffffffffffffffffffff8116156106025773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156106b357602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b34610149576106ef36610c31565b6106f76110f7565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036107a1575b505061077d828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b803b61078557005b6102b69360405193610798602086610f68565b600085526113e8565b6107aa91610ff0565b848361074e565b346101495760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101495760406107ea6112a2565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b34610149576102b661084536610c31565b9161084e6110f7565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036108cc575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610d47565b6108d591610ff0565b85816108a4565b346101495760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014957610913610beb565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115610b40575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06109636110f7565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415610b1257848614610ae4576109a3818686611222565b15610a98575015610a075774010000000000000000000000000000000000000000166109f3575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836109ca565b90740100000000000000000000000000000000000000008217809203610a84575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556109cc565b846000526020526040600020558380610a28565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610b6a907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610ff0565b83610939565b346101495760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610149576020610bcd6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610ca3565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361014957565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101495760043573ffffffffffffffffffffffffffffffffffffffff81168103610149579060243573ffffffffffffffffffffffffffffffffffffffff81168103610149579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610d1957740100000000000000000000000000000000000000001615610d12576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610f3e57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610b125773ffffffffffffffffffffffffffffffffffffffff8116809503610f0c5782610dbb9185611222565b15610e51575b5050836000528060205282604060002055828203610e02575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610dda565b7401000000000000000000000000000000000000000016158015610ec6575b610e7a5780610dc1565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610e70565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610fa957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90816020910312610149575180151581036101495790565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806110ed575b611019575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156110e1576000916110b2575b50156110855750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110d4915060203d6020116110da575b6110cc8183610f68565b810190610fd8565b3861107c565b503d6110c2565b6040513d6000823e3d90fd5b50813b1515611011565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611213573233148015611218575b611213577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611182575b5061117f57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa9081156110e1576000916111f4575b5038611175565b61120d915060203d6020116110da576110cc8183610f68565b386111ed565b503390565b506018361061113e565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561124d575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611247565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156113d65732331480156113de575b6113d657803314908115611335575b50611304576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116101495760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa9081156110e1576000916113b7575b50386112f8565b6113d0915060203d6020116110da576110cc8183610f68565b386113b0565b506000903690565b50601836106112e9565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b8381106115a957505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af19081156110e157600091611527575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036114f7575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116115a1575b8161154060209383610f68565b8101031261159d5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361159a57507fffffffff000000000000000000000000000000000000000000000000000000006114a9565b80fd5b5080fd5b3d9150611533565b602082820181015160a487840101528593500161145456fea26469706673582212204ee31260b0e36b5f56ef3b3de268801d130dde6eed18b5911c4793238533823964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0xB70 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x8DC JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x834 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x7B1 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x6E1 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x62C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x402 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x14E JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0xCC PUSH2 0xBEB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xE9 PUSH2 0xC0E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x185 PUSH2 0xBEB JUMP JUMPDEST PUSH2 0x18D PUSH2 0xC0E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x149 JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x149 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x149 JUMPI PUSH2 0x1D7 PUSH2 0x10F7 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B8 JUMPI JUMPDEST POP POP PUSH2 0x25C DUP5 DUP5 DUP5 DUP5 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x264 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x2B6 SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x2A5 PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xF68 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x13E8 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2C1 SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP7 DUP2 PUSH2 0x22D JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x2FF PUSH2 0x10F7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3D5 JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x439 PUSH2 0xBEB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x149 JUMPI PUSH2 0x533 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x46B PUSH2 0x10F7 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x505 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x55D DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xFF0 JUMP JUMPDEST PUSH2 0x44D JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x599 PUSH2 0xBEB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x602 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x6B3 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x6EF CALLDATASIZE PUSH2 0xC31 JUMP JUMPDEST PUSH2 0x6F7 PUSH2 0x10F7 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x7A1 JUMPI JUMPDEST POP POP PUSH2 0x77D DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x785 JUMPI STOP JUMPDEST PUSH2 0x2B6 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x798 PUSH1 0x20 DUP7 PUSH2 0xF68 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x13E8 JUMP JUMPDEST PUSH2 0x7AA SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x74E JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x40 PUSH2 0x7EA PUSH2 0x12A2 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH2 0x2B6 PUSH2 0x845 CALLDATASIZE PUSH2 0xC31 JUMP JUMPDEST SWAP2 PUSH2 0x84E PUSH2 0x10F7 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x8CC JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xD47 JUMP JUMPDEST PUSH2 0x8D5 SWAP2 PUSH2 0xFF0 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x8A4 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH2 0x913 PUSH2 0xBEB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0xB40 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x963 PUSH2 0x10F7 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xB12 JUMPI DUP5 DUP7 EQ PUSH2 0xAE4 JUMPI PUSH2 0x9A3 DUP2 DUP7 DUP7 PUSH2 0x1222 JUMP JUMPDEST ISZERO PUSH2 0xA98 JUMPI POP ISZERO PUSH2 0xA07 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x9F3 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x9CA JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0xA84 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x9CC JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0xA28 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xB6A SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xFF0 JUMP JUMPDEST DUP4 PUSH2 0x939 JUMP JUMPDEST CALLVALUE PUSH2 0x149 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x149 JUMPI PUSH1 0x20 PUSH2 0xBCD PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x149 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x149 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x149 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xD19 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xD12 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xF3E JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xB12 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xF0C JUMPI DUP3 PUSH2 0xDBB SWAP2 DUP6 PUSH2 0x1222 JUMP JUMPDEST ISZERO PUSH2 0xE51 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xE02 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xDDA JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xEC6 JUMPI JUMPDEST PUSH2 0xE7A JUMPI DUP1 PUSH2 0xDC1 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xE70 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xFA9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x149 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x149 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x10ED JUMPI JUMPDEST PUSH2 0x1019 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10B2 JUMPI JUMPDEST POP ISZERO PUSH2 0x1085 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10D4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI JUMPDEST PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFD8 JUMP JUMPDEST CODESIZE PUSH2 0x107C JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x1011 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1213 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1218 JUMPI JUMPDEST PUSH2 0x1213 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1182 JUMPI JUMPDEST POP PUSH2 0x117F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x11F4 JUMPI JUMPDEST POP CODESIZE PUSH2 0x1175 JUMP JUMPDEST PUSH2 0x120D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST CODESIZE PUSH2 0x11ED JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x113E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x124D JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1247 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x13D6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x13DE JUMPI JUMPDEST PUSH2 0x13D6 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1335 JUMPI JUMPDEST POP PUSH2 0x1304 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x149 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x13B7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x12F8 JUMP JUMPDEST PUSH2 0x13D0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10DA JUMPI PUSH2 0x10CC DUP2 DUP4 PUSH2 0xF68 JUMP JUMPDEST CODESIZE PUSH2 0x13B0 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x12E9 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x15A9 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1527 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x14F7 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x15A1 JUMPI JUMPDEST DUP2 PUSH2 0x1540 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xF68 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x159D JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x159A JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x14A9 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1533 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1454 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4E CALLF 0x1260 0xB0 CALLF 0x6B5F JUMP 0xEF EXTCODESIZE RETURNDATASIZE 0xE2 PUSH9 0x801D130DDE6EED18B5 SWAP2 SHR SELFBALANCE SWAP4 0x23 DUP6 CALLER DUP3 CODECOPY PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"295:291:151:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;295:291:151;-1:-1:-1;295:291:151;28718:11:327;295:291:151;;;;-1:-1:-1;295:291:151;28718:28:327;295:291:151;-1:-1:-1;295:291:151;;;;;;-1:-1:-1;295:291:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1640:41:319;;:::i;:::-;295:291:151;;;;;;;;2616:14:352;2612:76;;295:291:151;29158:19:327;;11217:7;1863:70;;;;295:291:151;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;295:291:151;11235:101:327;295:291:151;;11271:54:327;295:291:151;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11271:54:327;:::i;:::-;295:291:151;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;295:291:151;;;;;;;;;;;1640:41:319;;:::i;:::-;295:291:151;;;;;;;3174:18:180;;;3170:53;;2657:25:327;295:291:151;500:10:59;295:291:151;500:10:59;;;295:291:151;;;;636:1:180;295:291:151;;;;3170:53:180;3201:22;295:291:151;3201:22:180;295:291:151;;;;3201:22:180;295:291:151;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;295:291:151;;1640:41:319;;;:::i;:::-;295:291:151;;;6339:18:327;;;;6335:63;;295:291:151;6463:42:327;6408:19;295:291:151;-1:-1:-1;295:291:151;6408:11:327;295:291:151;;;-1:-1:-1;295:291:151;;-1:-1:-1;295:291:151;;;;-1:-1:-1;295:291:151;;;;;;;;;;;;;;;;6463:42:327;295:291:151;6335:63:327;6366:32;;295:291:151;6366:32:327;295:291:151;;;;6366:32:327;1500:115:305;2931:8:352;668:81;295:291:151;2931:8:352;:::i;:::-;1500:115:305;;295:291:151;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;295:291:151;;-1:-1:-1;295:291:151;26801:10:327;295:291:151;;;;-1:-1:-1;295:291:151;;;;;;;;26724:60:327;26756:28;295:291:151;26756:28:327;295:291:151;;26756:28:327;295:291:151;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;295:291:151;;;;;;;;27291:64:327;27324:31;;295:291:151;27324:31:327;295:291:151;;;;27324:31:327;295:291:151;;;;;;;:::i;:::-;1640:41:319;;:::i;:::-;3179:19:352;295:291:151;;;;;;;;2616:14:352;2612:76;;295:291:151;29158:19:327;;9668:7;1863:70;;;;295:291:151;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;295:291:151;9686:99:327;9722:52;295:291:151;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;295:291:151;;;;;;;;;;;;1875:39:319;;:::i;:::-;295:291:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2134:7:305;295:291:151;;;:::i;:::-;1640:41:319;;;:::i;:::-;295:291:151;;;;;;;;2616:14:352;2612:76;;295:291:151;29158:19:327;;295:291:151;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;295:291:151;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;295:291:151;29158:19:327;295:291:151;1640:41:319;;:::i;:::-;295:291:151;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;295:291:151;5670:35:327;;295:291:151;5157:173:327;295:291:151;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;295:291:151;;;;;5620:11:327;295:291:151;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;295:291:151;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;295:291:151;5052:59:327;;;295:291:151;5052:59:327;295:291:151;;;;;;;;;5052:59:327;4927:63;4958:32;;295:291:151;4958:32:327;295:291:151;;;;4958:32:327;4802:64;4835:31;;295:291:151;4835:31:327;295:291:151;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;295:291:151;2931:8:352;:::i;:::-;1064:117:305;;;295:291:151;;;;;;;;;;;;3579:43:305;295:291:151;;;3579:43:305;:::i;:::-;295:291:151;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27798:360:327:-;295:291:151;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;295:291:151;;;28073:11:327;295:291:151;;;;;;;;28066:27:327;:::o;28022:130::-;28124:17;;295:291:151;28124:17:327;:::o;27948:64::-;27981:31;;295:291:151;27981:31:327;;295:291:151;;;27981:31:327;7385:956;;;295:291:151;;7507:16:327;;;7503:58;;295:291:151;7521:1:327;295:291:151;;;;;7521:1:327;295:291:151;;;;;30700:19:327;;;7615:64;;295:291:151;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;295:291:151;;;7521:1:327;295:291:151;;;;;;7521:1:327;295:291:151;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;295:291:151;-1:-1:-1;295:291:151;;;;;-1:-1:-1;295:291:151;;;;;2220:8:327;;295:291:151;-1:-1:-1;295:291:151;;;;-1:-1:-1;295:291:151;8155:10:327;295:291:151;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;295:291:151;7896:51:327;;;7521:1;7896:51;295:291:151;7896:51:327;295:291:151;;;;;;7521:1:327;7896:51;7828:59;295:291:151;;7521:1:327;295:291:151;7867:11:327;;;295:291:151;;;;7521:1:327;295:291:151;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;295:291:151;;;;7521:1:327;7728:34;7503:58;7532:29;7521:1;7532:29;;7521:1;7532:29;295:291:151;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;295:291:151;;;;;-1:-1:-1;295:291:151;;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;295:291:151;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;295:291:151;;;3613:51:352;295:291:151;;3613:51:352;;;;295:291:151;3613:51:352;;3648:4;3613:51;;;295:291:151;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;295:291:151;;-1:-1:-1;3691:28:352;3613:51;;;;295:291:151;3613:51:352;295:291:151;3613:51:352;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;295:291:151;;;-1:-1:-1;295:291:151;;;;;3524:68:352;3559:29;;;:33;;3524:68;;907:917:76;295:291:151;1029:19:76;295:291:151;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;295:291:151;;;1676:74:76;;295:291:151;;;1676:74:76;;;295:291:151;1327:10:76;295:291:151;;;;1744:4:76;295:291:151;;;;;-1:-1:-1;1676:74:76;;295:291:151;;;;;;1676:74:76;;;;;;;295:291:151;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;295:291:151;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;295:291:151;;-1:-1:-1;295:291:151;30435:11:327;295:291:151;;;;-1:-1:-1;295:291:151;30435:27:327;295:291:151;-1:-1:-1;295:291:151;;;;;-1:-1:-1;295:291:151;;;30413:49:327;;;;;1938:939:76;295:291:151;2065:19:76;295:291:151;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;295:291:151;720:8:80;295:291:151;720:8:80;;295:291:151;;;;2115:1:76;2802:32;;:::o;2624:153::-;295:291:151;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;295:291:151;2361:10:76;295:291:151;;;;2771:4:76;295:291:151;;;;;-1:-1:-1;2682:95:76;;295:291:151;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;;295:291:151;29701:270:327;;;;;;295:291:151;;;;;29832:65:327;295:291:151;29832:65:327;;295:291:151;29832:65:327;;;295:291:151;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;295:291:151;;;;;;;;;;;;;-1:-1:-1;295:291:151;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;295:291:151;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29828:136::-;29925:39;-1:-1:-1;29925:39:327;29832:65;295:291:151;;;;-1:-1:-1;29925:39:327;29832:65;295:291:151;29832:65:327;;295:291:151;29832:65:327;;;;;;295:291:151;29832:65:327;;;:::i;:::-;;;295:291:151;;;;;;;;;;;;;29832:65:327;295:291:151;29832:65:327;;295:291:151;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;295:291:151;;;;;;;;;;;;;;;;-1:-1:-1;295:291:151;;"},"gasEstimates":{"creation":{"codeDepositCost":"1124600","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2531","getApproved(uint256)":"4574","initERC721Storage()":"infinite","isApprovedForAll(address,address)":"2736","ownerOf(uint256)":"2454","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","transferFrom(address,address,uint256)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","initERC721Storage()":"b1c7ee02","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"initERC721Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721FacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"initERC721Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol\":\"ERC721WithOperatorFiltererFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/facets/ERC721WithOperatorFiltererFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721WithOperatorFiltererFacet} from \\\"./../../../../token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol\\\";\\n\\n/// @title ERC721FacetMock\\ncontract ERC721WithOperatorFiltererFacetMock is ERC721WithOperatorFiltererFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721WithOperatorFiltererFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xda8a7d26818599c377e5ce6a8f1607262ae64ea2cfbf90a09afd7b502260ae0c\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\\ncontract ERC721WithOperatorFiltererFacet is ERC721WithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x86f87a4b990a900cf6c88e4474c5bcacf8afdfc26ae07b5203f32c483f270b8f\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"initERC721Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC721."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol":{"ERC721FullBurnMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"ERC721FullBurnMock","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1610,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1573,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346106205761464c8038038061001981610625565b928339810160a0828203126106205781516001600160401b038111610620578161004491840161064a565b602083015190916001600160401b0382116106205761006491840161064a565b60408301519092906001600160a01b038116908190036106205760608201516001600160a01b03811692908390036106205760800151926001600160a01b038416840361062057336105c1575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b0382116104975760008051602061460c8339815191525490600182811c921680156105b7575b60208310146104775781601f84931161053a575b50602090601f83116001146104b8576000926104ad575b50508160011b916000199060031b1c19161760008051602061460c833981519152555b83516001600160401b0381116104975760008051602061462c83398151915254600181811c9116801561048d575b602082101461047757601f8111610405575b50602094601f821160011461038457948192939495600092610379575b50508160011b916000199060031b1c19161760008051602061462c833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b84528284208054821683179055638b8b4ef560e01b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613f5690816106b6823960805181818161282f0152818161327101528181613af50152613ca00152f35b015190503880610274565b601f1982169560008051602061462c833981519152600052806000209160005b8881106103ed575083600195969798106103d4575b505050811b0160008051602061462c83398151915255610297565b015160001960f88460031b161c191690553880806103b9565b919260206001819286850151815501940192016103a4565b60008051602061462c8339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061046d575b601f0160051c01905b8181106104615750610257565b60008155600101610454565b909150819061044b565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b60008051602061460c83398151915260009081528281209350601f198516905b8181106105225750908460019594939210610509575b505050811b0160008051602061460c83398151915255610217565b015160001960f88460031b161c191690553880806104ee565b929360206001819287860151815501950193016104d8565b60008051602061460c8339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c810191602085106105ad575b90601f859493920160051c01905b81811061059e57506101dd565b60008155849350600101610591565b9091508190610583565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761049757604052565b81601f82011215610620578051906001600160401b03821161049757610679601f8301601f1916602001610625565b92828452602083830101116106205760005b8281106106a057505060206000918301015290565b8060208092840101518282870101520161068b56fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612e3957806306fdde0314612dde578063081812fc14612d81578063095ea7b314612aed578063114ba8ee146129ee57806323b872dd146129465780632a55205a146128535780632b4c9f16146127e45780632f2ff15d1461265857806331e66e1e146125d557806340c10f191461254557806342842e0e146124755780634684d7e9146122dc578063572b6c051461229157806361ba27da146121755780636352211e146120fa57806370a082311461203057806373c8a95814611e8057806379cc679014611be25780638832e6e3146119945780638bb9c5bf146118255780638da5cb5b146117b45780638dc251e31461168757806391d14854146115ef57806395d89b41146115805780639da5e83214611456578063a0c76f62146113e5578063a22cb46514611285578063b0ccc31e14611214578063b88d4fde146110f2578063c3666c3614610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e23661311a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613ade565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e8183876138a3565b3573ffffffffffffffffffffffffffffffffffffffff8116809103610335576102788285876138a3565b359081471061030357600080809381935af13d156102fb573d9061029b826132b9565b916102a96040519384613186565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c8612f05565b6103d0612f28565b9060443567ffffffffffffffff8111610335576103f1903690600401612fbd565b926103fa613ade565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694613c09565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d8189866138a3565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b610710916139f3565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e612f05565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778613ade565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936612fee565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844613ade565b92610850848483613c09565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c08188866138a3565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a67612f05565b73ffffffffffffffffffffffffffffffffffffffff610a84612f28565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a612f28565b610b62613ade565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613848565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d90820185612ec2565b0390f35b3d8083833e610e308183613186565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e67846132b9565b92610e756040519485613186565b84845260208584010111610e9e5750610e1d92610e989160208085019101612e9f565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461033557610ec33661305d565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f08613ade565b925416911690810361036457508082148015906110e8575b61033a5760005b828110610f3057005b73ffffffffffffffffffffffffffffffffffffffff610f58610f5383858a6138a3565b6138b3565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea9576000916110ba575b501561108d575073ffffffffffffffffffffffffffffffffffffffff610fe7610f5383858a6138a3565b1690610ff7610f538286896138a3565b9161100382878b6138a3565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea95760019261107c575b5001610f27565b600061108791613186565b88611075565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110db915060203d81116110e1575b6110d38183613186565b8101906138d4565b89610fbd565b503d6110c9565b5082821415610f20565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611129612f05565b611131612f28565b60443560643567ffffffffffffffff8111610335576111549036906004016130ec565b92909361115f613ade565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603611204575b50506111e5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b823b6111ed57005b611202956111fc9136916132f3565b93613dcf565b005b61120d916139f3565b86856111b6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576112bc612f05565b6024359081151591828103610335576113b6575b73ffffffffffffffffffffffffffffffffffffffff806112ee613ade565b169116918183146113885760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113e0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306139f3565b6112d0565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610335576114643661311a565b6114967fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b90613681565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114c1816131f6565b946114cf6040519687613186565b818652602086019160051b81019036821161033557915b81831061155357505050906114fc91369161320e565b918051918351830361033a5760005b83811061151457005b8061154d73ffffffffffffffffffffffffffffffffffffffff61153960019487613805565b51166115458389613805565b519085613743565b0161150b565b823573ffffffffffffffffffffffffffffffffffffffff81168103610335578152602092830192016114e6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56138ec565b604051918291602083526020830190612ec2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611626612f28565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576116be612f05565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116fd613ade565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561178a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611880613ade565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561194c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119cb612f05565b6024359060443567ffffffffffffffff8111610335576119ef9036906004016130ec565b91611a1c7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b611a5c8482611a567fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a4e613ade565b9736916132f3565b94613743565b803b611a6457005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ad160405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612ec2565b03816000865af1908115610ea957600091611b63575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bda575b81611b7c60209383613186565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611ae7565b5080fd5b3d9150611b6f565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611c19612f05565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c46613ade565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e525773ffffffffffffffffffffffffffffffffffffffff8116809503611e205782611c9b9185613c09565b15611d49575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dbd575b611d725780611ca1565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d68565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557611e8e3661305d565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ed1613ade565b92541691169081036103645750808414801590612026575b61033a5760005b848110611ef957005b611f048183886138a3565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091611f37610f53868b8e6138a3565b82611fa1611fcd611f49898d8d6138a3565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613186565b51925af115610ea9576000513d61201d5750803b155b611ff05750600101611ef0565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fe3565b5082841415611ee9565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612067612f05565b73ffffffffffffffffffffffffffffffffffffffff8116156120d05773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613848565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121e6613ade565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206122d26122cd612f05565b61325a565b6040519015158152f35b346103355761235b73ffffffffffffffffffffffffffffffffffffffff61230236612fee565b929193906123327fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c093369161320e565b921690811561244b5782519260005b8481106123ab575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123b58183613805565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241e57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161236a565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355761248336612f4b565b61248b613ade565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612535575b5050612511828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b803b61251957005b611202936040519361252c602086613186565b60008552613dcf565b61253e916139f3565b84836124e2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761120261257f612f05565b6125ab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613743565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557604061260e613c89565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435612692612f28565b61269a613ade565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561274d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c908015801561293e575b15612908575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a082101561292b5761292590620186a09261363f565b046128d8565b620186a0612939920461363f565b6128d8565b5081156128cb565b346103355761120261295736612f4b565b91612960613ade565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036129de575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b6129e7916139f3565b85816129b6565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612a7c613ade565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612b24612f05565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612d51575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612b74613ade565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612d2357848614612cf557612bb4818686613c09565b15612ca9575015612c18577401000000000000000000000000000000000000000016612c04575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612bdb565b90740100000000000000000000000000000000000000008217809203612c95575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612bdd565b846000526020526040600020558380612c39565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612d7b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306139f3565b83612b4a565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133d9565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46138ec565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576122d260209161332a565b60005b838110612eb25750506000910152565b8181015183820152602001612ea2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612efe81518092818752878088019101612e9f565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff82116103355761305991600401612fbd565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816130a691600401612fbd565b9290929160243567ffffffffffffffff811161033557816130c991600401612fbd565b929092916044359067ffffffffffffffff82116103355761305991600401612fbd565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161316391600401612fbd565b929092916024359067ffffffffffffffff82116103355761305991600401612fbd565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176131c757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116131c75760051b60200190565b92919061321a816131f6565b936132286040519586613186565b602085838152019160051b810192831161033557905b82821061324a57505050565b813581526020918201910161323e565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132b25773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116131c757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926132ff826132b9565b9161330d6040519384613186565b829481845281830111610335578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146133d3577f01ffc9a70000000000000000000000000000000000000000000000000000000081146133cd576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af577401000000000000000000000000000000000000000016156132b2576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612d235773ffffffffffffffffffffffffffffffffffffffff811680950361360d57826134bc9185613c09565b15613552575b5050836000528060205282604060002055828203613503575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386134db565b74010000000000000000000000000000000000000000161580156135c7575b61357b57806134c2565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613571565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561365257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156136db5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244b57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166137d757600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156138195760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613876575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156138195760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519160008154918260011c926001811680156139e9575b6020851081146139bc5784875286939291811561397c5750600114613935575b5061393392500383613186565b565b90506000929192526020600020906000915b8183106139605750509060206139339282010138613926565b6020919350806001915483858901015201910190918492613947565b602093506139339592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613926565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613906565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613ad4575b613a1c575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea957600091613ab5575b5015613a885750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613ace915060203d6020116110e1576110d38183613186565b38613a7f565b50813b1515613a14565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613bfa573233148015613bff575b613bfa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b69575b50613b6657503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ea957600091613bdb575b5038613b5c565b613bf4915060203d6020116110e1576110d38183613186565b38613bd4565b503390565b5060183610613b25565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613c34575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613c2e565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613dbd573233148015613dc5575b613dbd57803314908115613d1c575b50613ceb576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103355760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ea957600091613d9e575b5038613cdf565b613db7915060203d6020116110e1576110d38183613186565b38613d97565b506000903690565b5060183610613cd0565b73ffffffffffffffffffffffffffffffffffffffff90613e41826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612ec2565b03816000865af1908115610ea957600091613ea5575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b33575050565b6020813d602011613f18575b81613ebe60209383613186565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000613e57565b3d9150613eb156fea2646970667358221220090003c65cadaf3342fd621342df4a03e75c423750fb2b1ad66d1c63f462f88964736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x620 JUMPI PUSH2 0x464C DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x625 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x620 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x620 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x64A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x620 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x64A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x620 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x620 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x620 JUMPI CALLER PUSH2 0x5C1 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x460C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5B7 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x477 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x53A JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4B8 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4AD JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x460C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x462C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x48D JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x477 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x405 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x384 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x379 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x462C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x8B8B4EF5 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3F56 SWAP1 DUP2 PUSH2 0x6B6 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x282F ADD MSTORE DUP2 DUP2 PUSH2 0x3271 ADD MSTORE DUP2 DUP2 PUSH2 0x3AF5 ADD MSTORE PUSH2 0x3CA0 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x462C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3ED JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3D4 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x462C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3B9 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x3A4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x462C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x46D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x461 JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x454 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x44B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x460C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x522 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x509 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x460C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4EE JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4D8 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x460C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5AD JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x59E JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x591 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x583 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x497 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x620 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x497 JUMPI PUSH2 0x679 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x625 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x620 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x6A0 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x68B JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E39 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2DDE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2D81 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2AED JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x29EE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2946 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2853 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x27E4 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2658 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x25D5 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2545 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2475 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2291 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2175 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20FA JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2030 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E80 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BE2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1994 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1825 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17B4 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1687 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15EF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1580 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1456 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13E5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1285 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1214 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x311A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x32B9 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3186 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x2F28 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3C09 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x2F05 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x2FEE JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x3C09 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x2F05 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x2F28 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x2F28 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3848 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x2EC2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x32B9 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3186 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2E9F JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xEC3 CALLDATASIZE PUSH2 0x305D JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF08 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10E8 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF30 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF58 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x38A3 JUMP JUMPDEST PUSH2 0x38B3 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10BA JUMPI JUMPDEST POP ISZERO PUSH2 0x108D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE7 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x38A3 JUMP JUMPDEST AND SWAP1 PUSH2 0xFF7 PUSH2 0xF53 DUP3 DUP7 DUP10 PUSH2 0x38A3 JUMP JUMPDEST SWAP2 PUSH2 0x1003 DUP3 DUP8 DUP12 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x107C JUMPI JUMPDEST POP ADD PUSH2 0xF27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1087 SWAP2 PUSH2 0x3186 JUMP JUMPDEST DUP9 PUSH2 0x1075 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10E1 JUMPI JUMPDEST PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x38D4 JUMP JUMPDEST DUP10 PUSH2 0xFBD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C9 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF20 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1129 PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x1131 PUSH2 0x2F28 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1154 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x30EC JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x115F PUSH2 0x3ADE JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1204 JUMPI JUMPDEST POP POP PUSH2 0x11E5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11ED JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP6 PUSH2 0x11FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x32F3 JUMP JUMPDEST SWAP4 PUSH2 0x3DCF JUMP JUMPDEST STOP JUMPDEST PUSH2 0x120D SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x12BC PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x13B6 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12EE PUSH2 0x3ADE JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1388 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13E0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x39F3 JUMP JUMPDEST PUSH2 0x12D0 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1464 CALLDATASIZE PUSH2 0x311A JUMP JUMPDEST PUSH2 0x1496 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH2 0x3681 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14C1 DUP2 PUSH2 0x31F6 JUMP JUMPDEST SWAP5 PUSH2 0x14CF PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3186 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1553 JUMPI POP POP POP SWAP1 PUSH2 0x14FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x320E JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1514 JUMPI STOP JUMPDEST DUP1 PUSH2 0x154D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1539 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3805 JUMP JUMPDEST MLOAD AND PUSH2 0x1545 DUP4 DUP10 PUSH2 0x3805 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3743 JUMP JUMPDEST ADD PUSH2 0x150B JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14E6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x38EC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1626 PUSH2 0x2F28 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x16BE PUSH2 0x2F05 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16FD PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x178A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1880 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19CB PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x19EF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x30EC JUMP JUMPDEST SWAP2 PUSH2 0x1A1C PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH2 0x1A5C DUP5 DUP3 PUSH2 0x1A56 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A4E PUSH2 0x3ADE JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x32F3 JUMP JUMPDEST SWAP5 PUSH2 0x3743 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A64 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AD1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B63 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BDA JUMPI JUMPDEST DUP2 PUSH2 0x1B7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AE7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B6F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1C19 PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C46 PUSH2 0x3ADE JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E52 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E20 JUMPI DUP3 PUSH2 0x1C9B SWAP2 DUP6 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x1D49 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DBD JUMPI JUMPDEST PUSH2 0x1D72 JUMPI DUP1 PUSH2 0x1CA1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D68 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E8E CALLDATASIZE PUSH2 0x305D JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1ED1 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2026 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EF9 JUMPI STOP JUMPDEST PUSH2 0x1F04 DUP2 DUP4 DUP9 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F37 PUSH2 0xF53 DUP7 DUP12 DUP15 PUSH2 0x38A3 JUMP JUMPDEST DUP3 PUSH2 0x1FA1 PUSH2 0x1FCD PUSH2 0x1F49 DUP10 DUP14 DUP14 PUSH2 0x38A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3186 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x201D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FF0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FE3 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2067 PUSH2 0x2F05 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20D0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3848 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21E6 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2264 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x22D2 PUSH2 0x22CD PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x325A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x235B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2302 CALLDATASIZE PUSH2 0x2FEE JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2332 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x320E JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23AB JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23B5 DUP2 DUP4 PUSH2 0x3805 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x241E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x236A JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2483 CALLDATASIZE PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x248B PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2535 JUMPI JUMPDEST POP POP PUSH2 0x2511 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2519 JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x252C PUSH1 0x20 DUP7 PUSH2 0x3186 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3DCF JUMP JUMPDEST PUSH2 0x253E SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24E2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x257F PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x25AB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3743 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x40 PUSH2 0x260E PUSH2 0x3C89 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2692 PUSH2 0x2F28 JUMP JUMPDEST PUSH2 0x269A PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x274D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x293E JUMPI JUMPDEST ISZERO PUSH2 0x2908 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x292B JUMPI PUSH2 0x2925 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x363F JUMP JUMPDEST DIV PUSH2 0x28D8 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2939 SWAP3 DIV PUSH2 0x363F JUMP JUMPDEST PUSH2 0x28D8 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x28CB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x2957 CALLDATASIZE PUSH2 0x2F4B JUMP JUMPDEST SWAP2 PUSH2 0x2960 PUSH2 0x3ADE JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29DE JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST PUSH2 0x29E7 SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x29B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2A7C PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2B24 PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2D51 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2B74 PUSH2 0x3ADE JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2D23 JUMPI DUP5 DUP7 EQ PUSH2 0x2CF5 JUMPI PUSH2 0x2BB4 DUP2 DUP7 DUP7 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x2CA9 JUMPI POP ISZERO PUSH2 0x2C18 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2C04 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2BDB JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2C95 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2BDD JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2C39 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2D7B SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x39F3 JUMP JUMPDEST DUP4 PUSH2 0x2B4A JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33D9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x38EC JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x22D2 PUSH1 0x20 SWAP2 PUSH2 0x332A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2EB2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2EA2 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2EFE DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2E9F JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x30A6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x30C9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3163 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x31C7 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C7 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x321A DUP2 PUSH2 0x31F6 JUMP JUMPDEST SWAP4 PUSH2 0x3228 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3186 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x324A JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x323E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x32B2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C7 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x32FF DUP3 PUSH2 0x32B9 JUMP JUMPDEST SWAP2 PUSH2 0x330D PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3186 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x33D3 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x33CD JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x32B2 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2D23 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x360D JUMPI DUP3 PUSH2 0x34BC SWAP2 DUP6 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x3552 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3503 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x34DB JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x35C7 JUMPI JUMPDEST PUSH2 0x357B JUMPI DUP1 PUSH2 0x34C2 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3571 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3652 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x36DB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x37D7 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3819 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3876 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3819 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x39E9 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x39BC JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x397C JUMPI POP PUSH1 0x1 EQ PUSH2 0x3935 JUMPI JUMPDEST POP PUSH2 0x3933 SWAP3 POP SUB DUP4 PUSH2 0x3186 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3960 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3933 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3926 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3947 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3933 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3926 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3906 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3AD4 JUMPI JUMPDEST PUSH2 0x3A1C JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3AB5 JUMPI JUMPDEST POP ISZERO PUSH2 0x3A88 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3ACE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3A7F JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3BFA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3BFF JUMPI JUMPDEST PUSH2 0x3BFA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B69 JUMPI JUMPDEST POP PUSH2 0x3B66 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3BDB JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B5C JUMP JUMPDEST PUSH2 0x3BF4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3BD4 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3B25 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3C34 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3C2E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3DBD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3DC5 JUMPI JUMPDEST PUSH2 0x3DBD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3D1C JUMPI JUMPDEST POP PUSH2 0x3CEB JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D9E JUMPI JUMPDEST POP CODESIZE PUSH2 0x3CDF JUMP JUMPDEST PUSH2 0x3DB7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3D97 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3CD0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3E41 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3EA5 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3F18 JUMPI JUMPDEST DUP2 PUSH2 0x3EBE PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3E57 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3EB1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MULMOD STOP SUB 0xC6 TLOAD 0xAD 0xAF CALLER TIMESTAMP REVERT PUSH3 0x1342DF BLOBBASEFEE SUB SWAPN 0x5C TIMESTAMP CALLDATACOPY POP EXTSTATICCALL 0x2B BYTE 0xD6 PUSH14 0x1C63F462F88964736F6C63430008 0x1E STOP CALLER PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 ","sourceMap":"479:477:152:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;1717:10:329;1645:152:42;;-1:-1:-1;479:477:152;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;479:477:152;;;-1:-1:-1;;;;;;479:477:152;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;479:477:152;;;-1:-1:-1;;;;;479:477:152;;;;-1:-1:-1;;;;;;;;;;;479:477:152;;990:1:42;479:477:152;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;990:1:42;479:477:152;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;479:477:152;;;;-1:-1:-1;;;;;479:477:152;;;;-1:-1:-1;;;;;;;;;;;479:477:152;990:1:42;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;990:1:42;479:477:152;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;479:477:152;;1289:23:341;479:477:152;;-1:-1:-1;;;;;;479:477:152;;;;;;;-1:-1:-1;;;;500:10:59;;;479:477:152;500:10:59;;;;479:477:152;500:10:59;;;;;-1:-1:-1;;500:10:59;;;479:477:152;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;479:477:152;745:39:76;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;479:477:152;;-1:-1:-1;479:477:152;;-1:-1:-1;479:477:152;;;;;;;;990:1:42;479:477:152;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;479:477:152;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;479:477:152;;990:1:42;479:477:152;;;;;;-1:-1:-1;479:477:152;;;;;;;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;;;;;;;;;;;;479:477:152;;;;;;;-1:-1:-1;;;479:477:152;;;;;;;;;;;;990:1:42;479:477:152;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;479:477:152;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;479:477:152;;;-1:-1:-1;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;-1:-1:-1;990:1:42;479:477:152;;;;;;-1:-1:-1;479:477:152;;;;;;;;;;;1645:152:42;479:477:152;;;-1:-1:-1;;;;;;479:477:152;1717:10:329;479:477:152;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;479:477:152;-1:-1:-1;479:477:152;;;;;;;;;-1:-1:-1;;479:477:152;;;-1:-1:-1;;;;;479:477:152;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;479:477:152;;;;;;;;-1:-1:-1;;479:477:152;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;;;;-1:-1:-1;479:477:152;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12072,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":12107,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":12270,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12381,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12570,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12221,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":12814,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13043,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":14548,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":12524,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12037,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":11970,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":12790,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":12985,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":14499,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":13887,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14572,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":11935,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":12678,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":15823,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":14835,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":13953,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":13273,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":15369,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":12890,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":14147,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":15497,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":15070,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":14408,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":13098,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":13384,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14341,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":14515,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10287},{"length":32,"start":12913},{"length":32,"start":15093},{"length":32,"start":15520}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612e3957806306fdde0314612dde578063081812fc14612d81578063095ea7b314612aed578063114ba8ee146129ee57806323b872dd146129465780632a55205a146128535780632b4c9f16146127e45780632f2ff15d1461265857806331e66e1e146125d557806340c10f191461254557806342842e0e146124755780634684d7e9146122dc578063572b6c051461229157806361ba27da146121755780636352211e146120fa57806370a082311461203057806373c8a95814611e8057806379cc679014611be25780638832e6e3146119945780638bb9c5bf146118255780638da5cb5b146117b45780638dc251e31461168757806391d14854146115ef57806395d89b41146115805780639da5e83214611456578063a0c76f62146113e5578063a22cb46514611285578063b0ccc31e14611214578063b88d4fde146110f2578063c3666c3614610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e23661311a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613ade565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e8183876138a3565b3573ffffffffffffffffffffffffffffffffffffffff8116809103610335576102788285876138a3565b359081471061030357600080809381935af13d156102fb573d9061029b826132b9565b916102a96040519384613186565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c8612f05565b6103d0612f28565b9060443567ffffffffffffffff8111610335576103f1903690600401612fbd565b926103fa613ade565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694613c09565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d8189866138a3565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b610710916139f3565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e612f05565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778613ade565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936612fee565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844613ade565b92610850848483613c09565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c08188866138a3565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a67612f05565b73ffffffffffffffffffffffffffffffffffffffff610a84612f28565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a612f28565b610b62613ade565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613848565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d90820185612ec2565b0390f35b3d8083833e610e308183613186565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e67846132b9565b92610e756040519485613186565b84845260208584010111610e9e5750610e1d92610e989160208085019101612e9f565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461033557610ec33661305d565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f08613ade565b925416911690810361036457508082148015906110e8575b61033a5760005b828110610f3057005b73ffffffffffffffffffffffffffffffffffffffff610f58610f5383858a6138a3565b6138b3565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea9576000916110ba575b501561108d575073ffffffffffffffffffffffffffffffffffffffff610fe7610f5383858a6138a3565b1690610ff7610f538286896138a3565b9161100382878b6138a3565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea95760019261107c575b5001610f27565b600061108791613186565b88611075565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110db915060203d81116110e1575b6110d38183613186565b8101906138d4565b89610fbd565b503d6110c9565b5082821415610f20565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611129612f05565b611131612f28565b60443560643567ffffffffffffffff8111610335576111549036906004016130ec565b92909361115f613ade565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603611204575b50506111e5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b823b6111ed57005b611202956111fc9136916132f3565b93613dcf565b005b61120d916139f3565b86856111b6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576112bc612f05565b6024359081151591828103610335576113b6575b73ffffffffffffffffffffffffffffffffffffffff806112ee613ade565b169116918183146113885760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113e0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306139f3565b6112d0565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610335576114643661311a565b6114967fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b90613681565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114c1816131f6565b946114cf6040519687613186565b818652602086019160051b81019036821161033557915b81831061155357505050906114fc91369161320e565b918051918351830361033a5760005b83811061151457005b8061154d73ffffffffffffffffffffffffffffffffffffffff61153960019487613805565b51166115458389613805565b519085613743565b0161150b565b823573ffffffffffffffffffffffffffffffffffffffff81168103610335578152602092830192016114e6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56138ec565b604051918291602083526020830190612ec2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611626612f28565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576116be612f05565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116fd613ade565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561178a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611880613ade565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561194c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119cb612f05565b6024359060443567ffffffffffffffff8111610335576119ef9036906004016130ec565b91611a1c7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b611a5c8482611a567fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a4e613ade565b9736916132f3565b94613743565b803b611a6457005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ad160405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612ec2565b03816000865af1908115610ea957600091611b63575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bda575b81611b7c60209383613186565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611ae7565b5080fd5b3d9150611b6f565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611c19612f05565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c46613ade565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e525773ffffffffffffffffffffffffffffffffffffffff8116809503611e205782611c9b9185613c09565b15611d49575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dbd575b611d725780611ca1565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d68565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557611e8e3661305d565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ed1613ade565b92541691169081036103645750808414801590612026575b61033a5760005b848110611ef957005b611f048183886138a3565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091611f37610f53868b8e6138a3565b82611fa1611fcd611f49898d8d6138a3565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613186565b51925af115610ea9576000513d61201d5750803b155b611ff05750600101611ef0565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fe3565b5082841415611ee9565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612067612f05565b73ffffffffffffffffffffffffffffffffffffffff8116156120d05773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613848565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121e6613ade565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206122d26122cd612f05565b61325a565b6040519015158152f35b346103355761235b73ffffffffffffffffffffffffffffffffffffffff61230236612fee565b929193906123327fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c093369161320e565b921690811561244b5782519260005b8481106123ab575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123b58183613805565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241e57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161236a565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355761248336612f4b565b61248b613ade565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612535575b5050612511828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b803b61251957005b611202936040519361252c602086613186565b60008552613dcf565b61253e916139f3565b84836124e2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761120261257f612f05565b6125ab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490613ade565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613743565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557604061260e613c89565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435612692612f28565b61269a613ade565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561274d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c908015801561293e575b15612908575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a082101561292b5761292590620186a09261363f565b046128d8565b620186a0612939920461363f565b6128d8565b5081156128cb565b346103355761120261295736612f4b565b91612960613ade565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036129de575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613448565b6129e7916139f3565b85816129b6565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612a7c613ade565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612b24612f05565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612d51575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612b74613ade565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612d2357848614612cf557612bb4818686613c09565b15612ca9575015612c18577401000000000000000000000000000000000000000016612c04575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612bdb565b90740100000000000000000000000000000000000000008217809203612c95575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612bdd565b846000526020526040600020558380612c39565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612d7b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306139f3565b83612b4a565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133d9565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46138ec565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576122d260209161332a565b60005b838110612eb25750506000910152565b8181015183820152602001612ea2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612efe81518092818752878088019101612e9f565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff82116103355761305991600401612fbd565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816130a691600401612fbd565b9290929160243567ffffffffffffffff811161033557816130c991600401612fbd565b929092916044359067ffffffffffffffff82116103355761305991600401612fbd565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161316391600401612fbd565b929092916024359067ffffffffffffffff82116103355761305991600401612fbd565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176131c757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116131c75760051b60200190565b92919061321a816131f6565b936132286040519586613186565b602085838152019160051b810192831161033557905b82821061324a57505050565b813581526020918201910161323e565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132b25773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116131c757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926132ff826132b9565b9161330d6040519384613186565b829481845281830111610335578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146133d3577f01ffc9a70000000000000000000000000000000000000000000000000000000081146133cd576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af577401000000000000000000000000000000000000000016156132b2576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612d235773ffffffffffffffffffffffffffffffffffffffff811680950361360d57826134bc9185613c09565b15613552575b5050836000528060205282604060002055828203613503575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386134db565b74010000000000000000000000000000000000000000161580156135c7575b61357b57806134c2565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613571565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561365257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156136db5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244b57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166137d757600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156138195760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613876575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156138195760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519160008154918260011c926001811680156139e9575b6020851081146139bc5784875286939291811561397c5750600114613935575b5061393392500383613186565b565b90506000929192526020600020906000915b8183106139605750509060206139339282010138613926565b6020919350806001915483858901015201910190918492613947565b602093506139339592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613926565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613906565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613ad4575b613a1c575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea957600091613ab5575b5015613a885750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613ace915060203d6020116110e1576110d38183613186565b38613a7f565b50813b1515613a14565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613bfa573233148015613bff575b613bfa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b69575b50613b6657503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ea957600091613bdb575b5038613b5c565b613bf4915060203d6020116110e1576110d38183613186565b38613bd4565b503390565b5060183610613b25565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613c34575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613c2e565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613dbd573233148015613dc5575b613dbd57803314908115613d1c575b50613ceb576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103355760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ea957600091613d9e575b5038613cdf565b613db7915060203d6020116110e1576110d38183613186565b38613d97565b506000903690565b5060183610613cd0565b73ffffffffffffffffffffffffffffffffffffffff90613e41826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612ec2565b03816000865af1908115610ea957600091613ea5575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b33575050565b6020813d602011613f18575b81613ebe60209383613186565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000613e57565b3d9150613eb156fea2646970667358221220090003c65cadaf3342fd621342df4a03e75c423750fb2b1ad66d1c63f462f88964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E39 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2DDE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2D81 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2AED JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x29EE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2946 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2853 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x27E4 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2658 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x25D5 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2545 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2475 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2291 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2175 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20FA JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2030 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E80 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BE2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1994 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1825 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17B4 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1687 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15EF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1580 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1456 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13E5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1285 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1214 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x311A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x32B9 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3186 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x2F28 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3C09 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x2F05 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x2FEE JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x3C09 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x2F05 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x2F28 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x2F28 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3848 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x2EC2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x32B9 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3186 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2E9F JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xEC3 CALLDATASIZE PUSH2 0x305D JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF08 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10E8 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF30 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF58 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x38A3 JUMP JUMPDEST PUSH2 0x38B3 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10BA JUMPI JUMPDEST POP ISZERO PUSH2 0x108D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE7 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x38A3 JUMP JUMPDEST AND SWAP1 PUSH2 0xFF7 PUSH2 0xF53 DUP3 DUP7 DUP10 PUSH2 0x38A3 JUMP JUMPDEST SWAP2 PUSH2 0x1003 DUP3 DUP8 DUP12 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x107C JUMPI JUMPDEST POP ADD PUSH2 0xF27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1087 SWAP2 PUSH2 0x3186 JUMP JUMPDEST DUP9 PUSH2 0x1075 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10E1 JUMPI JUMPDEST PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x38D4 JUMP JUMPDEST DUP10 PUSH2 0xFBD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C9 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF20 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1129 PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x1131 PUSH2 0x2F28 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1154 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x30EC JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x115F PUSH2 0x3ADE JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1204 JUMPI JUMPDEST POP POP PUSH2 0x11E5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11ED JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP6 PUSH2 0x11FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x32F3 JUMP JUMPDEST SWAP4 PUSH2 0x3DCF JUMP JUMPDEST STOP JUMPDEST PUSH2 0x120D SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x12BC PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x13B6 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12EE PUSH2 0x3ADE JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1388 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13E0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x39F3 JUMP JUMPDEST PUSH2 0x12D0 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1464 CALLDATASIZE PUSH2 0x311A JUMP JUMPDEST PUSH2 0x1496 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 PUSH2 0x3681 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14C1 DUP2 PUSH2 0x31F6 JUMP JUMPDEST SWAP5 PUSH2 0x14CF PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3186 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1553 JUMPI POP POP POP SWAP1 PUSH2 0x14FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x320E JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1514 JUMPI STOP JUMPDEST DUP1 PUSH2 0x154D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1539 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3805 JUMP JUMPDEST MLOAD AND PUSH2 0x1545 DUP4 DUP10 PUSH2 0x3805 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3743 JUMP JUMPDEST ADD PUSH2 0x150B JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14E6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x38EC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1626 PUSH2 0x2F28 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x16BE PUSH2 0x2F05 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16FD PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x178A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1880 PUSH2 0x3ADE JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19CB PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x19EF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x30EC JUMP JUMPDEST SWAP2 PUSH2 0x1A1C PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH2 0x1A5C DUP5 DUP3 PUSH2 0x1A56 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A4E PUSH2 0x3ADE JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x32F3 JUMP JUMPDEST SWAP5 PUSH2 0x3743 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A64 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AD1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B63 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BDA JUMPI JUMPDEST DUP2 PUSH2 0x1B7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AE7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B6F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1C19 PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C46 PUSH2 0x3ADE JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E52 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E20 JUMPI DUP3 PUSH2 0x1C9B SWAP2 DUP6 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x1D49 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DBD JUMPI JUMPDEST PUSH2 0x1D72 JUMPI DUP1 PUSH2 0x1CA1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D68 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E8E CALLDATASIZE PUSH2 0x305D JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1ED1 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2026 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EF9 JUMPI STOP JUMPDEST PUSH2 0x1F04 DUP2 DUP4 DUP9 PUSH2 0x38A3 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F37 PUSH2 0xF53 DUP7 DUP12 DUP15 PUSH2 0x38A3 JUMP JUMPDEST DUP3 PUSH2 0x1FA1 PUSH2 0x1FCD PUSH2 0x1F49 DUP10 DUP14 DUP14 PUSH2 0x38A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3186 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x201D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FF0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FE3 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2067 PUSH2 0x2F05 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20D0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3848 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21E6 PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2264 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x22D2 PUSH2 0x22CD PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x325A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x235B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2302 CALLDATASIZE PUSH2 0x2FEE JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2332 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x320E JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23AB JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23B5 DUP2 DUP4 PUSH2 0x3805 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x241E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x236A JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2483 CALLDATASIZE PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x248B PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2535 JUMPI JUMPDEST POP POP PUSH2 0x2511 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2519 JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x252C PUSH1 0x20 DUP7 PUSH2 0x3186 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3DCF JUMP JUMPDEST PUSH2 0x253E SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24E2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x257F PUSH2 0x2F05 JUMP JUMPDEST PUSH2 0x25AB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x3ADE JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3743 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x40 PUSH2 0x260E PUSH2 0x3C89 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2692 PUSH2 0x2F28 JUMP JUMPDEST PUSH2 0x269A PUSH2 0x3ADE JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x274D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x293E JUMPI JUMPDEST ISZERO PUSH2 0x2908 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x292B JUMPI PUSH2 0x2925 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x363F JUMP JUMPDEST DIV PUSH2 0x28D8 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2939 SWAP3 DIV PUSH2 0x363F JUMP JUMPDEST PUSH2 0x28D8 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x28CB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x2957 CALLDATASIZE PUSH2 0x2F4B JUMP JUMPDEST SWAP2 PUSH2 0x2960 PUSH2 0x3ADE JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29DE JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3448 JUMP JUMPDEST PUSH2 0x29E7 SWAP2 PUSH2 0x39F3 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x29B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2A7C PUSH2 0x3ADE JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2B24 PUSH2 0x2F05 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2D51 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2B74 PUSH2 0x3ADE JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2D23 JUMPI DUP5 DUP7 EQ PUSH2 0x2CF5 JUMPI PUSH2 0x2BB4 DUP2 DUP7 DUP7 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x2CA9 JUMPI POP ISZERO PUSH2 0x2C18 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2C04 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2BDB JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2C95 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2BDD JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2C39 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2D7B SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x39F3 JUMP JUMPDEST DUP4 PUSH2 0x2B4A JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33D9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x38EC JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x22D2 PUSH1 0x20 SWAP2 PUSH2 0x332A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2EB2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2EA2 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2EFE DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2E9F JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x30A6 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x30C9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3163 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x3059 SWAP2 PUSH1 0x4 ADD PUSH2 0x2FBD JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x31C7 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C7 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x321A DUP2 PUSH2 0x31F6 JUMP JUMPDEST SWAP4 PUSH2 0x3228 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3186 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x324A JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x323E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x32B2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31C7 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x32FF DUP3 PUSH2 0x32B9 JUMP JUMPDEST SWAP2 PUSH2 0x330D PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3186 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x33D3 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x33CD JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x32B2 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2D23 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x360D JUMPI DUP3 PUSH2 0x34BC SWAP2 DUP6 PUSH2 0x3C09 JUMP JUMPDEST ISZERO PUSH2 0x3552 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3503 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x34DB JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x35C7 JUMPI JUMPDEST PUSH2 0x357B JUMPI DUP1 PUSH2 0x34C2 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3571 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3652 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x36DB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x37D7 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3819 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3876 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3819 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x39E9 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x39BC JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x397C JUMPI POP PUSH1 0x1 EQ PUSH2 0x3935 JUMPI JUMPDEST POP PUSH2 0x3933 SWAP3 POP SUB DUP4 PUSH2 0x3186 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3960 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3933 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3926 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3947 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3933 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3926 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3906 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3AD4 JUMPI JUMPDEST PUSH2 0x3A1C JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3AB5 JUMPI JUMPDEST POP ISZERO PUSH2 0x3A88 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3ACE SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3A7F JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3BFA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3BFF JUMPI JUMPDEST PUSH2 0x3BFA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B69 JUMPI JUMPDEST POP PUSH2 0x3B66 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3BDB JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B5C JUMP JUMPDEST PUSH2 0x3BF4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3BD4 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3B25 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3C34 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3C2E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3DBD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3DC5 JUMPI JUMPDEST PUSH2 0x3DBD JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3D1C JUMPI JUMPDEST POP PUSH2 0x3CEB JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D9E JUMPI JUMPDEST POP CODESIZE PUSH2 0x3CDF JUMP JUMPDEST PUSH2 0x3DB7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x3186 JUMP JUMPDEST CODESIZE PUSH2 0x3D97 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3CD0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3E41 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2EC2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3EA5 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3F18 JUMPI JUMPDEST DUP2 PUSH2 0x3EBE PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3186 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3E57 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3EB1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MULMOD STOP SUB 0xC6 TLOAD 0xAD 0xAF CALLER TIMESTAMP REVERT PUSH3 0x1342DF BLOBBASEFEE SUB SWAPN 0x5C TIMESTAMP CALLDATACOPY POP EXTSTATICCALL 0x2B BYTE 0xD6 PUSH14 0x1C63F462F88964736F6C63430008 0x1E STOP CALLER ","sourceMap":"479:477:152:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;479:477:152;;2085:41:329;;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;479:477:152;1845:10:192;;;;;;479:477:152;1857:3:192;1876:11;;;;;:::i;:::-;479:477:152;;;;;;;;;1898:10:192;;;;;:::i;:::-;479:477:152;1375:21:9;;;:30;1371:125;;479:477:152;1548:33:9;;;;;;;479:477:152;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;479:477:152;;1834:9:192;;1591:58:9;479:477:152;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;479:477:152;5957:19:9;479:477:152;;5957:19:9;479:477:152;;;;;1371:125:9;1455:21;;1428:57;479:477:152;1428:57:9;479:477:152;;;;;;1428:57:9;479:477:152;;;;1756:63:192;1793:26;479:477:152;1793:26:192;479:477:152;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;479:477:152;;-1:-1:-1;4538:25:42;479:477:152;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2085:41:329;;;:::i;:::-;3179:19:352;479:477:152;;;;;;;;2616:14:352;2612:76;;479:477:152;29158:19:327;;479:477:152;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;479:477:152;;12884:11:327;;479:477:152;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;479:477:152;13173:304:327;-1:-1:-1;479:477:152;;;13323:10:327;479:477:152;;;;;;;;;;;2220:8:327;;479:477:152;;;;;;;;;2220:8:327;;479:477:152;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;479:477:152;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;479:477:152;;;;;;;;;;;;;;2220:8:327;13125:27;;;479:477:152;13125:27:327;;479:477:152;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;479:477:152;12987:51:327;;479:477:152;12987:51:327;479:477:152;;;;;;;;;12987:51:327;12919:59;479:477:152;;;;12958:11:327;479:477:152;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;479:477:152;12832:34:327;479:477:152;;;;;;12832:34:327;12715:64;12748:31;;479:477:152;12748:31:327;479:477:152;;;;12748:31:327;12409:58;12438:29;479:477:152;12438:29:327;479:477:152;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;479:477:152;;;;;;;;;;;;;:::i;:::-;;2085:41:329;;;:::i;:::-;479:477:152;;;;;;;;3205:23:42;;;3201:60;;479:477:152;;;3275:25:42;;;;3271:146;;479:477:152;3271:146:42;2220:8:327;;;;;;;;3361:45:42;479:477:152;3361:45:42;;479:477:152;;;;;;;;:::i;:::-;29158:19:327;479:477:152;2085:41:329;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;479:477:152;;25879:11:327;;479:477:152;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;479:477:152;26179:110:327;-1:-1:-1;479:477:152;26238:10:327;479:477:152;;;-1:-1:-1;479:477:152;;;;;2220:8:327;;479:477:152;;;25601:3:327;25638:11;;;;;:::i;:::-;479:477:152;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;479:477:152;;;;;;;;;;2414:66:327;479:477:152;;;2220:8:327;479:477:152;26123:35:327;;;;;479:477:152;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;479:477:152;25982:51:327;;479:477:152;25982:51:327;479:477:152;;;;;;;;;25982:51:327;25914:59;479:477:152;;;;25953:11:327;479:477:152;;;;;;;;;;;25943:30:327;;25914:59;;479:477:152;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;479:477:152;-1:-1:-1;479:477:152;28718:11:327;479:477:152;;;;-1:-1:-1;479:477:152;28718:28:327;479:477:152;-1:-1:-1;479:477:152;;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;479:477:152;;;;;;;;;;;;;;;;;;;;;;713:6:351;479:477:152;;;;;;;;;;;;;;;;;;:::i;:::-;2085:41:329;;:::i;:::-;5148:19:42;479:477:152;;;;;;;4503:26:42;;;4499:64;;4464:19:41;479:477:152;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;1880:140:41;;479:477:152;1880:140:41;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;479:477:152;;;;1973:36:41;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;479:477:152;;;1453:39:302;1863:70:327;479:477:152;1453:39:302;:::i;:::-;;479:477:152;3364:23:341;479:477:152;;;;3364:64:341;;;;;479:477:152;3364:64:341;;1603:4:302;479:477:152;3364:64:341;;479:477:152;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;479:477:152;3364:64:341;;;479:477:152;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;479:477:152;;;;;;;;;;;3364:64:341;479:477:152;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;479:477:152;;;2085:41:329;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;479:477:152;3852:94:192;;479:477:152;3972:10:192;;;;;;479:477:152;3984:3:192;479:477:152;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;479:477:152;;;;4058:76:192;;4108:25;479:477:152;4058:76:192;;479:477:152;4058:76:192;;;;;;;;;;;;479:477:152;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;479:477:152;4239:12:192;;;;;;:::i;:::-;479:477:152;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;479:477:152;4239:70:192;;;;;;;479:477:152;;;;;;;4239:70:192;;;;;479:477:152;4239:70:192;;4277:4;479:477:152;4239:70:192;;479:477:152;;4058:76:192;479:477:152;;;;;;;4239:70:192;;;;;;;479:477:152;4239:70:192;;;3984:3;;479:477:152;3961:9:192;;4239:70;479:477:152;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;479:477:152;4161:50:192;479:477:152;;4058:76:192;479:477:152;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;479:477:152;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2085:41:329;;;;;:::i;:::-;3179:19:352;479:477:152;;;;;;;;2616:14:352;2612:76;;479:477:152;29158:19:327;;11217:7;1863:70;;;;479:477:152;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;479:477:152;11235:101:327;11271:54;479:477:152;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;479:477:152;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;479:477:152;;2085:41:329;;;:::i;:::-;479:477:152;;;6339:18:327;;;;6335:63;;479:477:152;6463:42:327;6408:19;479:477:152;-1:-1:-1;479:477:152;6408:11:327;479:477:152;;;-1:-1:-1;479:477:152;;-1:-1:-1;479:477:152;;;;-1:-1:-1;479:477:152;;;;;;;;;;;;;;;;6463:42:327;479:477:152;6335:63:327;6366:32;;479:477:152;6366:32:327;479:477:152;;;;6366:32:327;1500:115:305;2931:8:352;668:81;479:477:152;2931:8:352;:::i;:::-;1500:115:305;;479:477:152;;;;;;;;;;;;;2991:23:341;479:477:152;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;479:477:152;2085:41:329;;:::i;:::-;1368:12:300;;:::i;:::-;479:477:152;1062:8:300;;;;:::i;:::-;479:477:152;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;479:477:152;;1062:8:300;;;;;;;;;;;479:477:152;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;479:477:152;17882:10:327;;;;;;479:477:152;17894:3:327;17920:13;17935:11;479:477:152;17920:13:327;479:477:152;17920:13:327;;;:::i;:::-;479:477:152;;17935:11:327;;;;:::i;:::-;479:477:152;17935:11:327;;;:::i;:::-;479:477:152;17871:9:327;;1062:8:300;479:477:152;;;;;;;;;1062:8:300;;;;;;;;;;479:477:152;;;;;;;;;;;;;2688:13:341;479:477:152;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;479:477:152;-1:-1:-1;479:477:152;;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;479:477:152;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2085:41:329;;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;2976:19:351;479:477:152;;;;;1732:22:351;1728:93;;479:477:152;;2220:8:327;;;;;;;479:477:152;;;1728:93:351;1777:33;479:477:152;1777:33:351;479:477:152;;1777:33:351;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2085:41:329;;:::i;:::-;479:477:152;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;3741:25:41;3737:66;;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;479:477:152;;;;2455:33:41;479:477:152;3737:66:41;479:477:152;3775:28:41;;;479:477:152;3775:28:41;479:477:152;;;;;;;3775:28:41;479:477:152;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;479:477:152;2085:41:329;;:::i;1586:12:303:-;15560:7:327;1863:70;;479:477:152;;2085:41:329;;;:::i;:::-;479:477:152;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;479:477:152;15578:107:327;479:477:152;;;;;;;;;29832:65:327;;;;;479:477:152;29832:65:327;;479:477:152;;29832:65:327;;479:477:152;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;479:477:152;29832:65:327;;;;;;;;479:477:152;29832:65:327;;;15578:107;479:477:152;;;;;29832:84:327;29828:136;;479:477:152;29828:136:327;29925:39;479:477:152;29925:39:327;479:477:152;;;;;;29925:39:327;29832:65;479:477:152;29832:65:327;;479:477:152;29832:65:327;;;;;;479:477:152;29832:65:327;;;:::i;:::-;;;479:477:152;;;;;;;;;;;;;29832:65:327;479:477:152;29832:65:327;;479:477:152;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;479:477:152;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;479:477:152;2085:41:329;;:::i;:::-;479:477:152;;;;;;;;;;;;;30700:19:327;;;24121:64;;479:477:152;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;479:477:152;;;;;;;;;;2414:66:327;479:477:152;;;2220:8:327;479:477:152;;;24633:10:327;479:477:152;;;;;;;;;2220:8:327;;24674:35;;;;479:477:152;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;479:477:152;24402:51:327;;;479:477:152;24402:51:327;479:477:152;;;;;;;;;24402:51:327;24334:59;479:477:152;;;;24373:11:327;479:477:152;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;479:477:152;24234:34:327;479:477:152;;;;;;24234:34:327;24121:64;24154:31;;479:477:152;24154:31:327;479:477:152;;;;24154:31:327;479:477:152;;;;;;;:::i;:::-;5148:19:42;;;;479:477:152;;;2085:41:329;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;479:477:152;2776:90:192;;479:477:152;2892:10:192;;;;;;479:477:152;2904:3:192;2923:9;;;;;:::i;:::-;479:477:152;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;479:477:152;;;1328:43:8;;;;;;479:477:152;;;;1328:43:8;;;479:477:152;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;479:477:152;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;479:477:152;;2881:9:192;;8938:146:8;9033:40;479:477:152;9033:40:8;479:477:152;;1328:43:8;479:477:152;9033:40:8;8942:68;479:477:152;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;479:477:152;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;479:477:152;;-1:-1:-1;479:477:152;26801:10:327;479:477:152;;;;-1:-1:-1;479:477:152;;;;;;;;26724:60:327;26756:28;479:477:152;26756:28:327;479:477:152;;26756:28:327;479:477:152;;;;;;;;;;;;3395:39:305;479:477:152;;;3395:39:305;:::i;:::-;479:477:152;;;;;;;;;;;;;;;;;;;;;;;2085:41:329;;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;2976:19:351;479:477:152;1281:36:351;713:6;1281:36;;1277:119;;479:477:152;;;;;;;;;;;;;;;1277:119:351;1340:45;479:477:152;1340:45:351;479:477:152;;;;1340:45:351;479:477:152;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;1956:12:303;479:477:152;2085:41:329;;:::i;1956:12:303:-;479:477:152;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;479:477:152;;16512:9:327;479:477:152;16523:10:327;;;;;;16821:14;;;-1:-1:-1;479:477:152;16821:10:327;479:477:152;;;-1:-1:-1;479:477:152;;;;;2220:8:327;;479:477:152;;;16535:3:327;16572:11;;;;:::i;:::-;479:477:152;;;;;;;;;;;;;16597:72:327;;479:477:152;;;;;;;;;;;;;2220:8:327;16743:33;479:477:152;16743:33:327;;;;479:477:152;16512:9:327;;16597:72;16641:28;479:477:152;16641:28:327;479:477:152;;;;16641:28:327;16400:54;16429:25;479:477:152;16429:25:327;479:477:152;;16429:25:327;479:477:152;;;;;;;:::i;:::-;2085:41:329;;:::i;:::-;3179:19:352;479:477:152;;;;;;;;2616:14:352;2612:76;;479:477:152;29158:19:327;;9668:7;1863:70;;;;479:477:152;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;479:477:152;9686:99:327;9722:52;479:477:152;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;479:477:152;;;;;;;;;;;1287:7:303;479:477:152;;:::i;:::-;1232:12:303;479:477:152;2085:41:329;;:::i;1232:12:303:-;479:477:152;;;;1287:7:303;:::i;479:477:152:-;;;;;;;;;;;;2320:39:329;;:::i;:::-;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2085:41:329;;:::i;:::-;5148:19:42;479:477:152;;;;;;;4503:26:42;;;4499:64;;4464:19:41;479:477:152;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;1254:25:41;1250:140;;479:477:152;1250:140:41;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;479:477:152;;;;1343:36:41;479:477:152;;;;;;;;;;;;;;;;941:19:75;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;479:477:152;2499:377:351;;;2559:17;;479:477:152;;2499:377:351;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;479:477:152;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;479:477:152;2499:377:351;;2607:259;713:6;2794:57;479:477:152;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;479:477:152;;;;2134:7:305;479:477:152;;;:::i;:::-;2085:41:329;;;:::i;:::-;479:477:152;;;;;;;;2616:14:352;2612:76;;479:477:152;29158:19:327;;479:477:152;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;479:477:152;;;;;;;;;;;;;;;;;;;;;;2085:41:329;;;:::i;:::-;479:477:152;;;;;4503:26:42;;;4499:64;;3179:19:352;479:477:152;;;;2220:8:327;;;;;;;479:477:152;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;479:477:152;29158:19:327;479:477:152;2085:41:329;;:::i;:::-;479:477:152;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;479:477:152;5670:35:327;;479:477:152;5157:173:327;479:477:152;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;479:477:152;;;;;5620:11:327;479:477:152;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;479:477:152;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;479:477:152;5052:59:327;;;479:477:152;5052:59:327;479:477:152;;;;;;;;;5052:59:327;4927:63;4958:32;;479:477:152;4958:32:327;479:477:152;;;;4958:32:327;4802:64;4835:31;;479:477:152;4835:31:327;479:477:152;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;479:477:152;2931:8:352;:::i;:::-;1064:117:305;;;479:477:152;;;;;;;;;;;;3579:43:305;479:477:152;;;3579:43:305;:::i;479:477:152:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;479:477:152;635:65:55;;:::i;479:477:152:-;;;;;;;;-1:-1:-1;;479:477:152;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;479:477:152;1146:19:75;479:477:152;1146:53:75;;;1142:96;;479:477:152;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;479:477:152;1215:12:75;:::o;479:477:152:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;479:477:152;;;;;;:::o;1359:340:59:-;479:477:152;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;479:477:152;500:10:59;479:477:152;500:10:59;;;;479:477:152;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;479:477:152;1528:12:59;:::o;27798:360:327:-;479:477:152;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;479:477:152;;;28073:11:327;479:477:152;;;;;;;;28066:27:327;:::o;7385:956::-;;;479:477:152;;7507:16:327;;;7503:58;;479:477:152;7521:1:327;479:477:152;;;;;7521:1:327;479:477:152;;;;;30700:19:327;;;7615:64;;479:477:152;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;479:477:152;;;7521:1:327;479:477:152;;;;;;7521:1:327;479:477:152;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;479:477:152;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;;;2220:8:327;;479:477:152;-1:-1:-1;479:477:152;;;;-1:-1:-1;479:477:152;8155:10:327;479:477:152;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;479:477:152;7896:51:327;;;7521:1;7896:51;479:477:152;7896:51:327;479:477:152;;;;;;7521:1:327;7896:51;7828:59;479:477:152;;7521:1:327;479:477:152;7867:11:327;;;479:477:152;;;;7521:1:327;479:477:152;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;479:477:152;;;;7521:1:327;7728:34;479:477:152;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;479:477:152;-1:-1:-1;479:477:152;;;;-1:-1:-1;479:477:152;;;;-1:-1:-1;479:477:152;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;479:477:152;3775:28:41;;-1:-1:-1;3775:28:41;479:477:152;3775:28:41;479:477:152;;;;;-1:-1:-1;3775:28:41;14035:460:327;;479:477:152;;14119:16:327;;;14115:54;;479:477:152;14133:1:327;479:477:152;;;;;;14133:1:327;479:477:152;;;14179:72:327;;14415:10;479:477:152;;14133:1:327;479:477:152;;;;;;14133:1:327;479:477:152;2220:8:327;479:477:152;-1:-1:-1;479:477:152;14415:10:327;479:477:152;;;-1:-1:-1;479:477:152;14415:10:327;479:477:152;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;479:477:152;;14133:1:327;14223:28;479:477:152;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;479:477:152;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;479:477:152;;-1:-1:-1;27324:31:327;479:477:152;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;479:477:152;;;;;-1:-1:-1;479:477:152;;-1:-1:-1;479:477:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;479:477:152;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;479:477:152;;;3613:51:352;479:477:152;;3613:51:352;;;;479:477:152;3613:51:352;;3648:4;3613:51;;;479:477:152;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;479:477:152;;-1:-1:-1;3691:28:352;3613:51;;;;479:477:152;3613:51:352;479:477:152;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;479:477:152;1029:19:76;479:477:152;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;479:477:152;;;1676:74:76;;479:477:152;;;1676:74:76;;;479:477:152;1327:10:76;479:477:152;;;;1744:4:76;479:477:152;;;;;-1:-1:-1;1676:74:76;;479:477:152;;;;;;1676:74:76;;;;;;;479:477:152;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;479:477:152;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;479:477:152;;-1:-1:-1;479:477:152;30435:11:327;479:477:152;;;;-1:-1:-1;479:477:152;30435:27:327;479:477:152;-1:-1:-1;479:477:152;;;500:10:59;479:477:152;-1:-1:-1;479:477:152;500:10:59;;30413:49:327;;;;;1938:939:76;479:477:152;2065:19:76;479:477:152;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;479:477:152;720:8:80;479:477:152;720:8:80;;479:477:152;;;;2115:1:76;2802:32;;:::o;2624:153::-;479:477:152;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;479:477:152;2361:10:76;479:477:152;;;;2771:4:76;479:477:152;;;;;-1:-1:-1;2682:95:76;;479:477:152;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;479:477:152;29701:270:327;479:477:152;29701:270:327;479:477:152;29701:270:327;;;;;479:477:152;;;;;29832:65:327;;;;;479:477:152;29832:65:327;;479:477:152;29832:65:327;;;479:477:152;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;479:477:152;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;479:477:152;29832:65:327;;479:477:152;29832:65:327;;;;;;479:477:152;29832:65:327;;;:::i;:::-;;;479:477:152;;;;;;;;;;;;;29832:65:327;479:477:152;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3242800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"848","ROYALTY_FEE_DENOMINATOR()":"892","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","isApprovedForAll(address,address)":"3289","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2715","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"ERC721FullBurnMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol\":\"ERC721FullBurnMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/ERC721FullBurnMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ERC721FullBurn} from \\\"./../../../../token/ERC721/preset/ERC721FullBurn.sol\\\";\\n\\n/// @title ERC721FullBurnMock\\ncontract ERC721FullBurnMock is ERC721FullBurn {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC721FullBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa6c855e822d9af331dcbe5a968efaa341070adc81cb7a69af02bb4957f696f1d\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./base/ERC721BurnableBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Burnable is ERC721BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\\n    constructor() {\\n        ERC721Storage.initERC721Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xb63465341692ba51eeae4dd59c0c43809f4262b0dee67343981aaffbd49c0908\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./base/ERC721DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x0465e23e92e293553137225252d7c5b80b6fc7ae406b15559830b5b7164025f9\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721FullBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721Mintable} from \\\"./../ERC721Mintable.sol\\\";\\nimport {ERC721Deliverable} from \\\"./../ERC721Deliverable.sol\\\";\\nimport {ERC721Burnable} from \\\"./../ERC721Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullBurn is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721Mintable,\\n    ERC721Deliverable,\\n    ERC721Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x15163c8bfd56bada82e04418d4f95579b9a708b8631154f59e02a66e6bbe32df\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol":{"ERC721FullMintOnceBurnMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"title":"ERC721FullBurnMock","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1610,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1573,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a060405234610620576148b98038038061001981610625565b928339810160a0828203126106205781516001600160401b038111610620578161004491840161064a565b602083015190916001600160401b0382116106205761006491840161064a565b60408301519092906001600160a01b038116908190036106205760608201516001600160a01b03811692908390036106205760800151926001600160a01b038416840361062057336105c1575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b038211610497576000805160206148798339815191525490600182811c921680156105b7575b60208310146104775781601f84931161053a575b50602090601f83116001146104b8576000926104ad575b50508160011b916000199060031b1c191617600080516020614879833981519152555b83516001600160401b0381116104975760008051602061489983398151915254600181811c9116801561048d575b602082101461047757601f8111610405575b50602094601f821160011461038457948192939495600092610379575b50508160011b916000199060031b1c191617600080516020614899833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b84528284208054821683179055638b8b4ef560e01b8452828420805482168317905563152a902d60e11b845292829020805490931617909155608091909152516141c390816106b68239608051818181612a470152818161348901528181613d620152613f0d0152f35b015190503880610274565b601f19821695600080516020614899833981519152600052806000209160005b8881106103ed575083600195969798106103d4575b505050811b0160008051602061489983398151915255610297565b015160001960f88460031b161c191690553880806103b9565b919260206001819286850151815501940192016103a4565b6000805160206148998339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061046d575b601f0160051c01905b8181106104615750610257565b60008155600101610454565b909150819061044b565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b60008051602061487983398151915260009081528281209350601f198516905b8181106105225750908460019594939210610509575b505050811b0160008051602061487983398151915255610217565b015160001960f88460031b161c191690553880806104ee565b929360206001819287860151815501950193016104d8565b6000805160206148798339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c810191602085106105ad575b90601f859493920160051c01905b81811061059e57506101dd565b60008155849350600101610591565b9091508190610583565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761049757604052565b81601f82011215610620578051906001600160401b03821161049757610679601f8301601f1916602001610625565b92828452602083830101116106205760005b8281106106a057505060206000918301015290565b8060208092840101518282870101520161068b56fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461305157806306fdde0314612ff6578063081812fc14612f99578063095ea7b314612d05578063114ba8ee14612c0657806323b872dd14612b5e5780632a55205a14612a6b5780632b4c9f16146129fc5780632f2ff15d1461287057806331e66e1e146127ed57806340c10f191461275d57806342842e0e1461268d5780634684d7e9146124c9578063572b6c051461247e57806361ba27da146123625780636352211e146122e757806370a082311461221d57806373c8a9581461206d57806379cc679014611dcf5780638832e6e314611b815780638bb9c5bf14611a125780638da5cb5b146119a15780638dc251e31461187457806391d14854146117dc57806395d89b411461176d5780639da5e832146114ec578063a0c76f621461147b578063a22cb4651461131b578063b0ccc31e146112aa578063b88d4fde14611188578063c3666c3614610f4b578063c77c695514610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613332565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e613d4b565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387613b10565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587613b10565b359081471061030e57600080809381935af13d15610306573d906102a6826134d1565b916102b4604051938461339e565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d361311d565b6103db613140565b9060443567ffffffffffffffff8111610340576103fc9036906004016131d5565b92610405613d4b565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa8382849694613e76565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986613b10565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b91613c60565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761075961311d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610783613d4b565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613206565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f613d4b565b9261085b848483613e76565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886613b10565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a7261311d565b73ffffffffffffffffffffffffffffffffffffffff610a8f613140565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b65613140565b610b6d613d4b565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ab5565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e28908201856130da565b0390f35b3d8083833e610e3b818361339e565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e72846134d1565b92610e80604051948561339e565b84845260208584010111610ea95750610e2892610ea391602080850191016130b7565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034057610f5936613275565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f9e613d4b565b925416911690810361036f575080821480159061117e575b6103455760005b828110610fc657005b73ffffffffffffffffffffffffffffffffffffffff610fee610fe983858a613b10565b613b20565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb457600091611150575b5015611123575073ffffffffffffffffffffffffffffffffffffffff61107d610fe983858a613b10565b169061108d610fe9828689613b10565b9161109982878b613b10565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611112575b5001610fbd565b600061111d9161339e565b8861110b565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611171915060203d8111611177575b611169818361339e565b810190613b41565b89611053565b503d61115f565b5082821415610fb6565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111bf61311d565b6111c7613140565b60443560643567ffffffffffffffff8111610340576111ea903690600401613304565b9290936111f5613d4b565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361129a575b505061127b848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b823b61128357005b6112989561129291369161350b565b9361403c565b005b6112a391613c60565b868561124c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761135261311d565b60243590811515918281036103405761144c575b73ffffffffffffffffffffffffffffffffffffffff80611384613d4b565b1691169181831461141e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611476817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613c60565b611366565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610340576114fa36613332565b91929161152f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b90613899565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361155a8161340e565b93611568604051958661339e565b818552602085019160051b81019036821161034057915b8183106117405750505090611595913691613426565b9181519280518403610345577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115d057005b73ffffffffffffffffffffffffffffffffffffffff6115ef8284613a72565b51168015611716576116018285613a72565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116e8577fdead000000000000000000000000000000000000000000000000000000000000146116ba5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115c7565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff811681036103405781526020928301920161157f565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613b59565b6040519182916020835260208301906130da565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611813613140565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118ab61311d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118ea613d4b565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119775773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a6d613d4b565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b395760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611bb861311d565b6024359060443567ffffffffffffffff811161034057611bdc903690600401613304565b91611c097fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b611c498482611c437fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c3b613d4b565b97369161350b565b9461395b565b803b611c5157005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cbe60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906130da565b03816000865af1908115610eb457600091611d50575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2057005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dc7575b81611d696020938361339e565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611cd4565b5080fd5b3d9150611d5c565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611e0661311d565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e33613d4b565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561203f5773ffffffffffffffffffffffffffffffffffffffff811680950361200d5782611e889185613e76565b15611f36575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611faa575b611f5f5780611e8e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f55565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761207b36613275565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120be613d4b565b925416911690810361036f5750808414801590612213575b6103455760005b8481106120e657005b6120f1818388613b10565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091612124610fe9868b8e613b10565b8261218e6121ba612136898d8d613b10565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261339e565b51925af115610eb4576000513d61220a5750803b155b6121dd57506001016120dd565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121d0565b50828414156120d6565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761225461311d565b73ffffffffffffffffffffffffffffffffffffffff8116156122bd5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ab5565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123d3613d4b565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206124bf6124ba61311d565b613472565b6040519015158152f35b346103405761254873ffffffffffffffffffffffffffffffffffffffff6124ef36613206565b9291939061251f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613426565b92169081156117165782519260005b848110612598575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125a28183613a72565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661265f577fdead0000000000000000000000000000000000000000000000000000000000001461263257908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612557565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761269b36613163565b6126a3613d4b565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361274d575b5050612729828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b803b61273157005b611298936040519361274460208661339e565b6000855261403c565b61275691613c60565b84836126fa565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761129861279761311d565b6127c37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061395b565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576040612826613ef6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004356128aa613140565b6128b2613d4b565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561296557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612b56575b15612b20575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a0821015612b4357612b3d90620186a092613857565b04612af0565b620186a0612b519204613857565b612af0565b508115612ae3565b3461034057611298612b6f36613163565b91612b78613d4b565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612bf6575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b612bff91613c60565b8581612bce565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c94613d4b565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612d3c61311d565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612f69575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612d8c613d4b565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612f3b57848614612f0d57612dcc818686613e76565b15612ec1575015612e30577401000000000000000000000000000000000000000016612e1c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612df3565b90740100000000000000000000000000000000000000008217809203612ead575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612df5565b846000526020526040600020558380612e51565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612f93907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613c60565b83612d62565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135f1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613b59565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576124bf602091613542565b60005b8381106130ca5750506000910152565b81810151838201526020016130ba565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613116815180928187528780880191016130b7565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff821161034057613271916004016131d5565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff811161034057816132be916004016131d5565b9290929160243567ffffffffffffffff811161034057816132e1916004016131d5565b929092916044359067ffffffffffffffff821161034057613271916004016131d5565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff8111610340578161337b916004016131d5565b929092916024359067ffffffffffffffff821161034057613271916004016131d5565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176133df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116133df5760051b60200190565b9291906134328161340e565b93613440604051958661339e565b602085838152019160051b810192831161034057905b82821061346257505050565b8135815260209182019101613456565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156134ca5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116133df57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613517826134d1565b91613525604051938461339e565b829481845281830111610340578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135eb577f01ffc9a70000000000000000000000000000000000000000000000000000000081146135e5576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba577401000000000000000000000000000000000000000016156134ca576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612f3b5773ffffffffffffffffffffffffffffffffffffffff811680950361382557826136d49185613e76565b1561376a575b505083600052806020528260406000205582820361371b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386136f3565b74010000000000000000000000000000000000000000161580156137df575b61379357806136da565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613789565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561386a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156138f35750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561171657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116613a44577fdead00000000000000000000000000000000000000000000000000000000000014613a1657600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613a865760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613ae3575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613a865760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b906040519160008154918260011c92600181168015613c56575b602085108114613c2957848752869392918115613be95750600114613ba2575b50613ba09250038361339e565b565b90506000929192526020600020906000915b818310613bcd575050906020613ba09282010138613b93565b6020919350806001915483858901015201910190918492613bb4565b60209350613ba09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613b93565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613b73565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613d41575b613c89575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091613d22575b5015613cf55750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613d3b915060203d60201161117757611169818361339e565b38613cec565b50813b1515613c81565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613e67573233148015613e6c575b613e67577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613dd6575b50613dd357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610eb457600091613e48575b5038613dc9565b613e61915060203d60201161117757611169818361339e565b38613e41565b503390565b5060183610613d92565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613ea1575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613e9b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561402a573233148015614032575b61402a57803314908115613f89575b50613f58576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103405760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161400b575b5038613f4c565b614024915060203d60201161117757611169818361339e565b38614004565b506000903690565b5060183610613f3d565b73ffffffffffffffffffffffffffffffffffffffff906140ae826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906130da565b03816000865af1908115610eb457600091614112575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d20575050565b6020813d602011614185575b8161412b6020938361339e565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff000000000000000000000000000000000000000000000000000000006140c4565b3d915061411e56fea2646970667358221220bf180ed69a8ee63f6b8acf1837c6462b80cd489b2b7cf39a0040f0a21c1a7ecf64736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x620 JUMPI PUSH2 0x48B9 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x625 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x620 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x620 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x64A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x620 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x64A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x620 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x620 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x620 JUMPI CALLER PUSH2 0x5C1 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4879 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5B7 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x477 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x53A JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4B8 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4AD JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4879 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4899 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x48D JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x477 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x405 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x384 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x379 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4899 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x8B8B4EF5 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x41C3 SWAP1 DUP2 PUSH2 0x6B6 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2A47 ADD MSTORE DUP2 DUP2 PUSH2 0x3489 ADD MSTORE DUP2 DUP2 PUSH2 0x3D62 ADD MSTORE PUSH2 0x3F0D ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4899 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3ED JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3D4 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4899 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3B9 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x3A4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4899 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x46D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x461 JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x454 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x44B JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4879 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x522 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x509 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4879 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4EE JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4D8 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4879 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5AD JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x59E JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x591 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x583 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x497 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x620 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x497 JUMPI PUSH2 0x679 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x625 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x620 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x6A0 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x68B JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3051 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2FF6 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2F99 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2D05 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2C06 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2B5E JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2A6B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x29FC JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2870 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x27ED JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x275D JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x268D JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24C9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x247E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2362 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x221D JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x206D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DCF JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B81 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A12 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19A1 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1874 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17DC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x176D JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14EC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x147B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x131B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12AA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1188 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF4B JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3332 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x34D1 JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x339E JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x311D JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x3140 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3E76 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x311D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3206 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x3D4B JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x3E76 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x311D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x3140 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x3140 JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3AB5 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x30DA JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x34D1 JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x339E JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x30B7 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xF59 CALLDATASIZE PUSH2 0x3275 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF9E PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x117E JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFC6 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFEE PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x3B10 JUMP JUMPDEST PUSH2 0x3B20 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1150 JUMPI JUMPDEST POP ISZERO PUSH2 0x1123 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x107D PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x3B10 JUMP JUMPDEST AND SWAP1 PUSH2 0x108D PUSH2 0xFE9 DUP3 DUP7 DUP10 PUSH2 0x3B10 JUMP JUMPDEST SWAP2 PUSH2 0x1099 DUP3 DUP8 DUP12 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1112 JUMPI JUMPDEST POP ADD PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111D SWAP2 PUSH2 0x339E JUMP JUMPDEST DUP9 PUSH2 0x110B JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1171 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1177 JUMPI JUMPDEST PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B41 JUMP JUMPDEST DUP10 PUSH2 0x1053 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x115F JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFB6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x11BF PUSH2 0x311D JUMP JUMPDEST PUSH2 0x11C7 PUSH2 0x3140 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x11EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3304 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11F5 PUSH2 0x3D4B JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x129A JUMPI JUMPDEST POP POP PUSH2 0x127B DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1283 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP6 PUSH2 0x1292 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x350B JUMP JUMPDEST SWAP4 PUSH2 0x403C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12A3 SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x124C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1352 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x144C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1384 PUSH2 0x3D4B JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x141E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1476 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3C60 JUMP JUMPDEST PUSH2 0x1366 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x14FA CALLDATASIZE PUSH2 0x3332 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x152F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH2 0x3899 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x155A DUP2 PUSH2 0x340E JUMP JUMPDEST SWAP4 PUSH2 0x1568 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x339E JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1740 JUMPI POP POP POP SWAP1 PUSH2 0x1595 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3426 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x345 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15D0 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EF DUP3 DUP5 PUSH2 0x3A72 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1716 JUMPI PUSH2 0x1601 DUP3 DUP6 PUSH2 0x3A72 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16E8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16BA JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15C7 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x157F JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3B59 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1813 PUSH2 0x3140 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x18AB PUSH2 0x311D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18EA PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1977 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A6D PUSH2 0x3D4B JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B39 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1BB8 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x1BDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3304 JUMP JUMPDEST SWAP2 PUSH2 0x1C09 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH2 0x1C49 DUP5 DUP3 PUSH2 0x1C43 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C3B PUSH2 0x3D4B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x350B JUMP JUMPDEST SWAP5 PUSH2 0x395B JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C51 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CBE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D50 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DC7 JUMPI JUMPDEST DUP2 PUSH2 0x1D69 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CD4 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D5C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1E06 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E33 PUSH2 0x3D4B JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x203F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x200D JUMPI DUP3 PUSH2 0x1E88 SWAP2 DUP6 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x1F36 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FAA JUMPI JUMPDEST PUSH2 0x1F5F JUMPI DUP1 PUSH2 0x1E8E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F55 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x207B CALLDATASIZE PUSH2 0x3275 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20BE PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2213 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20E6 JUMPI STOP JUMPDEST PUSH2 0x20F1 DUP2 DUP4 DUP9 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2124 PUSH2 0xFE9 DUP7 DUP12 DUP15 PUSH2 0x3B10 JUMP JUMPDEST DUP3 PUSH2 0x218E PUSH2 0x21BA PUSH2 0x2136 DUP10 DUP14 DUP14 PUSH2 0x3B10 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x339E JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x220A JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21DD JUMPI POP PUSH1 0x1 ADD PUSH2 0x20DD JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21D0 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2254 PUSH2 0x311D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3AB5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23D3 PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2451 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x24BF PUSH2 0x24BA PUSH2 0x311D JUMP JUMPDEST PUSH2 0x3472 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2548 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24EF CALLDATASIZE PUSH2 0x3206 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x251F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3426 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2598 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25A2 DUP2 DUP4 PUSH2 0x3A72 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x265F JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2632 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2557 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x269B CALLDATASIZE PUSH2 0x3163 JUMP JUMPDEST PUSH2 0x26A3 PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x274D JUMPI JUMPDEST POP POP PUSH2 0x2729 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2731 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2744 PUSH1 0x20 DUP7 PUSH2 0x339E JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x403C JUMP JUMPDEST PUSH2 0x2756 SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26FA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2797 PUSH2 0x311D JUMP JUMPDEST PUSH2 0x27C3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x395B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x40 PUSH2 0x2826 PUSH2 0x3EF6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x28AA PUSH2 0x3140 JUMP JUMPDEST PUSH2 0x28B2 PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2965 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2B56 JUMPI JUMPDEST ISZERO PUSH2 0x2B20 JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2B43 JUMPI PUSH2 0x2B3D SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3857 JUMP JUMPDEST DIV PUSH2 0x2AF0 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2B51 SWAP3 DIV PUSH2 0x3857 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2AE3 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2B6F CALLDATASIZE PUSH2 0x3163 JUMP JUMPDEST SWAP2 PUSH2 0x2B78 PUSH2 0x3D4B JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2BF6 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x2BFF SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2BCE JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C94 PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2D3C PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2F69 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2D8C PUSH2 0x3D4B JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2F3B JUMPI DUP5 DUP7 EQ PUSH2 0x2F0D JUMPI PUSH2 0x2DCC DUP2 DUP7 DUP7 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x2EC1 JUMPI POP ISZERO PUSH2 0x2E30 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2E1C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2DF3 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2EAD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2DF5 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2E51 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2F93 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3C60 JUMP JUMPDEST DUP4 PUSH2 0x2D62 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35F1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3B59 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x24BF PUSH1 0x20 SWAP2 PUSH2 0x3542 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x30CA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x30BA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3116 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x30B7 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x32BE SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x32E1 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x337B SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x33DF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33DF JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3432 DUP2 PUSH2 0x340E JUMP JUMPDEST SWAP4 PUSH2 0x3440 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x339E JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3462 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3456 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x34CA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33DF JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3517 DUP3 PUSH2 0x34D1 JUMP JUMPDEST SWAP2 PUSH2 0x3525 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x339E JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35EB JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35E5 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x34CA JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2F3B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3825 JUMPI DUP3 PUSH2 0x36D4 SWAP2 DUP6 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x376A JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x371B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x36F3 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x37DF JUMPI JUMPDEST PUSH2 0x3793 JUMPI DUP1 PUSH2 0x36DA JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3789 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x386A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x38F3 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x3A44 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3A16 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3A86 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3AE3 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3A86 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3C56 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3C29 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3BE9 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3BA2 JUMPI JUMPDEST POP PUSH2 0x3BA0 SWAP3 POP SUB DUP4 PUSH2 0x339E JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3BCD JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3BA0 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3B93 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3BB4 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3BA0 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3B93 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3B73 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3D41 JUMPI JUMPDEST PUSH2 0x3C89 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D22 JUMPI JUMPDEST POP ISZERO PUSH2 0x3CF5 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3D3B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x3CEC JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3C81 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3E67 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3E6C JUMPI JUMPDEST PUSH2 0x3E67 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3DD6 JUMPI JUMPDEST POP PUSH2 0x3DD3 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E48 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DC9 JUMP JUMPDEST PUSH2 0x3E61 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x3E41 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3D92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3EA1 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3E9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x402A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4032 JUMPI JUMPDEST PUSH2 0x402A JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3F89 JUMPI JUMPDEST POP PUSH2 0x3F58 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x400B JUMPI JUMPDEST POP CODESIZE PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x4024 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x4004 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3F3D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x40AE DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4112 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4185 JUMPI JUMPDEST DUP2 PUSH2 0x412B PUSH1 0x20 SWAP4 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x40C4 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x411E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF XOR 0xE 0xD6 SWAP11 DUP15 DUPN 0x3F PUSH12 0x8ACF1837C6462B80CD489B2B PUSH29 0xF39A0040F0A21C1A7ECF64736F6C634300081E00337EA68FD2DCF1C056 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A47EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A50000 ","sourceMap":"495:501:153:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;1749:10:330;1645:152:42;;-1:-1:-1;495:501:153;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;495:501:153;;;-1:-1:-1;;;;;;495:501:153;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;495:501:153;;;-1:-1:-1;;;;;495:501:153;;;;-1:-1:-1;;;;;;;;;;;495:501:153;;990:1:42;495:501:153;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;990:1:42;495:501:153;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;495:501:153;;;;-1:-1:-1;;;;;495:501:153;;;;-1:-1:-1;;;;;;;;;;;495:501:153;990:1:42;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;990:1:42;495:501:153;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;495:501:153;;1289:23:341;495:501:153;;-1:-1:-1;;;;;;495:501:153;;;;;;;-1:-1:-1;;;;500:10:59;;;495:501:153;500:10:59;;;;495:501:153;500:10:59;;;;;-1:-1:-1;;500:10:59;;;495:501:153;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;495:501:153;745:39:76;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;495:501:153;;-1:-1:-1;495:501:153;;-1:-1:-1;495:501:153;;;;;;;;990:1:42;495:501:153;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;495:501:153;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;495:501:153;;990:1:42;495:501:153;;;;;;-1:-1:-1;495:501:153;;;;;;;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;;;;;;;;;;;;495:501:153;;;;;;;-1:-1:-1;;;495:501:153;;;;;;;;;;;;990:1:42;495:501:153;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;495:501:153;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;495:501:153;;;-1:-1:-1;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;-1:-1:-1;990:1:42;495:501:153;;;;;;-1:-1:-1;495:501:153;;;;;;;;;;;1645:152:42;495:501:153;;;-1:-1:-1;;;;;;495:501:153;1749:10:330;495:501:153;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;495:501:153;-1:-1:-1;495:501:153;;;;;;;;;-1:-1:-1;;495:501:153;;;-1:-1:-1;;;;;495:501:153;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;495:501:153;;;;;;;;-1:-1:-1;;495:501:153;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;;;;-1:-1:-1;495:501:153;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12608,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":12643,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":12806,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12917,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13106,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12757,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13350,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13579,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15169,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":13060,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12573,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":12506,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13326,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13521,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":15120,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14423,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":15193,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":12471,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":13214,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":16444,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":15456,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14489,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":13809,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":15990,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13426,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintOnce":{"entryPoint":14683,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":16118,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":15691,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":15029,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":13634,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":13920,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14962,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":15136,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10823},{"length":32,"start":13449},{"length":32,"start":15714},{"length":32,"start":16141}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461305157806306fdde0314612ff6578063081812fc14612f99578063095ea7b314612d05578063114ba8ee14612c0657806323b872dd14612b5e5780632a55205a14612a6b5780632b4c9f16146129fc5780632f2ff15d1461287057806331e66e1e146127ed57806340c10f191461275d57806342842e0e1461268d5780634684d7e9146124c9578063572b6c051461247e57806361ba27da146123625780636352211e146122e757806370a082311461221d57806373c8a9581461206d57806379cc679014611dcf5780638832e6e314611b815780638bb9c5bf14611a125780638da5cb5b146119a15780638dc251e31461187457806391d14854146117dc57806395d89b411461176d5780639da5e832146114ec578063a0c76f621461147b578063a22cb4651461131b578063b0ccc31e146112aa578063b88d4fde14611188578063c3666c3614610f4b578063c77c695514610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613332565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e613d4b565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387613b10565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587613b10565b359081471061030e57600080809381935af13d15610306573d906102a6826134d1565b916102b4604051938461339e565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d361311d565b6103db613140565b9060443567ffffffffffffffff8111610340576103fc9036906004016131d5565b92610405613d4b565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa8382849694613e76565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986613b10565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b91613c60565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761075961311d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610783613d4b565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613206565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f613d4b565b9261085b848483613e76565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886613b10565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a7261311d565b73ffffffffffffffffffffffffffffffffffffffff610a8f613140565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b65613140565b610b6d613d4b565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ab5565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e28908201856130da565b0390f35b3d8083833e610e3b818361339e565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e72846134d1565b92610e80604051948561339e565b84845260208584010111610ea95750610e2892610ea391602080850191016130b7565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034057610f5936613275565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f9e613d4b565b925416911690810361036f575080821480159061117e575b6103455760005b828110610fc657005b73ffffffffffffffffffffffffffffffffffffffff610fee610fe983858a613b10565b613b20565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb457600091611150575b5015611123575073ffffffffffffffffffffffffffffffffffffffff61107d610fe983858a613b10565b169061108d610fe9828689613b10565b9161109982878b613b10565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611112575b5001610fbd565b600061111d9161339e565b8861110b565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611171915060203d8111611177575b611169818361339e565b810190613b41565b89611053565b503d61115f565b5082821415610fb6565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111bf61311d565b6111c7613140565b60443560643567ffffffffffffffff8111610340576111ea903690600401613304565b9290936111f5613d4b565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361129a575b505061127b848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b823b61128357005b6112989561129291369161350b565b9361403c565b005b6112a391613c60565b868561124c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761135261311d565b60243590811515918281036103405761144c575b73ffffffffffffffffffffffffffffffffffffffff80611384613d4b565b1691169181831461141e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611476817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613c60565b611366565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610340576114fa36613332565b91929161152f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b90613899565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361155a8161340e565b93611568604051958661339e565b818552602085019160051b81019036821161034057915b8183106117405750505090611595913691613426565b9181519280518403610345577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115d057005b73ffffffffffffffffffffffffffffffffffffffff6115ef8284613a72565b51168015611716576116018285613a72565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116e8577fdead000000000000000000000000000000000000000000000000000000000000146116ba5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115c7565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff811681036103405781526020928301920161157f565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613b59565b6040519182916020835260208301906130da565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611813613140565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118ab61311d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118ea613d4b565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119775773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a6d613d4b565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b395760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611bb861311d565b6024359060443567ffffffffffffffff811161034057611bdc903690600401613304565b91611c097fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b611c498482611c437fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c3b613d4b565b97369161350b565b9461395b565b803b611c5157005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cbe60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906130da565b03816000865af1908115610eb457600091611d50575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2057005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dc7575b81611d696020938361339e565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611cd4565b5080fd5b3d9150611d5c565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611e0661311d565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e33613d4b565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561203f5773ffffffffffffffffffffffffffffffffffffffff811680950361200d5782611e889185613e76565b15611f36575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611faa575b611f5f5780611e8e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f55565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761207b36613275565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120be613d4b565b925416911690810361036f5750808414801590612213575b6103455760005b8481106120e657005b6120f1818388613b10565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091612124610fe9868b8e613b10565b8261218e6121ba612136898d8d613b10565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261339e565b51925af115610eb4576000513d61220a5750803b155b6121dd57506001016120dd565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121d0565b50828414156120d6565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761225461311d565b73ffffffffffffffffffffffffffffffffffffffff8116156122bd5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ab5565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123d3613d4b565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206124bf6124ba61311d565b613472565b6040519015158152f35b346103405761254873ffffffffffffffffffffffffffffffffffffffff6124ef36613206565b9291939061251f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613426565b92169081156117165782519260005b848110612598575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125a28183613a72565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661265f577fdead0000000000000000000000000000000000000000000000000000000000001461263257908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612557565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761269b36613163565b6126a3613d4b565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361274d575b5050612729828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b803b61273157005b611298936040519361274460208661339e565b6000855261403c565b61275691613c60565b84836126fa565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761129861279761311d565b6127c37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611529613d4b565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061395b565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576040612826613ef6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004356128aa613140565b6128b2613d4b565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561296557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612b56575b15612b20575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a0821015612b4357612b3d90620186a092613857565b04612af0565b620186a0612b519204613857565b612af0565b508115612ae3565b3461034057611298612b6f36613163565b91612b78613d4b565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612bf6575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613660565b612bff91613c60565b8581612bce565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c94613d4b565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612d3c61311d565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612f69575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612d8c613d4b565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612f3b57848614612f0d57612dcc818686613e76565b15612ec1575015612e30577401000000000000000000000000000000000000000016612e1c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612df3565b90740100000000000000000000000000000000000000008217809203612ead575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612df5565b846000526020526040600020558380612e51565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612f93907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613c60565b83612d62565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135f1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613b59565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576124bf602091613542565b60005b8381106130ca5750506000910152565b81810151838201526020016130ba565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613116815180928187528780880191016130b7565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff821161034057613271916004016131d5565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff811161034057816132be916004016131d5565b9290929160243567ffffffffffffffff811161034057816132e1916004016131d5565b929092916044359067ffffffffffffffff821161034057613271916004016131d5565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff8111610340578161337b916004016131d5565b929092916024359067ffffffffffffffff821161034057613271916004016131d5565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176133df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116133df5760051b60200190565b9291906134328161340e565b93613440604051958661339e565b602085838152019160051b810192831161034057905b82821061346257505050565b8135815260209182019101613456565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156134ca5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116133df57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613517826134d1565b91613525604051938461339e565b829481845281830111610340578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135eb577f01ffc9a70000000000000000000000000000000000000000000000000000000081146135e5576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba577401000000000000000000000000000000000000000016156134ca576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612f3b5773ffffffffffffffffffffffffffffffffffffffff811680950361382557826136d49185613e76565b1561376a575b505083600052806020528260406000205582820361371b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386136f3565b74010000000000000000000000000000000000000000161580156137df575b61379357806136da565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613789565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561386a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156138f35750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561171657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116613a44577fdead00000000000000000000000000000000000000000000000000000000000014613a1657600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613a865760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613ae3575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613a865760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b906040519160008154918260011c92600181168015613c56575b602085108114613c2957848752869392918115613be95750600114613ba2575b50613ba09250038361339e565b565b90506000929192526020600020906000915b818310613bcd575050906020613ba09282010138613b93565b6020919350806001915483858901015201910190918492613bb4565b60209350613ba09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613b93565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613b73565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613d41575b613c89575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091613d22575b5015613cf55750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613d3b915060203d60201161117757611169818361339e565b38613cec565b50813b1515613c81565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613e67573233148015613e6c575b613e67577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613dd6575b50613dd357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610eb457600091613e48575b5038613dc9565b613e61915060203d60201161117757611169818361339e565b38613e41565b503390565b5060183610613d92565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613ea1575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613e9b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561402a573233148015614032575b61402a57803314908115613f89575b50613f58576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103405760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161400b575b5038613f4c565b614024915060203d60201161117757611169818361339e565b38614004565b506000903690565b5060183610613f3d565b73ffffffffffffffffffffffffffffffffffffffff906140ae826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906130da565b03816000865af1908115610eb457600091614112575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d20575050565b6020813d602011614185575b8161412b6020938361339e565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff000000000000000000000000000000000000000000000000000000006140c4565b3d915061411e56fea2646970667358221220bf180ed69a8ee63f6b8acf1837c6462b80cd489b2b7cf39a0040f0a21c1a7ecf64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3051 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2FF6 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2F99 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2D05 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2C06 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2B5E JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2A6B JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x29FC JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2870 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x27ED JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x275D JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x268D JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24C9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x247E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2362 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x221D JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x206D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DCF JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B81 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A12 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19A1 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1874 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17DC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x176D JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14EC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x147B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x131B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12AA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1188 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF4B JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3332 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x34D1 JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x339E JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x311D JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x3140 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3E76 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x311D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3206 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x3D4B JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x3E76 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x311D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x3140 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x3140 JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3AB5 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x30DA JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x34D1 JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x339E JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x30B7 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xF59 CALLDATASIZE PUSH2 0x3275 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF9E PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x117E JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFC6 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFEE PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x3B10 JUMP JUMPDEST PUSH2 0x3B20 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1150 JUMPI JUMPDEST POP ISZERO PUSH2 0x1123 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x107D PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x3B10 JUMP JUMPDEST AND SWAP1 PUSH2 0x108D PUSH2 0xFE9 DUP3 DUP7 DUP10 PUSH2 0x3B10 JUMP JUMPDEST SWAP2 PUSH2 0x1099 DUP3 DUP8 DUP12 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1112 JUMPI JUMPDEST POP ADD PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111D SWAP2 PUSH2 0x339E JUMP JUMPDEST DUP9 PUSH2 0x110B JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1171 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1177 JUMPI JUMPDEST PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B41 JUMP JUMPDEST DUP10 PUSH2 0x1053 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x115F JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFB6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x11BF PUSH2 0x311D JUMP JUMPDEST PUSH2 0x11C7 PUSH2 0x3140 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x11EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3304 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11F5 PUSH2 0x3D4B JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x129A JUMPI JUMPDEST POP POP PUSH2 0x127B DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1283 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP6 PUSH2 0x1292 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x350B JUMP JUMPDEST SWAP4 PUSH2 0x403C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12A3 SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x124C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1352 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x144C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1384 PUSH2 0x3D4B JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x141E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1476 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3C60 JUMP JUMPDEST PUSH2 0x1366 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x14FA CALLDATASIZE PUSH2 0x3332 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x152F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST SWAP1 PUSH2 0x3899 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x155A DUP2 PUSH2 0x340E JUMP JUMPDEST SWAP4 PUSH2 0x1568 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x339E JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1740 JUMPI POP POP POP SWAP1 PUSH2 0x1595 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3426 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x345 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15D0 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EF DUP3 DUP5 PUSH2 0x3A72 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1716 JUMPI PUSH2 0x1601 DUP3 DUP6 PUSH2 0x3A72 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16E8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16BA JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15C7 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x157F JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3B59 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1813 PUSH2 0x3140 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x18AB PUSH2 0x311D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18EA PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1977 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A6D PUSH2 0x3D4B JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B39 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1BB8 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x1BDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3304 JUMP JUMPDEST SWAP2 PUSH2 0x1C09 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH2 0x1C49 DUP5 DUP3 PUSH2 0x1C43 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C3B PUSH2 0x3D4B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x350B JUMP JUMPDEST SWAP5 PUSH2 0x395B JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C51 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CBE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D50 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DC7 JUMPI JUMPDEST DUP2 PUSH2 0x1D69 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CD4 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D5C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1E06 PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E33 PUSH2 0x3D4B JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x203F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x200D JUMPI DUP3 PUSH2 0x1E88 SWAP2 DUP6 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x1F36 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FAA JUMPI JUMPDEST PUSH2 0x1F5F JUMPI DUP1 PUSH2 0x1E8E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F55 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x207B CALLDATASIZE PUSH2 0x3275 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20BE PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2213 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20E6 JUMPI STOP JUMPDEST PUSH2 0x20F1 DUP2 DUP4 DUP9 PUSH2 0x3B10 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2124 PUSH2 0xFE9 DUP7 DUP12 DUP15 PUSH2 0x3B10 JUMP JUMPDEST DUP3 PUSH2 0x218E PUSH2 0x21BA PUSH2 0x2136 DUP10 DUP14 DUP14 PUSH2 0x3B10 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x339E JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x220A JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21DD JUMPI POP PUSH1 0x1 ADD PUSH2 0x20DD JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21D0 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2254 PUSH2 0x311D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3AB5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23D3 PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2451 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x24BF PUSH2 0x24BA PUSH2 0x311D JUMP JUMPDEST PUSH2 0x3472 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2548 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24EF CALLDATASIZE PUSH2 0x3206 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x251F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3426 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2598 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25A2 DUP2 DUP4 PUSH2 0x3A72 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x265F JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2632 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2557 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x269B CALLDATASIZE PUSH2 0x3163 JUMP JUMPDEST PUSH2 0x26A3 PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x274D JUMPI JUMPDEST POP POP PUSH2 0x2729 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2731 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2744 PUSH1 0x20 DUP7 PUSH2 0x339E JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x403C JUMP JUMPDEST PUSH2 0x2756 SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26FA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2797 PUSH2 0x311D JUMP JUMPDEST PUSH2 0x27C3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x3D4B JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x395B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x40 PUSH2 0x2826 PUSH2 0x3EF6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x28AA PUSH2 0x3140 JUMP JUMPDEST PUSH2 0x28B2 PUSH2 0x3D4B JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2965 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2B56 JUMPI JUMPDEST ISZERO PUSH2 0x2B20 JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2B43 JUMPI PUSH2 0x2B3D SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3857 JUMP JUMPDEST DIV PUSH2 0x2AF0 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2B51 SWAP3 DIV PUSH2 0x3857 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2AE3 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2B6F CALLDATASIZE PUSH2 0x3163 JUMP JUMPDEST SWAP2 PUSH2 0x2B78 PUSH2 0x3D4B JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2BF6 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x2BFF SWAP2 PUSH2 0x3C60 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2BCE JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C94 PUSH2 0x3D4B JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2D3C PUSH2 0x311D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2F69 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2D8C PUSH2 0x3D4B JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2F3B JUMPI DUP5 DUP7 EQ PUSH2 0x2F0D JUMPI PUSH2 0x2DCC DUP2 DUP7 DUP7 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x2EC1 JUMPI POP ISZERO PUSH2 0x2E30 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2E1C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2DF3 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2EAD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2DF5 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2E51 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2F93 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3C60 JUMP JUMPDEST DUP4 PUSH2 0x2D62 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35F1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3B59 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x24BF PUSH1 0x20 SWAP2 PUSH2 0x3542 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x30CA JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x30BA JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3116 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x30B7 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x32BE SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x32E1 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x337B SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3271 SWAP2 PUSH1 0x4 ADD PUSH2 0x31D5 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x33DF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33DF JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3432 DUP2 PUSH2 0x340E JUMP JUMPDEST SWAP4 PUSH2 0x3440 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x339E JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3462 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3456 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x34CA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33DF JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3517 DUP3 PUSH2 0x34D1 JUMP JUMPDEST SWAP2 PUSH2 0x3525 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x339E JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35EB JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35E5 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x34CA JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2F3B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3825 JUMPI DUP3 PUSH2 0x36D4 SWAP2 DUP6 PUSH2 0x3E76 JUMP JUMPDEST ISZERO PUSH2 0x376A JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x371B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x36F3 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x37DF JUMPI JUMPDEST PUSH2 0x3793 JUMPI DUP1 PUSH2 0x36DA JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3789 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x386A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x38F3 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x3A44 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3A16 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3A86 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3AE3 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3A86 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3C56 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3C29 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3BE9 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3BA2 JUMPI JUMPDEST POP PUSH2 0x3BA0 SWAP3 POP SUB DUP4 PUSH2 0x339E JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3BCD JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3BA0 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3B93 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3BB4 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3BA0 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3B93 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3B73 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3D41 JUMPI JUMPDEST PUSH2 0x3C89 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D22 JUMPI JUMPDEST POP ISZERO PUSH2 0x3CF5 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3D3B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x3CEC JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3C81 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3E67 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3E6C JUMPI JUMPDEST PUSH2 0x3E67 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3DD6 JUMPI JUMPDEST POP PUSH2 0x3DD3 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E48 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DC9 JUMP JUMPDEST PUSH2 0x3E61 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x3E41 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3D92 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3EA1 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3E9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x402A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4032 JUMPI JUMPDEST PUSH2 0x402A JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3F89 JUMPI JUMPDEST POP PUSH2 0x3F58 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x400B JUMPI JUMPDEST POP CODESIZE PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x4024 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x339E JUMP JUMPDEST CODESIZE PUSH2 0x4004 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3F3D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x40AE DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x30DA JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4112 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4185 JUMPI JUMPDEST DUP2 PUSH2 0x412B PUSH1 0x20 SWAP4 DUP4 PUSH2 0x339E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x40C4 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x411E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF XOR 0xE 0xD6 SWAP11 DUP15 DUPN 0x3F PUSH12 0x8ACF1837C6462B80CD489B2B PUSH29 0xF39A0040F0A21C1A7ECF64736F6C634300081E00330000000000000000 ","sourceMap":"495:501:153:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;495:501:153;;2117:41:330;;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;495:501:153;1845:10:192;;;;;;495:501:153;1857:3:192;1876:11;;;;;:::i;:::-;495:501:153;;;;;;;;;1898:10:192;;;;;:::i;:::-;495:501:153;1375:21:9;;;:30;1371:125;;495:501:153;1548:33:9;;;;;;;495:501:153;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;495:501:153;;1834:9:192;;1591:58:9;495:501:153;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;495:501:153;5957:19:9;495:501:153;;5957:19:9;495:501:153;;;;;1371:125:9;1455:21;;1428:57;495:501:153;1428:57:9;495:501:153;;;;;;1428:57:9;495:501:153;;;;1756:63:192;1793:26;495:501:153;1793:26:192;495:501:153;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;495:501:153;;-1:-1:-1;4538:25:42;495:501:153;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2117:41:330;;;:::i;:::-;3179:19:352;495:501:153;;;;;;;;2616:14:352;2612:76;;495:501:153;29158:19:327;;495:501:153;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;495:501:153;;12884:11:327;;495:501:153;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;495:501:153;13173:304:327;-1:-1:-1;495:501:153;;;13323:10:327;495:501:153;;;;;;;;;;;2220:8:327;;495:501:153;;;;;;;;;2220:8:327;;495:501:153;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;495:501:153;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;495:501:153;;;;;;;;;;;;;;2220:8:327;13125:27;;;495:501:153;13125:27:327;;495:501:153;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;495:501:153;12987:51:327;;495:501:153;12987:51:327;495:501:153;;;;;;;;;12987:51:327;12919:59;495:501:153;;;;12958:11:327;495:501:153;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;495:501:153;12832:34:327;495:501:153;;;;;;12832:34:327;12715:64;12748:31;;495:501:153;12748:31:327;495:501:153;;;;12748:31:327;12409:58;12438:29;495:501:153;12438:29:327;495:501:153;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;495:501:153;;;;;;;;;;;;;:::i;:::-;;2117:41:330;;;:::i;:::-;495:501:153;;;;;;;;3205:23:42;;;3201:60;;495:501:153;;;3275:25:42;;;;3271:146;;495:501:153;3271:146:42;2220:8:327;;;;;;;;3361:45:42;495:501:153;3361:45:42;;495:501:153;;;;;;;;:::i;:::-;29158:19:327;495:501:153;2117:41:330;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;495:501:153;;25879:11:327;;495:501:153;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;495:501:153;26179:110:327;-1:-1:-1;495:501:153;26238:10:327;495:501:153;;;-1:-1:-1;495:501:153;;;;;2220:8:327;;495:501:153;;;25601:3:327;25638:11;;;;;:::i;:::-;495:501:153;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;495:501:153;;;;;;;;;;2414:66:327;495:501:153;;;2220:8:327;495:501:153;26123:35:327;;;;;495:501:153;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;495:501:153;25982:51:327;;495:501:153;25982:51:327;495:501:153;;;;;;;;;25982:51:327;25914:59;495:501:153;;;;25953:11:327;495:501:153;;;;;;;;;;;25943:30:327;;25914:59;;495:501:153;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;495:501:153;-1:-1:-1;495:501:153;28718:11:327;495:501:153;;;;-1:-1:-1;495:501:153;28718:28:327;495:501:153;-1:-1:-1;495:501:153;;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;495:501:153;;;;;;;;;;;;;;;;;;;;;;713:6:351;495:501:153;;;;;;;;;;;;;;;;;;:::i;:::-;2117:41:330;;:::i;:::-;5148:19:42;495:501:153;;;;;;;4503:26:42;;;4499:64;;4464:19:41;495:501:153;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;1880:140:41;;495:501:153;1880:140:41;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;495:501:153;;;;1973:36:41;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;495:501:153;;;1453:39:302;1863:70:327;495:501:153;1453:39:302;:::i;:::-;;495:501:153;3364:23:341;495:501:153;;;;3364:64:341;;;;;495:501:153;3364:64:341;;1603:4:302;495:501:153;3364:64:341;;495:501:153;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;495:501:153;3364:64:341;;;495:501:153;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;495:501:153;;;;;;;;;;;3364:64:341;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;495:501:153;;;;30830:32:327;495:501:153;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;495:501:153;;;2117:41:330;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;495:501:153;3852:94:192;;495:501:153;3972:10:192;;;;;;495:501:153;3984:3:192;495:501:153;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;495:501:153;;;;4058:76:192;;4108:25;495:501:153;4058:76:192;;495:501:153;4058:76:192;;;;;;;;;;;;495:501:153;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;495:501:153;4239:12:192;;;;;;:::i;:::-;495:501:153;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;495:501:153;4239:70:192;;;;;;;495:501:153;;;;;;;4239:70:192;;;;;495:501:153;4239:70:192;;4277:4;495:501:153;4239:70:192;;495:501:153;;4058:76:192;495:501:153;;;;;;;4239:70:192;;;;;;;495:501:153;4239:70:192;;;3984:3;;495:501:153;3961:9:192;;4239:70;495:501:153;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;495:501:153;4161:50:192;495:501:153;;4058:76:192;495:501:153;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;495:501:153;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2117:41:330;;;;;:::i;:::-;3179:19:352;495:501:153;;;;;;;;2616:14:352;2612:76;;495:501:153;29158:19:327;;11217:7;1863:70;;;;495:501:153;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;495:501:153;11235:101:327;11271:54;495:501:153;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;495:501:153;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;495:501:153;;2117:41:330;;;:::i;:::-;495:501:153;;;6339:18:327;;;;6335:63;;495:501:153;6463:42:327;6408:19;495:501:153;-1:-1:-1;495:501:153;6408:11:327;495:501:153;;;-1:-1:-1;495:501:153;;-1:-1:-1;495:501:153;;;;-1:-1:-1;495:501:153;;;;;;;;;;;;;;;;6463:42:327;495:501:153;6335:63:327;6366:32;;495:501:153;6366:32:327;495:501:153;;;;6366:32:327;1500:115:305;2931:8:352;668:81;495:501:153;2931:8:352;:::i;:::-;1500:115:305;;495:501:153;;;;;;;;;;;;;2991:23:341;495:501:153;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1471:12:301;495:501:153;2117:41:330;;:::i;:::-;1471:12:301;;:::i;:::-;495:501:153;1072:8:301;;;;:::i;:::-;495:501:153;;;;;;;:::i;:::-;1072:8:301;;;;;;;;;;;495:501:153;;1072:8:301;;;;;;;;;;;495:501:153;;;;;;;;;:::i;:::-;;;;;;;22754:25:327;;22750:64;;23302:10;;22829:9;495:501:153;22840:10:327;;;;;;495:501:153;22852:3:327;495:501:153;22884:13:327;;;;:::i;:::-;495:501:153;;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;495:501:153;;;;;;1072:8:301;495:501:153;;;;;;;;23070:60:327;;2414:66;30830:32;23144:59;;495:501:153;;;;;;;;1072:8:301;495:501:153;;;;;2220:8:327;495:501:153;-1:-1:-1;495:501:153;;;;;;;;;;;;;2220:8:327;;495:501:153;23350:33:327;;;;495:501:153;22829:9:327;;23144:59;23178:25;;495:501:153;23178:25:327;495:501:153;;;;23178:25:327;23070:60;23102:28;;495:501:153;23102:28:327;495:501:153;;;;23102:28:327;22911:54;22940:25;495:501:153;22940:25:327;495:501:153;;22940:25:327;1072:8:301;495:501:153;;;;;;;;;1072:8:301;;;;;;;;;;495:501:153;;;;;;;;;;;;;2688:13:341;495:501:153;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;495:501:153;-1:-1:-1;495:501:153;;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;495:501:153;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2117:41:330;;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;2976:19:351;495:501:153;;;;;1732:22:351;1728:93;;495:501:153;;2220:8:327;;;;;;;495:501:153;;;1728:93:351;1777:33;495:501:153;1777:33:351;495:501:153;;1777:33:351;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2117:41:330;;:::i;:::-;495:501:153;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;3741:25:41;3737:66;;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;495:501:153;;;;2455:33:41;495:501:153;3737:66:41;495:501:153;3775:28:41;;;495:501:153;3775:28:41;495:501:153;;;;;;;3775:28:41;495:501:153;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1766:12:304;495:501:153;2117:41:330;;:::i;1766:12:304:-;20205:7:327;1863:70;;495:501:153;;2117:41:330;;;:::i;:::-;495:501:153;;;;:::i;:::-;20205:7:327;;:::i;:::-;376:58:354;;20223:107:327;;495:501:153;20223:107:327;495:501:153;;;;;;;;;29832:65:327;;;;;495:501:153;29832:65:327;;495:501:153;;29832:65:327;;495:501:153;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;495:501:153;29832:65:327;;;;;;;;495:501:153;29832:65:327;;;20223:107;495:501:153;;;;;29832:84:327;29828:136;;495:501:153;29828:136:327;29925:39;495:501:153;29925:39:327;495:501:153;;;;;;29925:39:327;29832:65;495:501:153;29832:65:327;;495:501:153;29832:65:327;;;;;;495:501:153;29832:65:327;;;:::i;:::-;;;495:501:153;;;;;;;;;;;;;29832:65:327;495:501:153;29832:65:327;;495:501:153;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;495:501:153;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;495:501:153;2117:41:330;;:::i;:::-;495:501:153;;;;;;;;;;;;;30700:19:327;;;24121:64;;495:501:153;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;495:501:153;;;;;;;;;;2414:66:327;495:501:153;;;2220:8:327;495:501:153;;;24633:10:327;495:501:153;;;;;;;;;2220:8:327;;24674:35;;;;495:501:153;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;495:501:153;24402:51:327;;;495:501:153;24402:51:327;495:501:153;;;;;;;;;24402:51:327;24334:59;495:501:153;;;;24373:11:327;495:501:153;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;495:501:153;24234:34:327;495:501:153;;;;;;24234:34:327;24121:64;24154:31;;495:501:153;24154:31:327;495:501:153;;;;24154:31:327;495:501:153;;;;;;;:::i;:::-;5148:19:42;;;;495:501:153;;;2117:41:330;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;495:501:153;2776:90:192;;495:501:153;2892:10:192;;;;;;495:501:153;2904:3:192;2923:9;;;;;:::i;:::-;495:501:153;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;495:501:153;;;1328:43:8;;;;;;495:501:153;;;;1328:43:8;;;495:501:153;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;495:501:153;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;495:501:153;;2881:9:192;;8938:146:8;9033:40;495:501:153;9033:40:8;495:501:153;;1328:43:8;495:501:153;9033:40:8;8942:68;495:501:153;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;495:501:153;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;495:501:153;;-1:-1:-1;495:501:153;26801:10:327;495:501:153;;;;-1:-1:-1;495:501:153;;;;;;;;26724:60:327;26756:28;495:501:153;26756:28:327;495:501:153;;26756:28:327;495:501:153;;;;;;;;;;;;3395:39:305;495:501:153;;;3395:39:305;:::i;:::-;495:501:153;;;;;;;;;;;;;;;;;;;;;;;2117:41:330;;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;2976:19:351;495:501:153;1281:36:351;713:6;1281:36;;1277:119;;495:501:153;;;;;;;;;;;;;;;1277:119:351;1340:45;495:501:153;1340:45:351;495:501:153;;;;1340:45:351;495:501:153;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;2233:12:304;495:501:153;2117:41:330;;:::i;2233:12:304:-;495:501:153;;;;;:::i;:::-;;;21151:16:327;;;21147:54;;495:501:153;;21259:9:327;495:501:153;21270:10:327;;;;;;21677:14;;;-1:-1:-1;495:501:153;21677:10:327;495:501:153;;;-1:-1:-1;495:501:153;;;;;2220:8:327;;495:501:153;;;21282:3:327;21319:11;;;;:::i;:::-;495:501:153;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;495:501:153;;;;;;;;;;;;;2220:8:327;21599:33;495:501:153;21599:33:327;;;;495:501:153;21259:9:327;;21465:59;21499:25;495:501:153;21499:25:327;495:501:153;;;;21499:25:327;21391:60;21423:28;;495:501:153;21423:28:327;495:501:153;;;;21423:28:327;495:501:153;;;;;;;:::i;:::-;2117:41:330;;:::i;:::-;3179:19:352;495:501:153;;;;;;;;2616:14:352;2612:76;;495:501:153;29158:19:327;;9668:7;1863:70;;;;495:501:153;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;495:501:153;9686:99:327;9722:52;495:501:153;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;495:501:153;;;;;;;;;;;1382:7:304;495:501:153;;:::i;:::-;1323:12:304;495:501:153;2117:41:330;;:::i;1323:12:304:-;495:501:153;;;;1382:7:304;:::i;495:501:153:-;;;;;;;;;;;;2352:39:330;;:::i;:::-;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2117:41:330;;:::i;:::-;5148:19:42;495:501:153;;;;;;;4503:26:42;;;4499:64;;4464:19:41;495:501:153;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;1254:25:41;1250:140;;495:501:153;1250:140:41;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;495:501:153;;;;1343:36:41;495:501:153;;;;;;;;;;;;;;;;941:19:75;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;495:501:153;2499:377:351;;;2559:17;;495:501:153;;2499:377:351;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;495:501:153;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;495:501:153;2499:377:351;;2607:259;713:6;2794:57;495:501:153;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;495:501:153;;;;2134:7:305;495:501:153;;;:::i;:::-;2117:41:330;;;:::i;:::-;495:501:153;;;;;;;;2616:14:352;2612:76;;495:501:153;29158:19:327;;495:501:153;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;495:501:153;;;;;;;;;;;;;;;;;;;;;;2117:41:330;;;:::i;:::-;495:501:153;;;;;4503:26:42;;;4499:64;;3179:19:352;495:501:153;;;;2220:8:327;;;;;;;495:501:153;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;495:501:153;29158:19:327;495:501:153;2117:41:330;;:::i;:::-;495:501:153;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;495:501:153;5670:35:327;;495:501:153;5157:173:327;495:501:153;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;495:501:153;;;;;5620:11:327;495:501:153;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;495:501:153;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;495:501:153;5052:59:327;;;495:501:153;5052:59:327;495:501:153;;;;;;;;;5052:59:327;4927:63;4958:32;;495:501:153;4958:32:327;495:501:153;;;;4958:32:327;4802:64;4835:31;;495:501:153;4835:31:327;495:501:153;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;495:501:153;2931:8:352;:::i;:::-;1064:117:305;;;495:501:153;;;;;;;;;;;;3579:43:305;495:501:153;;;3579:43:305;:::i;495:501:153:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;495:501:153;635:65:55;;:::i;495:501:153:-;;;;;;;;-1:-1:-1;;495:501:153;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;495:501:153;1146:19:75;495:501:153;1146:53:75;;;1142:96;;495:501:153;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;495:501:153;1215:12:75;:::o;495:501:153:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;495:501:153;;;;;;:::o;1359:340:59:-;495:501:153;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;495:501:153;500:10:59;495:501:153;500:10:59;;;;495:501:153;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;495:501:153;1528:12:59;:::o;27798:360:327:-;495:501:153;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;495:501:153;;;28073:11:327;495:501:153;;;;;;;;28066:27:327;:::o;7385:956::-;;;495:501:153;;7507:16:327;;;7503:58;;495:501:153;7521:1:327;495:501:153;;;;;7521:1:327;495:501:153;;;;;30700:19:327;;;7615:64;;495:501:153;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;495:501:153;;;7521:1:327;495:501:153;;;;;;7521:1:327;495:501:153;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;495:501:153;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;;;2220:8:327;;495:501:153;-1:-1:-1;495:501:153;;;;-1:-1:-1;495:501:153;8155:10:327;495:501:153;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;495:501:153;7896:51:327;;;7521:1;7896:51;495:501:153;7896:51:327;495:501:153;;;;;;7521:1:327;7896:51;7828:59;495:501:153;;7521:1:327;495:501:153;7867:11:327;;;495:501:153;;;;7521:1:327;495:501:153;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;495:501:153;;;;7521:1:327;7728:34;495:501:153;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;495:501:153;-1:-1:-1;495:501:153;;;;-1:-1:-1;495:501:153;;;;-1:-1:-1;495:501:153;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;495:501:153;3775:28:41;;-1:-1:-1;3775:28:41;495:501:153;3775:28:41;495:501:153;;;;;-1:-1:-1;3775:28:41;18606:565:327;;495:501:153;;18694:16:327;;;18690:54;;495:501:153;18708:1:327;495:501:153;;;;;18708:1:327;495:501:153;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;495:501:153;;18708:1:327;495:501:153;;;;;;18708:1:327;495:501:153;2220:8:327;495:501:153;-1:-1:-1;495:501:153;19091:10:327;495:501:153;;;-1:-1:-1;495:501:153;19091:10:327;495:501:153;;;2220:8:327;;18708:1;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;495:501:153;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;495:501:153;;18708:1:327;18830:28;495:501:153;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;495:501:153;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;495:501:153;;-1:-1:-1;27324:31:327;495:501:153;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;495:501:153;;;;;-1:-1:-1;495:501:153;;-1:-1:-1;495:501:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;495:501:153;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;495:501:153;;;3613:51:352;495:501:153;;3613:51:352;;;;495:501:153;3613:51:352;;3648:4;3613:51;;;495:501:153;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;495:501:153;;-1:-1:-1;3691:28:352;3613:51;;;;495:501:153;3613:51:352;495:501:153;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;495:501:153;1029:19:76;495:501:153;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;495:501:153;;;1676:74:76;;495:501:153;;;1676:74:76;;;495:501:153;1327:10:76;495:501:153;;;;1744:4:76;495:501:153;;;;;-1:-1:-1;1676:74:76;;495:501:153;;;;;;1676:74:76;;;;;;;495:501:153;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;495:501:153;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;495:501:153;;-1:-1:-1;495:501:153;30435:11:327;495:501:153;;;;-1:-1:-1;495:501:153;30435:27:327;495:501:153;-1:-1:-1;495:501:153;;;500:10:59;495:501:153;-1:-1:-1;495:501:153;500:10:59;;30413:49:327;;;;;1938:939:76;495:501:153;2065:19:76;495:501:153;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;495:501:153;720:8:80;495:501:153;720:8:80;;495:501:153;;;;2115:1:76;2802:32;;:::o;2624:153::-;495:501:153;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;495:501:153;2361:10:76;495:501:153;;;;2771:4:76;495:501:153;;;;;-1:-1:-1;2682:95:76;;495:501:153;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;495:501:153;29701:270:327;495:501:153;29701:270:327;495:501:153;29701:270:327;;;;;495:501:153;;;;;29832:65:327;;;;;495:501:153;29832:65:327;;495:501:153;29832:65:327;;;495:501:153;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;495:501:153;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;495:501:153;29832:65:327;;495:501:153;29832:65:327;;;;;;495:501:153;29832:65:327;;;:::i;:::-;;;495:501:153;;;;;;;;;;;;;29832:65:327;495:501:153;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3367000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"870","ROYALTY_FEE_DENOMINATOR()":"914","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","isApprovedForAll(address,address)":"3311","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2715","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","wasBurnt(uint256)":"3001"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"title\":\"ERC721FullBurnMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol\":\"ERC721FullMintOnceBurnMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/ERC721FullMintOnceBurnMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ERC721FullMintOnceBurn} from \\\"./../../../../token/ERC721/preset/ERC721FullMintOnceBurn.sol\\\";\\n\\n/// @title ERC721FullBurnMock\\ncontract ERC721FullMintOnceBurnMock is ERC721FullMintOnceBurn {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC721FullMintOnceBurn(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x552c2f52aeb694969e3327d9664981c8fb755217fb67a7169e9527093d11d50e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./base/ERC721BurnableBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Burnable is ERC721BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\\n    constructor() {\\n        ERC721Storage.initERC721Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xb63465341692ba51eeae4dd59c0c43809f4262b0dee67343981aaffbd49c0908\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721DeliverableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./base/ERC721DeliverableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721DeliverableOnce is ERC721DeliverableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x3c07d84a3a3605882b84afd3bdf130a9c3992ba00e42403981b8813d3d4587b6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721MintableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./base/ERC721MintableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721MintableOnce is ERC721MintableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x62f7a355cfbf9bfb04f2932abcd474379b37af62f0f9fd5a09e63393e70dddd3\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721MintableOnce} from \\\"./../ERC721MintableOnce.sol\\\";\\nimport {ERC721DeliverableOnce} from \\\"./../ERC721DeliverableOnce.sol\\\";\\nimport {ERC721Burnable} from \\\"./../ERC721Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullMintOnceBurn is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721MintableOnce,\\n    ERC721DeliverableOnce,\\n    ERC721Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x5dd7179ea00c9f4fe4780dba08d3c1c3babc0fda0909eaa85e6eceedf7a857d1\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"version":1}}},"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol":{"ERC721FullMock":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"ERC721FullMock","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1589,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1552,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a06040523461060b5761413a8038038061001981610610565b928339810160a08282031261060b5781516001600160401b03811161060b5781610044918401610635565b602083015190916001600160401b03821161060b57610064918401610635565b60408301519092906001600160a01b0381169081900361060b5760608201516001600160a01b038116929083900361060b5760800151926001600160a01b038416840361060b57336105ac575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b038211610482576000805160206140fa8339815191525490600182811c921680156105a2575b60208310146104625781601f849311610525575b50602090601f83116001146104a357600092610498575b50508160011b916000199060031b1c1916176000805160206140fa833981519152555b83516001600160401b0381116104825760008051602061411a83398151915254600181811c91168015610478575b602082101461046257601f81116103f0575b50602094601f821160011461036f57948192939495600092610364575b50508160011b916000199060031b1c19161760008051602061411a833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613a5990816106a1823960805181818161239d01528181612d74015281816135f801526137a30152f35b015190503880610274565b601f1982169560008051602061411a833981519152600052806000209160005b8881106103d8575083600195969798106103bf575b505050811b0160008051602061411a83398151915255610297565b015160001960f88460031b161c191690553880806103a4565b9192602060018192868501518155019401920161038f565b60008051602061411a8339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610458575b601f0160051c01905b81811061044c5750610257565b6000815560010161043f565b9091508190610436565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b6000805160206140fa83398151915260009081528281209350601f198516905b81811061050d57509084600195949392106104f4575b505050811b016000805160206140fa83398151915255610217565b015160001960f88460031b161c191690553880806104d9565b929360206001819287860151815501950193016104c3565b6000805160206140fa8339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c81019160208510610598575b90601f859493920160051c01905b81811061058957506101dd565b6000815584935060010161057c565b909150819061056e565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761048257604052565b81601f8201121561060b578051906001600160401b03821161048257610664601f8301601f1916602001610610565b928284526020838301011161060b5760005b82811061068b57505060206000918301015290565b8060208092840101518282870101520161067656fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146129a757806306fdde031461294c578063081812fc146128ef578063095ea7b31461265b578063114ba8ee1461255c57806323b872dd146124b45780632a55205a146123c15780632b4c9f16146123525780632f2ff15d146121c657806331e66e1e1461214357806340c10f19146120b357806342842e0e14611fe35780634684d7e914611e03578063572b6c0514611db857806361ba27da14611c9c5780636352211e14611c2157806370a0823114611b5757806373c8a958146119a75780638832e6e3146117595780638bb9c5bf146115ea5780638da5cb5b146115795780638dc251e31461144c57806391d14854146113b457806395d89b41146113455780639da5e8321461121b578063a0c76f62146111aa578063a22cb4651461104a578063b0ccc31e14610fd9578063b88d4fde14610eb7578063c3666c3614610c7a578063c87b56dd14610ac7578063d539139314610a6e578063d547741f146108e5578063e1a8bf2c146108a9578063e985e9c5146107f5578063f2fde38b14610701578063f3993d111461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc36612c1d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d6135e1565b925416911690810361034e57508181036103245760005b81811061022d57005b6102388183876133a6565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f576102628285876133a6565b35908147106102ed57600080809381935af13d156102e5573d9061028582612dbc565b916102936040519384612c89565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b2612a73565b6103ba612a96565b9060443567ffffffffffffffff811161031f576103db903690600401612b2b565b926103e46135e1565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106f1575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106c757610489838284969461370c565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061050c578787878181141580610503575b6104c157005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104bb565b6105178189866133a6565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106995788036106675784610590575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104a7565b7401000000000000000000000000000000000000000016158015610604575b6105b9578961054f565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105af565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106fa916134f6565b858261043b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610738612a73565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906107626135e1565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034e575073ffffffffffffffffffffffffffffffffffffffff16918282036107a657005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761082c612a73565b73ffffffffffffffffffffffffffffffffffffffff610849612a96565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020604051620186a08152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561091f612a96565b6109276135e1565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109d957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610bb96000600435610b28817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6e57600091610be6575b60405160208082528190610be290820185612a30565b0390f35b3d8083833e610bf58183612c89565b810190602081830312610c665780519067ffffffffffffffff8211610c6a570181601f82011215610c6657805192610c2c84612dbc565b92610c3a6040519485612c89565b84845260208584010111610c635750610be292610c5d9160208085019101612a0d565b90610bcc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031f57610c8836612b5c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ccd6135e1565b925416911690810361034e5750808214801590610ead575b6103245760005b828110610cf557005b73ffffffffffffffffffffffffffffffffffffffff610d1d610d1883858a6133a6565b6133b6565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6e57600091610e7f575b5015610e52575073ffffffffffffffffffffffffffffffffffffffff610dac610d1883858a6133a6565b1690610dbc610d188286896133a6565b91610dc882878b6133a6565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6e57600192610e41575b5001610cec565b6000610e4c91612c89565b88610e3a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea0915060203d8111610ea6575b610e988183612c89565b8101906133d7565b89610d82565b503d610e8e565b5082821415610ce5565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610eee612a73565b610ef6612a96565b60443560643567ffffffffffffffff811161031f57610f19903690600401612bef565b929093610f246135e1565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fc9575b5050610faa848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b823b610fb257005b610fc795610fc1913691612df6565b936138d2565b005b610fd2916134f6565b8685610f7b565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611081612a73565b602435908115159182810361031f5761117b575b73ffffffffffffffffffffffffffffffffffffffff806110b36135e1565b1691169181831461114d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111a5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134f6565b611095565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031f5761122936612c1d565b61125b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b90613184565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261128681612cf9565b946112946040519687612c89565b818652602086019160051b81019036821161031f57915b81831061131857505050906112c1913691612d11565b91805191835183036103245760005b8381106112d957005b8061131273ffffffffffffffffffffffffffffffffffffffff6112fe60019487613308565b511661130a8389613308565b519085613246565b016112d0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016112ab565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56133ef565b604051918291602083526020830190612a30565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576113eb612a96565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611483612a73565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114c26135e1565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561154f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356116456135e1565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a69565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611790612a73565b6024359060443567ffffffffffffffff811161031f576117b4903690600401612bef565b916117e17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b611821848261181b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0956118136135e1565b973691612df6565b94613246565b803b61182957005b73ffffffffffffffffffffffffffffffffffffffff80602092169361189660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612a30565b03816000865af1908115610c6e57600091611928575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161199f575b8161194160209383612c89565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff000000000000000000000000000000000000000000000000000000006118ac565b5080fd5b3d9150611934565b3461031f576119b536612b5c565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119f86135e1565b925416911690810361034e5750808414801590611b4d575b6103245760005b848110611a2057005b611a2b8183886133a6565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f576000602091611a5e610d18868b8e6133a6565b82611ac8611af4611a70898d8d6133a6565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612c89565b51925af115610c6e576000513d611b445750803b155b611b175750600101611a17565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b0a565b5082841415611a10565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611b8e612a73565b73ffffffffffffffffffffffffffffffffffffffff811615611bf75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d0d6135e1565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8b57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611df9611df4612a73565b612d5d565b6040519015158152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611e3a612a73565b60243567ffffffffffffffff811161031f5773ffffffffffffffffffffffffffffffffffffffff611e72611ec9923690600401612b2b565b9290611ea07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691612d11565b9216908115611fb95782519260005b848110611f19575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f238183613308565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8c57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ed8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57611ff136612ab9565b611ff96135e1565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120a3575b505061207f828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b803b61208757005b610fc7936040519361209a602086612c89565b600085526138d2565b6120ac916134f6565b8483612050565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610fc76120ed612a73565b6121197fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613246565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57604061217c61378c565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435612200612a96565b6122086135e1565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156122bb57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a69565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156124ac575b15612476575050610be260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610be291620186a08210156124995761249390620186a092613142565b04612446565b620186a06124a79204613142565b612446565b508115612439565b3461031f57610fc76124c536612ab9565b916124ce6135e1565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361254c575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b612555916134f6565b8581612524565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806125ea6135e1565b925416911690810361034e575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57612692612a73565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156128bf575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06126e26135e1565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612891578486146128635761272281868661370c565b15612817575015612786577401000000000000000000000000000000000000000016612772575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612749565b90740100000000000000000000000000000000000000008217809203612803575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561274b565b8460005260205260406000205583806127a7565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6128e9907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134f6565b836126b8565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612edc565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46133ef565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f57611df9602091612e2d565b60005b838110612a205750506000910152565b8181015183820152602001612a10565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612a6c81518092818752878088019101612a0d565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060243573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060443590565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612ba591600401612b2b565b9290929160243567ffffffffffffffff811161031f5781612bc891600401612b2b565b929092916044359067ffffffffffffffff821161031f57612beb91600401612b2b565b9091565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612c6691600401612b2b565b929092916024359067ffffffffffffffff821161031f57612beb91600401612b2b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cca57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612cca5760051b60200190565b929190612d1d81612cf9565b93612d2b6040519586612c89565b602085838152019160051b810192831161031f57905b828210612d4d57505050565b8135815260209182019101612d41565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612db55773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612cca57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612e0282612dbc565b91612e106040519384612c89565b82948184528183011161031f578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ed6577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612ed0576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561069957740100000000000000000000000000000000000000001615612db5576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106c757846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156128915773ffffffffffffffffffffffffffffffffffffffff81168095036131105782612fbf918561370c565b15613055575b5050836000528060205282604060002055828203613006575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538612fde565b74010000000000000000000000000000000000000000161580156130ca575b61307e5780612fc5565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613074565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561315557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156131de5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fb957826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166132da57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561331c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613379575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561331c5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9081602091031261031f5751801515810361031f5790565b906040519160008154918260011c926001811680156134ec575b6020851081146134bf5784875286939291811561347f5750600114613438575b5061343692500383612c89565b565b90506000929192526020600020906000915b8183106134635750509060206134369282010138613429565b602091935080600191548385890101520191019091849261344a565b602093506134369592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613429565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613409565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806135d7575b61351f575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c6e576000916135b8575b501561358b5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135d1915060203d602011610ea657610e988183612c89565b38613582565b50813b1515613517565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156136fd573233148015613702575b6136fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561366c575b5061366957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c6e576000916136de575b503861365f565b6136f7915060203d602011610ea657610e988183612c89565b386136d7565b503390565b5060183610613628565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613737575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613731565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156138c05732331480156138c8575b6138c05780331490811561381f575b506137ee576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161031f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c6e576000916138a1575b50386137e2565b6138ba915060203d602011610ea657610e988183612c89565b3861389a565b506000903690565b50601836106137d3565b73ffffffffffffffffffffffffffffffffffffffff90613944826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612a30565b03816000865af1908115610c6e576000916139a8575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f8575050565b6020813d602011613a1b575b816139c160209383612c89565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff0000000000000000000000000000000000000000000000000000000061395a565b3d91506139b456fea26469706673582212207b6255e482ea650ba7cba87c59caf7dc8e488f4cbcef137bb29f6b9d9ec3247064736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x60B JUMPI PUSH2 0x413A DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x610 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x60B JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x60B JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x635 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x60B JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x635 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x60B JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x60B JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x60B JUMPI CALLER PUSH2 0x5AC JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40FA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5A2 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x462 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x525 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4A3 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x498 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40FA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x411A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x478 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x462 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3F0 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x36F JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x364 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x411A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3A59 SWAP1 DUP2 PUSH2 0x6A1 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x239D ADD MSTORE DUP2 DUP2 PUSH2 0x2D74 ADD MSTORE DUP2 DUP2 PUSH2 0x35F8 ADD MSTORE PUSH2 0x37A3 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x411A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3D8 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3BF JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x411A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3A4 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x38F JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x411A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x458 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x44C JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x43F JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x436 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40FA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x50D JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4F4 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40FA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4D9 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4C3 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40FA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x598 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x589 JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x57C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x56E JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x482 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x60B JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x482 JUMPI PUSH2 0x664 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x610 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x60B JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x68B JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x676 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x29A7 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x294C JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x28EF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x265B JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x255C JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x24B4 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x23C1 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2352 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x21C6 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2143 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20B3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FE3 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E03 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DB8 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C21 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B57 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1759 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15EA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1579 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x144C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13B4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1345 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x121B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11AA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x104A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFD9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEB7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAC7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA6E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8A9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x2C1D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x2DBC JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2C89 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x2A96 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x3DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 PUSH2 0x3E4 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6F1 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6C7 JUMPI PUSH2 0x489 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x370C JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x50C JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x503 JUMPI JUMPDEST PUSH2 0x4C1 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4BB JUMP JUMPDEST PUSH2 0x517 DUP2 DUP10 DUP7 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x699 JUMPI DUP9 SUB PUSH2 0x667 JUMPI DUP5 PUSH2 0x590 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4A7 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x604 JUMPI JUMPDEST PUSH2 0x5B9 JUMPI DUP10 PUSH2 0x54F JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5AF JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6FA SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x43B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x738 PUSH2 0x2A73 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x762 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7A6 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x82C PUSH2 0x2A73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x849 PUSH2 0x2A96 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x91F PUSH2 0x2A96 JUMP JUMPDEST PUSH2 0x927 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9D9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBB9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB28 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE6 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBE2 SWAP1 DUP3 ADD DUP6 PUSH2 0x2A30 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBF5 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC2C DUP5 PUSH2 0x2DBC JUMP JUMPDEST SWAP3 PUSH2 0xC3A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2C89 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC63 JUMPI POP PUSH2 0xBE2 SWAP3 PUSH2 0xC5D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2A0D JUMP JUMPDEST SWAP1 PUSH2 0xBCC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC88 CALLDATASIZE PUSH2 0x2B5C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCCD PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEAD JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD1D PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x33A6 JUMP JUMPDEST PUSH2 0x33B6 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7F JUMPI JUMPDEST POP ISZERO PUSH2 0xE52 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDAC PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x33A6 JUMP JUMPDEST AND SWAP1 PUSH2 0xDBC PUSH2 0xD18 DUP3 DUP7 DUP10 PUSH2 0x33A6 JUMP JUMPDEST SWAP2 PUSH2 0xDC8 DUP3 DUP8 DUP12 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE41 JUMPI JUMPDEST POP ADD PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE4C SWAP2 PUSH2 0x2C89 JUMP JUMPDEST DUP9 PUSH2 0xE3A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x33D7 JUMP JUMPDEST DUP10 PUSH2 0xD82 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE8E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEEE PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0xEF6 PUSH2 0x2A96 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2BEF JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF24 PUSH2 0x35E1 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFC9 JUMPI JUMPDEST POP POP PUSH2 0xFAA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFB2 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP6 PUSH2 0xFC1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2DF6 JUMP JUMPDEST SWAP4 PUSH2 0x38D2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD2 SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF7B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1081 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x117B JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10B3 PUSH2 0x35E1 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x114D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11A5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x1095 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1229 CALLDATASIZE PUSH2 0x2C1D JUMP JUMPDEST PUSH2 0x125B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH2 0x3184 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1286 DUP2 PUSH2 0x2CF9 JUMP JUMPDEST SWAP5 PUSH2 0x1294 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2C89 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1318 JUMPI POP POP POP SWAP1 PUSH2 0x12C1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2D11 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12D9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1312 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12FE PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3308 JUMP JUMPDEST MLOAD AND PUSH2 0x130A DUP4 DUP10 PUSH2 0x3308 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3246 JUMP JUMPDEST ADD PUSH2 0x12D0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12AB JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x33EF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x13EB PUSH2 0x2A96 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1483 PUSH2 0x2A73 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14C2 PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x154F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1645 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1711 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1790 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x17B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2BEF JUMP JUMPDEST SWAP2 PUSH2 0x17E1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH2 0x1821 DUP5 DUP3 PUSH2 0x181B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1813 PUSH2 0x35E1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2DF6 JUMP JUMPDEST SWAP5 PUSH2 0x3246 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1829 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1896 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1928 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x199F JUMPI JUMPDEST DUP2 PUSH2 0x1941 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18AC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1934 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x19B5 CALLDATASIZE PUSH2 0x2B5C JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F8 PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B4D JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A20 JUMPI STOP JUMPDEST PUSH2 0x1A2B DUP2 DUP4 DUP9 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A5E PUSH2 0xD18 DUP7 DUP12 DUP15 PUSH2 0x33A6 JUMP JUMPDEST DUP3 PUSH2 0x1AC8 PUSH2 0x1AF4 PUSH2 0x1A70 DUP10 DUP14 DUP14 PUSH2 0x33A6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2C89 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B44 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B17 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A17 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B0A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A10 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1B8E PUSH2 0x2A73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D0D PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D8B JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1DF9 PUSH2 0x1DF4 PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x2D5D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1E3A PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E72 PUSH2 0x1EC9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EA0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2D11 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F19 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F23 DUP2 DUP4 PUSH2 0x3308 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F8C JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ED8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1FF1 CALLDATASIZE PUSH2 0x2AB9 JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20A3 JUMPI JUMPDEST POP POP PUSH2 0x207F DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2087 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x209A PUSH1 0x20 DUP7 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x38D2 JUMP JUMPDEST PUSH2 0x20AC SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2050 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x20ED PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x2119 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3246 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x40 PUSH2 0x217C PUSH2 0x378C JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2200 PUSH2 0x2A96 JUMP JUMPDEST PUSH2 0x2208 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22BB JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x24AC JUMPI JUMPDEST ISZERO PUSH2 0x2476 JUMPI POP POP PUSH2 0xBE2 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBE2 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2499 JUMPI PUSH2 0x2493 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3142 JUMP JUMPDEST DIV PUSH2 0x2446 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x24A7 SWAP3 DIV PUSH2 0x3142 JUMP JUMPDEST PUSH2 0x2446 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2439 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x24C5 CALLDATASIZE PUSH2 0x2AB9 JUMP JUMPDEST SWAP2 PUSH2 0x24CE PUSH2 0x35E1 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x254C JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2555 SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2524 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25EA PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2692 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x28BF JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x26E2 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2891 JUMPI DUP5 DUP7 EQ PUSH2 0x2863 JUMPI PUSH2 0x2722 DUP2 DUP7 DUP7 PUSH2 0x370C JUMP JUMPDEST ISZERO PUSH2 0x2817 JUMPI POP ISZERO PUSH2 0x2786 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2772 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2749 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2803 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x274B JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x27A7 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x28E9 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34F6 JUMP JUMPDEST DUP4 PUSH2 0x26B8 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EDC JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x33EF JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1DF9 PUSH1 0x20 SWAP2 PUSH2 0x2E2D JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2A20 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2A10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2A6C DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2A0D JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2BA5 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2BC8 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2BEB SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2C66 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2BEB SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CCA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2D1D DUP2 PUSH2 0x2CF9 JUMP JUMPDEST SWAP4 PUSH2 0x2D2B PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31F JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2D4D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2D41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2DB5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2E02 DUP3 PUSH2 0x2DBC JUMP JUMPDEST SWAP2 PUSH2 0x2E10 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2C89 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED0 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x699 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x2DB5 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6C7 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2891 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3110 JUMPI DUP3 PUSH2 0x2FBF SWAP2 DUP6 PUSH2 0x370C JUMP JUMPDEST ISZERO PUSH2 0x3055 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3006 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x2FDE JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x30CA JUMPI JUMPDEST PUSH2 0x307E JUMPI DUP1 PUSH2 0x2FC5 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3074 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3155 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x31DE JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x32DA JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x331C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3379 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x331C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x34EC JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x34BF JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x347F JUMPI POP PUSH1 0x1 EQ PUSH2 0x3438 JUMPI JUMPDEST POP PUSH2 0x3436 SWAP3 POP SUB DUP4 PUSH2 0x2C89 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3463 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3436 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3429 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3436 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3429 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3409 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x35D7 JUMPI JUMPDEST PUSH2 0x351F JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x35B8 JUMPI JUMPDEST POP ISZERO PUSH2 0x358B JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35D1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x3582 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x36FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3702 JUMPI JUMPDEST PUSH2 0x36FD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x366C JUMPI JUMPDEST POP PUSH2 0x3669 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x36DE JUMPI JUMPDEST POP CODESIZE PUSH2 0x365F JUMP JUMPDEST PUSH2 0x36F7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x36D7 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3628 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3737 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3731 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x38C0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x38C8 JUMPI JUMPDEST PUSH2 0x38C0 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x381F JUMPI JUMPDEST POP PUSH2 0x37EE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x38A1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x37E2 JUMP JUMPDEST PUSH2 0x38BA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x389A JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x37D3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3944 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x39A8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3A1B JUMPI JUMPDEST DUP2 PUSH2 0x39C1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x395A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x39B4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x6255E482EA650BA7CBA87C59CAF7DC8E488F4CBCEF137BB29F6B9D9E 0xC3 0x24 PUSH17 0x64736F6C634300081E00337EA68FD2DCF1 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A47EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A50000 ","sourceMap":"467:465:154:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;1637:10:328;1645:152:42;;-1:-1:-1;467:465:154;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;467:465:154;;;-1:-1:-1;;;;;;467:465:154;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;467:465:154;;;-1:-1:-1;;;;;467:465:154;;;;-1:-1:-1;;;;;;;;;;;467:465:154;;990:1:42;467:465:154;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;990:1:42;467:465:154;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;467:465:154;;;;-1:-1:-1;;;;;467:465:154;;;;-1:-1:-1;;;;;;;;;;;467:465:154;990:1:42;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;990:1:42;467:465:154;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;467:465:154;;1289:23:341;467:465:154;;-1:-1:-1;;;;;;467:465:154;;;;;;;-1:-1:-1;;;;500:10:59;;;467:465:154;500:10:59;;;;467:465:154;500:10:59;;;;;-1:-1:-1;;500:10:59;;;467:465:154;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;467:465:154;745:39:76;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;467:465:154;;-1:-1:-1;467:465:154;;-1:-1:-1;467:465:154;;;;;;;;990:1:42;467:465:154;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;467:465:154;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;467:465:154;;990:1:42;467:465:154;;;;;;-1:-1:-1;467:465:154;;;;;;;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;;;;;;;;;;;;467:465:154;;;;;;;-1:-1:-1;;;467:465:154;;;;;;;;;;;;990:1:42;467:465:154;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;467:465:154;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;467:465:154;;;-1:-1:-1;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;-1:-1:-1;990:1:42;467:465:154;;;;;;-1:-1:-1;467:465:154;;;;;;;;;;;1645:152:42;467:465:154;;;-1:-1:-1;;;;;;467:465:154;1637:10:328;467:465:154;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;467:465:154;-1:-1:-1;467:465:154;;;;;;;;;-1:-1:-1;;467:465:154;;;-1:-1:-1;;;;;467:465:154;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;467:465:154;;;;;;;;-1:-1:-1;;467:465:154;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;;;;-1:-1:-1;467:465:154;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":10902,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":10937,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11100,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11293,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":11051,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":11537,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":11766,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13271,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11247,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":10867,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":10800,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":11513,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11708,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":13222,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":12610,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":13295,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":10765,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11401,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":14546,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":13558,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12676,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":11996,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":14092,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":11613,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":12870,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":14220,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":13793,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":13131,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":11821,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":12107,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":13064,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":13238,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":9117},{"length":32,"start":11636},{"length":32,"start":13816},{"length":32,"start":14243}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146129a757806306fdde031461294c578063081812fc146128ef578063095ea7b31461265b578063114ba8ee1461255c57806323b872dd146124b45780632a55205a146123c15780632b4c9f16146123525780632f2ff15d146121c657806331e66e1e1461214357806340c10f19146120b357806342842e0e14611fe35780634684d7e914611e03578063572b6c0514611db857806361ba27da14611c9c5780636352211e14611c2157806370a0823114611b5757806373c8a958146119a75780638832e6e3146117595780638bb9c5bf146115ea5780638da5cb5b146115795780638dc251e31461144c57806391d14854146113b457806395d89b41146113455780639da5e8321461121b578063a0c76f62146111aa578063a22cb4651461104a578063b0ccc31e14610fd9578063b88d4fde14610eb7578063c3666c3614610c7a578063c87b56dd14610ac7578063d539139314610a6e578063d547741f146108e5578063e1a8bf2c146108a9578063e985e9c5146107f5578063f2fde38b14610701578063f3993d111461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc36612c1d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d6135e1565b925416911690810361034e57508181036103245760005b81811061022d57005b6102388183876133a6565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f576102628285876133a6565b35908147106102ed57600080809381935af13d156102e5573d9061028582612dbc565b916102936040519384612c89565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b2612a73565b6103ba612a96565b9060443567ffffffffffffffff811161031f576103db903690600401612b2b565b926103e46135e1565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106f1575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106c757610489838284969461370c565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061050c578787878181141580610503575b6104c157005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104bb565b6105178189866133a6565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106995788036106675784610590575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104a7565b7401000000000000000000000000000000000000000016158015610604575b6105b9578961054f565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105af565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106fa916134f6565b858261043b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610738612a73565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906107626135e1565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034e575073ffffffffffffffffffffffffffffffffffffffff16918282036107a657005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761082c612a73565b73ffffffffffffffffffffffffffffffffffffffff610849612a96565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020604051620186a08152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561091f612a96565b6109276135e1565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109d957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610bb96000600435610b28817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6e57600091610be6575b60405160208082528190610be290820185612a30565b0390f35b3d8083833e610bf58183612c89565b810190602081830312610c665780519067ffffffffffffffff8211610c6a570181601f82011215610c6657805192610c2c84612dbc565b92610c3a6040519485612c89565b84845260208584010111610c635750610be292610c5d9160208085019101612a0d565b90610bcc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031f57610c8836612b5c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ccd6135e1565b925416911690810361034e5750808214801590610ead575b6103245760005b828110610cf557005b73ffffffffffffffffffffffffffffffffffffffff610d1d610d1883858a6133a6565b6133b6565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6e57600091610e7f575b5015610e52575073ffffffffffffffffffffffffffffffffffffffff610dac610d1883858a6133a6565b1690610dbc610d188286896133a6565b91610dc882878b6133a6565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6e57600192610e41575b5001610cec565b6000610e4c91612c89565b88610e3a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea0915060203d8111610ea6575b610e988183612c89565b8101906133d7565b89610d82565b503d610e8e565b5082821415610ce5565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610eee612a73565b610ef6612a96565b60443560643567ffffffffffffffff811161031f57610f19903690600401612bef565b929093610f246135e1565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fc9575b5050610faa848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b823b610fb257005b610fc795610fc1913691612df6565b936138d2565b005b610fd2916134f6565b8685610f7b565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611081612a73565b602435908115159182810361031f5761117b575b73ffffffffffffffffffffffffffffffffffffffff806110b36135e1565b1691169181831461114d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111a5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134f6565b611095565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031f5761122936612c1d565b61125b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b90613184565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261128681612cf9565b946112946040519687612c89565b818652602086019160051b81019036821161031f57915b81831061131857505050906112c1913691612d11565b91805191835183036103245760005b8381106112d957005b8061131273ffffffffffffffffffffffffffffffffffffffff6112fe60019487613308565b511661130a8389613308565b519085613246565b016112d0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016112ab565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56133ef565b604051918291602083526020830190612a30565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576113eb612a96565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611483612a73565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114c26135e1565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561154f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356116456135e1565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a69565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611790612a73565b6024359060443567ffffffffffffffff811161031f576117b4903690600401612bef565b916117e17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b611821848261181b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0956118136135e1565b973691612df6565b94613246565b803b61182957005b73ffffffffffffffffffffffffffffffffffffffff80602092169361189660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612a30565b03816000865af1908115610c6e57600091611928575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161199f575b8161194160209383612c89565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff000000000000000000000000000000000000000000000000000000006118ac565b5080fd5b3d9150611934565b3461031f576119b536612b5c565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119f86135e1565b925416911690810361034e5750808414801590611b4d575b6103245760005b848110611a2057005b611a2b8183886133a6565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f576000602091611a5e610d18868b8e6133a6565b82611ac8611af4611a70898d8d6133a6565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612c89565b51925af115610c6e576000513d611b445750803b155b611b175750600101611a17565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b0a565b5082841415611a10565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611b8e612a73565b73ffffffffffffffffffffffffffffffffffffffff811615611bf75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d0d6135e1565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8b57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611df9611df4612a73565b612d5d565b6040519015158152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611e3a612a73565b60243567ffffffffffffffff811161031f5773ffffffffffffffffffffffffffffffffffffffff611e72611ec9923690600401612b2b565b9290611ea07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691612d11565b9216908115611fb95782519260005b848110611f19575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f238183613308565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8c57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ed8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57611ff136612ab9565b611ff96135e1565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120a3575b505061207f828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b803b61208757005b610fc7936040519361209a602086612c89565b600085526138d2565b6120ac916134f6565b8483612050565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610fc76120ed612a73565b6121197fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226112556135e1565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613246565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57604061217c61378c565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435612200612a96565b6122086135e1565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156122bb57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a69565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156124ac575b15612476575050610be260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610be291620186a08210156124995761249390620186a092613142565b04612446565b620186a06124a79204613142565b612446565b508115612439565b3461031f57610fc76124c536612ab9565b916124ce6135e1565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361254c575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f4b565b612555916134f6565b8581612524565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806125ea6135e1565b925416911690810361034e575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57612692612a73565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156128bf575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06126e26135e1565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612891578486146128635761272281868661370c565b15612817575015612786577401000000000000000000000000000000000000000016612772575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612749565b90740100000000000000000000000000000000000000008217809203612803575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561274b565b8460005260205260406000205583806127a7565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6128e9907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306134f6565b836126b8565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612edc565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46133ef565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f57611df9602091612e2d565b60005b838110612a205750506000910152565b8181015183820152602001612a10565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612a6c81518092818752878088019101612a0d565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060243573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060443590565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612ba591600401612b2b565b9290929160243567ffffffffffffffff811161031f5781612bc891600401612b2b565b929092916044359067ffffffffffffffff821161031f57612beb91600401612b2b565b9091565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612c6691600401612b2b565b929092916024359067ffffffffffffffff821161031f57612beb91600401612b2b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cca57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612cca5760051b60200190565b929190612d1d81612cf9565b93612d2b6040519586612c89565b602085838152019160051b810192831161031f57905b828210612d4d57505050565b8135815260209182019101612d41565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612db55773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612cca57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612e0282612dbc565b91612e106040519384612c89565b82948184528183011161031f578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612ed6577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612ed0576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561069957740100000000000000000000000000000000000000001615612db5576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106c757846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156128915773ffffffffffffffffffffffffffffffffffffffff81168095036131105782612fbf918561370c565b15613055575b5050836000528060205282604060002055828203613006575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538612fde565b74010000000000000000000000000000000000000000161580156130ca575b61307e5780612fc5565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613074565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561315557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156131de5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fb957826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166132da57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561331c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613379575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561331c5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9081602091031261031f5751801515810361031f5790565b906040519160008154918260011c926001811680156134ec575b6020851081146134bf5784875286939291811561347f5750600114613438575b5061343692500383612c89565b565b90506000929192526020600020906000915b8183106134635750509060206134369282010138613429565b602091935080600191548385890101520191019091849261344a565b602093506134369592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613429565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613409565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806135d7575b61351f575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c6e576000916135b8575b501561358b5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135d1915060203d602011610ea657610e988183612c89565b38613582565b50813b1515613517565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156136fd573233148015613702575b6136fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561366c575b5061366957503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c6e576000916136de575b503861365f565b6136f7915060203d602011610ea657610e988183612c89565b386136d7565b503390565b5060183610613628565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613737575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613731565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156138c05732331480156138c8575b6138c05780331490811561381f575b506137ee576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161031f5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c6e576000916138a1575b50386137e2565b6138ba915060203d602011610ea657610e988183612c89565b3861389a565b506000903690565b50601836106137d3565b73ffffffffffffffffffffffffffffffffffffffff90613944826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612a30565b03816000865af1908115610c6e576000916139a8575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f8575050565b6020813d602011613a1b575b816139c160209383612c89565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff0000000000000000000000000000000000000000000000000000000061395a565b3d91506139b456fea26469706673582212207b6255e482ea650ba7cba87c59caf7dc8e488f4cbcef137bb29f6b9d9ec3247064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x29A7 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x294C JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x28EF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x265B JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x255C JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x24B4 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x23C1 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2352 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x21C6 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x2143 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20B3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FE3 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E03 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DB8 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C21 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B57 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1759 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15EA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1579 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x144C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13B4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1345 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x121B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11AA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x104A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFD9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEB7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAC7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA6E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8A9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x2C1D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x2DBC JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2C89 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x2A96 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x3DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 PUSH2 0x3E4 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6F1 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6C7 JUMPI PUSH2 0x489 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x370C JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x50C JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x503 JUMPI JUMPDEST PUSH2 0x4C1 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4BB JUMP JUMPDEST PUSH2 0x517 DUP2 DUP10 DUP7 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x699 JUMPI DUP9 SUB PUSH2 0x667 JUMPI DUP5 PUSH2 0x590 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4A7 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x604 JUMPI JUMPDEST PUSH2 0x5B9 JUMPI DUP10 PUSH2 0x54F JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5AF JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6FA SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x43B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x738 PUSH2 0x2A73 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x762 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7A6 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x82C PUSH2 0x2A73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x849 PUSH2 0x2A96 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x91F PUSH2 0x2A96 JUMP JUMPDEST PUSH2 0x927 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9D9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBB9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB28 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE6 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBE2 SWAP1 DUP3 ADD DUP6 PUSH2 0x2A30 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBF5 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC2C DUP5 PUSH2 0x2DBC JUMP JUMPDEST SWAP3 PUSH2 0xC3A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2C89 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC63 JUMPI POP PUSH2 0xBE2 SWAP3 PUSH2 0xC5D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2A0D JUMP JUMPDEST SWAP1 PUSH2 0xBCC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC88 CALLDATASIZE PUSH2 0x2B5C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCCD PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEAD JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD1D PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x33A6 JUMP JUMPDEST PUSH2 0x33B6 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7F JUMPI JUMPDEST POP ISZERO PUSH2 0xE52 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDAC PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x33A6 JUMP JUMPDEST AND SWAP1 PUSH2 0xDBC PUSH2 0xD18 DUP3 DUP7 DUP10 PUSH2 0x33A6 JUMP JUMPDEST SWAP2 PUSH2 0xDC8 DUP3 DUP8 DUP12 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE41 JUMPI JUMPDEST POP ADD PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE4C SWAP2 PUSH2 0x2C89 JUMP JUMPDEST DUP9 PUSH2 0xE3A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x33D7 JUMP JUMPDEST DUP10 PUSH2 0xD82 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE8E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEEE PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0xEF6 PUSH2 0x2A96 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2BEF JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF24 PUSH2 0x35E1 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFC9 JUMPI JUMPDEST POP POP PUSH2 0xFAA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFB2 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP6 PUSH2 0xFC1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2DF6 JUMP JUMPDEST SWAP4 PUSH2 0x38D2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD2 SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF7B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1081 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x117B JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10B3 PUSH2 0x35E1 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x114D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11A5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34F6 JUMP JUMPDEST PUSH2 0x1095 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1229 CALLDATASIZE PUSH2 0x2C1D JUMP JUMPDEST PUSH2 0x125B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 PUSH2 0x3184 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1286 DUP2 PUSH2 0x2CF9 JUMP JUMPDEST SWAP5 PUSH2 0x1294 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2C89 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1318 JUMPI POP POP POP SWAP1 PUSH2 0x12C1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2D11 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12D9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1312 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12FE PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3308 JUMP JUMPDEST MLOAD AND PUSH2 0x130A DUP4 DUP10 PUSH2 0x3308 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3246 JUMP JUMPDEST ADD PUSH2 0x12D0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12AB JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x33EF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x13EB PUSH2 0x2A96 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1483 PUSH2 0x2A73 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14C2 PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x154F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1645 PUSH2 0x35E1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1711 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1790 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x17B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2BEF JUMP JUMPDEST SWAP2 PUSH2 0x17E1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH2 0x1821 DUP5 DUP3 PUSH2 0x181B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1813 PUSH2 0x35E1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2DF6 JUMP JUMPDEST SWAP5 PUSH2 0x3246 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1829 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1896 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1928 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x199F JUMPI JUMPDEST DUP2 PUSH2 0x1941 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18AC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1934 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x19B5 CALLDATASIZE PUSH2 0x2B5C JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F8 PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B4D JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A20 JUMPI STOP JUMPDEST PUSH2 0x1A2B DUP2 DUP4 DUP9 PUSH2 0x33A6 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A5E PUSH2 0xD18 DUP7 DUP12 DUP15 PUSH2 0x33A6 JUMP JUMPDEST DUP3 PUSH2 0x1AC8 PUSH2 0x1AF4 PUSH2 0x1A70 DUP10 DUP14 DUP14 PUSH2 0x33A6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2C89 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B44 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B17 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A17 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B0A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A10 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1B8E PUSH2 0x2A73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D0D PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D8B JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1DF9 PUSH2 0x1DF4 PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x2D5D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1E3A PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E72 PUSH2 0x1EC9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EA0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2D11 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F19 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F23 DUP2 DUP4 PUSH2 0x3308 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F8C JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ED8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1FF1 CALLDATASIZE PUSH2 0x2AB9 JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20A3 JUMPI JUMPDEST POP POP PUSH2 0x207F DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2087 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x209A PUSH1 0x20 DUP7 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x38D2 JUMP JUMPDEST PUSH2 0x20AC SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2050 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x20ED PUSH2 0x2A73 JUMP JUMPDEST PUSH2 0x2119 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x35E1 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3246 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x40 PUSH2 0x217C PUSH2 0x378C JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2200 PUSH2 0x2A96 JUMP JUMPDEST PUSH2 0x2208 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22BB JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x24AC JUMPI JUMPDEST ISZERO PUSH2 0x2476 JUMPI POP POP PUSH2 0xBE2 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBE2 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2499 JUMPI PUSH2 0x2493 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3142 JUMP JUMPDEST DIV PUSH2 0x2446 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x24A7 SWAP3 DIV PUSH2 0x3142 JUMP JUMPDEST PUSH2 0x2446 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2439 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x24C5 CALLDATASIZE PUSH2 0x2AB9 JUMP JUMPDEST SWAP2 PUSH2 0x24CE PUSH2 0x35E1 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x254C JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F4B JUMP JUMPDEST PUSH2 0x2555 SWAP2 PUSH2 0x34F6 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2524 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25EA PUSH2 0x35E1 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2692 PUSH2 0x2A73 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x28BF JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x26E2 PUSH2 0x35E1 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2891 JUMPI DUP5 DUP7 EQ PUSH2 0x2863 JUMPI PUSH2 0x2722 DUP2 DUP7 DUP7 PUSH2 0x370C JUMP JUMPDEST ISZERO PUSH2 0x2817 JUMPI POP ISZERO PUSH2 0x2786 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2772 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2749 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2803 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x274B JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x27A7 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x28E9 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x34F6 JUMP JUMPDEST DUP4 PUSH2 0x26B8 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EDC JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x33EF JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1DF9 PUSH1 0x20 SWAP2 PUSH2 0x2E2D JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2A20 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2A10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2A6C DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2A0D JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2BA5 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2BC8 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2BEB SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2C66 SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2BEB SWAP2 PUSH1 0x4 ADD PUSH2 0x2B2B JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CCA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2D1D DUP2 PUSH2 0x2CF9 JUMP JUMPDEST SWAP4 PUSH2 0x2D2B PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2C89 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31F JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2D4D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2D41 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2DB5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2E02 DUP3 PUSH2 0x2DBC JUMP JUMPDEST SWAP2 PUSH2 0x2E10 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2C89 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2ED0 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x699 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x2DB5 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6C7 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2891 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3110 JUMPI DUP3 PUSH2 0x2FBF SWAP2 DUP6 PUSH2 0x370C JUMP JUMPDEST ISZERO PUSH2 0x3055 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3006 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x2FDE JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x30CA JUMPI JUMPDEST PUSH2 0x307E JUMPI DUP1 PUSH2 0x2FC5 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3074 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3155 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x31DE JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x32DA JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x331C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3379 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x331C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x34EC JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x34BF JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x347F JUMPI POP PUSH1 0x1 EQ PUSH2 0x3438 JUMPI JUMPDEST POP PUSH2 0x3436 SWAP3 POP SUB DUP4 PUSH2 0x2C89 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3463 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3436 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3429 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3436 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3429 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3409 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x35D7 JUMPI JUMPDEST PUSH2 0x351F JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x35B8 JUMPI JUMPDEST POP ISZERO PUSH2 0x358B JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35D1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x3582 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x36FD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3702 JUMPI JUMPDEST PUSH2 0x36FD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x366C JUMPI JUMPDEST POP PUSH2 0x3669 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x36DE JUMPI JUMPDEST POP CODESIZE PUSH2 0x365F JUMP JUMPDEST PUSH2 0x36F7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x36D7 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3628 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3737 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3731 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x38C0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x38C8 JUMPI JUMPDEST PUSH2 0x38C0 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x381F JUMPI JUMPDEST POP PUSH2 0x37EE JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x38A1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x37E2 JUMP JUMPDEST PUSH2 0x38BA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x2C89 JUMP JUMPDEST CODESIZE PUSH2 0x389A JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x37D3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3944 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2A30 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x39A8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3A1B JUMPI JUMPDEST DUP2 PUSH2 0x39C1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2C89 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x395A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x39B4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x6255E482EA650BA7CBA87C59CAF7DC8E488F4CBCEF137BB29F6B9D9E 0xC3 0x24 PUSH17 0x64736F6C634300081E0033000000000000 ","sourceMap":"467:465:154:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;467:465:154;;2005:41:328;;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;467:465:154;1845:10:192;;;;;;467:465:154;1857:3:192;1876:11;;;;;:::i;:::-;467:465:154;;;;;;;;;1898:10:192;;;;;:::i;:::-;467:465:154;1375:21:9;;;:30;1371:125;;467:465:154;1548:33:9;;;;;;;467:465:154;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;467:465:154;;1834:9:192;;1591:58:9;467:465:154;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;467:465:154;5957:19:9;467:465:154;;5957:19:9;467:465:154;;;;;1371:125:9;1455:21;;1428:57;467:465:154;1428:57:9;467:465:154;;;;;;1428:57:9;467:465:154;;;;1756:63:192;1793:26;467:465:154;1793:26:192;467:465:154;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;467:465:154;;-1:-1:-1;4538:25:42;467:465:154;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2005:41:328;;;:::i;:::-;3179:19:352;467:465:154;;;;;;;;2616:14:352;2612:76;;467:465:154;29158:19:327;;467:465:154;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;467:465:154;;12884:11:327;;467:465:154;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;467:465:154;13173:304:327;-1:-1:-1;467:465:154;;;13323:10:327;467:465:154;;;;;;;;;;;2220:8:327;;467:465:154;;;;;;;;;2220:8:327;;467:465:154;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;467:465:154;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;467:465:154;;;;;;;;;;;;;;2220:8:327;13125:27;;;467:465:154;13125:27:327;;467:465:154;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;467:465:154;12987:51:327;;467:465:154;12987:51:327;467:465:154;;;;;;;;;12987:51:327;12919:59;467:465:154;;;;12958:11:327;467:465:154;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;467:465:154;12832:34:327;467:465:154;;;;;;12832:34:327;12715:64;12748:31;;467:465:154;12748:31:327;467:465:154;;;;12748:31:327;12409:58;12438:29;467:465:154;12438:29:327;467:465:154;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;467:465:154;;;;;;;;;;;;;:::i;:::-;;2005:41:328;;;:::i;:::-;467:465:154;;;;;;;;3205:23:42;;;3201:60;;467:465:154;;;3275:25:42;;;;3271:146;;467:465:154;3271:146:42;2220:8:327;;;;;;;;3361:45:42;467:465:154;3361:45:42;;467:465:154;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;467:465:154;-1:-1:-1;467:465:154;28718:11:327;467:465:154;;;;-1:-1:-1;467:465:154;28718:28:327;467:465:154;-1:-1:-1;467:465:154;;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;467:465:154;;;;;;;;;;;;;;;;;;;;;;713:6:351;467:465:154;;;;;;;;;;;;;;;;;;:::i;:::-;2005:41:328;;:::i;:::-;5148:19:42;467:465:154;;;;;;;4503:26:42;;;4499:64;;4464:19:41;467:465:154;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;1880:140:41;;467:465:154;1880:140:41;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;467:465:154;;;;1973:36:41;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;467:465:154;;;1453:39:302;1863:70:327;467:465:154;1453:39:302;:::i;:::-;;467:465:154;3364:23:341;467:465:154;;;;3364:64:341;;;;;467:465:154;3364:64:341;;1603:4:302;467:465:154;3364:64:341;;467:465:154;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;467:465:154;3364:64:341;;;467:465:154;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;467:465:154;;;;;;;;;;;3364:64:341;467:465:154;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;467:465:154;;;2005:41:328;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;467:465:154;3852:94:192;;467:465:154;3972:10:192;;;;;;467:465:154;3984:3:192;467:465:154;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;467:465:154;;;;4058:76:192;;4108:25;467:465:154;4058:76:192;;467:465:154;4058:76:192;;;;;;;;;;;;467:465:154;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;467:465:154;4239:12:192;;;;;;:::i;:::-;467:465:154;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;467:465:154;4239:70:192;;;;;;;467:465:154;;;;;;;4239:70:192;;;;;467:465:154;4239:70:192;;4277:4;467:465:154;4239:70:192;;467:465:154;;4058:76:192;467:465:154;;;;;;;4239:70:192;;;;;;;467:465:154;4239:70:192;;;3984:3;;467:465:154;3961:9:192;;4239:70;467:465:154;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;467:465:154;4161:50:192;467:465:154;;4058:76:192;467:465:154;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;467:465:154;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2005:41:328;;;;;:::i;:::-;3179:19:352;467:465:154;;;;;;;;2616:14:352;2612:76;;467:465:154;29158:19:327;;11217:7;1863:70;;;;467:465:154;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;467:465:154;11235:101:327;11271:54;467:465:154;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;467:465:154;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;467:465:154;;2005:41:328;;;:::i;:::-;467:465:154;;;6339:18:327;;;;6335:63;;467:465:154;6463:42:327;6408:19;467:465:154;-1:-1:-1;467:465:154;6408:11:327;467:465:154;;;-1:-1:-1;467:465:154;;-1:-1:-1;467:465:154;;;;-1:-1:-1;467:465:154;;;;;;;;;;;;;;;;6463:42:327;467:465:154;6335:63:327;6366:32;;467:465:154;6366:32:327;467:465:154;;;;6366:32:327;1500:115:305;2931:8:352;668:81;467:465:154;2931:8:352;:::i;:::-;1500:115:305;;467:465:154;;;;;;;;;;;;;2991:23:341;467:465:154;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;467:465:154;2005:41:328;;:::i;:::-;1368:12:300;;:::i;:::-;467:465:154;1062:8:300;;;;:::i;:::-;467:465:154;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;467:465:154;;1062:8:300;;;;;;;;;;;467:465:154;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;467:465:154;17882:10:327;;;;;;467:465:154;17894:3:327;17920:13;17935:11;467:465:154;17920:13:327;467:465:154;17920:13:327;;;:::i;:::-;467:465:154;;17935:11:327;;;;:::i;:::-;467:465:154;17935:11:327;;;:::i;:::-;467:465:154;17871:9:327;;1062:8:300;467:465:154;;;;;;;;;1062:8:300;;;;;;;;;;467:465:154;;;;;;;;;;;;;2688:13:341;467:465:154;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;467:465:154;-1:-1:-1;467:465:154;;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;467:465:154;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2005:41:328;;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;2976:19:351;467:465:154;;;;;1732:22:351;1728:93;;467:465:154;;2220:8:327;;;;;;;467:465:154;;;1728:93:351;1777:33;467:465:154;1777:33:351;467:465:154;;1777:33:351;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2005:41:328;;:::i;:::-;467:465:154;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;3741:25:41;3737:66;;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;467:465:154;;;;2455:33:41;467:465:154;3737:66:41;467:465:154;3775:28:41;;;467:465:154;3775:28:41;467:465:154;;;;;;;3775:28:41;467:465:154;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;467:465:154;2005:41:328;;:::i;1586:12:303:-;15560:7:327;1863:70;;467:465:154;;2005:41:328;;;:::i;:::-;467:465:154;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;467:465:154;15578:107:327;467:465:154;;;;;;;;;29832:65:327;;;;;467:465:154;29832:65:327;;467:465:154;;29832:65:327;;467:465:154;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;467:465:154;29832:65:327;;;;;;;;467:465:154;29832:65:327;;;15578:107;467:465:154;;;;;29832:84:327;29828:136;;467:465:154;29828:136:327;29925:39;467:465:154;29925:39:327;467:465:154;;;;;;29925:39:327;29832:65;467:465:154;29832:65:327;;467:465:154;29832:65:327;;;;;;467:465:154;29832:65:327;;;:::i;:::-;;;467:465:154;;;;;;;;;;;;;29832:65:327;467:465:154;29832:65:327;;467:465:154;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;467:465:154;;;;;;;:::i;:::-;5148:19:42;;;;467:465:154;;;2005:41:328;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;467:465:154;2776:90:192;;467:465:154;2892:10:192;;;;;;467:465:154;2904:3:192;2923:9;;;;;:::i;:::-;467:465:154;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;467:465:154;;;1328:43:8;;;;;;467:465:154;;;;1328:43:8;;;467:465:154;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;467:465:154;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;467:465:154;;2881:9:192;;8938:146:8;9033:40;467:465:154;9033:40:8;467:465:154;;1328:43:8;467:465:154;9033:40:8;8942:68;467:465:154;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;467:465:154;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;467:465:154;;-1:-1:-1;467:465:154;26801:10:327;467:465:154;;;;-1:-1:-1;467:465:154;;;;;;;;26724:60:327;26756:28;467:465:154;26756:28:327;467:465:154;;26756:28:327;467:465:154;;;;;;;;;;;;3395:39:305;467:465:154;;;3395:39:305;:::i;:::-;467:465:154;;;;;;;;;;;;;;;;;;;;;;;2005:41:328;;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;2976:19:351;467:465:154;1281:36:351;713:6;1281:36;;1277:119;;467:465:154;;;;;;;;;;;;;;;1277:119:351;1340:45;467:465:154;1340:45:351;467:465:154;;;;1340:45:351;467:465:154;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1956:12:303;467:465:154;2005:41:328;;:::i;1956:12:303:-;467:465:154;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;467:465:154;;16512:9:327;467:465:154;16523:10:327;;;;;;16821:14;;;-1:-1:-1;467:465:154;16821:10:327;467:465:154;;;-1:-1:-1;467:465:154;;;;;2220:8:327;;467:465:154;;;16535:3:327;16572:11;;;;:::i;:::-;467:465:154;;;;;;;;;;;;;16597:72:327;;467:465:154;;;;;;;;;;;;;2220:8:327;16743:33;467:465:154;16743:33:327;;;;467:465:154;16512:9:327;;16597:72;16641:28;467:465:154;16641:28:327;467:465:154;;;;16641:28:327;16400:54;16429:25;467:465:154;16429:25:327;467:465:154;;16429:25:327;467:465:154;;;;;;;:::i;:::-;2005:41:328;;:::i;:::-;3179:19:352;467:465:154;;;;;;;;2616:14:352;2612:76;;467:465:154;29158:19:327;;9668:7;1863:70;;;;467:465:154;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;467:465:154;9686:99:327;9722:52;467:465:154;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;467:465:154;;;;;;;;;;;1287:7:303;467:465:154;;:::i;:::-;1232:12:303;467:465:154;2005:41:328;;:::i;1232:12:303:-;467:465:154;;;;1287:7:303;:::i;467:465:154:-;;;;;;;;;;;;2240:39:328;;:::i;:::-;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2005:41:328;;:::i;:::-;5148:19:42;467:465:154;;;;;;;4503:26:42;;;4499:64;;4464:19:41;467:465:154;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;1254:25:41;1250:140;;467:465:154;1250:140:41;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;467:465:154;;;;1343:36:41;467:465:154;;;;;;;;;;;;;;;;941:19:75;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;467:465:154;2499:377:351;;;2559:17;;467:465:154;;2499:377:351;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;467:465:154;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;467:465:154;2499:377:351;;2607:259;713:6;2794:57;467:465:154;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;467:465:154;;;;2134:7:305;467:465:154;;;:::i;:::-;2005:41:328;;;:::i;:::-;467:465:154;;;;;;;;2616:14:352;2612:76;;467:465:154;29158:19:327;;467:465:154;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;467:465:154;;;;;;;;;;;;;;;;;;;;;;2005:41:328;;;:::i;:::-;467:465:154;;;;;4503:26:42;;;4499:64;;3179:19:352;467:465:154;;;;2220:8:327;;;;;;;467:465:154;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;467:465:154;29158:19:327;467:465:154;2005:41:328;;:::i;:::-;467:465:154;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;467:465:154;5670:35:327;;467:465:154;5157:173:327;467:465:154;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;467:465:154;;;;;5620:11:327;467:465:154;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;467:465:154;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;467:465:154;5052:59:327;;;467:465:154;5052:59:327;467:465:154;;;;;;;;;5052:59:327;4927:63;4958:32;;467:465:154;4958:32:327;467:465:154;;;;4958:32:327;4802:64;4835:31;;467:465:154;4835:31:327;467:465:154;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;467:465:154;2931:8:352;:::i;:::-;1064:117:305;;;467:465:154;;;;;;;;;;;;3579:43:305;467:465:154;;;3579:43:305;:::i;467:465:154:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;467:465:154;635:65:55;;:::i;467:465:154:-;;;;;;;;-1:-1:-1;;467:465:154;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;467:465:154;1146:19:75;467:465:154;1146:53:75;;;1142:96;;467:465:154;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;467:465:154;1215:12:75;:::o;467:465:154:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;467:465:154;;;;;;:::o;1359:340:59:-;467:465:154;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;467:465:154;500:10:59;467:465:154;500:10:59;;;;467:465:154;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;467:465:154;1528:12:59;:::o;27798:360:327:-;467:465:154;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;467:465:154;;;28073:11:327;467:465:154;;;;;;;;28066:27:327;:::o;7385:956::-;;;467:465:154;;7507:16:327;;;7503:58;;467:465:154;7521:1:327;467:465:154;;;;;7521:1:327;467:465:154;;;;;30700:19:327;;;7615:64;;467:465:154;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;467:465:154;;;7521:1:327;467:465:154;;;;;;7521:1:327;467:465:154;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;467:465:154;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;;;2220:8:327;;467:465:154;-1:-1:-1;467:465:154;;;;-1:-1:-1;467:465:154;8155:10:327;467:465:154;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;467:465:154;7896:51:327;;;7521:1;7896:51;467:465:154;7896:51:327;467:465:154;;;;;;7521:1:327;7896:51;7828:59;467:465:154;;7521:1:327;467:465:154;7867:11:327;;;467:465:154;;;;7521:1:327;467:465:154;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;467:465:154;;;;7521:1:327;7728:34;467:465:154;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;467:465:154;-1:-1:-1;467:465:154;;;;-1:-1:-1;467:465:154;;;;-1:-1:-1;467:465:154;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;467:465:154;3775:28:41;;-1:-1:-1;3775:28:41;467:465:154;3775:28:41;467:465:154;;;;;-1:-1:-1;3775:28:41;14035:460:327;;467:465:154;;14119:16:327;;;14115:54;;467:465:154;14133:1:327;467:465:154;;;;;;14133:1:327;467:465:154;;;14179:72:327;;14415:10;467:465:154;;14133:1:327;467:465:154;;;;;;14133:1:327;467:465:154;2220:8:327;467:465:154;-1:-1:-1;467:465:154;14415:10:327;467:465:154;;;-1:-1:-1;467:465:154;14415:10:327;467:465:154;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;467:465:154;;14133:1:327;14223:28;467:465:154;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;467:465:154;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;467:465:154;;-1:-1:-1;27324:31:327;467:465:154;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;467:465:154;;;;;-1:-1:-1;467:465:154;;-1:-1:-1;467:465:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;467:465:154;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;467:465:154;;;3613:51:352;467:465:154;;3613:51:352;;;;467:465:154;3613:51:352;;3648:4;3613:51;;;467:465:154;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;467:465:154;;-1:-1:-1;3691:28:352;3613:51;;;;467:465:154;3613:51:352;467:465:154;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;467:465:154;1029:19:76;467:465:154;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;467:465:154;;;1676:74:76;;467:465:154;;;1676:74:76;;;467:465:154;1327:10:76;467:465:154;;;;1744:4:76;467:465:154;;;;;-1:-1:-1;1676:74:76;;467:465:154;;;;;;1676:74:76;;;;;;;467:465:154;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;467:465:154;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;467:465:154;;-1:-1:-1;467:465:154;30435:11:327;467:465:154;;;;-1:-1:-1;467:465:154;30435:27:327;467:465:154;-1:-1:-1;467:465:154;;;500:10:59;467:465:154;-1:-1:-1;467:465:154;500:10:59;;30413:49:327;;;;;1938:939:76;467:465:154;2065:19:76;467:465:154;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;467:465:154;720:8:80;467:465:154;720:8:80;;467:465:154;;;;2115:1:76;2802:32;;:::o;2624:153::-;467:465:154;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;467:465:154;2361:10:76;467:465:154;;;;2771:4:76;467:465:154;;;;;-1:-1:-1;2682:95:76;;467:465:154;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;467:465:154;29701:270:327;467:465:154;29701:270:327;467:465:154;29701:270:327;;;;;467:465:154;;;;;29832:65:327;;;;;467:465:154;29832:65:327;;467:465:154;29832:65:327;;;467:465:154;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;467:465:154;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;467:465:154;29832:65:327;;467:465:154;29832:65:327;;;;;;467:465:154;29832:65:327;;;:::i;:::-;;;467:465:154;;;;;;;;;;;;;29832:65:327;467:465:154;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"2987400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"826","ROYALTY_FEE_DENOMINATOR()":"870","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","isApprovedForAll(address,address)":"3267","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2693","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"ERC721FullMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol\":\"ERC721FullMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/ERC721FullMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../../token/metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ERC721Full} from \\\"./../../../../token/ERC721/preset/ERC721Full.sol\\\";\\n\\n/// @title ERC721FullMock\\ncontract ERC721FullMock is ERC721Full {\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC721Full(tokenName, tokenSymbol, metadataResolver, filterRegistry, forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa6b96b8190f8c44d4f3d93c9ede3521e01bc45d6bf7b2a180a5eb7f53c9f9ef5\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./base/ERC721DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x0465e23e92e293553137225252d7c5b80b6fc7ae406b15559830b5b7164025f9\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721Full.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721Mintable} from \\\"./../ERC721Mintable.sol\\\";\\nimport {ERC721Deliverable} from \\\"./../ERC721Deliverable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721Full is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721Mintable,\\n    ERC721Deliverable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x90426d7d59d6ed41b9fef38bd49f317fd960dd68faa7708b24a272d5168706cc\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol":{"ERC721FullBurnProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f6148a238819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f57608052604051614807908161009b823960805181818161283a01528181613b39015281816143a601526145510152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461370f57806306fdde03146136b4578063081812fc14613657578063095ea7b3146133c35780630e07f85414612ae0578063114ba8ee146129f957806323b872dd146129515780632a55205a1461285e5780632b4c9f16146127ef5780632f2ff15d1461266357806331e66e1e146125e057806340c10f191461255057806342842e0e146124805780634684d7e9146122e7578063572b6c051461229c57806361ba27da146121805780636352211e1461210557806370a082311461203b57806373c8a95814611e8b57806379cc679014611bed5780638832e6e31461199f5780638bb9c5bf146118305780638da5cb5b146117bf5780638dc251e31461169257806391d14854146115fa57806395d89b411461158b5780639da5e83214611461578063a0c76f62146113f0578063a22cb46514611290578063b0ccc31e1461121f578063b88d4fde146110fd578063c3666c3614610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613a11565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e61438f565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387614199565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587614199565b359081471061030e57600080809381935af13d15610306573d906102a682613b81565b916102b46040519384613a7d565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d36137fc565b6103db61381f565b9060443567ffffffffffffffff8111610340576103fc9036906004016138e2565b9261040561438f565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa83828496946144ba565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986614199565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b916142a4565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576107596137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078361438f565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613913565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f61438f565b9261085b8484836144ba565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886614199565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a726137fc565b73ffffffffffffffffffffffffffffffffffffffff610a8f61381f565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b6561381f565b610b6d61438f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061413e565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e28908201856137b9565b0390f35b3d8083833e610e3b8183613a7d565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e7284613b81565b92610e806040519485613a7d565b84845260208584010111610ea95750610e2892610ea39160208085019101613796565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461034057610ece36613982565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f1361438f565b925416911690810361036f57508082148015906110f3575b6103455760005b828110610f3b57005b73ffffffffffffffffffffffffffffffffffffffff610f63610f5e83858a614199565b6141a9565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb4576000916110c5575b5015611098575073ffffffffffffffffffffffffffffffffffffffff610ff2610f5e83858a614199565b1690611002610f5e828689614199565b9161100e82878b614199565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611087575b5001610f32565b600061109291613a7d565b88611080565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110e6915060203d81116110ec575b6110de8183613a7d565b8101906141ca565b89610fc8565b503d6110d4565b5082821415610f2b565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111346137fc565b61113c61381f565b60443560643567ffffffffffffffff81116103405761115f903690600401613842565b92909361116a61438f565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361120f575b50506111f0848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b823b6111f857005b61120d95611207913691613bbb565b93614680565b005b611218916142a4565b86856111c1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576112c76137fc565b6024359081151591828103610340576113c1575b73ffffffffffffffffffffffffffffffffffffffff806112f961438f565b169116918183146113935760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113eb817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306142a4565b6112db565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103405761146f36613a11565b6114a17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b90613f77565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114cc81613abe565b946114da6040519687613a7d565b818652602086019160051b81019036821161034057915b81831061155e5750505090611507913691613ad6565b91805191835183036103455760005b83811061151f57005b8061155873ffffffffffffffffffffffffffffffffffffffff611544600194876140fb565b511661155083896140fb565b519085614039565b01611516565b823573ffffffffffffffffffffffffffffffffffffffff81168103610340578152602092830192016114f1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286115e67f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56141e2565b6040519182916020835260208301906137b9565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761163161381f565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576116c96137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061170861438f565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156117955773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561188b61438f565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156119575760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576119d66137fc565b6024359060443567ffffffffffffffff8111610340576119fa903690600401613842565b91611a277fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b611a678482611a617fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a5961438f565b973691613bbb565b94614039565b803b611a6f57005b73ffffffffffffffffffffffffffffffffffffffff806020921693611adc60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906137b9565b03816000865af1908115610eb457600091611b6e575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3e57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611be5575b81611b8760209383613a7d565b81010312611be15751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611af2565b5080fd5b3d9150611b7a565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611c246137fc565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c5161438f565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e5d5773ffffffffffffffffffffffffffffffffffffffff8116809503611e2b5782611ca691856144ba565b15611d54575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dc8575b611d7d5780611cac565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d73565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034057611e9936613982565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611edc61438f565b925416911690810361036f5750808414801590612031575b6103455760005b848110611f0457005b611f0f818388614199565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091611f42610f5e868b8e614199565b82611fac611fd8611f54898d8d614199565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613a7d565b51925af115610eb4576000513d6120285750803b155b611ffb5750600101611efb565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fee565b5082841415611ef4565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576120726137fc565b73ffffffffffffffffffffffffffffffffffffffff8116156120db5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206121626004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061413e565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121f161438f565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226f57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206122dd6122d86137fc565b613b22565b6040519015158152f35b346103405761236673ffffffffffffffffffffffffffffffffffffffff61230d36613913565b9291939061233d7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613ad6565b92169081156124565782519260005b8481106123b6575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123c081836140fb565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661242957908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612375565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405761248e36613870565b61249661438f565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612540575b505061251c828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b803b61252457005b61120d9360405193612537602086613a7d565b60008552614680565b612549916142a4565b84836124ed565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761120d61258a6137fc565b6125b67fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0614039565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057604061261961453a565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043561269d61381f565b6126a561438f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561275857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612949575b15612913575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a08210156129365761293090620186a092613f35565b046128e3565b620186a06129449204613f35565b6128e3565b5081156128d6565b346103405761120d61296236613870565b9161296b61438f565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036129e9575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b6129f2916142a4565b85816129c1565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612a306137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612a6f61438f565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043567ffffffffffffffff811161034057612b2f903690600401613842565b60243567ffffffffffffffff811161034057612b4f903690600401613842565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610340576064359373ffffffffffffffffffffffffffffffffffffffff85168503610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612bbd61438f565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015613082575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161336e575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015613082575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161323f578190612e6e8454613ceb565b601f811161331b575b50600090601f83116001146132795760009261326e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161323f57612ef97f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613ceb565b601f81116131bb575b506000601f82116001146130bf57819293946000926130b4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015613082575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612f1c565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106131a357508360019596971061316b575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612f6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905584808061313e565b9092602060018192868601358155019401910161312a565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410613235575b601f0160051c01905b8181106132295750612f02565b6000815560010161321c565b9091508190613213565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612e8e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061330357509084600195949392106132cb575b505050811b019055612ec0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558780806132be565b919360206001819287870135815501950192016132a8565b909150836000526020600020601f840160051c81019160208510613364575b90601f859493920160051c01905b8181106133555750612e77565b60008155849350600101613348565b909150819061333a565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612c2a565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576133fa6137fc565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115613627575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061344a61438f565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156135f9578486146135cb5761348a8186866144ba565b1561357f5750156134ee5774010000000000000000000000000000000000000000166134da575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836134b1565b9074010000000000000000000000000000000000000000821780920361356b575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556134b3565b84600052602052604060002055838061350f565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613651907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306142a4565b83613420565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206121626004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c7c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286115e67f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46141e2565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576122dd6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613bf2565b60005b8381106137a95750506000910152565b8181015183820152602001613799565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936137f581518092818752878088019101613796565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff82116103405761397e916004016138e2565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff811161034057816139cb916004016138e2565b9290929160243567ffffffffffffffff811161034057816139ee916004016138e2565b929092916044359067ffffffffffffffff82116103405761397e916004016138e2565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613a5a916004016138e2565b929092916024359067ffffffffffffffff82116103405761397e916004016138e2565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761323f57604052565b67ffffffffffffffff811161323f5760051b60200190565b929190613ae281613abe565b93613af06040519586613a7d565b602085838152019160051b810192831161034057905b828210613b1257505050565b8135815260209182019101613b06565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613b7a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161323f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613bc782613b81565b91613bd56040519384613a7d565b829481845281830111610340578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613b7a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613c755760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba57740100000000000000000000000000000000000000001615613b7a576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613d34575b6020831014613d0557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613cfa565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156135f95773ffffffffffffffffffffffffffffffffffffffff8116809503613f035782613db291856144ba565b15613e48575b5050836000528060205282604060002055828203613df9575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613dd1565b7401000000000000000000000000000000000000000016158015613ebd575b613e715780613db8565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613e67565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613f4857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613fd15750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561245657826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166140cd57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561410f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541690811561416c575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561410f5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b90604051918260008254926141f684613ceb565b8084529360018116908115614264575060011461421d575b5061421b92500383613a7d565b565b90506000929192526020600020906000915b81831061424857505090602061421b928201013861420e565b602091935080600191548385890101520191019091849261422f565b6020935061421b9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861420e565b5473ffffffffffffffffffffffffffffffffffffffff169081151580614385575b6142cd575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091614366575b50156143395750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61437f915060203d6020116110ec576110de8183613a7d565b38614330565b50813b15156142c5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156144ab5732331480156144b0575b6144ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561441a575b5061441757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161448c575b503861440d565b6144a5915060203d6020116110ec576110de8183613a7d565b38614485565b503390565b50601836106143d6565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156144e5575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806144df565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561466e573233148015614676575b61466e578033149081156145cd575b5061459c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103405760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161464f575b5038614590565b614668915060203d6020116110ec576110de8183613a7d565b38614648565b506000903690565b5060183610614581565b73ffffffffffffffffffffffffffffffffffffffff906146f2826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906137b9565b03816000865af1908115610eb457600091614756575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3e575050565b6020813d6020116147c9575b8161476f60209383613a7d565b81010312611be15751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000614708565b3d915061476256fea2646970667358221220b26ff95383482afed2a4d1b37f5f3b248bfda17c34803ab1663a3d9c62a3b42f64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x48A2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4807 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x283A ADD MSTORE DUP2 DUP2 PUSH2 0x3B39 ADD MSTORE DUP2 DUP2 PUSH2 0x43A6 ADD MSTORE PUSH2 0x4551 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x370F JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x36B4 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x3657 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x33C3 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2AE0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x29F9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2951 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x285E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x27EF JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2663 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x25E0 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2550 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2480 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x229C JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2180 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2105 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x203B JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E8B JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BED JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x199F JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1830 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17BF JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1692 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15FA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x158B JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1461 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13F0 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1290 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x121F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10FD JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3A11 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x3B81 JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3A7D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x381F JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x44BA JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3913 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x438F JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x44BA JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x37FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x381F JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x381F JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x413E JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x37B9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x3B81 JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3A7D JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3796 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xECE CALLDATASIZE PUSH2 0x3982 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF13 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10F3 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF3B JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF63 PUSH2 0xF5E DUP4 DUP6 DUP11 PUSH2 0x4199 JUMP JUMPDEST PUSH2 0x41A9 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10C5 JUMPI JUMPDEST POP ISZERO PUSH2 0x1098 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFF2 PUSH2 0xF5E DUP4 DUP6 DUP11 PUSH2 0x4199 JUMP JUMPDEST AND SWAP1 PUSH2 0x1002 PUSH2 0xF5E DUP3 DUP7 DUP10 PUSH2 0x4199 JUMP JUMPDEST SWAP2 PUSH2 0x100E DUP3 DUP8 DUP12 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1087 JUMPI JUMPDEST POP ADD PUSH2 0xF32 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1092 SWAP2 PUSH2 0x3A7D JUMP JUMPDEST DUP9 PUSH2 0x1080 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10E6 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10EC JUMPI JUMPDEST PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x41CA JUMP JUMPDEST DUP10 PUSH2 0xFC8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10D4 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF2B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1134 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x113C PUSH2 0x381F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x115F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x116A PUSH2 0x438F JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x120F JUMPI JUMPDEST POP POP PUSH2 0x11F0 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11F8 JUMPI STOP JUMPDEST PUSH2 0x120D SWAP6 PUSH2 0x1207 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3BBB JUMP JUMPDEST SWAP4 PUSH2 0x4680 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1218 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x12C7 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x13C1 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12F9 PUSH2 0x438F JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1393 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13EB DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x42A4 JUMP JUMPDEST PUSH2 0x12DB JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x146F CALLDATASIZE PUSH2 0x3A11 JUMP JUMPDEST PUSH2 0x14A1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH2 0x3F77 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14CC DUP2 PUSH2 0x3ABE JUMP JUMPDEST SWAP5 PUSH2 0x14DA PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3A7D JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x155E JUMPI POP POP POP SWAP1 PUSH2 0x1507 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3AD6 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x151F JUMPI STOP JUMPDEST DUP1 PUSH2 0x1558 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1544 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x40FB JUMP JUMPDEST MLOAD AND PUSH2 0x1550 DUP4 DUP10 PUSH2 0x40FB JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x4039 JUMP JUMPDEST ADD PUSH2 0x1516 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14F1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x15E6 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x41E2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1631 PUSH2 0x381F JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x16C9 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1708 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1795 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x188B PUSH2 0x438F JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1957 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x19D6 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x19FA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST SWAP2 PUSH2 0x1A27 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH2 0x1A67 DUP5 DUP3 PUSH2 0x1A61 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A59 PUSH2 0x438F JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3BBB JUMP JUMPDEST SWAP5 PUSH2 0x4039 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A6F JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1ADC PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B6E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B3E JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BE5 JUMPI JUMPDEST DUP2 PUSH2 0x1B87 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BE1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AF2 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B7A JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1C24 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C51 PUSH2 0x438F JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E5D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E2B JUMPI DUP3 PUSH2 0x1CA6 SWAP2 DUP6 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x1D54 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DC8 JUMPI JUMPDEST PUSH2 0x1D7D JUMPI DUP1 PUSH2 0x1CAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D73 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1E99 CALLDATASIZE PUSH2 0x3982 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EDC PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2031 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F04 JUMPI STOP JUMPDEST PUSH2 0x1F0F DUP2 DUP4 DUP9 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F42 PUSH2 0xF5E DUP7 DUP12 DUP15 PUSH2 0x4199 JUMP JUMPDEST DUP3 PUSH2 0x1FAC PUSH2 0x1FD8 PUSH2 0x1F54 DUP10 DUP14 DUP14 PUSH2 0x4199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3A7D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2028 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FFB JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EFB JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FEE JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EF4 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2072 PUSH2 0x37FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20DB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2162 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x413E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21F1 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x226F JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x22DD PUSH2 0x22D8 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x3B22 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2366 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x230D CALLDATASIZE PUSH2 0x3913 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x233D PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3AD6 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x2456 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23B6 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23C0 DUP2 DUP4 PUSH2 0x40FB JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2429 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2375 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x248E CALLDATASIZE PUSH2 0x3870 JUMP JUMPDEST PUSH2 0x2496 PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2540 JUMPI JUMPDEST POP POP PUSH2 0x251C DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2524 JUMPI STOP JUMPDEST PUSH2 0x120D SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2537 PUSH1 0x20 DUP7 PUSH2 0x3A7D JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4680 JUMP JUMPDEST PUSH2 0x2549 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24ED JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x120D PUSH2 0x258A PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x25B6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4039 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x40 PUSH2 0x2619 PUSH2 0x453A JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x269D PUSH2 0x381F JUMP JUMPDEST PUSH2 0x26A5 PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2758 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2949 JUMPI JUMPDEST ISZERO PUSH2 0x2913 JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2936 JUMPI PUSH2 0x2930 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3F35 JUMP JUMPDEST DIV PUSH2 0x28E3 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2944 SWAP3 DIV PUSH2 0x3F35 JUMP JUMPDEST PUSH2 0x28E3 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x28D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x120D PUSH2 0x2962 CALLDATASIZE PUSH2 0x3870 JUMP JUMPDEST SWAP2 PUSH2 0x296B PUSH2 0x438F JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29E9 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST PUSH2 0x29F2 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x29C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2A30 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2A6F PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2B2F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2B4F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x340 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2BBD PUSH2 0x438F JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x336E JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x323F JUMPI DUP2 SWAP1 PUSH2 0x2E6E DUP5 SLOAD PUSH2 0x3CEB JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x331B JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3279 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x326E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH2 0x2EF9 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3CEB JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x31BB JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x30BF JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x30B4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2F1C JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x31A3 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x316B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2F6E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x313E JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x312A JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x3235 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3229 JUMPI POP PUSH2 0x2F02 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x321C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3213 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2E8E JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x3303 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x32CB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2EC0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x32BE JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x32A8 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3364 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3355 JUMPI POP PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3348 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x333A JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2C2A JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x33FA PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x3627 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x344A PUSH2 0x438F JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x35F9 JUMPI DUP5 DUP7 EQ PUSH2 0x35CB JUMPI PUSH2 0x348A DUP2 DUP7 DUP7 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x357F JUMPI POP ISZERO PUSH2 0x34EE JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x34DA JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x34B1 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x356B JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x34B3 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x350F JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3651 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x42A4 JUMP JUMPDEST DUP4 PUSH2 0x3420 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2162 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C7C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x15E6 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x41E2 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x22DD PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3BF2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x37A9 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3799 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x37F5 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3796 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x39CB SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x39EE SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3A5A SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x323F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3AE2 DUP2 PUSH2 0x3ABE JUMP JUMPDEST SWAP4 PUSH2 0x3AF0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3A7D JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3B12 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3B7A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3BC7 DUP3 PUSH2 0x3B81 JUMP JUMPDEST SWAP2 PUSH2 0x3BD5 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3A7D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3B7A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3C75 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3B7A JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3D34 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3D05 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3CFA JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x35F9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3F03 JUMPI DUP3 PUSH2 0x3DB2 SWAP2 DUP6 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x3E48 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3DF9 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3DD1 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3EBD JUMPI JUMPDEST PUSH2 0x3E71 JUMPI DUP1 PUSH2 0x3DB8 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3E67 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3F48 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3FD1 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x2456 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x40CD JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x410F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x416C JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x410F JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x41F6 DUP5 PUSH2 0x3CEB JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x4264 JUMPI POP PUSH1 0x1 EQ PUSH2 0x421D JUMPI JUMPDEST POP PUSH2 0x421B SWAP3 POP SUB DUP4 PUSH2 0x3A7D JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4248 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x421B SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x420E JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x422F JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x421B SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x420E JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4385 JUMPI JUMPDEST PUSH2 0x42CD JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4366 JUMPI JUMPDEST POP ISZERO PUSH2 0x4339 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x437F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4330 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x42C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x44AB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x44B0 JUMPI JUMPDEST PUSH2 0x44AB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x441A JUMPI JUMPDEST POP PUSH2 0x4417 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x448C JUMPI JUMPDEST POP CODESIZE PUSH2 0x440D JUMP JUMPDEST PUSH2 0x44A5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4485 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x43D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x44E5 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x44DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x466E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4676 JUMPI JUMPDEST PUSH2 0x466E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x45CD JUMPI JUMPDEST POP PUSH2 0x459C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x464F JUMPI JUMPDEST POP CODESIZE PUSH2 0x4590 JUMP JUMPDEST PUSH2 0x4668 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4648 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4581 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x46F2 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4756 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B3E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x47C9 JUMPI JUMPDEST DUP2 PUSH2 0x476F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BE1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x4708 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4762 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB2 PUSH16 0xF95383482AFED2A4D1B37F5F3B248BFD LOG1 PUSH29 0x34803AB1663A3D9C62A3B42F64736F6C634300081E0033000000000000 ","sourceMap":"262:261:155:-:0;;;;;;;;;;;;;-1:-1:-1;;262:261:155;;;;-1:-1:-1;;;;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;262:261:155;;;;;;745:39:76;;262:261:155;;;;;;;;745:39:76;262:261:155;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;262:261:155;;;;;;-1:-1:-1;262:261:155;;;;;-1:-1:-1;262:261:155"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":14332,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":14448,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":14611,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":14722,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":14865,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":14562,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":15062,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":15291,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":16842,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":14402,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":14367,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":14265,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":15038,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":15233,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":16793,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":16181,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":16866,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":14230,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":15595,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":14973,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":18048,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":17060,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":16247,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":15484,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":17594,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":15138,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":16441,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":17722,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":17295,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":16702,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":15346,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":15678,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":16635,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":16809,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10298},{"length":32,"start":15161},{"length":32,"start":17318},{"length":32,"start":17745}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461370f57806306fdde03146136b4578063081812fc14613657578063095ea7b3146133c35780630e07f85414612ae0578063114ba8ee146129f957806323b872dd146129515780632a55205a1461285e5780632b4c9f16146127ef5780632f2ff15d1461266357806331e66e1e146125e057806340c10f191461255057806342842e0e146124805780634684d7e9146122e7578063572b6c051461229c57806361ba27da146121805780636352211e1461210557806370a082311461203b57806373c8a95814611e8b57806379cc679014611bed5780638832e6e31461199f5780638bb9c5bf146118305780638da5cb5b146117bf5780638dc251e31461169257806391d14854146115fa57806395d89b411461158b5780639da5e83214611461578063a0c76f62146113f0578063a22cb46514611290578063b0ccc31e1461121f578063b88d4fde146110fd578063c3666c3614610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613a11565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e61438f565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387614199565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587614199565b359081471061030e57600080809381935af13d15610306573d906102a682613b81565b916102b46040519384613a7d565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d36137fc565b6103db61381f565b9060443567ffffffffffffffff8111610340576103fc9036906004016138e2565b9261040561438f565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa83828496946144ba565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986614199565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b916142a4565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576107596137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078361438f565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613913565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f61438f565b9261085b8484836144ba565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886614199565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a726137fc565b73ffffffffffffffffffffffffffffffffffffffff610a8f61381f565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b6561381f565b610b6d61438f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061413e565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e28908201856137b9565b0390f35b3d8083833e610e3b8183613a7d565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e7284613b81565b92610e806040519485613a7d565b84845260208584010111610ea95750610e2892610ea39160208085019101613796565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461034057610ece36613982565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f1361438f565b925416911690810361036f57508082148015906110f3575b6103455760005b828110610f3b57005b73ffffffffffffffffffffffffffffffffffffffff610f63610f5e83858a614199565b6141a9565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb4576000916110c5575b5015611098575073ffffffffffffffffffffffffffffffffffffffff610ff2610f5e83858a614199565b1690611002610f5e828689614199565b9161100e82878b614199565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611087575b5001610f32565b600061109291613a7d565b88611080565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110e6915060203d81116110ec575b6110de8183613a7d565b8101906141ca565b89610fc8565b503d6110d4565b5082821415610f2b565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111346137fc565b61113c61381f565b60443560643567ffffffffffffffff81116103405761115f903690600401613842565b92909361116a61438f565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361120f575b50506111f0848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b823b6111f857005b61120d95611207913691613bbb565b93614680565b005b611218916142a4565b86856111c1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576112c76137fc565b6024359081151591828103610340576113c1575b73ffffffffffffffffffffffffffffffffffffffff806112f961438f565b169116918183146113935760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113eb817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306142a4565b6112db565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103405761146f36613a11565b6114a17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b90613f77565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114cc81613abe565b946114da6040519687613a7d565b818652602086019160051b81019036821161034057915b81831061155e5750505090611507913691613ad6565b91805191835183036103455760005b83811061151f57005b8061155873ffffffffffffffffffffffffffffffffffffffff611544600194876140fb565b511661155083896140fb565b519085614039565b01611516565b823573ffffffffffffffffffffffffffffffffffffffff81168103610340578152602092830192016114f1565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286115e67f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56141e2565b6040519182916020835260208301906137b9565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761163161381f565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576116c96137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061170861438f565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156117955773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561188b61438f565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156119575760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576119d66137fc565b6024359060443567ffffffffffffffff8111610340576119fa903690600401613842565b91611a277fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b611a678482611a617fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a5961438f565b973691613bbb565b94614039565b803b611a6f57005b73ffffffffffffffffffffffffffffffffffffffff806020921693611adc60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906137b9565b03816000865af1908115610eb457600091611b6e575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3e57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611be5575b81611b8760209383613a7d565b81010312611be15751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611af2565b5080fd5b3d9150611b7a565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611c246137fc565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c5161438f565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e5d5773ffffffffffffffffffffffffffffffffffffffff8116809503611e2b5782611ca691856144ba565b15611d54575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dc8575b611d7d5780611cac565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d73565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034057611e9936613982565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611edc61438f565b925416911690810361036f5750808414801590612031575b6103455760005b848110611f0457005b611f0f818388614199565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091611f42610f5e868b8e614199565b82611fac611fd8611f54898d8d614199565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613a7d565b51925af115610eb4576000513d6120285750803b155b611ffb5750600101611efb565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fee565b5082841415611ef4565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576120726137fc565b73ffffffffffffffffffffffffffffffffffffffff8116156120db5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206121626004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061413e565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121f161438f565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226f57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206122dd6122d86137fc565b613b22565b6040519015158152f35b346103405761236673ffffffffffffffffffffffffffffffffffffffff61230d36613913565b9291939061233d7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613ad6565b92169081156124565782519260005b8481106123b6575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123c081836140fb565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661242957908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612375565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405761248e36613870565b61249661438f565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612540575b505061251c828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b803b61252457005b61120d9360405193612537602086613a7d565b60008552614680565b612549916142a4565b84836124ed565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405761120d61258a6137fc565b6125b67fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261149b61438f565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0614039565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057604061261961453a565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043561269d61381f565b6126a561438f565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561275857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612949575b15612913575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a08210156129365761293090620186a092613f35565b046128e3565b620186a06129449204613f35565b6128e3565b5081156128d6565b346103405761120d61296236613870565b9161296b61438f565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036129e9575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613d3e565b6129f2916142a4565b85816129c1565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612a306137fc565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612a6f61438f565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043567ffffffffffffffff811161034057612b2f903690600401613842565b60243567ffffffffffffffff811161034057612b4f903690600401613842565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610340576064359373ffffffffffffffffffffffffffffffffffffffff85168503610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612bbd61438f565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015613082575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161336e575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015613082575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161323f578190612e6e8454613ceb565b601f811161331b575b50600090601f83116001146132795760009261326e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161323f57612ef97f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613ceb565b601f81116131bb575b506000601f82116001146130bf57819293946000926130b4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015613082575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612f1c565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106131a357508360019596971061316b575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612f6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905584808061313e565b9092602060018192868601358155019401910161312a565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410613235575b601f0160051c01905b8181106132295750612f02565b6000815560010161321c565b9091508190613213565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612e8e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061330357509084600195949392106132cb575b505050811b019055612ec0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558780806132be565b919360206001819287870135815501950192016132a8565b909150836000526020600020601f840160051c81019160208510613364575b90601f859493920160051c01905b8181106133555750612e77565b60008155849350600101613348565b909150819061333a565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612c2a565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576133fa6137fc565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115613627575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061344a61438f565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156135f9578486146135cb5761348a8186866144ba565b1561357f5750156134ee5774010000000000000000000000000000000000000000166134da575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836134b1565b9074010000000000000000000000000000000000000000821780920361356b575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556134b3565b84600052602052604060002055838061350f565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613651907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd306142a4565b83613420565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206121626004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c7c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286115e67f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46141e2565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576122dd6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613bf2565b60005b8381106137a95750506000910152565b8181015183820152602001613799565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936137f581518092818752878088019101613796565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff82116103405761397e916004016138e2565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff811161034057816139cb916004016138e2565b9290929160243567ffffffffffffffff811161034057816139ee916004016138e2565b929092916044359067ffffffffffffffff82116103405761397e916004016138e2565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613a5a916004016138e2565b929092916024359067ffffffffffffffff82116103405761397e916004016138e2565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761323f57604052565b67ffffffffffffffff811161323f5760051b60200190565b929190613ae281613abe565b93613af06040519586613a7d565b602085838152019160051b810192831161034057905b828210613b1257505050565b8135815260209182019101613b06565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613b7a5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161323f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613bc782613b81565b91613bd56040519384613a7d565b829481845281830111610340578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613b7a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613c755760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba57740100000000000000000000000000000000000000001615613b7a576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613d34575b6020831014613d0557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613cfa565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156135f95773ffffffffffffffffffffffffffffffffffffffff8116809503613f035782613db291856144ba565b15613e48575b5050836000528060205282604060002055828203613df9575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613dd1565b7401000000000000000000000000000000000000000016158015613ebd575b613e715780613db8565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613e67565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613f4857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613fd15750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561245657826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166140cd57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561410f5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541690811561416c575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561410f5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b90604051918260008254926141f684613ceb565b8084529360018116908115614264575060011461421d575b5061421b92500383613a7d565b565b90506000929192526020600020906000915b81831061424857505090602061421b928201013861420e565b602091935080600191548385890101520191019091849261422f565b6020935061421b9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861420e565b5473ffffffffffffffffffffffffffffffffffffffff169081151580614385575b6142cd575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091614366575b50156143395750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61437f915060203d6020116110ec576110de8183613a7d565b38614330565b50813b15156142c5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156144ab5732331480156144b0575b6144ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561441a575b5061441757503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161448c575b503861440d565b6144a5915060203d6020116110ec576110de8183613a7d565b38614485565b503390565b50601836106143d6565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156144e5575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806144df565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561466e573233148015614676575b61466e578033149081156145cd575b5061459c576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116103405760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610eb45760009161464f575b5038614590565b614668915060203d6020116110ec576110de8183613a7d565b38614648565b506000903690565b5060183610614581565b73ffffffffffffffffffffffffffffffffffffffff906146f2826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906137b9565b03816000865af1908115610eb457600091614756575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3e575050565b6020813d6020116147c9575b8161476f60209383613a7d565b81010312611be15751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000614708565b3d915061476256fea2646970667358221220b26ff95383482afed2a4d1b37f5f3b248bfda17c34803ab1663a3d9c62a3b42f64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x370F JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x36B4 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x3657 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x33C3 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2AE0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x29F9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2951 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x285E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x27EF JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2663 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x25E0 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2550 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2480 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x229C JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2180 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2105 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x203B JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E8B JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BED JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x199F JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1830 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17BF JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1692 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15FA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x158B JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1461 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13F0 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1290 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x121F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10FD JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3A11 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x3B81 JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3A7D JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x381F JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x44BA JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3913 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x438F JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x44BA JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x37FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x381F JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x381F JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x413E JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x37B9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x3B81 JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3A7D JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3796 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xECE CALLDATASIZE PUSH2 0x3982 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF13 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10F3 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF3B JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF63 PUSH2 0xF5E DUP4 DUP6 DUP11 PUSH2 0x4199 JUMP JUMPDEST PUSH2 0x41A9 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10C5 JUMPI JUMPDEST POP ISZERO PUSH2 0x1098 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFF2 PUSH2 0xF5E DUP4 DUP6 DUP11 PUSH2 0x4199 JUMP JUMPDEST AND SWAP1 PUSH2 0x1002 PUSH2 0xF5E DUP3 DUP7 DUP10 PUSH2 0x4199 JUMP JUMPDEST SWAP2 PUSH2 0x100E DUP3 DUP8 DUP12 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1087 JUMPI JUMPDEST POP ADD PUSH2 0xF32 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1092 SWAP2 PUSH2 0x3A7D JUMP JUMPDEST DUP9 PUSH2 0x1080 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10E6 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10EC JUMPI JUMPDEST PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x41CA JUMP JUMPDEST DUP10 PUSH2 0xFC8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10D4 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF2B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1134 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x113C PUSH2 0x381F JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x115F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x116A PUSH2 0x438F JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x120F JUMPI JUMPDEST POP POP PUSH2 0x11F0 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11F8 JUMPI STOP JUMPDEST PUSH2 0x120D SWAP6 PUSH2 0x1207 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3BBB JUMP JUMPDEST SWAP4 PUSH2 0x4680 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1218 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x12C7 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x13C1 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12F9 PUSH2 0x438F JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1393 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13EB DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x42A4 JUMP JUMPDEST PUSH2 0x12DB JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x146F CALLDATASIZE PUSH2 0x3A11 JUMP JUMPDEST PUSH2 0x14A1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST SWAP1 PUSH2 0x3F77 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14CC DUP2 PUSH2 0x3ABE JUMP JUMPDEST SWAP5 PUSH2 0x14DA PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3A7D JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x155E JUMPI POP POP POP SWAP1 PUSH2 0x1507 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3AD6 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x151F JUMPI STOP JUMPDEST DUP1 PUSH2 0x1558 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1544 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x40FB JUMP JUMPDEST MLOAD AND PUSH2 0x1550 DUP4 DUP10 PUSH2 0x40FB JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x4039 JUMP JUMPDEST ADD PUSH2 0x1516 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14F1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x15E6 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x41E2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1631 PUSH2 0x381F JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x16C9 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1708 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1795 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x188B PUSH2 0x438F JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1957 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x19D6 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x19FA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST SWAP2 PUSH2 0x1A27 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH2 0x1A67 DUP5 DUP3 PUSH2 0x1A61 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A59 PUSH2 0x438F JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3BBB JUMP JUMPDEST SWAP5 PUSH2 0x4039 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A6F JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1ADC PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B6E JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B3E JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BE5 JUMPI JUMPDEST DUP2 PUSH2 0x1B87 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BE1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AF2 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B7A JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1C24 PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C51 PUSH2 0x438F JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E5D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E2B JUMPI DUP3 PUSH2 0x1CA6 SWAP2 DUP6 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x1D54 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DC8 JUMPI JUMPDEST PUSH2 0x1D7D JUMPI DUP1 PUSH2 0x1CAC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D73 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1E99 CALLDATASIZE PUSH2 0x3982 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EDC PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2031 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F04 JUMPI STOP JUMPDEST PUSH2 0x1F0F DUP2 DUP4 DUP9 PUSH2 0x4199 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F42 PUSH2 0xF5E DUP7 DUP12 DUP15 PUSH2 0x4199 JUMP JUMPDEST DUP3 PUSH2 0x1FAC PUSH2 0x1FD8 PUSH2 0x1F54 DUP10 DUP14 DUP14 PUSH2 0x4199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3A7D JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2028 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FFB JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EFB JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FEE JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EF4 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2072 PUSH2 0x37FC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20DB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2162 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x413E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21F1 PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x226F JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x22DD PUSH2 0x22D8 PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x3B22 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2366 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x230D CALLDATASIZE PUSH2 0x3913 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x233D PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3AD6 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x2456 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23B6 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23C0 DUP2 DUP4 PUSH2 0x40FB JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2429 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2375 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x248E CALLDATASIZE PUSH2 0x3870 JUMP JUMPDEST PUSH2 0x2496 PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2540 JUMPI JUMPDEST POP POP PUSH2 0x251C DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2524 JUMPI STOP JUMPDEST PUSH2 0x120D SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2537 PUSH1 0x20 DUP7 PUSH2 0x3A7D JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4680 JUMP JUMPDEST PUSH2 0x2549 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24ED JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x120D PUSH2 0x258A PUSH2 0x37FC JUMP JUMPDEST PUSH2 0x25B6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x149B PUSH2 0x438F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4039 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x40 PUSH2 0x2619 PUSH2 0x453A JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x269D PUSH2 0x381F JUMP JUMPDEST PUSH2 0x26A5 PUSH2 0x438F JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2758 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2949 JUMPI JUMPDEST ISZERO PUSH2 0x2913 JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2936 JUMPI PUSH2 0x2930 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3F35 JUMP JUMPDEST DIV PUSH2 0x28E3 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2944 SWAP3 DIV PUSH2 0x3F35 JUMP JUMPDEST PUSH2 0x28E3 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x28D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x120D PUSH2 0x2962 CALLDATASIZE PUSH2 0x3870 JUMP JUMPDEST SWAP2 PUSH2 0x296B PUSH2 0x438F JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x29E9 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3D3E JUMP JUMPDEST PUSH2 0x29F2 SWAP2 PUSH2 0x42A4 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x29C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2A30 PUSH2 0x37FC JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2A6F PUSH2 0x438F JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2B2F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2B4F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3842 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x340 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2BBD PUSH2 0x438F JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x336E JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x323F JUMPI DUP2 SWAP1 PUSH2 0x2E6E DUP5 SLOAD PUSH2 0x3CEB JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x331B JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3279 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x326E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH2 0x2EF9 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3CEB JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x31BB JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x30BF JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x30B4 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x3082 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2F1C JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x31A3 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x316B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2F6E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x313E JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x312A JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x3235 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3229 JUMPI POP PUSH2 0x2F02 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x321C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3213 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2E8E JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x3303 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x32CB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2EC0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x32BE JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x32A8 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3364 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3355 JUMPI POP PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3348 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x333A JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2C2A JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x33FA PUSH2 0x37FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x3627 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x344A PUSH2 0x438F JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x35F9 JUMPI DUP5 DUP7 EQ PUSH2 0x35CB JUMPI PUSH2 0x348A DUP2 DUP7 DUP7 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x357F JUMPI POP ISZERO PUSH2 0x34EE JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x34DA JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x34B1 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x356B JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x34B3 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x350F JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3651 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x42A4 JUMP JUMPDEST DUP4 PUSH2 0x3420 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2162 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C7C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x15E6 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x41E2 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x22DD PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3BF2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x37A9 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3799 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x37F5 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3796 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x39CB SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x39EE SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3A5A SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x397E SWAP2 PUSH1 0x4 ADD PUSH2 0x38E2 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x323F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3AE2 DUP2 PUSH2 0x3ABE JUMP JUMPDEST SWAP4 PUSH2 0x3AF0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3A7D JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3B12 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3B7A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x323F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3BC7 DUP3 PUSH2 0x3B81 JUMP JUMPDEST SWAP2 PUSH2 0x3BD5 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3A7D JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3B7A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3C75 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3B7A JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3D34 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3D05 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3CFA JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x35F9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3F03 JUMPI DUP3 PUSH2 0x3DB2 SWAP2 DUP6 PUSH2 0x44BA JUMP JUMPDEST ISZERO PUSH2 0x3E48 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3DF9 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3DD1 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3EBD JUMPI JUMPDEST PUSH2 0x3E71 JUMPI DUP1 PUSH2 0x3DB8 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3E67 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3F48 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3FD1 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x2456 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x40CD JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x410F JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x416C JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x410F JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x41F6 DUP5 PUSH2 0x3CEB JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x4264 JUMPI POP PUSH1 0x1 EQ PUSH2 0x421D JUMPI JUMPDEST POP PUSH2 0x421B SWAP3 POP SUB DUP4 PUSH2 0x3A7D JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4248 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x421B SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x420E JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x422F JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x421B SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x420E JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4385 JUMPI JUMPDEST PUSH2 0x42CD JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4366 JUMPI JUMPDEST POP ISZERO PUSH2 0x4339 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x437F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4330 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x42C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x44AB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x44B0 JUMPI JUMPDEST PUSH2 0x44AB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x441A JUMPI JUMPDEST POP PUSH2 0x4417 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x448C JUMPI JUMPDEST POP CODESIZE PUSH2 0x440D JUMP JUMPDEST PUSH2 0x44A5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4485 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x43D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x44E5 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x44DF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x466E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4676 JUMPI JUMPDEST PUSH2 0x466E JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x45CD JUMPI JUMPDEST POP PUSH2 0x459C JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x464F JUMPI JUMPDEST POP CODESIZE PUSH2 0x4590 JUMP JUMPDEST PUSH2 0x4668 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10EC JUMPI PUSH2 0x10DE DUP2 DUP4 PUSH2 0x3A7D JUMP JUMPDEST CODESIZE PUSH2 0x4648 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4581 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x46F2 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x37B9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4756 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B3E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x47C9 JUMPI JUMPDEST DUP2 PUSH2 0x476F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3A7D JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BE1 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x4708 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4762 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB2 PUSH16 0xF95383482AFED2A4D1B37F5F3B248BFD LOG1 PUSH29 0x34803AB1663A3D9C62A3B42F64736F6C634300081E0033000000000000 ","sourceMap":"262:261:155:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;262:261:155;;3668:41:331;;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;262:261:155;1845:10:192;;;;;;262:261:155;1857:3:192;1876:11;;;;;:::i;:::-;262:261:155;;;;;;;;;1898:10:192;;;;;:::i;:::-;262:261:155;1375:21:9;;;:30;1371:125;;262:261:155;1548:33:9;;;;;;;262:261:155;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;262:261:155;;1834:9:192;;1591:58:9;262:261:155;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;262:261:155;5957:19:9;262:261:155;;5957:19:9;262:261:155;;;;;1371:125:9;1455:21;;1428:57;262:261:155;1428:57:9;262:261:155;;;;;;1428:57:9;262:261:155;;;;1756:63:192;1793:26;262:261:155;1793:26:192;262:261:155;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;262:261:155;;-1:-1:-1;4538:25:42;262:261:155;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3668:41:331;;;:::i;:::-;3179:19:352;262:261:155;;;;;;;;2616:14:352;2612:76;;262:261:155;29158:19:327;;262:261:155;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;262:261:155;;12884:11:327;;262:261:155;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;262:261:155;13173:304:327;-1:-1:-1;262:261:155;;;13323:10:327;262:261:155;;;;;;;;;;;2220:8:327;;262:261:155;;;;;;;;;2220:8:327;;262:261:155;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;262:261:155;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;262:261:155;;;;;;;;;;;;;;2220:8:327;13125:27;;;262:261:155;13125:27:327;;262:261:155;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;262:261:155;12987:51:327;;262:261:155;12987:51:327;262:261:155;;;;;;;;;12987:51:327;12919:59;262:261:155;;;;12958:11:327;262:261:155;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;262:261:155;12832:34:327;262:261:155;;;;;;12832:34:327;12715:64;12748:31;;262:261:155;12748:31:327;262:261:155;;;;12748:31:327;12409:58;12438:29;262:261:155;12438:29:327;262:261:155;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;262:261:155;;;;;;;;;;;;;:::i;:::-;;3668:41:331;;;:::i;:::-;262:261:155;;;;;;;;3205:23:42;;;3201:60;;262:261:155;;;3275:25:42;;;;3271:146;;262:261:155;3271:146:42;2220:8:327;;;;;;;;3361:45:42;262:261:155;3361:45:42;;262:261:155;;;;;;;;:::i;:::-;29158:19:327;262:261:155;3668:41:331;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;262:261:155;;25879:11:327;;262:261:155;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;262:261:155;26179:110:327;-1:-1:-1;262:261:155;26238:10:327;262:261:155;;;-1:-1:-1;262:261:155;;;;;2220:8:327;;262:261:155;;;25601:3:327;25638:11;;;;;:::i;:::-;262:261:155;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;262:261:155;;;;;;;;;;2414:66:327;262:261:155;;;2220:8:327;262:261:155;26123:35:327;;;;;262:261:155;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;262:261:155;25982:51:327;;262:261:155;25982:51:327;262:261:155;;;;;;;;;25982:51:327;25914:59;262:261:155;;;;25953:11:327;262:261:155;;;;;;;;;;;25943:30:327;;25914:59;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;262:261:155;-1:-1:-1;262:261:155;28718:11:327;262:261:155;;;;-1:-1:-1;262:261:155;28718:28:327;262:261:155;-1:-1:-1;262:261:155;;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;262:261:155;;;;;;;;;;;;;;;;;;;;;;713:6:351;262:261:155;;;;;;;;;;;;;;;;;;:::i;:::-;3668:41:331;;:::i;:::-;5148:19:42;262:261:155;;;;;;;4503:26:42;;;4499:64;;4464:19:41;262:261:155;;;;;;;;;;;;;-1:-1:-1;262:261:155;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;1880:140:41;;262:261:155;1880:140:41;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;262:261:155;;;;1973:36:41;;;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;262:261:155;;;1453:39:302;1863:70:327;262:261:155;1453:39:302;:::i;:::-;;262:261:155;3364:23:341;262:261:155;;;;3364:64:341;;;;;262:261:155;3364:64:341;;1603:4:302;262:261:155;3364:64:341;;262:261:155;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;262:261:155;3364:64:341;;;262:261:155;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;262:261:155;;;;;;;;;;;3364:64:341;262:261:155;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;262:261:155;;;3668:41:331;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;262:261:155;3852:94:192;;262:261:155;3972:10:192;;;;;;262:261:155;3984:3:192;262:261:155;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;262:261:155;;;;4058:76:192;;4108:25;262:261:155;4058:76:192;;262:261:155;4058:76:192;;;;;;;;;;;;262:261:155;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;262:261:155;4239:12:192;;;;;;:::i;:::-;262:261:155;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;262:261:155;4239:70:192;;;;;;;262:261:155;;;;;;;4239:70:192;;;;;262:261:155;4239:70:192;;4277:4;262:261:155;4239:70:192;;262:261:155;;4058:76:192;262:261:155;;;;;;;4239:70:192;;;;;;;262:261:155;4239:70:192;;;3984:3;;262:261:155;3961:9:192;;4239:70;262:261:155;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;262:261:155;4161:50:192;262:261:155;;4058:76:192;262:261:155;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3668:41:331;;;;;:::i;:::-;3179:19:352;262:261:155;;;;;;;;2616:14:352;2612:76;;262:261:155;29158:19:327;;11217:7;1863:70;;;;262:261:155;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;262:261:155;11235:101:327;11271:54;262:261:155;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;262:261:155;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;262:261:155;;3668:41:331;;;:::i;:::-;262:261:155;;;6339:18:327;;;;6335:63;;262:261:155;6463:42:327;6408:19;262:261:155;-1:-1:-1;262:261:155;6408:11:327;262:261:155;;;-1:-1:-1;262:261:155;;-1:-1:-1;262:261:155;;;;-1:-1:-1;262:261:155;;;;;;;;;;;;;;;;6463:42:327;262:261:155;6335:63:327;6366:32;;262:261:155;6366:32:327;262:261:155;;;;6366:32:327;1500:115:305;2931:8:352;668:81;262:261:155;2931:8:352;:::i;:::-;1500:115:305;;262:261:155;;;;;;;;;;;;;2991:23:341;262:261:155;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;262:261:155;3668:41:331;;:::i;:::-;1368:12:300;;:::i;:::-;262:261:155;1062:8:300;;;;:::i;:::-;262:261:155;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;262:261:155;;1062:8:300;;;;;;;;;;;262:261:155;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;262:261:155;17882:10:327;;;;;;262:261:155;17894:3:327;17920:13;17935:11;262:261:155;17920:13:327;262:261:155;17920:13:327;;;:::i;:::-;262:261:155;;17935:11:327;;;;:::i;:::-;262:261:155;17935:11:327;;;:::i;:::-;262:261:155;17871:9:327;;1062:8:300;262:261:155;;;;;;;;;1062:8:300;;;;;;;;;;262:261:155;;;;;;;;;;;;;2688:13:341;262:261:155;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;262:261:155;-1:-1:-1;262:261:155;;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;262:261:155;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3668:41:331;;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;2976:19:351;262:261:155;;;;;1732:22:351;1728:93;;262:261:155;;2220:8:327;;;;;;;262:261:155;;;1728:93:351;1777:33;262:261:155;1777:33:351;262:261:155;;1777:33:351;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3668:41:331;;:::i;:::-;262:261:155;;;;;;;;;;;;;-1:-1:-1;262:261:155;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;3741:25:41;3737:66;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;262:261:155;;;;2455:33:41;262:261:155;3737:66:41;262:261:155;3775:28:41;;;262:261:155;3775:28:41;262:261:155;;;;;;;3775:28:41;262:261:155;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;262:261:155;3668:41:331;;:::i;1586:12:303:-;15560:7:327;1863:70;;262:261:155;;3668:41:331;;;:::i;:::-;262:261:155;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;262:261:155;15578:107:327;262:261:155;;;;;;;;;29832:65:327;;;;;262:261:155;29832:65:327;;262:261:155;;29832:65:327;;262:261:155;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;262:261:155;29832:65:327;;;;;;;;262:261:155;29832:65:327;;;15578:107;262:261:155;;;;;29832:84:327;29828:136;;262:261:155;29828:136:327;29925:39;262:261:155;29925:39:327;262:261:155;;;;;;29925:39:327;29832:65;262:261:155;29832:65:327;;262:261:155;29832:65:327;;;;;;262:261:155;29832:65:327;;;:::i;:::-;;;262:261:155;;;;;;;;;;;;;29832:65:327;262:261:155;29832:65:327;;262:261:155;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;262:261:155;3668:41:331;;:::i;:::-;262:261:155;;;;;;;;;;;;;30700:19:327;;;24121:64;;262:261:155;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;262:261:155;;;;;;;;;;2414:66:327;262:261:155;;;2220:8:327;262:261:155;;;24633:10:327;262:261:155;;;;;;;;;2220:8:327;;24674:35;;;;262:261:155;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;262:261:155;24402:51:327;;;262:261:155;24402:51:327;262:261:155;;;;;;;;;24402:51:327;24334:59;262:261:155;;;;24373:11:327;262:261:155;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;262:261:155;24234:34:327;262:261:155;;;;;;24234:34:327;24121:64;24154:31;;262:261:155;24154:31:327;262:261:155;;;;24154:31:327;262:261:155;;;;;;;:::i;:::-;5148:19:42;;;;262:261:155;;;3668:41:331;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;262:261:155;2776:90:192;;262:261:155;2892:10:192;;;;;;262:261:155;2904:3:192;2923:9;;;;;:::i;:::-;262:261:155;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;262:261:155;;;1328:43:8;;;;;;262:261:155;;;;1328:43:8;;;262:261:155;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;262:261:155;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;262:261:155;;2881:9:192;;8938:146:8;9033:40;262:261:155;9033:40:8;262:261:155;;1328:43:8;262:261:155;9033:40:8;8942:68;262:261:155;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;262:261:155;;-1:-1:-1;262:261:155;26801:10:327;262:261:155;;;;-1:-1:-1;262:261:155;;;;;;;;26724:60:327;26756:28;262:261:155;26756:28:327;262:261:155;;26756:28:327;262:261:155;;;;;;;;;;;;3395:39:305;262:261:155;;;3395:39:305;:::i;:::-;262:261:155;;;;;;;;;;;;;;;;;;;;;;;3668:41:331;;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;2976:19:351;262:261:155;1281:36:351;713:6;1281:36;;1277:119;;262:261:155;;;;;;;;;;;;;;;1277:119:351;1340:45;262:261:155;1340:45:351;262:261:155;;;;1340:45:351;262:261:155;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;1956:12:303;262:261:155;3668:41:331;;:::i;1956:12:303:-;262:261:155;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;262:261:155;;16512:9:327;262:261:155;16523:10:327;;;;;;16821:14;;;-1:-1:-1;262:261:155;16821:10:327;262:261:155;;;-1:-1:-1;262:261:155;;;;;2220:8:327;;262:261:155;;;16535:3:327;16572:11;;;;:::i;:::-;262:261:155;;;;;;;;;;;;;16597:72:327;;262:261:155;;;;;;;;;;;;;2220:8:327;16743:33;262:261:155;16743:33:327;;;;262:261:155;16512:9:327;;16597:72;16641:28;262:261:155;16641:28:327;262:261:155;;;;16641:28:327;16400:54;16429:25;262:261:155;16429:25:327;262:261:155;;16429:25:327;262:261:155;;;;;;;:::i;:::-;3668:41:331;;:::i;:::-;3179:19:352;262:261:155;;;;;;;;2616:14:352;2612:76;;262:261:155;29158:19:327;;9668:7;1863:70;;;;262:261:155;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;262:261:155;9686:99:327;9722:52;262:261:155;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;262:261:155;;;;;;;;;;;1287:7:303;262:261:155;;:::i;:::-;1232:12:303;262:261:155;3668:41:331;;:::i;1232:12:303:-;262:261:155;;;;1287:7:303;:::i;262:261:155:-;;;;;;;;;;;;3903:39:331;;:::i;:::-;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3668:41:331;;:::i;:::-;5148:19:42;262:261:155;;;;;;;4503:26:42;;;4499:64;;4464:19:41;262:261:155;;;;;;;;;;;;;-1:-1:-1;262:261:155;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;1254:25:41;1250:140;;262:261:155;1250:140:41;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;262:261:155;;;;1343:36:41;262:261:155;;;;;;;;;;;;;;;;941:19:75;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;262:261:155;2499:377:351;;;2559:17;;262:261:155;;2499:377:351;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;262:261:155;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;262:261:155;2499:377:351;;2607:259;713:6;2794:57;262:261:155;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;262:261:155;;;;2134:7:305;262:261:155;;;:::i;:::-;3668:41:331;;;:::i;:::-;262:261:155;;;;;;;;2616:14:352;2612:76;;262:261:155;29158:19:327;;262:261:155;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;3668:41:331;;;:::i;:::-;262:261:155;;;;;4503:26:42;;;4499:64;;3179:19:352;262:261:155;;;;2220:8:327;;;;;;;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3668:41:331;;:::i;:::-;262:261:155;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;262:261:155;2220:8:327;262:261:155;;;;1645:152:42;;262:261:155;-1:-1:-1;;262:261:155;;500:10:59;;262:261:155;;1124:1:42;262:261:155;;;;;;;;;500:10:59;262:261:155;;;;;;;;500:10:59;262:261:155;;;;;;;;500:10:59;262:261:155;;;;;;;;500:10:59;262:261:155;;;;;;;;500:10:59;262:261:155;;;;;;;;500:10:59;262:261:155;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;262:261:155;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;262:261:155;2220:8:327;262:261:155;583:77:341;;;;;;;;;;:::i;:::-;;;;;;262:261:155;583:77:341;262:261:155;583:77:341;;;;;;;;262:261:155;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;262:261:155;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;262:261:155;583:77:341;;;;;;;;;;;262:261:155;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;262:261:155;2196:23:341;262:261:155;;2220:8:327;;;;;;;262:261:155;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;262:261:155;2220:8:327;1124:1:42;262:261:155;2220:8:327;262:261:155;2220:8:327;;;;;;;262:261:155;;;896:88:181;930:54;262:261:155;930:54:181;262:261:155;;1124:1:42;262:261:155;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;262:261:155;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;262:261:155;583:77:341;;;;;;;;;;262:261:155;583:77:341;;;;;;;;;;;;;;;;;;;;;262:261:155;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;262:261:155;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;262:261:155;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;262:261:155;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;262:261:155;583:77:341;262:261:155;;583:77:341;;;;;;;;;262:261:155;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;262:261:155;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;262:261:155;1740:46:42;;;;1645:152;;;;262:261:155;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;262:261:155;29158:19:327;262:261:155;3668:41:331;;:::i;:::-;262:261:155;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;262:261:155;5670:35:327;;262:261:155;5157:173:327;262:261:155;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;262:261:155;;;;;5620:11:327;262:261:155;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;262:261:155;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;262:261:155;5052:59:327;;;262:261:155;5052:59:327;262:261:155;;;;;;;;;5052:59:327;4927:63;4958:32;;262:261:155;4958:32:327;262:261:155;;;;4958:32:327;4802:64;4835:31;;262:261:155;4835:31:327;262:261:155;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;262:261:155;2931:8:352;:::i;:::-;1064:117:305;;;262:261:155;;;;;;;;;;;;3579:43:305;262:261:155;;;3579:43:305;:::i;262:261:155:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;262:261:155;1793:19:59;262:261:155;635:65:55;:::i;262:261:155:-;;;;;;;;-1:-1:-1;;262:261:155;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;262:261:155;1146:19:75;262:261:155;1146:53:75;;;1142:96;;262:261:155;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;262:261:155;1215:12:75;:::o;262:261:155:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;262:261:155;;;;;;:::o;1359:340:59:-;;262:261:155;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;262:261:155;500:10:59;;;;;262:261:155;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;262:261:155;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;262:261:155;;;28073:11:327;262:261:155;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;262:261:155;;7507:16:327;;;7503:58;;262:261:155;7521:1:327;262:261:155;;;;;7521:1:327;262:261:155;;;;;30700:19:327;;;7615:64;;262:261:155;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;262:261:155;;;7521:1:327;262:261:155;;;;;;7521:1:327;262:261:155;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;262:261:155;-1:-1:-1;262:261:155;;;;;-1:-1:-1;262:261:155;;;;;2220:8:327;;262:261:155;-1:-1:-1;262:261:155;;;;-1:-1:-1;262:261:155;8155:10:327;262:261:155;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;262:261:155;7896:51:327;;;7521:1;7896:51;262:261:155;7896:51:327;262:261:155;;;;;;7521:1:327;7896:51;7828:59;262:261:155;;7521:1:327;262:261:155;7867:11:327;;;262:261:155;;;;7521:1:327;262:261:155;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;262:261:155;;;;7521:1:327;7728:34;262:261:155;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;262:261:155;-1:-1:-1;262:261:155;;;;-1:-1:-1;262:261:155;;;;-1:-1:-1;262:261:155;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;262:261:155;3775:28:41;;-1:-1:-1;3775:28:41;262:261:155;3775:28:41;262:261:155;;;;;-1:-1:-1;3775:28:41;14035:460:327;;262:261:155;;14119:16:327;;;14115:54;;262:261:155;14133:1:327;262:261:155;;;;;;14133:1:327;262:261:155;;;14179:72:327;;14415:10;262:261:155;;14133:1:327;262:261:155;;;;;;14133:1:327;262:261:155;2220:8:327;262:261:155;-1:-1:-1;262:261:155;14415:10:327;262:261:155;;;-1:-1:-1;262:261:155;14415:10:327;262:261:155;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;262:261:155;;14133:1:327;14223:28;262:261:155;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;262:261:155;-1:-1:-1;262:261:155;;;;;-1:-1:-1;262:261:155;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;262:261:155;;-1:-1:-1;27324:31:327;262:261:155;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;262:261:155;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;262:261:155;-1:-1:-1;583:77:341;262:261:155;-1:-1:-1;262:261:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;262:261:155;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;262:261:155;;;3613:51:352;262:261:155;;3613:51:352;;;;262:261:155;3613:51:352;;3648:4;3613:51;;;262:261:155;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;262:261:155;;-1:-1:-1;3691:28:352;3613:51;;;;262:261:155;3613:51:352;262:261:155;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;262:261:155;1029:19:76;262:261:155;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;262:261:155;;;1676:74:76;;262:261:155;;;1676:74:76;;;262:261:155;1327:10:76;262:261:155;;;;1744:4:76;262:261:155;;;;;-1:-1:-1;1676:74:76;;262:261:155;;;;;;1676:74:76;;;;;;;262:261:155;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;262:261:155;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;262:261:155;;-1:-1:-1;262:261:155;30435:11:327;262:261:155;;;;-1:-1:-1;262:261:155;30435:27:327;262:261:155;-1:-1:-1;262:261:155;;;500:10:59;262:261:155;-1:-1:-1;262:261:155;500:10:59;;30413:49:327;;;;;1938:939:76;262:261:155;2065:19:76;262:261:155;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;262:261:155;720:8:80;262:261:155;720:8:80;;262:261:155;;;;2115:1:76;2802:32;;:::o;2624:153::-;262:261:155;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;262:261:155;2361:10:76;262:261:155;;;;2771:4:76;262:261:155;;;;;-1:-1:-1;2682:95:76;;262:261:155;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;262:261:155;29701:270:327;262:261:155;29701:270:327;262:261:155;29701:270:327;;;;;262:261:155;;;;;29832:65:327;;;;;262:261:155;29832:65:327;;262:261:155;29832:65:327;;;262:261:155;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;262:261:155;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;262:261:155;29832:65:327;;262:261:155;29832:65:327;;;;;;262:261:155;29832:65:327;;;:::i;:::-;;;262:261:155;;;;;;;;;;;;;29832:65:327;262:261:155;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3687800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"870","ROYALTY_FEE_DENOMINATOR()":"914","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2773","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2983","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3311","isTrustedForwarder(address)":"infinite","metadataResolver()":"2847","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2891","owner()":"2737","ownerOf(uint256)":"2731","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol\":\"ERC721FullBurnProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullBurnProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721FullBurnProxied} from \\\"./../../../../../token/ERC721/preset/proxied/ERC721FullBurnProxied.sol\\\";\\n\\ncontract ERC721FullBurnProxiedMock is ERC721FullBurnProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullBurnProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4cd60a0642c5df10518a06b5e54423bce56889a6acf6cb90df23e401bb39acbb\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../../base/ERC721MintableBase.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../../base/ERC721DeliverableBase.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../../base/ERC721BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullBurnProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableBase,\\n    ERC721DeliverableBase,\\n    ERC721BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC721Storage.initERC721Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8783de6ebd00ad7e9a3d6bf78b1d88891eed5260e812d800dad8cd8eefeea1ed\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol":{"ERC721FullMintOnceBurnProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f614b0f38819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f57608052604051614a74908161009b8239608051818181612a5201528181613d510152818161461301526147be0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461392757806306fdde03146138cc578063081812fc1461386f578063095ea7b3146135db5780630e07f85414612cf8578063114ba8ee14612c1157806323b872dd14612b695780632a55205a14612a765780632b4c9f1614612a075780632f2ff15d1461287b57806331e66e1e146127f857806340c10f191461276857806342842e0e146126985780634684d7e9146124d4578063572b6c051461248957806361ba27da1461236d5780636352211e146122f257806370a082311461222857806373c8a9581461207857806379cc679014611dda5780638832e6e314611b8c5780638bb9c5bf14611a1d5780638da5cb5b146119ac5780638dc251e31461187f57806391d14854146117e757806395d89b41146117785780639da5e832146114f7578063a0c76f6214611486578063a22cb46514611326578063b0ccc31e146112b5578063b88d4fde14611193578063c3666c3614610f56578063c77c695514610ecb578063c87b56dd14610d18578063d539139314610cbf578063d547741f14610b36578063e1a8bf2c14610afa578063e985e9c514610a46578063f247296514610821578063f2fde38b1461072d578063f3993d11146103a75763f7ba94bd146101ea57600080fd5b3461034b576101f836613c29565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102396145fc565b925416911690810361037a57508181036103505760005b81811061025957005b610264818387614406565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034b5761028e828587614406565b359081471061031957600080809381935af13d15610311573d906102b182613d99565b916102bf6040519384613c95565b82523d6000602084013e5b156102d85750600101610250565b8051156102e757602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102ca565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576103de613a14565b6103e6613a37565b9060443567ffffffffffffffff811161034b57610407903690600401613afa565b926104106145fc565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361071d575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106f3576104b58382849694614727565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061053857878787818114158061052f575b6104ed57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104e7565b610543818986614406565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106c557880361069357846105bc575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104d3565b7401000000000000000000000000000000000000000016158015610630575b6105e5578961057b565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105db565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61072691614511565b8582610467565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610764613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078e6145fc565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361037a575073ffffffffffffffffffffffffffffffffffffffff16918282036107d257005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461034b5761082f36613b2b565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161085a6145fc565b92610866848483614727565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108cb5786868161089457005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108d6818886614406565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106c5578803610693578661096f575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610884565b74010000000000000000000000000000000000000000161580156109e3575b610998578861090e565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8416141561098e565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610a7d613a14565b73ffffffffffffffffffffffffffffffffffffffff610a9a613a37565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576020604051620186a08152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57600435610b70613a37565b610b786145fc565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361037a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c2a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e0a6000600435610d79817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06143ab565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ebf57600091610e37575b60405160208082528190610e33908201856139d1565b0390f35b3d8083833e610e468183613c95565b810190602081830312610eb75780519067ffffffffffffffff8211610ebb570181601f82011215610eb757805192610e7d84613d99565b92610e8b6040519485613c95565b84845260208584010111610eb45750610e3392610eae91602080850191016139ae565b90610e1d565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034b57610f6436613b9a565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610fa96145fc565b925416911690810361037a5750808214801590611189575b6103505760005b828110610fd157005b73ffffffffffffffffffffffffffffffffffffffff610ff9610ff483858a614406565b614416565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ebf5760009161115b575b501561112e575073ffffffffffffffffffffffffffffffffffffffff611088610ff483858a614406565b1690611098610ff4828689614406565b916110a482878b614406565b3592813b1561034b57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ebf5760019261111d575b5001610fc8565b600061112891613c95565b88611116565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61117c915060203d8111611182575b6111748183613c95565b810190614437565b8961105e565b503d61116a565b5082821415610fc1565b3461034b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576111ca613a14565b6111d2613a37565b60443560643567ffffffffffffffff811161034b576111f5903690600401613a5a565b9290936112006145fc565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036112a5575b5050611286848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b823b61128e57005b6112a39561129d913691613dd3565b936148ed565b005b6112ae91614511565b8685611257565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761135d613a14565b602435908115159182810361034b57611457575b73ffffffffffffffffffffffffffffffffffffffff8061138f6145fc565b169116918183146114295760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611481817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614511565b611371565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461034b5761150536613c29565b91929161153a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b9061418f565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361156581613cd6565b936115736040519586613c95565b818552602085019160051b81019036821161034b57915b81831061174b57505050906115a0913691613cee565b9181519280518403610350577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115db57005b73ffffffffffffffffffffffffffffffffffffffff6115fa8284614368565b511680156117215761160c8285614368565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116f3577fdead000000000000000000000000000000000000000000000000000000000000146116c55790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115d2565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff8116810361034b5781526020928301920161158a565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e336117d37f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a561444f565b6040519182916020835260208301906139d1565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761181e613a37565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576118b6613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118f56145fc565b925416911690810361037a57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119825773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a786145fc565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b445760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610cba565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461034b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57611bc3613a14565b6024359060443567ffffffffffffffff811161034b57611be7903690600401613a5a565b91611c147fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b611c548482611c4e7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c466145fc565b973691613dd3565b94614251565b803b611c5c57005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cc960405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906139d1565b03816000865af1908115610ebf57600091611d5b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2b57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dd2575b81611d7460209383613c95565b81010312611dce5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eb457507fffffffff00000000000000000000000000000000000000000000000000000000611cdf565b5080fd5b3d9150611d67565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57611e11613a14565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e3e6145fc565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561204a5773ffffffffffffffffffffffffffffffffffffffff81168095036120185782611e939185614727565b15611f41575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611fb5575b611f6a5780611e99565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f60565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5761208636613b9a565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120c96145fc565b925416911690810361037a575080841480159061221e575b6103505760005b8481106120f157005b6120fc818388614406565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361034b57600060209161212f610ff4868b8e614406565b826121996121c5612141898d8d614406565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613c95565b51925af115610ebf576000513d6122155750803b155b6121e857506001016120e8565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121db565b50828414156120e1565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761225f613a14565b73ffffffffffffffffffffffffffffffffffffffff8116156122c85773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602061234f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06143ab565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123de6145fc565b925416911690810361037a57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245c57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760206124ca6124c5613a14565b613d3a565b6040519015158152f35b3461034b5761255373ffffffffffffffffffffffffffffffffffffffff6124fa36613b2b565b9291939061252a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613cee565b92169081156117215782519260005b8481106125a3575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125ad8183614368565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661266a577fdead0000000000000000000000000000000000000000000000000000000000001461263d57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612562565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b576126a636613a88565b6126ae6145fc565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612758575b5050612734828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b803b61273c57005b6112a3936040519361274f602086613c95565b600085526148ed565b61276191614511565b8483612705565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576112a36127a2613a14565b6127ce7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0614251565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760406128316147a7565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004356128b5613a37565b6128bd6145fc565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361037a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561297057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610cba565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612b61575b15612b2b575050610e3360005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e3391620186a0821015612b4e57612b4890620186a09261414d565b04612afb565b620186a0612b5c920461414d565b612afb565b508115612aee565b3461034b576112a3612b7a36613a88565b91612b836145fc565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612c01575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b612c0a91614511565b8581612bd9565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57612c48613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c876145fc565b925416911690810361037a575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461034b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760043567ffffffffffffffff811161034b57612d47903690600401613a5a565b60243567ffffffffffffffff811161034b57612d67903690600401613a5a565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361034b576064359373ffffffffffffffffffffffffffffffffffffffff8516850361034b577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612dd56145fc565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561329a575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081613586575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4939181101561329a575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116134575781906130868454613f03565b601f8111613533575b50600090601f831160011461349157600092613486575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111613457576131117f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613f03565b601f81116133d3575b506000601f82116001146132d757819293946000926132cc575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d54600181101561329a575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480613134565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106133bb575083600195969710613383575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555613186565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080613356565b90926020600181928686013581550194019101613342565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061344d575b601f0160051c01905b818110613441575061311a565b60008155600101613434565b909150819061342b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806130a6565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061351b57509084600195949392106134e3575b505050811b0190556130d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558780806134d6565b919360206001819287870135815501950192016134c0565b909150836000526020600020601f840160051c8101916020851061357c575b90601f859493920160051c01905b81811061356d575061308f565b60008155849350600101613560565b9091508190613552565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612e42565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57613612613a14565b6024359073ffffffffffffffffffffffffffffffffffffffff811690811590811561383f575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136626145fc565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415613811578486146137e3576136a2818686614727565b156137975750156137065774010000000000000000000000000000000000000000166136f2575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836136c9565b90740100000000000000000000000000000000000000008217809203613783575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556136cb565b846000526020526040600020558380613727565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613869907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614511565b83613638565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602061234f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613e94565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e336117d37f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a461444f565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361034b576124ca6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613e0a565b60005b8381106139c15750506000910152565b81810151838201526020016139b1565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613a0d815180928187528780880191016139ae565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034b57565b9181601f8401121561034b5782359167ffffffffffffffff831161034b576020838186019501011161034b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261034b5760043573ffffffffffffffffffffffffffffffffffffffff8116810361034b579060243573ffffffffffffffffffffffffffffffffffffffff8116810361034b579060443590565b9181601f8401121561034b5782359167ffffffffffffffff831161034b576020808501948460051b01011161034b57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261034b5760043573ffffffffffffffffffffffffffffffffffffffff8116810361034b57916024359067ffffffffffffffff821161034b57613b9691600401613afa565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261034b5760043567ffffffffffffffff811161034b5781613be391600401613afa565b9290929160243567ffffffffffffffff811161034b5781613c0691600401613afa565b929092916044359067ffffffffffffffff821161034b57613b9691600401613afa565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261034b5760043567ffffffffffffffff811161034b5781613c7291600401613afa565b929092916024359067ffffffffffffffff821161034b57613b9691600401613afa565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761345757604052565b67ffffffffffffffff81116134575760051b60200190565b929190613cfa81613cd6565b93613d086040519586613c95565b602085838152019160051b810192831161034b57905b828210613d2a57505050565b8135815260209182019101613d1e565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613d925773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161345757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613ddf82613d99565b91613ded6040519384613c95565b82948184528183011161034b578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613d92577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613e8d5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106c557740100000000000000000000000000000000000000001615613d92576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613f4c575b6020831014613f1d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613f12565b909273ffffffffffffffffffffffffffffffffffffffff169283156106f357846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156138115773ffffffffffffffffffffffffffffffffffffffff811680950361411b5782613fca9185614727565b15614060575b5050836000528060205282604060002055828203614011575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613fe9565b74010000000000000000000000000000000000000000161580156140d5575b6140895780613fd0565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8216141561407f565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561416057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156141e95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561172157826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811661433a577fdead0000000000000000000000000000000000000000000000000000000000001461430c57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561437c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156143d9575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561437c5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361034b5790565b9081602091031261034b5751801515810361034b5790565b906040519182600082549261446384613f03565b80845293600181169081156144d1575060011461448a575b5061448892500383613c95565b565b90506000929192526020600020906000915b8183106144b5575050906020614488928201013861447b565b602091935080600191548385890101520191019091849261449c565b602093506144889592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861447b565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806145f2575b61453a575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ebf576000916145d3575b50156145a65750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6145ec915060203d602011611182576111748183613c95565b3861459d565b50813b1515614532565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561471857323314801561471d575b614718577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115614687575b5061468457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ebf576000916146f9575b503861467a565b614712915060203d602011611182576111748183613c95565b386146f2565b503390565b5060183610614643565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614752575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061474c565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156148db5732331480156148e3575b6148db5780331490811561483a575b50614809576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161034b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ebf576000916148bc575b50386147fd565b6148d5915060203d602011611182576111748183613c95565b386148b5565b506000903690565b50601836106147ee565b73ffffffffffffffffffffffffffffffffffffffff9061495f826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906139d1565b03816000865af1908115610ebf576000916149c3575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2b575050565b6020813d602011614a36575b816149dc60209383613c95565b81010312611dce5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eb457507fffffffff00000000000000000000000000000000000000000000000000000000614975565b3d91506149cf56fea2646970667358221220f6116f7c0511610c9644b036eb2a9296af0341cc7edfab5e2ef45f87407f92ed64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x4B0F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4A74 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2A52 ADD MSTORE DUP2 DUP2 PUSH2 0x3D51 ADD MSTORE DUP2 DUP2 PUSH2 0x4613 ADD MSTORE PUSH2 0x47BE ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3927 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x38CC JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x386F JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x35DB JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2CF8 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2C11 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2B69 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2A76 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2A07 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x287B JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x27F8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2768 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2698 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24D4 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2489 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x236D JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22F2 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2228 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x2078 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DDA JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B8C JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A1D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19AC JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x187F JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17E7 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1778 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14F7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1486 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1326 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12B5 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1193 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF56 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xECB JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD18 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCBF JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB36 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAFA JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA46 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x821 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x72D JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x3A7 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x1F8 CALLDATASIZE PUSH2 0x3C29 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x239 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP2 DUP2 SUB PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x259 JUMPI STOP JUMPDEST PUSH2 0x264 DUP2 DUP4 DUP8 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x34B JUMPI PUSH2 0x28E DUP3 DUP6 DUP8 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x319 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x311 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2B1 DUP3 PUSH2 0x3D99 JUMP JUMPDEST SWAP2 PUSH2 0x2BF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C95 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2D8 JUMPI POP PUSH1 0x1 ADD PUSH2 0x250 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2CA JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x3DE PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x3E6 PUSH2 0x3A37 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x407 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 PUSH2 0x410 PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x71D JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6F3 JUMPI PUSH2 0x4B5 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4727 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x538 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x52F JUMPI JUMPDEST PUSH2 0x4ED JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x543 DUP2 DUP10 DUP7 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6C5 JUMPI DUP9 SUB PUSH2 0x693 JUMPI DUP5 PUSH2 0x5BC JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4D3 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x630 JUMPI JUMPDEST PUSH2 0x5E5 JUMPI DUP10 PUSH2 0x57B JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5DB JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x726 SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x467 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x764 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x78E PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7D2 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x82F CALLDATASIZE PUSH2 0x3B2B JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x85A PUSH2 0x45FC JUMP JUMPDEST SWAP3 PUSH2 0x866 DUP5 DUP5 DUP4 PUSH2 0x4727 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8CB JUMPI DUP7 DUP7 DUP2 PUSH2 0x894 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8D6 DUP2 DUP9 DUP7 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6C5 JUMPI DUP9 SUB PUSH2 0x693 JUMPI DUP7 PUSH2 0x96F JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x884 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9E3 JUMPI JUMPDEST PUSH2 0x998 JUMPI DUP9 PUSH2 0x90E JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x98E JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xA7D PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9A PUSH2 0x3A37 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB70 PUSH2 0x3A37 JUMP JUMPDEST PUSH2 0xB78 PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC2A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE0A PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD79 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x43AB JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE37 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE33 SWAP1 DUP3 ADD DUP6 PUSH2 0x39D1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE46 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEB7 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEBB JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEB7 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE7D DUP5 PUSH2 0x3D99 JUMP JUMPDEST SWAP3 PUSH2 0xE8B PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3C95 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEB4 JUMPI POP PUSH2 0xE33 SWAP3 PUSH2 0xEAE SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x39AE JUMP JUMPDEST SWAP1 PUSH2 0xE1D JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0xF64 CALLDATASIZE PUSH2 0x3B9A JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFA9 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1189 JUMPI JUMPDEST PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFD1 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFF9 PUSH2 0xFF4 DUP4 DUP6 DUP11 PUSH2 0x4406 JUMP JUMPDEST PUSH2 0x4416 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x115B JUMPI JUMPDEST POP ISZERO PUSH2 0x112E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1088 PUSH2 0xFF4 DUP4 DUP6 DUP11 PUSH2 0x4406 JUMP JUMPDEST AND SWAP1 PUSH2 0x1098 PUSH2 0xFF4 DUP3 DUP7 DUP10 PUSH2 0x4406 JUMP JUMPDEST SWAP2 PUSH2 0x10A4 DUP3 DUP8 DUP12 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x34B JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x1 SWAP3 PUSH2 0x111D JUMPI JUMPDEST POP ADD PUSH2 0xFC8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1128 SWAP2 PUSH2 0x3C95 JUMP JUMPDEST DUP9 PUSH2 0x1116 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x117C SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1182 JUMPI JUMPDEST PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4437 JUMP JUMPDEST DUP10 PUSH2 0x105E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x116A JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFC1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x11CA PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x11D2 PUSH2 0x3A37 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x11F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x1200 PUSH2 0x45FC JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x12A5 JUMPI JUMPDEST POP POP PUSH2 0x1286 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x128E JUMPI STOP JUMPDEST PUSH2 0x12A3 SWAP6 PUSH2 0x129D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3DD3 JUMP JUMPDEST SWAP4 PUSH2 0x48ED JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12AE SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x1257 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x135D PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x34B JUMPI PUSH2 0x1457 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x138F PUSH2 0x45FC JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1429 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1481 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4511 JUMP JUMPDEST PUSH2 0x1371 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x1505 CALLDATASIZE PUSH2 0x3C29 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x153A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH2 0x418F JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x1565 DUP2 PUSH2 0x3CD6 JUMP JUMPDEST SWAP4 PUSH2 0x1573 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C95 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x34B JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x174B JUMPI POP POP POP SWAP1 PUSH2 0x15A0 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3CEE JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x350 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15DB JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15FA DUP3 DUP5 PUSH2 0x4368 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1721 JUMPI PUSH2 0x160C DUP3 DUP6 PUSH2 0x4368 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16F3 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16C5 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15D2 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x158A JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE33 PUSH2 0x17D3 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x444F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x181E PUSH2 0x3A37 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x18B6 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18F5 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1982 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A78 PUSH2 0x45FC JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B44 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCBA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x1BC3 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x1BE7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST SWAP2 PUSH2 0x1C14 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH2 0x1C54 DUP5 DUP3 PUSH2 0x1C4E PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C46 PUSH2 0x45FC JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3DD3 JUMP JUMPDEST SWAP5 PUSH2 0x4251 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C5C JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CC9 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D5B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D2B JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DD2 JUMPI JUMPDEST DUP2 PUSH2 0x1D74 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DCE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEB4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CDF JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D67 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x1E11 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E3E PUSH2 0x45FC JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x204A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x2018 JUMPI DUP3 PUSH2 0x1E93 SWAP2 DUP6 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x1F41 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FB5 JUMPI JUMPDEST PUSH2 0x1F6A JUMPI DUP1 PUSH2 0x1E99 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F60 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x2086 CALLDATASIZE PUSH2 0x3B9A JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20C9 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x221E JUMPI JUMPDEST PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20F1 JUMPI STOP JUMPDEST PUSH2 0x20FC DUP2 DUP4 DUP9 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x34B JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x212F PUSH2 0xFF4 DUP7 DUP12 DUP15 PUSH2 0x4406 JUMP JUMPDEST DUP3 PUSH2 0x2199 PUSH2 0x21C5 PUSH2 0x2141 DUP10 DUP14 DUP14 PUSH2 0x4406 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3C95 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2215 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21E8 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20E8 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21DB JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20E1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x225F PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22C8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x234F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x43AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23DE PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x245C JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x24CA PUSH2 0x24C5 PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x3D3A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x2553 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24FA CALLDATASIZE PUSH2 0x3B2B JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x252A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3CEE JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1721 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x25A3 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25AD DUP2 DUP4 PUSH2 0x4368 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x266A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x263D JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2562 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x26A6 CALLDATASIZE PUSH2 0x3A88 JUMP JUMPDEST PUSH2 0x26AE PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2758 JUMPI JUMPDEST POP POP PUSH2 0x2734 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x273C JUMPI STOP JUMPDEST PUSH2 0x12A3 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x274F PUSH1 0x20 DUP7 PUSH2 0x3C95 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x48ED JUMP JUMPDEST PUSH2 0x2761 SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2705 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x12A3 PUSH2 0x27A2 PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x27CE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4251 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x40 PUSH2 0x2831 PUSH2 0x47A7 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x28B5 PUSH2 0x3A37 JUMP JUMPDEST PUSH2 0x28BD PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2970 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCBA JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2B61 JUMPI JUMPDEST ISZERO PUSH2 0x2B2B JUMPI POP POP PUSH2 0xE33 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE33 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2B4E JUMPI PUSH2 0x2B48 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x414D JUMP JUMPDEST DIV PUSH2 0x2AFB JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2B5C SWAP3 DIV PUSH2 0x414D JUMP JUMPDEST PUSH2 0x2AFB JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2AEE JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x12A3 PUSH2 0x2B7A CALLDATASIZE PUSH2 0x3A88 JUMP JUMPDEST SWAP2 PUSH2 0x2B83 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2C01 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST PUSH2 0x2C0A SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2BD9 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x2C48 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C87 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x2D47 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x2D67 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x34B JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x34B JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2DD5 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x3586 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3457 JUMPI DUP2 SWAP1 PUSH2 0x3086 DUP5 SLOAD PUSH2 0x3F03 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3533 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3491 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x3486 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH2 0x3111 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3F03 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x33D3 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x32D7 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x32CC JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x3134 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x33BB JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x3383 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x3186 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x3356 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x3342 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x344D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3441 JUMPI POP PUSH2 0x311A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3434 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x342B JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x30A6 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x351B JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x34E3 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x30D8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x34D6 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x34C0 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x357C JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x356D JUMPI POP PUSH2 0x308F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3560 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3552 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2E42 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x3612 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x383F JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3662 PUSH2 0x45FC JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3811 JUMPI DUP5 DUP7 EQ PUSH2 0x37E3 JUMPI PUSH2 0x36A2 DUP2 DUP7 DUP7 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x3797 JUMPI POP ISZERO PUSH2 0x3706 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x36F2 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x36C9 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x3783 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x36CB JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3727 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3869 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4511 JUMP JUMPDEST DUP4 PUSH2 0x3638 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x234F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3E94 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE33 PUSH2 0x17D3 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x444F JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI PUSH2 0x24CA PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3E0A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x39C1 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x39B1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3A0D DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x39AE JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x34B JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x34B JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x34B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x34B JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x34B JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x34B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x34B JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x34B JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3BE3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3C06 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3C72 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3457 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3CFA DUP2 PUSH2 0x3CD6 JUMP JUMPDEST SWAP4 PUSH2 0x3D08 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C95 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x34B JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3D2A JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D1E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3D92 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3DDF DUP3 PUSH2 0x3D99 JUMP JUMPDEST SWAP2 PUSH2 0x3DED PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C95 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x34B JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3D92 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3E8D JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6C5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3D92 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3F4C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3F1D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3F12 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6F3 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3811 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x411B JUMPI DUP3 PUSH2 0x3FCA SWAP2 DUP6 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x4060 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x4011 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3FE9 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x40D5 JUMPI JUMPDEST PUSH2 0x4089 JUMPI DUP1 PUSH2 0x3FD0 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x407F JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x4160 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x41E9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1721 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x433A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x430C JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x437C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x43D9 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x437C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x34B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x34B JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x4463 DUP5 PUSH2 0x3F03 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x44D1 JUMPI POP PUSH1 0x1 EQ PUSH2 0x448A JUMPI JUMPDEST POP PUSH2 0x4488 SWAP3 POP SUB DUP4 PUSH2 0x3C95 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x44B5 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x4488 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x447B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x449C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x4488 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x447B JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x45F2 JUMPI JUMPDEST PUSH2 0x453A JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x45D3 JUMPI JUMPDEST POP ISZERO PUSH2 0x45A6 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x45EC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x459D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4532 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4718 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x471D JUMPI JUMPDEST PUSH2 0x4718 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4687 JUMPI JUMPDEST POP PUSH2 0x4684 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x46F9 JUMPI JUMPDEST POP CODESIZE PUSH2 0x467A JUMP JUMPDEST PUSH2 0x4712 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x46F2 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4643 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4752 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x474C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x48DB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x48E3 JUMPI JUMPDEST PUSH2 0x48DB JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x483A JUMPI JUMPDEST POP PUSH2 0x4809 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x34B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x48BC JUMPI JUMPDEST POP CODESIZE PUSH2 0x47FD JUMP JUMPDEST PUSH2 0x48D5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x48B5 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x47EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x495F DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x49C3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D2B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4A36 JUMPI JUMPDEST DUP2 PUSH2 0x49DC PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DCE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEB4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x4975 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x49CF JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF6 GT PUSH16 0x7C0511610C9644B036EB2A9296AF0341 0xCC PUSH31 0xDFAB5E2EF45F87407F92ED64736F6C634300081E0033000000000000000000 ","sourceMap":"278:285:156:-:0;;;;;;;;;;;;;-1:-1:-1;;278:285:156;;;;-1:-1:-1;;;;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;278:285:156;;;;;;745:39:76;;278:285:156;;;;;;;;745:39:76;278:285:156;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;278:285:156;;;;;;-1:-1:-1;278:285:156;;;;;-1:-1:-1;278:285:156"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":14868,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":14984,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":15147,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":15258,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":15401,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":15098,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":15598,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":15827,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":17463,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":14938,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":14903,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":14801,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":15574,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":15769,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":17414,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":16717,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":17487,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":14766,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":16131,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":15509,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":18669,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":17681,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":16783,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":16020,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":18215,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":15674,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintOnce":{"entryPoint":16977,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":18343,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":17916,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":17323,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":15882,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":16214,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":17256,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":17430,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10834},{"length":32,"start":15697},{"length":32,"start":17939},{"length":32,"start":18366}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461392757806306fdde03146138cc578063081812fc1461386f578063095ea7b3146135db5780630e07f85414612cf8578063114ba8ee14612c1157806323b872dd14612b695780632a55205a14612a765780632b4c9f1614612a075780632f2ff15d1461287b57806331e66e1e146127f857806340c10f191461276857806342842e0e146126985780634684d7e9146124d4578063572b6c051461248957806361ba27da1461236d5780636352211e146122f257806370a082311461222857806373c8a9581461207857806379cc679014611dda5780638832e6e314611b8c5780638bb9c5bf14611a1d5780638da5cb5b146119ac5780638dc251e31461187f57806391d14854146117e757806395d89b41146117785780639da5e832146114f7578063a0c76f6214611486578063a22cb46514611326578063b0ccc31e146112b5578063b88d4fde14611193578063c3666c3614610f56578063c77c695514610ecb578063c87b56dd14610d18578063d539139314610cbf578063d547741f14610b36578063e1a8bf2c14610afa578063e985e9c514610a46578063f247296514610821578063f2fde38b1461072d578063f3993d11146103a75763f7ba94bd146101ea57600080fd5b3461034b576101f836613c29565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102396145fc565b925416911690810361037a57508181036103505760005b81811061025957005b610264818387614406565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034b5761028e828587614406565b359081471061031957600080809381935af13d15610311573d906102b182613d99565b916102bf6040519384613c95565b82523d6000602084013e5b156102d85750600101610250565b8051156102e757602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102ca565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576103de613a14565b6103e6613a37565b9060443567ffffffffffffffff811161034b57610407903690600401613afa565b926104106145fc565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361071d575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106f3576104b58382849694614727565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061053857878787818114158061052f575b6104ed57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104e7565b610543818986614406565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106c557880361069357846105bc575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104d3565b7401000000000000000000000000000000000000000016158015610630575b6105e5578961057b565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105db565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61072691614511565b8582610467565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610764613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078e6145fc565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361037a575073ffffffffffffffffffffffffffffffffffffffff16918282036107d257005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461034b5761082f36613b2b565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161085a6145fc565b92610866848483614727565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108cb5786868161089457005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108d6818886614406565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106c5578803610693578661096f575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610884565b74010000000000000000000000000000000000000000161580156109e3575b610998578861090e565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8416141561098e565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610a7d613a14565b73ffffffffffffffffffffffffffffffffffffffff610a9a613a37565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576020604051620186a08152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57600435610b70613a37565b610b786145fc565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361037a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c2a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e0a6000600435610d79817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06143ab565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ebf57600091610e37575b60405160208082528190610e33908201856139d1565b0390f35b3d8083833e610e468183613c95565b810190602081830312610eb75780519067ffffffffffffffff8211610ebb570181601f82011215610eb757805192610e7d84613d99565b92610e8b6040519485613c95565b84845260208584010111610eb45750610e3392610eae91602080850191016139ae565b90610e1d565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034b57610f6436613b9a565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610fa96145fc565b925416911690810361037a5750808214801590611189575b6103505760005b828110610fd157005b73ffffffffffffffffffffffffffffffffffffffff610ff9610ff483858a614406565b614416565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ebf5760009161115b575b501561112e575073ffffffffffffffffffffffffffffffffffffffff611088610ff483858a614406565b1690611098610ff4828689614406565b916110a482878b614406565b3592813b1561034b57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ebf5760019261111d575b5001610fc8565b600061112891613c95565b88611116565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61117c915060203d8111611182575b6111748183613c95565b810190614437565b8961105e565b503d61116a565b5082821415610fc1565b3461034b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576111ca613a14565b6111d2613a37565b60443560643567ffffffffffffffff811161034b576111f5903690600401613a5a565b9290936112006145fc565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036112a5575b5050611286848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b823b61128e57005b6112a39561129d913691613dd3565b936148ed565b005b6112ae91614511565b8685611257565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761135d613a14565b602435908115159182810361034b57611457575b73ffffffffffffffffffffffffffffffffffffffff8061138f6145fc565b169116918183146114295760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611481817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614511565b611371565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461034b5761150536613c29565b91929161153a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b9061418f565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361156581613cd6565b936115736040519586613c95565b818552602085019160051b81019036821161034b57915b81831061174b57505050906115a0913691613cee565b9181519280518403610350577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115db57005b73ffffffffffffffffffffffffffffffffffffffff6115fa8284614368565b511680156117215761160c8285614368565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116f3577fdead000000000000000000000000000000000000000000000000000000000000146116c55790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115d2565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff8116810361034b5781526020928301920161158a565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e336117d37f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a561444f565b6040519182916020835260208301906139d1565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761181e613a37565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576118b6613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118f56145fc565b925416911690810361037a57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119825773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a786145fc565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b445760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610cba565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461034b5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57611bc3613a14565b6024359060443567ffffffffffffffff811161034b57611be7903690600401613a5a565b91611c147fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b611c548482611c4e7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c466145fc565b973691613dd3565b94614251565b803b611c5c57005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cc960405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906139d1565b03816000865af1908115610ebf57600091611d5b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2b57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dd2575b81611d7460209383613c95565b81010312611dce5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eb457507fffffffff00000000000000000000000000000000000000000000000000000000611cdf565b5080fd5b3d9150611d67565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57611e11613a14565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e3e6145fc565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561204a5773ffffffffffffffffffffffffffffffffffffffff81168095036120185782611e939185614727565b15611f41575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611fb5575b611f6a5780611e99565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f60565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5761208636613b9a565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120c96145fc565b925416911690810361037a575080841480159061221e575b6103505760005b8481106120f157005b6120fc818388614406565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361034b57600060209161212f610ff4868b8e614406565b826121996121c5612141898d8d614406565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613c95565b51925af115610ebf576000513d6122155750803b155b6121e857506001016120e8565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121db565b50828414156120e1565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5761225f613a14565b73ffffffffffffffffffffffffffffffffffffffff8116156122c85773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602061234f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06143ab565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123de6145fc565b925416911690810361037a57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245c57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760206124ca6124c5613a14565b613d3a565b6040519015158152f35b3461034b5761255373ffffffffffffffffffffffffffffffffffffffff6124fa36613b2b565b9291939061252a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613cee565b92169081156117215782519260005b8481106125a3575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125ad8183614368565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661266a577fdead0000000000000000000000000000000000000000000000000000000000001461263d57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612562565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461034b576126a636613a88565b6126ae6145fc565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612758575b5050612734828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b803b61273c57005b6112a3936040519361274f602086613c95565b600085526148ed565b61276191614511565b8483612705565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576112a36127a2613a14565b6127ce7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226115346145fc565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0614251565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760406128316147a7565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004356128b5613a37565b6128bd6145fc565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361037a57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561297057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610cba565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612b61575b15612b2b575050610e3360005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e3391620186a0821015612b4e57612b4890620186a09261414d565b04612afb565b620186a0612b5c920461414d565b612afb565b508115612aee565b3461034b576112a3612b7a36613a88565b91612b836145fc565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612c01575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613f56565b612c0a91614511565b8581612bd9565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57612c48613a14565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c876145fc565b925416911690810361037a575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461034b5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b5760043567ffffffffffffffff811161034b57612d47903690600401613a5a565b60243567ffffffffffffffff811161034b57612d67903690600401613a5a565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361034b576064359373ffffffffffffffffffffffffffffffffffffffff8516850361034b577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612dd56145fc565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561329a575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081613586575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4939181101561329a575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116134575781906130868454613f03565b601f8111613533575b50600090601f831160011461349157600092613486575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111613457576131117f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613f03565b601f81116133d3575b506000601f82116001146132d757819293946000926132cc575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d54600181101561329a575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480613134565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106133bb575083600195969710613383575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555613186565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080613356565b90926020600181928686013581550194019101613342565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061344d575b601f0160051c01905b818110613441575061311a565b60008155600101613434565b909150819061342b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806130a6565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061351b57509084600195949392106134e3575b505050811b0190556130d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558780806134d6565b919360206001819287870135815501950192016134c0565b909150836000526020600020601f840160051c8101916020851061357c575b90601f859493920160051c01905b81811061356d575061308f565b60008155849350600101613560565b9091508190613552565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612e42565b3461034b5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57613612613a14565b6024359073ffffffffffffffffffffffffffffffffffffffff811690811590811561383f575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136626145fc565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415613811578486146137e3576136a2818686614727565b156137975750156137065774010000000000000000000000000000000000000000166136f2575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836136c9565b90740100000000000000000000000000000000000000008217809203613783575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556136cb565b846000526020526040600020558380613727565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613869907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614511565b83613638565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57602061234f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613e94565b3461034b5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b57610e336117d37f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a461444f565b3461034b5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034b576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361034b576124ca6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613e0a565b60005b8381106139c15750506000910152565b81810151838201526020016139b1565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613a0d815180928187528780880191016139ae565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034b57565b9181601f8401121561034b5782359167ffffffffffffffff831161034b576020838186019501011161034b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261034b5760043573ffffffffffffffffffffffffffffffffffffffff8116810361034b579060243573ffffffffffffffffffffffffffffffffffffffff8116810361034b579060443590565b9181601f8401121561034b5782359167ffffffffffffffff831161034b576020808501948460051b01011161034b57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261034b5760043573ffffffffffffffffffffffffffffffffffffffff8116810361034b57916024359067ffffffffffffffff821161034b57613b9691600401613afa565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261034b5760043567ffffffffffffffff811161034b5781613be391600401613afa565b9290929160243567ffffffffffffffff811161034b5781613c0691600401613afa565b929092916044359067ffffffffffffffff821161034b57613b9691600401613afa565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261034b5760043567ffffffffffffffff811161034b5781613c7291600401613afa565b929092916024359067ffffffffffffffff821161034b57613b9691600401613afa565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761345757604052565b67ffffffffffffffff81116134575760051b60200190565b929190613cfa81613cd6565b93613d086040519586613c95565b602085838152019160051b810192831161034b57905b828210613d2a57505050565b8135815260209182019101613d1e565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613d925773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161345757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613ddf82613d99565b91613ded6040519384613c95565b82948184528183011161034b578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613d92577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613e8d5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106c557740100000000000000000000000000000000000000001615613d92576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613f4c575b6020831014613f1d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613f12565b909273ffffffffffffffffffffffffffffffffffffffff169283156106f357846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156138115773ffffffffffffffffffffffffffffffffffffffff811680950361411b5782613fca9185614727565b15614060575b5050836000528060205282604060002055828203614011575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613fe9565b74010000000000000000000000000000000000000000161580156140d5575b6140895780613fd0565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8216141561407f565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561416057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156141e95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561172157826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811661433a577fdead0000000000000000000000000000000000000000000000000000000000001461430c57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561437c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156143d9575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561437c5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361034b5790565b9081602091031261034b5751801515810361034b5790565b906040519182600082549261446384613f03565b80845293600181169081156144d1575060011461448a575b5061448892500383613c95565b565b90506000929192526020600020906000915b8183106144b5575050906020614488928201013861447b565b602091935080600191548385890101520191019091849261449c565b602093506144889592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861447b565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806145f2575b61453a575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ebf576000916145d3575b50156145a65750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6145ec915060203d602011611182576111748183613c95565b3861459d565b50813b1515614532565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561471857323314801561471d575b614718577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115614687575b5061468457503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610ebf576000916146f9575b503861467a565b614712915060203d602011611182576111748183613c95565b386146f2565b503390565b5060183610614643565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614752575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061474c565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156148db5732331480156148e3575b6148db5780331490811561483a575b50614809576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161034b5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610ebf576000916148bc575b50386147fd565b6148d5915060203d602011611182576111748183613c95565b386148b5565b506000903690565b50601836106147ee565b73ffffffffffffffffffffffffffffffffffffffff9061495f826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906139d1565b03816000865af1908115610ebf576000916149c3575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2b575050565b6020813d602011614a36575b816149dc60209383613c95565b81010312611dce5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eb457507fffffffff00000000000000000000000000000000000000000000000000000000614975565b3d91506149cf56fea2646970667358221220f6116f7c0511610c9644b036eb2a9296af0341cc7edfab5e2ef45f87407f92ed64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3927 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x38CC JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x386F JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x35DB JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2CF8 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2C11 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2B69 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2A76 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2A07 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x287B JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x27F8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2768 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2698 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24D4 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2489 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x236D JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22F2 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2228 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x2078 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DDA JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B8C JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A1D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19AC JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x187F JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17E7 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1778 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14F7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1486 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1326 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12B5 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1193 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF56 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xECB JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD18 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCBF JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB36 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAFA JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA46 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x821 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x72D JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x3A7 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x1F8 CALLDATASIZE PUSH2 0x3C29 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x239 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP2 DUP2 SUB PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x259 JUMPI STOP JUMPDEST PUSH2 0x264 DUP2 DUP4 DUP8 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x34B JUMPI PUSH2 0x28E DUP3 DUP6 DUP8 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x319 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x311 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2B1 DUP3 PUSH2 0x3D99 JUMP JUMPDEST SWAP2 PUSH2 0x2BF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C95 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2D8 JUMPI POP PUSH1 0x1 ADD PUSH2 0x250 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2CA JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x3DE PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x3E6 PUSH2 0x3A37 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x407 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 PUSH2 0x410 PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x71D JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6F3 JUMPI PUSH2 0x4B5 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4727 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x538 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x52F JUMPI JUMPDEST PUSH2 0x4ED JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x543 DUP2 DUP10 DUP7 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6C5 JUMPI DUP9 SUB PUSH2 0x693 JUMPI DUP5 PUSH2 0x5BC JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4D3 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x630 JUMPI JUMPDEST PUSH2 0x5E5 JUMPI DUP10 PUSH2 0x57B JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5DB JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x726 SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x467 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x764 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x78E PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7D2 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x82F CALLDATASIZE PUSH2 0x3B2B JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x85A PUSH2 0x45FC JUMP JUMPDEST SWAP3 PUSH2 0x866 DUP5 DUP5 DUP4 PUSH2 0x4727 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8CB JUMPI DUP7 DUP7 DUP2 PUSH2 0x894 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8D6 DUP2 DUP9 DUP7 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6C5 JUMPI DUP9 SUB PUSH2 0x693 JUMPI DUP7 PUSH2 0x96F JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x884 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9E3 JUMPI JUMPDEST PUSH2 0x998 JUMPI DUP9 PUSH2 0x90E JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x98E JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xA7D PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9A PUSH2 0x3A37 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB70 PUSH2 0x3A37 JUMP JUMPDEST PUSH2 0xB78 PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC2A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE0A PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD79 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x43AB JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE37 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE33 SWAP1 DUP3 ADD DUP6 PUSH2 0x39D1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE46 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEB7 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEBB JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEB7 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE7D DUP5 PUSH2 0x3D99 JUMP JUMPDEST SWAP3 PUSH2 0xE8B PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3C95 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEB4 JUMPI POP PUSH2 0xE33 SWAP3 PUSH2 0xEAE SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x39AE JUMP JUMPDEST SWAP1 PUSH2 0xE1D JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0xF64 CALLDATASIZE PUSH2 0x3B9A JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xFA9 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1189 JUMPI JUMPDEST PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFD1 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFF9 PUSH2 0xFF4 DUP4 DUP6 DUP11 PUSH2 0x4406 JUMP JUMPDEST PUSH2 0x4416 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x115B JUMPI JUMPDEST POP ISZERO PUSH2 0x112E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1088 PUSH2 0xFF4 DUP4 DUP6 DUP11 PUSH2 0x4406 JUMP JUMPDEST AND SWAP1 PUSH2 0x1098 PUSH2 0xFF4 DUP3 DUP7 DUP10 PUSH2 0x4406 JUMP JUMPDEST SWAP2 PUSH2 0x10A4 DUP3 DUP8 DUP12 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x34B JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x1 SWAP3 PUSH2 0x111D JUMPI JUMPDEST POP ADD PUSH2 0xFC8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1128 SWAP2 PUSH2 0x3C95 JUMP JUMPDEST DUP9 PUSH2 0x1116 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x117C SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1182 JUMPI JUMPDEST PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x4437 JUMP JUMPDEST DUP10 PUSH2 0x105E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x116A JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFC1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x11CA PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x11D2 PUSH2 0x3A37 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x11F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x1200 PUSH2 0x45FC JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x12A5 JUMPI JUMPDEST POP POP PUSH2 0x1286 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x128E JUMPI STOP JUMPDEST PUSH2 0x12A3 SWAP6 PUSH2 0x129D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3DD3 JUMP JUMPDEST SWAP4 PUSH2 0x48ED JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12AE SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x1257 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x135D PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x34B JUMPI PUSH2 0x1457 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x138F PUSH2 0x45FC JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1429 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1481 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4511 JUMP JUMPDEST PUSH2 0x1371 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x1505 CALLDATASIZE PUSH2 0x3C29 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x153A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST SWAP1 PUSH2 0x418F JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x1565 DUP2 PUSH2 0x3CD6 JUMP JUMPDEST SWAP4 PUSH2 0x1573 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C95 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x34B JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x174B JUMPI POP POP POP SWAP1 PUSH2 0x15A0 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3CEE JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x350 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15DB JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15FA DUP3 DUP5 PUSH2 0x4368 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1721 JUMPI PUSH2 0x160C DUP3 DUP6 PUSH2 0x4368 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16F3 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16C5 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15D2 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x158A JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE33 PUSH2 0x17D3 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x444F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x181E PUSH2 0x3A37 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x18B6 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18F5 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1982 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A78 PUSH2 0x45FC JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B44 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCBA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x1BC3 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x1BE7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST SWAP2 PUSH2 0x1C14 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH2 0x1C54 DUP5 DUP3 PUSH2 0x1C4E PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C46 PUSH2 0x45FC JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3DD3 JUMP JUMPDEST SWAP5 PUSH2 0x4251 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C5C JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CC9 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D5B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D2B JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DD2 JUMPI JUMPDEST DUP2 PUSH2 0x1D74 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DCE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEB4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CDF JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D67 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x1E11 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E3E PUSH2 0x45FC JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x204A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x2018 JUMPI DUP3 PUSH2 0x1E93 SWAP2 DUP6 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x1F41 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FB5 JUMPI JUMPDEST PUSH2 0x1F6A JUMPI DUP1 PUSH2 0x1E99 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F60 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x2086 CALLDATASIZE PUSH2 0x3B9A JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20C9 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x221E JUMPI JUMPDEST PUSH2 0x350 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20F1 JUMPI STOP JUMPDEST PUSH2 0x20FC DUP2 DUP4 DUP9 PUSH2 0x4406 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x34B JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x212F PUSH2 0xFF4 DUP7 DUP12 DUP15 PUSH2 0x4406 JUMP JUMPDEST DUP3 PUSH2 0x2199 PUSH2 0x21C5 PUSH2 0x2141 DUP10 DUP14 DUP14 PUSH2 0x4406 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3C95 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2215 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21E8 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20E8 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21DB JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20E1 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x225F PUSH2 0x3A14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22C8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x234F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x43AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23DE PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x245C JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x24CA PUSH2 0x24C5 PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x3D3A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x2553 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24FA CALLDATASIZE PUSH2 0x3B2B JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x252A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3CEE JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1721 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x25A3 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25AD DUP2 DUP4 PUSH2 0x4368 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x266A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x263D JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2562 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x26A6 CALLDATASIZE PUSH2 0x3A88 JUMP JUMPDEST PUSH2 0x26AE PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2758 JUMPI JUMPDEST POP POP PUSH2 0x2734 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x273C JUMPI STOP JUMPDEST PUSH2 0x12A3 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x274F PUSH1 0x20 DUP7 PUSH2 0x3C95 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x48ED JUMP JUMPDEST PUSH2 0x2761 SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2705 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x12A3 PUSH2 0x27A2 PUSH2 0x3A14 JUMP JUMPDEST PUSH2 0x27CE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1534 PUSH2 0x45FC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4251 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x40 PUSH2 0x2831 PUSH2 0x47A7 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x28B5 PUSH2 0x3A37 JUMP JUMPDEST PUSH2 0x28BD PUSH2 0x45FC JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2970 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCBA JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2B61 JUMPI JUMPDEST ISZERO PUSH2 0x2B2B JUMPI POP POP PUSH2 0xE33 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE33 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2B4E JUMPI PUSH2 0x2B48 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x414D JUMP JUMPDEST DIV PUSH2 0x2AFB JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2B5C SWAP3 DIV PUSH2 0x414D JUMP JUMPDEST PUSH2 0x2AFB JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2AEE JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x12A3 PUSH2 0x2B7A CALLDATASIZE PUSH2 0x3A88 JUMP JUMPDEST SWAP2 PUSH2 0x2B83 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2C01 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3F56 JUMP JUMPDEST PUSH2 0x2C0A SWAP2 PUSH2 0x4511 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2BD9 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x2C48 PUSH2 0x3A14 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C87 PUSH2 0x45FC JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x37A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x2D47 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI PUSH2 0x2D67 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A5A JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x34B JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x34B JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2DD5 PUSH2 0x45FC JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x3586 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3457 JUMPI DUP2 SWAP1 PUSH2 0x3086 DUP5 SLOAD PUSH2 0x3F03 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3533 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3491 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x3486 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH2 0x3111 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3F03 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x33D3 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x32D7 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x32CC JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x329A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x3134 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x33BB JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x3383 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x3186 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x3356 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x3342 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x344D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3441 JUMPI POP PUSH2 0x311A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3434 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x342B JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x30A6 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x351B JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x34E3 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x30D8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x34D6 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x34C0 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x357C JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x356D JUMPI POP PUSH2 0x308F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3560 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3552 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2E42 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0x3612 PUSH2 0x3A14 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x383F JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3662 PUSH2 0x45FC JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3811 JUMPI DUP5 DUP7 EQ PUSH2 0x37E3 JUMPI PUSH2 0x36A2 DUP2 DUP7 DUP7 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x3797 JUMPI POP ISZERO PUSH2 0x3706 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x36F2 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x36C9 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x3783 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x36CB JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3727 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3869 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4511 JUMP JUMPDEST DUP4 PUSH2 0x3638 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x20 PUSH2 0x234F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3E94 JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH2 0xE33 PUSH2 0x17D3 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x444F JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI PUSH2 0x24CA PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3E0A JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x39C1 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x39B1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3A0D DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x39AE JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x34B JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x34B JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x34B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x34B JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x34B JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x34B JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x34B JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x34B JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3BE3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3C06 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x34B JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x34B JUMPI DUP2 PUSH2 0x3C72 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34B JUMPI PUSH2 0x3B96 SWAP2 PUSH1 0x4 ADD PUSH2 0x3AFA JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3457 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3CFA DUP2 PUSH2 0x3CD6 JUMP JUMPDEST SWAP4 PUSH2 0x3D08 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C95 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x34B JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3D2A JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D1E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3D92 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3457 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3DDF DUP3 PUSH2 0x3D99 JUMP JUMPDEST SWAP2 PUSH2 0x3DED PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C95 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x34B JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3D92 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3E8D JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6C5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3D92 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3F4C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3F1D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3F12 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6F3 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3811 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x411B JUMPI DUP3 PUSH2 0x3FCA SWAP2 DUP6 PUSH2 0x4727 JUMP JUMPDEST ISZERO PUSH2 0x4060 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x4011 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3FE9 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x40D5 JUMPI JUMPDEST PUSH2 0x4089 JUMPI DUP1 PUSH2 0x3FD0 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x407F JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x4160 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x41E9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1721 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x433A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x430C JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x437C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x43D9 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x437C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x34B JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x34B JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x34B JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x4463 DUP5 PUSH2 0x3F03 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x44D1 JUMPI POP PUSH1 0x1 EQ PUSH2 0x448A JUMPI JUMPDEST POP PUSH2 0x4488 SWAP3 POP SUB DUP4 PUSH2 0x3C95 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x44B5 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x4488 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x447B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x449C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x4488 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x447B JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x45F2 JUMPI JUMPDEST PUSH2 0x453A JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x45D3 JUMPI JUMPDEST POP ISZERO PUSH2 0x45A6 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x45EC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x459D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4532 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4718 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x471D JUMPI JUMPDEST PUSH2 0x4718 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4687 JUMPI JUMPDEST POP PUSH2 0x4684 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x46F9 JUMPI JUMPDEST POP CODESIZE PUSH2 0x467A JUMP JUMPDEST PUSH2 0x4712 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x46F2 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4643 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4752 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x474C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x48DB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x48E3 JUMPI JUMPDEST PUSH2 0x48DB JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x483A JUMPI JUMPDEST POP PUSH2 0x4809 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x34B JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x48BC JUMPI JUMPDEST POP CODESIZE PUSH2 0x47FD JUMP JUMPDEST PUSH2 0x48D5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1182 JUMPI PUSH2 0x1174 DUP2 DUP4 PUSH2 0x3C95 JUMP JUMPDEST CODESIZE PUSH2 0x48B5 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x47EE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x495F DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x39D1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEBF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x49C3 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D2B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4A36 JUMPI JUMPDEST DUP2 PUSH2 0x49DC PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C95 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DCE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEB4 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x4975 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x49CF JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF6 GT PUSH16 0x7C0511610C9644B036EB2A9296AF0341 0xCC PUSH31 0xDFAB5E2EF45F87407F92ED64736F6C634300081E0033000000000000000000 ","sourceMap":"278:285:156:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;278:285:156;;3700:41:332;;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;278:285:156;1845:10:192;;;;;;278:285:156;1857:3:192;1876:11;;;;;:::i;:::-;278:285:156;;;;;;;;;1898:10:192;;;;;:::i;:::-;278:285:156;1375:21:9;;;:30;1371:125;;278:285:156;1548:33:9;;;;;;;278:285:156;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;278:285:156;;1834:9:192;;1591:58:9;278:285:156;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;278:285:156;5957:19:9;278:285:156;;5957:19:9;278:285:156;;;;;1371:125:9;1455:21;;1428:57;278:285:156;1428:57:9;278:285:156;;;;;;1428:57:9;278:285:156;;;;1756:63:192;1793:26;278:285:156;1793:26:192;278:285:156;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;278:285:156;;-1:-1:-1;4538:25:42;278:285:156;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3700:41:332;;;:::i;:::-;3179:19:352;278:285:156;;;;;;;;2616:14:352;2612:76;;278:285:156;29158:19:327;;278:285:156;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;278:285:156;;12884:11:327;;278:285:156;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;278:285:156;13173:304:327;-1:-1:-1;278:285:156;;;13323:10:327;278:285:156;;;;;;;;;;;2220:8:327;;278:285:156;;;;;;;;;2220:8:327;;278:285:156;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;278:285:156;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;278:285:156;;;;;;;;;;;;;;2220:8:327;13125:27;;;278:285:156;13125:27:327;;278:285:156;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;278:285:156;12987:51:327;;278:285:156;12987:51:327;278:285:156;;;;;;;;;12987:51:327;12919:59;278:285:156;;;;12958:11:327;278:285:156;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;278:285:156;12832:34:327;278:285:156;;;;;;12832:34:327;12715:64;12748:31;;278:285:156;12748:31:327;278:285:156;;;;12748:31:327;12409:58;12438:29;278:285:156;12438:29:327;278:285:156;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;278:285:156;;;;;;;;;;;;;:::i;:::-;;3700:41:332;;;:::i;:::-;278:285:156;;;;;;;;3205:23:42;;;3201:60;;278:285:156;;;3275:25:42;;;;3271:146;;278:285:156;3271:146:42;2220:8:327;;;;;;;;3361:45:42;278:285:156;3361:45:42;;278:285:156;;;;;;;;:::i;:::-;29158:19:327;278:285:156;3700:41:332;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;278:285:156;;25879:11:327;;278:285:156;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;278:285:156;26179:110:327;-1:-1:-1;278:285:156;26238:10:327;278:285:156;;;-1:-1:-1;278:285:156;;;;;2220:8:327;;278:285:156;;;25601:3:327;25638:11;;;;;:::i;:::-;278:285:156;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;278:285:156;;;;;;;;;;2414:66:327;278:285:156;;;2220:8:327;278:285:156;26123:35:327;;;;;278:285:156;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;278:285:156;25982:51:327;;278:285:156;25982:51:327;278:285:156;;;;;;;;;25982:51:327;25914:59;278:285:156;;;;25953:11:327;278:285:156;;;;;;;;;;;25943:30:327;;25914:59;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;278:285:156;-1:-1:-1;278:285:156;28718:11:327;278:285:156;;;;-1:-1:-1;278:285:156;28718:28:327;278:285:156;-1:-1:-1;278:285:156;;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;278:285:156;;;;;;;;;;;;;;;;;;;;;;713:6:351;278:285:156;;;;;;;;;;;;;;;;;;:::i;:::-;3700:41:332;;:::i;:::-;5148:19:42;278:285:156;;;;;;;4503:26:42;;;4499:64;;4464:19:41;278:285:156;;;;;;;;;;;;;-1:-1:-1;278:285:156;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;1880:140:41;;278:285:156;1880:140:41;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;278:285:156;;;;1973:36:41;;;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;278:285:156;;;1453:39:302;1863:70:327;278:285:156;1453:39:302;:::i;:::-;;278:285:156;3364:23:341;278:285:156;;;;3364:64:341;;;;;278:285:156;3364:64:341;;1603:4:302;278:285:156;3364:64:341;;278:285:156;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;278:285:156;3364:64:341;;;278:285:156;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;278:285:156;;;;;;;;;;;3364:64:341;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;278:285:156;;;;30830:32:327;278:285:156;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;278:285:156;;;3700:41:332;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;278:285:156;3852:94:192;;278:285:156;3972:10:192;;;;;;278:285:156;3984:3:192;278:285:156;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;278:285:156;;;;4058:76:192;;4108:25;278:285:156;4058:76:192;;278:285:156;4058:76:192;;;;;;;;;;;;278:285:156;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;278:285:156;4239:12:192;;;;;;:::i;:::-;278:285:156;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;278:285:156;4239:70:192;;;;;;;278:285:156;;;;;;;4239:70:192;;;;;278:285:156;4239:70:192;;4277:4;278:285:156;4239:70:192;;278:285:156;;4058:76:192;278:285:156;;;;;;;4239:70:192;;;;;;;278:285:156;4239:70:192;;;3984:3;;278:285:156;3961:9:192;;4239:70;278:285:156;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;278:285:156;4161:50:192;278:285:156;;4058:76:192;278:285:156;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3700:41:332;;;;;:::i;:::-;3179:19:352;278:285:156;;;;;;;;2616:14:352;2612:76;;278:285:156;29158:19:327;;11217:7;1863:70;;;;278:285:156;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;278:285:156;11235:101:327;11271:54;278:285:156;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;278:285:156;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;278:285:156;;3700:41:332;;;:::i;:::-;278:285:156;;;6339:18:327;;;;6335:63;;278:285:156;6463:42:327;6408:19;278:285:156;-1:-1:-1;278:285:156;6408:11:327;278:285:156;;;-1:-1:-1;278:285:156;;-1:-1:-1;278:285:156;;;;-1:-1:-1;278:285:156;;;;;;;;;;;;;;;;6463:42:327;278:285:156;6335:63:327;6366:32;;278:285:156;6366:32:327;278:285:156;;;;6366:32:327;1500:115:305;2931:8:352;668:81;278:285:156;2931:8:352;:::i;:::-;1500:115:305;;278:285:156;;;;;;;;;;;;;2991:23:341;278:285:156;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1471:12:301;278:285:156;3700:41:332;;:::i;:::-;1471:12:301;;:::i;:::-;278:285:156;1072:8:301;;;;:::i;:::-;278:285:156;;;;;;;:::i;:::-;1072:8:301;;;;;;;;;;;278:285:156;;1072:8:301;;;;;;;;;;;278:285:156;;;;;;;;;:::i;:::-;;;;;;;22754:25:327;;22750:64;;23302:10;;22829:9;278:285:156;22840:10:327;;;;;;278:285:156;22852:3:327;278:285:156;22884:13:327;;;;:::i;:::-;278:285:156;;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;278:285:156;;;;;;1072:8:301;278:285:156;;;;;;;;23070:60:327;;2414:66;30830:32;23144:59;;278:285:156;;;;;;;;1072:8:301;278:285:156;;;;;2220:8:327;278:285:156;-1:-1:-1;278:285:156;;;;;;;;;;;;;2220:8:327;;278:285:156;23350:33:327;;;;278:285:156;22829:9:327;;23144:59;23178:25;;278:285:156;23178:25:327;278:285:156;;;;23178:25:327;23070:60;23102:28;;278:285:156;23102:28:327;278:285:156;;;;23102:28:327;22911:54;22940:25;278:285:156;22940:25:327;278:285:156;;22940:25:327;1072:8:301;278:285:156;;;;;;;;;1072:8:301;;;;;;;;;;278:285:156;;;;;;;;;;;;;2688:13:341;278:285:156;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;278:285:156;-1:-1:-1;278:285:156;;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;278:285:156;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3700:41:332;;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;2976:19:351;278:285:156;;;;;1732:22:351;1728:93;;278:285:156;;2220:8:327;;;;;;;278:285:156;;;1728:93:351;1777:33;278:285:156;1777:33:351;278:285:156;;1777:33:351;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3700:41:332;;:::i;:::-;278:285:156;;;;;;;;;;;;;-1:-1:-1;278:285:156;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;3741:25:41;3737:66;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;278:285:156;;;;2455:33:41;278:285:156;3737:66:41;278:285:156;3775:28:41;;;278:285:156;3775:28:41;278:285:156;;;;;;;3775:28:41;278:285:156;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1766:12:304;278:285:156;3700:41:332;;:::i;1766:12:304:-;20205:7:327;1863:70;;278:285:156;;3700:41:332;;;:::i;:::-;278:285:156;;;;:::i;:::-;20205:7:327;;:::i;:::-;376:58:354;;20223:107:327;;278:285:156;20223:107:327;278:285:156;;;;;;;;;29832:65:327;;;;;278:285:156;29832:65:327;;278:285:156;;29832:65:327;;278:285:156;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;278:285:156;29832:65:327;;;;;;;;278:285:156;29832:65:327;;;20223:107;278:285:156;;;;;29832:84:327;29828:136;;278:285:156;29828:136:327;29925:39;278:285:156;29925:39:327;278:285:156;;;;;;29925:39:327;29832:65;278:285:156;29832:65:327;;278:285:156;29832:65:327;;;;;;278:285:156;29832:65:327;;;:::i;:::-;;;278:285:156;;;;;;;;;;;;;29832:65:327;278:285:156;29832:65:327;;278:285:156;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;278:285:156;3700:41:332;;:::i;:::-;278:285:156;;;;;;;;;;;;;30700:19:327;;;24121:64;;278:285:156;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;278:285:156;;;;;;;;;;2414:66:327;278:285:156;;;2220:8:327;278:285:156;;;24633:10:327;278:285:156;;;;;;;;;2220:8:327;;24674:35;;;;278:285:156;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;278:285:156;24402:51:327;;;278:285:156;24402:51:327;278:285:156;;;;;;;;;24402:51:327;24334:59;278:285:156;;;;24373:11:327;278:285:156;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;278:285:156;24234:34:327;278:285:156;;;;;;24234:34:327;24121:64;24154:31;;278:285:156;24154:31:327;278:285:156;;;;24154:31:327;278:285:156;;;;;;;:::i;:::-;5148:19:42;;;;278:285:156;;;3700:41:332;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;278:285:156;2776:90:192;;278:285:156;2892:10:192;;;;;;278:285:156;2904:3:192;2923:9;;;;;:::i;:::-;278:285:156;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;278:285:156;;;1328:43:8;;;;;;278:285:156;;;;1328:43:8;;;278:285:156;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;278:285:156;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;278:285:156;;2881:9:192;;8938:146:8;9033:40;278:285:156;9033:40:8;278:285:156;;1328:43:8;278:285:156;9033:40:8;8942:68;278:285:156;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;278:285:156;;-1:-1:-1;278:285:156;26801:10:327;278:285:156;;;;-1:-1:-1;278:285:156;;;;;;;;26724:60:327;26756:28;278:285:156;26756:28:327;278:285:156;;26756:28:327;278:285:156;;;;;;;;;;;;3395:39:305;278:285:156;;;3395:39:305;:::i;:::-;278:285:156;;;;;;;;;;;;;;;;;;;;;;;3700:41:332;;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;2976:19:351;278:285:156;1281:36:351;713:6;1281:36;;1277:119;;278:285:156;;;;;;;;;;;;;;;1277:119:351;1340:45;278:285:156;1340:45:351;278:285:156;;;;1340:45:351;278:285:156;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;2233:12:304;278:285:156;3700:41:332;;:::i;2233:12:304:-;278:285:156;;;;;:::i;:::-;;;21151:16:327;;;21147:54;;278:285:156;;21259:9:327;278:285:156;21270:10:327;;;;;;21677:14;;;-1:-1:-1;278:285:156;21677:10:327;278:285:156;;;-1:-1:-1;278:285:156;;;;;2220:8:327;;278:285:156;;;21282:3:327;21319:11;;;;:::i;:::-;278:285:156;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;278:285:156;;;;;;;;;;;;;2220:8:327;21599:33;278:285:156;21599:33:327;;;;278:285:156;21259:9:327;;21465:59;21499:25;278:285:156;21499:25:327;278:285:156;;;;21499:25:327;21391:60;21423:28;;278:285:156;21423:28:327;278:285:156;;;;21423:28:327;278:285:156;;;;;;;:::i;:::-;3700:41:332;;:::i;:::-;3179:19:352;278:285:156;;;;;;;;2616:14:352;2612:76;;278:285:156;29158:19:327;;9668:7;1863:70;;;;278:285:156;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;278:285:156;9686:99:327;9722:52;278:285:156;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;278:285:156;;;;;;;;;;;1382:7:304;278:285:156;;:::i;:::-;1323:12:304;278:285:156;3700:41:332;;:::i;1323:12:304:-;278:285:156;;;;1382:7:304;:::i;278:285:156:-;;;;;;;;;;;;3935:39:332;;:::i;:::-;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:41:332;;:::i;:::-;5148:19:42;278:285:156;;;;;;;4503:26:42;;;4499:64;;4464:19:41;278:285:156;;;;;;;;;;;;;-1:-1:-1;278:285:156;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;1254:25:41;1250:140;;278:285:156;1250:140:41;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;278:285:156;;;;1343:36:41;278:285:156;;;;;;;;;;;;;;;;941:19:75;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;278:285:156;2499:377:351;;;2559:17;;278:285:156;;2499:377:351;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;278:285:156;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;278:285:156;2499:377:351;;2607:259;713:6;2794:57;278:285:156;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;278:285:156;;;;2134:7:305;278:285:156;;;:::i;:::-;3700:41:332;;;:::i;:::-;278:285:156;;;;;;;;2616:14:352;2612:76;;278:285:156;29158:19:327;;278:285:156;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;3700:41:332;;;:::i;:::-;278:285:156;;;;;4503:26:42;;;4499:64;;3179:19:352;278:285:156;;;;2220:8:327;;;;;;;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3700:41:332;;:::i;:::-;278:285:156;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;278:285:156;2220:8:327;278:285:156;;;;1645:152:42;;278:285:156;-1:-1:-1;;278:285:156;;500:10:59;;278:285:156;;1124:1:42;278:285:156;;;;;;;;;500:10:59;278:285:156;;;;;;;;500:10:59;278:285:156;;;;;;;;500:10:59;278:285:156;;;;;;;;500:10:59;278:285:156;;;;;;;;500:10:59;278:285:156;;;;;;;;500:10:59;278:285:156;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;278:285:156;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;278:285:156;2220:8:327;278:285:156;583:77:341;;;;;;;;;;:::i;:::-;;;;;;278:285:156;583:77:341;278:285:156;583:77:341;;;;;;;;278:285:156;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;278:285:156;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;278:285:156;583:77:341;;;;;;;;;;;278:285:156;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;278:285:156;2196:23:341;278:285:156;;2220:8:327;;;;;;;278:285:156;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;278:285:156;2220:8:327;1124:1:42;278:285:156;2220:8:327;278:285:156;2220:8:327;;;;;;;278:285:156;;;896:88:181;930:54;278:285:156;930:54:181;278:285:156;;1124:1:42;278:285:156;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;278:285:156;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;278:285:156;583:77:341;;;;;;;;;;278:285:156;583:77:341;;;;;;;;;;;;;;;;;;;;;278:285:156;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;278:285:156;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;278:285:156;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;278:285:156;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;278:285:156;583:77:341;278:285:156;;583:77:341;;;;;;;;;278:285:156;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;278:285:156;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;278:285:156;1740:46:42;;;;1645:152;;;;278:285:156;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;278:285:156;29158:19:327;278:285:156;3700:41:332;;:::i;:::-;278:285:156;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;278:285:156;5670:35:327;;278:285:156;5157:173:327;278:285:156;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;278:285:156;;;;;5620:11:327;278:285:156;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;278:285:156;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;278:285:156;5052:59:327;;;278:285:156;5052:59:327;278:285:156;;;;;;;;;5052:59:327;4927:63;4958:32;;278:285:156;4958:32:327;278:285:156;;;;4958:32:327;4802:64;4835:31;;278:285:156;4835:31:327;278:285:156;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;278:285:156;2931:8:352;:::i;:::-;1064:117:305;;;278:285:156;;;;;;;;;;;;3579:43:305;278:285:156;;;3579:43:305;:::i;278:285:156:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;278:285:156;1793:19:59;278:285:156;635:65:55;:::i;278:285:156:-;;;;;;;;-1:-1:-1;;278:285:156;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;278:285:156;1146:19:75;278:285:156;1146:53:75;;;1142:96;;278:285:156;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;278:285:156;1215:12:75;:::o;278:285:156:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;278:285:156;;;;;;:::o;1359:340:59:-;;278:285:156;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;278:285:156;500:10:59;;;;;278:285:156;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;278:285:156;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;278:285:156;;;28073:11:327;278:285:156;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;278:285:156;;7507:16:327;;;7503:58;;278:285:156;7521:1:327;278:285:156;;;;;7521:1:327;278:285:156;;;;;30700:19:327;;;7615:64;;278:285:156;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;278:285:156;;;7521:1:327;278:285:156;;;;;;7521:1:327;278:285:156;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;278:285:156;-1:-1:-1;278:285:156;;;;;-1:-1:-1;278:285:156;;;;;2220:8:327;;278:285:156;-1:-1:-1;278:285:156;;;;-1:-1:-1;278:285:156;8155:10:327;278:285:156;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;278:285:156;7896:51:327;;;7521:1;7896:51;278:285:156;7896:51:327;278:285:156;;;;;;7521:1:327;7896:51;7828:59;278:285:156;;7521:1:327;278:285:156;7867:11:327;;;278:285:156;;;;7521:1:327;278:285:156;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;278:285:156;;;;7521:1:327;7728:34;278:285:156;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;278:285:156;-1:-1:-1;278:285:156;;;;-1:-1:-1;278:285:156;;;;-1:-1:-1;278:285:156;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;278:285:156;3775:28:41;;-1:-1:-1;3775:28:41;278:285:156;3775:28:41;278:285:156;;;;;-1:-1:-1;3775:28:41;18606:565:327;;278:285:156;;18694:16:327;;;18690:54;;278:285:156;18708:1:327;278:285:156;;;;;18708:1:327;278:285:156;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;278:285:156;;18708:1:327;278:285:156;;;;;;18708:1:327;278:285:156;2220:8:327;278:285:156;-1:-1:-1;278:285:156;19091:10:327;278:285:156;;;-1:-1:-1;278:285:156;19091:10:327;278:285:156;;;2220:8:327;;18708:1;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;278:285:156;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;278:285:156;;18708:1:327;18830:28;278:285:156;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;278:285:156;-1:-1:-1;278:285:156;;;;;-1:-1:-1;278:285:156;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;278:285:156;;-1:-1:-1;27324:31:327;278:285:156;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;278:285:156;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;278:285:156;-1:-1:-1;583:77:341;278:285:156;-1:-1:-1;278:285:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;278:285:156;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;278:285:156;;;3613:51:352;278:285:156;;3613:51:352;;;;278:285:156;3613:51:352;;3648:4;3613:51;;;278:285:156;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;278:285:156;;-1:-1:-1;3691:28:352;3613:51;;;;278:285:156;3613:51:352;278:285:156;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;278:285:156;1029:19:76;278:285:156;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;278:285:156;;;1676:74:76;;278:285:156;;;1676:74:76;;;278:285:156;1327:10:76;278:285:156;;;;1744:4:76;278:285:156;;;;;-1:-1:-1;1676:74:76;;278:285:156;;;;;;1676:74:76;;;;;;;278:285:156;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;278:285:156;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;278:285:156;;-1:-1:-1;278:285:156;30435:11:327;278:285:156;;;;-1:-1:-1;278:285:156;30435:27:327;278:285:156;-1:-1:-1;278:285:156;;;500:10:59;278:285:156;-1:-1:-1;278:285:156;500:10:59;;30413:49:327;;;;;1938:939:76;278:285:156;2065:19:76;278:285:156;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;278:285:156;720:8:80;278:285:156;720:8:80;;278:285:156;;;;2115:1:76;2802:32;;:::o;2624:153::-;278:285:156;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;278:285:156;2361:10:76;278:285:156;;;;2771:4:76;278:285:156;;;;;-1:-1:-1;2682:95:76;;278:285:156;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;278:285:156;29701:270:327;278:285:156;29701:270:327;278:285:156;29701:270:327;;;;;278:285:156;;;;;29832:65:327;;;;;278:285:156;29832:65:327;;278:285:156;29832:65:327;;;278:285:156;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;278:285:156;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;278:285:156;29832:65:327;;278:285:156;29832:65:327;;;;;;278:285:156;29832:65:327;;;:::i;:::-;;;278:285:156;;;;;;;;;;;;;29832:65:327;278:285:156;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3812000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"892","ROYALTY_FEE_DENOMINATOR()":"936","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2773","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2983","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3333","isTrustedForwarder(address)":"infinite","metadataResolver()":"2847","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2891","owner()":"2737","ownerOf(uint256)":"2731","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","wasBurnt(uint256)":"3023"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol\":\"ERC721FullMintOnceBurnProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721FullMintOnceBurnProxied} from \\\"./../../../../../token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol\\\";\\n\\ncontract ERC721FullMintOnceBurnProxiedMock is ERC721FullMintOnceBurnProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullMintOnceBurnProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xb9e885f5c70991acd94e09c4e7f0666d5b18aacfa9f0b5172ebc97f41526ee55\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./../../base/ERC721MintableOnceBase.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./../../base/ERC721DeliverableOnceBase.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../../base/ERC721BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullMintOnceBurnProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableOnceBase,\\n    ERC721DeliverableOnceBase,\\n    ERC721BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC721Storage.initERC721Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x9b0d0339dbda93abadf89ab0264faf3638763e3e9b0d714a89b00250a4059d92\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"version":1}}},"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol":{"ERC721FullProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61437c38819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f576080526040516142e1908161009b82396080518181816123a80152818161361301528181613e80015261402b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461325457806306fdde03146131f9578063081812fc1461319c578063095ea7b314612f085780630e07f8541461264e578063114ba8ee1461256757806323b872dd146124bf5780632a55205a146123cc5780632b4c9f161461235d5780632f2ff15d146121d157806331e66e1e1461214e57806340c10f19146120be57806342842e0e14611fee5780634684d7e914611e0e578063572b6c0514611dc357806361ba27da14611ca75780636352211e14611c2c57806370a0823114611b6257806373c8a958146119b25780638832e6e3146117645780638bb9c5bf146115f55780638da5cb5b146115845780638dc251e31461145757806391d14854146113bf57806395d89b41146113505780639da5e83214611226578063a0c76f62146111b5578063a22cb46514611055578063b0ccc31e14610fe4578063b88d4fde14610ec2578063c3666c3614610c85578063c87b56dd14610ad2578063d539139314610a79578063d547741f146108f0578063e1a8bf2c146108b4578063e985e9c514610800578063f2fde38b1461070c578063f3993d11146103865763f7ba94bd146101c957600080fd5b3461032a576101d7366134eb565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613e69565b9254169116908103610359575081810361032f5760005b81811061023857005b610243818387613c73565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d828587613c73565b35908147106102f857600080809381935af13d156102f0573d906102908261365b565b9161029e6040519384613557565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd613341565b6103c5613364565b9060443567ffffffffffffffff811161032a576103e6903690600401613427565b926103ef613e69565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106fc575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106d2576104948382849694613f94565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061051757878787818114158061050e575b6104cc57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104c6565b610522818986613c73565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578461059b575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104b2565b740100000000000000000000000000000000000000001615801561060f575b6105c4578961055a565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105ba565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61070591613d7e565b8582610446565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610743613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061076d613e69565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff16918282036107b157005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610837613341565b73ffffffffffffffffffffffffffffffffffffffff610854613364565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020604051620186a08152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561092a613364565b610932613e69565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109e457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bc46000600435610b33817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c18565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c7957600091610bf1575b60405160208082528190610bed908201856132fe565b0390f35b3d8083833e610c008183613557565b810190602081830312610c715780519067ffffffffffffffff8211610c75570181601f82011215610c7157805192610c378461365b565b92610c456040519485613557565b84845260208584010111610c6e5750610bed92610c6891602080850191016132db565b90610bd7565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461032a57610c9336613458565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd8613e69565b92541691169081036103595750808214801590610eb8575b61032f5760005b828110610d0057005b73ffffffffffffffffffffffffffffffffffffffff610d28610d2383858a613c73565b613c83565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c7957600091610e8a575b5015610e5d575073ffffffffffffffffffffffffffffffffffffffff610db7610d2383858a613c73565b1690610dc7610d23828689613c73565b91610dd382878b613c73565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c7957600192610e4c575b5001610cf7565b6000610e5791613557565b88610e45565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610eab915060203d8111610eb1575b610ea38183613557565b810190613ca4565b89610d8d565b503d610e99565b5082821415610cf0565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610ef9613341565b610f01613364565b60443560643567ffffffffffffffff811161032a57610f24903690600401613387565b929093610f2f613e69565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fd4575b5050610fb5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b823b610fbd57005b610fd295610fcc913691613695565b9361415a565b005b610fdd91613d7e565b8685610f86565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761108c613341565b602435908115159182810361032a57611186575b73ffffffffffffffffffffffffffffffffffffffff806110be613e69565b169116918183146111585760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111b0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d7e565b6110a0565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461032a57611234366134eb565b6112667fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b90613a51565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261129181613598565b9461129f6040519687613557565b818652602086019160051b81019036821161032a57915b81831061132357505050906112cc9136916135b0565b918051918351830361032f5760005b8381106112e457005b8061131d73ffffffffffffffffffffffffffffffffffffffff61130960019487613bd5565b51166113158389613bd5565b519085613b13565b016112db565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016112b6565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bed6113ab7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613cbc565b6040519182916020835260208301906132fe565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576113f6613364565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761148e613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114cd613e69565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561155a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611650613e69565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561171c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a74565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761179b613341565b6024359060443567ffffffffffffffff811161032a576117bf903690600401613387565b916117ec7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b61182c84826118267fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09561181e613e69565b973691613695565b94613b13565b803b61183457005b73ffffffffffffffffffffffffffffffffffffffff8060209216936118a160405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906132fe565b03816000865af1908115610c7957600091611933575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361190357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116119aa575b8161194c60209383613557565b810103126119a65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6e57507fffffffff000000000000000000000000000000000000000000000000000000006118b7565b5080fd5b3d915061193f565b3461032a576119c036613458565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a03613e69565b92541691169081036103595750808414801590611b58575b61032f5760005b848110611a2b57005b611a36818388613c73565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a576000602091611a69610d23868b8e613c73565b82611ad3611aff611a7b898d8d613c73565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613557565b51925af115610c79576000513d611b4f5750803b155b611b225750600101611a22565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b15565b5082841415611a1b565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611b99613341565b73ffffffffffffffffffffffffffffffffffffffff811615611c025773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611c896004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c18565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d18613e69565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d9657815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611e04611dff613341565b6135fc565b6040519015158152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611e45613341565b60243567ffffffffffffffff811161032a5773ffffffffffffffffffffffffffffffffffffffff611e7d611ed4923690600401613427565b9290611eab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09336916135b0565b9216908115611fc45782519260005b848110611f24575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f2e8183613bd5565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f9757908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ee3565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a57611ffc366133b5565b612004613e69565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120ae575b505061208a828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b803b61209257005b610fd293604051936120a5602086613557565b6000855261415a565b6120b791613d7e565b848361205b565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610fd26120f8613341565b6121247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b13565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576040612187614014565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561220b613364565b612213613e69565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156122c657005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a74565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156124b7575b15612481575050610bed60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610bed91620186a08210156124a45761249e90620186a092613a0f565b04612451565b620186a06124b29204613a0f565b612451565b508115612444565b3461032a57610fd26124d0366133b5565b916124d9613e69565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612557575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b61256091613d7e565b858161252f565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761259e613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806125dd613e69565b9254169116908103610359575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a5761269d903690600401613387565b60243567ffffffffffffffff811161032a576126bd903690600401613387565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361032a576064359373ffffffffffffffffffffffffffffffffffffffff8516850361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61272b613e69565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612bc7575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612eb3575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612bc7575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612d845781906129b384546137c5565b601f8111612e60575b50600090601f8311600114612dbe57600092612db3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612d8457612a3e7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5546137c5565b601f8111612d00575b506000601f8211600114612c045781929394600092612bf9575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612bc7575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612a61565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612ce8575083600195969710612cb0575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612ab3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612c83565b90926020600181928686013581550194019101612c6f565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612d7a575b601f0160051c01905b818110612d6e5750612a47565b60008155600101612d61565b9091508190612d58565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806129d3565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612e485750908460019594939210612e10575b505050811b019055612a05565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612e03565b91936020600181928787013581550195019201612ded565b909150836000526020600020601f840160051c81019160208510612ea9575b90601f859493920160051c01905b818110612e9a57506129bc565b60008155849350600101612e8d565b9091508190612e7f565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612798565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612f3f613341565b6024359073ffffffffffffffffffffffffffffffffffffffff811690811590811561316c575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f8f613e69565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff821693841561313e5784861461311057612fcf818686613f94565b156130c457501561303357740100000000000000000000000000000000000000001661301f575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612ff6565b907401000000000000000000000000000000000000000082178092036130b0575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612ff8565b846000526020526040600020558380613054565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613196907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d7e565b83612f65565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611c896004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613756565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bed6113ab7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613cbc565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a57611e046020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6136cc565b60005b8381106132ee5750506000910152565b81810151838201526020016132de565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361333a815180928187528780880191016132db565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060243573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060443590565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816134a191600401613427565b9290929160243567ffffffffffffffff811161032a57816134c491600401613427565b929092916044359067ffffffffffffffff821161032a576134e791600401613427565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161353491600401613427565b929092916024359067ffffffffffffffff821161032a576134e791600401613427565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612d8457604052565b67ffffffffffffffff8111612d845760051b60200190565b9291906135bc81613598565b936135ca6040519586613557565b602085838152019160051b810192831161032a57905b8282106135ec57505050565b81358152602091820191016135e0565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156136545773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612d8457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136a18261365b565b916136af6040519384613557565b82948184528183011161032a578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613654577f01ffc9a700000000000000000000000000000000000000000000000000000000811461374f5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106a457740100000000000000000000000000000000000000001615613654576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c9216801561380e575b60208310146137df57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916137d4565b909273ffffffffffffffffffffffffffffffffffffffff169283156106d257846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561313e5773ffffffffffffffffffffffffffffffffffffffff81168095036139dd578261388c9185613f94565b15613922575b50508360005280602052826040600020558282036138d3575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386138ab565b7401000000000000000000000000000000000000000016158015613997575b61394b5780613892565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613941565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613a2257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613aab5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fc457826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416613ba757600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613be95760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613c46575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613be95760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b9081602091031261032a5751801515810361032a5790565b9060405191826000825492613cd0846137c5565b8084529360018116908115613d3e5750600114613cf7575b50613cf592500383613557565b565b90506000929192526020600020906000915b818310613d22575050906020613cf59282010138613ce8565b6020919350806001915483858901015201910190918492613d09565b60209350613cf59592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613ce8565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613e5f575b613da7575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c7957600091613e40575b5015613e135750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613e59915060203d602011610eb157610ea38183613557565b38613e0a565b50813b1515613d9f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613f85573233148015613f8a575b613f85577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613ef4575b50613ef157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c7957600091613f66575b5038613ee7565b613f7f915060203d602011610eb157610ea38183613557565b38613f5f565b503390565b5060183610613eb0565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613fbf575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613fb9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614148573233148015614150575b614148578033149081156140a7575b50614076576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c7957600091614129575b503861406a565b614142915060203d602011610eb157610ea38183613557565b38614122565b506000903690565b506018361061405b565b73ffffffffffffffffffffffffffffffffffffffff906141cc826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906132fe565b03816000865af1908115610c7957600091614230575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611903575050565b6020813d6020116142a3575b8161424960209383613557565b810103126119a65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6e57507fffffffff000000000000000000000000000000000000000000000000000000006141e2565b3d915061423c56fea264697066735822122057ffd6aa7c3f0efa56dd1464548cc267ea5823dda516cc2a24cf59e2cefa774364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x437C CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x42E1 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x23A8 ADD MSTORE DUP2 DUP2 PUSH2 0x3613 ADD MSTORE DUP2 DUP2 PUSH2 0x3E80 ADD MSTORE PUSH2 0x402B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3254 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x31F9 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x319C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2F08 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x264E JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2567 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x24BF JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x23CC JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x235D JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x21D1 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x214E JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20BE JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FEE JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E0E JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DC3 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1CA7 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C2C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B62 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19B2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1764 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15F5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1584 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1457 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13BF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1350 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1226 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11B5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1055 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFE4 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEC2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC85 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAD2 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA79 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8F0 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8B4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x34EB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x365B JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3557 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x3C5 PUSH2 0x3364 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3E6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 PUSH2 0x3EF PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6FC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6D2 JUMPI PUSH2 0x494 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3F94 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x517 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x50E JUMPI JUMPDEST PUSH2 0x4CC JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4C6 JUMP JUMPDEST PUSH2 0x522 DUP2 DUP10 DUP7 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP5 PUSH2 0x59B JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4B2 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI JUMPDEST PUSH2 0x5C4 JUMPI DUP10 PUSH2 0x55A JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5BA JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x705 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP6 DUP3 PUSH2 0x446 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x743 PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x76D PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7B1 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x837 PUSH2 0x3341 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x854 PUSH2 0x3364 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x92A PUSH2 0x3364 JUMP JUMPDEST PUSH2 0x932 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9E4 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBC4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB33 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C18 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBF1 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBED SWAP1 DUP3 ADD DUP6 PUSH2 0x32FE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xC00 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC71 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC75 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC71 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC37 DUP5 PUSH2 0x365B JUMP JUMPDEST SWAP3 PUSH2 0xC45 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3557 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC6E JUMPI POP PUSH2 0xBED SWAP3 PUSH2 0xC68 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x32DB JUMP JUMPDEST SWAP1 PUSH2 0xBD7 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xC93 CALLDATASIZE PUSH2 0x3458 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD8 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB8 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xD00 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD28 PUSH2 0xD23 DUP4 DUP6 DUP11 PUSH2 0x3C73 JUMP JUMPDEST PUSH2 0x3C83 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE8A JUMPI JUMPDEST POP ISZERO PUSH2 0xE5D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB7 PUSH2 0xD23 DUP4 DUP6 DUP11 PUSH2 0x3C73 JUMP JUMPDEST AND SWAP1 PUSH2 0xDC7 PUSH2 0xD23 DUP3 DUP7 DUP10 PUSH2 0x3C73 JUMP JUMPDEST SWAP2 PUSH2 0xDD3 DUP3 DUP8 DUP12 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE4C JUMPI JUMPDEST POP ADD PUSH2 0xCF7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE57 SWAP2 PUSH2 0x3557 JUMP JUMPDEST DUP9 PUSH2 0xE45 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEAB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEB1 JUMPI JUMPDEST PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3CA4 JUMP JUMPDEST DUP10 PUSH2 0xD8D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE99 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCF0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xEF9 PUSH2 0x3341 JUMP JUMPDEST PUSH2 0xF01 PUSH2 0x3364 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xF24 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF2F PUSH2 0x3E69 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFD4 JUMPI JUMPDEST POP POP PUSH2 0xFB5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFBD JUMPI STOP JUMPDEST PUSH2 0xFD2 SWAP6 PUSH2 0xFCC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3695 JUMP JUMPDEST SWAP4 PUSH2 0x415A JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFDD SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x108C PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1186 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10BE PUSH2 0x3E69 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1158 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11B0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D7E JUMP JUMPDEST PUSH2 0x10A0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1234 CALLDATASIZE PUSH2 0x34EB JUMP JUMPDEST PUSH2 0x1266 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH2 0x3A51 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1291 DUP2 PUSH2 0x3598 JUMP JUMPDEST SWAP5 PUSH2 0x129F PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3557 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1323 JUMPI POP POP POP SWAP1 PUSH2 0x12CC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x35B0 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12E4 JUMPI STOP JUMPDEST DUP1 PUSH2 0x131D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1309 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD AND PUSH2 0x1315 DUP4 DUP10 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3B13 JUMP JUMPDEST ADD PUSH2 0x12DB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12B6 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBED PUSH2 0x13AB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3CBC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x13F6 PUSH2 0x3364 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x148E PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14CD PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x155A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1650 PUSH2 0x3E69 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x171C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x179B PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x17BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST SWAP2 PUSH2 0x17EC PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH2 0x182C DUP5 DUP3 PUSH2 0x1826 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x181E PUSH2 0x3E69 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3695 JUMP JUMPDEST SWAP5 PUSH2 0x3B13 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1834 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x18A1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1933 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1903 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x19AA JUMPI JUMPDEST DUP2 PUSH2 0x194C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x19A6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC6E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18B7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x193F JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x19C0 CALLDATASIZE PUSH2 0x3458 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A03 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B58 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A2B JUMPI STOP JUMPDEST PUSH2 0x1A36 DUP2 DUP4 DUP9 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A69 PUSH2 0xD23 DUP7 DUP12 DUP15 PUSH2 0x3C73 JUMP JUMPDEST DUP3 PUSH2 0x1AD3 PUSH2 0x1AFF PUSH2 0x1A7B DUP10 DUP14 DUP14 PUSH2 0x3C73 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3557 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B4F JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B22 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A22 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B15 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A1B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1B99 PUSH2 0x3341 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1C02 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1C89 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C18 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D18 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D96 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1E04 PUSH2 0x1DFF PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1E45 PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E7D PUSH2 0x1ED4 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EAB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x35B0 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FC4 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F24 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F2E DUP2 DUP4 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F97 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1EE3 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1FFC CALLDATASIZE PUSH2 0x33B5 JUMP JUMPDEST PUSH2 0x2004 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20AE JUMPI JUMPDEST POP POP PUSH2 0x208A DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2092 JUMPI STOP JUMPDEST PUSH2 0xFD2 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x20A5 PUSH1 0x20 DUP7 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x415A JUMP JUMPDEST PUSH2 0x20B7 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP5 DUP4 PUSH2 0x205B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xFD2 PUSH2 0x20F8 PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x2124 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B13 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x40 PUSH2 0x2187 PUSH2 0x4014 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x220B PUSH2 0x3364 JUMP JUMPDEST PUSH2 0x2213 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22C6 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA74 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x24B7 JUMPI JUMPDEST ISZERO PUSH2 0x2481 JUMPI POP POP PUSH2 0xBED PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBED SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x24A4 JUMPI PUSH2 0x249E SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3A0F JUMP JUMPDEST DIV PUSH2 0x2451 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x24B2 SWAP3 DIV PUSH2 0x3A0F JUMP JUMPDEST PUSH2 0x2451 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2444 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xFD2 PUSH2 0x24D0 CALLDATASIZE PUSH2 0x33B5 JUMP JUMPDEST SWAP2 PUSH2 0x24D9 PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2557 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST PUSH2 0x2560 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP6 DUP2 PUSH2 0x252F JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x259E PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25DD PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x269D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x26BD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x32A JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x272B PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2EB3 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2D84 JUMPI DUP2 SWAP1 PUSH2 0x29B3 DUP5 SLOAD PUSH2 0x37C5 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2E60 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2DBE JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2DB3 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH2 0x2A3E PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x37C5 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2D00 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2C04 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2BF9 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2A61 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2CE8 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2CB0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2AB3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2C83 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2C6F JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2D7A JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D6E JUMPI POP PUSH2 0x2A47 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D61 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2D58 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x29D3 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E48 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2E10 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2A05 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2E03 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2DED JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2EA9 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E9A JUMPI POP PUSH2 0x29BC JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2E8D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2E7F JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2798 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2F3F PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x316C JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F8F PUSH2 0x3E69 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x313E JUMPI DUP5 DUP7 EQ PUSH2 0x3110 JUMPI PUSH2 0x2FCF DUP2 DUP7 DUP7 PUSH2 0x3F94 JUMP JUMPDEST ISZERO PUSH2 0x30C4 JUMPI POP ISZERO PUSH2 0x3033 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x301F JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2FF6 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x30B0 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2FF8 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3054 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3196 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D7E JUMP JUMPDEST DUP4 PUSH2 0x2F65 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1C89 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3756 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBED PUSH2 0x13AB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3CBC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1E04 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x36CC JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x32EE JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x32DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x333A DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x32DB JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x34A1 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x34C4 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x34E7 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x3534 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x34E7 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2D84 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x35BC DUP2 PUSH2 0x3598 JUMP JUMPDEST SWAP4 PUSH2 0x35CA PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x32A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x35EC JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x35E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3654 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x36A1 DUP3 PUSH2 0x365B JUMP JUMPDEST SWAP2 PUSH2 0x36AF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3557 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3654 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x374F JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6A4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3654 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x380E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x37DF JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x37D4 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6D2 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x313E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x39DD JUMPI DUP3 PUSH2 0x388C SWAP2 DUP6 PUSH2 0x3F94 JUMP JUMPDEST ISZERO PUSH2 0x3922 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x38D3 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x38AB JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3997 JUMPI JUMPDEST PUSH2 0x394B JUMPI DUP1 PUSH2 0x3892 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3941 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3A22 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3AAB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FC4 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3BA7 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3BE9 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3C46 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3BE9 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3CD0 DUP5 PUSH2 0x37C5 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3D3E JUMPI POP PUSH1 0x1 EQ PUSH2 0x3CF7 JUMPI JUMPDEST POP PUSH2 0x3CF5 SWAP3 POP SUB DUP4 PUSH2 0x3557 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3D22 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3CF5 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3CE8 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3D09 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3CF5 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3CE8 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3E5F JUMPI JUMPDEST PUSH2 0x3DA7 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E40 JUMPI JUMPDEST POP ISZERO PUSH2 0x3E13 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3E59 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x3E0A JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D9F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3F85 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3F8A JUMPI JUMPDEST PUSH2 0x3F85 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3EF4 JUMPI JUMPDEST POP PUSH2 0x3EF1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F66 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3EE7 JUMP JUMPDEST PUSH2 0x3F7F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x3F5F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3EB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3FBF JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3FB9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4148 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4150 JUMPI JUMPDEST PUSH2 0x4148 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x40A7 JUMPI JUMPDEST POP PUSH2 0x4076 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4129 JUMPI JUMPDEST POP CODESIZE PUSH2 0x406A JUMP JUMPDEST PUSH2 0x4142 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x4122 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x405B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x41CC DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4230 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1903 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x42A3 JUMPI JUMPDEST DUP2 PUSH2 0x4249 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x19A6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC6E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x41E2 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x423C JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI SELFDESTRUCT 0xD6 0xAA PUSH29 0x3F0EFA56DD1464548CC267EA5823DDA516CC2A24CF59E2CEFA77436473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"254:249:157:-:0;;;;;;;;;;;;;-1:-1:-1;;254:249:157;;;;-1:-1:-1;;;;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;254:249:157;;;;;;745:39:76;;254:249:157;;;;;;;;745:39:76;254:249:157;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;254:249:157;;;;;;-1:-1:-1;254:249:157;;;;;-1:-1:-1;254:249:157"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":13156,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":13237,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13400,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13547,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":13351,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13744,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13973,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15524,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":13191,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":13121,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":13054,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13720,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13915,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":15475,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14863,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":15548,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":13019,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":14277,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":13655,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":16730,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":15742,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14929,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":14166,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":16276,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13820,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":15123,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":16404,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":15977,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":15384,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":14028,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":14360,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":15317,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":15491,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":9128},{"length":32,"start":13843},{"length":32,"start":16000},{"length":32,"start":16427}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461325457806306fdde03146131f9578063081812fc1461319c578063095ea7b314612f085780630e07f8541461264e578063114ba8ee1461256757806323b872dd146124bf5780632a55205a146123cc5780632b4c9f161461235d5780632f2ff15d146121d157806331e66e1e1461214e57806340c10f19146120be57806342842e0e14611fee5780634684d7e914611e0e578063572b6c0514611dc357806361ba27da14611ca75780636352211e14611c2c57806370a0823114611b6257806373c8a958146119b25780638832e6e3146117645780638bb9c5bf146115f55780638da5cb5b146115845780638dc251e31461145757806391d14854146113bf57806395d89b41146113505780639da5e83214611226578063a0c76f62146111b5578063a22cb46514611055578063b0ccc31e14610fe4578063b88d4fde14610ec2578063c3666c3614610c85578063c87b56dd14610ad2578063d539139314610a79578063d547741f146108f0578063e1a8bf2c146108b4578063e985e9c514610800578063f2fde38b1461070c578063f3993d11146103865763f7ba94bd146101c957600080fd5b3461032a576101d7366134eb565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613e69565b9254169116908103610359575081810361032f5760005b81811061023857005b610243818387613c73565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d828587613c73565b35908147106102f857600080809381935af13d156102f0573d906102908261365b565b9161029e6040519384613557565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd613341565b6103c5613364565b9060443567ffffffffffffffff811161032a576103e6903690600401613427565b926103ef613e69565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106fc575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106d2576104948382849694613f94565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061051757878787818114158061050e575b6104cc57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104c6565b610522818986613c73565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578461059b575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104b2565b740100000000000000000000000000000000000000001615801561060f575b6105c4578961055a565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105ba565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61070591613d7e565b8582610446565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610743613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061076d613e69565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff16918282036107b157005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610837613341565b73ffffffffffffffffffffffffffffffffffffffff610854613364565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020604051620186a08152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561092a613364565b610932613e69565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109e457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bc46000600435610b33817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c18565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c7957600091610bf1575b60405160208082528190610bed908201856132fe565b0390f35b3d8083833e610c008183613557565b810190602081830312610c715780519067ffffffffffffffff8211610c75570181601f82011215610c7157805192610c378461365b565b92610c456040519485613557565b84845260208584010111610c6e5750610bed92610c6891602080850191016132db565b90610bd7565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461032a57610c9336613458565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd8613e69565b92541691169081036103595750808214801590610eb8575b61032f5760005b828110610d0057005b73ffffffffffffffffffffffffffffffffffffffff610d28610d2383858a613c73565b613c83565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c7957600091610e8a575b5015610e5d575073ffffffffffffffffffffffffffffffffffffffff610db7610d2383858a613c73565b1690610dc7610d23828689613c73565b91610dd382878b613c73565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c7957600192610e4c575b5001610cf7565b6000610e5791613557565b88610e45565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610eab915060203d8111610eb1575b610ea38183613557565b810190613ca4565b89610d8d565b503d610e99565b5082821415610cf0565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610ef9613341565b610f01613364565b60443560643567ffffffffffffffff811161032a57610f24903690600401613387565b929093610f2f613e69565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fd4575b5050610fb5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b823b610fbd57005b610fd295610fcc913691613695565b9361415a565b005b610fdd91613d7e565b8685610f86565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761108c613341565b602435908115159182810361032a57611186575b73ffffffffffffffffffffffffffffffffffffffff806110be613e69565b169116918183146111585760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111b0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d7e565b6110a0565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461032a57611234366134eb565b6112667fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b90613a51565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261129181613598565b9461129f6040519687613557565b818652602086019160051b81019036821161032a57915b81831061132357505050906112cc9136916135b0565b918051918351830361032f5760005b8381106112e457005b8061131d73ffffffffffffffffffffffffffffffffffffffff61130960019487613bd5565b51166113158389613bd5565b519085613b13565b016112db565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016112b6565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bed6113ab7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613cbc565b6040519182916020835260208301906132fe565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576113f6613364565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761148e613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114cd613e69565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561155a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611650613e69565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561171c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a74565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761179b613341565b6024359060443567ffffffffffffffff811161032a576117bf903690600401613387565b916117ec7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b61182c84826118267fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09561181e613e69565b973691613695565b94613b13565b803b61183457005b73ffffffffffffffffffffffffffffffffffffffff8060209216936118a160405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906132fe565b03816000865af1908115610c7957600091611933575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361190357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116119aa575b8161194c60209383613557565b810103126119a65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6e57507fffffffff000000000000000000000000000000000000000000000000000000006118b7565b5080fd5b3d915061193f565b3461032a576119c036613458565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a03613e69565b92541691169081036103595750808414801590611b58575b61032f5760005b848110611a2b57005b611a36818388613c73565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a576000602091611a69610d23868b8e613c73565b82611ad3611aff611a7b898d8d613c73565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613557565b51925af115610c79576000513d611b4f5750803b155b611b225750600101611a22565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b15565b5082841415611a1b565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611b99613341565b73ffffffffffffffffffffffffffffffffffffffff811615611c025773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611c896004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613c18565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d18613e69565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d9657815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611e04611dff613341565b6135fc565b6040519015158152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611e45613341565b60243567ffffffffffffffff811161032a5773ffffffffffffffffffffffffffffffffffffffff611e7d611ed4923690600401613427565b9290611eab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09336916135b0565b9216908115611fc45782519260005b848110611f24575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f2e8183613bd5565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f9757908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ee3565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a57611ffc366133b5565b612004613e69565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120ae575b505061208a828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b803b61209257005b610fd293604051936120a5602086613557565b6000855261415a565b6120b791613d7e565b848361205b565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610fd26120f8613341565b6121247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611260613e69565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b13565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576040612187614014565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561220b613364565b612213613e69565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156122c657005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a74565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156124b7575b15612481575050610bed60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610bed91620186a08210156124a45761249e90620186a092613a0f565b04612451565b620186a06124b29204613a0f565b612451565b508115612444565b3461032a57610fd26124d0366133b5565b916124d9613e69565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612557575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613818565b61256091613d7e565b858161252f565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761259e613341565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806125dd613e69565b9254169116908103610359575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a5761269d903690600401613387565b60243567ffffffffffffffff811161032a576126bd903690600401613387565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361032a576064359373ffffffffffffffffffffffffffffffffffffffff8516850361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61272b613e69565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612bc7575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612eb3575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612bc7575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612d845781906129b384546137c5565b601f8111612e60575b50600090601f8311600114612dbe57600092612db3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612d8457612a3e7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5546137c5565b601f8111612d00575b506000601f8211600114612c045781929394600092612bf9575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612bc7575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612a61565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612ce8575083600195969710612cb0575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612ab3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612c83565b90926020600181928686013581550194019101612c6f565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612d7a575b601f0160051c01905b818110612d6e5750612a47565b60008155600101612d61565b9091508190612d58565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806129d3565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612e485750908460019594939210612e10575b505050811b019055612a05565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612e03565b91936020600181928787013581550195019201612ded565b909150836000526020600020601f840160051c81019160208510612ea9575b90601f859493920160051c01905b818110612e9a57506129bc565b60008155849350600101612e8d565b9091508190612e7f565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612798565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612f3f613341565b6024359073ffffffffffffffffffffffffffffffffffffffff811690811590811561316c575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f8f613e69565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff821693841561313e5784861461311057612fcf818686613f94565b156130c457501561303357740100000000000000000000000000000000000000001661301f575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612ff6565b907401000000000000000000000000000000000000000082178092036130b0575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612ff8565b846000526020526040600020558380613054565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613196907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613d7e565b83612f65565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020611c896004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613756565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610bed6113ab7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613cbc565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a57611e046020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6136cc565b60005b8381106132ee5750506000910152565b81810151838201526020016132de565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361333a815180928187528780880191016132db565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060243573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060443590565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816134a191600401613427565b9290929160243567ffffffffffffffff811161032a57816134c491600401613427565b929092916044359067ffffffffffffffff821161032a576134e791600401613427565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161353491600401613427565b929092916024359067ffffffffffffffff821161032a576134e791600401613427565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612d8457604052565b67ffffffffffffffff8111612d845760051b60200190565b9291906135bc81613598565b936135ca6040519586613557565b602085838152019160051b810192831161032a57905b8282106135ec57505050565b81358152602091820191016135e0565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156136545773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612d8457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136a18261365b565b916136af6040519384613557565b82948184528183011161032a578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613654577f01ffc9a700000000000000000000000000000000000000000000000000000000811461374f5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106a457740100000000000000000000000000000000000000001615613654576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c9216801561380e575b60208310146137df57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916137d4565b909273ffffffffffffffffffffffffffffffffffffffff169283156106d257846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561313e5773ffffffffffffffffffffffffffffffffffffffff81168095036139dd578261388c9185613f94565b15613922575b50508360005280602052826040600020558282036138d3575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386138ab565b7401000000000000000000000000000000000000000016158015613997575b61394b5780613892565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613941565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613a2257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613aab5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fc457826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416613ba757600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613be95760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613c46575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613be95760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b9081602091031261032a5751801515810361032a5790565b9060405191826000825492613cd0846137c5565b8084529360018116908115613d3e5750600114613cf7575b50613cf592500383613557565b565b90506000929192526020600020906000915b818310613d22575050906020613cf59282010138613ce8565b6020919350806001915483858901015201910190918492613d09565b60209350613cf59592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613ce8565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613e5f575b613da7575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c7957600091613e40575b5015613e135750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613e59915060203d602011610eb157610ea38183613557565b38613e0a565b50813b1515613d9f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613f85573233148015613f8a575b613f85577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613ef4575b50613ef157503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610c7957600091613f66575b5038613ee7565b613f7f915060203d602011610eb157610ea38183613557565b38613f5f565b503390565b5060183610613eb0565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613fbf575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613fb9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614148573233148015614150575b614148578033149081156140a7575b50614076576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161032a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa908115610c7957600091614129575b503861406a565b614142915060203d602011610eb157610ea38183613557565b38614122565b506000903690565b506018361061405b565b73ffffffffffffffffffffffffffffffffffffffff906141cc826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906132fe565b03816000865af1908115610c7957600091614230575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611903575050565b6020813d6020116142a3575b8161424960209383613557565b810103126119a65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6e57507fffffffff000000000000000000000000000000000000000000000000000000006141e2565b3d915061423c56fea264697066735822122057ffd6aa7c3f0efa56dd1464548cc267ea5823dda516cc2a24cf59e2cefa774364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3254 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x31F9 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x319C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2F08 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x264E JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2567 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x24BF JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x23CC JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x235D JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x21D1 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x214E JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20BE JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FEE JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E0E JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DC3 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1CA7 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C2C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B62 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19B2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1764 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15F5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1584 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1457 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13BF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1350 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1226 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11B5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1055 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFE4 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEC2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC85 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAD2 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA79 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8F0 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8B4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x34EB JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x365B JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3557 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x3C5 PUSH2 0x3364 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3E6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 PUSH2 0x3EF PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6FC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6D2 JUMPI PUSH2 0x494 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3F94 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x517 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x50E JUMPI JUMPDEST PUSH2 0x4CC JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4C6 JUMP JUMPDEST PUSH2 0x522 DUP2 DUP10 DUP7 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP5 PUSH2 0x59B JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4B2 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI JUMPDEST PUSH2 0x5C4 JUMPI DUP10 PUSH2 0x55A JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5BA JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x705 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP6 DUP3 PUSH2 0x446 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x743 PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x76D PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7B1 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x837 PUSH2 0x3341 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x854 PUSH2 0x3364 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x92A PUSH2 0x3364 JUMP JUMPDEST PUSH2 0x932 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9E4 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBC4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB33 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C18 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBF1 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBED SWAP1 DUP3 ADD DUP6 PUSH2 0x32FE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xC00 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC71 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC75 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC71 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC37 DUP5 PUSH2 0x365B JUMP JUMPDEST SWAP3 PUSH2 0xC45 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3557 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC6E JUMPI POP PUSH2 0xBED SWAP3 PUSH2 0xC68 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x32DB JUMP JUMPDEST SWAP1 PUSH2 0xBD7 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xC93 CALLDATASIZE PUSH2 0x3458 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD8 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB8 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xD00 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD28 PUSH2 0xD23 DUP4 DUP6 DUP11 PUSH2 0x3C73 JUMP JUMPDEST PUSH2 0x3C83 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE8A JUMPI JUMPDEST POP ISZERO PUSH2 0xE5D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB7 PUSH2 0xD23 DUP4 DUP6 DUP11 PUSH2 0x3C73 JUMP JUMPDEST AND SWAP1 PUSH2 0xDC7 PUSH2 0xD23 DUP3 DUP7 DUP10 PUSH2 0x3C73 JUMP JUMPDEST SWAP2 PUSH2 0xDD3 DUP3 DUP8 DUP12 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE4C JUMPI JUMPDEST POP ADD PUSH2 0xCF7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE57 SWAP2 PUSH2 0x3557 JUMP JUMPDEST DUP9 PUSH2 0xE45 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEAB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEB1 JUMPI JUMPDEST PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3CA4 JUMP JUMPDEST DUP10 PUSH2 0xD8D JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE99 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCF0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xEF9 PUSH2 0x3341 JUMP JUMPDEST PUSH2 0xF01 PUSH2 0x3364 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xF24 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF2F PUSH2 0x3E69 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFD4 JUMPI JUMPDEST POP POP PUSH2 0xFB5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFBD JUMPI STOP JUMPDEST PUSH2 0xFD2 SWAP6 PUSH2 0xFCC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3695 JUMP JUMPDEST SWAP4 PUSH2 0x415A JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFDD SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x108C PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1186 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10BE PUSH2 0x3E69 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1158 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11B0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D7E JUMP JUMPDEST PUSH2 0x10A0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1234 CALLDATASIZE PUSH2 0x34EB JUMP JUMPDEST PUSH2 0x1266 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST SWAP1 PUSH2 0x3A51 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1291 DUP2 PUSH2 0x3598 JUMP JUMPDEST SWAP5 PUSH2 0x129F PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x3557 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1323 JUMPI POP POP POP SWAP1 PUSH2 0x12CC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x35B0 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12E4 JUMPI STOP JUMPDEST DUP1 PUSH2 0x131D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1309 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD AND PUSH2 0x1315 DUP4 DUP10 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3B13 JUMP JUMPDEST ADD PUSH2 0x12DB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12B6 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBED PUSH2 0x13AB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3CBC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x13F6 PUSH2 0x3364 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x148E PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14CD PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x155A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1650 PUSH2 0x3E69 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x171C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x179B PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x17BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST SWAP2 PUSH2 0x17EC PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH2 0x182C DUP5 DUP3 PUSH2 0x1826 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x181E PUSH2 0x3E69 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3695 JUMP JUMPDEST SWAP5 PUSH2 0x3B13 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1834 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x18A1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1933 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1903 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x19AA JUMPI JUMPDEST DUP2 PUSH2 0x194C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x19A6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC6E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18B7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x193F JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x19C0 CALLDATASIZE PUSH2 0x3458 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A03 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B58 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A2B JUMPI STOP JUMPDEST PUSH2 0x1A36 DUP2 DUP4 DUP9 PUSH2 0x3C73 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A69 PUSH2 0xD23 DUP7 DUP12 DUP15 PUSH2 0x3C73 JUMP JUMPDEST DUP3 PUSH2 0x1AD3 PUSH2 0x1AFF PUSH2 0x1A7B DUP10 DUP14 DUP14 PUSH2 0x3C73 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3557 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B4F JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B22 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A22 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B15 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A1B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1B99 PUSH2 0x3341 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1C02 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1C89 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3C18 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D18 PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D96 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1E04 PUSH2 0x1DFF PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x35FC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1E45 PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E7D PUSH2 0x1ED4 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EAB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x35B0 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FC4 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F24 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F2E DUP2 DUP4 PUSH2 0x3BD5 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F97 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1EE3 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1FFC CALLDATASIZE PUSH2 0x33B5 JUMP JUMPDEST PUSH2 0x2004 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20AE JUMPI JUMPDEST POP POP PUSH2 0x208A DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2092 JUMPI STOP JUMPDEST PUSH2 0xFD2 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x20A5 PUSH1 0x20 DUP7 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x415A JUMP JUMPDEST PUSH2 0x20B7 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP5 DUP4 PUSH2 0x205B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xFD2 PUSH2 0x20F8 PUSH2 0x3341 JUMP JUMPDEST PUSH2 0x2124 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1260 PUSH2 0x3E69 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B13 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x40 PUSH2 0x2187 PUSH2 0x4014 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x220B PUSH2 0x3364 JUMP JUMPDEST PUSH2 0x2213 PUSH2 0x3E69 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22C6 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA74 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x24B7 JUMPI JUMPDEST ISZERO PUSH2 0x2481 JUMPI POP POP PUSH2 0xBED PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBED SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x24A4 JUMPI PUSH2 0x249E SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3A0F JUMP JUMPDEST DIV PUSH2 0x2451 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x24B2 SWAP3 DIV PUSH2 0x3A0F JUMP JUMPDEST PUSH2 0x2451 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2444 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xFD2 PUSH2 0x24D0 CALLDATASIZE PUSH2 0x33B5 JUMP JUMPDEST SWAP2 PUSH2 0x24D9 PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2557 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3818 JUMP JUMPDEST PUSH2 0x2560 SWAP2 PUSH2 0x3D7E JUMP JUMPDEST DUP6 DUP2 PUSH2 0x252F JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x259E PUSH2 0x3341 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25DD PUSH2 0x3E69 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x269D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x26BD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3387 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x32A JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x272B PUSH2 0x3E69 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2EB3 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2D84 JUMPI DUP2 SWAP1 PUSH2 0x29B3 DUP5 SLOAD PUSH2 0x37C5 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2E60 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2DBE JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2DB3 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH2 0x2A3E PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x37C5 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2D00 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2C04 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2BF9 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BC7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2A61 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2CE8 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2CB0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2AB3 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2C83 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2C6F JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2D7A JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D6E JUMPI POP PUSH2 0x2A47 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D61 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2D58 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x29D3 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E48 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2E10 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2A05 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2E03 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2DED JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2EA9 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E9A JUMPI POP PUSH2 0x29BC JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2E8D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2E7F JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2798 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2F3F PUSH2 0x3341 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x316C JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F8F PUSH2 0x3E69 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x313E JUMPI DUP5 DUP7 EQ PUSH2 0x3110 JUMPI PUSH2 0x2FCF DUP2 DUP7 DUP7 PUSH2 0x3F94 JUMP JUMPDEST ISZERO PUSH2 0x30C4 JUMPI POP ISZERO PUSH2 0x3033 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x301F JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2FF6 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x30B0 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2FF8 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3054 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3196 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3D7E JUMP JUMPDEST DUP4 PUSH2 0x2F65 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x1C89 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3756 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xBED PUSH2 0x13AB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3CBC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x1E04 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x36CC JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x32EE JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x32DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x333A DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x32DB JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x34A1 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x34C4 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x34E7 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x3534 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x34E7 SWAP2 PUSH1 0x4 ADD PUSH2 0x3427 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2D84 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x35BC DUP2 PUSH2 0x3598 JUMP JUMPDEST SWAP4 PUSH2 0x35CA PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3557 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x32A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x35EC JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x35E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3654 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2D84 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x36A1 DUP3 PUSH2 0x365B JUMP JUMPDEST SWAP2 PUSH2 0x36AF PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3557 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3654 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x374F JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6A4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3654 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x380E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x37DF JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x37D4 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6D2 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x313E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x39DD JUMPI DUP3 PUSH2 0x388C SWAP2 DUP6 PUSH2 0x3F94 JUMP JUMPDEST ISZERO PUSH2 0x3922 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x38D3 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x38AB JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3997 JUMPI JUMPDEST PUSH2 0x394B JUMPI DUP1 PUSH2 0x3892 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3941 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3A22 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3AAB JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FC4 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3BA7 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3BE9 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3C46 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3BE9 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3CD0 DUP5 PUSH2 0x37C5 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3D3E JUMPI POP PUSH1 0x1 EQ PUSH2 0x3CF7 JUMPI JUMPDEST POP PUSH2 0x3CF5 SWAP3 POP SUB DUP4 PUSH2 0x3557 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3D22 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3CF5 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3CE8 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3D09 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3CF5 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3CE8 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3E5F JUMPI JUMPDEST PUSH2 0x3DA7 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E40 JUMPI JUMPDEST POP ISZERO PUSH2 0x3E13 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3E59 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x3E0A JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D9F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3F85 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3F8A JUMPI JUMPDEST PUSH2 0x3F85 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3EF4 JUMPI JUMPDEST POP PUSH2 0x3EF1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F66 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3EE7 JUMP JUMPDEST PUSH2 0x3F7F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x3F5F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3EB0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3FBF JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3FB9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4148 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4150 JUMPI JUMPDEST PUSH2 0x4148 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x40A7 JUMPI JUMPDEST POP PUSH2 0x4076 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4129 JUMPI JUMPDEST POP CODESIZE PUSH2 0x406A JUMP JUMPDEST PUSH2 0x4142 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEB1 JUMPI PUSH2 0xEA3 DUP2 DUP4 PUSH2 0x3557 JUMP JUMPDEST CODESIZE PUSH2 0x4122 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x405B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x41CC DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x32FE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC79 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4230 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1903 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x42A3 JUMPI JUMPDEST DUP2 PUSH2 0x4249 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3557 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x19A6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC6E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x41E2 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x423C JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI SELFDESTRUCT 0xD6 0xAA PUSH29 0x3F0EFA56DD1464548CC267EA5823DDA516CC2A24CF59E2CEFA77436473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"254:249:157:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;254:249:157;;3524:41:333;;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;254:249:157;1845:10:192;;;;;;254:249:157;1857:3:192;1876:11;;;;;:::i;:::-;254:249:157;;;;;;;;;1898:10:192;;;;;:::i;:::-;254:249:157;1375:21:9;;;:30;1371:125;;254:249:157;1548:33:9;;;;;;;254:249:157;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;254:249:157;;1834:9:192;;1591:58:9;254:249:157;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;254:249:157;5957:19:9;254:249:157;;5957:19:9;254:249:157;;;;;1371:125:9;1455:21;;1428:57;254:249:157;1428:57:9;254:249:157;;;;;;1428:57:9;254:249:157;;;;1756:63:192;1793:26;254:249:157;1793:26:192;254:249:157;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;254:249:157;;-1:-1:-1;4538:25:42;254:249:157;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3524:41:333;;;:::i;:::-;3179:19:352;254:249:157;;;;;;;;2616:14:352;2612:76;;254:249:157;29158:19:327;;254:249:157;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;254:249:157;;12884:11:327;;254:249:157;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;254:249:157;13173:304:327;-1:-1:-1;254:249:157;;;13323:10:327;254:249:157;;;;;;;;;;;2220:8:327;;254:249:157;;;;;;;;;2220:8:327;;254:249:157;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;254:249:157;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;254:249:157;;;;;;;;;;;;;;2220:8:327;13125:27;;;254:249:157;13125:27:327;;254:249:157;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;254:249:157;12987:51:327;;254:249:157;12987:51:327;254:249:157;;;;;;;;;12987:51:327;12919:59;254:249:157;;;;12958:11:327;254:249:157;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;254:249:157;12832:34:327;254:249:157;;;;;;12832:34:327;12715:64;12748:31;;254:249:157;12748:31:327;254:249:157;;;;12748:31:327;12409:58;12438:29;254:249:157;12438:29:327;254:249:157;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;254:249:157;;;;;;;;;;;;;:::i;:::-;;3524:41:333;;;:::i;:::-;254:249:157;;;;;;;;3205:23:42;;;3201:60;;254:249:157;;;3275:25:42;;;;3271:146;;254:249:157;3271:146:42;2220:8:327;;;;;;;;3361:45:42;254:249:157;3361:45:42;;254:249:157;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;254:249:157;-1:-1:-1;254:249:157;28718:11:327;254:249:157;;;;-1:-1:-1;254:249:157;28718:28:327;254:249:157;-1:-1:-1;254:249:157;;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;254:249:157;;;;;;;;;;;;;;;;;;;;;;713:6:351;254:249:157;;;;;;;;;;;;;;;;;;:::i;:::-;3524:41:333;;:::i;:::-;5148:19:42;254:249:157;;;;;;;4503:26:42;;;4499:64;;4464:19:41;254:249:157;;;;;;;;;;;;;-1:-1:-1;254:249:157;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;1880:140:41;;254:249:157;1880:140:41;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;254:249:157;;;;1973:36:41;;;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;254:249:157;;;1453:39:302;1863:70:327;254:249:157;1453:39:302;:::i;:::-;;254:249:157;3364:23:341;254:249:157;;;;3364:64:341;;;;;254:249:157;3364:64:341;;1603:4:302;254:249:157;3364:64:341;;254:249:157;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;254:249:157;3364:64:341;;;254:249:157;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;254:249:157;;;;;;;;;;;3364:64:341;254:249:157;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;254:249:157;;;3524:41:333;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;254:249:157;3852:94:192;;254:249:157;3972:10:192;;;;;;254:249:157;3984:3:192;254:249:157;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;254:249:157;;;;4058:76:192;;4108:25;254:249:157;4058:76:192;;254:249:157;4058:76:192;;;;;;;;;;;;254:249:157;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;254:249:157;4239:12:192;;;;;;:::i;:::-;254:249:157;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;254:249:157;4239:70:192;;;;;;;254:249:157;;;;;;;4239:70:192;;;;;254:249:157;4239:70:192;;4277:4;254:249:157;4239:70:192;;254:249:157;;4058:76:192;254:249:157;;;;;;;4239:70:192;;;;;;;254:249:157;4239:70:192;;;3984:3;;254:249:157;3961:9:192;;4239:70;254:249:157;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;254:249:157;4161:50:192;254:249:157;;4058:76:192;254:249:157;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;254:249:157;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3524:41:333;;;;;:::i;:::-;3179:19:352;254:249:157;;;;;;;;2616:14:352;2612:76;;254:249:157;29158:19:327;;11217:7;1863:70;;;;254:249:157;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;254:249:157;11235:101:327;11271:54;254:249:157;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;254:249:157;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;254:249:157;;3524:41:333;;;:::i;:::-;254:249:157;;;6339:18:327;;;;6335:63;;254:249:157;6463:42:327;6408:19;254:249:157;-1:-1:-1;254:249:157;6408:11:327;254:249:157;;;-1:-1:-1;254:249:157;;-1:-1:-1;254:249:157;;;;-1:-1:-1;254:249:157;;;;;;;;;;;;;;;;6463:42:327;254:249:157;6335:63:327;6366:32;;254:249:157;6366:32:327;254:249:157;;;;6366:32:327;1500:115:305;2931:8:352;668:81;254:249:157;2931:8:352;:::i;:::-;1500:115:305;;254:249:157;;;;;;;;;;;;;2991:23:341;254:249:157;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;254:249:157;3524:41:333;;:::i;:::-;1368:12:300;;:::i;:::-;254:249:157;1062:8:300;;;;:::i;:::-;254:249:157;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;254:249:157;;1062:8:300;;;;;;;;;;;254:249:157;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;254:249:157;17882:10:327;;;;;;254:249:157;17894:3:327;17920:13;17935:11;254:249:157;17920:13:327;254:249:157;17920:13:327;;;:::i;:::-;254:249:157;;17935:11:327;;;;:::i;:::-;254:249:157;17935:11:327;;;:::i;:::-;254:249:157;17871:9:327;;1062:8:300;254:249:157;;;;;;;;;1062:8:300;;;;;;;;;;254:249:157;;;;;;;;;;;;;2688:13:341;254:249:157;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;254:249:157;-1:-1:-1;254:249:157;;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;254:249:157;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3524:41:333;;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;2976:19:351;254:249:157;;;;;1732:22:351;1728:93;;254:249:157;;2220:8:327;;;;;;;254:249:157;;;1728:93:351;1777:33;254:249:157;1777:33:351;254:249:157;;1777:33:351;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3524:41:333;;:::i;:::-;254:249:157;;;;;;;;;;;;;-1:-1:-1;254:249:157;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;3741:25:41;3737:66;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;254:249:157;;;;2455:33:41;254:249:157;3737:66:41;254:249:157;3775:28:41;;;254:249:157;3775:28:41;254:249:157;;;;;;;3775:28:41;254:249:157;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;254:249:157;3524:41:333;;:::i;1586:12:303:-;15560:7:327;1863:70;;254:249:157;;3524:41:333;;;:::i;:::-;254:249:157;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;254:249:157;15578:107:327;254:249:157;;;;;;;;;29832:65:327;;;;;254:249:157;29832:65:327;;254:249:157;;29832:65:327;;254:249:157;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;254:249:157;29832:65:327;;;;;;;;254:249:157;29832:65:327;;;15578:107;254:249:157;;;;;29832:84:327;29828:136;;254:249:157;29828:136:327;29925:39;254:249:157;29925:39:327;254:249:157;;;;;;29925:39:327;29832:65;254:249:157;29832:65:327;;254:249:157;29832:65:327;;;;;;254:249:157;29832:65:327;;;:::i;:::-;;;254:249:157;;;;;;;;;;;;;29832:65:327;254:249:157;29832:65:327;;254:249:157;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;254:249:157;;;;;;;:::i;:::-;5148:19:42;;;;254:249:157;;;3524:41:333;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;254:249:157;2776:90:192;;254:249:157;2892:10:192;;;;;;254:249:157;2904:3:192;2923:9;;;;;:::i;:::-;254:249:157;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;254:249:157;;;1328:43:8;;;;;;254:249:157;;;;1328:43:8;;;254:249:157;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;254:249:157;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;254:249:157;;2881:9:192;;8938:146:8;9033:40;254:249:157;9033:40:8;254:249:157;;1328:43:8;254:249:157;9033:40:8;8942:68;254:249:157;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;254:249:157;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;254:249:157;;-1:-1:-1;254:249:157;26801:10:327;254:249:157;;;;-1:-1:-1;254:249:157;;;;;;;;26724:60:327;26756:28;254:249:157;26756:28:327;254:249:157;;26756:28:327;254:249:157;;;;;;;;;;;;3395:39:305;254:249:157;;;3395:39:305;:::i;:::-;254:249:157;;;;;;;;;;;;;;;;;;;;;;;3524:41:333;;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;2976:19:351;254:249:157;1281:36:351;713:6;1281:36;;1277:119;;254:249:157;;;;;;;;;;;;;;;1277:119:351;1340:45;254:249:157;1340:45:351;254:249:157;;;;1340:45:351;254:249:157;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1956:12:303;254:249:157;3524:41:333;;:::i;1956:12:303:-;254:249:157;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;254:249:157;;16512:9:327;254:249:157;16523:10:327;;;;;;16821:14;;;-1:-1:-1;254:249:157;16821:10:327;254:249:157;;;-1:-1:-1;254:249:157;;;;;2220:8:327;;254:249:157;;;16535:3:327;16572:11;;;;:::i;:::-;254:249:157;;;;;;;;;;;;;16597:72:327;;254:249:157;;;;;;;;;;;;;2220:8:327;16743:33;254:249:157;16743:33:327;;;;254:249:157;16512:9:327;;16597:72;16641:28;254:249:157;16641:28:327;254:249:157;;;;16641:28:327;16400:54;16429:25;254:249:157;16429:25:327;254:249:157;;16429:25:327;254:249:157;;;;;;;:::i;:::-;3524:41:333;;:::i;:::-;3179:19:352;254:249:157;;;;;;;;2616:14:352;2612:76;;254:249:157;29158:19:327;;9668:7;1863:70;;;;254:249:157;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;254:249:157;9686:99:327;9722:52;254:249:157;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;254:249:157;;;;;;;;;;;1287:7:303;254:249:157;;:::i;:::-;1232:12:303;254:249:157;3524:41:333;;:::i;1232:12:303:-;254:249:157;;;;1287:7:303;:::i;254:249:157:-;;;;;;;;;;;;3759:39:333;;:::i;:::-;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3524:41:333;;:::i;:::-;5148:19:42;254:249:157;;;;;;;4503:26:42;;;4499:64;;4464:19:41;254:249:157;;;;;;;;;;;;;-1:-1:-1;254:249:157;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;1254:25:41;1250:140;;254:249:157;1250:140:41;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;254:249:157;;;;1343:36:41;254:249:157;;;;;;;;;;;;;;;;941:19:75;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;254:249:157;2499:377:351;;;2559:17;;254:249:157;;2499:377:351;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;254:249:157;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;254:249:157;2499:377:351;;2607:259;713:6;2794:57;254:249:157;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;254:249:157;;;;2134:7:305;254:249:157;;;:::i;:::-;3524:41:333;;;:::i;:::-;254:249:157;;;;;;;;2616:14:352;2612:76;;254:249:157;29158:19:327;;254:249:157;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;254:249:157;;;;;;;;;;;;;:::i;:::-;;;3524:41:333;;;:::i;:::-;254:249:157;;;;;4503:26:42;;;4499:64;;3179:19:352;254:249:157;;;;2220:8:327;;;;;;;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3524:41:333;;:::i;:::-;254:249:157;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;254:249:157;2220:8:327;254:249:157;;;;1645:152:42;;254:249:157;-1:-1:-1;;254:249:157;;500:10:59;;254:249:157;;1124:1:42;254:249:157;;;;;;;;;500:10:59;254:249:157;;;;;;;;500:10:59;254:249:157;;;;;;;;500:10:59;254:249:157;;;;;;;;500:10:59;254:249:157;;;;;;;;500:10:59;254:249:157;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;254:249:157;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;254:249:157;2220:8:327;254:249:157;583:77:341;;;;;;;;;;:::i;:::-;;;;;;254:249:157;583:77:341;254:249:157;583:77:341;;;;;;;;254:249:157;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;254:249:157;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;254:249:157;583:77:341;;;;;;;;;;;254:249:157;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;254:249:157;2196:23:341;254:249:157;;2220:8:327;;;;;;;254:249:157;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;254:249:157;2220:8:327;1124:1:42;254:249:157;2220:8:327;254:249:157;2220:8:327;;;;;;;254:249:157;;;896:88:181;930:54;254:249:157;930:54:181;254:249:157;;1124:1:42;254:249:157;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;254:249:157;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;254:249:157;583:77:341;;;;;;;;;;254:249:157;583:77:341;;;;;;;;;;;;;;;;;;;;;254:249:157;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;254:249:157;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;254:249:157;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;254:249:157;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;254:249:157;583:77:341;254:249:157;;583:77:341;;;;;;;;;254:249:157;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;254:249:157;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;254:249:157;1740:46:42;;;;1645:152;;;;254:249:157;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;254:249:157;29158:19:327;254:249:157;3524:41:333;;:::i;:::-;254:249:157;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;254:249:157;5670:35:327;;254:249:157;5157:173:327;254:249:157;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;254:249:157;;;;;5620:11:327;254:249:157;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;254:249:157;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;254:249:157;5052:59:327;;;254:249:157;5052:59:327;254:249:157;;;;;;;;;5052:59:327;4927:63;4958:32;;254:249:157;4958:32:327;254:249:157;;;;4958:32:327;4802:64;4835:31;;254:249:157;4835:31:327;254:249:157;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;254:249:157;2931:8:352;:::i;:::-;1064:117:305;;;254:249:157;;;;;;;;;;;;3579:43:305;254:249:157;;;3579:43:305;:::i;254:249:157:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;254:249:157;1793:19:59;254:249:157;635:65:55;:::i;254:249:157:-;;;;;;;;-1:-1:-1;;254:249:157;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;254:249:157;1146:19:75;254:249:157;1146:53:75;;;1142:96;;254:249:157;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;254:249:157;1215:12:75;:::o;254:249:157:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;254:249:157;;;;;;:::o;1359:340:59:-;;254:249:157;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;254:249:157;500:10:59;;;;;254:249:157;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;254:249:157;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;254:249:157;;;28073:11:327;254:249:157;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;254:249:157;;7507:16:327;;;7503:58;;254:249:157;7521:1:327;254:249:157;;;;;7521:1:327;254:249:157;;;;;30700:19:327;;;7615:64;;254:249:157;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;254:249:157;;;7521:1:327;254:249:157;;;;;;7521:1:327;254:249:157;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;254:249:157;-1:-1:-1;254:249:157;;;;;-1:-1:-1;254:249:157;;;;;2220:8:327;;254:249:157;-1:-1:-1;254:249:157;;;;-1:-1:-1;254:249:157;8155:10:327;254:249:157;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;254:249:157;7896:51:327;;;7521:1;7896:51;254:249:157;7896:51:327;254:249:157;;;;;;7521:1:327;7896:51;7828:59;254:249:157;;7521:1:327;254:249:157;7867:11:327;;;254:249:157;;;;7521:1:327;254:249:157;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;254:249:157;;;;7521:1:327;7728:34;254:249:157;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;254:249:157;-1:-1:-1;254:249:157;;;;-1:-1:-1;254:249:157;;;;-1:-1:-1;254:249:157;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;254:249:157;3775:28:41;;-1:-1:-1;3775:28:41;254:249:157;3775:28:41;254:249:157;;;;;-1:-1:-1;3775:28:41;14035:460:327;;254:249:157;;14119:16:327;;;14115:54;;254:249:157;14133:1:327;254:249:157;;;;;;14133:1:327;254:249:157;;;14179:72:327;;14415:10;254:249:157;;14133:1:327;254:249:157;;;;;;14133:1:327;254:249:157;2220:8:327;254:249:157;-1:-1:-1;254:249:157;14415:10:327;254:249:157;;;-1:-1:-1;254:249:157;14415:10:327;254:249:157;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;254:249:157;;14133:1:327;14223:28;254:249:157;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;254:249:157;-1:-1:-1;254:249:157;;;;;-1:-1:-1;254:249:157;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;254:249:157;;-1:-1:-1;27324:31:327;254:249:157;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;254:249:157;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;254:249:157;-1:-1:-1;583:77:341;254:249:157;-1:-1:-1;254:249:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;254:249:157;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;254:249:157;;;3613:51:352;254:249:157;;3613:51:352;;;;254:249:157;3613:51:352;;3648:4;3613:51;;;254:249:157;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;254:249:157;;-1:-1:-1;3691:28:352;3613:51;;;;254:249:157;3613:51:352;254:249:157;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;254:249:157;1029:19:76;254:249:157;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;254:249:157;;;1676:74:76;;254:249:157;;;1676:74:76;;;254:249:157;1327:10:76;254:249:157;;;;1744:4:76;254:249:157;;;;;-1:-1:-1;1676:74:76;;254:249:157;;;;;;1676:74:76;;;;;;;254:249:157;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;254:249:157;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;254:249:157;;-1:-1:-1;254:249:157;30435:11:327;254:249:157;;;;-1:-1:-1;254:249:157;30435:27:327;254:249:157;-1:-1:-1;254:249:157;;;500:10:59;254:249:157;-1:-1:-1;254:249:157;500:10:59;;30413:49:327;;;;;1938:939:76;254:249:157;2065:19:76;254:249:157;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;254:249:157;720:8:80;254:249:157;720:8:80;;254:249:157;;;;2115:1:76;2802:32;;:::o;2624:153::-;254:249:157;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;254:249:157;2361:10:76;254:249:157;;;;2771:4:76;254:249:157;;;;;-1:-1:-1;2682:95:76;;254:249:157;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;254:249:157;29701:270:327;254:249:157;29701:270:327;254:249:157;29701:270:327;;;;;254:249:157;;;;;29832:65:327;;;;;254:249:157;29832:65:327;;254:249:157;29832:65:327;;;254:249:157;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;254:249:157;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;254:249:157;29832:65:327;;254:249:157;29832:65:327;;;;;;254:249:157;29832:65:327;;;:::i;:::-;;;254:249:157;;;;;;;;;;;;;29832:65:327;254:249:157;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3424200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"848","ROYALTY_FEE_DENOMINATOR()":"892","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2773","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3289","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2715","ownerOf(uint256)":"2731","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol\":\"ERC721FullProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/preset/proxied/ERC721FullProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721FullProxied} from \\\"./../../../../../token/ERC721/preset/proxied/ERC721FullProxied.sol\\\";\\n\\ncontract ERC721FullProxiedMock is ERC721FullProxied {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC721FullProxied(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xbe28c4f040f2ae7e5edb467901835664199ac622247961e8435b5f1e3c7be775\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../../base/ERC721MintableBase.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../../base/ERC721DeliverableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableBase,\\n    ERC721DeliverableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x92e23b5fdbbd1b3b1afe5209d83e10e30eea76133ba0c6cc5ee98b03b174a793\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol":{"ERC721WithoutOperatorFiltererProxiedMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461007f57601f61296f38819003918201601f19168301916001600160401b038311848410176100845780849260209460405283398101031261007f57516001600160a01b038116810361007f576080526040516128d4908161009b823960805181818161193801528181611e660152818161241201526125cd0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714611c70578063081812fc14611bf5578063095ea7b31461199d57806323b872dd1461195c5780632b4c9f16146118ed5780632f2ff15d1461176157806331e66e1e146116de57806340c10f191461164e57806342842e0e146115e55780634684d7e91461135a578063572b6c051461130f5780636352211e1461125a57806370a08231146111905780638832e6e314610ec85780638bb9c5bf14610d595780638da5cb5b14610ce857806391d1485414610c50578063a22cb46514610b25578063b88d4fde14610a6a578063d539139314610a11578063d547741f14610888578063e1c7392a14610627578063e985e9c514610573578063f2fde38b146104525763f3993d111461012f57600080fd5b3461044d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610166611cf7565b61016e611d1a565b9060443567ffffffffffffffff811161044d5761018f903690600401611daf565b91907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09273ffffffffffffffffffffffffffffffffffffffff6101d06123fb565b9516918215610423576101e68685879497612536565b159373ffffffffffffffffffffffffffffffffffffffff169160005b868110156103c55760008160051b8401359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff81168015610399578703610369578693929188918a61028a575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197528760205283604082205580a401610202565b909293945074010000000000000000000000000000000000000000915016158015610308575b6102bf5790868693923861024f565b6064918673ffffffffffffffffffffffffffffffffffffffff8c7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8b1614156102b0565b50604491867f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b868585818114158061041a575b6103d857005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156103d2565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610489611cf7565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906104b36123fb565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610546575073ffffffffffffffffffffffffffffffffffffffff16918282036104f757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576105aa611cf7565b73ffffffffffffffffffffffffffffffffffffffff6105c7611d1a565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61067f6123fb565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610856575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610801575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f8e773e13000000000000000000000000000000000000000000000000000000006000527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480549091169091179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806106ec565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004356108c2611d1a565b6108ca6123fb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361054657507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661097c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461044d5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610aa1611cf7565b610aa9611d1a565b60443560643567ffffffffffffffff811161044d57610acc903690600401611de0565b9290937fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c093610b06848484610aff6123fb565b809961203a565b823b610b0e57005b610b2395610b1d913691611eae565b936126fc565b005b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610b5c611cf7565b6024359081151580920361044d5773ffffffffffffffffffffffffffffffffffffffff80610b886123fb565b16911691818314610c225760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610c87611d1a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610db46123fb565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610e805760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a0c565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461044d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610eff611cf7565b6024359060443567ffffffffffffffff811161044d57610f23903690600401611de0565b9091610f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b9061225f565b610f978482610f917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c096610f896123fb565b963691611eae565b95612321565b803b610f9f57005b73ffffffffffffffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff604051927f150b7a0200000000000000000000000000000000000000000000000000000000845216600483015260006024830152836044830152608060648301528181519182608483015260005b83811061117857505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561116c576000916110ea575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110ba57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611164575b8161110360209383611e0e565b810103126111605751907fffffffff000000000000000000000000000000000000000000000000000000008216820361115d57507fffffffff0000000000000000000000000000000000000000000000000000000061106e565b80fd5b5080fd5b3d91506110f6565b6040513d6000823e3d90fd5b602082820181015160a4878401015285935001611019565b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576111c7611cf7565b73ffffffffffffffffffffffffffffffffffffffff8116156112305773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156112e157602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602061135061134b611cf7565b611e4f565b6040519015158152f35b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57611391611cf7565b60243567ffffffffffffffff811161044d576113b1903690600401611daf565b916113de7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09167ffffffffffffffff84116115b6578360051b604051946114246020830187611e0e565b8552602085019082019136831161044d57905b8282106115a65750505073ffffffffffffffffffffffffffffffffffffffff1690811561157c5782519260005b8481106114a5575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b815181101561154d5760208160051b83010151806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661152057908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611464565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b8135815260209182019101611437565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461044d576115f336611d3d565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161162a8282866116236123fb565b809761203a565b803b61163257005b610b239360405193611645602086611e0e565b600085526126fc565b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610b23611688611cf7565b6116b47fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612321565b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760406117176125b6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760043561179b611d1a565b6117a36123fb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361054657507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561185657005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a0c565b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461044d57610b2361196d36611d3d565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06119976123fb565b9061203a565b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576119d4611cf7565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090611a026123fb565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116928315611bc75773ffffffffffffffffffffffffffffffffffffffff1693838514611b9957611a58818585612536565b15611b4d575083611abc577401000000000000000000000000000000000000000016611aa8575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583611a7f565b90740100000000000000000000000000000000000000008217809203611b39575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055611a81565b846000526020526040600020558380611add565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576020611c526004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611f9d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361044d576113506020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d611f13565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361044d57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361044d57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261044d5760043573ffffffffffffffffffffffffffffffffffffffff8116810361044d579060243573ffffffffffffffffffffffffffffffffffffffff8116810361044d579060443590565b9181601f8401121561044d5782359167ffffffffffffffff831161044d576020808501948460051b01011161044d57565b9181601f8401121561044d5782359167ffffffffffffffff831161044d576020838186019501011161044d57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115b657604052565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611ea75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b92919267ffffffffffffffff82116115b65760405191611ef6601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184611e0e565b82948184528183011161044d578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611ea7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611f965760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561200c57740100000000000000000000000000000000000000001615611ea7576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff1692831561042357846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156122315773ffffffffffffffffffffffffffffffffffffffff81168095036121ff57826120ae9185612536565b15612144575b50508360005280602052826040600020558282036120f5575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386120cd565b74010000000000000000000000000000000000000000161580156121b9575b61216d57806120b4565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415612163565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156122b95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561157c57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166123b557600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9081602091031261044d5751801515810361044d5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561252757323314801561252c575b612527577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612486575b5061248357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561116c576000916124f8575b5038612479565b61251a915060203d602011612520575b6125128183611e0e565b8101906123e3565b386124f1565b503d612508565b503390565b5060183610612442565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315612561575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061255b565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156126ea5732331480156126f2575b6126ea57803314908115612649575b50612618576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161044d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561116c576000916126cb575b503861260c565b6126e4915060203d602011612520576125128183611e0e565b386126c4565b506000903690565b50601836106125fd565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061288657505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561116c5760009161280b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110ba575050565b6020813d60201161287e575b8161282460209383611e0e565b810103126111605751907fffffffff000000000000000000000000000000000000000000000000000000008216820361115d57507fffffffff000000000000000000000000000000000000000000000000000000006127bd565b3d9150612817565b602082820181015160a487840101528593500161276856fea2646970667358221220115c8eaf398a5400c9e3b48c287d9c1931438373466ceebc755214cd1365ba8864736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x7F JUMPI PUSH1 0x1F PUSH2 0x296F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x84 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x7F JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x7F JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x28D4 SWAP1 DUP2 PUSH2 0x9B DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x1938 ADD MSTORE DUP2 DUP2 PUSH2 0x1E66 ADD MSTORE DUP2 DUP2 PUSH2 0x2412 ADD MSTORE PUSH2 0x25CD ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1C70 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1BF5 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x199D JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x195C JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x18ED JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1761 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x16DE JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x164E JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x15E5 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x135A JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x130F JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x125A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1190 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0xEC8 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xD59 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xCE8 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xC50 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xB25 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xA6A JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA11 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x888 JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x627 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x573 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x452 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x166 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x16E PUSH2 0x1D1A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0x18F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DAF JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1D0 PUSH2 0x23FB JUMP JUMPDEST SWAP6 AND SWAP2 DUP3 ISZERO PUSH2 0x423 JUMPI PUSH2 0x1E6 DUP7 DUP6 DUP8 SWAP5 SWAP8 PUSH2 0x2536 JUMP JUMPDEST ISZERO SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3C5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x5 SHL DUP5 ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x399 JUMPI DUP8 SUB PUSH2 0x369 JUMPI DUP7 SWAP4 SWAP3 SWAP2 DUP9 SWAP2 DUP11 PUSH2 0x28A JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE DUP8 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x202 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x308 JUMPI JUMPDEST PUSH2 0x2BF JUMPI SWAP1 DUP7 DUP7 SWAP4 SWAP3 CODESIZE PUSH2 0x24F JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND EQ ISZERO PUSH2 0x2B0 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP7 DUP6 DUP6 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x41A JUMPI JUMPDEST PUSH2 0x3D8 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x3D2 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x489 PUSH2 0x1CF7 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x4B3 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4F7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x5AA PUSH2 0x1CF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x5C7 PUSH2 0x1D1A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x67F PUSH2 0x23FB JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x856 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x801 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x6EC JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8C2 PUSH2 0x1D1A JUMP JUMPDEST PUSH2 0x8CA PUSH2 0x23FB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x97C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xAA1 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0xAA9 PUSH2 0x1D1A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0xACC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DE0 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0xB06 DUP5 DUP5 DUP5 PUSH2 0xAFF PUSH2 0x23FB JUMP JUMPDEST DUP1 SWAP10 PUSH2 0x203A JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xB0E JUMPI STOP JUMPDEST PUSH2 0xB23 SWAP6 PUSH2 0xB1D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1EAE JUMP JUMPDEST SWAP4 PUSH2 0x26FC JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xB5C PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x44D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xB88 PUSH2 0x23FB JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0xC22 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xC87 PUSH2 0x1D1A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xDB4 PUSH2 0x23FB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xEFF PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0xF23 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DE0 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xF57 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH2 0x225F JUMP JUMPDEST PUSH2 0xF97 DUP5 DUP3 PUSH2 0xF91 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP7 PUSH2 0xF89 PUSH2 0x23FB JUMP JUMPDEST SWAP7 CALLDATASIZE SWAP2 PUSH2 0x1EAE JUMP JUMPDEST SWAP6 PUSH2 0x2321 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0xF9F JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1178 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10EA JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10BA JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1164 JUMPI JUMPDEST DUP2 PUSH2 0x1103 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1160 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x115D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x106E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1019 JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x11C7 PUSH2 0x1CF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1230 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH2 0x1350 PUSH2 0x134B PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x1E4F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x1391 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0x13B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DAF JUMP JUMPDEST SWAP2 PUSH2 0x13DE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x15B6 JUMPI DUP4 PUSH1 0x5 SHL PUSH1 0x40 MLOAD SWAP5 PUSH2 0x1424 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x1E0E JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x44D JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x15A6 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x157C JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x14A5 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x154D JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1520 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1464 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1437 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH2 0x15F3 CALLDATASIZE PUSH2 0x1D3D JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x162A DUP3 DUP3 DUP7 PUSH2 0x1623 PUSH2 0x23FB JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x203A JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1632 JUMPI STOP JUMPDEST PUSH2 0xB23 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x1645 PUSH1 0x20 DUP7 PUSH2 0x1E0E JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x26FC JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xB23 PUSH2 0x1688 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x16B4 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2321 JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x40 PUSH2 0x1717 PUSH2 0x25B6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x179B PUSH2 0x1D1A JUMP JUMPDEST PUSH2 0x17A3 PUSH2 0x23FB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1856 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA0C JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH2 0xB23 PUSH2 0x196D CALLDATASIZE PUSH2 0x1D3D JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1997 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH2 0x203A JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x19D4 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x1A02 PUSH2 0x23FB JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x1BC7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x1B99 JUMPI PUSH2 0x1A58 DUP2 DUP6 DUP6 PUSH2 0x2536 JUMP JUMPDEST ISZERO PUSH2 0x1B4D JUMPI POP DUP4 PUSH2 0x1ABC JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x1AA8 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x1A7F JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x1B39 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x1A81 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x1ADD JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH2 0x1C52 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1F9D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI PUSH2 0x1350 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1F13 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x44D JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x44D JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x44D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x44D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x44D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x44D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x44D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x44D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x15B6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1EA7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x15B6 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1EF6 PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD DUP5 PUSH2 0x1E0E JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x44D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1EA7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1F96 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x200C JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x1EA7 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x423 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2231 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x21FF JUMPI DUP3 PUSH2 0x20AE SWAP2 DUP6 PUSH2 0x2536 JUMP JUMPDEST ISZERO PUSH2 0x2144 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x20F5 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x20CD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x21B9 JUMPI JUMPDEST PUSH2 0x216D JUMPI DUP1 PUSH2 0x20B4 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x2163 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22B9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x157C JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x23B5 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x44D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x44D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2527 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x252C JUMPI JUMPDEST PUSH2 0x2527 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2486 JUMPI JUMPDEST POP PUSH2 0x2483 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24F8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2479 JUMP JUMPDEST PUSH2 0x251A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2520 JUMPI JUMPDEST PUSH2 0x2512 DUP2 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x23E3 JUMP JUMPDEST CODESIZE PUSH2 0x24F1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2508 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2442 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x2561 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x255B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x26EA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x26F2 JUMPI JUMPDEST PUSH2 0x26EA JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2649 JUMPI JUMPDEST POP PUSH2 0x2618 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x44D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x26CB JUMPI JUMPDEST POP CODESIZE PUSH2 0x260C JUMP JUMPDEST PUSH2 0x26E4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2520 JUMPI PUSH2 0x2512 DUP2 DUP4 PUSH2 0x1E0E JUMP JUMPDEST CODESIZE PUSH2 0x26C4 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x25FD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2886 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x280B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10BA JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x287E JUMPI JUMPDEST DUP2 PUSH2 0x2824 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1160 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x115D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x27BD JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2817 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2768 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT TLOAD DUP15 0xAF CODECOPY DUP11 SLOAD STOP 0xC9 CALLF 0xB48C 0x28 PUSH30 0x9C1931438373466CEEBC755214CD1365BA8864736F6C634300081E003300 ","sourceMap":"1240:1267:158:-:0;;;;;;;;;;;;;-1:-1:-1;;1240:1267:158;;;;-1:-1:-1;;;;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1240:1267:158;;;;;;745:39:76;;1240:1267:158;;;;;;;;745:39:76;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;;;;-1:-1:-1;1240:1267:158;;;;;-1:-1:-1;1240:1267:158"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":7415,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":7485,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":7599,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_bytes":{"entryPoint":7854,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":9187,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":7648,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":7450,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":7694,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":9980,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":8799,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":8093,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":9526,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":7759,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":8993,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgData":{"entryPoint":9654,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":9211,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":7955,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":8250,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":6456},{"length":32,"start":7782},{"length":32,"start":9234},{"length":32,"start":9677}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714611c70578063081812fc14611bf5578063095ea7b31461199d57806323b872dd1461195c5780632b4c9f16146118ed5780632f2ff15d1461176157806331e66e1e146116de57806340c10f191461164e57806342842e0e146115e55780634684d7e91461135a578063572b6c051461130f5780636352211e1461125a57806370a08231146111905780638832e6e314610ec85780638bb9c5bf14610d595780638da5cb5b14610ce857806391d1485414610c50578063a22cb46514610b25578063b88d4fde14610a6a578063d539139314610a11578063d547741f14610888578063e1c7392a14610627578063e985e9c514610573578063f2fde38b146104525763f3993d111461012f57600080fd5b3461044d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610166611cf7565b61016e611d1a565b9060443567ffffffffffffffff811161044d5761018f903690600401611daf565b91907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09273ffffffffffffffffffffffffffffffffffffffff6101d06123fb565b9516918215610423576101e68685879497612536565b159373ffffffffffffffffffffffffffffffffffffffff169160005b868110156103c55760008160051b8401359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff81168015610399578703610369578693929188918a61028a575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197528760205283604082205580a401610202565b909293945074010000000000000000000000000000000000000000915016158015610308575b6102bf5790868693923861024f565b6064918673ffffffffffffffffffffffffffffffffffffffff8c7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8b1614156102b0565b50604491867f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b868585818114158061041a575b6103d857005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156103d2565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610489611cf7565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906104b36123fb565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610546575073ffffffffffffffffffffffffffffffffffffffff16918282036104f757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576105aa611cf7565b73ffffffffffffffffffffffffffffffffffffffff6105c7611d1a565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61067f6123fb565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610856575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610801575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f8e773e13000000000000000000000000000000000000000000000000000000006000527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480549091169091179055005b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a380806106ec565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004356108c2611d1a565b6108ca6123fb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361054657507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661097c57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461044d5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610aa1611cf7565b610aa9611d1a565b60443560643567ffffffffffffffff811161044d57610acc903690600401611de0565b9290937fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c093610b06848484610aff6123fb565b809961203a565b823b610b0e57005b610b2395610b1d913691611eae565b936126fc565b005b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610b5c611cf7565b6024359081151580920361044d5773ffffffffffffffffffffffffffffffffffffffff80610b886123fb565b16911691818314610c225760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610c87611d1a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435610db46123fb565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615610e805760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a0c565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461044d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610eff611cf7565b6024359060443567ffffffffffffffff811161044d57610f23903690600401611de0565b9091610f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b9061225f565b610f978482610f917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c096610f896123fb565b963691611eae565b95612321565b803b610f9f57005b73ffffffffffffffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff604051927f150b7a0200000000000000000000000000000000000000000000000000000000845216600483015260006024830152836044830152608060648301528181519182608483015260005b83811061117857505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561116c576000916110ea575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110ba57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611164575b8161110360209383611e0e565b810103126111605751907fffffffff000000000000000000000000000000000000000000000000000000008216820361115d57507fffffffff0000000000000000000000000000000000000000000000000000000061106e565b80fd5b5080fd5b3d91506110f6565b6040513d6000823e3d90fd5b602082820181015160a4878401015285935001611019565b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576111c7611cf7565b73ffffffffffffffffffffffffffffffffffffffff8116156112305773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156112e157602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602061135061134b611cf7565b611e4f565b6040519015158152f35b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57611391611cf7565b60243567ffffffffffffffff811161044d576113b1903690600401611daf565b916113de7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09167ffffffffffffffff84116115b6578360051b604051946114246020830187611e0e565b8552602085019082019136831161044d57905b8282106115a65750505073ffffffffffffffffffffffffffffffffffffffff1690811561157c5782519260005b8481106114a5575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b815181101561154d5760208160051b83010151806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661152057908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611464565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b8135815260209182019101611437565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461044d576115f336611d3d565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161162a8282866116236123fb565b809761203a565b803b61163257005b610b239360405193611645602086611e0e565b600085526126fc565b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57610b23611688611cf7565b6116b47fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610f516123fb565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612321565b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760406117176125b6565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d5760043561179b611d1a565b6117a36123fb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361054657507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561185657005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a0c565b3461044d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461044d57610b2361196d36611d3d565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06119976123fb565b9061203a565b3461044d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576119d4611cf7565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090611a026123fb565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116928315611bc75773ffffffffffffffffffffffffffffffffffffffff1693838514611b9957611a58818585612536565b15611b4d575083611abc577401000000000000000000000000000000000000000016611aa8575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583611a7f565b90740100000000000000000000000000000000000000008217809203611b39575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055611a81565b846000526020526040600020558380611add565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576020611c526004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611f9d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461044d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261044d576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361044d576113506020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d611f13565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361044d57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361044d57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261044d5760043573ffffffffffffffffffffffffffffffffffffffff8116810361044d579060243573ffffffffffffffffffffffffffffffffffffffff8116810361044d579060443590565b9181601f8401121561044d5782359167ffffffffffffffff831161044d576020808501948460051b01011161044d57565b9181601f8401121561044d5782359167ffffffffffffffff831161044d576020838186019501011161044d57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115b657604052565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611ea75773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b92919267ffffffffffffffff82116115b65760405191611ef6601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184611e0e565b82948184528183011161044d578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611ea7577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611f965760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561200c57740100000000000000000000000000000000000000001615611ea7576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff1692831561042357846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156122315773ffffffffffffffffffffffffffffffffffffffff81168095036121ff57826120ae9185612536565b15612144575b50508360005280602052826040600020558282036120f5575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815401905582600052602052604060002060018154019055386120cd565b74010000000000000000000000000000000000000000161580156121b9575b61216d57806120b4565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415612163565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156122b95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561157c57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166123b557600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9081602091031261044d5751801515810361044d5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561252757323314801561252c575b612527577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115612486575b5061248357503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561116c576000916124f8575b5038612479565b61251a915060203d602011612520575b6125128183611e0e565b8101906123e3565b386124f1565b503d612508565b503390565b5060183610612442565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315612561575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061255b565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156126ea5732331480156126f2575b6126ea57803314908115612649575b50612618576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161044d5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561116c576000916126cb575b503861260c565b6126e4915060203d602011612520576125128183611e0e565b386126c4565b506000903690565b50601836106125fd565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061288657505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af190811561116c5760009161280b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110ba575050565b6020813d60201161287e575b8161282460209383611e0e565b810103126111605751907fffffffff000000000000000000000000000000000000000000000000000000008216820361115d57507fffffffff000000000000000000000000000000000000000000000000000000006127bd565b3d9150612817565b602082820181015160a487840101528593500161276856fea2646970667358221220115c8eaf398a5400c9e3b48c287d9c1931438373466ceebc755214cd1365ba8864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1C70 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1BF5 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x199D JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x195C JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x18ED JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1761 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x16DE JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x164E JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x15E5 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x135A JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x130F JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x125A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1190 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0xEC8 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0xD59 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xCE8 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0xC50 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xB25 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xA6A JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA11 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x888 JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x627 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x573 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x452 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x12F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x166 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x16E PUSH2 0x1D1A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0x18F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DAF JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1D0 PUSH2 0x23FB JUMP JUMPDEST SWAP6 AND SWAP2 DUP3 ISZERO PUSH2 0x423 JUMPI PUSH2 0x1E6 DUP7 DUP6 DUP8 SWAP5 SWAP8 PUSH2 0x2536 JUMP JUMPDEST ISZERO SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3C5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x5 SHL DUP5 ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x399 JUMPI DUP8 SUB PUSH2 0x369 JUMPI DUP7 SWAP4 SWAP3 SWAP2 DUP9 SWAP2 DUP11 PUSH2 0x28A JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE DUP8 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x202 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x308 JUMPI JUMPDEST PUSH2 0x2BF JUMPI SWAP1 DUP7 DUP7 SWAP4 SWAP3 CODESIZE PUSH2 0x24F JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND EQ ISZERO PUSH2 0x2B0 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP7 DUP6 DUP6 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x41A JUMPI JUMPDEST PUSH2 0x3D8 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x3D2 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x489 PUSH2 0x1CF7 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x4B3 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x4F7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x5AA PUSH2 0x1CF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x5C7 PUSH2 0x1D1A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x67F PUSH2 0x23FB JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x856 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x801 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP1 DUP1 PUSH2 0x6EC JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x8C2 PUSH2 0x1D1A JUMP JUMPDEST PUSH2 0x8CA PUSH2 0x23FB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x97C JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xAA1 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0xAA9 PUSH2 0x1D1A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0xACC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DE0 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0xB06 DUP5 DUP5 DUP5 PUSH2 0xAFF PUSH2 0x23FB JUMP JUMPDEST DUP1 SWAP10 PUSH2 0x203A JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xB0E JUMPI STOP JUMPDEST PUSH2 0xB23 SWAP6 PUSH2 0xB1D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1EAE JUMP JUMPDEST SWAP4 PUSH2 0x26FC JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xB5C PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x44D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xB88 PUSH2 0x23FB JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0xC22 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xC87 PUSH2 0x1D1A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0xDB4 PUSH2 0x23FB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA0C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xEFF PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0xF23 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DE0 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0xF57 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH2 0x225F JUMP JUMPDEST PUSH2 0xF97 DUP5 DUP3 PUSH2 0xF91 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP7 PUSH2 0xF89 PUSH2 0x23FB JUMP JUMPDEST SWAP7 CALLDATASIZE SWAP2 PUSH2 0x1EAE JUMP JUMPDEST SWAP6 PUSH2 0x2321 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0xF9F JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1178 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10EA JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10BA JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1164 JUMPI JUMPDEST DUP2 PUSH2 0x1103 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1160 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x115D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x106E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1019 JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x11C7 PUSH2 0x1CF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1230 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH2 0x1350 PUSH2 0x134B PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x1E4F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x1391 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x44D JUMPI PUSH2 0x13B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1DAF JUMP JUMPDEST SWAP2 PUSH2 0x13DE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x15B6 JUMPI DUP4 PUSH1 0x5 SHL PUSH1 0x40 MLOAD SWAP5 PUSH2 0x1424 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x1E0E JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x44D JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x15A6 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x157C JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x14A5 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x154D JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1520 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1464 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1437 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH2 0x15F3 CALLDATASIZE PUSH2 0x1D3D JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x162A DUP3 DUP3 DUP7 PUSH2 0x1623 PUSH2 0x23FB JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x203A JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1632 JUMPI STOP JUMPDEST PUSH2 0xB23 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x1645 PUSH1 0x20 DUP7 PUSH2 0x1E0E JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x26FC JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0xB23 PUSH2 0x1688 PUSH2 0x1CF7 JUMP JUMPDEST PUSH2 0x16B4 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0xF51 PUSH2 0x23FB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2321 JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x40 PUSH2 0x1717 PUSH2 0x25B6 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x179B PUSH2 0x1D1A JUMP JUMPDEST PUSH2 0x17A3 PUSH2 0x23FB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x546 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1856 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA0C JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH2 0xB23 PUSH2 0x196D CALLDATASIZE PUSH2 0x1D3D JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1997 PUSH2 0x23FB JUMP JUMPDEST SWAP1 PUSH2 0x203A JUMP JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH2 0x19D4 PUSH2 0x1CF7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x1A02 PUSH2 0x23FB JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x1BC7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x1B99 JUMPI PUSH2 0x1A58 DUP2 DUP6 DUP6 PUSH2 0x2536 JUMP JUMPDEST ISZERO PUSH2 0x1B4D JUMPI POP DUP4 PUSH2 0x1ABC JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x1AA8 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x1A7F JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x1B39 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x1A81 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x1ADD JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x20 PUSH2 0x1C52 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1F9D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x44D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI PUSH2 0x1350 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x1F13 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x44D JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x44D JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x44D JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x44D JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x44D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x44D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x44D JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x44D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x44D JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x44D JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x15B6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1EA7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x15B6 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1EF6 PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD DUP5 PUSH2 0x1E0E JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x44D JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1EA7 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1F96 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x200C JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x1EA7 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x423 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2231 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x21FF JUMPI DUP3 PUSH2 0x20AE SWAP2 DUP6 PUSH2 0x2536 JUMP JUMPDEST ISZERO PUSH2 0x2144 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x20F5 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x20CD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x21B9 JUMPI JUMPDEST PUSH2 0x216D JUMPI DUP1 PUSH2 0x20B4 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x2163 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x22B9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x157C JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x23B5 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x44D JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x44D JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2527 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x252C JUMPI JUMPDEST PUSH2 0x2527 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2486 JUMPI JUMPDEST POP PUSH2 0x2483 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24F8 JUMPI JUMPDEST POP CODESIZE PUSH2 0x2479 JUMP JUMPDEST PUSH2 0x251A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2520 JUMPI JUMPDEST PUSH2 0x2512 DUP2 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x23E3 JUMP JUMPDEST CODESIZE PUSH2 0x24F1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2508 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2442 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x2561 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x255B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x26EA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x26F2 JUMPI JUMPDEST PUSH2 0x26EA JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x2649 JUMPI JUMPDEST POP PUSH2 0x2618 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x44D JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x26CB JUMPI JUMPDEST POP CODESIZE PUSH2 0x260C JUMP JUMPDEST PUSH2 0x26E4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2520 JUMPI PUSH2 0x2512 DUP2 DUP4 PUSH2 0x1E0E JUMP JUMPDEST CODESIZE PUSH2 0x26C4 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x25FD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2886 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x116C JUMPI PUSH1 0x0 SWAP2 PUSH2 0x280B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10BA JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x287E JUMPI JUMPDEST DUP2 PUSH2 0x2824 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1E0E JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1160 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x115D JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x27BD JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2817 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2768 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT TLOAD DUP15 0xAF CODECOPY DUP11 SLOAD STOP 0xC9 CALLF 0xB48C 0x28 PUSH30 0x9C1931438373466CEEBC755214CD1365BA8864736F6C634300081E003300 ","sourceMap":"1240:1267:158:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;29158:19:327;;1240:1267:158;2224:41;1240:1267;2224:41;;:::i;:::-;1240:1267;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12884:11;;1240:1267:158;;;;12606:3:327;12594:10;;;;;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;1240:1267:158;;13125:27:327;1240:1267:158;;;;;;;;;;;;2220:8:327;13125:27;;1240:1267:158;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;1240:1267:158;12987:51:327;;1240:1267:158;12987:51:327;;;;1240:1267:158;;;;;;;12987:51:327;12919:59;1240:1267:158;;;;12958:11:327;1240:1267:158;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;1240:1267:158;12832:34:327;;;;;1240:1267:158;;;;12832:34:327;12715:64;1240:1267:158;12748:31:327;;;;;1240:1267:158;;12748:31:327;12594:10;;;;13177;;;;:25;;;12578:585;13173:304;;1240:1267:158;13173:304:327;-1:-1:-1;1240:1267:158;;;13323:10:327;1240:1267:158;;;;;;;;;;;2220:8:327;;1240:1267:158;;;;;;;;;2220:8:327;;1240:1267:158;13177:25:327;13191:11;;;;13177:25;;12409:58;12438:29;1240:1267:158;12438:29:327;1240:1267:158;;12438:29:327;1240:1267:158;;;;;;;;;;;;;;;;;:::i;:::-;;2224:41;;;:::i;:::-;1240:1267;;;;;;;;3205:23:42;;;3201:60;;1240:1267:158;;;3275:25:42;;;;3271:146;;1240:1267:158;3271:146:42;2220:8:327;;;;;;;;3361:45:42;1240:1267:158;3361:45:42;;1240:1267:158;3201:60:42;3237:24;1240:1267:158;3237:24:42;1240:1267:158;;;;3237:24:42;1240:1267:158;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;1240:1267:158;-1:-1:-1;1240:1267:158;28718:11:327;1240:1267:158;;;;-1:-1:-1;1240:1267:158;28718:28:327;1240:1267:158;-1:-1:-1;1240:1267:158;;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;1240:1267:158;;;;;;;;;;;;;;;;;;;;2224:41;;:::i;:::-;1240:1267;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1240:1267:158;2220:8:327;1240:1267:158;;;;1645:152:42;;1240:1267:158;;500:10:59;;;1240:1267:158;;1124:1:42;1240:1267:158;;;;;;;;;500:10:59;1240:1267:158;;;;;;;;500:10:59;1240:1267:158;;;;;;;;3399:33:327;-1:-1:-1;500:10:59;;1240:1267:158;;;;;;;;;;;1645:152:42;2220:8:327;;;;;;;;1240:1267:158;1740:46:42;;;;1645:152;;;;896:88:181;930:54;1240:1267:158;930:54:181;1240:1267:158;;1124:1:42;1240:1267:158;;;;930:54:181;1240:1267:158;;;;;;;;;;;;;;;:::i;:::-;2224:41;;:::i;:::-;5148:19:42;1240:1267:158;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1240:1267:158;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;1880:140:41;;1240:1267:158;1880:140:41;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1240:1267:158;;;;1973:36:41;;;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;29158:19:327;;;1240:1267:158;2224:41;11217:7:327;2224:41:158;;;;;:::i;:::-;11217:7:327;;;:::i;:::-;376:58:354;;11235:101:327;;1240:1267:158;11235:101:327;11271:54;1240:1267:158;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;1240:1267:158;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2224:41;;;:::i;:::-;1240:1267;;;6339:18:327;;;;6335:63;;1240:1267:158;6463:42:327;6408:19;1240:1267:158;-1:-1:-1;1240:1267:158;6408:11:327;1240:1267:158;;;-1:-1:-1;1240:1267:158;;-1:-1:-1;1240:1267:158;;;;-1:-1:-1;1240:1267:158;;;;;;;;;;;;;;;;6463:42:327;1240:1267:158;6335:63:327;6366:32;;1240:1267:158;6366:32:327;1240:1267:158;;;;6366:32:327;1240:1267:158;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1240:1267:158;-1:-1:-1;1240:1267:158;;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2224:41;;:::i;:::-;1240:1267;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;3741:25:41;3737:66;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1240:1267:158;;;;2455:33:41;1240:1267:158;3737:66:41;1240:1267:158;3775:28:41;;;1240:1267:158;3775:28:41;1240:1267:158;;;;;;;3775:28:41;1240:1267:158;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1586:12:303;1240:1267:158;2224:41;;:::i;:::-;1586:12:303;;:::i;:::-;15560:7:327;1863:70;;1240:1267:158;;2224:41;;;:::i;:::-;1240:1267;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;1240:1267:158;15578:107:327;1240:1267:158;;;;;;29832:65:327;1240:1267:158;29832:65:327;;1240:1267:158;;29832:65:327;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;1240:1267:158;29832:65:327;;;;;;;;1240:1267:158;29832:65:327;;;1240:1267:158;;;;;;29832:84:327;29828:136;;1240:1267:158;29828:136:327;29925:39;1240:1267:158;29925:39:327;1240:1267:158;;;;;;29925:39:327;29832:65;1240:1267:158;29832:65:327;;1240:1267:158;29832:65:327;;;;;;1240:1267:158;29832:65:327;;;:::i;:::-;;;1240:1267:158;;;;;;;;;;;;;29832:65:327;1240:1267:158;29832:65:327;;1240:1267:158;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;1240:1267:158;;-1:-1:-1;1240:1267:158;26801:10:327;1240:1267:158;;;;-1:-1:-1;1240:1267:158;;;;;;;;26724:60:327;26756:28;1240:1267:158;26756:28:327;1240:1267:158;;26756:28:327;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;1240:1267:158;;;;;;;;27291:64:327;27324:31;;1240:1267:158;27324:31:327;1240:1267:158;;;;27324:31:327;1240:1267:158;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1956:12:303;1240:1267:158;2224:41;;:::i;1956:12:303:-;1240:1267:158;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16404:16:327;;;16400:54;;1240:1267:158;;16512:9:327;1240:1267:158;16523:10:327;;;;;;16821:14;;;-1:-1:-1;1240:1267:158;16821:10:327;1240:1267:158;;;-1:-1:-1;1240:1267:158;;;;;2220:8:327;;1240:1267:158;;;16535:3:327;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:72:327;;1240:1267:158;;;;;;;;;;;;;2220:8:327;16743:33;1240:1267:158;16743:33:327;;;;1240:1267:158;16512:9:327;;16597:72;16641:28;1240:1267:158;16641:28:327;1240:1267:158;;;;16641:28:327;1240:1267:158;;;;;;;;;;16400:54:327;16429:25;1240:1267:158;16429:25:327;1240:1267:158;;16429:25:327;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2224:41;9668:7:327;2224:41:158;;;;;:::i;:::-;9668:7:327;;;:::i;:::-;376:58:354;;9686:99:327;;1240:1267:158;9686:99:327;9722:52;1240:1267:158;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;1240:1267:158:-;;;;;;;;;;;1287:7:303;1240:1267:158;;:::i;:::-;1232:12:303;1240:1267:158;2224:41;;:::i;1232:12:303:-;1240:1267:158;;;;1287:7:303;:::i;1240:1267:158:-;;;;;;;;;;;;2459:39;;:::i;:::-;1240:1267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2224:41;;:::i;:::-;5148:19:42;1240:1267:158;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1240:1267:158;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;1254:25:41;1250:140;;1240:1267:158;1250:140:41;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1240:1267:158;;;;1343:36:41;1240:1267:158;;;;;;;;;;;;;;;;941:19:75;1240:1267:158;;;;;;;;1128:7:296;1240:1267:158;;;:::i;:::-;29158:19:327;1240:1267:158;2224:41;;:::i;:::-;1128:7:296;;:::i;1240:1267:158:-;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;1240:1267:158;2224:41;;;:::i;:::-;1240:1267;;;;;;;;;;;;;;30700:19:327;;;4802:64;;1240:1267:158;;4931:18:327;;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;1240:1267:158;5670:35:327;;1240:1267:158;5157:173:327;1240:1267:158;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;1240:1267:158;;;;;5620:11:327;1240:1267:158;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;1240:1267:158;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;1240:1267:158;5052:59:327;;;1240:1267:158;5052:59:327;1240:1267:158;;;;;;;;;5052:59:327;4927:63;4958:32;;1240:1267:158;4958:32:327;1240:1267:158;;;;4958:32:327;4802:64;4835:31;;1240:1267:158;4835:31:327;1240:1267:158;;;;4835:31:327;1240:1267:158;;;;;;;;;;;;2087:43:296;1240:1267:158;;;2087:43:296;:::i;:::-;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:65:55;1240:1267:158;1793:19:59;1240:1267:158;635:65:55;:::i;1240:1267:158:-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1240:1267:158;1146:19:75;1240:1267:158;1146:53:75;;;1142:96;;1240:1267:158;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1240:1267:158;1215:12:75;:::o;1240:1267:158:-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;;;;:::o;1359:340:59:-;;1240:1267:158;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1240:1267:158;500:10:59;;;;;1240:1267:158;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;1240:1267:158;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;1240:1267:158;;;28073:11:327;1240:1267:158;;;;;;;;28066:27:327;:::o;27948:64::-;27981:31;;1240:1267:158;27981:31:327;;1240:1267:158;;;27981:31:327;7385:956;;;1240:1267:158;;7507:16:327;;;7503:58;;1240:1267:158;7521:1:327;1240:1267:158;;;;;7521:1:327;1240:1267:158;;;;;30700:19:327;;;7615:64;;1240:1267:158;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;1240:1267:158;;;7521:1:327;1240:1267:158;;;;;;7521:1:327;1240:1267:158;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;1240:1267:158;-1:-1:-1;1240:1267:158;;;;;-1:-1:-1;1240:1267:158;;;;;2220:8:327;;1240:1267:158;-1:-1:-1;1240:1267:158;;;;-1:-1:-1;1240:1267:158;8155:10:327;1240:1267:158;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;1240:1267:158;7896:51:327;;;7521:1;7896:51;1240:1267:158;7896:51:327;1240:1267:158;;;;;;7521:1:327;7896:51;7828:59;1240:1267:158;;7521:1:327;1240:1267:158;7867:11:327;;;1240:1267:158;;;;7521:1:327;1240:1267:158;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;1240:1267:158;;;;7521:1:327;7728:34;7615:64;7648:31;;7521:1;7648:31;;1240:1267:158;;7521:1:327;7648:31;3640:170:41;1240:1267:158;-1:-1:-1;1240:1267:158;;;;-1:-1:-1;1240:1267:158;;;;-1:-1:-1;1240:1267:158;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1240:1267:158;3775:28:41;;-1:-1:-1;3775:28:41;1240:1267:158;3775:28:41;1240:1267:158;;;;;-1:-1:-1;3775:28:41;14035:460:327;;1240:1267:158;;14119:16:327;;;14115:54;;1240:1267:158;14133:1:327;1240:1267:158;;;;;;14133:1:327;1240:1267:158;;;14179:72:327;;14415:10;1240:1267:158;;14133:1:327;1240:1267:158;;;;;;14133:1:327;1240:1267:158;2220:8:327;1240:1267:158;-1:-1:-1;1240:1267:158;14415:10:327;1240:1267:158;;;-1:-1:-1;1240:1267:158;14415:10:327;1240:1267:158;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;1240:1267:158;;14133:1:327;14223:28;1240:1267:158;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1240:1267:158;1029:19:76;1240:1267:158;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1240:1267:158;;;1676:74:76;;1240:1267:158;;;1676:74:76;;;1240:1267:158;1327:10:76;1240:1267:158;;;;1744:4:76;1240:1267:158;;;;;-1:-1:-1;1676:74:76;;1240:1267:158;;;;;;1676:74:76;;;;;;;1240:1267:158;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;1240:1267:158;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;1240:1267:158;;-1:-1:-1;1240:1267:158;30435:11:327;1240:1267:158;;;;-1:-1:-1;1240:1267:158;30435:27:327;1240:1267:158;-1:-1:-1;1240:1267:158;;;500:10:59;1240:1267:158;-1:-1:-1;1240:1267:158;500:10:59;;30413:49:327;;;;;1938:939:76;1240:1267:158;2065:19:76;1240:1267:158;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;1240:1267:158;720:8:80;1240:1267:158;720:8:80;;1240:1267:158;;;;2115:1:76;2802:32;;:::o;2624:153::-;1240:1267:158;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;1240:1267:158;2361:10:76;1240:1267:158;;;;2771:4:76;1240:1267:158;;;;;-1:-1:-1;2682:95:76;;1240:1267:158;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;29701:270:327;;1240:1267:158;29701:270:327;;;;;;1240:1267:158;;;;;29832:65:327;1240:1267:158;29832:65:327;;1240:1267:158;29832:65:327;;;1240:1267:158;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;1240:1267:158;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;1240:1267:158;29832:65:327;;1240:1267:158;29832:65:327;;;;;;1240:1267:158;29832:65:327;;;:::i;:::-;;;1240:1267:158;;;;;;;;;;;;;29832:65:327;1240:1267:158;29832:65:327;;;;;-1:-1:-1;29832:65:327;;1240:1267:158;;;;;;;;;;;;;;;;-1:-1:-1;1240:1267:158;;"},"gasEstimates":{"creation":{"codeDepositCost":"2090400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"562","__msgData()":"infinite","approve(address,uint256)":"infinite","balanceOf(address)":"2663","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4596","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2807","init()":"infinite","isApprovedForAll(address,address)":"3003","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","owner()":"2583","ownerOf(uint256)":"2586","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","supportsInterface(bytes4)":"2436","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","__msgData()":"31e66e1e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init()":"e1c7392a","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol\":\"ERC721WithoutOperatorFiltererProxiedMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/ERC721/proxied/ERC721WithoutOperatorFiltererProxiedMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../../../token/ERC721/libraries/ERC721Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {ERC721Base} from \\\"./../../../../token/ERC721/base/ERC721Base.sol\\\";\\nimport {ERC721BatchTransferBase} from \\\"./../../../../token/ERC721/base/ERC721BatchTransferBase.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../../../../token/ERC721/base/ERC721MintableBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721WithoutOperatorFiltererProxiedMock is\\n    ERC721Base,\\n    ERC721BatchTransferBase,\\n    ERC721MintableBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init() external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Mintable();\\n    }\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xed31e501dd662d59cfd14a4fd3de264d60ac49eb8a50d8ced8d44f9ca4520775\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol":{"OperatorFilterRegistryMock":{"abi":[{"inputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"codeHashOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToCopy","type":"address"}],"name":"copyEntriesOf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"filteredCodeHashAt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"filteredCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"filteredOperatorAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"filteredOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32","name":"codeHash","type":"bytes32"}],"name":"isCodeHashFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operatorWithCode","type":"address"}],"name":"isCodeHashOfFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isOperatorAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperatorFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToCopy","type":"address"}],"name":"registerAndCopyEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"subscription","type":"address"}],"name":"registerAndSubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToSubscribe","type":"address"}],"name":"subscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subscriberAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"subscribers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"subscriptionOf","outputs":[{"internalType":"address","name":"registrant","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"unregister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bool","name":"copyExistingEntries","type":"bool"}],"name":"unsubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateCodeHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32[]","name":"codeHashes","type":"bytes32[]"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateCodeHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address[]","name":"operators","type":"address[]"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateOperators","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"608034606257601f6106b238819003918201601f19168301916001600160401b038311848410176067578084926020946040528339810103126062575180151580910360625760ff801960005416911617600055604051610634908161007e8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c908163063298b61461025e5781631e06b4b4146101d757816322fa27621461032e575080632ec2c246146102e957806334a0dc10146102ee5780633c5030bb146101945780633f1cc5fa146102e45780634420e486146102e957806355940e51146102e45780635745ae281461018f5780635eae317314610132578063695cfe3a146102a35780636af0c315146101dc578063712fc00b1461026c5780637d3e3dbe146101d7578063a0af2903146101d7578063a14584c11461025e578063a2f367ab14610213578063a6529eb5146101dc578063b314d414146101d7578063bbd652c714610194578063c3c5a54714610194578063c43088051461018f578063c6171134146101375763e4aecb541461013257600080fd5b6105be565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761016e6103a7565b506101776103ca565b50602060ff600054166040519015158152f35b600080fd5b61052c565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576101cb6103a7565b50602060405160008152f35b6104b5565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576101cb6103a7565b3461018a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761024a6103a7565b506102536103ca565b5061025c6103fc565b005b3461018a5761025c3661040b565b3461018a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576102536103a7565b3461018a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a57602060ff600054166040519015158152f35b6101dc565b6104f5565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576103256103a7565b5061025c6103ed565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576103656103a7565b50806020810160208252606051809152604082019060809060005b81811061038e575050500390f35b8251845285945060209384019390920191600101610380565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361018a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361018a57565b60243590811515820361018a57565b60443590811515820361018a57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261018a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361018a579160243567ffffffffffffffff811161018a5760040160009280601f830112156104b15781359367ffffffffffffffff85116104ae57506020808301928560051b01011161018a579190604435801515810361018a5790565b80fd5b8380fd5b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576104ec6103a7565b5061025c6103ca565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761025c6103a7565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576105636103a7565b50604051806020810160208252606051809152604082019060809060005b81811061058f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610581565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576105f56103a7565b506101cb6103ca56fea2646970667358221220b65e4c530e2f09759da590fa39266a86f9f914197257c711014200fc4a8bf86364736f6c634300081e0033","opcodes":"PUSH1 0x80 CALLVALUE PUSH1 0x62 JUMPI PUSH1 0x1F PUSH2 0x6B2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x67 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x62 JUMPI MLOAD DUP1 ISZERO ISZERO DUP1 SWAP2 SUB PUSH1 0x62 JUMPI PUSH1 0xFF DUP1 NOT PUSH1 0x0 SLOAD AND SWAP2 AND OR PUSH1 0x0 SSTORE PUSH1 0x40 MLOAD PUSH2 0x634 SWAP1 DUP2 PUSH2 0x7E DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x63298B6 EQ PUSH2 0x25E JUMPI DUP2 PUSH4 0x1E06B4B4 EQ PUSH2 0x1D7 JUMPI DUP2 PUSH4 0x22FA2762 EQ PUSH2 0x32E JUMPI POP DUP1 PUSH4 0x2EC2C246 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x34A0DC10 EQ PUSH2 0x2EE JUMPI DUP1 PUSH4 0x3C5030BB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0x3F1CC5FA EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x4420E486 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x55940E51 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x5745AE28 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x5EAE3173 EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0x695CFE3A EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x6AF0C315 EQ PUSH2 0x1DC JUMPI DUP1 PUSH4 0x712FC00B EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x7D3E3DBE EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xA0AF2903 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xA14584C1 EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0xA2F367AB EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xA6529EB5 EQ PUSH2 0x1DC JUMPI DUP1 PUSH4 0xB314D414 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xBBD652C7 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xC3C5A547 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xC4308805 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0xC6171134 EQ PUSH2 0x137 JUMPI PUSH4 0xE4AECB54 EQ PUSH2 0x132 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x16E PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x177 PUSH2 0x3CA JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0xFF PUSH1 0x0 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x52C JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x1CB PUSH2 0x3A7 JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4B5 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x1CB PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x24A PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x253 PUSH2 0x3CA JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3FC JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH2 0x25C CALLDATASIZE PUSH2 0x40B JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x253 PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH1 0x0 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH2 0x1DC JUMP JUMPDEST PUSH2 0x4F5 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x325 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3ED JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x365 PUSH2 0x3A7 JUMP JUMPDEST POP DUP1 PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE PUSH1 0x60 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP1 PUSH1 0x80 SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x38E JUMPI POP POP POP SUB SWAP1 RETURN JUMPDEST DUP3 MLOAD DUP5 MSTORE DUP6 SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x380 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x18A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x18A JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18A JUMPI PUSH1 0x4 ADD PUSH1 0x0 SWAP3 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x4B1 JUMPI DUP2 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x4AE JUMPI POP PUSH1 0x20 DUP1 DUP4 ADD SWAP3 DUP6 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x18A JUMPI SWAP2 SWAP1 PUSH1 0x44 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x18A JUMPI SWAP1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x4EC PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3CA JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x25C PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x563 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE PUSH1 0x60 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP1 PUSH1 0x80 SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x58F JUMPI POP POP POP SUB SWAP1 RETURN JUMPDEST DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE DUP6 SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x581 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x5F5 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x1CB PUSH2 0x3CA JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 MCOPY 0x4C MSTORE8 0xE 0x2F MULMOD PUSH22 0x9DA590FA39266A86F9F914197257C711014200FC4A8B EXTCALL PUSH4 0x64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"163:2312:159:-:0;;;;;;;;;;;;;-1:-1:-1;;163:2312:159;;;;-1:-1:-1;;;;;163:2312:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;-1:-1:-1;163:2312:159;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;;-1:-1:-1;163:2312:159;;;;;-1:-1:-1;163:2312:159"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":935,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_array_bytes32_dyn_calldatat_bool":{"entryPoint":1035,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_bool":{"entryPoint":1020,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_t_address":{"entryPoint":970,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_t_bool":{"entryPoint":1005,"id":null,"parameterSlots":0,"returnSlots":1},"external_fun_copyEntriesOf":{"entryPoint":1205,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_filteredOperatorAt":{"entryPoint":null,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_isCodeHashOfFiltered":{"entryPoint":1470,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_subscribers":{"entryPoint":1324,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_unregister":{"entryPoint":1269,"id":null,"parameterSlots":0,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b60003560e01c908163063298b61461025e5781631e06b4b4146101d757816322fa27621461032e575080632ec2c246146102e957806334a0dc10146102ee5780633c5030bb146101945780633f1cc5fa146102e45780634420e486146102e957806355940e51146102e45780635745ae281461018f5780635eae317314610132578063695cfe3a146102a35780636af0c315146101dc578063712fc00b1461026c5780637d3e3dbe146101d7578063a0af2903146101d7578063a14584c11461025e578063a2f367ab14610213578063a6529eb5146101dc578063b314d414146101d7578063bbd652c714610194578063c3c5a54714610194578063c43088051461018f578063c6171134146101375763e4aecb541461013257600080fd5b6105be565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761016e6103a7565b506101776103ca565b50602060ff600054166040519015158152f35b600080fd5b61052c565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576101cb6103a7565b50602060405160008152f35b6104b5565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576101cb6103a7565b3461018a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761024a6103a7565b506102536103ca565b5061025c6103fc565b005b3461018a5761025c3661040b565b3461018a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576102536103a7565b3461018a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a57602060ff600054166040519015158152f35b6101dc565b6104f5565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576103256103a7565b5061025c6103ed565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576103656103a7565b50806020810160208252606051809152604082019060809060005b81811061038e575050500390f35b8251845285945060209384019390920191600101610380565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361018a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361018a57565b60243590811515820361018a57565b60443590811515820361018a57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261018a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361018a579160243567ffffffffffffffff811161018a5760040160009280601f830112156104b15781359367ffffffffffffffff85116104ae57506020808301928560051b01011161018a579190604435801515810361018a5790565b80fd5b8380fd5b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576104ec6103a7565b5061025c6103ca565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a5761025c6103a7565b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576105636103a7565b50604051806020810160208252606051809152604082019060809060005b81811061058f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610581565b3461018a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576105f56103a7565b506101cb6103ca56fea2646970667358221220b65e4c530e2f09759da590fa39266a86f9f914197257c711014200fc4a8bf86364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x63298B6 EQ PUSH2 0x25E JUMPI DUP2 PUSH4 0x1E06B4B4 EQ PUSH2 0x1D7 JUMPI DUP2 PUSH4 0x22FA2762 EQ PUSH2 0x32E JUMPI POP DUP1 PUSH4 0x2EC2C246 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x34A0DC10 EQ PUSH2 0x2EE JUMPI DUP1 PUSH4 0x3C5030BB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0x3F1CC5FA EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x4420E486 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x55940E51 EQ PUSH2 0x2E4 JUMPI DUP1 PUSH4 0x5745AE28 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x5EAE3173 EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0x695CFE3A EQ PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x6AF0C315 EQ PUSH2 0x1DC JUMPI DUP1 PUSH4 0x712FC00B EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x7D3E3DBE EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xA0AF2903 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xA14584C1 EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0xA2F367AB EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xA6529EB5 EQ PUSH2 0x1DC JUMPI DUP1 PUSH4 0xB314D414 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0xBBD652C7 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xC3C5A547 EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xC4308805 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0xC6171134 EQ PUSH2 0x137 JUMPI PUSH4 0xE4AECB54 EQ PUSH2 0x132 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x16E PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x177 PUSH2 0x3CA JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0xFF PUSH1 0x0 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x52C JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x1CB PUSH2 0x3A7 JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4B5 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x1CB PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x24A PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x253 PUSH2 0x3CA JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3FC JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH2 0x25C CALLDATASIZE PUSH2 0x40B JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x253 PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH1 0x0 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH2 0x1DC JUMP JUMPDEST PUSH2 0x4F5 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x325 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3ED JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x365 PUSH2 0x3A7 JUMP JUMPDEST POP DUP1 PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE PUSH1 0x60 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP1 PUSH1 0x80 SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x38E JUMPI POP POP POP SUB SWAP1 RETURN JUMPDEST DUP3 MLOAD DUP5 MSTORE DUP6 SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x380 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x18A JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x18A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x18A JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18A JUMPI PUSH1 0x4 ADD PUSH1 0x0 SWAP3 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x4B1 JUMPI DUP2 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x4AE JUMPI POP PUSH1 0x20 DUP1 DUP4 ADD SWAP3 DUP6 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x18A JUMPI SWAP2 SWAP1 PUSH1 0x44 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x18A JUMPI SWAP1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x4EC PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x25C PUSH2 0x3CA JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x25C PUSH2 0x3A7 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x563 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 DUP2 ADD PUSH1 0x20 DUP3 MSTORE PUSH1 0x60 MLOAD DUP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD SWAP1 PUSH1 0x80 SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x58F JUMPI POP POP POP SUB SWAP1 RETURN JUMPDEST DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 MSTORE DUP6 SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x581 JUMP JUMPDEST CALLVALUE PUSH2 0x18A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x18A JUMPI PUSH2 0x5F5 PUSH2 0x3A7 JUMP JUMPDEST POP PUSH2 0x1CB PUSH2 0x3CA JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 MCOPY 0x4C MSTORE8 0xE 0x2F MULMOD PUSH22 0x9DA590FA39266A86F9F914197257C711014200FC4A8B EXTCALL PUSH4 0x64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"163:2312:159:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;163:2312:159;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i"},"gasEstimates":{"creation":{"codeDepositCost":"317600","executionCost":"infinite","totalCost":"infinite"},"external":{"codeHashOf(address)":"655","copyEntriesOf(address,address)":"284","filteredCodeHashAt(address,uint256)":"611","filteredCodeHashes(address)":"infinite","filteredOperatorAt(address,uint256)":"359","filteredOperators(address)":"infinite","isCodeHashFiltered(address,bytes32)":"479","isCodeHashOfFiltered(address,address)":"510","isOperatorAllowed(address,address)":"2899","isOperatorFiltered(address,address)":"815","isRegistered(address)":"677","operatorAllowed()":"2509","register(address)":"355","registerAndCopyEntries(address,address)":"594","registerAndSubscribe(address,address)":"572","subscribe(address,address)":"682","subscriberAt(address,uint256)":"403","subscribers(address)":"infinite","subscriptionOf(address)":"325","unregister(address)":"267","unsubscribe(address,bool)":"340","updateCodeHash(address,bytes32,bool)":"538","updateCodeHashes(address,bytes32[],bool)":"383","updateOperator(address,address,bool)":"689","updateOperators(address,address[],bool)":"737"}},"methodIdentifiers":{"codeHashOf(address)":"bbd652c7","copyEntriesOf(address,address)":"1e06b4b4","filteredCodeHashAt(address,uint256)":"a6529eb5","filteredCodeHashes(address)":"22fa2762","filteredOperatorAt(address,uint256)":"3f1cc5fa","filteredOperators(address)":"c4308805","isCodeHashFiltered(address,bytes32)":"6af0c315","isCodeHashOfFiltered(address,address)":"5eae3173","isOperatorAllowed(address,address)":"c6171134","isOperatorFiltered(address,address)":"e4aecb54","isRegistered(address)":"c3c5a547","operatorAllowed()":"695cfe3a","register(address)":"4420e486","registerAndCopyEntries(address,address)":"a0af2903","registerAndSubscribe(address,address)":"7d3e3dbe","subscribe(address,address)":"b314d414","subscriberAt(address,uint256)":"55940e51","subscribers(address)":"5745ae28","subscriptionOf(address)":"3c5030bb","unregister(address)":"2ec2c246","unsubscribe(address,bool)":"34a0dc10","updateCodeHash(address,bytes32,bool)":"712fc00b","updateCodeHashes(address,bytes32[],bool)":"063298b6","updateOperator(address,address,bool)":"a2f367ab","updateOperators(address,address[],bool)":"a14584c1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"codeHashOf\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToCopy\",\"type\":\"address\"}],\"name\":\"copyEntriesOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"filteredCodeHashAt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"filteredCodeHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"filteredOperatorAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"filteredOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"codeHash\",\"type\":\"bytes32\"}],\"name\":\"isCodeHashFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operatorWithCode\",\"type\":\"address\"}],\"name\":\"isCodeHashOfFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOperatorAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperatorFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToCopy\",\"type\":\"address\"}],\"name\":\"registerAndCopyEntries\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"subscription\",\"type\":\"address\"}],\"name\":\"registerAndSubscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToSubscribe\",\"type\":\"address\"}],\"name\":\"subscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"subscriberAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"name\":\"subscribers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"subscriptionOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"unregister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"copyExistingEntries\",\"type\":\"bool\"}],\"name\":\"unsubscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"codehash\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateCodeHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"codeHashes\",\"type\":\"bytes32[]\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateCodeHashes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"operators\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol\":\"OperatorFilterRegistryMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../../../token/royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\n\\ncontract OperatorFilterRegistryMock is IOperatorFilterRegistry {\\n    bool public operatorAllowed;\\n\\n    constructor(bool allowed) {\\n        operatorAllowed = allowed;\\n    }\\n\\n    function isOperatorAllowed(address, address) external view returns (bool) {\\n        return operatorAllowed;\\n    }\\n\\n    function register(address registrant) external {}\\n\\n    function registerAndSubscribe(address registrant, address subscription) external {}\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external {}\\n\\n    function unregister(address addr) external {}\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external {}\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external {}\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external {}\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external {}\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external {}\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external {}\\n\\n    function subscriptionOf(address addr) external returns (address registrant) {}\\n\\n    function subscribers(address registrant) external returns (address[] memory) {}\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address) {}\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external {}\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool) {}\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool) {}\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool) {}\\n\\n    function filteredOperators(address addr) external returns (address[] memory) {}\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory) {}\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address) {}\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32) {}\\n\\n    function isRegistered(address addr) external returns (bool) {}\\n\\n    function codeHashOf(address addr) external returns (bytes32) {}\\n}\\n\",\"keccak256\":\"0x1387c4ce756ecc59e4be483f8527031ed29e332e797731c4c9c1c07e354d501d\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":17989,"contract":"contracts/mocks/token/royalty/OperatorFilterRegistryMock.sol:OperatorFilterRegistryMock","label":"operatorAllowed","offset":0,"slot":"0","type":"t_bool"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol":{"ERC2981FacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC2981","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initERC2981()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}}},"title":"ERC2981FacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f61099c38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516109139081610089823960805181818161066701526107c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80632a55205a146104bc57806331e66e1e1461043957806361ba27da1461031d5780638dc251e3146101d9578063d60da2011461009f5763e1a8bf2c1461005e57600080fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576020604051620186a08152f35b600080fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576100d66107b2565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101ac577f2a55205a000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e52080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a5760043573ffffffffffffffffffffffffffffffffffffffff811680910361009a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102686107b2565b92541691169081036102f057507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579080156102c65781547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061038e6107b2565b92541691169081036102f057507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161040c57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576040610472610650565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461009a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a5760406024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c8115801561057e575b1561054c57505060005b73ffffffffffffffffffffffffffffffffffffffff8351921682526020820152f35b620186a082101561056b5761056590620186a092610586565b0461052a565b620186a06105799204610586565b61052a565b508015610520565b8181029291811591840414171561059957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761060957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261009a5751801515810361009a5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107a05732331480156107a8575b6107a0578033149081156106e3575b506106b2576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161009a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561079457600091610765575b50386106a6565b610787915060203d60201161078d575b61077f81836105c8565b810190610638565b3861075e565b503d610775565b6040513d6000823e3d90fd5b506000903690565b5060183610610697565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108ce5732331480156108d3575b6108ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561083d575b5061083a57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610794576000916108af575b5038610830565b6108c8915060203d60201161078d5761077f81836105c8565b386108a8565b503390565b50601836106107f956fea26469706673582212200f3519c05ae76c3819aa0591779c6bac4a15b96b3a531061d2ae445b9c30949564736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x99C CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x913 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x667 ADD MSTORE PUSH2 0x7C9 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2A55205A EQ PUSH2 0x4BC JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x439 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0xD60DA201 EQ PUSH2 0x9F JUMPI PUSH4 0xE1A8BF2C EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH2 0xD6 PUSH2 0x7B2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AC JUMPI PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x9A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x268 PUSH2 0x7B2 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F0 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 DUP1 ISZERO PUSH2 0x2C6 JUMPI DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x38E PUSH2 0x7B2 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F0 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x40C JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x40 PUSH2 0x472 PUSH2 0x650 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x40 PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR DUP2 ISZERO DUP1 ISZERO PUSH2 0x57E JUMPI JUMPDEST ISZERO PUSH2 0x54C JUMPI POP POP PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 MLOAD SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE RETURN JUMPDEST PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x56B JUMPI PUSH2 0x565 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x586 JUMP JUMPDEST DIV PUSH2 0x52A JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x579 SWAP3 DIV PUSH2 0x586 JUMP JUMPDEST PUSH2 0x52A JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x520 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x599 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x609 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x9A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x9A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7A0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7A8 JUMPI JUMPDEST PUSH2 0x7A0 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6E3 JUMPI JUMPDEST POP PUSH2 0x6B2 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x9A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x794 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x765 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6A6 JUMP JUMPDEST PUSH2 0x787 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x78D JUMPI JUMPDEST PUSH2 0x77F DUP2 DUP4 PUSH2 0x5C8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x638 JUMP JUMPDEST CODESIZE PUSH2 0x75E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x775 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x697 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8CE JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8D3 JUMPI JUMPDEST PUSH2 0x8CE JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x83D JUMPI JUMPDEST POP PUSH2 0x83A JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x794 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8AF JUMPI JUMPDEST POP CODESIZE PUSH2 0x830 JUMP JUMPDEST PUSH2 0x8C8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x78D JUMPI PUSH2 0x77F DUP2 DUP4 PUSH2 0x5C8 JUMP JUMPDEST CODESIZE PUSH2 0x8A8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7F9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF CALLDATALOAD NOT 0xC0 GAS SWAPN 0x6C CODESIZE NOT 0xAA SDIV SWAP2 PUSH24 0x9C6BAC4A15B96B3A531061D2AE445B9C30949564736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:234:160:-:0;;;;;;;;;;;;;-1:-1:-1;;259:234:160;;;;-1:-1:-1;;;;;259:234:160;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;259:234:160;;;;;;745:39:76;;259:234:160;;;;;;;;745:39:76;259:234:160;;;;;;;;;;;;-1:-1:-1;259:234:160;;;;;;-1:-1:-1;259:234:160;;;;;-1:-1:-1;259:234:160"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1592,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"checked_mul_uint256":{"entryPoint":1414,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":1480,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1616,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1970,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1639},{"length":32,"start":1993}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80632a55205a146104bc57806331e66e1e1461043957806361ba27da1461031d5780638dc251e3146101d9578063d60da2011461009f5763e1a8bf2c1461005e57600080fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576020604051620186a08152f35b600080fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576100d66107b2565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101ac577f2a55205a000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e52080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a5760043573ffffffffffffffffffffffffffffffffffffffff811680910361009a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806102686107b2565b92541691169081036102f057507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579080156102c65781547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061038e6107b2565b92541691169081036102f057507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161040c57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461009a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a576040610472610650565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b3461009a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009a5760406024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c8115801561057e575b1561054c57505060005b73ffffffffffffffffffffffffffffffffffffffff8351921682526020820152f35b620186a082101561056b5761056590620186a092610586565b0461052a565b620186a06105799204610586565b61052a565b508015610520565b8181029291811591840414171561059957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761060957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261009a5751801515810361009a5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107a05732331480156107a8575b6107a0578033149081156106e3575b506106b2576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36019036821161009a5760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561079457600091610765575b50386106a6565b610787915060203d60201161078d575b61077f81836105c8565b810190610638565b3861075e565b503d610775565b6040513d6000823e3d90fd5b506000903690565b5060183610610697565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108ce5732331480156108d3575b6108ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561083d575b5061083a57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa908115610794576000916108af575b5038610830565b6108c8915060203d60201161078d5761077f81836105c8565b386108a8565b503390565b50601836106107f956fea26469706673582212200f3519c05ae76c3819aa0591779c6bac4a15b96b3a531061d2ae445b9c30949564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2A55205A EQ PUSH2 0x4BC JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0x439 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0xD60DA201 EQ PUSH2 0x9F JUMPI PUSH4 0xE1A8BF2C EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH2 0xD6 PUSH2 0x7B2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1AC JUMPI PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x9A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x268 PUSH2 0x7B2 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F0 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 DUP1 ISZERO PUSH2 0x2C6 JUMPI DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x38E PUSH2 0x7B2 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2F0 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x40C JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x40 PUSH2 0x472 PUSH2 0x650 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x9A JUMPI PUSH1 0x40 PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR DUP2 ISZERO DUP1 ISZERO PUSH2 0x57E JUMPI JUMPDEST ISZERO PUSH2 0x54C JUMPI POP POP PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 MLOAD SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE RETURN JUMPDEST PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x56B JUMPI PUSH2 0x565 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x586 JUMP JUMPDEST DIV PUSH2 0x52A JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x579 SWAP3 DIV PUSH2 0x586 JUMP JUMPDEST PUSH2 0x52A JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x520 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x599 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x609 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x9A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x9A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7A0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7A8 JUMPI JUMPDEST PUSH2 0x7A0 JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6E3 JUMPI JUMPDEST POP PUSH2 0x6B2 JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x9A JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x794 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x765 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6A6 JUMP JUMPDEST PUSH2 0x787 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x78D JUMPI JUMPDEST PUSH2 0x77F DUP2 DUP4 PUSH2 0x5C8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x638 JUMP JUMPDEST CODESIZE PUSH2 0x75E JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x775 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x697 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8CE JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8D3 JUMPI JUMPDEST PUSH2 0x8CE JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x83D JUMPI JUMPDEST POP PUSH2 0x83A JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x794 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8AF JUMPI JUMPDEST POP CODESIZE PUSH2 0x830 JUMP JUMPDEST PUSH2 0x8C8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x78D JUMPI PUSH2 0x77F DUP2 DUP4 PUSH2 0x5C8 JUMP JUMPDEST CODESIZE PUSH2 0x8A8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7F9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF CALLDATALOAD NOT 0xC0 GAS SWAPN 0x6C CODESIZE NOT 0xAA SDIV SWAP2 PUSH24 0x9C6BAC4A15B96B3A531061D2AE445B9C30949564736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"259:234:160:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;713:6:351;259:234:160;;;;;;;;;;;;;;;;;;1536:41:347;;:::i;:::-;259:234:160;;;;;;;3174:18:180;;;3170:53;;897:26:351;259:234:160;500:10:59;259:234:160;500:10:59;;;;;;;636:1:180;500:10:59;;;259:234:160;3170:53:180;3201:22;259:234:160;3201:22:180;259:234:160;;;;3201:22:180;259:234:160;;;;;;;;;;;;;;;;;;;;;;;1536:41:347;;;:::i;:::-;259:234:160;;;;;4503:26:42;;;4499:64;;2976:19:351;259:234:160;1732:22:351;;;1728:93;;259:234:160;;;;;;;;1728:93:351;1777:33;259:234:160;1777:33:351;259:234:160;;1777:33:351;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;259:234:160;;-1:-1:-1;4538:25:42;259:234:160;;;;;;;;;;;;;;;1536:41:347;;;:::i;:::-;259:234:160;;;;;4503:26:42;;;4499:64;;2976:19:351;259:234:160;1281:36:351;713:6;1281:36;;1277:119;;259:234:160;;;;;;;;;;;;;;;1277:119:351;1340:45;259:234:160;1340:45:351;259:234:160;;;;1340:45:351;259:234:160;;;;;;;;;;;;1771:39:347;;:::i;:::-;259:234:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;:40;;;;259:234:160;2499:377:351;;;2559:17;;259:234:160;2499:377:351;259:234:160;;;;;;;;;;;;2499:377:351;713:6;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;259:234:160;2499:377:351;;2607:259;713:6;2794:57;259:234:160;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;259:234:160;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;259:234:160;;;;;-1:-1:-1;259:234:160;;;;;;;;;;;;;;;;;;;:::o;1938:939:76:-;259:234:160;2065:19:76;259:234:160;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;259:234:160;720:8:80;259:234:160;720:8:80;;259:234:160;;;;2115:1:76;2802:32;;:::o;2624:153::-;259:234:160;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;259:234:160;2361:10:76;259:234:160;;;;2771:4:76;259:234:160;;;;;-1:-1:-1;2682:95:76;;259:234:160;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;259:234:160;;;2115:1:76;259:234:160;;;;;2357:93:76;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;;907:917;259:234:160;1029:19:76;259:234:160;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;259:234:160;;;1676:74:76;;259:234:160;;;1676:74:76;;;259:234:160;1327:10:76;259:234:160;;;;1744:4:76;259:234:160;;;;;-1:-1:-1;1676:74:76;;259:234:160;;;;;;1676:74:76;;;;;;;259:234:160;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"464600","executionCost":"infinite","totalCost":"infinite"},"external":{"ROYALTY_FEE_DENOMINATOR()":"251","__msgData()":"infinite","initERC2981()":"infinite","royaltyInfo(uint256,uint256)":"2480","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite"}},"methodIdentifiers":{"ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","__msgData()":"31e66e1e","initERC2981()":"d60da201","royaltyInfo(uint256,uint256)":"2a55205a","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC2981\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initERC2981()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}}},\"title\":\"ERC2981FacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC2981()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC2981.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol\":\"ERC2981FacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/royalty/facets/ERC2981FacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2981Facet} from \\\"./../../../../token/royalty/facets/ERC2981Facet.sol\\\";\\n\\n/// @title ERC2981FacetMock\\ncontract ERC2981FacetMock is ERC2981Facet {\\n    constructor(IForwarderRegistry forwarderRegistry) ERC2981Facet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x5a2f95c566b3056b3149b75cf87ffb64853580c2113ddeb0350491cbd430c2c5\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/facets/ERC2981Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC2981Base} from \\\"./../base/ERC2981Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}.\\ncontract ERC2981Facet is ERC2981Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC2981() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC2981Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3171eae90bc8b8fd1db5f82dc14d4e9bbe82b55ec2aff55c9f9f4f6e71b9a630\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC2981()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC2981."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."}},"version":1}}},"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol":{"OperatorFiltererFacetMock":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"__msgData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"operatorFilterRegistry","type":"address"}],"name":"initOperatorFilterer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initOperatorFilterer(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"operatorFilterRegistry":"The operator filter registry address. When set to the zero address, checks will be bypassed."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"OperatorFiltererFacetMock","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606d57601f6107be38819003918201601f19168301916001600160401b03831184841017607257808492602094604052833981010312606d57516001600160a01b0381168103606d576080526040516107359081610089823960805181818161048901526105d00152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063114ba8ee146102d657806330fd6a751461014157806331e66e1e146100be5763b0ccc31e1461004857600080fd5b346100b95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b957602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b600080fd5b346100b95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760406100f76105b9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100b95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b957610199610472565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036102a957507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015610277575060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5581547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b95761032e610472565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541691169081036103bd57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761042b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100b9575180151581036100b95790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156105aa5732331480156105af575b6105aa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156104fd575b506104fa57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561059e5760009161056f575b50386104f0565b610591915060203d602011610597575b61058981836103ea565b81019061045a565b38610568565b503d61057f565b6040513d6000823e3d90fd5b503390565b50601836106104b9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106ed5732331480156106f5575b6106ed5780331490811561064c575b5061061b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b95760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561059e576000916106ce575b503861060f565b6106e7915060203d6020116105975761058981836103ea565b386106c7565b506000903690565b506018361061060056fea26469706673582212207ad38f19ac2349ca676c0890144c4cae82704b7aa032b75f39fa90cbb310dd7664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x6D JUMPI PUSH1 0x1F PUSH2 0x7BE CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x72 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x6D JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x6D JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x735 SWAP1 DUP2 PUSH2 0x89 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x489 ADD MSTORE PUSH2 0x5D0 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2D6 JUMPI DUP1 PUSH4 0x30FD6A75 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0xBE JUMPI PUSH4 0xB0CCC31E EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x40 PUSH2 0xF7 PUSH2 0x5B9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB9 JUMPI PUSH2 0x199 PUSH2 0x472 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2A9 JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x277 JUMPI POP PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB9 JUMPI PUSH2 0x32E PUSH2 0x472 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3BD JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x42B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB9 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB9 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x5AA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x5AF JUMPI JUMPDEST PUSH2 0x5AA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4FD JUMPI JUMPDEST POP PUSH2 0x4FA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x56F JUMPI JUMPDEST POP CODESIZE PUSH2 0x4F0 JUMP JUMPDEST PUSH2 0x591 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x597 JUMPI JUMPDEST PUSH2 0x589 DUP2 DUP4 PUSH2 0x3EA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x45A JUMP JUMPDEST CODESIZE PUSH2 0x568 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x57F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4B9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6ED JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6F5 JUMPI JUMPDEST PUSH2 0x6ED JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x64C JUMPI JUMPDEST POP PUSH2 0x61B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB9 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x60F JUMP JUMPDEST PUSH2 0x6E7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x597 JUMPI PUSH2 0x589 DUP2 DUP4 PUSH2 0x3EA JUMP JUMPDEST CODESIZE PUSH2 0x6C7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x600 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH27 0xD38F19AC2349CA676C0890144C4CAE82704B7AA032B75F39FA90CB 0xB3 LT 0xDD PUSH23 0x64736F6C634300081E0033000000000000000000000000 ","sourceMap":"286:261:161:-:0;;;;;;;;;;;;;-1:-1:-1;;286:261:161;;;;-1:-1:-1;;;;;286:261:161;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;286:261:161;;;;;;745:39:76;;286:261:161;;;;;;;;745:39:76;286:261:161;;;;;;;;;;;;-1:-1:-1;286:261:161;;;;;;-1:-1:-1;286:261:161;;;;;-1:-1:-1;286:261:161"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1114,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_address_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"finalize_allocation":{"entryPoint":1002,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgData":{"entryPoint":1465,"id":13296,"parameterSlots":0,"returnSlots":2},"fun_msgSender":{"entryPoint":1138,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1161},{"length":32,"start":1488}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063114ba8ee146102d657806330fd6a751461014157806331e66e1e146100be5763b0ccc31e1461004857600080fd5b346100b95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b957602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b600080fd5b346100b95760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760406100f76105b9565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8484519586946020865281602087015286860137600085828601015201168101030190f35b346100b95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b957610199610472565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036102a957507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015610277575060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5581547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b95760043573ffffffffffffffffffffffffffffffffffffffff81168091036100b95761032e610472565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541691169081036103bd57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761042b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100b9575180151581036100b95790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156105aa5732331480156105af575b6105aa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156104fd575b506104fa57503390565b90565b6040517f019a202800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201523360248201523060448201529150602090829060649082905afa90811561059e5760009161056f575b50386104f0565b610591915060203d602011610597575b61058981836103ea565b81019061045a565b38610568565b503d61057f565b6040513d6000823e3d90fd5b503390565b50601836106104b9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106ed5732331480156106f5575b6106ed5780331490811561064c575b5061061b576000903690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec3601903682116100b95760009190565b6040517f019a20280000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c60048201523360248201523060448201529150602090829060649082905afa90811561059e576000916106ce575b503861060f565b6106e7915060203d6020116105975761058981836103ea565b386106c7565b506000903690565b506018361061060056fea26469706673582212207ad38f19ac2349ca676c0890144c4cae82704b7aa032b75f39fa90cbb310dd7664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2D6 JUMPI DUP1 PUSH4 0x30FD6A75 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x31E66E1E EQ PUSH2 0xBE JUMPI PUSH4 0xB0CCC31E EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x40 PUSH2 0xF7 PUSH2 0x5B9 JUMP JUMPDEST SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 DUP5 MLOAD SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB9 JUMPI PUSH2 0x199 PUSH2 0x472 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2A9 JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x277 JUMPI POP PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB9 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB9 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xB9 JUMPI PUSH2 0x32E PUSH2 0x472 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3BD JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x42B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xB9 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xB9 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x5AA JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x5AF JUMPI JUMPDEST PUSH2 0x5AA JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x4FD JUMPI JUMPDEST POP PUSH2 0x4FA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x56F JUMPI JUMPDEST POP CODESIZE PUSH2 0x4F0 JUMP JUMPDEST PUSH2 0x591 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x597 JUMPI JUMPDEST PUSH2 0x589 DUP2 DUP4 PUSH2 0x3EA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x45A JUMP JUMPDEST CODESIZE PUSH2 0x568 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x57F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4B9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6ED JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6F5 JUMPI JUMPDEST PUSH2 0x6ED JUMPI DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x64C JUMPI JUMPDEST POP PUSH2 0x61B JUMPI PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xB9 JUMPI PUSH1 0x0 SWAP2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR PUSH1 0x4 DUP3 ADD MSTORE CALLER PUSH1 0x24 DUP3 ADD MSTORE ADDRESS PUSH1 0x44 DUP3 ADD MSTORE SWAP2 POP PUSH1 0x20 SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 SWAP1 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6CE JUMPI JUMPDEST POP CODESIZE PUSH2 0x60F JUMP JUMPDEST PUSH2 0x6E7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x597 JUMPI PUSH2 0x589 DUP2 DUP4 PUSH2 0x3EA JUMP JUMPDEST CODESIZE PUSH2 0x6C7 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 CALLDATASIZE SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x600 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH27 0xD38F19AC2349CA676C0890144C4CAE82704B7AA032B75F39FA90CB 0xB3 LT 0xDD PUSH23 0x64736F6C634300081E0033000000000000000000000000 ","sourceMap":"286:261:161:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2326:39:348;;:::i;:::-;286:261:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:41:348;;:::i;:::-;286:261:161;;;;;;;3174:18:180;;;3170:53;;3179:19:352;286:261:161;;;;636:1:180;900:21:181;;;896:88;;-1:-1:-1;636:1:180;286:261:161;;;;;;;;;;896:88:181;930:54;286:261:161;930:54:181;286:261:161;;636:1:180;286:261:161;;;;930:54:181;3170:53:180;3201:22;286:261:161;3201:22:180;286:261:161;;;;3201:22:180;286:261:161;;;;;;;;;;;;;;;;;;;;;2091:41:348;;:::i;:::-;286:261:161;;;;;;;4503:26:42;;;4499:64;;-1:-1:-1;286:261:161;;;;;;;;;;;4499:64:42;4538:25;286:261:161;4538:25:42;286:261:161;;;;4538:25:42;286:261:161;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;286:261:161;;;;;-1:-1:-1;286:261:161;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;286:261:161;1029:19:76;286:261:161;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;286:261:161;;;1676:74:76;;286:261:161;;;1676:74:76;;;286:261:161;1327:10:76;286:261:161;;;;1744:4:76;286:261:161;;;;;-1:-1:-1;1676:74:76;;286:261:161;;;;;;1676:74:76;;;;;;;286:261:161;1676:74:76;;;1630:120;;;;;1676:74;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;286:261:161;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;1938:939;286:261:161;2065:19:76;286:261:161;2065:53:76;;2061:99;;2375:9;2361:10;:23;:47;;;;1938:939;2357:93;;2361:10;;2624:42;:153;;;;;1938:939;2607:238;;;2115:1;2862:8;;1938:939;:::o;2607:238::-;286:261:161;720:8:80;286:261:161;720:8:80;;286:261:161;;;;2115:1:76;2802:32;;:::o;2624:153::-;286:261:161;;;2682:95:76;;408:89:80;;;;;;2682:95:76;;;286:261:161;2361:10:76;286:261:161;;;;2771:4:76;286:261:161;;;;;-1:-1:-1;2682:95:76;;286:261:161;;;;;;2682:95:76;;;;;;;2115:1;2682:95;;;2624:153;;;;;2682:95;;;;;;;;;;;;;;:::i;:::-;;;;2357:93;2424:15;2115:1;2431:8;;2424:15;:::o;2361:47::-;2388:8;2406:2;2388:8;:20;2361:47;"},"gasEstimates":{"creation":{"codeDepositCost":"369000","executionCost":"infinite","totalCost":"infinite"},"external":{"__msgData()":"infinite","initOperatorFilterer(address)":"infinite","operatorFilterRegistry()":"2316","updateOperatorFilterRegistry(address)":"infinite"}},"methodIdentifiers":{"__msgData()":"31e66e1e","initOperatorFilterer(address)":"30fd6a75","operatorFilterRegistry()":"b0ccc31e","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"__msgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"operatorFilterRegistry\",\"type\":\"address\"}],\"name\":\"initOperatorFilterer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initOperatorFilterer(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"operatorFilterRegistry\":\"The operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"OperatorFiltererFacetMock\",\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initOperatorFilterer(address)\":{\"notice\":\"Sets the address that the contract will make OperatorFilter checks against.\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol\":\"OperatorFiltererFacetMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/mocks/token/royalty/facets/OperatorFiltererFacetMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {OperatorFiltererFacet} from \\\"./../../../../token/royalty/facets/OperatorFiltererFacet.sol\\\";\\n\\n/// @title OperatorFiltererFacetMock\\ncontract OperatorFiltererFacetMock is OperatorFiltererFacet {\\n    constructor(IForwarderRegistry forwarderRegistry) OperatorFiltererFacet(forwarderRegistry) {}\\n\\n    function __msgData() external view returns (bytes calldata) {\\n        return _msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xe80933153f652fb628fc80dc44404e388a70c317452dcf6793538280b17bcffb\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/facets/OperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../base/OperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract OperatorFiltererFacet is OperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function initOperatorFilterer(IOperatorFilterRegistry operatorFilterRegistry) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        OperatorFiltererStorage.layout().proxyInit(operatorFilterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6baa1d32a8970890aa323df3c3afdf10e0d1baafe4126b8716926587a8021e0d\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initOperatorFilterer(address)":{"notice":"Sets the address that the contract will make OperatorFilter checks against."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/mocks/utils/Bytes32Mock.sol":{"Bytes32Mock":{"abi":[{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"toASCIIString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"toBase32String","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610452908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806384e7ad211461017e5763dea65fa11461003257600080fd5b346101795760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101795760043560346040519061007560608361022b565b81526040366020830137601c8260021b16602081101561014a57603392825184101561014a5783917f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637901a605384015360031c905b6100e057604051806100dc84826101c3565b0390f35b601f811690602082101561014a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f6162636465666768696a6b6c6d6e6f707172737475767778797a32333435363794019384921a61014083856102d5565b5360051c906100ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b346101795760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610179576100dc6101bb6004356102e6565b604051918291825b9190916020815282519283602083015260005b8481106102155750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016101d6565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761026c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161026c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b90815181101561014a570160200190565b908115610405576040519160208301526020825261030560408361022b565b601f5b7fff0000000000000000000000000000000000000000000000000000000000000061033382856102d5565b5116610360577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610308565b60018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06103a86103928461029b565b936103a0604051958661022b565b80855261029b565b0136602084013760005b818111156103c1575090925050565b807fff000000000000000000000000000000000000000000000000000000000000006103ef600193886102d5565b511660001a6103fe82866102d5565b53016103b2565b905060405161041560208261022b565b600081529056fea26469706673582212207b7792c3f5183d28e6d0f2cddf0c94ea4e72a1a5b0990815ad5819eb2a6a904a64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x452 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x84E7AD21 EQ PUSH2 0x17E JUMPI PUSH4 0xDEA65FA1 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x179 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x34 PUSH1 0x40 MLOAD SWAP1 PUSH2 0x75 PUSH1 0x60 DUP4 PUSH2 0x22B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 CALLDATASIZE PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x1C DUP3 PUSH1 0x2 SHL AND PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14A JUMPI PUSH1 0x33 SWAP3 DUP3 MLOAD DUP5 LT ISZERO PUSH2 0x14A JUMPI DUP4 SWAP2 PUSH32 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637 SWAP1 BYTE PUSH1 0x53 DUP5 ADD MSTORE8 PUSH1 0x3 SHR SWAP1 JUMPDEST PUSH2 0xE0 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH2 0xDC DUP5 DUP3 PUSH2 0x1C3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x1F DUP2 AND SWAP1 PUSH1 0x20 DUP3 LT ISZERO PUSH2 0x14A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637 SWAP5 ADD SWAP4 DUP5 SWAP3 BYTE PUSH2 0x140 DUP4 DUP6 PUSH2 0x2D5 JUMP JUMPDEST MSTORE8 PUSH1 0x5 SHR SWAP1 PUSH2 0xCA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x179 JUMPI PUSH2 0xDC PUSH2 0x1BB PUSH1 0x4 CALLDATALOAD PUSH2 0x2E6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x215 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1D6 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x26C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x14A JUMPI ADD PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x405 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x20 DUP3 MSTORE PUSH2 0x305 PUSH1 0x40 DUP4 PUSH2 0x22B JUMP JUMPDEST PUSH1 0x1F JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 PUSH2 0x333 DUP3 DUP6 PUSH2 0x2D5 JUMP JUMPDEST MLOAD AND PUSH2 0x360 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD PUSH2 0x308 JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x3A8 PUSH2 0x392 DUP5 PUSH2 0x29B JUMP JUMPDEST SWAP4 PUSH2 0x3A0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x22B JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH2 0x29B JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x3C1 JUMPI POP SWAP1 SWAP3 POP POP JUMP JUMPDEST DUP1 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 PUSH2 0x3EF PUSH1 0x1 SWAP4 DUP9 PUSH2 0x2D5 JUMP JUMPDEST MLOAD AND PUSH1 0x0 BYTE PUSH2 0x3FE DUP3 DUP7 PUSH2 0x2D5 JUMP JUMPDEST MSTORE8 ADD PUSH2 0x3B2 JUMP JUMPDEST SWAP1 POP PUSH1 0x40 MLOAD PUSH2 0x415 PUSH1 0x20 DUP3 PUSH2 0x22B JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x7792C3F5183D28E6D0F2CDDF0C94EA4E72A1A5B0990815AD5819EB2A PUSH11 0x904A64736F6C634300081E STOP CALLER ","sourceMap":"119:293:162:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_encode_string":{"entryPoint":451,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_string":{"entryPoint":667,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":555,"id":null,"parameterSlots":2,"returnSlots":0},"fun_toASCIIString":{"entryPoint":742,"id":38192,"parameterSlots":1,"returnSlots":1},"memory_array_index_access_bytes":{"entryPoint":725,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806384e7ad211461017e5763dea65fa11461003257600080fd5b346101795760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101795760043560346040519061007560608361022b565b81526040366020830137601c8260021b16602081101561014a57603392825184101561014a5783917f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637901a605384015360031c905b6100e057604051806100dc84826101c3565b0390f35b601f811690602082101561014a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f6162636465666768696a6b6c6d6e6f707172737475767778797a32333435363794019384921a61014083856102d5565b5360051c906100ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b346101795760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610179576100dc6101bb6004356102e6565b604051918291825b9190916020815282519283602083015260005b8481106102155750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016101d6565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761026c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161026c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b90815181101561014a570160200190565b908115610405576040519160208301526020825261030560408361022b565b601f5b7fff0000000000000000000000000000000000000000000000000000000000000061033382856102d5565b5116610360577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610308565b60018101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06103a86103928461029b565b936103a0604051958661022b565b80855261029b565b0136602084013760005b818111156103c1575090925050565b807fff000000000000000000000000000000000000000000000000000000000000006103ef600193886102d5565b511660001a6103fe82866102d5565b53016103b2565b905060405161041560208261022b565b600081529056fea26469706673582212207b7792c3f5183d28e6d0f2cddf0c94ea4e72a1a5b0990815ad5819eb2a6a904a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x84E7AD21 EQ PUSH2 0x17E JUMPI PUSH4 0xDEA65FA1 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x179 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x34 PUSH1 0x40 MLOAD SWAP1 PUSH2 0x75 PUSH1 0x60 DUP4 PUSH2 0x22B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x40 CALLDATASIZE PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x1C DUP3 PUSH1 0x2 SHL AND PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14A JUMPI PUSH1 0x33 SWAP3 DUP3 MLOAD DUP5 LT ISZERO PUSH2 0x14A JUMPI DUP4 SWAP2 PUSH32 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637 SWAP1 BYTE PUSH1 0x53 DUP5 ADD MSTORE8 PUSH1 0x3 SHR SWAP1 JUMPDEST PUSH2 0xE0 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH2 0xDC DUP5 DUP3 PUSH2 0x1C3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x1F DUP2 AND SWAP1 PUSH1 0x20 DUP3 LT ISZERO PUSH2 0x14A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637 SWAP5 ADD SWAP4 DUP5 SWAP3 BYTE PUSH2 0x140 DUP4 DUP6 PUSH2 0x2D5 JUMP JUMPDEST MSTORE8 PUSH1 0x5 SHR SWAP1 PUSH2 0xCA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x179 JUMPI PUSH2 0xDC PUSH2 0x1BB PUSH1 0x4 CALLDATALOAD PUSH2 0x2E6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x215 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x1D6 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x26C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x26C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x14A JUMPI ADD PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x405 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x20 DUP3 MSTORE PUSH2 0x305 PUSH1 0x40 DUP4 PUSH2 0x22B JUMP JUMPDEST PUSH1 0x1F JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 PUSH2 0x333 DUP3 DUP6 PUSH2 0x2D5 JUMP JUMPDEST MLOAD AND PUSH2 0x360 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD PUSH2 0x308 JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x3A8 PUSH2 0x392 DUP5 PUSH2 0x29B JUMP JUMPDEST SWAP4 PUSH2 0x3A0 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x22B JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH2 0x29B JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x3C1 JUMPI POP SWAP1 SWAP3 POP POP JUMP JUMPDEST DUP1 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 PUSH2 0x3EF PUSH1 0x1 SWAP4 DUP9 PUSH2 0x2D5 JUMP JUMPDEST MLOAD AND PUSH1 0x0 BYTE PUSH2 0x3FE DUP3 DUP7 PUSH2 0x2D5 JUMP JUMPDEST MSTORE8 ADD PUSH2 0x3B2 JUMP JUMPDEST SWAP1 POP PUSH1 0x40 MLOAD PUSH2 0x415 PUSH1 0x20 DUP3 PUSH2 0x22B JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x7792C3F5183D28E6D0F2CDDF0C94EA4E72A1A5B0990815AD5819EB2A PUSH11 0x904A64736F6C634300081E STOP CALLER ","sourceMap":"119:293:162:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;451:2:355;119:293:162;;;;;;;:::i;:::-;;;;;;;;;;;573:1:355;119:293:162;;;541:35:355;;;;;119:293:162;529:47:355;119:293:162;;;;;;;;;327:66:355;541:35;;119:293:162;;;529:47:355;119:293:162;;674:106:355;681:5;;;119:293:162;;;;;;;:::i;:::-;;;;674:106:355;119:293:162;;;718:22:355;119:293:162;718:22:355;;;;;119:293:162;327:66:355;119:293:162;;718:22:355;;;;706:34;;;;:::i;:::-;;119:293:162;;674:106:355;;;718:22;119:293:162;;;;;;;;;;;;;;;;;;;;;;;;;375:28;119:293;;375:28;:::i;:::-;119:293;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;119:293:162;;;;;-1:-1:-1;119:293:162;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1003:591:355:-;;1093:13;;1089:28;;119:293:162;;1160:23:355;;;;119:293:162;1160:23:355;;;;119:293:162;1160:23:355;;:::i;:::-;1208:2;1220:131;119:293:162;1251:16:355;;;;:::i;:::-;119:293:162;;1247:32:355;;119:293:162;;1220:131:355;;1247:32;1227:4;119:293:162;;1411:18:355;1160:23;119:293:162;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;1160:23:355;119:293:162;;;1102:4:355;1459:8;;;;;;;-1:-1:-1;1551:26:355;;-1:-1:-1;;1003:591:355:o;1469:3::-;1509:14;119:293:162;1509:14:355;1227:4;1509:14;;;:::i;:::-;119:293:162;;1102:4:355;1492:31;;;;;:::i;:::-;;119:293:162;1448:9:355;;1089:28;119:293:162;;;;;;;;:::i;:::-;1102:4:355;119:293:162;;1108:9:355;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"221200","executionCost":"269","totalCost":"221469"},"external":{"toASCIIString(bytes32)":"infinite","toBase32String(bytes32)":"infinite"}},"methodIdentifiers":{"toASCIIString(bytes32)":"84e7ad21","toBase32String(bytes32)":"dea65fa1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"name\":\"toASCIIString\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"name\":\"toBase32String\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/utils/Bytes32Mock.sol\":\"Bytes32Mock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/mocks/utils/Bytes32Mock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {Bytes32} from \\\"./../../utils/libraries/Bytes32.sol\\\";\\n\\ncontract Bytes32Mock {\\n    function toBase32String(bytes32 value) external pure returns (string memory) {\\n        return Bytes32.toBase32String(value);\\n    }\\n\\n    function toASCIIString(bytes32 value) external pure returns (string memory) {\\n        return Bytes32.toASCIIString(value);\\n    }\\n}\\n\",\"keccak256\":\"0x9b9536f36bfbb17bb148a080ee191b032b80b0d08600cd88d10f43387038a8e8\",\"license\":\"MIT\"},\"contracts/utils/libraries/Bytes32.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Bytes32 {\\n    /// @notice Converts bytes32 to base32 string.\\n    /// @param value value to convert.\\n    /// @return the converted base32 string.\\n    function toBase32String(bytes32 value) internal pure returns (string memory) {\\n        bytes32 base32Alphabet = 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637;\\n        uint256 i = uint256(value);\\n        uint256 k = 52;\\n        bytes memory bstr = new bytes(k);\\n        unchecked {\\n            bstr[--k] = base32Alphabet[uint8((i % 8) << 2)]; // uint8 s = uint8((256 - skip) % 5);  // (i % (2**s)) << (5-s)\\n            i /= 8;\\n            while (k > 0) {\\n                bstr[--k] = base32Alphabet[i % 32];\\n                i /= 32;\\n            }\\n        }\\n        return string(bstr);\\n    }\\n\\n    /// @notice Converts a bytes32 value to an ASCII string, trimming the tailing zeros.\\n    /// @param value value to convert.\\n    /// @return the converted ASCII string.\\n    function toASCIIString(bytes32 value) internal pure returns (string memory) {\\n        if (value == 0x00) return \\\"\\\";\\n        bytes memory bytesString = bytes(abi.encodePacked(value));\\n        uint256 pos = 31;\\n        while (true) {\\n            if (bytesString[pos] != 0) break;\\n            unchecked {\\n                --pos;\\n            }\\n        }\\n        unchecked {\\n            bytes memory asciiString = new bytes(pos + 1);\\n            for (uint256 i; i <= pos; ++i) {\\n                asciiString[i] = bytesString[i];\\n            }\\n            return string(asciiString);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x4ff493b034293873e78ddc83c34535bc9965305e976fa63ffea51b62049ec649\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/mocks/utils/MultiStaticCallMock.sol":{"MultiStaticCallMock":{"abi":[{"inputs":[],"name":"Reverted","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"StaticCallReverted","type":"error"},{"inputs":[],"name":"getBlockNumber","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockCoinbase","outputs":[{"internalType":"address","name":"coinbase","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockGasLimit","outputs":[{"internalType":"uint256","name":"gaslimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revertingCall","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"revertingCallWithoutMessage","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct MultiStaticCall.Call[]","name":"calls","type":"tuple[]"}],"name":"tryAggregate","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct MultiStaticCall.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct MultiStaticCall.Call[]","name":"calls","type":"tuple[]"}],"name":"tryBlockAndAggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct MultiStaticCall.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"StaticCallReverted(address,bytes)":[{"params":{"data":"The encoded function call executed on `target`.","target":"The target contract address of the static call."}}]},"kind":"dev","methods":{"tryAggregate(bool,(address,bytes)[])":{"details":"Reverts if `requireSuccess` is true and one of the static calls fails.","params":{"calls":"The list of target contracts and encoded function calls for each static call.","requireSuccess":"Whether a failed static call should trigger a revert."},"returns":{"returnData":"The list of success flags and raw return data for each static call."}},"tryBlockAndAggregate(bool,(address,bytes)[])":{"details":"Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.Reverts if `requireSuccess` is true and one of the static calls fails.","params":{"calls":"The list of target contracts and encoded function calls for each static call.","requireSuccess":"Whether a failed static call should trigger a revert."},"returns":{"blockNumber":"The latest mined block number indicating at which point the return data is valid.","returnData":"The list of success flags and raw return data for each static call."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610820908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80630f28c97d146100a7578063399542e9146100a257806342cbb15c1461009d5780634d2301cc1461009857806386d516e814610093578063a8b0574e1461008e578063b62c531814610089578063bce38bd7146100845763ce0d89f41461007f57600080fd5b6103b9565b610391565b610387565b61034e565b610315565b6102cf565b610278565b610240565b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0574260805260206080f35b600080fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100e05760043580151581036100e0579160243567ffffffffffffffff81116100e057826023820112156100e05780600401359267ffffffffffffffff84116100e05760248460051b830101116100e0576024019190565b9080602083519283815201916020808260051b8401019401926000925b82841061018f57505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183526020865180511515835201516040602083015280519081604084015260005b82811061022a57505060206060837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85600085879860019a0101520116010197019301940192919390610180565b80602080928401015160608287010152016101da565b346100e05761027461025a610254366100e5565b916106e4565b604051918291438352604060208401526040830190610163565b0390f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051438152f35b73ffffffffffffffffffffffffffffffffffffffff8116036100e057565b346100e05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e057602060043561030c816102b1565b31604051908152f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051458152f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051418152f35b346100e057600080fd5b346100e0576102746103a5610254366100e5565b604051918291602083526020830190610163565b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0577f4a5033eb0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761046157604052565b610412565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761046157604052565b67ffffffffffffffff81116104615760051b60200190565b906104d46104cf836104aa565b610466565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061050282946104aa565b019060005b82811061051357505050565b60209061051e610441565b6000815260608382015282828501015201610507565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156105a35760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1813603018212156100e0570190565b610534565b356105b2816102b1565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e0570180359067ffffffffffffffff82116100e0576020019181360383136100e057565b908092918237016000815290565b3d15610669573d9067ffffffffffffffff82116104615761065c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610466565b9182523d6000602084013e565b606090565b9183606094601f9273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095168652604060208701528160408701528686013760008582860101520116010190565b80518210156105a35760209160051b010190565b9291906106f0826104c2565b9360005b8381106107015750505050565b61071461070f828686610563565b6105a8565b61072c610722838787610563565b60208101906105b5565b60008060409493945180610741818689610606565b0390855afa9261074f610614565b9286806107e2575b61079657505050906001929161077561076e610441565b9215158352565b602082015261078482896106d0565b5261078f81886106d0565b50016106f4565b8351939284156107a857505050602001fd5b6107de906040519384937f1199c4420000000000000000000000000000000000000000000000000000000085526004850161066e565b0390fd5b50841561075756fea264697066735822122045a422d742b892360a7b624524d334dec9c0c24aebe972149fedea85f68d12b264736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x820 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF28C97D EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0x399542E9 EQ PUSH2 0xA2 JUMPI DUP1 PUSH4 0x42CBB15C EQ PUSH2 0x9D JUMPI DUP1 PUSH4 0x4D2301CC EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x86D516E8 EQ PUSH2 0x93 JUMPI DUP1 PUSH4 0xA8B0574E EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0xB62C5318 EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0xBCE38BD7 EQ PUSH2 0x84 JUMPI PUSH4 0xCE0D89F4 EQ PUSH2 0x7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x391 JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH2 0x34E JUMP JUMPDEST PUSH2 0x315 JUMP JUMPDEST PUSH2 0x2CF JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH2 0x240 JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI TIMESTAMP PUSH1 0x80 MSTORE PUSH1 0x20 PUSH1 0x80 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xE0 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE0 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0xE0 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xE0 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0xE0 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP3 JUMPDEST DUP3 DUP5 LT PUSH2 0x18F JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE PUSH1 0x20 DUP7 MLOAD DUP1 MLOAD ISZERO ISZERO DUP4 MSTORE ADD MLOAD PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x22A JUMPI POP POP PUSH1 0x20 PUSH1 0x60 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 DUP8 SWAP9 PUSH1 0x1 SWAP11 ADD ADD MSTORE ADD AND ADD ADD SWAP8 ADD SWAP4 ADD SWAP5 ADD SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x180 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x1DA JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH2 0x274 PUSH2 0x25A PUSH2 0x254 CALLDATASIZE PUSH2 0xE5 JUMP JUMPDEST SWAP2 PUSH2 0x6E4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 NUMBER DUP4 MSTORE PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x163 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD NUMBER DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0xE0 JUMPI JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x4 CALLDATALOAD PUSH2 0x30C DUP2 PUSH2 0x2B1 JUMP JUMPDEST BALANCE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD GASLIMIT DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD COINBASE DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH2 0x274 PUSH2 0x3A5 PUSH2 0x254 CALLDATASIZE PUSH2 0xE5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x163 JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH32 0x4A5033EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x461 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x412 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP4 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x461 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x461 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4D4 PUSH2 0x4CF DUP4 PUSH2 0x4AA JUMP JUMPDEST PUSH2 0x466 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x502 DUP3 SWAP5 PUSH2 0x4AA JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x513 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x51E PUSH2 0x441 JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x507 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x5A3 JUMPI PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0xE0 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x534 JUMP JUMPDEST CALLDATALOAD PUSH2 0x5B2 DUP2 PUSH2 0x2B1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0xE0 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE0 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0xE0 JUMPI JUMP JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x461 JUMPI PUSH2 0x65C PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND ADD PUSH2 0x466 JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x60 SWAP5 PUSH1 0x1F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP6 AND DUP7 MSTORE PUSH1 0x40 PUSH1 0x20 DUP8 ADD MSTORE DUP2 PUSH1 0x40 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5A3 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x6F0 DUP3 PUSH2 0x4C2 JUMP JUMPDEST SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x701 JUMPI POP POP POP POP JUMP JUMPDEST PUSH2 0x714 PUSH2 0x70F DUP3 DUP7 DUP7 PUSH2 0x563 JUMP JUMPDEST PUSH2 0x5A8 JUMP JUMPDEST PUSH2 0x72C PUSH2 0x722 DUP4 DUP8 DUP8 PUSH2 0x563 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x5B5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD DUP1 PUSH2 0x741 DUP2 DUP7 DUP10 PUSH2 0x606 JUMP JUMPDEST SUB SWAP1 DUP6 GAS STATICCALL SWAP3 PUSH2 0x74F PUSH2 0x614 JUMP JUMPDEST SWAP3 DUP7 DUP1 PUSH2 0x7E2 JUMPI JUMPDEST PUSH2 0x796 JUMPI POP POP POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH2 0x775 PUSH2 0x76E PUSH2 0x441 JUMP JUMPDEST SWAP3 ISZERO ISZERO DUP4 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x784 DUP3 DUP10 PUSH2 0x6D0 JUMP JUMPDEST MSTORE PUSH2 0x78F DUP2 DUP9 PUSH2 0x6D0 JUMP JUMPDEST POP ADD PUSH2 0x6F4 JUMP JUMPDEST DUP4 MLOAD SWAP4 SWAP3 DUP5 ISZERO PUSH2 0x7A8 JUMPI POP POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x7DE SWAP1 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH32 0x1199C44200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x66E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST POP DUP5 ISZERO PUSH2 0x757 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GASLIMIT LOG4 0x22 0xD7 TIMESTAMP 0xB8 SWAP3 CALLDATASIZE EXP PUSH28 0x624524D334DEC9C0C24AEBE972149FEDEA85F68D12B264736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"125:909:163:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_boolt_array_struct_Call_calldata_dyn_calldata":{"entryPoint":229,"id":null,"parameterSlots":1,"returnSlots":3},"abi_encode_address_bytes_calldata":{"entryPoint":1646,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_array_struct_Result_dyn":{"entryPoint":355,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":1542,"id":null,"parameterSlots":3,"returnSlots":1},"access_calldata_tail_bytes_calldata":{"entryPoint":1461,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_and_zero_memory_array_array_struct_Result_dyn":{"entryPoint":1218,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory":{"entryPoint":1126,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_1597":{"entryPoint":1089,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_Result_dyn":{"entryPoint":1194,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_struct_Call_calldata_dyn_calldata":{"entryPoint":1379,"id":null,"parameterSlots":3,"returnSlots":1},"external_fun_getBlockNumber":{"entryPoint":632,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getCurrentBlockCoinbase":{"entryPoint":846,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getCurrentBlockGasLimit":{"entryPoint":789,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_getEthBalance":{"entryPoint":719,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_revertingCall":{"entryPoint":953,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_revertingCallWithoutMessage":{"entryPoint":903,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_tryAggregate":{"entryPoint":913,"id":null,"parameterSlots":0,"returnSlots":0},"external_fun_tryBlockAndAggregate":{"entryPoint":576,"id":null,"parameterSlots":0,"returnSlots":0},"extract_returndata":{"entryPoint":1556,"id":null,"parameterSlots":0,"returnSlots":1},"fun_tryAggregate":{"entryPoint":1764,"id":37985,"parameterSlots":3,"returnSlots":1},"memory_array_index_access_struct_Result_dyn":{"entryPoint":1744,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x32":{"entryPoint":1332,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":1042,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":1448,"id":null,"parameterSlots":1,"returnSlots":1},"validator_revert_address":{"entryPoint":689,"id":null,"parameterSlots":1,"returnSlots":0},"write_to_memory_bool":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80630f28c97d146100a7578063399542e9146100a257806342cbb15c1461009d5780634d2301cc1461009857806386d516e814610093578063a8b0574e1461008e578063b62c531814610089578063bce38bd7146100845763ce0d89f41461007f57600080fd5b6103b9565b610391565b610387565b61034e565b610315565b6102cf565b610278565b610240565b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0574260805260206080f35b600080fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100e05760043580151581036100e0579160243567ffffffffffffffff81116100e057826023820112156100e05780600401359267ffffffffffffffff84116100e05760248460051b830101116100e0576024019190565b9080602083519283815201916020808260051b8401019401926000925b82841061018f57505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183526020865180511515835201516040602083015280519081604084015260005b82811061022a57505060206060837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85600085879860019a0101520116010197019301940192919390610180565b80602080928401015160608287010152016101da565b346100e05761027461025a610254366100e5565b916106e4565b604051918291438352604060208401526040830190610163565b0390f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051438152f35b73ffffffffffffffffffffffffffffffffffffffff8116036100e057565b346100e05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e057602060043561030c816102b1565b31604051908152f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051458152f35b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0576020604051418152f35b346100e057600080fd5b346100e0576102746103a5610254366100e5565b604051918291602083526020830190610163565b346100e05760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100e0577f4a5033eb0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761046157604052565b610412565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761046157604052565b67ffffffffffffffff81116104615760051b60200190565b906104d46104cf836104aa565b610466565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061050282946104aa565b019060005b82811061051357505050565b60209061051e610441565b6000815260608382015282828501015201610507565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156105a35760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1813603018212156100e0570190565b610534565b356105b2816102b1565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e0570180359067ffffffffffffffff82116100e0576020019181360383136100e057565b908092918237016000815290565b3d15610669573d9067ffffffffffffffff82116104615761065c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610466565b9182523d6000602084013e565b606090565b9183606094601f9273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095168652604060208701528160408701528686013760008582860101520116010190565b80518210156105a35760209160051b010190565b9291906106f0826104c2565b9360005b8381106107015750505050565b61071461070f828686610563565b6105a8565b61072c610722838787610563565b60208101906105b5565b60008060409493945180610741818689610606565b0390855afa9261074f610614565b9286806107e2575b61079657505050906001929161077561076e610441565b9215158352565b602082015261078482896106d0565b5261078f81886106d0565b50016106f4565b8351939284156107a857505050602001fd5b6107de906040519384937f1199c4420000000000000000000000000000000000000000000000000000000085526004850161066e565b0390fd5b50841561075756fea264697066735822122045a422d742b892360a7b624524d334dec9c0c24aebe972149fedea85f68d12b264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF28C97D EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0x399542E9 EQ PUSH2 0xA2 JUMPI DUP1 PUSH4 0x42CBB15C EQ PUSH2 0x9D JUMPI DUP1 PUSH4 0x4D2301CC EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x86D516E8 EQ PUSH2 0x93 JUMPI DUP1 PUSH4 0xA8B0574E EQ PUSH2 0x8E JUMPI DUP1 PUSH4 0xB62C5318 EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0xBCE38BD7 EQ PUSH2 0x84 JUMPI PUSH4 0xCE0D89F4 EQ PUSH2 0x7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x391 JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH2 0x34E JUMP JUMPDEST PUSH2 0x315 JUMP JUMPDEST PUSH2 0x2CF JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH2 0x240 JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI TIMESTAMP PUSH1 0x80 MSTORE PUSH1 0x20 PUSH1 0x80 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0xE0 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE0 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0xE0 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xE0 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0xE0 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP3 JUMPDEST DUP3 DUP5 LT PUSH2 0x18F JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE PUSH1 0x20 DUP7 MLOAD DUP1 MLOAD ISZERO ISZERO DUP4 MSTORE ADD MLOAD PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x22A JUMPI POP POP PUSH1 0x20 PUSH1 0x60 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 DUP8 SWAP9 PUSH1 0x1 SWAP11 ADD ADD MSTORE ADD AND ADD ADD SWAP8 ADD SWAP4 ADD SWAP5 ADD SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x180 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x1DA JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH2 0x274 PUSH2 0x25A PUSH2 0x254 CALLDATASIZE PUSH2 0xE5 JUMP JUMPDEST SWAP2 PUSH2 0x6E4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 NUMBER DUP4 MSTORE PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x163 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD NUMBER DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SUB PUSH2 0xE0 JUMPI JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x4 CALLDATALOAD PUSH2 0x30C DUP2 PUSH2 0x2B1 JUMP JUMPDEST BALANCE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD GASLIMIT DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD COINBASE DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH2 0x274 PUSH2 0x3A5 PUSH2 0x254 CALLDATASIZE PUSH2 0xE5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x163 JUMP JUMPDEST CALLVALUE PUSH2 0xE0 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xE0 JUMPI PUSH32 0x4A5033EB00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x461 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x412 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP4 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x461 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x461 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4D4 PUSH2 0x4CF DUP4 PUSH2 0x4AA JUMP JUMPDEST PUSH2 0x466 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x502 DUP3 SWAP5 PUSH2 0x4AA JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x513 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x51E PUSH2 0x441 JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x507 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x5A3 JUMPI PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0xE0 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x534 JUMP JUMPDEST CALLDATALOAD PUSH2 0x5B2 DUP2 PUSH2 0x2B1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0xE0 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE0 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0xE0 JUMPI JUMP JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x461 JUMPI PUSH2 0x65C PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND ADD PUSH2 0x466 JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x60 SWAP5 PUSH1 0x1F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP6 AND DUP7 MSTORE PUSH1 0x40 PUSH1 0x20 DUP8 ADD MSTORE DUP2 PUSH1 0x40 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5A3 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x6F0 DUP3 PUSH2 0x4C2 JUMP JUMPDEST SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x701 JUMPI POP POP POP POP JUMP JUMPDEST PUSH2 0x714 PUSH2 0x70F DUP3 DUP7 DUP7 PUSH2 0x563 JUMP JUMPDEST PUSH2 0x5A8 JUMP JUMPDEST PUSH2 0x72C PUSH2 0x722 DUP4 DUP8 DUP8 PUSH2 0x563 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x5B5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD DUP1 PUSH2 0x741 DUP2 DUP7 DUP10 PUSH2 0x606 JUMP JUMPDEST SUB SWAP1 DUP6 GAS STATICCALL SWAP3 PUSH2 0x74F PUSH2 0x614 JUMP JUMPDEST SWAP3 DUP7 DUP1 PUSH2 0x7E2 JUMPI JUMPDEST PUSH2 0x796 JUMPI POP POP POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH2 0x775 PUSH2 0x76E PUSH2 0x441 JUMP JUMPDEST SWAP3 ISZERO ISZERO DUP4 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x784 DUP3 DUP10 PUSH2 0x6D0 JUMP JUMPDEST MSTORE PUSH2 0x78F DUP2 DUP9 PUSH2 0x6D0 JUMP JUMPDEST POP ADD PUSH2 0x6F4 JUMP JUMPDEST DUP4 MLOAD SWAP4 SWAP3 DUP5 ISZERO PUSH2 0x7A8 JUMPI POP POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x7DE SWAP1 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH32 0x1199C44200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x66E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST POP DUP5 ISZERO PUSH2 0x757 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GASLIMIT LOG4 0x22 0xD7 TIMESTAMP 0xB8 SWAP3 CALLDATASIZE EXP PUSH28 0x624524D334DEC9C0C24AEBE972149FEDEA85F68D12B264736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"125:909:163:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;661:15;125:909;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;125:909:163;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;125:909:163;;;;;;;;;;;;;;-1:-1:-1;125:909:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2870:35:353;125:909:163;;;:::i;:::-;2870:35:353;;:::i;:::-;125:909:163;;2835:12:353;;;;125:909:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;294:12;125:909;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;784:12;125:909;;;;;;;;;;;;;;;;;;;;536:14;125:909;;;;;;;;;;;;;;;;;414:14;125:909;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;863:10;125:909;863:10;125:909;;863:10;125:909;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;125:909:163;;;;;;;;;:::o;:::-;;;;;:::i;:::-;-1:-1:-1;125:909:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;125:909:163;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1080:860:353:-;;;;1257:20;;;:::i;:::-;1292:9;-1:-1:-1;1303:10:353;;;;;;1080:860;;;;:::o;1315:3::-;1351:15;:8;;;;;:::i;:::-;:15;:::i;:::-;1402:17;:8;;;;;:::i;:::-;:17;;;;;:::i;:::-;-1:-1:-1;125:909:163;;;;;;;;;;;;:::i;:::-;1468:23:353;;;;;;;;:::i;:::-;1510:26;;;;;1315:3;1506:367;;125:909:163;;;;;;;1903:20:353;125:909:163;;:::i;:::-;;;;;;;1903:20:353;1402:17;1903:20;;125:909:163;1887:36:353;;;;:::i;:::-;;;;;;:::i;:::-;;125:909:163;1292:9:353;;1506:367;125:909:163;;;;1615:21:353;;;;1660:95;;;1402:17;1660:95;;1611:248;1808:32;125:909:163;;;1808:32:353;;;;;;;;;;:::i;:::-;;;;1510:26;1528:8;;;1510:26;"},"gasEstimates":{"creation":{"codeDepositCost":"416000","executionCost":"456","totalCost":"416456"},"external":{"getBlockNumber()":"199","getCurrentBlockCoinbase()":"265","getCurrentBlockGasLimit()":"243","getCurrentBlockTimestamp()":"140","getEthBalance(address)":"2880","revertingCall()":"320","revertingCallWithoutMessage()":"244","tryAggregate(bool,(address,bytes)[])":"infinite","tryBlockAndAggregate(bool,(address,bytes)[])":"infinite"}},"methodIdentifiers":{"getBlockNumber()":"42cbb15c","getCurrentBlockCoinbase()":"a8b0574e","getCurrentBlockGasLimit()":"86d516e8","getCurrentBlockTimestamp()":"0f28c97d","getEthBalance(address)":"4d2301cc","revertingCall()":"ce0d89f4","revertingCallWithoutMessage()":"b62c5318","tryAggregate(bool,(address,bytes)[])":"bce38bd7","tryBlockAndAggregate(bool,(address,bytes)[])":"399542e9"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"Reverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"StaticCallReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertingCall\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertingCallWithoutMessage\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"StaticCallReverted(address,bytes)\":[{\"params\":{\"data\":\"The encoded function call executed on `target`.\",\"target\":\"The target contract address of the static call.\"}}]},\"kind\":\"dev\",\"methods\":{\"tryAggregate(bool,(address,bytes)[])\":{\"details\":\"Reverts if `requireSuccess` is true and one of the static calls fails.\",\"params\":{\"calls\":\"The list of target contracts and encoded function calls for each static call.\",\"requireSuccess\":\"Whether a failed static call should trigger a revert.\"},\"returns\":{\"returnData\":\"The list of success flags and raw return data for each static call.\"}},\"tryBlockAndAggregate(bool,(address,bytes)[])\":{\"details\":\"Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.Reverts if `requireSuccess` is true and one of the static calls fails.\",\"params\":{\"calls\":\"The list of target contracts and encoded function calls for each static call.\",\"requireSuccess\":\"Whether a failed static call should trigger a revert.\"},\"returns\":{\"blockNumber\":\"The latest mined block number indicating at which point the return data is valid.\",\"returnData\":\"The list of success flags and raw return data for each static call.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"StaticCallReverted(address,bytes)\":[{\"notice\":\"Emitted when a static call reverts without return data.\"}]},\"kind\":\"user\",\"methods\":{\"tryAggregate(bool,(address,bytes)[])\":{\"notice\":\"Aggregates the results of multiple static calls.\"},\"tryBlockAndAggregate(bool,(address,bytes)[])\":{\"notice\":\"Aggregates the results of multiple static calls, together with the associated block number.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/utils/MultiStaticCallMock.sol\":\"MultiStaticCallMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/mocks/utils/MultiStaticCallMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {MultiStaticCall} from \\\"./../../utils/MultiStaticCall.sol\\\";\\n\\ncontract MultiStaticCallMock is MultiStaticCall {\\n    error Reverted();\\n\\n    function getBlockNumber() public view returns (uint256 blockNumber) {\\n        blockNumber = block.number;\\n    }\\n\\n    function getCurrentBlockCoinbase() public view returns (address coinbase) {\\n        coinbase = block.coinbase;\\n    }\\n\\n    function getCurrentBlockGasLimit() public view returns (uint256 gaslimit) {\\n        gaslimit = block.gaslimit;\\n    }\\n\\n    function getCurrentBlockTimestamp() public view returns (uint256 timestamp) {\\n        timestamp = block.timestamp;\\n    }\\n\\n    function getEthBalance(address addr) public view returns (uint256 balance) {\\n        balance = addr.balance;\\n    }\\n\\n    function revertingCall() public pure {\\n        revert Reverted();\\n    }\\n\\n    function revertingCallWithoutMessage() public pure {\\n        // solhint-disable-next-line gas-custom-errors, reason-string\\n        revert();\\n    }\\n}\\n\",\"keccak256\":\"0x3267c1ab034b3c27d651823a5db2c0be331ee07944911ec1d3ad8b75708e98c8\",\"license\":\"MIT\"},\"contracts/utils/MultiStaticCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n/// @title MultiStaticCall - Aggregate results from multiple static calls\\n/// @dev Derived from https://github.com/makerdao/multicall (MIT licence)\\ncontract MultiStaticCall {\\n    struct Call {\\n        address target;\\n        bytes callData;\\n    }\\n\\n    struct Result {\\n        bool success;\\n        bytes returnData;\\n    }\\n\\n    /// @notice Emitted when a static call reverts without return data.\\n    /// @param target The target contract address of the static call.\\n    /// @param data The encoded function call executed on `target`.\\n    error StaticCallReverted(address target, bytes data);\\n\\n    /// @notice Aggregates the results of multiple static calls.\\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\\n    /// @param calls The list of target contracts and encoded function calls for each static call.\\n    /// @return returnData The list of success flags and raw return data for each static call.\\n    function tryAggregate(bool requireSuccess, Call[] calldata calls) public view returns (Result[] memory returnData) {\\n        uint256 length = calls.length;\\n        returnData = new Result[](length);\\n        for (uint256 i; i < length; ++i) {\\n            address target = calls[i].target;\\n            bytes calldata data = calls[i].callData;\\n            (bool success, bytes memory ret) = target.staticcall(data);\\n\\n            if (requireSuccess && !success) {\\n                uint256 returndataLength = ret.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, ret), returndataLength)\\n                    }\\n                } else {\\n                    revert StaticCallReverted(target, data);\\n                }\\n            }\\n\\n            returnData[i] = Result(success, ret);\\n        }\\n    }\\n\\n    /// @notice Aggregates the results of multiple static calls, together with the associated block number.\\n    /// @dev Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.\\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\\n    /// @param calls The list of target contracts and encoded function calls for each static call.\\n    /// @return blockNumber The latest mined block number indicating at which point the return data is valid.\\n    /// @return returnData The list of success flags and raw return data for each static call.\\n    function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public view returns (uint256 blockNumber, Result[] memory returnData) {\\n        blockNumber = block.number;\\n        returnData = tryAggregate(requireSuccess, calls);\\n    }\\n}\\n\",\"keccak256\":\"0x2d8d690c883427e3355a22ba13fc8fb245c00bc304ea0836bff45f40a4f2d302\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"StaticCallReverted(address,bytes)":[{"notice":"Emitted when a static call reverts without return data."}]},"kind":"user","methods":{"tryAggregate(bool,(address,bytes)[])":{"notice":"Aggregates the results of multiple static calls."},"tryBlockAndAggregate(bool,(address,bytes)[])":{"notice":"Aggregates the results of multiple static calls, together with the associated block number."}},"version":1}}},"contracts/mocks/vrf/VRFV2WrapperMock.sol":{"VRFV2WrapperMock":{"abi":[{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"calculateRequestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"consumers","outputs":[{"internalType":"contract VRFConsumerBaseV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"estimateRequestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract VRFConsumerBaseV2","name":"consumer","type":"address"},{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"fulfillRandomnessRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numWords","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"stateVariables":{"lastRequestId":{"return":"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made.","returns":{"_0":"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610746908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c806317537c7e1461049a578063265fe5751461044c5780634306d354146104145780634651ed3d146103b65780637fb5d19d14610372578063a4c0ed36146101f7578063e6689c51146100b25763fc2a88c31461007557600080fd5b346100af57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5760209054604051908152f35b80fd5b50346100af5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576004359073ffffffffffffffffffffffffffffffffffffffff82168092036100af5760443567ffffffffffffffff81116101f357366023820112156101f357806004013592610130846106b7565b9161013e6040519384610647565b8483526024602084019560051b820101903682116101ef57602401945b8186106101df575050829350803b156101db576101ae83929183926040519485809481937f1fe543e3000000000000000000000000000000000000000000000000000000008352602435600484016106cf565b03925af180156101d0576101bf5750f35b816101c991610647565b6100af5780f35b6040513d84823e3d90fd5b5050fd5b853581526020958601950161015b565b8480fd5b5080fd5b50346100af5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576004359073ffffffffffffffffffffffffffffffffffffffff82168092036100af5760443567ffffffffffffffff81116101f357366023820112156101f357806004013567ffffffffffffffff811161036e57810136602482011161036e57606090829003126101f35761029d60248201610636565b50604481013561ffff8116036101f35760646102b99101610636565b8154926001840180941161034157838352600160205260408320907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055828252600260205263ffffffff6040832091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000082541617905555602060405160018152f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b50346100af5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576103aa61061e565b50602060405160648152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260018452205416604051908152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576103aa61061e565b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5763ffffffff6040602092600435815260028452205416604051908152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5760043580825260026020528163ffffffff604082205416916104eb836106b7565b926104f96040519485610647565b8084527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610526826106b7565b01366020860137825b8181106105cb575050808252600160205273ffffffffffffffffffffffffffffffffffffffff60408320541692833b1561036e5761059f938392836040518097819582947f1fe543e3000000000000000000000000000000000000000000000000000000008452600484016106cf565b03925af180156105be576105b05780f35b6105b991610647565b388180f35b50604051903d90823e3d90fd5b9091925083518110156105f15780607b602060019360051b87010152019084929161052f565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004359063ffffffff8216820361063157565b600080fd5b359063ffffffff8216820361063157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761068857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106885760051b60200190565b60606020916040810193815260408382015284518094520192019060005b8181106106fa5750505090565b82518452602093840193909201916001016106ed56fea264697066735822122000a0edecd60de2054e69013f92a0aff7134718e58363ef5ffe69885173edfa9f64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x746 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x17537C7E EQ PUSH2 0x49A JUMPI DUP1 PUSH4 0x265FE575 EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0x4306D354 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x4651ED3D EQ PUSH2 0x3B6 JUMPI DUP1 PUSH4 0x7FB5D19D EQ PUSH2 0x372 JUMPI DUP1 PUSH4 0xA4C0ED36 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0xE6689C51 EQ PUSH2 0xB2 JUMPI PUSH4 0xFC2A88C3 EQ PUSH2 0x75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAF JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x20 SWAP1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0xAF JUMPI PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F3 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1F3 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH2 0x130 DUP5 PUSH2 0x6B7 JUMP JUMPDEST SWAP2 PUSH2 0x13E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x647 JUMP JUMPDEST DUP5 DUP4 MSTORE PUSH1 0x24 PUSH1 0x20 DUP5 ADD SWAP6 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1EF JUMPI PUSH1 0x24 ADD SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1DF JUMPI POP POP DUP3 SWAP4 POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1DB JUMPI PUSH2 0x1AE DUP4 SWAP3 SWAP2 DUP4 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 DUP1 SWAP5 DUP2 SWAP4 PUSH32 0x1FE543E300000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x24 CALLDATALOAD PUSH1 0x4 DUP5 ADD PUSH2 0x6CF JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1D0 JUMPI PUSH2 0x1BF JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x1C9 SWAP2 PUSH2 0x647 JUMP JUMPDEST PUSH2 0xAF JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP REVERT JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x15B JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0xAF JUMPI PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F3 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1F3 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x36E JUMPI DUP2 ADD CALLDATASIZE PUSH1 0x24 DUP3 ADD GT PUSH2 0x36E JUMPI PUSH1 0x60 SWAP1 DUP3 SWAP1 SUB SLT PUSH2 0x1F3 JUMPI PUSH2 0x29D PUSH1 0x24 DUP3 ADD PUSH2 0x636 JUMP JUMPDEST POP PUSH1 0x44 DUP2 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND SUB PUSH2 0x1F3 JUMPI PUSH1 0x64 PUSH2 0x2B9 SWAP2 ADD PUSH2 0x636 JUMP JUMPDEST DUP2 SLOAD SWAP3 PUSH1 0x1 DUP5 ADD DUP1 SWAP5 GT PUSH2 0x341 JUMPI DUP4 DUP4 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE DUP3 DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH4 0xFFFFFFFF PUSH1 0x40 DUP4 KECCAK256 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 DUP3 SLOAD AND OR SWAP1 SSTORE SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x24 DUP4 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH2 0x3AA PUSH2 0x61E JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x64 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x1 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH2 0x3AA PUSH2 0x61E JUMP JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH4 0xFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x2 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD DUP1 DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE DUP2 PUSH4 0xFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND SWAP2 PUSH2 0x4EB DUP4 PUSH2 0x6B7 JUMP JUMPDEST SWAP3 PUSH2 0x4F9 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x647 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x526 DUP3 PUSH2 0x6B7 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP3 JUMPDEST DUP2 DUP2 LT PUSH2 0x5CB JUMPI POP POP DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP4 KECCAK256 SLOAD AND SWAP3 DUP4 EXTCODESIZE ISZERO PUSH2 0x36E JUMPI PUSH2 0x59F SWAP4 DUP4 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x1FE543E300000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x6CF JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x5BE JUMPI PUSH2 0x5B0 JUMPI DUP1 RETURN JUMPDEST PUSH2 0x5B9 SWAP2 PUSH2 0x647 JUMP JUMPDEST CODESIZE DUP2 DUP1 RETURN JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 POP DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x5F1 JUMPI DUP1 PUSH1 0x7B PUSH1 0x20 PUSH1 0x1 SWAP4 PUSH1 0x5 SHL DUP8 ADD ADD MSTORE ADD SWAP1 DUP5 SWAP3 SWAP2 PUSH2 0x52F JUMP JUMPDEST PUSH1 0x24 DUP6 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH4 0xFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x631 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATALOAD SWAP1 PUSH4 0xFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x631 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x688 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x688 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP2 ADD SWAP4 DUP2 MSTORE PUSH1 0x40 DUP4 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x6FA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x6ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP LOG0 0xED EOFCREATE 0xD6 0xD 0xE2 SDIV 0x4E PUSH10 0x13F92A0AFF7134718E5 DUP4 PUSH4 0xEF5FFE69 DUP9 MLOAD PUSH20 0xEDFA9F64736F6C634300081E0033000000000000 ","sourceMap":"343:1343:164:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_uint32":{"entryPoint":1590,"id":null,"parameterSlots":1,"returnSlots":1},"abi_decode_uint32_3739":{"entryPoint":1566,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_uint256_array_uint256_dyn":{"entryPoint":1743,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":1719,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1607,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c806317537c7e1461049a578063265fe5751461044c5780634306d354146104145780634651ed3d146103b65780637fb5d19d14610372578063a4c0ed36146101f7578063e6689c51146100b25763fc2a88c31461007557600080fd5b346100af57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5760209054604051908152f35b80fd5b50346100af5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576004359073ffffffffffffffffffffffffffffffffffffffff82168092036100af5760443567ffffffffffffffff81116101f357366023820112156101f357806004013592610130846106b7565b9161013e6040519384610647565b8483526024602084019560051b820101903682116101ef57602401945b8186106101df575050829350803b156101db576101ae83929183926040519485809481937f1fe543e3000000000000000000000000000000000000000000000000000000008352602435600484016106cf565b03925af180156101d0576101bf5750f35b816101c991610647565b6100af5780f35b6040513d84823e3d90fd5b5050fd5b853581526020958601950161015b565b8480fd5b5080fd5b50346100af5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576004359073ffffffffffffffffffffffffffffffffffffffff82168092036100af5760443567ffffffffffffffff81116101f357366023820112156101f357806004013567ffffffffffffffff811161036e57810136602482011161036e57606090829003126101f35761029d60248201610636565b50604481013561ffff8116036101f35760646102b99101610636565b8154926001840180941161034157838352600160205260408320907fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055828252600260205263ffffffff6040832091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000082541617905555602060405160018152f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b50346100af5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576103aa61061e565b50602060405160648152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5773ffffffffffffffffffffffffffffffffffffffff6040602092600435815260018452205416604051908152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af576103aa61061e565b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5763ffffffff6040602092600435815260028452205416604051908152f35b50346100af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100af5760043580825260026020528163ffffffff604082205416916104eb836106b7565b926104f96040519485610647565b8084527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610526826106b7565b01366020860137825b8181106105cb575050808252600160205273ffffffffffffffffffffffffffffffffffffffff60408320541692833b1561036e5761059f938392836040518097819582947f1fe543e3000000000000000000000000000000000000000000000000000000008452600484016106cf565b03925af180156105be576105b05780f35b6105b991610647565b388180f35b50604051903d90823e3d90fd5b9091925083518110156105f15780607b602060019360051b87010152019084929161052f565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004359063ffffffff8216820361063157565b600080fd5b359063ffffffff8216820361063157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761068857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116106885760051b60200190565b60606020916040810193815260408382015284518094520192019060005b8181106106fa5750505090565b82518452602093840193909201916001016106ed56fea264697066735822122000a0edecd60de2054e69013f92a0aff7134718e58363ef5ffe69885173edfa9f64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x17537C7E EQ PUSH2 0x49A JUMPI DUP1 PUSH4 0x265FE575 EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0x4306D354 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x4651ED3D EQ PUSH2 0x3B6 JUMPI DUP1 PUSH4 0x7FB5D19D EQ PUSH2 0x372 JUMPI DUP1 PUSH4 0xA4C0ED36 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0xE6689C51 EQ PUSH2 0xB2 JUMPI PUSH4 0xFC2A88C3 EQ PUSH2 0x75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAF JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x20 SWAP1 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0xAF JUMPI PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F3 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1F3 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH2 0x130 DUP5 PUSH2 0x6B7 JUMP JUMPDEST SWAP2 PUSH2 0x13E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x647 JUMP JUMPDEST DUP5 DUP4 MSTORE PUSH1 0x24 PUSH1 0x20 DUP5 ADD SWAP6 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1EF JUMPI PUSH1 0x24 ADD SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1DF JUMPI POP POP DUP3 SWAP4 POP DUP1 EXTCODESIZE ISZERO PUSH2 0x1DB JUMPI PUSH2 0x1AE DUP4 SWAP3 SWAP2 DUP4 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 DUP1 SWAP5 DUP2 SWAP4 PUSH32 0x1FE543E300000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x24 CALLDATALOAD PUSH1 0x4 DUP5 ADD PUSH2 0x6CF JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x1D0 JUMPI PUSH2 0x1BF JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x1C9 SWAP2 PUSH2 0x647 JUMP JUMPDEST PUSH2 0xAF JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP POP REVERT JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x15B JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0xAF JUMPI PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F3 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x1F3 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x36E JUMPI DUP2 ADD CALLDATASIZE PUSH1 0x24 DUP3 ADD GT PUSH2 0x36E JUMPI PUSH1 0x60 SWAP1 DUP3 SWAP1 SUB SLT PUSH2 0x1F3 JUMPI PUSH2 0x29D PUSH1 0x24 DUP3 ADD PUSH2 0x636 JUMP JUMPDEST POP PUSH1 0x44 DUP2 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND SUB PUSH2 0x1F3 JUMPI PUSH1 0x64 PUSH2 0x2B9 SWAP2 ADD PUSH2 0x636 JUMP JUMPDEST DUP2 SLOAD SWAP3 PUSH1 0x1 DUP5 ADD DUP1 SWAP5 GT PUSH2 0x341 JUMPI DUP4 DUP4 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP4 KECCAK256 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE DUP3 DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH4 0xFFFFFFFF PUSH1 0x40 DUP4 KECCAK256 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 DUP3 SLOAD AND OR SWAP1 SSTORE SSTORE PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x24 DUP4 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH2 0x3AA PUSH2 0x61E JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x64 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x1 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH2 0x3AA PUSH2 0x61E JUMP JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH4 0xFFFFFFFF PUSH1 0x40 PUSH1 0x20 SWAP3 PUSH1 0x4 CALLDATALOAD DUP2 MSTORE PUSH1 0x2 DUP5 MSTORE KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xAF JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAF JUMPI PUSH1 0x4 CALLDATALOAD DUP1 DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE DUP2 PUSH4 0xFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND SWAP2 PUSH2 0x4EB DUP4 PUSH2 0x6B7 JUMP JUMPDEST SWAP3 PUSH2 0x4F9 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x647 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x526 DUP3 PUSH2 0x6B7 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP3 JUMPDEST DUP2 DUP2 LT PUSH2 0x5CB JUMPI POP POP DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP4 KECCAK256 SLOAD AND SWAP3 DUP4 EXTCODESIZE ISZERO PUSH2 0x36E JUMPI PUSH2 0x59F SWAP4 DUP4 SWAP3 DUP4 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x1FE543E300000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0x6CF JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x5BE JUMPI PUSH2 0x5B0 JUMPI DUP1 RETURN JUMPDEST PUSH2 0x5B9 SWAP2 PUSH2 0x647 JUMP JUMPDEST CODESIZE DUP2 DUP1 RETURN JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 POP DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x5F1 JUMPI DUP1 PUSH1 0x7B PUSH1 0x20 PUSH1 0x1 SWAP4 PUSH1 0x5 SHL DUP8 ADD ADD MSTORE ADD SWAP1 DUP5 SWAP3 SWAP2 PUSH2 0x52F JUMP JUMPDEST PUSH1 0x24 DUP6 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH4 0xFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x631 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATALOAD SWAP1 PUSH4 0xFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x631 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x688 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x688 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x20 SWAP2 PUSH1 0x40 DUP2 ADD SWAP4 DUP2 MSTORE PUSH1 0x40 DUP4 DUP3 ADD MSTORE DUP5 MLOAD DUP1 SWAP5 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x6FA JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x6ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 STOP LOG0 0xED EOFCREATE 0xD6 0xD 0xE2 SDIV 0x4E PUSH10 0x13F92A0AFF7134718E5 DUP4 PUSH4 0xEF5FFE69 DUP9 MLOAD PUSH20 0xEDFA9F64736F6C634300081E0033000000000000 ","sourceMap":"343:1343:164:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1623:54;;;;;;;;;;;343:1343;;;;;;;1623:54;;;;;;343:1343;1623:54;;343:1343;;;1623:54;;;:::i;:::-;;;;;;;;;;;343:1343;;1623:54;;;;;:::i;:::-;343:1343;;1623:54;343:1343;1623:54;343:1343;;;;;;;;;1623:54;343:1343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1057:8;343:1343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;761:3;343:1343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;512:42;343:1343;;;;;;;;;;;;;;;;;;;;;;;;;;;;1242:8;343:1343;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;1338:9;1349:10;;;;;;343:1343;;;;;;;;;;;;;;1420:66;;;;;;;343:1343;;;;;;1420:66;;;;;;343:1343;1420:66;;343:1343;1420:66;;;:::i;:::-;;;;;;;;;;;343:1343;;1420:66;;;;:::i;:::-;;;343:1343;;1420:66;343:1343;;;;;;;;;;;1361:3;343:1343;;;;;;;;;;;;1397:3;343:1343;;;;;;;;;;1338:9;;;;;;343:1343;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;343:1343:164;;;;;-1:-1:-1;343:1343:164;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"372400","executionCost":"418","totalCost":"372818"},"external":{"calculateRequestPrice(uint32)":"256","consumers(uint256)":"2390","estimateRequestPrice(uint32,uint256)":"300","fulfillRandomWords(address,uint256,uint256[])":"infinite","fulfillRandomnessRequest(uint256)":"infinite","lastRequestId()":"2401","numWords(uint256)":"2346","onTokenTransfer(address,uint256,bytes)":"infinite"}},"methodIdentifiers":{"calculateRequestPrice(uint32)":"4306d354","consumers(uint256)":"4651ed3d","estimateRequestPrice(uint32,uint256)":"7fb5d19d","fulfillRandomWords(address,uint256,uint256[])":"e6689c51","fulfillRandomnessRequest(uint256)":"17537c7e","lastRequestId()":"fc2a88c3","numWords(uint256)":"265fe575","onTokenTransfer(address,uint256,bytes)":"a4c0ed36"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"calculateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"consumers\",\"outputs\":[{\"internalType\":\"contract VRFConsumerBaseV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"estimateRequestPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract VRFConsumerBaseV2\",\"name\":\"consumer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"randomWords\",\"type\":\"uint256[]\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"fulfillRandomnessRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRequestId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"numWords\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"lastRequestId\":{\"return\":\"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made.\",\"returns\":{\"_0\":\"the request ID of the most recent VRF V2 request made by this wrapper. This should only be relied option within the same transaction that the request was made.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/vrf/VRFV2WrapperMock.sol\":\"VRFV2WrapperMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n *\\n * @notice Interface for contracts using VRF randomness\\n * *****************************************************************************\\n * @dev PURPOSE\\n *\\n * @dev Reggie the Random Oracle (not his real job) wants to provide randomness\\n * @dev to Vera the verifier in such a way that Vera can be sure he's not\\n * @dev making his output up to suit himself. Reggie provides Vera a public key\\n * @dev to which he knows the secret key. Each time Vera provides a seed to\\n * @dev Reggie, he gives back a value which is computed completely\\n * @dev deterministically from the seed and the secret key.\\n *\\n * @dev Reggie provides a proof by which Vera can verify that the output was\\n * @dev correctly computed once Reggie tells it to her, but without that proof,\\n * @dev the output is indistinguishable to her from a uniform random sample\\n * @dev from the output space.\\n *\\n * @dev The purpose of this contract is to make it easy for unrelated contracts\\n * @dev to talk to Vera the verifier about the work Reggie is doing, to provide\\n * @dev simple access to a verifiable source of randomness. It ensures 2 things:\\n * @dev 1. The fulfillment came from the VRFCoordinator\\n * @dev 2. The consumer contract implements fulfillRandomWords.\\n * *****************************************************************************\\n * @dev USAGE\\n *\\n * @dev Calling contracts must inherit from VRFConsumerBase, and can\\n * @dev initialize VRFConsumerBase's attributes in their constructor as\\n * @dev shown:\\n *\\n * @dev   contract VRFConsumer {\\n * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)\\n * @dev       VRFConsumerBase(_vrfCoordinator) public {\\n * @dev         <initialization with other arguments goes here>\\n * @dev       }\\n * @dev   }\\n *\\n * @dev The oracle will have given you an ID for the VRF keypair they have\\n * @dev committed to (let's call it keyHash). Create subscription, fund it\\n * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface\\n * @dev subscription management functions).\\n * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,\\n * @dev callbackGasLimit, numWords),\\n * @dev see (VRFCoordinatorInterface for a description of the arguments).\\n *\\n * @dev Once the VRFCoordinator has received and validated the oracle's response\\n * @dev to your request, it will call your contract's fulfillRandomWords method.\\n *\\n * @dev The randomness argument to fulfillRandomWords is a set of random words\\n * @dev generated from your requestId and the blockHash of the request.\\n *\\n * @dev If your contract could have concurrent requests open, you can use the\\n * @dev requestId returned from requestRandomWords to track which response is associated\\n * @dev with which randomness request.\\n * @dev See \\\"SECURITY CONSIDERATIONS\\\" for principles to keep in mind,\\n * @dev if your contract could have multiple requests in flight simultaneously.\\n *\\n * @dev Colliding `requestId`s are cryptographically impossible as long as seeds\\n * @dev differ.\\n *\\n * *****************************************************************************\\n * @dev SECURITY CONSIDERATIONS\\n *\\n * @dev A method with the ability to call your fulfillRandomness method directly\\n * @dev could spoof a VRF response with any random value, so it's critical that\\n * @dev it cannot be directly called by anything other than this base contract\\n * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).\\n *\\n * @dev For your users to trust that your contract's random behavior is free\\n * @dev from malicious interference, it's best if you can write it so that all\\n * @dev behaviors implied by a VRF response are executed *during* your\\n * @dev fulfillRandomness method. If your contract must store the response (or\\n * @dev anything derived from it) and use it later, you must ensure that any\\n * @dev user-significant behavior which depends on that stored value cannot be\\n * @dev manipulated by a subsequent VRF request.\\n *\\n * @dev Similarly, both miners and the VRF oracle itself have some influence\\n * @dev over the order in which VRF responses appear on the blockchain, so if\\n * @dev your contract could have multiple VRF requests in flight simultaneously,\\n * @dev you must ensure that the order in which the VRF responses arrive cannot\\n * @dev be used to manipulate your contract's user-significant behavior.\\n *\\n * @dev Since the block hash of the block which contains the requestRandomness\\n * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful\\n * @dev miner could, in principle, fork the blockchain to evict the block\\n * @dev containing the request, forcing the request to be included in a\\n * @dev different block with a different hash, and therefore a different input\\n * @dev to the VRF. However, such an attack would incur a substantial economic\\n * @dev cost. This cost scales with the number of blocks the VRF oracle waits\\n * @dev until it calls responds to a request. It is for this reason that\\n * @dev that you can signal to an oracle you'd like them to wait longer before\\n * @dev responding to the request (however this is not enforced in the contract\\n * @dev and so remains effective only in the case of unmodified oracle software).\\n */\\nabstract contract VRFConsumerBaseV2 {\\n  error OnlyCoordinatorCanFulfill(address have, address want);\\n\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  address private immutable vrfCoordinator;\\n\\n  /**\\n   * @param _vrfCoordinator address of VRFCoordinator contract\\n   */\\n  constructor(\\n    address _vrfCoordinator\\n  ) {\\n    vrfCoordinator = _vrfCoordinator;\\n  }\\n\\n  /**\\n   * @notice fulfillRandomness handles the VRF response. Your contract must\\n   * @notice implement it. See \\\"SECURITY CONSIDERATIONS\\\" above for important\\n   * @notice principles to keep in mind when implementing your fulfillRandomness\\n   * @notice method.\\n   *\\n   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this\\n   * @dev signature, and will call it once it has verified the proof\\n   * @dev associated with the randomness. (It is triggered via a call to\\n   * @dev rawFulfillRandomness, below.)\\n   *\\n   * @param requestId The Id initially returned by requestRandomness\\n   * @param randomWords the VRF output expanded to the requested number of words\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;\\n\\n  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF\\n  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating\\n  // the origin of the call\\n  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {\\n    if (msg.sender != vrfCoordinator) {\\n      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);\\n    }\\n    fulfillRandomWords(requestId, randomWords);\\n  }\\n}\\n\",\"keccak256\":\"0x377514238c3fd6e6f9acdce8b537aa8c189c3164edc1027a3d25044ab24d7b4f\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface VRFV2WrapperInterface {\\n  /**\\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\\n   * be relied option within the same transaction that the request was made.\\n   */\\n  function lastRequestId() external view returns (uint256);\\n\\n  /**\\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\\n   * @notice block.\\n   *\\n   * @dev This function relies on the transaction gas price which is not automatically set during\\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   */\\n  function calculateRequestPrice(\\n    uint32 _callbackGasLimit\\n  ) external view returns (uint256);\\n\\n  /**\\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\\n   *\\n   * @dev This is a convenience function that can be called in simulation to better understand\\n   * @dev pricing.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\\n   */\\n  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x64e35b94edb2bf70b2fd64d5c571394b44e3c66f707ece3555fe81e847f2517a\",\"license\":\"MIT\"},\"contracts/mocks/vrf/VRFV2WrapperMock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC677Receiver} from \\\"./../../token/ERC20/interfaces/IERC677Receiver.sol\\\";\\nimport {VRFV2WrapperInterface} from \\\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\\\";\\nimport {VRFConsumerBaseV2} from \\\"@chainlink/contracts/src/v0.8/vrf/VRFConsumerBaseV2.sol\\\";\\n\\ncontract VRFV2WrapperMock is IERC677Receiver, VRFV2WrapperInterface {\\n    uint256 public lastRequestId;\\n\\n    mapping(uint256 => VRFConsumerBaseV2) public consumers;\\n    mapping(uint256 => uint32) public numWords;\\n\\n    function calculateRequestPrice(uint32) external pure returns (uint256) {\\n        return 100;\\n    }\\n\\n    function estimateRequestPrice(uint32, uint256) external pure returns (uint256) {\\n        return 100;\\n    }\\n\\n    function onTokenTransfer(address from, uint256, bytes calldata data) external returns (bool) {\\n        (, , uint32 nWords) = abi.decode(data, (uint32, uint16, uint32));\\n        uint256 requestId = lastRequestId + 1;\\n        consumers[requestId] = VRFConsumerBaseV2(from);\\n        numWords[requestId] = nWords;\\n        lastRequestId = requestId;\\n        return true;\\n    }\\n\\n    function fulfillRandomnessRequest(uint256 requestId) external {\\n        uint32 nWords = numWords[requestId];\\n        uint256[] memory randomWords = new uint256[](nWords);\\n        for (uint256 i; i < nWords; ++i) {\\n            randomWords[i] = 123;\\n        }\\n        consumers[requestId].rawFulfillRandomWords(requestId, randomWords);\\n    }\\n\\n    function fulfillRandomWords(VRFConsumerBaseV2 consumer, uint256 requestId, uint256[] memory randomWords) external {\\n        consumer.rawFulfillRandomWords(requestId, randomWords);\\n    }\\n}\\n\",\"keccak256\":\"0x080d806b3adddf44e5d3c190dc7e82861fc513bc5954fc56a5d5b11ed6ec60a7\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC677Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC677 transferAndCall Token Standard, receiver interface.\\n/// @dev See https://github.com/ethereum/EIPs/issues/677\\ninterface IERC677Receiver {\\n    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool success);\\n}\\n\",\"keccak256\":\"0x6622734f4dd330da397e8c05807073796a15024c82105e014ee5920dc29fa968\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":18400,"contract":"contracts/mocks/vrf/VRFV2WrapperMock.sol:VRFV2WrapperMock","label":"lastRequestId","offset":0,"slot":"0","type":"t_uint256"},{"astId":18405,"contract":"contracts/mocks/vrf/VRFV2WrapperMock.sol:VRFV2WrapperMock","label":"consumers","offset":0,"slot":"1","type":"t_mapping(t_uint256,t_contract(VRFConsumerBaseV2)152)"},{"astId":18409,"contract":"contracts/mocks/vrf/VRFV2WrapperMock.sol:VRFV2WrapperMock","label":"numWords","offset":0,"slot":"2","type":"t_mapping(t_uint256,t_uint32)"}],"types":{"t_contract(VRFConsumerBaseV2)152":{"encoding":"inplace","label":"contract VRFConsumerBaseV2","numberOfBytes":"20"},"t_mapping(t_uint256,t_contract(VRFConsumerBaseV2)152)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => contract VRFConsumerBaseV2)","numberOfBytes":"32","value":"t_contract(VRFConsumerBaseV2)152"},"t_mapping(t_uint256,t_uint32)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => uint32)","numberOfBytes":"32","value":"t_uint32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint32":{"encoding":"inplace","label":"uint32","numberOfBytes":"4"}}},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/payment/CumulativeMerkleClaim.sol":{"CumulativeMerkleClaim":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"InvalidProof","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootSet","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"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"PayoutClaimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"claimData","type":"bytes"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AlreadyClaimed(address,bytes,uint256)":[{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim."}}],"InvalidProof(address,bytes,uint256)":[{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"MerkleRootSet(bytes32)":{"params":{"root":"The new merkle root."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"PayoutClaimed(bytes32,address,bytes,uint256)":{"params":{"claimData":"The encoded claim data for the claim.","nonce":"The nonce as when the claim was made.","recipient":"The recipient of the claim.","root":"The merkle root on which the claim was made."}}},"kind":"dev","methods":{"claimPayout(address,bytes,bytes32[])":{"details":"Reverts with {Paused} if the contract is paused.Reverts with {AlreadyClaimed} if this specific payout has already been claimed.Reverts with {InvalidProof} if the merkle proof cannot be verified.Emits a {PayoutClaimed} event.","params":{"claimData":"Encoded claim data for `recipient`","proof":"Merkle proof of the user based on the merkle root","recipient":"Address of the user to claim the payout"}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"pause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event."},"paused()":{"returns":{"_0":"The paused state of the contract."}},"setMerkleRoot(bytes32)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.Emits a {MerkleRootSet} event.","params":{"merkleRoot":"The merkle root to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"unpause()":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event."}},"title":"CumulativeMerkleClaim","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"claimPayout(address,bytes,bytes32[])":"edcdebcc","claimed(bytes32)":"cc3c0f06","nonce()":"affed0e0","owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","root()":"ebf0c717","setMerkleRoot(bytes32)":"7cb64759","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"MerkleRootSet\",\"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\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"PayoutClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"claimPayout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"claimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"root\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"setMerkleRoot\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AlreadyClaimed(address,bytes,uint256)\":[{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\"}}],\"InvalidProof(address,bytes,uint256)\":[{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"MerkleRootSet(bytes32)\":{\"params\":{\"root\":\"The new merkle root.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"PayoutClaimed(bytes32,address,bytes,uint256)\":{\"params\":{\"claimData\":\"The encoded claim data for the claim.\",\"nonce\":\"The nonce as when the claim was made.\",\"recipient\":\"The recipient of the claim.\",\"root\":\"The merkle root on which the claim was made.\"}}},\"kind\":\"dev\",\"methods\":{\"claimPayout(address,bytes,bytes32[])\":{\"details\":\"Reverts with {Paused} if the contract is paused.Reverts with {AlreadyClaimed} if this specific payout has already been claimed.Reverts with {InvalidProof} if the merkle proof cannot be verified.Emits a {PayoutClaimed} event.\",\"params\":{\"claimData\":\"Encoded claim data for `recipient`\",\"proof\":\"Merkle proof of the user based on the merkle root\",\"recipient\":\"Address of the user to claim the payout\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"pause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {Paused} if the contract is paused.Emits a {Paused} event.\"},\"paused()\":{\"returns\":{\"_0\":\"The paused state of the contract.\"}},\"setMerkleRoot(bytes32)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.Emits a {MerkleRootSet} event.\",\"params\":{\"merkleRoot\":\"The merkle root to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"unpause()\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {NotPaused} if the contract is not paused.Emits an {Unpaused} event.\"}},\"title\":\"CumulativeMerkleClaim\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyClaimed(address,bytes,uint256)\":[{\"notice\":\"Thrown when trying to claim the same leaf more than once.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InvalidProof(address,bytes,uint256)\":[{\"notice\":\"Thrown when a proof cannot be verified.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotPaused()\":[{\"notice\":\"Thrown when the contract is not paused but is required to.\"}],\"Paused()\":[{\"notice\":\"Thrown when the contract is paused but is required not to.\"}]},\"events\":{\"MerkleRootSet(bytes32)\":{\"notice\":\"Emitted when a new merkle root is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Pause()\":{\"notice\":\"Emitted when the pause is triggered.\"},\"PayoutClaimed(bytes32,address,bytes,uint256)\":{\"notice\":\"Emitted when a payout is claimed.\"},\"Unpause()\":{\"notice\":\"Emitted when the pause is lifted.\"}},\"kind\":\"user\",\"methods\":{\"claimPayout(address,bytes,bytes32[])\":{\"notice\":\"Executes the payout for a given user (anyone can call this function).\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Gets the paused state of the contract.\"},\"setMerkleRoot(bytes32)\":{\"notice\":\"Sets the merkle root for a new claiming period and unpauses the contract.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"notice\":\"This contract is designed for claiming payouts which will cumulate over time.A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the currentunclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/CumulativeMerkleClaim.sol\":\"CumulativeMerkleClaim\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/Hashes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/Hashes.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library of standard hash functions.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Hashes {\\n    /**\\n     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.\\n     *\\n     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n     */\\n    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {\\n        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);\\n    }\\n\\n    /**\\n     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n     */\\n    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, a)\\n            mstore(0x20, b)\\n            value := keccak256(0x00, 0x40)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8cbd338f083224b4b6f0ff42cbda641a0a6c31ffcdca197452b97fe4d0918269\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)\\n// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.\\n\\npragma solidity ^0.8.20;\\n\\nimport {Hashes} from \\\"./Hashes.sol\\\";\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the Merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\\n * against this attack out of the box.\\n *\\n * IMPORTANT: Consider memory side-effects when using custom hashing functions\\n * that access memory in an unsafe way.\\n *\\n * NOTE: This library supports proof verification for merkle trees built using\\n * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving\\n * leaf inclusion in trees built using non-commutative hashing functions requires\\n * additional logic that is not supported by this library.\\n */\\nlibrary MerkleProof {\\n    /**\\n     *@dev The multiproof provided is not valid.\\n     */\\n    error MerkleProofInvalidMultiproof();\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProof(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with the default hashing function.\\n     */\\n    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function verify(\\n        bytes32[] memory proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProof(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in memory with a custom hashing function.\\n     */\\n    function processProof(\\n        bytes32[] memory proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n        return processProofCalldata(proof, leaf) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with the default hashing function.\\n     */\\n    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n     * defined by `root`. For this, a `proof` must be provided, containing\\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function verifyCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 root,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processProofCalldata(proof, leaf, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n     * hash matches the root of the tree. When processing the proof, the pairs\\n     * of leaves & pre-images are assumed to be sorted.\\n     *\\n     * This version handles proofs in calldata with a custom hashing function.\\n     */\\n    function processProofCalldata(\\n        bytes32[] calldata proof,\\n        bytes32 leaf,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32) {\\n        bytes32 computedHash = leaf;\\n        for (uint256 i = 0; i < proof.length; i++) {\\n            computedHash = hasher(computedHash, proof[i]);\\n        }\\n        return computedHash;\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProof}.\\n     */\\n    function multiProofVerify(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProof(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in memory with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProof(\\n        bytes32[] memory proof,\\n        bool[] memory proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with the default hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves\\n    ) internal pure returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = Hashes.commutativeKeccak256(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n     *\\n     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.\\n     * The `leaves` must be validated independently. See {processMultiProofCalldata}.\\n     */\\n    function multiProofVerifyCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32 root,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bool) {\\n        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;\\n    }\\n\\n    /**\\n     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n     * respectively.\\n     *\\n     * This version handles multiproofs in calldata with a custom hashing function.\\n     *\\n     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n     *\\n     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,\\n     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not\\n     * validating the leaves elsewhere.\\n     */\\n    function processMultiProofCalldata(\\n        bytes32[] calldata proof,\\n        bool[] calldata proofFlags,\\n        bytes32[] memory leaves,\\n        function(bytes32, bytes32) view returns (bytes32) hasher\\n    ) internal view returns (bytes32 merkleRoot) {\\n        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n        // the Merkle tree.\\n        uint256 leavesLen = leaves.length;\\n        uint256 proofFlagsLen = proofFlags.length;\\n\\n        // Check proof validity.\\n        if (leavesLen + proof.length != proofFlagsLen + 1) {\\n            revert MerkleProofInvalidMultiproof();\\n        }\\n\\n        // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n        bytes32[] memory hashes = new bytes32[](proofFlagsLen);\\n        uint256 leafPos = 0;\\n        uint256 hashPos = 0;\\n        uint256 proofPos = 0;\\n        // At each step, we compute the next hash using two values:\\n        // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n        //   get the next hash.\\n        // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n        //   `proof` array.\\n        for (uint256 i = 0; i < proofFlagsLen; i++) {\\n            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n            bytes32 b = proofFlags[i]\\n                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n                : proof[proofPos++];\\n            hashes[i] = hasher(a, b);\\n        }\\n\\n        if (proofFlagsLen > 0) {\\n            if (proofPos != proof.length) {\\n                revert MerkleProofInvalidMultiproof();\\n            }\\n            unchecked {\\n                return hashes[proofFlagsLen - 1];\\n            }\\n        } else if (leavesLen > 0) {\\n            return leaves[0];\\n        } else {\\n            return proof[0];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x36a0c409c437a753cac9b92b75f93b0fbe92803bf2c8ff1517e54b247f166134\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/lifecycle/Pause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PauseStorage} from \\\"./libraries/PauseStorage.sol\\\";\\nimport {PauseBase} from \\\"./base/PauseBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Pausing mechanism (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract Pause is PauseBase, ContractOwnership {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial pause state.\\n    /// @dev Emits a {Paused} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    constructor(bool isPaused) {\\n        PauseStorage.layout().constructorInit(isPaused);\\n    }\\n}\\n\",\"keccak256\":\"0x2d5ed9d279d9fbaff12a44d109bd722814eb8dbedcbc6957a176e397e309f338\",\"license\":\"MIT\"},\"contracts/lifecycle/base/PauseBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPause} from \\\"./../interfaces/IPause.sol\\\";\\nimport {PauseStorage} from \\\"./../libraries/PauseStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Pausing mechanism (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PauseBase is IPause, Context {\\n    using PauseStorage for PauseStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Paused} event.\\n    function pause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    function unpause() external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n    }\\n\\n    // /// @inheritdoc IPause\\n    function paused() external view virtual returns (bool) {\\n        return PauseStorage.layout().paused();\\n    }\\n}\\n\",\"keccak256\":\"0xce7817330cd1eadebb70e2f860112e09659ce9793516f0546dc39cc4b24f1c34\",\"license\":\"MIT\"},\"contracts/lifecycle/errors/PauseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the contract is paused but is required not to.\\nerror Paused();\\n\\n/// @notice Thrown when the contract is not paused but is required to.\\nerror NotPaused();\\n\",\"keccak256\":\"0x67f81551733d46df8176197ce4b44eded4cd4e3c3a78fb3a3aed29a8bf6545ab\",\"license\":\"MIT\"},\"contracts/lifecycle/events/PauseEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the pause is triggered.\\nevent Pause();\\n\\n/// @notice Emitted when the pause is lifted.\\nevent Unpause();\\n\",\"keccak256\":\"0x8dcd0b8f7e684ef7d09ba562e2862e228a43168026197a6ba16514c05d5a4ca9\",\"license\":\"MIT\"},\"contracts/lifecycle/interfaces/IPause.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Pausing mechanism (functions)\\ninterface IPause {\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused() external view returns (bool isPaused);\\n}\\n\",\"keccak256\":\"0x4df1892f1219700728890972c13726c5f13f68b0d19e34dafa4dc31ed11b697f\",\"license\":\"MIT\"},\"contracts/lifecycle/libraries/PauseStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {Paused, NotPaused} from \\\"./../errors/PauseErrors.sol\\\";\\nimport {Pause, Unpause} from \\\"./../events/PauseEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PauseStorage {\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    struct Layout {\\n        bool isPaused;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.lifecycle.Pause.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial pause state (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function constructorInit(Layout storage s, bool isPaused) internal {\\n        if (isPaused) {\\n            s.isPaused = true;\\n            emit Pause();\\n        }\\n    }\\n\\n    /// @notice Initializes the storage with an initial pause state (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits a {Pause} event if `isPaused` is true.\\n    /// @param isPaused The initial pause state.\\n    function proxyInit(Layout storage s, bool isPaused) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(isPaused);\\n    }\\n\\n    /// @notice Pauses the contract.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Emits a {Pause} event.\\n    function pause(Layout storage s) internal {\\n        s.enforceIsNotPaused();\\n        s.isPaused = true;\\n        emit Pause();\\n    }\\n\\n    /// @notice Unpauses the contract.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpause} event.\\n    function unpause(Layout storage s) internal {\\n        s.enforceIsPaused();\\n        s.isPaused = false;\\n        emit Unpause();\\n    }\\n\\n    /// @notice Gets the paused state of the contract.\\n    /// @return isPaused The paused state of the contract.\\n    function paused(Layout storage s) internal view returns (bool isPaused) {\\n        return s.isPaused;\\n    }\\n\\n    /// @notice Ensures that the contract is paused.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    function enforceIsPaused(Layout storage s) internal view {\\n        if (!s.isPaused) revert NotPaused();\\n    }\\n\\n    /// @notice Ensures that the contract is not paused.\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    function enforceIsNotPaused(Layout storage s) internal view {\\n        if (s.isPaused) revert Paused();\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe026b8e9e2594bf104ef8e8b481ae5b87fc40f3e142f02b6fcbce4d9ca004764\",\"license\":\"MIT\"},\"contracts/payment/CumulativeMerkleClaim.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {MerkleProof} from \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PauseStorage} from \\\"./../lifecycle/libraries/PauseStorage.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\nimport {Pause} from \\\"./../lifecycle/Pause.sol\\\";\\n\\n/// @title CumulativeMerkleClaim\\n/// @notice This contract is designed for claiming payouts which will cumulate over time.\\n/// @notice A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).\\n/// @notice Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the current\\n/// @notice unclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.\\n/// @notice A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees.\\nabstract contract CumulativeMerkleClaim is Pause {\\n    using MerkleProof for bytes32[];\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PauseStorage for PauseStorage.Layout;\\n\\n    bytes32 public root;\\n    uint256 public nonce;\\n\\n    mapping(bytes32 => bool) public claimed;\\n\\n    /// @notice Emitted when a new merkle root is set.\\n    /// @param root The new merkle root.\\n    event MerkleRootSet(bytes32 root);\\n\\n    /// @notice Emitted when a payout is claimed.\\n    /// @param root The merkle root on which the claim was made.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    event PayoutClaimed(bytes32 indexed root, address indexed recipient, bytes claimData, uint256 nonce);\\n\\n    /// @notice Thrown when trying to claim the same leaf more than once.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    error AlreadyClaimed(address recipient, bytes claimData, uint256 nonce);\\n\\n    /// @notice Thrown when a proof cannot be verified.\\n    /// @param recipient The recipient of the claim.\\n    /// @param claimData The encoded claim data for the claim.\\n    /// @param nonce The nonce as when the claim was made.\\n    error InvalidProof(address recipient, bytes claimData, uint256 nonce);\\n\\n    constructor() Pause(true) ContractOwnership(msg.sender) {}\\n\\n    /// @notice Sets the merkle root for a new claiming period and unpauses the contract.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {NotPaused} if the contract is not paused.\\n    /// @dev Emits an {Unpaused} event.\\n    /// @dev Emits a {MerkleRootSet} event.\\n    /// @param merkleRoot The merkle root to set.\\n    function setMerkleRoot(bytes32 merkleRoot) public {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PauseStorage.layout().unpause();\\n        root = merkleRoot;\\n        unchecked {\\n            ++nonce;\\n        }\\n        emit MerkleRootSet(merkleRoot);\\n    }\\n\\n    /// @notice Executes the payout for a given user (anyone can call this function).\\n    /// @dev Reverts with {Paused} if the contract is paused.\\n    /// @dev Reverts with {AlreadyClaimed} if this specific payout has already been claimed.\\n    /// @dev Reverts with {InvalidProof} if the merkle proof cannot be verified.\\n    /// @dev Emits a {PayoutClaimed} event.\\n    /// @param recipient Address of the user to claim the payout\\n    /// @param claimData Encoded claim data for `recipient`\\n    /// @param proof Merkle proof of the user based on the merkle root\\n    function claimPayout(address recipient, bytes calldata claimData, bytes32[] calldata proof) external {\\n        PauseStorage.layout().enforceIsNotPaused();\\n\\n        uint256 currentNonce = nonce;\\n        bytes32 currentRoot = root;\\n        bytes32 leaf = keccak256(abi.encodePacked(recipient, claimData, currentNonce));\\n\\n        if (claimed[leaf]) revert AlreadyClaimed(recipient, claimData, currentNonce);\\n        if (!proof.verifyCalldata(currentRoot, leaf)) revert InvalidProof(recipient, claimData, currentNonce);\\n\\n        claimed[leaf] = true;\\n\\n        emit PayoutClaimed(currentRoot, recipient, claimData, currentNonce);\\n\\n        _distributePayout(recipient, claimData);\\n    }\\n\\n    /// @notice Distributes the payout to the recipient.\\n    /// @dev This virtual function must be implemented by inheriting contracts.\\n    /// @param recipient Address of the user to claim the payout\\n    /// @param claimData Encoded claim data for `recipient`. The encoding is specific to the inheriting contract, for example a quantity of tokens.\\n    function _distributePayout(address recipient, bytes calldata claimData) internal virtual;\\n}\\n\",\"keccak256\":\"0x4ab563dd036efa7f52085a83dba987becb5ac733b01eb728d97bfd1ab8de8ee6\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":18580,"contract":"contracts/payment/CumulativeMerkleClaim.sol:CumulativeMerkleClaim","label":"root","offset":0,"slot":"0","type":"t_bytes32"},{"astId":18582,"contract":"contracts/payment/CumulativeMerkleClaim.sol:CumulativeMerkleClaim","label":"nonce","offset":0,"slot":"1","type":"t_uint256"},{"astId":18586,"contract":"contracts/payment/CumulativeMerkleClaim.sol:CumulativeMerkleClaim","label":"claimed","offset":0,"slot":"2","type":"t_mapping(t_bytes32,t_bool)"}],"types":{"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"AlreadyClaimed(address,bytes,uint256)":[{"notice":"Thrown when trying to claim the same leaf more than once."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InvalidProof(address,bytes,uint256)":[{"notice":"Thrown when a proof cannot be verified."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotPaused()":[{"notice":"Thrown when the contract is not paused but is required to."}],"Paused()":[{"notice":"Thrown when the contract is paused but is required not to."}]},"events":{"MerkleRootSet(bytes32)":{"notice":"Emitted when a new merkle root is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Pause()":{"notice":"Emitted when the pause is triggered."},"PayoutClaimed(bytes32,address,bytes,uint256)":{"notice":"Emitted when a payout is claimed."},"Unpause()":{"notice":"Emitted when the pause is lifted."}},"kind":"user","methods":{"claimPayout(address,bytes,bytes32[])":{"notice":"Executes the payout for a given user (anyone can call this function)."},"owner()":{"notice":"Gets the address of the contract owner."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Gets the paused state of the contract."},"setMerkleRoot(bytes32)":{"notice":"Sets the merkle root for a new claiming period and unpauses the contract."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"unpause()":{"notice":"Unpauses the contract."}},"notice":"This contract is designed for claiming payouts which will cumulate over time.A merkle tree is generated with one leaf for each claim recipient together with the description of the claim (claimData).Flow: when new claims become available, the contract is paused to avoid further claims, a new tree is generated by summing up the currentunclaimed payouts and the new payouts, per user. The new tree is set and replaces the previous one and the contract is unpaused.A nonce is used for each new tree and is included in every leaf to prevent collisions with claims from previous trees.","version":1}}},"contracts/payment/PayoutWallet.sol":{"PayoutWallet":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"ZeroAddressPayoutWallet","type":"error"},{"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":false,"internalType":"address","name":"payoutWallet","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPayoutWallet","type":"address"}],"name":"setPayoutWallet","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"PayoutWalletSet(address)":{"params":{"payoutWallet":"the new payout wallet address."}}},"kind":"dev","methods":{"constructor":{"details":"Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"initialPayoutWallet":"The initial payout wallet."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"payoutWallet()":{"returns":{"wallet":"The payout wallet."}},"setPayoutWallet(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"newPayoutWallet":"The payout wallet."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"Payout wallet (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","payoutWallet()":"8488bb4e","setPayoutWallet(address)":"6b8f9c43","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressPayoutWallet\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"address\",\"name\":\"payoutWallet\",\"type\":\"address\"}],\"name\":\"PayoutWalletSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"newPayoutWallet\",\"type\":\"address\"}],\"name\":\"setPayoutWallet\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"PayoutWalletSet(address)\":{\"params\":{\"payoutWallet\":\"the new payout wallet address.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"initialPayoutWallet\":\"The initial payout wallet.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}},\"setPayoutWallet(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"newPayoutWallet\":\"The payout wallet.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"Payout wallet (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"ZeroAddressPayoutWallet()\":[{\"notice\":\"Thrown when setting the zero address as the payout wallet.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"PayoutWalletSet(address)\":{\"notice\":\"Emitted when the payout wallet address changes.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Initializes the storage with an initial payout wallet.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"},\"setPayoutWallet(address)\":{\"notice\":\"Sets the payout wallet.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/PayoutWallet.sol\":\"PayoutWallet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/payment/PayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {PayoutWalletStorage} from \\\"./libraries/PayoutWalletStorage.sol\\\";\\nimport {PayoutWalletBase} from \\\"./base/PayoutWalletBase.sol\\\";\\nimport {ContractOwnership} from \\\"../access/ContractOwnership.sol\\\";\\n\\n/// @title Payout wallet (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract PayoutWallet is PayoutWalletBase, ContractOwnership {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    constructor(address payable initialPayoutWallet) {\\n        PayoutWalletStorage.layout().constructorInit(initialPayoutWallet);\\n    }\\n}\\n\",\"keccak256\":\"0x4cfd896198908c885c344fa2e3bf7ef782caadb6b4739290c9e379317ea4f70b\",\"license\":\"MIT\"},\"contracts/payment/base/PayoutWalletBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPayoutWallet} from \\\"./../interfaces/IPayoutWallet.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Payout wallet (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view virtual returns (address payable wallet) {\\n        return PayoutWalletStorage.layout().payoutWallet();\\n    }\\n}\\n\",\"keccak256\":\"0x90b83174d8575394a9f8036d43ab94db79d2b9f4f65d5178b6878b6104eb0714\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"ZeroAddressPayoutWallet()":[{"notice":"Thrown when setting the zero address as the payout wallet."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"PayoutWalletSet(address)":{"notice":"Emitted when the payout wallet address changes."}},"kind":"user","methods":{"constructor":{"notice":"Initializes the storage with an initial payout wallet."},"owner()":{"notice":"Gets the address of the contract owner."},"payoutWallet()":{"notice":"Gets the payout wallet."},"setPayoutWallet(address)":{"notice":"Sets the payout wallet."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/payment/base/PayoutWalletBase.sol":{"PayoutWalletBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"ZeroAddressPayoutWallet","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payoutWallet","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPayoutWallet","type":"address"}],"name":"setPayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"PayoutWalletSet(address)":{"params":{"payoutWallet":"the new payout wallet address."}}},"kind":"dev","methods":{"payoutWallet()":{"returns":{"wallet":"The payout wallet."}},"setPayoutWallet(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"newPayoutWallet":"The payout wallet."}}},"title":"Payout wallet (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"payoutWallet()":"8488bb4e","setPayoutWallet(address)":"6b8f9c43"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressPayoutWallet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payoutWallet\",\"type\":\"address\"}],\"name\":\"PayoutWalletSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"newPayoutWallet\",\"type\":\"address\"}],\"name\":\"setPayoutWallet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"PayoutWalletSet(address)\":{\"params\":{\"payoutWallet\":\"the new payout wallet address.\"}}},\"kind\":\"dev\",\"methods\":{\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}},\"setPayoutWallet(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"newPayoutWallet\":\"The payout wallet.\"}}},\"title\":\"Payout wallet (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"ZeroAddressPayoutWallet()\":[{\"notice\":\"Thrown when setting the zero address as the payout wallet.\"}]},\"events\":{\"PayoutWalletSet(address)\":{\"notice\":\"Emitted when the payout wallet address changes.\"}},\"kind\":\"user\",\"methods\":{\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"},\"setPayoutWallet(address)\":{\"notice\":\"Sets the payout wallet.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/base/PayoutWalletBase.sol\":\"PayoutWalletBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/payment/base/PayoutWalletBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPayoutWallet} from \\\"./../interfaces/IPayoutWallet.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Payout wallet (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view virtual returns (address payable wallet) {\\n        return PayoutWalletStorage.layout().payoutWallet();\\n    }\\n}\\n\",\"keccak256\":\"0x90b83174d8575394a9f8036d43ab94db79d2b9f4f65d5178b6878b6104eb0714\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"ZeroAddressPayoutWallet()":[{"notice":"Thrown when setting the zero address as the payout wallet."}]},"events":{"PayoutWalletSet(address)":{"notice":"Emitted when the payout wallet address changes."}},"kind":"user","methods":{"payoutWallet()":{"notice":"Gets the payout wallet."},"setPayoutWallet(address)":{"notice":"Sets the payout wallet."}},"version":1}}},"contracts/payment/facets/PayoutWalletFacet.sol":{"PayoutWalletFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"ZeroAddressPayoutWallet","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payoutWallet","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[{"internalType":"address payable","name":"initialPayoutWallet","type":"address"}],"name":"initPayoutWalletStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPayoutWallet","type":"address"}],"name":"setPayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"PayoutWalletSet(address)":{"params":{"payoutWallet":"the new payout wallet address."}}},"kind":"dev","methods":{"initPayoutWalletStorage(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"initialPayoutWallet":"The initial payout wallet."}},"payoutWallet()":{"returns":{"wallet":"The payout wallet."}},"setPayoutWallet(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.","params":{"newPayoutWallet":"The payout wallet."}}},"title":"Payout wallet (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61061638819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161059490816100828239608051816103d10152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80636b8f9c431461022a5780638488bb4e146101b95763a556589a1461003d57600080fd5b346101b45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b45760043573ffffffffffffffffffffffffffffffffffffffff811681036101b4576100946103ba565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361018757507f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d54907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad600183101561015457610152925060017f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d5561031c565b005b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b457602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101b45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b45760043573ffffffffffffffffffffffffffffffffffffffff811681036101b4576102816103ba565b9073ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541692169182036102ee57610152907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad61031c565b507f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9073ffffffffffffffffffffffffffffffffffffffff169081156103905781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1565b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561054f573233148015610554575b61054f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610445575b5061044257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610543576000916104a0575b5038610438565b60203d60201161053c575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761050f5760209183916040528101031261050b5751908115158203610508575038610499565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d6104ab565b6040513d6000823e3d90fd5b503390565b506018361061040156fea2646970667358221220030b0989e78008a159711a04f1bbeca043f2d24adbe5ce020a92beaecdf0375264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x616 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x594 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x3D1 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x1B9 JUMPI PUSH4 0xA556589A EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B4 JUMPI PUSH2 0x94 PUSH2 0x3BA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x187 JUMPI POP PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SLOAD SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x154 JUMPI PUSH2 0x152 SWAP3 POP PUSH1 0x1 PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SSTORE PUSH2 0x31C JUMP JUMPDEST STOP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B4 JUMPI PUSH2 0x281 PUSH2 0x3BA JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP3 AND SWAP2 DUP3 SUB PUSH2 0x2EE JUMPI PUSH2 0x152 SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH2 0x31C JUMP JUMPDEST POP PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x390 JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 JUMP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x54F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x554 JUMPI JUMPDEST PUSH2 0x54F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x445 JUMPI JUMPDEST POP PUSH2 0x442 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4A0 JUMPI JUMPDEST POP CODESIZE PUSH2 0x438 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x53C JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x50F JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x50B JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x508 JUMPI POP CODESIZE PUSH2 0x499 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x4AB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x401 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SUB SIGNEXTEND MULMOD DUP10 SWAPN 0x80 ADDMOD LOG1 MSIZE PUSH18 0x1A04F1BBECA043F2D24ADBE5CE020A92BEAE 0xCD CREATE CALLDATACOPY MSTORE PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"786:1537:170:-:0;;;;;;;;;;;;;-1:-1:-1;;786:1537:170;;;;-1:-1:-1;;;;;786:1537:170;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;786:1537:170;;;;;;745:39:76;;786:1537:170;;;;;;;;745:39:76;786:1537:170;;;;;;;-1:-1:-1;786:1537:170;;;;;;-1:-1:-1;786:1537:170;;;;;-1:-1:-1;786:1537:170"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":954,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_setPayoutWallet":{"entryPoint":796,"id":19070,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":977}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80636b8f9c431461022a5780638488bb4e146101b95763a556589a1461003d57600080fd5b346101b45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b45760043573ffffffffffffffffffffffffffffffffffffffff811681036101b4576100946103ba565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361018757507f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d54907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad600183101561015457610152925060017f03497821c97e7d2bd8e34992e1a723a2edcf97a05eef937ff657491b38cca19d5561031c565b005b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101b45760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b457602073ffffffffffffffffffffffffffffffffffffffff7f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad5416604051908152f35b346101b45760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101b45760043573ffffffffffffffffffffffffffffffffffffffff811681036101b4576102816103ba565b9073ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541692169182036102ee57610152907f4fb5f8cdfbce77f22b0931a39e9f476a60a0f66524b2f379e96485471eb700ad61031c565b507f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9073ffffffffffffffffffffffffffffffffffffffff169081156103905781817fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855937fffffffffffffffffffffffff00000000000000000000000000000000000000006020945416179055604051908152a1565b7f40b539cf0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561054f573233148015610554575b61054f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610445575b5061044257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610543576000916104a0575b5038610438565b60203d60201161053c575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761050f5760209183916040528101031261050b5751908115158203610508575038610499565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d6104ab565b6040513d6000823e3d90fd5b503390565b506018361061040156fea2646970667358221220030b0989e78008a159711a04f1bbeca043f2d24adbe5ce020a92beaecdf0375264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6B8F9C43 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x8488BB4E EQ PUSH2 0x1B9 JUMPI PUSH4 0xA556589A EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B4 JUMPI PUSH2 0x94 PUSH2 0x3BA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x187 JUMPI POP PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SLOAD SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x154 JUMPI PUSH2 0x152 SWAP3 POP PUSH1 0x1 PUSH32 0x3497821C97E7D2BD8E34992E1A723A2EDCF97A05EEF937FF657491B38CCA19D SSTORE PUSH2 0x31C JUMP JUMPDEST STOP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1B4 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1B4 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1B4 JUMPI PUSH2 0x281 PUSH2 0x3BA JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP3 AND SWAP2 DUP3 SUB PUSH2 0x2EE JUMPI PUSH2 0x152 SWAP1 PUSH32 0x4FB5F8CDFBCE77F22B0931A39E9F476A60A0F66524B2F379E96485471EB700AD PUSH2 0x31C JUMP JUMPDEST POP PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x390 JUMPI DUP2 DUP2 PUSH32 0xDD880D24A789958A6398C99C2E54CE31BC10A638CBC42F7DD34285479AE0F855 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x20 SWAP5 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG1 JUMP JUMPDEST PUSH32 0x40B539CF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x54F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x554 JUMPI JUMPDEST PUSH2 0x54F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x445 JUMPI JUMPDEST POP PUSH2 0x442 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4A0 JUMPI JUMPDEST POP CODESIZE PUSH2 0x438 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x53C JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x50F JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x50B JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x508 JUMPI POP CODESIZE PUSH2 0x499 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x4AB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x401 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SUB SIGNEXTEND MULMOD DUP10 SWAPN 0x80 ADDMOD LOG1 MSIZE PUSH18 0x1A04F1BBECA043F2D24ADBE5CE020A92BEAE 0xCD CREATE CALLDATACOPY MSTORE PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"786:1537:170:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2040:41;;:::i;:::-;786:1537;;;;;;;3174:18:180;;;3170:53;;-1:-1:-1;786:1537:170;;;;636:1:180;900:21:181;;;896:88;;2015:19:172;786:1537:170;;636:1:180;786:1537:170;;2015:19:172;:::i;:::-;786:1537:170;896:88:181;930:54;;786:1537:170;930:54:181;786:1537:170;;636:1:180;786:1537:170;;;;930:54:181;3170:53:180;3201:22;786:1537:170;3201:22:180;786:1537:170;;;;3201:22:180;786:1537:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2040:41;;:::i;:::-;786:1537;;;;;;;;4503:26:42;;;4499:64;;1295:15:167;2824:19:172;786:1537:170;1295:15:167;:::i;4499:64:42:-;4538:25;;786:1537:170;4538:25:42;786:1537:170;;;;4538:25:42;2278:252:172;;786:1537:170;;2377:29:172;;;2373:67;;786:1537:170;;2491:32:172;786:1537:170;;;;;;;;;;;;;;2491:32:172;2278:252::o;2373:67::-;2415:25;2404:1;2415:25;;2404:1;2415:25;907:917:76;786:1537:170;1029:19:76;786:1537:170;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;786:1537:170;;;;;;1676:74:76;;;;786:1537:170;1676:74:76;;;;;;786:1537:170;1327:10:76;786:1537:170;;;;1744:4:76;786:1537:170;;;;1676:74:76;;;;;;;786:1537:170;1676:74:76;;;1630:120;;;;;1676:74;786:1537:170;1676:74:76;786:1537:170;1676:74:76;;;;786:1537:170;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;786:1537:170;;;;;;;;;;;;;1676:74:76;;;;786:1537:170;;;;;;;;;;;;;;1676:74:76;786:1537:170;;1676:74:76;;;;;;786:1537:170;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"285600","executionCost":"infinite","totalCost":"infinite"},"external":{"initPayoutWalletStorage(address)":"infinite","payoutWallet()":"2275","setPayoutWallet(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initPayoutWalletStorage(address)":"a556589a","payoutWallet()":"8488bb4e","setPayoutWallet(address)":"6b8f9c43"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressPayoutWallet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payoutWallet\",\"type\":\"address\"}],\"name\":\"PayoutWalletSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"initialPayoutWallet\",\"type\":\"address\"}],\"name\":\"initPayoutWalletStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"newPayoutWallet\",\"type\":\"address\"}],\"name\":\"setPayoutWallet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"PayoutWalletSet(address)\":{\"params\":{\"payoutWallet\":\"the new payout wallet address.\"}}},\"kind\":\"dev\",\"methods\":{\"initPayoutWalletStorage(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"initialPayoutWallet\":\"The initial payout wallet.\"}},\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}},\"setPayoutWallet(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.Emits a {PayoutWalletSet} event.\",\"params\":{\"newPayoutWallet\":\"The payout wallet.\"}}},\"title\":\"Payout wallet (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"ZeroAddressPayoutWallet()\":[{\"notice\":\"Thrown when setting the zero address as the payout wallet.\"}]},\"events\":{\"PayoutWalletSet(address)\":{\"notice\":\"Emitted when the payout wallet address changes.\"}},\"kind\":\"user\",\"methods\":{\"initPayoutWalletStorage(address)\":{\"notice\":\"Initializes the storage with an initial payout wallet.Sets the proxy initialization phase to `1`.\"},\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"},\"setPayoutWallet(address)\":{\"notice\":\"Sets the payout wallet.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/facets/PayoutWalletFacet.sol\":\"PayoutWalletFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/payment/base/PayoutWalletBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IPayoutWallet} from \\\"./../interfaces/IPayoutWallet.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Payout wallet (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract PayoutWalletBase is IPayoutWallet, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(address payable newPayoutWallet) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        PayoutWalletStorage.layout().setPayoutWallet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view virtual returns (address payable wallet) {\\n        return PayoutWalletStorage.layout().payoutWallet();\\n    }\\n}\\n\",\"keccak256\":\"0x90b83174d8575394a9f8036d43ab94db79d2b9f4f65d5178b6878b6104eb0714\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/facets/PayoutWalletFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {PayoutWalletStorage} from \\\"./../libraries/PayoutWalletStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {PayoutWalletBase} from \\\"./../base/PayoutWalletBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Payout wallet (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract PayoutWalletFacet is PayoutWalletBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial payout wallet.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function initPayoutWalletStorage(address payable initialPayoutWallet) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        PayoutWalletStorage.layout().proxyInit(initialPayoutWallet);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x58d31223888aedb675a9d588cef2f8ea71f24a225193529547af3a8cdac02d56\",\"license\":\"MIT\"},\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"ZeroAddressPayoutWallet()":[{"notice":"Thrown when setting the zero address as the payout wallet."}]},"events":{"PayoutWalletSet(address)":{"notice":"Emitted when the payout wallet address changes."}},"kind":"user","methods":{"initPayoutWalletStorage(address)":{"notice":"Initializes the storage with an initial payout wallet.Sets the proxy initialization phase to `1`."},"payoutWallet()":{"notice":"Gets the payout wallet."},"setPayoutWallet(address)":{"notice":"Sets the payout wallet."}},"version":1}}},"contracts/payment/interfaces/IPayoutWallet.sol":{"IPayoutWallet":{"abi":[{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"payoutWallet()":{"returns":{"wallet":"The payout wallet."}}},"title":"Payout wallet (functions)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"payoutWallet()":"8488bb4e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"payoutWallet\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"wallet\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"payoutWallet()\":{\"returns\":{\"wallet\":\"The payout wallet.\"}}},\"title\":\"Payout wallet (functions)\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"payoutWallet()\":{\"notice\":\"Gets the payout wallet.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/interfaces/IPayoutWallet.sol\":\"IPayoutWallet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/payment/interfaces/IPayoutWallet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Payout wallet (functions)\\ninterface IPayoutWallet {\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet() external view returns (address payable wallet);\\n}\\n\",\"keccak256\":\"0x2dfdbfde32775462e3fff5309ab93cb48b7f75dbae000b8ea1c8c976960a0125\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"payoutWallet()":{"notice":"Gets the payout wallet."}},"version":1}}},"contracts/payment/libraries/PayoutWalletStorage.sol":{"PayoutWalletStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220e095e5028ad7c627770c36fc7e04bfd7ee967b8efee9e898b86b7158de74cb8664736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RJUMP 0x95E5 MUL DUP11 0xD7 0xC6 0x27 PUSH24 0xC36FC7E04BFD7EE967B8EFEE9E898B86B7158DE74CB8664 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"288:2624:172:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220e095e5028ad7c627770c36fc7e04bfd7ee967b8efee9e898b86b7158de74cb8664736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RJUMP 0x95E5 MUL DUP11 0xD7 0xC6 0x27 PUSH24 0xC36FC7E04BFD7EE967B8EFEE9E898B86B7158DE74CB8664 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"288:2624:172:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"constructorInit(struct PayoutWalletStorage.Layout storage pointer,address payable)":"infinite","layout()":"infinite","payoutWallet(struct PayoutWalletStorage.Layout storage pointer)":"infinite","proxyInit(struct PayoutWalletStorage.Layout storage pointer,address payable)":"infinite","setPayoutWallet(struct PayoutWalletStorage.Layout storage pointer,address payable)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/payment/libraries/PayoutWalletStorage.sol\":\"PayoutWalletStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/payment/errors/PayoutWalletErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the zero address as the payout wallet.\\nerror ZeroAddressPayoutWallet();\\n\",\"keccak256\":\"0xab15b82b63d26a7c6da8f96bfee4bb5d148fb90746229deddd6964eb7ff7581e\",\"license\":\"MIT\"},\"contracts/payment/events/PayoutWalletEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the payout wallet address changes.\\n/// @param payoutWallet the new payout wallet address.\\nevent PayoutWalletSet(address payoutWallet);\\n\",\"keccak256\":\"0x9651117c83a04c15be4b57ff9ca3db8881bd3934de1381edbad5b23ad431c060\",\"license\":\"MIT\"},\"contracts/payment/libraries/PayoutWalletStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ZeroAddressPayoutWallet} from \\\"./../errors/PayoutWalletErrors.sol\\\";\\nimport {PayoutWalletSet} from \\\"./../events/PayoutWalletEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary PayoutWalletStorage {\\n    using PayoutWalletStorage for PayoutWalletStorage.Layout;\\n\\n    struct Layout {\\n        address payable wallet;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.payment.PayoutWallet.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial payout wallet (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function constructorInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Initializes the storage with an initial payout wallet (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `initialPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param initialPayoutWallet The initial payout wallet.\\n    function proxyInit(Layout storage s, address payable initialPayoutWallet) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.setPayoutWallet(initialPayoutWallet);\\n    }\\n\\n    /// @notice Sets the payout wallet.\\n    /// @dev Reverts with {ZeroAddressPayoutWallet} if `newPayoutWallet` is the zero address.\\n    /// @dev Emits a {PayoutWalletSet} event.\\n    /// @param newPayoutWallet The payout wallet.\\n    function setPayoutWallet(Layout storage s, address payable newPayoutWallet) internal {\\n        if (newPayoutWallet == address(0)) revert ZeroAddressPayoutWallet();\\n        s.wallet = newPayoutWallet;\\n        emit PayoutWalletSet(newPayoutWallet);\\n    }\\n\\n    /// @notice Gets the payout wallet.\\n    /// @return wallet The payout wallet.\\n    function payoutWallet(Layout storage s) internal view returns (address payable) {\\n        return s.wallet;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa64ab5f3456c4971fcc9894f3b0b8bf6ed30e927140296b48d8811ee2e268a34\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/proxy/ProxyAdmin.sol":{"ProxyAdmin":{"abi":[{"inputs":[],"name":"NoInitialProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"AdminChanged(address,address)":{"params":{"newAdmin":"the new admin.","previousAdmin":"the previous admin."}}},"kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"constructor":{"details":"Emits an {AdminChanged} event if `initialAdmin` is not the zero address.","params":{"initialAdmin":"The initial payout wallet."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin."}}},"title":"ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"changeProxyAdmin(address)":"9f712f2f","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"NoInitialProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"the new admin.\",\"previousAdmin\":\"the previous admin.\"}}},\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"constructor\":{\"details\":\"Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\",\"params\":{\"initialAdmin\":\"The initial payout wallet.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin.\"}}},\"title\":\"ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NoInitialProxyAdmin()\":[{\"notice\":\"Thrown when the initial admin is not set.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"Emitted when the proxy admin changes.\"}},\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"constructor\":{\"notice\":\"Initializes the storage with an initial admin.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/ProxyAdmin.sol\":\"ProxyAdmin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/ProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ProxyAdminStorage} from \\\"./libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdminBase} from \\\"./base/ProxyAdminBase.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ProxyAdmin is ProxyAdminBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial admin.\\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\\n    /// @param initialAdmin The initial payout wallet.\\n    constructor(address initialAdmin) {\\n        ProxyAdminStorage.layout().constructorInit(initialAdmin);\\n    }\\n}\\n\",\"keccak256\":\"0x3a11da964b8815c2961617c504293adfbc3a192eb109f9de8678579ba7d08d62\",\"license\":\"MIT\"},\"contracts/proxy/base/ProxyAdminBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IProxyAdmin} from \\\"./../interfaces/IProxyAdmin.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external virtual {\\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin.\\n    function proxyAdmin() external view virtual returns (address admin) {\\n        return ProxyAdminStorage.layout().proxyAdmin();\\n    }\\n}\\n\",\"keccak256\":\"0x7fb543bca8244cd09a8acb36242ed7e870512bfe36148071136515d3f7a831ac\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NoInitialProxyAdmin()":[{"notice":"Thrown when the initial admin is not set."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"AdminChanged(address,address)":{"notice":"Emitted when the proxy admin changes."}},"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"constructor":{"notice":"Initializes the storage with an initial admin."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/proxy/base/ProxyAdminBase.sol":{"ProxyAdminBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used via inheritance in a proxied implementation.","errors":{"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"AdminChanged(address,address)":{"params":{"newAdmin":"the new admin.","previousAdmin":"the previous admin."}}},"kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin."}}},"title":"ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"changeProxyAdmin(address)":"9f712f2f","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used via inheritance in a proxied implementation.\",\"errors\":{\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"the new admin.\",\"previousAdmin\":\"the previous admin.\"}}},\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin.\"}}},\"title\":\"ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"Emitted when the proxy admin changes.\"}},\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/base/ProxyAdminBase.sol\":\"ProxyAdminBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/base/ProxyAdminBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IProxyAdmin} from \\\"./../interfaces/IProxyAdmin.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external virtual {\\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin.\\n    function proxyAdmin() external view virtual returns (address admin) {\\n        return ProxyAdminStorage.layout().proxyAdmin();\\n    }\\n}\\n\",\"keccak256\":\"0x7fb543bca8244cd09a8acb36242ed7e870512bfe36148071136515d3f7a831ac\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"AdminChanged(address,address)":{"notice":"Emitted when the proxy admin changes."}},"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/proxy/facets/ProxyAdminFacet.sol":{"ProxyAdminFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[],"name":"NoInitialProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"name":"initProxyAdminStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"AdminChanged(address,address)":{"params":{"newAdmin":"the new admin.","previousAdmin":"the previous admin."}}},"kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"initProxyAdminStorage(address)":{"details":"Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {AdminChanged} event if `initialAdmin` is not the zero address.","params":{"initialAdmin":"The initial payout wallet."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin."}}},"title":"ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6105ba38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161053890816100828239608051816103750152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80633e47158c146102ed5780634d3506221461016e57639f712f2f1461003d57600080fd5b346101695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101695760043573ffffffffffffffffffffffffffffffffffffffff8116809103610169577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036100b661035e565b73ffffffffffffffffffffffffffffffffffffffff80835416911681810361013c57508281036100e257005b82827f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f947fffffffffffffffffffffffff0000000000000000000000000000000000000000604095541617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101695760043573ffffffffffffffffffffffffffffffffffffffff8116809103610169577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61037fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975460018110156102bb575060017fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975581156102915781817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f937fffffffffffffffffffffffff00000000000000000000000000000000000000006040945416179055815190600082526020820152a1005b7fbf9195600000000000000000000000000000000000000000000000000000000060005260046000fd5b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b346101695760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016957602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104f35732331480156104f8575b6104f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156103e9575b506103e657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156104e757600091610444575b50386103dc565b60203d6020116104e0575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176104b3576020918391604052810103126104af57519081151582036104ac57503861043d565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61044f565b6040513d6000823e3d90fd5b503390565b50601836106103a556fea264697066735822122041448c651c238e4a78c951b3e38f65f6e0c79e0812778ccb98e31dba28d1ccc664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x5BA CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x538 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x375 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3E47158C EQ PUSH2 0x2ED JUMPI DUP1 PUSH4 0x4D350622 EQ PUSH2 0x16E JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x169 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0xB6 PUSH2 0x35E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x13C JUMPI POP DUP3 DUP2 SUB PUSH2 0xE2 JUMPI STOP JUMPDEST DUP3 DUP3 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x169 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BB JUMPI POP PUSH1 0x1 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SSTORE DUP2 ISZERO PUSH2 0x291 JUMPI DUP2 DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP5 SLOAD AND OR SWAP1 SSTORE DUP2 MLOAD SWAP1 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0xBF91956000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4F3 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4F8 JUMPI JUMPDEST PUSH2 0x4F3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E9 JUMPI JUMPDEST POP PUSH2 0x3E6 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x444 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E0 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4B3 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x4AF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x4AC JUMPI POP CODESIZE PUSH2 0x43D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x44F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 COINBASE PREVRANDAO DUP13 PUSH6 0x1C238E4A78C9 MLOAD 0xB3 CALLF 0x8F65 0xF6 RJUMP 0xC79E ADDMOD SLT PUSH24 0x8CCB98E31DBA28D1CCC664736F6C634300081E0033000000 ","sourceMap":"703:1222:178:-:0;;;;;;;;;;;;;-1:-1:-1;;703:1222:178;;;;-1:-1:-1;;;;;703:1222:178;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;703:1222:178;;;;;;745:39:76;;703:1222:178;;;;;;;;745:39:76;703:1222:178;;;;;;;-1:-1:-1;703:1222:178;;;;;;-1:-1:-1;703:1222:178;;;;;-1:-1:-1;703:1222:178"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":862,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":885}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80633e47158c146102ed5780634d3506221461016e57639f712f2f1461003d57600080fd5b346101695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101695760043573ffffffffffffffffffffffffffffffffffffffff8116809103610169577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036100b661035e565b73ffffffffffffffffffffffffffffffffffffffff80835416911681810361013c57508281036100e257005b82827f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f947fffffffffffffffffffffffff0000000000000000000000000000000000000000604095541617905582519182526020820152a1005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101695760043573ffffffffffffffffffffffffffffffffffffffff8116809103610169577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61037fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975460018110156102bb575060017fc4214a2a0bb1b53325bec6bf1dc591abd32036bb3f39039f460ac4a3eb0f72975581156102915781817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f937fffffffffffffffffffffffff00000000000000000000000000000000000000006040945416179055815190600082526020820152a1005b7fbf9195600000000000000000000000000000000000000000000000000000000060005260046000fd5b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b346101695760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016957602073ffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416604051908152f35b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104f35732331480156104f8575b6104f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156103e9575b506103e657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156104e757600091610444575b50386103dc565b60203d6020116104e0575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176104b3576020918391604052810103126104af57519081151582036104ac57503861043d565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61044f565b6040513d6000823e3d90fd5b503390565b50601836106103a556fea264697066735822122041448c651c238e4a78c951b3e38f65f6e0c79e0812778ccb98e31dba28d1ccc664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3E47158C EQ PUSH2 0x2ED JUMPI DUP1 PUSH4 0x4D350622 EQ PUSH2 0x16E JUMPI PUSH4 0x9F712F2F EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x169 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0xB6 PUSH2 0x35E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 SLOAD AND SWAP2 AND DUP2 DUP2 SUB PUSH2 0x13C JUMPI POP DUP3 DUP2 SUB PUSH2 0xE2 JUMPI STOP JUMPDEST DUP3 DUP3 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP6 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x169 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2BB JUMPI POP PUSH1 0x1 PUSH32 0xC4214A2A0BB1B53325BEC6BF1DC591ABD32036BB3F39039F460AC4A3EB0F7297 SSTORE DUP2 ISZERO PUSH2 0x291 JUMPI DUP2 DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH1 0x40 SWAP5 SLOAD AND OR SWAP1 SSTORE DUP2 MLOAD SWAP1 PUSH1 0x0 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0xBF91956000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x169 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x169 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4F3 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4F8 JUMPI JUMPDEST PUSH2 0x4F3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E9 JUMPI JUMPDEST POP PUSH2 0x3E6 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x444 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DC JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E0 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4B3 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x4AF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x4AC JUMPI POP CODESIZE PUSH2 0x43D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x44F JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 COINBASE PREVRANDAO DUP13 PUSH6 0x1C238E4A78C9 MLOAD 0xB3 CALLF 0x8F65 0xF6 RJUMP 0xC79E ADDMOD SLT PUSH24 0x8CCB98E31DBA28D1CCC664736F6C634300081E0033000000 ","sourceMap":"703:1222:178:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1642:41;;:::i;:::-;703:1222;;;;;;;2513:23:180;;;2509:57;;2580:25;;;;2576:130;;703:1222:178;2576:130:180;703:1222:178;;2658:37:180;703:1222:178;;;;;;;;;;;2658:37:180;703:1222:178;;;;;;2658:37:180;703:1222:178;2509:57:180;2545:21;703:1222:178;2545:21:180;703:1222:178;;;;2545:21:180;703:1222:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;752:1:180;900:21:181;;;896:88;;703:1222:178;752:1:180;703:1222:178;;1227:26:180;;1223:60;;703:1222:178;;1330:38:180;703:1222:178;;;;;;;;;;;1330:38:180;703:1222:178;;;;;;;1330:38:180;703:1222:178;1223:60:180;1262:21;703:1222:178;1262:21:180;703:1222:178;;1262:21:180;896:88:181;930:54;703:1222:178;930:54:181;703:1222:178;;752:1:180;703:1222:178;;;;930:54:181;703:1222:178;;;;;;;;;;;;;;;;;;;;;;907:917:76;703:1222:178;1029:19:76;703:1222:178;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;703:1222:178;;;;;;1676:74:76;;;;703:1222:178;1676:74:76;;;;;;703:1222:178;1327:10:76;703:1222:178;;;;1744:4:76;703:1222:178;;;;1676:74:76;;;;;;;703:1222:178;1676:74:76;;;1630:120;;;;;1676:74;703:1222:178;1676:74:76;703:1222:178;1676:74:76;;;;703:1222:178;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;703:1222:178;;;;;;;;;;;;;1676:74:76;;;;703:1222:178;;;;;;;;;;;;;;1676:74:76;703:1222:178;;1676:74:76;;;;;;703:1222:178;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"267200","executionCost":"infinite","totalCost":"infinite"},"external":{"changeProxyAdmin(address)":"infinite","initProxyAdminStorage(address)":"49968","proxyAdmin()":"2253"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"changeProxyAdmin(address)":"9f712f2f","initProxyAdminStorage(address)":"4d350622","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoInitialProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialAdmin\",\"type\":\"address\"}],\"name\":\"initProxyAdminStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1967This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"the new admin.\",\"previousAdmin\":\"the previous admin.\"}}},\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"initProxyAdminStorage(address)\":{\"details\":\"Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\",\"params\":{\"initialAdmin\":\"The initial payout wallet.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin.\"}}},\"title\":\"ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NoInitialProxyAdmin()\":[{\"notice\":\"Thrown when the initial admin is not set.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"Emitted when the proxy admin changes.\"}},\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"initProxyAdminStorage(address)\":{\"notice\":\"Initializes the storage with an initial admin.Sets the proxy initialization phase to `1`.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/facets/ProxyAdminFacet.sol\":\"ProxyAdminFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/base/ProxyAdminBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IProxyAdmin} from \\\"./../interfaces/IProxyAdmin.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract ProxyAdminBase is IProxyAdmin, Context {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external virtual {\\n        ProxyAdminStorage.layout().changeProxyAdmin(_msgSender(), newAdmin);\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin.\\n    function proxyAdmin() external view virtual returns (address admin) {\\n        return ProxyAdminStorage.layout().proxyAdmin();\\n    }\\n}\\n\",\"keccak256\":\"0x7fb543bca8244cd09a8acb36242ed7e870512bfe36148071136515d3f7a831ac\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/facets/ProxyAdminFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../libraries/ProxyAdminStorage.sol\\\";\\nimport {ProxyAdminBase} from \\\"./../base/ProxyAdminBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (facet version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\ncontract ProxyAdminFacet is ProxyAdminBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with an initial admin.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {AdminChanged} event if `initialAdmin` is not the zero address.\\n    /// @param initialAdmin The initial payout wallet.\\n    function initProxyAdminStorage(address initialAdmin) external {\\n        ProxyAdminStorage.layout().proxyInit(initialAdmin);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x097e3b98e64f7395aa104b83f2dec21dd42a3bc6c30e18bdd7787496c121a9ab\",\"license\":\"MIT\"},\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NoInitialProxyAdmin()":[{"notice":"Thrown when the initial admin is not set."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"AdminChanged(address,address)":{"notice":"Emitted when the proxy admin changes."}},"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"initProxyAdminStorage(address)":{"notice":"Initializes the storage with an initial admin.Sets the proxy initialization phase to `1`."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/proxy/interfaces/IProxyAdmin.sol":{"IProxyAdmin":{"abi":[{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyAdmin","outputs":[{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1967","kind":"dev","methods":{"changeProxyAdmin(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.","params":{"newAdmin":"The new proxy admin."}},"proxyAdmin()":{"returns":{"admin":"The proxy admin"}}},"title":"ERC1967 Standard Proxy Storage Slots, Admin Address (functions).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"changeProxyAdmin(address)":"9f712f2f","proxyAdmin()":"3e47158c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1967\",\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\",\"params\":{\"newAdmin\":\"The new proxy admin.\"}},\"proxyAdmin()\":{\"returns\":{\"admin\":\"The proxy admin\"}}},\"title\":\"ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"changeProxyAdmin(address)\":{\"notice\":\"Sets a new proxy admin.\"},\"proxyAdmin()\":{\"notice\":\"Gets the proxy admin.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/interfaces/IProxyAdmin.sol\":\"IProxyAdmin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/proxy/interfaces/IProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1967 Standard Proxy Storage Slots, Admin Address (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1967\\ninterface IProxyAdmin {\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(address newAdmin) external;\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin() external view returns (address admin);\\n}\\n\",\"keccak256\":\"0xe92df3954566d05ec77fcd6745e4d199a24b794b2a2b1789df0ed62a650b6789\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"changeProxyAdmin(address)":{"notice":"Sets a new proxy admin."},"proxyAdmin()":{"notice":"Gets the proxy admin."}},"version":1}}},"contracts/proxy/libraries/ProxyAdminStorage.sol":{"ProxyAdminStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212208a5d222b2875c1aaf599bb2af1b4411b207919f13d88dd2aafc356a3fe6c126064736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 TSTORE 0x22 0x2B 0x28 PUSH22 0xC1AAF599BB2AF1B4411B207919F13D88DD2AAFC356A3 INVALID PUSH13 0x126064736F6C634300081E0033 ","sourceMap":"270:3142:180:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212208a5d222b2875c1aaf599bb2af1b4411b207919f13d88dd2aafc356a3fe6c126064736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 TSTORE 0x22 0x2B 0x28 PUSH22 0xC1AAF599BB2AF1B4411B207919F13D88DD2AAFC356A3 INVALID PUSH13 0x126064736F6C634300081E0033 ","sourceMap":"270:3142:180:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"changeProxyAdmin(struct ProxyAdminStorage.Layout storage pointer,address,address)":"infinite","constructorInit(struct ProxyAdminStorage.Layout storage pointer,address)":"infinite","enforceIsProxyAdmin(struct ProxyAdminStorage.Layout storage pointer,address)":"infinite","layout()":"infinite","proxyAdmin(struct ProxyAdminStorage.Layout storage pointer)":"infinite","proxyInit(struct ProxyAdminStorage.Layout storage pointer,address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/libraries/ProxyAdminStorage.sol\":\"ProxyAdminStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/proxy/libraries/ProxyInitialization.sol":{"ProxyInitialization":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220fcaba1eba2ee3f4f30248275c2309e540b96923e34dfc3b1bda24ef28a6b654b64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC 0xAB LOG1 0xEB LOG2 RETURNCONTRACT 0x3F 0x4F ADDRESS 0x24 DUP3 PUSH22 0xC2309E540B96923E34DFC3B1BDA24EF28A6B654B6473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"319:712:181:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220fcaba1eba2ee3f4f30248275c2309e540b96923e34dfc3b1bda24ef28a6b654b64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC 0xAB LOG1 0xEB LOG2 RETURNCONTRACT 0x3F 0x4F ADDRESS 0x24 DUP3 PUSH22 0xC2309E540B96923E34DFC3B1BDA24EF28A6B654B6473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"319:712:181:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"setPhase(bytes32,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Multiple calls protection for storage-modifying proxy initialization functions.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/proxy/libraries/ProxyInitialization.sol\":\"ProxyInitialization\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"notice":"Multiple calls protection for storage-modifying proxy initialization functions.","version":1}}},"contracts/security/SealedExecutor.sol":{"SealedExecutor":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"AlreadySealed","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sealId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sealer","type":"address"}],"name":"Sealed","type":"event"},{"inputs":[],"name":"SEALER_ROLE","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"wasSealed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"sealedCall","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AddressEmptyCode(address)":[{"details":"There's no code at `target` (it is not a contract)."}],"AlreadySealed(uint256)":[{"params":{"sealId":"The seal identifier."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Sealed(uint256,address)":{"params":{"sealId":"the seal identifier.","sealer":"the sealer address."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isSealed(uint256)":{"params":{"sealId":"the seal identifier."},"returns":{"wasSealed":"Whether a seal has been used already."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"sealedCall(address,bytes,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the sealer role.Reverts with {AlreadySealed} if the sealId has already been used.Emits a {Sealed} event.","params":{"callData":"The encoded function call.","returnData":"The data returned by the call.","sealId":"The seal identifier.","target":"The target contract."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"Sealead executions via calls on target contracts.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a03461012a57601f61106238819003918201601f19168301916001600160401b0383118484101761012f5780849260209460405283398101031261012a57516001600160a01b038116810361012a57336100cb575b6307f5828d60e41b6000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff19166001179055608052604051610f1c9081610146823960805181610d1d0152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610055565b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610af75780630b476f99146108035780632c1758c1146107955780632f2ff15d14610609578063526c9811146105b05780638bb9c5bf146104415780638da5cb5b146103d057806391d1485414610338578063d547741f146101af5763f2fde38b1461008a57600080fd5b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576100c1610b67565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100ea610d06565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361017d575073ffffffffffffffffffffffffffffffffffffffff169283830361013057005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576004356101e9610b8a565b6101f1610d06565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361017d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166102a357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5761036f610b8a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101aa5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561049c610d06565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156105685760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610333565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101aa5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760206040517f7365616c657200000000000000000000000000000000000000000000000000008152f35b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa57600435610643610b8a565b61064b610d06565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361017d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156106fe57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610333565b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b600435600052602052602060ff604060002054166040519015158152f35b346101aa5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5761083a610b67565b6024359067ffffffffffffffff82116101aa57366023830112156101aa5781600401359067ffffffffffffffff82116101aa5736602483850101116101aa5760443592610885610d06565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fd379d9a3cb0ce2c21ac2ac62c3e37fbdafed322705056ef335203f500fc21224602052604090205460ff1615610a8f577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b856000528060205260ff60406000205416610a61576109ee93927f4ede4a0b55ef0b366eeda846c0db70204e9f7205524b8c5f653085ca572b257760408873ffffffffffffffffffffffffffffffffffffffff8996602496836000526020528360002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790558351928352166020820152a161099483610c1d565b6109a16040519182610bad565b8381526020810191602060009889968796879401863783010152519082855af13d15610a59573d916109d283610c1d565b926109e06040519485610bad565b83523d85602085013e610e49565b604051809260208252825192836020840152815b848110610a41575050601f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092604080968601015201168101030190f35b60208282018101516040888401015286945001610a02565b606091610e49565b857f6e02cd6d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f7365616c657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101aa57610b5d602091610c57565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101aa57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101aa57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610bee57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610bee57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610d00577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610cfa576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e3a573233148015610e3f575b610e3a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d91575b50610d8e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610e2e57600091610dec575b5038610d84565b6020813d602011610e26575b81610e0560209383610bad565b81010312610e225751908115158203610e1f575038610de5565b80fd5b5080fd5b3d9150610df8565b6040513d6000823e3d90fd5b503390565b5060183610610d4d565b90610e885750805115610e5e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580610edd575b610e99575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15610e9156fea2646970667358221220a6f4f3111c0dd1ceba174b64cc1b7aa827c937663bc3ff2cb800315418c07d1164736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH2 0x12A JUMPI PUSH1 0x1F PUSH2 0x1062 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x12F JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x12A JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x12A JUMPI CALLER PUSH2 0xCB JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xF1C SWAP1 DUP2 PUSH2 0x146 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xD1D ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x55 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xAF7 JUMPI DUP1 PUSH4 0xB476F99 EQ PUSH2 0x803 JUMPI DUP1 PUSH4 0x2C1758C1 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x526C9811 EQ PUSH2 0x5B0 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1AF JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0xC1 PUSH2 0xB67 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xEA PUSH2 0xD06 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x130 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1E9 PUSH2 0xB8A JUMP JUMPDEST PUSH2 0x1F1 PUSH2 0xD06 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2A3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0x36F PUSH2 0xB8A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x49C PUSH2 0xD06 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x333 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x643 PUSH2 0xB8A JUMP JUMPDEST PUSH2 0x64B PUSH2 0xD06 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x6FE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x333 JUMP JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0x83A PUSH2 0xB67 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AA JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x1AA JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AA JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x1AA JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH2 0x885 PUSH2 0xD06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xD379D9A3CB0CE2C21AC2AC62C3E37FBDAFED322705056EF335203F500FC21224 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xA8F JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B DUP6 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xA61 JUMPI PUSH2 0x9EE SWAP4 SWAP3 PUSH32 0x4EDE4A0B55EF0B366EEDA846C0DB70204E9F7205524B8C5F653085CA572B2577 PUSH1 0x40 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 SWAP7 PUSH1 0x24 SWAP7 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP4 MLOAD SWAP3 DUP4 MSTORE AND PUSH1 0x20 DUP3 ADD MSTORE LOG1 PUSH2 0x994 DUP4 PUSH2 0xC1D JUMP JUMPDEST PUSH2 0x9A1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xBAD JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 PUSH1 0x20 PUSH1 0x0 SWAP9 DUP10 SWAP7 DUP8 SWAP7 DUP8 SWAP5 ADD DUP7 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP1 DUP3 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0xA59 JUMPI RETURNDATASIZE SWAP2 PUSH2 0x9D2 DUP4 PUSH2 0xC1D JUMP JUMPDEST SWAP3 PUSH2 0x9E0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xBAD JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE DUP6 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0xE49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP5 ADD MSTORE DUP2 JUMPDEST DUP5 DUP2 LT PUSH2 0xA41 JUMPI POP POP PUSH1 0x1F DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP9 DUP5 ADD ADD MSTORE DUP7 SWAP5 POP ADD PUSH2 0xA02 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0xE49 JUMP JUMPDEST DUP6 PUSH32 0x6E02CD6D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1AA JUMPI PUSH2 0xB5D PUSH1 0x20 SWAP2 PUSH2 0xC57 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AA JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBEE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xBEE JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD00 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xCFA JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE3A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE3F JUMPI JUMPDEST PUSH2 0xE3A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD91 JUMPI JUMPDEST POP PUSH2 0xD8E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE2E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDEC JUMPI JUMPDEST POP CODESIZE PUSH2 0xD84 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE26 JUMPI JUMPDEST DUP2 PUSH2 0xE05 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xBAD JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xE22 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xE1F JUMPI POP CODESIZE PUSH2 0xDE5 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xDF8 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD4D JUMP JUMPDEST SWAP1 PUSH2 0xE88 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0xE5E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0xEDD JUMPI JUMPDEST PUSH2 0xE99 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0xE91 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA6 DELEGATECALL RETURN GT SHR 0xD DATALOADN 0xCEBA OR 0x4B PUSH5 0xCC1B7AA827 0xC9 CALLDATACOPY PUSH7 0x3BC3FF2CB80031 SLOAD XOR 0xC0 PUSH30 0x1164736F6C634300081E0033000000000000000000000000000000000000 ","sourceMap":"1157:1702:182:-:0;;;;;;;;;;;;;-1:-1:-1;;1157:1702:182;;;;-1:-1:-1;;;;;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1157:1702:182;;;;;;1558:10;1645:152:42;;-1:-1:-1;;;;;500:10:59;1157:1702:182;;500:10:59;;;;-1:-1:-1;;500:10:59;990:1:42;500:10:59;;;745:39:76;;1157:1702:182;;;;;;;;745:39:76;1157:1702:182;;;;;;1645:152:42;1157:1702:182;;;-1:-1:-1;;;;;;1157:1702:182;1558:10;1157:1702;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1157:1702:182;-1:-1:-1;1157:1702:182;;;;;;-1:-1:-1;1157:1702:182;;;;;-1:-1:-1;1157:1702:182"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2954,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_t_address":{"entryPoint":2919,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":3101,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2989,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":3334,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":3159,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_verifyCallResultFromTarget":{"entryPoint":3657,"id":1133,"parameterSlots":3,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3357}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610af75780630b476f99146108035780632c1758c1146107955780632f2ff15d14610609578063526c9811146105b05780638bb9c5bf146104415780638da5cb5b146103d057806391d1485414610338578063d547741f146101af5763f2fde38b1461008a57600080fd5b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576100c1610b67565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6100ea610d06565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361017d575073ffffffffffffffffffffffffffffffffffffffff169283830361013057005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576004356101e9610b8a565b6101f1610d06565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361017d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166102a357005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5761036f610b8a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346101aa5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561049c610d06565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156105685760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610333565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346101aa5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5760206040517f7365616c657200000000000000000000000000000000000000000000000000008152f35b346101aa5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa57600435610643610b8a565b61064b610d06565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361017d57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156106fe57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610333565b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b600435600052602052602060ff604060002054166040519015158152f35b346101aa5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa5761083a610b67565b6024359067ffffffffffffffff82116101aa57366023830112156101aa5781600401359067ffffffffffffffff82116101aa5736602483850101116101aa5760443592610885610d06565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fd379d9a3cb0ce2c21ac2ac62c3e37fbdafed322705056ef335203f500fc21224602052604090205460ff1615610a8f577f2a97c6c62f2f8616c552895c02acda791e96a0e77ad57580c7b74a08b219567b856000528060205260ff60406000205416610a61576109ee93927f4ede4a0b55ef0b366eeda846c0db70204e9f7205524b8c5f653085ca572b257760408873ffffffffffffffffffffffffffffffffffffffff8996602496836000526020528360002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790558351928352166020820152a161099483610c1d565b6109a16040519182610bad565b8381526020810191602060009889968796879401863783010152519082855af13d15610a59573d916109d283610c1d565b926109e06040519485610bad565b83523d85602085013e610e49565b604051809260208252825192836020840152815b848110610a41575050601f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092604080968601015201168101030190f35b60208282018101516040888401015286945001610a02565b606091610e49565b857f6e02cd6d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f7365616c657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346101aa5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101aa576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101aa57610b5d602091610c57565b6040519015158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101aa57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101aa57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610bee57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610bee57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114610d00577f01ffc9a7000000000000000000000000000000000000000000000000000000008114610cfa576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610e3a573233148015610e3f575b610e3a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610d91575b50610d8e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610e2e57600091610dec575b5038610d84565b6020813d602011610e26575b81610e0560209383610bad565b81010312610e225751908115158203610e1f575038610de5565b80fd5b5080fd5b3d9150610df8565b6040513d6000823e3d90fd5b503390565b5060183610610d4d565b90610e885750805115610e5e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580610edd575b610e99575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15610e9156fea2646970667358221220a6f4f3111c0dd1ceba174b64cc1b7aa827c937663bc3ff2cb800315418c07d1164736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xAF7 JUMPI DUP1 PUSH4 0xB476F99 EQ PUSH2 0x803 JUMPI DUP1 PUSH4 0x2C1758C1 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x526C9811 EQ PUSH2 0x5B0 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1AF JUMPI PUSH4 0xF2FDE38B EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0xC1 PUSH2 0xB67 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0xEA PUSH2 0xD06 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x130 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1E9 PUSH2 0xB8A JUMP JUMPDEST PUSH2 0x1F1 PUSH2 0xD06 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2A3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0x36F PUSH2 0xB8A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x49C PUSH2 0xD06 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x333 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x643 PUSH2 0xB8A JUMP JUMPDEST PUSH2 0x64B PUSH2 0xD06 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x17D JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x6FE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x333 JUMP JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH2 0x83A PUSH2 0xB67 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AA JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x1AA JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AA JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x1AA JUMPI PUSH1 0x44 CALLDATALOAD SWAP3 PUSH2 0x885 PUSH2 0xD06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xD379D9A3CB0CE2C21AC2AC62C3E37FBDAFED322705056EF335203F500FC21224 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xA8F JUMPI PUSH32 0x2A97C6C62F2F8616C552895C02ACDA791E96A0E77AD57580C7B74A08B219567B DUP6 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xA61 JUMPI PUSH2 0x9EE SWAP4 SWAP3 PUSH32 0x4EDE4A0B55EF0B366EEDA846C0DB70204E9F7205524B8C5F653085CA572B2577 PUSH1 0x40 DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 SWAP7 PUSH1 0x24 SWAP7 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP4 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP4 MLOAD SWAP3 DUP4 MSTORE AND PUSH1 0x20 DUP3 ADD MSTORE LOG1 PUSH2 0x994 DUP4 PUSH2 0xC1D JUMP JUMPDEST PUSH2 0x9A1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH2 0xBAD JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 PUSH1 0x20 PUSH1 0x0 SWAP9 DUP10 SWAP7 DUP8 SWAP7 DUP8 SWAP5 ADD DUP7 CALLDATACOPY DUP4 ADD ADD MSTORE MLOAD SWAP1 DUP3 DUP6 GAS CALL RETURNDATASIZE ISZERO PUSH2 0xA59 JUMPI RETURNDATASIZE SWAP2 PUSH2 0x9D2 DUP4 PUSH2 0xC1D JUMP JUMPDEST SWAP3 PUSH2 0x9E0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0xBAD JUMP JUMPDEST DUP4 MSTORE RETURNDATASIZE DUP6 PUSH1 0x20 DUP6 ADD RETURNDATACOPY PUSH2 0xE49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP3 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP5 ADD MSTORE DUP2 JUMPDEST DUP5 DUP2 LT PUSH2 0xA41 JUMPI POP POP PUSH1 0x1F DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP9 DUP5 ADD ADD MSTORE DUP7 SWAP5 POP ADD PUSH2 0xA02 JUMP JUMPDEST PUSH1 0x60 SWAP2 PUSH2 0xE49 JUMP JUMPDEST DUP6 PUSH32 0x6E02CD6D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x7365616C65720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1AA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1AA JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x1AA JUMPI PUSH2 0xB5D PUSH1 0x20 SWAP2 PUSH2 0xC57 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AA JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1AA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBEE JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xBEE JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xD00 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0xCFA JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xE3A JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xE3F JUMPI JUMPDEST PUSH2 0xE3A JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xD91 JUMPI JUMPDEST POP PUSH2 0xD8E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE2E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xDEC JUMPI JUMPDEST POP CODESIZE PUSH2 0xD84 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE26 JUMPI JUMPDEST DUP2 PUSH2 0xE05 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xBAD JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xE22 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xE1F JUMPI POP CODESIZE PUSH2 0xDE5 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xDF8 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xD4D JUMP JUMPDEST SWAP1 PUSH2 0xE88 JUMPI POP DUP1 MLOAD ISZERO PUSH2 0xE5E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 MLOAD ISZERO DUP1 PUSH2 0xEDD JUMPI JUMPDEST PUSH2 0xE99 JUMPI POP SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9996B31500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO PUSH2 0xE91 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xA6 DELEGATECALL RETURN GT SHR 0xD DATALOADN 0xCEBA OR 0x4B PUSH5 0xCC1B7AA827 0xC9 CALLDATACOPY PUSH7 0x3BC3FF2CB80031 SLOAD XOR 0xC0 PUSH30 0x1164736F6C634300081E0033000000000000000000000000000000000000 ","sourceMap":"1157:1702:182:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2576:41;;:::i;:::-;1157:1702;;;;;;;;;;3205:23:42;;;3201:60;;1157:1702:182;;;3275:25:42;;;;3271:146;;1157:1702:182;3271:146:42;1157:1702:182;;;;;;3361:45:42;1157:1702:182;;3361:45:42;1157:1702:182;3201:60:42;3237:24;1157:1702:182;3237:24:42;1157:1702:182;;;;3237:24:42;1157:1702:182;;;;;;;;;;;;;;;;;;;:::i;:::-;2576:41;;:::i;:::-;5148:19:42;1157:1702:182;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1157:1702:182;;;;;;;;;;;;;-1:-1:-1;1157:1702:182;;;500:10:59;1157:1702:182;-1:-1:-1;1157:1702:182;500:10:59;;1880:140:41;;1157:1702:182;1880:140:41;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1157:1702:182;;;;1973:36:41;;;;1157:1702:182;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1157:1702:182;-1:-1:-1;1157:1702:182;;;;500:10:59;1157:1702:182;-1:-1:-1;1157:1702:182;500:10:59;;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:41;;:::i;:::-;1157:1702;;;;;;;;;;;;;-1:-1:-1;1157:1702:182;;;500:10:59;1157:1702:182;-1:-1:-1;1157:1702:182;500:10:59;;3741:25:41;3737:66;;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1157:1702:182;;;;2455:33:41;1157:1702:182;3737:66:41;1157:1702:182;3775:28:41;;;1157:1702:182;3775:28:41;1157:1702:182;;;;;;;3775:28:41;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2576:41;;:::i;:::-;5148:19:42;1157:1702:182;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1157:1702:182;;;;;;;;;;;;;-1:-1:-1;1157:1702:182;;;500:10:59;1157:1702:182;-1:-1:-1;1157:1702:182;500:10:59;;1254:25:41;1250:140;;1157:1702:182;1250:140:41;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1157:1702:182;;;;1343:36:41;1157:1702:182;;;;;;;;;;;;;;;;;;;;500:10:59;1157:1702:182;;;500:10:59;;1157:1702:182;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:41;;;:::i;:::-;1157:1702;;;;;;;;;;;;;500:10:59;;;3741:25:41;3737:66;;1157:1702:182;;;;;;;500:10:59;1157:1702:182;;;500:10:59;;773:49:191;;3320:55:9;1157:1702:182;;869:22:191;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;869:22:191;1157:1702:182;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3272:31:9;;;;;;1157:1702:182;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;3320:55:9;:::i;:::-;1157:1702:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1157:1702:182;;;;;;3320:55:9;:::i;773:49:191:-;801:21;;1157:1702:182;801:21:191;1157:1702:182;;;;801:21:191;3737:66:41;1157:1702:182;3775:28:41;;1157:1702:182;3775:28:41;1157:1702:182;;;;;;;;3775:28:41;1157:1702:182;;;;;;;;;;;;;;;;;;;;635:65:55;1157:1702:182;635:65:55;;:::i;:::-;1157:1702:182;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1157:1702:182;;;;;-1:-1:-1;1157:1702:182;;;;;;;;;;;;;;:::o;1359:340:59:-;1157:1702:182;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1157:1702:182;500:10:59;1157:1702:182;500:10:59;;;;1157:1702:182;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1157:1702:182;1528:12:59;:::o;907:917:76:-;1157:1702:182;1029:19:76;1157:1702:182;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1157:1702:182;;;;;;1676:74:76;;;;1157:1702:182;1676:74:76;;;;;;1157:1702:182;1327:10:76;1157:1702:182;;;;1744:4:76;1157:1702:182;;;;1676:74:76;;;;;;;1157:1702:182;1676:74:76;;;1630:120;;;;;1676:74;1157:1702:182;1676:74:76;;1157:1702:182;1676:74:76;;;;;;1157:1702:182;1676:74:76;;;:::i;:::-;;;1157:1702:182;;;;;;;;;;;;;1676:74:76;;;;1157:1702:182;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;1157:1702:182;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;4437:582:9;;4609:8;;-1:-1:-1;1157:1702:182;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;1157:1702:182;;4857:22:9;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;1157:1702:182;4933:24:9;;4878:1;4933:24;1157:1702:182;4933:24:9;1157:1702:182;;4878:1:9;4933:24;4857:49;4883:18;;;:23;4857:49;"},"gasEstimates":{"creation":{"codeDepositCost":"773600","executionCost":"infinite","totalCost":"infinite"},"external":{"SEALER_ROLE()":"232","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2609","isSealed(uint256)":"2369","owner()":"2385","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","sealedCall(address,bytes,uint256)":"infinite","supportsInterface(bytes4)":"2433","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"SEALER_ROLE()":"526c9811","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isSealed(uint256)":"2c1758c1","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","sealedCall(address,bytes,uint256)":"0b476f99","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"AlreadySealed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sealer\",\"type\":\"address\"}],\"name\":\"Sealed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SEALER_ROLE\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"isSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"wasSealed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"sealedCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AlreadySealed(uint256)\":[{\"params\":{\"sealId\":\"The seal identifier.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Sealed(uint256,address)\":{\"params\":{\"sealId\":\"the seal identifier.\",\"sealer\":\"the sealer address.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isSealed(uint256)\":{\"params\":{\"sealId\":\"the seal identifier.\"},\"returns\":{\"wasSealed\":\"Whether a seal has been used already.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"sealedCall(address,bytes,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the sealer role.Reverts with {AlreadySealed} if the sealId has already been used.Emits a {Sealed} event.\",\"params\":{\"callData\":\"The encoded function call.\",\"returnData\":\"The data returned by the call.\",\"sealId\":\"The seal identifier.\",\"target\":\"The target contract.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"Sealead executions via calls on target contracts.\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadySealed(uint256)\":[{\"notice\":\"Thrown when trying to seal a sealId which has already been used.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Sealed(uint256,address)\":{\"notice\":\"Emitted when a seal is used.\"}},\"kind\":\"user\",\"methods\":{\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isSealed(uint256)\":{\"notice\":\"Retrieves whether a seal has been used already.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"sealedCall(address,bytes,uint256)\":{\"notice\":\"Calls a contract function uniquely for a given seal identifier.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"notice\":\"Enables contract calls to be performed uniquely thanks to a seal identifier.Multiple executions can happen for example due to automation bugs in a backend or in a script.Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,such as a constant defined in a script or in a unique database field.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/SealedExecutor.sol\":\"SealedExecutor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/SealedExecutor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {AccessControlStorage} from \\\"./../access/libraries/AccessControlStorage.sol\\\";\\nimport {SealsStorage} from \\\"./libraries/SealsStorage.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {SealsBase} from \\\"./base/SealsBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../access/AccessControl.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Sealead executions via calls on target contracts.\\n/// @notice Enables contract calls to be performed uniquely thanks to a seal identifier.\\n/// @notice Multiple executions can happen for example due to automation bugs in a backend or in a script.\\n/// @notice Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,\\n/// @notice such as a constant defined in a script or in a unique database field.\\ncontract SealedExecutor is SealsBase, AccessControl, ForwarderRegistryContextBase {\\n    using SealsStorage for SealsStorage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using Address for address;\\n\\n    bytes32 public constant SEALER_ROLE = \\\"sealer\\\";\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) ContractOwnership(msg.sender) {}\\n\\n    /// @notice Calls a contract function uniquely for a given seal identifier.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the sealer role.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param target The target contract.\\n    /// @param callData The encoded function call.\\n    /// @param sealId The seal identifier.\\n    /// @param returnData The data returned by the call.\\n    function sealedCall(address target, bytes calldata callData, uint256 sealId) external returns (bytes memory returnData) {\\n        address sealer = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(SEALER_ROLE, sealer);\\n        SealsStorage.layout().seal(sealer, sealId);\\n        return target.functionCall(callData);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x7376887c1e0fd516673158b90106584cc6417559e3886d94050ef9366d12a97a\",\"license\":\"MIT\"},\"contracts/security/base/SealsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ISeals} from \\\"./../interfaces/ISeals.sol\\\";\\nimport {SealsStorage} from \\\"./../libraries/SealsStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Uniquely identified seals management (proxiable version).\\nabstract contract SealsBase is ISeals, Context {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view virtual returns (bool wasSealed) {\\n        return SealsStorage.layout().isSealed(sealId);\\n    }\\n}\\n\",\"keccak256\":\"0xc008172eeec7a415ac9b31401f3b215f94d5dd0d3dbc715cd0413713e5474f45\",\"license\":\"MIT\"},\"contracts/security/errors/SealsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to seal a sealId which has already been used.\\n/// @param sealId The seal identifier.\\nerror AlreadySealed(uint256 sealId);\\n\",\"keccak256\":\"0xe1ada78adc1270e60bc0d6e5decddde05e89194f91aa4828b89abeec8114fed1\",\"license\":\"MIT\"},\"contracts/security/events/SealsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a seal is used.\\n/// @param sealId the seal identifier.\\n/// @param sealer the sealer address.\\nevent Sealed(uint256 sealId, address sealer);\\n\",\"keccak256\":\"0x718ef405558601bf99cd720a64f0c3a9c75b254862013a4aa0b7232c007841ae\",\"license\":\"MIT\"},\"contracts/security/interfaces/ISeals.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Uniquely identified seals management.\\ninterface ISeals {\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view returns (bool wasSealed);\\n}\\n\",\"keccak256\":\"0x763b8ef3f27c078900e4591a5891d4da36b44b29b6f902cc3782ccb30a20c9b6\",\"license\":\"MIT\"},\"contracts/security/libraries/SealsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AlreadySealed} from \\\"./../errors/SealsErrors.sol\\\";\\nimport {Sealed} from \\\"./../events/SealsEvents.sol\\\";\\n\\nlibrary SealsStorage {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => bool) seals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.security.Seals.storage\\\")) - 1);\\n\\n    /// @notice Registers a unique seal identifier.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param sealer The sealer address\\n    /// @param sealId The seal identifier.\\n    function seal(Layout storage s, address sealer, uint256 sealId) internal {\\n        if (s.seals[sealId]) revert AlreadySealed(sealId);\\n        s.seals[sealId] = true;\\n        emit Sealed(sealId, sealer);\\n    }\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(Layout storage s, uint256 sealId) internal view returns (bool) {\\n        return s.seals[sealId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf14843021b6f94e638381210dce97979c8ea8d4788d968906ed089eb92ec3eb2\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"AlreadySealed(uint256)":[{"notice":"Thrown when trying to seal a sealId which has already been used."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Sealed(uint256,address)":{"notice":"Emitted when a seal is used."}},"kind":"user","methods":{"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isSealed(uint256)":{"notice":"Retrieves whether a seal has been used already."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"sealedCall(address,bytes,uint256)":{"notice":"Calls a contract function uniquely for a given seal identifier."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"notice":"Enables contract calls to be performed uniquely thanks to a seal identifier.Multiple executions can happen for example due to automation bugs in a backend or in a script.Typically, it can be a good practice to protect the minting of fungible tokens with an immutable seal identifier,such as a constant defined in a script or in a unique database field.","version":1}}},"contracts/security/TokenRecovery.sol":{"TokenRecovery":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"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\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/TokenRecovery.sol\":\"TokenRecovery\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/security/base/SealsBase.sol":{"SealsBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"wasSealed","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"isSealed(uint256)":{"params":{"sealId":"the seal identifier."},"returns":{"wasSealed":"Whether a seal has been used already."}}},"title":"Uniquely identified seals management (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isSealed(uint256)":"2c1758c1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"isSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"wasSealed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isSealed(uint256)\":{\"params\":{\"sealId\":\"the seal identifier.\"},\"returns\":{\"wasSealed\":\"Whether a seal has been used already.\"}}},\"title\":\"Uniquely identified seals management (proxiable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isSealed(uint256)\":{\"notice\":\"Retrieves whether a seal has been used already.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/base/SealsBase.sol\":\"SealsBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/security/base/SealsBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ISeals} from \\\"./../interfaces/ISeals.sol\\\";\\nimport {SealsStorage} from \\\"./../libraries/SealsStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Uniquely identified seals management (proxiable version).\\nabstract contract SealsBase is ISeals, Context {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view virtual returns (bool wasSealed) {\\n        return SealsStorage.layout().isSealed(sealId);\\n    }\\n}\\n\",\"keccak256\":\"0xc008172eeec7a415ac9b31401f3b215f94d5dd0d3dbc715cd0413713e5474f45\",\"license\":\"MIT\"},\"contracts/security/errors/SealsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to seal a sealId which has already been used.\\n/// @param sealId The seal identifier.\\nerror AlreadySealed(uint256 sealId);\\n\",\"keccak256\":\"0xe1ada78adc1270e60bc0d6e5decddde05e89194f91aa4828b89abeec8114fed1\",\"license\":\"MIT\"},\"contracts/security/events/SealsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a seal is used.\\n/// @param sealId the seal identifier.\\n/// @param sealer the sealer address.\\nevent Sealed(uint256 sealId, address sealer);\\n\",\"keccak256\":\"0x718ef405558601bf99cd720a64f0c3a9c75b254862013a4aa0b7232c007841ae\",\"license\":\"MIT\"},\"contracts/security/interfaces/ISeals.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Uniquely identified seals management.\\ninterface ISeals {\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view returns (bool wasSealed);\\n}\\n\",\"keccak256\":\"0x763b8ef3f27c078900e4591a5891d4da36b44b29b6f902cc3782ccb30a20c9b6\",\"license\":\"MIT\"},\"contracts/security/libraries/SealsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AlreadySealed} from \\\"./../errors/SealsErrors.sol\\\";\\nimport {Sealed} from \\\"./../events/SealsEvents.sol\\\";\\n\\nlibrary SealsStorage {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => bool) seals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.security.Seals.storage\\\")) - 1);\\n\\n    /// @notice Registers a unique seal identifier.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param sealer The sealer address\\n    /// @param sealId The seal identifier.\\n    function seal(Layout storage s, address sealer, uint256 sealId) internal {\\n        if (s.seals[sealId]) revert AlreadySealed(sealId);\\n        s.seals[sealId] = true;\\n        emit Sealed(sealId, sealer);\\n    }\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(Layout storage s, uint256 sealId) internal view returns (bool) {\\n        return s.seals[sealId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf14843021b6f94e638381210dce97979c8ea8d4788d968906ed089eb92ec3eb2\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isSealed(uint256)":{"notice":"Retrieves whether a seal has been used already."}},"version":1}}},"contracts/security/base/TokenRecoveryBase.sol":{"TokenRecoveryBase":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}}},"title":"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}}},\"title\":\"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/base/TokenRecoveryBase.sol\":\"TokenRecoveryBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."}},"version":1}}},"contracts/security/facets/TokenRecoveryFacet.sol":{"TokenRecoveryFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ContractOwnershipFacet}.","errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}}},"title":"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6109cd38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161094b90816100828239608051816108180152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806373c8a95814610501578063c3666c36146102b85763f7ba94bd1461003d57600080fd5b3461025c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025c5760043567ffffffffffffffff811161025c5761008c903690600401610684565b60243567ffffffffffffffff811161025c576100ac903690600401610684565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100ed610801565b925416911690810361028b57508181036102615760005b81811061010d57005b610118818387610748565b3573ffffffffffffffffffffffffffffffffffffffff811680910361025c57610142828587610748565b359081471061022a57600080809381935af13d15610222573d9067ffffffffffffffff82116101f357604051916101a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846107a8565b82523d6000602084013e5b156101ba5750600101610104565b8051156101c957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101ac565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461025c576102c6366106b5565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061030b610801565b925416911690810361028b57508082148015906104f7575b6102615760005b82811061033357005b73ffffffffffffffffffffffffffffffffffffffff61035b61035683858a610748565b610787565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610490576000916104c9575b501561049c575073ffffffffffffffffffffffffffffffffffffffff6103ea61035683858a610748565b16906103fa610356828689610748565b9161040682878b610748565b3592813b1561025c57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156104905760019261047f575b500161032a565b600061048a916107a8565b88610478565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6104ea915060203d81116104f0575b6104e281836107a8565b8101906107e9565b896103c0565b503d6104d8565b5082821415610323565b3461025c5761050f366106b5565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610552610801565b925416911690810361028b575080831480159061067a575b6102615760005b83811061057a57005b610585818388610748565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361025c5760006020918a826105c6876105bf610356828f8f90610748565b938b610748565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526106216064826107a8565b51925af115610490576000513d6106715750803b155b6106445750600101610571565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415610637565b508583141561056a565b9181601f8401121561025c5782359167ffffffffffffffff831161025c576020808501948460051b01011161025c57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261025c5760043567ffffffffffffffff811161025c57816106fe91600401610684565b9290929160243567ffffffffffffffff811161025c578161072191600401610684565b929092916044359067ffffffffffffffff821161025c5761074491600401610684565b9091565b91908110156107585760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361025c5790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176101f357604052565b9081602091031261025c5751801515810361025c5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561090657323314801561090b575b610906577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561088c575b5061088957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610490576000916108e7575b503861087f565b610900915060203d6020116104f0576104e281836107a8565b386108e0565b503390565b506018361061084856fea26469706673582212205d09c578a4e8eb7fcb73a4cbe438c52f14c41cbf5740340c595ad0c3cd19af4064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x9CD CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x94B SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x818 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x2B8 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x25C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI PUSH2 0x8C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI PUSH2 0xAC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xED PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP2 DUP2 SUB PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x10D JUMPI STOP JUMPDEST PUSH2 0x118 DUP2 DUP4 DUP8 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x25C JUMPI PUSH2 0x142 DUP3 DUP6 DUP8 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x222 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1F3 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x7A8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x1BA JUMPI POP PUSH1 0x1 ADD PUSH2 0x104 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x1C9 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1AC JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH2 0x2C6 CALLDATASIZE PUSH2 0x6B5 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x30B PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x4F7 JUMPI JUMPDEST PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x333 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x35B PUSH2 0x356 DUP4 DUP6 DUP11 PUSH2 0x748 JUMP JUMPDEST PUSH2 0x787 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4C9 JUMPI JUMPDEST POP ISZERO PUSH2 0x49C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3EA PUSH2 0x356 DUP4 DUP6 DUP11 PUSH2 0x748 JUMP JUMPDEST AND SWAP1 PUSH2 0x3FA PUSH2 0x356 DUP3 DUP7 DUP10 PUSH2 0x748 JUMP JUMPDEST SWAP2 PUSH2 0x406 DUP3 DUP8 DUP12 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x25C JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x490 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x47F JUMPI JUMPDEST POP ADD PUSH2 0x32A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48A SWAP2 PUSH2 0x7A8 JUMP JUMPDEST DUP9 PUSH2 0x478 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4EA SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x4F0 JUMPI JUMPDEST PUSH2 0x4E2 DUP2 DUP4 PUSH2 0x7A8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x7E9 JUMP JUMPDEST DUP10 PUSH2 0x3C0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4D8 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x323 JUMP JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH2 0x50F CALLDATASIZE PUSH2 0x6B5 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x552 PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x67A JUMPI JUMPDEST PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x57A JUMPI STOP JUMPDEST PUSH2 0x585 DUP2 DUP4 DUP9 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x25C JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x5C6 DUP8 PUSH2 0x5BF PUSH2 0x356 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x748 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x621 PUSH1 0x64 DUP3 PUSH2 0x7A8 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x671 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x644 JUMPI POP PUSH1 0x1 ADD PUSH2 0x571 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x637 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x56A JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x25C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x25C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x25C JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x25C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI DUP2 PUSH2 0x6FE SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI DUP2 PUSH2 0x721 SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25C JUMPI PUSH2 0x744 SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x25C JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1F3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x25C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x25C JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x906 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x90B JUMPI JUMPDEST PUSH2 0x906 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x88C JUMPI JUMPDEST POP PUSH2 0x889 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x87F JUMP JUMPDEST PUSH2 0x900 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4F0 JUMPI PUSH2 0x4E2 DUP2 DUP4 PUSH2 0x7A8 JUMP JUMPDEST CODESIZE PUSH2 0x8E0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x848 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TSTORE MULMOD 0xC5 PUSH25 0xA4E8EB7FCB73A4CBE438C52F14C41CBF5740340C595AD0C3CD NOT 0xAF BLOCKHASH PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"677:650:188:-:0;;;;;;;;;;;;;-1:-1:-1;;677:650:188;;;;-1:-1:-1;;;;;677:650:188;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;677:650:188;;;;;;745:39:76;;677:650:188;;;;;;;;745:39:76;677:650:188;;;;;;;-1:-1:-1;677:650:188;;;;;;-1:-1:-1;677:650:188;;;;;-1:-1:-1;677:650:188"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1668,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":1717,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_bool_fromMemory":{"entryPoint":2025,"id":null,"parameterSlots":2,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":1864,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":1960,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2049,"id":13231,"parameterSlots":0,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":1927,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2072}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806373c8a95814610501578063c3666c36146102b85763f7ba94bd1461003d57600080fd5b3461025c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025c5760043567ffffffffffffffff811161025c5761008c903690600401610684565b60243567ffffffffffffffff811161025c576100ac903690600401610684565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806100ed610801565b925416911690810361028b57508181036102615760005b81811061010d57005b610118818387610748565b3573ffffffffffffffffffffffffffffffffffffffff811680910361025c57610142828587610748565b359081471061022a57600080809381935af13d15610222573d9067ffffffffffffffff82116101f357604051916101a160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846107a8565b82523d6000602084013e5b156101ba5750600101610104565b8051156101c957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060906101ac565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461025c576102c6366106b5565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061030b610801565b925416911690810361028b57508082148015906104f7575b6102615760005b82811061033357005b73ffffffffffffffffffffffffffffffffffffffff61035b61035683858a610748565b610787565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610490576000916104c9575b501561049c575073ffffffffffffffffffffffffffffffffffffffff6103ea61035683858a610748565b16906103fa610356828689610748565b9161040682878b610748565b3592813b1561025c57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156104905760019261047f575b500161032a565b600061048a916107a8565b88610478565b6040513d6000823e3d90fd5b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6104ea915060203d81116104f0575b6104e281836107a8565b8101906107e9565b896103c0565b503d6104d8565b5082821415610323565b3461025c5761050f366106b5565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610552610801565b925416911690810361028b575080831480159061067a575b6102615760005b83811061057a57005b610585818388610748565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361025c5760006020918a826105c6876105bf610356828f8f90610748565b938b610748565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248301526044820152604481526106216064826107a8565b51925af115610490576000513d6106715750803b155b6106445750600101610571565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415610637565b508583141561056a565b9181601f8401121561025c5782359167ffffffffffffffff831161025c576020808501948460051b01011161025c57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261025c5760043567ffffffffffffffff811161025c57816106fe91600401610684565b9290929160243567ffffffffffffffff811161025c578161072191600401610684565b929092916044359067ffffffffffffffff821161025c5761074491600401610684565b9091565b91908110156107585760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361025c5790565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176101f357604052565b9081602091031261025c5751801515810361025c5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561090657323314801561090b575b610906577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561088c575b5061088957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610490576000916108e7575b503861087f565b610900915060203d6020116104f0576104e281836107a8565b386108e0565b503390565b506018361061084856fea26469706673582212205d09c578a4e8eb7fcb73a4cbe438c52f14c41cbf5740340c595ad0c3cd19af4064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x2B8 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x25C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI PUSH2 0x8C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI PUSH2 0xAC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xED PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP2 DUP2 SUB PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x10D JUMPI STOP JUMPDEST PUSH2 0x118 DUP2 DUP4 DUP8 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x25C JUMPI PUSH2 0x142 DUP3 DUP6 DUP8 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x222 JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1F3 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1A1 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x7A8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x1BA JUMPI POP PUSH1 0x1 ADD PUSH2 0x104 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x1C9 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x1AC JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH2 0x2C6 CALLDATASIZE PUSH2 0x6B5 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x30B PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x4F7 JUMPI JUMPDEST PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x333 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x35B PUSH2 0x356 DUP4 DUP6 DUP11 PUSH2 0x748 JUMP JUMPDEST PUSH2 0x787 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4C9 JUMPI JUMPDEST POP ISZERO PUSH2 0x49C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3EA PUSH2 0x356 DUP4 DUP6 DUP11 PUSH2 0x748 JUMP JUMPDEST AND SWAP1 PUSH2 0x3FA PUSH2 0x356 DUP3 DUP7 DUP10 PUSH2 0x748 JUMP JUMPDEST SWAP2 PUSH2 0x406 DUP3 DUP8 DUP12 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x25C JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x490 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x47F JUMPI JUMPDEST POP ADD PUSH2 0x32A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48A SWAP2 PUSH2 0x7A8 JUMP JUMPDEST DUP9 PUSH2 0x478 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4EA SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x4F0 JUMPI JUMPDEST PUSH2 0x4E2 DUP2 DUP4 PUSH2 0x7A8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x7E9 JUMP JUMPDEST DUP10 PUSH2 0x3C0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x4D8 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x323 JUMP JUMPDEST CALLVALUE PUSH2 0x25C JUMPI PUSH2 0x50F CALLDATASIZE PUSH2 0x6B5 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x552 PUSH2 0x801 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x28B JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x67A JUMPI JUMPDEST PUSH2 0x261 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x57A JUMPI STOP JUMPDEST PUSH2 0x585 DUP2 DUP4 DUP9 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x25C JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x5C6 DUP8 PUSH2 0x5BF PUSH2 0x356 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x748 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x748 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x621 PUSH1 0x64 DUP3 PUSH2 0x7A8 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x671 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x644 JUMPI POP PUSH1 0x1 ADD PUSH2 0x571 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x637 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x56A JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x25C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x25C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x25C JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x25C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI DUP2 PUSH2 0x6FE SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x25C JUMPI DUP2 PUSH2 0x721 SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x25C JUMPI PUSH2 0x744 SWAP2 PUSH1 0x4 ADD PUSH2 0x684 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x25C JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x1F3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x25C JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x25C JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x906 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x90B JUMPI JUMPDEST PUSH2 0x906 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x88C JUMPI JUMPDEST POP PUSH2 0x889 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x87F JUMP JUMPDEST PUSH2 0x900 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4F0 JUMPI PUSH2 0x4E2 DUP2 DUP4 PUSH2 0x7A8 JUMP JUMPDEST CODESIZE PUSH2 0x8E0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x848 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TSTORE MULMOD 0xC5 PUSH25 0xA4E8EB7FCB73A4CBE438C52F14C41CBF5740340C595AD0C3CD NOT 0xAF BLOCKHASH PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"677:650:188:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;677:650:188;;1044:41;;;:::i;:::-;677:650;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;677:650:188;1845:10:192;;;;;;677:650:188;1857:3:192;1876:11;;;;;:::i;:::-;677:650:188;;;;;;;;;1898:10:192;;;;;:::i;:::-;677:650:188;1375:21:9;;;:30;1371:125;;677:650:188;1548:33:9;;;;;;;677:650:188;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;677:650:188;;1834:9:192;;1591:58:9;677:650:188;;5690:21:9;:17;;677:650:188;5815:105:9;;;;;5686:301;5957:19;677:650:188;5957:19:9;677:650:188;;5957:19:9;677:650:188;;;;;;;;;;;;;;;1371:125:9;1455:21;;1428:57;677:650:188;1428:57:9;677:650:188;;;;;;1428:57:9;677:650:188;;;;1756:63:192;1793:26;677:650:188;1793:26:192;677:650:188;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;677:650:188;;-1:-1:-1;4538:25:42;677:650:188;;;;;;;:::i;:::-;5148:19:42;;;;;;677:650:188;;;1044:41;;:::i;:::-;677:650;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;677:650:188;3852:94:192;;677:650:188;3972:10:192;;;;;;677:650:188;3984:3:192;677:650:188;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;677:650:188;;;;4058:76:192;;4108:25;677:650:188;4058:76:192;;677:650:188;4058:76:192;;;;;;;;;;;;677:650:188;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;677:650:188;4239:12:192;;;;;;:::i;:::-;677:650:188;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;677:650:188;4239:70:192;;;;;;;677:650:188;;;;;;;4239:70:192;;;;;677:650:188;4239:70:192;;4277:4;677:650:188;4239:70:192;;677:650:188;;4058:76:192;677:650:188;;;;;;;4239:70:192;;;;;;;677:650:188;4239:70:192;;;3984:3;;677:650:188;3961:9:192;;4239:70;677:650:188;4239:70:192;;;:::i;:::-;;;;;677:650:188;;;;;;;;;4053:173:192;4161:50;677:650:188;4161:50:192;677:650:188;;4058:76:192;677:650:188;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;677:650:188;;;;;;;:::i;:::-;5148:19:42;;;;677:650:188;;1044:41;;;:::i;:::-;677:650;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;677:650:188;2776:90:192;;677:650:188;2892:10:192;;;;;;677:650:188;2904:3:192;2923:9;;;;;:::i;:::-;677:650:188;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;677:650:188;;;1328:43:8;677:650:188;1328:43:8;;;;677:650:188;1328:43:8;;677:650:188;1328:43:8;;;677:650:188;1328:43:8;677:650:188;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;677:650:188;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;677:650:188;;2881:9:192;;8938:146:8;9033:40;677:650:188;9033:40:8;677:650:188;;1328:43:8;677:650:188;9033:40:8;8942:68;677:650:188;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;677:650:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;677:650:188;1029:19:76;677:650:188;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;677:650:188;;;;;;1676:74:76;;;;677:650:188;1676:74:76;;;;;;677:650:188;1327:10:76;677:650:188;;;;1744:4:76;677:650:188;;;;1676:74:76;;;;;;;677:650:188;1676:74:76;;;1630:120;;;;;1676:74;;;;677:650:188;1676:74:76;677:650:188;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"475800","executionCost":"infinite","totalCost":"infinite"},"external":{"recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ContractOwnershipFacet}.\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}}},\"title\":\"Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/facets/TokenRecoveryFacet.sol\":\"TokenRecoveryFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/facets/TokenRecoveryFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../base/TokenRecoveryBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ContractOwnershipFacet}.\\ncontract TokenRecoveryFacet is TokenRecoveryBase, ForwarderRegistryContextBase {\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0b19a8140c042266a85021787d5b73c7847b303e310faeb9d60b5d0db4d22dbb\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."}},"version":1}}},"contracts/security/interfaces/ISeals.sol":{"ISeals":{"abi":[{"inputs":[{"internalType":"uint256","name":"sealId","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"wasSealed","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"isSealed(uint256)":{"params":{"sealId":"the seal identifier."},"returns":{"wasSealed":"Whether a seal has been used already."}}},"title":"Uniquely identified seals management.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"isSealed(uint256)":"2c1758c1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sealId\",\"type\":\"uint256\"}],\"name\":\"isSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"wasSealed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isSealed(uint256)\":{\"params\":{\"sealId\":\"the seal identifier.\"},\"returns\":{\"wasSealed\":\"Whether a seal has been used already.\"}}},\"title\":\"Uniquely identified seals management.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isSealed(uint256)\":{\"notice\":\"Retrieves whether a seal has been used already.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/interfaces/ISeals.sol\":\"ISeals\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/security/interfaces/ISeals.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Uniquely identified seals management.\\ninterface ISeals {\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(uint256 sealId) external view returns (bool wasSealed);\\n}\\n\",\"keccak256\":\"0x763b8ef3f27c078900e4591a5891d4da36b44b29b6f902cc3782ccb30a20c9b6\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"isSealed(uint256)":{"notice":"Retrieves whether a seal has been used already."}},"version":1}}},"contracts/security/interfaces/ITokenRecovery.sol":{"ITokenRecovery":{"abi":[{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"recoverERC20s(address[],address[],uint256[])":{"details":"Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens  so that the extraction is limited to only amounts sent accidentally.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens  so that the extraction is limited to only tokens sent accidentally.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.Warning: this function should be overriden for contracts which are supposed to hold ETH tokens  so that the extraction is limited to only amounts sent accidentally.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}}},"title":"Uniquely identified seals management.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens  so that the extraction is limited to only amounts sent accidentally.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens  so that the extraction is limited to only tokens sent accidentally.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.Warning: this function should be overriden for contracts which are supposed to hold ETH tokens  so that the extraction is limited to only amounts sent accidentally.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}}},\"title\":\"Uniquely identified seals management.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/interfaces/ITokenRecovery.sol\":\"ITokenRecovery\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."}},"version":1}}},"contracts/security/libraries/SealsStorage.sol":{"SealsStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220ba73eb169a3ab3c92d5af7353c0facff664d787f6be4e01dfc65fadc65340eec64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBA PUSH20 0xEB169A3AB3C92D5AF7353C0FACFF664D787F6BE4 RJUMP 0x1DFC PUSH6 0xFADC65340EEC PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"170:1207:191:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220ba73eb169a3ab3c92d5af7353c0facff664d787f6be4e01dfc65fadc65340eec64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBA PUSH20 0xEB169A3AB3C92D5AF7353C0FACFF664D787F6BE4 RJUMP 0x1DFC PUSH6 0xFADC65340EEC PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"170:1207:191:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"isSealed(struct SealsStorage.Layout storage pointer,uint256)":"infinite","layout()":"infinite","seal(struct SealsStorage.Layout storage pointer,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/libraries/SealsStorage.sol\":\"SealsStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/security/errors/SealsErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to seal a sealId which has already been used.\\n/// @param sealId The seal identifier.\\nerror AlreadySealed(uint256 sealId);\\n\",\"keccak256\":\"0xe1ada78adc1270e60bc0d6e5decddde05e89194f91aa4828b89abeec8114fed1\",\"license\":\"MIT\"},\"contracts/security/events/SealsEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a seal is used.\\n/// @param sealId the seal identifier.\\n/// @param sealer the sealer address.\\nevent Sealed(uint256 sealId, address sealer);\\n\",\"keccak256\":\"0x718ef405558601bf99cd720a64f0c3a9c75b254862013a4aa0b7232c007841ae\",\"license\":\"MIT\"},\"contracts/security/libraries/SealsStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AlreadySealed} from \\\"./../errors/SealsErrors.sol\\\";\\nimport {Sealed} from \\\"./../events/SealsEvents.sol\\\";\\n\\nlibrary SealsStorage {\\n    using SealsStorage for SealsStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => bool) seals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.security.Seals.storage\\\")) - 1);\\n\\n    /// @notice Registers a unique seal identifier.\\n    /// @dev Reverts with {AlreadySealed} if the sealId has already been used.\\n    /// @dev Emits a {Sealed} event.\\n    /// @param sealer The sealer address\\n    /// @param sealId The seal identifier.\\n    function seal(Layout storage s, address sealer, uint256 sealId) internal {\\n        if (s.seals[sealId]) revert AlreadySealed(sealId);\\n        s.seals[sealId] = true;\\n        emit Sealed(sealId, sealer);\\n    }\\n\\n    /// @notice Retrieves whether a seal has been used already.\\n    /// @param sealId the seal identifier.\\n    /// @return wasSealed Whether a seal has been used already.\\n    function isSealed(Layout storage s, uint256 sealId) internal view returns (bool) {\\n        return s.seals[sealId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf14843021b6f94e638381210dce97979c8ea8d4788d968906ed089eb92ec3eb2\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/security/libraries/TokenRecoveryLibrary.sol":{"TokenRecoveryLibrary":{"abi":[{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"}],"devdoc":{"errors":{"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}]},"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212203d3048ca327db117bd47bdf0d22980cf99f51055650ae2317628142aebe7287b64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RETURNDATASIZE ADDRESS BASEFEE 0xCA ORIGIN PUSH30 0xB117BD47BDF0D22980CF99F51055650AE2317628142AEBE7287B64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"485:3843:192:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212203d3048ca327db117bd47bdf0d22980cf99f51055650ae2317628142aebe7287b64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RETURNDATASIZE ADDRESS BASEFEE 0xCA ORIGIN PUSH30 0xB117BD47BDF0D22980CF99F51055650AE2317628142AEBE7287B64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"485:3843:192:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"recoverERC20s(address[] calldata,contract IERC20[] calldata,uint256[] calldata)":"infinite","recoverERC721s(address[] calldata,contract IERC721[] calldata,uint256[] calldata)":"infinite","recoverETH(address payable[] calldata,uint256[] calldata)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"}],\"devdoc\":{\"errors\":{\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/security/libraries/TokenRecoveryLibrary.sol\":\"TokenRecoveryLibrary\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}]},"kind":"user","methods":{},"version":1}}},"contracts/staking/linear/LinearPool.sol":{"LinearPool":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"constructor":{"details":"Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,      the higher the precision loss can be if the scaling factor is too low.","params":{"forwarderRegistry":"The address of the forwarder registry contract.","scalingFactorDecimals":"The number of decimals for the scaling factor used to avoid precision loss in reward calculations."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for the stake (encoding freely determined by the deriving contracts)."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"title":"Linear rewards distribution staking pool.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"constructor\":{\"details\":\"Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,      the higher the precision loss can be if the scaling factor is too low.\",\"params\":{\"forwarderRegistry\":\"The address of the forwarder registry contract.\",\"scalingFactorDecimals\":\"The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for the stake (encoding freely determined by the deriving contracts).\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"title\":\"Linear rewards distribution staking pool.\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"notice\":\"Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/LinearPool.sol\":\"LinearPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/staking/linear/LinearPool.sol:LinearPool","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"notice":"Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.Stakes, whether fungible or non-fungible, map to an amount of \"stake points\", then used to compute the user rewards share.NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.","version":1}}},"contracts/staking/linear/interfaces/ILinearPool.sol":{"ILinearPool":{"abi":[{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","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":""},"gasEstimates":null,"methodIdentifiers":{"addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","earned(address)":"008cc262","lastTimeRewardApplicable()":"80faa57d","rewardPerStakePoint()":"2c9d0b80","stake(bytes)":"2d1e0c02","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/interfaces/ILinearPool.sol\":\"ILinearPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol":{"LinearPool_ERC20Rewards":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"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":"rewardHolder","type":"address"}],"name":"RewardHolderSet","type":"event"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardHolder_","type":"address"}],"name":"setRewardHolder","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"constructor":{"details":"Emits a {RewardHolderSet} event with the initial reward holder address.","params":{"rewardHolder_":"The address that holds the rewards.","rewardToken":"The ERC20 token used for rewards."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"setRewardHolder(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.","params":{"rewardHolder_":"The address of the reward holder."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"LinearPool_ERC20Rewards","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"REWARD_TOKEN()":"99248ea7","owner()":"8da5cb5b","rewardHolder()":"569c93d2","setRewardHolder(address)":"6806cc93","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"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\":\"rewardHolder\",\"type\":\"address\"}],\"name\":\"RewardHolderSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARD_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardHolder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardHolder_\",\"type\":\"address\"}],\"name\":\"setRewardHolder\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Emits a {RewardHolderSet} event with the initial reward holder address.\",\"params\":{\"rewardHolder_\":\"The address that holds the rewards.\",\"rewardToken\":\"The ERC20 token used for rewards.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"setRewardHolder(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RewardHolderSet} event if the reward holder address is changed.\",\"params\":{\"rewardHolder_\":\"The address of the reward holder.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"LinearPool_ERC20Rewards\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"setRewardHolder(address)\":{\"notice\":\"Sets the reward holder address.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"notice\":\"A linear pool that allows for ERC20 rewards distribution.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol\":\"LinearPool_ERC20Rewards\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\n/// @title LinearPool_ERC20Rewards\\n/// @notice A linear pool that allows for ERC20 rewards distribution.\\n// solhint-disable-next-line contract-name-capwords\\nabstract contract LinearPool_ERC20Rewards is ContractOwnership {\\n    using SafeERC20 for IERC20;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    IERC20 public immutable REWARD_TOKEN;\\n\\n    address public rewardHolder;\\n\\n    event RewardHolderSet(address indexed rewardHolder);\\n\\n    /// @dev Emits a {RewardHolderSet} event with the initial reward holder address.\\n    /// @param rewardToken The ERC20 token used for rewards.\\n    /// @param rewardHolder_ The address that holds the rewards.\\n    constructor(IERC20 rewardToken, address rewardHolder_) {\\n        REWARD_TOKEN = rewardToken;\\n        rewardHolder = rewardHolder_;\\n        emit RewardHolderSet(rewardHolder_);\\n    }\\n\\n    /// @notice Sets the reward holder address.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RewardHolderSet} event if the reward holder address is changed.\\n    /// @param rewardHolder_ The address of the reward holder.\\n    function setRewardHolder(address rewardHolder_) external {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        if (rewardHolder_ != rewardHolder) {\\n            rewardHolder = rewardHolder_;\\n            emit RewardHolderSet(rewardHolder_);\\n        }\\n    }\\n\\n    /// @notice Transfers `reward` amount of REWARD_TOKEN from the reward holder to the staker.\\n    /// @param staker The address of the staker.\\n    /// @param claimable The amount of REWARD_TOKEN to be transferred.\\n    /// @return claimed The amount of REWARD_TOKEN successfully claimed identical to claimable.\\n    /// @return unclaimed The amount of REWARD_TOKEN that could not be claimed, always 0.\\n    function _computeClaim(address staker, uint256 claimable, bytes calldata) internal virtual returns (uint256 claimed, uint256 unclaimed) {\\n        claimed = claimable;\\n        unclaimed = 0;\\n        REWARD_TOKEN.safeTransferFrom(rewardHolder, staker, claimable);\\n    }\\n\\n    /// @notice Computes the reward for a staker.\\n    /// @dev This function is empty since the rewards do not need to be transferred to this contract.\\n    function _computeAddReward(address, uint256) internal virtual {}\\n}\\n\",\"keccak256\":\"0x0c8dc711b3c8cb7f9ea2a1e8f6f956c821b0d7b56fe7a6839b5dfe3874c436ad\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":21081,"contract":"contracts/staking/linear/reward/LinearPool_ERC20Rewards.sol:LinearPool_ERC20Rewards","label":"rewardHolder","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"owner()":{"notice":"Gets the address of the contract owner."},"setRewardHolder(address)":{"notice":"Sets the reward holder address."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"notice":"A linear pool that allows for ERC20 rewards distribution.","version":1}}},"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol":{"ERC1155StakingLinearPool":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balances","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","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":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.","params":{"amounts":"The amounts of tokens received.","from":"The address of the sender.","ids":"The ids of the tokens received.","operator":"The address of the operator."},"returns":{"_0":"bytes4 The function selector of the callback."}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.","params":{"amount":"The amount of tokens received.","from":"The address of the sender.","id":"The id of the token received.","operator":"The address of the operator."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"title":"ERC1155StakingLinearPool","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","addReward(uint256,uint256)":"75c93bb9","balances(address,uint256)":"cbf1304d","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"NotEnoughBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"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\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\",\"params\":{\"amounts\":\"The amounts of tokens received.\",\"from\":\"The address of the sender.\",\"ids\":\"The ids of the tokens received.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\",\"params\":{\"amount\":\"The amount of tokens received.\",\"from\":\"The address of the sender.\",\"id\":\"The id of the token received.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"title\":\"ERC1155StakingLinearPool\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"notice\":\"A linear pool that allows staking of ERC1155 tokens.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol\":\"ERC1155StakingLinearPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC1155TokenReceiver} from \\\"./../../../token/ERC1155/ERC1155TokenReceiver.sol\\\";\\nimport {IERC1155} from \\\"./../../../token/ERC1155/interfaces/IERC1155.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\n\\n/// @title ERC1155StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC1155 tokens.\\nabstract contract ERC1155StakingLinearPool is LinearPool, ERC1155TokenReceiver {\\n    IERC1155 public immutable STAKING_TOKEN;\\n\\n    mapping(address staker => mapping(uint256 id => uint256 amount)) public balances;\\n\\n    error InvalidToken();\\n    error NotEnoughBalance(address staker, uint256 id, uint256 amount, uint256 balance);\\n\\n    constructor(\\n        IERC1155 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\\n    /// @param operator The address of the operator.\\n    /// @param from The address of the sender.\\n    /// @param id The id of the token received.\\n    /// @param amount The amount of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC1155Received(\\n        address operator,\\n        address from,\\n        uint256 id,\\n        uint256 amount,\\n        bytes calldata\\n    ) external virtual override returns (bytes4) {\\n        if (operator != address(this)) {\\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n            bool requiresTransfer = false;\\n            bool batch = false;\\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, id, amount)));\\n        }\\n        return this.onERC1155Received.selector;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions.\\n    /// @dev Reverts with {InvalidToken} if this function is not called by this contract and the sender is not the staking token.\\n    /// @param operator The address of the operator.\\n    /// @param from The address of the sender.\\n    /// @param ids The ids of the tokens received.\\n    /// @param amounts The amounts of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC1155BatchReceived(\\n        address operator,\\n        address from,\\n        uint256[] calldata ids,\\n        uint256[] calldata amounts,\\n        bytes calldata\\n    ) external virtual override returns (bytes4) {\\n        if (operator != address(this)) {\\n            if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n            bool requiresTransfer = false;\\n            bool batch = true;\\n            _stake(from, abi.encode(requiresTransfer, abi.encode(batch, ids, amounts)));\\n        }\\n        return this.onERC1155BatchReceived.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        bool batch = abi.decode(data, (bool));\\n        if (batch) {\\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(data, (bool, uint256[], uint256[]));\\n            uint256 count = ids.length;\\n            require(count == amounts.length, InconsistentArrayLengths());\\n            for (uint256 i; i != count; ++i) {\\n                uint256 id = ids[i];\\n                uint256 amount = amounts[i];\\n                balances[staker][id] += amount;\\n                stakePoints += _tokenValue(id, amount);\\n            }\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.safeBatchTransferFrom(staker, address(this), ids, amounts, \\\"\\\");\\n            }\\n        } else {\\n            (, uint256 id, uint256 amount) = abi.decode(data, (bool, uint256, uint256));\\n            balances[staker][id] += amount;\\n            stakePoints = _tokenValue(id, amount);\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.safeTransferFrom(staker, address(this), id, amount, \\\"\\\");\\n            }\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @dev Reverts with {InconsistentArrayLengths} if the lengths of the ids and amounts arrays are not equal.\\n    /// @dev Reverts with {NotEnoughBalance} if the staker does not have enough balance for the given id and amount.\\n    /// @param withdrawData The data to be used for withdrawing, encoded as\\n    ///   (bool batch, uint256 tokenId, uint256 amount) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds, uint256[] amounts) where batch is true.\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        bool batch = abi.decode(withdrawData, (bool));\\n        if (batch) {\\n            (, uint256[] memory ids, uint256[] memory amounts) = abi.decode(withdrawData, (bool, uint256[], uint256[]));\\n            uint256 count = ids.length;\\n            require(count == amounts.length, InconsistentArrayLengths());\\n            for (uint256 i; i != count; ++i) {\\n                uint256 id = ids[i];\\n                uint256 amount = amounts[i];\\n                uint256 balance = balances[staker][id];\\n                require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\\n                balances[staker][id] = balance - amount;\\n                stakePoints += _tokenValue(id, amount);\\n            }\\n            STAKING_TOKEN.safeBatchTransferFrom(address(this), staker, ids, amounts, \\\"\\\");\\n        } else {\\n            (, uint256 id, uint256 amount) = abi.decode(withdrawData, (bool, uint256, uint256));\\n            uint256 balance = balances[staker][id];\\n            require(balance >= amount, NotEnoughBalance(staker, id, amount, balance));\\n            balances[staker][id] = balance - amount;\\n            stakePoints = _tokenValue(id, amount);\\n            STAKING_TOKEN.safeTransferFrom(address(this), staker, id, amount, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Computes the stake points for a given token id and amount.\\n    /// @param id The id of the token.\\n    /// @param amount The amount of the token.\\n    /// @return stakePoints The computed stake points for the given token id and amount.\\n    function _tokenValue(uint256 id, uint256 amount) internal view virtual returns (uint256 stakePoints);\\n}\\n\",\"keccak256\":\"0xf1d03d4b540e3a1b52254d09319df6c2ba49aab7c581fcfd3dfa3244d580f604\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155TokenReceiver} from \\\"./interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, Token Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155TokenReceiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xaa801a5fe8512813bf7bfa2de627c8649e26ac732b0588604e26a0e8e9e111cf\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"},{"astId":21203,"contract":"contracts/staking/linear/stake/ERC1155StakingLinearPool.sol:ERC1155StakingLinearPool","label":"balances","offset":0,"slot":"9","type":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_uint256,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint256 => uint256))","numberOfBytes":"32","value":"t_mapping(t_uint256,t_uint256)"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_uint256)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Callback called when the contract receives ERC1155 tokens via the IERC1155Receiver functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"notice":"A linear pool that allows staking of ERC1155 tokens.","version":1}}},"contracts/staking/linear/stake/ERC20StakingLinearPool.sol":{"ERC20StakingLinearPool":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"recoverable","type":"uint256"}],"name":"InvalidRecoveryAmount","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC20Received(address,address,uint256,bytes)":{"details":"Reverts  with {InvalidToken} if the sender is not the staking token.","params":{"from":"The address of the sender.","value":"The amount of tokens received."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as (uint256 value)"}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"title":"ERC20StakingLinearPool","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC20Received(address,address,uint256,bytes)":"4fc35859","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"recoverable\",\"type\":\"uint256\"}],\"name\":\"InvalidRecoveryAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC20Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC20Received(address,address,uint256,bytes)\":{\"details\":\"Reverts  with {InvalidToken} if the sender is not the staking token.\",\"params\":{\"from\":\"The address of the sender.\",\"value\":\"The amount of tokens received.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as (uint256 value)\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"title\":\"ERC20StakingLinearPool\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC20Received(address,address,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"notice\":\"A linear pool that allows staking of ERC20 tokens.WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/stake/ERC20StakingLinearPool.sol\":\"ERC20StakingLinearPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC20StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC20Receiver} from \\\"./../../../token/ERC20/ERC20Receiver.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n/// @title ERC20StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC20 tokens.\\n/// @notice WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens.\\nabstract contract ERC20StakingLinearPool is LinearPool, ERC20Receiver {\\n    using SafeERC20 for IERC20;\\n\\n    IERC20 public immutable STAKING_TOKEN;\\n\\n    error InvalidToken();\\n    error InvalidRecoveryAmount(uint256 requested, uint256 recoverable);\\n\\n    constructor(\\n        IERC20 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions.\\n    /// @dev Reverts  with {InvalidToken} if the sender is not the staking token.\\n    /// @param from The address of the sender.\\n    /// @param value The amount of tokens received.\\n    /// @return bytes4 The function selector of the callback.\\n    function onERC20Received(address, address from, uint256 value, bytes calldata) external virtual override returns (bytes4) {\\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n        bool requiresTransfer = false;\\n        _stake(from, abi.encode(requiresTransfer, abi.encode(value)));\\n        return this.onERC20Received.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (uint256 value)\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes data) where data is (uint256 value).\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        stakePoints = abi.decode(data, (uint256));\\n        if (requiresTransfer) {\\n            STAKING_TOKEN.safeTransferFrom(staker, address(this), stakePoints);\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param withdrawData The data to be used for withdrawing, encoded as (uint256 value)\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        stakePoints = abi.decode(withdrawData, (uint256));\\n        STAKING_TOKEN.safeTransfer(staker, stakePoints);\\n    }\\n\\n    /// @inheritdoc TokenRecoveryBase\\n    /// @dev Reverts with {InvalidRecoveryAmount} if recovering some STAKING_TOKEN in greater quatity than what is recoverable.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual override {\\n        uint256 stakingTokenRecoveryAmount;\\n        for (uint256 i; i < tokens.length; ++i) {\\n            if (tokens[i] == STAKING_TOKEN) {\\n                stakingTokenRecoveryAmount += amounts[i];\\n            }\\n        }\\n        if (stakingTokenRecoveryAmount != 0) {\\n            uint256 recoverable = STAKING_TOKEN.balanceOf(address(this)) - totalStaked;\\n            if (stakingTokenRecoveryAmount > recoverable) {\\n                revert InvalidRecoveryAmount(stakingTokenRecoveryAmount, recoverable);\\n            }\\n        }\\n        super.recoverERC20s(accounts, tokens, amounts);\\n    }\\n}\\n\",\"keccak256\":\"0xfc584f2099066de626d70905a101ebef7d59dbdc610781ad1c4125a3f9c09264\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Receiver} from \\\"./interfaces/IERC20Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Receiver is IERC20Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xfcf1a39ddedf6c5bc3fa134f389b98cdb17d33df14903239fe0e1c7120ec7c16\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/staking/linear/stake/ERC20StakingLinearPool.sol:ERC20StakingLinearPool","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC20Received(address,address,uint256,bytes)":{"notice":"Callback called when the contract receives ERC20 tokens via the IERC20SafeTransfers functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"notice":"A linear pool that allows staking of ERC20 tokens.WARNING: This contract is not compatible with fee-on-transfer and rebasing tokens.","version":1}}},"contracts/staking/linear/stake/ERC721StakingLinearPool.sol":{"ERC721StakingLinearPool":{"abi":[{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"InvalidClaimSum","type":"error"},{"inputs":[],"name":"InvalidDuration","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"InvalidRecoveryToken","type":"error"},{"inputs":[],"name":"InvalidRewardAmount","type":"error"},{"inputs":[],"name":"InvalidStakeAmount","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"InvalidWithdrawAmount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"}],"name":"NotEnoughStake","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"NotTheTokenOwner","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentRewardRate","type":"uint256"},{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"RewardDilution","type":"error"},{"inputs":[],"name":"RewardOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"ScalingFactorOutOfBounds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"claimData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"claimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unclaimed","type":"uint256"}],"name":"Claimed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"stakeData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"bytes","name":"withdrawData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"stakePoints","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"REWARDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALING_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_TOKEN","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claimData","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":[],"name":"rewardPerStakePoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewardPerStakePointPaid","outputs":[{"internalType":"uint256","name":"paid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerStakePointStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"stakeData","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"stakePoints","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":"tokenId","type":"uint256"}],"name":"tokenOwners","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"withdrawData","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}}},"kind":"dev","methods":{"addReward(uint256,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.","params":{"duration":"The duration of the rewards distribution.","reward":"The amount of rewards to be added."}},"claim(bytes)":{"details":"Emits a {Claimed} event with the staker address, claimData and reward.","params":{"claimData":"The data to be used in the claim process (encoding freely determined by the deriving contracts)."}},"earned(address)":{"params":{"account":"The address of the account to check."},"returns":{"_0":"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"lastTimeRewardApplicable()":{"returns":{"_0":"The minimum of the current block timestamp and the distribution end."}},"onERC721Received(address,address,uint256,bytes)":{"details":"Reverts with {InvalidToken} if the sender is not the staking token.","params":{"from":"The address of the sender.","tokenId":"The ID of the token received."},"returns":{"_0":"bytes4 The function selector of the callback."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"rewardPerStakePoint()":{"returns":{"_0":"The sum of the last stored value and the new rewards since the last update"}},"stake(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.","params":{"stakeData":"The data to be used for staking, encoded as   (bool batch, uint256 tokenId) where batch is false, or   (bool batch, uint256[] tokenIds) where batch is true."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"withdraw(bytes)":{"details":"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.","params":{"withdrawData":"The data to be used for the withdraw (encoding freely determined by the deriving contracts)."}}},"title":"ERC721StakingLinearPool","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"REWARDER_ROLE()":"8580cf76","SCALING_FACTOR()":"ef4cadc5","STAKING_TOKEN()":"0479d644","addReward(uint256,uint256)":"75c93bb9","claim(bytes)":"c63ff8dd","distributionEnd()":"efa90b54","earned(address)":"008cc262","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isTrustedForwarder(address)":"572b6c05","lastTimeRewardApplicable()":"80faa57d","lastUpdated()":"d0b06f5d","onERC721Received(address,address,uint256,bytes)":"150b7a02","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","rewardPerStakePoint()":"2c9d0b80","rewardPerStakePointPaid(address)":"c5c8f770","rewardPerStakePointStored()":"9d696e36","rewardRate()":"7b0a47ee","rewards(address)":"0700037d","stake(bytes)":"2d1e0c02","staked(address)":"98807d84","supportsInterface(bytes4)":"01ffc9a7","tokenOwners(uint256)":"f8a14f46","totalStaked()":"817b1cd2","transferOwnership(address)":"f2fde38b","withdraw(bytes)":"0968f264"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"claimable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"InvalidClaimSum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"InvalidRecoveryToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdraw\",\"type\":\"uint256\"}],\"name\":\"NotEnoughStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NotTheTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentRewardRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newRewardRate\",\"type\":\"uint256\"}],\"name\":\"RewardDilution\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ScalingFactorOutOfBounds\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unclaimed\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"REWARDER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCALING_FACTOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_TOKEN\",\"outputs\":[{\"internalType\":\"contract IERC721\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"addReward\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributionEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":[],\"name\":\"rewardPerStakePoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewardPerStakePointPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerStakePointStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"stakeData\",\"type\":\"bytes\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"staked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakePoints\",\"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\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStaked\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"withdrawData\",\"type\":\"bytes\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}}},\"kind\":\"dev\",\"methods\":{\"addReward(uint256,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.Reverts with {InvalidRewardAmount} if the reward amount is 0.Reverts with {InvalidDuration} if the duration is 0.Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.Reverts with {RewardDilution} if the new reward rate is lower than the current one.Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\",\"params\":{\"duration\":\"The duration of the rewards distribution.\",\"reward\":\"The amount of rewards to be added.\"}},\"claim(bytes)\":{\"details\":\"Emits a {Claimed} event with the staker address, claimData and reward.\",\"params\":{\"claimData\":\"The data to be used in the claim process (encoding freely determined by the deriving contracts).\"}},\"earned(address)\":{\"params\":{\"account\":\"The address of the account to check.\"},\"returns\":{\"_0\":\"The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"lastTimeRewardApplicable()\":{\"returns\":{\"_0\":\"The minimum of the current block timestamp and the distribution end.\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Reverts with {InvalidToken} if the sender is not the staking token.\",\"params\":{\"from\":\"The address of the sender.\",\"tokenId\":\"The ID of the token received.\"},\"returns\":{\"_0\":\"bytes4 The function selector of the callback.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"rewardPerStakePoint()\":{\"returns\":{\"_0\":\"The sum of the last stored value and the new rewards since the last update\"}},\"stake(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidStakeAmount} if the stake amount is 0.Emits a {Staked} event with the staker address, stakeData and stake points.The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\",\"params\":{\"stakeData\":\"The data to be used for staking, encoded as   (bool batch, uint256 tokenId) where batch is false, or   (bool batch, uint256[] tokenIds) where batch is true.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"withdraw(bytes)\":{\"details\":\"Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.Emits a {Withdrawn} event with the staker address, withdrawData and stake points.The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\",\"params\":{\"withdrawData\":\"The data to be used for the withdraw (encoding freely determined by the deriving contracts).\"}}},\"title\":\"ERC721StakingLinearPool\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"}},\"kind\":\"user\",\"methods\":{\"addReward(uint256,uint256)\":{\"notice\":\"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\"},\"claim(bytes)\":{\"notice\":\"Claims the rewards for the sender.\"},\"earned(address)\":{\"notice\":\"Returns the amount of rewards earned by the account.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"lastTimeRewardApplicable()\":{\"notice\":\"Returns the last time rewards are applicable.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"rewardPerStakePoint()\":{\"notice\":\"Returns the current reward per stake point.\"},\"stake(bytes)\":{\"notice\":\"Stakes to the pool.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"withdraw(bytes)\":{\"notice\":\"Withdraws from the pool.\"}},\"notice\":\"A linear pool that allows staking of ERC721 tokens.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/staking/linear/stake/ERC721StakingLinearPool.sol\":\"ERC721StakingLinearPool\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\\n * consider using {ReentrancyGuardTransient} instead.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant NOT_ENTERED = 1;\\n    uint256 private constant ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    /**\\n     * @dev Unauthorized reentrant call.\\n     */\\n    error ReentrancyGuardReentrantCall();\\n\\n    constructor() {\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and making it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        _nonReentrantBefore();\\n        _;\\n        _nonReentrantAfter();\\n    }\\n\\n    function _nonReentrantBefore() private {\\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\\n        if (_status == ENTERED) {\\n            revert ReentrancyGuardReentrantCall();\\n        }\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = ENTERED;\\n    }\\n\\n    function _nonReentrantAfter() private {\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n     * `nonReentrant` function in the call stack.\\n     */\\n    function _reentrancyGuardEntered() internal view returns (bool) {\\n        return _status == ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/staking/linear/LinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\nimport {ReentrancyGuard} from \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport {TokenRecovery} from \\\"./../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../metatx/ForwarderRegistryContext.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\nimport {SafeERC20, IERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Math} from \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport {ILinearPool} from \\\"./interfaces/ILinearPool.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n// design inspired from https://github.com/k06a/Unipool/blob/master/contracts/Unipool.sol\\n\\n/// @title Linear rewards distribution staking pool.\\n/// @notice Implements the base logic for linear reward pools, while the nature of the staking and rewards is left to the deriving contracts.\\n/// @notice Stakes, whether fungible or non-fungible, map to an amount of \\\"stake points\\\", then used to compute the user rewards share.\\n/// @notice NB: This contract inherits TokenRecovery functions. In the likely event that the deriving contract does keep tokens in stake,\\n/// @notice the corresponding functions must be overriden to prevent recovering tokens legitimately staked in the contract.\\nabstract contract LinearPool is ILinearPool, AccessControl, ReentrancyGuard, TokenRecovery, ForwarderRegistryContext {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using SafeERC20 for IERC20;\\n    using Math for uint256;\\n\\n    bytes32 public constant REWARDER_ROLE = \\\"rewarder\\\";\\n\\n    uint256 public immutable SCALING_FACTOR;\\n\\n    uint256 public totalStaked;\\n    uint256 public lastUpdated;\\n    uint256 public rewardRate;\\n    uint256 public rewardPerStakePointStored;\\n    uint256 public distributionEnd;\\n\\n    mapping(address staker => uint256 stakePoints) public staked;\\n    mapping(address staker => uint256 reward) public rewards;\\n    mapping(address staker => uint256 paid) public rewardPerStakePointPaid;\\n\\n    event Staked(address indexed staker, bytes stakeData, uint256 stakePoints);\\n    event Withdrawn(address indexed staker, bytes withdrawData, uint256 stakePoints);\\n    event Claimed(address indexed staker, bytes claimData, uint256 claimed, uint256 unclaimed);\\n    event RewardAdded(address indexed rewarder, uint256 reward, uint256 duration);\\n\\n    error ScalingFactorOutOfBounds();\\n    error InvalidStakeAmount();\\n    error InvalidWithdrawAmount();\\n    error NotEnoughStake(address staker, uint256 stake, uint256 withdraw);\\n    error InvalidClaimSum(uint256 claimable, uint256 claimed, uint256 unclaimed);\\n    error InvalidRewardAmount();\\n    error InvalidDuration();\\n    error RewardDilution(uint256 currentRewardRate, uint256 newRewardRate);\\n    error RewardOverflow();\\n\\n    /// @param scalingFactorDecimals The number of decimals for the scaling factor used to avoid precision loss in reward calculations.\\n    /// @param forwarderRegistry The address of the forwarder registry contract.\\n    /// @dev Reverts with {ScalingFactorOutOfBounds} if scalingFactorDecimals is 77 or more.\\n    /// @dev It is recomended to use a scaling factor as high as possible without causing overflows in reward calculations.\\n    ///      Overflow would happen in addReward if the total remaining reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    ///      When rewardPerStakePoint() is computed, the reward is divided by totalStaked, so the highest the total staked gets,\\n    ///      the higher the precision loss can be if the scaling factor is too low.\\n    constructor(\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ContractOwnership(msg.sender) ForwarderRegistryContext(forwarderRegistry) {\\n        require(scalingFactorDecimals < 77, ScalingFactorOutOfBounds());\\n        SCALING_FACTOR = 10 ** scalingFactorDecimals;\\n    }\\n\\n    function _updateReward(address account) internal {\\n        rewardPerStakePointStored = rewardPerStakePoint();\\n        if (block.timestamp >= distributionEnd || totalStaked != 0) {\\n            // ensure rewards before the first staker do not get lost\\n            lastUpdated = lastTimeRewardApplicable();\\n        }\\n        if (account != address(0)) {\\n            rewards[account] = earned(account);\\n            rewardPerStakePointPaid[account] = rewardPerStakePointStored;\\n        }\\n    }\\n\\n    /// @notice Returns the last time rewards are applicable.\\n    /// @return The minimum of the current block timestamp and the distribution end.\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\n        uint256 currentDistributionEnd = distributionEnd;\\n        return block.timestamp < currentDistributionEnd ? block.timestamp : currentDistributionEnd;\\n    }\\n\\n    /// @notice Returns the current reward per stake point.\\n    /// @return The sum of the last stored value and the new rewards since the last update\\n    function rewardPerStakePoint() public view returns (uint256) {\\n        uint256 currentTotalStaked = totalStaked;\\n        if (currentTotalStaked == 0) {\\n            return rewardPerStakePointStored;\\n        }\\n        return rewardPerStakePointStored + (((lastTimeRewardApplicable() - lastUpdated) * rewardRate) / currentTotalStaked);\\n    }\\n\\n    /// @notice Returns the amount of rewards earned by the account.\\n    /// @return The account's stake points times the difference between the current reward per stake point and the last paid reward per stake point.\\n    /// @param account The address of the account to check.\\n    function earned(address account) public view returns (uint256) {\\n        return (staked[account] * (rewardPerStakePoint() - rewardPerStakePointPaid[account])) + rewards[account];\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function stake(bytes calldata stakeData) public payable virtual {\\n        _stake(_msgSender(), stakeData);\\n    }\\n\\n    /// @notice Stakes to the pool.\\n    /// NB: If a reward is ongoing while there are no stakers, the accumulated rewards so far will go to the first staker.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidStakeAmount} if the stake amount is 0.\\n    /// @dev Emits a {Staked} event with the staker address, stakeData and stake points.\\n    /// @dev The stakeData is passed to the _computeStake function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    function _stake(address staker, bytes memory stakeData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeStake(staker, stakeData);\\n        require(stakePoints != 0, InvalidStakeAmount());\\n        totalStaked += stakePoints;\\n        staked[staker] += stakePoints;\\n        emit Staked(staker, stakeData, stakePoints);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function withdraw(bytes calldata withdrawData) public virtual {\\n        _withdraw(_msgSender(), withdrawData);\\n    }\\n\\n    /// @notice Withdraws from the pool.\\n    /// @dev Reverts with {ReentrancyGuardReentrantCall} if the function is re-entered.\\n    /// @dev Reverts with {InvalidWithdrawAmount} if the withdraw amount is 0.\\n    /// @dev Reverts with {NotEnoughStake} if the staker does not have enough stake points to withdraw.\\n    /// @dev Emits a {Withdrawn} event with the staker address, withdrawData and stake points.\\n    /// @dev The withdrawData is passed to the _computeWithdraw function, which must be implemented in the deriving contract.\\n    /// @param staker The address of the staker.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    function _withdraw(address staker, bytes memory withdrawData) internal virtual nonReentrant {\\n        _updateReward(staker);\\n        uint256 stakePoints = _computeWithdraw(staker, withdrawData);\\n        require(stakePoints != 0, InvalidWithdrawAmount());\\n        uint256 currentStaked = staked[staker];\\n        require(currentStaked >= stakePoints, NotEnoughStake(staker, currentStaked, stakePoints));\\n        unchecked {\\n            // no underflow possible\\n            staked[staker] = currentStaked - stakePoints;\\n            totalStaked -= stakePoints;\\n        }\\n        emit Withdrawn(staker, withdrawData, stakePoints);\\n    }\\n\\n    /// @notice Claims the rewards for the sender.\\n    /// @dev Emits a {Claimed} event with the staker address, claimData and reward.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    function claim(bytes calldata claimData) public virtual nonReentrant {\\n        address staker = _msgSender();\\n        _updateReward(staker);\\n        uint256 reward = earned(staker);\\n        if (reward != 0) {\\n            uint256 claimable = reward / SCALING_FACTOR;\\n            uint256 dust = reward % SCALING_FACTOR;\\n            (uint256 claimed, uint256 unclaimed) = _computeClaim(staker, claimable, claimData);\\n            require(claimed + unclaimed == claimable, InvalidClaimSum(claimable, claimed, unclaimed));\\n            rewards[staker] = dust + unclaimed * SCALING_FACTOR;\\n            emit Claimed(staker, claimData, claimed, unclaimed);\\n        }\\n    }\\n\\n    /// @notice Adds rewards to the pool.\\n    /// @notice If there is an ongoing distribution, the new rewards are added to the current distribution:\\n    /// @notice - If the new distribution ends before the current one, the new rewards are added to the current distribution.\\n    /// @notice - If the new distribution ends after the current one, the remaining rewards are added to the new distribution.\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the REWARDER_ROLE.\\n    /// @dev Reverts with {InvalidRewardAmount} if the reward amount is 0.\\n    /// @dev Reverts with {InvalidDuration} if the duration is 0.\\n    /// @dev Reverts with {RewardOverflow} if the resulting total reward to be distributed overflows when scaled by the SCALING_FACTOR.\\n    /// @dev Reverts with {RewardDilution} if the new reward rate is lower than the current one.\\n    /// @dev Emits a {RewardAdded} event with the rewarder address, reward amount, and duration.\\n    /// @param reward The amount of rewards to be added.\\n    /// @param duration The duration of the rewards distribution.\\n    function addReward(uint256 reward, uint256 duration) public payable virtual {\\n        address rewarder = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(REWARDER_ROLE, rewarder);\\n\\n        require(reward != 0, InvalidRewardAmount());\\n        require(duration != 0, InvalidDuration());\\n\\n        (bool success, uint256 totalReward) = reward.tryMul(SCALING_FACTOR);\\n        require(success, RewardOverflow());\\n\\n        _updateReward(address(0));\\n\\n        uint256 currentDistributionEnd = distributionEnd;\\n        uint256 newDisrtibutionEnd = block.timestamp + duration;\\n\\n        if (block.timestamp >= currentDistributionEnd) {\\n            // No current distribution\\n            rewardRate = totalReward / duration;\\n            distributionEnd = newDisrtibutionEnd;\\n        } else {\\n            uint256 currentRewardRate = rewardRate;\\n            uint256 remainingReward = currentRewardRate * (currentDistributionEnd - block.timestamp);\\n            (success, totalReward) = totalReward.tryAdd(remainingReward);\\n            require(success, RewardOverflow());\\n\\n            if (newDisrtibutionEnd <= currentDistributionEnd) {\\n                // New distribution ends before current distribution\\n                // Keep the current distribution end and increase the reward rate accordingly\\n                duration = currentDistributionEnd - block.timestamp;\\n                rewardRate = totalReward / duration;\\n            } else {\\n                // New distribution ends after current distribution\\n                // Extend the current distribution end and increase the reward rate accordingly\\n                uint256 newRewardRate = totalReward / duration;\\n                require(newRewardRate >= currentRewardRate, RewardDilution(currentRewardRate, newRewardRate));\\n                rewardRate = newRewardRate;\\n                distributionEnd = newDisrtibutionEnd;\\n            }\\n        }\\n        lastUpdated = block.timestamp;\\n\\n        _computeAddReward(rewarder, reward);\\n\\n        emit RewardAdded(rewarder, reward, duration);\\n    }\\n\\n    /// @notice Performs a stake (deposit some asset in the pool), for example by transferring staking tokens to this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the stakeData.\\n    /// @param sender The address of the sender.\\n    /// @param stakeData The data to be used for the stake (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the stakeData.\\n    function _computeStake(address sender, bytes memory stakeData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a withdrawal (remove some asset from the pool), for example by transferring taking tokens from this contract.\\n    /// @notice Computes the amount of stake points for the sender based on the withdrawData.\\n    /// @param sender The address of the sender.\\n    /// @param withdrawData The data to be used for the withdraw (encoding freely determined by the deriving contracts).\\n    /// @return stakePoints The amount of stake points computed from the withdrawData.\\n    function _computeWithdraw(address sender, bytes memory withdrawData) internal virtual returns (uint256 stakePoints);\\n\\n    /// @notice Performs a claim, for examples by transferring reward tokens to the sender.\\n    /// @param sender The address of the sender.\\n    /// @param claimable The amount of rewards which can be claimed.\\n    /// @param claimData The data to be used in the claim process (encoding freely determined by the deriving contracts).\\n    /// @return claimed The amount of rewards that was claimed.\\n    /// @return unclaimed The amount of rewards that was not claimed.\\n    function _computeClaim(address sender, uint256 claimable, bytes calldata claimData) internal virtual returns (uint256 claimed, uint256 unclaimed);\\n\\n    /// @notice Performs addition of rewards to the pool, for example by transferring rewards tokens to this contract.\\n    /// @param sender The address of the sender.\\n    /// @param reward The amount of rewards to be added.\\n    function _computeAddReward(address sender, uint256 reward) internal virtual;\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4fb8ada9b31da22c48a62c38e8946308d8ca8dbb727001be50f44586e3e29677\",\"license\":\"MIT\"},\"contracts/staking/linear/interfaces/ILinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\ninterface ILinearPool {\\n    function lastTimeRewardApplicable() external view returns (uint256);\\n\\n    function rewardPerStakePoint() external view returns (uint256);\\n\\n    function earned(address account) external view returns (uint256);\\n\\n    function stake(bytes calldata stakeData) external payable;\\n\\n    function withdraw(bytes calldata withdrawData) external;\\n\\n    function claim(bytes calldata claimData) external;\\n\\n    function addReward(uint256 reward, uint256 duration) external payable;\\n}\\n\",\"keccak256\":\"0xe64e1d524ca0bade7e242360d626b58d18957eb32b47cea1eb396a376fb647bd\",\"license\":\"MIT\"},\"contracts/staking/linear/stake/ERC721StakingLinearPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {LinearPool} from \\\"./../LinearPool.sol\\\";\\nimport {ERC721Receiver} from \\\"./../../../token/ERC721/ERC721Receiver.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {IERC721} from \\\"./../../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\n\\n/// @title ERC721StakingLinearPool\\n/// @notice A linear pool that allows staking of ERC721 tokens.\\nabstract contract ERC721StakingLinearPool is LinearPool, ERC721Receiver {\\n    IERC721 public immutable STAKING_TOKEN;\\n\\n    mapping(uint256 tokenId => address owner) public tokenOwners;\\n\\n    error InvalidToken();\\n    error NotTheTokenOwner(address staker, uint256 tokenId, address owner);\\n    error InvalidRecoveryToken(uint256 tokenId);\\n\\n    constructor(\\n        IERC721 stakingToken,\\n        uint8 scalingFactorDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) LinearPool(scalingFactorDecimals, forwarderRegistry) {\\n        STAKING_TOKEN = stakingToken;\\n    }\\n\\n    /// @notice Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions.\\n    /// @param from The address of the sender.\\n    /// @param tokenId The ID of the token received.\\n    /// @return bytes4 The function selector of the callback.\\n    /// @dev Reverts with {InvalidToken} if the sender is not the staking token.\\n    function onERC721Received(address, address from, uint256 tokenId, bytes calldata) external virtual override returns (bytes4) {\\n        if (msg.sender != address(STAKING_TOKEN)) revert InvalidToken();\\n        bool requiresTransfer = false;\\n        bool batch = false;\\n        _stake(from, abi.encode(requiresTransfer, abi.encode(batch, tokenId)));\\n        return this.onERC721Received.selector;\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function stake(bytes calldata stakeData) public payable virtual override {\\n        bool requiresTransfer = true;\\n        _stake(_msgSender(), abi.encode(requiresTransfer, stakeData));\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param stakeData The data to be used for staking, encoded as (bool requiresTransfer, bytes stakeData) where stakeData is\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function _computeStake(address staker, bytes memory stakeData) internal virtual override returns (uint256 stakePoints) {\\n        (bool requiresTransfer, bytes memory data) = abi.decode(stakeData, (bool, bytes));\\n        bool batch = abi.decode(data, (bool));\\n        if (batch) {\\n            (, uint256[] memory tokenIds) = abi.decode(data, (bool, uint256[]));\\n            uint256 count = tokenIds.length;\\n            for (uint256 i; i != count; ++i) {\\n                uint256 tokenId = tokenIds[i];\\n                tokenOwners[tokenId] = staker;\\n                stakePoints += _tokenValue(tokenId);\\n                // batch case always requires transfer\\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\\n            }\\n        } else {\\n            (, uint256 tokenId) = abi.decode(data, (bool, uint256));\\n            tokenOwners[tokenId] = staker;\\n            stakePoints = _tokenValue(tokenId);\\n            if (requiresTransfer) {\\n                STAKING_TOKEN.transferFrom(staker, address(this), tokenId);\\n            }\\n        }\\n    }\\n\\n    /// @inheritdoc LinearPool\\n    /// @param withdrawData The data to be used for withdrawing, encoded as\\n    ///   (bool batch, uint256 tokenId) where batch is false, or\\n    ///   (bool batch, uint256[] tokenIds) where batch is true.\\n    function _computeWithdraw(address staker, bytes memory withdrawData) internal virtual override returns (uint256 stakePoints) {\\n        bool batch = abi.decode(withdrawData, (bool));\\n        if (batch) {\\n            (, uint256[] memory tokenIds) = abi.decode(withdrawData, (bool, uint256[]));\\n            uint256 count = tokenIds.length;\\n            for (uint256 i; i != count; ++i) {\\n                uint256 tokenId = tokenIds[i];\\n                address tokenOwner = tokenOwners[tokenId];\\n                require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\\n                delete tokenOwners[tokenId];\\n                stakePoints += _tokenValue(tokenId);\\n                STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\\n            }\\n        } else {\\n            (, uint256 tokenId) = abi.decode(withdrawData, (bool, uint256));\\n            address tokenOwner = tokenOwners[tokenId];\\n            require(staker == tokenOwner, NotTheTokenOwner(staker, tokenId, tokenOwner));\\n            delete tokenOwners[tokenId];\\n            stakePoints = _tokenValue(tokenId);\\n            STAKING_TOKEN.transferFrom(address(this), staker, tokenId);\\n        }\\n    }\\n\\n    /// @inheritdoc TokenRecoveryBase\\n    /// @dev Reverts with {InvalidRecoveryToken} if recovering some STAKING_TOKEN which was legitimately staked to this contract.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual override {\\n        for (uint256 i; i != contracts.length; ++i) {\\n            if (contracts[i] == STAKING_TOKEN) {\\n                uint256 tokenId = tokenIds[i];\\n                require(tokenOwners[tokenId] == address(0), InvalidRecoveryToken(tokenId));\\n            }\\n        }\\n        super.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n\\n    /// @notice Computes the stake points for a given token ID.\\n    /// @param tokenId The ID of the token.\\n    /// @return stakePoints The stake points for the token.\\n    function _tokenValue(uint256 tokenId) internal view virtual returns (uint256 stakePoints);\\n}\\n\",\"keccak256\":\"0x9f1a764c34875019343fe6949bf5954b1555f52b72ea5fb42203b9c504161ffe\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Receiver} from \\\"./interfaces/IERC721Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Receiver is IERC721Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0x63a2d3363c5e74e4dbc670fcf947ffdfbe12c6059a9300432a3c46e0eb9c1235\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":1291,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"_status","offset":0,"slot":"0","type":"t_uint256"},{"astId":20302,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"totalStaked","offset":0,"slot":"1","type":"t_uint256"},{"astId":20304,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"lastUpdated","offset":0,"slot":"2","type":"t_uint256"},{"astId":20306,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"rewardRate","offset":0,"slot":"3","type":"t_uint256"},{"astId":20308,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"rewardPerStakePointStored","offset":0,"slot":"4","type":"t_uint256"},{"astId":20310,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"distributionEnd","offset":0,"slot":"5","type":"t_uint256"},{"astId":20314,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"staked","offset":0,"slot":"6","type":"t_mapping(t_address,t_uint256)"},{"astId":20318,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"rewards","offset":0,"slot":"7","type":"t_mapping(t_address,t_uint256)"},{"astId":20322,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"rewardPerStakePointPaid","offset":0,"slot":"8","type":"t_mapping(t_address,t_uint256)"},{"astId":22079,"contract":"contracts/staking/linear/stake/ERC721StakingLinearPool.sol:ERC721StakingLinearPool","label":"tokenOwners","offset":0,"slot":"9","type":"t_mapping(t_uint256,t_address)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_address)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => address)","numberOfBytes":"32","value":"t_address"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."}},"kind":"user","methods":{"addReward(uint256,uint256)":{"notice":"Adds rewards to the pool.If there is an ongoing distribution, the new rewards are added to the current distribution:- If the new distribution ends before the current one, the new rewards are added to the current distribution.- If the new distribution ends after the current one, the remaining rewards are added to the new distribution."},"claim(bytes)":{"notice":"Claims the rewards for the sender."},"earned(address)":{"notice":"Returns the amount of rewards earned by the account."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"lastTimeRewardApplicable()":{"notice":"Returns the last time rewards are applicable."},"onERC721Received(address,address,uint256,bytes)":{"notice":"Callback called when the contract receives ERC721 tokens via the IERC721Receiver functions."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"rewardPerStakePoint()":{"notice":"Returns the current reward per stake point."},"stake(bytes)":{"notice":"Stakes to the pool."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"withdraw(bytes)":{"notice":"Withdraws from the pool."}},"notice":"A linear pool that allows staking of ERC721 tokens.","version":1}}},"contracts/token/ERC1155/ERC1155.sol":{"ERC1155":{"abi":[{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","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":"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"approvedForAll","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":"values","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":"value","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":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC1155 Multi Token Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"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.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"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\":\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC1155 Multi Token Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155.sol\":\"ERC1155\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155Base} from \\\"./base/ERC1155Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155 is ERC1155Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    constructor() {\\n        ERC1155Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0cc8e6bb595c468c7b2f51d67b00b30e3ada7e0ab54a3de0c39b03832043a5c7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/token/ERC1155/ERC1155Burnable.sol":{"ERC1155Burnable":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}}},"title":"ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[],uint256[])":"80534934","burnFrom(address,uint256,uint256)":"124d91e5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"constructor\":{\"notice\":\"Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155Burnable.sol\":\"ERC1155Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./base/ERC1155BurnableBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Burnable is ERC1155BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable\\n    constructor() {\\n        ERC1155Storage.initERC1155Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0x3a83ffae95480cf133b1bdc247455b5c5e812ea66be6092e27f738b11e4951fa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"constructor":{"notice":"Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable"}},"version":1}}},"contracts/token/ERC1155/ERC1155Deliverable.sol":{"ERC1155Deliverable":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155Deliverable.sol\":\"ERC1155Deliverable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./base/ERC1155DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\\n    constructor() {\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x66d13c9e643f22c8bebea5c0266b175a4b4868616453832c5a1ca819c560f389\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"constructor":{"notice":"Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable"},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC1155/ERC1155Metadata.sol":{"ERC1155Metadata":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"constructor":{"params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchSetTokenURI(uint256[],string[])":"6706467b","metadataResolver()":"a0c76f62","name()":"06fdde03","setTokenURI(uint256,string)":"162094c4","symbol()":"95d89b41","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"constructor\":{\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}]},\"events\":{\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155Metadata.sol\":\"ERC1155Metadata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./base/ERC1155MetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0x0fb7629855ad3af8c8e677fffc7b32c891b9346a2cb86986a0be8ab045fa88a4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}]},"events":{"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155MetadataURI."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC1155/ERC1155Mintable.sol":{"ERC1155Mintable":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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"},{"inputs":[],"name":"MINTER_ROLE","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeMint(address,uint256,uint256,bytes)":"5cfa9297","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155Mintable.sol\":\"ERC1155Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"constructor":{"notice":"Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable"},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC1155/ERC1155TokenReceiver.sol":{"ERC1155TokenReceiver":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"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":"magicValue","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":"magicValue","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":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","kind":"dev","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"Return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (`0xbc197c81`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.","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":{"magicValue":"`0xbc197c81` to accept the transfer, or any other value to reject it."}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"Return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (`0xf23a6e61`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.","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":{"magicValue":"`0xf23a6e61` to accept the transfer, or any other value to reject it."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC1155 Multi Token Standard, Token Receiver (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"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\":\"magicValue\",\"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\":\"magicValue\",\"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\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\",\"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\":{\"magicValue\":\"`0xbc197c81` to accept the transfer, or any other value to reject it.\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\",\"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\":{\"magicValue\":\"`0xf23a6e61` to accept the transfer, or any other value to reject it.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC1155 Multi Token Standard, Token Receiver (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155TokenReceiver.sol\":\"ERC1155TokenReceiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155TokenReceiver} from \\\"./interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, Token Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155TokenReceiver is IERC1155TokenReceiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155TokenReceiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xaa801a5fe8512813bf7bfa2de627c8649e26ac732b0588604e26a0e8e9e111cf\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC1155TokenReceiver."},"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol":{"ERC1155WithOperatorFilterer":{"abi":[{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"values","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":"value","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"constructor":{"params":{"operatorFilterRegistry":"The operator filter registry address. When set to the zero address, checks will be bypassed."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"ERC1155 Multi Token Standard with Operator Filterer (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","isApprovedForAll(address,address)":"e985e9c5","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"values\",\"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\":\"value\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"constructor\":{\"params\":{\"operatorFilterRegistry\":\"The operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"ERC1155 Multi Token Standard with Operator Filterer (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.Sets the address that the contract will make OperatorFilter checks against.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":\"ERC1155WithOperatorFilterer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC1155Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xb9ba2417238c386a02e193f03882682ab0f043bb84eff39287985c11fc2c1bed\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155.Sets the address that the contract will make OperatorFilter checks against."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/ERC1155/base/ERC1155Base.sol":{"ERC1155Base":{"abi":[{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","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":"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155 Multi Token Standard (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"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"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"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\":\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155 Multi Token Standard (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155Base.sol\":\"ERC1155Base\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/token/ERC1155/base/ERC1155BurnableBase.sol":{"ERC1155BurnableBase":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).","errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}}},"title":"ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[],uint256[])":"80534934","burnFrom(address,uint256,uint256)":"124d91e5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).\",\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":\"ERC1155BurnableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."}},"version":1}}},"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol":{"ERC1155DeliverableBase":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).Note: This contract requires AccessControl.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":\"ERC1155DeliverableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."}},"version":1}}},"contracts/token/ERC1155/base/ERC1155MetadataBase.sol":{"ERC1155MetadataBase":{"abi":[{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).","errors":{"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchSetTokenURI(uint256[],string[])":"6706467b","metadataResolver()":"a0c76f62","name()":"06fdde03","setTokenURI(uint256,string)":"162094c4","symbol()":"95d89b41","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).\",\"errors\":{\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}]},\"events\":{\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":\"ERC1155MetadataBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}]},"events":{"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC1155/base/ERC1155MintableBase.sol":{"ERC1155MintableBase":{"abi":[{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).Note: This contract requires AccessControl.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeMint(address,uint256,uint256,bytes)":"5cfa9297"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC1155 (Multi Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":\"ERC1155MintableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."}},"version":1}}},"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol":{"ERC1155WithOperatorFiltererBase":{"abi":[{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155 Multi Token Standard with Operator Filterer (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"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"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"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\":\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":\"ERC1155WithOperatorFiltererBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol":{"ERC1155BurnableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC1155BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"initERC1155BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC1155 Multi Token Standard, optional extension: Burnable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6108f938819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161087790816100828239608051816105570152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063124d91e514610355578063641ff7d91461021b5763805349341461003d57600080fd5b346102165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610074610470565b60243567ffffffffffffffff811161021657610094903690600401610493565b60449291923567ffffffffffffffff8111610216576100b7903690600401610493565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100e4610540565b948683036101ec576100f78683836106e4565b156101a25760005b838110610176575050906101717f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb939260009773ffffffffffffffffffffffffffffffffffffffff8061015f604051978897604089526040890191610503565b93868503602088015216981696610503565b0390a4005b8061019c61018760019387896104c4565b35610193838c8b6104c4565b35908686610764565b016100ff565b73ffffffffffffffffffffffffffffffffffffffff8281887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610252610540565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610328577f921ed8d1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761038c610470565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126024356044356103bb610540565b926103c78486836106e4565b156104265773ffffffffffffffffffffffffffffffffffffffff8086846104157fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b604098610764565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361021657565b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b91908110156104d45760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102165760209260051b809284830137010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106d55732331480156106da575b6106d5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105cb575b506105c857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106c957600091610626575b50386105be565b60203d6020116106c2575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761069557602091839160405281010312610691575190811515820361068e57503861061f565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610631565b6040513d6000823e3d90fd5b503390565b5060183610610587565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561070f575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610709565b909183610772575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156107e857505060005260205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020553880808061076c565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f03dee4c5000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fdfea2646970667358221220aa225935c24b728be6d65626d869a66664f1e63dba866a9c1f694c4588d3cac164736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x8F9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x877 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x557 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x641FF7D9 EQ PUSH2 0x21B JUMPI PUSH4 0x80534934 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x74 PUSH2 0x470 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x216 JUMPI PUSH2 0x94 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x493 JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x216 JUMPI PUSH2 0xB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x493 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xE4 PUSH2 0x540 JUMP JUMPDEST SWAP5 DUP7 DUP4 SUB PUSH2 0x1EC JUMPI PUSH2 0xF7 DUP7 DUP4 DUP4 PUSH2 0x6E4 JUMP JUMPDEST ISZERO PUSH2 0x1A2 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x176 JUMPI POP POP SWAP1 PUSH2 0x171 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 SWAP3 PUSH1 0x0 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x15F PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 PUSH1 0x40 DUP10 MSTORE PUSH1 0x40 DUP10 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST SWAP4 DUP7 DUP6 SUB PUSH1 0x20 DUP9 ADD MSTORE AND SWAP9 AND SWAP7 PUSH2 0x503 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x19C PUSH2 0x187 PUSH1 0x1 SWAP4 DUP8 DUP10 PUSH2 0x4C4 JUMP JUMPDEST CALLDATALOAD PUSH2 0x193 DUP4 DUP13 DUP12 PUSH2 0x4C4 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 DUP7 PUSH2 0x764 JUMP JUMPDEST ADD PUSH2 0xFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x252 PUSH2 0x540 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x328 JUMPI PUSH32 0x921ED8D100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x38C PUSH2 0x470 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x3BB PUSH2 0x540 JUMP JUMPDEST SWAP3 PUSH2 0x3C7 DUP5 DUP7 DUP4 PUSH2 0x6E4 JUMP JUMPDEST ISZERO PUSH2 0x426 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x415 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x764 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x216 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x216 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x216 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x216 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4D4 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x216 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6D5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6DA JUMPI JUMPDEST PUSH2 0x6D5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5CB JUMPI JUMPDEST POP PUSH2 0x5C8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6C9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x626 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5BE JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6C2 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x695 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x691 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x68E JUMPI POP CODESIZE PUSH2 0x61F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x631 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x587 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x70F JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x709 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x772 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x7E8 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x76C JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAA 0x22 MSIZE CALLDATALOAD 0xC2 0x4B PUSH19 0x8BE6D65626D869A66664F1E63DBA866A9C1F69 0x4C GASLIMIT DUP9 0xD3 0xCA 0xC1 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"838:1054:215:-:0;;;;;;;;;;;;;-1:-1:-1;;838:1054:215;;;;-1:-1:-1;;;;;838:1054:215;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;838:1054:215;;;;;;745:39:76;;838:1054:215;;;;;;;;745:39:76;838:1054:215;;;;;;;-1:-1:-1;838:1054:215;;;;;;-1:-1:-1;838:1054:215;;;;;-1:-1:-1;838:1054:215"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1136,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":1171,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":1283,"id":null,"parameterSlots":3,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":1220,"id":null,"parameterSlots":3,"returnSlots":1},"fun_burnToken":{"entryPoint":1892,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_isOperatable":{"entryPoint":1764,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":1344,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1367}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063124d91e514610355578063641ff7d91461021b5763805349341461003d57600080fd5b346102165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610074610470565b60243567ffffffffffffffff811161021657610094903690600401610493565b60449291923567ffffffffffffffff8111610216576100b7903690600401610493565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100e4610540565b948683036101ec576100f78683836106e4565b156101a25760005b838110610176575050906101717f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb939260009773ffffffffffffffffffffffffffffffffffffffff8061015f604051978897604089526040890191610503565b93868503602088015216981696610503565b0390a4005b8061019c61018760019387896104c4565b35610193838c8b6104c4565b35908686610764565b016100ff565b73ffffffffffffffffffffffffffffffffffffffff8281887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610252610540565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610328577f921ed8d1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761038c610470565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126024356044356103bb610540565b926103c78486836106e4565b156104265773ffffffffffffffffffffffffffffffffffffffff8086846104157fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b604098610764565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361021657565b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b91908110156104d45760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102165760209260051b809284830137010190565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106d55732331480156106da575b6106d5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105cb575b506105c857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106c957600091610626575b50386105be565b60203d6020116106c2575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761069557602091839160405281010312610691575190811515820361068e57503861061f565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610631565b6040513d6000823e3d90fd5b503390565b5060183610610587565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561070f575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610709565b909183610772575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156107e857505060005260205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020553880808061076c565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f03dee4c5000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fdfea2646970667358221220aa225935c24b728be6d65626d869a66664f1e63dba866a9c1f694c4588d3cac164736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x641FF7D9 EQ PUSH2 0x21B JUMPI PUSH4 0x80534934 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x74 PUSH2 0x470 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x216 JUMPI PUSH2 0x94 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x493 JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x216 JUMPI PUSH2 0xB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x493 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xE4 PUSH2 0x540 JUMP JUMPDEST SWAP5 DUP7 DUP4 SUB PUSH2 0x1EC JUMPI PUSH2 0xF7 DUP7 DUP4 DUP4 PUSH2 0x6E4 JUMP JUMPDEST ISZERO PUSH2 0x1A2 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x176 JUMPI POP POP SWAP1 PUSH2 0x171 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 SWAP3 PUSH1 0x0 SWAP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x15F PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 PUSH1 0x40 DUP10 MSTORE PUSH1 0x40 DUP10 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST SWAP4 DUP7 DUP6 SUB PUSH1 0x20 DUP9 ADD MSTORE AND SWAP9 AND SWAP7 PUSH2 0x503 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x19C PUSH2 0x187 PUSH1 0x1 SWAP4 DUP8 DUP10 PUSH2 0x4C4 JUMP JUMPDEST CALLDATALOAD PUSH2 0x193 DUP4 DUP13 DUP12 PUSH2 0x4C4 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 DUP7 PUSH2 0x764 JUMP JUMPDEST ADD PUSH2 0xFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x252 PUSH2 0x540 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x328 JUMPI PUSH32 0x921ED8D100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x216 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x216 JUMPI PUSH2 0x38C PUSH2 0x470 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x3BB PUSH2 0x540 JUMP JUMPDEST SWAP3 PUSH2 0x3C7 DUP5 DUP7 DUP4 PUSH2 0x6E4 JUMP JUMPDEST ISZERO PUSH2 0x426 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x415 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x764 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x216 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x216 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x216 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x216 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4D4 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x216 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6D5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6DA JUMPI JUMPDEST PUSH2 0x6D5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5CB JUMPI JUMPDEST POP PUSH2 0x5C8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6C9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x626 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5BE JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6C2 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x695 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x691 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x68E JUMPI POP CODESIZE PUSH2 0x61F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x631 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x587 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x70F JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x709 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x772 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x7E8 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x76C JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAA 0x22 MSIZE CALLDATALOAD 0xC2 0x4B PUSH19 0x8BE6D65626D869A66664F1E63DBA866A9C1F69 0x4C GASLIMIT DUP9 0xD3 0xCA 0xC1 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"838:1054:215:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;838:1054:215;1609:41;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;838:1054:215;13625:10:228;;;;;;838:1054:215;;;;13720:52:228;838:1054:215;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13720:52:228;;;838:1054:215;13637:3:228;13676:6;13684:9;13676:6;838:1054:215;13676:6:228;;;;:::i;:::-;838:1054:215;13684:9:228;;;;;:::i;:::-;838:1054:215;13684:9:228;;;;:::i;:::-;838:1054:215;13614:9:228;;13522:76;838:1054:215;13566:32:228;;;;838:1054:215;13566:32:228;838:1054:215;;;;;;;;13566:32:228;13450:62;13486:26;838:1054:215;13486:26:228;838:1054:215;;13486:26:228;838:1054:215;;;;;;;;;;;;;;;1609:41;;:::i;:::-;838:1054;;;;;;;3174:18:180;;;3170:53;;3111:34:228;838:1054:215;500:10:59;838:1054:215;500:10:59;;;;;;;636:1:180;500:10:59;;;838:1054:215;3170:53:180;3201:22;838:1054:215;3201:22:180;838:1054:215;;;;3201:22:180;838:1054:215;;;;;;;;;;;;;:::i;:::-;;;;;;1609:41;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;838:1054:215;12560:5:228;;;;12581:51;12560:5;;838:1054:215;12560:5:228;838:1054:215;12560:5:228;;:::i;:::-;838:1054:215;;;;;;;;;;;;12581:51:228;;838:1054:215;12450:76:228;838:1054:215;12494:32:228;;;;838:1054:215;12494:32:228;838:1054:215;;;;;;;;12494:32:228;838:1054:215;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;838:1054:215;1029:19:76;838:1054:215;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;838:1054:215;;;;;;1676:74:76;;;;838:1054:215;1676:74:76;;;;;;838:1054:215;1327:10:76;838:1054:215;;;;1744:4:76;838:1054:215;;;;1676:74:76;;;;;;;838:1054:215;1676:74:76;;;1630:120;;;;;1676:74;838:1054:215;1676:74:76;838:1054:215;1676:74:76;;;;838:1054:215;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;838:1054:215;;;;;;;;;;;;;1676:74:76;;;;838:1054:215;;;;;;;;;;;;;;1676:74:76;838:1054:215;;1676:74:76;;;;;;838:1054:215;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;16846:185:228;838:1054:215;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;838:1054:215;;-1:-1:-1;838:1054:215;16997:11:228;838:1054:215;;;;-1:-1:-1;838:1054:215;16997:27:228;838:1054:215;-1:-1:-1;838:1054:215;;;;;-1:-1:-1;838:1054:215;;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;;:::o;18382:326::-;838:1054:215;18395:1:228;838:1054:215;;;;;18395:1:228;838:1054:215;;;;-1:-1:-1;838:1054:215;;;;-1:-1:-1;838:1054:215;;;;;;18550:21:228;;;;;18546:86;;838:1054:215;;18395:1:228;838:1054:215;;;;;18395:1:228;838:1054:215;18650:20:228;838:1054:215;-1:-1:-1;838:1054:215;;;;-1:-1:-1;838:1054:215;;18382:326:228;;;;;;18546:86;18580:52;838:1054:215;;;;;;;18580:52:228;;;;838:1054:215;18580:52:228;;;838:1054:215;;;;;;;;;;;;;18580:52:228"},"gasEstimates":{"creation":{"codeDepositCost":"433400","executionCost":"infinite","totalCost":"infinite"},"external":{"batchBurnFrom(address,uint256[],uint256[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","initERC1155BurnableStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchBurnFrom(address,uint256[],uint256[])":"80534934","burnFrom(address,uint256,uint256)":"124d91e5","initERC1155BurnableStorage()":"641ff7d9"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC1155BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"initERC1155BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Burnable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"initERC1155BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol\":\"ERC1155BurnableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./../base/ERC1155BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155BurnableFacet is ERC1155BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x630d76de99015fbc4d1e090d47cb500ef94eebdd2ed761f5c98eda2db5766ef0\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"initERC1155BurnableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Burnable."}},"version":1}}},"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol":{"ERC1155DeliverableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[],"name":"initERC1155DeliverableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"initERC1155DeliverableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610adb38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610a5990816100828239608051816108f70152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063ba92ca2a1461065e5763e8ab9ccc1461003257600080fd5b346105f15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105f15760043567ffffffffffffffff81116105f157610081903690600401610798565b60243567ffffffffffffffff81116105f1576100a1903690600401610798565b60443567ffffffffffffffff81116105f1576100c1903690600401610798565b90946064359367ffffffffffffffff85116105f157366023860112156105f15784600401359367ffffffffffffffff85116105f15736602486880101116105f15761010a6108e0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205490979060ff16156105f65761016381610839565b9361017160405195866107c9565b818552602085019160051b8101903682116105f157915b8183106105c457505050966101a56101ad92602098993691610851565b933691610851565b926000958187926024604051986101eb857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018b6107c9565b828a52018389013786010152805190825182148015906105b9575b61059157909573ffffffffffffffffffffffffffffffffffffffff1690855b878110610230578680f35b73ffffffffffffffffffffffffffffffffffffffff61024f828461089d565b511661025b828661089d565b51610266838861089d565b51918015610569578261047c575b808a877fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260408051878152886020820152a4803b6102b8575b505050600101610225565b6040517ff23a6e610000000000000000000000000000000000000000000000000000000081528660048201528a602482015282604482015283606482015260a0608482015289518060a4830152818c805b8d8482106104615750508160c4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f87868560209a8601015201168101030191865af1908115610456578b916103d8575b507fffffffff000000000000000000000000000000000000000000000000000000007ff23a6e6100000000000000000000000000000000000000000000000000000000911603156102ad577f40f39d38000000000000000000000000000000000000000000000000000000008a52600452602452604452606487fd5b90506020813d821161044e575b816103f2602093836107c9565b8101031261044a57517fffffffff000000000000000000000000000000000000000000000000000000008116810361044a577fffffffff0000000000000000000000000000000000000000000000000000000061035c565b8a80fd5b3d91506103e5565b6040513d8d823e3d90fd5b810160209081015186830160c401528593508f925001610309565b818a527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408a2073ffffffffffffffffffffffffffffffffffffffff82168b5260205260408a205483810190808211156105265750828b527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408b2073ffffffffffffffffffffffffffffffffffffffff83168c5260205260408b2055610274565b849150608493604051937f42fb00bc0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b60048a7f021149bd000000000000000000000000000000000000000000000000000000008152fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b508351821415610206565b823573ffffffffffffffffffffffffffffffffffffffff811681036105f157815260209283019201610188565b600080fd5b73ffffffffffffffffffffffffffffffffffffffff887f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346105f15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105f1576106956108e0565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361076b577fe8ab9ccc000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156105f15782359167ffffffffffffffff83116105f1576020808501948460051b0101116105f157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761080a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161080a5760051b60200190565b92919061085d81610839565b9361086b60405195866107c9565b602085838152019160051b81019283116105f157905b82821061088d57505050565b8135815260209182019101610881565b80518210156108b15760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a14573233148015610a19575b610a14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561096b575b5061096857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610a08576000916109c6575b503861095e565b6020813d602011610a00575b816109df602093836107c9565b810103126109fc57519081151582036109f95750386109bf565b80fd5b5080fd5b3d91506109d2565b6040513d6000823e3d90fd5b503390565b506018361061092756fea26469706673582212205b5c7c1c41a0097b67ba12408271501e2487c82b3b908187be8340fdfb8766b364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xADB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xA59 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x8F7 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBA92CA2A EQ PUSH2 0x65E JUMPI PUSH4 0xE8AB9CCC EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x5F1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5F1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0x81 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0xA1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0xC1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST SWAP1 SWAP5 PUSH1 0x64 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5F1 JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x5F1 JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5F1 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP9 ADD ADD GT PUSH2 0x5F1 JUMPI PUSH2 0x10A PUSH2 0x8E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP8 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x5F6 JUMPI PUSH2 0x163 DUP2 PUSH2 0x839 JUMP JUMPDEST SWAP4 PUSH2 0x171 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x7C9 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5F1 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5C4 JUMPI POP POP POP SWAP7 PUSH2 0x1A5 PUSH2 0x1AD SWAP3 PUSH1 0x20 SWAP9 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x851 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x851 JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP6 DUP2 DUP8 SWAP3 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP9 PUSH2 0x1EB DUP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD DUP12 PUSH2 0x7C9 JUMP JUMPDEST DUP3 DUP11 MSTORE ADD DUP4 DUP10 ADD CALLDATACOPY DUP7 ADD ADD MSTORE DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x5B9 JUMPI JUMPDEST PUSH2 0x591 JUMPI SWAP1 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x230 JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24F DUP3 DUP5 PUSH2 0x89D JUMP JUMPDEST MLOAD AND PUSH2 0x25B DUP3 DUP7 PUSH2 0x89D JUMP JUMPDEST MLOAD PUSH2 0x266 DUP4 DUP9 PUSH2 0x89D JUMP JUMPDEST MLOAD SWAP2 DUP1 ISZERO PUSH2 0x569 JUMPI DUP3 PUSH2 0x47C JUMPI JUMPDEST DUP1 DUP11 DUP8 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP8 DUP2 MSTORE DUP9 PUSH1 0x20 DUP3 ADD MSTORE LOG4 DUP1 EXTCODESIZE PUSH2 0x2B8 JUMPI JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP7 PUSH1 0x4 DUP3 ADD MSTORE DUP11 PUSH1 0x24 DUP3 ADD MSTORE DUP3 PUSH1 0x44 DUP3 ADD MSTORE DUP4 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE DUP10 MLOAD DUP1 PUSH1 0xA4 DUP4 ADD MSTORE DUP2 DUP13 DUP1 JUMPDEST DUP14 DUP5 DUP3 LT PUSH2 0x461 JUMPI POP POP DUP2 PUSH1 0xC4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP8 DUP7 DUP6 PUSH1 0x20 SWAP11 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x456 JUMPI DUP12 SWAP2 PUSH2 0x3D8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB ISZERO PUSH2 0x2AD JUMPI PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 DUP8 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x44E JUMPI JUMPDEST DUP2 PUSH2 0x3F2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x7C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x44A JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x44A JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x35C JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3E5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP14 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 ADD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP7 DUP4 ADD PUSH1 0xC4 ADD MSTORE DUP6 SWAP4 POP DUP16 SWAP3 POP ADD PUSH2 0x309 JUMP JUMPDEST DUP2 DUP11 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SLOAD DUP4 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x526 JUMPI POP DUP3 DUP12 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP13 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SSTORE PUSH2 0x274 JUMP JUMPDEST DUP5 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x4 DUP11 PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP4 MLOAD DUP3 EQ ISZERO PUSH2 0x206 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x5F1 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x188 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5F1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5F1 JUMPI PUSH2 0x695 PUSH2 0x8E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x76B JUMPI PUSH32 0xE8AB9CCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x5F1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x5F1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x5F1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x80A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x80A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x85D DUP2 PUSH2 0x839 JUMP JUMPDEST SWAP4 PUSH2 0x86B PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x7C9 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x5F1 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x88D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x881 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA14 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA19 JUMPI JUMPDEST PUSH2 0xA14 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x96B JUMPI JUMPDEST POP PUSH2 0x968 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA08 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9C6 JUMPI JUMPDEST POP CODESIZE PUSH2 0x95E JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA00 JUMPI JUMPDEST DUP2 PUSH2 0x9DF PUSH1 0x20 SWAP4 DUP4 PUSH2 0x7C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x9FC JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x9F9 JUMPI POP CODESIZE PUSH2 0x9BF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x9D2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x927 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST TLOAD PUSH29 0x1C41A0097B67BA12408271501E2487C82B3B908187BE8340FDFB8766B3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"847:1069:216:-:0;;;;;;;;;;;;;-1:-1:-1;;847:1069:216;;;;-1:-1:-1;;;;;847:1069:216;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;847:1069:216;;;;;;745:39:76;;847:1069:216;;;;;;;;745:39:76;847:1069:216;;;;;;;-1:-1:-1;847:1069:216;;;;;;-1:-1:-1;847:1069:216;;;;;-1:-1:-1;847:1069:216"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1944,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":2129,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":2105,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1993,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2272,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":2205,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2295}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063ba92ca2a1461065e5763e8ab9ccc1461003257600080fd5b346105f15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105f15760043567ffffffffffffffff81116105f157610081903690600401610798565b60243567ffffffffffffffff81116105f1576100a1903690600401610798565b60443567ffffffffffffffff81116105f1576100c1903690600401610798565b90946064359367ffffffffffffffff85116105f157366023860112156105f15784600401359367ffffffffffffffff85116105f15736602486880101116105f15761010a6108e0565b73ffffffffffffffffffffffffffffffffffffffff811660009081527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205490979060ff16156105f65761016381610839565b9361017160405195866107c9565b818552602085019160051b8101903682116105f157915b8183106105c457505050966101a56101ad92602098993691610851565b933691610851565b926000958187926024604051986101eb857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018b6107c9565b828a52018389013786010152805190825182148015906105b9575b61059157909573ffffffffffffffffffffffffffffffffffffffff1690855b878110610230578680f35b73ffffffffffffffffffffffffffffffffffffffff61024f828461089d565b511661025b828661089d565b51610266838861089d565b51918015610569578261047c575b808a877fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260408051878152886020820152a4803b6102b8575b505050600101610225565b6040517ff23a6e610000000000000000000000000000000000000000000000000000000081528660048201528a602482015282604482015283606482015260a0608482015289518060a4830152818c805b8d8482106104615750508160c4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f87868560209a8601015201168101030191865af1908115610456578b916103d8575b507fffffffff000000000000000000000000000000000000000000000000000000007ff23a6e6100000000000000000000000000000000000000000000000000000000911603156102ad577f40f39d38000000000000000000000000000000000000000000000000000000008a52600452602452604452606487fd5b90506020813d821161044e575b816103f2602093836107c9565b8101031261044a57517fffffffff000000000000000000000000000000000000000000000000000000008116810361044a577fffffffff0000000000000000000000000000000000000000000000000000000061035c565b8a80fd5b3d91506103e5565b6040513d8d823e3d90fd5b810160209081015186830160c401528593508f925001610309565b818a527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408a2073ffffffffffffffffffffffffffffffffffffffff82168b5260205260408a205483810190808211156105265750828b527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861260205260408b2073ffffffffffffffffffffffffffffffffffffffff83168c5260205260408b2055610274565b849150608493604051937f42fb00bc0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b60048a7f021149bd000000000000000000000000000000000000000000000000000000008152fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b508351821415610206565b823573ffffffffffffffffffffffffffffffffffffffff811681036105f157815260209283019201610188565b600080fd5b73ffffffffffffffffffffffffffffffffffffffff887f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b346105f15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105f1576106956108e0565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361076b577fe8ab9ccc000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156105f15782359167ffffffffffffffff83116105f1576020808501948460051b0101116105f157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761080a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161080a5760051b60200190565b92919061085d81610839565b9361086b60405195866107c9565b602085838152019160051b81019283116105f157905b82821061088d57505050565b8135815260209182019101610881565b80518210156108b15760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610a14573233148015610a19575b610a14577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561096b575b5061096857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610a08576000916109c6575b503861095e565b6020813d602011610a00575b816109df602093836107c9565b810103126109fc57519081151582036109f95750386109bf565b80fd5b5080fd5b3d91506109d2565b6040513d6000823e3d90fd5b503390565b506018361061092756fea26469706673582212205b5c7c1c41a0097b67ba12408271501e2487c82b3b908187be8340fdfb8766b364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xBA92CA2A EQ PUSH2 0x65E JUMPI PUSH4 0xE8AB9CCC EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x5F1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5F1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0x81 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0xA1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5F1 JUMPI PUSH2 0xC1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x798 JUMP JUMPDEST SWAP1 SWAP5 PUSH1 0x64 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5F1 JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x5F1 JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x5F1 JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP9 ADD ADD GT PUSH2 0x5F1 JUMPI PUSH2 0x10A PUSH2 0x8E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP8 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x5F6 JUMPI PUSH2 0x163 DUP2 PUSH2 0x839 JUMP JUMPDEST SWAP4 PUSH2 0x171 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x7C9 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x5F1 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x5C4 JUMPI POP POP POP SWAP7 PUSH2 0x1A5 PUSH2 0x1AD SWAP3 PUSH1 0x20 SWAP9 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x851 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x851 JUMP JUMPDEST SWAP3 PUSH1 0x0 SWAP6 DUP2 DUP8 SWAP3 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP9 PUSH2 0x1EB DUP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD DUP12 PUSH2 0x7C9 JUMP JUMPDEST DUP3 DUP11 MSTORE ADD DUP4 DUP10 ADD CALLDATACOPY DUP7 ADD ADD MSTORE DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x5B9 JUMPI JUMPDEST PUSH2 0x591 JUMPI SWAP1 SWAP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x230 JUMPI DUP7 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24F DUP3 DUP5 PUSH2 0x89D JUMP JUMPDEST MLOAD AND PUSH2 0x25B DUP3 DUP7 PUSH2 0x89D JUMP JUMPDEST MLOAD PUSH2 0x266 DUP4 DUP9 PUSH2 0x89D JUMP JUMPDEST MLOAD SWAP2 DUP1 ISZERO PUSH2 0x569 JUMPI DUP3 PUSH2 0x47C JUMPI JUMPDEST DUP1 DUP11 DUP8 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP8 DUP2 MSTORE DUP9 PUSH1 0x20 DUP3 ADD MSTORE LOG4 DUP1 EXTCODESIZE PUSH2 0x2B8 JUMPI JUMPDEST POP POP POP PUSH1 0x1 ADD PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP7 PUSH1 0x4 DUP3 ADD MSTORE DUP11 PUSH1 0x24 DUP3 ADD MSTORE DUP3 PUSH1 0x44 DUP3 ADD MSTORE DUP4 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP3 ADD MSTORE DUP10 MLOAD DUP1 PUSH1 0xA4 DUP4 ADD MSTORE DUP2 DUP13 DUP1 JUMPDEST DUP14 DUP5 DUP3 LT PUSH2 0x461 JUMPI POP POP DUP2 PUSH1 0xC4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP8 DUP7 DUP6 PUSH1 0x20 SWAP11 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP2 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x456 JUMPI DUP12 SWAP2 PUSH2 0x3D8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB ISZERO PUSH2 0x2AD JUMPI PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 DUP11 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 DUP8 REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE DUP3 GT PUSH2 0x44E JUMPI JUMPDEST DUP2 PUSH2 0x3F2 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x7C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x44A JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x44A JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x35C JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3E5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP14 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 ADD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD DUP7 DUP4 ADD PUSH1 0xC4 ADD MSTORE DUP6 SWAP4 POP DUP16 SWAP3 POP ADD PUSH2 0x309 JUMP JUMPDEST DUP2 DUP11 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SLOAD DUP4 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x526 JUMPI POP DUP3 DUP12 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP13 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SSTORE PUSH2 0x274 JUMP JUMPDEST DUP5 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST PUSH1 0x4 DUP11 PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST POP DUP4 MLOAD DUP3 EQ ISZERO PUSH2 0x206 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x5F1 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x188 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x5F1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x5F1 JUMPI PUSH2 0x695 PUSH2 0x8E0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x76B JUMPI PUSH32 0xE8AB9CCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x5F1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x5F1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x5F1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x80A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x80A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x85D DUP2 PUSH2 0x839 JUMP JUMPDEST SWAP4 PUSH2 0x86B PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x7C9 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x5F1 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x88D JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x881 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xA14 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xA19 JUMPI JUMPDEST PUSH2 0xA14 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x96B JUMPI JUMPDEST POP PUSH2 0x968 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA08 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x9C6 JUMPI JUMPDEST POP CODESIZE PUSH2 0x95E JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xA00 JUMPI JUMPDEST DUP2 PUSH2 0x9DF PUSH1 0x20 SWAP4 DUP4 PUSH2 0x7C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x9FC JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x9F9 JUMPI POP CODESIZE PUSH2 0x9BF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x9D2 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x927 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST TLOAD PUSH29 0x1C41A0097B67BA12408271501E2487C82B3B908187BE8340FDFB8766B3 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"847:1069:216:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:41;;:::i;:::-;974:8:208;;;847:1069:216;;;;;;;;;;;;;;;;3741:25:41;3737:66;;974:8:208;;;:::i;:::-;847:1069:216;974:8:208;847:1069:216;;974:8:208;;;:::i;:::-;;;;847:1069:216;974:8:208;;;;;;;847:1069:216;;974:8:208;;;;;;;;;;;847:1069:216;;;;974:8:208;;847:1069:216;;;;;974:8:208;;:::i;:::-;847:1069:216;;974:8:208;;:::i;:::-;;847:1069:216;;;;;;;;974:8:208;;;;847:1069:216;974:8:208;;;;;;:::i;:::-;;;;847:1069:216;974:8:208;;;;;;;;847:1069:216;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;11717:9;;974:8:208;;;11717:9:228;11728:10;;;;;;847:1069:216;;;11740:3:228;974:8:208;11778:13:228;;;;:::i;:::-;847:1069:216;974:8:208;11793:6:228;;;;:::i;:::-;847:1069:216;11801:9:228;;;;:::i;:::-;847:1069:216;8152:16:228;;;8148:55;;17957:10;17953:320;;11740:3;847:1069:216;;;8258:49:228;847:1069:216;;;;;;;;;;;8258:49:228;376:58:354;;8318:110:228;;11740:3;;;;762:1:41;847:1069:216;11717:9:228;;8318:110;847:1069:216;;;19356:74:228;;;847:1069:216;19356:74:228;;847:1069:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;974:8:208;847:1069:216;;;;;;;;;;974:8:208;;847:1069:216;;19356:74:228;;;;;;;;;;;;;;;847:1069:216;;;;;;19356:101:228;19352:168;8318:110;19352:168;19478:42;;;847:1069:216;;;;;;;19478:42:228;;19356:74;;;847:1069:216;19356:74:228;;;;;;;;;847:1069:216;19356:74:228;;;:::i;:::-;;;847:1069:216;;;;;;;;;;;;;19356:74:228;;847:1069:216;;;;19356:74:228;;;-1:-1:-1;19356:74:228;;;847:1069:216;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;847:1069:216;;-1:-1:-1;847:1069:216;;;17953:320:228;847:1069:216;;;;;;;;;974:8:208;;;847:1069:216;;;;;;;;;;;18123:21:228;;;;;18119:80;;847:1069:216;;;;;;;;;;974:8:208;;;847:1069:216;;;;;;;;17953:320:228;;18119:80;847:1069:216;;;18153:46:228;847:1069:216;;;18153:46:228;;;;847:1069:216;18153:46:228;;847:1069:216;;;;;;;;;;;;;18153:46:228;8148:55;847:1069:216;8177:26:228;;;;;11616:86;847:1069:216;11676:26:228;;;;;11620:47;847:1069:216;;;11644:23:228;;;11620:47;;974:8:208;;;;;;;;;;;;847:1069:216;974:8:208;;;;;;;;847:1069:216;974:8:208;;3737:66:41;974:8:208;3775:28:41;;847:1069:216;3775:28:41;847:1069:216;;;974:8:208;847:1069:216;;;;3775:28:41;847:1069:216;;;;;;;;;;;1633:41;;:::i;:::-;974:8:208;847:1069:216;;;974:8:208;;;3174:18:180;;;3170:53;;2860:37:228;847:1069:216;500:10:59;847:1069:216;500:10:59;;;;;;;636:1:180;500:10:59;;;847:1069:216;3170:53:180;3201:22;847:1069:216;3201:22:180;847:1069:216;;;;3201:22:180;847:1069:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;974:8:208:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;974:8:208;;;;;-1:-1:-1;974:8:208;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;847:1069:216;974:8:208;847:1069:216;;974:8:208;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;847:1069:216;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;974:8:208;1029:19:76;974:8:208;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;847:1069:216;;;;;;1676:74:76;;;;847:1069:216;1676:74:76;;;;;;847:1069:216;1327:10:76;847:1069:216;;;;1744:4:76;847:1069:216;;;;1676:74:76;;;;;;;847:1069:216;1676:74:76;;;1630:120;;;;;1676:74;847:1069:216;1676:74:76;;847:1069:216;1676:74:76;;;;;;847:1069:216;1676:74:76;;;:::i;:::-;;;847:1069:216;;;;;;;;;;;;;1676:74:76;;;;847:1069:216;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;847:1069:216;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"529800","executionCost":"infinite","totalCost":"infinite"},"external":{"initERC1155DeliverableStorage()":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initERC1155DeliverableStorage()":"ba92ca2a","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"initERC1155DeliverableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC1155DeliverableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"initERC1155DeliverableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol\":\"ERC1155DeliverableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155DeliverableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../base/ERC1155DeliverableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155DeliverableFacet is ERC1155DeliverableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155DeliverableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x62902659d29ea676a988f45b5b8c8ed16e1470b11f1b61e82809789371ff8458\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"initERC1155DeliverableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Deliverable."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."}},"version":1}}},"contracts/token/ERC1155/facets/ERC1155Facet.sol":{"ERC1155Facet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","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":"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"initERC1155Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"initERC1155Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155 Multi Token Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6113f938819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516113779081610082823960805181610f420152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610be55780632eb2c2d61461080e5780634e1273f414610650578063a22cb46514610525578063c34106c8146103eb578063e985e9c5146103375763f242432a1461006857600080fd5b346103325760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761009f610c53565b6100a7610c76565b604435906064359260843567ffffffffffffffff8111610332576100cf903690600401610cca565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100fa610f2b565b73ffffffffffffffffffffffffffffffffffffffff831695861561030857610123828783611062565b156102be5773ffffffffffffffffffffffffffffffffffffffff9161014c8a8a878a87966110e2565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61018957005b602092610197913691610ec6565b926101ed60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906112e2565b03816000865af19081156102b2577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610283575b50160361025057005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102a5915060203d6020116102ab575b61029d8183610df2565b8101906112aa565b38610247565b503d610293565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761036e610c53565b73ffffffffffffffffffffffffffffffffffffffff61038b610c76565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103325760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257610422610f2b565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036104f8577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761055c610c53565b602435908115158092036103325773ffffffffffffffffffffffffffffffffffffffff80610588610f2b565b169116918183146106225760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325760043567ffffffffffffffff81116103325761069f903690600401610c99565b9060243567ffffffffffffffff8111610332576106c0903690600401610c99565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036107e4576106f285610e62565b946107006040519687610df2565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061072d82610e62565b0136602088013760005b81811061075857604051602080825281906107549082018a610cf8565b0390f35b610763818388610da5565b3573ffffffffffffffffffffffffffffffffffffffff811681036103325761079890610790838689610da5565b359086610d2c565b9087518110156107b55760019160208260051b8a01015201610737565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346103325760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257610845610c53565b61084d610c76565b60443567ffffffffffffffff81116103325761086d903690600401610c99565b929060643567ffffffffffffffff81116103325761088f903690600401610c99565b9360843567ffffffffffffffff8111610332576108b0903690600401610cca565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612956108dd610f2b565b73ffffffffffffffffffffffffffffffffffffffff831697881561030857898b036107e45761090d828483611062565b15610b9b5760005b8b8110610b6c575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610991604051928392604084526109838d60408601908d610db5565b918483036020860152610db5565b0390a43b61099b57005b6020946109b06109b8926109c0953691610e7a565b993691610e7a565b953691610ec6565b92610a7060405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610a40610a1060a485018b610cf8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610cf8565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526112e2565b03816000875af19081156102b2577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610b4d575b501603610ad357005b610b4990610b196040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610cf8565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610cf8565b0390fd5b610b66915060203d6020116102ab5761029d8183610df2565b86610aca565b80610b958c610b8b8f94610b83816001978d610da5565b35928d610da5565b35908888876110e2565b01610915565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610332576020610c4b610c21610c53565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610d2c565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033257565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033257565b9181601f840112156103325782359167ffffffffffffffff8311610332576020808501948460051b01011161033257565b9181601f840112156103325782359167ffffffffffffffff8311610332576020838186019501011161033257565b906020808351928381520192019060005b818110610d165750505090565b8251845260209384019390920191600101610d09565b909173ffffffffffffffffffffffffffffffffffffffff831615610d7b5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156107b55760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103325760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e3357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610e335760051b60200190565b929190610e8681610e62565b93610e946040519586610df2565b602085838152019160051b810192831161033257905b828210610eb657505050565b8135815260209182019101610eaa565b92919267ffffffffffffffff8211610e335760405191610f0e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610df2565b829481845281830111610332578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611053573233148015611058575b611053577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610fb6575b50610fb357503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156102b257600091611011575b5038610fa9565b6020813d60201161104b575b8161102a60209383610df2565b81010312611047575190811515820361104457503861100a565b80fd5b5080fd5b3d915061101d565b503390565b5060183610610f72565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561108d575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611087565b919290846110f2575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260406000205490858203918083101561124e575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff82160361116a575b506110eb565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156111f057505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080611164565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261033257517fffffffff00000000000000000000000000000000000000000000000000000000811681036103325790565b919082519283825260005b84811061132c5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016112ed56fea26469706673582212207fc6efe08f53aa882156871998134e6189c2187487a12feeea5678b6b7f3a58964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x13F9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1377 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xF42 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xBE5 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x80E JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x650 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x525 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x337 JUMPI PUSH4 0xF242432A EQ PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x9F PUSH2 0xC53 JUMP JUMPDEST PUSH2 0xA7 PUSH2 0xC76 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0xCF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCCA JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xFA PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x308 JUMPI PUSH2 0x123 DUP3 DUP8 DUP4 PUSH2 0x1062 JUMP JUMPDEST ISZERO PUSH2 0x2BE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x14C DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x10E2 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x189 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x197 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xEC6 JUMP JUMPDEST SWAP3 PUSH2 0x1ED PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x12E2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x283 JUMPI JUMPDEST POP AND SUB PUSH2 0x250 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2A5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2AB JUMPI JUMPDEST PUSH2 0x29D DUP2 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x12AA JUMP JUMPDEST CODESIZE PUSH2 0x247 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x293 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x36E PUSH2 0xC53 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x38B PUSH2 0xC76 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x422 PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x4F8 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x55C PUSH2 0xC53 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x332 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x588 PUSH2 0xF2B JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x622 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x69F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x6C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x7E4 JUMPI PUSH2 0x6F2 DUP6 PUSH2 0xE62 JUMP JUMPDEST SWAP5 PUSH2 0x700 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xDF2 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x72D DUP3 PUSH2 0xE62 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x758 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x754 SWAP1 DUP3 ADD DUP11 PUSH2 0xCF8 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x763 DUP2 DUP4 DUP9 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x332 JUMPI PUSH2 0x798 SWAP1 PUSH2 0x790 DUP4 DUP7 DUP10 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xD2C JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x737 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x845 PUSH2 0xC53 JUMP JUMPDEST PUSH2 0x84D PUSH2 0xC76 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x86D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x88F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x8B0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCCA JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x8DD PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x308 JUMPI DUP10 DUP12 SUB PUSH2 0x7E4 JUMPI PUSH2 0x90D DUP3 DUP5 DUP4 PUSH2 0x1062 JUMP JUMPDEST ISZERO PUSH2 0xB9B JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xB6C JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x991 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x983 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xDB5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xDB5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x99B JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x9B0 PUSH2 0x9B8 SWAP3 PUSH2 0x9C0 SWAP6 CALLDATASIZE SWAP2 PUSH2 0xE7A JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xE7A JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xEC6 JUMP JUMPDEST SWAP3 PUSH2 0xA70 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xA40 PUSH2 0xA10 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xCF8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xCF8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x12E2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xB4D JUMPI JUMPDEST POP AND SUB PUSH2 0xAD3 JUMPI STOP JUMPDEST PUSH2 0xB49 SWAP1 PUSH2 0xB19 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xCF8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xCF8 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB66 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2AB JUMPI PUSH2 0x29D DUP2 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP7 PUSH2 0xACA JUMP JUMPDEST DUP1 PUSH2 0xB95 DUP13 PUSH2 0xB8B DUP16 SWAP5 PUSH2 0xB83 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x10E2 JUMP JUMPDEST ADD PUSH2 0x915 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH1 0x20 PUSH2 0xC4B PUSH2 0xC21 PUSH2 0xC53 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xD2C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x332 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x332 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x332 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xD16 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD09 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xD7B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xE33 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE33 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xE86 DUP2 PUSH2 0xE62 JUMP JUMPDEST SWAP4 PUSH2 0xE94 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xDF2 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x332 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xEB6 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xEAA JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE33 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xF0E PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xDF2 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x332 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1053 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1058 JUMPI JUMPDEST PUSH2 0x1053 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xFB6 JUMPI JUMPDEST POP PUSH2 0xFB3 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1011 JUMPI JUMPDEST POP CODESIZE PUSH2 0xFA9 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104B JUMPI JUMPDEST DUP2 PUSH2 0x102A PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1047 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x1044 JUMPI POP CODESIZE PUSH2 0x100A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x101D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x108D JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1087 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x10F2 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x124E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x116A JUMPI JUMPDEST POP PUSH2 0x10EB JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x11F0 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x1164 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x332 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x332 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x132C JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x12ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH32 0xC6EFE08F53AA882156871998134E6189C2187487A12FEEEA5678B6B7F3A58964 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"792:1007:217:-:0;;;;;;;;;;;;;-1:-1:-1;;792:1007:217;;;;-1:-1:-1;;;;;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;792:1007:217;;;;;;745:39:76;;792:1007:217;;;;;;;;745:39:76;792:1007:217;;;;;;;-1:-1:-1;792:1007:217;;;;;;-1:-1:-1;792:1007:217;;;;;-1:-1:-1;792:1007:217"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3190,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3225,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":3706,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":3782,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":4778,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":3274,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":3155,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":3320,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":3509,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":4834,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":3682,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":3493,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3570,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":3372,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_isOperatable":{"entryPoint":4194,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":3883,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferToken":{"entryPoint":4322,"id":25299,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3906}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610be55780632eb2c2d61461080e5780634e1273f414610650578063a22cb46514610525578063c34106c8146103eb578063e985e9c5146103375763f242432a1461006857600080fd5b346103325760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761009f610c53565b6100a7610c76565b604435906064359260843567ffffffffffffffff8111610332576100cf903690600401610cca565b927f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936100fa610f2b565b73ffffffffffffffffffffffffffffffffffffffff831695861561030857610123828783611062565b156102be5773ffffffffffffffffffffffffffffffffffffffff9161014c8a8a878a87966110e2565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b61018957005b602092610197913691610ec6565b926101ed60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906112e2565b03816000865af19081156102b2577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610283575b50160361025057005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102a5915060203d6020116102ab575b61029d8183610df2565b8101906112aa565b38610247565b503d610293565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761036e610c53565b73ffffffffffffffffffffffffffffffffffffffff61038b610c76565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103325760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257610422610f2b565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036104f8577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325761055c610c53565b602435908115158092036103325773ffffffffffffffffffffffffffffffffffffffff80610588610f2b565b169116918183146106225760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325760043567ffffffffffffffff81116103325761069f903690600401610c99565b9060243567ffffffffffffffff8111610332576106c0903690600401610c99565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036107e4576106f285610e62565b946107006040519687610df2565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061072d82610e62565b0136602088013760005b81811061075857604051602080825281906107549082018a610cf8565b0390f35b610763818388610da5565b3573ffffffffffffffffffffffffffffffffffffffff811681036103325761079890610790838689610da5565b359086610d2c565b9087518110156107b55760019160208260051b8a01015201610737565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346103325760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257610845610c53565b61084d610c76565b60443567ffffffffffffffff81116103325761086d903690600401610c99565b929060643567ffffffffffffffff81116103325761088f903690600401610c99565b9360843567ffffffffffffffff8111610332576108b0903690600401610cca565b9390917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612956108dd610f2b565b73ffffffffffffffffffffffffffffffffffffffff831697881561030857898b036107e45761090d828483611062565b15610b9b5760005b8b8110610b6c575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610991604051928392604084526109838d60408601908d610db5565b918483036020860152610db5565b0390a43b61099b57005b6020946109b06109b8926109c0953691610e7a565b993691610e7a565b953691610ec6565b92610a7060405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610a40610a1060a485018b610cf8565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610cf8565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526112e2565b03816000875af19081156102b2577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610b4d575b501603610ad357005b610b4990610b196040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610cf8565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610cf8565b0390fd5b610b66915060203d6020116102ab5761029d8183610df2565b86610aca565b80610b958c610b8b8f94610b83816001978d610da5565b35928d610da5565b35908888876110e2565b01610915565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103325760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610332576020610c4b610c21610c53565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610d2c565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033257565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033257565b9181601f840112156103325782359167ffffffffffffffff8311610332576020808501948460051b01011161033257565b9181601f840112156103325782359167ffffffffffffffff8311610332576020838186019501011161033257565b906020808351928381520192019060005b818110610d165750505090565b8251845260209384019390920191600101610d09565b909173ffffffffffffffffffffffffffffffffffffffff831615610d7b5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156107b55760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103325760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e3357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610e335760051b60200190565b929190610e8681610e62565b93610e946040519586610df2565b602085838152019160051b810192831161033257905b828210610eb657505050565b8135815260209182019101610eaa565b92919267ffffffffffffffff8211610e335760405191610f0e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610df2565b829481845281830111610332578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611053573233148015611058575b611053577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610fb6575b50610fb357503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156102b257600091611011575b5038610fa9565b6020813d60201161104b575b8161102a60209383610df2565b81010312611047575190811515820361104457503861100a565b80fd5b5080fd5b3d915061101d565b503390565b5060183610610f72565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561108d575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080611087565b919290846110f2575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260406000205490858203918083101561124e575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff82160361116a575b506110eb565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156111f057505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080611164565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261033257517fffffffff00000000000000000000000000000000000000000000000000000000811681036103325790565b919082519283825260005b84811061132c5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016112ed56fea26469706673582212207fc6efe08f53aa882156871998134e6189c2187487a12feeea5678b6b7f3a58964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xBE5 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x80E JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x650 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x525 JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x337 JUMPI PUSH4 0xF242432A EQ PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x9F PUSH2 0xC53 JUMP JUMPDEST PUSH2 0xA7 PUSH2 0xC76 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0xCF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCCA JUMP JUMPDEST SWAP3 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0xFA PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP6 DUP7 ISZERO PUSH2 0x308 JUMPI PUSH2 0x123 DUP3 DUP8 DUP4 PUSH2 0x1062 JUMP JUMPDEST ISZERO PUSH2 0x2BE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x14C DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x10E2 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x189 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x197 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xEC6 JUMP JUMPDEST SWAP3 PUSH2 0x1ED PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x12E2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x283 JUMPI JUMPDEST POP AND SUB PUSH2 0x250 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2A5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2AB JUMPI JUMPDEST PUSH2 0x29D DUP2 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x12AA JUMP JUMPDEST CODESIZE PUSH2 0x247 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x293 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x36E PUSH2 0xC53 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x38B PUSH2 0xC76 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x422 PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x4F8 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x55C PUSH2 0xC53 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x332 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x588 PUSH2 0xF2B JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x622 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x69F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x6C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x7E4 JUMPI PUSH2 0x6F2 DUP6 PUSH2 0xE62 JUMP JUMPDEST SWAP5 PUSH2 0x700 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xDF2 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x72D DUP3 PUSH2 0xE62 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x758 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x754 SWAP1 DUP3 ADD DUP11 PUSH2 0xCF8 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x763 DUP2 DUP4 DUP9 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x332 JUMPI PUSH2 0x798 SWAP1 PUSH2 0x790 DUP4 DUP7 DUP10 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xD2C JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x737 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH2 0x845 PUSH2 0xC53 JUMP JUMPDEST PUSH2 0x84D PUSH2 0xC76 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x86D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x88F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xC99 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x332 JUMPI PUSH2 0x8B0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCCA JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP6 PUSH2 0x8DD PUSH2 0xF2B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP8 DUP9 ISZERO PUSH2 0x308 JUMPI DUP10 DUP12 SUB PUSH2 0x7E4 JUMPI PUSH2 0x90D DUP3 DUP5 DUP4 PUSH2 0x1062 JUMP JUMPDEST ISZERO PUSH2 0xB9B JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xB6C JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x991 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x983 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xDB5 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xDB5 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x99B JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x9B0 PUSH2 0x9B8 SWAP3 PUSH2 0x9C0 SWAP6 CALLDATASIZE SWAP2 PUSH2 0xE7A JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xE7A JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xEC6 JUMP JUMPDEST SWAP3 PUSH2 0xA70 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xA40 PUSH2 0xA10 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xCF8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xCF8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x12E2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xB4D JUMPI JUMPDEST POP AND SUB PUSH2 0xAD3 JUMPI STOP JUMPDEST PUSH2 0xB49 SWAP1 PUSH2 0xB19 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xCF8 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xCF8 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB66 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2AB JUMPI PUSH2 0x29D DUP2 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP7 PUSH2 0xACA JUMP JUMPDEST DUP1 PUSH2 0xB95 DUP13 PUSH2 0xB8B DUP16 SWAP5 PUSH2 0xB83 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xDA5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x10E2 JUMP JUMPDEST ADD PUSH2 0x915 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x332 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x332 JUMPI PUSH1 0x20 PUSH2 0xC4B PUSH2 0xC21 PUSH2 0xC53 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xD2C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x332 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x332 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x332 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x332 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xD16 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xD09 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xD7B JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x332 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xE33 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE33 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xE86 DUP2 PUSH2 0xE62 JUMP JUMPDEST SWAP4 PUSH2 0xE94 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xDF2 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x332 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xEB6 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xEAA JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE33 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0xF0E PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xDF2 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x332 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1053 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1058 JUMPI JUMPDEST PUSH2 0x1053 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xFB6 JUMPI JUMPDEST POP PUSH2 0xFB3 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1011 JUMPI JUMPDEST POP CODESIZE PUSH2 0xFA9 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104B JUMPI JUMPDEST DUP2 PUSH2 0x102A PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDF2 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1047 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x1044 JUMPI POP CODESIZE PUSH2 0x100A JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x101D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x108D JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x1087 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x10F2 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x124E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x116A JUMPI JUMPDEST POP PUSH2 0x10EB JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x11F0 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x1164 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x332 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x332 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x132C JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x12ED JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH32 0xC6EFE08F53AA882156871998134E6189C2187487A12FEEEA5678B6B7F3A58964 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"792:1007:217:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;792:1007:217;1516:41;;;:::i;:::-;792:1007;;;4536:16:228;;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;792:1007:217;4720:5:228;;;;;;;;;:::i;:::-;792:1007:217;;;;;;;4742:43:228;792:1007:217;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;792:1007:217;4796:104:228;792:1007:217;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;792:1007:217;19356:74:228;;792:1007:217;19356:74:228;;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;792:1007:217;19356:74:228;;;;;;;;792:1007:217;19356:74:228;792:1007:217;19356:74:228;792:1007:217;19356:74:228;;;4796:104;792:1007:217;;19356:101:228;19352:168;;792:1007:217;19352:168:228;19478:42;792:1007:217;19478:42:228;792:1007:217;;;;;;;;19478:42:228;19356:74;;;;792:1007:217;19356:74:228;792:1007:217;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;792:1007:217;;;;;;;;;4601:76:228;792:1007:217;4645:32:228;;;;792:1007:217;4645:32:228;792:1007:217;;;;;;;;4645:32:228;4532:59;4561:30;792:1007:217;4561:30:228;792:1007:217;;4561:30:228;792:1007:217;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;792:1007:217;-1:-1:-1;792:1007:217;14847:11:228;792:1007:217;;;;-1:-1:-1;792:1007:217;14847:28:228;792:1007:217;-1:-1:-1;792:1007:217;;;;;;-1:-1:-1;792:1007:217;;;;;;;;;;;;;;;;;;;;;;1516:41;;:::i;:::-;792:1007;;;;;;;3174:18:180;;;3170:53;;2109:26:228;792:1007:217;500:10:59;792:1007:217;500:10:59;;;792:1007:217;;;;636:1:180;792:1007:217;;;;3170:53:180;3201:22;792:1007:217;3201:22:180;792:1007:217;;;;3201:22:180;792:1007:217;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1516:41;;;:::i;:::-;792:1007;;;14276:18:228;;;;14272:64;;792:1007:217;14401:42:228;14346:19;792:1007:217;-1:-1:-1;792:1007:217;14346:11:228;792:1007:217;;;-1:-1:-1;792:1007:217;;-1:-1:-1;792:1007:217;;;;-1:-1:-1;792:1007:217;;;;;;;;;;;;;;;;14401:42:228;792:1007:217;14272:64:228;14303:33;;792:1007:217;14303:33:228;792:1007:217;;;;14303:33:228;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;16129:20:228;;;;16125:59;;792:1007:217;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;792:1007:217;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;792:1007:217;;;;;;;;16306:30:228;16329:6;;;;;;:::i;:::-;792:1007:217;16306:30:228;;;:::i;:::-;792:1007:217;;;;;;;;;;;;;;;;;;;16250:9:228;;792:1007:217;;;;;;;;;;16125:59:228;16158:26;792:1007:217;16158:26:228;792:1007:217;;16158:26:228;792:1007:217;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;792:1007:217;1516:41;;;:::i;:::-;792:1007;;;6523:16:228;;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;792:1007:217;6801:10:228;;;;;;792:1007:217;;;;;;;;;;6904:44:228;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;792:1007:217;6959:111:228;792:1007:217;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;792:1007:217;20263:81:228;;792:1007:217;20263:81:228;;792:1007:217;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;792:1007:217;20263:81:228;;;;;;;;792:1007:217;20263:81:228;792:1007:217;20263:81:228;792:1007:217;20263:81:228;;;6959:111;792:1007:217;;20263:107:228;20259:181;;792:1007:217;20259:181:228;1878:53;792:1007:217;1878:53:228;792:1007:217;;20391:49:228;;;;;;792:1007:217;20391:49:228;;792:1007:217;;;1878:53:228;;;792:1007:217;1878:53:228;;;;:::i;:::-;;792:1007:217;1878:53:228;;;;792:1007:217;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;792:1007:217;20263:81:228;792:1007:217;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;792:1007:217;6860:6:228;;;:::i;:::-;792:1007:217;6868:9:228;;;:::i;:::-;792:1007:217;6868:9:228;;;;;:::i;:::-;792:1007:217;6790:9:228;;6698:76;792:1007:217;6742:32:228;;;;792:1007:217;6742:32:228;792:1007:217;;;;;;;;6742:32:228;792:1007:217;;;;;;;;;;;;1730:44:206;792:1007:217;;:::i;:::-;;;;;1730:44:206;:::i;:::-;792:1007:217;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;792:1007:217;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;15240:220:228;;;792:1007:217;;;15358:19:228;15354:61;;15375:1;792:1007:217;;;;;15375:1:228;792:1007:217;15432:21:228;792:1007:217;-1:-1:-1;792:1007:217;;;;-1:-1:-1;792:1007:217;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;792:1007:217;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;792:1007:217;;;;;-1:-1:-1;792:1007:217;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;792:1007:217;;;;;;:::o;907:917:76:-;792:1007:217;1029:19:76;792:1007:217;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;792:1007:217;;;;;;1676:74:76;;;;792:1007:217;1676:74:76;;;;;;792:1007:217;1327:10:76;792:1007:217;;;;1744:4:76;792:1007:217;;;;1676:74:76;;;;;;;792:1007:217;1676:74:76;;;1630:120;;;;;1676:74;792:1007:217;1676:74:76;;792:1007:217;1676:74:76;;;;;;792:1007:217;1676:74:76;;;:::i;:::-;;;792:1007:217;;;;;;;;;;;;;1676:74:76;;;;792:1007:217;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;16846:185:228;792:1007:217;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;792:1007:217;;-1:-1:-1;792:1007:217;16997:11:228;792:1007:217;;;;-1:-1:-1;792:1007:217;16997:27:228;792:1007:217;-1:-1:-1;792:1007:217;;;;;-1:-1:-1;792:1007:217;;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;792:1007:217;17163:1:228;792:1007:217;;;;;17163:1:228;792:1007:217;;;;-1:-1:-1;792:1007:217;;;;-1:-1:-1;792:1007:217;;;;;;17330:29:228;;;;;17326:98;;792:1007:217;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;792:1007:217;17163:1:228;792:1007:217;;;;;17163:1:228;792:1007:217;;;;-1:-1:-1;792:1007:217;;;;-1:-1:-1;792:1007:217;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;792:1007:217;;17640:48:228;;;792:1007:217;;;17640:48:228;;;792:1007:217;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;792:1007:217;;17368:56:228;;;792:1007:217;;;;;17368:56:228;;;792:1007:217;;;;;;;;;;;;;;;;;;;20391:49:228;792:1007:217;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;792:1007:217;;;;;;;;;;;-1:-1:-1;792:1007:217;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"996600","executionCost":"infinite","totalCost":"infinite"},"external":{"balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","initERC1155Storage()":"infinite","isApprovedForAll(address,address)":"2629","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","initERC1155Storage()":"c34106c8","isApprovedForAll(address,address)":"e985e9c5","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"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\":\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"initERC1155Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"initERC1155Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155 Multi Token Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"initERC1155Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155Facet.sol\":\"ERC1155Facet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155Base is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        ERC1155Storage.layout().safeTransferFrom(_msgSender(), from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        ERC1155Storage.layout().safeBatchTransferFrom(_msgSender(), from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x5bff91f715a327cc96301efca44535a54f49d8d4369683144bbb0aa0474aa359\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155Base} from \\\"./../base/ERC1155Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155Facet is ERC1155Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x01e1c09bd9a1b50ef61550582b437738d5ddc921d1510f2427e1305587083689\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"initERC1155Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol":{"ERC1155MetadataFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"}],"name":"initERC1155MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"initERC1155MetadataStorage(string,string,address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155 Multi Token Standard, optional extension: Metadata (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6110c238819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516110409081610082823960805181610eed0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610c135780630e89341c14610a62578063162094c41461099b578063345c14ad146103375780636706467b1461014a57806395d89b41146100df5763a0c76f621461006957600080fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b600080fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5761014661013a7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e14565b60405191829182610c91565b0390f35b346100da5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760043567ffffffffffffffff81116100da57610199903690600401610d09565b60243567ffffffffffffffff81116100da576101b9903690600401610d09565b9182810361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102df57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301915b848110156102dd57818110156102ae578060051b9081850135848112156100da5785019182359267ffffffffffffffff84116100da576020019083360382136100da576001937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916102a56040519283928d01359583610d3a565b0390a20161022a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100da5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760043567ffffffffffffffff81116100da57610386903690600401610cdb565b60243567ffffffffffffffff81116100da576103a6903690600401610cdb565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036100da576103d2610ed6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361096e57507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf5854600181101561093c575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161080d5781906104a28454610d80565b601f81116108e9575b50600090601f83116001146108475760009261083c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161080d5761052d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610d80565b601f8111610789575b506000601f821160011461068e57819293600092610683575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f0e89341c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050838061054f565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8681106107715750836001959610610739575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556105a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061070c565b909260206001819286860135815501940191016106f9565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610803575b601f0160051c01905b8181106107f75750610536565b600081556001016107ea565b90915081906107e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905086806104c2565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106108d15750908460019594939210610899575b505050811b0190556104f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905586808061088c565b91936020600181928787013581550195019201610876565b909150836000526020600020601f840160051c81019160208510610932575b90601f859493920160051c01905b81811061092357506104ab565b60008155849350600101610916565b9091508190610908565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100da5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760243567ffffffffffffffff81116100da576109ea903690600401610cdb565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102df57610a5d7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583610d3a565b0390a2005b346100da5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da576044600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051928380927ff724dad700000000000000000000000000000000000000000000000000000000825230600483015260043560248301525afa908115610c0757600091610b24575b604051806101468482610c91565b3d8083833e610b338183610dd3565b810190602081830312610bff5780519067ffffffffffffffff8211610c03570181601f82011215610bff5780519267ffffffffffffffff8411610bd25760405192610ba660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610dd3565b84845260208584010111610bcf575061014692610bc99160208085019101610c6e565b90610b16565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5761014661013a7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e14565b60005b838110610c815750506000910152565b8181015183820152602001610c71565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610cd48151809281602088015260208888019101610c6e565b0116010190565b9181601f840112156100da5782359167ffffffffffffffff83116100da57602083818601950101116100da57565b9181601f840112156100da5782359167ffffffffffffffff83116100da576020808501948460051b0101116100da57565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b90600182811c92168015610dc9575b6020831014610d9a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610d8f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761080d57604052565b9060405191826000825492610e2884610d80565b8084529360018116908115610e965750600114610e4f575b50610e4d92500383610dd3565b565b90506000929192526020600020906000915b818310610e7a575050906020610e4d9282010138610e40565b6020919350806001915483858901015201910190918492610e61565b60209350610e4d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610e40565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ffb573233148015611000575b610ffb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610f61575b50610f5e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c0757600091610fbc575b5038610f54565b6020813d602011610ff3575b81610fd560209383610dd3565b81010312610fef5751908115158203610bcf575038610fb5565b5080fd5b3d9150610fc8565b503390565b5060183610610f1d56fea264697066735822122061e59190ea53ce4ea571c71295c3818de4476643be3f3009d434c2f6f68a88d064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x10C2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1040 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xEED ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xC13 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0xA62 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x99B JUMPI DUP1 PUSH4 0x345C14AD EQ PUSH2 0x337 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xDF JUMPI PUSH4 0xA0C76F62 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH2 0x146 PUSH2 0x13A PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xC91 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x199 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD09 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x1B9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD09 JUMP JUMPDEST SWAP2 DUP3 DUP2 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2DF JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP4 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2DD JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x2AE JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP6 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xDA JUMPI DUP6 ADD SWAP2 DUP3 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xDA JUMPI PUSH1 0x20 ADD SWAP1 DUP4 CALLDATASIZE SUB DUP3 SGT PUSH2 0xDA JUMPI PUSH1 0x1 SWAP4 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH2 0x2A5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP14 ADD CALLDATALOAD SWAP6 DUP4 PUSH2 0xD3A JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x22A JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x386 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x3A6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xDA JUMPI PUSH2 0x3D2 PUSH2 0xED6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x96E JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x93C JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x80D JUMPI DUP2 SWAP1 PUSH2 0x4A2 DUP5 SLOAD PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x8E9 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x847 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x83C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x80D JUMPI PUSH2 0x52D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x789 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x68E JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x683 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0xE89341C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x54F JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x771 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x739 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x5A1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x70C JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x6F9 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x803 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x7F7 JUMPI POP PUSH2 0x536 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x7EA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x7E1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP7 DUP1 PUSH2 0x4C2 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x8D1 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x899 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x4F4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP7 DUP1 DUP1 PUSH2 0x88C JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x876 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x932 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x923 JUMPI POP PUSH2 0x4AB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x916 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x908 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x9EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2DF JUMPI PUSH2 0xA5D PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0xD3A JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x44 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC07 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB24 JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x146 DUP5 DUP3 PUSH2 0xC91 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xB33 DUP2 DUP4 PUSH2 0xDD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xBFF JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC03 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xBFF JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xBD2 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0xBA6 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xDD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xBCF JUMPI POP PUSH2 0x146 SWAP3 PUSH2 0xBC9 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xC6E JUMP JUMPDEST SWAP1 PUSH2 0xB16 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH2 0x146 PUSH2 0x13A PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xC81 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC71 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xCD4 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xC6E JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDA JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xDA JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDA JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xDA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xDC9 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xD9A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xD8F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x80D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE28 DUP5 PUSH2 0xD80 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xE96 JUMPI POP PUSH1 0x1 EQ PUSH2 0xE4F JUMPI JUMPDEST POP PUSH2 0xE4D SWAP3 POP SUB DUP4 PUSH2 0xDD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xE7A JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xE4D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xE61 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xE4D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xE40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFFB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1000 JUMPI JUMPDEST PUSH2 0xFFB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF61 JUMPI JUMPDEST POP PUSH2 0xF5E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC07 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFBC JUMPI JUMPDEST POP CODESIZE PUSH2 0xF54 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xFF3 JUMPI JUMPDEST DUP2 PUSH2 0xFD5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDD3 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xFEF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xBCF JUMPI POP CODESIZE PUSH2 0xFB5 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xFC8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF1D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0xE591 SWAP1 0xEA MSTORE8 0xCE 0x4E 0xA5 PUSH18 0xC71295C3818DE4476643BE3F3009D434C2F6 0xF6 DUP11 DUP9 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1049:1244:218:-:0;;;;;;;;;;;;;-1:-1:-1;;1049:1244:218;;;;-1:-1:-1;;;;;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1049:1244:218;;;;;;745:39:76;;1049:1244:218;;;;;;;;745:39:76;1049:1244:218;;;;;;;-1:-1:-1;1049:1244:218;;;;;;-1:-1:-1;1049:1244:218;;;;;-1:-1:-1;1049:1244:218"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3337,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_string_calldata":{"entryPoint":3291,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":3217,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":3386,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":3604,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":3182,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":3456,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3539,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":3798,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3821}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610c135780630e89341c14610a62578063162094c41461099b578063345c14ad146103375780636706467b1461014a57806395d89b41146100df5763a0c76f621461006957600080fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b600080fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5761014661013a7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610e14565b60405191829182610c91565b0390f35b346100da5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760043567ffffffffffffffff81116100da57610199903690600401610d09565b60243567ffffffffffffffff81116100da576101b9903690600401610d09565b9182810361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102df57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301915b848110156102dd57818110156102ae578060051b9081850135848112156100da5785019182359267ffffffffffffffff84116100da576020019083360382136100da576001937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916102a56040519283928d01359583610d3a565b0390a20161022a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100da5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760043567ffffffffffffffff81116100da57610386903690600401610cdb565b60243567ffffffffffffffff81116100da576103a6903690600401610cdb565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036100da576103d2610ed6565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361096e57507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf5854600181101561093c575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff821161080d5781906104a28454610d80565b601f81116108e9575b50600090601f83116001146108475760009261083c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161080d5761052d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610d80565b601f8111610789575b506000601f821160011461068e57819293600092610683575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f0e89341c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050838061054f565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8681106107715750836001959610610739575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556105a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061070c565b909260206001819286860135815501940191016106f9565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610803575b601f0160051c01905b8181106107f75750610536565b600081556001016107ea565b90915081906107e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905086806104c2565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106108d15750908460019594939210610899575b505050811b0190556104f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905586808061088c565b91936020600181928787013581550195019201610876565b909150836000526020600020601f840160051c81019160208510610932575b90601f859493920160051c01905b81811061092357506104ab565b60008155849350600101610916565b9091508190610908565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100da5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5760243567ffffffffffffffff81116100da576109ea903690600401610cdb565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036102df57610a5d7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583610d3a565b0390a2005b346100da5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da576044600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051928380927ff724dad700000000000000000000000000000000000000000000000000000000825230600483015260043560248301525afa908115610c0757600091610b24575b604051806101468482610c91565b3d8083833e610b338183610dd3565b810190602081830312610bff5780519067ffffffffffffffff8211610c03570181601f82011215610bff5780519267ffffffffffffffff8411610bd25760405192610ba660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610dd3565b84845260208584010111610bcf575061014692610bc99160208085019101610c6e565b90610b16565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346100da5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100da5761014661013a7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610e14565b60005b838110610c815750506000910152565b8181015183820152602001610c71565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610cd48151809281602088015260208888019101610c6e565b0116010190565b9181601f840112156100da5782359167ffffffffffffffff83116100da57602083818601950101116100da57565b9181601f840112156100da5782359167ffffffffffffffff83116100da576020808501948460051b0101116100da57565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b90600182811c92168015610dc9575b6020831014610d9a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610d8f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761080d57604052565b9060405191826000825492610e2884610d80565b8084529360018116908115610e965750600114610e4f575b50610e4d92500383610dd3565b565b90506000929192526020600020906000915b818310610e7a575050906020610e4d9282010138610e40565b6020919350806001915483858901015201910190918492610e61565b60209350610e4d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610e40565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ffb573233148015611000575b610ffb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610f61575b50610f5e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c0757600091610fbc575b5038610f54565b6020813d602011610ff3575b81610fd560209383610dd3565b81010312610fef5751908115158203610bcf575038610fb5565b5080fd5b3d9150610fc8565b503390565b5060183610610f1d56fea264697066735822122061e59190ea53ce4ea571c71295c3818de4476643be3f3009d434c2f6f68a88d064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xC13 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0xA62 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x99B JUMPI DUP1 PUSH4 0x345C14AD EQ PUSH2 0x337 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xDF JUMPI PUSH4 0xA0C76F62 EQ PUSH2 0x69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH2 0x146 PUSH2 0x13A PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xC91 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x199 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD09 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x1B9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD09 JUMP JUMPDEST SWAP2 DUP3 DUP2 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2DF JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP4 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2DD JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x2AE JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP6 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xDA JUMPI DUP6 ADD SWAP2 DUP3 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xDA JUMPI PUSH1 0x20 ADD SWAP1 DUP4 CALLDATASIZE SUB DUP3 SGT PUSH2 0xDA JUMPI PUSH1 0x1 SWAP4 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH2 0x2A5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP14 ADD CALLDATALOAD SWAP6 DUP4 PUSH2 0xD3A JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x22A JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x386 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x3A6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0xDA JUMPI PUSH2 0x3D2 PUSH2 0xED6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x96E JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x93C JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x80D JUMPI DUP2 SWAP1 PUSH2 0x4A2 DUP5 SLOAD PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x8E9 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x847 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x83C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x80D JUMPI PUSH2 0x52D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x789 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x68E JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x683 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0xE89341C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x54F JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x771 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x739 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x5A1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x70C JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x6F9 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x803 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x7F7 JUMPI POP PUSH2 0x536 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x7EA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x7E1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP7 DUP1 PUSH2 0x4C2 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x8D1 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x899 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x4F4 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP7 DUP1 DUP1 PUSH2 0x88C JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x876 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x932 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x923 JUMPI POP PUSH2 0x4AB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x916 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x908 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDA JUMPI PUSH2 0x9EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xCDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x2DF JUMPI PUSH2 0xA5D PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0xD3A JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH1 0x44 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x4 CALLDATALOAD PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC07 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB24 JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x146 DUP5 DUP3 PUSH2 0xC91 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xB33 DUP2 DUP4 PUSH2 0xDD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xBFF JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC03 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xBFF JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0xBD2 JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0xBA6 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xDD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xBCF JUMPI POP PUSH2 0x146 SWAP3 PUSH2 0xBC9 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xC6E JUMP JUMPDEST SWAP1 PUSH2 0xB16 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0xDA JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xDA JUMPI PUSH2 0x146 PUSH2 0x13A PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xE14 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xC81 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC71 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xCD4 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xC6E JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDA JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xDA JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xDA JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xDA JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xDA JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xDC9 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xD9A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xD8F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x80D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xE28 DUP5 PUSH2 0xD80 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xE96 JUMPI POP PUSH1 0x1 EQ PUSH2 0xE4F JUMPI JUMPDEST POP PUSH2 0xE4D SWAP3 POP SUB DUP4 PUSH2 0xDD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xE7A JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xE4D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xE40 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xE61 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xE4D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xE40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xFFB JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1000 JUMPI JUMPDEST PUSH2 0xFFB JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xF61 JUMPI JUMPDEST POP PUSH2 0xF5E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC07 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFBC JUMPI JUMPDEST POP CODESIZE PUSH2 0xF54 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xFF3 JUMPI JUMPDEST DUP2 PUSH2 0xFD5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xDD3 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xFEF JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xBCF JUMPI POP CODESIZE PUSH2 0xFB5 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xFC8 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xF1D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0xE591 SWAP1 0xEA MSTORE8 0xCE 0x4E 0xA5 PUSH18 0xC71295C3818DE4476643BE3F3009D434C2F6 0xF6 DUP11 DUP9 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1049:1244:218:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2991:23:341;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;2688:13:341;1049:1244:218;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2380:35:209;;;;2376:74;;1049:1244:218;2991:23:341;1049:1244:218;;2464:10:209;:71;2460:115;;2591:9;1049:1244:218;;;;;;;2586:102:209;2623:3;2602:19;;;;;;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;1049:1244:218;2647:30:209;1049:1244:218;;;;;;;;2647:30:209;;;:::i;:::-;;;;1049:1244:218;2591:9:209;;1049:1244:218;;;;;;;;;;2602:19:209;1049:1244:218;2460:115:209;2544:31;1049:1244:218;2544:31:209;2464:10;1049:1244:218;;;;2544:31:209;2376:74;2424:26;1049:1244:218;2424:26:209;1049:1244:218;;2424:26:209;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2141:12;;:::i;:::-;1049:1244;;;;;;;3174:18:180;;;3170:53;;3529:19:341;1049:1244:218;;;;636:1:180;900:21:181;;;896:88;;1049:1244:218;636:1:180;1049:1244:218;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;1049:1244:218;583:77:341;1049:1244:218;583:77:341;;;;;;;;1049:1244:218;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;1049:1244:218;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;1049:1244:218;583:77:341;;;;;;;;;;1049:1244:218;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;2159:13;583:77;;;2196:23;583:77;;;2196:23;583:77;2355:37:228;1049:1244:218;500:10:59;1049:1244:218;;500:10:59;1049:1244:218;;500:10:59;636:1:180;500:10:59;;;;;;;1049:1244:218;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;1049:1244:218;;583:77:341;;;;1049:1244:218;;;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;1049:1244:218;636:1:180;583:77:341;;;;;;;;;;;;;;;;2159:13;1049:1244:218;;;583:77:341;;;;;;;;1049:1244:218;583:77:341;;;;;;;;;;;;;;;;;;;;;1049:1244:218;583:77:341;;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;1049:1244:218;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;1049:1244:218;;;;;;;583:77:341;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1049:1244:218;636:1:180;583:77:341;;;;;;;;;;;;;;;;1049:1244:218;;;;;;;;;583:77:341;;;;;;;;1049:1244:218;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;1049:1244:218;583:77:341;;;;-1:-1:-1;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;896:88:181;930:54;1049:1244:218;930:54:181;1049:1244:218;;636:1:180;1049:1244:218;;;;930:54:181;3170:53:180;3201:22;1049:1244:218;3201:22:180;1049:1244:218;;;;3201:22:180;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2991:23:341;1049:1244:218;;1716:10:209;:71;1712:115;;1842:22;;1049:1244:218;;;;;;;;1842:22:209;;;:::i;:::-;;;;1049:1244:218;;;;;;;;;;;;3364:64:341;1049:1244:218;;3364:23:341;1049:1244:218;;;;3364:64:341;;;;1049:1244:218;3364:64:341;;1306:4:209;1049:1244:218;3364:64:341;;1049:1244:218;;;;;;;3364:64:341;;;;;;;1049:1244:218;3364:64:341;;;1049:1244:218;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1049:1244:218;;;;;;;;;;;;;;;;;;;;;3364:64:341;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1049:1244:218;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;1049:1244:218;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1049:1244:218;;;;;-1:-1:-1;1049:1244:218;;-1:-1:-1;1049:1244:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;907:917:76;1049:1244:218;1029:19:76;1049:1244:218;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1049:1244:218;;;;;;1676:74:76;;;;1049:1244:218;1676:74:76;;;;;;1049:1244:218;1327:10:76;1049:1244:218;;;;1744:4:76;1049:1244:218;;;;1676:74:76;;;;;;;1049:1244:218;1676:74:76;;;1630:120;;;;;1676:74;1049:1244:218;1676:74:76;;1049:1244:218;1676:74:76;;;;;;1049:1244:218;1676:74:76;;;:::i;:::-;;;1049:1244:218;;;;;;;;;;;;;1676:74:76;;;;1049:1244:218;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"832000","executionCost":"infinite","totalCost":"infinite"},"external":{"batchSetTokenURI(uint256[],string[])":"infinite","initERC1155MetadataStorage(string,string,address)":"infinite","metadataResolver()":"2382","name()":"infinite","setTokenURI(uint256,string)":"infinite","symbol()":"infinite","uri(uint256)":"infinite"}},"methodIdentifiers":{"batchSetTokenURI(uint256[],string[])":"6706467b","initERC1155MetadataStorage(string,string,address)":"345c14ad","metadataResolver()":"a0c76f62","name()":"06fdde03","setTokenURI(uint256,string)":"162094c4","symbol()":"95d89b41","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"}],\"name\":\"initERC1155MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"initERC1155MetadataStorage(string,string,address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Metadata (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"initERC1155MetadataStorage(string,string,address)\":{\"notice\":\"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol\":\"ERC1155MetadataFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../base/ERC1155MetadataBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (facet version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC1155MetadataFacet is ERC1155MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the contract metadata.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    function initERC1155MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0xe3d3070f792deac4baa9b8e88e88f446748e44f91fa4ec923258305e2ab4b9fa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"initERC1155MetadataStorage(string,string,address)":{"notice":"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC1155MetadataURI."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol":{"ERC1155MintableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC1155MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"initERC1155MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Mintable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610e7838819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610df69081610082823960805181610b2c0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80630d6a5bbb146104715780635cfa9297146101e057806389511ecd146100a65763d53913931461004857600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a1576100dd610b15565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101b3577f5190c92c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100a15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15761021761082f565b6024356044359160643567ffffffffffffffff81116100a15761023e903690600401610883565b909161029f61024b610b15565b93610276857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226109dc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691610977565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610447576102df87878573ffffffffffffffffffffffffffffffffffffffff95610c4c565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61031b57005b6103769160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190610d61565b03816000865af190811561043b577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161040c575b5016036103d957005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61042e915060203d602011610434575b61042681836108b1565b810190610d29565b866103d0565b503d61041c565b6040513d6000823e3d90fd5b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100a15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a1576104a861082f565b60243567ffffffffffffffff81116100a1576104c8903690600401610852565b909160443567ffffffffffffffff81116100a1576104ea903690600401610852565b93909160643567ffffffffffffffff81116100a15761057e93610514610586923690600401610883565b959091610576610522610b15565b9661054d887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226109dc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691610921565b983691610921565b943691610977565b9173ffffffffffffffffffffffffffffffffffffffff821694851561044757865190855182036108055760005b8281106107db5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806106206106128d6040840190610ae1565b82810360208401528b610ae1565b0390a43b61062a57005b6106df9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526106af61067f60a485018b610ae1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610ae1565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152610d61565b03816000875af190811561043b577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916107bc575b50160361074257005b6107b8906107886040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610ae1565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610ae1565b0390fd5b6107d5915060203d6020116104345761042681836108b1565b86610739565b806107ff6107eb6001938c610a9e565b516107f6838b610a9e565b51908886610c4c565b016105b3565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100a157565b9181601f840112156100a15782359167ffffffffffffffff83116100a1576020808501948460051b0101116100a157565b9181601f840112156100a15782359167ffffffffffffffff83116100a157602083818601950101116100a157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108f257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9291909267ffffffffffffffff84116108f2578360051b90602060405161094a828501826108b1565b80968152019181019283116100a157905b82821061096757505050565b813581526020918201910161095b565b92919267ffffffffffffffff82116108f257604051916109bf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846108b1565b8294818452818301116100a1578281602093846000960137010152565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610a365750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015610ab25760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906020808351928381520192019060005b818110610aff5750505090565b8251845260209384019390920191600101610af2565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c3d573233148015610c42575b610c3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610ba0575b50610b9d57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561043b57600091610bfb575b5038610b93565b6020813d602011610c35575b81610c14602093836108b1565b81010312610c315751908115158203610c2e575038610bf4565b80fd5b5080fd5b3d9150610c07565b503390565b5060183610610b5c565b909183610c5a575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115610cd057505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610c54565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f42fb00bc000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b908160209103126100a157517fffffffff00000000000000000000000000000000000000000000000000000000811681036100a15790565b919082519283825260005b848110610dab5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610d6c56fea26469706673582212202cecfe1184262892a41bfbdab819e377fcd72349c82fa92afae9b880264ff09064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xE78 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xDF6 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xB2C ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x471 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x89511ECD EQ PUSH2 0xA6 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0xDD PUSH2 0xB15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1B3 JUMPI PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x217 PUSH2 0x82F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x23E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x883 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29F PUSH2 0x24B PUSH2 0xB15 JUMP JUMPDEST SWAP4 PUSH2 0x276 DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x9DC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x977 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x447 JUMPI PUSH2 0x2DF DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0xC4C JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x31B JUMPI STOP JUMPDEST PUSH2 0x376 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0xD61 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x40C JUMPI JUMPDEST POP AND SUB PUSH2 0x3D9 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x42E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x434 JUMPI JUMPDEST PUSH2 0x426 DUP2 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD29 JUMP JUMPDEST DUP7 PUSH2 0x3D0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x41C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x4A8 PUSH2 0x82F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x4C8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x852 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x4EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x852 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x57E SWAP4 PUSH2 0x514 PUSH2 0x586 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x883 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x576 PUSH2 0x522 PUSH2 0xB15 JUMP JUMPDEST SWAP7 PUSH2 0x54D DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x9DC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x921 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x921 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x977 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x447 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x805 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x7DB JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x620 PUSH2 0x612 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0xAE1 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0xAE1 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x62A JUMPI STOP JUMPDEST PUSH2 0x6DF SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x6AF PUSH2 0x67F PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xAE1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xAE1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0xD61 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x7BC JUMPI JUMPDEST POP AND SUB PUSH2 0x742 JUMPI STOP JUMPDEST PUSH2 0x7B8 SWAP1 PUSH2 0x788 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xAE1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xAE1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x7D5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x434 JUMPI PUSH2 0x426 DUP2 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP7 PUSH2 0x739 JUMP JUMPDEST DUP1 PUSH2 0x7FF PUSH2 0x7EB PUSH1 0x1 SWAP4 DUP13 PUSH2 0xA9E JUMP JUMPDEST MLOAD PUSH2 0x7F6 DUP4 DUP12 PUSH2 0xA9E JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0xC4C JUMP JUMPDEST ADD PUSH2 0x5B3 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8F2 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x8F2 JUMPI DUP4 PUSH1 0x5 SHL SWAP1 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH2 0x94A DUP3 DUP6 ADD DUP3 PUSH2 0x8B1 JUMP JUMPDEST DUP1 SWAP7 DUP2 MSTORE ADD SWAP2 DUP2 ADD SWAP3 DUP4 GT PUSH2 0xA1 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x967 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x95B JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8F2 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x9BF PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x8B1 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xA1 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xA36 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xAB2 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xAFF JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xAF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC3D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC42 JUMPI JUMPDEST PUSH2 0xC3D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBA0 JUMPI JUMPDEST POP PUSH2 0xB9D JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBFB JUMPI JUMPDEST POP CODESIZE PUSH2 0xB93 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC35 JUMPI JUMPDEST DUP2 PUSH2 0xC14 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC31 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xC2E JUMPI POP CODESIZE PUSH2 0xBF4 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC07 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB5C JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0xC5A JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0xCD0 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0xC54 JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xA1 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xA1 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xDAB JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xD6C JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2C EOFCREATE 0xFE GT DUP5 0x26 0x28 SWAP3 LOG4 SHL EXTSTATICCALL 0xDA 0xB8 NOT CALLF 0x77FC 0xD7 0x23 BLOBHASH 0xC8 0x2F 0xA9 0x2A STATICCALL 0xE9 0xB8 DUP1 0x26 0x4F CREATE SWAP1 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"838:1054:219:-:0;;;;;;;;;;;;;-1:-1:-1;;838:1054:219;;;;-1:-1:-1;;;;;838:1054:219;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;838:1054:219;;;;;;745:39:76;;838:1054:219;;;;;;;;745:39:76;838:1054:219;;;;;;;-1:-1:-1;838:1054:219;;;;;;-1:-1:-1;838:1054:219;;;;;-1:-1:-1;838:1054:219"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2095,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":2130,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":2337,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":2423,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":3369,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":2179,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_array_uint256_dyn":{"entryPoint":2785,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes":{"entryPoint":3425,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":2225,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2524,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mintToken":{"entryPoint":3148,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":2837,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_uint256_dyn":{"entryPoint":2718,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2860}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80630d6a5bbb146104715780635cfa9297146101e057806389511ecd146100a65763d53913931461004857600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a1576100dd610b15565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101b3577f5190c92c000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100a15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15761021761082f565b6024356044359160643567ffffffffffffffff81116100a15761023e903690600401610883565b909161029f61024b610b15565b93610276857fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226109dc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612933691610977565b9173ffffffffffffffffffffffffffffffffffffffff8216938415610447576102df87878573ffffffffffffffffffffffffffffffffffffffff95610c4c565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61031b57005b6103769160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190610d61565b03816000865af190811561043b577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161040c575b5016036103d957005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b61042e915060203d602011610434575b61042681836108b1565b810190610d29565b866103d0565b503d61041c565b6040513d6000823e3d90fd5b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100a15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a1576104a861082f565b60243567ffffffffffffffff81116100a1576104c8903690600401610852565b909160443567ffffffffffffffff81116100a1576104ea903690600401610852565b93909160643567ffffffffffffffff81116100a15761057e93610514610586923690600401610883565b959091610576610522610b15565b9661054d887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226109dc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691610921565b983691610921565b943691610977565b9173ffffffffffffffffffffffffffffffffffffffff821694851561044757865190855182036108055760005b8281106107db5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806106206106128d6040840190610ae1565b82810360208401528b610ae1565b0390a43b61062a57005b6106df9160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526106af61067f60a485018b610ae1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610ae1565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152610d61565b03816000875af190811561043b577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916107bc575b50160361074257005b6107b8906107886040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610ae1565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610ae1565b0390fd5b6107d5915060203d6020116104345761042681836108b1565b86610739565b806107ff6107eb6001938c610a9e565b516107f6838b610a9e565b51908886610c4c565b016105b3565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100a157565b9181601f840112156100a15782359167ffffffffffffffff83116100a1576020808501948460051b0101116100a157565b9181601f840112156100a15782359167ffffffffffffffff83116100a157602083818601950101116100a157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108f257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9291909267ffffffffffffffff84116108f2578360051b90602060405161094a828501826108b1565b80968152019181019283116100a157905b82821061096757505050565b813581526020918201910161095b565b92919267ffffffffffffffff82116108f257604051916109bf60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846108b1565b8294818452818301116100a1578281602093846000960137010152565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615610a365750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8051821015610ab25760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906020808351928381520192019060005b818110610aff5750505090565b8251845260209384019390920191600101610af2565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c3d573233148015610c42575b610c3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610ba0575b50610b9d57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561043b57600091610bfb575b5038610b93565b6020813d602011610c35575b81610c14602093836108b1565b81010312610c315751908115158203610c2e575038610bf4565b80fd5b5080fd5b3d9150610c07565b503390565b5060183610610b5c565b909183610c5a575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115610cd057505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080610c54565b60849350849273ffffffffffffffffffffffffffffffffffffffff604051947f42fb00bc000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b908160209103126100a157517fffffffff00000000000000000000000000000000000000000000000000000000811681036100a15790565b919082519283825260005b848110610dab5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610d6c56fea26469706673582212202cecfe1184262892a41bfbdab819e377fcd72349c82fa92afae9b880264ff09064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x471 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x89511ECD EQ PUSH2 0xA6 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0xDD PUSH2 0xB15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1B3 JUMPI PUSH32 0x5190C92C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x217 PUSH2 0x82F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x23E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x883 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29F PUSH2 0x24B PUSH2 0xB15 JUMP JUMPDEST SWAP4 PUSH2 0x276 DUP6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x9DC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x977 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x447 JUMPI PUSH2 0x2DF DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0xC4C JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x31B JUMPI STOP JUMPDEST PUSH2 0x376 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0xD61 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x40C JUMPI JUMPDEST POP AND SUB PUSH2 0x3D9 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x42E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x434 JUMPI JUMPDEST PUSH2 0x426 DUP2 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xD29 JUMP JUMPDEST DUP7 PUSH2 0x3D0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x41C JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x4A8 PUSH2 0x82F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x4C8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x852 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x4EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x852 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x57E SWAP4 PUSH2 0x514 PUSH2 0x586 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x883 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x576 PUSH2 0x522 PUSH2 0xB15 JUMP JUMPDEST SWAP7 PUSH2 0x54D DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x9DC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x921 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x921 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x977 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x447 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x805 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x7DB JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x620 PUSH2 0x612 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0xAE1 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0xAE1 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x62A JUMPI STOP JUMPDEST PUSH2 0x6DF SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x6AF PUSH2 0x67F PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xAE1 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xAE1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0xD61 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x7BC JUMPI JUMPDEST POP AND SUB PUSH2 0x742 JUMPI STOP JUMPDEST PUSH2 0x7B8 SWAP1 PUSH2 0x788 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xAE1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xAE1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x7D5 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x434 JUMPI PUSH2 0x426 DUP2 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP7 PUSH2 0x739 JUMP JUMPDEST DUP1 PUSH2 0x7FF PUSH2 0x7EB PUSH1 0x1 SWAP4 DUP13 PUSH2 0xA9E JUMP JUMPDEST MLOAD PUSH2 0x7F6 DUP4 DUP12 PUSH2 0xA9E JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0xC4C JUMP JUMPDEST ADD PUSH2 0x5B3 JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x8F2 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP1 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x8F2 JUMPI DUP4 PUSH1 0x5 SHL SWAP1 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH2 0x94A DUP3 DUP6 ADD DUP3 PUSH2 0x8B1 JUMP JUMPDEST DUP1 SWAP7 DUP2 MSTORE ADD SWAP2 DUP2 ADD SWAP3 DUP4 GT PUSH2 0xA1 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x967 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x95B JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8F2 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x9BF PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x8B1 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0xA1 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0xA36 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0xAB2 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xAFF JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xAF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC3D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC42 JUMPI JUMPDEST PUSH2 0xC3D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBA0 JUMPI JUMPDEST POP PUSH2 0xB9D JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x43B JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBFB JUMPI JUMPDEST POP CODESIZE PUSH2 0xB93 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC35 JUMPI JUMPDEST DUP2 PUSH2 0xC14 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8B1 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC31 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xC2E JUMPI POP CODESIZE PUSH2 0xBF4 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC07 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB5C JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0xC5A JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0xCD0 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0xC54 JUMP JUMPDEST PUSH1 0x84 SWAP4 POP DUP5 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0xA1 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0xA1 JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xDAB JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xD6C JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2C EOFCREATE 0xFE GT DUP5 0x26 0x28 SWAP3 LOG4 SHL EXTSTATICCALL 0xDA 0xB8 NOT CALLF 0x77FC 0xD7 0x23 BLOBHASH 0xC8 0x2F 0xA9 0x2A STATICCALL 0xE9 0xB8 DUP1 0x26 0x4F CREATE SWAP1 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"838:1054:219:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1609:41;;:::i;:::-;838:1054;;;;;;;3174:18:180;;;3170:53;;2606:34:228;838:1054:219;500:10:59;838:1054:219;500:10:59;;;;;;;636:1:180;500:10:59;;;838:1054:219;3170:53:180;3201:22;838:1054:219;3201:22:180;838:1054:219;;;;3201:22:180;838:1054:219;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;1609:41;;838:1054;1609:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;838:1054:219;1221:6:210;:::i;:::-;838:1054:219;;;;;:::i;:::-;;;;;8152:16:228;;;8148:55;;8236:5;;;;838:1054:219;8236:5:228;;:::i;:::-;838:1054:219;;;;;8258:49:228;838:1054:219;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;838:1054:219;8318:110:228;838:1054:219;;;;;;19356:74:228;;;;;838:1054:219;19356:74:228;;838:1054:219;19356:74:228;;838:1054:219;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;838:1054:219;19356:74:228;;;;;;;;838:1054:219;19356:74:228;838:1054:219;19356:74:228;838:1054:219;19356:74:228;;;8318:110;838:1054:219;;19356:101:228;19352:168;;838:1054:219;19352:168:228;19478:42;838:1054:219;19478:42:228;838:1054:219;;;;;;;;19478:42:228;19356:74;;;;838:1054:219;19356:74:228;838:1054:219;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;838:1054:219;;;;;;;;;8148:55:228;8177:26;838:1054:219;8177:26:228;838:1054:219;;8177:26:228;838:1054:219;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1609:41;;;838:1054;1609:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;838:1054:219;1669:6:210;:::i;:::-;838:1054:219;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;838:1054:219;;;;;9777:23:228;;9773:62;;838:1054:219;9862:10:228;;;;;;838:1054:219;;;;;;;;;9955:50:228;838:1054:219;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;838:1054:219;10016:117:228;838:1054:219;;;;;;20263:81:228;;;;;838:1054:219;20263:81:228;;838:1054:219;20263:81:228;;838:1054:219;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;838:1054:219;20263:81:228;;;;;;;;838:1054:219;20263:81:228;838:1054:219;20263:81:228;838:1054:219;20263:81:228;;;10016:117;838:1054:219;;20263:107:228;20259:181;;838:1054:219;20259:181:228;1878:53;838:1054:219;1878:53:228;838:1054:219;;20391:49:228;;;;;;838:1054:219;20391:49:228;;838:1054:219;;;1878:53:228;;;838:1054:219;1878:53:228;;;;:::i;:::-;;838:1054:219;1878:53:228;;;;838:1054:219;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;838:1054:219;20263:81:228;838:1054:219;20263:81:228;;;;;;;:::i;:::-;;;;9874:3;9911:6;9919:9;9911:6;838:1054:219;9911:6:228;;;:::i;:::-;838:1054:219;9919:9:228;;;;:::i;:::-;838:1054:219;9919:9:228;;;;:::i;:::-;838:1054:219;9851:9:228;;9773:62;9809:26;838:1054:219;9809:26:228;838:1054:219;;9809:26:228;838:1054:219;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;838:1054:219;;;;;-1:-1:-1;838:1054:219;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;838:1054:219;;;;;;:::o;3640:170:41:-;838:1054:219;-1:-1:-1;838:1054:219;;;;-1:-1:-1;838:1054:219;;;;-1:-1:-1;838:1054:219;;;;;-1:-1:-1;838:1054:219;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;838:1054:219;3775:28:41;;-1:-1:-1;3775:28:41;838:1054:219;3775:28:41;838:1054:219;;;;;-1:-1:-1;3775:28:41;838:1054:219;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;838:1054:219;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;907:917:76;838:1054:219;1029:19:76;838:1054:219;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;838:1054:219;;;;;;1676:74:76;;;;838:1054:219;1676:74:76;;;;;;838:1054:219;1327:10:76;838:1054:219;;;;1744:4:76;838:1054:219;;;;1676:74:76;;;;;;;838:1054:219;1676:74:76;;;1630:120;;;;;1676:74;838:1054:219;1676:74:76;;838:1054:219;1676:74:76;;;;;;838:1054:219;1676:74:76;;;:::i;:::-;;;838:1054:219;;;;;;;;;;;;;1676:74:76;;;;838:1054:219;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;838:1054:219;17966:1:228;838:1054:219;;;;;17966:1:228;838:1054:219;;;;-1:-1:-1;838:1054:219;;;;-1:-1:-1;838:1054:219;;;;;;18123:21:228;;;;;18119:80;;838:1054:219;;17966:1:228;838:1054:219;;;;;17966:1:228;838:1054:219;18217:18:228;838:1054:219;-1:-1:-1;838:1054:219;;;;-1:-1:-1;838:1054:219;;17953:320:228;;;;;;18119:80;18153:46;838:1054:219;;;;;;;18153:46:228;;;;838:1054:219;18153:46:228;;;838:1054:219;;;;;;;;;;;;;18153:46:228;838:1054:219;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;838:1054:219;;;;;;;;;;;-1:-1:-1;838:1054:219;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"714800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"207","initERC1155MintableStorage()":"infinite","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","initERC1155MintableStorage()":"89511ecd","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeMint(address,uint256,uint256,bytes)":"5cfa9297"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC1155MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC1155MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Mintable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"initERC1155MintableStorage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155Mintable.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol\":\"ERC1155MintableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../base/ERC1155MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC1155MintableFacet is ERC1155MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x7c0148e6ed6ff8e8758116a533ee4cc9702bc587b2411543b961865cc268aac8\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"initERC1155MintableStorage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155Mintable."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."}},"version":1}}},"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol":{"ERC1155WithOperatorFiltererFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"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"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"initERC1155Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","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":"values","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":"value","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"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.","errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"initERC1155Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155 Multi Token Standard with Operator Filterer (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6115ee38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161156c908161008282396080518161105f0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610cea5780632eb2c2d6146108ab5780634e1273f4146106ed578063a22cb4651461058d578063c34106c814610453578063e985e9c51461039f5763f242432a1461006857600080fd5b3461039a5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5761009f610d58565b6100a7610d7b565b604435906064359260843567ffffffffffffffff811161039a576100cf903690600401610dcf565b926100d8611048565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361038a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156103605761017b828783611257565b156103165773ffffffffffffffffffffffffffffffffffffffff916101a48a8a878a87966112d7565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6101e157005b6020926101ef913691610fcb565b9261024560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906114d7565b03816000865af190811561030a577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916102db575b5016036102a857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102fd915060203d602011610303575b6102f58183610ef7565b81019061149f565b3861029f565b503d6102eb565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b6103939161116c565b388561012f565b600080fd5b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576103d6610d58565b73ffffffffffffffffffffffffffffffffffffffff6103f3610d7b565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461039a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5761048a611048565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610560577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576105c4610d58565b602435908115159182810361039a576106be575b73ffffffffffffffffffffffffffffffffffffffff806105f6611048565b169116918183146106905760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6106e8817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061116c565b6105d8565b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5760043567ffffffffffffffff811161039a5761073c903690600401610d9e565b9060243567ffffffffffffffff811161039a5761075d903690600401610d9e565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036108815761078f85610f67565b9461079d6040519687610ef7565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06107ca82610f67565b0136602088013760005b8181106107f557604051602080825281906107f19082018a610dfd565b0390f35b610800818388610eaa565b3573ffffffffffffffffffffffffffffffffffffffff8116810361039a576108359061082d838689610eaa565b359086610e31565b9087518110156108525760019160208260051b8a010152016107d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461039a5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576108e2610d58565b6108ea610d7b565b60443567ffffffffffffffff811161039a5761090a903690600401610d9e565b929060643567ffffffffffffffff811161039a5761092c903690600401610d9e565b9360843567ffffffffffffffff811161039a5761094d903690600401610dcf565b939091610958611048565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603610cda575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561036057898b0361088157610a02828483611257565b15610c905760005b8b8110610c61575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610a8660405192839260408452610a788d60408601908d610eba565b918483036020860152610eba565b0390a43b610a9057005b602094610aa5610aad92610ab5953691610f7f565b993691610f7f565b953691610fcb565b92610b6560405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610b35610b0560a485018b610dfd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610dfd565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526114d7565b03816000875af190811561030a577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610c42575b501603610bc857005b610c3e90610c0e6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610dfd565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610dfd565b0390fd5b610c5b915060203d602011610303576102f58183610ef7565b86610bbf565b80610c8a8c610c808f94610c78816001978d610eaa565b35928d610eaa565b35908888876112d7565b01610a0a565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b610ce39161116c565b89876109af565b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576020610d50610d26610d58565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610e31565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361039a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361039a57565b9181601f8401121561039a5782359167ffffffffffffffff831161039a576020808501948460051b01011161039a57565b9181601f8401121561039a5782359167ffffffffffffffff831161039a576020838186019501011161039a57565b906020808351928381520192019060005b818110610e1b5750505090565b8251845260209384019390920191600101610e0e565b909173ffffffffffffffffffffffffffffffffffffffff831615610e805760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156108525760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161039a5760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610f3857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610f385760051b60200190565b929190610f8b81610f67565b93610f996040519586610ef7565b602085838152019160051b810192831161039a57905b828210610fbb57505050565b8135815260209182019101610faf565b92919267ffffffffffffffff8211610f38576040519161101360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610ef7565b82948184528183011161039a578281602093846000960137010152565b9081602091031261039a5751801515810361039a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561115d573233148015611162575b61115d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156110d3575b506110d057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561030a5760009161112e575b50386110c6565b611150915060203d602011611156575b6111488183610ef7565b810190611030565b38611127565b503d61113e565b503390565b506018361061108f565b5473ffffffffffffffffffffffffffffffffffffffff16908115158061124d575b611195575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561030a5760009161122e575b50156112015750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611247915060203d602011611156576111488183610ef7565b386111f8565b50813b151561118d565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611282575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061127c565b919290846112e7575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015611443575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff82160361135f575b506112e0565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156113e557505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080611359565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261039a57517fffffffff000000000000000000000000000000000000000000000000000000008116810361039a5790565b919082519283825260005b8481106115215750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016114e256fea26469706673582212205b1d68439a83bff6a51c5926c6a1e5a9bb787de71b521b5fe6be609203adaa2e64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x15EE CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x156C SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x105F ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xCEA JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x8AB JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x6ED JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x39F JUMPI PUSH4 0xF242432A EQ PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x9F PUSH2 0xD58 JUMP JUMPDEST PUSH2 0xA7 PUSH2 0xD7B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0xCF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDCF JUMP JUMPDEST SWAP3 PUSH2 0xD8 PUSH2 0x1048 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x38A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x360 JUMPI PUSH2 0x17B DUP3 DUP8 DUP4 PUSH2 0x1257 JUMP JUMPDEST ISZERO PUSH2 0x316 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x1A4 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x12D7 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x1E1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1EF SWAP2 CALLDATASIZE SWAP2 PUSH2 0xFCB JUMP JUMPDEST SWAP3 PUSH2 0x245 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x14D7 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2DB JUMPI JUMPDEST POP AND SUB PUSH2 0x2A8 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2FD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x303 JUMPI JUMPDEST PUSH2 0x2F5 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x149F JUMP JUMPDEST CODESIZE PUSH2 0x29F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2EB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x393 SWAP2 PUSH2 0x116C JUMP JUMPDEST CODESIZE DUP6 PUSH2 0x12F JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x3D6 PUSH2 0xD58 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3F3 PUSH2 0xD7B JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x48A PUSH2 0x1048 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x560 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x5C4 PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x39A JUMPI PUSH2 0x6BE JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5F6 PUSH2 0x1048 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x690 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E8 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x116C JUMP JUMPDEST PUSH2 0x5D8 JUMP JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x73C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x75D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x881 JUMPI PUSH2 0x78F DUP6 PUSH2 0xF67 JUMP JUMPDEST SWAP5 PUSH2 0x79D PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xEF7 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x7CA DUP3 PUSH2 0xF67 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x7F5 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x7F1 SWAP1 DUP3 ADD DUP11 PUSH2 0xDFD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x800 DUP2 DUP4 DUP9 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x39A JUMPI PUSH2 0x835 SWAP1 PUSH2 0x82D DUP4 DUP7 DUP10 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xE31 JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x852 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x7D4 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x8E2 PUSH2 0xD58 JUMP JUMPDEST PUSH2 0x8EA PUSH2 0xD7B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x90A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x92C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x94D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDCF JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x958 PUSH2 0x1048 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xCDA JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x360 JUMPI DUP10 DUP12 SUB PUSH2 0x881 JUMPI PUSH2 0xA02 DUP3 DUP5 DUP4 PUSH2 0x1257 JUMP JUMPDEST ISZERO PUSH2 0xC90 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xC61 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xA86 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xA78 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xEBA JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xEBA JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xA90 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xAA5 PUSH2 0xAAD SWAP3 PUSH2 0xAB5 SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF7F JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xF7F JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xFCB JUMP JUMPDEST SWAP3 PUSH2 0xB65 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xB35 PUSH2 0xB05 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xDFD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xDFD JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x14D7 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xC42 JUMPI JUMPDEST POP AND SUB PUSH2 0xBC8 JUMPI STOP JUMPDEST PUSH2 0xC3E SWAP1 PUSH2 0xC0E PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xDFD JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xDFD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xC5B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x303 JUMPI PUSH2 0x2F5 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP7 PUSH2 0xBBF JUMP JUMPDEST DUP1 PUSH2 0xC8A DUP13 PUSH2 0xC80 DUP16 SWAP5 PUSH2 0xC78 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x12D7 JUMP JUMPDEST ADD PUSH2 0xA0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xCE3 SWAP2 PUSH2 0x116C JUMP JUMPDEST DUP10 DUP8 PUSH2 0x9AF JUMP JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH1 0x20 PUSH2 0xD50 PUSH2 0xD26 PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xE31 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x39A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x39A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x39A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xE1B JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xE0E JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x852 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xF38 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xF38 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xF8B DUP2 PUSH2 0xF67 JUMP JUMPDEST SWAP4 PUSH2 0xF99 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xEF7 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x39A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xFBB JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xFAF JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xF38 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1013 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xEF7 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x39A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x39A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x39A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x115D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1162 JUMPI JUMPDEST PUSH2 0x115D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10D3 JUMPI JUMPDEST POP PUSH2 0x10D0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x112E JUMPI JUMPDEST POP CODESIZE PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0x1150 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1156 JUMPI JUMPDEST PUSH2 0x1148 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1030 JUMP JUMPDEST CODESIZE PUSH2 0x1127 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x113E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x108F JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x124D JUMPI JUMPDEST PUSH2 0x1195 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x122E JUMPI JUMPDEST POP ISZERO PUSH2 0x1201 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1247 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1156 JUMPI PUSH2 0x1148 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST CODESIZE PUSH2 0x11F8 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x118D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1282 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x127C JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x12E7 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x1443 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x135F JUMPI JUMPDEST POP PUSH2 0x12E0 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x13E5 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x1359 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x39A JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x39A JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1521 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x14E2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST SAR PUSH9 0x439A83BFF6A51C5926 0xC6 LOG1 JUMPF 0xA9BB PUSH25 0x7DE71B521B5FE6BE609203ADAA2E64736F6C634300081E0033 ","sourceMap":"879:1047:220:-:0;;;;;;;;;;;;;-1:-1:-1;;879:1047:220;;;;-1:-1:-1;;;;;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;879:1047:220;;;;;;745:39:76;;879:1047:220;;;;;;;;745:39:76;879:1047:220;;;;;;;-1:-1:-1;879:1047:220;;;;;;-1:-1:-1;879:1047:220;;;;;-1:-1:-1;879:1047:220"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":3451,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":3486,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":3967,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":4043,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":4144,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":5279,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":3535,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":3416,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":3581,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":3770,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes":{"entryPoint":5335,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":3943,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":3754,"id":null,"parameterSlots":3,"returnSlots":1},"finalize_allocation":{"entryPoint":3831,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":3633,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":4460,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":4695,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":4168,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferToken":{"entryPoint":4823,"id":25299,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4191}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14610cea5780632eb2c2d6146108ab5780634e1273f4146106ed578063a22cb4651461058d578063c34106c814610453578063e985e9c51461039f5763f242432a1461006857600080fd5b3461039a5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5761009f610d58565b6100a7610d7b565b604435906064359260843567ffffffffffffffff811161039a576100cf903690600401610dcf565b926100d8611048565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361038a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156103605761017b828783611257565b156103165773ffffffffffffffffffffffffffffffffffffffff916101a48a8a878a87966112d7565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6101e157005b6020926101ef913691610fcb565b9261024560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906114d7565b03816000865af190811561030a577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916102db575b5016036102a857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6102fd915060203d602011610303575b6102f58183610ef7565b81019061149f565b3861029f565b503d6102eb565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b6103939161116c565b388561012f565b600080fd5b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576103d6610d58565b73ffffffffffffffffffffffffffffffffffffffff6103f3610d7b565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461039a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5761048a611048565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610560577fd9b67a26000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576105c4610d58565b602435908115159182810361039a576106be575b73ffffffffffffffffffffffffffffffffffffffff806105f6611048565b169116918183146106905760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6106e8817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061116c565b6105d8565b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a5760043567ffffffffffffffff811161039a5761073c903690600401610d9e565b9060243567ffffffffffffffff811161039a5761075d903690600401610d9e565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612908085036108815761078f85610f67565b9461079d6040519687610ef7565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06107ca82610f67565b0136602088013760005b8181106107f557604051602080825281906107f19082018a610dfd565b0390f35b610800818388610eaa565b3573ffffffffffffffffffffffffffffffffffffffff8116810361039a576108359061082d838689610eaa565b359086610e31565b9087518110156108525760019160208260051b8a010152016107d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b3461039a5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576108e2610d58565b6108ea610d7b565b60443567ffffffffffffffff811161039a5761090a903690600401610d9e565b929060643567ffffffffffffffff811161039a5761092c903690600401610d9e565b9360843567ffffffffffffffff811161039a5761094d903690600401610dcf565b939091610958611048565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603610cda575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561036057898b0361088157610a02828483611257565b15610c905760005b8b8110610c61575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993610a8660405192839260408452610a788d60408601908d610eba565b918483036020860152610eba565b0390a43b610a9057005b602094610aa5610aad92610ab5953691610f7f565b993691610f7f565b953691610fcb565b92610b6560405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152610b35610b0560a485018b610dfd565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288610dfd565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526114d7565b03816000875af190811561030a577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091610c42575b501603610bc857005b610c3e90610c0e6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610dfd565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152610dfd565b0390fd5b610c5b915060203d602011610303576102f58183610ef7565b86610bbf565b80610c8a8c610c808f94610c78816001978d610eaa565b35928d610eaa565b35908888876112d7565b01610a0a565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b610ce39161116c565b89876109af565b3461039a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261039a576020610d50610d26610d58565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612610e31565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361039a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361039a57565b9181601f8401121561039a5782359167ffffffffffffffff831161039a576020808501948460051b01011161039a57565b9181601f8401121561039a5782359167ffffffffffffffff831161039a576020838186019501011161039a57565b906020808351928381520192019060005b818110610e1b5750505090565b8251845260209384019390920191600101610e0e565b909173ffffffffffffffffffffffffffffffffffffffff831615610e805760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b91908110156108525760051b0190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161039a5760209260051b809284830137010190565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610f3857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610f385760051b60200190565b929190610f8b81610f67565b93610f996040519586610ef7565b602085838152019160051b810192831161039a57905b828210610fbb57505050565b8135815260209182019101610faf565b92919267ffffffffffffffff8211610f38576040519161101360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610ef7565b82948184528183011161039a578281602093846000960137010152565b9081602091031261039a5751801515810361039a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561115d573233148015611162575b61115d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156110d3575b506110d057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561030a5760009161112e575b50386110c6565b611150915060203d602011611156575b6111488183610ef7565b810190611030565b38611127565b503d61113e565b503390565b506018361061108f565b5473ffffffffffffffffffffffffffffffffffffffff16908115158061124d575b611195575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561030a5760009161122e575b50156112015750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611247915060203d602011611156576111488183610ef7565b386111f8565b50813b151561118d565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315611282575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061127c565b919290846112e7575b5050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015611443575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff82160361135f575b506112e0565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156113e557505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080611359565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fd5b9081602091031261039a57517fffffffff000000000000000000000000000000000000000000000000000000008116810361039a5790565b919082519283825260005b8481106115215750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016114e256fea26469706673582212205b1d68439a83bff6a51c5926c6a1e5a9bb787de71b521b5fe6be609203adaa2e64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0xCEA JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x8AB JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x6ED JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0xC34106C8 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x39F JUMPI PUSH4 0xF242432A EQ PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x9F PUSH2 0xD58 JUMP JUMPDEST PUSH2 0xA7 PUSH2 0xD7B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0xCF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDCF JUMP JUMPDEST SWAP3 PUSH2 0xD8 PUSH2 0x1048 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x38A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x360 JUMPI PUSH2 0x17B DUP3 DUP8 DUP4 PUSH2 0x1257 JUMP JUMPDEST ISZERO PUSH2 0x316 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x1A4 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x12D7 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x1E1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x1EF SWAP2 CALLDATASIZE SWAP2 PUSH2 0xFCB JUMP JUMPDEST SWAP3 PUSH2 0x245 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x14D7 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2DB JUMPI JUMPDEST POP AND SUB PUSH2 0x2A8 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2FD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x303 JUMPI JUMPDEST PUSH2 0x2F5 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x149F JUMP JUMPDEST CODESIZE PUSH2 0x29F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2EB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x393 SWAP2 PUSH2 0x116C JUMP JUMPDEST CODESIZE DUP6 PUSH2 0x12F JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x3D6 PUSH2 0xD58 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3F3 PUSH2 0xD7B JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x48A PUSH2 0x1048 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x560 JUMPI PUSH32 0xD9B67A2600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x5C4 PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x39A JUMPI PUSH2 0x6BE JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5F6 PUSH2 0x1048 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x690 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E8 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x116C JUMP JUMPDEST PUSH2 0x5D8 JUMP JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x73C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x75D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP1 DUP1 DUP6 SUB PUSH2 0x881 JUMPI PUSH2 0x78F DUP6 PUSH2 0xF67 JUMP JUMPDEST SWAP5 PUSH2 0x79D PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0xEF7 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x7CA DUP3 PUSH2 0xF67 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x7F5 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x7F1 SWAP1 DUP3 ADD DUP11 PUSH2 0xDFD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x800 DUP2 DUP4 DUP9 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x39A JUMPI PUSH2 0x835 SWAP1 PUSH2 0x82D DUP4 DUP7 DUP10 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP7 PUSH2 0xE31 JUMP JUMPDEST SWAP1 DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x852 JUMPI PUSH1 0x1 SWAP2 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP11 ADD ADD MSTORE ADD PUSH2 0x7D4 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH2 0x8E2 PUSH2 0xD58 JUMP JUMPDEST PUSH2 0x8EA PUSH2 0xD7B JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x90A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x92C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xD9E JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x39A JUMPI PUSH2 0x94D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xDCF JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x958 PUSH2 0x1048 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xCDA JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x360 JUMPI DUP10 DUP12 SUB PUSH2 0x881 JUMPI PUSH2 0xA02 DUP3 DUP5 DUP4 PUSH2 0x1257 JUMP JUMPDEST ISZERO PUSH2 0xC90 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0xC61 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0xA86 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0xA78 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0xEBA JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xEBA JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0xA90 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0xAA5 PUSH2 0xAAD SWAP3 PUSH2 0xAB5 SWAP6 CALLDATASIZE SWAP2 PUSH2 0xF7F JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0xF7F JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0xFCB JUMP JUMPDEST SWAP3 PUSH2 0xB65 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0xB35 PUSH2 0xB05 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0xDFD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0xDFD JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x14D7 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0xC42 JUMPI JUMPDEST POP AND SUB PUSH2 0xBC8 JUMPI STOP JUMPDEST PUSH2 0xC3E SWAP1 PUSH2 0xC0E PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0xDFD JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0xDFD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xC5B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x303 JUMPI PUSH2 0x2F5 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP7 PUSH2 0xBBF JUMP JUMPDEST DUP1 PUSH2 0xC8A DUP13 PUSH2 0xC80 DUP16 SWAP5 PUSH2 0xC78 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0xEAA JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x12D7 JUMP JUMPDEST ADD PUSH2 0xA0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xCE3 SWAP2 PUSH2 0x116C JUMP JUMPDEST DUP10 DUP8 PUSH2 0x9AF JUMP JUMPDEST CALLVALUE PUSH2 0x39A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x39A JUMPI PUSH1 0x20 PUSH2 0xD50 PUSH2 0xD26 PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0xE31 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x39A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x39A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x39A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x39A JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xE1B JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xE0E JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0xE80 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x852 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x39A JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xF38 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xF38 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0xF8B DUP2 PUSH2 0xF67 JUMP JUMPDEST SWAP4 PUSH2 0xF99 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xEF7 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x39A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0xFBB JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xFAF JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xF38 JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x1013 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0xEF7 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x39A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x39A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x39A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x115D JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1162 JUMPI JUMPDEST PUSH2 0x115D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10D3 JUMPI JUMPDEST POP PUSH2 0x10D0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x112E JUMPI JUMPDEST POP CODESIZE PUSH2 0x10C6 JUMP JUMPDEST PUSH2 0x1150 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1156 JUMPI JUMPDEST PUSH2 0x1148 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1030 JUMP JUMPDEST CODESIZE PUSH2 0x1127 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x113E JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x108F JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x124D JUMPI JUMPDEST PUSH2 0x1195 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x30A JUMPI PUSH1 0x0 SWAP2 PUSH2 0x122E JUMPI JUMPDEST POP ISZERO PUSH2 0x1201 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1247 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1156 JUMPI PUSH2 0x1148 DUP2 DUP4 PUSH2 0xEF7 JUMP JUMPDEST CODESIZE PUSH2 0x11F8 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x118D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x1282 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x127C JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x12E7 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x1443 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x135F JUMPI JUMPDEST POP PUSH2 0x12E0 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x13E5 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x1359 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x39A JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x39A JUMPI SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1521 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x14E2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST SAR PUSH9 0x439A83BFF6A51C5926 0xC6 LOG1 JUMPF 0xA9BB PUSH25 0x7DE71B521B5FE6BE609203ADAA2E64736F6C634300081E0033 ","sourceMap":"879:1047:220:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1643:41;;;:::i;:::-;3179:19:352;879:1047:220;;;;;;;;2616:14:352;2612:76;;879:1047:220;-1:-1:-1;;879:1047:220;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;879:1047:220;4720:5:228;;;;;;;;;:::i;:::-;879:1047:220;;;;;;;4742:43:228;879:1047:220;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;879:1047:220;4796:104:228;879:1047:220;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;879:1047:220;19356:74:228;;879:1047:220;19356:74:228;;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;879:1047:220;19356:74:228;;;;;;;;879:1047:220;19356:74:228;879:1047:220;19356:74:228;879:1047:220;19356:74:228;;;4796:104;879:1047:220;;19356:101:228;19352:168;;879:1047:220;19352:168:228;19478:42;879:1047:220;19478:42:228;879:1047:220;;;;;;;;19478:42:228;19356:74;;;;879:1047:220;19356:74:228;879:1047:220;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;879:1047:220;;;;;;;;;4601:76:228;879:1047:220;4645:32:228;;;;879:1047:220;4645:32:228;879:1047:220;;;;;;;;4645:32:228;4532:59;4561:30;879:1047:220;4561:30:228;879:1047:220;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;879:1047:220;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;879:1047:220;-1:-1:-1;879:1047:220;14847:11:228;879:1047:220;;;;-1:-1:-1;879:1047:220;14847:28:228;879:1047:220;-1:-1:-1;879:1047:220;;;;;;-1:-1:-1;879:1047:220;;;;;;;;;;;;;;;;;;;;;;1643:41;;:::i;:::-;879:1047;;;;;;;3174:18:180;;;3170:53;;2109:26:228;879:1047:220;500:10:59;879:1047:220;500:10:59;;;879:1047:220;;;;636:1:180;879:1047:220;;;;3170:53:180;3201:22;879:1047:220;3201:22:180;879:1047:220;;;;3201:22:180;879:1047:220;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;879:1047:220;;1643:41;;;:::i;:::-;879:1047;;;14276:18:228;;;;14272:64;;879:1047:220;14401:42:228;14346:19;879:1047:220;-1:-1:-1;879:1047:220;14346:11:228;879:1047:220;;;-1:-1:-1;879:1047:220;;-1:-1:-1;879:1047:220;;;;-1:-1:-1;879:1047:220;;;;;;;;;;;;;;;;14401:42:228;879:1047:220;14272:64:228;14303:33;;879:1047:220;14303:33:228;879:1047:220;;;;14303:33:228;2071:115:211;2931:8:352;668:81;879:1047:220;2931:8:352;:::i;:::-;2071:115:211;;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;16129:20:228;;;;16125:59;;879:1047:220;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;879:1047:220;;;;;;;;;;;;;;:::i;:::-;;;;16273:3:228;16318:9;;;;;:::i;:::-;879:1047:220;;;;;;;;16306:30:228;16329:6;;;;;;:::i;:::-;879:1047:220;16306:30:228;;;:::i;:::-;879:1047:220;;;;;;;;;;;;;;;;;;;16250:9:228;;879:1047:220;;;;;;;;;;16125:59:228;16158:26;879:1047:220;16158:26:228;879:1047:220;;16158:26:228;879:1047:220;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1643:41;;;;;:::i;:::-;3179:19:352;879:1047:220;;;;;;;;2616:14:352;2612:76;;879:1047:220;-1:-1:-1;;879:1047:220;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;879:1047:220;6801:10:228;;;;;;879:1047:220;;;;;;;;;;6904:44:228;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;879:1047:220;6959:111:228;879:1047:220;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;879:1047:220;20263:81:228;;879:1047:220;20263:81:228;;879:1047:220;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;879:1047:220;20263:81:228;;;;;;;;879:1047:220;20263:81:228;879:1047:220;20263:81:228;879:1047:220;20263:81:228;;;6959:111;879:1047:220;;20263:107:228;20259:181;;879:1047:220;20259:181:228;1878:53;879:1047:220;1878:53:228;879:1047:220;;20391:49:228;;;;;;879:1047:220;20391:49:228;;879:1047:220;;;1878:53:228;;;879:1047:220;1878:53:228;;;;:::i;:::-;;879:1047:220;1878:53:228;;;;879:1047:220;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;879:1047:220;20263:81:228;879:1047:220;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;879:1047:220;6860:6:228;;;:::i;:::-;879:1047:220;6868:9:228;;;:::i;:::-;879:1047:220;6868:9:228;;;;;:::i;:::-;879:1047:220;6790:9:228;;6698:76;879:1047:220;6742:32:228;;;;879:1047:220;6742:32:228;879:1047:220;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;879:1047:220;;;;;;;;;;;;2650:44:211;879:1047:220;;:::i;:::-;;;;;2650:44:211;:::i;:::-;879:1047:220;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;879:1047:220;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;15240:220:228;;;879:1047:220;;;15358:19:228;15354:61;;15375:1;879:1047:220;;;;;15375:1:228;879:1047:220;15432:21:228;879:1047:220;-1:-1:-1;879:1047:220;;;;-1:-1:-1;879:1047:220;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;879:1047:220;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;879:1047:220;;;;;-1:-1:-1;879:1047:220;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;879:1047:220;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;879:1047:220;1029:19:76;879:1047:220;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;879:1047:220;;;;;;1676:74:76;;;;879:1047:220;1676:74:76;;;;;;879:1047:220;1327:10:76;879:1047:220;;;;1744:4:76;879:1047:220;;;;1676:74:76;;;;;;;879:1047:220;1676:74:76;;;1630:120;;;;;1676:74;;;;879:1047:220;1676:74:76;879:1047:220;1676:74:76;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;3271:479:352;879:1047:220;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;879:1047:220;;;3613:51:352;879:1047:220;;3613:51:352;;;;879:1047:220;3613:51:352;;3648:4;3613:51;;;879:1047:220;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;879:1047:220;;-1:-1:-1;3691:28:352;3613:51;;;;879:1047:220;3613:51:352;879:1047:220;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;879:1047:220;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;879:1047:220;;-1:-1:-1;879:1047:220;16997:11:228;879:1047:220;;;;-1:-1:-1;879:1047:220;16997:27:228;879:1047:220;-1:-1:-1;879:1047:220;;;;;-1:-1:-1;879:1047:220;;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;;:::o;17150:696::-;879:1047:220;17163:1:228;879:1047:220;;;;;17163:1:228;879:1047:220;;;;-1:-1:-1;879:1047:220;;;;-1:-1:-1;879:1047:220;;;;;;17330:29:228;;;;;17326:98;;879:1047:220;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;879:1047:220;17163:1:228;879:1047:220;;;;;17163:1:228;879:1047:220;;;;-1:-1:-1;879:1047:220;;;;-1:-1:-1;879:1047:220;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;879:1047:220;;17640:48:228;;;879:1047:220;;;17640:48:228;;;879:1047:220;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;879:1047:220;;17368:56:228;;;879:1047:220;;;;;17368:56:228;;;879:1047:220;;;;;;;;;;;;;;;;;;;20391:49:228;879:1047:220;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;879:1047:220;;;;;;;;;;;-1:-1:-1;879:1047:220;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"1096800","executionCost":"infinite","totalCost":"infinite"},"external":{"balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","initERC1155Storage()":"infinite","isApprovedForAll(address,address)":"2629","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","initERC1155Storage()":"c34106c8","isApprovedForAll(address,address)":"e985e9c5","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"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\":\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"initERC1155Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\",\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"initERC1155Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155 Multi Token Standard with Operator Filterer (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"initERC1155Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC1155.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol\":\"ERC1155WithOperatorFiltererFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/facets/ERC1155WithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\\ncontract ERC1155WithOperatorFiltererFacet is ERC1155WithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC1155Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC1155Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x303f02536cb38a6898ab94e7f84049fa5569e598fd4e6671af8ad374d254e6e6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"initERC1155Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC1155."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155.sol":{"IERC1155":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"approved","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":"values","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":"value","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"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0xd9b67a26.","kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approved":"True if the operator is approved, false if not."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Emits an {ApprovalForAll} event.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}}},"title":"ERC1155 Multi Token Standard, basic interface (functions).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"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"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"approved\",\"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\":\"values\",\"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\":\"value\",\"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\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0xd9b67a26.\",\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approved\":\"True if the operator is approved, false if not.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.Emits a {TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits a {TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}}},\"title\":\"ERC1155 Multi Token Standard, basic interface (functions).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155.sol\":\"IERC1155\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol":{"IERC1155Burnable":{"abi":[{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x921ed8d1.","kind":"dev","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}}},"title":"ERC1155 Multi Token Standard, optional extension: Burnable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[],uint256[])":"80534934","burnFrom(address,uint256,uint256)":"124d91e5"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x921ed8d1.\",\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Burnable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":\"IERC1155Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol":{"IERC1155Deliverable":{"abi":[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.","kind":"dev","methods":{"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts if `recipients`, `ids` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if one of `recipients` balance overflows.Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Deliverable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\",\"kind\":\"dev\",\"methods\":{\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `recipients`, `ids` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if one of `recipients` balance overflows.Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Deliverable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":\"IERC1155Deliverable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol":{"IERC1155MetadataSetter":{"abi":[{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{"batchSetTokenURI(uint256[],string[])":{"details":"Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"setTokenURI(uint256,string)":{"details":"Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchSetTokenURI(uint256[],string[])":"6706467b","setTokenURI(uint256,string)":"162094c4"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Sets the metadata URIs for a batch of tokens.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Sets the metadata URI for a token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":\"IERC1155MetadataSetter\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchSetTokenURI(uint256[],string[])":{"notice":"Sets the metadata URIs for a batch of tokens."},"setTokenURI(uint256,string)":{"notice":"Sets the metadata URI for a token."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol":{"IERC1155MetadataURI":{"abi":[{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x0e89341c.","kind":"dev","methods":{"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"title":"ERC1155 Multi Token Standard, optional extension: Metadata URI.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x0e89341c.\",\"kind\":\"dev\",\"methods\":{\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Metadata URI.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":\"IERC1155MetadataURI\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol":{"IERC1155Mintable":{"abi":[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x5190c92c.","kind":"dev","methods":{"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if `to` is the zero address.Reverts if `to`'s balance overflows for one of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.Emits an {IERC1155-TransferBatch} event.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `to`'s balance of `id` overflows.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits an {IERC1155-TransferSingle} event.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}}},"title":"ERC1155 Multi Token Standard, optional extension: Mintable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeMint(address,uint256,uint256,bytes)":"5cfa9297"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x5190c92c.\",\"kind\":\"dev\",\"methods\":{\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if `to` is the zero address.Reverts if `to`'s balance overflows for one of `ids`.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `to`'s balance of `id` overflows.Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}}},\"title\":\"ERC1155 Multi Token Standard, optional extension: Mintable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":\"IERC1155Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."}},"version":1}}},"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol":{"IERC1155TokenReceiver":{"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":"magicValue","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":"magicValue","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x4e2312e0.","kind":"dev","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"details":"Return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (`0xbc197c81`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.","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":{"magicValue":"`0xbc197c81` to accept the transfer, or any other value to reject it."}},"onERC1155Received(address,address,uint256,uint256,bytes)":{"details":"Return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (`0xf23a6e61`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.","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":{"magicValue":"`0xf23a6e61` to accept the transfer, or any other value to reject it."}}},"title":"ERC1155 Multi Token Standard, Tokens Receiver.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":"bc197c81","onERC1155Received(address,address,uint256,uint256,bytes)":"f23a6e61"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\":\"magicValue\",\"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\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1155Note: The ERC-165 identifier for this interface is 0x4e2312e0.\",\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\",\"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\":{\"magicValue\":\"`0xbc197c81` to accept the transfer, or any other value to reject it.\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\",\"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\":{\"magicValue\":\"`0xf23a6e61` to accept the transfer, or any other value to reject it.\"}}},\"title\":\"ERC1155 Multi Token Standard, Tokens Receiver.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"notice\":\"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\"}},\"notice\":\"Interface for any contract that wants to support transfers from ERC1155 asset contracts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":\"IERC1155TokenReceiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)":{"notice":"Handles the receipt of multiple ERC1155 token types.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates."},"onERC1155Received(address,address,uint256,uint256,bytes)":{"notice":"Handles the receipt of a single ERC1155 token type.ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update."}},"notice":"Interface for any contract that wants to support transfers from ERC1155 asset contracts.","version":1}}},"contracts/token/ERC1155/libraries/ERC1155Storage.sol":{"ERC1155Storage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220fc47fb24207aba8f598935515cb548025bef479cb85a21f9e4b1978b14011cbe64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC SELFBALANCE EXTSTATICCALL 0x24 KECCAK256 PUSH27 0xBA8F598935515CB548025BEF479CB85A21F9E4B1978B14011CBE64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1252:19197:228:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220fc47fb24207aba8f598935515cb548025bef479cb85a21f9e4b1978b14011cbe64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFC SELFBALANCE EXTSTATICCALL 0x24 KECCAK256 PUSH27 0xBA8F598935515CB548025BEF479CB85A21F9E4B1978B14011CBE64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1252:19197:228:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_burnToken(struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)":"infinite","_callOnERC1155BatchReceived(address,address,address,uint256[] memory,uint256[] memory,bytes memory)":"infinite","_callOnERC1155Received(address,address,address,uint256,uint256,bytes memory)":"infinite","_isOperatable(struct ERC1155Storage.Layout storage pointer,address,address)":"infinite","_mintToken(struct ERC1155Storage.Layout storage pointer,address,uint256,uint256)":"infinite","_transferToken(struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256)":"infinite","balanceOf(struct ERC1155Storage.Layout storage pointer,address,uint256)":"infinite","balanceOfBatch(struct ERC1155Storage.Layout storage pointer,address[] calldata,uint256[] calldata)":"infinite","batchBurnFrom(struct ERC1155Storage.Layout storage pointer,address,address,uint256[] calldata,uint256[] calldata)":"infinite","burnFrom(struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256)":"infinite","init()":"infinite","initERC1155Burnable()":"infinite","initERC1155Deliverable()":"infinite","initERC1155MetadataURI()":"infinite","initERC1155Mintable()":"infinite","isApprovedForAll(struct ERC1155Storage.Layout storage pointer,address,address)":"infinite","layout()":"infinite","safeBatchMint(struct ERC1155Storage.Layout storage pointer,address,address,uint256[] memory,uint256[] memory,bytes memory)":"infinite","safeBatchTransferFrom(struct ERC1155Storage.Layout storage pointer,address,address,address,uint256[] calldata,uint256[] calldata,bytes calldata)":"infinite","safeDeliver(struct ERC1155Storage.Layout storage pointer,address,address[] memory,uint256[] memory,uint256[] memory,bytes memory)":"infinite","safeMint(struct ERC1155Storage.Layout storage pointer,address,address,uint256,uint256,bytes memory)":"infinite","safeTransferFrom(struct ERC1155Storage.Layout storage pointer,address,address,address,uint256,uint256,bytes calldata)":"infinite","setApprovalForAll(struct ERC1155Storage.Layout storage pointer,address,address,bool)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":\"ERC1155Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC1155/preset/ERC1155Full.sol":{"ERC1155Full":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1542,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1505,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105dc57613e8c80380380610019816105e1565b928339810160a0828203126105dc5781516001600160401b0381116105dc5781610044918401610606565b602083015190916001600160401b0382116105dc57610064918401610606565b60408301519092906001600160a01b038116908190036105dc5760608201516001600160a01b03811692908390036105dc5760800151926001600160a01b03841684036105dc573361057d575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff199081166001908117909255636cdb3d1360e11b6000527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a805490911690911790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b0319169094179093558051906001600160401b03821161045357600080516020613e4c8339815191525490600182811c92168015610573575b60208310146104335781601f8493116104f6575b50602090601f831160011461047457600092610469575b50508160011b916000199060031b1c191617600080516020613e4c833981519152555b83516001600160401b03811161045357600080516020613e6c83398151915254600181811c91168015610449575b602082101461043357601f81116103c1575b50602094601f821160011461034057948192939495600092610335575b50508160011b916000199060031b1c191617600080516020613e6c833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b0319169190911790556303a24d0760e21b60009081526020919091526040808220805460ff199081166001908117909255631464324b60e21b84528284208054821683179055633a2ae73360e21b8452828420805482168317905563152a902d60e11b845292829020805490931617909155608091909152516137da9081610672823960805181818161212601528181612ccb01526132600152f35b01519050388061024c565b601f19821695600080516020613e6c833981519152600052806000209160005b8881106103a957508360019596979810610390575b505050811b01600080516020613e6c8339815191525561026f565b015160001960f88460031b161c19169055388080610375565b91926020600181928685015181550194019201610360565b600080516020613e6c8339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610429575b601f0160051c01905b81811061041d575061022f565b60008155600101610410565b9091508190610407565b634e487b7160e01b600052602260045260246000fd5b90607f169061021d565b634e487b7160e01b600052604160045260246000fd5b0151905038806101cc565b600080516020613e4c83398151915260009081528281209350601f198516905b8181106104de57509084600195949392106104c5575b505050811b01600080516020613e4c833981519152556101ef565b015160001960f88460031b161c191690553880806104aa565b92936020600181928786015181550195019301610494565b600080516020613e4c8339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c81019160208510610569575b90601f859493920160051c01905b81811061055a57506101b5565b6000815584935060010161054d565b909150819061053f565b91607f16916101a1565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761045357604052565b81601f820112156105dc578051906001600160401b03821161045357610635601f8301601f19166020016105e1565b92828452602083830101116105dc5760005b82811061065c57505060206000918301015290565b8060208092840101518282870101520161064756fe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461287d57806301ffc9a71461281757806306fdde03146127bc5780630d6a5bbb1461255a5780630e89341c14612403578063114ba8ee14612304578063162094c41461223d5780632a55205a1461214a5780632b4c9f16146120db5780632eb2c2d614611c9c5780632f2ff15d14611b105780634e1273f414611a32578063572b6c05146119e75780635cfa92971461191d57806361ba27da146118015780636706467b1461169957806373c8a958146114e95780638bb9c5bf1461137a5780638da5cb5b146113095780638dc251e3146111dc57806391d148541461114457806395d89b41146110d1578063a0c76f6214611060578063a22cb46514610f00578063b0ccc31e14610e8f578063c3666c3614610c52578063d539139314610bf9578063d547741f14610a70578063e1a8bf2c14610a34578063e8ab9ccc14610828578063e985e9c514610774578063f242432a14610442578063f2fde38b1461034e5763f7ba94bd1461019157600080fd5b346102f25761019f366129f6565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101e0613249565b925416911690810361032157508181036102f75760005b81811061020057005b61020b818387612d13565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102f257610235828587612d13565b35908147106102c057600080809381935af13d156102b8573d9061025882612bfd565b916102666040519384612b29565b82523d6000602084013e5b1561027f57506001016101f7565b80511561028e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610271565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576103856128eb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103af613249565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610321575073ffffffffffffffffffffffffffffffffffffffff16918282036103f357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102f25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576104796128eb565b61048161290e565b604435906064359260843567ffffffffffffffff81116102f2576104a99036906004016129c8565b926104b2613249565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610764575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561073a5761055582878361355d565b156106f05773ffffffffffffffffffffffffffffffffffffffff9161057e8a8a878a87966135dd565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105bb57005b6020926105c9913691612c37565b9261061f60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612954565b03816000865af19081156106e4577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106b5575b50160361068257005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106d7915060203d6020116106dd575b6106cf8183612b29565b81019061343a565b86610679565b503d6106c5565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61076d91613472565b8785610509565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576107ab6128eb565b73ffffffffffffffffffffffffffffffffffffffff6107c861290e565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760043567ffffffffffffffff81116102f257610877903690600401612997565b60243567ffffffffffffffff81116102f257610897903690600401612997565b929060443567ffffffffffffffff81116102f2576108b9903690600401612997565b93909160643567ffffffffffffffff81116102f2576108dc9036906004016129c8565b9390916108e7613249565b97610912897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461093d81612b99565b9761094b604051998a612b29565b818952602089019160051b8101903682116102f257915b818310610a0757505050916109806109889261099095943691612bb1565b973691612bb1565b933691612c37565b91835194805186148015906109fc575b6102f75760005b8681106109b057005b806109f68673ffffffffffffffffffffffffffffffffffffffff6109d66001958b613014565b51166109e28487613014565b516109ed8589613014565b51918d8a6130c8565b016109a7565b5081518614156109a0565b823573ffffffffffffffffffffffffffffffffffffffff811681036102f257815260209283019201610962565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576020604051620186a08152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257600435610aaa61290e565b610ab2613249565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032157507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102f257610c6036612a9a565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ca5613249565b92541691169081036103215750808214801590610e85575b6102f75760005b828110610ccd57005b73ffffffffffffffffffffffffffffffffffffffff610cf5610cf083858a612d13565b6130a7565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106e457600091610e57575b5015610e2a575073ffffffffffffffffffffffffffffffffffffffff610d84610cf083858a612d13565b1690610d94610cf0828689612d13565b91610da082878b612d13565b3592813b156102f257606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106e457600192610e19575b5001610cc4565b6000610e2491612b29565b88610e12565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e78915060203d8111610e7e575b610e708183612b29565b810190613231565b89610d5a565b503d610e66565b5082821415610cbd565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257610f376128eb565b60243590811515918281036102f257611031575b73ffffffffffffffffffffffffffffffffffffffff80610f69613249565b169116918183146110035760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61105b817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613472565b610f4b565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761114061112c7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5612e4b565b604051918291602083526020830190612954565b0390f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761117b61290e565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576112136128eb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611252613249565b925416911690810361032157507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112df5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113d5613249565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114a15760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bf4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102f2576114f736612a9a565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061153a613249565b9254169116908103610321575080841480159061168f575b6102f75760005b84811061156257005b61156d818388612d13565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102f25760006020916115a0610cf0868b8e612d13565b8261160a6116366115b2898d8d612d13565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612b29565b51925af1156106e4576000513d6116865750803b155b6116595750600101611559565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561164c565b5082841415611552565b346102f2576116a7366129f6565b8083949293036102f75773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117d357916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172357005b848110156117a4578060051b820135838112156102f25782019081359167ffffffffffffffff83116102f25760200182360381136102f2577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361178a848b8a612d13565b359261179b60405192839283612c6e565b0390a20161171a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611872613249565b925416911690810361032157507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a081116118f057815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576119546128eb565b6064359067ffffffffffffffff82116102f2576119786119e59236906004016129c8565b6119d7611983613249565b926119ae847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612c37565b9260443592602435926130c8565b005b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576020611a28611a236128eb565b612cb4565b6040519015158152f35b346102f257611a40366129f6565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861291908085036102f757611a7685612b99565b94611a846040519687612b29565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ab182612b99565b0136602088013760005b818110611ad857604051602080825281906111409082018a612a66565b80611aff611aec610cf0600194868b612d13565b611af7838789612d13565b359088612d23565b611b09828a613014565b5201611abb565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257600435611b4a61290e565b611b52613249565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032157507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c0557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bf4565b346102f25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257611cd36128eb565b611cdb61290e565b60443567ffffffffffffffff81116102f257611cfb903690600401612997565b929060643567ffffffffffffffff81116102f257611d1d903690600401612997565b9360843567ffffffffffffffff81116102f257611d3e9036906004016129c8565b939091611d49613249565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036120cb575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561073a57898b036102f757611df382848361355d565b156120815760005b8b8110612052575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611e7760405192839260408452611e698d60408601908d61306a565b91848303602086015261306a565b0390a43b611e8157005b602094611e96611e9e92611ea6953691612bb1565b993691612bb1565b953691612c37565b92611f5660405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f26611ef660a485018b612a66565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612a66565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612954565b03816000875af19081156106e4577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612033575b501603611fb957005b61202f90611fff6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612a66565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612a66565b0390fd5b61204c915060203d6020116106dd576106cf8183612b29565b86611fb0565b8061207b8c6120718f94612069816001978d612d13565b35928d612d13565b35908888876135dd565b01611dfb565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6120d491613472565b8987611da0565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612235575b156121ff57505061114060005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114091620186a08210156122225761221c90620186a092613028565b046121cf565b620186a06122309204613028565b6121cf565b5081156121c2565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760243567ffffffffffffffff81116102f25761228c9036906004016129c8565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117d3576122ff7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583612c6e565b0390a2005b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760043573ffffffffffffffffffffffffffffffffffffffff811681036102f2577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612392613249565b9254169116908103610321575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106e4576000916124d2575b6040516020808252819061114090820185612954565b3d8083833e6124e18183612b29565b8101906020818303126125525780519067ffffffffffffffff8211612556570181601f820112156125525780519261251884612bfd565b926125266040519485612b29565b8484526020858401011161254f5750611140926125499160208085019101612931565b906124bc565b80fd5b8280fd5b8380fd5b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576125916128eb565b60243567ffffffffffffffff81116102f2576125b1903690600401612997565b909160443567ffffffffffffffff81116102f2576125d3903690600401612997565b93909160643567ffffffffffffffff81116102f257612667936125fd61266f9236906004016129c8565b95909161265f61260b613249565b96612636887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612bb1565b983691612bb1565b943691612c37565b9173ffffffffffffffffffffffffffffffffffffffff821694851561279257865190855182036102f75760005b8281106127685750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806127096126fb8d6040840190612a66565b82810360208401528b612a66565b0390a43b61271357005b611f569160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f26611ef660a485018b612a66565b8061278c6127786001938c613014565b51612783838b613014565b5190888661335d565b0161269c565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761114061112c7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4612e4b565b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102f257611a28602091612d9c565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760206128e36128b96128eb565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612d23565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102f257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102f257565b60005b8381106129445750506000910152565b8181015183820152602001612934565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361299081518092818752878088019101612931565b0116010190565b9181601f840112156102f25782359167ffffffffffffffff83116102f2576020808501948460051b0101116102f257565b9181601f840112156102f25782359167ffffffffffffffff83116102f257602083818601950101116102f257565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102f25760043567ffffffffffffffff81116102f25781612a3f91600401612997565b929092916024359067ffffffffffffffff82116102f257612a6291600401612997565b9091565b906020808351928381520192019060005b818110612a845750505090565b8251845260209384019390920191600101612a77565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102f25760043567ffffffffffffffff81116102f25781612ae391600401612997565b9290929160243567ffffffffffffffff81116102f25781612b0691600401612997565b929092916044359067ffffffffffffffff82116102f257612a6291600401612997565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b6a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612b6a5760051b60200190565b929190612bbd81612b99565b93612bcb6040519586612b29565b602085838152019160051b81019283116102f257905b828210612bed57505050565b8135815260209182019101612be1565b67ffffffffffffffff8111612b6a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612c4382612bfd565b91612c516040519384612b29565b8294818452818301116102f2578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d0c5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117a45760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff831615612d725760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e45577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612e3f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015612f48575b602085108114612f1b57848752869392918115612edb5750600114612e94575b50612e9292500383612b29565b565b90506000929192526020600020906000915b818310612ebf575050906020612e929282010138612e85565b6020919350806001915483858901015201910190918492612ea6565b60209350612e929592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612e85565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693612e65565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612fac5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117a45760209160051b010190565b8181029291811591840414171561303b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102f25760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102f25790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156127925761310d87878573ffffffffffffffffffffffffffffffffffffffff9561335d565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61314f575b5050505050565b6131aa9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612954565b03816000865af19081156106e4577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613212575b501603610682578080613148565b61322b915060203d6020116106dd576106cf8183612b29565b38613204565b908160209103126102f2575180151581036102f25790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561334e573233148015613353575b61334e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156132d4575b506132d157503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106e45760009161332f575b50386132c7565b613348915060203d602011610e7e57610e708183612b29565b38613328565b503390565b5060183610613290565b90918361336b575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850194808611156133e157505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613365565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102f257517fffffffff00000000000000000000000000000000000000000000000000000000811681036102f25790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613553575b61349b575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106e457600091613534575b50156135075750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61354d915060203d602011610e7e57610e708183612b29565b386134fe565b50813b1515613493565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613588575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613582565b919290846135ec575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613748575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613664575b50613148565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156136ea57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061365e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea2646970667358221220700e169b9c84a0ba115ffd0797eed8dc9cf976fac40512724debf4b8220dd9b964736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5DC JUMPI PUSH2 0x3E8C DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5E1 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x5DC JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5DC JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x606 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5DC JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x606 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x5DC JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x5DC JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x5DC JUMPI CALLER PUSH2 0x57D JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x6CDB3D13 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E4C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x573 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x433 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x4F6 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x474 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x469 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E4C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E6C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x433 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3C1 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x340 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x335 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E6C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x3A24D07 PUSH1 0xE2 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x1464324B PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x3A2AE733 PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x37DA SWAP1 DUP2 PUSH2 0x672 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2126 ADD MSTORE DUP2 DUP2 PUSH2 0x2CCB ADD MSTORE PUSH2 0x3260 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24C JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E6C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3A9 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x390 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E6C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x26F JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x375 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x360 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E6C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x429 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x41D JUMPI POP PUSH2 0x22F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x410 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x407 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x21D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E4C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4DE JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4C5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E4C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x1EF JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4AA JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x494 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3E4C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x569 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x55A JUMPI POP PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x54D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x53F JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1A1 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x453 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5DC JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x453 JUMPI PUSH2 0x635 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5E1 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5DC JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x65C JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x647 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x287D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2817 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x27BC JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x255A JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2403 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2304 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x223D JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x214A JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x20DB JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B10 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A32 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19E7 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x191D JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1801 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1699 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14E9 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x137A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1309 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11DC JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1144 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10D1 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1060 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF00 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE8F JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC52 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xBF9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA70 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA34 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x828 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x774 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x34E JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x19F CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E0 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x200 JUMPI STOP JUMPDEST PUSH2 0x20B DUP2 DUP4 DUP8 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x235 DUP3 DUP6 DUP8 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2B8 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x258 DUP3 PUSH2 0x2BFD JUMP JUMPDEST SWAP2 PUSH2 0x266 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2B29 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x27F JUMPI POP PUSH1 0x1 ADD PUSH2 0x1F7 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x28E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x271 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x385 PUSH2 0x28EB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3AF PUSH2 0x3249 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3F3 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x479 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x481 PUSH2 0x290E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x4A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP3 PUSH2 0x4B2 PUSH2 0x3249 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x764 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x73A JUMPI PUSH2 0x555 DUP3 DUP8 DUP4 PUSH2 0x355D JUMP JUMPDEST ISZERO PUSH2 0x6F0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x57E DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x35DD JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5BB JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5C9 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH2 0x61F PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6B5 JUMPI JUMPDEST POP AND SUB PUSH2 0x682 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6D7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI JUMPDEST PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x343A JUMP JUMPDEST DUP7 PUSH2 0x679 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6C5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x76D SWAP2 PUSH2 0x3472 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x509 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x7AB PUSH2 0x28EB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7C8 PUSH2 0x290E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x877 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x897 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x8B9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x8DC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8E7 PUSH2 0x3249 JUMP JUMPDEST SWAP8 PUSH2 0x912 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x93D DUP2 PUSH2 0x2B99 JUMP JUMPDEST SWAP8 PUSH2 0x94B PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2B29 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2F2 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA07 JUMPI POP POP POP SWAP2 PUSH2 0x980 PUSH2 0x988 SWAP3 PUSH2 0x990 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0x9FC JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9B0 JUMPI STOP JUMPDEST DUP1 PUSH2 0x9F6 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9D6 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3014 JUMP JUMPDEST MLOAD AND PUSH2 0x9E2 DUP5 DUP8 PUSH2 0x3014 JUMP JUMPDEST MLOAD PUSH2 0x9ED DUP6 DUP10 PUSH2 0x3014 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x30C8 JUMP JUMPDEST ADD PUSH2 0x9A7 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9A0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x962 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAAA PUSH2 0x290E JUMP JUMPDEST PUSH2 0xAB2 PUSH2 0x3249 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB64 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0xC60 CALLDATASIZE PUSH2 0x2A9A JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCA5 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE85 JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCCD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xCF5 PUSH2 0xCF0 DUP4 DUP6 DUP11 PUSH2 0x2D13 JUMP JUMPDEST PUSH2 0x30A7 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE57 JUMPI JUMPDEST POP ISZERO PUSH2 0xE2A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD84 PUSH2 0xCF0 DUP4 DUP6 DUP11 PUSH2 0x2D13 JUMP JUMPDEST AND SWAP1 PUSH2 0xD94 PUSH2 0xCF0 DUP3 DUP7 DUP10 PUSH2 0x2D13 JUMP JUMPDEST SWAP2 PUSH2 0xDA0 DUP3 DUP8 DUP12 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2F2 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE19 JUMPI JUMPDEST POP ADD PUSH2 0xCC4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE24 SWAP2 PUSH2 0x2B29 JUMP JUMPDEST DUP9 PUSH2 0xE12 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE78 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE7E JUMPI JUMPDEST PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3231 JUMP JUMPDEST DUP10 PUSH2 0xD5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE66 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCBD JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0xF37 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x1031 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF69 PUSH2 0x3249 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1003 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x105B DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3472 JUMP JUMPDEST PUSH2 0xF4B JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1140 PUSH2 0x112C PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x2E4B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x117B PUSH2 0x290E JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1213 PUSH2 0x28EB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1252 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12DF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13D5 PUSH2 0x3249 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14A1 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBF4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x14F7 CALLDATASIZE PUSH2 0x2A9A JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x153A PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x168F JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1562 JUMPI STOP JUMPDEST PUSH2 0x156D DUP2 DUP4 DUP9 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15A0 PUSH2 0xCF0 DUP7 DUP12 DUP15 PUSH2 0x2D13 JUMP JUMPDEST DUP3 PUSH2 0x160A PUSH2 0x1636 PUSH2 0x15B2 DUP10 DUP14 DUP14 PUSH2 0x2D13 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2B29 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1686 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1659 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1559 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x164C JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1552 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x16A7 CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x2F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17D3 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x1723 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17A4 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x2F2 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x178A DUP5 DUP12 DUP11 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x179B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2C6E JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x171A JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1872 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x18F0 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1954 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x1978 PUSH2 0x19E5 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST PUSH2 0x19D7 PUSH2 0x1983 PUSH2 0x3249 JUMP JUMPDEST SWAP3 PUSH2 0x19AE DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x30C8 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH2 0x1A28 PUSH2 0x1A23 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x2CB4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x1A40 CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x2F7 JUMPI PUSH2 0x1A76 DUP6 PUSH2 0x2B99 JUMP JUMPDEST SWAP5 PUSH2 0x1A84 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2B29 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AB1 DUP3 PUSH2 0x2B99 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AD8 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1140 SWAP1 DUP3 ADD DUP11 PUSH2 0x2A66 JUMP JUMPDEST DUP1 PUSH2 0x1AFF PUSH2 0x1AEC PUSH2 0xCF0 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2D13 JUMP JUMPDEST PUSH2 0x1AF7 DUP4 DUP8 DUP10 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2D23 JUMP JUMPDEST PUSH2 0x1B09 DUP3 DUP11 PUSH2 0x3014 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ABB JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1B4A PUSH2 0x290E JUMP JUMPDEST PUSH2 0x1B52 PUSH2 0x3249 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C05 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBF4 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1CD3 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x1CDB PUSH2 0x290E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1CFB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1D1D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1D3E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1D49 PUSH2 0x3249 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20CB JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x73A JUMPI DUP10 DUP12 SUB PUSH2 0x2F7 JUMPI PUSH2 0x1DF3 DUP3 DUP5 DUP4 PUSH2 0x355D JUMP JUMPDEST ISZERO PUSH2 0x2081 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x2052 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1E77 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1E69 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x306A JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x306A JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1E81 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1E96 PUSH2 0x1E9E SWAP3 PUSH2 0x1EA6 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH2 0x1F56 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F26 PUSH2 0x1EF6 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2A66 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2A66 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2033 JUMPI JUMPDEST POP AND SUB PUSH2 0x1FB9 JUMPI STOP JUMPDEST PUSH2 0x202F SWAP1 PUSH2 0x1FFF PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2A66 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2A66 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x204C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP7 PUSH2 0x1FB0 JUMP JUMPDEST DUP1 PUSH2 0x207B DUP13 PUSH2 0x2071 DUP16 SWAP5 PUSH2 0x2069 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x35DD JUMP JUMPDEST ADD PUSH2 0x1DFB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x20D4 SWAP2 PUSH2 0x3472 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1DA0 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2235 JUMPI JUMPDEST ISZERO PUSH2 0x21FF JUMPI POP POP PUSH2 0x1140 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1140 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2222 JUMPI PUSH2 0x221C SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3028 JUMP JUMPDEST DIV PUSH2 0x21CF JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2230 SWAP3 DIV PUSH2 0x3028 JUMP JUMPDEST PUSH2 0x21CF JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x21C2 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x228C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17D3 JUMPI PUSH2 0x22FF PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x2C6E JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2392 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24D2 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1140 SWAP1 DUP3 ADD DUP6 PUSH2 0x2954 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x24E1 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2552 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2556 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2552 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2518 DUP5 PUSH2 0x2BFD JUMP JUMPDEST SWAP3 PUSH2 0x2526 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2B29 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x254F JUMPI POP PUSH2 0x1140 SWAP3 PUSH2 0x2549 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2931 JUMP JUMPDEST SWAP1 PUSH2 0x24BC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x2591 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x25B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x25D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x2667 SWAP4 PUSH2 0x25FD PUSH2 0x266F SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x265F PUSH2 0x260B PUSH2 0x3249 JUMP JUMPDEST SWAP7 PUSH2 0x2636 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2792 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2768 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2709 PUSH2 0x26FB DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2A66 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2A66 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2713 JUMPI STOP JUMPDEST PUSH2 0x1F56 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F26 PUSH2 0x1EF6 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2A66 JUMP JUMPDEST DUP1 PUSH2 0x278C PUSH2 0x2778 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3014 JUMP JUMPDEST MLOAD PUSH2 0x2783 DUP4 DUP12 PUSH2 0x3014 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x335D JUMP JUMPDEST ADD PUSH2 0x269C JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1140 PUSH2 0x112C PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x2E4B JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x1A28 PUSH1 0x20 SWAP2 PUSH2 0x2D9C JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH2 0x28E3 PUSH2 0x28B9 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2D23 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2944 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2934 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2990 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2931 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2F2 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2A3F SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x2A62 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2A84 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2A77 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2AE3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2B06 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x2A62 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2B6A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B6A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2BBD DUP2 PUSH2 0x2B99 JUMP JUMPDEST SWAP4 PUSH2 0x2BCB PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2B29 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2F2 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2BED JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2BE1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B6A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2C43 DUP3 PUSH2 0x2BFD JUMP JUMPDEST SWAP2 PUSH2 0x2C51 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2B29 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2F2 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D0C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17A4 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x2D72 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E45 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E3F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x2F48 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x2F1B JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x2EDB JUMPI POP PUSH1 0x1 EQ PUSH2 0x2E94 JUMPI JUMPDEST POP PUSH2 0x2E92 SWAP3 POP SUB DUP4 PUSH2 0x2B29 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2EBF JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2E92 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2E85 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2EA6 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2E92 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2E85 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x2E65 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2FAC JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17A4 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x303B JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2792 JUMPI PUSH2 0x310D DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x335D JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x314F JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x31AA SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3212 JUMPI JUMPDEST POP AND SUB PUSH2 0x682 JUMPI DUP1 DUP1 PUSH2 0x3148 JUMP JUMPDEST PUSH2 0x322B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x3204 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2F2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x334E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3353 JUMPI JUMPDEST PUSH2 0x334E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x32D4 JUMPI JUMPDEST POP PUSH2 0x32D1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x332F JUMPI JUMPDEST POP CODESIZE PUSH2 0x32C7 JUMP JUMPDEST PUSH2 0x3348 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE7E JUMPI PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x3328 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3290 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x336B JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x33E1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2F2 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3553 JUMPI JUMPDEST PUSH2 0x349B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3534 JUMPI JUMPDEST POP ISZERO PUSH2 0x3507 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x354D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE7E JUMPI PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x34FE JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3493 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3588 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3582 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x35EC JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3748 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3664 JUMPI JUMPDEST POP PUSH2 0x3148 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x36EA JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x365E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH17 0xE169B9C84A0BA115FFD0797EED8DC9CF9 PUSH23 0xFAC40512724DEBF4B8220DD9B964736F6C634300081E00 CALLER PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 ","sourceMap":"1054:1098:229:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;1499:10;1645:152:42;;-1:-1:-1;1054:1098:229;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;;1054:1098:229;;;-1:-1:-1;;;;;;1054:1098:229;;;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;;990:1:42;1054:1098:229;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;;;;-1:-1:-1;;;;;1054:1098:229;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;990:1:42;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;;1289:23:341;1054:1098:229;;-1:-1:-1;;;;;;1054:1098:229;;;;;;;-1:-1:-1;;;;500:10:59;;;1054:1098:229;500:10:59;;;;1054:1098:229;500:10:59;;;;;-1:-1:-1;;500:10:59;;;1054:1098:229;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;1054:1098:229;745:39:76;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1054:1098:229;;-1:-1:-1;1054:1098:229;;-1:-1:-1;1054:1098:229;;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;990:1:42;1054:1098:229;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;;;;;;;;;;;;1054:1098:229;;;;;;;-1:-1:-1;;;1054:1098:229;;;;;;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1054:1098:229;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1054:1098:229;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;990:1:42;1054:1098:229;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;1645:152:42;1054:1098:229;;;-1:-1:-1;;;;;;1054:1098:229;1499:10;1054:1098;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1054:1098:229;-1:-1:-1;1054:1098:229;;;;;;;;;-1:-1:-1;;1054:1098:229;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1054:1098:229;;;;;;;;-1:-1:-1;;1054:1098:229;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":10510,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":10906,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":10742,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":10647,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":11185,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":11319,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":12849,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":13370,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":10696,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":10475,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":10854,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":12394,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":10580,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":11374,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":11161,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11261,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":11539,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":12328,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":11851,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":10545,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11049,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":11555,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":13426,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12114,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":13661,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":11444,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":13149,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":12873,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":12488,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":11676,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferToken":{"entryPoint":13789,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":12308,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":12455,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8486},{"length":32,"start":11467},{"length":32,"start":12896}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461287d57806301ffc9a71461281757806306fdde03146127bc5780630d6a5bbb1461255a5780630e89341c14612403578063114ba8ee14612304578063162094c41461223d5780632a55205a1461214a5780632b4c9f16146120db5780632eb2c2d614611c9c5780632f2ff15d14611b105780634e1273f414611a32578063572b6c05146119e75780635cfa92971461191d57806361ba27da146118015780636706467b1461169957806373c8a958146114e95780638bb9c5bf1461137a5780638da5cb5b146113095780638dc251e3146111dc57806391d148541461114457806395d89b41146110d1578063a0c76f6214611060578063a22cb46514610f00578063b0ccc31e14610e8f578063c3666c3614610c52578063d539139314610bf9578063d547741f14610a70578063e1a8bf2c14610a34578063e8ab9ccc14610828578063e985e9c514610774578063f242432a14610442578063f2fde38b1461034e5763f7ba94bd1461019157600080fd5b346102f25761019f366129f6565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101e0613249565b925416911690810361032157508181036102f75760005b81811061020057005b61020b818387612d13565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102f257610235828587612d13565b35908147106102c057600080809381935af13d156102b8573d9061025882612bfd565b916102666040519384612b29565b82523d6000602084013e5b1561027f57506001016101f7565b80511561028e57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610271565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576103856128eb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103af613249565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610321575073ffffffffffffffffffffffffffffffffffffffff16918282036103f357005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102f25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576104796128eb565b61048161290e565b604435906064359260843567ffffffffffffffff81116102f2576104a99036906004016129c8565b926104b2613249565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610764575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561073a5761055582878361355d565b156106f05773ffffffffffffffffffffffffffffffffffffffff9161057e8a8a878a87966135dd565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105bb57005b6020926105c9913691612c37565b9261061f60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612954565b03816000865af19081156106e4577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106b5575b50160361068257005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106d7915060203d6020116106dd575b6106cf8183612b29565b81019061343a565b86610679565b503d6106c5565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61076d91613472565b8785610509565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576107ab6128eb565b73ffffffffffffffffffffffffffffffffffffffff6107c861290e565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760043567ffffffffffffffff81116102f257610877903690600401612997565b60243567ffffffffffffffff81116102f257610897903690600401612997565b929060443567ffffffffffffffff81116102f2576108b9903690600401612997565b93909160643567ffffffffffffffff81116102f2576108dc9036906004016129c8565b9390916108e7613249565b97610912897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461093d81612b99565b9761094b604051998a612b29565b818952602089019160051b8101903682116102f257915b818310610a0757505050916109806109889261099095943691612bb1565b973691612bb1565b933691612c37565b91835194805186148015906109fc575b6102f75760005b8681106109b057005b806109f68673ffffffffffffffffffffffffffffffffffffffff6109d66001958b613014565b51166109e28487613014565b516109ed8589613014565b51918d8a6130c8565b016109a7565b5081518614156109a0565b823573ffffffffffffffffffffffffffffffffffffffff811681036102f257815260209283019201610962565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576020604051620186a08152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257600435610aaa61290e565b610ab2613249565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032157507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102f257610c6036612a9a565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ca5613249565b92541691169081036103215750808214801590610e85575b6102f75760005b828110610ccd57005b73ffffffffffffffffffffffffffffffffffffffff610cf5610cf083858a612d13565b6130a7565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106e457600091610e57575b5015610e2a575073ffffffffffffffffffffffffffffffffffffffff610d84610cf083858a612d13565b1690610d94610cf0828689612d13565b91610da082878b612d13565b3592813b156102f257606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106e457600192610e19575b5001610cc4565b6000610e2491612b29565b88610e12565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e78915060203d8111610e7e575b610e708183612b29565b810190613231565b89610d5a565b503d610e66565b5082821415610cbd565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257610f376128eb565b60243590811515918281036102f257611031575b73ffffffffffffffffffffffffffffffffffffffff80610f69613249565b169116918183146110035760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61105b817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613472565b610f4b565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761114061112c7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5612e4b565b604051918291602083526020830190612954565b0390f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761117b61290e565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576112136128eb565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611252613249565b925416911690810361032157507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112df5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113d5613249565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114a15760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bf4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102f2576114f736612a9a565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061153a613249565b9254169116908103610321575080841480159061168f575b6102f75760005b84811061156257005b61156d818388612d13565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102f25760006020916115a0610cf0868b8e612d13565b8261160a6116366115b2898d8d612d13565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612b29565b51925af1156106e4576000513d6116865750803b155b6116595750600101611559565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561164c565b5082841415611552565b346102f2576116a7366129f6565b8083949293036102f75773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117d357916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172357005b848110156117a4578060051b820135838112156102f25782019081359167ffffffffffffffff83116102f25760200182360381136102f2577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361178a848b8a612d13565b359261179b60405192839283612c6e565b0390a20161171a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611872613249565b925416911690810361032157507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a081116118f057815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576119546128eb565b6064359067ffffffffffffffff82116102f2576119786119e59236906004016129c8565b6119d7611983613249565b926119ae847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612c37565b9260443592602435926130c8565b005b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576020611a28611a236128eb565b612cb4565b6040519015158152f35b346102f257611a40366129f6565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861291908085036102f757611a7685612b99565b94611a846040519687612b29565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611ab182612b99565b0136602088013760005b818110611ad857604051602080825281906111409082018a612a66565b80611aff611aec610cf0600194868b612d13565b611af7838789612d13565b359088612d23565b611b09828a613014565b5201611abb565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257600435611b4a61290e565b611b52613249565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032157507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c0557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bf4565b346102f25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257611cd36128eb565b611cdb61290e565b60443567ffffffffffffffff81116102f257611cfb903690600401612997565b929060643567ffffffffffffffff81116102f257611d1d903690600401612997565b9360843567ffffffffffffffff81116102f257611d3e9036906004016129c8565b939091611d49613249565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036120cb575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561073a57898b036102f757611df382848361355d565b156120815760005b8b8110612052575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611e7760405192839260408452611e698d60408601908d61306a565b91848303602086015261306a565b0390a43b611e8157005b602094611e96611e9e92611ea6953691612bb1565b993691612bb1565b953691612c37565b92611f5660405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f26611ef660a485018b612a66565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612a66565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612954565b03816000875af19081156106e4577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091612033575b501603611fb957005b61202f90611fff6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612a66565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612a66565b0390fd5b61204c915060203d6020116106dd576106cf8183612b29565b86611fb0565b8061207b8c6120718f94612069816001978d612d13565b35928d612d13565b35908888876135dd565b01611dfb565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6120d491613472565b8987611da0565b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612235575b156121ff57505061114060005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114091620186a08210156122225761221c90620186a092613028565b046121cf565b620186a06122309204613028565b6121cf565b5081156121c2565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760243567ffffffffffffffff81116102f25761228c9036906004016129c8565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117d3576122ff7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583612c6e565b0390a2005b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760043573ffffffffffffffffffffffffffffffffffffffff811681036102f2577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612392613249565b9254169116908103610321575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106e4576000916124d2575b6040516020808252819061114090820185612954565b3d8083833e6124e18183612b29565b8101906020818303126125525780519067ffffffffffffffff8211612556570181601f820112156125525780519261251884612bfd565b926125266040519485612b29565b8484526020858401011161254f5750611140926125499160208085019101612931565b906124bc565b80fd5b8280fd5b8380fd5b346102f25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576125916128eb565b60243567ffffffffffffffff81116102f2576125b1903690600401612997565b909160443567ffffffffffffffff81116102f2576125d3903690600401612997565b93909160643567ffffffffffffffff81116102f257612667936125fd61266f9236906004016129c8565b95909161265f61260b613249565b96612636887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22612f52565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612bb1565b983691612bb1565b943691612c37565b9173ffffffffffffffffffffffffffffffffffffffff821694851561279257865190855182036102f75760005b8281106127685750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806127096126fb8d6040840190612a66565b82810360208401528b612a66565b0390a43b61271357005b611f569160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f26611ef660a485018b612a66565b8061278c6127786001938c613014565b51612783838b613014565b5190888661335d565b0161269c565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102f25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25761114061112c7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4612e4b565b346102f25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f2576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102f257611a28602091612d9c565b346102f25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f25760206128e36128b96128eb565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612d23565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102f257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102f257565b60005b8381106129445750506000910152565b8181015183820152602001612934565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361299081518092818752878088019101612931565b0116010190565b9181601f840112156102f25782359167ffffffffffffffff83116102f2576020808501948460051b0101116102f257565b9181601f840112156102f25782359167ffffffffffffffff83116102f257602083818601950101116102f257565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102f25760043567ffffffffffffffff81116102f25781612a3f91600401612997565b929092916024359067ffffffffffffffff82116102f257612a6291600401612997565b9091565b906020808351928381520192019060005b818110612a845750505090565b8251845260209384019390920191600101612a77565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102f25760043567ffffffffffffffff81116102f25781612ae391600401612997565b9290929160243567ffffffffffffffff81116102f25781612b0691600401612997565b929092916044359067ffffffffffffffff82116102f257612a6291600401612997565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b6a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612b6a5760051b60200190565b929190612bbd81612b99565b93612bcb6040519586612b29565b602085838152019160051b81019283116102f257905b828210612bed57505050565b8135815260209182019101612be1565b67ffffffffffffffff8111612b6a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612c4382612bfd565b91612c516040519384612b29565b8294818452818301116102f2578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d0c5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117a45760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff831615612d725760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e45577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612e3f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c92600181168015612f48575b602085108114612f1b57848752869392918115612edb5750600114612e94575b50612e9292500383612b29565b565b90506000929192526020600020906000915b818310612ebf575050906020612e929282010138612e85565b6020919350806001915483858901015201910190918492612ea6565b60209350612e929592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612e85565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693612e65565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612fac5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117a45760209160051b010190565b8181029291811591840414171561303b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102f25760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102f25790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156127925761310d87878573ffffffffffffffffffffffffffffffffffffffff9561335d565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b61314f575b5050505050565b6131aa9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612954565b03816000865af19081156106e4577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613212575b501603610682578080613148565b61322b915060203d6020116106dd576106cf8183612b29565b38613204565b908160209103126102f2575180151581036102f25790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561334e573233148015613353575b61334e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156132d4575b506132d157503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106e45760009161332f575b50386132c7565b613348915060203d602011610e7e57610e708183612b29565b38613328565b503390565b5060183610613290565b90918361336b575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850194808611156133e157505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613365565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102f257517fffffffff00000000000000000000000000000000000000000000000000000000811681036102f25790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613553575b61349b575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106e457600091613534575b50156135075750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61354d915060203d602011610e7e57610e708183612b29565b386134fe565b50813b1515613493565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613588575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613582565b919290846135ec575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613748575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613664575b50613148565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff86166000526020526040600020549580870196808811156136ea57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff92831685528086528185209390935594168252909152205538808080808061365e565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea2646970667358221220700e169b9c84a0ba115ffd0797eed8dc9cf976fac40512724debf4b8220dd9b964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x287D JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2817 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x27BC JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x255A JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2403 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2304 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x223D JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x214A JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x20DB JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B10 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A32 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19E7 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x191D JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1801 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1699 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14E9 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x137A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1309 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11DC JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1144 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10D1 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1060 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF00 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE8F JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC52 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xBF9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA70 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA34 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x828 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x774 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x34E JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x19F CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E0 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x200 JUMPI STOP JUMPDEST PUSH2 0x20B DUP2 DUP4 DUP8 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x235 DUP3 DUP6 DUP8 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2B8 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x258 DUP3 PUSH2 0x2BFD JUMP JUMPDEST SWAP2 PUSH2 0x266 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2B29 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x27F JUMPI POP PUSH1 0x1 ADD PUSH2 0x1F7 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x28E JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x271 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x385 PUSH2 0x28EB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3AF PUSH2 0x3249 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3F3 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x479 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x481 PUSH2 0x290E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x4A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP3 PUSH2 0x4B2 PUSH2 0x3249 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x764 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x73A JUMPI PUSH2 0x555 DUP3 DUP8 DUP4 PUSH2 0x355D JUMP JUMPDEST ISZERO PUSH2 0x6F0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x57E DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x35DD JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5BB JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5C9 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH2 0x61F PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6B5 JUMPI JUMPDEST POP AND SUB PUSH2 0x682 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6D7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI JUMPDEST PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x343A JUMP JUMPDEST DUP7 PUSH2 0x679 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6C5 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x76D SWAP2 PUSH2 0x3472 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x509 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x7AB PUSH2 0x28EB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7C8 PUSH2 0x290E JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x877 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x897 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x8B9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x8DC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8E7 PUSH2 0x3249 JUMP JUMPDEST SWAP8 PUSH2 0x912 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x93D DUP2 PUSH2 0x2B99 JUMP JUMPDEST SWAP8 PUSH2 0x94B PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2B29 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2F2 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA07 JUMPI POP POP POP SWAP2 PUSH2 0x980 PUSH2 0x988 SWAP3 PUSH2 0x990 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0x9FC JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9B0 JUMPI STOP JUMPDEST DUP1 PUSH2 0x9F6 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9D6 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3014 JUMP JUMPDEST MLOAD AND PUSH2 0x9E2 DUP5 DUP8 PUSH2 0x3014 JUMP JUMPDEST MLOAD PUSH2 0x9ED DUP6 DUP10 PUSH2 0x3014 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x30C8 JUMP JUMPDEST ADD PUSH2 0x9A7 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9A0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x962 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAAA PUSH2 0x290E JUMP JUMPDEST PUSH2 0xAB2 PUSH2 0x3249 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB64 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0xC60 CALLDATASIZE PUSH2 0x2A9A JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCA5 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE85 JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCCD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xCF5 PUSH2 0xCF0 DUP4 DUP6 DUP11 PUSH2 0x2D13 JUMP JUMPDEST PUSH2 0x30A7 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE57 JUMPI JUMPDEST POP ISZERO PUSH2 0xE2A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD84 PUSH2 0xCF0 DUP4 DUP6 DUP11 PUSH2 0x2D13 JUMP JUMPDEST AND SWAP1 PUSH2 0xD94 PUSH2 0xCF0 DUP3 DUP7 DUP10 PUSH2 0x2D13 JUMP JUMPDEST SWAP2 PUSH2 0xDA0 DUP3 DUP8 DUP12 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2F2 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE19 JUMPI JUMPDEST POP ADD PUSH2 0xCC4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE24 SWAP2 PUSH2 0x2B29 JUMP JUMPDEST DUP9 PUSH2 0xE12 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE78 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE7E JUMPI JUMPDEST PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3231 JUMP JUMPDEST DUP10 PUSH2 0xD5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE66 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCBD JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0xF37 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x1031 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF69 PUSH2 0x3249 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1003 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x105B DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3472 JUMP JUMPDEST PUSH2 0xF4B JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1140 PUSH2 0x112C PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x2E4B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x117B PUSH2 0x290E JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1213 PUSH2 0x28EB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1252 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12DF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13D5 PUSH2 0x3249 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14A1 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBF4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x14F7 CALLDATASIZE PUSH2 0x2A9A JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x153A PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x168F JUMPI JUMPDEST PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1562 JUMPI STOP JUMPDEST PUSH2 0x156D DUP2 DUP4 DUP9 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15A0 PUSH2 0xCF0 DUP7 DUP12 DUP15 PUSH2 0x2D13 JUMP JUMPDEST DUP3 PUSH2 0x160A PUSH2 0x1636 PUSH2 0x15B2 DUP10 DUP14 DUP14 PUSH2 0x2D13 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2B29 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1686 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1659 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1559 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x164C JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1552 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x16A7 CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x2F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17D3 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x1723 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17A4 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x2F2 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x178A DUP5 DUP12 DUP11 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x179B PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2C6E JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x171A JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1872 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x18F0 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1954 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x1978 PUSH2 0x19E5 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST PUSH2 0x19D7 PUSH2 0x1983 PUSH2 0x3249 JUMP JUMPDEST SWAP3 PUSH2 0x19AE DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x30C8 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH2 0x1A28 PUSH2 0x1A23 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x2CB4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH2 0x1A40 CALLDATASIZE PUSH2 0x29F6 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x2F7 JUMPI PUSH2 0x1A76 DUP6 PUSH2 0x2B99 JUMP JUMPDEST SWAP5 PUSH2 0x1A84 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2B29 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1AB1 DUP3 PUSH2 0x2B99 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AD8 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1140 SWAP1 DUP3 ADD DUP11 PUSH2 0x2A66 JUMP JUMPDEST DUP1 PUSH2 0x1AFF PUSH2 0x1AEC PUSH2 0xCF0 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2D13 JUMP JUMPDEST PUSH2 0x1AF7 DUP4 DUP8 DUP10 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2D23 JUMP JUMPDEST PUSH2 0x1B09 DUP3 DUP11 PUSH2 0x3014 JUMP JUMPDEST MSTORE ADD PUSH2 0x1ABB JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1B4A PUSH2 0x290E JUMP JUMPDEST PUSH2 0x1B52 PUSH2 0x3249 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C05 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBF4 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1CD3 PUSH2 0x28EB JUMP JUMPDEST PUSH2 0x1CDB PUSH2 0x290E JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1CFB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1D1D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x1D3E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1D49 PUSH2 0x3249 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20CB JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x73A JUMPI DUP10 DUP12 SUB PUSH2 0x2F7 JUMPI PUSH2 0x1DF3 DUP3 DUP5 DUP4 PUSH2 0x355D JUMP JUMPDEST ISZERO PUSH2 0x2081 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x2052 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1E77 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1E69 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x306A JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x306A JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1E81 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1E96 PUSH2 0x1E9E SWAP3 PUSH2 0x1EA6 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP3 PUSH2 0x1F56 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F26 PUSH2 0x1EF6 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2A66 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2A66 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x2033 JUMPI JUMPDEST POP AND SUB PUSH2 0x1FB9 JUMPI STOP JUMPDEST PUSH2 0x202F SWAP1 PUSH2 0x1FFF PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2A66 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2A66 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x204C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP7 PUSH2 0x1FB0 JUMP JUMPDEST DUP1 PUSH2 0x207B DUP13 PUSH2 0x2071 DUP16 SWAP5 PUSH2 0x2069 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2D13 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x35DD JUMP JUMPDEST ADD PUSH2 0x1DFB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x20D4 SWAP2 PUSH2 0x3472 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1DA0 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2235 JUMPI JUMPDEST ISZERO PUSH2 0x21FF JUMPI POP POP PUSH2 0x1140 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1140 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2222 JUMPI PUSH2 0x221C SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3028 JUMP JUMPDEST DIV PUSH2 0x21CF JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2230 SWAP3 DIV PUSH2 0x3028 JUMP JUMPDEST PUSH2 0x21CF JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x21C2 JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x228C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17D3 JUMPI PUSH2 0x22FF PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x2C6E JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2392 PUSH2 0x3249 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x321 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24D2 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1140 SWAP1 DUP3 ADD DUP6 PUSH2 0x2954 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x24E1 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2552 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2556 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2552 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x2518 DUP5 PUSH2 0x2BFD JUMP JUMPDEST SWAP3 PUSH2 0x2526 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2B29 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x254F JUMPI POP PUSH2 0x1140 SWAP3 PUSH2 0x2549 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2931 JUMP JUMPDEST SWAP1 PUSH2 0x24BC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x2591 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x25B1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x25D3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI PUSH2 0x2667 SWAP4 PUSH2 0x25FD PUSH2 0x266F SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x29C8 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x265F PUSH2 0x260B PUSH2 0x3249 JUMP JUMPDEST SWAP7 PUSH2 0x2636 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x2F52 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2BB1 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2C37 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2792 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x2F7 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2768 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2709 PUSH2 0x26FB DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2A66 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2A66 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2713 JUMPI STOP JUMPDEST PUSH2 0x1F56 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F26 PUSH2 0x1EF6 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2A66 JUMP JUMPDEST DUP1 PUSH2 0x278C PUSH2 0x2778 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3014 JUMP JUMPDEST MLOAD PUSH2 0x2783 DUP4 DUP12 PUSH2 0x3014 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x335D JUMP JUMPDEST ADD PUSH2 0x269C JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH2 0x1140 PUSH2 0x112C PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x2E4B JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI PUSH2 0x1A28 PUSH1 0x20 SWAP2 PUSH2 0x2D9C JUMP JUMPDEST CALLVALUE PUSH2 0x2F2 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x20 PUSH2 0x28E3 PUSH2 0x28B9 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2D23 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2944 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2934 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2990 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2931 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2F2 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2F2 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2F2 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2A3F SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x2A62 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2A84 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2A77 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2F2 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2AE3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2 JUMPI DUP2 PUSH2 0x2B06 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2 JUMPI PUSH2 0x2A62 SWAP2 PUSH1 0x4 ADD PUSH2 0x2997 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2B6A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B6A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2BBD DUP2 PUSH2 0x2B99 JUMP JUMPDEST SWAP4 PUSH2 0x2BCB PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2B29 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2F2 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2BED JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2BE1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B6A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2C43 DUP3 PUSH2 0x2BFD JUMP JUMPDEST SWAP2 PUSH2 0x2C51 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2B29 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2F2 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D0C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17A4 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x2D72 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E45 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E3F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x2F48 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x2F1B JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x2EDB JUMPI POP PUSH1 0x1 EQ PUSH2 0x2E94 JUMPI JUMPDEST POP PUSH2 0x2E92 SWAP3 POP SUB DUP4 PUSH2 0x2B29 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2EBF JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2E92 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2E85 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2EA6 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2E92 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2E85 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x2E65 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2FAC JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17A4 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x303B JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2F2 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2792 JUMPI PUSH2 0x310D DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x335D JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x314F JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x31AA SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2954 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3212 JUMPI JUMPDEST POP AND SUB PUSH2 0x682 JUMPI DUP1 DUP1 PUSH2 0x3148 JUMP JUMPDEST PUSH2 0x322B SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6DD JUMPI PUSH2 0x6CF DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x3204 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2F2 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x334E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3353 JUMPI JUMPDEST PUSH2 0x334E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x32D4 JUMPI JUMPDEST POP PUSH2 0x32D1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x332F JUMPI JUMPDEST POP CODESIZE PUSH2 0x32C7 JUMP JUMPDEST PUSH2 0x3348 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE7E JUMPI PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x3328 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3290 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x336B JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x33E1 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2F2 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2F2 JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3553 JUMPI JUMPDEST PUSH2 0x349B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3534 JUMPI JUMPDEST POP ISZERO PUSH2 0x3507 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x354D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE7E JUMPI PUSH2 0xE70 DUP2 DUP4 PUSH2 0x2B29 JUMP JUMPDEST CODESIZE PUSH2 0x34FE JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3493 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3588 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3582 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x35EC JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3748 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3664 JUMPI JUMPDEST POP PUSH2 0x3148 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x36EA JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x365E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH17 0xE169B9C84A0BA115FFD0797EED8DC9CF9 PUSH23 0xFAC40512724DEBF4B8220DD9B964736F6C634300081E00 CALLER ","sourceMap":"1054:1098:229:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1054:1098:229;;1869:41;;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1054:1098:229;1845:10:192;;;;;;1054:1098:229;1857:3:192;1876:11;;;;;:::i;:::-;1054:1098:229;;;;;;;;;1898:10:192;;;;;:::i;:::-;1054:1098:229;1375:21:9;;;:30;1371:125;;1054:1098:229;1548:33:9;;;;;;;1054:1098:229;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1054:1098:229;;1834:9:192;;1591:58:9;1054:1098:229;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1054:1098:229;5957:19:9;1054:1098:229;;5957:19:9;1054:1098:229;;;;;1371:125:9;1455:21;;1428:57;1054:1098:229;1428:57:9;1054:1098:229;;;;;;1428:57:9;1054:1098:229;;;;1756:63:192;1793:26;1054:1098:229;1793:26:192;1054:1098:229;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1054:1098:229;;-1:-1:-1;4538:25:42;1054:1098:229;;;;;;;;;;;;;:::i;:::-;;1869:41;;;:::i;:::-;1054:1098;;;;;;;;3205:23:42;;;3201:60;;1054:1098:229;;;3275:25:42;;;;3271:146;;1054:1098:229;3271:146:42;1054:1098:229;;;;;;;;3361:45:42;1054:1098:229;3361:45:42;;1054:1098:229;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41;;;:::i;:::-;3179:19:352;1054:1098:229;;;;;;;;2616:14:352;2612:76;;1054:1098:229;-1:-1:-1;;1054:1098:229;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;1054:1098:229;4720:5:228;;;;;;;;;:::i;:::-;1054:1098:229;;;;;;;4742:43:228;1054:1098:229;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;1054:1098:229;4796:104:228;1054:1098:229;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;1054:1098:229;19356:74:228;;1054:1098:229;19356:74:228;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;1054:1098:229;19356:74:228;;;;;;;;1054:1098:229;19356:74:228;1054:1098:229;19356:74:228;1054:1098:229;19356:74:228;;;4796:104;1054:1098:229;;19356:101:228;19352:168;;1054:1098:229;19352:168:228;19478:42;1054:1098:229;19478:42:228;1054:1098:229;;;;;;;;19478:42:228;19356:74;;;;1054:1098:229;19356:74:228;1054:1098:229;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1054:1098:229;;;;;;;;;4601:76:228;1054:1098:229;4645:32:228;;;;1054:1098:229;4645:32:228;1054:1098:229;;;;;;;;4645:32:228;4532:59;4561:30;1054:1098:229;4561:30:228;1054:1098:229;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1054:1098:229;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;1054:1098:229;-1:-1:-1;1054:1098:229;14847:11:228;1054:1098:229;;;;-1:-1:-1;1054:1098:229;14847:28:228;1054:1098:229;-1:-1:-1;1054:1098:229;;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;1054:1098:229;1367:6:208;:::i;:::-;1054:1098:229;974:8:208;;;;:::i;:::-;1054:1098:229;;;;;;;:::i;:::-;974:8:208;;;1054:1098:229;974:8:208;;;;;;;1054:1098:229;;974:8:208;;;;;;;;;;;1054:1098:229;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;1054:1098:229;11728:10:228;;;;;;1054:1098:229;11740:3:228;11778:13;11812:4;11778:13;1054:1098:229;11778:13:228;1054:1098:229;11778:13:228;;;:::i;:::-;1054:1098:229;;11793:6:228;;;;:::i;:::-;1054:1098:229;11801:9:228;;;;:::i;:::-;1054:1098:229;11812:4:228;;;;:::i;:::-;1054:1098:229;11717:9:228;;11620:47;1054:1098:229;;;11644:23:228;;;11620:47;;974:8:208;1054:1098:229;;;;;;;;;974:8:208;;1054:1098:229;974:8:208;;;;;;;1054:1098:229;;;;;;;;;;;;;;713:6:351;1054:1098:229;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41;;:::i;:::-;5148:19:42;1054:1098:229;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1054:1098:229;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;1880:140:41;;1054:1098:229;1880:140:41;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1054:1098:229;;;;1973:36:41;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1054:1098:229;;;1869:41;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1054:1098:229;3852:94:192;;1054:1098:229;3972:10:192;;;;;;1054:1098:229;3984:3:192;1054:1098:229;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1054:1098:229;;;;4058:76:192;;4108:25;1054:1098:229;4058:76:192;;1054:1098:229;4058:76:192;;;;;;;;;;;;1054:1098:229;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1054:1098:229;4239:12:192;;;;;;:::i;:::-;1054:1098:229;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1054:1098:229;4239:70:192;;;;;;;1054:1098:229;;;;;;;4239:70:192;;;;;1054:1098:229;4239:70:192;;4277:4;1054:1098:229;4239:70:192;;1054:1098:229;;4058:76:192;1054:1098:229;;;;;;;4239:70:192;;;;;;;1054:1098:229;4239:70:192;;;3984:3;;1054:1098:229;3961:9:192;;4239:70;1054:1098:229;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1054:1098:229;4161:50:192;1054:1098:229;;4058:76:192;1054:1098:229;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;1054:1098:229;;1869:41;;;:::i;:::-;1054:1098;;;14276:18:228;;;;14272:64;;1054:1098:229;14401:42:228;14346:19;1054:1098:229;-1:-1:-1;1054:1098:229;14346:11:228;1054:1098:229;;;-1:-1:-1;1054:1098:229;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;;;;;14401:42:228;1054:1098:229;14272:64:228;14303:33;;1054:1098:229;14303:33:228;1054:1098:229;;;;14303:33:228;2071:115:211;2931:8:352;668:81;1054:1098:229;2931:8:352;:::i;:::-;2071:115:211;;1054:1098:229;;;;;;;;;;;;;2991:23:341;1054:1098:229;;;;;;;;;;;;;;;;;;;;;2688:13:341;1054:1098:229;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1054:1098:229;-1:-1:-1;1054:1098:229;;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1869:41;;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;2976:19:351;1054:1098:229;;;;;1732:22:351;1728:93;;1054:1098:229;;;;;;;;;;;;1728:93:351;1777:33;1054:1098:229;1777:33:351;1054:1098:229;;1777:33:351;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1869:41;;:::i;:::-;1054:1098;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;3741:25:41;3737:66;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1054:1098:229;;;;2455:33:41;1054:1098:229;3737:66:41;1054:1098:229;3775:28:41;;;1054:1098:229;3775:28:41;1054:1098:229;;;;;;;3775:28:41;1054:1098:229;;;;;;;:::i;:::-;5148:19:42;;;;1054:1098:229;;;1869:41;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1054:1098:229;2776:90:192;;1054:1098:229;2892:10:192;;;;;;1054:1098:229;2904:3:192;2923:9;;;;;:::i;:::-;1054:1098:229;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1054:1098:229;;;1328:43:8;;;;;;1054:1098:229;;;;1328:43:8;;;1054:1098:229;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1054:1098:229;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1054:1098:229;;2881:9:192;;8938:146:8;9033:40;1054:1098:229;9033:40:8;1054:1098:229;;1328:43:8;1054:1098:229;9033:40:8;8942:68;1054:1098:229;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1054:1098:229;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;1054:1098:229;2991:23:341;1054:1098:229;;2464:10:209;:71;2460:115;;2591:9;1054:1098:229;;;;;;;2586:102:209;2602:19;;;;;;1054:1098:229;2623:3:209;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;1054:1098:229;2665:11:209;;;;;;:::i;:::-;1054:1098:229;;2647:30:209;1054:1098:229;;2647:30:209;;;;;:::i;:::-;;;;1054:1098:229;2591:9:209;;1054:1098:229;;;;;;;;;;2460:115:209;2544:31;1054:1098:229;2544:31:209;2464:10;1054:1098:229;;;;2544:31:209;1054:1098:229;;;;;;;;;;;;;;;1869:41;;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;2976:19:351;1054:1098:229;1281:36:351;713:6;1281:36;;1277:119;;1054:1098:229;;;;;;;;;;;;;;;1277:119:351;1340:45;1054:1098:229;1340:45:351;1054:1098:229;;;;1340:45:351;1054:1098:229;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;1054:1098:229;;;;;;:::i;:::-;;1869:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;1054:1098:229;1221:6:210;:::i;:::-;1054:1098:229;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;1054:1098:229;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;1054:1098:229;;16447:19:228;16129:20;;;16125:59;;1054:1098:229;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;1054:1098:229;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;1054:1098:229;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;1054:1098:229;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;1054:1098:229;;16250:9:228;;1054:1098:229;;;;;;;;;;;;;;;:::i;:::-;1869:41;;:::i;:::-;5148:19:42;1054:1098:229;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1054:1098:229;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;1254:25:41;1250:140;;1054:1098:229;1250:140:41;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1054:1098:229;;;;1343:36:41;1054:1098:229;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1869:41;;;;;:::i;:::-;3179:19:352;1054:1098:229;;;;;;;;2616:14:352;2612:76;;1054:1098:229;-1:-1:-1;;1054:1098:229;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;1054:1098:229;6801:10:228;;;;;;1054:1098:229;;;;;;;;;;6904:44:228;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;1054:1098:229;6959:111:228;1054:1098:229;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;1054:1098:229;20263:81:228;;1054:1098:229;20263:81:228;;1054:1098:229;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;1054:1098:229;20263:81:228;;;;;;;;1054:1098:229;20263:81:228;1054:1098:229;20263:81:228;1054:1098:229;20263:81:228;;;6959:111;1054:1098:229;;20263:107:228;20259:181;;1054:1098:229;20259:181:228;1878:53;1054:1098:229;1878:53:228;1054:1098:229;;20391:49:228;;;;;;1054:1098:229;20391:49:228;;1054:1098:229;;;1878:53:228;;;1054:1098:229;1878:53:228;;;;:::i;:::-;;1054:1098:229;1878:53:228;;;;1054:1098:229;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;1054:1098:229;20263:81:228;1054:1098:229;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;1054:1098:229;6860:6:228;;;:::i;:::-;1054:1098:229;6868:9:228;;;:::i;:::-;1054:1098:229;6868:9:228;;;;;:::i;:::-;1054:1098:229;6790:9:228;;6698:76;1054:1098:229;6742:32:228;;;;1054:1098:229;6742:32:228;1054:1098:229;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1054:1098:229;;;;;;;;;;;;;;;941:19:75;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1054:1098:229;2499:377:351;;;2559:17;;1054:1098:229;;2499:377:351;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1054:1098:229;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1054:1098:229;2499:377:351;;2607:259;713:6;2794:57;1054:1098:229;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2991:23:341;1054:1098:229;;1716:10:209;:71;1712:115;;1842:22;;1054:1098:229;;;;;;;;1842:22:209;;;:::i;:::-;;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;1869:41;;;:::i;:::-;1054:1098;;;;;4503:26:42;;;4499:64;;3179:19:352;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;3364:23:341;1054:1098:229;;;;3364:64:341;;1306:4:209;1054:1098:229;3364:64:341;;;1054:1098:229;;;;;;;;;;-1:-1:-1;;1054:1098:229;;;;;;;;3364:64:341;;;;;;;1054:1098:229;3364:64:341;;;1054:1098:229;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1869:41;;;1054:1098;1869:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;1054:1098:229;1669:6:210;:::i;:::-;1054:1098:229;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;1054:1098:229;;;;;9777:23:228;;9773:62;;1054:1098:229;9862:10:228;;;;;;1054:1098:229;;;;;;;;;9955:50:228;1054:1098:229;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;1054:1098:229;10016:117:228;1054:1098:229;;;;;;20263:81:228;;;;;1054:1098:229;20263:81:228;;1054:1098:229;20263:81:228;;1054:1098:229;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;1054:1098:229;9911:6:228;;;:::i;:::-;1054:1098:229;9919:9:228;;;;:::i;:::-;1054:1098:229;9919:9:228;;;;:::i;:::-;1054:1098:229;9851:9:228;;9671:55;9700:26;1054:1098:229;9700:26:228;1054:1098:229;;9700:26:228;1054:1098:229;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1054:1098:229;635:65:55;;:::i;1054:1098:229:-;;;;;;;;;;;;2650:44:211;1054:1098:229;;:::i;:::-;;;;;2650:44:211;:::i;:::-;1054:1098:229;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1054:1098:229;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1054:1098:229;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1054:1098:229;1146:19:75;1054:1098:229;1146:53:75;;;1142:96;;1054:1098:229;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1054:1098:229;1215:12:75;:::o;1054:1098:229:-;;;;;;;;;;;;:::o;15240:220:228:-;;;1054:1098:229;;;15358:19:228;15354:61;;15375:1;1054:1098:229;;;;;15375:1:228;1054:1098:229;15432:21:228;1054:1098:229;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;1054:1098:229;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1054:1098:229;500:10:59;1054:1098:229;500:10:59;;;;1054:1098:229;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1054:1098:229;1528:12:59;:::o;1054:1098:229:-;;;;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1054:1098:229;;;;;-1:-1:-1;1054:1098:229;;-1:-1:-1;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;1054:1098:229;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1054:1098:229;3775:28:41;;-1:-1:-1;3775:28:41;1054:1098:229;3775:28:41;1054:1098:229;;;;;-1:-1:-1;3775:28:41;1054:1098:229;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;1054:1098:229;;;8152:16:228;;;8148:55;;8236:5;;;;1054:1098:229;8236:5:228;;:::i;:::-;1054:1098:229;;;8166:1:228;1054:1098:229;8258:49:228;1054:1098:229;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;1054:1098:229;;;;;;19356:74:228;;;;;1054:1098:229;19356:74:228;;;;;1054:1098:229;8166:1:228;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;1054:1098:229;19356:74:228;1054:1098:229;19356:74:228;8166:1;19356:74;;;8318:110;1054:1098:229;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;1054:1098:229;19356:74:228;1054:1098:229;19356:74:228;;;;;;;:::i;:::-;;;;1054:1098:229;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1054:1098:229;1029:19:76;1054:1098:229;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1054:1098:229;;;;;;1676:74:76;;;;1054:1098:229;1676:74:76;;;;;;1054:1098:229;1327:10:76;1054:1098:229;;;;1744:4:76;1054:1098:229;;;;1676:74:76;;;;;;;1054:1098:229;1676:74:76;;;1630:120;;;;;1676:74;;;;1054:1098:229;1676:74:76;1054:1098:229;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;1054:1098:229;17966:1:228;1054:1098:229;;;;;17966:1:228;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;;;18123:21:228;;;;;18119:80;;1054:1098:229;;17966:1:228;1054:1098:229;;;;;17966:1:228;1054:1098:229;18217:18:228;1054:1098:229;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;17953:320:228;;;;;;18119:80;1054:1098:229;;18153:46:228;;;1054:1098:229;;;18153:46:228;;;1054:1098:229;;;;;;;;;;;;;;;;;;20391:49:228;1054:1098:229;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;1054:1098:229;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1054:1098:229;;;3613:51:352;1054:1098:229;;3613:51:352;;;;1054:1098:229;3613:51:352;;3648:4;3613:51;;;1054:1098:229;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1054:1098:229;;-1:-1:-1;3691:28:352;3613:51;;;;1054:1098:229;3613:51:352;1054:1098:229;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;1054:1098:229;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;1054:1098:229;;-1:-1:-1;1054:1098:229;16997:11:228;1054:1098:229;;;;-1:-1:-1;1054:1098:229;16997:27:228;1054:1098:229;-1:-1:-1;1054:1098:229;;;500:10:59;1054:1098:229;-1:-1:-1;1054:1098:229;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;1054:1098:229;17163:1:228;1054:1098:229;;;;;17163:1:228;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;;;17330:29:228;;;;;17326:98;;1054:1098:229;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;1054:1098:229;17163:1:228;1054:1098:229;;;;;17163:1:228;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;-1:-1:-1;1054:1098:229;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;1054:1098:229;;17640:48:228;;;1054:1098:229;;;17640:48:228;;;1054:1098:229;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;1054:1098:229;;17368:56:228;;;1054:1098:229;;;;;17368:56:228;;;1054:1098:229;;;;;;;;;;;;;;;;;;;20391:49:228"},"gasEstimates":{"creation":{"codeDepositCost":"2859600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"716","ROYALTY_FEE_DENOMINATOR()":"760","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2895","isApprovedForAll(address,address)":"3179","isTrustedForwarder(address)":"infinite","metadataResolver()":"2737","name()":"infinite","operatorFilterRegistry()":"2781","owner()":"2649","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2455","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchSetTokenURI(uint256[],string[])":"6706467b","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/preset/ERC1155Full.sol\":\"ERC1155Full\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./base/ERC1155DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\\n    constructor() {\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x66d13c9e643f22c8bebea5c0266b175a4b4868616453832c5a1ca819c560f389\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./base/ERC1155MetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0x0fb7629855ad3af8c8e677fffc7b32c891b9346a2cb86986a0be8ab045fa88a4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC1155Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xb9ba2417238c386a02e193f03882682ab0f043bb84eff39287985c11fc2c1bed\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/ERC1155Full.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155WithOperatorFilterer} from \\\"./../ERC1155WithOperatorFilterer.sol\\\";\\nimport {ERC1155Metadata} from \\\"./../ERC1155Metadata.sol\\\";\\nimport {ERC1155Mintable} from \\\"./../ERC1155Mintable.sol\\\";\\nimport {ERC1155Deliverable} from \\\"./../ERC1155Deliverable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155Full is\\n    ERC1155WithOperatorFilterer,\\n    ERC1155Metadata,\\n    ERC1155Mintable,\\n    ERC1155Deliverable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC1155WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x61da94d134dcee6a05efd8b202450f914ad5c39e0b3e1376db64bd6bf42b0b41\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/token/ERC1155/preset/ERC1155FullBurn.sol":{"ERC1155FullBurn":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1563,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1526,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105f15761424e80380380610019816105f6565b928339810160a0828203126105f15781516001600160401b0381116105f1578161004491840161061b565b602083015190916001600160401b0382116105f15761006491840161061b565b60408301519092906001600160a01b038116908190036105f15760608201516001600160a01b03811692908390036105f15760800151926001600160a01b03841684036105f15733610592575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff199081166001908117909255636cdb3d1360e11b6000527f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a805490911690911790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b0319169094179093558051906001600160401b0382116104685760008051602061420e8339815191525490600182811c92168015610588575b60208310146104485781601f84931161050b575b50602090601f83116001146104895760009261047e575b50508160011b916000199060031b1c19161760008051602061420e833981519152555b83516001600160401b0381116104685760008051602061422e83398151915254600181811c9116801561045e575b602082101461044857601f81116103d6575b50602094601f82116001146103555794819293949560009261034a575b50508160011b916000199060031b1c19161760008051602061422e833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b0319169190911790556303a24d0760e21b60009081526020919091526040808220805460ff199081166001908117909255631464324b60e21b84528284208054821683179055633a2ae73360e21b8452828420805482168317905563921ed8d160e01b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613b87908161068782396080518181816122b501528181612f7501526135340152f35b01519050388061024c565b601f1982169560008051602061422e833981519152600052806000209160005b8881106103be575083600195969798106103a5575b505050811b0160008051602061422e8339815191525561026f565b015160001960f88460031b161c1916905538808061038a565b91926020600181928685015181550194019201610375565b60008051602061422e8339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061043e575b601f0160051c01905b818110610432575061022f565b60008155600101610425565b909150819061041c565b634e487b7160e01b600052602260045260246000fd5b90607f169061021d565b634e487b7160e01b600052604160045260246000fd5b0151905038806101cc565b60008051602061420e83398151915260009081528281209350601f198516905b8181106104f357509084600195949392106104da575b505050811b0160008051602061420e833981519152556101ef565b015160001960f88460031b161c191690553880806104bf565b929360206001819287860151815501950193016104a9565b60008051602061420e8339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c8101916020851061057e575b90601f859493920160051c01905b81811061056f57506101b5565b60008155849350600101610562565b9091508190610554565b91607f16916101a1565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761046857604052565b81601f820112156105f1578051906001600160401b0382116104685761064a601f8301601f19166020016105f6565b92828452602083830101116105f15760005b82811061067157505060206000918301015290565b8060208092840101518282870101520161065c56fe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14612b2757806301ffc9a714612ac157806306fdde0314612a665780630d6a5bbb146128045780630e89341c146126ad578063114ba8ee146125ae578063124d91e514612493578063162094c4146123cc5780632a55205a146122d95780632b4c9f161461226a5780632eb2c2d614611e445780632f2ff15d14611cb85780634e1273f414611bda578063572b6c0514611b8f5780635cfa929714611ac557806361ba27da146119a95780636706467b1461184157806373c8a9581461169157806380534934146114ff5780638bb9c5bf146113905780638da5cb5b1461131f5780638dc251e3146111f257806391d148541461115a57806395d89b41146110e7578063a0c76f6214611076578063a22cb46514610f16578063b0ccc31e14610ea5578063c3666c3614610c68578063d539139314610c0f578063d547741f14610a86578063e1a8bf2c14610a4a578063e8ab9ccc1461083e578063e985e9c51461078a578063f242432a14610458578063f2fde38b146103645763f7ba94bd146101a757600080fd5b34610308576101b536612ca0565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101f661351d565b9254169116908103610337575081810361030d5760005b81811061021657005b610221818387612fbd565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103085761024b828587612fbd565b35908147106102d657600080809381935af13d156102ce573d9061026e82612ea7565b9161027c6040519384612dd3565b82523d6000602084013e5b15610295575060010161020d565b8051156102a457602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610287565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761039b612b95565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103c561351d565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610337575073ffffffffffffffffffffffffffffffffffffffff169182820361040957005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761048f612b95565b610497612bb8565b604435906064359260843567ffffffffffffffff8111610308576104bf903690600401612c72565b926104c861351d565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361077a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156107505761056b828783613743565b156107065773ffffffffffffffffffffffffffffffffffffffff916105948a8a878a879661398a565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105d157005b6020926105df913691612ee1565b9261063560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612bfe565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106cb575b50160361069857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106ed915060203d6020116106f3575b6106e58183612dd3565b81019061370b565b8661068f565b503d6106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b6107839161389f565b878561051f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576107c1612b95565b73ffffffffffffffffffffffffffffffffffffffff6107de612bb8565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff81116103085761088d903690600401612c41565b60243567ffffffffffffffff8111610308576108ad903690600401612c41565b929060443567ffffffffffffffff8111610308576108cf903690600401612c41565b93909160643567ffffffffffffffff8111610308576108f2903690600401612c72565b9390916108fd61351d565b97610928897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095381612e43565b97610961604051998a612dd3565b818952602089019160051b81019036821161030857915b818310610a1d575050509161099661099e926109a695943691612e5b565b973691612e5b565b933691612ee1565b9183519480518614801590610a12575b61030d5760005b8681106109c657005b80610a0c8673ffffffffffffffffffffffffffffffffffffffff6109ec6001958b6132be565b51166109f884876132be565b51610a0385896132be565b51918d8a61339c565b016109bd565b5081518614156109b6565b823573ffffffffffffffffffffffffffffffffffffffff8116810361030857815260209283019201610978565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020604051620186a08152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435610ac0612bb8565b610ac861351d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b7a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461030857610c7636612d44565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cbb61351d565b92541691169081036103375750808214801590610e9b575b61030d5760005b828110610ce357005b73ffffffffffffffffffffffffffffffffffffffff610d0b610d0683858a612fbd565b61337b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106fa57600091610e6d575b5015610e40575073ffffffffffffffffffffffffffffffffffffffff610d9a610d0683858a612fbd565b1690610daa610d06828689612fbd565b91610db682878b612fbd565b3592813b1561030857606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106fa57600192610e2f575b5001610cda565b6000610e3a91612dd3565b88610e28565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e8e915060203d8111610e94575b610e868183612dd3565b810190613505565b89610d70565b503d610e7c565b5082821415610cd3565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857610f4d612b95565b602435908115159182810361030857611047575b73ffffffffffffffffffffffffffffffffffffffff80610f7f61351d565b169116918183146110195760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611071817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061389f565b610f61565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56130f5565b604051918291602083526020830190612bfe565b0390f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611191612bb8565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611229612b95565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061126861351d565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112f55773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113eb61351d565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114b75760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c0a565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103085760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611536612b95565b60243567ffffffffffffffff811161030857611556903690600401612c41565b9060443567ffffffffffffffff811161030857611577903690600401612c41565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115a261351d565b9483820361030d576115b5868883613743565b156116475760005b82811061161b575050946116167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613351565b0390a4005b8061164161162c600193868a612fbd565b35611638838989612fbd565b35908b866137c3565b016115bd565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103085761169f36612d44565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116e261351d565b92541691169081036103375750808414801590611837575b61030d5760005b84811061170a57005b611715818388612fbd565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610308576000602091611748610d06868b8e612fbd565b826117b26117de61175a898d8d612fbd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612dd3565b51925af1156106fa576000513d61182e5750803b155b6118015750600101611701565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117f4565b50828414156116fa565b346103085761184f36612ca0565b80839492930361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361197b57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118cb57005b8481101561194c578060051b820135838112156103085782019081359167ffffffffffffffff8311610308576020018236038113610308577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611932848b8a612fbd565b359261194360405192839283612f18565b0390a2016118c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a1a61351d565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611a9857815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611afc612b95565b6064359067ffffffffffffffff821161030857611b20611b8d923690600401612c72565b611b7f611b2b61351d565b92611b56847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612ee1565b92604435926024359261339c565b005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020611bd0611bcb612b95565b612f5e565b6040519015158152f35b3461030857611be836612ca0565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030d57611c1e85612e43565b94611c2c6040519687612dd3565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c5982612e43565b0136602088013760005b818110611c8057604051602080825281906111569082018a612d10565b80611ca7611c94610d06600194868b612fbd565b611c9f838789612fbd565b359088612fcd565b611cb1828a6132be565b5201611c63565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435611cf2612bb8565b611cfa61351d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611dad57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c0a565b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611e7b612b95565b611e83612bb8565b60443567ffffffffffffffff811161030857611ea3903690600401612c41565b929060643567ffffffffffffffff811161030857611ec5903690600401612c41565b9360843567ffffffffffffffff811161030857611ee6903690600401612c72565b939091611ef161351d565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff82160361225a575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075057898b0361030d57611f9b828483613743565b156122105760005b8b81106121e1575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61200699169a8b92169889936040519182918d8c8b85613351565b0390a43b61201057005b60209461202561202d92612035953691612e5b565b993691612e5b565b953691612ee1565b926120e560405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526120b561208560a485018b612d10565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612d10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612bfe565b03816000875af19081156106fa577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916121c2575b50160361214857005b6121be9061218e6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612d10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612d10565b0390fd5b6121db915060203d6020116106f3576106e58183612dd3565b8661213f565b8061220a8c6122008f946121f8816001978d612fbd565b35928d612fbd565b359088888761398a565b01611fa3565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122639161389f565b8987611f48565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156123c4575b1561238e57505061115660005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61115691620186a08210156123b1576123ab90620186a0926132d2565b0461235e565b620186a06123bf92046132d2565b61235e565b508115612351565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760243567ffffffffffffffff81116103085761241b903690600401612c72565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361197b5761248e7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583612f18565b0390a2005b346103085760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576124ca612b95565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126024356044356124f961351d565b92612505848683613743565b156125645773ffffffffffffffffffffffffffffffffffffffff8086846125537fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b6040986137c3565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043573ffffffffffffffffffffffffffffffffffffffff81168103610308577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061263c61351d565b9254169116908103610337575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106fa5760009161277c575b6040516020808252819061115690820185612bfe565b3d8083833e61278b8183612dd3565b8101906020818303126127fc5780519067ffffffffffffffff8211612800570181601f820112156127fc578051926127c284612ea7565b926127d06040519485612dd3565b848452602085840101116127f95750611156926127f39160208085019101612bdb565b90612766565b80fd5b8280fd5b8380fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761283b612b95565b60243567ffffffffffffffff81116103085761285b903690600401612c41565b909160443567ffffffffffffffff81116103085761287d903690600401612c41565b93909160643567ffffffffffffffff811161030857612911936128a7612919923690600401612c72565b9590916129096128b561351d565b966128e0887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612e5b565b983691612e5b565b943691612ee1565b9173ffffffffffffffffffffffffffffffffffffffff8216948515612a3c578651908551820361030d5760005b828110612a125750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806129b36129a58d6040840190612d10565b82810360208401528b612d10565b0390a43b6129bd57005b6120e59160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526120b561208560a485018b612d10565b80612a36612a226001938c6132be565b51612a2d838b6132be565b5190888661362e565b01612946565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46130f5565b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361030857611bd0602091613046565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020612b8d612b63612b95565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612fcd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b60005b838110612bee5750506000910152565b8181015183820152602001612bde565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612c3a81518092818752878088019101612bdb565b0116010190565b9181601f840112156103085782359167ffffffffffffffff8311610308576020808501948460051b01011161030857565b9181601f840112156103085782359167ffffffffffffffff8311610308576020838186019501011161030857565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781612ce991600401612c41565b929092916024359067ffffffffffffffff821161030857612d0c91600401612c41565b9091565b906020808351928381520192019060005b818110612d2e5750505090565b8251845260209384019390920191600101612d21565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781612d8d91600401612c41565b9290929160243567ffffffffffffffff81116103085781612db091600401612c41565b929092916044359067ffffffffffffffff821161030857612d0c91600401612c41565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612e1457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612e145760051b60200190565b929190612e6781612e43565b93612e756040519586612dd3565b602085838152019160051b810192831161030857905b828210612e9757505050565b8135815260209182019101612e8b565b67ffffffffffffffff8111612e1457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612eed82612ea7565b91612efb6040519384612dd3565b829481845281830111610308578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612fb65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b919081101561194c5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561301c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146130ef577f01ffc9a70000000000000000000000000000000000000000000000000000000081146130e9576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c926001811680156131f2575b6020851081146131c557848752869392918115613185575060011461313e575b5061313c92500383612dd3565b565b90506000929192526020600020906000915b81831061316957505090602061313c928201013861312f565b6020919350806001915483858901015201910190918492613150565b6020935061313c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861312f565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f169361310f565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156132565750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561194c5760209160051b010190565b818102929181159184041417156132e557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103085760209260051b809284830137010190565b929061336a906133789593604086526040860191613314565b926020818503910152613314565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103085790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415612a3c576133e187878573ffffffffffffffffffffffffffffffffffffffff9561362e565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613423575b5050505050565b61347e9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612bfe565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916134e6575b50160361069857808061341c565b6134ff915060203d6020116106f3576106e58183612dd3565b386134d8565b90816020910312610308575180151581036103085790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561361f573233148015613624575b61361f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156135a5575b5061337857503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106fa57600091613600575b503861359b565b613619915060203d602011610e9457610e868183612dd3565b386135f9565b503390565b5060183610613564565b90918361363c575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850194808611156136b257505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613636565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261030857517fffffffff00000000000000000000000000000000000000000000000000000000811681036103085790565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561376e575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613768565b9091836137d05750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808503948086101561384657505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613636565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580613980575b6138c8575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106fa57600091613961575b50156139345750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61397a915060203d602011610e9457610e868183612dd3565b3861392b565b50813b15156138c0565b91929084613999575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613af5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613a11575b5061341c565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613a9757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613a0b565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea264697066735822122013da43c8f47a7cab8fd08c41afb1f9f7c9cc3de700d6fdf78bd308ab473ea0af64736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5F1 JUMPI PUSH2 0x424E DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5F6 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x5F1 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5F1 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x61B JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5F1 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x61B JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x5F1 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x5F1 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x5F1 JUMPI CALLER PUSH2 0x592 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x6CDB3D13 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x588 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x448 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x50B JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x489 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x47E JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x422E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x45E JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x448 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3D6 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x355 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x34A JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x422E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x3A24D07 PUSH1 0xE2 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x1464324B PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x3A2AE733 PUSH1 0xE2 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x921ED8D1 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3B87 SWAP1 DUP2 PUSH2 0x687 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x22B5 ADD MSTORE DUP2 DUP2 PUSH2 0x2F75 ADD MSTORE PUSH2 0x3534 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24C JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x422E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3BE JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3A5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x422E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x26F JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x38A JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x375 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x422E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x43E JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x432 JUMPI POP PUSH2 0x22F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x425 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x41C JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x21D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1CC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4F3 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4DA JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x1EF JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4BF JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4A9 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x420E DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x57E JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x56F JUMPI POP PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x562 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x554 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1A1 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x468 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5F1 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x468 JUMPI PUSH2 0x64A PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5F6 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5F1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x671 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x65C JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2B27 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2AC1 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2A66 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2804 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x26AD JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x25AE JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x2493 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x23CC JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x22D9 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x226A JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1E44 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1CB8 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BDA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1B8F JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AC5 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19A9 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1841 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1691 JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x14FF JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1390 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131F JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11F2 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x115A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1076 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF16 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEA5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC68 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC0F JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA86 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA4A JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x83E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x78A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x364 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1B5 CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1F6 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP2 DUP2 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x216 JUMPI STOP JUMPDEST PUSH2 0x221 DUP2 DUP4 DUP8 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x308 JUMPI PUSH2 0x24B DUP3 DUP6 DUP8 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2CE JUMPI RETURNDATASIZE SWAP1 PUSH2 0x26E DUP3 PUSH2 0x2EA7 JUMP JUMPDEST SWAP2 PUSH2 0x27C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2DD3 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x295 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x287 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x39B PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3C5 PUSH2 0x351D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x409 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x48F PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x497 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x4BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP3 PUSH2 0x4C8 PUSH2 0x351D JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x77A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x750 JUMPI PUSH2 0x56B DUP3 DUP8 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x706 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x594 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x398A JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5D1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5DF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH2 0x635 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6CB JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI JUMPDEST PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x370B JUMP JUMPDEST DUP7 PUSH2 0x68F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x783 SWAP2 PUSH2 0x389F JUMP JUMPDEST DUP8 DUP6 PUSH2 0x51F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x7C1 PUSH2 0x2B95 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DE PUSH2 0x2BB8 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x88D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8CF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8F2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8FD PUSH2 0x351D JUMP JUMPDEST SWAP8 PUSH2 0x928 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x953 DUP2 PUSH2 0x2E43 JUMP JUMPDEST SWAP8 PUSH2 0x961 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA1D JUMPI POP POP POP SWAP2 PUSH2 0x996 PUSH2 0x99E SWAP3 PUSH2 0x9A6 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA12 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9C6 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA0C DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9EC PUSH1 0x1 SWAP6 DUP12 PUSH2 0x32BE JUMP JUMPDEST MLOAD AND PUSH2 0x9F8 DUP5 DUP8 PUSH2 0x32BE JUMP JUMPDEST MLOAD PUSH2 0xA03 DUP6 DUP10 PUSH2 0x32BE JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x339C JUMP JUMPDEST ADD PUSH2 0x9BD JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9B6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAC0 PUSH2 0x2BB8 JUMP JUMPDEST PUSH2 0xAC8 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB7A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0xC76 CALLDATASIZE PUSH2 0x2D44 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCBB PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCE3 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0B PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x2FBD JUMP JUMPDEST PUSH2 0x337B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE6D JUMPI JUMPDEST POP ISZERO PUSH2 0xE40 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD9A PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x2FBD JUMP JUMPDEST AND SWAP1 PUSH2 0xDAA PUSH2 0xD06 DUP3 DUP7 DUP10 PUSH2 0x2FBD JUMP JUMPDEST SWAP2 PUSH2 0xDB6 DUP3 DUP8 DUP12 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x308 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE2F JUMPI JUMPDEST POP ADD PUSH2 0xCDA JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3A SWAP2 PUSH2 0x2DD3 JUMP JUMPDEST DUP9 PUSH2 0xE28 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE8E SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE94 JUMPI JUMPDEST PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3505 JUMP JUMPDEST DUP10 PUSH2 0xD70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE7C JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCD3 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0xF4D PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1047 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF7F PUSH2 0x351D JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1019 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1071 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x389F JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x30F5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1191 PUSH2 0x2BB8 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1229 PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1268 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12F5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13EB PUSH2 0x351D JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1536 PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1556 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1577 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15A2 PUSH2 0x351D JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x30D JUMPI PUSH2 0x15B5 DUP7 DUP9 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x1647 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x161B JUMPI POP POP SWAP5 PUSH2 0x1616 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3351 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1641 PUSH2 0x162C PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH2 0x1638 DUP4 DUP10 DUP10 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x37C3 JUMP JUMPDEST ADD PUSH2 0x15BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x169F CALLDATASIZE PUSH2 0x2D44 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16E2 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1837 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x170A JUMPI STOP JUMPDEST PUSH2 0x1715 DUP2 DUP4 DUP9 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x308 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1748 PUSH2 0xD06 DUP7 DUP12 DUP15 PUSH2 0x2FBD JUMP JUMPDEST DUP3 PUSH2 0x17B2 PUSH2 0x17DE PUSH2 0x175A DUP10 DUP14 DUP14 PUSH2 0x2FBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2DD3 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x182E JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1801 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1701 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17F4 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x16FA JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x184F CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x197B JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18CB JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x194C JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x308 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x308 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1932 DUP5 DUP12 DUP11 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1943 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2F18 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18C2 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A1A PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1A98 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1AFC PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x1B20 PUSH2 0x1B8D SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST PUSH2 0x1B7F PUSH2 0x1B2B PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x1B56 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x339C JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x1BD0 PUSH2 0x1BCB PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x2F5E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1BE8 CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x30D JUMPI PUSH2 0x1C1E DUP6 PUSH2 0x2E43 JUMP JUMPDEST SWAP5 PUSH2 0x1C2C PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2DD3 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C59 DUP3 PUSH2 0x2E43 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C80 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP11 PUSH2 0x2D10 JUMP JUMPDEST DUP1 PUSH2 0x1CA7 PUSH2 0x1C94 PUSH2 0xD06 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2FBD JUMP JUMPDEST PUSH2 0x1C9F DUP4 DUP8 DUP10 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2FCD JUMP JUMPDEST PUSH2 0x1CB1 DUP3 DUP11 PUSH2 0x32BE JUMP JUMPDEST MSTORE ADD PUSH2 0x1C63 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1CF2 PUSH2 0x2BB8 JUMP JUMPDEST PUSH2 0x1CFA PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1DAD JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1E7B PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x1E83 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EA3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EC5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EE6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1EF1 PUSH2 0x351D JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x225A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x750 JUMPI DUP10 DUP12 SUB PUSH2 0x30D JUMPI PUSH2 0x1F9B DUP3 DUP5 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x2210 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x21E1 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2006 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3351 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2010 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2025 PUSH2 0x202D SWAP3 PUSH2 0x2035 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH2 0x20E5 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20B5 PUSH2 0x2085 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2D10 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2D10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x21C2 JUMPI JUMPDEST POP AND SUB PUSH2 0x2148 JUMPI STOP JUMPDEST PUSH2 0x21BE SWAP1 PUSH2 0x218E PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2D10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2D10 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x21DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP7 PUSH2 0x213F JUMP JUMPDEST DUP1 PUSH2 0x220A DUP13 PUSH2 0x2200 DUP16 SWAP5 PUSH2 0x21F8 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x398A JUMP JUMPDEST ADD PUSH2 0x1FA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2263 SWAP2 PUSH2 0x389F JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1F48 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x23C4 JUMPI JUMPDEST ISZERO PUSH2 0x238E JUMPI POP POP PUSH2 0x1156 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1156 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x23B1 JUMPI PUSH2 0x23AB SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x32D2 JUMP JUMPDEST DIV PUSH2 0x235E JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x23BF SWAP3 DIV PUSH2 0x32D2 JUMP JUMPDEST PUSH2 0x235E JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2351 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x241B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x197B JUMPI PUSH2 0x248E PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x2F18 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x24CA PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x24F9 PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x2505 DUP5 DUP7 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x2564 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x2553 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x37C3 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x263C PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x277C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP6 PUSH2 0x2BFE JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x278B DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x27FC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2800 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x27FC JUMPI DUP1 MLOAD SWAP3 PUSH2 0x27C2 DUP5 PUSH2 0x2EA7 JUMP JUMPDEST SWAP3 PUSH2 0x27D0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2DD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x27F9 JUMPI POP PUSH2 0x1156 SWAP3 PUSH2 0x27F3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2BDB JUMP JUMPDEST SWAP1 PUSH2 0x2766 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x283B PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x285B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x287D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2911 SWAP4 PUSH2 0x28A7 PUSH2 0x2919 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2909 PUSH2 0x28B5 PUSH2 0x351D JUMP JUMPDEST SWAP7 PUSH2 0x28E0 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2A3C JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2A12 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x29B3 PUSH2 0x29A5 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2D10 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2D10 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x29BD JUMPI STOP JUMPDEST PUSH2 0x20E5 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20B5 PUSH2 0x2085 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2D10 JUMP JUMPDEST DUP1 PUSH2 0x2A36 PUSH2 0x2A22 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x32BE JUMP JUMPDEST MLOAD PUSH2 0x2A2D DUP4 DUP12 PUSH2 0x32BE JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x362E JUMP JUMPDEST ADD PUSH2 0x2946 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x30F5 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1BD0 PUSH1 0x20 SWAP2 PUSH2 0x3046 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x2B8D PUSH2 0x2B63 PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2FCD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2BEE JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2BDE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2C3A DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2BDB JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2CE9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x2D0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D2E JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2D21 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2D8D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2DB0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x2D0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2E14 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2E14 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2E67 DUP2 PUSH2 0x2E43 JUMP JUMPDEST SWAP4 PUSH2 0x2E75 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2DD3 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x308 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2E97 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E8B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2E14 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2EED DUP3 PUSH2 0x2EA7 JUMP JUMPDEST SWAP2 PUSH2 0x2EFB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2DD3 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x308 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2FB6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x194C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x301C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x30EF JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x30E9 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x31F2 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x31C5 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3185 JUMPI POP PUSH1 0x1 EQ PUSH2 0x313E JUMPI JUMPDEST POP PUSH2 0x313C SWAP3 POP SUB DUP4 PUSH2 0x2DD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3169 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x313C SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x312F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3150 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x313C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x312F JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x310F JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3256 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x194C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x32E5 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x336A SWAP1 PUSH2 0x3378 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3314 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3314 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2A3C JUMPI PUSH2 0x33E1 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x362E JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3423 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x347E SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x34E6 JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI DUP1 DUP1 PUSH2 0x341C JUMP JUMPDEST PUSH2 0x34FF SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x34D8 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x361F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3624 JUMPI JUMPDEST PUSH2 0x361F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35A5 JUMPI JUMPDEST POP PUSH2 0x3378 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3600 JUMPI JUMPDEST POP CODESIZE PUSH2 0x359B JUMP JUMPDEST PUSH2 0x3619 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x35F9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3564 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x363C JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x36B2 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3636 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x376E JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3768 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x37D0 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x3846 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3636 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3980 JUMPI JUMPDEST PUSH2 0x38C8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3961 JUMPI JUMPDEST POP ISZERO PUSH2 0x3934 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x397A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x392B JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x38C0 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3999 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3AF5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3A11 JUMPI JUMPDEST POP PUSH2 0x341C JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3A97 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A0B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SGT 0xDA NUMBER 0xC8 DELEGATECALL PUSH27 0x7CAB8FD08C41AFB1F9F7C9CC3DE700D6FDF78BD308AB473EA0AF64 PUSH20 0x6F6C634300081E00337EA68FD2DCF1C056B94DB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A47EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A50000 ","sourceMap":"1112:1123:230:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;1582:10;1645:152:42;;-1:-1:-1;1112:1123:230;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;;1112:1123:230;;;-1:-1:-1;;;;;;1112:1123:230;;;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;;990:1:42;1112:1123:230;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;;;;-1:-1:-1;;;;;1112:1123:230;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;990:1:42;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;;1289:23:341;1112:1123:230;;-1:-1:-1;;;;;;1112:1123:230;;;;;;;-1:-1:-1;;;;500:10:59;;;1112:1123:230;500:10:59;;;;1112:1123:230;500:10:59;;;;;-1:-1:-1;;500:10:59;;;1112:1123:230;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;1112:1123:230;745:39:76;;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1112:1123:230;;-1:-1:-1;1112:1123:230;;-1:-1:-1;1112:1123:230;;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;990:1:42;1112:1123:230;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;;;;;;;;;;;;1112:1123:230;;;;;;;-1:-1:-1;;;1112:1123:230;;;;;;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1112:1123:230;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1112:1123:230;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;990:1:42;1112:1123:230;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;1645:152:42;1112:1123:230;;;-1:-1:-1;;;;;;1112:1123:230;1582:10;1112:1123;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1112:1123:230;-1:-1:-1;1112:1123:230;;;;;;;;;-1:-1:-1;;1112:1123:230;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1112:1123:230;;;;;;;;-1:-1:-1;;1112:1123:230;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":11157,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11588,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11424,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":11329,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":11867,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":12001,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13573,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":14091,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11378,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":11192,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":11536,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":13076,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata_array_uint256_dyn_calldata":{"entryPoint":13137,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":11262,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":12056,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":11843,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11943,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":12221,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":13010,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":12533,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":11227,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11731,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":12237,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_burnToken":{"entryPoint":14275,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":14495,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12796,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":14147,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":12126,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":13870,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":13597,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":13212,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":12358,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferToken":{"entryPoint":14730,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":12990,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":13179,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8885},{"length":32,"start":12149},{"length":32,"start":13620}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14612b2757806301ffc9a714612ac157806306fdde0314612a665780630d6a5bbb146128045780630e89341c146126ad578063114ba8ee146125ae578063124d91e514612493578063162094c4146123cc5780632a55205a146122d95780632b4c9f161461226a5780632eb2c2d614611e445780632f2ff15d14611cb85780634e1273f414611bda578063572b6c0514611b8f5780635cfa929714611ac557806361ba27da146119a95780636706467b1461184157806373c8a9581461169157806380534934146114ff5780638bb9c5bf146113905780638da5cb5b1461131f5780638dc251e3146111f257806391d148541461115a57806395d89b41146110e7578063a0c76f6214611076578063a22cb46514610f16578063b0ccc31e14610ea5578063c3666c3614610c68578063d539139314610c0f578063d547741f14610a86578063e1a8bf2c14610a4a578063e8ab9ccc1461083e578063e985e9c51461078a578063f242432a14610458578063f2fde38b146103645763f7ba94bd146101a757600080fd5b34610308576101b536612ca0565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101f661351d565b9254169116908103610337575081810361030d5760005b81811061021657005b610221818387612fbd565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103085761024b828587612fbd565b35908147106102d657600080809381935af13d156102ce573d9061026e82612ea7565b9161027c6040519384612dd3565b82523d6000602084013e5b15610295575060010161020d565b8051156102a457602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610287565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761039b612b95565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103c561351d565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610337575073ffffffffffffffffffffffffffffffffffffffff169182820361040957005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761048f612b95565b610497612bb8565b604435906064359260843567ffffffffffffffff8111610308576104bf903690600401612c72565b926104c861351d565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361077a575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861286156107505761056b828783613743565b156107065773ffffffffffffffffffffffffffffffffffffffff916105948a8a878a879661398a565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105d157005b6020926105df913691612ee1565b9261063560405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a4830190612bfe565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106cb575b50160361069857005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106ed915060203d6020116106f3575b6106e58183612dd3565b81019061370b565b8661068f565b503d6106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b6107839161389f565b878561051f565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576107c1612b95565b73ffffffffffffffffffffffffffffffffffffffff6107de612bb8565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043567ffffffffffffffff81116103085761088d903690600401612c41565b60243567ffffffffffffffff8111610308576108ad903690600401612c41565b929060443567ffffffffffffffff8111610308576108cf903690600401612c41565b93909160643567ffffffffffffffff8111610308576108f2903690600401612c72565b9390916108fd61351d565b97610928897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095381612e43565b97610961604051998a612dd3565b818952602089019160051b81019036821161030857915b818310610a1d575050509161099661099e926109a695943691612e5b565b973691612e5b565b933691612ee1565b9183519480518614801590610a12575b61030d5760005b8681106109c657005b80610a0c8673ffffffffffffffffffffffffffffffffffffffff6109ec6001958b6132be565b51166109f884876132be565b51610a0385896132be565b51918d8a61339c565b016109bd565b5081518614156109b6565b823573ffffffffffffffffffffffffffffffffffffffff8116810361030857815260209283019201610978565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020604051620186a08152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435610ac0612bb8565b610ac861351d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b7a57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461030857610c7636612d44565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cbb61351d565b92541691169081036103375750808214801590610e9b575b61030d5760005b828110610ce357005b73ffffffffffffffffffffffffffffffffffffffff610d0b610d0683858a612fbd565b61337b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106fa57600091610e6d575b5015610e40575073ffffffffffffffffffffffffffffffffffffffff610d9a610d0683858a612fbd565b1690610daa610d06828689612fbd565b91610db682878b612fbd565b3592813b1561030857606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106fa57600192610e2f575b5001610cda565b6000610e3a91612dd3565b88610e28565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e8e915060203d8111610e94575b610e868183612dd3565b810190613505565b89610d70565b503d610e7c565b5082821415610cd3565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857610f4d612b95565b602435908115159182810361030857611047575b73ffffffffffffffffffffffffffffffffffffffff80610f7f61351d565b169116918183146110195760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611071817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3061389f565b610f61565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56130f5565b604051918291602083526020830190612bfe565b0390f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611191612bb8565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611229612b95565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061126861351d565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112f55773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113eb61351d565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114b75760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c0a565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103085760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611536612b95565b60243567ffffffffffffffff811161030857611556903690600401612c41565b9060443567ffffffffffffffff811161030857611577903690600401612c41565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115a261351d565b9483820361030d576115b5868883613743565b156116475760005b82811061161b575050946116167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613351565b0390a4005b8061164161162c600193868a612fbd565b35611638838989612fbd565b35908b866137c3565b016115bd565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103085761169f36612d44565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116e261351d565b92541691169081036103375750808414801590611837575b61030d5760005b84811061170a57005b611715818388612fbd565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610308576000602091611748610d06868b8e612fbd565b826117b26117de61175a898d8d612fbd565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612dd3565b51925af1156106fa576000513d61182e5750803b155b6118015750600101611701565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117f4565b50828414156116fa565b346103085761184f36612ca0565b80839492930361030d5773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361197b57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118cb57005b8481101561194c578060051b820135838112156103085782019081359167ffffffffffffffff8311610308576020018236038113610308577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611932848b8a612fbd565b359261194360405192839283612f18565b0390a2016118c2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a1a61351d565b925416911690810361033757507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611a9857815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611afc612b95565b6064359067ffffffffffffffff821161030857611b20611b8d923690600401612c72565b611b7f611b2b61351d565b92611b56847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691612ee1565b92604435926024359261339c565b005b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020611bd0611bcb612b95565b612f5e565b6040519015158152f35b3461030857611be836612ca0565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030d57611c1e85612e43565b94611c2c6040519687612dd3565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c5982612e43565b0136602088013760005b818110611c8057604051602080825281906111569082018a612d10565b80611ca7611c94610d06600194868b612fbd565b611c9f838789612fbd565b359088612fcd565b611cb1828a6132be565b5201611c63565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857600435611cf2612bb8565b611cfa61351d565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361033757507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611dad57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c0a565b346103085760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857611e7b612b95565b611e83612bb8565b60443567ffffffffffffffff811161030857611ea3903690600401612c41565b929060643567ffffffffffffffff811161030857611ec5903690600401612c41565b9360843567ffffffffffffffff811161030857611ee6903690600401612c72565b939091611ef161351d565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff82160361225a575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075057898b0361030d57611f9b828483613743565b156122105760005b8b81106121e1575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61200699169a8b92169889936040519182918d8c8b85613351565b0390a43b61201057005b60209461202561202d92612035953691612e5b565b993691612e5b565b953691612ee1565b926120e560405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526120b561208560a485018b612d10565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc85820301606486015288612d10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016084850152612bfe565b03816000875af19081156106fa577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916121c2575b50160361214857005b6121be9061218e6040519485947fc287817e0000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190612d10565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc848303016044850152612d10565b0390fd5b6121db915060203d6020116106f3576106e58183612dd3565b8661213f565b8061220a8c6122008f946121f8816001978d612fbd565b35928d612fbd565b359088888761398a565b01611fa3565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6122639161389f565b8987611f48565b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030857602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156123c4575b1561238e57505061115660005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61115691620186a08210156123b1576123ab90620186a0926132d2565b0461235e565b620186a06123bf92046132d2565b61235e565b508115612351565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760243567ffffffffffffffff81116103085761241b903690600401612c72565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361197b5761248e7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b916040519182916004359583612f18565b0390a2005b346103085760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576124ca612b95565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86126024356044356124f961351d565b92612505848683613743565b156125645773ffffffffffffffffffffffffffffffffffffffff8086846125537fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b6040986137c3565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085760043573ffffffffffffffffffffffffffffffffffffffff81168103610308577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061263c61351d565b9254169116908103610337575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106fa5760009161277c575b6040516020808252819061115690820185612bfe565b3d8083833e61278b8183612dd3565b8101906020818303126127fc5780519067ffffffffffffffff8211612800570181601f820112156127fc578051926127c284612ea7565b926127d06040519485612dd3565b848452602085840101116127f95750611156926127f39160208085019101612bdb565b90612766565b80fd5b8280fd5b8380fd5b346103085760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103085761283b612b95565b60243567ffffffffffffffff81116103085761285b903690600401612c41565b909160443567ffffffffffffffff81116103085761287d903690600401612c41565b93909160643567ffffffffffffffff811161030857612911936128a7612919923690600401612c72565b9590916129096128b561351d565b966128e0887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226131fc565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691612e5b565b983691612e5b565b943691612ee1565b9173ffffffffffffffffffffffffffffffffffffffff8216948515612a3c578651908551820361030d5760005b828110612a125750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806129b36129a58d6040840190612d10565b82810360208401528b612d10565b0390a43b6129bd57005b6120e59160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526120b561208560a485018b612d10565b80612a36612a226001938c6132be565b51612a2d838b6132be565b5190888661362e565b01612946565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103085760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576111566111427f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46130f5565b346103085760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361030857611bd0602091613046565b346103085760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610308576020612b8d612b63612b95565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612612fcd565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361030857565b60005b838110612bee5750506000910152565b8181015183820152602001612bde565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612c3a81518092818752878088019101612bdb565b0116010190565b9181601f840112156103085782359167ffffffffffffffff8311610308576020808501948460051b01011161030857565b9181601f840112156103085782359167ffffffffffffffff8311610308576020838186019501011161030857565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781612ce991600401612c41565b929092916024359067ffffffffffffffff821161030857612d0c91600401612c41565b9091565b906020808351928381520192019060005b818110612d2e5750505090565b8251845260209384019390920191600101612d21565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103085760043567ffffffffffffffff81116103085781612d8d91600401612c41565b9290929160243567ffffffffffffffff81116103085781612db091600401612c41565b929092916044359067ffffffffffffffff821161030857612d0c91600401612c41565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612e1457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612e145760051b60200190565b929190612e6781612e43565b93612e756040519586612dd3565b602085838152019160051b810192831161030857905b828210612e9757505050565b8135815260209182019101612e8b565b67ffffffffffffffff8111612e1457601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612eed82612ea7565b91612efb6040519384612dd3565b829481845281830111610308578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612fb65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b919081101561194c5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff83161561301c5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146130ef577f01ffc9a70000000000000000000000000000000000000000000000000000000081146130e9576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b906040519160008154918260011c926001811680156131f2575b6020851081146131c557848752869392918115613185575060011461313e575b5061313c92500383612dd3565b565b90506000929192526020600020906000915b81831061316957505090602061313c928201013861312f565b6020919350806001915483858901015201910190918492613150565b6020935061313c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861312f565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f169361310f565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156132565750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b805182101561194c5760209160051b010190565b818102929181159184041417156132e557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103085760209260051b809284830137010190565b929061336a906133789593604086526040860191613314565b926020818503910152613314565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103085790565b94919092939473ffffffffffffffffffffffffffffffffffffffff8216938415612a3c576133e187878573ffffffffffffffffffffffffffffffffffffffff9561362e565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613423575b5050505050565b61347e9160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a4830190612bfe565b03816000865af19081156106fa577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916134e6575b50160361069857808061341c565b6134ff915060203d6020116106f3576106e58183612dd3565b386134d8565b90816020910312610308575180151581036103085790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561361f573233148015613624575b61361f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156135a5575b5061337857503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106fa57600091613600575b503861359b565b613619915060203d602011610e9457610e868183612dd3565b386135f9565b503390565b5060183610613564565b90918361363c575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850194808611156136b257505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613636565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261030857517fffffffff00000000000000000000000000000000000000000000000000000000811681036103085790565b73ffffffffffffffffffffffffffffffffffffffff808316908416149291831561376e575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613768565b9091836137d05750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260406000205493808503948086101561384657505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613636565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580613980575b6138c8575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106fa57600091613961575b50156139345750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61397a915060203d602011610e9457610e868183612dd3565b3861392b565b50813b15156138c0565b91929084613999575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613af5575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613a11575b5061341c565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613a9757505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613a0b565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea264697066735822122013da43c8f47a7cab8fd08c41afb1f9f7c9cc3de700d6fdf78bd308ab473ea0af64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2B27 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2AC1 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2A66 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2804 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x26AD JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x25AE JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x2493 JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x23CC JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x22D9 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x226A JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1E44 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1CB8 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BDA JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1B8F JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AC5 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19A9 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x1841 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1691 JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x14FF JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1390 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131F JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11F2 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x115A JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1076 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF16 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEA5 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC68 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC0F JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA86 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA4A JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x83E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x78A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x364 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1B5 CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1F6 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP2 DUP2 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x216 JUMPI STOP JUMPDEST PUSH2 0x221 DUP2 DUP4 DUP8 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x308 JUMPI PUSH2 0x24B DUP3 DUP6 DUP8 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2CE JUMPI RETURNDATASIZE SWAP1 PUSH2 0x26E DUP3 PUSH2 0x2EA7 JUMP JUMPDEST SWAP2 PUSH2 0x27C PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2DD3 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x295 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x287 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x39B PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3C5 PUSH2 0x351D JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x409 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x48F PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x497 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x4BF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP3 PUSH2 0x4C8 PUSH2 0x351D JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x77A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x750 JUMPI PUSH2 0x56B DUP3 DUP8 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x706 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x594 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x398A JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5D1 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5DF SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH2 0x635 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6CB JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6ED SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI JUMPDEST PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x370B JUMP JUMPDEST DUP7 PUSH2 0x68F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x783 SWAP2 PUSH2 0x389F JUMP JUMPDEST DUP8 DUP6 PUSH2 0x51F JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x7C1 PUSH2 0x2B95 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7DE PUSH2 0x2BB8 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x88D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8CF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x8F2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8FD PUSH2 0x351D JUMP JUMPDEST SWAP8 PUSH2 0x928 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x953 DUP2 PUSH2 0x2E43 JUMP JUMPDEST SWAP8 PUSH2 0x961 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x308 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA1D JUMPI POP POP POP SWAP2 PUSH2 0x996 PUSH2 0x99E SWAP3 PUSH2 0x9A6 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA12 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9C6 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA0C DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9EC PUSH1 0x1 SWAP6 DUP12 PUSH2 0x32BE JUMP JUMPDEST MLOAD AND PUSH2 0x9F8 DUP5 DUP8 PUSH2 0x32BE JUMP JUMPDEST MLOAD PUSH2 0xA03 DUP6 DUP10 PUSH2 0x32BE JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x339C JUMP JUMPDEST ADD PUSH2 0x9BD JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9B6 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAC0 PUSH2 0x2BB8 JUMP JUMPDEST PUSH2 0xAC8 PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB7A JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0xC76 CALLDATASIZE PUSH2 0x2D44 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCBB PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCE3 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD0B PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x2FBD JUMP JUMPDEST PUSH2 0x337B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE6D JUMPI JUMPDEST POP ISZERO PUSH2 0xE40 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD9A PUSH2 0xD06 DUP4 DUP6 DUP11 PUSH2 0x2FBD JUMP JUMPDEST AND SWAP1 PUSH2 0xDAA PUSH2 0xD06 DUP3 DUP7 DUP10 PUSH2 0x2FBD JUMP JUMPDEST SWAP2 PUSH2 0xDB6 DUP3 DUP8 DUP12 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x308 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE2F JUMPI JUMPDEST POP ADD PUSH2 0xCDA JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE3A SWAP2 PUSH2 0x2DD3 JUMP JUMPDEST DUP9 PUSH2 0xE28 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE8E SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE94 JUMPI JUMPDEST PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3505 JUMP JUMPDEST DUP10 PUSH2 0xD70 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE7C JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCD3 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0xF4D PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1047 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF7F PUSH2 0x351D JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1019 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1071 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x389F JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x30F5 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1191 PUSH2 0x2BB8 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1229 PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1268 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12F5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13EB PUSH2 0x351D JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1536 PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1556 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1577 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15A2 PUSH2 0x351D JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x30D JUMPI PUSH2 0x15B5 DUP7 DUP9 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x1647 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x161B JUMPI POP POP SWAP5 PUSH2 0x1616 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3351 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x1641 PUSH2 0x162C PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH2 0x1638 DUP4 DUP10 DUP10 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x37C3 JUMP JUMPDEST ADD PUSH2 0x15BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x169F CALLDATASIZE PUSH2 0x2D44 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16E2 PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1837 JUMPI JUMPDEST PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x170A JUMPI STOP JUMPDEST PUSH2 0x1715 DUP2 DUP4 DUP9 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x308 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1748 PUSH2 0xD06 DUP7 DUP12 DUP15 PUSH2 0x2FBD JUMP JUMPDEST DUP3 PUSH2 0x17B2 PUSH2 0x17DE PUSH2 0x175A DUP10 DUP14 DUP14 PUSH2 0x2FBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2DD3 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x182E JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1801 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1701 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17F4 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x16FA JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x184F CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x30D JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x197B JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18CB JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x194C JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x308 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x308 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1932 DUP5 DUP12 DUP11 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x1943 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x2F18 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18C2 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A1A PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1A98 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1AFC PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x1B20 PUSH2 0x1B8D SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST PUSH2 0x1B7F PUSH2 0x1B2B PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x1B56 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x339C JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x1BD0 PUSH2 0x1BCB PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x2F5E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH2 0x1BE8 CALLDATASIZE PUSH2 0x2CA0 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x30D JUMPI PUSH2 0x1C1E DUP6 PUSH2 0x2E43 JUMP JUMPDEST SWAP5 PUSH2 0x1C2C PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2DD3 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C59 DUP3 PUSH2 0x2E43 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C80 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP11 PUSH2 0x2D10 JUMP JUMPDEST DUP1 PUSH2 0x1CA7 PUSH2 0x1C94 PUSH2 0xD06 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x2FBD JUMP JUMPDEST PUSH2 0x1C9F DUP4 DUP8 DUP10 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x2FCD JUMP JUMPDEST PUSH2 0x1CB1 DUP3 DUP11 PUSH2 0x32BE JUMP JUMPDEST MSTORE ADD PUSH2 0x1C63 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1CF2 PUSH2 0x2BB8 JUMP JUMPDEST PUSH2 0x1CFA PUSH2 0x351D JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1DAD JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC0A JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1E7B PUSH2 0x2B95 JUMP JUMPDEST PUSH2 0x1E83 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EA3 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EC5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x1EE6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1EF1 PUSH2 0x351D JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x225A JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x750 JUMPI DUP10 DUP12 SUB PUSH2 0x30D JUMPI PUSH2 0x1F9B DUP3 DUP5 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x2210 JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x21E1 JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2006 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3351 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2010 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2025 PUSH2 0x202D SWAP3 PUSH2 0x2035 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP3 PUSH2 0x20E5 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20B5 PUSH2 0x2085 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2D10 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x2D10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x21C2 JUMPI JUMPDEST POP AND SUB PUSH2 0x2148 JUMPI STOP JUMPDEST PUSH2 0x21BE SWAP1 PUSH2 0x218E PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x2D10 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x2D10 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x21DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP7 PUSH2 0x213F JUMP JUMPDEST DUP1 PUSH2 0x220A DUP13 PUSH2 0x2200 DUP16 SWAP5 PUSH2 0x21F8 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x2FBD JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x398A JUMP JUMPDEST ADD PUSH2 0x1FA3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2263 SWAP2 PUSH2 0x389F JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1F48 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x23C4 JUMPI JUMPDEST ISZERO PUSH2 0x238E JUMPI POP POP PUSH2 0x1156 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1156 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x23B1 JUMPI PUSH2 0x23AB SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x32D2 JUMP JUMPDEST DIV PUSH2 0x235E JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x23BF SWAP3 DIV PUSH2 0x32D2 JUMP JUMPDEST PUSH2 0x235E JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2351 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x241B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x197B JUMPI PUSH2 0x248E PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x2F18 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x24CA PUSH2 0x2B95 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x24F9 PUSH2 0x351D JUMP JUMPDEST SWAP3 PUSH2 0x2505 DUP5 DUP7 DUP4 PUSH2 0x3743 JUMP JUMPDEST ISZERO PUSH2 0x2564 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x2553 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x37C3 JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x263C PUSH2 0x351D JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x337 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x277C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1156 SWAP1 DUP3 ADD DUP6 PUSH2 0x2BFE JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x278B DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x27FC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2800 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x27FC JUMPI DUP1 MLOAD SWAP3 PUSH2 0x27C2 DUP5 PUSH2 0x2EA7 JUMP JUMPDEST SWAP3 PUSH2 0x27D0 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2DD3 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x27F9 JUMPI POP PUSH2 0x1156 SWAP3 PUSH2 0x27F3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2BDB JUMP JUMPDEST SWAP1 PUSH2 0x2766 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x283B PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x285B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x287D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI PUSH2 0x2911 SWAP4 PUSH2 0x28A7 PUSH2 0x2919 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C72 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2909 PUSH2 0x28B5 PUSH2 0x351D JUMP JUMPDEST SWAP7 PUSH2 0x28E0 DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x31FC JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x2E5B JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x2EE1 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x2A3C JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x30D JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2A12 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x29B3 PUSH2 0x29A5 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x2D10 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x2D10 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x29BD JUMPI STOP JUMPDEST PUSH2 0x20E5 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20B5 PUSH2 0x2085 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x2D10 JUMP JUMPDEST DUP1 PUSH2 0x2A36 PUSH2 0x2A22 PUSH1 0x1 SWAP4 DUP13 PUSH2 0x32BE JUMP JUMPDEST MLOAD PUSH2 0x2A2D DUP4 DUP12 PUSH2 0x32BE JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x362E JUMP JUMPDEST ADD PUSH2 0x2946 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH2 0x1156 PUSH2 0x1142 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x30F5 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI PUSH2 0x1BD0 PUSH1 0x20 SWAP2 PUSH2 0x3046 JUMP JUMPDEST CALLVALUE PUSH2 0x308 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x308 JUMPI PUSH1 0x20 PUSH2 0x2B8D PUSH2 0x2B63 PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x2FCD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2BEE JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2BDE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2C3A DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2BDB JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x308 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x308 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2CE9 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x2D0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D2E JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x2D21 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x308 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2D8D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x308 JUMPI DUP2 PUSH2 0x2DB0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x308 JUMPI PUSH2 0x2D0C SWAP2 PUSH1 0x4 ADD PUSH2 0x2C41 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2E14 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2E14 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2E67 DUP2 PUSH2 0x2E43 JUMP JUMPDEST SWAP4 PUSH2 0x2E75 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2DD3 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x308 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2E97 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E8B JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2E14 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2EED DUP3 PUSH2 0x2EA7 JUMP JUMPDEST SWAP2 PUSH2 0x2EFB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2DD3 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x308 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2FB6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x194C JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x301C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x30EF JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x30E9 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x31F2 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x31C5 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3185 JUMPI POP PUSH1 0x1 EQ PUSH2 0x313E JUMPI JUMPDEST POP PUSH2 0x313C SWAP3 POP SUB DUP4 PUSH2 0x2DD3 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3169 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x313C SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x312F JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3150 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x313C SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x312F JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x310F JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3256 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x194C JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x32E5 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x308 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x336A SWAP1 PUSH2 0x3378 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3314 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3314 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2A3C JUMPI PUSH2 0x33E1 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x362E JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3423 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x347E SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x2BFE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x34E6 JUMPI JUMPDEST POP AND SUB PUSH2 0x698 JUMPI DUP1 DUP1 PUSH2 0x341C JUMP JUMPDEST PUSH2 0x34FF SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F3 JUMPI PUSH2 0x6E5 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x34D8 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x361F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3624 JUMPI JUMPDEST PUSH2 0x361F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35A5 JUMPI JUMPDEST POP PUSH2 0x3378 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3600 JUMPI JUMPDEST POP CODESIZE PUSH2 0x359B JUMP JUMPDEST PUSH2 0x3619 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x35F9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3564 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x363C JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x36B2 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3636 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x308 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x308 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x376E JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3768 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x37D0 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x3846 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3636 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3980 JUMPI JUMPDEST PUSH2 0x38C8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3961 JUMPI JUMPDEST POP ISZERO PUSH2 0x3934 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x397A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE94 JUMPI PUSH2 0xE86 DUP2 DUP4 PUSH2 0x2DD3 JUMP JUMPDEST CODESIZE PUSH2 0x392B JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x38C0 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3999 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3AF5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3A11 JUMPI JUMPDEST POP PUSH2 0x341C JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3A97 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3A0B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SGT 0xDA NUMBER 0xC8 DELEGATECALL PUSH27 0x7CAB8FD08C41AFB1F9F7C9CC3DE700D6FDF78BD308AB473EA0AF64 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1112:1123:230:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1112:1123:230;;1952:41;;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1112:1123:230;1845:10:192;;;;;;1112:1123:230;1857:3:192;1876:11;;;;;:::i;:::-;1112:1123:230;;;;;;;;;1898:10:192;;;;;:::i;:::-;1112:1123:230;1375:21:9;;;:30;1371:125;;1112:1123:230;1548:33:9;;;;;;;1112:1123:230;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1112:1123:230;;1834:9:192;;1591:58:9;1112:1123:230;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1112:1123:230;5957:19:9;1112:1123:230;;5957:19:9;1112:1123:230;;;;;1371:125:9;1455:21;;1428:57;1112:1123:230;1428:57:9;1112:1123:230;;;;;;1428:57:9;1112:1123:230;;;;1756:63:192;1793:26;1112:1123:230;1793:26:192;1112:1123:230;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1112:1123:230;;-1:-1:-1;4538:25:42;1112:1123:230;;;;;;;;;;;;;:::i;:::-;;1952:41;;;:::i;:::-;1112:1123;;;;;;;;3205:23:42;;;3201:60;;1112:1123:230;;;3275:25:42;;;;3271:146;;1112:1123:230;3271:146:42;1112:1123:230;;;;;;;;3361:45:42;1112:1123:230;3361:45:42;;1112:1123:230;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41;;;:::i;:::-;3179:19:352;1112:1123:230;;;;;;;;2616:14:352;2612:76;;1112:1123:230;-1:-1:-1;;1112:1123:230;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;1112:1123:230;4720:5:228;;;;;;;;;:::i;:::-;1112:1123:230;;;;;;;4742:43:228;1112:1123:230;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;1112:1123:230;4796:104:228;1112:1123:230;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;1112:1123:230;19356:74:228;;1112:1123:230;19356:74:228;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;1112:1123:230;19356:74:228;;;;;;;;1112:1123:230;19356:74:228;1112:1123:230;19356:74:228;1112:1123:230;19356:74:228;;;4796:104;1112:1123:230;;19356:101:228;19352:168;;1112:1123:230;19352:168:228;19478:42;1112:1123:230;19478:42:228;1112:1123:230;;;;;;;;19478:42:228;19356:74;;;;1112:1123:230;19356:74:228;1112:1123:230;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1112:1123:230;;;;;;;;;4601:76:228;1112:1123:230;4645:32:228;;;;1112:1123:230;4645:32:228;1112:1123:230;;;;;;;;4645:32:228;4532:59;4561:30;1112:1123:230;4561:30:228;1112:1123:230;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1112:1123:230;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;1112:1123:230;-1:-1:-1;1112:1123:230;14847:11:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;14847:28:228;1112:1123:230;-1:-1:-1;1112:1123:230;;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;1112:1123:230;1367:6:208;:::i;:::-;1112:1123:230;974:8:208;;;;:::i;:::-;1112:1123:230;;;;;;;:::i;:::-;974:8:208;;;1112:1123:230;974:8:208;;;;;;;1112:1123:230;;974:8:208;;;;;;;;;;;1112:1123:230;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;1112:1123:230;11728:10:228;;;;;;1112:1123:230;11740:3:228;11778:13;11812:4;11778:13;1112:1123:230;11778:13:228;1112:1123:230;11778:13:228;;;:::i;:::-;1112:1123:230;;11793:6:228;;;;:::i;:::-;1112:1123:230;11801:9:228;;;;:::i;:::-;1112:1123:230;11812:4:228;;;;:::i;:::-;1112:1123:230;11717:9:228;;11620:47;1112:1123:230;;;11644:23:228;;;11620:47;;974:8:208;1112:1123:230;;;;;;;;;974:8:208;;1112:1123:230;974:8:208;;;;;;;1112:1123:230;;;;;;;;;;;;;;713:6:351;1112:1123:230;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41;;:::i;:::-;5148:19:42;1112:1123:230;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1112:1123:230;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;1880:140:41;;1112:1123:230;1880:140:41;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1112:1123:230;;;;1973:36:41;;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1112:1123:230;;;1952:41;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1112:1123:230;3852:94:192;;1112:1123:230;3972:10:192;;;;;;1112:1123:230;3984:3:192;1112:1123:230;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1112:1123:230;;;;4058:76:192;;4108:25;1112:1123:230;4058:76:192;;1112:1123:230;4058:76:192;;;;;;;;;;;;1112:1123:230;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1112:1123:230;4239:12:192;;;;;;:::i;:::-;1112:1123:230;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1112:1123:230;4239:70:192;;;;;;;1112:1123:230;;;;;;;4239:70:192;;;;;1112:1123:230;4239:70:192;;4277:4;1112:1123:230;4239:70:192;;1112:1123:230;;4058:76:192;1112:1123:230;;;;;;;4239:70:192;;;;;;;1112:1123:230;4239:70:192;;;3984:3;;1112:1123:230;3961:9:192;;4239:70;1112:1123:230;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1112:1123:230;4161:50:192;1112:1123:230;;4058:76:192;1112:1123:230;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;1112:1123:230;;1952:41;;;:::i;:::-;1112:1123;;;14276:18:228;;;;14272:64;;1112:1123:230;14401:42:228;14346:19;1112:1123:230;-1:-1:-1;1112:1123:230;14346:11:228;1112:1123:230;;;-1:-1:-1;1112:1123:230;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;;;;;14401:42:228;1112:1123:230;14272:64:228;14303:33;;1112:1123:230;14303:33:228;1112:1123:230;;;;14303:33:228;2071:115:211;2931:8:352;668:81;1112:1123:230;2931:8:352;:::i;:::-;2071:115:211;;1112:1123:230;;;;;;;;;;;;;2991:23:341;1112:1123:230;;;;;;;;;;;;;;;;;;;;;2688:13:341;1112:1123:230;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1112:1123:230;-1:-1:-1;1112:1123:230;;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1952:41;;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;2976:19:351;1112:1123:230;;;;;1732:22:351;1728:93;;1112:1123:230;;;;;;;;;;;;1728:93:351;1777:33;1112:1123:230;1777:33:351;1112:1123:230;;1777:33:351;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:41;;:::i;:::-;1112:1123;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;3741:25:41;3737:66;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1112:1123:230;;;;2455:33:41;1112:1123:230;3737:66:41;1112:1123:230;3775:28:41;;;1112:1123:230;3775:28:41;1112:1123:230;;;;;;;3775:28:41;1112:1123:230;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;1112:1123:230;1952:41;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;1112:1123:230;13625:10:228;;;;;;1112:1123:230;;;13720:52:228;;1112:1123:230;;;;;;;;;;;;;;13720:52:228;;;:::i;:::-;;;;1112:1123:230;13637:3:228;13676:6;13684:9;13676:6;1112:1123:230;13676:6:228;;;;:::i;:::-;1112:1123:230;13684:9:228;;;;;:::i;:::-;1112:1123:230;13684:9:228;;;;:::i;:::-;1112:1123:230;13614:9:228;;13522:76;1112:1123:230;13566:32:228;;;;1112:1123:230;13566:32:228;1112:1123:230;;;;;;;;13566:32:228;1112:1123:230;;;;;;;:::i;:::-;5148:19:42;;;;1112:1123:230;;;1952:41;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1112:1123:230;2776:90:192;;1112:1123:230;2892:10:192;;;;;;1112:1123:230;2904:3:192;2923:9;;;;;:::i;:::-;1112:1123:230;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1112:1123:230;;;1328:43:8;;;;;;1112:1123:230;;;;1328:43:8;;;1112:1123:230;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1112:1123:230;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1112:1123:230;;2881:9:192;;8938:146:8;9033:40;1112:1123:230;9033:40:8;1112:1123:230;;1328:43:8;1112:1123:230;9033:40:8;8942:68;1112:1123:230;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1112:1123:230;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;1112:1123:230;2991:23:341;1112:1123:230;;2464:10:209;:71;2460:115;;2591:9;1112:1123:230;;;;;;;2586:102:209;2602:19;;;;;;1112:1123:230;2623:3:209;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;1112:1123:230;2665:11:209;;;;;;:::i;:::-;1112:1123:230;;2647:30:209;1112:1123:230;;2647:30:209;;;;;:::i;:::-;;;;1112:1123:230;2591:9:209;;1112:1123:230;;;;;;;;;;2460:115:209;2544:31;1112:1123:230;2544:31:209;2464:10;1112:1123:230;;;;2544:31:209;1112:1123:230;;;;;;;;;;;;;;;1952:41;;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;2976:19:351;1112:1123:230;1281:36:351;713:6;1281:36;;1277:119;;1112:1123:230;;;;;;;;;;;;;;;1277:119:351;1340:45;1112:1123:230;1340:45:351;1112:1123:230;;;;1340:45:351;1112:1123:230;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;1112:1123:230;;;;;;:::i;:::-;;1952:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;1112:1123:230;1221:6:210;:::i;:::-;1112:1123:230;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;1112:1123:230;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;1112:1123:230;;16447:19:228;16129:20;;;16125:59;;1112:1123:230;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;1112:1123:230;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;1112:1123:230;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;1112:1123:230;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;1112:1123:230;;16250:9:228;;1112:1123:230;;;;;;;;;;;;;;;:::i;:::-;1952:41;;:::i;:::-;5148:19:42;1112:1123:230;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1112:1123:230;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;1254:25:41;1250:140;;1112:1123:230;1250:140:41;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1112:1123:230;;;;1343:36:41;1112:1123:230;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1952:41;;;;;:::i;:::-;3179:19:352;1112:1123:230;;;;;;;;2616:14:352;2612:76;;1112:1123:230;-1:-1:-1;;1112:1123:230;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;1112:1123:230;6801:10:228;;;;;;1112:1123:230;;;;;;;;;;;6904:44:228;1112:1123:230;6904:44:228;1112:1123:230;;;;;;;;;;;6904:44:228;;;;;;;;:::i;:::-;;;;376:58:354;6959:111:228;;1112:1123:230;6959:111:228;1112:1123:230;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;1112:1123:230;20263:81:228;;1112:1123:230;20263:81:228;;1112:1123:230;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;1112:1123:230;20263:81:228;;;;;;;;1112:1123:230;20263:81:228;1112:1123:230;20263:81:228;1112:1123:230;20263:81:228;;;6959:111;1112:1123:230;;20263:107:228;20259:181;;1112:1123:230;20259:181:228;1878:53;1112:1123:230;1878:53:228;1112:1123:230;;20391:49:228;;;;;;1112:1123:230;20391:49:228;;1112:1123:230;;;1878:53:228;;;1112:1123:230;1878:53:228;;;;:::i;:::-;;1112:1123:230;1878:53:228;;;;1112:1123:230;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;1112:1123:230;20263:81:228;1112:1123:230;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;1112:1123:230;6860:6:228;;;:::i;:::-;1112:1123:230;6868:9:228;;;:::i;:::-;1112:1123:230;6868:9:228;;;;;:::i;:::-;1112:1123:230;6790:9:228;;6698:76;1112:1123:230;6742:32:228;;;;1112:1123:230;6742:32:228;1112:1123:230;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1112:1123:230;;;;;;;;;;;;;;;941:19:75;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1112:1123:230;2499:377:351;;;2559:17;;1112:1123:230;;2499:377:351;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1112:1123:230;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1112:1123:230;2499:377:351;;2607:259;713:6;2794:57;1112:1123:230;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2991:23:341;1112:1123:230;;1716:10:209;:71;1712:115;;1842:22;;1112:1123:230;;;;;;;;1842:22:209;;;:::i;:::-;;;;1112:1123:230;;;;;;;;;;;;;;:::i;:::-;;;;;;1952:41;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;1112:1123:230;12560:5:228;;;;12581:51;12560:5;;1112:1123:230;12560:5:228;1112:1123:230;12560:5:228;;:::i;:::-;1112:1123:230;;;;;;;;;;;;12581:51:228;;1112:1123:230;12450:76:228;1112:1123:230;12494:32:228;;;;1112:1123:230;12494:32:228;1112:1123:230;;;;;;;;12494:32:228;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;1952:41;;;:::i;:::-;1112:1123;;;;;4503:26:42;;;4499:64;;3179:19:352;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;3364:23:341;1112:1123:230;;;;3364:64:341;;1306:4:209;1112:1123:230;3364:64:341;;;1112:1123:230;;;;;;;;;;-1:-1:-1;;1112:1123:230;;;;;;;;3364:64:341;;;;;;;1112:1123:230;3364:64:341;;;1112:1123:230;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1952:41;;;1112:1123;1952:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;1112:1123:230;1669:6:210;:::i;:::-;1112:1123:230;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;1112:1123:230;;;;;9777:23:228;;9773:62;;1112:1123:230;9862:10:228;;;;;;1112:1123:230;;;;;;;;;9955:50:228;1112:1123:230;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;1112:1123:230;10016:117:228;1112:1123:230;;;;;;20263:81:228;;;;;1112:1123:230;20263:81:228;;1112:1123:230;20263:81:228;;1112:1123:230;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;1112:1123:230;9911:6:228;;;:::i;:::-;1112:1123:230;9919:9:228;;;;:::i;:::-;1112:1123:230;9919:9:228;;;;:::i;:::-;1112:1123:230;9851:9:228;;9671:55;9700:26;1112:1123:230;9700:26:228;1112:1123:230;;9700:26:228;1112:1123:230;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1112:1123:230;635:65:55;;:::i;1112:1123:230:-;;;;;;;;;;;;2650:44:211;1112:1123:230;;:::i;:::-;;;;;2650:44:211;:::i;:::-;1112:1123:230;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1112:1123:230;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1112:1123:230;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1112:1123:230;1146:19:75;1112:1123:230;1146:53:75;;;1142:96;;1112:1123:230;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1112:1123:230;1215:12:75;:::o;1112:1123:230:-;;;;;;;;;;;;:::o;15240:220:228:-;;;1112:1123:230;;;15358:19:228;15354:61;;15375:1;1112:1123:230;;;;;15375:1:228;1112:1123:230;15432:21:228;1112:1123:230;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;1112:1123:230;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1112:1123:230;500:10:59;1112:1123:230;500:10:59;;;;1112:1123:230;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1112:1123:230;1528:12:59;:::o;1112:1123:230:-;;;;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1112:1123:230;;;;;-1:-1:-1;1112:1123:230;;-1:-1:-1;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;1112:1123:230;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1112:1123:230;3775:28:41;;-1:-1:-1;3775:28:41;1112:1123:230;3775:28:41;1112:1123:230;;;;;-1:-1:-1;3775:28:41;1112:1123:230;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;1112:1123:230;;;8152:16:228;;;8148:55;;8236:5;;;;1112:1123:230;8236:5:228;;:::i;:::-;1112:1123:230;;;8166:1:228;1112:1123:230;8258:49:228;1112:1123:230;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;1112:1123:230;;;;;;19356:74:228;;;;;1112:1123:230;19356:74:228;;;;;1112:1123:230;8166:1:228;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;1112:1123:230;19356:74:228;1112:1123:230;19356:74:228;8166:1;19356:74;;;8318:110;1112:1123:230;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;1112:1123:230;19356:74:228;1112:1123:230;19356:74:228;;;;;;;:::i;:::-;;;;1112:1123:230;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1112:1123:230;1029:19:76;1112:1123:230;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;1676:74;1112:1123:230;;;;;;1676:74:76;;;;1112:1123:230;1676:74:76;;;;;;1112:1123:230;1327:10:76;1112:1123:230;;;;1744:4:76;1112:1123:230;;;;1676:74:76;;;;;;;1112:1123:230;1676:74:76;;;1630:120;;;;;1676:74;;;;1112:1123:230;1676:74:76;1112:1123:230;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;1112:1123:230;17966:1:228;1112:1123:230;;;;;17966:1:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;;;18123:21:228;;;;;18119:80;;1112:1123:230;;17966:1:228;1112:1123:230;;;;;17966:1:228;1112:1123:230;18217:18:228;1112:1123:230;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;17953:320:228;;;;;;18119:80;1112:1123:230;;18153:46:228;;;1112:1123:230;;;18153:46:228;;;1112:1123:230;;;;;;;;;;;;;;;;;;20391:49:228;1112:1123:230;;;;;;;;;;;;;;;;;;:::o;16846:185:228:-;1112:1123:230;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;1112:1123:230;;-1:-1:-1;1112:1123:230;16997:11:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;16997:27:228;1112:1123:230;-1:-1:-1;1112:1123:230;;;500:10:59;1112:1123:230;-1:-1:-1;1112:1123:230;500:10:59;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;:::o;18382:326::-;1112:1123:230;18395:1:228;1112:1123:230;;;;;18395:1:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;;;18550:21:228;;;;;18546:86;;1112:1123:230;;18395:1:228;1112:1123:230;;;;;18395:1:228;1112:1123:230;18650:20:228;1112:1123:230;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;18382:326:228;;;;;;18546:86;1112:1123:230;;18580:52:228;;;1112:1123:230;;;18580:52:228;;;1112:1123:230;;;;;;;;;;;;;;;;;;20391:49:228;3271:479:352;1112:1123:230;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1112:1123:230;;;3613:51:352;1112:1123:230;;3613:51:352;;;;1112:1123:230;3613:51:352;;3648:4;3613:51;;;1112:1123:230;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1112:1123:230;;-1:-1:-1;3691:28:352;3613:51;;;;1112:1123:230;3613:51:352;1112:1123:230;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;17037:815:228;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;1112:1123:230;17163:1:228;1112:1123:230;;;;;17163:1:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;;;17330:29:228;;;;;17326:98;;1112:1123:230;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;1112:1123:230;17163:1:228;1112:1123:230;;;;;17163:1:228;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;-1:-1:-1;1112:1123:230;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;1112:1123:230;;17640:48:228;;;1112:1123:230;;;17640:48:228;;;1112:1123:230;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;1112:1123:230;;17368:56:228;;;1112:1123:230;;;;;17368:56:228;;;1112:1123:230;;;;;;;;;;;;;;;;;;;20391:49:228"},"gasEstimates":{"creation":{"codeDepositCost":"3047800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"760","ROYALTY_FEE_DENOMINATOR()":"804","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchBurnFrom(address,uint256[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","isApprovedForAll(address,address)":"3223","isTrustedForwarder(address)":"infinite","metadataResolver()":"2781","name()":"infinite","operatorFilterRegistry()":"2825","owner()":"2693","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2716","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2455","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchBurnFrom(address,uint256[],uint256[])":"80534934","batchSetTokenURI(uint256[],string[])":"6706467b","burnFrom(address,uint256,uint256)":"124d91e5","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/preset/ERC1155FullBurn.sol\":\"ERC1155FullBurn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./base/ERC1155BurnableBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Burnable is ERC1155BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Burnable\\n    constructor() {\\n        ERC1155Storage.initERC1155Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0x3a83ffae95480cf133b1bdc247455b5c5e812ea66be6092e27f738b11e4951fa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./base/ERC1155DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Deliverable is ERC1155DeliverableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Deliverable\\n    constructor() {\\n        ERC1155Storage.initERC1155Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x66d13c9e643f22c8bebea5c0266b175a4b4868616453832c5a1ca819c560f389\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./base/ERC1155MetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Metadata is ERC1155MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155MetadataURI.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC1155Storage.initERC1155MetadataURI();\\n    }\\n}\\n\",\"keccak256\":\"0x0fb7629855ad3af8c8e677fffc7b32c891b9346a2cb86986a0be8ab045fa88a4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./base/ERC1155MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155Mintable is ERC1155MintableBase, AccessControl {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC1155Mintable\\n    constructor() {\\n        ERC1155Storage.initERC1155Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x2ec7bf5d28a55c5fc2d93e042e0ff49b5439467a5b22cff43e803e348bb7983d\",\"license\":\"MIT\"},\"contracts/token/ERC1155/ERC1155WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC1155WithOperatorFilterer is ERC1155WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC1155.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC1155Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xb9ba2417238c386a02e193f03882682ab0f043bb84eff39287985c11fc2c1bed\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/ERC1155FullBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155WithOperatorFilterer} from \\\"./../ERC1155WithOperatorFilterer.sol\\\";\\nimport {ERC1155Metadata} from \\\"./../ERC1155Metadata.sol\\\";\\nimport {ERC1155Mintable} from \\\"./../ERC1155Mintable.sol\\\";\\nimport {ERC1155Deliverable} from \\\"./../ERC1155Deliverable.sol\\\";\\nimport {ERC1155Burnable} from \\\"./../ERC1155Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullBurn is\\n    ERC1155WithOperatorFilterer,\\n    ERC1155Metadata,\\n    ERC1155Mintable,\\n    ERC1155Deliverable,\\n    ERC1155Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC1155Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC1155WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd2ff6a780dbc2048a7cb5d57fecff50f0b777c72d1e3eced787ba55f7233fa09\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol":{"ERC1155FullBurnProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchBurnFrom(address,uint256[],uint256[])":{"details":"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.","params":{"from":"Address of the current tokens owner.","ids":"Identifiers of the tokens to burn.","values":"Amounts of tokens to burn."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"burnFrom(address,uint256,uint256)":{"details":"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.","params":{"from":"Address of the current token owner.","id":"Identifier of the token to burn.","value":"Amount of token to burn."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f61449f38819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b038116810360745760805260405161440f908161009082396080518181816122c0015281816138140152613dbc0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146133f557806301ffc9a71461336e57806306fdde03146133135780630d6a5bbb146130b15780630e07f854146127f75780630e89341c146126a0578063114ba8ee146125b9578063124d91e51461249e578063162094c4146123d75780632a55205a146122e45780632b4c9f16146122755780632eb2c2d614611e4f5780632f2ff15d14611cc35780634e1273f414611be5578063572b6c0514611b9a5780635cfa929714611ad057806361ba27da146119b45780636706467b1461184c57806373c8a9581461169c578063805349341461150a5780638bb9c5bf1461139b5780638da5cb5b1461132a5780638dc251e3146111fd57806391d148541461116557806395d89b41146110f2578063a0c76f6214611081578063a22cb46514610f21578063b0ccc31e14610eb0578063c3666c3614610c73578063d539139314610c1a578063d547741f14610a91578063e1a8bf2c14610a55578063e8ab9ccc14610849578063e985e9c514610795578063f242432a14610463578063f2fde38b1461036f5763f7ba94bd146101b257600080fd5b34610313576101c03661356e565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610201613da5565b925416911690810361034257508181036103185760005b81811061022157005b61022c81838761385c565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103135761025682858761385c565b35908147106102e157600080809381935af13d156102d9573d9061027982613746565b9161028760405193846136a1565b82523d6000602084013e5b156102a05750600101610218565b8051156102af57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610292565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576103a6613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103d0613da5565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610342575073ffffffffffffffffffffffffffffffffffffffff169182820361041457005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761049a613463565b6104a2613486565b604435906064359260843567ffffffffffffffff8111610313576104ca903690600401613540565b926104d3613da5565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610785575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561075b57610576828783613fcb565b156107115773ffffffffffffffffffffffffffffffffffffffff9161059f8a8a878a8796614212565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105dc57005b6020926105ea913691613780565b9261064060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906134cc565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106d6575b5016036106a357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106f8915060203d6020116106fe575b6106f081836136a1565b810190613f93565b8661069a565b503d6106e6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078e91614127565b878561052a565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576107cc613463565b73ffffffffffffffffffffffffffffffffffffffff6107e9613486565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff81116103135761089890369060040161350f565b60243567ffffffffffffffff8111610313576108b890369060040161350f565b929060443567ffffffffffffffff8111610313576108da90369060040161350f565b93909160643567ffffffffffffffff8111610313576108fd903690600401613540565b939091610908613da5565b97610933897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095e816136e2565b9761096c604051998a6136a1565b818952602089019160051b81019036821161031357915b818310610a2857505050916109a16109a9926109b1959436916136fa565b9736916136fa565b933691613780565b9183519480518614801590610a1d575b6103185760005b8681106109d157005b80610a178673ffffffffffffffffffffffffffffffffffffffff6109f76001958b613b46565b5116610a038487613b46565b51610a0e8589613b46565b51918d8a613c24565b016109c8565b5081518614156109c1565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031357815260209283019201610983565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020604051620186a08152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435610acb613486565b610ad3613da5565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b8557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031357610c8136613612565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc6613da5565b92541691169081036103425750808214801590610ea6575b6103185760005b828110610cee57005b73ffffffffffffffffffffffffffffffffffffffff610d16610d1183858a61385c565b613c03565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561070557600091610e78575b5015610e4b575073ffffffffffffffffffffffffffffffffffffffff610da5610d1183858a61385c565b1690610db5610d1182868961385c565b91610dc182878b61385c565b3592813b1561031357606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561070557600192610e3a575b5001610ce5565b6000610e45916136a1565b88610e33565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e99915060203d8111610e9f575b610e9181836136a1565b810190613d8d565b89610d7b565b503d610e87565b5082821415610cde565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357610f58613463565b602435908115159182810361031357611052575b73ffffffffffffffffffffffffffffffffffffffff80610f8a613da5565b169116918183146110245760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61107c817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614127565b610f6c565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56139c2565b6040519182916020835260208301906134cc565b0390f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761119c613486565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611234613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611273613da5565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156113005773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113f6613da5565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114c25760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c15565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611541613463565b60243567ffffffffffffffff81116103135761156190369060040161350f565b9060443567ffffffffffffffff81116103135761158290369060040161350f565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115ad613da5565b94838203610318576115c0868883613fcb565b156116525760005b828110611626575050946116217f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613bd9565b0390a4005b8061164c611637600193868a61385c565b3561164383898961385c565b35908b8661404b565b016115c8565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b34610313576116aa36613612565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116ed613da5565b92541691169081036103425750808414801590611842575b6103185760005b84811061171557005b61172081838861385c565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610313576000602091611753610d11868b8e61385c565b826117bd6117e9611765898d8d61385c565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826136a1565b51925af115610705576000513d6118395750803b155b61180c575060010161170c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117ff565b5082841415611705565b346103135761185a3661356e565b8083949293036103185773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198657916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118d657005b84811015611957578060051b820135838112156103135782019081359167ffffffffffffffff8311610313576020018236038113610313577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361193d848b8a61385c565b359261194e604051928392836137b7565b0390a2016118cd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a25613da5565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611aa357815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611b07613463565b6064359067ffffffffffffffff821161031357611b2b611b98923690600401613540565b611b8a611b36613da5565b92611b61847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691613780565b926044359260243592613c24565b005b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020611bdb611bd6613463565b6137fd565b6040519015158152f35b3461031357611bf33661356e565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361031857611c29856136e2565b94611c3760405196876136a1565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c64826136e2565b0136602088013760005b818110611c8b57604051602080825281906111619082018a6135de565b80611cb2611c9f610d11600194868b61385c565b611caa83878961385c565b35908861386c565b611cbc828a613b46565b5201611c6e565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435611cfd613486565b611d05613da5565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611db857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c15565b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611e86613463565b611e8e613486565b60443567ffffffffffffffff811161031357611eae90369060040161350f565b929060643567ffffffffffffffff811161031357611ed090369060040161350f565b9360843567ffffffffffffffff811161031357611ef1903690600401613540565b939091611efc613da5565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603612265575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075b57898b0361031857611fa6828483613fcb565b1561221b5760005b8b81106121ec575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61201199169a8b92169889936040519182918d8c8b85613bd9565b0390a43b61201b57005b602094612030612038926120409536916136fa565b9936916136fa565b953691613780565b926120f060405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526120c061209060a485018b6135de565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886135de565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526134cc565b03816000875af1908115610705577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916121cd575b50160361215357005b6121c9906121996040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906135de565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526135de565b0390fd5b6121e6915060203d6020116106fe576106f081836136a1565b8661214a565b806122158c61220b8f94612203816001978d61385c565b35928d61385c565b3590888887614212565b01611fae565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b61226e91614127565b8987611f53565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156123cf575b1561239957505061116160005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116191620186a08210156123bc576123b690620186a092613b5a565b04612369565b620186a06123ca9204613b5a565b612369565b50811561235c565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760243567ffffffffffffffff811161031357612426903690600401613540565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a654163303611986576124997f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160043595836137b7565b0390a2005b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576124d5613463565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435612504613da5565b92612510848683613fcb565b1561256f5773ffffffffffffffffffffffffffffffffffffffff80868461255e7fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861404b565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576125f0613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061262f613da5565b9254169116908103610342575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156107055760009161276f575b60405160208082528190611161908201856134cc565b3d8083833e61277e81836136a1565b8101906020818303126127ef5780519067ffffffffffffffff82116127f3570181601f820112156127ef578051926127b584613746565b926127c360405194856136a1565b848452602085840101116127ec5750611161926127e691602080850191016134a9565b90612759565b80fd5b8280fd5b8380fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff811161031357612846903690600401613540565b60243567ffffffffffffffff811161031357612866903690600401613540565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610313576064359373ffffffffffffffffffffffffffffffffffffffff85168503610313577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6128d4613da5565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612d70575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161305c575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612d70575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612f2d578190612b5c845461396f565b601f8111613009575b50600090601f8311600114612f6757600092612f5c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612f2d57612be77f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a55461396f565b601f8111612ea9575b506000601f8211600114612dad5781929394600092612da2575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612d70575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612c0a565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612e91575083600195969710612e59575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612c5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612e2c565b90926020600181928686013581550194019101612e18565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612f23575b601f0160051c01905b818110612f175750612bf0565b60008155600101612f0a565b9091508190612f01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612b7c565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612ff15750908460019594939210612fb9575b505050811b019055612bae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612fac565b91936020600181928787013581550195019201612f96565b909150836000526020600020601f840160051c81019160208510613052575b90601f859493920160051c01905b8181106130435750612b65565b60008155849350600101613036565b9091508190613028565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612941565b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576130e8613463565b60243567ffffffffffffffff81116103135761310890369060040161350f565b909160443567ffffffffffffffff81116103135761312a90369060040161350f565b93909160643567ffffffffffffffff8111610313576131be936131546131c6923690600401613540565b9590916131b6613162613da5565b9661318d887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916136fa565b9836916136fa565b943691613780565b9173ffffffffffffffffffffffffffffffffffffffff82169485156132e957865190855182036103185760005b8281106132bf5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806132606132528d60408401906135de565b82810360208401528b6135de565b0390a43b61326a57005b6120f09160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526120c061209060a485018b6135de565b806132e36132cf6001938c613b46565b516132da838b613b46565b51908886613eb6565b016131f3565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46139c2565b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031357611bdb6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6138e5565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602061345b613431613463565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861261386c565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b60005b8381106134bc5750506000910152565b81810151838201526020016134ac565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613508815180928187528780880191016134a9565b0116010190565b9181601f840112156103135782359167ffffffffffffffff8311610313576020808501948460051b01011161031357565b9181601f840112156103135782359167ffffffffffffffff8311610313576020838186019501011161031357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff811161031357816135b79160040161350f565b929092916024359067ffffffffffffffff8211610313576135da9160040161350f565b9091565b906020808351928381520192019060005b8181106135fc5750505090565b82518452602093840193909201916001016135ef565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff8111610313578161365b9160040161350f565b9290929160243567ffffffffffffffff8111610313578161367e9160040161350f565b929092916044359067ffffffffffffffff8211610313576135da9160040161350f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612f2d57604052565b67ffffffffffffffff8111612f2d5760051b60200190565b929190613706816136e2565b9361371460405195866136a1565b602085838152019160051b810192831161031357905b82821061373657505050565b813581526020918201910161372a565b67ffffffffffffffff8111612f2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261378c82613746565b9161379a60405193846136a1565b829481845281830111610313578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156138555773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156119575760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156138bb5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613855577f01ffc9a70000000000000000000000000000000000000000000000000000000081146139685760005260205260ff6040600020541690565b5050600190565b90600182811c921680156139b8575b602083101461398957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161397e565b90604051918260008254926139d68461396f565b8084529360018116908115613a4457506001146139fd575b506139fb925003836136a1565b565b90506000929192526020600020906000915b818310613a285750509060206139fb92820101386139ee565b6020919350806001915483858901015201910190918492613a0f565b602093506139fb9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386139ee565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613ade5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156119575760209160051b010190565b81810292918115918404141715613b6d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103135760209260051b809284830137010190565b9290613bf290613c009593604086526040860191613b9c565b926020818503910152613b9c565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103135790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156132e957613c6987878573ffffffffffffffffffffffffffffffffffffffff95613eb6565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613cab575b5050505050565b613d069160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906134cc565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613d6e575b5016036106a3578080613ca4565b613d87915060203d6020116106fe576106f081836136a1565b38613d60565b90816020910312610313575180151581036103135790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613ea7573233148015613eac575b613ea7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e2d575b50613c0057503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561070557600091613e88575b5038613e23565b613ea1915060203d602011610e9f57610e9181836136a1565b38613e81565b503390565b5060183610613dec565b909183613ec4575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613f3a57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613ebe565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031357517fffffffff00000000000000000000000000000000000000000000000000000000811681036103135790565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613ff6575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613ff0565b9091836140585750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156140ce57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613ebe565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580614208575b614150575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610705576000916141e9575b50156141bc5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b614202915060203d602011610e9f57610e9181836136a1565b386141b3565b50813b1515614148565b91929084614221575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260406000205490858203918083101561437d575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603614299575b50613ca4565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561431f57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080614293565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea2646970667358221220b62648b58b58b178084f6c1dd0a5dceb7d0a387f65797444241c1e91e52dfd4064736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x449F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x440F SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x22C0 ADD MSTORE DUP2 DUP2 PUSH2 0x3814 ADD MSTORE PUSH2 0x3DBC ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x33F5 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x336E JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3313 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x30B1 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x27F7 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x26A0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x25B9 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x249E JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x23D7 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x22E4 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2275 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1E4F JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1CC3 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BE5 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1B9A JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AD0 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19B4 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x184C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x150A JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x139B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x132A JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11FD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1165 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1081 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF21 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEB0 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA91 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA55 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x849 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x463 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x36F JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1C0 CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x201 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP2 DUP2 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x221 JUMPI STOP JUMPDEST PUSH2 0x22C DUP2 DUP4 DUP8 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x313 JUMPI PUSH2 0x256 DUP3 DUP6 DUP8 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2D9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x279 DUP3 PUSH2 0x3746 JUMP JUMPDEST SWAP2 PUSH2 0x287 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x36A1 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x218 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2AF JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x292 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x3A6 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3D0 PUSH2 0x3DA5 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x414 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x49A PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x4A2 PUSH2 0x3486 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x4CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP3 PUSH2 0x4D3 PUSH2 0x3DA5 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x785 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x75B JUMPI PUSH2 0x576 DUP3 DUP8 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x711 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x59F DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x4212 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5DC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5EA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH2 0x640 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6D6 JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI JUMPDEST PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3F93 JUMP JUMPDEST DUP7 PUSH2 0x69A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x78E SWAP2 PUSH2 0x4127 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x52A JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x7CC PUSH2 0x3463 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7E9 PUSH2 0x3486 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x898 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8FD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x908 PUSH2 0x3DA5 JUMP JUMPDEST SWAP8 PUSH2 0x933 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x95E DUP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP8 PUSH2 0x96C PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x36A1 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA28 JUMPI POP POP POP SWAP2 PUSH2 0x9A1 PUSH2 0x9A9 SWAP3 PUSH2 0x9B1 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA1D JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9D1 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA17 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F7 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3B46 JUMP JUMPDEST MLOAD AND PUSH2 0xA03 DUP5 DUP8 PUSH2 0x3B46 JUMP JUMPDEST MLOAD PUSH2 0xA0E DUP6 DUP10 PUSH2 0x3B46 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3C24 JUMP JUMPDEST ADD PUSH2 0x9C8 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9C1 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xACB PUSH2 0x3486 JUMP JUMPDEST PUSH2 0xAD3 PUSH2 0x3DA5 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB85 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0xC81 CALLDATASIZE PUSH2 0x3612 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC6 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD16 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x385C JUMP JUMPDEST PUSH2 0x3C03 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE78 JUMPI JUMPDEST POP ISZERO PUSH2 0xE4B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA5 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x385C JUMP JUMPDEST AND SWAP1 PUSH2 0xDB5 PUSH2 0xD11 DUP3 DUP7 DUP10 PUSH2 0x385C JUMP JUMPDEST SWAP2 PUSH2 0xDC1 DUP3 DUP8 DUP12 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x313 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x705 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE3A JUMPI JUMPDEST POP ADD PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE45 SWAP2 PUSH2 0x36A1 JUMP JUMPDEST DUP9 PUSH2 0xE33 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE99 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9F JUMPI JUMPDEST PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3D8D JUMP JUMPDEST DUP10 PUSH2 0xD7B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE87 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDE JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0xF58 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1052 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8A PUSH2 0x3DA5 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1024 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x107C DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4127 JUMP JUMPDEST PUSH2 0xF6C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x39C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x119C PUSH2 0x3486 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1234 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1273 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1300 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F6 PUSH2 0x3DA5 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14C2 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1541 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1561 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15AD PUSH2 0x3DA5 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x318 JUMPI PUSH2 0x15C0 DUP7 DUP9 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1626 JUMPI POP POP SWAP5 PUSH2 0x1621 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3BD9 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x164C PUSH2 0x1637 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH2 0x1643 DUP4 DUP10 DUP10 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x404B JUMP JUMPDEST ADD PUSH2 0x15C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x16AA CALLDATASIZE PUSH2 0x3612 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16ED PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1842 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1715 JUMPI STOP JUMPDEST PUSH2 0x1720 DUP2 DUP4 DUP9 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x313 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1753 PUSH2 0xD11 DUP7 DUP12 DUP15 PUSH2 0x385C JUMP JUMPDEST DUP3 PUSH2 0x17BD PUSH2 0x17E9 PUSH2 0x1765 DUP10 DUP14 DUP14 PUSH2 0x385C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x36A1 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1839 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x180C JUMPI POP PUSH1 0x1 ADD PUSH2 0x170C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17FF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1705 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x185A CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x318 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x1986 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18D6 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1957 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x313 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x313 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x193D DUP5 DUP12 DUP11 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x194E PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x37B7 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18CD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A25 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AA3 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1B07 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x1B2B PUSH2 0x1B98 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH2 0x1B8A PUSH2 0x1B36 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 PUSH2 0x1B61 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3C24 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x1BDB PUSH2 0x1BD6 PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x37FD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1BF3 CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x318 JUMPI PUSH2 0x1C29 DUP6 PUSH2 0x36E2 JUMP JUMPDEST SWAP5 PUSH2 0x1C37 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x36A1 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C64 DUP3 PUSH2 0x36E2 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C8B JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP11 PUSH2 0x35DE JUMP JUMPDEST DUP1 PUSH2 0x1CB2 PUSH2 0x1C9F PUSH2 0xD11 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x385C JUMP JUMPDEST PUSH2 0x1CAA DUP4 DUP8 DUP10 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x386C JUMP JUMPDEST PUSH2 0x1CBC DUP3 DUP11 PUSH2 0x3B46 JUMP JUMPDEST MSTORE ADD PUSH2 0x1C6E JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1CFD PUSH2 0x3486 JUMP JUMPDEST PUSH2 0x1D05 PUSH2 0x3DA5 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1DB8 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1E86 PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x1E8E PUSH2 0x3486 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1EAE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1ED0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1EF1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1EFC PUSH2 0x3DA5 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2265 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x75B JUMPI DUP10 DUP12 SUB PUSH2 0x318 JUMPI PUSH2 0x1FA6 DUP3 DUP5 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x221B JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x21EC JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2011 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3BD9 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x201B JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2030 PUSH2 0x2038 SWAP3 PUSH2 0x2040 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH2 0x20F0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20C0 PUSH2 0x2090 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x35DE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x35DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x21CD JUMPI JUMPDEST POP AND SUB PUSH2 0x2153 JUMPI STOP JUMPDEST PUSH2 0x21C9 SWAP1 PUSH2 0x2199 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x35DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x35DE JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x21E6 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP7 PUSH2 0x214A JUMP JUMPDEST DUP1 PUSH2 0x2215 DUP13 PUSH2 0x220B DUP16 SWAP5 PUSH2 0x2203 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x4212 JUMP JUMPDEST ADD PUSH2 0x1FAE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x226E SWAP2 PUSH2 0x4127 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1F53 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x23CF JUMPI JUMPDEST ISZERO PUSH2 0x2399 JUMPI POP POP PUSH2 0x1161 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1161 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x23BC JUMPI PUSH2 0x23B6 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3B5A JUMP JUMPDEST DIV PUSH2 0x2369 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x23CA SWAP3 DIV PUSH2 0x3B5A JUMP JUMPDEST PUSH2 0x2369 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x235C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2426 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x1986 JUMPI PUSH2 0x2499 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x37B7 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x24D5 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x2504 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 PUSH2 0x2510 DUP5 DUP7 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x256F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x255E PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x404B JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x25F0 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x262F PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x276F JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP6 PUSH2 0x34CC JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x277E DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x27EF JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x27F3 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x27EF JUMPI DUP1 MLOAD SWAP3 PUSH2 0x27B5 DUP5 PUSH2 0x3746 JUMP JUMPDEST SWAP3 PUSH2 0x27C3 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x36A1 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x27EC JUMPI POP PUSH2 0x1161 SWAP3 PUSH2 0x27E6 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x34A9 JUMP JUMPDEST SWAP1 PUSH2 0x2759 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2846 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2866 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x313 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x313 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x28D4 PUSH2 0x3DA5 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x305C JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2D JUMPI DUP2 SWAP1 PUSH2 0x2B5C DUP5 SLOAD PUSH2 0x396F JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3009 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2F67 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2F5C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH2 0x2BE7 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x396F JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2EA9 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2DAD JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2DA2 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2C0A JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2E91 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2E59 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2C5C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2E2C JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2E18 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2F23 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2F17 JUMPI POP PUSH2 0x2BF0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2F0A JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2B7C JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2FF1 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2FB9 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2BAE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2FAC JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2F96 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3052 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3043 JUMPI POP PUSH2 0x2B65 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3036 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3028 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2941 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x30E8 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x3108 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x312A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x31BE SWAP4 PUSH2 0x3154 PUSH2 0x31C6 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x31B6 PUSH2 0x3162 PUSH2 0x3DA5 JUMP JUMPDEST SWAP7 PUSH2 0x318D DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x32E9 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x32BF JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x3260 PUSH2 0x3252 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x35DE JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x35DE JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x326A JUMPI STOP JUMPDEST PUSH2 0x20F0 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20C0 PUSH2 0x2090 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x35DE JUMP JUMPDEST DUP1 PUSH2 0x32E3 PUSH2 0x32CF PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3B46 JUMP JUMPDEST MLOAD PUSH2 0x32DA DUP4 DUP12 PUSH2 0x3B46 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3EB6 JUMP JUMPDEST ADD PUSH2 0x31F3 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x39C2 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1BDB PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x38E5 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x345B PUSH2 0x3431 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x386C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x34BC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x34AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3508 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x34A9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x35B7 SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x35DA SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x35FC JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x35EF JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x365B SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x367E SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x35DA SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2F2D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3706 DUP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP4 PUSH2 0x3714 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x36A1 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x313 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3736 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x372A JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x378C DUP3 PUSH2 0x3746 JUMP JUMPDEST SWAP2 PUSH2 0x379A PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x36A1 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x313 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3855 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1957 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x38BB JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3855 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3968 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x39B8 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3989 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x397E JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x39D6 DUP5 PUSH2 0x396F JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3A44 JUMPI POP PUSH1 0x1 EQ PUSH2 0x39FD JUMPI JUMPDEST POP PUSH2 0x39FB SWAP3 POP SUB DUP4 PUSH2 0x36A1 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3A28 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x39FB SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x39EE JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3A0F JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x39FB SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x39EE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3ADE JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1957 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3B6D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x3BF2 SWAP1 PUSH2 0x3C00 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3B9C JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3B9C JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x32E9 JUMPI PUSH2 0x3C69 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3EB6 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3CAB JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3D06 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3D6E JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI DUP1 DUP1 PUSH2 0x3CA4 JUMP JUMPDEST PUSH2 0x3D87 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x3D60 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3EA7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3EAC JUMPI JUMPDEST PUSH2 0x3EA7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E2D JUMPI JUMPDEST POP PUSH2 0x3C00 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E88 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E23 JUMP JUMPDEST PUSH2 0x3EA1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x3E81 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3DEC JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3EC4 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3F3A JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3FF6 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3FF0 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x4058 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x40CE JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4208 JUMPI JUMPDEST PUSH2 0x4150 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x41E9 JUMPI JUMPDEST POP ISZERO PUSH2 0x41BC JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4202 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x41B3 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4148 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x4221 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x437D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x4299 JUMPI JUMPDEST POP PUSH2 0x3CA4 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x431F JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4293 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 0x26 BASEFEE 0xB5 DUP12 PC 0xB1 PUSH25 0x84F6C1DD0A5DCEB7D0A387F65797444241C1E91E52DFD4064 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1954:1807:231:-:0;;;;;;;;;;;;;-1:-1:-1;;1954:1807:231;;;;-1:-1:-1;;;;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1954:1807:231;;;;;;745:39:76;;1954:1807:231;;;;;;;;745:39:76;1954:1807:231;;;;;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;;;;-1:-1:-1;1954:1807:231;;;;;-1:-1:-1;1954:1807:231"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":13446,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13842,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13678,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":13583,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":14074,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":14208,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15757,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":16275,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":13632,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":13411,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":13790,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":15260,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata_array_uint256_dyn_calldata":{"entryPoint":15321,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":13516,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":14263,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":14050,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":14150,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":14428,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":15194,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14786,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":13481,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":14703,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":13985,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":14444,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_burnToken":{"entryPoint":16459,"id":25409,"parameterSlots":4,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":16679,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14980,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":16331,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":14333,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":16054,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":15781,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":15396,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":14565,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferToken":{"entryPoint":16914,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":15174,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":15363,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8896},{"length":32,"start":14356},{"length":32,"start":15804}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e146133f557806301ffc9a71461336e57806306fdde03146133135780630d6a5bbb146130b15780630e07f854146127f75780630e89341c146126a0578063114ba8ee146125b9578063124d91e51461249e578063162094c4146123d75780632a55205a146122e45780632b4c9f16146122755780632eb2c2d614611e4f5780632f2ff15d14611cc35780634e1273f414611be5578063572b6c0514611b9a5780635cfa929714611ad057806361ba27da146119b45780636706467b1461184c57806373c8a9581461169c578063805349341461150a5780638bb9c5bf1461139b5780638da5cb5b1461132a5780638dc251e3146111fd57806391d148541461116557806395d89b41146110f2578063a0c76f6214611081578063a22cb46514610f21578063b0ccc31e14610eb0578063c3666c3614610c73578063d539139314610c1a578063d547741f14610a91578063e1a8bf2c14610a55578063e8ab9ccc14610849578063e985e9c514610795578063f242432a14610463578063f2fde38b1461036f5763f7ba94bd146101b257600080fd5b34610313576101c03661356e565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610201613da5565b925416911690810361034257508181036103185760005b81811061022157005b61022c81838761385c565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103135761025682858761385c565b35908147106102e157600080809381935af13d156102d9573d9061027982613746565b9161028760405193846136a1565b82523d6000602084013e5b156102a05750600101610218565b8051156102af57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610292565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576103a6613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103d0613da5565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610342575073ffffffffffffffffffffffffffffffffffffffff169182820361041457005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761049a613463565b6104a2613486565b604435906064359260843567ffffffffffffffff8111610313576104ca903690600401613540565b926104d3613da5565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610785575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561075b57610576828783613fcb565b156107115773ffffffffffffffffffffffffffffffffffffffff9161059f8a8a878a8796614212565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105dc57005b6020926105ea913691613780565b9261064060405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906134cc565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106d6575b5016036106a357005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106f8915060203d6020116106fe575b6106f081836136a1565b810190613f93565b8661069a565b503d6106e6565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61078e91614127565b878561052a565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576107cc613463565b73ffffffffffffffffffffffffffffffffffffffff6107e9613486565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff81116103135761089890369060040161350f565b60243567ffffffffffffffff8111610313576108b890369060040161350f565b929060443567ffffffffffffffff8111610313576108da90369060040161350f565b93909160643567ffffffffffffffff8111610313576108fd903690600401613540565b939091610908613da5565b97610933897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129461095e816136e2565b9761096c604051998a6136a1565b818952602089019160051b81019036821161031357915b818310610a2857505050916109a16109a9926109b1959436916136fa565b9736916136fa565b933691613780565b9183519480518614801590610a1d575b6103185760005b8681106109d157005b80610a178673ffffffffffffffffffffffffffffffffffffffff6109f76001958b613b46565b5116610a038487613b46565b51610a0e8589613b46565b51918d8a613c24565b016109c8565b5081518614156109c1565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031357815260209283019201610983565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020604051620186a08152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435610acb613486565b610ad3613da5565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b8557005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031357610c8136613612565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc6613da5565b92541691169081036103425750808214801590610ea6575b6103185760005b828110610cee57005b73ffffffffffffffffffffffffffffffffffffffff610d16610d1183858a61385c565b613c03565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa90811561070557600091610e78575b5015610e4b575073ffffffffffffffffffffffffffffffffffffffff610da5610d1183858a61385c565b1690610db5610d1182868961385c565b91610dc182878b61385c565b3592813b1561031357606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af191821561070557600192610e3a575b5001610ce5565b6000610e45916136a1565b88610e33565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e99915060203d8111610e9f575b610e9181836136a1565b810190613d8d565b89610d7b565b503d610e87565b5082821415610cde565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357610f58613463565b602435908115159182810361031357611052575b73ffffffffffffffffffffffffffffffffffffffff80610f8a613da5565b169116918183146110245760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61107c817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614127565b610f6c565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56139c2565b6040519182916020835260208301906134cc565b0390f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761119c613486565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611234613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611273613da5565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156113005773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113f6613da5565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114c25760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c15565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611541613463565b60243567ffffffffffffffff81116103135761156190369060040161350f565b9060443567ffffffffffffffff81116103135761158290369060040161350f565b907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612936115ad613da5565b94838203610318576115c0868883613fcb565b156116525760005b828110611626575050946116217f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb9373ffffffffffffffffffffffffffffffffffffffff93600098856040519687961699169785613bd9565b0390a4005b8061164c611637600193868a61385c565b3561164383898961385c565b35908b8661404b565b016115c8565b73ffffffffffffffffffffffffffffffffffffffff8781887f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b34610313576116aa36613612565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116ed613da5565b92541691169081036103425750808414801590611842575b6103185760005b84811061171557005b61172081838861385c565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610313576000602091611753610d11868b8e61385c565b826117bd6117e9611765898d8d61385c565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826136a1565b51925af115610705576000513d6118395750803b155b61180c575060010161170c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156117ff565b5082841415611705565b346103135761185a3661356e565b8083949293036103185773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416330361198657916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b8581106118d657005b84811015611957578060051b820135838112156103135782019081359167ffffffffffffffff8311610313576020018236038113610313577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b60019361193d848b8a61385c565b359261194e604051928392836137b7565b0390a2016118cd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611a25613da5565b925416911690810361034257507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611aa357815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611b07613463565b6064359067ffffffffffffffff821161031357611b2b611b98923690600401613540565b611b8a611b36613da5565b92611b61847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612923691613780565b926044359260243592613c24565b005b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576020611bdb611bd6613463565b6137fd565b6040519015158152f35b3461031357611bf33661356e565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361031857611c29856136e2565b94611c3760405196876136a1565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611c64826136e2565b0136602088013760005b818110611c8b57604051602080825281906111619082018a6135de565b80611cb2611c9f610d11600194868b61385c565b611caa83878961385c565b35908861386c565b611cbc828a613b46565b5201611c6e565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357600435611cfd613486565b611d05613da5565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034257507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611db857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c15565b346103135760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357611e86613463565b611e8e613486565b60443567ffffffffffffffff811161031357611eae90369060040161350f565b929060643567ffffffffffffffff811161031357611ed090369060040161350f565b9360843567ffffffffffffffff811161031357611ef1903690600401613540565b939091611efc613da5565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff821603612265575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561075b57898b0361031857611fa6828483613fcb565b1561221b5760005b8b81106121ec575050928992888a73ffffffffffffffffffffffffffffffffffffffff9897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a61201199169a8b92169889936040519182918d8c8b85613bd9565b0390a43b61201b57005b602094612030612038926120409536916136fa565b9936916136fa565b953691613780565b926120f060405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a060448401526120c061209060a485018b6135de565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858203016064860152886135de565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526134cc565b03816000875af1908115610705577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916121cd575b50160361215357005b6121c9906121996040519485947fc287817e00000000000000000000000000000000000000000000000000000000865260048601526060602486015260648501906135de565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160448501526135de565b0390fd5b6121e6915060203d6020116106fe576106f081836136a1565b8661214a565b806122158c61220b8f94612203816001978d61385c565b35928d61385c565b3590888887614212565b01611fae565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b61226e91614127565b8987611f53565b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156123cf575b1561239957505061116160005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61116191620186a08210156123bc576123b690620186a092613b5a565b04612369565b620186a06123ca9204613b5a565b612369565b50811561235c565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760243567ffffffffffffffff811161031357612426903690600401613540565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a654163303611986576124997f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160043595836137b7565b0390a2005b346103135760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576124d5613463565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612602435604435612504613da5565b92612510848683613fcb565b1561256f5773ffffffffffffffffffffffffffffffffffffffff80868461255e7fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62968860009b60409861404b565b8451968752602087015216941692a4005b73ffffffffffffffffffffffffffffffffffffffff8581867f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576125f0613463565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061262f613da5565b9254169116908103610342575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156107055760009161276f575b60405160208082528190611161908201856134cc565b3d8083833e61277e81836136a1565b8101906020818303126127ef5780519067ffffffffffffffff82116127f3570181601f820112156127ef578051926127b584613746565b926127c360405194856136a1565b848452602085840101116127ec5750611161926127e691602080850191016134a9565b90612759565b80fd5b8280fd5b8380fd5b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135760043567ffffffffffffffff811161031357612846903690600401613540565b60243567ffffffffffffffff811161031357612866903690600401613540565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610313576064359373ffffffffffffffffffffffffffffffffffffffff85168503610313577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6128d4613da5565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612d70575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff16908161305c575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f5c02e378c7e12e45f2172a90ebe0d96018481ff16fe9e48432619c595922030080548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612d70575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612f2d578190612b5c845461396f565b601f8111613009575b50600090601f8311600114612f6757600092612f5c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612f2d57612be77f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a55461396f565b601f8111612ea9575b506000601f8211600114612dad5781929394600092612da2575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612d70575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612c0a565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612e91575083600195969710612e59575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612c5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612e2c565b90926020600181928686013581550194019101612e18565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612f23575b601f0160051c01905b818110612f175750612bf0565b60008155600101612f0a565b9091508190612f01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612b7c565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612ff15750908460019594939210612fb9575b505050811b019055612bae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612fac565b91936020600181928787013581550195019201612f96565b909150836000526020600020601f840160051c81019160208510613052575b90601f859493920160051c01905b8181106130435750612b65565b60008155849350600101613036565b9091508190613028565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612941565b346103135760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576130e8613463565b60243567ffffffffffffffff81116103135761310890369060040161350f565b909160443567ffffffffffffffff81116103135761312a90369060040161350f565b93909160643567ffffffffffffffff8111610313576131be936131546131c6923690600401613540565b9590916131b6613162613da5565b9661318d887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22613a84565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129936916136fa565b9836916136fa565b943691613780565b9173ffffffffffffffffffffffffffffffffffffffff82169485156132e957865190855182036103185760005b8281106132bf5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb60405160408152806132606132528d60408401906135de565b82810360208401528b6135de565b0390a43b61326a57005b6120f09160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a060448401526120c061209060a485018b6135de565b806132e36132cf6001938c613b46565b516132da838b613b46565b51908886613eb6565b016131f3565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103135760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103135761116161114d7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46139c2565b346103135760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610313576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031357611bdb6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6138e5565b346103135760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031357602061345b613431613463565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861261386c565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031357565b60005b8381106134bc5750506000910152565b81810151838201526020016134ac565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613508815180928187528780880191016134a9565b0116010190565b9181601f840112156103135782359167ffffffffffffffff8311610313576020808501948460051b01011161031357565b9181601f840112156103135782359167ffffffffffffffff8311610313576020838186019501011161031357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff811161031357816135b79160040161350f565b929092916024359067ffffffffffffffff8211610313576135da9160040161350f565b9091565b906020808351928381520192019060005b8181106135fc5750505090565b82518452602093840193909201916001016135ef565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103135760043567ffffffffffffffff8111610313578161365b9160040161350f565b9290929160243567ffffffffffffffff8111610313578161367e9160040161350f565b929092916044359067ffffffffffffffff8211610313576135da9160040161350f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612f2d57604052565b67ffffffffffffffff8111612f2d5760051b60200190565b929190613706816136e2565b9361371460405195866136a1565b602085838152019160051b810192831161031357905b82821061373657505050565b813581526020918201910161372a565b67ffffffffffffffff8111612f2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261378c82613746565b9161379a60405193846136a1565b829481845281830111610313578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156138555773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156119575760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156138bb5760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613855577f01ffc9a70000000000000000000000000000000000000000000000000000000081146139685760005260205260ff6040600020541690565b5050600190565b90600182811c921680156139b8575b602083101461398957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161397e565b90604051918260008254926139d68461396f565b8084529360018116908115613a4457506001146139fd575b506139fb925003836136a1565b565b90506000929192526020600020906000915b818310613a285750509060206139fb92820101386139ee565b6020919350806001915483858901015201910190918492613a0f565b602093506139fb9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386139ee565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613ade5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156119575760209160051b010190565b81810292918115918404141715613b6d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116103135760209260051b809284830137010190565b9290613bf290613c009593604086526040860191613b9c565b926020818503910152613b9c565b90565b3573ffffffffffffffffffffffffffffffffffffffff811681036103135790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156132e957613c6987878573ffffffffffffffffffffffffffffffffffffffff95613eb6565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b613cab575b5050505050565b613d069160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906134cc565b03816000865af1908115610705577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613d6e575b5016036106a3578080613ca4565b613d87915060203d6020116106fe576106f081836136a1565b38613d60565b90816020910312610313575180151581036103135790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613ea7573233148015613eac575b613ea7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e2d575b50613c0057503390565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561070557600091613e88575b5038613e23565b613ea1915060203d602011610e9f57610e9181836136a1565b38613e81565b503390565b5060183610613dec565b909183613ec4575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613f3a57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613ebe565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b9081602091031261031357517fffffffff00000000000000000000000000000000000000000000000000000000811681036103135790565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613ff6575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613ff0565b9091836140585750505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff84166000526020526040600020549380850394808610156140ce57505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613ebe565b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b5473ffffffffffffffffffffffffffffffffffffffff169081151580614208575b614150575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610705576000916141e9575b50156141bc5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b614202915060203d602011610e9f57610e9181836136a1565b386141b3565b50813b1515614148565b91929084614221575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260406000205490858203918083101561437d575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603614299575b50613ca4565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff861660005260205260406000205495808701968088111561431f57505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080614293565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea2646970667358221220b62648b58b58b178084f6c1dd0a5dceb7d0a387f65797444241c1e91e52dfd4064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x33F5 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x336E JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3313 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x30B1 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x27F7 JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x26A0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x25B9 JUMPI DUP1 PUSH4 0x124D91E5 EQ PUSH2 0x249E JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x23D7 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x22E4 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2275 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1E4F JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1CC3 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1BE5 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1B9A JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1AD0 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x19B4 JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x184C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x169C JUMPI DUP1 PUSH4 0x80534934 EQ PUSH2 0x150A JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x139B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x132A JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11FD JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1165 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1081 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF21 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xEB0 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC73 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC1A JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA91 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA55 JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x849 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x463 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x36F JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1C0 CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x201 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP2 DUP2 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x221 JUMPI STOP JUMPDEST PUSH2 0x22C DUP2 DUP4 DUP8 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x313 JUMPI PUSH2 0x256 DUP3 DUP6 DUP8 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2D9 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x279 DUP3 PUSH2 0x3746 JUMP JUMPDEST SWAP2 PUSH2 0x287 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x36A1 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x218 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2AF JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x292 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x3A6 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3D0 PUSH2 0x3DA5 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x414 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x49A PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x4A2 PUSH2 0x3486 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x4CA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP3 PUSH2 0x4D3 PUSH2 0x3DA5 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x785 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x75B JUMPI PUSH2 0x576 DUP3 DUP8 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x711 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x59F DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x4212 JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5DC JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5EA SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH2 0x640 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6D6 JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6F8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI JUMPDEST PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3F93 JUMP JUMPDEST DUP7 PUSH2 0x69A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6E6 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x78E SWAP2 PUSH2 0x4127 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x52A JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x7CC PUSH2 0x3463 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7E9 PUSH2 0x3486 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x898 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8B8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8DA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x8FD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x908 PUSH2 0x3DA5 JUMP JUMPDEST SWAP8 PUSH2 0x933 DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x95E DUP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP8 PUSH2 0x96C PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x36A1 JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x313 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA28 JUMPI POP POP POP SWAP2 PUSH2 0x9A1 PUSH2 0x9A9 SWAP3 PUSH2 0x9B1 SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA1D JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9D1 JUMPI STOP JUMPDEST DUP1 PUSH2 0xA17 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F7 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3B46 JUMP JUMPDEST MLOAD AND PUSH2 0xA03 DUP5 DUP8 PUSH2 0x3B46 JUMP JUMPDEST MLOAD PUSH2 0xA0E DUP6 DUP10 PUSH2 0x3B46 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3C24 JUMP JUMPDEST ADD PUSH2 0x9C8 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9C1 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xACB PUSH2 0x3486 JUMP JUMPDEST PUSH2 0xAD3 PUSH2 0x3DA5 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB85 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0xC81 CALLDATASIZE PUSH2 0x3612 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC6 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD16 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x385C JUMP JUMPDEST PUSH2 0x3C03 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE78 JUMPI JUMPDEST POP ISZERO PUSH2 0xE4B JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA5 PUSH2 0xD11 DUP4 DUP6 DUP11 PUSH2 0x385C JUMP JUMPDEST AND SWAP1 PUSH2 0xDB5 PUSH2 0xD11 DUP3 DUP7 DUP10 PUSH2 0x385C JUMP JUMPDEST SWAP2 PUSH2 0xDC1 DUP3 DUP8 DUP12 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x313 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x705 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE3A JUMPI JUMPDEST POP ADD PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE45 SWAP2 PUSH2 0x36A1 JUMP JUMPDEST DUP9 PUSH2 0xE33 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE99 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9F JUMPI JUMPDEST PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3D8D JUMP JUMPDEST DUP10 PUSH2 0xD7B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE87 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDE JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0xF58 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1052 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8A PUSH2 0x3DA5 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1024 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x107C DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4127 JUMP JUMPDEST PUSH2 0xF6C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x39C2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x119C PUSH2 0x3486 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1234 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1273 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1300 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13F6 PUSH2 0x3DA5 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14C2 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1541 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1561 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP4 PUSH2 0x15AD PUSH2 0x3DA5 JUMP JUMPDEST SWAP5 DUP4 DUP3 SUB PUSH2 0x318 JUMPI PUSH2 0x15C0 DUP7 DUP9 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1626 JUMPI POP POP SWAP5 PUSH2 0x1621 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 PUSH1 0x0 SWAP9 DUP6 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP7 AND SWAP10 AND SWAP8 DUP6 PUSH2 0x3BD9 JUMP JUMPDEST SUB SWAP1 LOG4 STOP JUMPDEST DUP1 PUSH2 0x164C PUSH2 0x1637 PUSH1 0x1 SWAP4 DUP7 DUP11 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH2 0x1643 DUP4 DUP10 DUP10 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP12 DUP7 PUSH2 0x404B JUMP JUMPDEST ADD PUSH2 0x15C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 DUP9 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x16AA CALLDATASIZE PUSH2 0x3612 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16ED PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1842 JUMPI JUMPDEST PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1715 JUMPI STOP JUMPDEST PUSH2 0x1720 DUP2 DUP4 DUP9 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x313 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1753 PUSH2 0xD11 DUP7 DUP12 DUP15 PUSH2 0x385C JUMP JUMPDEST DUP3 PUSH2 0x17BD PUSH2 0x17E9 PUSH2 0x1765 DUP10 DUP14 DUP14 PUSH2 0x385C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x36A1 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1839 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x180C JUMPI POP PUSH1 0x1 ADD PUSH2 0x170C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x17FF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1705 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x185A CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x318 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x1986 JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x18D6 JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1957 JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x313 JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x313 JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x193D DUP5 DUP12 DUP11 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x194E PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x37B7 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x18CD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1A25 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1AA3 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1B07 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x1B2B PUSH2 0x1B98 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH2 0x1B8A PUSH2 0x1B36 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 PUSH2 0x1B61 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3C24 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x1BDB PUSH2 0x1BD6 PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x37FD JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH2 0x1BF3 CALLDATASIZE PUSH2 0x356E JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x318 JUMPI PUSH2 0x1C29 DUP6 PUSH2 0x36E2 JUMP JUMPDEST SWAP5 PUSH2 0x1C37 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x36A1 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1C64 DUP3 PUSH2 0x36E2 JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1C8B JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP11 PUSH2 0x35DE JUMP JUMPDEST DUP1 PUSH2 0x1CB2 PUSH2 0x1C9F PUSH2 0xD11 PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x385C JUMP JUMPDEST PUSH2 0x1CAA DUP4 DUP8 DUP10 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x386C JUMP JUMPDEST PUSH2 0x1CBC DUP3 DUP11 PUSH2 0x3B46 JUMP JUMPDEST MSTORE ADD PUSH2 0x1C6E JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1CFD PUSH2 0x3486 JUMP JUMPDEST PUSH2 0x1D05 PUSH2 0x3DA5 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1DB8 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC15 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1E86 PUSH2 0x3463 JUMP JUMPDEST PUSH2 0x1E8E PUSH2 0x3486 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1EAE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1ED0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x1EF1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1EFC PUSH2 0x3DA5 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2265 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x75B JUMPI DUP10 DUP12 SUB PUSH2 0x318 JUMPI PUSH2 0x1FA6 DUP3 DUP5 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x221B JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x21EC JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP11 PUSH2 0x2011 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP14 DUP13 DUP12 DUP6 PUSH2 0x3BD9 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x201B JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x2030 PUSH2 0x2038 SWAP3 PUSH2 0x2040 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP3 PUSH2 0x20F0 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20C0 PUSH2 0x2090 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x35DE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x35DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x21CD JUMPI JUMPDEST POP AND SUB PUSH2 0x2153 JUMPI STOP JUMPDEST PUSH2 0x21C9 SWAP1 PUSH2 0x2199 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x35DE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x35DE JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x21E6 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP7 PUSH2 0x214A JUMP JUMPDEST DUP1 PUSH2 0x2215 DUP13 PUSH2 0x220B DUP16 SWAP5 PUSH2 0x2203 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x385C JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x4212 JUMP JUMPDEST ADD PUSH2 0x1FAE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x226E SWAP2 PUSH2 0x4127 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1F53 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x23CF JUMPI JUMPDEST ISZERO PUSH2 0x2399 JUMPI POP POP PUSH2 0x1161 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1161 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x23BC JUMPI PUSH2 0x23B6 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3B5A JUMP JUMPDEST DIV PUSH2 0x2369 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x23CA SWAP3 DIV PUSH2 0x3B5A JUMP JUMPDEST PUSH2 0x2369 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x235C JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2426 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x1986 JUMPI PUSH2 0x2499 PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x37B7 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x24D5 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH2 0x2504 PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 PUSH2 0x2510 DUP5 DUP7 DUP4 PUSH2 0x3FCB JUMP JUMPDEST ISZERO PUSH2 0x256F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 DUP5 PUSH2 0x255E PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 SWAP7 DUP9 PUSH1 0x0 SWAP12 PUSH1 0x40 SWAP9 PUSH2 0x404B JUMP JUMPDEST DUP5 MLOAD SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD MSTORE AND SWAP5 AND SWAP3 LOG4 STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 DUP7 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x25F0 PUSH2 0x3463 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x262F PUSH2 0x3DA5 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x342 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x276F JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x1161 SWAP1 DUP3 ADD DUP6 PUSH2 0x34CC JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x277E DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x27EF JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x27F3 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x27EF JUMPI DUP1 MLOAD SWAP3 PUSH2 0x27B5 DUP5 PUSH2 0x3746 JUMP JUMPDEST SWAP3 PUSH2 0x27C3 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x36A1 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x27EC JUMPI POP PUSH2 0x1161 SWAP3 PUSH2 0x27E6 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x34A9 JUMP JUMPDEST SWAP1 PUSH2 0x2759 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2846 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x2866 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x313 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x313 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x28D4 PUSH2 0x3DA5 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x305C JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x5C02E378C7E12E45F2172A90EBE0D96018481FF16FE9E48432619C5959220300 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2F2D JUMPI DUP2 SWAP1 PUSH2 0x2B5C DUP5 SLOAD PUSH2 0x396F JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3009 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2F67 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2F5C JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH2 0x2BE7 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x396F JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2EA9 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2DAD JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2DA2 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2D70 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2C0A JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2E91 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2E59 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2C5C JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2E2C JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2E18 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2F23 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2F17 JUMPI POP PUSH2 0x2BF0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2F0A JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2B7C JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2FF1 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2FB9 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2BAE JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2FAC JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2F96 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3052 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3043 JUMPI POP PUSH2 0x2B65 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x3036 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3028 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2941 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x30E8 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x3108 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x312A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI PUSH2 0x31BE SWAP4 PUSH2 0x3154 PUSH2 0x31C6 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3540 JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x31B6 PUSH2 0x3162 PUSH2 0x3DA5 JUMP JUMPDEST SWAP7 PUSH2 0x318D DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x3A84 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x36FA JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3780 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x32E9 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x318 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x32BF JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x3260 PUSH2 0x3252 DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x35DE JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x35DE JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x326A JUMPI STOP JUMPDEST PUSH2 0x20F0 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x20C0 PUSH2 0x2090 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x35DE JUMP JUMPDEST DUP1 PUSH2 0x32E3 PUSH2 0x32CF PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3B46 JUMP JUMPDEST MLOAD PUSH2 0x32DA DUP4 DUP12 PUSH2 0x3B46 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3EB6 JUMP JUMPDEST ADD PUSH2 0x31F3 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH2 0x1161 PUSH2 0x114D PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x39C2 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI PUSH2 0x1BDB PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x38E5 JUMP JUMPDEST CALLVALUE PUSH2 0x313 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x313 JUMPI PUSH1 0x20 PUSH2 0x345B PUSH2 0x3431 PUSH2 0x3463 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x386C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x34BC JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x34AC JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3508 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x34A9 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x313 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x313 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x35B7 SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x35DA SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x35FC JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x35EF JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x313 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x365B SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x313 JUMPI DUP2 PUSH2 0x367E SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x313 JUMPI PUSH2 0x35DA SWAP2 PUSH1 0x4 ADD PUSH2 0x350F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2F2D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3706 DUP2 PUSH2 0x36E2 JUMP JUMPDEST SWAP4 PUSH2 0x3714 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x36A1 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x313 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3736 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x372A JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2F2D JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x378C DUP3 PUSH2 0x3746 JUMP JUMPDEST SWAP2 PUSH2 0x379A PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x36A1 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x313 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3855 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1957 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x38BB JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3855 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3968 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x39B8 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3989 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x397E JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x39D6 DUP5 PUSH2 0x396F JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3A44 JUMPI POP PUSH1 0x1 EQ PUSH2 0x39FD JUMPI JUMPDEST POP PUSH2 0x39FB SWAP3 POP SUB DUP4 PUSH2 0x36A1 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3A28 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x39FB SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x39EE JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3A0F JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x39FB SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x39EE JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3ADE JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1957 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3B6D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x313 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x3BF2 SWAP1 PUSH2 0x3C00 SWAP6 SWAP4 PUSH1 0x40 DUP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP2 PUSH2 0x3B9C JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x3B9C JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x32E9 JUMPI PUSH2 0x3C69 DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3EB6 JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x3CAB JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3D06 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x34CC JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3D6E JUMPI JUMPDEST POP AND SUB PUSH2 0x6A3 JUMPI DUP1 DUP1 PUSH2 0x3CA4 JUMP JUMPDEST PUSH2 0x3D87 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6FE JUMPI PUSH2 0x6F0 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x3D60 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3EA7 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3EAC JUMPI JUMPDEST PUSH2 0x3EA7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E2D JUMPI JUMPDEST POP PUSH2 0x3C00 JUMPI POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3E88 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E23 JUMP JUMPDEST PUSH2 0x3EA1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x3E81 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3DEC JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3EC4 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3F3A JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x313 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x313 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3FF6 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3FF0 JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x4058 JUMPI POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x40CE JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4208 JUMPI JUMPDEST PUSH2 0x4150 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x705 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x41E9 JUMPI JUMPDEST POP ISZERO PUSH2 0x41BC JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x4202 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9F JUMPI PUSH2 0xE91 DUP2 DUP4 PUSH2 0x36A1 JUMP JUMPDEST CODESIZE PUSH2 0x41B3 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4148 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x4221 JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x437D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x4299 JUMPI JUMPDEST POP PUSH2 0x3CA4 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x431F JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4293 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 0x26 BASEFEE 0xB5 DUP12 PC 0xB1 PUSH25 0x84F6C1DD0A5DCEB7D0A387F65797444241C1E91E52DFD4064 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1954:1807:231:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1954:1807:231;;3478:41;;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1954:1807:231;1845:10:192;;;;;;1954:1807:231;1857:3:192;1876:11;;;;;:::i;:::-;1954:1807:231;;;;;;;;;1898:10:192;;;;;:::i;:::-;1954:1807:231;1375:21:9;;;:30;1371:125;;1954:1807:231;1548:33:9;;;;;;;1954:1807:231;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1954:1807:231;;1834:9:192;;1591:58:9;1954:1807:231;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1954:1807:231;5957:19:9;1954:1807:231;;5957:19:9;1954:1807:231;;;;;1371:125:9;1455:21;;1428:57;1954:1807:231;1428:57:9;1954:1807:231;;;;;;1428:57:9;1954:1807:231;;;;1756:63:192;1793:26;1954:1807:231;1793:26:192;1954:1807:231;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1954:1807:231;;-1:-1:-1;4538:25:42;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;3478:41;;;:::i;:::-;1954:1807;;;;;;;;3205:23:42;;;3201:60;;1954:1807:231;;;3275:25:42;;;;3271:146;;1954:1807:231;3271:146:42;583:77:341;;;;;;;;3361:45:42;1954:1807:231;3361:45:42;;1954:1807:231;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41;;;:::i;:::-;3179:19:352;1954:1807:231;;;;;;;;2616:14:352;2612:76;;1954:1807:231;-1:-1:-1;;1954:1807:231;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;1954:1807:231;4720:5:228;;;;;;;;;:::i;:::-;1954:1807:231;;;;;;;4742:43:228;1954:1807:231;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;1954:1807:231;4796:104:228;1954:1807:231;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;1954:1807:231;19356:74:228;;1954:1807:231;19356:74:228;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;1954:1807:231;19356:74:228;;;;;;;;1954:1807:231;19356:74:228;1954:1807:231;19356:74:228;1954:1807:231;19356:74:228;;;4796:104;1954:1807:231;;19356:101:228;19352:168;;1954:1807:231;19352:168:228;19478:42;1954:1807:231;19478:42:228;1954:1807:231;;;;;;;;19478:42:228;19356:74;;;;1954:1807:231;19356:74:228;1954:1807:231;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1954:1807:231;;;;;;;;;4601:76:228;1954:1807:231;4645:32:228;;;;1954:1807:231;4645:32:228;1954:1807:231;;;;;;;;4645:32:228;4532:59;4561:30;1954:1807:231;4561:30:228;1954:1807:231;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;1954:1807:231;-1:-1:-1;1954:1807:231;14847:11:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;14847:28:228;1954:1807:231;-1:-1:-1;1954:1807:231;;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;1954:1807:231;1367:6:208;:::i;:::-;1954:1807:231;974:8:208;;;;:::i;:::-;1954:1807:231;;;;;;;:::i;:::-;974:8:208;;;1954:1807:231;974:8:208;;;;;;;1954:1807:231;;974:8:208;;;;;;;;;;;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;1954:1807:231;11728:10:228;;;;;;1954:1807:231;11740:3:228;11778:13;11812:4;11778:13;1954:1807:231;11778:13:228;1954:1807:231;11778:13:228;;;:::i;:::-;1954:1807:231;;11793:6:228;;;;:::i;:::-;1954:1807:231;11801:9:228;;;;:::i;:::-;1954:1807:231;11812:4:228;;;;:::i;:::-;1954:1807:231;11717:9:228;;11620:47;1954:1807:231;;;11644:23:228;;;11620:47;;974:8:208;1954:1807:231;;;;;;;;;974:8:208;;1954:1807:231;974:8:208;;;;;;;1954:1807:231;;;;;;;;;;;;;;713:6:351;1954:1807:231;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41;;:::i;:::-;5148:19:42;1954:1807:231;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1954:1807:231;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;1880:140:41;;1954:1807:231;1880:140:41;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1954:1807:231;;;;1973:36:41;;;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1954:1807:231;;;3478:41;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1954:1807:231;3852:94:192;;1954:1807:231;3972:10:192;;;;;;1954:1807:231;3984:3:192;1954:1807:231;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1954:1807:231;;;;4058:76:192;;4108:25;1954:1807:231;4058:76:192;;1954:1807:231;4058:76:192;;;;;;;;;;;;1954:1807:231;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1954:1807:231;4239:12:192;;;;;;:::i;:::-;1954:1807:231;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1954:1807:231;4239:70:192;;;;;;;1954:1807:231;;;;;;;4239:70:192;;;;;1954:1807:231;4239:70:192;;4277:4;1954:1807:231;4239:70:192;;1954:1807:231;;4058:76:192;1954:1807:231;;;;;;;4239:70:192;;;;;;;1954:1807:231;4239:70:192;;;3984:3;;1954:1807:231;3961:9:192;;4239:70;1954:1807:231;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1954:1807:231;4161:50:192;1954:1807:231;;4058:76:192;1954:1807:231;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;1954:1807:231;;3478:41;;;:::i;:::-;1954:1807;;;14276:18:228;;;;14272:64;;1954:1807:231;14401:42:228;14346:19;1954:1807:231;-1:-1:-1;1954:1807:231;14346:11:228;1954:1807:231;;;-1:-1:-1;1954:1807:231;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;;;;;;;;;;;;;14401:42:228;1954:1807:231;14272:64:228;14303:33;;1954:1807:231;14303:33:228;1954:1807:231;;;;14303:33:228;2071:115:211;2931:8:352;668:81;1954:1807:231;2931:8:352;:::i;:::-;2071:115:211;;1954:1807:231;;;;;;;;;;;;;2991:23:341;1954:1807:231;;;;;;;;;;;;;;;;;;;;;2688:13:341;1954:1807:231;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1954:1807:231;-1:-1:-1;1954:1807:231;;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3478:41;;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;2976:19:351;1954:1807:231;;;;;1732:22:351;1728:93;;1954:1807:231;;583:77:341;;;;;;;1954:1807:231;;;1728:93:351;1777:33;1954:1807:231;1777:33:351;1954:1807:231;;1777:33:351;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3478:41;;:::i;:::-;1954:1807;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;3741:25:41;3737:66;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1954:1807:231;;;;2455:33:41;1954:1807:231;3737:66:41;1954:1807:231;3775:28:41;;;1954:1807:231;3775:28:41;1954:1807:231;;;;;;;3775:28:41;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;1954:1807:231;3478:41;;;:::i;:::-;13454:23:228;;;;13450:62;;13527:30;;;;;:::i;:::-;13526:31;13522:76;;1954:1807:231;13625:10:228;;;;;;1954:1807:231;;;13720:52:228;;1954:1807:231;;;;;;;;;;;;;;13720:52:228;;;:::i;:::-;;;;1954:1807:231;13637:3:228;13676:6;13684:9;13676:6;1954:1807:231;13676:6:228;;;;:::i;:::-;1954:1807:231;13684:9:228;;;;;:::i;:::-;1954:1807:231;13684:9:228;;;;:::i;:::-;1954:1807:231;13614:9:228;;13522:76;1954:1807:231;13566:32:228;;;;1954:1807:231;13566:32:228;1954:1807:231;;;;;;;;13566:32:228;1954:1807:231;;;;;;;:::i;:::-;5148:19:42;;;;1954:1807:231;;;3478:41;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1954:1807:231;2776:90:192;;1954:1807:231;2892:10:192;;;;;;1954:1807:231;2904:3:192;2923:9;;;;;:::i;:::-;1954:1807:231;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1954:1807:231;;;1328:43:8;;;;;;1954:1807:231;;;;1328:43:8;;;1954:1807:231;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1954:1807:231;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1954:1807:231;;2881:9:192;;8938:146:8;9033:40;1954:1807:231;9033:40:8;1954:1807:231;;1328:43:8;1954:1807:231;9033:40:8;8942:68;1954:1807:231;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1954:1807:231;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;1954:1807:231;2991:23:341;1954:1807:231;;2464:10:209;:71;2460:115;;2591:9;1954:1807:231;;;;;;;2586:102:209;2602:19;;;;;;1954:1807:231;2623:3:209;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;1954:1807:231;2665:11:209;;;;;;:::i;:::-;1954:1807:231;;2647:30:209;1954:1807:231;;2647:30:209;;;;;:::i;:::-;;;;1954:1807:231;2591:9:209;;1954:1807:231;;;;;;;;;;2460:115:209;2544:31;1954:1807:231;2544:31:209;2464:10;1954:1807:231;;;;2544:31:209;1954:1807:231;;;;;;;;;;;;;;;3478:41;;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;2976:19:351;1954:1807:231;1281:36:351;713:6;1281:36;;1277:119;;1954:1807:231;;;;;;;;;;;;;;;1277:119:351;1340:45;1954:1807:231;1340:45:351;1954:1807:231;;;;1340:45:351;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;1954:1807:231;;;;;;:::i;:::-;;3478:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;1954:1807:231;1221:6:210;:::i;:::-;1954:1807:231;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;1954:1807:231;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;1954:1807:231;;16447:19:228;16129:20;;;16125:59;;1954:1807:231;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;1954:1807:231;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;1954:1807:231;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;1954:1807:231;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;1954:1807:231;;16250:9:228;;1954:1807:231;;;;;;;;;;;;;;;:::i;:::-;3478:41;;:::i;:::-;5148:19:42;1954:1807:231;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1954:1807:231;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;1254:25:41;1250:140;;1954:1807:231;1250:140:41;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1954:1807:231;;;;1343:36:41;1954:1807:231;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3478:41;;;;;:::i;:::-;3179:19:352;1954:1807:231;;;;;;;;2616:14:352;2612:76;;1954:1807:231;-1:-1:-1;;1954:1807:231;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;1954:1807:231;6801:10:228;;;;;;1954:1807:231;;;;;;;;;;;6904:44:228;1954:1807:231;6904:44:228;1954:1807:231;;;;;;;;;;;6904:44:228;;;;;;;;:::i;:::-;;;;376:58:354;6959:111:228;;1954:1807:231;6959:111:228;1954:1807:231;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;1954:1807:231;20263:81:228;;1954:1807:231;20263:81:228;;1954:1807:231;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;1954:1807:231;20263:81:228;;;;;;;;1954:1807:231;20263:81:228;1954:1807:231;20263:81:228;1954:1807:231;20263:81:228;;;6959:111;1954:1807:231;;20263:107:228;20259:181;;1954:1807:231;20259:181:228;1878:53;1954:1807:231;1878:53:228;1954:1807:231;;20391:49:228;;;;;;1954:1807:231;20391:49:228;;1954:1807:231;;;1878:53:228;;;1954:1807:231;1878:53:228;;;;:::i;:::-;;1954:1807:231;1878:53:228;;;;1954:1807:231;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;1954:1807:231;20263:81:228;1954:1807:231;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;1954:1807:231;6860:6:228;;;:::i;:::-;1954:1807:231;6868:9:228;;;:::i;:::-;1954:1807:231;6868:9:228;;;;;:::i;:::-;1954:1807:231;6790:9:228;;6698:76;1954:1807:231;6742:32:228;;;;1954:1807:231;6742:32:228;1954:1807:231;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1954:1807:231;;;;;;;;;;;;;;;941:19:75;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1954:1807:231;2499:377:351;;;2559:17;;1954:1807:231;;2499:377:351;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1954:1807:231;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1954:1807:231;2499:377:351;;2607:259;713:6;2794:57;1954:1807:231;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2991:23:341;1954:1807:231;;1716:10:209;:71;1712:115;;1842:22;;1954:1807:231;;;;;;;;1842:22:209;;;:::i;:::-;;;;1954:1807:231;;;;;;;;;;;;;;:::i;:::-;;;;;;3478:41;;:::i;:::-;12455:30:228;;;;;;:::i;:::-;12454:31;12450:76;;1954:1807:231;12560:5:228;;;;12581:51;12560:5;;1954:1807:231;12560:5:228;1954:1807:231;12560:5:228;;:::i;:::-;1954:1807:231;;;;;;;;;;;;12581:51:228;;1954:1807:231;12450:76:228;1954:1807:231;12494:32:228;;;;1954:1807:231;12494:32:228;1954:1807:231;;;;;;;;12494:32:228;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;3478:41;;;:::i;:::-;1954:1807;;;;;4503:26:42;;;4499:64;;3179:19:352;1954:1807:231;;;;583:77:341;;;;;;;1954:1807:231;;;;;;;;;;;;;;3364:23:341;1954:1807:231;;;;3364:64:341;;1306:4:209;1954:1807:231;3364:64:341;;;1954:1807:231;;;;;;;;;;-1:-1:-1;;1954:1807:231;;;;;;;;3364:64:341;;;;;;;1954:1807:231;3364:64:341;;;1954:1807:231;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3478:41;;:::i;:::-;1954:1807;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1954:1807:231;;;;;;1645:152:42;;1954:1807:231;-1:-1:-1;;1954:1807:231;;500:10:59;;1954:1807:231;;1124:1:42;1954:1807:231;;;;;;;;;500:10:59;1954:1807:231;;;;;;;;500:10:59;1954:1807:231;;;;;;;;500:10:59;1954:1807:231;;;;;;;;500:10:59;1954:1807:231;;;;;;;;500:10:59;1954:1807:231;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;1954:1807:231;;;;;;;;;;;;;;900:21:181;;;896:88;;1954:1807:231;1124:1:42;1954:1807:231;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;1954:1807:231;583:77:341;1954:1807:231;583:77:341;;;;;;;;1954:1807:231;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;1954:1807:231;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;1954:1807:231;583:77:341;;;;;;;;;;;1954:1807:231;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;1954:1807:231;2196:23:341;1954:1807:231;;583:77:341;;;;;;;1954:1807:231;;;;1124:1:42;900:21:181;;;896:88;;1954:1807:231;;;1124:1:42;1954:1807:231;;;583:77:341;;;;;;;1954:1807:231;;;896:88:181;930:54;1954:1807:231;930:54:181;1954:1807:231;;1124:1:42;1954:1807:231;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;1954:1807:231;;583:77:341;;;;1954:1807:231;;;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;1954:1807:231;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;1954:1807:231;;;583:77:341;;;;;;;;1954:1807:231;583:77:341;;;;;;;;;;;;;;;;;;;;;1954:1807:231;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;1954:1807:231;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;1954:1807:231;;;;;;;583:77:341;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1954:1807:231;1124:1:42;583:77:341;;;;;;;;;;;;;;;;1954:1807:231;;;;;;;;;583:77:341;;;;;;;;1954:1807:231;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;1954:1807:231;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;583:77:341;;;;;;;;1954:1807:231;1740:46:42;;;;1645:152;;;;1954:1807:231;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3478:41;;;1954:1807;3478:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;1954:1807:231;1669:6:210;:::i;:::-;1954:1807:231;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;1954:1807:231;;;;;9777:23:228;;9773:62;;1954:1807:231;9862:10:228;;;;;;1954:1807:231;;;;;;;;;9955:50:228;1954:1807:231;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;1954:1807:231;10016:117:228;1954:1807:231;;;;;;20263:81:228;;;;;1954:1807:231;20263:81:228;;1954:1807:231;20263:81:228;;1954:1807:231;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;1954:1807:231;9911:6:228;;;:::i;:::-;1954:1807:231;9919:9:228;;;;:::i;:::-;1954:1807:231;9919:9:228;;;;:::i;:::-;1954:1807:231;9851:9:228;;9671:55;9700:26;1954:1807:231;9700:26:228;1954:1807:231;;9700:26:228;1954:1807:231;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1954:1807:231;1793:19:59;1954:1807:231;635:65:55;:::i;1954:1807:231:-;;;;;;;;;;;;2650:44:211;1954:1807:231;;:::i;:::-;;;;;2650:44:211;:::i;:::-;1954:1807:231;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1954:1807:231;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1954:1807:231;1146:19:75;1954:1807:231;1146:53:75;;;1142:96;;1954:1807:231;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1954:1807:231;1215:12:75;:::o;1954:1807:231:-;;;;;;;;;;;;:::o;15240:220:228:-;;;1954:1807:231;;;15358:19:228;15354:61;;15375:1;1954:1807:231;;;;;15375:1:228;1954:1807:231;15432:21:228;1954:1807:231;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;;1954:1807:231;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1954:1807:231;500:10:59;;;;;1954:1807:231;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1954:1807:231:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1954:1807:231;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1954:1807:231;;;;;-1:-1:-1;1954:1807:231;;-1:-1:-1;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;1954:1807:231;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1954:1807:231;3775:28:41;;-1:-1:-1;3775:28:41;1954:1807:231;3775:28:41;1954:1807:231;;;;;-1:-1:-1;3775:28:41;1954:1807:231;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;1954:1807:231;;;8152:16:228;;;8148:55;;8236:5;;;;1954:1807:231;8236:5:228;;:::i;:::-;1954:1807:231;;;8166:1:228;1954:1807:231;8258:49:228;1954:1807:231;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;1954:1807:231;;;;;;19356:74:228;;;;;1954:1807:231;19356:74:228;;;;;1954:1807:231;8166:1:228;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;1954:1807:231;19356:74:228;1954:1807:231;19356:74:228;8166:1;19356:74;;;8318:110;1954:1807:231;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;1954:1807:231;19356:74:228;1954:1807:231;19356:74:228;;;;;;;:::i;:::-;;;;1954:1807:231;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1954:1807:231;1029:19:76;1954:1807:231;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1630:120::-;1676:74;1954:1807:231;;;;;;1676:74:76;;;;1954:1807:231;1676:74:76;;;;;;1954:1807:231;1327:10:76;1954:1807:231;;;;1744:4:76;1954:1807:231;;;;1676:74:76;;;;;;;1954:1807:231;1676:74:76;;;1630:120;;;;;1676:74;;;;1954:1807:231;1676:74:76;1954:1807:231;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;1954:1807:231;17966:1:228;1954:1807:231;;;;;17966:1:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;;;18123:21:228;;;;;18119:80;;1954:1807:231;;17966:1:228;1954:1807:231;;;;;17966:1:228;1954:1807:231;18217:18:228;1954:1807:231;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;17953:320:228;;;;;;18119:80;1954:1807:231;;18153:46:228;;;1954:1807:231;;;18153:46:228;;;1954:1807:231;;;;;;;;;;;;;;;;;;20391:49:228;1954:1807:231;;;;;;;;;;;;;;;;;;:::o;16846:185:228:-;1954:1807:231;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;1954:1807:231;;-1:-1:-1;1954:1807:231;16997:11:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;16997:27:228;1954:1807:231;-1:-1:-1;1954:1807:231;;;500:10:59;1954:1807:231;-1:-1:-1;1954:1807:231;500:10:59;;16975:49:228;;;;;18285:429;;;18386:10;18382:326;;18285:429;;;;:::o;18382:326::-;1954:1807:231;18395:1:228;1954:1807:231;;;;;18395:1:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;;;18550:21:228;;;;;18546:86;;1954:1807:231;;18395:1:228;1954:1807:231;;;;;18395:1:228;1954:1807:231;18650:20:228;1954:1807:231;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;18382:326:228;;;;;;18546:86;1954:1807:231;;18580:52:228;;;1954:1807:231;;;18580:52:228;;;1954:1807:231;;;;;;;;;;;;;;;;;;20391:49:228;3271:479:352;1954:1807:231;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1954:1807:231;;;3613:51:352;1954:1807:231;;3613:51:352;;;;1954:1807:231;3613:51:352;;3648:4;3613:51;;;1954:1807:231;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1954:1807:231;;-1:-1:-1;3691:28:352;3613:51;;;;1954:1807:231;3613:51:352;1954:1807:231;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;17037:815:228;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;1954:1807:231;17163:1:228;1954:1807:231;;;;;17163:1:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;;;17330:29:228;;;;;17326:98;;1954:1807:231;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;1954:1807:231;17163:1:228;1954:1807:231;;;;;17163:1:228;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;-1:-1:-1;1954:1807:231;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;1954:1807:231;;17640:48:228;;;1954:1807:231;;;17640:48:228;;;1954:1807:231;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;1954:1807:231;;17368:56:228;;;1954:1807:231;;;;;17368:56:228;;;1954:1807:231;;;;;;;;;;;;;;;;;;;20391:49:228"},"gasEstimates":{"creation":{"codeDepositCost":"3484600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"782","ROYALTY_FEE_DENOMINATOR()":"826","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchBurnFrom(address,uint256[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","burnFrom(address,uint256,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3245","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2715","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2738","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2458","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchBurnFrom(address,uint256[],uint256[])":"80534934","batchSetTokenURI(uint256[],string[])":"6706467b","burnFrom(address,uint256,uint256)":"124d91e5","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchBurnFrom(address,uint256[],uint256[])\":{\"details\":\"Reverts if `ids` and `values` have different lengths.Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance for any of `ids`.Emits an {IERC1155-TransferBatch} event.\",\"params\":{\"from\":\"Address of the current tokens owner.\",\"ids\":\"Identifiers of the tokens to burn.\",\"values\":\"Amounts of tokens to burn.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"burnFrom(address,uint256,uint256)\":{\"details\":\"Reverts if the sender is not `from` and has not been approved by `from`.Reverts if `from` has an insufficient balance of `id`.Emits an {IERC1155-TransferSingle} event.\",\"params\":{\"from\":\"Address of the current token owner.\",\"id\":\"Identifier of the token to burn.\",\"value\":\"Amount of token to burn.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchBurnFrom(address,uint256[],uint256[])\":{\"notice\":\"Burns multiple tokens.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"burnFrom(address,uint256,uint256)\":{\"notice\":\"Burns some token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol\":\"ERC1155FullBurnProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155BurnableBase is IERC1155Burnable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function burnFrom(address from, uint256 id, uint256 value) external virtual {\\n        ERC1155Storage.layout().burnFrom(_msgSender(), from, id, value);\\n    }\\n\\n    /// @inheritdoc IERC1155Burnable\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external virtual {\\n        ERC1155Storage.layout().batchBurnFrom(_msgSender(), from, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0xab04b3ca3dee7952258f687812c4d8b8546df0689b072a562cb4104642cbf8ac\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/proxied/ERC1155FullBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../libraries/ERC1155Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../../base/ERC1155MetadataBase.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../../base/ERC1155MintableBase.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../../base/ERC1155DeliverableBase.sol\\\";\\nimport {ERC1155BurnableBase} from \\\"./../../base/ERC1155BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullBurnProxied is\\n    ERC1155WithOperatorFiltererBase,\\n    ERC1155MetadataBase,\\n    ERC1155MintableBase,\\n    ERC1155DeliverableBase,\\n    ERC1155BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC1155Storage.init();\\n        ERC1155Storage.initERC1155MetadataURI();\\n        ERC1155Storage.initERC1155Mintable();\\n        ERC1155Storage.initERC1155Deliverable();\\n        ERC1155Storage.initERC1155Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x558d874299a6ed7827690ec53ebb60ab3054095ab07efd08eebe1b7f7c7dd60e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchBurnFrom(address,uint256[],uint256[])":{"notice":"Burns multiple tokens."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"burnFrom(address,uint256,uint256)":{"notice":"Burns some token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol":{"ERC1155FullProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1155BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155BalanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC1155MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC1155NonApproved","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"ERC1155SafeBatchTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC1155SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC1155SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC1155TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotMetadataResolver","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","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":"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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","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":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"value","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","recipient":"The recipient.","value":"The amount of tokens to transfer."}}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"params":{"balance":"The current balance.","id":"The token identifier.","owner":"The owner.","value":"The amount of tokens to transfer."}}],"ERC1155NonApproved(address,address)":[{"params":{"owner":"The owner.","sender":"The sender."}}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"params":{"ids":"The token identifiers.","recipient":"The recipient contract.","values":"The amounts of tokens to transfer."}}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"params":{"id":"The token identifier.","recipient":"The recipient contract.","value":"The amount of tokens to transfer."}}],"ERC1155SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotMetadataResolver(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"TransferBatch(address,address,address,uint256[],uint256[])":{"params":{"from":"The previous tokens owner.","ids":"The transferred tokens identifiers.","operator":"The initiator of the transfer.","to":"The new tokens owner.","values":"The amounts of tokens."}},"TransferSingle(address,address,address,uint256,uint256)":{"params":{"from":"The previous token owner.","id":"The transferred token identifier.","operator":"The initiator of the transfer.","to":"The new token owner.","value":"The amount of token."}},"URI(string,uint256)":{"params":{"id":"The token identifier.","value":"The token metadata URI."}}},"kind":"dev","methods":{"balanceOf(address,uint256)":{"params":{"id":"The identifier to retrieve the balance of.","owner":"The account to retrieve the balance of."},"returns":{"balance":"The balance of `id` owned by account `owner`."}},"balanceOfBatch(address[],uint256[])":{"details":"Reverts if `owners` and `ids` have different lengths.","params":{"ids":"The identifiers to retrieve the balance of.","owners":"The addresses of the token holders"},"returns":{"balances":"The balances of `ids` owned by accounts `owners`."}},"batchSetTokenURI(uint256[],string[])":{"details":"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.","params":{"tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"Address of the operator.","owner":"Address of the authorisation giver."},"returns":{"approvedForAll":"True if the operator is approved, false if not."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeBatchMint(address,uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","to":"Address of the new tokens owner.","values":"Amounts of tokens to mint."}},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current tokens owner.","ids":"Identifiers of the tokens to transfer.","to":"Address of the new tokens owner.","values":"Amounts of tokens to transfer."}},"safeDeliver(address[],uint256[],uint256[],bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","ids":"Identifiers of the tokens to mint.","recipients":"Addresses of the new tokens owners.","values":"Amounts of tokens to mint."}},"safeMint(address,uint256,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to send along to a receiver contract.","id":"Identifier of the token to mint.","to":"Address of the new token owner.","value":"Amount of token to mint."}},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"Current token owner.","id":"Identifier of the token to transfer.","to":"Address of the new token owner.","value":"Amount of token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.","params":{"approved":"True to approve the operator, false to revoke its approval.","operator":"Address of the operator."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"setTokenURI(uint256,string)":{"details":"Reverts if the caller is not the metadata resolver.Emits a {URI} event.","params":{"tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"uri(uint256)":{"details":"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \"ERC1155 Metadata URI JSON Schema\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.","returns":{"metadataURI":"The URI associated to the token."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f6140c938819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b038116810360745760805260405161403990816100908239608051818181612131015281816135410152613abf0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461312257806301ffc9a71461309b57806306fdde03146130405780630d6a5bbb14612dde5780630e07f8541461254d5780630e89341c146123f6578063114ba8ee1461230f578063162094c4146122485780632a55205a146121555780632b4c9f16146120e65780632eb2c2d614611ca75780632f2ff15d14611b1b5780634e1273f414611a3d578063572b6c05146119f25780635cfa92971461192857806361ba27da1461180c5780636706467b146116a457806373c8a958146114f45780638bb9c5bf146113855780638da5cb5b146113145780638dc251e3146111e757806391d148541461114f57806395d89b41146110dc578063a0c76f621461106b578063a22cb46514610f0b578063b0ccc31e14610e9a578063c3666c3614610c5d578063d539139314610c04578063d547741f14610a7b578063e1a8bf2c14610a3f578063e8ab9ccc14610833578063e985e9c51461077f578063f242432a1461044d578063f2fde38b146103595763f7ba94bd1461019c57600080fd5b346102fd576101aa3661329b565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101eb613aa8565b925416911690810361032c57508181036103025760005b81811061020b57005b610216818387613589565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102fd57610240828587613589565b35908147106102cb57600080809381935af13d156102c3573d9061026382613473565b9161027160405193846133ce565b82523d6000602084013e5b1561028a5750600101610202565b80511561029957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061027c565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610390613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103ba613aa8565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361032c575073ffffffffffffffffffffffffffffffffffffffff16918282036103fe57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610484613190565b61048c6131b3565b604435906064359260843567ffffffffffffffff81116102fd576104b490369060040161326d565b926104bd613aa8565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361076f575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561074557610560828783613dbc565b156106fb5773ffffffffffffffffffffffffffffffffffffffff916105898a8a878a8796613e3c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105c657005b6020926105d49136916134ad565b9261062a60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906131f9565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106c0575b50160361068d57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106e2915060203d6020116106e8575b6106da81836133ce565b810190613c99565b86610684565b503d6106d0565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61077891613cd1565b8785610514565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576107b6613190565b73ffffffffffffffffffffffffffffffffffffffff6107d36131b3565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd5761088290369060040161323c565b60243567ffffffffffffffff81116102fd576108a290369060040161323c565b929060443567ffffffffffffffff81116102fd576108c490369060040161323c565b93909160643567ffffffffffffffff81116102fd576108e790369060040161326d565b9390916108f2613aa8565b9761091d897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612946109488161340f565b97610956604051998a6133ce565b818952602089019160051b8101903682116102fd57915b818310610a12575050509161098b6109939261099b95943691613427565b973691613427565b9336916134ad565b9183519480518614801590610a07575b6103025760005b8681106109bb57005b80610a018673ffffffffffffffffffffffffffffffffffffffff6109e16001958b613873565b51166109ed8487613873565b516109f88589613873565b51918d8a613927565b016109b2565b5081518614156109ab565b823573ffffffffffffffffffffffffffffffffffffffff811681036102fd5781526020928301920161096d565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020604051620186a08152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435610ab56131b3565b610abd613aa8565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102fd57610c6b3661333f565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cb0613aa8565b925416911690810361032c5750808214801590610e90575b6103025760005b828110610cd857005b73ffffffffffffffffffffffffffffffffffffffff610d00610cfb83858a613589565b613906565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106ef57600091610e62575b5015610e35575073ffffffffffffffffffffffffffffffffffffffff610d8f610cfb83858a613589565b1690610d9f610cfb828689613589565b91610dab82878b613589565b3592813b156102fd57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106ef57600192610e24575b5001610ccf565b6000610e2f916133ce565b88610e1d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e83915060203d8111610e89575b610e7b81836133ce565b810190613a90565b89610d65565b503d610e71565b5082821415610cc8565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610f42613190565b60243590811515918281036102fd5761103c575b73ffffffffffffffffffffffffffffffffffffffff80610f74613aa8565b1691169181831461100e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611066817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cd1565b610f56565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56136ef565b6040519182916020835260208301906131f9565b0390f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576111866131b3565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761121e613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061125d613aa8565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112ea5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113e0613aa8565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114ac5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bff565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102fd576115023661333f565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611545613aa8565b925416911690810361032c575080841480159061169a575b6103025760005b84811061156d57005b611578818388613589565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102fd5760006020916115ab610cfb868b8e613589565b826116156116416115bd898d8d613589565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826133ce565b51925af1156106ef576000513d6116915750803b155b6116645750600101611564565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611657565b508284141561155d565b346102fd576116b23661329b565b8083949293036103025773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117de57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172e57005b848110156117af578060051b820135838112156102fd5782019081359167ffffffffffffffff83116102fd5760200182360381136102fd577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611795848b8a613589565b35926117a6604051928392836134e4565b0390a201611725565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061187d613aa8565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a081116118fb57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761195f613190565b6064359067ffffffffffffffff82116102fd576119836119f092369060040161326d565b6119e261198e613aa8565b926119b9847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129236916134ad565b926044359260243592613927565b005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020611a33611a2e613190565b61352a565b6040519015158152f35b346102fd57611a4b3661329b565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030257611a818561340f565b94611a8f60405196876133ce565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611abc8261340f565b0136602088013760005b818110611ae3576040516020808252819061114b9082018a61330b565b80611b0a611af7610cfb600194868b613589565b611b02838789613589565b359088613599565b611b14828a613873565b5201611ac6565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435611b556131b3565b611b5d613aa8565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c1057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bff565b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611cde613190565b611ce66131b3565b60443567ffffffffffffffff81116102fd57611d0690369060040161323c565b929060643567ffffffffffffffff81116102fd57611d2890369060040161323c565b9360843567ffffffffffffffff81116102fd57611d4990369060040161326d565b939091611d54613aa8565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036120d6575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561074557898b0361030257611dfe828483613dbc565b1561208c5760005b8b811061205d575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611e8260405192839260408452611e748d60408601908d6138c9565b9184830360208601526138c9565b0390a43b611e8c57005b602094611ea1611ea992611eb1953691613427565b993691613427565b9536916134ad565b92611f6160405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f31611f0160a485018b61330b565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8582030160648601528861330b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526131f9565b03816000875af19081156106ef577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161203e575b501603611fc457005b61203a9061200a6040519485947fc287817e000000000000000000000000000000000000000000000000000000008652600486015260606024860152606485019061330b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301604485015261330b565b0390fd5b612057915060203d6020116106e8576106da81836133ce565b86611fbb565b806120868c61207c8f94612074816001978d613589565b35928d613589565b3590888887613e3c565b01611e06565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6120df91613cd1565b8987611dab565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612240575b1561220a57505061114b60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114b91620186a082101561222d5761222790620186a092613887565b046121da565b620186a061223b9204613887565b6121da565b5081156121cd565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760243567ffffffffffffffff81116102fd5761229790369060040161326d565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117de5761230a7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160043595836134e4565b0390a2005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57612346613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612385613aa8565b925416911690810361032c575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106ef576000916124c5575b6040516020808252819061114b908201856131f9565b3d8083833e6124d481836133ce565b8101906020818303126125455780519067ffffffffffffffff8211612549570181601f820112156125455780519261250b84613473565b9261251960405194856133ce565b84845260208584010111612542575061114b9261253c91602080850191016131d6565b906124af565b80fd5b8280fd5b8380fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd5761259c90369060040161326d565b60243567ffffffffffffffff81116102fd576125bc90369060040161326d565b6044939193359173ffffffffffffffffffffffffffffffffffffffff831683036102fd576064359373ffffffffffffffffffffffffffffffffffffffff851685036102fd577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61262a613aa8565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612a9d575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612d89575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612a9d575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612c5a578190612889845461369c565b601f8111612d36575b50600090601f8311600114612c9457600092612c89575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612c5a576129147f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a55461369c565b601f8111612bd6575b506000601f8211600114612ada5781929394600092612acf575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612a9d575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612937565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612bbe575083600195969710612b86575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612989565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612b59565b90926020600181928686013581550194019101612b45565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612c50575b601f0160051c01905b818110612c44575061291d565b60008155600101612c37565b9091508190612c2e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806128a9565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612d1e5750908460019594939210612ce6575b505050811b0190556128db565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612cd9565b91936020600181928787013581550195019201612cc3565b909150836000526020600020601f840160051c81019160208510612d7f575b90601f859493920160051c01905b818110612d705750612892565b60008155849350600101612d63565b9091508190612d55565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612697565b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57612e15613190565b60243567ffffffffffffffff81116102fd57612e3590369060040161323c565b909160443567ffffffffffffffff81116102fd57612e5790369060040161323c565b93909160643567ffffffffffffffff81116102fd57612eeb93612e81612ef392369060040161326d565b959091612ee3612e8f613aa8565b96612eba887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691613427565b983691613427565b9436916134ad565b9173ffffffffffffffffffffffffffffffffffffffff821694851561301657865190855182036103025760005b828110612fec5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612f8d612f7f8d604084019061330b565b82810360208401528b61330b565b0390a43b612f9757005b611f619160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f31611f0160a485018b61330b565b80613010612ffc6001938c613873565b51613007838b613873565b51908886613bbc565b01612f20565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46136ef565b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd57611a336020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613612565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602061318861315e613190565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612613599565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b60005b8381106131e95750506000910152565b81810151838201526020016131d9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613235815180928187528780880191016131d6565b0116010190565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd576020808501948460051b0101116102fd57565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd57602083818601950101116102fd57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd57816132e49160040161323c565b929092916024359067ffffffffffffffff82116102fd576133079160040161323c565b9091565b906020808351928381520192019060005b8181106133295750505090565b825184526020938401939092019160010161331c565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd57816133889160040161323c565b9290929160243567ffffffffffffffff81116102fd57816133ab9160040161323c565b929092916044359067ffffffffffffffff82116102fd576133079160040161323c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c5a57604052565b67ffffffffffffffff8111612c5a5760051b60200190565b9291906134338161340f565b9361344160405195866133ce565b602085838152019160051b81019283116102fd57905b82821061346357505050565b8135815260209182019101613457565b67ffffffffffffffff8111612c5a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926134b982613473565b916134c760405193846133ce565b8294818452818301116102fd578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135825773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117af5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156135e85760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613582577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136955760005260205260ff6040600020541690565b5050600190565b90600182811c921680156136e5575b60208310146136b657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916136ab565b90604051918260008254926137038461369c565b8084529360018116908115613771575060011461372a575b50613728925003836133ce565b565b90506000929192526020600020906000915b818310613755575050906020613728928201013861371b565b602091935080600191548385890101520191019091849261373c565b602093506137289592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861371b565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561380b5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117af5760209160051b010190565b8181029291811591840414171561389a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102fd5760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102fd5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156130165761396c87878573ffffffffffffffffffffffffffffffffffffffff95613bbc565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b6139ae575b5050505050565b613a099160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906131f9565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613a71575b50160361068d5780806139a7565b613a8a915060203d6020116106e8576106da81836133ce565b38613a63565b908160209103126102fd575180151581036102fd5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613bad573233148015613bb2575b613bad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b33575b50613b3057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ef57600091613b8e575b5038613b26565b613ba7915060203d602011610e8957610e7b81836133ce565b38613b87565b503390565b5060183610613aef565b909183613bca575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613c4057505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613bc4565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102fd57517fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd5790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613db2575b613cfa575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106ef57600091613d93575b5015613d665750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613dac915060203d602011610e8957610e7b81836133ce565b38613d5d565b50813b1515613cf2565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613de7575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613de1565b91929084613e4b575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613fa7575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613ec3575b506139a7565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613f4957505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613ebd565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea26469706673582212209c835528a9aeb8fcacc8f683dbbda3d2b31ab53240330f833b291a6c9eeaa09664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x40C9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4039 SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2131 ADD MSTORE DUP2 DUP2 PUSH2 0x3541 ADD MSTORE PUSH2 0x3ABF ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x3122 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x309B JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3040 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2DDE JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x254D JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x23F6 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x230F JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x2248 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2155 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x20E6 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1CA7 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B1B JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A3D JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19F2 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1928 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x180C JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16A4 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14F4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1385 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1314 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11E7 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x114F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10DC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x106B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF0B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE9A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC5D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC04 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA7B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA3F JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x833 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x44D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x359 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1AA CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EB PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP2 DUP2 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x20B JUMPI STOP JUMPDEST PUSH2 0x216 DUP2 DUP4 DUP8 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x240 DUP3 DUP6 DUP8 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2C3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x263 DUP3 PUSH2 0x3473 JUMP JUMPDEST SWAP2 PUSH2 0x271 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x33CE JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x28A JUMPI POP PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x299 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x27C JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x390 PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3BA PUSH2 0x3AA8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3FE JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x484 PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x48C PUSH2 0x31B3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x4B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP3 PUSH2 0x4BD PUSH2 0x3AA8 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x76F JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x745 JUMPI PUSH2 0x560 DUP3 DUP8 DUP4 PUSH2 0x3DBC JUMP JUMPDEST ISZERO PUSH2 0x6FB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x589 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3E3C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5C6 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5D4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH2 0x62A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6C0 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI JUMPDEST PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3C99 JUMP JUMPDEST DUP7 PUSH2 0x684 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x778 SWAP2 PUSH2 0x3CD1 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x514 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x7B6 PUSH2 0x3190 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D3 PUSH2 0x31B3 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x882 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8A2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8E7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8F2 PUSH2 0x3AA8 JUMP JUMPDEST SWAP8 PUSH2 0x91D DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x948 DUP2 PUSH2 0x340F JUMP JUMPDEST SWAP8 PUSH2 0x956 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x33CE JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA12 JUMPI POP POP POP SWAP2 PUSH2 0x98B PUSH2 0x993 SWAP3 PUSH2 0x99B SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA07 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9BB JUMPI STOP JUMPDEST DUP1 PUSH2 0xA01 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E1 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3873 JUMP JUMPDEST MLOAD AND PUSH2 0x9ED DUP5 DUP8 PUSH2 0x3873 JUMP JUMPDEST MLOAD PUSH2 0x9F8 DUP6 DUP10 PUSH2 0x3873 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3927 JUMP JUMPDEST ADD PUSH2 0x9B2 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9AB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAB5 PUSH2 0x31B3 JUMP JUMPDEST PUSH2 0xABD PUSH2 0x3AA8 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB6F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0xC6B CALLDATASIZE PUSH2 0x333F JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCB0 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE90 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCD8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD00 PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x3589 JUMP JUMPDEST PUSH2 0x3906 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE62 JUMPI JUMPDEST POP ISZERO PUSH2 0xE35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD8F PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x3589 JUMP JUMPDEST AND SWAP1 PUSH2 0xD9F PUSH2 0xCFB DUP3 DUP7 DUP10 PUSH2 0x3589 JUMP JUMPDEST SWAP2 PUSH2 0xDAB DUP3 DUP8 DUP12 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2FD JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE24 JUMPI JUMPDEST POP ADD PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE2F SWAP2 PUSH2 0x33CE JUMP JUMPDEST DUP9 PUSH2 0xE1D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE83 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE89 JUMPI JUMPDEST PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3A90 JUMP JUMPDEST DUP10 PUSH2 0xD65 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE71 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCC8 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0xF42 PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x103C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF74 PUSH2 0x3AA8 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x100E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1066 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CD1 JUMP JUMPDEST PUSH2 0xF56 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1186 PUSH2 0x31B3 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x121E PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x125D PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12EA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13E0 PUSH2 0x3AA8 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14AC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1502 CALLDATASIZE PUSH2 0x333F JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1545 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x169A JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x156D JUMPI STOP JUMPDEST PUSH2 0x1578 DUP2 DUP4 DUP9 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15AB PUSH2 0xCFB DUP7 DUP12 DUP15 PUSH2 0x3589 JUMP JUMPDEST DUP3 PUSH2 0x1615 PUSH2 0x1641 PUSH2 0x15BD DUP10 DUP14 DUP14 PUSH2 0x3589 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x33CE JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1691 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1664 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1564 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1657 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x155D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x16B2 CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x302 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17DE JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x172E JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17AF JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2FD JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x2FD JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1795 DUP5 DUP12 DUP11 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17A6 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x34E4 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1725 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x187D PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x18FB JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x195F PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x1983 PUSH2 0x19F0 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH2 0x19E2 PUSH2 0x198E PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 PUSH2 0x19B9 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3927 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x1A33 PUSH2 0x1A2E PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x352A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1A4B CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x302 JUMPI PUSH2 0x1A81 DUP6 PUSH2 0x340F JUMP JUMPDEST SWAP5 PUSH2 0x1A8F PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x33CE JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1ABC DUP3 PUSH2 0x340F JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AE3 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP11 PUSH2 0x330B JUMP JUMPDEST DUP1 PUSH2 0x1B0A PUSH2 0x1AF7 PUSH2 0xCFB PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x3589 JUMP JUMPDEST PUSH2 0x1B02 DUP4 DUP8 DUP10 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x3599 JUMP JUMPDEST PUSH2 0x1B14 DUP3 DUP11 PUSH2 0x3873 JUMP JUMPDEST MSTORE ADD PUSH2 0x1AC6 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1B55 PUSH2 0x31B3 JUMP JUMPDEST PUSH2 0x1B5D PUSH2 0x3AA8 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C10 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1CDE PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x1CE6 PUSH2 0x31B3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D06 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D28 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D49 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1D54 PUSH2 0x3AA8 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20D6 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x745 JUMPI DUP10 DUP12 SUB PUSH2 0x302 JUMPI PUSH2 0x1DFE DUP3 DUP5 DUP4 PUSH2 0x3DBC JUMP JUMPDEST ISZERO PUSH2 0x208C JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x205D JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1E82 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1E74 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x38C9 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x38C9 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1E8C JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1EA1 PUSH2 0x1EA9 SWAP3 PUSH2 0x1EB1 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH2 0x1F61 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F31 PUSH2 0x1F01 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x330B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x330B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x203E JUMPI JUMPDEST POP AND SUB PUSH2 0x1FC4 JUMPI STOP JUMPDEST PUSH2 0x203A SWAP1 PUSH2 0x200A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x330B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x330B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2057 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP7 PUSH2 0x1FBB JUMP JUMPDEST DUP1 PUSH2 0x2086 DUP13 PUSH2 0x207C DUP16 SWAP5 PUSH2 0x2074 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3E3C JUMP JUMPDEST ADD PUSH2 0x1E06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x20DF SWAP2 PUSH2 0x3CD1 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1DAB JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2240 JUMPI JUMPDEST ISZERO PUSH2 0x220A JUMPI POP POP PUSH2 0x114B PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x114B SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x222D JUMPI PUSH2 0x2227 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3887 JUMP JUMPDEST DIV PUSH2 0x21DA JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x223B SWAP3 DIV PUSH2 0x3887 JUMP JUMPDEST PUSH2 0x21DA JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x21CD JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2297 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17DE JUMPI PUSH2 0x230A PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x34E4 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x2346 PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2385 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24C5 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP6 PUSH2 0x31F9 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x24D4 DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2545 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2549 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2545 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x250B DUP5 PUSH2 0x3473 JUMP JUMPDEST SWAP3 PUSH2 0x2519 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x33CE JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2542 JUMPI POP PUSH2 0x114B SWAP3 PUSH2 0x253C SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x31D6 JUMP JUMPDEST SWAP1 PUSH2 0x24AF JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x259C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x25BC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x2FD JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x2FD JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x262A PUSH2 0x3AA8 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2D89 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C5A JUMPI DUP2 SWAP1 PUSH2 0x2889 DUP5 SLOAD PUSH2 0x369C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2D36 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2C94 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2C89 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH2 0x2914 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x369C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2BD6 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2ADA JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2ACF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2937 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2BBE JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2B86 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2989 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2B59 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2B45 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2C50 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2C44 JUMPI POP PUSH2 0x291D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2C37 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2C2E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x28A9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D1E JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2CE6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x28DB JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2CD9 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2CC3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2D7F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D70 JUMPI POP PUSH2 0x2892 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2D63 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2D55 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2697 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x2E15 PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2E35 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2E57 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2EEB SWAP4 PUSH2 0x2E81 PUSH2 0x2EF3 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2EE3 PUSH2 0x2E8F PUSH2 0x3AA8 JUMP JUMPDEST SWAP7 PUSH2 0x2EBA DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3016 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2FEC JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2F8D PUSH2 0x2F7F DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x330B JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x330B JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2F97 JUMPI STOP JUMPDEST PUSH2 0x1F61 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F31 PUSH2 0x1F01 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x330B JUMP JUMPDEST DUP1 PUSH2 0x3010 PUSH2 0x2FFC PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3873 JUMP JUMPDEST MLOAD PUSH2 0x3007 DUP4 DUP12 PUSH2 0x3873 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3BBC JUMP JUMPDEST ADD PUSH2 0x2F20 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x36EF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x1A33 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3612 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x3188 PUSH2 0x315E PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x3599 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x31E9 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x31D9 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3235 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x31D6 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x32E4 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x3307 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3329 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x331C JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x3388 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x33AB SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x3307 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C5A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3433 DUP2 PUSH2 0x340F JUMP JUMPDEST SWAP4 PUSH2 0x3441 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x33CE JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2FD JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3463 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3457 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x34B9 DUP3 PUSH2 0x3473 JUMP JUMPDEST SWAP2 PUSH2 0x34C7 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x33CE JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2FD JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3582 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17AF JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x35E8 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3582 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3695 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x36E5 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x36B6 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x36AB JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3703 DUP5 PUSH2 0x369C JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3771 JUMPI POP PUSH1 0x1 EQ PUSH2 0x372A JUMPI JUMPDEST POP PUSH2 0x3728 SWAP3 POP SUB DUP4 PUSH2 0x33CE JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3755 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3728 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x371B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x373C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3728 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x371B JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x380B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17AF JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x389A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3016 JUMPI PUSH2 0x396C DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3BBC JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x39AE JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3A09 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3A71 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI DUP1 DUP1 PUSH2 0x39A7 JUMP JUMPDEST PUSH2 0x3A8A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3A63 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3BAD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3BB2 JUMPI JUMPDEST PUSH2 0x3BAD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B33 JUMPI JUMPDEST POP PUSH2 0x3B30 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3B8E JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B26 JUMP JUMPDEST PUSH2 0x3BA7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3B87 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3AEF JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3BCA JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3C40 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3BC4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3DB2 JUMPI JUMPDEST PUSH2 0x3CFA JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D93 JUMPI JUMPDEST POP ISZERO PUSH2 0x3D66 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3DAC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3D5D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3CF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3DE7 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3DE1 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3E4B JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3FA7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3EC3 JUMPI JUMPDEST POP PUSH2 0x39A7 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3F49 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3EBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 DUP4 SSTORE 0x28 0xA9 0xAE 0xB8 0xFC 0xAC 0xC8 0xF6 DUP4 0xDB 0xBD LOG3 0xD2 0xB3 BYTE 0xB5 ORIGIN BLOCKHASH CALLER 0xF DUP4 EXTCODESIZE 0x29 BYTE PUSH13 0x9EEAA09664736F6C634300081E STOP CALLER ","sourceMap":"1880:1732:232:-:0;;;;;;;;;;;;;-1:-1:-1;;1880:1732:232;;;;-1:-1:-1;;;;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1880:1732:232;;;;;;745:39:76;;1880:1732:232;;;;;;;;745:39:76;1880:1732:232;;;;;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;;;;-1:-1:-1;1880:1732:232;;;;;-1:-1:-1;1880:1732:232"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12688,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13119,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12955,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12860,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13351,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13485,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":14992,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes4_fromMemory":{"entryPoint":15513,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":12909,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12723,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_address_uint256_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_array_uint256_dyn":{"entryPoint":13067,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_array_uint256_dyn_calldata":{"entryPoint":14537,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":12793,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":13540,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13327,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13427,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_uint256_dyn_calldata":{"entryPoint":13705,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14471,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14063,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":12758,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":13980,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":13262,"id":null,"parameterSlots":2,"returnSlots":0},"fun_balanceOf":{"entryPoint":13721,"id":25099,"parameterSlots":3,"returnSlots":1},"fun_checkFilterOperator":{"entryPoint":15569,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14257,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isOperatable":{"entryPoint":15804,"id":25201,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13610,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintToken":{"entryPoint":15292,"id":25354,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":15016,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_safeMint":{"entryPoint":14631,"id":24728,"parameterSlots":6,"returnSlots":0},"fun_supportsInterface":{"entryPoint":13842,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferToken":{"entryPoint":15932,"id":25299,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14451,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":14598,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8497},{"length":32,"start":13633},{"length":32,"start":15039}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8062fdd58e1461312257806301ffc9a71461309b57806306fdde03146130405780630d6a5bbb14612dde5780630e07f8541461254d5780630e89341c146123f6578063114ba8ee1461230f578063162094c4146122485780632a55205a146121555780632b4c9f16146120e65780632eb2c2d614611ca75780632f2ff15d14611b1b5780634e1273f414611a3d578063572b6c05146119f25780635cfa92971461192857806361ba27da1461180c5780636706467b146116a457806373c8a958146114f45780638bb9c5bf146113855780638da5cb5b146113145780638dc251e3146111e757806391d148541461114f57806395d89b41146110dc578063a0c76f621461106b578063a22cb46514610f0b578063b0ccc31e14610e9a578063c3666c3614610c5d578063d539139314610c04578063d547741f14610a7b578063e1a8bf2c14610a3f578063e8ab9ccc14610833578063e985e9c51461077f578063f242432a1461044d578063f2fde38b146103595763f7ba94bd1461019c57600080fd5b346102fd576101aa3661329b565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101eb613aa8565b925416911690810361032c57508181036103025760005b81811061020b57005b610216818387613589565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102fd57610240828587613589565b35908147106102cb57600080809381935af13d156102c3573d9061026382613473565b9161027160405193846133ce565b82523d6000602084013e5b1561028a5750600101610202565b80511561029957602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061027c565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610390613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc906103ba613aa8565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361032c575073ffffffffffffffffffffffffffffffffffffffff16918282036103fe57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610484613190565b61048c6131b3565b604435906064359260843567ffffffffffffffff81116102fd576104b490369060040161326d565b926104bd613aa8565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361076f575b505073ffffffffffffffffffffffffffffffffffffffff8216947f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612861561074557610560828783613dbc565b156106fb5773ffffffffffffffffffffffffffffffffffffffff916105898a8a878a8796613e3c565b169416918583867fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518c81528d6020820152a43b6105c657005b6020926105d49136916134ad565b9261062a60405194859384937ff23a6e610000000000000000000000000000000000000000000000000000000085526004850152602484015287604484015288606484015260a0608484015260a48301906131f9565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000916000916106c0575b50160361068d57005b7f40f39d380000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6106e2915060203d6020116106e8575b6106da81836133ce565b810190613c99565b86610684565b503d6106d0565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff8681847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b7fb5e890150000000000000000000000000000000000000000000000000000000060005260046000fd5b61077891613cd1565b8785610514565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576107b6613190565b73ffffffffffffffffffffffffffffffffffffffff6107d36131b3565b91166000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e861360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd5761088290369060040161323c565b60243567ffffffffffffffff81116102fd576108a290369060040161323c565b929060443567ffffffffffffffff81116102fd576108c490369060040161323c565b93909160643567ffffffffffffffff81116102fd576108e790369060040161326d565b9390916108f2613aa8565b9761091d897fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612946109488161340f565b97610956604051998a6133ce565b818952602089019160051b8101903682116102fd57915b818310610a12575050509161098b6109939261099b95943691613427565b973691613427565b9336916134ad565b9183519480518614801590610a07575b6103025760005b8681106109bb57005b80610a018673ffffffffffffffffffffffffffffffffffffffff6109e16001958b613873565b51166109ed8487613873565b516109f88589613873565b51918d8a613927565b016109b2565b5081518614156109ab565b823573ffffffffffffffffffffffffffffffffffffffff811681036102fd5781526020928301920161096d565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020604051620186a08152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435610ab56131b3565b610abd613aa8565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610b6f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346102fd57610c6b3661333f565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cb0613aa8565b925416911690810361032c5750808214801590610e90575b6103025760005b828110610cd857005b73ffffffffffffffffffffffffffffffffffffffff610d00610cfb83858a613589565b613906565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156106ef57600091610e62575b5015610e35575073ffffffffffffffffffffffffffffffffffffffff610d8f610cfb83858a613589565b1690610d9f610cfb828689613589565b91610dab82878b613589565b3592813b156102fd57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156106ef57600192610e24575b5001610ccf565b6000610e2f916133ce565b88610e1d565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e83915060203d8111610e89575b610e7b81836133ce565b810190613a90565b89610d65565b503d610e71565b5082821415610cc8565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57610f42613190565b60243590811515918281036102fd5761103c575b73ffffffffffffffffffffffffffffffffffffffff80610f74613aa8565b1691169181831461100e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86138252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507ffb0fdf610000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611066817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cd1565b610f56565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56136ef565b6040519182916020835260208301906131f9565b0390f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576111866131b3565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761121e613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061125d613aa8565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156112ea5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356113e0613aa8565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156114ac5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610bff565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346102fd576115023661333f565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611545613aa8565b925416911690810361032c575080841480159061169a575b6103025760005b84811061156d57005b611578818388613589565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102fd5760006020916115ab610cfb868b8e613589565b826116156116416115bd898d8d613589565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826133ce565b51925af1156106ef576000513d6116915750803b155b6116645750600101611564565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611657565b508284141561155d565b346102fd576116b23661329b565b8083949293036103025773ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117de57916000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301915b85811061172e57005b848110156117af578060051b820135838112156102fd5782019081359167ffffffffffffffff83116102fd5760200182360381136102fd577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b600193611795848b8a613589565b35926117a6604051928392836134e4565b0390a201611725565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f22060671000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061187d613aa8565b925416911690810361032c57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a081116118fb57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761195f613190565b6064359067ffffffffffffffff82116102fd576119836119f092369060040161326d565b6119e261198e613aa8565b926119b9847fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e86129236916134ad565b926044359260243592613927565b005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576020611a33611a2e613190565b61352a565b6040519015158152f35b346102fd57611a4b3661329b565b9192917f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612919080850361030257611a818561340f565b94611a8f60405196876133ce565b8086527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611abc8261340f565b0136602088013760005b818110611ae3576040516020808252819061114b9082018a61330b565b80611b0a611af7610cfb600194868b613589565b611b02838789613589565b359088613599565b611b14828a613873565b5201611ac6565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57600435611b556131b3565b611b5d613aa8565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361032c57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611c1057005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610bff565b346102fd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57611cde613190565b611ce66131b3565b60443567ffffffffffffffff81116102fd57611d0690369060040161323c565b929060643567ffffffffffffffff81116102fd57611d2890369060040161323c565b9360843567ffffffffffffffff81116102fd57611d4990369060040161326d565b939091611d54613aa8565b957f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308773ffffffffffffffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff8216036120d6575b505073ffffffffffffffffffffffffffffffffffffffff8216967f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612881561074557898b0361030257611dfe828483613dbc565b1561208c5760005b8b811061205d575050928992888a8897947f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb73ffffffffffffffffffffffffffffffffffffffff809b99169a8b9216988993611e8260405192839260408452611e748d60408601908d6138c9565b9184830360208601526138c9565b0390a43b611e8c57005b602094611ea1611ea992611eb1953691613427565b993691613427565b9536916134ad565b92611f6160405194859384937fbc197c810000000000000000000000000000000000000000000000000000000085526004850152602484015260a06044840152611f31611f0160a485018b61330b565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8582030160648601528861330b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8483030160848501526131f9565b03816000875af19081156106ef577fbc197c8100000000000000000000000000000000000000000000000000000000917fffffffff000000000000000000000000000000000000000000000000000000009160009161203e575b501603611fc457005b61203a9061200a6040519485947fc287817e000000000000000000000000000000000000000000000000000000008652600486015260606024860152606485019061330b565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84830301604485015261330b565b0390fd5b612057915060203d6020116106e8576106da81836133ce565b86611fbb565b806120868c61207c8f94612074816001978d613589565b35928d613589565b3590888887613e3c565b01611e06565b73ffffffffffffffffffffffffffffffffffffffff8381847f05bbb9c400000000000000000000000000000000000000000000000000000000600052166004521660245260446000fd5b6120df91613cd1565b8987611dab565b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612240575b1561220a57505061114b60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b61114b91620186a082101561222d5761222790620186a092613887565b046121da565b620186a061223b9204613887565b6121da565b5081156121cd565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760243567ffffffffffffffff81116102fd5761229790369060040161326d565b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541633036117de5761230a7f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b9160405191829160043595836134e4565b0390a2005b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57612346613190565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612385613aa8565b925416911690810361032c575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd577f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6546040517ff724dad700000000000000000000000000000000000000000000000000000000815230600480830191909152356024820152906000908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa9081156106ef576000916124c5575b6040516020808252819061114b908201856131f9565b3d8083833e6124d481836133ce565b8101906020818303126125455780519067ffffffffffffffff8211612549570181601f820112156125455780519261250b84613473565b9261251960405194856133ce565b84845260208584010111612542575061114b9261253c91602080850191016131d6565b906124af565b80fd5b8280fd5b8380fd5b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5760043567ffffffffffffffff81116102fd5761259c90369060040161326d565b60243567ffffffffffffffff81116102fd576125bc90369060040161326d565b6044939193359173ffffffffffffffffffffffffffffffffffffffff831683036102fd576064359373ffffffffffffffffffffffffffffffffffffffff851685036102fd577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61262a613aa8565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612a9d575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612d89575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f55f2baa086bcadb68563d14bf0ae4964705cc6bc8fd476a834dc8cb4e83cc92a80548216831790557f798ccc21e731e7c6df0f17af649aebfe86cf40852d893cd6be9ac4b4f1a38c4a80548216831790557f9e2577fef401b922351ba64c2dd1b1973f93ce5aa0ac6d201b8f37697f418ddc80548216831790557fd5b919ee98bf671a286d76fb974776031948c06c028e2b68350aa10f39644e9e80548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612a9d575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612c5a578190612889845461369c565b601f8111612d36575b50600090601f8311600114612c9457600092612c89575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612c5a576129147f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a55461369c565b601f8111612bd6575b506000601f8211600114612ada5781929394600092612acf575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612a9d575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612937565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612bbe575083600195969710612b86575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612989565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612b59565b90926020600181928686013581550194019101612b45565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612c50575b601f0160051c01905b818110612c44575061291d565b60008155600101612c37565b9091508190612c2e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806128a9565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612d1e5750908460019594939210612ce6575b505050811b0190556128db565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612cd9565b91936020600181928787013581550195019201612cc3565b909150836000526020600020601f840160051c81019160208510612d7f575b90601f859493920160051c01905b818110612d705750612892565b60008155849350600101612d63565b9091508190612d55565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612697565b346102fd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57612e15613190565b60243567ffffffffffffffff81116102fd57612e3590369060040161323c565b909160443567ffffffffffffffff81116102fd57612e5790369060040161323c565b93909160643567ffffffffffffffff81116102fd57612eeb93612e81612ef392369060040161326d565b959091612ee3612e8f613aa8565b96612eba887fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226137b1565b7f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612993691613427565b983691613427565b9436916134ad565b9173ffffffffffffffffffffffffffffffffffffffff821694851561301657865190855182036103025760005b828110612fec5750505073ffffffffffffffffffffffffffffffffffffffff1690846000837f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6040516040815280612f8d612f7f8d604084019061330b565b82810360208401528b61330b565b0390a43b612f9757005b611f619160209160405193849283927fbc197c8100000000000000000000000000000000000000000000000000000000845260048401526000602484015260a06044840152611f31611f0160a485018b61330b565b80613010612ffc6001938c613873565b51613007838b613873565b51908886613bbc565b01612f20565b7f021149bd0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102fd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd5761114b6111377f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46136ef565b346102fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd57611a336020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613612565b346102fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102fd57602061318861315e613190565b602435907f5ccf5846fa27a68fafc8e588671a68f5e67c2f9b56af4263806a4d71735e8612613599565b604051908152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102fd57565b60005b8381106131e95750506000910152565b81810151838201526020016131d9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093613235815180928187528780880191016131d6565b0116010190565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd576020808501948460051b0101116102fd57565b9181601f840112156102fd5782359167ffffffffffffffff83116102fd57602083818601950101116102fd57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd57816132e49160040161323c565b929092916024359067ffffffffffffffff82116102fd576133079160040161323c565b9091565b906020808351928381520192019060005b8181106133295750505090565b825184526020938401939092019160010161331c565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102fd5760043567ffffffffffffffff81116102fd57816133889160040161323c565b9290929160243567ffffffffffffffff81116102fd57816133ab9160040161323c565b929092916044359067ffffffffffffffff82116102fd576133079160040161323c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c5a57604052565b67ffffffffffffffff8111612c5a5760051b60200190565b9291906134338161340f565b9361344160405195866133ce565b602085838152019160051b81019283116102fd57905b82821061346357505050565b8135815260209182019101613457565b67ffffffffffffffff8111612c5a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926134b982613473565b916134c760405193846133ce565b8294818452818301116102fd578281602093846000960137010152565b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135825773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b91908110156117af5760051b0190565b909173ffffffffffffffffffffffffffffffffffffffff8316156135e85760005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205490565b7fca2434a50000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613582577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136955760005260205260ff6040600020541690565b5050600190565b90600182811c921680156136e5575b60208310146136b657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916136ab565b90604051918260008254926137038461369c565b8084529360018116908115613771575060011461372a575b50613728925003836133ce565b565b90506000929192526020600020906000915b818310613755575050906020613728928201013861371b565b602091935080600191548385890101520191019091849261373c565b602093506137289592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861371b565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561380b5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156117af5760209160051b010190565b8181029291811591840414171561389a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116102fd5760209260051b809284830137010190565b3573ffffffffffffffffffffffffffffffffffffffff811681036102fd5790565b94919092939473ffffffffffffffffffffffffffffffffffffffff82169384156130165761396c87878573ffffffffffffffffffffffffffffffffffffffff95613bbc565b1690836000837fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604080518a81528b6020820152a43b6139ae575b5050505050565b613a099160209160405193849283927ff23a6e6100000000000000000000000000000000000000000000000000000000845260048401526000602484015287604484015288606484015260a0608484015260a48301906131f9565b03816000865af19081156106ef577ff23a6e6100000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091613a71575b50160361068d5780806139a7565b613a8a915060203d6020116106e8576106da81836133ce565b38613a63565b908160209103126102fd575180151581036102fd5790565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613bad573233148015613bb2575b613bad577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613b33575b50613b3057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ef57600091613b8e575b5038613b26565b613ba7915060203d602011610e8957610e7b81836133ce565b38613b87565b503390565b5060183610613aef565b909183613bca575b50505050565b8060005281602052604060002073ffffffffffffffffffffffffffffffffffffffff8416600052602052604060002054938085019480861115613c4057505060005260205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260406000205538808080613bc4565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602481019390935260448301526064820152608490fd5b908160209103126102fd57517fffffffff00000000000000000000000000000000000000000000000000000000811681036102fd5790565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613db2575b613cfa575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa9081156106ef57600091613d93575b5015613d665750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613dac915060203d602011610e8957610e7b81836133ce565b38613d5d565b50813b1515613cf2565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613de7575b50505090565b600192935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613de1565b91929084613e4b575050505050565b8160005282602052604060002073ffffffffffffffffffffffffffffffffffffffff8216600052602052604060002054908582039180831015613fa7575073ffffffffffffffffffffffffffffffffffffffff851673ffffffffffffffffffffffffffffffffffffffff821603613ec3575b506139a7565b8260005283602052604060002073ffffffffffffffffffffffffffffffffffffffff8616600052602052604060002054958087019680881115613f4957505060009283526020938452604080842073ffffffffffffffffffffffffffffffffffffffff928316855280865281852093909355941682529091522055388080808080613ebd565b6040517f42fb00bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881660048201526024810186905260448101919091526064810191909152608490fd5b6040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92909216600483015260248201849052604482015260648101869052608490fdfea26469706673582212209c835528a9aeb8fcacc8f683dbbda3d2b31ab53240330f833b291a6c9eeaa09664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH3 0xFDD58E EQ PUSH2 0x3122 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x309B JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3040 JUMPI DUP1 PUSH4 0xD6A5BBB EQ PUSH2 0x2DDE JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x254D JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x23F6 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x230F JUMPI DUP1 PUSH4 0x162094C4 EQ PUSH2 0x2248 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2155 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x20E6 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x1CA7 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1B1B JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1A3D JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x19F2 JUMPI DUP1 PUSH4 0x5CFA9297 EQ PUSH2 0x1928 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x180C JUMPI DUP1 PUSH4 0x6706467B EQ PUSH2 0x16A4 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x14F4 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1385 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1314 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x11E7 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x114F JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10DC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x106B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0xF0B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xE9A JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC5D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC04 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xA7B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xA3F JUMPI DUP1 PUSH4 0xE8AB9CCC EQ PUSH2 0x833 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x44D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x359 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x19C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1AA CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EB PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP2 DUP2 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x20B JUMPI STOP JUMPDEST PUSH2 0x216 DUP2 DUP4 DUP8 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x240 DUP3 DUP6 DUP8 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2C3 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x263 DUP3 PUSH2 0x3473 JUMP JUMPDEST SWAP2 PUSH2 0x271 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x33CE JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x28A JUMPI POP PUSH1 0x1 ADD PUSH2 0x202 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x299 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x27C JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x390 PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x3BA PUSH2 0x3AA8 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3FE JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x484 PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x48C PUSH2 0x31B3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD SWAP3 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x4B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP3 PUSH2 0x4BD PUSH2 0x3AA8 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x76F JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP7 ISZERO PUSH2 0x745 JUMPI PUSH2 0x560 DUP3 DUP8 DUP4 PUSH2 0x3DBC JUMP JUMPDEST ISZERO PUSH2 0x6FB JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH2 0x589 DUP11 DUP11 DUP8 DUP11 DUP8 SWAP7 PUSH2 0x3E3C JUMP JUMPDEST AND SWAP5 AND SWAP2 DUP6 DUP4 DUP7 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP13 DUP2 MSTORE DUP14 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x5C6 JUMPI STOP JUMPDEST PUSH1 0x20 SWAP3 PUSH2 0x5D4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH2 0x62A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x6C0 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI STOP JUMPDEST PUSH32 0x40F39D3800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6E2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI JUMPDEST PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3C99 JUMP JUMPDEST DUP7 PUSH2 0x684 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x6D0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xB5E8901500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x778 SWAP2 PUSH2 0x3CD1 JUMP JUMPDEST DUP8 DUP6 PUSH2 0x514 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x7B6 PUSH2 0x3190 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D3 PUSH2 0x31B3 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x882 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8A2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8C4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x8E7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x8F2 PUSH2 0x3AA8 JUMP JUMPDEST SWAP8 PUSH2 0x91D DUP10 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP5 PUSH2 0x948 DUP2 PUSH2 0x340F JUMP JUMPDEST SWAP8 PUSH2 0x956 PUSH1 0x40 MLOAD SWAP10 DUP11 PUSH2 0x33CE JUMP JUMPDEST DUP2 DUP10 MSTORE PUSH1 0x20 DUP10 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2FD JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xA12 JUMPI POP POP POP SWAP2 PUSH2 0x98B PUSH2 0x993 SWAP3 PUSH2 0x99B SWAP6 SWAP5 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP4 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP2 DUP4 MLOAD SWAP5 DUP1 MLOAD DUP7 EQ DUP1 ISZERO SWAP1 PUSH2 0xA07 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP7 DUP2 LT PUSH2 0x9BB JUMPI STOP JUMPDEST DUP1 PUSH2 0xA01 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9E1 PUSH1 0x1 SWAP6 DUP12 PUSH2 0x3873 JUMP JUMPDEST MLOAD AND PUSH2 0x9ED DUP5 DUP8 PUSH2 0x3873 JUMP JUMPDEST MLOAD PUSH2 0x9F8 DUP6 DUP10 PUSH2 0x3873 JUMP JUMPDEST MLOAD SWAP2 DUP14 DUP11 PUSH2 0x3927 JUMP JUMPDEST ADD PUSH2 0x9B2 JUMP JUMPDEST POP DUP2 MLOAD DUP7 EQ ISZERO PUSH2 0x9AB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xAB5 PUSH2 0x31B3 JUMP JUMPDEST PUSH2 0xABD PUSH2 0x3AA8 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xB6F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0xC6B CALLDATASIZE PUSH2 0x333F JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCB0 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xE90 JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCD8 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD00 PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x3589 JUMP JUMPDEST PUSH2 0x3906 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE62 JUMPI JUMPDEST POP ISZERO PUSH2 0xE35 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD8F PUSH2 0xCFB DUP4 DUP6 DUP11 PUSH2 0x3589 JUMP JUMPDEST AND SWAP1 PUSH2 0xD9F PUSH2 0xCFB DUP3 DUP7 DUP10 PUSH2 0x3589 JUMP JUMPDEST SWAP2 PUSH2 0xDAB DUP3 DUP8 DUP12 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2FD JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE24 JUMPI JUMPDEST POP ADD PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE2F SWAP2 PUSH2 0x33CE JUMP JUMPDEST DUP9 PUSH2 0xE1D JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE83 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE89 JUMPI JUMPDEST PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3A90 JUMP JUMPDEST DUP10 PUSH2 0xD65 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE71 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCC8 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0xF42 PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x103C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF74 PUSH2 0x3AA8 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x100E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8613 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xFB0FDF6100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1066 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CD1 JUMP JUMPDEST PUSH2 0xF56 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1186 PUSH2 0x31B3 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x121E PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x125D PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x12EA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x13E0 PUSH2 0x3AA8 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x14AC JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1502 CALLDATASIZE PUSH2 0x333F JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1545 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x169A JUMPI JUMPDEST PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x156D JUMPI STOP JUMPDEST PUSH2 0x1578 DUP2 DUP4 DUP9 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x15AB PUSH2 0xCFB DUP7 DUP12 DUP15 PUSH2 0x3589 JUMP JUMPDEST DUP3 PUSH2 0x1615 PUSH2 0x1641 PUSH2 0x15BD DUP10 DUP14 DUP14 PUSH2 0x3589 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x33CE JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1691 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1664 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1564 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1657 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x155D JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x16B2 CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST DUP1 DUP4 SWAP5 SWAP3 SWAP4 SUB PUSH2 0x302 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17DE JUMPI SWAP2 PUSH1 0x0 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD SWAP2 JUMPDEST DUP6 DUP2 LT PUSH2 0x172E JUMPI STOP JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x17AF JUMPI DUP1 PUSH1 0x5 SHL DUP3 ADD CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x2FD JUMPI DUP3 ADD SWAP1 DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 ADD DUP3 CALLDATASIZE SUB DUP2 SGT PUSH2 0x2FD JUMPI PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B PUSH1 0x1 SWAP4 PUSH2 0x1795 DUP5 DUP12 DUP11 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 PUSH2 0x17A6 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x34E4 JUMP JUMPDEST SUB SWAP1 LOG2 ADD PUSH2 0x1725 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2206067100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE CALLER PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x187D PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x18FB JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x195F PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x64 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x1983 PUSH2 0x19F0 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH2 0x19E2 PUSH2 0x198E PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 PUSH2 0x19B9 DUP5 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP3 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0x24 CALLDATALOAD SWAP3 PUSH2 0x3927 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x1A33 PUSH2 0x1A2E PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x352A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH2 0x1A4B CALLDATASIZE PUSH2 0x329B JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP2 SWAP1 DUP1 DUP6 SUB PUSH2 0x302 JUMPI PUSH2 0x1A81 DUP6 PUSH2 0x340F JUMP JUMPDEST SWAP5 PUSH2 0x1A8F PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x33CE JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x1ABC DUP3 PUSH2 0x340F JUMP JUMPDEST ADD CALLDATASIZE PUSH1 0x20 DUP9 ADD CALLDATACOPY PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AE3 JUMPI PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP11 PUSH2 0x330B JUMP JUMPDEST DUP1 PUSH2 0x1B0A PUSH2 0x1AF7 PUSH2 0xCFB PUSH1 0x1 SWAP5 DUP7 DUP12 PUSH2 0x3589 JUMP JUMPDEST PUSH2 0x1B02 DUP4 DUP8 DUP10 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 PUSH2 0x3599 JUMP JUMPDEST PUSH2 0x1B14 DUP3 DUP11 PUSH2 0x3873 JUMP JUMPDEST MSTORE ADD PUSH2 0x1AC6 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1B55 PUSH2 0x31B3 JUMP JUMPDEST PUSH2 0x1B5D PUSH2 0x3AA8 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C10 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xBFF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x1CDE PUSH2 0x3190 JUMP JUMPDEST PUSH2 0x1CE6 PUSH2 0x31B3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D06 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D28 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x1D49 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH2 0x1D54 PUSH2 0x3AA8 JUMP JUMPDEST SWAP6 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20D6 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP7 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 DUP9 ISZERO PUSH2 0x745 JUMPI DUP10 DUP12 SUB PUSH2 0x302 JUMPI PUSH2 0x1DFE DUP3 DUP5 DUP4 PUSH2 0x3DBC JUMP JUMPDEST ISZERO PUSH2 0x208C JUMPI PUSH1 0x0 JUMPDEST DUP12 DUP2 LT PUSH2 0x205D JUMPI POP POP SWAP3 DUP10 SWAP3 DUP9 DUP11 DUP9 SWAP8 SWAP5 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP12 SWAP10 AND SWAP11 DUP12 SWAP3 AND SWAP9 DUP10 SWAP4 PUSH2 0x1E82 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP3 PUSH1 0x40 DUP5 MSTORE PUSH2 0x1E74 DUP14 PUSH1 0x40 DUP7 ADD SWAP1 DUP14 PUSH2 0x38C9 JUMP JUMPDEST SWAP2 DUP5 DUP4 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0x38C9 JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x1E8C JUMPI STOP JUMPDEST PUSH1 0x20 SWAP5 PUSH2 0x1EA1 PUSH2 0x1EA9 SWAP3 PUSH2 0x1EB1 SWAP6 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP10 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP6 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP3 PUSH2 0x1F61 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F31 PUSH2 0x1F01 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x330B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP6 DUP3 SUB ADD PUSH1 0x64 DUP7 ADD MSTORE DUP9 PUSH2 0x330B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x84 DUP6 ADD MSTORE PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP8 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x203E JUMPI JUMPDEST POP AND SUB PUSH2 0x1FC4 JUMPI STOP JUMPDEST PUSH2 0x203A SWAP1 PUSH2 0x200A PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP5 PUSH32 0xC287817E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x4 DUP7 ADD MSTORE PUSH1 0x60 PUSH1 0x24 DUP7 ADD MSTORE PUSH1 0x64 DUP6 ADD SWAP1 PUSH2 0x330B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP5 DUP4 SUB ADD PUSH1 0x44 DUP6 ADD MSTORE PUSH2 0x330B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2057 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP7 PUSH2 0x1FBB JUMP JUMPDEST DUP1 PUSH2 0x2086 DUP13 PUSH2 0x207C DUP16 SWAP5 PUSH2 0x2074 DUP2 PUSH1 0x1 SWAP8 DUP14 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP14 PUSH2 0x3589 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP9 DUP9 DUP8 PUSH2 0x3E3C JUMP JUMPDEST ADD PUSH2 0x1E06 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP5 PUSH32 0x5BBB9C400000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x20DF SWAP2 PUSH2 0x3CD1 JUMP JUMPDEST DUP10 DUP8 PUSH2 0x1DAB JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2240 JUMPI JUMPDEST ISZERO PUSH2 0x220A JUMPI POP POP PUSH2 0x114B PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x114B SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x222D JUMPI PUSH2 0x2227 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3887 JUMP JUMPDEST DIV PUSH2 0x21DA JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x223B SWAP3 DIV PUSH2 0x3887 JUMP JUMPDEST PUSH2 0x21DA JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x21CD JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2297 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND CALLER SUB PUSH2 0x17DE JUMPI PUSH2 0x230A PUSH32 0x6BB7FF708619BA0610CBA295A58592E0451DEE2622938C8755667688DAF3529B SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x4 CALLDATALOAD SWAP6 DUP4 PUSH2 0x34E4 JUMP JUMPDEST SUB SWAP1 LOG2 STOP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x2346 PUSH2 0x3190 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2385 PUSH2 0x3AA8 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD PUSH1 0x40 MLOAD PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE CALLDATALOAD PUSH1 0x24 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 SWAP1 DUP3 SWAP1 PUSH1 0x44 SWAP1 DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x24C5 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0x114B SWAP1 DUP3 ADD DUP6 PUSH2 0x31F9 JUMP JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x24D4 DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x2545 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2549 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x2545 JUMPI DUP1 MLOAD SWAP3 PUSH2 0x250B DUP5 PUSH2 0x3473 JUMP JUMPDEST SWAP3 PUSH2 0x2519 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x33CE JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x2542 JUMPI POP PUSH2 0x114B SWAP3 PUSH2 0x253C SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x31D6 JUMP JUMPDEST SWAP1 PUSH2 0x24AF JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x259C SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x25BC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x2FD JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x2FD JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x262A PUSH2 0x3AA8 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2D89 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x55F2BAA086BCADB68563D14BF0AE4964705CC6BC8FD476A834DC8CB4E83CC92A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x798CCC21E731E7C6DF0F17AF649AEBFE86CF40852D893CD6BE9AC4B4F1A38C4A DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9E2577FEF401B922351BA64C2DD1B1973F93CE5AA0AC6D201B8F37697F418DDC DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xD5B919EE98BF671A286D76FB974776031948C06C028E2B68350AA10F39644E9E DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2C5A JUMPI DUP2 SWAP1 PUSH2 0x2889 DUP5 SLOAD PUSH2 0x369C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2D36 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2C94 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2C89 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH2 0x2914 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x369C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2BD6 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2ADA JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2ACF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2A9D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2937 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2BBE JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2B86 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2989 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2B59 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2B45 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2C50 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2C44 JUMPI POP PUSH2 0x291D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2C37 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2C2E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x28A9 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D1E JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2CE6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x28DB JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2CD9 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2CC3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2D7F JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D70 JUMPI POP PUSH2 0x2892 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2D63 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2D55 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2697 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x2E15 PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2E35 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2E57 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP4 SWAP1 SWAP2 PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI PUSH2 0x2EEB SWAP4 PUSH2 0x2E81 PUSH2 0x2EF3 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x326D JUMP JUMPDEST SWAP6 SWAP1 SWAP2 PUSH2 0x2EE3 PUSH2 0x2E8F PUSH2 0x3AA8 JUMP JUMPDEST SWAP7 PUSH2 0x2EBA DUP9 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x37B1 JUMP JUMPDEST PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 SWAP10 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP9 CALLDATASIZE SWAP2 PUSH2 0x3427 JUMP JUMPDEST SWAP5 CALLDATASIZE SWAP2 PUSH2 0x34AD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP6 ISZERO PUSH2 0x3016 JUMPI DUP7 MLOAD SWAP1 DUP6 MLOAD DUP3 SUB PUSH2 0x302 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2FEC JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP5 PUSH1 0x0 DUP4 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP1 PUSH2 0x2F8D PUSH2 0x2F7F DUP14 PUSH1 0x40 DUP5 ADD SWAP1 PUSH2 0x330B JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE DUP12 PUSH2 0x330B JUMP JUMPDEST SUB SWAP1 LOG4 EXTCODESIZE PUSH2 0x2F97 JUMPI STOP JUMPDEST PUSH2 0x1F61 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xBC197C8100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x44 DUP5 ADD MSTORE PUSH2 0x1F31 PUSH2 0x1F01 PUSH1 0xA4 DUP6 ADD DUP12 PUSH2 0x330B JUMP JUMPDEST DUP1 PUSH2 0x3010 PUSH2 0x2FFC PUSH1 0x1 SWAP4 DUP13 PUSH2 0x3873 JUMP JUMPDEST MLOAD PUSH2 0x3007 DUP4 DUP12 PUSH2 0x3873 JUMP JUMPDEST MLOAD SWAP1 DUP9 DUP7 PUSH2 0x3BBC JUMP JUMPDEST ADD PUSH2 0x2F20 JUMP JUMPDEST PUSH32 0x21149BD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH2 0x114B PUSH2 0x1137 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x36EF JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI PUSH2 0x1A33 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3612 JUMP JUMPDEST CALLVALUE PUSH2 0x2FD JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x20 PUSH2 0x3188 PUSH2 0x315E PUSH2 0x3190 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x5CCF5846FA27A68FAFC8E588671A68F5E67C2F9B56AF4263806A4D71735E8612 PUSH2 0x3599 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x31E9 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x31D9 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3235 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x31D6 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2FD JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2FD JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x32E4 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x3307 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP1 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP3 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3329 JUMPI POP POP POP SWAP1 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x331C JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2FD JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x3388 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2FD JUMPI DUP2 PUSH2 0x33AB SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2FD JUMPI PUSH2 0x3307 SWAP2 PUSH1 0x4 ADD PUSH2 0x323C JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C5A JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3433 DUP2 PUSH2 0x340F JUMP JUMPDEST SWAP4 PUSH2 0x3441 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x33CE JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x2FD JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3463 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3457 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C5A JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x34B9 DUP3 PUSH2 0x3473 JUMP JUMPDEST SWAP2 PUSH2 0x34C7 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x33CE JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2FD JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x1F DUP4 PUSH1 0x40 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 PUSH1 0x20 DUP7 MSTORE DUP2 PUSH1 0x20 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3582 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x17AF JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO PUSH2 0x35E8 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH32 0xCA2434A500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3582 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3695 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x36E5 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x36B6 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x36AB JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3703 DUP5 PUSH2 0x369C JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3771 JUMPI POP PUSH1 0x1 EQ PUSH2 0x372A JUMPI JUMPDEST POP PUSH2 0x3728 SWAP3 POP SUB DUP4 PUSH2 0x33CE JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3755 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3728 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x371B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x373C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3728 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x371B JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x380B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x17AF JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x389A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 DUP2 MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2FD JUMPI PUSH1 0x20 SWAP3 PUSH1 0x5 SHL DUP1 SWAP3 DUP5 DUP4 ADD CALLDATACOPY ADD ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP2 SWAP1 SWAP3 SWAP4 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3016 JUMPI PUSH2 0x396C DUP8 DUP8 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 PUSH2 0x3BBC JUMP JUMPDEST AND SWAP1 DUP4 PUSH1 0x0 DUP4 PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP1 MLOAD DUP11 DUP2 MSTORE DUP12 PUSH1 0x20 DUP3 ADD MSTORE LOG4 EXTCODESIZE PUSH2 0x39AE JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3A09 SWAP2 PUSH1 0x20 SWAP2 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP3 DUP4 SWAP3 PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE DUP9 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0xA0 PUSH1 0x84 DUP5 ADD MSTORE PUSH1 0xA4 DUP4 ADD SWAP1 PUSH2 0x31F9 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH32 0xF23A6E6100000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x3A71 JUMPI JUMPDEST POP AND SUB PUSH2 0x68D JUMPI DUP1 DUP1 PUSH2 0x39A7 JUMP JUMPDEST PUSH2 0x3A8A SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E8 JUMPI PUSH2 0x6DA DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3A63 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3BAD JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3BB2 JUMPI JUMPDEST PUSH2 0x3BAD JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3B33 JUMPI JUMPDEST POP PUSH2 0x3B30 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3B8E JUMPI JUMPDEST POP CODESIZE PUSH2 0x3B26 JUMP JUMPDEST PUSH2 0x3BA7 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3B87 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3AEF JUMP JUMPDEST SWAP1 SWAP2 DUP4 PUSH2 0x3BCA JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP4 DUP1 DUP6 ADD SWAP5 DUP1 DUP7 GT ISZERO PUSH2 0x3C40 JUMPI POP POP PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3BC4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2FD JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2FD JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3DB2 JUMPI JUMPDEST PUSH2 0x3CFA JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3D93 JUMPI JUMPDEST POP ISZERO PUSH2 0x3D66 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3DAC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE89 JUMPI PUSH2 0xE7B DUP2 DUP4 PUSH2 0x33CE JUMP JUMPDEST CODESIZE PUSH2 0x3D5D JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3CF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3DE7 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3DE1 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 DUP5 PUSH2 0x3E4B JUMPI POP POP POP POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 DUP6 DUP3 SUB SWAP2 DUP1 DUP4 LT ISZERO PUSH2 0x3FA7 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x3EC3 JUMPI JUMPDEST POP PUSH2 0x39A7 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 DUP1 DUP8 ADD SWAP7 DUP1 DUP9 GT ISZERO PUSH2 0x3F49 JUMPI POP POP PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP6 MSTORE DUP1 DUP7 MSTORE DUP2 DUP6 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP5 AND DUP3 MSTORE SWAP1 SWAP2 MSTORE KECCAK256 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3EBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x42FB00BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x3DEE4C500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x84 SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 DUP4 SSTORE 0x28 0xA9 0xAE 0xB8 0xFC 0xAC 0xC8 0xF6 DUP4 0xDB 0xBD LOG3 0xD2 0xB3 BYTE 0xB5 ORIGIN BLOCKHASH CALLER 0xF DUP4 EXTCODESIZE 0x29 BYTE PUSH13 0x9EEAA09664736F6C634300081E STOP CALLER ","sourceMap":"1880:1732:232:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1880:1732:232;;3329:41;;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1880:1732:232;1845:10:192;;;;;;1880:1732:232;1857:3:192;1876:11;;;;;:::i;:::-;1880:1732:232;;;;;;;;;1898:10:192;;;;;:::i;:::-;1880:1732:232;1375:21:9;;;:30;1371:125;;1880:1732:232;1548:33:9;;;;;;;1880:1732:232;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1880:1732:232;;1834:9:192;;1591:58:9;1880:1732:232;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1880:1732:232;5957:19:9;1880:1732:232;;5957:19:9;1880:1732:232;;;;;1371:125:9;1455:21;;1428:57;1880:1732:232;1428:57:9;1880:1732:232;;;;;;1428:57:9;1880:1732:232;;;;1756:63:192;1793:26;1880:1732:232;1793:26:192;1880:1732:232;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1880:1732:232;;-1:-1:-1;4538:25:42;1880:1732:232;;;;;;;;;;;;;:::i;:::-;;3329:41;;;:::i;:::-;1880:1732;;;;;;;;3205:23:42;;;3201:60;;1880:1732:232;;;3275:25:42;;;;3271:146;;1880:1732:232;3271:146:42;583:77:341;;;;;;;;3361:45:42;1880:1732:232;3361:45:42;;1880:1732:232;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41;;;:::i;:::-;3179:19:352;1880:1732:232;;;;;;;;2616:14:352;2612:76;;1880:1732:232;-1:-1:-1;;1880:1732:232;;;;;4536:16:228;;4532:59;;4606:30;;;;;:::i;:::-;4605:31;4601:76;;1880:1732:232;4720:5:228;;;;;;;;;:::i;:::-;1880:1732:232;;;;;;;4742:43:228;1880:1732:232;;;;;;;;;;;4742:43:228;376:58:354;4796:104:228;;1880:1732:232;4796:104:228;1880:1732:232;;;;;;;:::i;:::-;;;;;19356:74:228;;;;;1880:1732:232;19356:74:228;;1880:1732:232;19356:74:228;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;1880:1732:232;19356:74:228;;;;;;;;1880:1732:232;19356:74:228;1880:1732:232;19356:74:228;1880:1732:232;19356:74:228;;;4796:104;1880:1732:232;;19356:101:228;19352:168;;1880:1732:232;19352:168:228;19478:42;1880:1732:232;19478:42:228;1880:1732:232;;;;;;;;19478:42:228;19356:74;;;;1880:1732:232;19356:74:228;1880:1732:232;19356:74:228;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;1880:1732:232;;;;;;;;;4601:76:228;1880:1732:232;4645:32:228;;;;1880:1732:232;4645:32:228;1880:1732:232;;;;;;;;4645:32:228;4532:59;4561:30;1880:1732:232;4561:30:228;1880:1732:232;;4561:30:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1880:1732:232;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;16447:19:228;1880:1732:232;-1:-1:-1;1880:1732:232;14847:11:228;1880:1732:232;;;;-1:-1:-1;1880:1732:232;14847:28:228;1880:1732:232;-1:-1:-1;1880:1732:232;;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41;;;;;:::i;:::-;4464:19:41;1367:6:208;688:76:41;1880:1732:232;1367:6:208;:::i;:::-;1880:1732:232;974:8:208;;;;:::i;:::-;1880:1732:232;;;;;;;:::i;:::-;974:8:208;;;1880:1732:232;974:8:208;;;;;;;1880:1732:232;;974:8:208;;;;;;;;;;;1880:1732:232;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;11620:20:228;;;;:47;;;974:8:208;11616:86:228;;1880:1732:232;11728:10:228;;;;;;1880:1732:232;11740:3:228;11778:13;11812:4;11778:13;1880:1732:232;11778:13:228;1880:1732:232;11778:13:228;;;:::i;:::-;1880:1732:232;;11793:6:228;;;;:::i;:::-;1880:1732:232;11801:9:228;;;;:::i;:::-;1880:1732:232;11812:4:228;;;;:::i;:::-;1880:1732:232;11717:9:228;;11620:47;1880:1732:232;;;11644:23:228;;;11620:47;;974:8:208;1880:1732:232;;;;;;;;;974:8:208;;1880:1732:232;974:8:208;;;;;;;1880:1732:232;;;;;;;;;;;;;;713:6:351;1880:1732:232;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41;;:::i;:::-;5148:19:42;1880:1732:232;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1880:1732:232;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;1880:140:41;;:1732:232;:140:41;:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1880:1732:232;;;;1973:36:41;;;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1880:1732:232;;;3329:41;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1880:1732:232;3852:94:192;;1880:1732:232;3972:10:192;;;;;;1880:1732:232;3984:3:192;1880:1732:232;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1880:1732:232;;;;4058:76:192;;4108:25;1880:1732:232;4058:76:192;;1880:1732:232;4058:76:192;;;;;;;;;;;;1880:1732:232;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1880:1732:232;4239:12:192;;;;;;:::i;:::-;1880:1732:232;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1880:1732:232;4239:70:192;;;;;;;1880:1732:232;;;;;;;4239:70:192;;;;;1880:1732:232;4239:70:192;;4277:4;1880:1732:232;4239:70:192;;1880:1732:232;;4058:76:192;1880:1732:232;;;;;;;4239:70:192;;;;;;;1880:1732:232;4239:70:192;;;3984:3;;1880:1732:232;3961:9:192;;4239:70;1880:1732:232;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1880:1732:232;4161:50:192;1880:1732:232;;4058:76:192;1880:1732:232;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2071:115:211;;1880:1732:232;;3329:41;;;:::i;:::-;1880:1732;;;14276:18:228;;;;14272:64;;1880:1732:232;14401:42:228;14346:19;1880:1732:232;-1:-1:-1;1880:1732:232;14346:11:228;1880:1732:232;;;-1:-1:-1;1880:1732:232;;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;;;;;;;;;;;;;14401:42:228;1880:1732:232;14272:64:228;14303:33;;1880:1732:232;14303:33:228;1880:1732:232;;;;14303:33:228;2071:115:211;2931:8:352;668:81;1880:1732:232;2931:8:352;:::i;:::-;2071:115:211;;1880:1732:232;;;;;;;;;;;;;2991:23:341;1880:1732:232;;;;;;;;;;;;;;;;;;;;;2688:13:341;1880:1732:232;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1880:1732:232;-1:-1:-1;1880:1732:232;;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3329:41;;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;2976:19:351;1880:1732:232;;;;;1732:22:351;1728:93;;1880:1732:232;;583:77:341;;;;;;;1880:1732:232;;;1728:93:351;1777:33;1880:1732:232;1777:33:351;1880:1732:232;;1777:33:351;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3329:41;;:::i;:::-;1880:1732;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;3741:25:41;3737:66;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1880:1732:232;;;;2455:33:41;1880:1732:232;3737:66:41;1880:1732:232;3775:28:41;;;1880:1732:232;3775:28:41;1880:1732:232;;;;;;;3775:28:41;1880:1732:232;;;;;;;:::i;:::-;5148:19:42;;;;1880:1732:232;;;3329:41;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1880:1732:232;2776:90:192;;1880:1732:232;2892:10:192;;;;;;1880:1732:232;2904:3:192;2923:9;;;;;:::i;:::-;1880:1732:232;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1880:1732:232;;;1328:43:8;;;;;;1880:1732:232;;;;1328:43:8;;;1880:1732:232;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1880:1732:232;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1880:1732:232;;2881:9:192;;8938:146:8;9033:40;1880:1732:232;9033:40:8;1880:1732:232;;1328:43:8;1880:1732:232;9033:40:8;8942:68;1880:1732:232;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1880:1732:232;;;;;;;:::i;:::-;2380:35:209;;;;;;2376:74;;1880:1732:232;2991:23:341;1880:1732:232;;2464:10:209;:71;2460:115;;2591:9;1880:1732:232;;;;;;;2586:102:209;2602:19;;;;;;1880:1732:232;2623:3:209;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2647:30:209;1880:1732:232;2665:11:209;;;;;;:::i;:::-;1880:1732:232;;2647:30:209;1880:1732:232;;2647:30:209;;;;;:::i;:::-;;;;1880:1732:232;2591:9:209;;1880:1732:232;;;;;;;;;;2460:115:209;2544:31;1880:1732:232;2544:31:209;2464:10;1880:1732:232;;;;2544:31:209;1880:1732:232;;;;;;;;;;;;;;;3329:41;;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;2976:19:351;1880:1732:232;1281:36:351;713:6;1281:36;;1277:119;;1880:1732:232;;;;;;;;;;;;;;;1277:119:351;1340:45;1880:1732:232;1340:45:351;1880:1732:232;;;;1340:45:351;1880:1732:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1238:61:210;1880:1732:232;;;;;;:::i;:::-;;3329:41;;:::i;:::-;4464:19:41;1221:6:210;688:76:41;1880:1732:232;1221:6:210;:::i;:::-;1880:1732:232;;;;;:::i;:::-;;;;;;;1238:61:210;;:::i;:::-;1880:1732:232;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;16447:19:228;;;1880:1732:232;;16447:19:228;16129:20;;;16125:59;;1880:1732:232;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;16261:10:228;;;;;;1880:1732:232;;;;;;;;;;;;;;:::i;16273:3:228:-;16318:9;16306:30;16318:9;;1880:1732:232;16318:9:228;;;;:::i;:::-;16329:6;;;;;:::i;:::-;1880:1732:232;16306:30:228;;;:::i;:::-;16292:44;;;;:::i;:::-;1880:1732:232;;16250:9:228;;1880:1732:232;;;;;;;;;;;;;;;:::i;:::-;3329:41;;:::i;:::-;5148:19:42;1880:1732:232;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1880:1732:232;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;1254:25:41;1250:140;;1880:1732:232;1250:140:41;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1880:1732:232;;;;1343:36:41;1880:1732:232;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3329:41;;;;;:::i;:::-;3179:19:352;1880:1732:232;;;;;;;;2616:14:352;2612:76;;1880:1732:232;-1:-1:-1;;1880:1732:232;;;;;6523:16:228;;6519:59;;6629:23;;;6625:62;;6703:30;;;;;:::i;:::-;6702:31;6698:76;;1880:1732:232;6801:10:228;;;;;;1880:1732:232;;;;;;;;;;6904:44:228;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;6904:44:228;;;376:58:354;6959:111:228;;1880:1732:232;6959:111:228;1880:1732:232;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;20263:81:228;;;;;1880:1732:232;20263:81:228;;1880:1732:232;20263:81:228;;1880:1732:232;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;20263:81:228;;1880:1732:232;20263:81:228;;;;;;;;1880:1732:232;20263:81:228;1880:1732:232;20263:81:228;1880:1732:232;20263:81:228;;;6959:111;1880:1732:232;;20263:107:228;20259:181;;1880:1732:232;20259:181:228;1878:53;1880:1732:232;1878:53:228;1880:1732:232;;20391:49:228;;;;;;1880:1732:232;20391:49:228;;1880:1732:232;;;1878:53:228;;;1880:1732:232;1878:53:228;;;;:::i;:::-;;1880:1732:232;1878:53:228;;;;1880:1732:232;1878:53:228;;;;:::i;:::-;20391:49;;;20263:81;;;;1880:1732:232;20263:81:228;1880:1732:232;20263:81:228;;;;;;;:::i;:::-;;;;6813:3;6860:6;6868:9;6860:6;6868:9;6860:6;;;;1880:1732:232;6860:6:228;;;:::i;:::-;1880:1732:232;6868:9:228;;;:::i;:::-;1880:1732:232;6868:9:228;;;;;:::i;:::-;1880:1732:232;6790:9:228;;6698:76;1880:1732:232;6742:32:228;;;;1880:1732:232;6742:32:228;1880:1732:232;;;;;;;;6742:32:228;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1880:1732:232;;;;;;;;;;;;;;;941:19:75;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1880:1732:232;2499:377:351;;;2559:17;;1880:1732:232;;2499:377:351;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1880:1732:232;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1880:1732:232;2499:377:351;;2607:259;713:6;2794:57;1880:1732:232;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2991:23:341;1880:1732:232;;1716:10:209;:71;1712:115;;1842:22;;1880:1732:232;;;;;;;;1842:22:209;;;:::i;:::-;;;;1880:1732:232;;;;;;;;;;;;;;:::i;:::-;;;3329:41;;;:::i;:::-;1880:1732;;;;;4503:26:42;;;4499:64;;3179:19:352;1880:1732:232;;;;583:77:341;;;;;;;1880:1732:232;;;;;;;;;;;;;;3364:23:341;1880:1732:232;;;;3364:64:341;;1306:4:209;1880:1732:232;3364:64:341;;;1880:1732:232;;;;;;;;;;-1:-1:-1;;1880:1732:232;;;;;;;;3364:64:341;;;;;;;1880:1732:232;3364:64:341;;;1880:1732:232;;;;;;;;;;;;;;;:::i;3364:64:341:-;;;;;;;;;;:::i;:::-;;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3329:41;;:::i;:::-;1880:1732;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1880:1732:232;;;;;;1645:152:42;;1880:1732:232;-1:-1:-1;;1880:1732:232;;500:10:59;;1880:1732:232;;1124:1:42;1880:1732:232;;;;;;;;;500:10:59;1880:1732:232;;;;;;;;500:10:59;1880:1732:232;;;;;;;;500:10:59;1880:1732:232;;;;;;;;500:10:59;1880:1732:232;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;1880:1732:232;;;;;;;;;;;;;;900:21:181;;;896:88;;1880:1732:232;1124:1:42;1880:1732:232;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;1880:1732:232;583:77:341;1880:1732:232;583:77:341;;;;;;;;1880:1732:232;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;1880:1732:232;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;1880:1732:232;583:77:341;;;;;;;;;;;1880:1732:232;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;1880:1732:232;2196:23:341;1880:1732:232;;583:77:341;;;;;;;1880:1732:232;;;;1124:1:42;900:21:181;;;896:88;;1880:1732:232;;;1124:1:42;1880:1732:232;;;583:77:341;;;;;;;1880:1732:232;;;896:88:181;930:54;1880:1732:232;930:54:181;1880:1732:232;;1124:1:42;1880:1732:232;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;1880:1732:232;;583:77:341;;;;1880:1732:232;;;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;1880:1732:232;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;1880:1732:232;;;583:77:341;;;;;;;;1880:1732:232;583:77:341;;;;;;;;;;;;;;;;;;;;;1880:1732:232;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;1880:1732:232;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;1880:1732:232;;;;;;;583:77:341;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1880:1732:232;1124:1:42;583:77:341;;;;;;;;;;;;;;;;1880:1732:232;;;;;;;;;583:77:341;;;;;;;;1880:1732:232;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;1880:1732:232;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;583:77:341;;;;;;;;1880:1732:232;1740:46:42;;;;1645:152;;;;1880:1732:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3329:41;;;1880:1732;3329:41;;:::i;:::-;4464:19:41;1669:6:210;688:76:41;1880:1732:232;1669:6:210;:::i;:::-;1880:1732:232;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;;9675:16:228;;;9671:55;;1880:1732:232;;;;;9777:23:228;;9773:62;;1880:1732:232;9862:10:228;;;;;;1880:1732:232;;;;;;;;;9955:50:228;1880:1732:232;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;9955:50:228;;;376:58:354;10016:117:228;;1880:1732:232;10016:117:228;1880:1732:232;;;;;;20263:81:228;;;;;1880:1732:232;20263:81:228;;1880:1732:232;20263:81:228;;1880:1732:232;;;;;;;;;;;;;;;;;;:::i;9874:3:228:-;9911:6;9919:9;9911:6;1880:1732:232;9911:6:228;;;:::i;:::-;1880:1732:232;9919:9:228;;;;:::i;:::-;1880:1732:232;9919:9:228;;;;:::i;:::-;1880:1732:232;9851:9:228;;9671:55;9700:26;1880:1732:232;9700:26:228;1880:1732:232;;9700:26:228;1880:1732:232;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1880:1732:232;1793:19:59;1880:1732:232;635:65:55;:::i;1880:1732:232:-;;;;;;;;;;;;2650:44:211;1880:1732:232;;:::i;:::-;;;;;2650:44:211;:::i;:::-;1880:1732:232;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;1880:1732:232;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1880:1732:232;1146:19:75;1880:1732:232;1146:53:75;;;1142:96;;1880:1732:232;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1880:1732:232;1215:12:75;:::o;1880:1732:232:-;;;;;;;;;;;;:::o;15240:220:228:-;;;1880:1732:232;;;15358:19:228;15354:61;;15375:1;1880:1732:232;;;;;15375:1:228;1880:1732:232;15432:21:228;1880:1732:232;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;15240:220:228;:::o;15354:61::-;15386:29;15375:1;15386:29;;15375:1;15386:29;1359:340:59;;1880:1732:232;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1880:1732:232;500:10:59;;;;;1880:1732:232;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1880:1732:232:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1880:1732:232;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1880:1732:232;;;;;-1:-1:-1;1880:1732:232;;-1:-1:-1;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3640:170:41;1880:1732:232;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1880:1732:232;3775:28:41;;-1:-1:-1;3775:28:41;1880:1732:232;3775:28:41;1880:1732:232;;;;;-1:-1:-1;3775:28:41;1880:1732:232;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8019:415:228:-;;;;;;;1880:1732:232;;;8152:16:228;;;8148:55;;8236:5;;;;1880:1732:232;8236:5:228;;:::i;:::-;1880:1732:232;;;8166:1:228;1880:1732:232;8258:49:228;1880:1732:232;;;;;;;;;;;8258:49:228;376:58:354;8318:110:228;;8019:415;;;;;;:::o;8318:110::-;1880:1732:232;;;;;;19356:74:228;;;;;1880:1732:232;19356:74:228;;;;;1880:1732:232;8166:1:228;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19356:74:228;;8166:1;19356:74;;;;;;;;1880:1732:232;19356:74:228;1880:1732:232;19356:74:228;8166:1;19356:74;;;8318:110;1880:1732:232;;19356:101:228;19352:168;;8318:110;;;;19356:74;;;;1880:1732:232;19356:74:228;1880:1732:232;19356:74:228;;;;;;;:::i;:::-;;;;1880:1732:232;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1880:1732:232;1029:19:76;1880:1732:232;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1880:1732:232;;;;;;1676:74:76;;;;1880:1732:232;1676:74:76;;;;;;1880:1732:232;1327:10:76;1880:1732:232;;;;1744:4:76;1880:1732:232;;;;1676:74:76;;;;;;;1880:1732:232;1676:74:76;;;1630:120;;;;;1676:74;;;;1880:1732:232;1676:74:76;1880:1732:232;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;17858:421:228;;;17957:10;17953:320;;17858:421;;;;;:::o;17953:320::-;1880:1732:232;17966:1:228;1880:1732:232;;;;;17966:1:228;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;;;18123:21:228;;;;;18119:80;;1880:1732:232;;17966:1:228;1880:1732:232;;;;;17966:1:228;1880:1732:232;18217:18:228;1880:1732:232;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;17953:320:228;;;;;;18119:80;1880:1732:232;;18153:46:228;;;1880:1732:232;;;18153:46:228;;;1880:1732:232;;;;;;;;;;;;;;;;;;20391:49:228;1880:1732:232;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;1880:1732:232;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1880:1732:232;;;3613:51:352;1880:1732:232;;3613:51:352;;;;1880:1732:232;3613:51:352;;3648:4;3613:51;;;1880:1732:232;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1880:1732:232;;-1:-1:-1;3691:28:352;3613:51;;;;1880:1732:232;3613:51:352;1880:1732:232;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;16846:185:228;1880:1732:232;;;;;;;16976:16:228;;16846:185;16975:49;;;;16846:185;16968:56;;;16846:185;:::o;16975:49::-;16997:11;:18;;;1880:1732:232;;-1:-1:-1;1880:1732:232;16997:11:228;1880:1732:232;;;;-1:-1:-1;1880:1732:232;16997:27:228;1880:1732:232;-1:-1:-1;1880:1732:232;;;500:10:59;1880:1732:232;-1:-1:-1;1880:1732:232;500:10:59;;16975:49:228;;;;;17037:815;;;;17154:10;17150:696;;17037:815;;;;;:::o;17150:696::-;1880:1732:232;17163:1:228;1880:1732:232;;;;;17163:1:228;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;;;17330:29:228;;;;;17326:98;;1880:1732:232;;;;;;;17446:10:228;17442:380;;17150:696;;;;17442:380;1880:1732:232;17163:1:228;1880:1732:232;;;;;17163:1:228;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;-1:-1:-1;1880:1732:232;;;;;;17606:25:228;;;;;17602:86;;-1:-1:-1;;17163:1:228;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:380:228;;;;;;;;17602:86;1880:1732:232;;17640:48:228;;;1880:1732:232;;;17640:48:228;;;1880:1732:232;;;;;;;;;;;;;;;;;;;;;;;20391:49:228;17326:98;1880:1732:232;;17368:56:228;;;1880:1732:232;;;;;17368:56:228;;;1880:1732:232;;;;;;;;;;;;;;;;;;;20391:49:228"},"gasEstimates":{"creation":{"codeDepositCost":"3288200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"738","ROYALTY_FEE_DENOMINATOR()":"782","balanceOf(address,uint256)":"2504","balanceOfBatch(address[],uint256[])":"infinite","batchSetTokenURI(uint256[],string[])":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2917","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3201","isTrustedForwarder(address)":"infinite","metadataResolver()":"2759","name()":"infinite","operatorFilterRegistry()":"2803","owner()":"2671","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2716","safeBatchMint(address,uint256[],uint256[],bytes)":"infinite","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"infinite","safeDeliver(address[],uint256[],uint256[],bytes)":"infinite","safeMint(address,uint256,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","setTokenURI(uint256,string)":"infinite","supportsInterface(bytes4)":"2458","symbol()":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","uri(uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","balanceOf(address,uint256)":"00fdd58e","balanceOfBatch(address[],uint256[])":"4e1273f4","batchSetTokenURI(uint256[],string[])":"6706467b","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeBatchMint(address,uint256[],uint256[],bytes)":"0d6a5bbb","safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":"2eb2c2d6","safeDeliver(address[],uint256[],uint256[],bytes)":"e8ab9ccc","safeMint(address,uint256,uint256,bytes)":"5cfa9297","safeTransferFrom(address,address,uint256,uint256,bytes)":"f242432a","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","setTokenURI(uint256,string)":"162094c4","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","uri(uint256)":"0e89341c"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC1155BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155BalanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155NonApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155SafeBatchTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC1155SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC1155SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1155TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotMetadataResolver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"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\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"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\":\"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\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"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\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeDeliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"value\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"metadataURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"recipient\":\"The recipient.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"id\":\"The token identifier.\",\"owner\":\"The owner.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155NonApproved(address,address)\":[{\"params\":{\"owner\":\"The owner.\",\"sender\":\"The sender.\"}}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"params\":{\"ids\":\"The token identifiers.\",\"recipient\":\"The recipient contract.\",\"values\":\"The amounts of tokens to transfer.\"}}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"params\":{\"id\":\"The token identifier.\",\"recipient\":\"The recipient contract.\",\"value\":\"The amount of tokens to transfer.\"}}],\"ERC1155SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotMetadataResolver(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"params\":{\"from\":\"The previous tokens owner.\",\"ids\":\"The transferred tokens identifiers.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new tokens owner.\",\"values\":\"The amounts of tokens.\"}},\"TransferSingle(address,address,address,uint256,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"id\":\"The transferred token identifier.\",\"operator\":\"The initiator of the transfer.\",\"to\":\"The new token owner.\",\"value\":\"The amount of token.\"}},\"URI(string,uint256)\":{\"params\":{\"id\":\"The token identifier.\",\"value\":\"The token metadata URI.\"}}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"params\":{\"id\":\"The identifier to retrieve the balance of.\",\"owner\":\"The account to retrieve the balance of.\"},\"returns\":{\"balance\":\"The balance of `id` owned by account `owner`.\"}},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `ids` have different lengths.\",\"params\":{\"ids\":\"The identifiers to retrieve the balance of.\",\"owners\":\"The addresses of the token holders\"},\"returns\":{\"balances\":\"The balances of `ids` owned by accounts `owners`.\"}},\"batchSetTokenURI(uint256[],string[])\":{\"details\":\"Reverts if `tokenIds` and `tokenURIs` have different lengths.Reverts if the caller is not the metadata resolver.Emits a {URI} event for each token.\",\"params\":{\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"Address of the operator.\",\"owner\":\"Address of the authorisation giver.\"},\"returns\":{\"approvedForAll\":\"True if the operator is approved, false if not.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current tokens owner.\",\"ids\":\"Identifiers of the tokens to transfer.\",\"to\":\"Address of the new tokens owner.\",\"values\":\"Amounts of tokens to transfer.\"}},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"ids\":\"Identifiers of the tokens to mint.\",\"recipients\":\"Addresses of the new tokens owners.\",\"values\":\"Amounts of tokens to mint.\"}},\"safeMint(address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"id\":\"Identifier of the token to mint.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to mint.\"}},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"Current token owner.\",\"id\":\"Identifier of the token to transfer.\",\"to\":\"Address of the new token owner.\",\"value\":\"Amount of token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to approve the operator, false to revoke its approval.\",\"operator\":\"Address of the operator.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"setTokenURI(uint256,string)\":{\"details\":\"Reverts if the caller is not the metadata resolver.Emits a {URI} event.\",\"params\":{\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"uri(uint256)\":{\"details\":\"URIs are defined in RFC 3986.The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".The uri function SHOULD be used to retrieve values if no event was emitted.The uri function MUST return the same value as the latest event for an _id if it was emitted.The uri function MUST NOT be used to check for the existence of a token as it is possible for  an implementation to return a valid string even if the token does not exist.\",\"returns\":{\"metadataURI\":\"The URI associated to the token.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC1155BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC1155BalanceOverflow(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC1155MintToAddressZero()\":[{\"notice\":\"Thrown when minting tokens to the zero address.\"}],\"ERC1155NonApproved(address,address)\":[{\"notice\":\"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\"}],\"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])\":[{\"notice\":\"Thrown when a safe batch transfer is rejected by the recipient contract.\"}],\"ERC1155SafeTransferRejected(address,uint256,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC1155SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC1155TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotMetadataResolver(address)\":[{\"notice\":\"Thrown when an account is not the metadata resolver but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"notice\":\"Emitted when a batch of tokens is transferred.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when some token is transferred.\"},\"URI(string,uint256)\":{\"notice\":\"Emitted when a token metadata URI is set updated.\"}},\"kind\":\"user\",\"methods\":{\"balanceOf(address,uint256)\":{\"notice\":\"Retrieves the balance of `id` owned by account `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"notice\":\"Retrieves the balances of `ids` owned by accounts `owners`.\"},\"batchSetTokenURI(uint256[],string[])\":{\"notice\":\"Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Retrieves the approval status of an operator for a given owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeBatchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints a batch of tokens.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"Safely transfers a batch of tokens.\"},\"safeDeliver(address[],uint256[],uint256[],bytes)\":{\"notice\":\"Safely mints tokens to multiple recipients.\"},\"safeMint(address,uint256,uint256,bytes)\":{\"notice\":\"Safely mints some token.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"Safely transfers some token.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Enables or disables an operator's approval.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"setTokenURI(uint256,string)\":{\"notice\":\"Emits the URI event when a token metadata URI is set by the metadata resolver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"uri(uint256)\":{\"notice\":\"Retrieves the URI for a given token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol\":\"ERC1155FullProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155DeliverableBase is IERC1155Deliverable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC1155MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeDeliver(sender, recipients, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0xd244419d043cbf4bc72d79ddc4fdb96bc3419acd79dfababb6db33d78970dd30\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {NotMetadataResolver} from \\\"./../../metadata/errors/TokenMetadataErrors.sol\\\";\\nimport {URI} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155MetadataSetter} from \\\"./../interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\nabstract contract ERC1155MetadataBase is TokenMetadataBase, IERC1155MetadataURI, IERC1155MetadataSetter {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC1155MetadataURI\\n    function uri(uint256 tokenId) external view virtual returns (string memory metadataURI) {\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n\\n    /// @notice Emits the URI event when a token metadata URI is set by the metadata resolver.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external virtual {\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n        emit URI(tokenURI, tokenId);\\n    }\\n\\n    /// @notice Emits URI events when a batch of token metadata URIs is set by the metadata resolver.\\n    /// @dev Reverts if `tokenIds` and `tokenURIs` have different lengths.\\n    /// @dev Reverts if the caller is not the metadata resolver.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external virtual {\\n        if (tokenIds.length != tokenURIs.length) revert InconsistentArrayLengths();\\n        if (msg.sender != address(TokenMetadataStorage.layout().metadataResolver())) revert NotMetadataResolver(msg.sender);\\n\\n        for (uint256 i; i < tokenIds.length; ++i) {\\n            emit URI(tokenURIs[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x948e0f1f76b4b244a77c7166fab59f393ec117360b2fef6430ccc7386af8031b\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC1155 (Multi Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC1155MintableBase is IERC1155Mintable, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeMint(sender, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, sender);\\n        ERC1155Storage.layout().safeBatchMint(sender, to, ids, values, data);\\n    }\\n}\\n\",\"keccak256\":\"0x01f55e02f4702e2f74a6fe863d750682f1a090a0f9c33b2ec9a074870f9593b6\",\"license\":\"MIT\"},\"contracts/token/ERC1155/base/ERC1155WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {ERC1155Storage} from \\\"./../libraries/ERC1155Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC1155 Multi Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC1155WithOperatorFiltererBase is IERC1155, Context {\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeTransferFrom(sender, from, to, id, value, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeBatchTransferFrom(\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC1155Storage.layout().safeBatchTransferFrom(sender, from, to, ids, values, data);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    /// @dev Reverts with {OperatorNotAllowed} if `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC1155Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC1155Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOf(address owner, uint256 id) external view virtual returns (uint256 balance) {\\n        return ERC1155Storage.layout().balanceOf(owner, id);\\n    }\\n\\n    /// @inheritdoc IERC1155\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual returns (uint256[] memory balances) {\\n        return ERC1155Storage.layout().balanceOfBatch(owners, ids);\\n    }\\n}\\n\",\"keccak256\":\"0x7013c12b03c0523a4ab31cc9a521994cc6d3cb77ce3c13f0e1c12e79d0440ccc\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC1155SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\nerror ERC1155TransferToAddressZero();\\n\\n/// @notice Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner.\\n/// @param sender The sender.\\n/// @param owner The owner.\\nerror ERC1155NonApproved(address sender, address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155InsufficientBalance(address owner, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance.\\n/// @param recipient The recipient.\\n/// @param id The token identifier.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155BalanceOverflow(address recipient, uint256 id, uint256 balance, uint256 value);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param id The token identifier.\\n/// @param value The amount of tokens to transfer.\\nerror ERC1155SafeTransferRejected(address recipient, uint256 id, uint256 value);\\n\\n/// @notice Thrown when a safe batch transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param ids The token identifiers.\\n/// @param values The amounts of tokens to transfer.\\nerror ERC1155SafeBatchTransferRejected(address recipient, uint256[] ids, uint256[] values);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC1155BalanceOfAddressZero();\\n\",\"keccak256\":\"0x6775c643613b1deef22ecdc14910c6a48682cae9b48a91131d2481300f1328b5\",\"license\":\"MIT\"},\"contracts/token/ERC1155/errors/ERC1155MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting tokens to the zero address.\\nerror ERC1155MintToAddressZero();\\n\",\"keccak256\":\"0x0105e9296f9c7f0301e24386335ec79f953f3eb6bd011fff7fe82f52ea1d9ca4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/events/ERC1155Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when some token is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param id The transferred token identifier.\\n/// @param value The amount of token.\\nevent TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n/// @notice Emitted when a batch of tokens is transferred.\\n/// @param operator The initiator of the transfer.\\n/// @param from The previous tokens owner.\\n/// @param to The new tokens owner.\\n/// @param ids The transferred tokens identifiers.\\n/// @param values The amounts of tokens.\\nevent TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n/// @notice Emitted when a token metadata URI is set updated.\\n/// @param value The token metadata URI.\\n/// @param id The token identifier.\\nevent URI(string value, uint256 indexed id);\\n\",\"keccak256\":\"0x68076f7a001760c2b44795ea2eb01b38601a1922f4b44a72d256a19311576922\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.\\ninterface IERC1155 {\\n    /// @notice Safely transfers some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely transfers a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n\\n    /// @notice Enables or disables an operator's approval.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approved);\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(address owner, uint256 id) external view returns (uint256 balance);\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts if `owners` and `ids` have different lengths.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory balances);\\n}\\n\",\"keccak256\":\"0x06d3d6362ae5e9d35f7b75cf048876699e0dd061bb15510e964bd4f3a0138af1\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.\\ninterface IERC1155Burnable {\\n    /// @notice Burns some token.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance of `id`.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(address from, uint256 id, uint256 value) external;\\n\\n    /// @notice Burns multiple tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from`.\\n    /// @dev Reverts if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata ids, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0x622a6afac5eafe2d61e6cd16260b558d9560b9fa037c2396f2f840e184a5edfa\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0xe8ab9ccc.\\ninterface IERC1155Deliverable {\\n    /// @notice Safely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `recipients` balance overflows.\\n    /// @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event from the zero address for each transfer.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(address[] calldata recipients, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x59f29e01bb9c54a669087b9dcb72b69019e9d4cb134854650d52b35090be77f4\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Metadata URI.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.\\ninterface IERC1155MetadataURI {\\n    /// @notice Retrieves the URI for a given token.\\n    /// @dev URIs are defined in RFC 3986.\\n    /// @dev The URI MUST point to a JSON file that conforms to the \\\"ERC1155 Metadata URI JSON Schema\\\".\\n    /// @dev The uri function SHOULD be used to retrieve values if no event was emitted.\\n    /// @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.\\n    /// @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for\\n    ///  an implementation to return a valid string even if the token does not exist.\\n    /// @return metadataURI The URI associated to the token.\\n    function uri(uint256 id) external view returns (string memory metadataURI);\\n}\\n\",\"keccak256\":\"0xfec80c38d5ae10e528007d641bb79f5cf3d359fb2c2df3a0e5463059cbf80aef\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5190c92c.\\ninterface IERC1155Mintable {\\n    /// @notice Safely mints some token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance of `id` overflows.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferSingle} event.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n    /// @notice Safely mints a batch of tokens.\\n    /// @dev Reverts if `ids` and `values` have different lengths.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x9c1bcc69ef258d249484579e4bebf3a18c4314c7c5de1711cea340974c9f5913\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155TokenReceiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC1155 Multi Token Standard, Tokens Receiver.\\n/// @notice Interface for any contract that wants to support transfers from ERC1155 asset contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1155\\n/// @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.\\ninterface IERC1155TokenReceiver {\\n    /// @notice Handles the receipt of a single ERC1155 token type.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (`0xf23a6e61`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xf23a6e61` to accept the transfer, or any other value to reject it.\\n    function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n\\n    /// @notice Handles the receipt of multiple ERC1155 token types.\\n    /// @notice ERC1155 contracts MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.\\n    /// @dev Return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (`0xbc197c81`) to accept the transfer.\\n    /// @dev Return of any other value than the prescribed keccak256 generated value will result in the transaction being reverted by the caller.\\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 magicValue `0xbc197c81` to accept the transfer, or any other value to reject it.\\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 magicValue);\\n}\\n\",\"keccak256\":\"0xc84aae8e1152d36d5dac45bd5e45f7d0a80cc457f0ac9c87fc2d132b40687a51\",\"license\":\"MIT\"},\"contracts/token/ERC1155/libraries/ERC1155Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC1155SelfApprovalForAll,\\n    ERC1155TransferToAddressZero,\\n    ERC1155NonApproved,\\n    ERC1155InsufficientBalance,\\n    ERC1155BalanceOverflow,\\n    ERC1155SafeTransferRejected,\\n    ERC1155SafeBatchTransferRejected,\\n    ERC1155BalanceOfAddressZero\\n} from \\\"./../errors/ERC1155Errors.sol\\\";\\nimport {ERC1155MintToAddressZero} from \\\"./../errors/ERC1155MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {TransferSingle, TransferBatch, ApprovalForAll} from \\\"./../events/ERC1155Events.sol\\\";\\nimport {IERC1155} from \\\"./../interfaces/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"./../interfaces/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Mintable} from \\\"./../interfaces/IERC1155Mintable.sol\\\";\\nimport {IERC1155Deliverable} from \\\"./../interfaces/IERC1155Deliverable.sol\\\";\\nimport {IERC1155Burnable} from \\\"./../interfaces/IERC1155Burnable.sol\\\";\\nimport {IERC1155TokenReceiver} from \\\"./../interfaces/IERC1155TokenReceiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC1155Storage {\\n    using Address for address;\\n    using ERC1155Storage for ERC1155Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => mapping(address => uint256)) balances;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC1155.ERC1155.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC1155_SINGLE_RECEIVED = IERC1155TokenReceiver.onERC1155Received.selector;\\n    bytes4 internal constant ERC1155_BATCH_RECEIVED = IERC1155TokenReceiver.onERC1155BatchReceived.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155MetadataURI.\\n    function initERC1155MetadataURI() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155MetadataURI).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Mintable.\\n    function initERC1155Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Deliverable.\\n    function initERC1155Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC1155Burnable.\\n    function initERC1155Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC1155Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Safely transfers some token by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Current token owner.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to transfer.\\n    /// @param value Amount of token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 id, uint256 value, bytes calldata data) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        _transferToken(s, from, to, id, value);\\n\\n        emit TransferSingle(sender, from, to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, from, to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely transfers a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of any of `ids` overflows.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155BatchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to transfer.\\n    /// @param values Amounts of tokens to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchTransferFrom(\\n        Layout storage s,\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] calldata ids,\\n        uint256[] calldata values,\\n        bytes calldata data\\n    ) internal {\\n        if (to == address(0)) revert ERC1155TransferToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _transferToken(s, from, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, from, to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints some token by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeMint(address,uint256,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance of `id` overflows.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new token owner.\\n    /// @param id Identifier of the token to mint.\\n    /// @param value Amount of token to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeMint(Layout storage s, address sender, address to, uint256 id, uint256 value, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n\\n        _mintToken(s, to, id, value);\\n\\n        emit TransferSingle(sender, address(0), to, id, value);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155Received(sender, address(0), to, id, value, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC1155Mintable-safeBatchMint(address,uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if `to`'s balance overflows for one of `ids`.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155batchReceived} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param to Address of the new tokens owner.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeBatchMint(Layout storage s, address sender, address to, uint256[] memory ids, uint256[] memory values, bytes memory data) internal {\\n        if (to == address(0)) revert ERC1155MintToAddressZero();\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        for (uint256 i; i < length; ++i) {\\n            _mintToken(s, to, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, address(0), to, ids, values);\\n\\n        if (to.hasBytecode()) {\\n            _callOnERC1155BatchReceived(sender, address(0), to, ids, values, data);\\n        }\\n    }\\n\\n    /// @notice Safely mints tokens to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC1155Deliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients`, `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC1155BalanceOverflow} if one of the `recipients`' balance overflows for the associated `ids`.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if one of `recipients` is a contract and the call to\\n    ///  {IERC1155TokenReceiver-onERC1155Received} fails, reverts or is rejected.\\n    /// @dev Emits a {TransferSingle} event from the zero address for each transfer.\\n    /// @param sender The message sender.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param ids Identifiers of the tokens to mint.\\n    /// @param values Amounts of tokens to mint.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeDeliver(\\n        Layout storage s,\\n        address sender,\\n        address[] memory recipients,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) internal {\\n        uint256 length = recipients.length;\\n        if (length != ids.length || length != values.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.safeMint(sender, recipients[i], ids[i], values[i], data);\\n        }\\n    }\\n\\n    /// @notice Burns some token by a sender.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance of `id`.\\n    /// @dev Emits a {TransferSingle} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current token owner.\\n    /// @param id Identifier of the token to burn.\\n    /// @param value Amount of token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 id, uint256 value) internal {\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n        _burnToken(s, from, id, value);\\n        emit TransferSingle(sender, from, address(0), id, value);\\n    }\\n\\n    /// @notice Burns multiple tokens by a sender.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `ids` and `values` have different lengths.\\n    /// @dev Reverts with {ERC1155NonApproved} if `sender` is not `from` and has not been approved by `from`.\\n    /// @dev Reverts with {ERC1155InsufficientBalance} if `from` has an insufficient balance for any of `ids`.\\n    /// @dev Emits an {IERC1155-TransferBatch} event.\\n    /// @param sender The message sender.\\n    /// @param from Address of the current tokens owner.\\n    /// @param ids Identifiers of the tokens to burn.\\n    /// @param values Amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata ids, uint256[] calldata values) internal {\\n        uint256 length = ids.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n        if (!_isOperatable(s, from, sender)) revert ERC1155NonApproved(sender, from);\\n\\n        for (uint256 i; i < length; ++i) {\\n            _burnToken(s, from, ids[i], values[i]);\\n        }\\n\\n        emit TransferBatch(sender, from, address(0), ids, values);\\n    }\\n\\n    /// @notice Enables or disables an operator's approval by a sender.\\n    /// @dev Reverts with {ERC1155SelfApprovalForAll} if `sender` is `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator Address of the operator.\\n    /// @param approved True to approve the operator, false to revoke its approval.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC1155SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Retrieves the approval status of an operator for a given owner.\\n    /// @param owner Address of the authorisation giver.\\n    /// @param operator Address of the operator.\\n    /// @return approved True if the operator is approved, false if not.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approved) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Retrieves the balance of `id` owned by account `owner`.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The account to retrieve the balance of.\\n    /// @param id The identifier to retrieve the balance of.\\n    /// @return balance The balance of `id` owned by account `owner`.\\n    function balanceOf(Layout storage s, address owner, uint256 id) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC1155BalanceOfAddressZero();\\n        return s.balances[id][owner];\\n    }\\n\\n    /// @notice Retrieves the balances of `ids` owned by accounts `owners`.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `ids` have different lengths.\\n    /// @dev Reverts with {ERC1155BalanceOfAddressZero} if one of `owners` is the zero address.\\n    /// @param owners The addresses of the token holders\\n    /// @param ids The identifiers to retrieve the balance of.\\n    /// @return balances The balances of `ids` owned by accounts `owners`.\\n    function balanceOfBatch(Layout storage s, address[] calldata owners, uint256[] calldata ids) internal view returns (uint256[] memory balances) {\\n        uint256 length = owners.length;\\n        if (length != ids.length) revert InconsistentArrayLengths();\\n\\n        balances = new uint256[](owners.length);\\n\\n        for (uint256 i; i < length; ++i) {\\n            balances[i] = s.balanceOf(owners[i], ids[i]);\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _transferToken(Layout storage s, address from, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 fromBalance = s.balances[id][from];\\n            unchecked {\\n                uint256 newFromBalance = fromBalance - value;\\n                if (newFromBalance >= fromBalance) revert ERC1155InsufficientBalance(from, id, fromBalance, value);\\n                if (from != to) {\\n                    uint256 toBalance = s.balances[id][to];\\n                    uint256 newToBalance = toBalance + value;\\n                    if (newToBalance <= toBalance) revert ERC1155BalanceOverflow(to, id, toBalance, value);\\n\\n                    s.balances[id][from] = newFromBalance;\\n                    s.balances[id][to] = newToBalance;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _mintToken(Layout storage s, address to, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            unchecked {\\n                uint256 balance = s.balances[id][to];\\n                uint256 newBalance = balance + value;\\n                if (newBalance <= balance) revert ERC1155BalanceOverflow(to, id, balance, value);\\n                s.balances[id][to] = newBalance;\\n            }\\n        }\\n    }\\n\\n    function _burnToken(Layout storage s, address from, uint256 id, uint256 value) private {\\n        if (value != 0) {\\n            uint256 balance = s.balances[id][from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC1155InsufficientBalance(from, id, balance, value);\\n                s.balances[id][from] = newBalance;\\n            }\\n        }\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param id Identifier of the token transferred.\\n    /// @param value Value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155Received(address sender, address from, address to, uint256 id, uint256 value, bytes memory data) private {\\n        if (IERC1155TokenReceiver(to).onERC1155Received(sender, from, id, value, data) != ERC1155_SINGLE_RECEIVED)\\n            revert ERC1155SafeTransferRejected(to, id, value);\\n    }\\n\\n    /// @notice Calls {IERC1155TokenReceiver-onERC1155BatchReceived} on a target contract.\\n    /// @dev Reverts with {ERC1155SafeBatchTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param ids Identifiers of the tokens transferred.\\n    /// @param values Values transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC1155BatchReceived(\\n        address sender,\\n        address from,\\n        address to,\\n        uint256[] memory ids,\\n        uint256[] memory values,\\n        bytes memory data\\n    ) private {\\n        if (IERC1155TokenReceiver(to).onERC1155BatchReceived(sender, from, ids, values, data) != ERC1155_BATCH_RECEIVED)\\n            revert ERC1155SafeBatchTransferRejected(to, ids, values);\\n    }\\n}\\n\",\"keccak256\":\"0x90189230ab9165b9b1a5ab84d85bd6bc1a7b3aed8d0b39d1a32e4c2305b3c14e\",\"license\":\"MIT\"},\"contracts/token/ERC1155/preset/proxied/ERC1155FullProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC1155Storage} from \\\"./../../libraries/ERC1155Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC1155WithOperatorFiltererBase} from \\\"./../../base/ERC1155WithOperatorFiltererBase.sol\\\";\\nimport {ERC1155MetadataBase} from \\\"./../../base/ERC1155MetadataBase.sol\\\";\\nimport {ERC1155MintableBase} from \\\"./../../base/ERC1155MintableBase.sol\\\";\\nimport {ERC1155DeliverableBase} from \\\"./../../base/ERC1155DeliverableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC1155FullProxied is\\n    ERC1155WithOperatorFiltererBase,\\n    ERC1155MetadataBase,\\n    ERC1155MintableBase,\\n    ERC1155DeliverableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC1155Storage.init();\\n        ERC1155Storage.initERC1155MetadataURI();\\n        ERC1155Storage.initERC1155Mintable();\\n        ERC1155Storage.initERC1155Deliverable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xce01be5d1572ea6ad633a3388bb2cf816e819a0247102aa7e92405a3e2c3833f\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/errors/TokenMetadataErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the metadata resolver but is required to.\\n/// @param account The account that was checked.\\nerror NotMetadataResolver(address account);\\n\",\"keccak256\":\"0x99dfe5150e6cb793815bc4c8446ef70dd10396e2480a677576bfc984194c4f9d\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC1155BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC1155BalanceOverflow(address,uint256,uint256,uint256)":[{"notice":"Thrown when minting or transferring an amount of tokens that would overflow the recipient's balance."}],"ERC1155InsufficientBalance(address,uint256,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC1155MintToAddressZero()":[{"notice":"Thrown when minting tokens to the zero address."}],"ERC1155NonApproved(address,address)":[{"notice":"Thrown when a sender tries to transfer tokens but is neither the owner nor approved by the owner."}],"ERC1155SafeBatchTransferRejected(address,uint256[],uint256[])":[{"notice":"Thrown when a safe batch transfer is rejected by the recipient contract."}],"ERC1155SafeTransferRejected(address,uint256,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC1155SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC1155TransferToAddressZero()":[{"notice":"Thrown when transferring tokens to the zero address."}],"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotMetadataResolver(address)":[{"notice":"Thrown when an account is not the metadata resolver but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"TransferBatch(address,address,address,uint256[],uint256[])":{"notice":"Emitted when a batch of tokens is transferred."},"TransferSingle(address,address,address,uint256,uint256)":{"notice":"Emitted when some token is transferred."},"URI(string,uint256)":{"notice":"Emitted when a token metadata URI is set updated."}},"kind":"user","methods":{"balanceOf(address,uint256)":{"notice":"Retrieves the balance of `id` owned by account `owner`."},"balanceOfBatch(address[],uint256[])":{"notice":"Retrieves the balances of `ids` owned by accounts `owners`."},"batchSetTokenURI(uint256[],string[])":{"notice":"Emits URI events when a batch of token metadata URIs is set by the metadata resolver."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Retrieves the approval status of an operator for a given owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeBatchMint(address,uint256[],uint256[],bytes)":{"notice":"Safely mints a batch of tokens."},"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)":{"notice":"Safely transfers a batch of tokens."},"safeDeliver(address[],uint256[],uint256[],bytes)":{"notice":"Safely mints tokens to multiple recipients."},"safeMint(address,uint256,uint256,bytes)":{"notice":"Safely mints some token."},"safeTransferFrom(address,address,uint256,uint256,bytes)":{"notice":"Safely transfers some token."},"setApprovalForAll(address,bool)":{"notice":"Enables or disables an operator's approval."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"setTokenURI(uint256,string)":{"notice":"Emits the URI event when a token metadata URI is set by the metadata resolver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"uri(uint256)":{"notice":"Retrieves the URI for a given token."}},"version":1}}},"contracts/token/ERC20/ERC20.sol":{"ERC20":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","supportsInterface(bytes4)":"01ffc9a7","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."}},"version":1}}},"contracts/token/ERC20/ERC20BatchTransfers.sol":{"ERC20BatchTransfers":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20BatchTransfers.sol\":\"ERC20BatchTransfers\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."}},"version":1}}},"contracts/token/ERC20/ERC20Burnable.sol":{"ERC20Burnable":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address[],uint256[])":"1b9a7529","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Burnable.sol\":\"ERC20Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./base/ERC20BurnableBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Burnable is ERC20BurnableBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    constructor() {\\n        ERC20Storage.initERC20Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xc0155d693e6d3884f65f53877fb50d0678e7113f494cb71989def75115009e73\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Burnable."}},"version":1}}},"contracts/token/ERC20/ERC20Detailed.sol":{"ERC20Detailed":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","kind":"dev","methods":{"constructor":{"params":{"tokenDecimals":"The token decimals.","tokenName":"The token name.","tokenSymbol":"The token symbol."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"name()":{"returns":{"_0":"The name of the token."}},"symbol()":{"returns":{"_0":"The symbol of the token."}}},"title":"ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"tokenDecimals\":\"The token decimals.\",\"tokenName\":\"The token name.\",\"tokenSymbol\":\"The token symbol.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Initializes the storage with the token details.Marks the following ERC165 interface(s) as supported: ERC20Detailed.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Detailed.sol\":\"ERC20Detailed\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"constructor":{"notice":"Initializes the storage with the token details.Marks the following ERC165 interface(s) as supported: ERC20Detailed."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."}},"version":1}}},"contracts/token/ERC20/ERC20Metadata.sol":{"ERC20Metadata":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"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":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the contract owner."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"owner()":"8da5cb5b","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","tokenURI()":"3c130d90","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"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\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Metadata.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Metadata.sol\":\"ERC20Metadata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"owner()":{"notice":"Gets the address of the contract owner."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"tokenURI()":{"notice":"Gets the token metadata URI."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC20/ERC20Mintable.sol":{"ERC20Mintable":{"abi":[{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address[],uint256[])":"68573107","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","mint(address,uint256)":"40c10f19","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Mintable.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Mintable.sol\":\"ERC20Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20MintableBase} from \\\"./base/ERC20MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Mintable is ERC20MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    constructor() {\\n        ERC20Storage.initERC20Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x41ab17a82891d788d675cf9f92a26eada93fc2cab87469098030c409527f3875\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Mintable."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC20/ERC20Permit.sol":{"ERC20Permit":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.Note: This contract requires ERC20Detailed.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}}},"title":"ERC20 Fungible Token Standard, optional extension: Permit (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.Note: This contract requires ERC20Detailed.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Permit.\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Permit.sol\":\"ERC20Permit\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Permit."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"}},"version":1}}},"contracts/token/ERC20/ERC20Receiver.sol":{"ERC20Receiver":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"magicValue","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":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","kind":"dev","methods":{"onERC20Received(address,address,uint256,bytes)":{"details":"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.","params":{"data":"Optional additional data with no specified format.","from":"The previous tokens owner.","operator":"The initiator of the safe transfer.","value":"The amount of tokens transferred."},"returns":{"magicValue":"`bytes4(keccak256(\"onERC20Received(address,address,uint256,bytes)\"))` (`0x4fc35859`) to accept, any other value to refuse."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC20 Fungible Token Standard, Receiver (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC20Received(address,address,uint256,bytes)":"4fc35859","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC20Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"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\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"kind\":\"dev\",\"methods\":{\"onERC20Received(address,address,uint256,bytes)\":{\"details\":\"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous tokens owner.\",\"operator\":\"The initiator of the safe transfer.\",\"value\":\"The amount of tokens transferred.\"},\"returns\":{\"magicValue\":\"`bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC20 Fungible Token Standard, Receiver (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Receiver.\"},\"onERC20Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of ERC20 tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20Receiver.sol\":\"ERC20Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Receiver} from \\\"./interfaces/IERC20Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Receiver is IERC20Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0xfcf1a39ddedf6c5bc3fa134f389b98cdb17d33df14903239fe0e1c7120ec7c16\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Receiver."},"onERC20Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of ERC20 tokens."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/token/ERC20/ERC20SafeTransfers.sol":{"ERC20SafeTransfers":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/ERC20SafeTransfers.sol\":\"ERC20SafeTransfers\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."}},"version":1}}},"contracts/token/ERC20/base/ERC20Base.sol":{"ERC20Base":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20Base.sol\":\"ERC20Base\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."}},"version":1}}},"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol":{"ERC20BatchTransfersBase":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":\"ERC20BatchTransfersBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."}},"version":1}}},"contracts/token/ERC20/base/ERC20BurnableBase.sol":{"ERC20BurnableBase":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address[],uint256[])":"1b9a7529","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":\"ERC20BurnableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."}},"version":1}}},"contracts/token/ERC20/base/ERC20DetailedBase.sol":{"ERC20DetailedBase":{"abi":[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).","kind":"dev","methods":{"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"name()":{"returns":{"_0":"The name of the token."}},"symbol()":{"returns":{"_0":"The symbol of the token."}}},"title":"ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).\",\"kind\":\"dev\",\"methods\":{\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":\"ERC20DetailedBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."}},"version":1}}},"contracts/token/ERC20/base/ERC20MetadataBase.sol":{"ERC20MetadataBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}}},"title":"ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"setTokenURI(string)":"e0df5b6f","tokenURI()":"3c130d90"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":\"ERC20MetadataBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"setTokenURI(string)":{"notice":"Sets the token URI."},"tokenURI()":{"notice":"Gets the token metadata URI."}},"version":1}}},"contracts/token/ERC20/base/ERC20MintableBase.sol":{"ERC20MintableBase":{"abi":[{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires AccessControl.","errors":{"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}}},"title":"ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address[],uint256[])":"68573107","mint(address,uint256)":"40c10f19"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20MintableBase.sol\":\"ERC20MintableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."}},"version":1}}},"contracts/token/ERC20/base/ERC20PermitBase.sol":{"ERC20PermitBase":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires ERC20Detailed.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}}},"title":"ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).Note: This contract requires ERC20Detailed.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20PermitBase.sol\":\"ERC20PermitBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"}},"version":1}}},"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol":{"ERC20SafeTransfersBase":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC20 (Fungible Token Standard).\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":\"ERC20SafeTransfersBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."}},"version":1}}},"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol":{"ERC20BatchTransfersFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20BatchTransfersStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"initERC20BatchTransfersStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610cc838819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610c469081610082823960805181610a830152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80634885b2541461022c57806388d695b21461017c5763c30f1be11461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757610074610a6c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577fc05327e6000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb9036906004016102f2565b6024359167ffffffffffffffff8311610177576101ef6102219336906004016102f2565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61021b610a6c565b9061080b565b602060405160018152f35b346101775760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043573ffffffffffffffffffffffffffffffffffffffff811681036101775760243567ffffffffffffffff81116101775761029b9036906004016102f2565b916044359267ffffffffffffffff8411610177576102c06102219436906004016102f2565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102ec610a6c565b90610383565b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b91908110156103335760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036101775790565b9490929195938481036107e15780156107d85773ffffffffffffffffffffffffffffffffffffffff8716600052856020526040600020549160009560009260005b81811061054f575050505050505073ffffffffffffffffffffffffffffffffffffffff8091169316918383036103fb575b50505050565b8315610521576001018260005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141580610518575b610484575b505060207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591604051908152a3388080806103f5565b80830392808410156104d55750507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916020918460005282526040600020856000528252806040600020559161044e565b608491859187604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b50801515610449565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff61057761057283858b610323565b610362565b16801561079457610589828587610323565b358c81610654575b907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff6020949316938492604051908152a38915158061064a575b6105ee575b506001016103c4565b898703908782101561061457600090815260208c905260409020908601905560016105e5565b878b917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858a14156105e0565b50998a81019081111561076a57998c8c73ffffffffffffffffffffffffffffffffffffffff82168481146106dc575073ffffffffffffffffffffffffffffffffffffffff602094939260407fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936000908782528852208481540190555b929394505050610591565b915050888293949596979892116107345750810195949392916020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8f6106d1565b8891507fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff8c7f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b92939490918185036107e1578415610a645773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106108fd575050505050801515806108f3575b61086c575b5050505050565b80850394808610156108a957505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080610865565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415610860565b73ffffffffffffffffffffffffffffffffffffffff610920610572838589610323565b168015610a2057610932828587610323565b3580610986575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161084b565b968781019081111561076a579673ffffffffffffffffffffffffffffffffffffffff89168281146109d357509060019291604060008381528c602052208181540190555b90919250610939565b8c829c92116109ea5750908a60019392019a6109ca565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c01573233148015610c06575b610c01577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610af7575b50610af457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610bf557600091610b52575b5038610aea565b60203d602011610bee575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff821117610bc157602091839160405281010312610bbd5751908115158203610bba575038610b4b565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610b5d565b6040513d6000823e3d90fd5b503390565b5060183610610ab356fea2646970667358221220b1ec434de461881bed53082dca43092ef5dcb479172526b9d11af754550efb9764736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xCC8 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xC46 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xA83 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4885B254 EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x17C JUMPI PUSH4 0xC30F1BE1 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0xA6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0xC05327E600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH2 0x1EF PUSH2 0x221 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21B PUSH2 0xA6C JUMP JUMPDEST SWAP1 PUSH2 0x80B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x29B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x177 JUMPI PUSH2 0x2C0 PUSH2 0x221 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2EC PUSH2 0xA6C JUMP JUMPDEST SWAP1 PUSH2 0x383 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x333 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP1 SWAP3 SWAP2 SWAP6 SWAP4 DUP5 DUP2 SUB PUSH2 0x7E1 JUMPI DUP1 ISZERO PUSH2 0x7D8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x54F JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP4 AND SWAP2 DUP4 DUP4 SUB PUSH2 0x3FB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP4 ISZERO PUSH2 0x521 JUMPI PUSH1 0x1 ADD DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x518 JUMPI JUMPDEST PUSH2 0x484 JUMPI JUMPDEST POP POP PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F5 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x4D5 JUMPI POP POP PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x20 SWAP2 DUP5 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP2 PUSH2 0x44E JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x449 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x577 PUSH2 0x572 DUP4 DUP6 DUP12 PUSH2 0x323 JUMP JUMPDEST PUSH2 0x362 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x794 JUMPI PUSH2 0x589 DUP3 DUP6 DUP8 PUSH2 0x323 JUMP JUMPDEST CALLDATALOAD DUP13 DUP2 PUSH2 0x654 JUMPI JUMPDEST SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP10 ISZERO ISZERO DUP1 PUSH2 0x64A JUMPI JUMPDEST PUSH2 0x5EE JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3C4 JUMP JUMPDEST DUP10 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP13 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x5E5 JUMP JUMPDEST DUP8 DUP12 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP11 EQ ISZERO PUSH2 0x5E0 JUMP JUMPDEST POP SWAP10 DUP11 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x76A JUMPI SWAP10 DUP13 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP5 DUP2 EQ PUSH2 0x6DC JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 SWAP3 PUSH1 0x40 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP4 PUSH1 0x0 SWAP1 DUP8 DUP3 MSTORE DUP9 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP3 SWAP4 SWAP5 POP POP POP PUSH2 0x591 JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 SWAP4 SWAP5 SWAP6 SWAP7 SWAP8 SWAP9 SWAP3 GT PUSH2 0x734 JUMPI POP DUP2 ADD SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP16 PUSH2 0x6D1 JUMP JUMPDEST DUP9 SWAP2 POP PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x7E1 JUMPI DUP5 ISZERO PUSH2 0xA64 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x8FD JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x8F3 JUMPI JUMPDEST PUSH2 0x86C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x8A9 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x865 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x860 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x920 PUSH2 0x572 DUP4 DUP6 DUP10 PUSH2 0x323 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0xA20 JUMPI PUSH2 0x932 DUP3 DUP6 DUP8 PUSH2 0x323 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x986 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x84B JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x76A JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x9D3 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x939 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x9EA JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x9CA JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC01 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC06 JUMPI JUMPDEST PUSH2 0xC01 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAF7 JUMPI JUMPDEST POP PUSH2 0xAF4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xBF5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB52 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAEA JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBEE JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBC1 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0xBBD JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xBBA JUMPI POP CODESIZE PUSH2 0xB4B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 EOFCREATE 0x43 0x4D RETF PUSH2 0x881B 0xED MSTORE8 ADDMOD 0x2D 0xCA NUMBER MULMOD 0x2E CREATE2 0xDC 0xB4 PUSH26 0x172526B9D11AF754550EFB9764736F6C634300081E0033000000 ","sourceMap":"849:1074:257:-:0;;;;;;;;;;;;;-1:-1:-1;;849:1074:257;;;;-1:-1:-1;;;;;849:1074:257;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;849:1074:257;;;;;;745:39:76;;849:1074:257;;;;;;;;745:39:76;849:1074:257;;;;;;;-1:-1:-1;849:1074:257;;;;;;-1:-1:-1;849:1074:257;;;;;-1:-1:-1;849:1074:257"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":754,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":803,"id":null,"parameterSlots":3,"returnSlots":1},"fun_batchTransfer":{"entryPoint":2059,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":899,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_msgSender":{"entryPoint":2668,"id":13231,"parameterSlots":0,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":866,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2691}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80634885b2541461022c57806388d695b21461017c5763c30f1be11461003d57600080fd5b346101775760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017757610074610a6c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361014a577fc05327e6000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043567ffffffffffffffff8111610177576101cb9036906004016102f2565b6024359167ffffffffffffffff8311610177576101ef6102219336906004016102f2565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61021b610a6c565b9061080b565b602060405160018152f35b346101775760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101775760043573ffffffffffffffffffffffffffffffffffffffff811681036101775760243567ffffffffffffffff81116101775761029b9036906004016102f2565b916044359267ffffffffffffffff8411610177576102c06102219436906004016102f2565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102ec610a6c565b90610383565b9181601f840112156101775782359167ffffffffffffffff8311610177576020808501948460051b01011161017757565b91908110156103335760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036101775790565b9490929195938481036107e15780156107d85773ffffffffffffffffffffffffffffffffffffffff8716600052856020526040600020549160009560009260005b81811061054f575050505050505073ffffffffffffffffffffffffffffffffffffffff8091169316918383036103fb575b50505050565b8315610521576001018260005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141580610518575b610484575b505060207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591604051908152a3388080806103f5565b80830392808410156104d55750507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916020918460005282526040600020856000528252806040600020559161044e565b608491859187604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b50801515610449565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff61057761057283858b610323565b610362565b16801561079457610589828587610323565b358c81610654575b907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff6020949316938492604051908152a38915158061064a575b6105ee575b506001016103c4565b898703908782101561061457600090815260208c905260409020908601905560016105e5565b878b917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858a14156105e0565b50998a81019081111561076a57998c8c73ffffffffffffffffffffffffffffffffffffffff82168481146106dc575073ffffffffffffffffffffffffffffffffffffffff602094939260407fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936000908782528852208481540190555b929394505050610591565b915050888293949596979892116107345750810195949392916020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8f6106d1565b8891507fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff8c7f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b92939490918185036107e1578415610a645773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106108fd575050505050801515806108f3575b61086c575b5050505050565b80850394808610156108a957505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080610865565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415610860565b73ffffffffffffffffffffffffffffffffffffffff610920610572838589610323565b168015610a2057610932828587610323565b3580610986575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a30161084b565b968781019081111561076a579673ffffffffffffffffffffffffffffffffffffffff89168281146109d357509060019291604060008381528c602052208181540190555b90919250610939565b8c829c92116109ea5750908a60019392019a6109ca565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c01573233148015610c06575b610c01577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610af7575b50610af457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610bf557600091610b52575b5038610aea565b60203d602011610bee575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff821117610bc157602091839160405281010312610bbd5751908115158203610bba575038610b4b565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610b5d565b6040513d6000823e3d90fd5b503390565b5060183610610ab356fea2646970667358221220b1ec434de461881bed53082dca43092ef5dcb479172526b9d11af754550efb9764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4885B254 EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x17C JUMPI PUSH4 0xC30F1BE1 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH2 0x74 PUSH2 0xA6C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x14A JUMPI PUSH32 0xC05327E600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x1CB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH2 0x1EF PUSH2 0x221 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21B PUSH2 0xA6C JUMP JUMPDEST SWAP1 PUSH2 0x80B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x177 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x177 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x177 JUMPI PUSH2 0x29B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x177 JUMPI PUSH2 0x2C0 PUSH2 0x221 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2EC PUSH2 0xA6C JUMP JUMPDEST SWAP1 PUSH2 0x383 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x177 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x177 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x177 JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x333 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x177 JUMPI SWAP1 JUMP JUMPDEST SWAP5 SWAP1 SWAP3 SWAP2 SWAP6 SWAP4 DUP5 DUP2 SUB PUSH2 0x7E1 JUMPI DUP1 ISZERO PUSH2 0x7D8 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x54F JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP4 AND SWAP2 DUP4 DUP4 SUB PUSH2 0x3FB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST DUP4 ISZERO PUSH2 0x521 JUMPI PUSH1 0x1 ADD DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x518 JUMPI JUMPDEST PUSH2 0x484 JUMPI JUMPDEST POP POP PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3F5 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x4D5 JUMPI POP POP PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 PUSH1 0x20 SWAP2 DUP5 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP2 PUSH2 0x44E JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x449 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x577 PUSH2 0x572 DUP4 DUP6 DUP12 PUSH2 0x323 JUMP JUMPDEST PUSH2 0x362 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x794 JUMPI PUSH2 0x589 DUP3 DUP6 DUP8 PUSH2 0x323 JUMP JUMPDEST CALLDATALOAD DUP13 DUP2 PUSH2 0x654 JUMPI JUMPDEST SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP10 ISZERO ISZERO DUP1 PUSH2 0x64A JUMPI JUMPDEST PUSH2 0x5EE JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3C4 JUMP JUMPDEST DUP10 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x614 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP13 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x5E5 JUMP JUMPDEST DUP8 DUP12 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP11 EQ ISZERO PUSH2 0x5E0 JUMP JUMPDEST POP SWAP10 DUP11 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x76A JUMPI SWAP10 DUP13 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP5 DUP2 EQ PUSH2 0x6DC JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 SWAP5 SWAP4 SWAP3 PUSH1 0x40 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP4 PUSH1 0x0 SWAP1 DUP8 DUP3 MSTORE DUP9 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP3 SWAP4 SWAP5 POP POP POP PUSH2 0x591 JUMP JUMPDEST SWAP2 POP POP DUP9 DUP3 SWAP4 SWAP5 SWAP6 SWAP7 SWAP8 SWAP9 SWAP3 GT PUSH2 0x734 JUMPI POP DUP2 ADD SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP16 PUSH2 0x6D1 JUMP JUMPDEST DUP9 SWAP2 POP PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x7E1 JUMPI DUP5 ISZERO PUSH2 0xA64 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x8FD JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x8F3 JUMPI JUMPDEST PUSH2 0x86C JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x8A9 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x865 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x860 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x920 PUSH2 0x572 DUP4 DUP6 DUP10 PUSH2 0x323 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0xA20 JUMPI PUSH2 0x932 DUP3 DUP6 DUP8 PUSH2 0x323 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x986 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x84B JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x76A JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x9D3 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x939 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x9EA JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x9CA JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC01 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC06 JUMPI JUMPDEST PUSH2 0xC01 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xAF7 JUMPI JUMPDEST POP PUSH2 0xAF4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xBF5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB52 JUMPI JUMPDEST POP CODESIZE PUSH2 0xAEA JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xBEE JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBC1 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0xBBD JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xBBA JUMPI POP CODESIZE PUSH2 0xB4B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xAB3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB1 EOFCREATE 0x43 0x4D RETF PUSH2 0x881B 0xED MSTORE8 ADDMOD 0x2D 0xCA NUMBER MULMOD 0x2E CREATE2 0xDC 0xB4 PUSH26 0x172526B9D11AF754550EFB9764736F6C634300081E0033000000 ","sourceMap":"849:1074:257:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1640:41;;:::i;:::-;849:1074;;;;;;;3174:18:180;;;3170:53;;3173:38:280;849:1074:257;500:10:59;849:1074:257;500:10:59;;;;;;;636:1:180;500:10:59;;;849:1074:257;3170:53:180;3201:22;849:1074:257;3201:22:180;849:1074:257;;;;3201:22:180;849:1074:257;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;875:6:243;849:1074:257;;;;;;:::i;:::-;27705:19:280;;;849:1074:257;1640:41;;:::i;:::-;875:6:243;;:::i;:::-;849:1074:257;;;899:4:243;849:1074:257;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;849:1074:257;;;;;;:::i;:::-;27705:19:280;;;849:1074:257;1640:41;;:::i;:::-;1170:6:243;;:::i;849:1074:257:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;849:1074:257;;;-1:-1:-1;849:1074:257;;;;;-1:-1:-1;849:1074:257;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;849:1074:257;;;;;;;;;;;;;15707:14:280;;;;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;6808:21;;6804:67;;849:1074:257;6908:12:280;849:1074:257;-1:-1:-1;849:1074:257;;;;;-1:-1:-1;849:1074:257;;-1:-1:-1;849:1074:257;;;;-1:-1:-1;849:1074:257;;6951:37:280;6971:17;6951:37;;;:51;;;15703:90;6947:534;;15703:90;849:1074:257;;;7495:42:280;849:1074:257;;;;;;7495:42:280;15703:90;;;;;;6947:534;849:1074:257;;;7238:32:280;;;;;7234:112;;7364:19;;7495:42;7364:19;849:1074:257;7364:19:280;849:1074:257;-1:-1:-1;849:1074:257;;;;-1:-1:-1;849:1074:257;;-1:-1:-1;849:1074:257;;;;;-1:-1:-1;849:1074:257;;6947:534:280;;;7234:112;7279:67;849:1074:257;;;;;;7279:67:280;;;;;;;849:1074:257;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;6838:33;;14132:1;6838:33;;849:1074:257;;14132:1:280;6838:33;14293:3;849:1074:257;14325:13:280;;;;;;:::i;:::-;;:::i;:::-;849:1074:257;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;849:1074:257;14472:10:280;;14468:656;;14293:3;849:1074:257;15143:25:280;849:1074:257;;;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;849:1074:257;;14270:9:280;;15183:500;849:1074:257;;;15437:21:280;;;;;15433:85;;-1:-1:-1;849:1074:257;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;849:1074:257;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;849:1074:257;;;;;14602:27:280;;;;14598:74;;849:1074:257;;;;;;14746:10:280;;;;;14784:14;849:1074:257;;14784:14:280;;;849:1074:257;15143:25:280;14784:14;-1:-1:-1;849:1074:257;;;;;;;;;;;;;14742:350:280;14468:656;;;;;;;;14742:350;14866:15;;;;;;;;;;;;;14862:74;;-1:-1:-1;849:1074:257;;;;;;;;;15143:25:280;849:1074:257;;14742:350:280;;14862:74;14890:46;;;;14132:1;14890:46;;849:1074:257;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;849:1074:257;14381:32:280;;14132:1;14381:32;849:1074:257;14381:32:280;849:1074:257;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;14045:62::-;14081:26;;;;;;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;849:1074:257;;;-1:-1:-1;849:1074:257;;;;;-1:-1:-1;849:1074:257;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;849:1074:257;;;12409:21:280;;;;;12405:85;;12508:16;;849:1074:257;;-1:-1:-1;849:1074:257;;;;-1:-1:-1;849:1074:257;;;;;12171:472:280;;;;;;;12405:85;849:1074:257;12439:51:280;;11116:1;12439:51;849:1074:257;12439:51:280;849:1074:257;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;849:1074:257;11309:13:280;;;;;;:::i;:::-;849:1074:257;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;849:1074:257;11455:10:280;11451:656;;11277:3;849:1074:257;;;;;;;;;12125:25:280;849:1074:257;;;;12125:25:280;;849:1074:257;11254:9:280;;11451:656;849:1074:257;;;;11585:27:280;;;;11581:74;;849:1074:257;;;;11729:10:280;;;;;11767:14;;849:1074:257;11767:14:280;;849:1074:257;-1:-1:-1;849:1074:257;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;849:1074:257;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;849:1074:257;;;;;;11116:1:280;11873:46;11336:61;849:1074:257;11365:32:280;;11116:1;11365:32;849:1074:257;11365:32:280;849:1074:257;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;907:917:76:-;849:1074:257;1029:19:76;849:1074:257;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;849:1074:257;;;;;;1676:74:76;;;;849:1074:257;1676:74:76;;;;;;849:1074:257;1327:10:76;849:1074:257;;;;1744:4:76;849:1074:257;;;;1676:74:76;;;;;;;849:1074:257;1676:74:76;;;1630:120;;;;;1676:74;849:1074:257;1676:74:76;849:1074:257;1676:74:76;;;;849:1074:257;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;849:1074:257;;;;;;;;;;;;;1676:74:76;;;;849:1074:257;;;;;;;;;;;;;;1676:74:76;849:1074:257;;1676:74:76;;;;;;849:1074:257;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"628400","executionCost":"infinite","totalCost":"infinite"},"external":{"batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","initERC20BatchTransfersStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","initERC20BatchTransfersStorage()":"c30f1be1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20BatchTransfersStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"initERC20BatchTransfersStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"initERC20BatchTransfersStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol\":\"ERC20BatchTransfersFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20BatchTransfersFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../base/ERC20BatchTransfersBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20BatchTransfersFacet is ERC20BatchTransfersBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20BatchTransfersStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x08b4875c774ccc3935f876026eaa72b246d0ee773d6e69f974c826b549dfdfa5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"initERC20BatchTransfersStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."}},"version":1}}},"contracts/token/ERC20/facets/ERC20BurnableFacet.sol":{"ERC20BurnableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"initERC20BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC20 Fungible Token Standard, optional extension: Burnable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610a7138819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516109ef90816100828239608051816106780152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80631b9a7529146102b057806342966c681461024c578063751ec2d314610112576379cc67901461004857600080fd5b3461010d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5760043573ffffffffffffffffffffffffffffffffffffffff811680820361010d576100f091602435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90836100cb610661565b9173ffffffffffffffffffffffffffffffffffffffff8316036100fb575b5050610540565b602060405160018152f35b610106918484610805565b38836100e9565b600080fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610149610661565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021f577f20c07ed1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d576100f06004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102aa610661565b90610540565b3461010d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5760043567ffffffffffffffff811161010d576102ff903690600401610355565b6024359167ffffffffffffffff831161010d576103236100f0933690600401610355565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61034f610661565b906103c5565b9181601f8401121561010d5782359167ffffffffffffffff831161010d576020808501948460051b01011161010d57565b91908110156103965760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9390929480860361051657851561050e5760009560005b8181106103fd57505050505050816103f2575050565b600201908154039055565b610408818387610386565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361010d57610433838688610386565b3590818973ffffffffffffffffffffffffffffffffffffffff811685036104fc575b509050610494575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a3016103dc565b98604060008381528a60205220548a810390808210156104c65750600083815260208b9052604090205589019861045d565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610506928c610805565b388189610455565b505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b8261058e575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610615575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610546565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107f65732331480156107fb575b6107f6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106ec575b506106e957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156107ea57600091610747575b50386106df565b60203d6020116107e3575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176107b6576020918391604052810103126107b257519081151582036107af575038610740565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610752565b6040513d6000823e3d90fd5b503390565b50601836106106a8565b92909173ffffffffffffffffffffffffffffffffffffffff169283156109755760010173ffffffffffffffffffffffffffffffffffffffff831660005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314158061096c575b6108cf575b505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808303928084101561091357505073ffffffffffffffffffffffffffffffffffffffff83811660009081526020928352604080822087835284529020839055610888565b60849185918773ffffffffffffffffffffffffffffffffffffffff604051947f137ad6ab000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b50801515610883565b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea264697066735822122093a956c81b88c4b53a7b63bc3e14f606d74ea0efa8e9816ac1f69db25dbf9b4a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xA71 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x9EF SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x678 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x24C JUMPI DUP1 PUSH4 0x751EC2D3 EQ PUSH2 0x112 JUMPI PUSH4 0x79CC6790 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x10D JUMPI PUSH2 0xF0 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 DUP4 PUSH2 0xCB PUSH2 0x661 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFB JUMPI JUMPDEST POP POP PUSH2 0x540 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x106 SWAP2 DUP5 DUP5 PUSH2 0x805 JUMP JUMPDEST CODESIZE DUP4 PUSH2 0xE9 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x149 PUSH2 0x661 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21F JUMPI PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0xF0 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2AA PUSH2 0x661 JUMP JUMPDEST SWAP1 PUSH2 0x540 JUMP JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0x2FF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x355 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH2 0x323 PUSH2 0xF0 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x355 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x34F PUSH2 0x661 JUMP JUMPDEST SWAP1 PUSH2 0x3C5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x10D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x396 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP4 SWAP1 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x516 JUMPI DUP6 ISZERO PUSH2 0x50E JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3FD JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3F2 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x408 DUP2 DUP4 DUP8 PUSH2 0x386 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x10D JUMPI PUSH2 0x433 DUP4 DUP7 DUP9 PUSH2 0x386 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x4FC JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x494 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3DC JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x4C6 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x45D JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x506 SWAP3 DUP13 PUSH2 0x805 JUMP JUMPDEST CODESIZE DUP2 DUP10 PUSH2 0x455 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x58E JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x615 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x546 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7F6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7FB JUMPI JUMPDEST PUSH2 0x7F6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6EC JUMPI JUMPDEST POP PUSH2 0x6E9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7EA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x747 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6DF JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7E3 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x7B6 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x7B2 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x7AF JUMPI POP CODESIZE PUSH2 0x740 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x752 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6A8 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x975 JUMPI PUSH1 0x1 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x96C JUMPI JUMPDEST PUSH2 0x8CF JUMPI JUMPDEST POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x913 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP8 DUP4 MSTORE DUP5 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x888 JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x883 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP4 0xA9 JUMP 0xC8 SHL DUP9 0xC4 0xB5 GASPRICE PUSH28 0x63BC3E14F606D74EA0EFA8E9816AC1F69DB25DBF9B4A64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"830:1044:258:-:0;;;;;;;;;;;;;-1:-1:-1;;830:1044:258;;;;-1:-1:-1;;;;;830:1044:258;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;830:1044:258;;;;;;745:39:76;;830:1044:258;;;;;;;;745:39:76;830:1044:258;;;;;;;-1:-1:-1;830:1044:258;;;;;;-1:-1:-1;830:1044:258;;;;;-1:-1:-1;830:1044:258"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":853,"id":null,"parameterSlots":2,"returnSlots":2},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":902,"id":null,"parameterSlots":3,"returnSlots":1},"fun_batchBurnFrom":{"entryPoint":965,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_burn":{"entryPoint":1344,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":2053,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_msgSender":{"entryPoint":1633,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1656}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80631b9a7529146102b057806342966c681461024c578063751ec2d314610112576379cc67901461004857600080fd5b3461010d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5760043573ffffffffffffffffffffffffffffffffffffffff811680820361010d576100f091602435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90836100cb610661565b9173ffffffffffffffffffffffffffffffffffffffff8316036100fb575b5050610540565b602060405160018152f35b610106918484610805565b38836100e9565b600080fd5b3461010d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d57610149610661565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021f577f20c07ed1000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461010d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d576100f06004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6102aa610661565b90610540565b3461010d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010d5760043567ffffffffffffffff811161010d576102ff903690600401610355565b6024359167ffffffffffffffff831161010d576103236100f0933690600401610355565b9290917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61034f610661565b906103c5565b9181601f8401121561010d5782359167ffffffffffffffff831161010d576020808501948460051b01011161010d57565b91908110156103965760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9390929480860361051657851561050e5760009560005b8181106103fd57505050505050816103f2575050565b600201908154039055565b610408818387610386565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361010d57610433838688610386565b3590818973ffffffffffffffffffffffffffffffffffffffff811685036104fc575b509050610494575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a3016103dc565b98604060008381528a60205220548a810390808210156104c65750600083815260208b9052604090205589019861045d565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b610506928c610805565b388189610455565b505050505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b8261058e575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610615575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610546565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156107f65732331480156107fb575b6107f6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106ec575b506106e957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156107ea57600091610747575b50386106df565b60203d6020116107e3575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176107b6576020918391604052810103126107b257519081151582036107af575038610740565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610752565b6040513d6000823e3d90fd5b503390565b50601836106106a8565b92909173ffffffffffffffffffffffffffffffffffffffff169283156109755760010173ffffffffffffffffffffffffffffffffffffffff831660005280602052604060002084600052602052604060002054917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8314158061096c575b6108cf575b505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808303928084101561091357505073ffffffffffffffffffffffffffffffffffffffff83811660009081526020928352604080822087835284529020839055610888565b60849185918773ffffffffffffffffffffffffffffffffffffffff604051947f137ad6ab000000000000000000000000000000000000000000000000000000008652166004850152602484015260448301526064820152fd5b50801515610883565b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea264697066735822122093a956c81b88c4b53a7b63bc3e14f606d74ea0efa8e9816ac1f69db25dbf9b4a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x24C JUMPI DUP1 PUSH4 0x751EC2D3 EQ PUSH2 0x112 JUMPI PUSH4 0x79CC6790 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x10D JUMPI PUSH2 0xF0 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 DUP4 PUSH2 0xCB PUSH2 0x661 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFB JUMPI JUMPDEST POP POP PUSH2 0x540 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x106 SWAP2 DUP5 DUP5 PUSH2 0x805 JUMP JUMPDEST CODESIZE DUP4 PUSH2 0xE9 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0x149 PUSH2 0x661 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21F JUMPI PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH2 0xF0 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2AA PUSH2 0x661 JUMP JUMPDEST SWAP1 PUSH2 0x540 JUMP JUMPDEST CALLVALUE PUSH2 0x10D JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x10D JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10D JUMPI PUSH2 0x2FF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x355 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH2 0x323 PUSH2 0xF0 SWAP4 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x355 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x34F PUSH2 0x661 JUMP JUMPDEST SWAP1 PUSH2 0x3C5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x10D JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x10D JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x10D JUMPI JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x396 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP4 SWAP1 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x516 JUMPI DUP6 ISZERO PUSH2 0x50E JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3FD JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3F2 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x408 DUP2 DUP4 DUP8 PUSH2 0x386 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x10D JUMPI PUSH2 0x433 DUP4 DUP7 DUP9 PUSH2 0x386 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x4FC JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x494 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3DC JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x4C6 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x45D JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x506 SWAP3 DUP13 PUSH2 0x805 JUMP JUMPDEST CODESIZE DUP2 DUP10 PUSH2 0x455 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x58E JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x615 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x546 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x7F6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x7FB JUMPI JUMPDEST PUSH2 0x7F6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6EC JUMPI JUMPDEST POP PUSH2 0x6E9 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x7EA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x747 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6DF JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x7E3 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x7B6 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x7B2 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x7AF JUMPI POP CODESIZE PUSH2 0x740 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x752 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x6A8 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x975 JUMPI PUSH1 0x1 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 EQ ISZERO DUP1 PUSH2 0x96C JUMPI JUMPDEST PUSH2 0x8CF JUMPI JUMPDEST POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP4 SUB SWAP3 DUP1 DUP5 LT ISZERO PUSH2 0x913 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP8 DUP4 MSTORE DUP5 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x888 JUMP JUMPDEST PUSH1 0x84 SWAP2 DUP6 SWAP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP5 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x883 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP4 0xA9 JUMP 0xC8 SHL DUP9 0xC4 0xB5 GASPRICE PUSH28 0x63BC3E14F606D74EA0EFA8E9816AC1F69DB25DBF9B4A64736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"830:1044:258:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24144:5:280;830:1044:258;;;27705:19:280;830:1044:258;1591:41;;;;:::i;:::-;830:1044;;;;24041:14:280;24037:85;;830:1044:258;24144:5:280;;;:::i;:::-;830:1044:258;;;;;;;24037:85:280;24105:5;;;;;:::i;:::-;24037:85;;;;830:1044:258;;;;;;;;;;;;;;;1591:41;;:::i;:::-;830:1044;;;;;;;3174:18:180;;;3170:53;;3920:32:280;830:1044:258;500:10:59;830:1044:258;500:10:59;;;;;;;636:1:180;500:10:59;;;830:1044:258;3170:53:180;3201:22;830:1044:258;3201:22:180;830:1044:258;;;;3201:22:180;830:1044:258;;;;;;;;;;;765:5:244;830:1044:258;;;1591:41;;:::i;:::-;765:5:244;;:::i;830:1044:258:-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1232:6:244;830:1044:258;;;;;;:::i;:::-;27705:19:280;;;830:1044:258;1591:41;;:::i;:::-;1232:6:244;;:::i;830:1044:258:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;25152:1242:280;;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;830:1044:258;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;:::i;:::-;830:1044:258;;;;;;;;;;25558:9:280;;;;;:::i;:::-;830:1044:258;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;830:1044:258;;;26163:33:280;830:1044:258;25409:1:280;830:1044:258;;;;;;26163:33:280;830:1044:258;25462:9:280;;25689:455;25741:16;830:1044:258;-1:-1:-1;830:1044:258;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;830:1044:258;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;830:1044:258;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;25322:62::-;25358:26;;;;;;22659:524;22743:10;22739:389;;22659:524;830:1044:258;;23143:33:280;830:1044:258;;22752:1:280;830:1044:258;;;;;;;23143:33:280;;22659:524::o;22739:389::-;830:1044:258;;;-1:-1:-1;830:1044:258;;;;;-1:-1:-1;830:1044:258;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;830:1044:258;;;22752:1:280;830:1044:258;;;;;;;;;;;23044:8:280;;830:1044:258;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;830:1044:258;22933:46:280;;22752:1;22933:46;830:1044:258;22933:46:280;830:1044:258;;;;;;22752:1:280;22933:46;907:917:76;830:1044:258;1029:19:76;830:1044:258;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;830:1044:258;;;;;;1676:74:76;;;;830:1044:258;1676:74:76;;;;;;830:1044:258;1327:10:76;830:1044:258;;;;1744:4:76;830:1044:258;;;;1676:74:76;;;;;;;830:1044:258;1676:74:76;;;1630:120;;;;;1676:74;830:1044:258;1676:74:76;830:1044:258;1676:74:76;;;;830:1044:258;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;830:1044:258;;;;;;;;;;;;;1676:74:76;;;;830:1044:258;;;;;;;;;;;;;;1676:74:76;830:1044:258;;1676:74:76;;;;;;830:1044:258;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;6693:851:280;;;;830:1044:258;;6808:21:280;;;6804:67;;6908:12;;830:1044:258;;;-1:-1:-1;830:1044:258;;;;;-1:-1:-1;830:1044:258;;-1:-1:-1;830:1044:258;;;;-1:-1:-1;830:1044:258;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;830:1044:258;;;;;7495:42:280;830:1044:258;;;;;;;7495:42:280;;6693:851::o;6947:534::-;830:1044:258;;;7238:32:280;;;;;7234:112;;-1:-1:-1;;830:1044:258;;;;-1:-1:-1;830:1044:258;;;;;;;;;;;;;;;;;;;;;6947:534:280;;7234:112;7279:67;830:1044:258;;;;;;;7279:67:280;;;;830:1044:258;7279:67:280;;;830:1044:258;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;830:1044:258;6838:33:280;;6827:1;6838:33;830:1044:258;6838:33:280;830:1044:258;;6827:1:280;6838:33"},"gasEstimates":{"creation":{"codeDepositCost":"508600","executionCost":"infinite","totalCost":"infinite"},"external":{"batchBurnFrom(address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","initERC20BurnableStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchBurnFrom(address[],uint256[])":"1b9a7529","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","initERC20BurnableStorage()":"751ec2d3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"initERC20BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Burnable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"initERC20BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20BurnableFacet.sol\":\"ERC20BurnableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./../base/ERC20BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20BurnableFacet is ERC20BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xdcb63788435fc859e6c25ecaf185c86e9b63f25937be03eb3e8f381a2ecc8407\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"initERC20BurnableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Burnable."}},"version":1}}},"contracts/token/ERC20/facets/ERC20DetailedFacet.sol":{"ERC20DetailedFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"initERC20DetailedStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"initERC20DetailedStorage(string,string,uint8)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"tokenDecimals":"The token decimals.","tokenName":"The token name.","tokenSymbol":"The token symbol."}},"name()":{"returns":{"_0":"The name of the token."}},"symbol()":{"returns":{"_0":"The symbol of the token."}}},"title":"ERC20 Fungible Token Standard, optional extension: Detailed (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610ba938819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610b2790816100828239608051816109c50152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610767578063313ce5671461070957806395d89b411461069e5763ef9612791461004857600080fd5b346106995760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106995760043567ffffffffffffffff81116106995761009790369060040161082a565b60243567ffffffffffffffff8111610699576100b790369060040161082a565b90926044359260ff8416809403610699576100d06109ae565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361066c57507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81917fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb7454600181101561063a575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff821161050b5781906101a08454610858565b601f81116105e7575b50600090601f83116001146105455760009261053a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161050b5761022b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254610858565b601f8111610487575b506000601f821160011461038c57819293600092610381575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a025000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050388061024d565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b86811061046f5750836001959610610437575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a825561029f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905538808061040a565b909260206001819286860135815501940191016103f7565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610501575b601f0160051c01905b8181106104f55750610234565b600081556001016104e8565b90915081906104df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101c0565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105cf5750908460019594939210610597575b505050811b0190556101f2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905538808061058a565b91936020600181928787013581550195019201610574565b909150836000526020600020601f840160051c81019160208510610630575b90601f859493920160051c01905b81811061062157506101a9565b60008155849350600101610614565b9091508190610606565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610699576107056106f97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826108ec565b604051918291826107c2565b0390f35b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261069957602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610699576107056106f97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816108ec565b9190916020815282519283602083015260005b8481106108145750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016107d5565b9181601f840112156106995782359167ffffffffffffffff8311610699576020838186019501011161069957565b90600182811c921680156108a1575b602083101461087257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610867565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761050b57604052565b906040519182600082549261090084610858565b808452936001811690811561096e5750600114610927575b50610925925003836108ab565b565b90506000929192526020600020906000915b8183106109525750509060206109259282010138610918565b6020919350806001915483858901015201910190918492610939565b602093506109259592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610918565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ae2573233148015610ae7575b610ae2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a39575b50610a3657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ad657600091610a94575b5038610a2c565b6020813d602011610ace575b81610aad602093836108ab565b81010312610aca5751908115158203610ac7575038610a8d565b80fd5b5080fd5b3d9150610aa0565b6040513d6000823e3d90fd5b503390565b50601836106109f556fea26469706673582212202f36e0d3eb137db62a6851555304e3fbc2ed3671ceaa46c567850aa84ef1881864736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xBA9 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB27 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x9C5 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x767 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x709 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x69E JUMPI PUSH4 0xEF961279 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x699 JUMPI PUSH2 0x97 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x82A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x699 JUMPI PUSH2 0xB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x82A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0xFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x699 JUMPI PUSH2 0xD0 PUSH2 0x9AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x66C JUMPI POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP2 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x63A JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x50B JUMPI DUP2 SWAP1 PUSH2 0x1A0 DUP5 SLOAD PUSH2 0x858 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5E7 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x545 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x53A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x50B JUMPI PUSH2 0x22B PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x858 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x487 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x38C JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x381 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24D JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x46F JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x437 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x29F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x40A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x3F7 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x501 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4F5 JUMPI POP PUSH2 0x234 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4E8 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4DF JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1C0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5CF JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x597 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x1F2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x58A JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x574 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x630 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x621 JUMPI POP PUSH2 0x1A9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x614 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x606 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH2 0x705 PUSH2 0x6F9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x7C2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH2 0x705 PUSH2 0x6F9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x8EC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x814 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x7D5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x699 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x699 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x699 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x8A1 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x872 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x867 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x50B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x900 DUP5 PUSH2 0x858 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x96E JUMPI POP PUSH1 0x1 EQ PUSH2 0x927 JUMPI JUMPDEST POP PUSH2 0x925 SWAP3 POP SUB DUP4 PUSH2 0x8AB JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x952 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x925 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x918 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x939 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x925 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x918 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAE2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAE7 JUMPI JUMPDEST PUSH2 0xAE2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA39 JUMPI JUMPDEST POP PUSH2 0xA36 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xAD6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA94 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA2C JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xACE JUMPI JUMPDEST DUP2 PUSH2 0xAAD PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8AB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xACA JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xAC7 JUMPI POP CODESIZE PUSH2 0xA8D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xAA0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9F5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F CALLDATASIZE RJUMP 0xD3EB SGT PUSH30 0xB62A6851555304E3FBC2ED3671CEAA46C567850AA84EF1881864736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"779:1145:259:-:0;;;;;;;;;;;;;-1:-1:-1;;779:1145:259;;;;-1:-1:-1;;;;;779:1145:259;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;779:1145:259;;;;;;745:39:76;;779:1145:259;;;;;;;;745:39:76;779:1145:259;;;;;;;-1:-1:-1;779:1145:259;;;;;;-1:-1:-1;779:1145:259;;;;;-1:-1:-1;779:1145:259"},"deployedBytecode":{"functionDebugData":{"abi_decode_string_calldata":{"entryPoint":2090,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":1986,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":2284,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":2136,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2219,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2478,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2501}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde0314610767578063313ce5671461070957806395d89b411461069e5763ef9612791461004857600080fd5b346106995760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106995760043567ffffffffffffffff81116106995761009790369060040161082a565b60243567ffffffffffffffff8111610699576100b790369060040161082a565b90926044359260ff8416809403610699576100d06109ae565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361066c57507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81917fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb7454600181101561063a575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff821161050b5781906101a08454610858565b601f81116105e7575b50600090601f83116001146105455760009261053a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff811161050b5761022b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254610858565b601f8111610487575b506000601f821160011461038c57819293600092610381575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a025000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050388061024d565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b86811061046f5750836001959610610437575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a825561029f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905538808061040a565b909260206001819286860135815501940191016103f7565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610501575b601f0160051c01905b8181106104f55750610234565b600081556001016104e8565b90915081906104df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101c0565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105cf5750908460019594939210610597575b505050811b0190556101f2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905538808061058a565b91936020600181928787013581550195019201610574565b909150836000526020600020601f840160051c81019160208510610630575b90601f859493920160051c01905b81811061062157506101a9565b60008155849350600101610614565b9091508190610606565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610699576107056106f97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826108ec565b604051918291826107c2565b0390f35b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261069957602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346106995760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610699576107056106f97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816108ec565b9190916020815282519283602083015260005b8481106108145750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016107d5565b9181601f840112156106995782359167ffffffffffffffff8311610699576020838186019501011161069957565b90600182811c921680156108a1575b602083101461087257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610867565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761050b57604052565b906040519182600082549261090084610858565b808452936001811690811561096e5750600114610927575b50610925925003836108ab565b565b90506000929192526020600020906000915b8183106109525750509060206109259282010138610918565b6020919350806001915483858901015201910190918492610939565b602093506109259592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610918565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ae2573233148015610ae7575b610ae2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610a39575b50610a3657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ad657600091610a94575b5038610a2c565b6020813d602011610ace575b81610aad602093836108ab565b81010312610aca5751908115158203610ac7575038610a8d565b80fd5b5080fd5b3d9150610aa0565b6040513d6000823e3d90fd5b503390565b50601836106109f556fea26469706673582212202f36e0d3eb137db62a6851555304e3fbc2ed3671ceaa46c567850aa84ef1881864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x767 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x709 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x69E JUMPI PUSH4 0xEF961279 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x699 JUMPI PUSH2 0x97 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x82A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x699 JUMPI PUSH2 0xB7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x82A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH1 0xFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x699 JUMPI PUSH2 0xD0 PUSH2 0x9AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x66C JUMPI POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP2 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x63A JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x50B JUMPI DUP2 SWAP1 PUSH2 0x1A0 DUP5 SLOAD PUSH2 0x858 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5E7 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x545 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x53A JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x50B JUMPI PUSH2 0x22B PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x858 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x487 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x38C JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x381 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x24D JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x46F JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x437 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x29F JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x40A JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x3F7 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x501 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x4F5 JUMPI POP PUSH2 0x234 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4E8 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4DF JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1C0 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5CF JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x597 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x1F2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x58A JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x574 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x630 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x621 JUMPI POP PUSH2 0x1A9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x614 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x606 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH2 0x705 PUSH2 0x6F9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x7C2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x699 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x699 JUMPI PUSH2 0x705 PUSH2 0x6F9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x8EC JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x814 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x7D5 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x699 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x699 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x699 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x8A1 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x872 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x867 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x50B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x900 DUP5 PUSH2 0x858 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x96E JUMPI POP PUSH1 0x1 EQ PUSH2 0x927 JUMPI JUMPDEST POP PUSH2 0x925 SWAP3 POP SUB DUP4 PUSH2 0x8AB JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x952 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x925 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x918 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x939 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x925 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x918 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xAE2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xAE7 JUMPI JUMPDEST PUSH2 0xAE2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xA39 JUMPI JUMPDEST POP PUSH2 0xA36 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xAD6 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xA94 JUMPI JUMPDEST POP CODESIZE PUSH2 0xA2C JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xACE JUMPI JUMPDEST DUP2 PUSH2 0xAAD PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8AB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xACA JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xAC7 JUMPI POP CODESIZE PUSH2 0xA8D JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xAA0 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x9F5 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F CALLDATASIZE RJUMP 0xD3EB SGT PUSH30 0xB62A6851555304E3FBC2ED3671CEAA46C567850AA84EF1881864736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"779:1145:259:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;1814:12;;:::i;:::-;779:1145;;;;;;;3174:18:180;;;3170:53;;3848:19:277;779:1145:259;;;;636:1:180;900:21:181;;;896:88;;779:1145:259;636:1:180;779:1145:259;;;791:79:277;;;;;;;;;;:::i;:::-;;;;;;779:1145:259;791:79:277;779:1145:259;791:79:277;;;;;;;;779:1145:259;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;779:1145:259;791:79:277;;;;;2461:13;791:79;;:::i;:::-;;;;;;;;779:1145:259;791:79:277;;;;;;;;;;779:1145:259;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;2461:13;791:79;;;2498:15;791:79;;;2498:15;791:79;2596:32;779:1145:259;500:10:59;779:1145:259;;500:10:59;779:1145:259;;500:10:59;636:1:180;791:79:277;500:10:59;;791:79:277;;500:10:59;;779:1145:259;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;2461:13;779:1145:259;;791:79:277;;;;779:1145:259;;;791:79:277;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;;2461:13;791:79;;;;;;;;;;;;;;;;;;;;;;;;;;779:1145:259;636:1:180;791:79:277;;;;;;;;;;;;;;;;2461:13;779:1145:259;;;791:79:277;;;;;;;;779:1145:259;791:79:277;;;;;;;;;;;;;;;;;;;;;779:1145:259;791:79:277;;636:1:180;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;;779:1145:259;;;;;;;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;;;;;779:1145:259;;;;;;;791:79:277;;;;;;;;;;;636:1:180;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;779:1145:259;636:1:180;791:79:277;;;;;;;;;;;;;;;;779:1145:259;;;;;;;;;791:79:277;;;;;;;;779:1145:259;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;779:1145:259;791:79:277;;;;-1:-1:-1;636:1:180;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;896:88:181;930:54;779:1145:259;930:54:181;779:1145:259;;636:1:180;779:1145:259;;;;930:54:181;3170:53:180;3201:22;779:1145:259;3201:22:180;779:1145:259;;;;3201:22:180;779:1145:259;;;;;;;;;;;;;;;;;3091:13:277;779:1145:259;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3732:15:277;779:1145:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;779:1145:259;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;779:1145:259;;;;;-1:-1:-1;779:1145:259;;-1:-1:-1;779:1145:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;907:917:76;779:1145:259;1029:19:76;779:1145:259;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;779:1145:259;;;;;;1676:74:76;;;;779:1145:259;1676:74:76;;;;;;779:1145:259;1327:10:76;779:1145:259;;;;1744:4:76;779:1145:259;;;;1676:74:76;;;;;;;779:1145:259;1676:74:76;;;1630:120;;;;;1676:74;779:1145:259;1676:74:76;;779:1145:259;1676:74:76;;;;;;779:1145:259;1676:74:76;;;:::i;:::-;;;779:1145:259;;;;;;;;;;;;;1676:74:76;;;;779:1145:259;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;779:1145:259;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"571000","executionCost":"infinite","totalCost":"infinite"},"external":{"decimals()":"2275","initERC20DetailedStorage(string,string,uint8)":"infinite","name()":"infinite","symbol()":"infinite"}},"methodIdentifiers":{"decimals()":"313ce567","initERC20DetailedStorage(string,string,uint8)":"ef961279","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"initERC20DetailedStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"initERC20DetailedStorage(string,string,uint8)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"tokenDecimals\":\"The token decimals.\",\"tokenName\":\"The token name.\",\"tokenSymbol\":\"The token symbol.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Detailed (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"initERC20DetailedStorage(string,string,uint8)\":{\"notice\":\"Initializes the storage with the token details.Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC20Detailed.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20DetailedFacet.sol\":\"ERC20DetailedFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20DetailedFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../base/ERC20DetailedBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20DetailedFacet is ERC20DetailedBase, ForwarderRegistryContextBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function initERC20DetailedStorage(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0xe7cbcd2286aea25da2b1584cca758da8eec4e89539884e7bd01831e9953022cb\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"initERC20DetailedStorage(string,string,uint8)":{"notice":"Initializes the storage with the token details.Sets the proxy initialization phase to `1`.Marks the following ERC165 interface(s) as supported: ERC20Detailed."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."}},"version":1}}},"contracts/token/ERC20/facets/ERC20Facet.sol":{"ERC20Facet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"initialHolders","type":"address[]"},{"internalType":"uint256[]","name":"initialAllocations","type":"uint256[]"}],"name":"initERC20StorageWithAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"initERC20Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"initERC20StorageWithAllocations(address[],uint256[])":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6113c538819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516113439081610082823960805181610ff40152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063095ea7b314610a3357806318160ddd146109d857806323b872dd1461091b57806339509351146106eb57806370a0823114610666578063a457c2d7146105f9578063a9059cbb14610581578063c8342b1d146102a9578063dd62ed3e146101fa5763fb33f6081461008a57600080fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff806100f8610fdd565b92541691169081036101c8577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790555b005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610231610b5f565b73ffffffffffffffffffffffffffffffffffffffff61024e610b82565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760043567ffffffffffffffff81116101f5576102f8903690600401610ba5565b60243567ffffffffffffffff81116101f557610318903690600401610ba5565b917fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610358610fdd565b92541691169081036101c8575061036e81610c46565b9361037c6040519586610bd6565b818552602085019160051b8101903682116101f557915b818310610554575050506103a682610c46565b916103b46040519384610bd6565b808352602083019060051b8201913683116101f557905b828210610544575050507f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d12274990549160018310156105115760017f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749908190557fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811683179091557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790556101c692507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611163565b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b81358152602091820191016103cb565b823573ffffffffffffffffffffffffffffffffffffffff811681036101f557815260209283019201610393565b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee6105bb610b5f565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6105e8610fdd565b90610e3c565b602060405160018152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee610633610b5f565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610660610fdd565b90610c5e565b346101f55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55761069d610b5f565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610722610b5f565b60243561072d610fdd565b9073ffffffffffffffffffffffffffffffffffffffff83169283156108d75773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205260406000208460005260205260406000205491806107f2575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561087c57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506107a3565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101f55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee610955610b5f565b61095d610b82565b604435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61098a610fdd565b8473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036109c6575b5050610e3c565b6109d1918484610c5e565b85846109bf565b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610a6a610b5f565b60243573ffffffffffffffffffffffffffffffffffffffff610a8a610fdd565b9216918215610b1b57602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928181166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352846040600020556040519485521692a3602060405160018152f35b73ffffffffffffffffffffffffffffffffffffffff907ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101f557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101f557565b9181601f840112156101f55782359167ffffffffffffffff83116101f5576020808501948460051b0101116101f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610c175760051b60200190565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415610df8576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580610def575b610d2b575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015610d945750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592610ce3565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515610cde565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315610f995782610ea6575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610f4d57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610f26575b5050925050610e61565b83831660005281855260406000205586600052835260406000208581540190553880610f1c565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611111573233148015611116575b611111577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611068575b5061106557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115611105576000916110c3575b503861105b565b6020813d6020116110fd575b816110dc60209383610bd6565b810103126110f957519081151582036110f65750386110bc565b80fd5b5080fd5b3d91506110cf565b6040513d6000823e3d90fd5b503390565b5060183610611024565b80518210156111345760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036112e35781156112dd5760009360005b8381106111d7575050505081611190575050565b60020180549180830192808411156111a757505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff6111f68284611120565b511680156112b3576112088285611120565b5180611246575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161117c565b969190878301928311156112895773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061120f565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220322de91b442fa6c55cff7eb9b4b93bf30ad5887a798f044e2117d425c2402b4f64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x13C5 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1343 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xFF4 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xA33 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x9D8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x91B JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x6EB JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x666 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0xC8342B1D EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1FA JUMPI PUSH4 0xFB33F608 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8 PUSH2 0xFDD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x231 PUSH2 0xB5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24E PUSH2 0xB82 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F5 JUMPI PUSH2 0x2F8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xBA5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F5 JUMPI PUSH2 0x318 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xBA5 JUMP JUMPDEST SWAP2 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x358 PUSH2 0xFDD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI POP PUSH2 0x36E DUP2 PUSH2 0xC46 JUMP JUMPDEST SWAP4 PUSH2 0x37C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xBD6 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1F5 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x554 JUMPI POP POP POP PUSH2 0x3A6 DUP3 PUSH2 0xC46 JUMP JUMPDEST SWAP2 PUSH2 0x3B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0xBD6 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x1F5 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x544 JUMPI POP POP POP PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 SLOAD SWAP2 PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x1 PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 DUP2 SWAP1 SSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND DUP4 OR SWAP1 SWAP2 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1C6 SWAP3 POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1163 JUMP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3CB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1F5 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x393 JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x5BB PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x5E8 PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH2 0xE3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x633 PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x660 PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH2 0xC5E JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x69D PUSH2 0xB5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x722 PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x72D PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x8D7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x7F2 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x87C JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x7A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x955 PUSH2 0xB5F JUMP JUMPDEST PUSH2 0x95D PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x98A PUSH2 0xFDD JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x9C6 JUMPI JUMPDEST POP POP PUSH2 0xE3C JUMP JUMPDEST PUSH2 0x9D1 SWAP2 DUP5 DUP5 PUSH2 0xC5E JUMP JUMPDEST DUP6 DUP5 PUSH2 0x9BF JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0xA6A PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8A PUSH2 0xFDD JUMP JUMPDEST SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0xB1B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1F5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1F5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1F5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1F5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1F5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xC17 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xC17 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xDF8 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0xDEF JUMPI JUMPDEST PUSH2 0xD2B JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0xD94 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0xCE3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0xCDE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xF99 JUMPI DUP3 PUSH2 0xEA6 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xF4D JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xF26 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xE61 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xF1C JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1111 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1116 JUMPI JUMPDEST PUSH2 0x1111 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1068 JUMPI JUMPDEST POP PUSH2 0x1065 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1105 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x105B JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10FD JUMPI JUMPDEST DUP2 PUSH2 0x10DC PUSH1 0x20 SWAP4 DUP4 PUSH2 0xBD6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x10F9 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x10F6 JUMPI POP CODESIZE PUSH2 0x10BC JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1024 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1134 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x12E3 JUMPI DUP2 ISZERO PUSH2 0x12DD JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x11D7 JUMPI POP POP POP POP DUP2 PUSH2 0x1190 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x11A7 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x11F6 DUP3 DUP5 PUSH2 0x1120 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x12B3 JUMPI PUSH2 0x1208 DUP3 DUP6 PUSH2 0x1120 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x1246 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x117C JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x1289 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x120F JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ORIGIN 0x2D 0xE9 SHL PREVRANDAO 0x2F 0xA6 0xC5 TLOAD SELFDESTRUCT PUSH31 0xB9B4B93BF30AD5887A798F044E2117D425C2402B4F64736F6C634300081E00 CALLER ","sourceMap":"784:1521:260:-:0;;;;;;;;;;;;;-1:-1:-1;;784:1521:260;;;;-1:-1:-1;;;;;784:1521:260;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;784:1521:260;;;;;;745:39:76;;784:1521:260;;;;;;;;745:39:76;784:1521:260;;;;;;;-1:-1:-1;784:1521:260;;;;;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2911,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":2981,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":2946,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":3142,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":3030,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchMint":{"entryPoint":4451,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":3166,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_init":{"entryPoint":null,"id":28743,"parameterSlots":0,"returnSlots":0},"fun_msgSender":{"entryPoint":4061,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transfer":{"entryPoint":3644,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":4384,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4084}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063095ea7b314610a3357806318160ddd146109d857806323b872dd1461091b57806339509351146106eb57806370a0823114610666578063a457c2d7146105f9578063a9059cbb14610581578063c8342b1d146102a9578063dd62ed3e146101fa5763fb33f6081461008a57600080fd5b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff806100f8610fdd565b92541691169081036101c8577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790555b005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610231610b5f565b73ffffffffffffffffffffffffffffffffffffffff61024e610b82565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760043567ffffffffffffffff81116101f5576102f8903690600401610ba5565b60243567ffffffffffffffff81116101f557610318903690600401610ba5565b917fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373ffffffffffffffffffffffffffffffffffffffff80610358610fdd565b92541691169081036101c8575061036e81610c46565b9361037c6040519586610bd6565b818552602085019160051b8101903682116101f557915b818310610554575050506103a682610c46565b916103b46040519384610bd6565b808352602083019060051b8201913683116101f557905b828210610544575050507f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d12274990549160018310156105115760017f53d309e32e4ca7be7e99298a42b755b0cd82d1ad9411e9a18f57394d122749908190557fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811683179091557f9d075186000000000000000000000000000000000000000000000000000000006000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a66805490911690911790556101c692507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611163565b827fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b81358152602091820191016103cb565b823573ffffffffffffffffffffffffffffffffffffffff811681036101f557815260209283019201610393565b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee6105bb610b5f565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6105e8610fdd565b90610e3c565b602060405160018152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee610633610b5f565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610660610fdd565b90610c5e565b346101f55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55761069d610b5f565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610722610b5f565b60243561072d610fdd565b9073ffffffffffffffffffffffffffffffffffffffff83169283156108d75773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205260406000208460005260205260406000205491806107f2575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561087c57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef835260406000208660005283528060406000205592506107a3565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101f55760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f5576105ee610955610b5f565b61095d610b82565b604435917f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61098a610fdd565b8473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036109c6575b5050610e3c565b6109d1918484610c5e565b85846109bf565b346101f55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f55760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346101f55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f557610a6a610b5f565b60243573ffffffffffffffffffffffffffffffffffffffff610a8a610fdd565b9216918215610b1b57602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928181166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352846040600020556040519485521692a3602060405160018152f35b73ffffffffffffffffffffffffffffffffffffffff907ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101f557565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101f557565b9181601f840112156101f55782359167ffffffffffffffff83116101f5576020808501948460051b0101116101f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111610c175760051b60200190565b92909173ffffffffffffffffffffffffffffffffffffffff8116938415610df8576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580610def575b610d2b575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015610d945750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592610ce3565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515610cde565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315610f995782610ea6575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610f4d57508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610f26575b5050925050610e61565b83831660005281855260406000205586600052835260406000208581540190553880610f1c565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611111573233148015611116575b611111577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115611068575b5061106557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115611105576000916110c3575b503861105b565b6020813d6020116110fd575b816110dc60209383610bd6565b810103126110f957519081151582036110f65750386110bc565b80fd5b5080fd5b3d91506110cf565b6040513d6000823e3d90fd5b503390565b5060183610611024565b80518210156111345760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036112e35781156112dd5760009360005b8381106111d7575050505081611190575050565b60020180549180830192808411156111a757505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff6111f68284611120565b511680156112b3576112088285611120565b5180611246575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161117c565b969190878301928311156112895773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061120f565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220322de91b442fa6c55cff7eb9b4b93bf30ad5887a798f044e2117d425c2402b4f64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xA33 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x9D8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x91B JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x6EB JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x666 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0xC8342B1D EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1FA JUMPI PUSH4 0xFB33F608 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF8 PUSH2 0xFDD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x231 PUSH2 0xB5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24E PUSH2 0xB82 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F5 JUMPI PUSH2 0x2F8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xBA5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1F5 JUMPI PUSH2 0x318 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xBA5 JUMP JUMPDEST SWAP2 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x358 PUSH2 0xFDD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1C8 JUMPI POP PUSH2 0x36E DUP2 PUSH2 0xC46 JUMP JUMPDEST SWAP4 PUSH2 0x37C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0xBD6 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x1F5 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x554 JUMPI POP POP POP PUSH2 0x3A6 DUP3 PUSH2 0xC46 JUMP JUMPDEST SWAP2 PUSH2 0x3B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0xBD6 JUMP JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x1F5 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x544 JUMPI POP POP POP PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 SLOAD SWAP2 PUSH1 0x1 DUP4 LT ISZERO PUSH2 0x511 JUMPI PUSH1 0x1 PUSH32 0x53D309E32E4CA7BE7E99298A42B755B0CD82D1AD9411E9A18F57394D12274990 DUP2 SWAP1 SSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND DUP4 OR SWAP1 SWAP2 SSTORE PUSH32 0x9D07518600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1C6 SWAP3 POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1163 JUMP JUMPDEST DUP3 PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3CB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x1F5 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x393 JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x5BB PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x5E8 PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH2 0xE3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x633 PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x660 PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH2 0xC5E JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x69D PUSH2 0xB5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x722 PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x72D PUSH2 0xFDD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x8D7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x7F2 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x87C JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x7A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0x5EE PUSH2 0x955 PUSH2 0xB5F JUMP JUMPDEST PUSH2 0x95D PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x98A PUSH2 0xFDD JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x9C6 JUMPI JUMPDEST POP POP PUSH2 0xE3C JUMP JUMPDEST PUSH2 0x9D1 SWAP2 DUP5 DUP5 PUSH2 0xC5E JUMP JUMPDEST DUP6 DUP5 PUSH2 0x9BF JUMP JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x1F5 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x1F5 JUMPI PUSH2 0xA6A PUSH2 0xB5F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8A PUSH2 0xFDD JUMP JUMPDEST SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0xB1B JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1F5 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x1F5 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x1F5 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1F5 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x1F5 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xC17 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xC17 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xDF8 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0xDEF JUMPI JUMPDEST PUSH2 0xD2B JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0xD94 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0xCE3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0xCDE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xF99 JUMPI DUP3 PUSH2 0xEA6 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xF4D JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xF26 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0xE61 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xF1C JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x1111 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1116 JUMPI JUMPDEST PUSH2 0x1111 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x1068 JUMPI JUMPDEST POP PUSH2 0x1065 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1105 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10C3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x105B JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10FD JUMPI JUMPDEST DUP2 PUSH2 0x10DC PUSH1 0x20 SWAP4 DUP4 PUSH2 0xBD6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x10F9 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x10F6 JUMPI POP CODESIZE PUSH2 0x10BC JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x1024 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x1134 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x12E3 JUMPI DUP2 ISZERO PUSH2 0x12DD JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x11D7 JUMPI POP POP POP POP DUP2 PUSH2 0x1190 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x11A7 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x11F6 DUP3 DUP5 PUSH2 0x1120 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x12B3 JUMPI PUSH2 0x1208 DUP3 DUP6 PUSH2 0x1120 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x1246 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x117C JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x1289 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x120F JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ORIGIN 0x2D 0xE9 SHL PREVRANDAO 0x2F 0xA6 0xC5 TLOAD SELFDESTRUCT PUSH31 0xB9B4B93BF30AD5887A798F044E2117D425C2402B4F64736F6C634300081E00 CALLER ","sourceMap":"784:1521:260:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2022:41;;;:::i;:::-;784:1521;;;;;3174:18:180;;;3170:53;;784:1521:260;500:10:59;;;;;443:1;500:10;;;;;;;;;2560:33:280;-1:-1:-1;500:10:59;;;;;;;;;;;;1356:12:260;784:1521;3170:53:180;3201:22;-1:-1:-1;3201:22:180;;784:1521:260;;-1:-1:-1;3201:22:180;784:1521:260;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;784:1521:260;-1:-1:-1;784:1521:260;27576:12:280;784:1521:260;;;;-1:-1:-1;784:1521:260;27576:28:280;784:1521:260;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3324:19:180;784:1521:260;;2022:41;;;:::i;:::-;784:1521;;;;;3174:18:180;;;3170:53;;784:1521:260;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;900:21:181;2124:1:280;900:21:181;;;896:88;;2124:1:280;784:1521:260;;;;;500:10:59;;;;;;;;;;;;;;2560:33:280;-1:-1:-1;500:10:59;;;;;;;;;;;;2939:18:280;;-1:-1:-1;784:1521:260;2939:18:280;:::i;896:88:181:-;930:54;;784:1521:260;930:54:181;784:1521:260;;2124:1:280;784:1521:260;;;;930:54:181;784:1521:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1036:5:242;784:1521:260;;:::i;:::-;;;;;2022:41;;:::i;:::-;1036:5:242;;:::i;:::-;784:1521:260;;;;;;;;;;;;;;;;;;1788:15:242;784:1521:260;;:::i;:::-;;;;;2022:41;;:::i;:::-;1788:15:242;;:::i;784:1521:260:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;784:1521:260;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2022:41;;:::i;:::-;784:1521;;;;5455:21:280;;;5451:67;;784:1521:260;;;-1:-1:-1;784:1521:260;5555:12:280;784:1521:260;;;-1:-1:-1;784:1521:260;;-1:-1:-1;784:1521:260;;;;-1:-1:-1;784:1521:260;;5597:10:280;;5593:366;;784:1521:260;;;5973:42:280;784:1521:260;;;;;;;;;5973:42:280;;784:1521:260;;;;;;;5593:366:280;784:1521:260;;;5720:32:280;;;;;5716:108;;5842:19;;;784:1521:260;;5973:42:280;5842:19;784:1521:260;;;-1:-1:-1;784:1521:260;5555:12:280;784:1521:260;;;-1:-1:-1;784:1521:260;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;5593:366:280;;;;5716:108;784:1521:260;;5761:63:280;;;784:1521:260;;;;;5761:63:280;;784:1521:260;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;784:1521:260;5485:33:280;;784:1521:260;5485:33:280;784:1521:260;;;;;5485:33:280;784:1521:260;;;;;;;;;;;9818:5:280;784:1521:260;;:::i;:::-;;;:::i;:::-;;;27705:19:280;784:1521:260;2022:41;;:::i;:::-;784:1521;;;;;;;9707:14:280;9703:85;;784:1521:260;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;784:1521:260;;;;;;;;;;;;26654:8:280;784:1521:260;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2022:41;;:::i;:::-;784:1521;;4533:21:280;;;4529:67;;784:1521:260;;4657:31:280;4606:19;784:1521:260;;;-1:-1:-1;784:1521:260;4606:12:280;784:1521:260;;;-1:-1:-1;784:1521:260;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;;;;;;4657:31:280;;784:1521:260;;;;;;;4529:67:280;784:1521:260;4563:33:280;;784:1521:260;4563:33:280;784:1521:260;;;;;4563:33:280;784:1521:260;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;;;;;;;;;;:::o;6693:851:280:-;;;;784:1521:260;;;6808:21:280;;;6804:67;;6908:12;;:19;784:1521:260;;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;-1:-1:-1;784:1521:260;;;;-1:-1:-1;784:1521:260;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;784:1521:260;;;;;;7495:42:280;784:1521:260;;;;;;;7495:42:280;;6693:851::o;6947:534::-;784:1521:260;;;7238:32:280;;;;;7234:112;;7364:19;;;784:1521:260;7495:42:280;7364:19;784:1521:260;7364:19:280;784:1521:260;;;-1:-1:-1;784:1521:260;;;;-1:-1:-1;784:1521:260;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;6947:534:280;;;7234:112;784:1521:260;;7279:67:280;;;784:1521:260;;;;7279:67:280;;;784:1521:260;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;784:1521:260;6838:33:280;;6827:1;6838:33;784:1521:260;6838:33:280;784:1521:260;;6827:1:280;6838:33;8105:628;;;784:1521:260;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;784:1521:260;;;8701:25:280;784:1521:260;;;;;;;8701:25:280;;8105:628::o;8273:413::-;784:1521:260;;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;;;8437:21:280;;;;;8433:80;;784:1521:260;;;;;;;;8701:25:280;784:1521:260;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;784:1521:260;;;-1:-1:-1;784:1521:260;;;;;-1:-1:-1;784:1521:260;;;-1:-1:-1;784:1521:260;;;;-1:-1:-1;784:1521:260;;;;;;;8531:131:280;;;;8433:80;8467:46;;784:1521:260;8467:46:280;;8219:1;8467:46;784:1521:260;8467:46:280;784:1521:260;;;;;;8219:1:280;8467:46;8201:61;784:1521:260;8230:32:280;;8219:1;8230:32;784:1521:260;8230:32:280;784:1521:260;;8219:1:280;8230:32;907:917:76;784:1521:260;1029:19:76;784:1521:260;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;784:1521:260;;;;;;1676:74:76;;;;784:1521:260;1676:74:76;;;;;;784:1521:260;1327:10:76;784:1521:260;;;;1744:4:76;784:1521:260;;;;1676:74:76;;;;;;;784:1521:260;1676:74:76;;;1630:120;;;;;1676:74;784:1521:260;1676:74:76;;784:1521:260;1676:74:76;;;;;;784:1521:260;1676:74:76;;;:::i;:::-;;;784:1521:260;;;;;;;;;;;;;1676:74:76;;;;784:1521:260;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;784:1521:260;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;784:1521:260;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;20857:1233:280;;;784:1521:260;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;784:1521:260;;;;;;21949:19:280;;;;;21945:76;;784:1521:260;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;784:1521:260;;;;-1:-1:-1;21977:44:280;21174:3;784:1521:260;21206:13:280;;;;:::i;:::-;784:1521:260;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;784:1521:260;21344:10:280;21340:372;;21174:3;784:1521:260;-1:-1:-1;21730:31:280;784:1521:260;;;;;;;;;21730:31:280;784:1521:260;21151:9:280;;21340:372;784:1521:260;;;;;;21474:27:280;;;;21470:70;;784:1521:260;;;-1:-1:-1;784:1521:260;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;784:1521:260;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;21084;21101:7;;;;:::o;21011:62::-;21047:26;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280"},"gasEstimates":{"creation":{"codeDepositCost":"986200","executionCost":"infinite","totalCost":"infinite"},"external":{"allowance(address,address)":"2683","approve(address,uint256)":"infinite","balanceOf(address)":"2465","decreaseAllowance(address,uint256)":"infinite","increaseAllowance(address,uint256)":"infinite","initERC20Storage()":"infinite","initERC20StorageWithAllocations(address[],uint256[])":"infinite","totalSupply()":"2269","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","initERC20Storage()":"fb33f608","initERC20StorageWithAllocations(address[],uint256[])":"c8342b1d","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"initialHolders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"initialAllocations\",\"type\":\"uint256[]\"}],\"name\":\"initERC20StorageWithAllocations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"initERC20Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"initERC20StorageWithAllocations(address[],uint256[])\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"initERC20Storage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\"},\"initERC20StorageWithAllocations(address[],uint256[])\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20Facet.sol\":\"ERC20Facet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../base/ERC20Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20Facet is ERC20Base, ForwarderRegistryContextBase {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.init();\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20StorageWithAllocations(address[] calldata initialHolders, uint256[] calldata initialAllocations) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initWithAllocations(initialHolders, initialAllocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xcbab9ebe31aa02741092114f157f022aa8cdca24e97b73d2aa9176d939fae665\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"initERC20Storage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"initERC20StorageWithAllocations(address[],uint256[])":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."}},"version":1}}},"contracts/token/ERC20/facets/ERC20MetadataFacet.sol":{"ERC20MetadataFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"initERC20MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}.","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}}},"title":"ERC20 Fungible Token Standard, optional extension: Metadata (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61081338819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610791908161008282396080518161062f0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80633c130d90146103d9578063529eec471461029f5763e0df5b6f1461003d57600080fd5b3461029a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a5760043567ffffffffffffffff811161029a573660238201121561029a57806004013567ffffffffffffffff811161029a57366024828401011161029a576100b1610618565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361026d57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6000916101228254610555565b601f8111610228575b5082601f821160011461018557839482939492610177575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b602492500101353880610143565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b87811061020d5750836001959697106101d2575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690553880806101c7565b909260206001819260248787010135815501940191016101b3565b82845260208420601f830160051c81019160208410610263575b601f0160051c01905b818110610258575061012b565b84815560010161024b565b9091508190610242565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461029a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a576102d6610618565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103ac577f3c130d90000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f7fe8ee7f2d313a16678eef7035aac3e7ad68d287fc547fab9e84f1ec0f7db44d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461029a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a577ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6040519081600082549261043c84610555565b808452936001811690811561051557506001146104ce575b50610461925003826105a8565b60405190602082528181519182602083015260005b8381106104b65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610476565b90506000929192526020600020906000915b8183106104f95750509060206104619282010184610454565b60209193508060019154838588010152019101909183926104e0565b602093506104619592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010184610454565b90600182811c9216801561059e575b602083101461056f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610564565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105e957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074c573233148015610751575b61074c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106a3575b506106a057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610740576000916106fe575b5038610696565b6020813d602011610738575b81610717602093836105a8565b8101031261073457519081151582036107315750386106f7565b80fd5b5080fd5b3d915061070a565b6040513d6000823e3d90fd5b503390565b506018361061065f56fea2646970667358221220f4bffe9ccb011e1d445eb0c9c9801d78bb85d318a2b89b69771a7a2b572fcda464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x813 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x791 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x62F ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0x529EEC47 EQ PUSH2 0x29F JUMPI PUSH4 0xE0DF5B6F EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x29A JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x29A JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x29A JUMPI CALLDATASIZE PUSH1 0x24 DUP3 DUP5 ADD ADD GT PUSH2 0x29A JUMPI PUSH2 0xB1 PUSH2 0x618 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x26D JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x0 SWAP2 PUSH2 0x122 DUP3 SLOAD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x228 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x185 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x177 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x143 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x20D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x1D2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1C7 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x1B3 JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x263 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x258 JUMPI POP PUSH2 0x12B JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x24B JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x242 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH2 0x2D6 PUSH2 0x618 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3AC JUMPI PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x7FE8EE7F2D313A16678EEF7035AAC3E7AD68D287FC547FAB9E84F1EC0F7DB44D DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x40 MLOAD SWAP1 DUP2 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x43C DUP5 PUSH2 0x555 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x515 JUMPI POP PUSH1 0x1 EQ PUSH2 0x4CE JUMPI JUMPDEST POP PUSH2 0x461 SWAP3 POP SUB DUP3 PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP3 MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4B6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x476 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4F9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x461 SWAP3 DUP3 ADD ADD DUP5 PUSH2 0x454 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x4E0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x461 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD DUP5 PUSH2 0x454 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x59E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x56F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x564 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5E9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x751 JUMPI JUMPDEST PUSH2 0x74C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6A3 JUMPI JUMPDEST POP PUSH2 0x6A0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x740 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6FE JUMPI JUMPDEST POP CODESIZE PUSH2 0x696 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x738 JUMPI JUMPDEST DUP2 PUSH2 0x717 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x5A8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x734 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x731 JUMPI POP CODESIZE PUSH2 0x6F7 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x70A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x65F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL 0xBF INVALID SWAP13 0xCB ADD 0x1E SAR PREVRANDAO MCOPY 0xB0 0xC9 0xC9 DUP1 SAR PUSH25 0xBB85D318A2B89B69771A7A2B572FCDA464736F6C634300081E STOP CALLER ","sourceMap":"872:959:261:-:0;;;;;;;;;;;;;-1:-1:-1;;872:959:261;;;;-1:-1:-1;;;;;872:959:261;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;872:959:261;;;;;;745:39:76;;872:959:261;;;;;;;;745:39:76;872:959:261;;;;;;;-1:-1:-1;872:959:261;;;;;;-1:-1:-1;872:959:261;;;;;-1:-1:-1;872:959:261"},"deployedBytecode":{"functionDebugData":{"extract_byte_array_length":{"entryPoint":1365,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1448,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":1560,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1583}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80633c130d90146103d9578063529eec471461029f5763e0df5b6f1461003d57600080fd5b3461029a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a5760043567ffffffffffffffff811161029a573660238201121561029a57806004013567ffffffffffffffff811161029a57366024828401011161029a576100b1610618565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361026d57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6000916101228254610555565b601f8111610228575b5082601f821160011461018557839482939492610177575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b602492500101353880610143565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b87811061020d5750836001959697106101d2575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690553880806101c7565b909260206001819260248787010135815501940191016101b3565b82845260208420601f830160051c81019160208410610263575b601f0160051c01905b818110610258575061012b565b84815560010161024b565b9091508190610242565b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461029a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a576102d6610618565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103ac577f3c130d90000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f7fe8ee7f2d313a16678eef7035aac3e7ad68d287fc547fab9e84f1ec0f7db44d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461029a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029a577ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6040519081600082549261043c84610555565b808452936001811690811561051557506001146104ce575b50610461925003826105a8565b60405190602082528181519182602083015260005b8381106104b65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610476565b90506000929192526020600020906000915b8183106104f95750509060206104619282010184610454565b60209193508060019154838588010152019101909183926104e0565b602093506104619592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010184610454565b90600182811c9216801561059e575b602083101461056f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610564565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105e957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561074c573233148015610751575b61074c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106a3575b506106a057503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610740576000916106fe575b5038610696565b6020813d602011610738575b81610717602093836105a8565b8101031261073457519081151582036107315750386106f7565b80fd5b5080fd5b3d915061070a565b6040513d6000823e3d90fd5b503390565b506018361061065f56fea2646970667358221220f4bffe9ccb011e1d445eb0c9c9801d78bb85d318a2b89b69771a7a2b572fcda464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0x529EEC47 EQ PUSH2 0x29F JUMPI PUSH4 0xE0DF5B6F EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x29A JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x29A JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x29A JUMPI CALLDATASIZE PUSH1 0x24 DUP3 DUP5 ADD ADD GT PUSH2 0x29A JUMPI PUSH2 0xB1 PUSH2 0x618 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x26D JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x0 SWAP2 PUSH2 0x122 DUP3 SLOAD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x228 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x185 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x177 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x143 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x20D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x1D2 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1C7 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x1B3 JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x263 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x258 JUMPI POP PUSH2 0x12B JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x24B JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x242 JUMP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH2 0x2D6 PUSH2 0x618 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3AC JUMPI PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x7FE8EE7F2D313A16678EEF7035AAC3E7AD68D287FC547FAB9E84F1EC0F7DB44D DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x29A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x29A JUMPI PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH1 0x40 MLOAD SWAP1 DUP2 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x43C DUP5 PUSH2 0x555 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x515 JUMPI POP PUSH1 0x1 EQ PUSH2 0x4CE JUMPI JUMPDEST POP PUSH2 0x461 SWAP3 POP SUB DUP3 PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x20 DUP3 MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4B6 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 RETURN JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x476 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4F9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x461 SWAP3 DUP3 ADD ADD DUP5 PUSH2 0x454 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x4E0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x461 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD DUP5 PUSH2 0x454 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x59E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x56F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x564 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5E9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x74C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x751 JUMPI JUMPDEST PUSH2 0x74C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6A3 JUMPI JUMPDEST POP PUSH2 0x6A0 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x740 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6FE JUMPI JUMPDEST POP CODESIZE PUSH2 0x696 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x738 JUMPI JUMPDEST DUP2 PUSH2 0x717 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x5A8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x734 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x731 JUMPI POP CODESIZE PUSH2 0x6F7 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x70A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x65F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL 0xBF INVALID SWAP13 0xCB ADD 0x1E SAR PREVRANDAO MCOPY 0xB0 0xC9 0xC9 DUP1 SAR PUSH25 0xBB85D318A2B89B69771A7A2B572FCDA464736F6C634300081E STOP CALLER ","sourceMap":"872:959:261:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1548:41;;:::i;:::-;872:959;;;;;;;4503:26:42;;;4499:64;;1283:19:278;872:959:261;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;872:959:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;872:959:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;872:959:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;872:959:261;;;;;;-1:-1:-1;872:959:261;;;;4499:64:42;4538:25;872:959:261;4538:25:42;872:959:261;;;;4538:25:42;872:959:261;;;;;;;;;;;;;;;1548:41;;:::i;:::-;872:959;;;;;;;3174:18:180;;;3170:53;;768:32:278;872:959:261;500:10:59;872:959:261;500:10:59;;;;;;;636:1:180;500:10:59;;;872:959:261;3170:53:180;3201:22;872:959:261;3201:22:180;872:959:261;;;;3201:22:180;872:959:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;872:959:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;872:959:261;;;;;-1:-1:-1;872:959:261;907:917:76;872:959:261;1029:19:76;872:959:261;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;872:959:261;;;;;;1676:74:76;;;;872:959:261;1676:74:76;;;;;;872:959:261;1327:10:76;872:959:261;;;;1744:4:76;872:959:261;;;;1676:74:76;;;;;;;872:959:261;1676:74:76;;;1630:120;;;;;1676:74;872:959:261;1676:74:76;;872:959:261;1676:74:76;;;;;;872:959:261;1676:74:76;;;:::i;:::-;;;872:959:261;;;;;;;;;;;;;1676:74:76;;;;872:959:261;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;872:959:261;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"387400","executionCost":"infinite","totalCost":"infinite"},"external":{"initERC20MetadataStorage()":"infinite","setTokenURI(string)":"infinite","tokenURI()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initERC20MetadataStorage()":"529eec47","setTokenURI(string)":"e0df5b6f","tokenURI()":"3c130d90"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"initERC20MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Metadata (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC20MetadataStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Metadata.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20MetadataFacet.sol\":\"ERC20MetadataFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../base/ERC20MetadataBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20MetadataFacet is ERC20MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function initERC20MetadataStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20MetadataStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xdbe77f1801db43493c19704f259a28a8fd9c9531bd993276e136629e433500ec\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC20MetadataStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Metadata."},"setTokenURI(string)":{"notice":"Sets the token URI."},"tokenURI()":{"notice":"Gets the token metadata URI."}},"version":1}}},"contracts/token/ERC20/facets/ERC20MintableFacet.sol":{"ERC20MintableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC20MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.","errors":{"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"initERC20MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}}},"title":"ERC20 Fungible Token Standard, optional extension: Mintable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610a5b38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516109d990816100828239608051816108770152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806311e60a3e146103e857806340c10f191461022457806368573107146100a65763d53913931461004857600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100a15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760043567ffffffffffffffff81116100a1576100f5903690600401610522565b60243567ffffffffffffffff81116100a157610115903690600401610522565b92909161014a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610144610860565b906105db565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90610175816105c3565b926101836040519485610553565b818452602084019160051b8101903682116100a157915b8183106101f7575050506101ad846105c3565b926101bb6040519485610553565b848452602084019460051b8101903682116100a157945b8186106101e75750506101e593506106e0565b005b85358152602095860195016101d2565b823573ffffffffffffffffffffffffffffffffffffffff811681036100a15781526020928301920161019a565b346100a15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760043573ffffffffffffffffffffffffffffffffffffffff81168091036100a1576024356102a37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610144610860565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee82156103be5781610300575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054828101908082111561038c57507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6102d0565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15761041f610860565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036104f5577f28963e1e000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156100a15782359167ffffffffffffffff83116100a1576020808501948460051b0101116100a157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105945760051b60200190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156106355750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156106b15760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036108365781156108305760009360005b83811061075457505050508161070d575050565b600201805491808301928084111561072457505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff610773828461069d565b511680156103be57610785828561069d565b51806107c3575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a3016106f9565b969190878301928311156108065773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061078c565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610994573233148015610999575b610994577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108eb575b506108e857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561098857600091610946575b50386108de565b6020813d602011610980575b8161095f60209383610553565b8101031261097c575190811515820361097957503861093f565b80fd5b5080fd5b3d9150610952565b6040513d6000823e3d90fd5b503390565b50601836106108a756fea26469706673582212209655660b80c7dada3cecc6341b519fb57c4435d81573cecde167879e9b52d01664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xA5B CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x9D9 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x877 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11E60A3E EQ PUSH2 0x3E8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0xA6 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0xF5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x522 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x115 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x522 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x14A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x144 PUSH2 0x860 JUMP JUMPDEST SWAP1 PUSH2 0x5DB JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x175 DUP2 PUSH2 0x5C3 JUMP JUMPDEST SWAP3 PUSH2 0x183 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x553 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xA1 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1F7 JUMPI POP POP POP PUSH2 0x1AD DUP5 PUSH2 0x5C3 JUMP JUMPDEST SWAP3 PUSH2 0x1BB PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x553 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xA1 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1E7 JUMPI POP POP PUSH2 0x1E5 SWAP4 POP PUSH2 0x6E0 JUMP JUMPDEST STOP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1D2 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xA1 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x19A JUMP JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xA1 JUMPI PUSH1 0x24 CALLDATALOAD PUSH2 0x2A3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x144 PUSH2 0x860 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE DUP3 ISZERO PUSH2 0x3BE JUMPI DUP2 PUSH2 0x300 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x38C JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2D0 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x41F PUSH2 0x860 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x4F5 JUMPI PUSH32 0x28963E1E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x594 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x594 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x635 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x6B1 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x836 JUMPI DUP2 ISZERO PUSH2 0x830 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x754 JUMPI POP POP POP POP DUP2 PUSH2 0x70D JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x724 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x773 DUP3 DUP5 PUSH2 0x69D JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH2 0x785 DUP3 DUP6 PUSH2 0x69D JUMP JUMPDEST MLOAD DUP1 PUSH2 0x7C3 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x6F9 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x806 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x78C JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x994 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x999 JUMPI JUMPDEST PUSH2 0x994 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8EB JUMPI JUMPDEST POP PUSH2 0x8E8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x988 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x946 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x980 JUMPI JUMPDEST DUP2 PUSH2 0x95F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x553 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x97C JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x979 JUMPI POP CODESIZE PUSH2 0x93F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x952 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8A7 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 SSTORE PUSH7 0xB80C7DADA3CEC 0xC6 CALLVALUE SHL MLOAD SWAP16 0xB5 PUSH29 0x4435D81573CECDE167879E9B52D01664736F6C634300081E0033000000 ","sourceMap":"878:1044:262:-:0;;;;;;;;;;;;;-1:-1:-1;;878:1044:262;;;;-1:-1:-1;;;;;878:1044:262;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;878:1044:262;;;;;;745:39:76;;878:1044:262;;;;;;;;745:39:76;878:1044:262;;;;;;;-1:-1:-1;878:1044:262;;;;;;-1:-1:-1;878:1044:262;;;;;-1:-1:-1;878:1044:262"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1314,"id":null,"parameterSlots":2,"returnSlots":2},"array_allocation_size_array_address_dyn":{"entryPoint":1475,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1363,"id":null,"parameterSlots":2,"returnSlots":0},"fun_batchMint":{"entryPoint":1760,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":1499,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2144,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1693,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2167}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806311e60a3e146103e857806340c10f191461022457806368573107146100a65763d53913931461004857600080fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100a15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760043567ffffffffffffffff81116100a1576100f5903690600401610522565b60243567ffffffffffffffff81116100a157610115903690600401610522565b92909161014a7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610144610860565b906105db565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90610175816105c3565b926101836040519485610553565b818452602084019160051b8101903682116100a157915b8183106101f7575050506101ad846105c3565b926101bb6040519485610553565b848452602084019460051b8101903682116100a157945b8186106101e75750506101e593506106e0565b005b85358152602095860195016101d2565b823573ffffffffffffffffffffffffffffffffffffffff811681036100a15781526020928301920161019a565b346100a15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15760043573ffffffffffffffffffffffffffffffffffffffff81168091036100a1576024356102a37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610144610860565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee82156103be5781610300575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054828101908082111561038c57507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6102d0565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100a15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a15761041f610860565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036104f5577f28963e1e000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9181601f840112156100a15782359167ffffffffffffffff83116100a1576020808501948460051b0101116100a157565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105945760051b60200190565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156106355750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b80518210156106b15760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9091825190805182036108365781156108305760009360005b83811061075457505050508161070d575050565b600201805491808301928084111561072457505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff610773828461069d565b511680156103be57610785828561069d565b51806107c3575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a3016106f9565b969190878301928311156108065773ffffffffffffffffffffffffffffffffffffffff81166000908152602088905260409020805489019055919690919061078c565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610994573233148015610999575b610994577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156108eb575b506108e857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561098857600091610946575b50386108de565b6020813d602011610980575b8161095f60209383610553565b8101031261097c575190811515820361097957503861093f565b80fd5b5080fd5b3d9150610952565b6040513d6000823e3d90fd5b503390565b50601836106108a756fea26469706673582212209655660b80c7dada3cecc6341b519fb57c4435d81573cecde167879e9b52d01664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x11E60A3E EQ PUSH2 0x3E8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0xA6 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0xF5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x522 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA1 JUMPI PUSH2 0x115 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x522 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x14A PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x144 PUSH2 0x860 JUMP JUMPDEST SWAP1 PUSH2 0x5DB JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x175 DUP2 PUSH2 0x5C3 JUMP JUMPDEST SWAP3 PUSH2 0x183 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x553 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xA1 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1F7 JUMPI POP POP POP PUSH2 0x1AD DUP5 PUSH2 0x5C3 JUMP JUMPDEST SWAP3 PUSH2 0x1BB PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x553 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0xA1 JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1E7 JUMPI POP POP PUSH2 0x1E5 SWAP4 POP PUSH2 0x6E0 JUMP JUMPDEST STOP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1D2 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0xA1 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x19A JUMP JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xA1 JUMPI PUSH1 0x24 CALLDATALOAD PUSH2 0x2A3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x144 PUSH2 0x860 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE DUP3 ISZERO PUSH2 0x3BE JUMPI DUP2 PUSH2 0x300 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x38C JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2D0 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xA1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xA1 JUMPI PUSH2 0x41F PUSH2 0x860 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x4F5 JUMPI PUSH32 0x28963E1E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xA1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xA1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xA1 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x594 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x594 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x635 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x6B1 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x836 JUMPI DUP2 ISZERO PUSH2 0x830 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x754 JUMPI POP POP POP POP DUP2 PUSH2 0x70D JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x724 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x773 DUP3 DUP5 PUSH2 0x69D JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH2 0x785 DUP3 DUP6 PUSH2 0x69D JUMP JUMPDEST MLOAD DUP1 PUSH2 0x7C3 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x6F9 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x806 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x78C JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x994 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x999 JUMPI JUMPDEST PUSH2 0x994 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x8EB JUMPI JUMPDEST POP PUSH2 0x8E8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x988 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x946 JUMPI JUMPDEST POP CODESIZE PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x980 JUMPI JUMPDEST DUP2 PUSH2 0x95F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x553 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x97C JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x979 JUMPI POP CODESIZE PUSH2 0x93F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x952 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x8A7 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 SSTORE PUSH7 0xB80C7DADA3CEC 0xC6 CALLVALUE SHL MLOAD SWAP16 0xB5 PUSH29 0x4435D81573CECDE167879E9B52D01664736F6C634300081E0033000000 ","sourceMap":"878:1044:262:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;878:1044:262;1639:41;;:::i;:::-;1488:12:247;;:::i;:::-;878:1044:262;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;:::-;878:1044:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:12:247;878:1044:262;1639:41;;:::i;1129:12:247:-;878:1044:262;19546:16:280;;19542:53;;19609:10;19605:370;;878:1044:262;;19989:31:280;878:1044:262;;;;;;;;19989:31:280;878:1044:262;19605:370:280;19652:8;878:1044:262;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;878:1044:262;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;878:1044:262;19786:39:280;878:1044:262;;;;;;19786:39:280;19542:53;19571:24;878:1044:262;19571:24:280;878:1044:262;;19571:24:280;878:1044:262;;;;;;;;;;;1639:41;;:::i;:::-;878:1044;;;;;;;3174:18:180;;;3170:53;;3678:32:280;878:1044:262;500:10:59;878:1044:262;500:10:59;;;;;;;636:1:180;500:10:59;;;878:1044:262;3170:53:180;3201:22;878:1044:262;3201:22:180;878:1044:262;;;;3201:22:180;878:1044:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;878:1044:262;;;;;-1:-1:-1;878:1044:262;;;;;;;;;;;;:::o;3640:170:41:-;878:1044:262;-1:-1:-1;878:1044:262;;;;-1:-1:-1;878:1044:262;;;;-1:-1:-1;878:1044:262;;;;;-1:-1:-1;878:1044:262;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;878:1044:262;3775:28:41;;-1:-1:-1;3775:28:41;878:1044:262;3775:28:41;878:1044:262;;;;;-1:-1:-1;3775:28:41;878:1044:262;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;20857:1233:280;;;878:1044:262;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;878:1044:262;;;;;;21949:19:280;;;;;21945:76;;878:1044:262;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;878:1044:262;;;;-1:-1:-1;21977:44:280;21174:3;878:1044:262;21206:13:280;;;;:::i;:::-;878:1044:262;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;878:1044:262;21344:10:280;21340:372;;21174:3;878:1044:262;-1:-1:-1;21730:31:280;878:1044:262;;;;;;;;;21730:31:280;878:1044:262;21151:9:280;;21340:372;878:1044:262;;;;;;21474:27:280;;;;21470:70;;878:1044:262;;;-1:-1:-1;878:1044:262;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;878:1044:262;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21084:24;21101:7;;;;:::o;21011:62::-;21047:26;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280;907:917:76;878:1044:262;1029:19:76;878:1044:262;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;878:1044:262;;;;;;1676:74:76;;;;878:1044:262;1676:74:76;;;;;;878:1044:262;1327:10:76;878:1044:262;;;;1744:4:76;878:1044:262;;;;1676:74:76;;;;;;;878:1044:262;1676:74:76;;;1630:120;;;;;1676:74;878:1044:262;1676:74:76;;878:1044:262;1676:74:76;;;;;;878:1044:262;1676:74:76;;;:::i;:::-;;;878:1044:262;;;;;;;;;;;;;1676:74:76;;;;878:1044:262;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;878:1044:262;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"504200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"207","batchMint(address[],uint256[])":"infinite","initERC20MintableStorage()":"infinite","mint(address,uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address[],uint256[])":"68573107","initERC20MintableStorage()":"11e60a3e","mint(address,uint256)":"40c10f19"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\",\"errors\":{\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"initERC20MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Mintable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"initERC20MintableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20MintableFacet.sol\":\"ERC20MintableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20MintableBase} from \\\"./../base/ERC20MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {ContractOwnershipFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC20MintableFacet is ERC20MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4d0a5b65e861f1813504c967eb8537411278999586ad2384d825e953fef7eeeb\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"initERC20MintableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Mintable."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."}},"version":1}}},"contracts/token/ERC20/facets/ERC20PermitFacet.sol":{"ERC20PermitFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC20PermitStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"initERC20PermitStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}}},"title":"ERC20 Fungible Token Standard, optional extension: Permit (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61098938819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161090790816100828239608051816107b10152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80631de5d844146103f95780633644e515146103b85780637ecebe00146103335763d505accf1461004857600080fd5b3461032e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761007f610533565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361032e576044356064356084359060ff821680920361032e5773ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d9416938415610304578142116102d6576020926000926080928785528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528960408401528a6060840152888684015260a083015260c082015260c0815261016d60e082610556565b5190206101786105c6565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526101bd606282610556565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156102ca578173ffffffffffffffffffffffffffffffffffffffff60005116036102a05782156102725760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055604051908152a3005b507ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461032e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761036a610533565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5760206103f16105c6565b604051908152f35b3461032e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761043061079a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610506577f9d8ff7da000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fe136d7b577e24834119bec976c568a497f54cf7b8bef8b9534f1ac7a342834a080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516000907f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8154918260011c9060018416938415610790575b602083108514610763578284526020840194849291811561072957506001146106aa575b61063092500382610556565b51902060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526106a460c082610556565b51902090565b507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81600090815290917fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa4285b81831061070d57505090602061063092820101610624565b60209193508060019154838588010152019101909183926106f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686525061063092151560051b82016020019050610624565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f1691610600565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c25732331480156108c7575b6108c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610825575b5061082257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156102ca57600091610880575b5038610818565b6020813d6020116108ba575b8161089960209383610556565b810103126108b657519081151582036108b3575038610879565b80fd5b5080fd5b3d915061088c565b503390565b50601836106107e156fea26469706673582212209da5e6085c2fc4bfe69803c024564429d61da2a18094ddb730953d4e7344d9e364736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x989 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x907 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x7B1 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1DE5D844 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x333 JUMPI PUSH4 0xD505ACCF EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x7F PUSH2 0x533 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x32E JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x32E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP5 AND SWAP4 DUP5 ISZERO PUSH2 0x304 JUMPI DUP2 TIMESTAMP GT PUSH2 0x2D6 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP8 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP10 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE DUP9 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x16D PUSH1 0xE0 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x178 PUSH2 0x5C6 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1BD PUSH1 0x62 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x2CA JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x2A0 JUMPI DUP3 ISZERO PUSH2 0x272 JUMPI PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x36A PUSH2 0x533 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH1 0x20 PUSH2 0x3F1 PUSH2 0x5C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x430 PUSH2 0x79A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x506 JUMPI PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xE136D7B577E24834119BEC976C568A497F54CF7B8BEF8B9534F1AC7A342834A0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32E JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x597 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP1 PUSH1 0x1 DUP5 AND SWAP4 DUP5 ISZERO PUSH2 0x790 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT DUP6 EQ PUSH2 0x763 JUMPI DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 DUP5 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x729 JUMPI POP PUSH1 0x1 EQ PUSH2 0x6AA JUMPI JUMPDEST PUSH2 0x630 SWAP3 POP SUB DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x6A4 PUSH1 0xC0 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 SWAP2 PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 JUMPDEST DUP2 DUP4 LT PUSH2 0x70D JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x630 SWAP3 DUP3 ADD ADD PUSH2 0x624 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x6F5 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 MSTORE POP PUSH2 0x630 SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD PUSH1 0x20 ADD SWAP1 POP PUSH2 0x624 JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x600 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8C7 JUMPI JUMPDEST PUSH2 0x8C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x825 JUMPI JUMPDEST POP PUSH2 0x822 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x880 JUMPI JUMPDEST POP CODESIZE PUSH2 0x818 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8BA JUMPI JUMPDEST DUP2 PUSH2 0x899 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x556 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x8B6 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x8B3 JUMPI POP CODESIZE PUSH2 0x879 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x88C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7E1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP14 0xA5 DUPN 0x8 TLOAD 0x2F 0xC4 0xBF DUPN 0x98 SUB 0xC0 0x24 JUMP PREVRANDAO 0x29 0xD6 SAR LOG2 LOG1 DUP1 SWAP5 0xDD 0xB7 ADDRESS SWAP6 RETURNDATASIZE 0x4E PUSH20 0x44D9E364736F6C634300081E0033000000000000 ","sourceMap":"858:1089:263:-:0;;;;;;;;;;;;;-1:-1:-1;;858:1089:263;;;;-1:-1:-1;;;;;858:1089:263;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;858:1089:263;;;;;;745:39:76;;858:1089:263;;;;;;;;745:39:76;858:1089:263;;;;;;;-1:-1:-1;858:1089:263;;;;;;-1:-1:-1;858:1089:263;;;;;-1:-1:-1;858:1089:263"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1331,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":1366,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":1478,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_msgSender":{"entryPoint":1946,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1969}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80631de5d844146103f95780633644e515146103b85780637ecebe00146103335763d505accf1461004857600080fd5b3461032e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761007f610533565b6024359073ffffffffffffffffffffffffffffffffffffffff821680920361032e576044356064356084359060ff821680920361032e5773ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d9416938415610304578142116102d6576020926000926080928785528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528960408401528a6060840152888684015260a083015260c082015260c0815261016d60e082610556565b5190206101786105c6565b9060405190868201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526101bd606282610556565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156102ca578173ffffffffffffffffffffffffffffffffffffffff60005116036102a05782156102725760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055604051908152a3005b507ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b3461032e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761036a610533565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5760206103f16105c6565b604051908152f35b3461032e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032e5761043061079a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610506577f9d8ff7da000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fe136d7b577e24834119bec976c568a497f54cf7b8bef8b9534f1ac7a342834a080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032e57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516000907f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8154918260011c9060018416938415610790575b602083108514610763578284526020840194849291811561072957506001146106aa575b61063092500382610556565b51902060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526106a460c082610556565b51902090565b507f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81600090815290917fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa4285b81831061070d57505090602061063092820101610624565b60209193508060019154838588010152019101909183926106f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686525061063092151560051b82016020019050610624565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f1691610600565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108c25732331480156108c7575b6108c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610825575b5061082257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156102ca57600091610880575b5038610818565b6020813d6020116108ba575b8161089960209383610556565b810103126108b657519081151582036108b3575038610879565b80fd5b5080fd5b3d915061088c565b503390565b50601836106107e156fea26469706673582212209da5e6085c2fc4bfe69803c024564429d61da2a18094ddb730953d4e7344d9e364736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1DE5D844 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x333 JUMPI PUSH4 0xD505ACCF EQ PUSH2 0x48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x7F PUSH2 0x533 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x32E JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x32E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP5 AND SWAP4 DUP5 ISZERO PUSH2 0x304 JUMPI DUP2 TIMESTAMP GT PUSH2 0x2D6 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP8 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP10 PUSH1 0x40 DUP5 ADD MSTORE DUP11 PUSH1 0x60 DUP5 ADD MSTORE DUP9 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x16D PUSH1 0xE0 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x178 PUSH2 0x5C6 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1BD PUSH1 0x62 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x2CA JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x2A0 JUMPI DUP3 ISZERO PUSH2 0x272 JUMPI PUSH1 0x20 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x36A PUSH2 0x533 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH1 0x20 PUSH2 0x3F1 PUSH2 0x5C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32E JUMPI PUSH2 0x430 PUSH2 0x79A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x506 JUMPI PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xE136D7B577E24834119BEC976C568A497F54CF7B8BEF8B9534F1AC7A342834A0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32E JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x597 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP1 PUSH1 0x1 DUP5 AND SWAP4 DUP5 ISZERO PUSH2 0x790 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT DUP6 EQ PUSH2 0x763 JUMPI DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 DUP5 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x729 JUMPI POP PUSH1 0x1 EQ PUSH2 0x6AA JUMPI JUMPDEST PUSH2 0x630 SWAP3 POP SUB DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x6A4 PUSH1 0xC0 DUP3 PUSH2 0x556 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST POP PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 SWAP2 PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 JUMPDEST DUP2 DUP4 LT PUSH2 0x70D JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x630 SWAP3 DUP3 ADD ADD PUSH2 0x624 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP4 SWAP3 PUSH2 0x6F5 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 MSTORE POP PUSH2 0x630 SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD PUSH1 0x20 ADD SWAP1 POP PUSH2 0x624 JUMP JUMPDEST PUSH1 0x24 DUP3 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x600 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8C2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8C7 JUMPI JUMPDEST PUSH2 0x8C2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x825 JUMPI JUMPDEST POP PUSH2 0x822 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x880 JUMPI JUMPDEST POP CODESIZE PUSH2 0x818 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8BA JUMPI JUMPDEST DUP2 PUSH2 0x899 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x556 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x8B6 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x8B3 JUMPI POP CODESIZE PUSH2 0x879 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x88C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x7E1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP14 0xA5 DUPN 0x8 TLOAD 0x2F 0xC4 0xBF DUPN 0x98 SUB 0xC0 0x24 JUMP PREVRANDAO 0x29 0xD6 SAR LOG2 LOG1 DUP1 SWAP5 0xDD 0xB7 ADDRESS SWAP6 RETURNDATASIZE 0x4E PUSH20 0x44D9E364736F6C634300081E0033000000000000 ","sourceMap":"858:1089:263:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2404:19:279;;;2400:60;;2474:15;;:26;2470:67;;858:1089:263;2653:23:279;858:1089:263;2653:23:279;858:1089:263;2653:23:279;858:1089:263;;;;;;;;;;;1021:95:279;858:1089:263;1021:95:279;;;;858:1089:263;;2602:87:279;;;;858:1089:263;1021:95:279;858:1089:263;;1021:95:279;858:1089:263;1021:95:279;;858:1089:263;1021:95:279;858:1089:263;1021:95:279;;858:1089:263;1021:95:279;;;;858:1089:263;;1021:95:279;;858:1089:263;;1021:95:279;;858:1089:263;;2602:87:279;;;858:1089:263;2602:87:279;;:::i;:::-;858:1089:263;2592:98:279;;2758:18;;:::i;:::-;858:1089:263;;;2729:60:279;;;;1021:95;;;;;;;858:1089:263;1021:95:279;;;858:1089:263;1021:95:279;2729:60;;;;;;:::i;:::-;858:1089:263;2719:71:279;;858:1089:263;;;;;;1021:95:279;;;;858:1089:263;;;1021:95:279;;858:1089:263;;;;1021:95:279;;858:1089:263;2821:24:279;;;858:1089:263;2821:24:279;;;;;;858:1089:263;;2821:24:279;858:1089:263;2863:15:279;2859:57;;4533:21:280;;4529:67;;858:1089:263;4657:31:280;4606:19;858:1089:263;;;4606:12:280;858:1089:263;;;;;;-1:-1:-1;858:1089:263;;;;;-1:-1:-1;858:1089:263;1021:95:279;858:1089:263;;;;;4657:31:280;858:1089:263;4529:67:280;4563:33;;858:1089:263;4563:33:280;858:1089:263;;;;4563:33:280;2859:57:279;2887:29;858:1089:263;2887:29:279;858:1089:263;;2887:29:279;2821:24;858:1089:263;;1021:95:279;858:1089:263;1021:95:279;;;;;2470:67;2509:28;;858:1089:263;2509:28:279;858:1089:263;;;;2509:28:279;2400:60;2432:28;858:1089:263;2432:28:279;858:1089:263;;2432:28:279;858:1089:263;;;;;;;;;;;;;;;;;:::i;:::-;;;3281:22:279;858:1089:263;-1:-1:-1;858:1089:263;;;;;-1:-1:-1;858:1089:263;;;;;;;;;;;;;;;;;;;;1284:37:248;;:::i;:::-;858:1089:263;;;;;;;;;;;;;;;;;1664:41;;:::i;:::-;858:1089;;;;;;;3174:18:180;;;3170:53;;1298:30:279;858:1089:263;500:10:59;858:1089:263;500:10:59;;;;;;;636:1:180;500:10:59;;;858:1089:263;3170:53:180;3201:22;858:1089:263;3201:22:180;858:1089:263;;;;3201:22:180;858:1089:263;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;858:1089:263;;;;;-1:-1:-1;858:1089:263;4317:545:279;858:1089:263;;-1:-1:-1;858:1089:263;;;;;733:1:277;858:1089:263;;733:1:277;858:1089:263;;;;;;;4317:545:279;858:1089:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4669:54:279;;858:1089:263;;;4520:321:279;;858:1089:263;4552:95:279;858:1089:263;;;;;;4745:14:279;858:1089:263;;;;4412:53:279;858:1089:263;;;;4818:4:279;858:1089:263;;;;;4520:321:279;;;;;;:::i;:::-;858:1089:263;4493:362:279;;4317:545;:::o;858:1089:263:-;-1:-1:-1;858:1089:263;-1:-1:-1;858:1089:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;733:1:277;858:1089:263;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:1089:263;;;;;;;;;;;-1:-1:-1;858:1089:263;;;;;;;;;;;;;;;;;;;907:917:76;858:1089:263;1029:19:76;858:1089:263;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;858:1089:263;;;;;;1676:74:76;;;;858:1089:263;1676:74:76;;;;;;858:1089:263;1327:10:76;858:1089:263;;;;1744:4:76;858:1089:263;;;;1676:74:76;;;;;;;858:1089:263;1676:74:76;;;1630:120;;;;;1676:74;858:1089:263;1676:74:76;;858:1089:263;1676:74:76;;;;;;858:1089:263;1676:74:76;;;:::i;:::-;;;858:1089:263;;;;;;;;;;;;;1676:74:76;;;;858:1089:263;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"462200","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","initERC20PermitStorage()":"infinite","nonces(address)":"2421","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","initERC20PermitStorage()":"1de5d844","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC20PermitStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"initERC20PermitStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Permit (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"initERC20PermitStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20Permit.\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20PermitFacet.sol\":\"ERC20PermitFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20PermitFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../base/ERC20PermitBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ERC20DetailedFacet}.\\ncontract ERC20PermitFacet is ERC20PermitBase, ForwarderRegistryContextBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20PermitStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20PermitStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x056fa03def6ad26ffde135a453cc0d1fcd2ae27a72ee64a5132f45da2008e676\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"initERC20PermitStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20Permit."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"}},"version":1}}},"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol":{"ERC20SafeTransfersFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"initERC20SafeTransfersStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"initERC20SafeTransfersStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}}},"title":"ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610b9838819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610b1690816100828239608051816106470152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063b88d4fde14610241578063d294f8eb146101075763eb7955491461003d57600080fd5b346101025760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761007461050a565b60243560443567ffffffffffffffff81116101025761009790369060040161052d565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926100d083836100c9610630565b809761093f565b813b6100e2575b602060405160018152f35b6100f8946100f19136916105cb565b9280610773565b38808080806100d7565b600080fd5b346101025760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761013e610630565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610214577f53f41a97000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101025760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761027861050a565b60243573ffffffffffffffffffffffffffffffffffffffff811681036101025760443560643567ffffffffffffffff8111610102576102bb90369060040161052d565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee936102e8610630565b9484848473ffffffffffffffffffffffffffffffffffffffff89169373ffffffffffffffffffffffffffffffffffffffff821694808603610360575b5061032f945061093f565b823b61034057602060405160018152f35b6103559561034f9136916105cb565b93610773565b8080808080806100d7565b925092505080156104dc578487928792856000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002081600052602052604060002054957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871415806104d3575b61040e575b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602061032f98604051908152a38b610324565b9350939094809250039080821015610490575061032f93889388937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560208a95836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055985050506103da565b889150608493604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508515156103d5565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010257565b9181601f840112156101025782359167ffffffffffffffff8311610102576020838186019501011161010257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b92919267ffffffffffffffff821161059c576040519161061360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461055b565b829481845281830111610102578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610764573233148015610769575b610764577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bb575b506106b857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561075857600091610716575b50386106ae565b6020813d602011610750575b8161072f6020938361055b565b8101031261074c575190811515820361074957503861070f565b80fd5b5080fd5b3d9150610722565b6040513d6000823e3d90fd5b503390565b5060183610610677565b9290939173ffffffffffffffffffffffffffffffffffffffff8091169481604051957f4fc358590000000000000000000000000000000000000000000000000000000087521660048601521660248401526044830152608060648301528181519182608483015260005b83811061092757505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610758576000916108ac575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361087f5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d60201161091f575b816108c56020938361055b565b8101031261074c5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361074957507fffffffff00000000000000000000000000000000000000000000000000000000610832565b3d91506108b8565b602082820181015160a48784010152859350016107dd565b929173ffffffffffffffffffffffffffffffffffffffff16928315610a9c57826109a9575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610a5057508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610a29575b5050925050610964565b83831660005281855260406000205586600052835260406000208581540190553880610a1f565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220d1f9b01cdc3baec385c7895da10587a42bcec1e0aadc2bed37caa90c13cde77a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xB98 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xB16 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x647 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0xD294F8EB EQ PUSH2 0x107 JUMPI PUSH4 0xEB795549 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x74 PUSH2 0x50A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x102 JUMPI PUSH2 0x97 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x52D JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xD0 DUP4 DUP4 PUSH2 0xC9 PUSH2 0x630 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x93F JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xF8 SWAP5 PUSH2 0xF1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x5CB JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x773 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x13E PUSH2 0x630 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x214 JUMPI PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x278 PUSH2 0x50A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x102 JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x102 JUMPI PUSH2 0x2BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x52D JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x2E8 PUSH2 0x630 JUMP JUMPDEST SWAP5 DUP5 DUP5 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP1 DUP7 SUB PUSH2 0x360 JUMPI JUMPDEST POP PUSH2 0x32F SWAP5 POP PUSH2 0x93F JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x355 SWAP6 PUSH2 0x34F SWAP2 CALLDATASIZE SWAP2 PUSH2 0x5CB JUMP JUMPDEST SWAP4 PUSH2 0x773 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xD7 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP DUP1 ISZERO PUSH2 0x4DC JUMPI DUP5 DUP8 SWAP3 DUP8 SWAP3 DUP6 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 EQ ISZERO DUP1 PUSH2 0x4D3 JUMPI JUMPDEST PUSH2 0x40E JUMPI JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH2 0x32F SWAP9 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP12 PUSH2 0x324 JUMP JUMPDEST SWAP4 POP SWAP4 SWAP1 SWAP5 DUP1 SWAP3 POP SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x490 JUMPI POP PUSH2 0x32F SWAP4 DUP9 SWAP4 DUP9 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 DUP11 SWAP6 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP9 POP POP POP PUSH2 0x3DA JUMP JUMPDEST DUP9 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP6 ISZERO ISZERO PUSH2 0x3D5 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x102 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x102 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x102 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x102 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x59C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x59C JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x613 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x55B JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x102 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x764 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x769 JUMPI JUMPDEST PUSH2 0x764 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BB JUMPI JUMPDEST POP PUSH2 0x6B8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x716 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x750 JUMPI JUMPDEST DUP2 PUSH2 0x72F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x55B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x74C JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x749 JUMPI POP CODESIZE PUSH2 0x70F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x677 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP5 DUP2 PUSH1 0x40 MLOAD SWAP6 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x927 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8AC JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x87F JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x91F JUMPI JUMPDEST DUP2 PUSH2 0x8C5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x55B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x74C JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x749 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x832 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x7DD JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xA9C JUMPI DUP3 PUSH2 0x9A9 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xA50 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xA29 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x964 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xA1F JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DATALOADN 0xF9B0 SHR 0xDC EXTCODESIZE 0xAE 0xC3 DUP6 0xC7 DUP10 TSTORE LOG1 SDIV DUP8 LOG4 0x2B 0xCE 0xC1 RJUMP 0xAADC 0x2B 0xED CALLDATACOPY 0xCA 0xA9 0xC SGT 0xCD SWAPN 0x7A PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"846:1070:264:-:0;;;;;;;;;;;;;-1:-1:-1;;846:1070:264;;;;-1:-1:-1;;;;;846:1070:264;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;846:1070:264;;;;;;745:39:76;;846:1070:264;;;;;;;;745:39:76;846:1070:264;;;;;;;-1:-1:-1;846:1070:264;;;;;;-1:-1:-1;846:1070:264;;;;;-1:-1:-1;846:1070:264"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1290,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":1483,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":1325,"id":null,"parameterSlots":2,"returnSlots":2},"finalize_allocation":{"entryPoint":1371,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":1907,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_msgSender":{"entryPoint":1584,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transfer":{"entryPoint":2367,"id":29123,"parameterSlots":4,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1607}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063b88d4fde14610241578063d294f8eb146101075763eb7955491461003d57600080fd5b346101025760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761007461050a565b60243560443567ffffffffffffffff81116101025761009790369060040161052d565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee926100d083836100c9610630565b809761093f565b813b6100e2575b602060405160018152f35b6100f8946100f19136916105cb565b9280610773565b38808080806100d7565b600080fd5b346101025760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761013e610630565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610214577f53f41a97000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101025760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101025761027861050a565b60243573ffffffffffffffffffffffffffffffffffffffff811681036101025760443560643567ffffffffffffffff8111610102576102bb90369060040161052d565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee936102e8610630565b9484848473ffffffffffffffffffffffffffffffffffffffff89169373ffffffffffffffffffffffffffffffffffffffff821694808603610360575b5061032f945061093f565b823b61034057602060405160018152f35b6103559561034f9136916105cb565b93610773565b8080808080806100d7565b925092505080156104dc578487928792856000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002081600052602052604060002054957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871415806104d3575b61040e575b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602061032f98604051908152a38b610324565b9350939094809250039080821015610490575061032f93889388937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560208a95836000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8252604060002085600052825280604060002055985050506103da565b889150608493604051937f137ad6ab0000000000000000000000000000000000000000000000000000000085526004850152602484015260448301526064820152fd5b508515156103d5565b827ff7e1ac0f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010257565b9181601f840112156101025782359167ffffffffffffffff8311610102576020838186019501011161010257565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b92919267ffffffffffffffff821161059c576040519161061360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461055b565b829481845281830111610102578281602093846000960137010152565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610764573233148015610769575b610764577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106bb575b506106b857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561075857600091610716575b50386106ae565b6020813d602011610750575b8161072f6020938361055b565b8101031261074c575190811515820361074957503861070f565b80fd5b5080fd5b3d9150610722565b6040513d6000823e3d90fd5b503390565b5060183610610677565b9290939173ffffffffffffffffffffffffffffffffffffffff8091169481604051957f4fc358590000000000000000000000000000000000000000000000000000000087521660048601521660248401526044830152608060648301528181519182608483015260005b83811061092757505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610758576000916108ac575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361087f5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d60201161091f575b816108c56020938361055b565b8101031261074c5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361074957507fffffffff00000000000000000000000000000000000000000000000000000000610832565b3d91506108b8565b602082820181015160a48784010152859350016107dd565b929173ffffffffffffffffffffffffffffffffffffffff16928315610a9c57826109a9575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015610a5057508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603610a29575b5050925050610964565b83831660005281855260406000205586600052835260406000208581540190553880610a1f565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220d1f9b01cdc3baec385c7895da10587a42bcec1e0aadc2bed37caa90c13cde77a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0xD294F8EB EQ PUSH2 0x107 JUMPI PUSH4 0xEB795549 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x74 PUSH2 0x50A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x102 JUMPI PUSH2 0x97 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x52D JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xD0 DUP4 DUP4 PUSH2 0xC9 PUSH2 0x630 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x93F JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xF8 SWAP5 PUSH2 0xF1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x5CB JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x773 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x13E PUSH2 0x630 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x214 JUMPI PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x102 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x102 JUMPI PUSH2 0x278 PUSH2 0x50A JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x102 JUMPI PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x102 JUMPI PUSH2 0x2BB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x52D JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x2E8 PUSH2 0x630 JUMP JUMPDEST SWAP5 DUP5 DUP5 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP5 DUP1 DUP7 SUB PUSH2 0x360 JUMPI JUMPDEST POP PUSH2 0x32F SWAP5 POP PUSH2 0x93F JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x355 SWAP6 PUSH2 0x34F SWAP2 CALLDATASIZE SWAP2 PUSH2 0x5CB JUMP JUMPDEST SWAP4 PUSH2 0x773 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xD7 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP DUP1 ISZERO PUSH2 0x4DC JUMPI DUP5 DUP8 SWAP3 DUP8 SWAP3 DUP6 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 EQ ISZERO DUP1 PUSH2 0x4D3 JUMPI JUMPDEST PUSH2 0x40E JUMPI JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH2 0x32F SWAP9 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP12 PUSH2 0x324 JUMP JUMPDEST SWAP4 POP SWAP4 SWAP1 SWAP5 DUP1 SWAP3 POP SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x490 JUMPI POP PUSH2 0x32F SWAP4 DUP9 SWAP4 DUP9 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 DUP11 SWAP6 DUP4 PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP9 POP POP POP PUSH2 0x3DA JUMP JUMPDEST DUP9 SWAP2 POP PUSH1 0x84 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE REVERT JUMPDEST POP DUP6 ISZERO ISZERO PUSH2 0x3D5 JUMP JUMPDEST DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x102 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x102 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x102 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x102 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x59C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x59C JUMPI PUSH1 0x40 MLOAD SWAP2 PUSH2 0x613 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD DUP5 PUSH2 0x55B JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x102 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x764 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x769 JUMPI JUMPDEST PUSH2 0x764 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6BB JUMPI JUMPDEST POP PUSH2 0x6B8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x716 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x750 JUMPI JUMPDEST DUP2 PUSH2 0x72F PUSH1 0x20 SWAP4 DUP4 PUSH2 0x55B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x74C JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x749 JUMPI POP CODESIZE PUSH2 0x70F JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x722 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x677 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 AND SWAP5 DUP2 PUSH1 0x40 MLOAD SWAP6 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x927 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x8AC JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x87F JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x91F JUMPI JUMPDEST DUP2 PUSH2 0x8C5 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x55B JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x74C JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x749 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x832 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x8B8 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x7DD JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xA9C JUMPI DUP3 PUSH2 0x9A9 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0xA50 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0xA29 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x964 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0xA1F JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DATALOADN 0xF9B0 SHR 0xDC EXTCODESIZE 0xAE 0xC3 DUP6 0xC7 DUP10 TSTORE LOG1 SDIV DUP8 LOG4 0x2B 0xCE 0xC1 RJUMP 0xAADC 0x2B 0xED CALLDATACOPY 0xCA 0xA9 0xC SGT 0xCD SWAPN 0x7A PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"846:1070:264:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;846:1070:264;1633:41;17093:5:280;1633:41:264;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;846:1070:264;;;;;;;;17109:96:280;17145:49;846:1070:264;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;846:1070:264;;;;;;;;;;;;;;;1633:41;;:::i;:::-;846:1070;;;;;;;3174:18:180;;;3170:53;;3431:37:280;846:1070:264;500:10:59;846:1070:264;500:10:59;;;;;;;636:1:180;500:10:59;;;846:1070:264;3170:53:180;3201:22;846:1070:264;3201:22:180;846:1070:264;;;;3201:22:180;846:1070:264;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;846:1070:264;1633:41;;;:::i;:::-;846:1070;;;;;;;;;;;9707:14:280;;;;9703:85;;846:1070:264;9818:5:280;;;;;:::i;:::-;376:58:354;;18723:98:280;;846:1070:264;;;;;;;18723:98:280;18759:51;846:1070:264;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;6808:21;;;;;;;6804:67;;6908:19;;;;;846:1070:264;-1:-1:-1;846:1070:264;6908:12:280;846:1070:264;;;-1:-1:-1;846:1070:264;;-1:-1:-1;846:1070:264;;;;-1:-1:-1;846:1070:264;;6951:37:280;6971:17;6951:37;;;:51;;;9703:85;6947:534;;9703:85;7495:42;846:1070:264;9818:5:280;846:1070:264;;;;;;7495:42:280;9703:85;;;6947:534;846:1070:264;;;;;;;;;7238:32:280;;;;;7234:112;;7364:19;9818:5;7364:19;;;;;7495:42;846:1070:264;7364:19:280;;846:1070:264;-1:-1:-1;846:1070:264;6908:12:280;846:1070:264;;;-1:-1:-1;846:1070:264;;-1:-1:-1;846:1070:264;;;;;-1:-1:-1;846:1070:264;;6947:534:280;;;;;;7234:112;846:1070:264;;;7279:67:280;846:1070:264;;;7279:67:280;;;;846:1070:264;7279:67:280;;846:1070:264;;;;;;;;;;;;;7279:67:280;6951:51;6992:10;;;;6951:51;;6804:67;6838:33;;846:1070:264;6838:33:280;846:1070:264;;;;6838:33:280;846:1070:264;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;846:1070:264;;;;;-1:-1:-1;846:1070:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;846:1070:264;;;;;;:::o;907:917:76:-;846:1070:264;1029:19:76;846:1070:264;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;846:1070:264;;;;;;1676:74:76;;;;846:1070:264;1676:74:76;;;;;;846:1070:264;1327:10:76;846:1070:264;;;;1744:4:76;846:1070:264;;;;1676:74:76;;;;;;;846:1070:264;1676:74:76;;;1630:120;;;;;1676:74;846:1070:264;1676:74:76;;846:1070:264;1676:74:76;;;;;;846:1070:264;1676:74:76;;;:::i;:::-;;;846:1070:264;;;;;;;;;;;;;1676:74:76;;;;846:1070:264;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;846:1070:264;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;;;;;846:1070:264;28229:252:280;;846:1070:264;;;;;28357:61:280;846:1070:264;28357:61:280;;846:1070:264;28357:61:280;;;846:1070:264;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;846:1070:264;;;;;;;;;;;;;-1:-1:-1;846:1070:264;;;;;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;846:1070:264;;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;846:1070:264;;-1:-1:-1;28445:29:280;28357:61;846:1070:264;28357:61:280;;846:1070:264;28357:61:280;;;;;;846:1070:264;28357:61:280;;;:::i;:::-;;;846:1070:264;;;;;;;;;;;;;28357:61:280;846:1070:264;28357:61:280;;;;;-1:-1:-1;28357:61:280;;846:1070:264;;;;;;;;;;;;;;;;-1:-1:-1;846:1070:264;;;8105:628:280;;;846:1070:264;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;846:1070:264;;;8701:25:280;846:1070:264;;;;;;;8701:25:280;;8105:628::o;8273:413::-;846:1070:264;;;-1:-1:-1;846:1070:264;;;;;-1:-1:-1;846:1070:264;;;;;8437:21:280;;;;;8433:80;;846:1070:264;;;;;;;;8701:25:280;846:1070:264;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;846:1070:264;;;-1:-1:-1;846:1070:264;;;;;-1:-1:-1;846:1070:264;;;-1:-1:-1;846:1070:264;;;;-1:-1:-1;846:1070:264;;;;;;;8531:131:280;;;;8433:80;8467:46;;846:1070:264;8467:46:280;;8219:1;8467:46;846:1070:264;8467:46:280;846:1070:264;;;;;;8219:1:280;8467:46;8201:61;846:1070:264;8230:32:280;;8219:1;8230:32;846:1070:264;8230:32:280;846:1070:264;;8219:1:280;8230:32"},"gasEstimates":{"creation":{"codeDepositCost":"567600","executionCost":"infinite","totalCost":"infinite"},"external":{"initERC20SafeTransfersStorage()":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initERC20SafeTransfersStorage()":"d294f8eb","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"initERC20SafeTransfersStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"initERC20SafeTransfersStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"initERC20SafeTransfersStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol\":\"ERC20SafeTransfersFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/facets/ERC20SafeTransfersFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../base/ERC20SafeTransfersBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC20SafeTransfersFacet is ERC20SafeTransfersBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC20SafeTransfersStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x233dbea2002b2ebdba3c0a0a255adf92ead39f6fd7fb2547e3840c4c5e97c11b\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"initERC20SafeTransfersStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20.sol":{"IERC20":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: The ERC-165 identifier for this interface is 0x36372b07.","kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Token Standard, basic interface (functions).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: The ERC-165 identifier for this interface is 0x36372b07.\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Token Standard, basic interface (functions).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Allowance.sol":{"IERC20Allowance":{"abi":[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x9d075186.","kind":"dev","methods":{"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Token Standard, optional extension: Allowance.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x9d075186.\",\"kind\":\"dev\",\"methods\":{\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Allowance.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":\"IERC20Allowance\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol":{"IERC20BatchTransfers":{"abi":[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0xc05327e6.","kind":"dev","methods":{"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"result":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Token Standard, optional extension: Batch Transfers.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0xc05327e6.\",\"kind\":\"dev\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Batch Transfers.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":\"IERC20BatchTransfers\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Burnable.sol":{"IERC20Burnable":{"abi":[{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.","kind":"dev","methods":{"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"result":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"result":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Token Standard, optional extension: Burnable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address[],uint256[])":"1b9a7529","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\",\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Burnable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":\"IERC20Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Detailed.sol":{"IERC20Detailed":{"abi":[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"nbDecimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0xa219a025.","kind":"dev","methods":{"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"nbDecimals":"The number of decimals used to display the balances."}},"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}}},"title":"ERC20 Token Standard, optional extension: Detailed.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"nbDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0xa219a025.\",\"kind\":\"dev\",\"methods\":{\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"nbDecimals\":\"The number of decimals used to display the balances.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Detailed.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":\"IERC20Detailed\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Metadata.sol":{"IERC20Metadata":{"abi":[{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-1046Note: the ERC-165 identifier for this interface is 0x3c130d90.","kind":"dev","methods":{"tokenURI()":{"returns":{"uri":"The token metadata URI."}}},"title":"ERC20 Token Standard, ERC1046 optional extension: Metadata.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"tokenURI()":"3c130d90"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-1046Note: the ERC-165 identifier for this interface is 0x3c130d90.\",\"kind\":\"dev\",\"methods\":{\"tokenURI()\":{\"returns\":{\"uri\":\"The token metadata URI.\"}}},\"title\":\"ERC20 Token Standard, ERC1046 optional extension: Metadata.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":\"IERC20Metadata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"tokenURI()":{"notice":"Gets the token metadata URI."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Mintable.sol":{"IERC20Mintable":{"abi":[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x28963e1e.","kind":"dev","methods":{"batchMint(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the total supply overflows.Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"mint(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the total supply overflows.Emits an {IERC20-Transfer} event with `from` set to the zero address.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}}},"title":"ERC20 Token Standard, optional extension: Mintable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchMint(address[],uint256[])":"68573107","mint(address,uint256)":"40c10f19"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x28963e1e.\",\"kind\":\"dev\",\"methods\":{\"batchMint(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the total supply overflows.Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the total supply overflows.Emits an {IERC20-Transfer} event with `from` set to the zero address.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Mintable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":\"IERC20Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC20Permit.sol":{"IERC20Permit":{"abi":[{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2612Note: the ERC-165 identifier for this interface is 0x9d8ff7da.","kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"domainSeparator":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"nonce":"The current permit nonce of `owner`."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}}},"title":"ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2612Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"domainSeparator\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"nonce\":\"The current permit nonce of `owner`.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}}},\"title\":\"ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"}},\"notice\":\"Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":\"IERC20Permit\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"}},"notice":"Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.","version":1}}},"contracts/token/ERC20/interfaces/IERC20Receiver.sol":{"IERC20Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x4fc35859.","kind":"dev","methods":{"onERC20Received(address,address,uint256,bytes)":{"details":"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.","params":{"data":"Optional additional data with no specified format.","from":"The previous tokens owner.","operator":"The initiator of the safe transfer.","value":"The amount of tokens transferred."},"returns":{"magicValue":"`bytes4(keccak256(\"onERC20Received(address,address,uint256,bytes)\"))` (`0x4fc35859`) to accept, any other value to refuse."}}},"title":"ERC20 Token Standard, Tokens Receiver.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC20Received(address,address,uint256,bytes)":"4fc35859"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC20Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x4fc35859.\",\"kind\":\"dev\",\"methods\":{\"onERC20Received(address,address,uint256,bytes)\":{\"details\":\"Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous tokens owner.\",\"operator\":\"The initiator of the safe transfer.\",\"value\":\"The amount of tokens transferred.\"},\"returns\":{\"magicValue\":\"`bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\"}}},\"title\":\"ERC20 Token Standard, Tokens Receiver.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onERC20Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of ERC20 tokens.\"}},\"notice\":\"Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":\"IERC20Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"onERC20Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of ERC20 tokens."}},"notice":"Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.","version":1}}},"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol":{"IERC20SafeTransfers":{"abi":[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x53f41a97.","kind":"dev","methods":{"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}}},"title":"ERC20 Token Standard, optional extension: Safe Transfers.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-20Note: the ERC-165 identifier for this interface is 0x53f41a97.\",\"kind\":\"dev\",\"methods\":{\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}}},\"title\":\"ERC20 Token Standard, optional extension: Safe Transfers.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":\"IERC20SafeTransfers\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."}},"version":1}}},"contracts/token/ERC20/interfaces/IERC677.sol":{"IERC677":{"abi":[{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://github.com/ethereum/EIPs/issues/677","kind":"dev","methods":{},"title":"ERC677 transferAndCall Token Standard, basic interface.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"transferAndCall(address,uint256,bytes)":"4000aea0"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://github.com/ethereum/EIPs/issues/677\",\"kind\":\"dev\",\"methods\":{},\"title\":\"ERC677 transferAndCall Token Standard, basic interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC677.sol\":\"IERC677\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC677.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC677 transferAndCall Token Standard, basic interface.\\n/// @dev See https://github.com/ethereum/EIPs/issues/677\\ninterface IERC677 {\\n    function transferAndCall(address receiver, uint256 amount, bytes calldata data) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xed79ca04cc24f42596c4c6fcfa3e3add4cdef9302015b0e5e3f3ede7c4956671\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/interfaces/IERC677Receiver.sol":{"IERC677Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://github.com/ethereum/EIPs/issues/677","kind":"dev","methods":{},"title":"ERC677 transferAndCall Token Standard, receiver interface.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onTokenTransfer(address,uint256,bytes)":"a4c0ed36"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://github.com/ethereum/EIPs/issues/677\",\"kind\":\"dev\",\"methods\":{},\"title\":\"ERC677 transferAndCall Token Standard, receiver interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/interfaces/IERC677Receiver.sol\":\"IERC677Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC20/interfaces/IERC677Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC677 transferAndCall Token Standard, receiver interface.\\n/// @dev See https://github.com/ethereum/EIPs/issues/677\\ninterface IERC677Receiver {\\n    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool success);\\n}\\n\",\"keccak256\":\"0x6622734f4dd330da397e8c05807073796a15024c82105e014ee5920dc29fa968\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol":{"ERC20DetailedStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220bc7a8d995b07611cec9e4216154f0c8a82b834af20f01fc95530f243c4236db364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC PUSH27 0x8D995B07611CEC9E4216154F0C8A82B834AF20F01FC95530F243C4 0x23 PUSH14 0xB364736F6C634300081E00330000 ","sourceMap":"322:3614:277:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220bc7a8d995b07611cec9e4216154f0c8a82b834af20f01fc95530f243c4236db364736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBC PUSH27 0x8D995B07611CEC9E4216154F0C8A82B834AF20F01FC95530F243C4 0x23 PUSH14 0xB364736F6C634300081E00330000 ","sourceMap":"322:3614:277:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"constructorInit(struct ERC20DetailedStorage.Layout storage pointer,string memory,string memory,uint8)":"infinite","decimals(struct ERC20DetailedStorage.Layout storage pointer)":"infinite","layout()":"infinite","name(struct ERC20DetailedStorage.Layout storage pointer)":"infinite","proxyInit(struct ERC20DetailedStorage.Layout storage pointer,string calldata,string calldata,uint8)":"infinite","symbol(struct ERC20DetailedStorage.Layout storage pointer)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":\"ERC20DetailedStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol":{"ERC20MetadataStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122027651e7612910b1a68017d3b54e66bc36beb8a1dd38f2f4250fab1f3556aee2364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x27 PUSH6 0x1E7612910B1A PUSH9 0x17D3B54E66BC36BEB DUP11 SAR 0xD3 DUP16 0x2F TIMESTAMP POP STATICCALL 0xB1 RETURN SSTORE PUSH11 0xEE2364736F6C634300081E STOP CALLER ","sourceMap":"234:1137:278:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122027651e7612910b1a68017d3b54e66bc36beb8a1dd38f2f4250fab1f3556aee2364736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x27 PUSH6 0x1E7612910B1A PUSH9 0x17D3B54E66BC36BEB DUP11 SAR 0xD3 DUP16 0x2F TIMESTAMP POP STATICCALL 0xB1 RETURN SSTORE PUSH11 0xEE2364736F6C634300081E STOP CALLER ","sourceMap":"234:1137:278:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"init()":"infinite","layout()":"infinite","setTokenURI(struct ERC20MetadataStorage.Layout storage pointer,string calldata)":"infinite","tokenURI(struct ERC20MetadataStorage.Layout storage pointer)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":\"ERC20MetadataStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/libraries/ERC20PermitStorage.sol":{"ERC20PermitStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122020143167da3c2b9bee736a5d777df9c88d3f9d2f856060140ae337494a6b6fa164736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 EQ BALANCE PUSH8 0xDA3C2B9BEE736A5D PUSH24 0x7DF9C88D3F9D2F856060140AE337494A6B6FA164736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"471:4573:279:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122020143167da3c2b9bee736a5d777df9c88d3f9d2f856060140ae337494a6b6fa164736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 EQ BALANCE PUSH8 0xDA3C2B9BEE736A5D PUSH24 0x7DF9C88D3F9D2F856060140AE337494A6B6FA164736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"471:4573:279:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"DOMAIN_SEPARATOR()":"infinite","init()":"infinite","layout()":"infinite","nonces(struct ERC20PermitStorage.Layout storage pointer,address)":"infinite","permit(struct ERC20PermitStorage.Layout storage pointer,address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":\"ERC20PermitStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/libraries/ERC20Storage.sol":{"ERC20Storage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122010f7715f84566eed9a53081078d38abe3f6fbfe3aa8ff64979b2b7aaf050c94b64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LT 0xF7 PUSH18 0x5F84566EED9A53081078D38ABE3F6FBFE3AA DUP16 0xF6 BLOBHASH PUSH26 0xB2B7AAF050C94B64736F6C634300081E00330000000000000000 ","sourceMap":"1532:26951:280:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122010f7715f84566eed9a53081078d38abe3f6fbfe3aa8ff64979b2b7aaf050c94b64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LT 0xF7 PUSH18 0x5F84566EED9A53081078D38ABE3F6FBFE3AA DUP16 0xF6 BLOBHASH PUSH26 0xB2B7AAF050C94B64736F6C634300081E00330000000000000000 ","sourceMap":"1532:26951:280:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_callOnERC20Received(address,address,address,uint256,bytes memory)":"infinite","allowance(struct ERC20Storage.Layout storage pointer,address,address)":"infinite","approve(struct ERC20Storage.Layout storage pointer,address,address,uint256)":"infinite","balanceOf(struct ERC20Storage.Layout storage pointer,address)":"infinite","batchBurnFrom(struct ERC20Storage.Layout storage pointer,address,address[] calldata,uint256[] calldata)":"infinite","batchMint(struct ERC20Storage.Layout storage pointer,address[] memory,uint256[] memory)":"infinite","batchTransfer(struct ERC20Storage.Layout storage pointer,address,address[] calldata,uint256[] calldata)":"infinite","batchTransferFrom(struct ERC20Storage.Layout storage pointer,address,address,address[] calldata,uint256[] calldata)":"infinite","burn(struct ERC20Storage.Layout storage pointer,address,uint256)":"infinite","burnFrom(struct ERC20Storage.Layout storage pointer,address,address,uint256)":"infinite","decreaseAllowance(struct ERC20Storage.Layout storage pointer,address,address,uint256)":"infinite","increaseAllowance(struct ERC20Storage.Layout storage pointer,address,address,uint256)":"infinite","init()":"infinite","initERC20BatchTransfers()":"infinite","initERC20Burnable()":"infinite","initERC20Mintable()":"infinite","initERC20SafeTransfers()":"infinite","initWithAllocations(address[] memory,uint256[] memory)":"infinite","layout()":"infinite","mint(struct ERC20Storage.Layout storage pointer,address,uint256)":"infinite","safeTransfer(struct ERC20Storage.Layout storage pointer,address,address,uint256,bytes calldata)":"infinite","safeTransferFrom(struct ERC20Storage.Layout storage pointer,address,address,address,uint256,bytes calldata)":"infinite","totalSupply(struct ERC20Storage.Layout storage pointer)":"infinite","transfer(struct ERC20Storage.Layout storage pointer,address,address,uint256)":"infinite","transferFrom(struct ERC20Storage.Layout storage pointer,address,address,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/libraries/ERC20Storage.sol\":\"ERC20Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC20/preset/ERC20FixedSupply.sol":{"ERC20FixedSupply":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1730,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1693,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":1837,"id":null,"parameterSlots":1,"returnSlots":1},"fun_batchMint":{"entryPoint":1902,"id":29811,"parameterSlots":2,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":1860,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a06040523461066857613442803803806100198161069d565b928339810160c0828203126106685781516001600160401b03811161066857816100449184016106c2565b60208301519092906001600160401b03811161066857826100669183016106c2565b9260408201519060ff82168092036106685760608301516001600160401b0381116106685783019284601f850112156106685783516100ac6100a78261072d565b61069d565b9460208087848152019260051b8201019087821161066857602001915b81831061067d5750505060808101516001600160401b0381116106685781019480601f870112156106685785516101026100a78261072d565b9660208089848152019260051b82010192831161066857602001905b82821061066d5750505060a00151916001600160a01b0383168303610668577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f8054600160ff199182168117909255634e83a8c360e11b6000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680549091169091179055825190926001600160401b03821161053e576000805160206134028339815191525490600182811c9216801561065e575b602083101461051e5781601f8493116105e1575b50602090601f831160011461055f57600092610554575b50508160011b916000199060031b1c191617600080516020613402833981519152555b85516001600160401b03811161053e576000805160206133c283398151915254600181811c91168015610534575b602082101461051e57601f81116104ac575b506020601f82116001146104275781906103979860009261041c575b50508160011b916000199060031b1c1916176000805160206133c2833981519152555b60ff196000805160206134228339815191525416176000805160206134228339815191525563a219a02560e01b600052806020526040600020600160ff19825416179055336103bd575b6307f5828d60e41b600090815260209190915260408082208054600160ff1991821681179092556303c130d960e41b84528284208054821683179055634ec7fbed60e11b845282842080548216831790556353f41a9760e01b8452828420805482168317905563602993f360e11b8452919092208054909116909117905560805261076e565b604051612afb90816108c7823960805181818161167c01528181611b0201526128470152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610311565b0151905038806102a4565b601f198216976000805160206133c2833981519152600052816000209860005b818110610494575091610397999184600195941061047b575b505050811b016000805160206133c2833981519152556102c7565b015160001960f88460031b161c19169055388080610460565b838301518b556001909a019960209384019301610447565b6000805160206133c28339815191526000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610514575b601f0160051c01905b8181106105085750610288565b600081556001016104fb565b90915081906104f2565b634e487b7160e01b600052602260045260246000fd5b90607f1690610276565b634e487b7160e01b600052604160045260246000fd5b015190503880610225565b60008051602061340283398151915260009081528281209350601f198516905b8181106105c957509084600195949392106105b0575b505050811b0160008051602061340283398151915255610248565b015160001960f88460031b161c19169055388080610595565b9293602060018192878601518155019501930161057f565b6000805160206134028339815191526000529091507fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa428601f840160051c81019160208510610654575b90601f859493920160051c01905b818110610645575061020e565b60008155849350600101610638565b909150819061062a565b91607f16916101fa565b600080fd5b815181526020918201910161011e565b82516001600160a01b0381168103610668578152602092830192016100c9565b6040519190601f01601f191682016001600160401b0381118382101761053e57604052565b81601f82011215610668578051906001600160401b03821161053e576106f1601f8301601f191660200161069d565b92828452602083830101116106685760005b82811061071857505060206000918301015290565b80602080928401015182828701015201610703565b6001600160401b03811161053e5760051b60200190565b80518210156107585760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815190805182036108b55781156108b05760009260005b8381106107e15750505050806107995750565b6000805160206133e2833981519152549080820191808311156107ca5750506000805160206133e283398151915255565b6301b352fb60e11b60005260045260245260446000fd5b6001600160a01b036107f38284610744565b5116801561089f576108058285610744565b5180610843575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301610786565b9591908683019283111561088e5760008181527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee60205260409020805488019055919590919061080c565b631550ab9f60e21b60005260046000fd5b6392fd9c8f60e01b60005260046000fd5b505050565b6332c1299b60e11b60005260046000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461188257806306fdde0314611827578063095ea7b3146117ba57806318160ddd1461175f57806323b872dd146116a05780632b4c9f1614611631578063313ce567146115d35780633644e5151461159257806339509351146113625780633c130d90146113075780634885b25414611259578063572b6c051461120e57806370a082311461118957806373c8a958146110065780637ecebe0014610f8157806388d695b214610f3d5780638da5cb5b14610ecc57806395d89b4114610e59578063a457c2d714610dec578063a9059cbb14610d7f578063b88d4fde14610c6f578063c3666c3614610a32578063d505accf146107bf578063dd62ed3e14610710578063e0df5b6f146104c5578063eb79554914610400578063f2fde38b1461030d5763f7ba94bd1461015057600080fd5b346102b15761015e36611a51565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061019f612830565b92541691169081036102e057508181036102b65760005b8181106101bf57005b6101ca818387611ebb565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102b1576101f4828587611ebb565b359081471061027f57600080809381935af13d15610277573d90610217826127a7565b916102256040519384611c4c565b82523d6000602084013e5b1561023e57506001016101b6565b80511561024d57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610230565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610344611947565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61036d612830565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102e0575073ffffffffffffffffffffffffffffffffffffffff16928383036103b357005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610437611947565b60243560443567ffffffffffffffff81116102b15761045a903690600401611abd565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610493838361048c612830565b8097612606565b813b6104a5575b602060405160018152f35b6104bb946104b49136916127e1565b9280612944565b808080808061049a565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760043567ffffffffffffffff81116102b157610514903690600401611abd565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610553612830565b92541691169081036102e057507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106e15761059b8254611bf9565b601f8111610699575b506000601f82116001146105fe578192936000926105f3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106815750836001959610610649575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061063f565b9092602060018192868601358155019401910161062c565b826000526020600020601f830160051c810191602084106106d7575b601f0160051c01905b8181106106cb57506105a4565b600081556001016106be565b90915081906106b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610747611947565b73ffffffffffffffffffffffffffffffffffffffff61076461196a565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102b15760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576107f6611947565b6107fe61196a565b6044359060643560843560ff81168091036102b15773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a08578142116109da576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108e060e082611c4c565b5190206108eb611e14565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610930606282611c4c565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109ce5773ffffffffffffffffffffffffffffffffffffffff60005116036109a4576109a2927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d4f565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102b157610a40366119be565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a85612830565b92541691169081036102e05750808214801590610c65575b6102b65760005b828110610aad57005b73ffffffffffffffffffffffffffffffffffffffff610ad5610ad083858a611ebb565b611efa565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109ce57600091610c37575b5015610c0a575073ffffffffffffffffffffffffffffffffffffffff610b64610ad083858a611ebb565b1690610b74610ad0828689611ebb565b91610b8082878b611ebb565b3592813b156102b157606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109ce57600192610bf9575b5001610aa4565b6000610c0491611c4c565b88610bf2565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c58915060203d8111610c5e575b610c508183611c4c565b810190612818565b89610b3a565b503d610c46565b5082821415610a9d565b346102b15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ca6611947565b610cae61196a565b60443560643567ffffffffffffffff81116102b157610cd1903690600401611abd565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d3d848484610d04612830565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d6e57612606565b823b610d4e57602060405160018152f35b610d6395610d5d9136916127e1565b93612944565b80808080808061049a565b610d7a848b8484612428565b612606565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a610db9611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610de6612830565b90612606565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a610e26611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e53612830565b90612428565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611c8d565b6040519182916020835260208301906118e8565b0390f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102b15761049a610f4e36611a51565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f7b612830565b906121c7565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610fb8611947565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102b157611014366119be565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611057612830565b92541691169081036102e0575080831480159061117f575b6102b65760005b83811061107f57005b61108a818388611ebb565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102b15760006020918a826110cb876110c4610ad0828f8f90611ebb565b938b611ebb565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611126606482611c4c565b51925af1156109ce576000513d6111765750803b155b6111495750600101611076565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561113c565b508583141561106f565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576111c0611947565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602061124f61124a611947565b611aeb565b6040519015158152f35b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157611290611947565b60243567ffffffffffffffff81116102b1576112b090369060040161198d565b916044359267ffffffffffffffff84116102b1576112d561049a94369060040161198d565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611301612830565b90611f1b565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611c8d565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157611399611947565b6024356113a4612830565b9073ffffffffffffffffffffffffffffffffffffffff831692831561154e5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611469575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114f357505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061141a565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760206115cb611e14565b604051908152f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a6116da611947565b6116e261196a565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9161170c612830565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff85160361174d575b5050612606565b611758918484612428565b8584611746565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a6117f4611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611821612830565b90611d4f565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611c8d565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102b15761124f602091611b4a565b919082519283825260005b8481106119325750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016118f3565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102b157565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102b157565b9181601f840112156102b15782359167ffffffffffffffff83116102b1576020808501948460051b0101116102b157565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102b15760043567ffffffffffffffff81116102b15781611a079160040161198d565b9290929160243567ffffffffffffffff81116102b15781611a2a9160040161198d565b929092916044359067ffffffffffffffff82116102b157611a4d9160040161198d565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102b15760043567ffffffffffffffff81116102b15781611a9a9160040161198d565b929092916024359067ffffffffffffffff82116102b157611a4d9160040161198d565b9181601f840112156102b15782359167ffffffffffffffff83116102b157602083818601950101116102b157565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611b435773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611bf3577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611bed576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611c42575b6020831014611c1357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611c08565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e157604052565b9060405191826000825492611ca184611bf9565b8084529360018116908115611d0f5750600114611cc8575b50611cc692500383611c4c565b565b90506000929192526020600020906000915b818310611cf3575050906020611cc69282010138611cb9565b6020919350806001915483858901015201910190918492611cda565b60209350611cc69592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cb9565b929173ffffffffffffffffffffffffffffffffffffffff16928315611dd05773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611e3d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611c8d565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152611eb560c082611c4c565b51902090565b9190811015611ecb5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102b15790565b959490939291928581036102b65780156121be5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110611fb7575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603611fa5575b50505050565b611fae93612428565b38808080611f9f565b73ffffffffffffffffffffffffffffffffffffffff611fda610ad083858b611ebb565b16801561217a57611fec828587611ebb565b35806120b6575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806120ac575b612050575b50600101611f5d565b8a8703908782101561207657600090815260208d90526040902090860190556001612047565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612042565b9a8b810190811115612150579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146121025750906040602093926000908482528552208181540190555b909150611ff3565b9050888298921161211a5750908660209201966120fa565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102b65784156124205773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106122b9575050505050801515806122af575b612228575b5050505050565b808503948086101561226557505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612221565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b508381141561221c565b73ffffffffffffffffffffffffffffffffffffffff6122dc610ad0838589611ebb565b1680156123dc576122ee828587611ebb565b3580612342575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612207565b9687810190811115612150579673ffffffffffffffffffffffffffffffffffffffff891682811461238f57509060019291604060008381528c602052208181540190555b909192506122f5565b8c829c92116123a65750908a60019392019a612386565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff81169384156125c2576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806125b9575b6124f5575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808403938085101561255e5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926124ad565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156124a8565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156127635782612670575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561271757508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036126f0575b505092505061262b565b838316600052818552604060002055866000528352604060002085815401905538806126e6565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106e157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926127ed826127a7565b916127fb6040519384611c4c565b8294818452818301116102b1578281602093846000960137010152565b908160209103126102b1575180151581036102b15790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561293557323314801561293a575b612935577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156128bb575b506128b857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156109ce57600091612916575b50386128ae565b61292f915060203d602011610c5e57610c508183611c4c565b3861290f565b503390565b5060183610612877565b6129b373ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906118e8565b03816000865af19081156109ce57600091612a43575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612a165750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612abd575b81612a5c60209383611c4c565b81010312612ab95751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612ab657507fffffffff000000000000000000000000000000000000000000000000000000006129c9565b80fd5b5080fd5b3d9150612a4f56fea2646970667358221220f27d2386d0ec28605cfc8d68c25f26207c2ff2219d5e678d22bfbf17feaf14dd64736f6c634300081e0033335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a821da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x668 JUMPI PUSH2 0x3442 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x69D JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xC0 DUP3 DUP3 SUB SLT PUSH2 0x668 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP3 PUSH2 0x66 SWAP2 DUP4 ADD PUSH2 0x6C2 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD MLOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x668 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP4 ADD SWAP3 DUP5 PUSH1 0x1F DUP6 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP4 MLOAD PUSH2 0xAC PUSH2 0xA7 DUP3 PUSH2 0x72D JUMP JUMPDEST PUSH2 0x69D JUMP JUMPDEST SWAP5 PUSH1 0x20 DUP1 DUP8 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP1 DUP8 DUP3 GT PUSH2 0x668 JUMPI PUSH1 0x20 ADD SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x67D JUMPI POP POP POP PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x668 JUMPI DUP2 ADD SWAP5 DUP1 PUSH1 0x1F DUP8 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP6 MLOAD PUSH2 0x102 PUSH2 0xA7 DUP3 PUSH2 0x72D JUMP JUMPDEST SWAP7 PUSH1 0x20 DUP1 DUP10 DUP5 DUP2 MSTORE ADD SWAP3 PUSH1 0x5 SHL DUP3 ADD ADD SWAP3 DUP4 GT PUSH2 0x668 JUMPI PUSH1 0x20 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x66D JUMPI POP POP POP PUSH1 0xA0 ADD MLOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP4 SUB PUSH2 0x668 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x4E83A8C3 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE DUP3 MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x53E JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3402 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x65E JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x51E JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x5E1 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x55F JUMPI PUSH1 0x0 SWAP3 PUSH2 0x554 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3402 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x53E JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x534 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x51E JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x4AC JUMPI JUMPDEST POP PUSH1 0x20 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x427 JUMPI DUP2 SWAP1 PUSH2 0x397 SWAP9 PUSH1 0x0 SWAP3 PUSH2 0x41C JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3422 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3422 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH4 0xA219A025 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE CALLER PUSH2 0x3BD JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x3C130D9 PUSH1 0xE4 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4EC7FBED PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x53F41A97 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x602993F3 PUSH1 0xE1 SHL DUP5 MSTORE SWAP2 SWAP1 SWAP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 MSTORE PUSH2 0x76E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2AFB SWAP1 DUP2 PUSH2 0x8C7 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x167C ADD MSTORE DUP2 DUP2 PUSH2 0x1B02 ADD MSTORE PUSH2 0x2847 ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x311 JUMP JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x2A4 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP8 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP2 PUSH1 0x0 KECCAK256 SWAP9 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x494 JUMPI POP SWAP2 PUSH2 0x397 SWAP10 SWAP2 DUP5 PUSH1 0x1 SWAP6 SWAP5 LT PUSH2 0x47B JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x2C7 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x460 JUMP JUMPDEST DUP4 DUP4 ADD MLOAD DUP12 SSTORE PUSH1 0x1 SWAP1 SWAP11 ADD SWAP10 PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 ADD PUSH2 0x447 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x514 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x508 JUMPI POP PUSH2 0x288 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4FB JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4F2 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x276 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3402 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x5C9 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5B0 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3402 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x248 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x595 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x57F JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3402 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x654 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x645 JUMPI POP PUSH2 0x20E JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x638 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x62A JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1FA JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH2 0x668 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x53E JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x668 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x53E JUMPI PUSH2 0x6F1 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x69D JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x668 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x718 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x703 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x53E JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x8B5 JUMPI DUP2 ISZERO PUSH2 0x8B0 JUMPI PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x7E1 JUMPI POP POP POP POP DUP1 PUSH2 0x799 JUMPI POP JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33E2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 DUP1 DUP3 ADD SWAP2 DUP1 DUP4 GT ISZERO PUSH2 0x7CA JUMPI POP POP PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x33E2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMP JUMPDEST PUSH4 0x1B352FB PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH2 0x7F3 DUP3 DUP5 PUSH2 0x744 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x89F JUMPI PUSH2 0x805 DUP3 DUP6 PUSH2 0x744 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x843 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x786 JUMP JUMPDEST SWAP6 SWAP2 SWAP1 DUP7 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x88E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP2 SWAP6 SWAP1 SWAP2 SWAP1 PUSH2 0x80C JUMP JUMPDEST PUSH4 0x1550AB9F PUSH1 0xE2 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x92FD9C8F PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0x32C1299B PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1882 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1827 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x17BA JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x175F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x16A0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1631 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x15D3 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1592 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1362 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1307 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1259 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x120E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1189 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1006 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF81 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xF3D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xECC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE59 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDEC JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD7F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC6F JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA32 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7BF JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x710 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4C5 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x400 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x30D JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x15E CALLDATASIZE PUSH2 0x1A51 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1BF JUMPI STOP JUMPDEST PUSH2 0x1CA DUP2 DUP4 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2B1 JUMPI PUSH2 0x1F4 DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x27F JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x277 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x217 DUP3 PUSH2 0x27A7 JUMP JUMPDEST SWAP2 PUSH2 0x225 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1C4C JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x23E JUMPI POP PUSH1 0x1 ADD PUSH2 0x1B6 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x24D JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x230 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x344 PUSH2 0x1947 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x36D PUSH2 0x2830 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2E0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3B3 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x437 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x45A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x493 DUP4 DUP4 PUSH2 0x48C PUSH2 0x2830 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x2606 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4A5 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4BB SWAP5 PUSH2 0x4B4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x27E1 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2944 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x49A JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x514 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x553 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6E1 JUMPI PUSH2 0x59B DUP3 SLOAD PUSH2 0x1BF9 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x699 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5FE JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5F3 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5BD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x681 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x649 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x63F JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x62C JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6D7 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6CB JUMPI POP PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6BE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6B5 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x747 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x764 PUSH2 0x196A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x7F6 PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x7FE PUSH2 0x196A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2B1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA08 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9DA JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8E0 PUSH1 0xE0 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8EB PUSH2 0x1E14 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x930 PUSH1 0x62 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9CE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9A4 JUMPI PUSH2 0x9A2 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D4F JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0xA40 CALLDATASIZE PUSH2 0x19BE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA85 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC65 JUMPI JUMPDEST PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAAD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAD5 PUSH2 0xAD0 DUP4 DUP6 DUP11 PUSH2 0x1EBB JUMP JUMPDEST PUSH2 0x1EFA JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC37 JUMPI JUMPDEST POP ISZERO PUSH2 0xC0A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB64 PUSH2 0xAD0 DUP4 DUP6 DUP11 PUSH2 0x1EBB JUMP JUMPDEST AND SWAP1 PUSH2 0xB74 PUSH2 0xAD0 DUP3 DUP7 DUP10 PUSH2 0x1EBB JUMP JUMPDEST SWAP2 PUSH2 0xB80 DUP3 DUP8 DUP12 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2B1 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x1 SWAP3 PUSH2 0xBF9 JUMPI JUMPDEST POP ADD PUSH2 0xAA4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC04 SWAP2 PUSH2 0x1C4C JUMP JUMPDEST DUP9 PUSH2 0xBF2 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC5E JUMPI JUMPDEST PUSH2 0xC50 DUP2 DUP4 PUSH2 0x1C4C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2818 JUMP JUMPDEST DUP10 PUSH2 0xB3A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC46 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA9D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xCA6 PUSH2 0x1947 JUMP JUMPDEST PUSH2 0xCAE PUSH2 0x196A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0xCD1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD3D DUP5 DUP5 DUP5 PUSH2 0xD04 PUSH2 0x2830 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD6E JUMPI PUSH2 0x2606 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD4E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD63 SWAP6 PUSH2 0xD5D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x27E1 JUMP JUMPDEST SWAP4 PUSH2 0x2944 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x49A JUMP JUMPDEST PUSH2 0xD7A DUP5 DUP12 DUP5 DUP5 PUSH2 0x2428 JUMP JUMPDEST PUSH2 0x2606 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xDB9 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDE6 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x2606 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xE26 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE53 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x2428 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1C8D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x18E8 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xF4E CALLDATASIZE PUSH2 0x1A51 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF7B PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x21C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xFB8 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x1014 CALLDATASIZE PUSH2 0x19BE JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1057 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x117F JUMPI JUMPDEST PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x107F JUMPI STOP JUMPDEST PUSH2 0x108A DUP2 DUP4 DUP9 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x10CB DUP8 PUSH2 0x10C4 PUSH2 0xAD0 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1EBB JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1126 PUSH1 0x64 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1176 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1149 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1076 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x113C JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x106F JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x11C0 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH2 0x124F PUSH2 0x124A PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x1AEB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x1290 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x12B0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2B1 JUMPI PUSH2 0x12D5 PUSH2 0x49A SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1301 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x1F1B JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1C8D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x1399 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x13A4 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x154E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1469 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14F3 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x141A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH2 0x15CB PUSH2 0x1E14 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0x16DA PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x16E2 PUSH2 0x196A JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x170C PUSH2 0x2830 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x174D JUMPI JUMPDEST POP POP PUSH2 0x2606 JUMP JUMPDEST PUSH2 0x1758 SWAP2 DUP5 DUP5 PUSH2 0x2428 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x1746 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0x17F4 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1821 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x1D4F JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1C8D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2B1 JUMPI PUSH2 0x124F PUSH1 0x20 SWAP2 PUSH2 0x1B4A JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1932 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x18F3 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2B1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2B1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2B1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A07 SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A2A SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2B1 JUMPI PUSH2 0x1A4D SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A9A SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2B1 JUMPI PUSH2 0x1A4D SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2B1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2B1 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1B43 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1BF3 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1BED JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1C42 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1C13 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C08 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1CA1 DUP5 PUSH2 0x1BF9 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1D0F JUMPI POP PUSH1 0x1 EQ PUSH2 0x1CC8 JUMPI JUMPDEST POP PUSH2 0x1CC6 SWAP3 POP SUB DUP4 PUSH2 0x1C4C JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1CF3 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1CC6 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1CB9 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1CDA JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1CC6 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1CB9 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1DD0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1E3D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1C8D JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x1EB5 PUSH1 0xC0 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1ECB JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2B1 JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2B6 JUMPI DUP1 ISZERO PUSH2 0x21BE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1FB7 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1FA5 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1FAE SWAP4 PUSH2 0x2428 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x1F9F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1FDA PUSH2 0xAD0 DUP4 DUP6 DUP12 PUSH2 0x1EBB JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x217A JUMPI PUSH2 0x1FEC DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x20B6 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x20AC JUMPI JUMPDEST PUSH2 0x2050 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1F5D JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2076 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2047 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2042 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2150 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2102 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x1FF3 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x211A JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x20FA JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2B6 JUMPI DUP5 ISZERO PUSH2 0x2420 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22B9 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x22AF JUMPI JUMPDEST PUSH2 0x2228 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2265 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2221 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x221C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22DC PUSH2 0xAD0 DUP4 DUP6 DUP10 PUSH2 0x1EBB JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x23DC JUMPI PUSH2 0x22EE DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2342 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2207 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2150 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x238F JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x22F5 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x23A6 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2386 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x25C2 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x25B9 JUMPI JUMPDEST PUSH2 0x24F5 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x255E JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x24AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x24A8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2763 JUMPI DUP3 PUSH2 0x2670 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2717 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x26F0 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x262B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x26E6 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6E1 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x27ED DUP3 PUSH2 0x27A7 JUMP JUMPDEST SWAP2 PUSH2 0x27FB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1C4C JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2B1 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2B1 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2B1 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2935 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x293A JUMPI JUMPDEST PUSH2 0x2935 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x28BB JUMPI JUMPDEST POP PUSH2 0x28B8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2916 JUMPI JUMPDEST POP CODESIZE PUSH2 0x28AE JUMP JUMPDEST PUSH2 0x292F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC5E JUMPI PUSH2 0xC50 DUP2 DUP4 PUSH2 0x1C4C JUMP JUMPDEST CODESIZE PUSH2 0x290F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2877 JUMP JUMPDEST PUSH2 0x29B3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x18E8 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A43 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2A16 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2ABD JUMPI JUMPDEST DUP2 PUSH2 0x2A5C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1C4C JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AB9 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2AB6 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x29C9 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2A4F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE PUSH30 0x2386D0EC28605CFC8D68C25F26207C2FF2219D5E678D22BFBF17FEAF14DD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER CALLER TSTORE DELEGATECALL GT SWAP12 0xBB DIV CREATE JUMP 0xB3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x821DA92899D3DA68BF9787 DUP3 NUMBER DUP9 LOG3 PUSH31 0xA2BFA79780BCEF91B9716C390EEC8ECBF0335DF4119BBB04F056B33EBA33B8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x81335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x8300000000000000000000 ","sourceMap":"1046:1142:281:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1046:1142:281;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1046:1142:281;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;500:10:59;;;;;;2510:4:280;-1:-1:-1;;1046:1142:281;;;;;500:10:59;;;-1:-1:-1;;;;500:10:59;;;;1046:1142:281;;;;;;500:10:59;;1046:1142:281;;;;-1:-1:-1;;;;;1046:1142:281;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;2510:4:280;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;;2510:4:280;1046:1142:281;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;;-1:-1:-1;;;;;1046:1142:281;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;2510:4:280;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:11;1046:1142;-1:-1:-1;1046:1142:281;;;;;;;2510:4:280;1046:1142:281;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;1598:32:277;;;-1:-1:-1;500:10:59;;1046:1142:281;500:10:59;1046:1142:281;-1:-1:-1;500:10:59;2510:4:280;1046:1142:281;;500:10:59;;1046:1142:281;;500:10:59;;1641::281;1645:152:42;;1046:1142:281;-1:-1:-1;;;;500:10:59;;;1046:1142:281;500:10:59;;;;1046:1142:281;500:10:59;;;;;2510:4:280;-1:-1:-1;;1046:1142:281;;;;;500:10:59;;;-1:-1:-1;;;500:10:59;;;;;;;1046:1142:281;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1046:1142:281;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1046:1142:281;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;;1046:1142:281;;;;;;500:10:59;;1046:1142:281;745:39:76;1704:11:281;:::i;:::-;1046:1142;;;;;;;;;;;;;;;;;;;;;;;;;1645:152:42;1046:1142:281;;;-1:-1:-1;;;;;;1046:1142:281;1641:10;1046:1142;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1046:1142:281;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;;;;;1704:11;1046:1142;;;2510:4:280;1046:1142:281;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;1046:1142:281;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;2510:4:280;1046:1142:281;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;;;;;;;;;;;;1046:1142:281;;;;;;;-1:-1:-1;;;1046:1142:281;;;;;;;;;;;;2510:4:280;1046:1142:281;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;1046:1142:281;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;2510:4:280;1046:1142:281;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1046:1142:281;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;-1:-1:-1;;1046:1142:281;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1046:1142:281;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;20857:1233:280;;1046:1142:281;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;:::o;21782:302::-;-1:-1:-1;;;;;;;;;;;1046:1142:281;;;;;21949:19:280;;;;;21945:76;;1046:1142:281;;-1:-1:-1;;;;;;;;;;;1046:1142:281;20857:1233:280:o;21945:76::-;21977:44;;;-1:-1:-1;21977:44:280;;1046:1142:281;;;;-1:-1:-1;21977:44:280;21174:3;-1:-1:-1;;;;;21206:13:280;;;;:::i;:::-;1046:1142:281;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;1046:1142:281;21344:10:280;21340:372;;21174:3;1046:1142:281;-1:-1:-1;21730:31:280;1046:1142:281;;;;;;;;;21730:31:280;1046:1142:281;21151:9:280;;21340:372;1046:1142:281;;;;;;21474:27:280;;;;21470:70;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;21562:26:280;;21340:372;;1046:1142:281;21340:372:280;;21470:70;21510:30;;;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;;;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;21084;21101:7;;;:::o;21011:62::-;21047:26;;;-1:-1:-1;21047:26:280;;-1:-1:-1;21047:26:280"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":6506,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":6541,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6590,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":6737,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":10209,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":10264,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":6845,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":6471,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_string":{"entryPoint":6376,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":10151,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":7867,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":7309,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":7161,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":7244,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":7700,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":7503,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchTransfer":{"entryPoint":8647,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":7963,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":10564,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":9256,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":6891,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgSender":{"entryPoint":10288,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":6986,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transfer":{"entryPoint":9734,"id":29123,"parameterSlots":4,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":7930,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":5756},{"length":32,"start":6914},{"length":32,"start":10311}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461188257806306fdde0314611827578063095ea7b3146117ba57806318160ddd1461175f57806323b872dd146116a05780632b4c9f1614611631578063313ce567146115d35780633644e5151461159257806339509351146113625780633c130d90146113075780634885b25414611259578063572b6c051461120e57806370a082311461118957806373c8a958146110065780637ecebe0014610f8157806388d695b214610f3d5780638da5cb5b14610ecc57806395d89b4114610e59578063a457c2d714610dec578063a9059cbb14610d7f578063b88d4fde14610c6f578063c3666c3614610a32578063d505accf146107bf578063dd62ed3e14610710578063e0df5b6f146104c5578063eb79554914610400578063f2fde38b1461030d5763f7ba94bd1461015057600080fd5b346102b15761015e36611a51565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061019f612830565b92541691169081036102e057508181036102b65760005b8181106101bf57005b6101ca818387611ebb565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102b1576101f4828587611ebb565b359081471061027f57600080809381935af13d15610277573d90610217826127a7565b916102256040519384611c4c565b82523d6000602084013e5b1561023e57506001016101b6565b80511561024d57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610230565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610344611947565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61036d612830565b9080549273ffffffffffffffffffffffffffffffffffffffff80851693168381036102e0575073ffffffffffffffffffffffffffffffffffffffff16928383036103b357005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610437611947565b60243560443567ffffffffffffffff81116102b15761045a903690600401611abd565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610493838361048c612830565b8097612606565b813b6104a5575b602060405160018152f35b6104bb946104b49136916127e1565b9280612944565b808080808061049a565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760043567ffffffffffffffff81116102b157610514903690600401611abd565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610553612830565b92541691169081036102e057507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106e15761059b8254611bf9565b601f8111610699575b506000601f82116001146105fe578192936000926105f3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106815750836001959610610649575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061063f565b9092602060018192868601358155019401910161062c565b826000526020600020601f830160051c810191602084106106d7575b601f0160051c01905b8181106106cb57506105a4565b600081556001016106be565b90915081906106b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610747611947565b73ffffffffffffffffffffffffffffffffffffffff61076461196a565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102b15760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576107f6611947565b6107fe61196a565b6044359060643560843560ff81168091036102b15773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a08578142116109da576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108e060e082611c4c565b5190206108eb611e14565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610930606282611c4c565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109ce5773ffffffffffffffffffffffffffffffffffffffff60005116036109a4576109a2927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d4f565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102b157610a40366119be565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a85612830565b92541691169081036102e05750808214801590610c65575b6102b65760005b828110610aad57005b73ffffffffffffffffffffffffffffffffffffffff610ad5610ad083858a611ebb565b611efa565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109ce57600091610c37575b5015610c0a575073ffffffffffffffffffffffffffffffffffffffff610b64610ad083858a611ebb565b1690610b74610ad0828689611ebb565b91610b8082878b611ebb565b3592813b156102b157606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109ce57600192610bf9575b5001610aa4565b6000610c0491611c4c565b88610bf2565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c58915060203d8111610c5e575b610c508183611c4c565b810190612818565b89610b3a565b503d610c46565b5082821415610a9d565b346102b15760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ca6611947565b610cae61196a565b60443560643567ffffffffffffffff81116102b157610cd1903690600401611abd565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d3d848484610d04612830565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d6e57612606565b823b610d4e57602060405160018152f35b610d6395610d5d9136916127e1565b93612944565b80808080808061049a565b610d7a848b8484612428565b612606565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a610db9611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610de6612830565b90612606565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a610e26611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e53612830565b90612428565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82611c8d565b6040519182916020835260208301906118e8565b0390f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102b15761049a610f4e36611a51565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610f7b612830565b906121c7565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610fb8611947565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102b157611014366119be565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611057612830565b92541691169081036102e0575080831480159061117f575b6102b65760005b83811061107f57005b61108a818388611ebb565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102b15760006020918a826110cb876110c4610ad0828f8f90611ebb565b938b611ebb565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611126606482611c4c565b51925af1156109ce576000513d6111765750803b155b6111495750600101611076565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6001141561113c565b508583141561106f565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576111c0611947565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602061124f61124a611947565b611aeb565b6040519015158152f35b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157611290611947565b60243567ffffffffffffffff81116102b1576112b090369060040161198d565b916044359267ffffffffffffffff84116102b1576112d561049a94369060040161198d565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611301612830565b90611f1b565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea611c8d565b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157611399611947565b6024356113a4612830565b9073ffffffffffffffffffffffffffffffffffffffff831692831561154e5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611469575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b80830192808411156114f357505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061141a565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760206115cb611e14565b604051908152f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102b15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a6116da611947565b6116e261196a565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9161170c612830565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff85160361174d575b5050612606565b611758918484612428565b8584611746565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102b15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b15761049a6117f4611947565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611821612830565b90611d4f565b346102b15760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b157610ec8610eb47f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611c8d565b346102b15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b1576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102b15761124f602091611b4a565b919082519283825260005b8481106119325750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016118f3565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102b157565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102b157565b9181601f840112156102b15782359167ffffffffffffffff83116102b1576020808501948460051b0101116102b157565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102b15760043567ffffffffffffffff81116102b15781611a079160040161198d565b9290929160243567ffffffffffffffff81116102b15781611a2a9160040161198d565b929092916044359067ffffffffffffffff82116102b157611a4d9160040161198d565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102b15760043567ffffffffffffffff81116102b15781611a9a9160040161198d565b929092916024359067ffffffffffffffff82116102b157611a4d9160040161198d565b9181601f840112156102b15782359167ffffffffffffffff83116102b157602083818601950101116102b157565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115611b435773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114611bf3577f01ffc9a7000000000000000000000000000000000000000000000000000000008114611bed576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c92168015611c42575b6020831014611c1357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611c08565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e157604052565b9060405191826000825492611ca184611bf9565b8084529360018116908115611d0f5750600114611cc8575b50611cc692500383611c4c565b565b90506000929192526020600020906000915b818310611cf3575050906020611cc69282010138611cb9565b6020919350806001915483858901015201910190918492611cda565b60209350611cc69592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cb9565b929173ffffffffffffffffffffffffffffffffffffffff16928315611dd05773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b611e3d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81611c8d565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152611eb560c082611c4c565b51902090565b9190811015611ecb5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102b15790565b959490939291928581036102b65780156121be5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110611fb7575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603611fa5575b50505050565b611fae93612428565b38808080611f9f565b73ffffffffffffffffffffffffffffffffffffffff611fda610ad083858b611ebb565b16801561217a57611fec828587611ebb565b35806120b6575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806120ac575b612050575b50600101611f5d565b8a8703908782101561207657600090815260208d90526040902090860190556001612047565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612042565b9a8b810190811115612150579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146121025750906040602093926000908482528552208181540190555b909150611ff3565b9050888298921161211a5750908660209201966120fa565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102b65784156124205773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b8181106122b9575050505050801515806122af575b612228575b5050505050565b808503948086101561226557505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612221565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b508381141561221c565b73ffffffffffffffffffffffffffffffffffffffff6122dc610ad0838589611ebb565b1680156123dc576122ee828587611ebb565b3580612342575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612207565b9687810190811115612150579673ffffffffffffffffffffffffffffffffffffffff891682811461238f57509060019291604060008381528c602052208181540190555b909192506122f5565b8c829c92116123a65750908a60019392019a612386565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b92909173ffffffffffffffffffffffffffffffffffffffff81169384156125c2576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806125b9575b6124f5575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808403938085101561255e5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926020928286166000528352604060002086600052835280604060002055926124ad565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b508015156124a8565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156127635782612670575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561271757508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036126f0575b505092505061262b565b838316600052818552604060002055866000528352604060002085815401905538806126e6565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106e157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926127ed826127a7565b916127fb6040519384611c4c565b8294818452818301116102b1578281602093846000960137010152565b908160209103126102b1575180151581036102b15790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561293557323314801561293a575b612935577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156128bb575b506128b857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156109ce57600091612916575b50386128ae565b61292f915060203d602011610c5e57610c508183611c4c565b3861290f565b503390565b5060183610612877565b6129b373ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906118e8565b03816000865af19081156109ce57600091612a43575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc3585900000000000000000000000000000000000000000000000000000000911603612a165750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011612abd575b81612a5c60209383611c4c565b81010312612ab95751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612ab657507fffffffff000000000000000000000000000000000000000000000000000000006129c9565b80fd5b5080fd5b3d9150612a4f56fea2646970667358221220f27d2386d0ec28605cfc8d68c25f26207c2ff2219d5e678d22bfbf17feaf14dd64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x1882 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x1827 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x17BA JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x175F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x16A0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1631 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x15D3 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1592 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1362 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1307 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1259 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x120E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1189 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1006 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF81 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0xF3D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xECC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE59 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDEC JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD7F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC6F JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA32 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7BF JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x710 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4C5 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x400 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x30D JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x15E CALLDATASIZE PUSH2 0x1A51 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP2 DUP2 SUB PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1BF JUMPI STOP JUMPDEST PUSH2 0x1CA DUP2 DUP4 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2B1 JUMPI PUSH2 0x1F4 DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x27F JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x277 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x217 DUP3 PUSH2 0x27A7 JUMP JUMPDEST SWAP2 PUSH2 0x225 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1C4C JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x23E JUMPI POP PUSH1 0x1 ADD PUSH2 0x1B6 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x24D JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x230 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x344 PUSH2 0x1947 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x36D PUSH2 0x2830 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x2E0 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x3B3 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x437 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x45A SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x493 DUP4 DUP4 PUSH2 0x48C PUSH2 0x2830 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x2606 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4A5 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4BB SWAP5 PUSH2 0x4B4 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x27E1 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x2944 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x49A JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x514 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x553 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6E1 JUMPI PUSH2 0x59B DUP3 SLOAD PUSH2 0x1BF9 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x699 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5FE JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5F3 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5BD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x681 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x649 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x63F JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x62C JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6D7 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6CB JUMPI POP PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6BE JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6B5 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x747 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x764 PUSH2 0x196A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x7F6 PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x7FE PUSH2 0x196A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2B1 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA08 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9DA JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8E0 PUSH1 0xE0 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8EB PUSH2 0x1E14 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x930 PUSH1 0x62 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9CE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9A4 JUMPI PUSH2 0x9A2 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D4F JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0xA40 CALLDATASIZE PUSH2 0x19BE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA85 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC65 JUMPI JUMPDEST PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAAD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAD5 PUSH2 0xAD0 DUP4 DUP6 DUP11 PUSH2 0x1EBB JUMP JUMPDEST PUSH2 0x1EFA JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC37 JUMPI JUMPDEST POP ISZERO PUSH2 0xC0A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB64 PUSH2 0xAD0 DUP4 DUP6 DUP11 PUSH2 0x1EBB JUMP JUMPDEST AND SWAP1 PUSH2 0xB74 PUSH2 0xAD0 DUP3 DUP7 DUP10 PUSH2 0x1EBB JUMP JUMPDEST SWAP2 PUSH2 0xB80 DUP3 DUP8 DUP12 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2B1 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x1 SWAP3 PUSH2 0xBF9 JUMPI JUMPDEST POP ADD PUSH2 0xAA4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC04 SWAP2 PUSH2 0x1C4C JUMP JUMPDEST DUP9 PUSH2 0xBF2 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC58 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC5E JUMPI JUMPDEST PUSH2 0xC50 DUP2 DUP4 PUSH2 0x1C4C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2818 JUMP JUMPDEST DUP10 PUSH2 0xB3A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC46 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xA9D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xCA6 PUSH2 0x1947 JUMP JUMPDEST PUSH2 0xCAE PUSH2 0x196A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0xCD1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1ABD JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD3D DUP5 DUP5 DUP5 PUSH2 0xD04 PUSH2 0x2830 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD6E JUMPI PUSH2 0x2606 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD4E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD63 SWAP6 PUSH2 0xD5D SWAP2 CALLDATASIZE SWAP2 PUSH2 0x27E1 JUMP JUMPDEST SWAP4 PUSH2 0x2944 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x49A JUMP JUMPDEST PUSH2 0xD7A DUP5 DUP12 DUP5 DUP5 PUSH2 0x2428 JUMP JUMPDEST PUSH2 0x2606 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xDB9 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDE6 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x2606 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xE26 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE53 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x2428 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x1C8D JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x18E8 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0xF4E CALLDATASIZE PUSH2 0x1A51 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xF7B PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x21C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xFB8 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH2 0x1014 CALLDATASIZE PUSH2 0x19BE JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1057 PUSH2 0x2830 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E0 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x117F JUMPI JUMPDEST PUSH2 0x2B6 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x107F JUMPI STOP JUMPDEST PUSH2 0x108A DUP2 DUP4 DUP9 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x10CB DUP8 PUSH2 0x10C4 PUSH2 0xAD0 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x1EBB JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1126 PUSH1 0x64 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1176 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1149 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1076 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x113C JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x106F JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x11C0 PUSH2 0x1947 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH2 0x124F PUSH2 0x124A PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x1AEB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x1290 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI PUSH2 0x12B0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2B1 JUMPI PUSH2 0x12D5 PUSH2 0x49A SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1301 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x1F1B JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x1C8D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x1399 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x13A4 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x154E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1469 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x14F3 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x141A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH2 0x15CB PUSH2 0x1E14 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0x16DA PUSH2 0x1947 JUMP JUMPDEST PUSH2 0x16E2 PUSH2 0x196A JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x170C PUSH2 0x2830 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x174D JUMPI JUMPDEST POP POP PUSH2 0x2606 JUMP JUMPDEST PUSH2 0x1758 SWAP2 DUP5 DUP5 PUSH2 0x2428 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x1746 JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0x49A PUSH2 0x17F4 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1821 PUSH2 0x2830 JUMP JUMPDEST SWAP1 PUSH2 0x1D4F JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH2 0xEC8 PUSH2 0xEB4 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1C8D JUMP JUMPDEST CALLVALUE PUSH2 0x2B1 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2B1 JUMPI PUSH2 0x124F PUSH1 0x20 SWAP2 PUSH2 0x1B4A JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1932 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x18F3 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2B1 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2B1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2B1 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A07 SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A2A SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2B1 JUMPI PUSH2 0x1A4D SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2B1 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2B1 JUMPI DUP2 PUSH2 0x1A9A SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2B1 JUMPI PUSH2 0x1A4D SWAP2 PUSH1 0x4 ADD PUSH2 0x198D JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2B1 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2B1 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2B1 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x1B43 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1BF3 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x1BED JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x1C42 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x1C13 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C08 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x1CA1 DUP5 PUSH2 0x1BF9 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x1D0F JUMPI POP PUSH1 0x1 EQ PUSH2 0x1CC8 JUMPI JUMPDEST POP PUSH2 0x1CC6 SWAP3 POP SUB DUP4 PUSH2 0x1C4C JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1CF3 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1CC6 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1CB9 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1CDA JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1CC6 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1CB9 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x1DD0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1E3D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x1C8D JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x1EB5 PUSH1 0xC0 DUP3 PUSH2 0x1C4C JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x1ECB JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2B1 JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2B6 JUMPI DUP1 ISZERO PUSH2 0x21BE JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1FB7 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1FA5 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1FAE SWAP4 PUSH2 0x2428 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x1F9F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1FDA PUSH2 0xAD0 DUP4 DUP6 DUP12 PUSH2 0x1EBB JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x217A JUMPI PUSH2 0x1FEC DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x20B6 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x20AC JUMPI JUMPDEST PUSH2 0x2050 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1F5D JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2076 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2047 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2042 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2150 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2102 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x1FF3 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x211A JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x20FA JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2B6 JUMPI DUP5 ISZERO PUSH2 0x2420 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22B9 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x22AF JUMPI JUMPDEST PUSH2 0x2228 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2265 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2221 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x221C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22DC PUSH2 0xAD0 DUP4 DUP6 DUP10 PUSH2 0x1EBB JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x23DC JUMPI PUSH2 0x22EE DUP3 DUP6 DUP8 PUSH2 0x1EBB JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2342 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2207 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2150 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x238F JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x22F5 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x23A6 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2386 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x25C2 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x25B9 JUMPI JUMPDEST PUSH2 0x24F5 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x255E JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x24AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x24A8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2763 JUMPI DUP3 PUSH2 0x2670 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2717 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x26F0 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x262B JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x26E6 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6E1 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x27ED DUP3 PUSH2 0x27A7 JUMP JUMPDEST SWAP2 PUSH2 0x27FB PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x1C4C JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2B1 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2B1 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2B1 JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x2935 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x293A JUMPI JUMPDEST PUSH2 0x2935 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x28BB JUMPI JUMPDEST POP PUSH2 0x28B8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2916 JUMPI JUMPDEST POP CODESIZE PUSH2 0x28AE JUMP JUMPDEST PUSH2 0x292F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC5E JUMPI PUSH2 0xC50 DUP2 DUP4 PUSH2 0x1C4C JUMP JUMPDEST CODESIZE PUSH2 0x290F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x2877 JUMP JUMPDEST PUSH2 0x29B3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x18E8 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9CE JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A43 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x2A16 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x2ABD JUMPI JUMPDEST DUP2 PUSH2 0x2A5C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1C4C JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x2AB9 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x2AB6 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x29C9 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x2A4F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE PUSH30 0x2386D0EC28605CFC8D68C25F26207C2FF2219D5E678D22BFBF17FEAF14DD PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1046:1142:281:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1046:1142:281;;1905:41;;;:::i;:::-;1046:1142;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1046:1142:281;1845:10:192;;;;;;1046:1142:281;1857:3:192;1876:11;;;;;:::i;:::-;1046:1142:281;;;;;;;;;1898:10:192;;;;;:::i;:::-;1046:1142:281;1375:21:9;;;:30;1371:125;;1046:1142:281;1548:33:9;;;;;;;1046:1142:281;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1046:1142:281;;1834:9:192;;1591:58:9;1046:1142:281;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1046:1142:281;5957:19:9;1046:1142:281;;5957:19:9;1046:1142:281;;;;;1371:125:9;1455:21;;1428:57;1046:1142:281;1428:57:9;1046:1142:281;;;;;;1428:57:9;1046:1142:281;;;;1756:63:192;1793:26;1046:1142:281;1793:26:192;1046:1142:281;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1046:1142:281;;-1:-1:-1;4538:25:42;1046:1142:281;;;;;;;;;;;;;:::i;:::-;;1905:41;;:::i;:::-;1046:1142;;;;;;;;;;3205:23:42;;;3201:60;;1046:1142:281;;;3275:25:42;;;;3271:146;;1046:1142:281;3271:146:42;1046:1142:281;;;;;;3361:45:42;1046:1142:281;;3361:45:42;1046:1142:281;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1046:1142:281;1905:41;17093:5:280;1905:41:281;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;1046:1142:281;;;;;;;;17109:96:280;17145:49;1046:1142:281;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1905:41;;;:::i;:::-;1046:1142;;;;;4503:26:42;;;4499:64;;1283:19:278;1046:1142:281;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;1046:1142:281;-1:-1:-1;1046:1142:281;27576:12:280;1046:1142:281;;;;-1:-1:-1;1046:1142:281;27576:28:280;1046:1142:281;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;1046:1142:281;2653:23:279;1046:1142:281;2653:23:279;1046:1142:281;2653:23:279;1046:1142:281;;;;;;;;;;;;;;;;;;;2602:87:279;;;;1046:1142:281;1021:95:279;1046:1142:281;;1021:95:279;1046:1142:281;1021:95:279;;1046:1142:281;;;;;1021:95:279;;1046:1142:281;1021:95:279;;;;1046:1142:281;;1021:95:279;;1046:1142:281;;1021:95:279;;1046:1142:281;;2602:87:279;;;1046:1142:281;2602:87:279;;:::i;:::-;1046:1142:281;2592:98:279;;2758:18;;:::i;:::-;1046:1142:281;;;2729:60:279;;;;1021:95;;;;;;;1046:1142:281;1021:95:279;;;1046:1142:281;1021:95:279;2729:60;;;;;;:::i;:::-;1046:1142:281;2719:71:279;;1046:1142:281;;;;;;1021:95:279;;;1046:1142:281;;;;1021:95:279;;1046:1142:281;;;;1021:95:279;;1046:1142:281;2821:24:279;;;1046:1142:281;2821:24:279;;;;;1046:1142:281;;2821:24:279;1046:1142:281;2863:15:279;2859:57;;2982:5;27705:19:280;1046:1142:281;2982:5:279;:::i;:::-;1046:1142:281;2859:57:279;2887:29;1046:1142:281;2887:29:279;1046:1142:281;;2887:29:279;2821:24;1046:1142:281;;;;;;;;;2470:67:279;2509:28;;1046:1142:281;2509:28:279;1046:1142:281;;;;2509:28:279;2400:60;2432:28;1046:1142:281;2432:28:279;1046:1142:281;;2432:28:279;1046:1142:281;;;;;;;:::i;:::-;5148:19:42;;;;;;1046:1142:281;;;1905:41;;:::i;:::-;1046:1142;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1046:1142:281;3852:94:192;;1046:1142:281;3972:10:192;;;;;;1046:1142:281;3984:3:192;1046:1142:281;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1046:1142:281;;;;4058:76:192;;4108:25;1046:1142:281;4058:76:192;;1046:1142:281;4058:76:192;;;;;;;;;;;;1046:1142:281;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1046:1142:281;4239:12:192;;;;;;:::i;:::-;1046:1142:281;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1046:1142:281;4239:70:192;;;;;;;1046:1142:281;;;;;;;4239:70:192;;;;;1046:1142:281;4239:70:192;;4277:4;1046:1142:281;4239:70:192;;1046:1142:281;;4058:76:192;1046:1142:281;;;;;;;4239:70:192;;;;;;;1046:1142:281;4239:70:192;;;3984:3;;1046:1142:281;3961:9:192;;4239:70;1046:1142:281;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1046:1142:281;4161:50:192;1046:1142:281;;4058:76:192;1046:1142:281;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1046:1142:281;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1046:1142:281;1905:41;9818:5:280;1905:41:281;;;;;:::i;:::-;1046:1142;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;1046:1142:281;;;;;;;18723:98:280;18759:51;1046:1142:281;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;1046:1142:281:-;;;;;;;;;;;1036:5:242;1046:1142:281;;:::i;:::-;;;;;1905:41;;:::i;:::-;1036:5:242;;:::i;1046:1142:281:-;;;;;;;;;;;1788:15:242;1046:1142:281;;:::i;:::-;;;;;1905:41;;:::i;:::-;1788:15:242;;:::i;1046:1142:281:-;;;;;;;;;;;;;3091:13:277;1046:1142:281;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:6:243;1046:1142:281;;;:::i;:::-;27705:19:280;;;;1046:1142:281;1905:41;;:::i;:::-;875:6:243;;:::i;1046:1142:281:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1046:1142:281;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;1046:1142:281;;1905:41;;;:::i;:::-;1046:1142;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1046:1142:281;2776:90:192;;1046:1142:281;2892:10:192;;;;;;1046:1142:281;2904:3:192;2923:9;;;;;:::i;:::-;1046:1142:281;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;1046:1142:281;;;1328:43:8;1046:1142:281;1328:43:8;;;;1046:1142:281;1328:43:8;;1046:1142:281;1328:43:8;;;1046:1142:281;1328:43:8;1046:1142:281;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;1046:1142:281;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1046:1142:281;;2881:9:192;;8938:146:8;9033:40;1046:1142:281;9033:40:8;1046:1142:281;;1328:43:8;1046:1142:281;9033:40:8;8942:68;1046:1142:281;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1046:1142:281;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1046:1142:281;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;1046:1142:281;;;;;;:::i;:::-;27705:19:280;;;1046:1142:281;1905:41;;:::i;:::-;1170:6:243;;:::i;1046:1142:281:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;1905:41;;:::i;:::-;1046:1142;;;;5455:21:280;;;5451:67;;1046:1142:281;;;-1:-1:-1;1046:1142:281;5555:12:280;1046:1142:281;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;5597:10:280;;5593:366;;1046:1142:281;;;5973:42:280;1046:1142:281;;;;;;;;;5973:42:280;;1046:1142:281;;;;;;;5593:366:280;1046:1142:281;;;5720:32:280;;;;;5716:108;;5842:19;;;1046:1142:281;;5973:42:280;5842:19;1046:1142:281;;;-1:-1:-1;1046:1142:281;5555:12:280;1046:1142:281;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;5593:366:280;;;;5716:108;1046:1142:281;;5761:63:280;;;1046:1142:281;;;;;5761:63:280;;1046:1142:281;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;1046:1142:281;5485:33:280;;1046:1142:281;5485:33:280;1046:1142:281;;;;;5485:33:280;1046:1142:281;;;;;;;;;;;;1284:37:248;;:::i;:::-;1046:1142:281;;;;;;;;;;;;;;;;;;;3732:15:277;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;941:19:75;1046:1142:281;;;;;;;;;;;;;;;9818:5:280;1046:1142:281;;:::i;:::-;;;:::i;:::-;;1905:41;;;:::i;:::-;1046:1142;;;;;;;;;;;9707:14:280;9703:85;;1046:1142:281;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;1046:1142:281;;;;;;;;;;;;26654:8:280;1046:1142:281;;;;;;;;;;;;;;;;;;826:5:242;1046:1142:281;;:::i;:::-;;;;;1905:41;;:::i;:::-;826:5:242;;:::i;1046:1142:281:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1046:1142:281;635:65:55;;:::i;1046:1142:281:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1046:1142:281;1146:19:75;1046:1142:281;1146:53:75;;;1142:96;;1046:1142:281;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1046:1142:281;1215:12:75;:::o;1359:340:59:-;1046:1142:281;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1046:1142:281;500:10:59;1046:1142:281;500:10:59;;1046:1142:281;500:10:59;1046:1142:281;500:10:59;;1046:1142:281;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1046:1142:281;1528:12:59;:::o;1046:1142:281:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;1046:1142:281;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;1046:1142:281;;4533:21:280;;;4529:67;;1046:1142:281;4657:31:280;4606:19;:12;1046:1142:281;4606:19:280;1046:1142:281;;;-1:-1:-1;1046:1142:281;4606:12:280;1046:1142:281;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;1046:1142:281;4563:33:280;;4552:1;4563:33;1046:1142:281;4563:33:280;1046:1142:281;;4552:1:280;4563:33;4317:545:279;1046:1142:281;;;:::i;:::-;;;;;;4669:54:279;1046:1142:281;;;4520:321:279;;1046:1142:281;4552:95:279;1046:1142:281;;;;;;4745:14:279;1046:1142:281;;;;4412:53:279;1046:1142:281;;;;4818:4:279;1046:1142:281;;;;;4520:321:279;;;;;;:::i;:::-;1046:1142:281;4493:362:279;;4317:545;:::o;1046:1142:281:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;1046:1142:281;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;1046:1142:281;14325:13:280;;;;;;:::i;:::-;1046:1142:281;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;1046:1142:281;14472:10:280;14468:656;;14293:3;1046:1142:281;;;15143:25:280;1046:1142:281;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;1046:1142:281;;14270:9:280;;15183:500;1046:1142:281;;;15437:21:280;;;;;15433:85;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;1046:1142:281;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;1046:1142:281;;;;14602:27:280;;;;14598:74;;1046:1142:281;;;;;14746:10:280;;;;;14784:14;;1046:1142:281;;14784:14:280;;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;1046:1142:281;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;1046:1142:281;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;1046:1142:281;14381:32:280;;14132:1;14381:32;1046:1142:281;14381:32:280;1046:1142:281;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;10853:1796::-;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;1046:1142:281;;;12409:21:280;;;;;12405:85;;12508:16;;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;;;;12171:472:280;;;;;;;12405:85;1046:1142:281;12439:51:280;;11116:1;12439:51;1046:1142:281;12439:51:280;1046:1142:281;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;1046:1142:281;11309:13:280;;;;;;:::i;:::-;1046:1142:281;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;1046:1142:281;11455:10:280;11451:656;;11277:3;1046:1142:281;;;;;;;;;12125:25:280;1046:1142:281;;;;12125:25:280;;1046:1142:281;11254:9:280;;11451:656;1046:1142:281;;;;11585:27:280;;;;11581:74;;1046:1142:281;;;;11729:10:280;;;;;11767:14;;1046:1142:281;11767:14:280;;1046:1142:281;-1:-1:-1;1046:1142:281;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;1046:1142:281;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;1046:1142:281;;;;;;11116:1:280;11873:46;11336:61;1046:1142:281;11365:32:280;;11116:1;11365:32;1046:1142:281;11365:32:280;1046:1142:281;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;6693:851::-;;;;1046:1142:281;;;6808:21:280;;;6804:67;;6908:12;;:19;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;1046:1142:281;;;;;;7495:42:280;1046:1142:281;;;;;;;7495:42:280;;6693:851::o;6947:534::-;1046:1142:281;;;7238:32:280;;;;;7234:112;;7364:19;;;1046:1142:281;7495:42:280;7364:19;1046:1142:281;7364:19:280;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;6947:534:280;;;7234:112;1046:1142:281;;7279:67:280;;;1046:1142:281;;;;7279:67:280;;;1046:1142:281;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;1046:1142:281;6838:33:280;;6827:1;6838:33;1046:1142:281;6838:33:280;1046:1142:281;;6827:1:280;6838:33;8105:628;;;1046:1142:281;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;1046:1142:281;;;8701:25:280;1046:1142:281;;;;;;;8701:25:280;;8105:628::o;8273:413::-;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;;;8437:21:280;;;;;8433:80;;1046:1142:281;;;;;;;;8701:25:280;1046:1142:281;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;;-1:-1:-1;1046:1142:281;;;-1:-1:-1;1046:1142:281;;;;-1:-1:-1;1046:1142:281;;;;;;;8531:131:280;;;;8433:80;8467:46;;1046:1142:281;8467:46:280;;8219:1;8467:46;1046:1142:281;8467:46:280;1046:1142:281;;;;;;8219:1:280;8467:46;8201:61;1046:1142:281;8230:32:280;;8219:1;8230:32;1046:1142:281;8230:32:280;1046:1142:281;;8219:1:280;8230:32;1046:1142:281;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1046:1142:281;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1046:1142:281;1029:19:76;1046:1142:281;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1046:1142:281;;;;;;1676:74:76;;;;1046:1142:281;1676:74:76;;;;;;1046:1142:281;1327:10:76;1046:1142:281;;;;1744:4:76;1046:1142:281;;;;1676:74:76;;;;;;;1046:1142:281;1676:74:76;;;1630:120;;;;;1676:74;;;;1046:1142:281;1676:74:76;1046:1142:281;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;1046:1142:281;;28229:252:280;;;;1046:1142:281;28229:252:280;1046:1142:281;;;;;28357:61:280;;;;;1046:1142:281;28357:61:280;;1046:1142:281;28357:61:280;;;1046:1142:281;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;1046:1142:281;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;1046:1142:281;;-1:-1:-1;28445:29:280;28357:61;1046:1142:281;28357:61:280;;1046:1142:281;28357:61:280;;;;;;1046:1142:281;28357:61:280;;;:::i;:::-;;;1046:1142:281;;;;;;;;;;;;;28357:61:280;1046:1142:281;28357:61:280;;1046:1142:281;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2200600","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","allowance(address,address)":"3013","approve(address,uint256)":"infinite","balanceOf(address)":"2641","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","decimals()":"2385","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","increaseAllowance(address,uint256)":"infinite","isTrustedForwarder(address)":"infinite","name()":"infinite","nonces(address)":"2685","owner()":"2605","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","increaseAllowance(address,uint256)":"39509351","isTrustedForwarder(address)":"572b6c05","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"holders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"allocations\",\"type\":\"uint256[]\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/preset/ERC20FixedSupply.sol\":\"ERC20FixedSupply\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/ERC20FixedSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20} from \\\"./../ERC20.sol\\\";\\nimport {ERC20Detailed} from \\\"./../ERC20Detailed.sol\\\";\\nimport {ERC20Metadata} from \\\"./../ERC20Metadata.sol\\\";\\nimport {ERC20Permit} from \\\"./../ERC20Permit.sol\\\";\\nimport {ERC20SafeTransfers} from \\\"./../ERC20SafeTransfers.sol\\\";\\nimport {ERC20BatchTransfers} from \\\"./../ERC20BatchTransfers.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (immutable version).\\ncontract ERC20FixedSupply is\\n    ERC20,\\n    ERC20Detailed,\\n    ERC20Metadata,\\n    ERC20Permit,\\n    ERC20SafeTransfers,\\n    ERC20BatchTransfers,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] memory holders,\\n        uint256[] memory allocations,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {\\n        ERC20Storage.layout().batchMint(holders, allocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1944f12c439c1942890c32c0d12723dd7e2b65076072b3383d33f21bbfa9dee7\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC20/preset/ERC20MintBurn.sol":{"ERC20MintBurn":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1539,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1502,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346105d95761403d80380380610019816105de565b9283398101906080818303126105d95780516001600160401b0381116105d95782610045918301610603565b602082015190926001600160401b0382116105d957610065918301610603565b9160408201519160ff83168093036105d95760600151916001600160a01b03831683036105d9577fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f8054600160ff199182168117909255634e83a8c360e11b6000527fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680549091169091179055825190926001600160401b0382116104af57600080516020613ffd8339815191525490600182811c921680156105cf575b602083101461048f5781601f849311610552575b50602090601f83116001146104d0576000926104c5575b50508160011b916000199060031b1c191617600080516020613ffd833981519152555b83516001600160401b0381116104af57600080516020613fdd83398151915254600181811c911680156104a5575b602082101461048f57601f811161041d575b50602094601f821160011461039c57948192939495600092610391575b50508160011b916000199060031b1c191617600080516020613fdd833981519152555b60ff1960008051602061401d83398151915254161760008051602061401d8339815191525563a219a02560e01b600052806020526040600020600160ff1982541617905533610332575b6307f5828d60e41b600090815260209190915260408082208054600160ff1991821681179092556303c130d960e41b84528284208054821683179055634ec7fbed60e11b845282842080548216831790556353f41a9760e01b8452828420805482168317905563602993f360e11b8452828420805482168317905563144b1f0f60e11b845282842080548216831790556320c07ed160e01b8452928290208054909316179091556080919091525161396e908161066f82396080518181816120560152818161252001526136ba0152f35b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3610261565b0151905038806101f4565b601f19821695600080516020613fdd833981519152600052806000209160005b888110610405575083600195969798106103ec575b505050811b01600080516020613fdd83398151915255610217565b015160001960f88460031b161c191690553880806103d1565b919260206001819286850151815501940192016103bc565b600080516020613fdd8339815191526000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610485575b601f0160051c01905b81811061047957506101d7565b6000815560010161046c565b9091508190610463565b634e487b7160e01b600052602260045260246000fd5b90607f16906101c5565b634e487b7160e01b600052604160045260246000fd5b015190503880610174565b600080516020613ffd83398151915260009081528281209350601f198516905b81811061053a5750908460019594939210610521575b505050811b01600080516020613ffd83398151915255610197565b015160001960f88460031b161c19169055388080610506565b929360206001819287860151815501950193016104f0565b600080516020613ffd8339815191526000529091507fce6c9d9c5887233b79e8966827dc87013a092e23a7d6c4dfeb06be71659aa428601f840160051c810191602085106105c5575b90601f859493920160051c01905b8181106105b6575061015d565b600081558493506001016105a9565b909150819061059b565b91607f1691610149565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176104af57604052565b81601f820112156105d9578051906001600160401b0382116104af57610632601f8301601f19166020016105de565b92828452602083830101116105d95760005b82811061065957505060206000918301015290565b8060208092840101518282870101520161064456fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146122a057806306fdde0314612245578063095ea7b3146121d857806318160ddd1461217d5780631b9a75291461213957806323b872dd1461207a5780632b4c9f161461200b5780632f2ff15d14611e7f578063313ce56714611e215780633644e51514611de05780633950935114611bb05780633c130d9014611b5557806340c10f191461199257806342966c681461192e5780634885b25414611880578063572b6c0514611835578063685731071461171a57806370a082311461169557806373c8a9581461151257806379cc67901461145d5780637ecebe00146113d857806388d695b2146113945780638bb9c5bf146112255780638da5cb5b146111b457806391d148541461111c57806395d89b41146110a9578063a457c2d71461103c578063a9059cbb14610fcf578063b88d4fde14610ebf578063c3666c3614610c82578063d505accf14610a0f578063d5391393146109b6578063d547741f1461082d578063dd62ed3e1461077e578063e0df5b6f14610533578063eb7955491461046e578063f2fde38b1461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc366123dc565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d6136a3565b925416911690810361034e57508181036103245760005b81811061022d57005b61023881838761284a565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f5761026282858761284a565b35908147106102ed57600080809381935af13d156102e5573d906102858261361a565b916102936040519384612568565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b2612365565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103db6136a3565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361034e575073ffffffffffffffffffffffffffffffffffffffff169283830361042157005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576104a5612365565b60243560443567ffffffffffffffff811161031f576104c89036906004016124db565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261050183836104fa6136a3565b80976134c5565b813b610513575b602060405160018152f35b61052994610522913691613654565b92806137b7565b8080808080610508565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043567ffffffffffffffff811161031f576105829036906004016124db565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105c16136a3565b925416911690810361034e57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff811161074f576106098254612670565b601f8111610707575b506000601f821160011461066c57819293600092610661575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b01359050838061062b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106ef57508360019596106106b7575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806106ad565b9092602060018192868601358155019401910161069a565b826000526020600020601f830160051c81019160208410610745575b601f0160051c01905b8181106107395750610612565b6000815560010161072c565b9091508190610723565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576107b5612365565b73ffffffffffffffffffffffffffffffffffffffff6107d2612388565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435610867612388565b61086f6136a3565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661092157005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610a46612365565b610a4e612388565b6044359060643560843560ff811680910361031f5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610c5857814211610c2a576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c08152610b3060e082612568565b519020610b3b6129f4565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610b80606282612568565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610c1e5773ffffffffffffffffffffffffffffffffffffffff6000511603610bf457610bf2927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612785565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57610c903661244c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd56136a3565b925416911690810361034e5750808214801590610eb5575b6103245760005b828110610cfd57005b73ffffffffffffffffffffffffffffffffffffffff610d25610d2083858a61284a565b612889565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c1e57600091610e87575b5015610e5a575073ffffffffffffffffffffffffffffffffffffffff610db4610d2083858a61284a565b1690610dc4610d2082868961284a565b91610dd082878b61284a565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c1e57600192610e49575b5001610cf4565b6000610e5491612568565b88610e42565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea8915060203d8111610eae575b610ea08183612568565b81019061368b565b89610d8a565b503d610e96565b5082821415610ced565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610ef6612365565b610efe612388565b60443560643567ffffffffffffffff811161031f57610f219036906004016124db565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610f8d848484610f546136a3565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610fbe576134c5565b823b610f9e57602060405160018152f35b610fb395610fad913691613654565b936137b7565b808080808080610508565b610fca848b84846132e7565b6134c5565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611009612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110366136a3565b906134c5565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611076612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110a36136a3565b906132e7565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826126c3565b604051918291602083526020830190612306565b0390f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611153612388565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356112806136a3565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561134c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016109b1565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f576105086113a5366123dc565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6113d26136a3565b9061308e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761140f612365565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611497612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6114c46136a3565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611500575b5050612b5d565b61150b9184846132e7565b84836114f9565b3461031f576115203661244c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115636136a3565b925416911690810361034e575080831480159061168b575b6103245760005b83811061158b57005b61159681838861284a565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f5760006020918a826115d7876115d0610d20828f8f9061284a565b938b61284a565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611632606482612568565b51925af115610c1e576000513d6116825750803b155b6116555750600101611582565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611648565b508583141561157b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576116cc612365565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461031f57611728366123dc565b92909161175d7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226117576136a3565b90612a9b565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90611788816125a9565b926117966040519485612568565b818452602084019160051b81019036821161031f57915b818310611808575050506117c0846125a9565b926117ce6040519485612568565b848452602084019460051b81019036821161031f57945b8186106117f8575050610bf29350612f3e565b85358152602095860195016117e5565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016117ad565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611876611871612365565b612509565b6040519015158152f35b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576118b7612365565b60243567ffffffffffffffff811161031f576118d79036906004016123ab565b916044359267ffffffffffffffff841161031f576118fc6105089436906004016123ab565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6119286136a3565b90612c7e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576105086004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61198c6136a3565b90612b5d565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576119c9612365565b6024356119f87fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226117576136a3565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9216918215611b2b5781611a6d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0548281019080821115611af957507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611a3d565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6126c3565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611be7612365565b602435611bf26136a3565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611d9c5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611cb7575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611d4157505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611c68565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611e196129f4565b604051908152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435611eb9612388565b611ec16136a3565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611f7457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016109b1565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576105086120b4612365565b6120bc612388565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916120e66136a3565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612127575b50506134c5565b6121329184846132e7565b8584612120565b3461031f5761050861214a366123dc565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121776136a3565b906128aa565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508612212612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61223f6136a3565b90612785565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c3565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f576118766020916125c1565b919082519283825260005b8481106123505750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612311565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612425916004016123ab565b929092916024359067ffffffffffffffff821161031f57612448916004016123ab565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612495916004016123ab565b9290929160243567ffffffffffffffff811161031f57816124b8916004016123ab565b929092916044359067ffffffffffffffff821161031f57612448916004016123ab565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156125615773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761074f57604052565b67ffffffffffffffff811161074f5760051b60200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461266a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612664576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c921680156126b9575b602083101461268a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161267f565b90604051918260008254926126d784612670565b808452936001811690811561274557506001146126fe575b506126fc92500383612568565b565b90506000929192526020600020906000915b8183106127295750509060206126fc92820101386126ef565b6020919350806001915483858901015201910190918492612710565b602093506126fc9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386126ef565b929173ffffffffffffffffffffffffffffffffffffffff169283156128065773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b919081101561285a5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9392948086036103245785156129ec5760009560005b8181106128e157505050505050816128d6575050565b600201908154039055565b6128ef610d2082848861284a565b6128fa82858961284a565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff811685036129da575b509050612972575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a3016128c0565b98604060008381528a60205220548a810390808210156129a45750600083815260208b9052604090205589019861293b565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6129e4928c6132e7565b388187612933565b505050505050565b612a1d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c3565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612a9560c082612568565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612af55750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b82612bab575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612c32575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612b63565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b95949093929192858103610324578015612f215773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612d1a575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612d08575b50505050565b612d11936132e7565b38808080612d02565b73ffffffffffffffffffffffffffffffffffffffff612d3d610d2083858b61284a565b168015612edd57612d4f82858761284a565b3580612e19575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612e0f575b612db3575b50600101612cc0565b8a87039087821015612dd957600090815260208d90526040902090860190556001612daa565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612da5565b9a8b810190811115612eb3579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612e655750906040602093926000908482528552208181540190555b909150612d56565b90508882989211612e7d575090866020920196612e5d565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b805182101561285a5760209160051b010190565b909182519080518203610324578115612d025760009360005b838110612fb2575050505081612f6b575050565b6002018054918083019280841115612f8257505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612fd18284612f2a565b51168015611b2b57612fe38285612f2a565b5180613021575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612f57565b969190878301928311156130645773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612fea565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b92939490918185036103245784156129ec5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061318057505050505080151580613176575b6130ef575b5050505050565b808503948086101561312c57505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806130e8565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156130e3565b73ffffffffffffffffffffffffffffffffffffffff6131a3610d2083858961284a565b1680156132a3576131b582858761284a565b3580613209575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a3016130ce565b9687810190811115612eb3579673ffffffffffffffffffffffffffffffffffffffff891682811461325657509060019291604060008381528c602052208181540190555b909192506131bc565b8c829c921161326d5750908a60019392019a61324d565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613481576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613478575b6133b4575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808403938085101561341d5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260209282861660005283526040600020866000528352806040600020559261336c565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613367565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156135d6578261352f575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612c3257508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036135af575b50509250506134ea565b838316600052818552604060002055866000528352604060002085815401905538806135a5565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161074f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136608261361a565b9161366e6040519384612568565b82948184528183011161031f578281602093846000960137010152565b9081602091031261031f5751801515810361031f5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156137a85732331480156137ad575b6137a8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561372e575b5061372b57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c1e57600091613789575b5038613721565b6137a2915060203d602011610eae57610ea08183612568565b38613782565b503390565b50601836106136ea565b61382673ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612306565b03816000865af1908115610c1e576000916138b6575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036138895750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011613930575b816138cf60209383612568565b8101031261392c5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361392957507fffffffff0000000000000000000000000000000000000000000000000000000061383c565b80fd5b5080fd5b3d91506138c256fea2646970667358221220fe4e70044e588d96a7172d6571a03b2ddf9c6008383e09c35cc4d3ca8cf3282b64736f6c634300081e0033335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x5D9 JUMPI PUSH2 0x403D DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x5DE JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SLT PUSH2 0x5D9 JUMPI DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x5D9 JUMPI DUP3 PUSH2 0x45 SWAP2 DUP4 ADD PUSH2 0x603 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x5D9 JUMPI PUSH2 0x65 SWAP2 DUP4 ADD PUSH2 0x603 JUMP JUMPDEST SWAP2 PUSH1 0x40 DUP3 ADD MLOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x5D9 JUMPI PUSH1 0x60 ADD MLOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP4 SUB PUSH2 0x5D9 JUMPI PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x4E83A8C3 PUSH1 0xE1 SHL PUSH1 0x0 MSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE DUP3 MLOAD SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FFD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5CF JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x48F JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x552 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4D0 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4C5 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FFD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FDD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x4A5 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x48F JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x41D JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x39C JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x391 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FDD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH1 0xFF NOT PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x401D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x401D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH4 0xA219A025 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH1 0xFF NOT DUP3 SLOAD AND OR SWAP1 SSTORE CALLER PUSH2 0x332 JUMPI JUMPDEST PUSH4 0x7F5828D PUSH1 0xE4 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0xFF NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x3C130D9 PUSH1 0xE4 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4EC7FBED PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x53F41A97 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x602993F3 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x144B1F0F PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x20C07ED1 PUSH1 0xE0 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x396E SWAP1 DUP2 PUSH2 0x66F DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2056 ADD MSTORE DUP2 DUP2 PUSH2 0x2520 ADD MSTORE PUSH2 0x36BA ADD MSTORE RETURN JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0x261 JUMP JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FDD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x405 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3EC JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FDD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3D1 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x3BC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FDD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x485 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x479 JUMPI POP PUSH2 0x1D7 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x46C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x463 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x1C5 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x174 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FFD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x53A JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x521 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FFD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x197 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x506 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4F0 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FFD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0xCE6C9D9C5887233B79E8966827DC87013A092E23A7D6C4DFEB06BE71659AA428 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5C5 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x5B6 JUMPI POP PUSH2 0x15D JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x5A9 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x59B JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x149 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x4AF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x5D9 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x4AF JUMPI PUSH2 0x632 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x5DE JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x5D9 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x659 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x644 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x22A0 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2245 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x21D8 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x217D JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2139 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x207A JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x200B JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1E7F JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1E21 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1DE0 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1BB0 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1B55 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x1992 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x192E JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1880 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1835 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x171A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1695 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1512 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x145D JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x13D8 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1394 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1225 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11B4 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x111C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10A9 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x103C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xFCF JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEBF JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC82 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0xA0F JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x9B6 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x82D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x77E JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x46E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x361A JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2568 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x2365 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3DB PUSH2 0x36A3 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x421 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x4A5 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x4C8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x501 DUP4 DUP4 PUSH2 0x4FA PUSH2 0x36A3 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x34C5 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x513 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x529 SWAP5 PUSH2 0x522 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3654 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x37B7 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x508 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5C1 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH2 0x609 DUP3 SLOAD PUSH2 0x2670 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x707 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x66C JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x661 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x62B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x6EF JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x6B7 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x6AD JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x745 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x739 JUMPI POP PUSH2 0x612 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x72C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x723 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x7B5 PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D2 PUSH2 0x2388 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x867 PUSH2 0x2388 JUMP JUMPDEST PUSH2 0x86F PUSH2 0x36A3 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x921 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xA46 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0xA4E PUSH2 0x2388 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xC58 JUMPI DUP2 TIMESTAMP GT PUSH2 0xC2A JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xB30 PUSH1 0xE0 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0xB3B PUSH2 0x29F4 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0xB80 PUSH1 0x62 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0xC1E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0xBF4 JUMPI PUSH2 0xBF2 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2785 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC90 CALLDATASIZE PUSH2 0x244C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD5 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB5 JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCFD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD25 PUSH2 0xD20 DUP4 DUP6 DUP11 PUSH2 0x284A JUMP JUMPDEST PUSH2 0x2889 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE87 JUMPI JUMPDEST POP ISZERO PUSH2 0xE5A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB4 PUSH2 0xD20 DUP4 DUP6 DUP11 PUSH2 0x284A JUMP JUMPDEST AND SWAP1 PUSH2 0xDC4 PUSH2 0xD20 DUP3 DUP7 DUP10 PUSH2 0x284A JUMP JUMPDEST SWAP2 PUSH2 0xDD0 DUP3 DUP8 DUP12 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE49 JUMPI JUMPDEST POP ADD PUSH2 0xCF4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE54 SWAP2 PUSH2 0x2568 JUMP JUMPDEST DUP9 PUSH2 0xE42 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEAE JUMPI JUMPDEST PUSH2 0xEA0 DUP2 DUP4 PUSH2 0x2568 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x368B JUMP JUMPDEST DUP10 PUSH2 0xD8A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE96 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCED JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEF6 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0xEFE PUSH2 0x2388 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF21 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xF8D DUP5 DUP5 DUP5 PUSH2 0xF54 PUSH2 0x36A3 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFBE JUMPI PUSH2 0x34C5 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xF9E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xFB3 SWAP6 PUSH2 0xFAD SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3654 JUMP JUMPDEST SWAP4 PUSH2 0x37B7 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x508 JUMP JUMPDEST PUSH2 0xFCA DUP5 DUP12 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST PUSH2 0x34C5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1009 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1036 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x34C5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1076 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x10A3 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x32E7 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x26C3 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2306 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1153 PUSH2 0x2388 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1280 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x134C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9B1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x13A5 CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x13D2 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x308E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x140F PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1497 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x14C4 PUSH2 0x36A3 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1500 JUMPI JUMPDEST POP POP PUSH2 0x2B5D JUMP JUMPDEST PUSH2 0x150B SWAP2 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x14F9 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1520 CALLDATASIZE PUSH2 0x244C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1563 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x168B JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x158B JUMPI STOP JUMPDEST PUSH2 0x1596 DUP2 DUP4 DUP9 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x15D7 DUP8 PUSH2 0x15D0 PUSH2 0xD20 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x284A JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1632 PUSH1 0x64 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1682 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1655 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1582 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1648 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x157B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x16CC PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1728 CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x175D PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1757 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2A9B JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1788 DUP2 PUSH2 0x25A9 JUMP JUMPDEST SWAP3 PUSH2 0x1796 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2568 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1808 JUMPI POP POP POP PUSH2 0x17C0 DUP5 PUSH2 0x25A9 JUMP JUMPDEST SWAP3 PUSH2 0x17CE PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2568 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x17F8 JUMPI POP POP PUSH2 0xBF2 SWAP4 POP PUSH2 0x2F3E JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x17E5 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x17AD JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1876 PUSH2 0x1871 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0x2509 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x18B7 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x18D7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x31F JUMPI PUSH2 0x18FC PUSH2 0x508 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1928 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2C7E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x198C PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2B5D JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x19C9 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x19F8 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1757 PUSH2 0x36A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x1B2B JUMPI DUP2 PUSH2 0x1A6D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1AF9 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x1A3D JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x26C3 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1BE7 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1BF2 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1D9C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1CB7 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1D41 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1C68 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1E19 PUSH2 0x29F4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1EB9 PUSH2 0x2388 JUMP JUMPDEST PUSH2 0x1EC1 PUSH2 0x36A3 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1F74 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9B1 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x20B4 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0x20BC PUSH2 0x2388 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x20E6 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2127 JUMPI JUMPDEST POP POP PUSH2 0x34C5 JUMP JUMPDEST PUSH2 0x2132 SWAP2 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x2120 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x214A CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2177 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x28AA JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x2212 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x223F PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2785 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C3 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1876 PUSH1 0x20 SWAP2 PUSH2 0x25C1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2350 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2311 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2425 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2448 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2495 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x24B8 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2448 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2561 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x74F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x266A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2664 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x26B9 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x268A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x267F JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x26D7 DUP5 PUSH2 0x2670 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2745 JUMPI POP PUSH1 0x1 EQ PUSH2 0x26FE JUMPI JUMPDEST POP PUSH2 0x26FC SWAP3 POP SUB DUP4 PUSH2 0x2568 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2729 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x26FC SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x26EF JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2710 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x26FC SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x26EF JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2806 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x285A JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x324 JUMPI DUP6 ISZERO PUSH2 0x29EC JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x28E1 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x28D6 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x28EF PUSH2 0xD20 DUP3 DUP5 DUP9 PUSH2 0x284A JUMP JUMPDEST PUSH2 0x28FA DUP3 DUP6 DUP10 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x29DA JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x2972 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x28C0 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x29A4 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x293B JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x29E4 SWAP3 DUP13 PUSH2 0x32E7 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x2933 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2A1D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C3 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2A95 PUSH1 0xC0 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2AF5 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x2BAB JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2C32 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2B63 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x324 JUMPI DUP1 ISZERO PUSH2 0x2F21 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D1A JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2D08 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2D11 SWAP4 PUSH2 0x32E7 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x2D02 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D3D PUSH2 0xD20 DUP4 DUP6 DUP12 PUSH2 0x284A JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2EDD JUMPI PUSH2 0x2D4F DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2E19 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2E0F JUMPI JUMPDEST PUSH2 0x2DB3 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2CC0 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2DD9 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2DAA JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2DA5 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2EB3 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2E65 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2D56 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2E7D JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2E5D JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x285A JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x324 JUMPI DUP2 ISZERO PUSH2 0x2D02 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2FB2 JUMPI POP POP POP POP DUP2 PUSH2 0x2F6B JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2F82 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2FD1 DUP3 DUP5 PUSH2 0x2F2A JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1B2B JUMPI PUSH2 0x2FE3 DUP3 DUP6 PUSH2 0x2F2A JUMP JUMPDEST MLOAD DUP1 PUSH2 0x3021 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2F57 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x3064 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2FEA JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x324 JUMPI DUP5 ISZERO PUSH2 0x29EC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3180 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3176 JUMPI JUMPDEST PUSH2 0x30EF JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x312C JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x30E8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x30E3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x31A3 PUSH2 0xD20 DUP4 DUP6 DUP10 PUSH2 0x284A JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x32A3 JUMPI PUSH2 0x31B5 DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3209 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x30CE JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2EB3 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3256 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x31BC JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x326D JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x324D JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3481 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3478 JUMPI JUMPDEST PUSH2 0x33B4 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x341D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x336C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3367 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x35D6 JUMPI DUP3 PUSH2 0x352F JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2C32 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x35AF JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x34EA JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x35A5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3660 DUP3 PUSH2 0x361A JUMP JUMPDEST SWAP2 PUSH2 0x366E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2568 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x37A8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x37AD JUMPI JUMPDEST PUSH2 0x37A8 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x372E JUMPI JUMPDEST POP PUSH2 0x372B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3789 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3721 JUMP JUMPDEST PUSH2 0x37A2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAE JUMPI PUSH2 0xEA0 DUP2 DUP4 PUSH2 0x2568 JUMP JUMPDEST CODESIZE PUSH2 0x3782 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x36EA JUMP JUMPDEST PUSH2 0x3826 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2306 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x38B6 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3889 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3930 JUMPI JUMPDEST DUP2 PUSH2 0x38CF PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2568 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x392C JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3929 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x383C JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x38C2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID 0x4E PUSH17 0x44E588D96A7172D6571A03B2DDF9C6008 CODESIZE RETURNDATACOPY MULMOD 0xC3 TLOAD 0xC4 0xD3 0xCA DUP13 RETURN 0x28 0x2B PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER CALLER TSTORE DELEGATECALL GT SWAP12 0xBB DIV CREATE JUMP 0xB3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x82335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x81335DF4119BBB04F056B3 RETURNDATACOPY 0xBA CALLER 0xB8 0x26 0xD3 MSTORE SWAP2 0x29 RETF PC STATICCALL 0xF6 0xDA 0xA9 SWAP3 0x4B GAS DUP16 EXTCODESIZE PUSH11 0x8300000000000000000000 ","sourceMap":"1083:988:282:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1083:988:282;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1083:988:282;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1083:988:282;;;;;;;;500:10:59;;;;;;2510:4:280;-1:-1:-1;;1083:988:282;;;;;500:10:59;;;-1:-1:-1;;;;500:10:59;;;;1083:988:282;;;;;;500:10:59;;1083:988:282;;;;-1:-1:-1;;;;;1083:988:282;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;2510:4:280;1083:988:282;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;;;-1:-1:-1;;;;;1083:988:282;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;2510:4:280;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;;-1:-1:-1;;;;;;;;;;;1083:988:282;1598:32:277;;;-1:-1:-1;500:10:59;;1083:988:282;500:10:59;1083:988:282;-1:-1:-1;500:10:59;2510:4:280;1083:988:282;;500:10:59;;1083:988:282;;500:10:59;;1592::282;1645:152:42;;1083:988:282;-1:-1:-1;;;;500:10:59;;;1083:988:282;500:10:59;;;;1083:988:282;500:10:59;;;;;2510:4:280;-1:-1:-1;;1083:988:282;;;;;500:10:59;;;-1:-1:-1;;;500:10:59;;;;;;;1083:988:282;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1083:988:282;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1083:988:282;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1083:988:282;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;1083:988:282;;;;500:10:59;;-1:-1:-1;;;500:10:59;;;;;;;;1083:988:282;;;;500:10:59;;;1083:988:282;745:39:76;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;1645:152:42;1083:988:282;;;-1:-1:-1;;;;;;1083:988:282;1592:10;1083:988;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1083:988:282;;;;-1:-1:-1;1083:988:282;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1083:988:282;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;2510:4:280;1083:988:282;;;;;;-1:-1:-1;1083:988:282;;;;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;;;;;;;;;;;;1083:988:282;;;;;;;-1:-1:-1;;;1083:988:282;;;;;;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;2510:4:280;1083:988:282;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;2510:4:280;1083:988:282;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;-1:-1:-1;;1083:988:282;;;-1:-1:-1;;;;;1083:988:282;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1083:988:282;;;;;;;;-1:-1:-1;;1083:988:282;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":9096,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":9131,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9292,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9180,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":13908,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13963,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":9435,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":9061,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":8966,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":9641,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13850,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":10314,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":9923,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":9840,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":9576,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":10740,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":10117,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchBurnFrom":{"entryPoint":10410,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_batchMint":{"entryPoint":12094,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":12430,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":11390,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_burn":{"entryPoint":11101,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":14263,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":13031,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":10907,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":9481,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgSender":{"entryPoint":13987,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":9665,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transfer":{"entryPoint":13509,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":12074,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":10377,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8278},{"length":32,"start":9504},{"length":32,"start":14010}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146122a057806306fdde0314612245578063095ea7b3146121d857806318160ddd1461217d5780631b9a75291461213957806323b872dd1461207a5780632b4c9f161461200b5780632f2ff15d14611e7f578063313ce56714611e215780633644e51514611de05780633950935114611bb05780633c130d9014611b5557806340c10f191461199257806342966c681461192e5780634885b25414611880578063572b6c0514611835578063685731071461171a57806370a082311461169557806373c8a9581461151257806379cc67901461145d5780637ecebe00146113d857806388d695b2146113945780638bb9c5bf146112255780638da5cb5b146111b457806391d148541461111c57806395d89b41146110a9578063a457c2d71461103c578063a9059cbb14610fcf578063b88d4fde14610ebf578063c3666c3614610c82578063d505accf14610a0f578063d5391393146109b6578063d547741f1461082d578063dd62ed3e1461077e578063e0df5b6f14610533578063eb7955491461046e578063f2fde38b1461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc366123dc565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d6136a3565b925416911690810361034e57508181036103245760005b81811061022d57005b61023881838761284a565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f5761026282858761284a565b35908147106102ed57600080809381935af13d156102e5573d906102858261361a565b916102936040519384612568565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b2612365565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc6103db6136a3565b9080549273ffffffffffffffffffffffffffffffffffffffff808516931683810361034e575073ffffffffffffffffffffffffffffffffffffffff169283830361042157005b7fffffffffffffffffffffffff000000000000000000000000000000000000000016831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576104a5612365565b60243560443567ffffffffffffffff811161031f576104c89036906004016124db565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261050183836104fa6136a3565b80976134c5565b813b610513575b602060405160018152f35b61052994610522913691613654565b92806137b7565b8080808080610508565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043567ffffffffffffffff811161031f576105829036906004016124db565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806105c16136a3565b925416911690810361034e57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff811161074f576106098254612670565b601f8111610707575b506000601f821160011461066c57819293600092610661575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b01359050838061062b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b8681106106ef57508360019596106106b7575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558380806106ad565b9092602060018192868601358155019401910161069a565b826000526020600020601f830160051c81019160208410610745575b601f0160051c01905b8181106107395750610612565b6000815560010161072c565b9091508190610723565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576107b5612365565b73ffffffffffffffffffffffffffffffffffffffff6107d2612388565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435610867612388565b61086f6136a3565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541661092157005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610a46612365565b610a4e612388565b6044359060643560843560ff811680910361031f5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610c5857814211610c2a576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c08152610b3060e082612568565b519020610b3b6129f4565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152610b80606282612568565b519020906040519182528482015260a435604082015260c435606082015282805260015afa15610c1e5773ffffffffffffffffffffffffffffffffffffffff6000511603610bf457610bf2927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612785565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57610c903661244c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cd56136a3565b925416911690810361034e5750808214801590610eb5575b6103245760005b828110610cfd57005b73ffffffffffffffffffffffffffffffffffffffff610d25610d2083858a61284a565b612889565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c1e57600091610e87575b5015610e5a575073ffffffffffffffffffffffffffffffffffffffff610db4610d2083858a61284a565b1690610dc4610d2082868961284a565b91610dd082878b61284a565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c1e57600192610e49575b5001610cf4565b6000610e5491612568565b88610e42565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea8915060203d8111610eae575b610ea08183612568565b81019061368b565b89610d8a565b503d610e96565b5082821415610ced565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610ef6612365565b610efe612388565b60443560643567ffffffffffffffff811161031f57610f219036906004016124db565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610f8d848484610f546136a3565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610fbe576134c5565b823b610f9e57602060405160018152f35b610fb395610fad913691613654565b936137b7565b808080808080610508565b610fca848b84846132e7565b6134c5565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611009612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110366136a3565b906134c5565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611076612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6110a36136a3565b906132e7565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826126c3565b604051918291602083526020830190612306565b0390f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611153612388565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226004356112806136a3565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561134c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081016109b1565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f576105086113a5366123dc565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6113d26136a3565b9061308e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761140f612365565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508611497612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6114c46136a3565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611500575b5050612b5d565b61150b9184846132e7565b84836114f9565b3461031f576115203661244c565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806115636136a3565b925416911690810361034e575080831480159061168b575b6103245760005b83811061158b57005b61159681838861284a565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f5760006020918a826115d7876115d0610d20828f8f9061284a565b938b61284a565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611632606482612568565b51925af115610c1e576000513d6116825750803b155b6116555750600101611582565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611648565b508583141561157b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576116cc612365565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461031f57611728366123dc565b92909161175d7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226117576136a3565b90612a9b565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee90611788816125a9565b926117966040519485612568565b818452602084019160051b81019036821161031f57915b818310611808575050506117c0846125a9565b926117ce6040519485612568565b848452602084019460051b81019036821161031f57945b8186106117f8575050610bf29350612f3e565b85358152602095860195016117e5565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016117ad565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611876611871612365565b612509565b6040519015158152f35b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576118b7612365565b60243567ffffffffffffffff811161031f576118d79036906004016123ab565b916044359267ffffffffffffffff841161031f576118fc6105089436906004016123ab565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6119286136a3565b90612c7e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576105086004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61198c6136a3565b90612b5d565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576119c9612365565b6024356119f87fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226117576136a3565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9216918215611b2b5781611a6d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0548281019080821115611af957507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611a3d565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea6126c3565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611be7612365565b602435611bf26136a3565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611d9c5773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611cb7575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611d4157505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611c68565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611e196129f4565b604051908152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57600435611eb9612388565b611ec16136a3565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff6040600020541615611f7457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080606081016109b1565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576105086120b4612365565b6120bc612388565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916120e66136a3565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603612127575b50506134c5565b6121329184846132e7565b8584612120565b3461031f5761050861214a366123dc565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121776136a3565b906128aa565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610508612212612365565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61223f6136a3565b90612785565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576111186111047f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c3565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f576118766020916125c1565b919082519283825260005b8481106123505750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612311565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612425916004016123ab565b929092916024359067ffffffffffffffff821161031f57612448916004016123ab565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f5781612495916004016123ab565b9290929160243567ffffffffffffffff811161031f57816124b8916004016123ab565b929092916044359067ffffffffffffffff821161031f57612448916004016123ab565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156125615773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761074f57604052565b67ffffffffffffffff811161074f5760051b60200190565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461266a577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612664576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b90600182811c921680156126b9575b602083101461268a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161267f565b90604051918260008254926126d784612670565b808452936001811690811561274557506001146126fe575b506126fc92500383612568565b565b90506000929192526020600020906000915b8183106127295750509060206126fc92820101386126ef565b6020919350806001915483858901015201910190918492612710565b602093506126fc9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386126ef565b929173ffffffffffffffffffffffffffffffffffffffff169283156128065773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b919081101561285a5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9392948086036103245785156129ec5760009560005b8181106128e157505050505050816128d6575050565b600201908154039055565b6128ef610d2082848861284a565b6128fa82858961284a565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff811685036129da575b509050612972575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a3016128c0565b98604060008381528a60205220548a810390808210156129a45750600083815260208b9052604090205589019861293b565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6129e4928c6132e7565b388187612933565b505050505050565b612a1d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a816126c3565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612a9560c082612568565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615612af55750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b82612bab575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612c32575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612b63565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b95949093929192858103610324578015612f215773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612d1a575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612d08575b50505050565b612d11936132e7565b38808080612d02565b73ffffffffffffffffffffffffffffffffffffffff612d3d610d2083858b61284a565b168015612edd57612d4f82858761284a565b3580612e19575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612e0f575b612db3575b50600101612cc0565b8a87039087821015612dd957600090815260208d90526040902090860190556001612daa565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415612da5565b9a8b810190811115612eb3579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612e655750906040602093926000908482528552208181540190555b909150612d56565b90508882989211612e7d575090866020920196612e5d565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b805182101561285a5760209160051b010190565b909182519080518203610324578115612d025760009360005b838110612fb2575050505081612f6b575050565b6002018054918083019280841115612f8257505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612fd18284612f2a565b51168015611b2b57612fe38285612f2a565b5180613021575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612f57565b969190878301928311156130645773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612fea565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b92939490918185036103245784156129ec5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b81811061318057505050505080151580613176575b6130ef575b5050505050565b808503948086101561312c57505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806130e8565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156130e3565b73ffffffffffffffffffffffffffffffffffffffff6131a3610d2083858961284a565b1680156132a3576131b582858761284a565b3580613209575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a3016130ce565b9687810190811115612eb3579673ffffffffffffffffffffffffffffffffffffffff891682811461325657509060019291604060008381528c602052208181540190555b909192506131bc565b8c829c921161326d5750908a60019392019a61324d565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613481576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613478575b6133b4575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b808403938085101561341d5750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260209282861660005283526040600020866000528352806040600020559261336c565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613367565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff169283156135d6578261352f575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff8216600052806020526040600020548381039080821015612c3257508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9716036135af575b50509250506134ea565b838316600052818552604060002055866000528352604060002085815401905538806135a5565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161074f57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926136608261361a565b9161366e6040519384612568565b82948184528183011161031f578281602093846000960137010152565b9081602091031261031f5751801515810361031f5790565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156137a85732331480156137ad575b6137a8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561372e575b5061372b57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c1e57600091613789575b5038613721565b6137a2915060203d602011610eae57610ea08183612568565b38613782565b503390565b50601836106136ea565b61382673ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612306565b03816000865af1908115610c1e576000916138b6575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036138895750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d602011613930575b816138cf60209383612568565b8101031261392c5751907fffffffff000000000000000000000000000000000000000000000000000000008216820361392957507fffffffff0000000000000000000000000000000000000000000000000000000061383c565b80fd5b5080fd5b3d91506138c256fea2646970667358221220fe4e70044e588d96a7172d6571a03b2ddf9c6008383e09c35cc4d3ca8cf3282b64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x22A0 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2245 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x21D8 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x217D JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2139 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x207A JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x200B JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x1E7F JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1E21 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1DE0 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1BB0 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1B55 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x1992 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x192E JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1880 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1835 JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x171A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1695 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1512 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x145D JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x13D8 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1394 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1225 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11B4 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x111C JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x10A9 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x103C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xFCF JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEBF JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC82 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0xA0F JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x9B6 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x82D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x77E JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x46E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x361A JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2568 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x2365 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x3DB PUSH2 0x36A3 JUMP JUMPDEST SWAP1 DUP1 SLOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 AND DUP4 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 DUP4 SUB PUSH2 0x421 JUMPI STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP4 OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x4A5 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x4C8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x501 DUP4 DUP4 PUSH2 0x4FA PUSH2 0x36A3 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x34C5 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x513 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x529 SWAP5 PUSH2 0x522 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3654 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x37B7 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x508 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x582 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x5C1 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH2 0x609 DUP3 SLOAD PUSH2 0x2670 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x707 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x66C JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x661 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x62B JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x6EF JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x6B7 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x6AD JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x745 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x739 JUMPI POP PUSH2 0x612 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x72C JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x723 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x7B5 PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7D2 PUSH2 0x2388 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x867 PUSH2 0x2388 JUMP JUMPDEST PUSH2 0x86F PUSH2 0x36A3 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x921 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xA46 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0xA4E PUSH2 0x2388 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xC58 JUMPI DUP2 TIMESTAMP GT PUSH2 0xC2A JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0xB30 PUSH1 0xE0 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0xB3B PUSH2 0x29F4 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0xB80 PUSH1 0x62 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0xC1E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0xBF4 JUMPI PUSH2 0xBF2 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2785 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC90 CALLDATASIZE PUSH2 0x244C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCD5 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEB5 JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCFD JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD25 PUSH2 0xD20 DUP4 DUP6 DUP11 PUSH2 0x284A JUMP JUMPDEST PUSH2 0x2889 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE87 JUMPI JUMPDEST POP ISZERO PUSH2 0xE5A JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDB4 PUSH2 0xD20 DUP4 DUP6 DUP11 PUSH2 0x284A JUMP JUMPDEST AND SWAP1 PUSH2 0xDC4 PUSH2 0xD20 DUP3 DUP7 DUP10 PUSH2 0x284A JUMP JUMPDEST SWAP2 PUSH2 0xDD0 DUP3 DUP8 DUP12 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE49 JUMPI JUMPDEST POP ADD PUSH2 0xCF4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE54 SWAP2 PUSH2 0x2568 JUMP JUMPDEST DUP9 PUSH2 0xE42 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA8 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEAE JUMPI JUMPDEST PUSH2 0xEA0 DUP2 DUP4 PUSH2 0x2568 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x368B JUMP JUMPDEST DUP10 PUSH2 0xD8A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE96 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCED JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEF6 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0xEFE PUSH2 0x2388 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF21 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x24DB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xF8D DUP5 DUP5 DUP5 PUSH2 0xF54 PUSH2 0x36A3 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xFBE JUMPI PUSH2 0x34C5 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xF9E JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xFB3 SWAP6 PUSH2 0xFAD SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3654 JUMP JUMPDEST SWAP4 PUSH2 0x37B7 JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x508 JUMP JUMPDEST PUSH2 0xFCA DUP5 DUP12 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST PUSH2 0x34C5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1009 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1036 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x34C5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1076 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x10A3 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x32E7 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x26C3 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2306 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1153 PUSH2 0x2388 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1280 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x134C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9B1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x13A5 CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x13D2 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x308E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x140F PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x1497 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x14C4 PUSH2 0x36A3 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1500 JUMPI JUMPDEST POP POP PUSH2 0x2B5D JUMP JUMPDEST PUSH2 0x150B SWAP2 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x14F9 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1520 CALLDATASIZE PUSH2 0x244C JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1563 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x168B JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x158B JUMPI STOP JUMPDEST PUSH2 0x1596 DUP2 DUP4 DUP9 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x15D7 DUP8 PUSH2 0x15D0 PUSH2 0xD20 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x284A JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1632 PUSH1 0x64 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1682 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1655 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1582 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1648 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x157B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x16CC PUSH2 0x2365 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1728 CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x175D PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1757 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2A9B JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1788 DUP2 PUSH2 0x25A9 JUMP JUMPDEST SWAP3 PUSH2 0x1796 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2568 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1808 JUMPI POP POP POP PUSH2 0x17C0 DUP5 PUSH2 0x25A9 JUMP JUMPDEST SWAP3 PUSH2 0x17CE PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2568 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x17F8 JUMPI POP POP PUSH2 0xBF2 SWAP4 POP PUSH2 0x2F3E JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x17E5 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x17AD JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1876 PUSH2 0x1871 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0x2509 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x18B7 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x18D7 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x31F JUMPI PUSH2 0x18FC PUSH2 0x508 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1928 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2C7E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x198C PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2B5D JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x19C9 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x19F8 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1757 PUSH2 0x36A3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x1B2B JUMPI DUP2 PUSH2 0x1A6D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1AF9 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x1A3D JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x26C3 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1BE7 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1BF2 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1D9C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1CB7 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1D41 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1C68 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1E19 PUSH2 0x29F4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x1EB9 PUSH2 0x2388 JUMP JUMPDEST PUSH2 0x1EC1 PUSH2 0x36A3 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1F74 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x9B1 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x20B4 PUSH2 0x2365 JUMP JUMPDEST PUSH2 0x20BC PUSH2 0x2388 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x20E6 PUSH2 0x36A3 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x2127 JUMPI JUMPDEST POP POP PUSH2 0x34C5 JUMP JUMPDEST PUSH2 0x2132 SWAP2 DUP5 DUP5 PUSH2 0x32E7 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x2120 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x214A CALLDATASIZE PUSH2 0x23DC JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2177 PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x28AA JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x508 PUSH2 0x2212 PUSH2 0x2365 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x223F PUSH2 0x36A3 JUMP JUMPDEST SWAP1 PUSH2 0x2785 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1118 PUSH2 0x1104 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C3 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1876 PUSH1 0x20 SWAP2 PUSH2 0x25C1 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2350 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2311 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2425 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2448 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x2495 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x24B8 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x2448 SWAP2 PUSH1 0x4 ADD PUSH2 0x23AB JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2561 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x74F JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x266A JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2664 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x26B9 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x268A JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x267F JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x26D7 DUP5 PUSH2 0x2670 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2745 JUMPI POP PUSH1 0x1 EQ PUSH2 0x26FE JUMPI JUMPDEST POP PUSH2 0x26FC SWAP3 POP SUB DUP4 PUSH2 0x2568 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2729 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x26FC SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x26EF JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2710 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x26FC SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x26EF JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x2806 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x285A JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x324 JUMPI DUP6 ISZERO PUSH2 0x29EC JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x28E1 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x28D6 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x28EF PUSH2 0xD20 DUP3 DUP5 DUP9 PUSH2 0x284A JUMP JUMPDEST PUSH2 0x28FA DUP3 DUP6 DUP10 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x29DA JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x2972 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x28C0 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x29A4 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x293B JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x29E4 SWAP3 DUP13 PUSH2 0x32E7 JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x2933 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2A1D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x26C3 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2A95 PUSH1 0xC0 DUP3 PUSH2 0x2568 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2AF5 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x2BAB JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2C32 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2B63 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x324 JUMPI DUP1 ISZERO PUSH2 0x2F21 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2D1A JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2D08 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2D11 SWAP4 PUSH2 0x32E7 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x2D02 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2D3D PUSH2 0xD20 DUP4 DUP6 DUP12 PUSH2 0x284A JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2EDD JUMPI PUSH2 0x2D4F DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2E19 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2E0F JUMPI JUMPDEST PUSH2 0x2DB3 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2CC0 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2DD9 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x2DAA JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x2DA5 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2EB3 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2E65 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x2D56 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2E7D JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2E5D JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x285A JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x324 JUMPI DUP2 ISZERO PUSH2 0x2D02 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2FB2 JUMPI POP POP POP POP DUP2 PUSH2 0x2F6B JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2F82 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2FD1 DUP3 DUP5 PUSH2 0x2F2A JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1B2B JUMPI PUSH2 0x2FE3 DUP3 DUP6 PUSH2 0x2F2A JUMP JUMPDEST MLOAD DUP1 PUSH2 0x3021 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2F57 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x3064 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2FEA JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x324 JUMPI DUP5 ISZERO PUSH2 0x29EC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3180 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3176 JUMPI JUMPDEST PUSH2 0x30EF JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x312C JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x30E8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x30E3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x31A3 PUSH2 0xD20 DUP4 DUP6 DUP10 PUSH2 0x284A JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x32A3 JUMPI PUSH2 0x31B5 DUP3 DUP6 DUP8 PUSH2 0x284A JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3209 JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x30CE JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2EB3 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3256 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x31BC JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x326D JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x324D JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3481 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3478 JUMPI JUMPDEST PUSH2 0x33B4 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x341D JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x336C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3367 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x35D6 JUMPI DUP3 PUSH2 0x352F JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x2C32 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x35AF JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x34EA JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x35A5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x74F JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3660 DUP3 PUSH2 0x361A JUMP JUMPDEST SWAP2 PUSH2 0x366E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2568 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x37A8 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x37AD JUMPI JUMPDEST PUSH2 0x37A8 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x372E JUMPI JUMPDEST POP PUSH2 0x372B JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3789 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3721 JUMP JUMPDEST PUSH2 0x37A2 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEAE JUMPI PUSH2 0xEA0 DUP2 DUP4 PUSH2 0x2568 JUMP JUMPDEST CODESIZE PUSH2 0x3782 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x36EA JUMP JUMPDEST PUSH2 0x3826 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2306 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x38B6 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3889 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3930 JUMPI JUMPDEST DUP2 PUSH2 0x38CF PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2568 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x392C JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x3929 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x383C JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x38C2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID 0x4E PUSH17 0x44E588D96A7172D6571A03B2DDF9C6008 CODESIZE RETURNDATACOPY MULMOD 0xC3 TLOAD 0xC4 0xD3 0xCA DUP13 RETURN 0x28 0x2B PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1083:988:282:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1083:988:282;;1788:41;;;:::i;:::-;1083:988;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1083:988:282;1845:10:192;;;;;;1083:988:282;1857:3:192;1876:11;;;;;:::i;:::-;1083:988:282;;;;;;;;;1898:10:192;;;;;:::i;:::-;1083:988:282;1375:21:9;;;:30;1371:125;;1083:988:282;1548:33:9;;;;;;;1083:988:282;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1083:988:282;;1834:9:192;;1591:58:9;1083:988:282;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1083:988:282;5957:19:9;1083:988:282;;5957:19:9;1083:988:282;;;;;1371:125:9;1455:21;;1428:57;1083:988:282;1428:57:9;1083:988:282;;;;;;1428:57:9;1083:988:282;;;;1756:63:192;1793:26;1083:988:282;1793:26:192;1083:988:282;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1083:988:282;;-1:-1:-1;4538:25:42;1083:988:282;;;;;;;;;;;;;:::i;:::-;;1788:41;;:::i;:::-;1083:988;;;;;;;;;;3205:23:42;;;3201:60;;1083:988:282;;;3275:25:42;;;;3271:146;;1083:988:282;3271:146:42;1083:988:282;;;;;;3361:45:42;1083:988:282;;3361:45:42;1083:988:282;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1083:988:282;1788:41;17093:5:280;1788:41:282;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;1083:988:282;;;;;;;;17109:96:280;17145:49;1083:988:282;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;1788:41;;;:::i;:::-;1083:988;;;;;4503:26:42;;;4499:64;;1283:19:278;1083:988:282;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;1083:988:282;-1:-1:-1;1083:988:282;27576:12:280;1083:988:282;;;;-1:-1:-1;1083:988:282;27576:28:280;1083:988:282;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1788:41;;:::i;:::-;5148:19:42;1083:988:282;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1083:988:282;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;500:10:59;1083:988:282;1880:140:41;;1083:988:282;1880:140:41;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1083:988:282;;;;1973:36:41;;;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;1083:988:282;2653:23:279;1083:988:282;2653:23:279;1083:988:282;2653:23:279;1083:988:282;;;;;;;;;;;;;;;;;;;2602:87:279;;;;1083:988:282;1021:95:279;1083:988:282;;1021:95:279;1083:988:282;1021:95:279;;1083:988:282;;;;;1021:95:279;;1083:988:282;1021:95:279;;;;1083:988:282;;1021:95:279;;1083:988:282;;1021:95:279;;1083:988:282;;2602:87:279;;;1083:988:282;2602:87:279;;:::i;:::-;1083:988:282;2592:98:279;;2758:18;;:::i;:::-;1083:988:282;;;2729:60:279;;;;1021:95;;;;;;;1083:988:282;1021:95:279;;;1083:988:282;1021:95:279;2729:60;;;;;;:::i;:::-;1083:988:282;2719:71:279;;1083:988:282;;;;;;1021:95:279;;;1083:988:282;;;;1021:95:279;;1083:988:282;;;;1021:95:279;;1083:988:282;2821:24:279;;;1083:988:282;2821:24:279;;;;;1083:988:282;;2821:24:279;1083:988:282;2863:15:279;2859:57;;2982:5;27705:19:280;1083:988:282;2982:5:279;:::i;:::-;1083:988:282;2859:57:279;2887:29;1083:988:282;2887:29:279;1083:988:282;;2887:29:279;2821:24;1083:988:282;;;;;;;;;2470:67:279;2509:28;;1083:988:282;2509:28:279;1083:988:282;;;;2509:28:279;2400:60;2432:28;1083:988:282;2432:28:279;1083:988:282;;2432:28:279;1083:988:282;;;;;;;:::i;:::-;5148:19:42;;;;;;1083:988:282;;;1788:41;;:::i;:::-;1083:988;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1083:988:282;3852:94:192;;1083:988:282;3972:10:192;;;;;;1083:988:282;3984:3:192;1083:988:282;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1083:988:282;;;;4058:76:192;;4108:25;1083:988:282;4058:76:192;;1083:988:282;4058:76:192;;;;;;;;;;;;1083:988:282;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1083:988:282;4239:12:192;;;;;;:::i;:::-;1083:988:282;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1083:988:282;4239:70:192;;;;;;;1083:988:282;;;;;;;4239:70:192;;;;;1083:988:282;4239:70:192;;4277:4;1083:988:282;4239:70:192;;1083:988:282;;4058:76:192;1083:988:282;;;;;;;4239:70:192;;;;;;;1083:988:282;4239:70:192;;;3984:3;;1083:988:282;3961:9:192;;4239:70;1083:988:282;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1083:988:282;4161:50:192;1083:988:282;;4058:76:192;1083:988:282;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1083:988:282;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1083:988:282;1788:41;9818:5:280;1788:41:282;;;;;:::i;:::-;1083:988;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;1083:988:282;;;;;;;18723:98:280;18759:51;1083:988:282;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;1083:988:282:-;;;;;;;;;;;1036:5:242;1083:988:282;;:::i;:::-;;;;;1788:41;;:::i;:::-;1036:5:242;;:::i;1083:988:282:-;;;;;;;;;;;1788:15:242;1083:988:282;;:::i;:::-;;;;;1788:41;;:::i;:::-;:15:242;;:::i;1083:988:282:-;;;;;;;;;;;;;3091:13:277;1083:988:282;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1083:988:282;-1:-1:-1;1083:988:282;;;;;;-1:-1:-1;1083:988:282;500:10:59;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1788:41;;:::i;:::-;1083:988;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;500:10:59;1083:988:282;3741:25:41;3737:66;;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1083:988:282;;;;2455:33:41;1083:988:282;3737:66:41;1083:988:282;3775:28:41;;;1083:988:282;3775:28:41;1083:988:282;;;;;;;3775:28:41;1083:988:282;;;;875:6:243;1083:988:282;;;:::i;:::-;27705:19:280;;;;1083:988:282;1788:41;;:::i;:::-;875:6:243;;:::i;1083:988:282:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1083:988:282;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;24144:5:280;1083:988:282;;:::i;:::-;;;27705:19:280;1083:988:282;1788:41;;:::i;:::-;1083:988;;;;;;;24041:14:280;24037:85;;1083:988:282;24144:5:280;;;:::i;24037:85::-;24105:5;;;;;:::i;:::-;24037:85;;;;1083:988:282;;;;;;;:::i;:::-;5148:19:42;;;;1083:988:282;;1788:41;;;:::i;:::-;1083:988;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1083:988:282;2776:90:192;;1083:988:282;2892:10:192;;;;;;1083:988:282;2904:3:192;2923:9;;;;;:::i;:::-;1083:988:282;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;1083:988:282;;;1328:43:8;1083:988:282;1328:43:8;;;;1083:988:282;1328:43:8;;1083:988:282;1328:43:8;;;1083:988:282;1328:43:8;1083:988:282;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;1083:988:282;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1083:988:282;;2881:9:192;;8938:146:8;9033:40;1083:988:282;9033:40:8;1083:988:282;;1328:43:8;1083:988:282;9033:40:8;8942:68;1083:988:282;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1083:988:282;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1083:988:282;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;1083:988:282;1788:41;;:::i;:::-;1488:12:247;;:::i;:::-;1083:988:282;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;1083:988:282:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;1083:988:282;;;;;;:::i;:::-;27705:19:280;;;1083:988:282;1788:41;;:::i;:::-;1170:6:243;;:::i;1083:988:282:-;;;;;;;;;;;765:5:244;1083:988:282;;;1788:41;;:::i;:::-;765:5:244;;:::i;1083:988:282:-;;;;;;;;;;;;;:::i;:::-;;;1129:12:247;1083:988:282;1788:41;;:::i;1129:12:247:-;1083:988:282;;;;19546:16:280;;;19542:53;;19609:10;19605:370;;1083:988:282;;19989:31:280;1083:988:282;;;;;;;;19989:31:280;1083:988:282;19605:370:280;19652:8;1083:988:282;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;1083:988:282;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;1083:988:282;19786:39:280;1083:988:282;;;;;;19786:39:280;19542:53;19571:24;1083:988:282;19571:24:280;1083:988:282;;19571:24:280;1083:988:282;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;1788:41;;:::i;:::-;1083:988;;;;5455:21:280;;;5451:67;;1083:988:282;;;-1:-1:-1;1083:988:282;5555:12:280;1083:988:282;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;5597:10:280;;5593:366;;1083:988:282;;;5973:42:280;1083:988:282;;;;;;;;;5973:42:280;;1083:988:282;;;;;;;5593:366:280;1083:988:282;;;5720:32:280;;;;;5716:108;;5842:19;;;1083:988:282;;5973:42:280;5842:19;1083:988:282;;;-1:-1:-1;1083:988:282;5555:12:280;1083:988:282;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;5593:366:280;;;;5716:108;1083:988:282;;5761:63:280;;;1083:988:282;;;;;5761:63:280;;1083:988:282;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;1083:988:282;5485:33:280;;1083:988:282;5485:33:280;1083:988:282;;;;;5485:33:280;1083:988:282;;;;;;;;;;;;1284:37:248;;:::i;:::-;1083:988:282;;;;;;;;;;;;;;;;;;;3732:15:277;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1788:41;;:::i;:::-;5148:19:42;1083:988:282;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1083:988:282;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;500:10:59;1083:988:282;1254:25:41;1250:140;;1083:988:282;1250:140:41;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1083:988:282;;;;1343:36:41;1083:988:282;;;;;;;;;;;;;;;;941:19:75;1083:988:282;;;;;;;;;;;;;;;9818:5:280;1083:988:282;;:::i;:::-;;;:::i;:::-;;1788:41;;;:::i;:::-;1083:988;;;;;;;;;;;9707:14:280;9703:85;;1083:988:282;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;1083:988:282;;;;1232:6:244;1083:988:282;;;:::i;:::-;27705:19:280;;;;1083:988:282;1788:41;;:::i;:::-;1232:6:244;;:::i;1083:988:282:-;;;;;;;;;;;;26654:8:280;1083:988:282;;;;;;;;;;;;;;;;;;826:5:242;1083:988:282;;:::i;:::-;;;;;1788:41;;:::i;:::-;826:5:242;;:::i;1083:988:282:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1083:988:282;635:65:55;;:::i;1083:988:282:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1083:988:282;1146:19:75;1083:988:282;1146:53:75;;;1142:96;;1083:988:282;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1083:988:282;1215:12:75;:::o;1083:988:282:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;1083:988:282;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1083:988:282;500:10:59;1083:988:282;500:10:59;;1083:988:282;500:10:59;1083:988:282;500:10:59;;1083:988:282;1359:340:59;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1083:988:282;1528:12:59;:::o;1083:988:282:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;1083:988:282;;4533:21:280;;;4529:67;;1083:988:282;4657:31:280;4606:19;:12;1083:988:282;4606:19:280;1083:988:282;;;-1:-1:-1;1083:988:282;4606:12:280;1083:988:282;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;1083:988:282;4563:33:280;;4552:1;4563:33;1083:988:282;4563:33:280;1083:988:282;;4552:1:280;4563:33;1083:988:282;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;25152:1242:280:-;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;1083:988:282;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;;:::i;:::-;25558;;;;;:::i;:::-;1083:988:282;;;;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;1083:988:282;;;26163:33:280;1083:988:282;25409:1:280;1083:988:282;;;;;;26163:33:280;1083:988:282;25462:9:280;;25689:455;25741:16;1083:988:282;-1:-1:-1;1083:988:282;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;1083:988:282;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;1083:988:282;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;4317:545:279:-;1083:988:282;;;:::i;:::-;;;;;;4669:54:279;1083:988:282;;;4520:321:279;;1083:988:282;4552:95:279;1083:988:282;;;;;;4745:14:279;1083:988:282;;;;4412:53:279;1083:988:282;;;;4818:4:279;1083:988:282;;;;;4520:321:279;;;;;;:::i;:::-;1083:988:282;4493:362:279;;4317:545;:::o;3640:170:41:-;1083:988:282;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;500:10:59;1083:988:282;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1083:988:282;3775:28:41;;-1:-1:-1;3775:28:41;1083:988:282;3775:28:41;1083:988:282;;;;;-1:-1:-1;3775:28:41;22659:524:280;22743:10;22739:389;;22659:524;1083:988:282;;23143:33:280;1083:988:282;;22752:1:280;1083:988:282;;;;;;;23143:33:280;;22659:524::o;22739:389::-;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;1083:988:282;;;22752:1:280;1083:988:282;;;;;;;;;;;23044:8:280;;1083:988:282;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;1083:988:282;22933:46:280;;22752:1;22933:46;1083:988:282;22933:46:280;1083:988:282;;;;;;22752:1:280;22933:46;13849:1950;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;1083:988:282;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;1083:988:282;14325:13:280;;;;;;:::i;:::-;1083:988:282;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;1083:988:282;14472:10:280;14468:656;;14293:3;1083:988:282;;;15143:25:280;1083:988:282;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;1083:988:282;;14270:9:280;;15183:500;1083:988:282;;;15437:21:280;;;;;15433:85;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;1083:988:282;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;1083:988:282;;;;14602:27:280;;;;14598:74;;1083:988:282;;;;;14746:10:280;;;;;14784:14;;1083:988:282;;14784:14:280;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;1083:988:282;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;1083:988:282;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;1083:988:282;14381:32:280;;14132:1;14381:32;1083:988:282;14381:32:280;1083:988:282;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;1083:988:282:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;1083:988:282;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;1083:988:282;;;;;;21949:19:280;;;;;21945:76;;1083:988:282;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;1083:988:282;;;;-1:-1:-1;21977:44:280;21174:3;1083:988:282;21206:13:280;;;;:::i;:::-;1083:988:282;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;1083:988:282;21344:10:280;21340:372;;21174:3;1083:988:282;-1:-1:-1;21730:31:280;1083:988:282;;;;;;;;;21730:31:280;1083:988:282;21151:9:280;;21340:372;1083:988:282;;;;;;21474:27:280;;;;21470:70;;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;1083:988:282;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;1083:988:282;;;12409:21:280;;;;;12405:85;;12508:16;;1083:988:282;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;;;;12171:472:280;;;;;;;12405:85;1083:988:282;12439:51:280;;11116:1;12439:51;1083:988:282;12439:51:280;1083:988:282;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;1083:988:282;11309:13:280;;;;;;:::i;:::-;1083:988:282;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;1083:988:282;11455:10:280;11451:656;;11277:3;1083:988:282;;;;;;;;;12125:25:280;1083:988:282;;;;12125:25:280;;1083:988:282;11254:9:280;;11451:656;1083:988:282;;;;11585:27:280;;;;11581:74;;1083:988:282;;;;11729:10:280;;;;;11767:14;;1083:988:282;11767:14:280;;1083:988:282;-1:-1:-1;1083:988:282;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;1083:988:282;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;1083:988:282;;;;;;11116:1:280;11873:46;11336:61;1083:988:282;11365:32:280;;11116:1;11365:32;1083:988:282;11365:32:280;1083:988:282;;11116:1:280;11365:32;6693:851;;;;1083:988:282;;;6808:21:280;;;6804:67;;6908:12;;:19;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;1083:988:282;;;;;;7495:42:280;1083:988:282;;;;;;;7495:42:280;;6693:851::o;6947:534::-;1083:988:282;;;7238:32:280;;;;;7234:112;;7364:19;;;1083:988:282;7495:42:280;7364:19;1083:988:282;7364:19:280;1083:988:282;;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;6947:534:280;;;7234:112;1083:988:282;;7279:67:280;;;1083:988:282;;;;7279:67:280;;;1083:988:282;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;1083:988:282;6838:33:280;;6827:1;6838:33;1083:988:282;6838:33:280;1083:988:282;;6827:1:280;6838:33;8105:628;;;1083:988:282;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;1083:988:282;;;8701:25:280;1083:988:282;;;;;;;8701:25:280;;8105:628::o;8273:413::-;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;;;8437:21:280;;;;;8433:80;;1083:988:282;;;;;;;;8701:25:280;1083:988:282;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;1083:988:282;;;-1:-1:-1;1083:988:282;;;;;-1:-1:-1;1083:988:282;;;-1:-1:-1;1083:988:282;;;;-1:-1:-1;1083:988:282;;;;;;;8531:131:280;;;;8201:61;1083:988:282;8230:32:280;;8219:1;8230:32;1083:988:282;8230:32:280;1083:988:282;;8219:1:280;8230:32;1083:988:282;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1083:988:282;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1083:988:282;1029:19:76;1083:988:282;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1083:988:282;;;;;;1676:74:76;;;;1083:988:282;1676:74:76;;;;;;1083:988:282;1327:10:76;1083:988:282;;;;1744:4:76;1083:988:282;;;;1676:74:76;;;;;;;1083:988:282;1676:74:76;;;1630:120;;;;;1676:74;;;;1083:988:282;1676:74:76;1083:988:282;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;1083:988:282;;28229:252:280;;;;1083:988:282;28229:252:280;1083:988:282;;;;;28357:61:280;;;;;1083:988:282;28357:61:280;;1083:988:282;28357:61:280;;;1083:988:282;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;1083:988:282;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;1083:988:282;;-1:-1:-1;28445:29:280;28357:61;1083:988:282;28357:61:280;;1083:988:282;28357:61:280;;;;;;1083:988:282;28357:61:280;;;:::i;:::-;;;1083:988:282;;;;;;;;;;;;;28357:61:280;1083:988:282;28357:61:280;;1083:988:282;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2940400","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","MINTER_ROLE()":"826","allowance(address,address)":"3233","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address[],uint256[])":"infinite","batchMint(address[],uint256[])":"infinite","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","decimals()":"2429","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2983","increaseAllowance(address,uint256)":"infinite","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","name()":"infinite","nonces(address)":"2817","owner()":"2759","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","MINTER_ROLE()":"d5391393","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address[],uint256[])":"1b9a7529","batchMint(address[],uint256[])":"68573107","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","increaseAllowance(address,uint256)":"39509351","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/preset/ERC20MintBurn.sol\":\"ERC20MintBurn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20Base} from \\\"./base/ERC20Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20 is ERC20Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    constructor() {\\n        ERC20Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x6df32fb3ead7ce4a30809cbaeb0829bd02db5acd07643a8089fd8bee41c40f2a\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./base/ERC20BatchTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20BatchTransfers is ERC20BatchTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20BatchTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0xb33e4983366b06d9e68191ce962775ba0efea8b7fbbcc30e5288a00976803132\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./base/ERC20BurnableBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Burnable is ERC20BurnableBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    constructor() {\\n        ERC20Storage.initERC20Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xc0155d693e6d3884f65f53877fb50d0678e7113f494cb71989def75115009e73\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20DetailedStorage} from \\\"./libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./base/ERC20DetailedBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Detailed is ERC20DetailedBase {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @notice Initializes the storage with the token details.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    constructor(string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) {\\n        ERC20DetailedStorage.layout().constructorInit(tokenName, tokenSymbol, tokenDecimals);\\n    }\\n}\\n\",\"keccak256\":\"0x69e7fa29be54e4a018faee910d354628b65394e386492ddb31cf2b02ad4fbea4\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20MetadataStorage} from \\\"./libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./base/ERC20MetadataBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Metadata is ERC20MetadataBase, ContractOwnership {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    constructor() {\\n        ERC20MetadataStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x9f5a878e2db5c3aaad4da6c9412473c3deb2455a88845f9221e59356fa10ab50\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20MintableBase} from \\\"./base/ERC20MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20Mintable is ERC20MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    constructor() {\\n        ERC20Storage.initERC20Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x41ab17a82891d788d675cf9f92a26eada93fc2cab87469098030c409527f3875\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitStorage} from \\\"./libraries/ERC20PermitStorage.sol\\\";\\nimport {ERC20PermitBase} from \\\"./base/ERC20PermitBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20Permit is ERC20PermitBase {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    constructor() {\\n        ERC20PermitStorage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x7b2f21bcace7f1ce6c7da04d6496b14e5ec26475f6b328289f32d214661f06a8\",\"license\":\"MIT\"},\"contracts/token/ERC20/ERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20Storage} from \\\"./libraries/ERC20Storage.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./base/ERC20SafeTransfersBase.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC20SafeTransfers is ERC20SafeTransfersBase {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    constructor() {\\n        ERC20Storage.initERC20SafeTransfers();\\n    }\\n}\\n\",\"keccak256\":\"0x6e13959d36c26de3fc66c205ec03ec575ea847aa7b9ca15f026fcbd0751ea43e\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/ERC20MintBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20} from \\\"./../ERC20.sol\\\";\\nimport {ERC20Detailed} from \\\"./../ERC20Detailed.sol\\\";\\nimport {ERC20Metadata} from \\\"./../ERC20Metadata.sol\\\";\\nimport {ERC20Permit} from \\\"./../ERC20Permit.sol\\\";\\nimport {ERC20SafeTransfers} from \\\"./../ERC20SafeTransfers.sol\\\";\\nimport {ERC20BatchTransfers} from \\\"./../ERC20BatchTransfers.sol\\\";\\nimport {ERC20Mintable} from \\\"./../ERC20Mintable.sol\\\";\\nimport {ERC20Burnable} from \\\"./../ERC20Burnable.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (immutable version).\\ncontract ERC20MintBurn is\\n    ERC20,\\n    ERC20Detailed,\\n    ERC20Metadata,\\n    ERC20Permit,\\n    ERC20SafeTransfers,\\n    ERC20BatchTransfers,\\n    ERC20Mintable,\\n    ERC20Burnable,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        uint8 tokenDecimals,\\n        IForwarderRegistry forwarderRegistry\\n    ) ERC20Detailed(tokenName, tokenSymbol, tokenDecimals) ForwarderRegistryContext(forwarderRegistry) ContractOwnership(msg.sender) {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc77047ab10062df1f0da1b0a09be6160b61b78faacd9e0ae9d899eaa59deb812\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol":{"ERC20FixedSupplyProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"allocations","type":"uint256[]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, fixed supply preset contract (proxied version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f6136c538819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b038116810360745760805260405161363590816100908239608051818181612014015281816124bb01526133810152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461221a57806306fdde03146121bf578063095ea7b31461215257806318160ddd146120f757806323b872dd146120385780632b4c9f1614611fc9578063313ce56714611f6b5780633644e51514611f2a5780633950935114611cfa5780633c130d9014611c9f5780634885b25414611bf1578063572b6c0514611ba657806370a0823114611b2157806373c8a9581461199e5780637ecebe001461191957806388d695b2146118d55780638a6d57b614610f495780638da5cb5b14610ed857806395d89b4114610e65578063a457c2d714610df8578063a9059cbb14610d8b578063b88d4fde14610c7b578063c3666c3614610a3e578063d505accf146107cb578063dd62ed3e1461071c578063e0df5b6f146104d1578063eb7955491461040c578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc576101693661240a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa61336a565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d5818387612867565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff828587612867565b359081471061028a57600080809381935af13d15610282573d90610222826132e1565b916102306040519384612503565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f612300565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061037961336a565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036102eb575073ffffffffffffffffffffffffffffffffffffffff16918282036103bd57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610443612300565b60243560443567ffffffffffffffff81116102bc57610466903690600401612476565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261049f838361049861336a565b8097613140565b813b6104b1575b602060405160018152f35b6104c7946104c091369161331b565b928061347e565b80808080806104a6565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc57610520903690600401612476565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055f61336a565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106ed576105a782546125e6565b601f81116106a5575b506000601f821160011461060a578192936000926105ff575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105c9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b86811061068d5750836001959610610655575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061064b565b90926020600181928686013581550194019101610638565b826000526020600020601f830160051c810191602084106106e3575b601f0160051c01905b8181106106d757506105b0565b600081556001016106ca565b90915081906106c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610753612300565b73ffffffffffffffffffffffffffffffffffffffff610770612323565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610802612300565b61080a612323565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a14578142116109e6576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108ec60e082612503565b5190206108f76127c0565b9060405190868201927f19010000000000000000000000000000000000000000000000000000000000008452602283015260428201526042815261093c606282612503565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109da5773ffffffffffffffffffffffffffffffffffffffff60005116036109b0576109ae927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6126fb565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc57610a4c36612377565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a9161336a565b92541691169081036102eb5750808214801590610c71575b6102c15760005b828110610ab957005b73ffffffffffffffffffffffffffffffffffffffff610ae1610adc83858a612867565b6128a6565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109da57600091610c43575b5015610c16575073ffffffffffffffffffffffffffffffffffffffff610b70610adc83858a612867565b1690610b80610adc828689612867565b91610b8c82878b612867565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109da57600192610c05575b5001610ab0565b6000610c1091612503565b88610bfe565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c64915060203d8111610c6a575b610c5c8183612503565b810190613352565b89610b46565b503d610c52565b5082821415610aa9565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610cb2612300565b610cba612323565b60443560643567ffffffffffffffff81116102bc57610cdd903690600401612476565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d49848484610d1061336a565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d7a57613140565b823b610d5a57602060405160018152f35b610d6f95610d6991369161331b565b9361347e565b8080808080806104a6565b610d86848b8484612f62565b613140565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6610dc5612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610df261336a565b90613140565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6610e32612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e5f61336a565b90612f62565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612639565b6040519182916020835260208301906122a1565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc57610f98903690600401612476565b9060243567ffffffffffffffff81116102bc57610fb9903690600401612476565b90926044359060ff82168092036102bc5760643567ffffffffffffffff81116102bc57610fea903690600401612346565b92909360843567ffffffffffffffff81116102bc5761100d903690600401612346565b9790967fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61103961336a565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561184e575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081611880575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f53f41a97000000000000000000000000000000000000000000000000000000006000527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a98054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491967f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81939092909181101561184e575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116106ed57819061127684546125e6565b601f81116117fb575b50600090601f83116001146117595760009261174e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff82116106ed5781906113037f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82546125e6565b601f81116116bf575b50600090601f83116001146115c0576000926115b5575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061150881612544565b926115166040519485612503565b818452602084019160051b8101903682116102bc57915b8183106115885750505061154084612544565b9261154e6040519485612503565b848452602084019460051b8101903682116102bc57945b8186106115785750506109ae9350612de8565b8535815260209586019501611565565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bc5781526020928301920161152d565b013590508880611323565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8282527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef929091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016815b8181106116a7575090846001959493921061166f575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8255611375565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055888080611642565b9193602060018192878701358155019501920161162c565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000529091507f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f840160051c81019160208510611744575b90601f859493920160051c01905b818110611735575061130c565b60008155849350600101611728565b909150819061171a565b013590508b80611296565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106117e357509084600195949392106117ab575b505050811b0190556112c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558b808061179e565b91936020600181928787013581550195019201611788565b909150836000526020600020601f840160051c81019160208510611844575b90601f859493920160051c01905b818110611835575061127f565b60008155849350600101611828565b909150819061181a565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a389806110a6565b346102bc576104a66118e63661240a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61191361336a565b90612b73565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611950612300565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc576119ac36612377565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119ef61336a565b92541691169081036102eb5750808314801590611b17575b6102c15760005b838110611a1757005b611a22818388612867565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a82611a6387611a5c610adc828f8f90612867565b938b612867565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611abe606482612503565b51925af1156109da576000513d611b0e5750803b155b611ae15750600101611a0e565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611ad4565b5085831415611a07565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611b58612300565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576020611be7611be2612300565b6124a4565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611c28612300565b60243567ffffffffffffffff81116102bc57611c48903690600401612346565b916044359267ffffffffffffffff84116102bc57611c6d6104a6943690600401612346565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611c9961336a565b906128c7565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612639565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611d31612300565b602435611d3c61336a565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611ee65773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611e01575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611e8b57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611db2565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576020611f636127c0565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6612072612300565b61207a612323565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916120a461336a565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036120e5575b5050613140565b6120f0918484612f62565b85846120de565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a661218c612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121b961336a565b906126fb565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612639565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc57611be76020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d61255c565b919082519283825260005b8481106122eb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016122ac565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc57816123c091600401612346565b9290929160243567ffffffffffffffff81116102bc57816123e391600401612346565b929092916044359067ffffffffffffffff82116102bc5761240691600401612346565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc578161245391600401612346565b929092916024359067ffffffffffffffff82116102bc5761240691600401612346565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156124fc5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106ed57604052565b67ffffffffffffffff81116106ed5760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146124fc577f01ffc9a70000000000000000000000000000000000000000000000000000000081146125df5760005260205260ff6040600020541690565b5050600190565b90600182811c9216801561262f575b602083101461260057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916125f5565b906040519182600082549261264d846125e6565b80845293600181169081156126bb5750600114612674575b5061267292500383612503565b565b90506000929192526020600020906000915b81831061269f5750509060206126729282010138612665565b6020919350806001915483858901015201910190918492612686565b602093506126729592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612665565b929173ffffffffffffffffffffffffffffffffffffffff1692831561277c5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6127e97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612639565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261286160c082612503565b51902090565b91908110156128775760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c1578015612b6a5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612963575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612951575b50505050565b61295a93612f62565b3880808061294b565b73ffffffffffffffffffffffffffffffffffffffff612986610adc83858b612867565b168015612b2657612998828587612867565b3580612a62575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612a58575b6129fc575b50600101612909565b8a87039087821015612a2257600090815260208d905260409020908601905560016129f3565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156129ee565b9a8b810190811115612afc579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612aae5750906040602093926000908482528552208181540190555b90915061299f565b90508882989211612ac6575090866020920196612aa6565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c1578415612dcc5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110612c6557505050505080151580612c5b575b612bd4575b5050505050565b8085039480861015612c1157505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612bcd565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612bc8565b73ffffffffffffffffffffffffffffffffffffffff612c88610adc838589612867565b168015612d8857612c9a828587612867565b3580612cee575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612bb3565b9687810190811115612afc579673ffffffffffffffffffffffffffffffffffffffff8916828114612d3b57509060019291604060008381528c602052208181540190555b90919250612ca1565b8c829c9211612d525750908a60019392019a612d32565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b80518210156128775760209160051b010190565b9091825190805182036102c157811561294b5760009360005b838110612e5c575050505081612e15575050565b6002018054918083019280841115612e2c57505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612e7b8284612dd4565b51168015612f3857612e8d8285612dd4565b5180612ecb575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612e01565b96919087830192831115612f0e5773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612e94565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b92909173ffffffffffffffffffffffffffffffffffffffff81169384156130fc576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806130f3575b61302f575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156130985750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592612fe7565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515612fe2565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561329d57826131aa575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561325157508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361322a575b5050925050613165565b83831660005281855260406000205586600052835260406000208581540190553880613220565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106ed57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613327826132e1565b916133356040519384612503565b8294818452818301116102bc578281602093846000960137010152565b908160209103126102bc575180151581036102bc5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561346f573233148015613474575b61346f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156133f5575b506133f257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156109da57600091613450575b50386133e8565b613469915060203d602011610c6a57610c5c8183612503565b38613449565b503390565b50601836106133b1565b6134ed73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906122a1565b03816000865af19081156109da5760009161357d575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036135505750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116135f7575b8161359660209383612503565b810103126135f35751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135f057507fffffffff00000000000000000000000000000000000000000000000000000000613503565b80fd5b5080fd5b3d915061358956fea26469706673582212202b373a0a64729ebfb47856a51d39afcf726f2a6e3ede5c5b8538b3bdd3c2d2bc64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x36C5 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x3635 SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x2014 ADD MSTORE DUP2 DUP2 PUSH2 0x24BB ADD MSTORE PUSH2 0x3381 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x221A JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x21BF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2152 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x20F7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2038 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1FC9 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1F6B JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1F2A JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1CFA JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1C9F JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1BF1 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BA6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B21 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x199E JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1919 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x18D5 JUMPI DUP1 PUSH4 0x8A6D57B6 EQ PUSH2 0xF49 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xED8 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE65 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDF8 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD8B JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC7B JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA3E JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7CB JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x71C JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4D1 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x240A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x32E1 JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2503 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x2300 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x379 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3BD JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x443 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x466 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x49F DUP4 DUP4 PUSH2 0x498 PUSH2 0x336A JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3140 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4B1 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4C7 SWAP5 PUSH2 0x4C0 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x331B JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x347E JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x520 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55F PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH2 0x5A7 DUP3 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6A5 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x60A JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5FF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5C9 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x68D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x655 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x64B JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x638 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6E3 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6D7 JUMPI POP PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6CA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6C1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x753 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x770 PUSH2 0x2323 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x802 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x80A PUSH2 0x2323 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA14 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9E6 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8EC PUSH1 0xE0 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8F7 PUSH2 0x27C0 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x93C PUSH1 0x62 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9B0 JUMPI PUSH2 0x9AE SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x26FB JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xA4C CALLDATASIZE PUSH2 0x2377 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA91 PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC71 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAB9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAE1 PUSH2 0xADC DUP4 DUP6 DUP11 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x28A6 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC43 JUMPI JUMPDEST POP ISZERO PUSH2 0xC16 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB70 PUSH2 0xADC DUP4 DUP6 DUP11 PUSH2 0x2867 JUMP JUMPDEST AND SWAP1 PUSH2 0xB80 PUSH2 0xADC DUP3 DUP7 DUP10 PUSH2 0x2867 JUMP JUMPDEST SWAP2 PUSH2 0xB8C DUP3 DUP8 DUP12 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC05 JUMPI JUMPDEST POP ADD PUSH2 0xAB0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC10 SWAP2 PUSH2 0x2503 JUMP JUMPDEST DUP9 PUSH2 0xBFE JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC64 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC6A JUMPI JUMPDEST PUSH2 0xC5C DUP2 DUP4 PUSH2 0x2503 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3352 JUMP JUMPDEST DUP10 PUSH2 0xB46 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC52 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAA9 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xCB2 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0xCBA PUSH2 0x2323 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xCDD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD49 DUP5 DUP5 DUP5 PUSH2 0xD10 PUSH2 0x336A JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD7A JUMPI PUSH2 0x3140 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD5A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD6F SWAP6 PUSH2 0xD69 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x331B JUMP JUMPDEST SWAP4 PUSH2 0x347E JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0xD86 DUP5 DUP12 DUP5 DUP5 PUSH2 0x2F62 JUMP JUMPDEST PUSH2 0x3140 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0xDC5 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDF2 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x3140 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0xE32 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE5F PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x2F62 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2639 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x22A1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xF98 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xFB9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x2BC JUMPI PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xFEA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x100D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x1039 PUSH2 0x336A JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x184E JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x1880 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP7 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0x184E JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6ED JUMPI DUP2 SWAP1 PUSH2 0x1276 DUP5 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x17FB JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1759 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x174E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6ED JUMPI DUP2 SWAP1 PUSH2 0x1303 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x16BF JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x15C0 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x15B5 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1508 DUP2 PUSH2 0x2544 JUMP JUMPDEST SWAP3 PUSH2 0x1516 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2503 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1588 JUMPI POP POP POP PUSH2 0x1540 DUP5 PUSH2 0x2544 JUMP JUMPDEST SWAP3 PUSH2 0x154E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2503 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1578 JUMPI POP POP PUSH2 0x9AE SWAP4 POP PUSH2 0x2DE8 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1565 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x152D JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP9 DUP1 PUSH2 0x1323 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP3 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x16A7 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x166F JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x1375 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP9 DUP1 DUP1 PUSH2 0x1642 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x162C JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x1744 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1735 JUMPI POP PUSH2 0x130C JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1728 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x171A JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP12 DUP1 PUSH2 0x1296 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x17E3 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x17AB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x12C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x179E JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1788 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x1844 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1835 JUMPI POP PUSH2 0x127F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1828 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x181A JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP10 DUP1 PUSH2 0x10A6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x18E6 CALLDATASIZE PUSH2 0x240A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1913 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x2B73 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1950 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x19AC CALLDATASIZE PUSH2 0x2377 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19EF PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B17 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1A17 JUMPI STOP JUMPDEST PUSH2 0x1A22 DUP2 DUP4 DUP9 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1A63 DUP8 PUSH2 0x1A5C PUSH2 0xADC DUP3 DUP16 DUP16 SWAP1 PUSH2 0x2867 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1ABE PUSH1 0x64 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B0E JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1AE1 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A0E JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1AD4 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1A07 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1B58 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x1BE7 PUSH2 0x1BE2 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x24A4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1C28 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x1C48 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x1C6D PUSH2 0x4A6 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1C99 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x28C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2639 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1D31 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1D3C PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1EE6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1E01 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1E8B JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x1F63 PUSH2 0x27C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x2072 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x207A PUSH2 0x2323 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x20A4 PUSH2 0x336A JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x20E5 JUMPI JUMPDEST POP POP PUSH2 0x3140 JUMP JUMPDEST PUSH2 0x20F0 SWAP2 DUP5 DUP5 PUSH2 0x2F62 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x20DE JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x218C PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21B9 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x26FB JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2639 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1BE7 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x255C JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x22EB JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x22AC JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x23C0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x23E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x2406 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x2453 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x2406 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x24FC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6ED JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x24FC JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x25DF JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x262F JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2600 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x25F5 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x264D DUP5 PUSH2 0x25E6 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x26BB JUMPI POP PUSH1 0x1 EQ PUSH2 0x2674 JUMPI JUMPDEST POP PUSH2 0x2672 SWAP3 POP SUB DUP4 PUSH2 0x2503 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x269F JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2672 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2665 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2686 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2672 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2665 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x277C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x27E9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2639 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2861 PUSH1 0xC0 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2877 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x2B6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2963 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2951 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x295A SWAP4 PUSH2 0x2F62 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x294B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2986 PUSH2 0xADC DUP4 DUP6 DUP12 PUSH2 0x2867 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2B26 JUMPI PUSH2 0x2998 DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2A62 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2A58 JUMPI JUMPDEST PUSH2 0x29FC JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2909 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2A22 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x29F3 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x29EE JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2AFC JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2AAE JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x299F JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2AC6 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2AA6 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x2DCC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2C65 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x2C5B JUMPI JUMPDEST PUSH2 0x2BD4 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2C11 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2BCD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2BC8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2C88 PUSH2 0xADC DUP4 DUP6 DUP10 PUSH2 0x2867 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2D88 JUMPI PUSH2 0x2C9A DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2CEE JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2BB3 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2AFC JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x2D3B JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2CA1 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2D52 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2D32 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2877 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x2C1 JUMPI DUP2 ISZERO PUSH2 0x294B JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2E5C JUMPI POP POP POP POP DUP2 PUSH2 0x2E15 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2E2C JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E7B DUP3 DUP5 PUSH2 0x2DD4 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x2F38 JUMPI PUSH2 0x2E8D DUP3 DUP6 PUSH2 0x2DD4 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x2ECB JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2E01 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x2F0E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2E94 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x30FC JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x30F3 JUMPI JUMPDEST PUSH2 0x302F JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3098 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x2FE7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x2FE2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x329D JUMPI DUP3 PUSH2 0x31AA JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3251 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x322A JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3165 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3220 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3327 DUP3 PUSH2 0x32E1 JUMP JUMPDEST SWAP2 PUSH2 0x3335 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2503 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x346F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3474 JUMPI JUMPDEST PUSH2 0x346F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x33F5 JUMPI JUMPDEST POP PUSH2 0x33F2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3450 JUMPI JUMPDEST POP CODESIZE PUSH2 0x33E8 JUMP JUMPDEST PUSH2 0x3469 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC6A JUMPI PUSH2 0xC5C DUP2 DUP4 PUSH2 0x2503 JUMP JUMPDEST CODESIZE PUSH2 0x3449 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x33B1 JUMP JUMPDEST PUSH2 0x34ED PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x22A1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x357D JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3550 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x35F7 JUMPI JUMPDEST DUP2 PUSH2 0x3596 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2503 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x35F3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x35F0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3503 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3589 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B CALLDATACOPY GASPRICE EXP PUSH5 0x729EBFB478 JUMP 0xA5 SAR CODECOPY 0xAF 0xCF PUSH19 0x6F2A6E3EDE5C5B8538B3BDD3C2D2BC64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"1666:1663:283:-:0;;;;;;;;;;;;;-1:-1:-1;;1666:1663:283;;;;-1:-1:-1;;;;;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1666:1663:283;;;;;;745:39:76;;1666:1663:283;;;;;;;;745:39:76;1666:1663:283;;;;;;;;;;;;;;;;;-1:-1:-1;1666:1663:283;;;;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":8960,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":9030,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9079,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":9226,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":13083,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13138,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":9334,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":8995,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_string":{"entryPoint":8865,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":9540,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13025,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":10343,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":9785,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":9702,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":9475,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":10176,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":9979,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchMint":{"entryPoint":11752,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":11123,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":10439,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":13438,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":12130,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":9380,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgSender":{"entryPoint":13162,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":9564,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transfer":{"entryPoint":12608,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":11732,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":10406,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8212},{"length":32,"start":9403},{"length":32,"start":13185}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461221a57806306fdde03146121bf578063095ea7b31461215257806318160ddd146120f757806323b872dd146120385780632b4c9f1614611fc9578063313ce56714611f6b5780633644e51514611f2a5780633950935114611cfa5780633c130d9014611c9f5780634885b25414611bf1578063572b6c0514611ba657806370a0823114611b2157806373c8a9581461199e5780637ecebe001461191957806388d695b2146118d55780638a6d57b614610f495780638da5cb5b14610ed857806395d89b4114610e65578063a457c2d714610df8578063a9059cbb14610d8b578063b88d4fde14610c7b578063c3666c3614610a3e578063d505accf146107cb578063dd62ed3e1461071c578063e0df5b6f146104d1578063eb7955491461040c578063f2fde38b146103185763f7ba94bd1461015b57600080fd5b346102bc576101693661240a565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806101aa61336a565b92541691169081036102eb57508181036102c15760005b8181106101ca57005b6101d5818387612867565b3573ffffffffffffffffffffffffffffffffffffffff81168091036102bc576101ff828587612867565b359081471061028a57600080809381935af13d15610282573d90610222826132e1565b916102306040519384612503565b82523d6000602084013e5b1561024957506001016101c1565b80511561025857602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061023b565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5761034f612300565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061037961336a565b9073ffffffffffffffffffffffffffffffffffffffff8084541692168281036102eb575073ffffffffffffffffffffffffffffffffffffffff16918282036103bd57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610443612300565b60243560443567ffffffffffffffff81116102bc57610466903690600401612476565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9261049f838361049861336a565b8097613140565b813b6104b1575b602060405160018152f35b6104c7946104c091369161331b565b928061347e565b80808080806104a6565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc57610520903690600401612476565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061055f61336a565b92541691169081036102eb57507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff81116106ed576105a782546125e6565b601f81116106a5575b506000601f821160011461060a578192936000926105ff575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0135905083806105c9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b86811061068d5750836001959610610655575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905583808061064b565b90926020600181928686013581550194019101610638565b826000526020600020601f830160051c810191602084106106e3575b601f0160051c01905b8181106106d757506105b0565b600081556001016106ca565b90915081906106c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610753612300565b73ffffffffffffffffffffffffffffffffffffffff610770612323565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b346102bc5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610802612300565b61080a612323565b6044359060643560843560ff81168091036102bc5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d8315610a14578142116109e6576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526108ec60e082612503565b5190206108f76127c0565b9060405190868201927f19010000000000000000000000000000000000000000000000000000000000008452602283015260428201526042815261093c606282612503565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156109da5773ffffffffffffffffffffffffffffffffffffffff60005116036109b0576109ae927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6126fb565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bc57610a4c36612377565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610a9161336a565b92541691169081036102eb5750808214801590610c71575b6102c15760005b828110610ab957005b73ffffffffffffffffffffffffffffffffffffffff610ae1610adc83858a612867565b6128a6565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156109da57600091610c43575b5015610c16575073ffffffffffffffffffffffffffffffffffffffff610b70610adc83858a612867565b1690610b80610adc828689612867565b91610b8c82878b612867565b3592813b156102bc57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156109da57600192610c05575b5001610ab0565b6000610c1091612503565b88610bfe565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610c64915060203d8111610c6a575b610c5c8183612503565b810190613352565b89610b46565b503d610c52565b5082821415610aa9565b346102bc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610cb2612300565b610cba612323565b60443560643567ffffffffffffffff81116102bc57610cdd903690600401612476565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee93610d49848484610d1061336a565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff831603610d7a57613140565b823b610d5a57602060405160018152f35b610d6f95610d6991369161331b565b9361347e565b8080808080806104a6565b610d86848b8484612f62565b613140565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6610dc5612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610df261336a565b90613140565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6610e32612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee610e5f61336a565b90612f62565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612639565b6040519182916020835260208301906122a1565b0390f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346102bc5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760043567ffffffffffffffff81116102bc57610f98903690600401612476565b9060243567ffffffffffffffff81116102bc57610fb9903690600401612476565b90926044359060ff82168092036102bc5760643567ffffffffffffffff81116102bc57610fea903690600401612346565b92909360843567ffffffffffffffff81116102bc5761100d903690600401612346565b9790967fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61103961336a565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561184e575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081611880575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f53f41a97000000000000000000000000000000000000000000000000000000006000527f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a98054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491967f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81939092909181101561184e575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff82116106ed57819061127684546125e6565b601f81116117fb575b50600090601f83116001146117595760009261174e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff82116106ed5781906113037f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82546125e6565b601f81116116bf575b50600090601f83116001146115c0576000926115b5575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061150881612544565b926115166040519485612503565b818452602084019160051b8101903682116102bc57915b8183106115885750505061154084612544565b9261154e6040519485612503565b848452602084019460051b8101903682116102bc57945b8186106115785750506109ae9350612de8565b8535815260209586019501611565565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bc5781526020928301920161152d565b013590508880611323565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8282527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef929091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016815b8181106116a7575090846001959493921061166f575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8255611375565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055888080611642565b9193602060018192878701358155019501920161162c565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000529091507f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f840160051c81019160208510611744575b90601f859493920160051c01905b818110611735575061130c565b60008155849350600101611728565b909150819061171a565b013590508b80611296565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106117e357509084600195949392106117ab575b505050811b0190556112c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558b808061179e565b91936020600181928787013581550195019201611788565b909150836000526020600020601f840160051c81019160208510611844575b90601f859493920160051c01905b818110611835575061127f565b60008155849350600101611828565b909150819061181a565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a389806110a6565b346102bc576104a66118e63661240a565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61191361336a565b90612b73565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611950612300565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b346102bc576119ac36612377565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119ef61336a565b92541691169081036102eb5750808314801590611b17575b6102c15760005b838110611a1757005b611a22818388612867565b3573ffffffffffffffffffffffffffffffffffffffff8116908181036102bc5760006020918a82611a6387611a5c610adc828f8f90612867565b938b612867565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611abe606482612503565b51925af1156109da576000513d611b0e5750803b155b611ae15750600101611a0e565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611ad4565b5085831415611a07565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611b58612300565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576020611be7611be2612300565b6124a4565b6040519015158152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611c28612300565b60243567ffffffffffffffff81116102bc57611c48903690600401612346565b916044359267ffffffffffffffff84116102bc57611c6d6104a6943690600401612346565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611c9961336a565b906128c7565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612639565b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57611d31612300565b602435611d3c61336a565b9073ffffffffffffffffffffffffffffffffffffffff8316928315611ee65773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef6020526040600020846000526020526040600020549180611e01575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b8083019280841115611e8b57505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef83526040600020866000528352806040600020559250611db2565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576020611f636127c0565b604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a6612072612300565b61207a612323565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916120a461336a565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036120e5575b5050613140565b6120f0918484612f62565b85846120de565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b346102bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576104a661218c612300565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121b961336a565b906126fb565b346102bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc57610ed4610ec07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612639565b346102bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102bc576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036102bc57611be76020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d61255c565b919082519283825260005b8481106122eb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016122ac565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bc57565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc576020808501948460051b0101116102bc57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc57816123c091600401612346565b9290929160243567ffffffffffffffff81116102bc57816123e391600401612346565b929092916044359067ffffffffffffffff82116102bc5761240691600401612346565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102bc5760043567ffffffffffffffff81116102bc578161245391600401612346565b929092916024359067ffffffffffffffff82116102bc5761240691600401612346565b9181601f840112156102bc5782359167ffffffffffffffff83116102bc57602083818601950101116102bc57565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156124fc5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106ed57604052565b67ffffffffffffffff81116106ed5760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146124fc577f01ffc9a70000000000000000000000000000000000000000000000000000000081146125df5760005260205260ff6040600020541690565b5050600190565b90600182811c9216801561262f575b602083101461260057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916125f5565b906040519182600082549261264d846125e6565b80845293600181169081156126bb5750600114612674575b5061267292500383612503565b565b90506000929192526020600020906000915b81831061269f5750509060206126729282010138612665565b6020919350806001915483858901015201910190918492612686565b602093506126729592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612665565b929173ffffffffffffffffffffffffffffffffffffffff1692831561277c5773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6127e97f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612639565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261286160c082612503565b51902090565b91908110156128775760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bc5790565b959490939291928581036102c1578015612b6a5773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b818110612963575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff821603612951575b50505050565b61295a93612f62565b3880808061294b565b73ffffffffffffffffffffffffffffffffffffffff612986610adc83858b612867565b168015612b2657612998828587612867565b3580612a62575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a151580612a58575b6129fc575b50600101612909565b8a87039087821015612a2257600090815260208d905260409020908601905560016129f3565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b14156129ee565b9a8b810190811115612afc579a8c73ffffffffffffffffffffffffffffffffffffffff8b16838114612aae5750906040602093926000908482528552208181540190555b90915061299f565b90508882989211612ac6575090866020920196612aa6565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b92939490918185036102c1578415612dcc5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110612c6557505050505080151580612c5b575b612bd4575b5050505050565b8085039480861015612c1157505073ffffffffffffffffffffffffffffffffffffffff166000526020526040600020910190553880808080612bcd565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b5083811415612bc8565b73ffffffffffffffffffffffffffffffffffffffff612c88610adc838589612867565b168015612d8857612c9a828587612867565b3580612cee575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301612bb3565b9687810190811115612afc579673ffffffffffffffffffffffffffffffffffffffff8916828114612d3b57509060019291604060008381528c602052208181540190555b90919250612ca1565b8c829c9211612d525750908a60019392019a612d32565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b505050505050565b80518210156128775760209160051b010190565b9091825190805182036102c157811561294b5760009360005b838110612e5c575050505081612e15575050565b6002018054918083019280841115612e2c57505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff612e7b8284612dd4565b51168015612f3857612e8d8285612dd4565b5180612ecb575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a301612e01565b96919087830192831115612f0e5773ffffffffffffffffffffffffffffffffffffffff811660009081526020889052604090208054890190559196909190612e94565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b92909173ffffffffffffffffffffffffffffffffffffffff81169384156130fc576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841415806130f3575b61302f575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b80840393808510156130985750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592612fe7565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515612fe2565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff1692831561329d57826131aa575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff821660005280602052604060002054838103908082101561325157508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef97160361322a575b5050925050613165565b83831660005281855260406000205586600052835260406000208581540190553880613220565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff81116106ed57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613327826132e1565b916133356040519384612503565b8294818452818301116102bc578281602093846000960137010152565b908160209103126102bc575180151581036102bc5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561346f573233148015613474575b61346f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156133f5575b506133f257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156109da57600091613450575b50386133e8565b613469915060203d602011610c6a57610c5c8183612503565b38613449565b503390565b50601836106133b1565b6134ed73ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc3585900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401526080606484015260848301906122a1565b03816000865af19081156109da5760009161357d575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc35859000000000000000000000000000000000000000000000000000000009116036135505750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116135f7575b8161359660209383612503565b810103126135f35751907fffffffff00000000000000000000000000000000000000000000000000000000821682036135f057507fffffffff00000000000000000000000000000000000000000000000000000000613503565b80fd5b5080fd5b3d915061358956fea26469706673582212202b373a0a64729ebfb47856a51d39afcf726f2a6e3ede5c5b8538b3bdd3c2d2bc64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x221A JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x21BF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2152 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x20F7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2038 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x1FC9 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1F6B JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x1F2A JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1CFA JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x1C9F JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x1BF1 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1BA6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B21 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x199E JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1919 JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x18D5 JUMPI DUP1 PUSH4 0x8A6D57B6 EQ PUSH2 0xF49 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xED8 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xE65 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0xDF8 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xD8B JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xC7B JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xA3E JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x7CB JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x71C JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0x4D1 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0x40C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x318 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x169 CALLDATASIZE PUSH2 0x240A JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1AA PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP2 DUP2 SUB PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1CA JUMPI STOP JUMPDEST PUSH2 0x1D5 DUP2 DUP4 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1FF DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x28A JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x282 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x222 DUP3 PUSH2 0x32E1 JUMP JUMPDEST SWAP2 PUSH2 0x230 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2503 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x249 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1C1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x258 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x23B JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x34F PUSH2 0x2300 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x379 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x3BD JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x443 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x466 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0x49F DUP4 DUP4 PUSH2 0x498 PUSH2 0x336A JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3140 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0x4B1 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x4C7 SWAP5 PUSH2 0x4C0 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x331B JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x347E JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x520 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x55F PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH2 0x5A7 DUP3 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x6A5 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x60A JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x5FF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0x5C9 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x68D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x655 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0x64B JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x638 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x6E3 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6D7 JUMPI POP PUSH2 0x5B0 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x6CA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x6C1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x753 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x770 PUSH2 0x2323 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x802 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x80A PUSH2 0x2323 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x2BC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0xA14 JUMPI DUP2 TIMESTAMP GT PUSH2 0x9E6 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x8EC PUSH1 0xE0 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x8F7 PUSH2 0x27C0 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x93C PUSH1 0x62 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x9DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x9B0 JUMPI PUSH2 0x9AE SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x26FB JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0xA4C CALLDATASIZE PUSH2 0x2377 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xA91 PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xC71 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xAB9 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xAE1 PUSH2 0xADC DUP4 DUP6 DUP11 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x28A6 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC43 JUMPI JUMPDEST POP ISZERO PUSH2 0xC16 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xB70 PUSH2 0xADC DUP4 DUP6 DUP11 PUSH2 0x2867 JUMP JUMPDEST AND SWAP1 PUSH2 0xB80 PUSH2 0xADC DUP3 DUP7 DUP10 PUSH2 0x2867 JUMP JUMPDEST SWAP2 PUSH2 0xB8C DUP3 DUP8 DUP12 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x2BC JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x1 SWAP3 PUSH2 0xC05 JUMPI JUMPDEST POP ADD PUSH2 0xAB0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC10 SWAP2 PUSH2 0x2503 JUMP JUMPDEST DUP9 PUSH2 0xBFE JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xC64 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xC6A JUMPI JUMPDEST PUSH2 0xC5C DUP2 DUP4 PUSH2 0x2503 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3352 JUMP JUMPDEST DUP10 PUSH2 0xB46 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC52 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xAA9 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xCB2 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0xCBA PUSH2 0x2323 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xCDD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0xD49 DUP5 DUP5 DUP5 PUSH2 0xD10 PUSH2 0x336A JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0xD7A JUMPI PUSH2 0x3140 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xD5A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xD6F SWAP6 PUSH2 0xD69 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x331B JUMP JUMPDEST SWAP4 PUSH2 0x347E JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0xD86 DUP5 DUP12 DUP5 DUP5 PUSH2 0x2F62 JUMP JUMPDEST PUSH2 0x3140 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0xDC5 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xDF2 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x3140 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0xE32 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0xE5F PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x2F62 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2639 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x22A1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0xA0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xF98 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xFB9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2476 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0xFF DUP3 AND DUP1 SWAP3 SUB PUSH2 0x2BC JUMPI PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0xFEA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x84 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x100D SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP8 SWAP1 SWAP7 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x1039 PUSH2 0x336A JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x184E JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x1880 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x53F41A9700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP7 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0x184E JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6ED JUMPI DUP2 SWAP1 PUSH2 0x1276 DUP5 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x17FB JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1759 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x174E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x6ED JUMPI DUP2 SWAP1 PUSH2 0x1303 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x25E6 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x16BF JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x15C0 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x15B5 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x1508 DUP2 PUSH2 0x2544 JUMP JUMPDEST SWAP3 PUSH2 0x1516 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2503 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1588 JUMPI POP POP POP PUSH2 0x1540 DUP5 PUSH2 0x2544 JUMP JUMPDEST SWAP3 PUSH2 0x154E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2503 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x2BC JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x1578 JUMPI POP POP PUSH2 0x9AE SWAP4 POP PUSH2 0x2DE8 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x1565 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x152D JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP9 DUP1 PUSH2 0x1323 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP3 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x16A7 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x166F JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x1375 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP9 DUP1 DUP1 PUSH2 0x1642 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x162C JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x1744 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1735 JUMPI POP PUSH2 0x130C JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1728 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x171A JUMP JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP12 DUP1 PUSH2 0x1296 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x17E3 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x17AB JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x12C8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x179E JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1788 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x1844 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x1835 JUMPI POP PUSH2 0x127F JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x1828 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x181A JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP10 DUP1 PUSH2 0x10A6 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x18E6 CALLDATASIZE PUSH2 0x240A JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1913 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x2B73 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1950 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH2 0x19AC CALLDATASIZE PUSH2 0x2377 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19EF PUSH2 0x336A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2EB JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B17 JUMPI JUMPDEST PUSH2 0x2C1 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1A17 JUMPI STOP JUMPDEST PUSH2 0x1A22 DUP2 DUP4 DUP9 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1A63 DUP8 PUSH2 0x1A5C PUSH2 0xADC DUP3 DUP16 DUP16 SWAP1 PUSH2 0x2867 JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1ABE PUSH1 0x64 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B0E JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1AE1 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A0E JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1AD4 JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1A07 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1B58 PUSH2 0x2300 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x1BE7 PUSH2 0x1BE2 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x24A4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1C28 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI PUSH2 0x1C48 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x2BC JUMPI PUSH2 0x1C6D PUSH2 0x4A6 SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1C99 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x28C7 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2639 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x1D31 PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x1D3C PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x1EE6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x1E01 JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x1E8B JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x1DB2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH2 0x1F63 PUSH2 0x27C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x2072 PUSH2 0x2300 JUMP JUMPDEST PUSH2 0x207A PUSH2 0x2323 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x20A4 PUSH2 0x336A JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x20E5 JUMPI JUMPDEST POP POP PUSH2 0x3140 JUMP JUMPDEST PUSH2 0x20F0 SWAP2 DUP5 DUP5 PUSH2 0x2F62 JUMP JUMPDEST DUP6 DUP5 PUSH2 0x20DE JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0x4A6 PUSH2 0x218C PUSH2 0x2300 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21B9 PUSH2 0x336A JUMP JUMPDEST SWAP1 PUSH2 0x26FB JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH2 0xED4 PUSH2 0xEC0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2639 JUMP JUMPDEST CALLVALUE PUSH2 0x2BC JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI PUSH2 0x1BE7 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x255C JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x22EB JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x22AC JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x2BC JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x23C0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x23E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x2406 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x2BC JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BC JUMPI DUP2 PUSH2 0x2453 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2BC JUMPI PUSH2 0x2406 SWAP2 PUSH1 0x4 ADD PUSH2 0x2346 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x2BC JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x2BC JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x2BC JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x24FC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6ED JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x24FC JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x25DF JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x262F JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2600 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x25F5 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x264D DUP5 PUSH2 0x25E6 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x26BB JUMPI POP PUSH1 0x1 EQ PUSH2 0x2674 JUMPI JUMPDEST POP PUSH2 0x2672 SWAP3 POP SUB DUP4 PUSH2 0x2503 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x269F JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2672 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2665 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2686 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2672 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2665 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x277C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x27E9 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2639 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x2861 PUSH1 0xC0 DUP3 PUSH2 0x2503 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x2877 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x2C1 JUMPI DUP1 ISZERO PUSH2 0x2B6A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2963 JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2951 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x295A SWAP4 PUSH2 0x2F62 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x294B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2986 PUSH2 0xADC DUP4 DUP6 DUP12 PUSH2 0x2867 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2B26 JUMPI PUSH2 0x2998 DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2A62 JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x2A58 JUMPI JUMPDEST PUSH2 0x29FC JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2909 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x2A22 JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x29F3 JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x29EE JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2AFC JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x2AAE JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x299F JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x2AC6 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x2AA6 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x2C1 JUMPI DUP5 ISZERO PUSH2 0x2DCC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x2C65 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x2C5B JUMPI JUMPDEST PUSH2 0x2BD4 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x2C11 JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x2BCD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x2BC8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2C88 PUSH2 0xADC DUP4 DUP6 DUP10 PUSH2 0x2867 JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x2D88 JUMPI PUSH2 0x2C9A DUP3 DUP6 DUP8 PUSH2 0x2867 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x2CEE JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x2BB3 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x2AFC JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x2D3B JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x2CA1 JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x2D52 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x2D32 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x2877 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x2C1 JUMPI DUP2 ISZERO PUSH2 0x294B JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2E5C JUMPI POP POP POP POP DUP2 PUSH2 0x2E15 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2E2C JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2E7B DUP3 DUP5 PUSH2 0x2DD4 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x2F38 JUMPI PUSH2 0x2E8D DUP3 DUP6 PUSH2 0x2DD4 JUMP JUMPDEST MLOAD DUP1 PUSH2 0x2ECB JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x2E01 JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x2F0E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x2E94 JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x30FC JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x30F3 JUMPI JUMPDEST PUSH2 0x302F JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3098 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x2FE7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x2FE2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x329D JUMPI DUP3 PUSH2 0x31AA JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3251 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x322A JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3165 JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3220 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6ED JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3327 DUP3 PUSH2 0x32E1 JUMP JUMPDEST SWAP2 PUSH2 0x3335 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2503 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x2BC JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x2BC JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x2BC JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x346F JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3474 JUMPI JUMPDEST PUSH2 0x346F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x33F5 JUMPI JUMPDEST POP PUSH2 0x33F2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3450 JUMPI JUMPDEST POP CODESIZE PUSH2 0x33E8 JUMP JUMPDEST PUSH2 0x3469 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC6A JUMPI PUSH2 0xC5C DUP2 DUP4 PUSH2 0x2503 JUMP JUMPDEST CODESIZE PUSH2 0x3449 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x33B1 JUMP JUMPDEST PUSH2 0x34ED PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x22A1 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x9DA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x357D JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x3550 JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x35F7 JUMPI JUMPDEST DUP2 PUSH2 0x3596 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2503 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x35F3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x35F0 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3503 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3589 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B CALLDATACOPY GASPRICE EXP PUSH5 0x729EBFB478 JUMP 0xA5 SAR CODECOPY 0xAF 0xCF PUSH19 0x6F2A6E3EDE5C5B8538B3BDD3C2D2BC64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"1666:1663:283:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1666:1663:283;;3046:41;;;:::i;:::-;1666:1663;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1666:1663:283;1845:10:192;;;;;;1666:1663:283;1857:3:192;1876:11;;;;;:::i;:::-;1666:1663:283;;;;;;;;;1898:10:192;;;;;:::i;:::-;1666:1663:283;1375:21:9;;;:30;1371:125;;1666:1663:283;1548:33:9;;;;;;;1666:1663:283;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1666:1663:283;;1834:9:192;;1591:58:9;1666:1663:283;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1666:1663:283;5957:19:9;1666:1663:283;;5957:19:9;1666:1663:283;;;;;1371:125:9;1455:21;;1428:57;1666:1663:283;1428:57:9;1666:1663:283;;;;;;1428:57:9;1666:1663:283;;;;1756:63:192;1793:26;1666:1663:283;1793:26:192;1666:1663:283;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1666:1663:283;;-1:-1:-1;4538:25:42;1666:1663:283;;;;;;;;;;;;;:::i;:::-;;3046:41;;;:::i;:::-;1666:1663;;;;;;;;3205:23:42;;;3201:60;;1666:1663:283;;;3275:25:42;;;;3271:146;;1666:1663:283;3271:146:42;1666:1663:283;;;;;;;;3361:45:42;1666:1663:283;3361:45:42;;1666:1663:283;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1666:1663:283;3046:41;17093:5:280;3046:41:283;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;1666:1663:283;;;;;;;;17109:96:280;17145:49;1666:1663:283;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3046:41;;;:::i;:::-;1666:1663;;;;;4503:26:42;;;4499:64;;1283:19:278;1666:1663:283;791:79:277;1666:1663:283;791:79:277;;;;;;;;:::i;:::-;;;;;;1666:1663:283;791:79:277;1666:1663:283;791:79:277;;;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;;;1666:1663:283;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;;;;1666:1663:283;;;;;;;791:79:277;;;;;;;;;;;;;;;;;-1:-1:-1;;;791:79:277;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;1666:1663:283;;;;;;791:79:277;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;-1:-1:-1;791:79:277;;;;;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;1666:1663:283;-1:-1:-1;1666:1663:283;27576:12:280;1666:1663:283;;;;-1:-1:-1;1666:1663:283;27576:28:280;1666:1663:283;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;1666:1663:283;2653:23:279;1666:1663:283;2653:23:279;1666:1663:283;2653:23:279;1666:1663:283;;;;;;;;;;;;;;;;;;;2602:87:279;;;;1666:1663:283;1021:95:279;1666:1663:283;;1021:95:279;1666:1663:283;1021:95:279;;1666:1663:283;;;;;1021:95:279;;1666:1663:283;1021:95:279;;;;1666:1663:283;;1021:95:279;;1666:1663:283;;1021:95:279;;1666:1663:283;;2602:87:279;;;1666:1663:283;2602:87:279;;:::i;:::-;1666:1663:283;2592:98:279;;2758:18;;:::i;:::-;1666:1663:283;;;2729:60:279;;;;1021:95;;;;;;;1666:1663:283;1021:95:279;;;1666:1663:283;1021:95:279;2729:60;;;;;;:::i;:::-;1666:1663:283;2719:71:279;;1666:1663:283;;;;;;1021:95:279;;;1666:1663:283;;;;1021:95:279;;1666:1663:283;;;;1021:95:279;;1666:1663:283;2821:24:279;;;1666:1663:283;2821:24:279;;;;;1666:1663:283;;2821:24:279;1666:1663:283;2863:15:279;2859:57;;2982:5;27705:19:280;1666:1663:283;2982:5:279;:::i;:::-;1666:1663:283;2859:57:279;2887:29;1666:1663:283;2887:29:279;1666:1663:283;;2887:29:279;2821:24;1666:1663:283;;;;;;;;;2470:67:279;2509:28;;1666:1663:283;2509:28:279;1666:1663:283;;;;2509:28:279;2400:60;2432:28;1666:1663:283;2432:28:279;1666:1663:283;;2432:28:279;1666:1663:283;;;;;;;:::i;:::-;5148:19:42;;;;;;1666:1663:283;;;3046:41;;:::i;:::-;1666:1663;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1666:1663:283;3852:94:192;;1666:1663:283;3972:10:192;;;;;;1666:1663:283;3984:3:192;1666:1663:283;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1666:1663:283;;;;4058:76:192;;4108:25;1666:1663:283;4058:76:192;;1666:1663:283;4058:76:192;;;;;;;;;;;;1666:1663:283;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1666:1663:283;4239:12:192;;;;;;:::i;:::-;1666:1663:283;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1666:1663:283;4239:70:192;;;;;;;1666:1663:283;;;;;;;4239:70:192;;;;;1666:1663:283;4239:70:192;;4277:4;1666:1663:283;4239:70:192;;1666:1663:283;;4058:76:192;1666:1663:283;;;;;;;4239:70:192;;;;;;;1666:1663:283;4239:70:192;;;3984:3;;1666:1663:283;3961:9:192;;4239:70;1666:1663:283;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1666:1663:283;4161:50:192;1666:1663:283;;4058:76:192;1666:1663:283;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1666:1663:283;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1666:1663:283;3046:41;9818:5:280;3046:41:283;;;;;:::i;:::-;1666:1663;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;1666:1663:283;;;;;;;18723:98:280;18759:51;1666:1663:283;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;1666:1663:283:-;;;;;;;;;;;1036:5:242;1666:1663:283;;:::i;:::-;;;;;3046:41;;:::i;:::-;1036:5:242;;:::i;1666:1663:283:-;;;;;;;;;;;1788:15:242;1666:1663:283;;:::i;:::-;;;;;3046:41;;:::i;:::-;1788:15:242;;:::i;1666:1663:283:-;;;;;;;;;;;;;3091:13:277;1666:1663:283;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;1666:1663:283;3046:41;;:::i;:::-;1666:1663;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1666:1663:283;;;;;;1645:152:42;;1666:1663:283;-1:-1:-1;;1666:1663:283;;500:10:59;;;;1666:1663:283;;1124:1:42;791:79:277;;;;;;1666:1663:283;;;500:10:59;1666:1663:283;;791:79:277;;;;1666:1663:283;;500:10:59;1666:1663:283;;791:79:277;;;;1666:1663:283;;500:10:59;1666:1663:283;;791:79:277;;;;1666:1663:283;;3431:37:280;-1:-1:-1;500:10:59;;1666:1663:283;;791:79:277;;;;;1666:1663:283;;;;;;;;;;;;900:21:181;;;896:88;;1666:1663:283;1124:1:42;1666:1663:283;;;791:79:277;;;;;;;;;;:::i;:::-;;;;;;1666:1663:283;791:79:277;1666:1663:283;791:79:277;;;;;;;;1666:1663:283;791:79:277;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;1666:1663:283;791:79:277;;;;;;;2461:13;791:79;;:::i;:::-;;;;;;;;1666:1663:283;791:79:277;;;;;;;;1666:1663:283;791:79:277;;;;;;;;1124:1:42;791:79:277;;;;;;;;2461:13;791:79;;;2498:15;791:79;;;2498:15;791:79;2596:32;1666:1663:283;500:10:59;;1666:1663:283;500:10:59;1666:1663:283;;500:10:59;1124:1:42;791:79:277;1666:1663:283;;791:79:277;;1666:1663:283;;768:32:278;1666:1663:283;500:10:59;;1666:1663:283;500:10:59;1666:1663:283;;500:10:59;1124:1:42;791:79:277;1666:1663:283;;791:79:277;;1666:1663:283;;1298:30:279;1666:1663:283;500:10:59;1666:1663:283;500:10:59;1666:1663:283;;500:10:59;1124:1:42;791:79:277;1666:1663:283;;791:79:277;;1666:1663:283;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2804:53;;;;;;:::i;1666:1663::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:79:277;;;;-1:-1:-1;791:79:277;;;;;2461:13;1666:1663:283;;;;791:79:277;;;;;;;;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;;;;2461:13;791:79;;;;;;;;;;;;;;;;;;;;;;;;;;1666:1663:283;1124:1:42;791:79:277;;;;;;;;;;;;;;;;2461:13;1666:1663:283;;;;-1:-1:-1;1666:1663:283;791:79:277;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;1666:1663:283;791:79:277;;;;-1:-1:-1;1124:1:42;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;;;;;-1:-1:-1;791:79:277;;;;;;;;;1666:1663:283;;;;;;;791:79:277;;;;;;;;;;;1124:1:42;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1666:1663:283;1124:1:42;791:79:277;;;;;;;;;;;;;;;;1666:1663:283;;;;;;;;;791:79:277;;;;;;;;1666:1663:283;791:79:277;;;;;;;;;;;;;;;;;;;;;;;;;;1666:1663:283;791:79:277;;;;-1:-1:-1;1124:1:42;791:79:277;;;;;;-1:-1:-1;791:79:277;;;;896:88:181;930:54;1666:1663:283;930:54:181;1666:1663:283;;1124:1:42;1666:1663:283;;;;930:54:181;1645:152:42;1666:1663:283;;;;;;;;;1740:46:42;;;;1645:152;;;;1666:1663:283;;;;875:6:243;1666:1663:283;;;:::i;:::-;27705:19:280;;;;1666:1663:283;3046:41;;:::i;:::-;875:6:243;;:::i;1666:1663:283:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1666:1663:283;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;1666:1663:283;;3046:41;;;:::i;:::-;1666:1663;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1666:1663:283;2776:90:192;;1666:1663:283;2892:10:192;;;;;;1666:1663:283;2904:3:192;2923:9;;;;;:::i;:::-;1666:1663:283;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;1666:1663:283;;;1328:43:8;1666:1663:283;1328:43:8;;;;1666:1663:283;1328:43:8;;1666:1663:283;1328:43:8;;;1666:1663:283;1328:43:8;1666:1663:283;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;1666:1663:283;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1666:1663:283;;2881:9:192;;8938:146:8;9033:40;1666:1663:283;9033:40:8;1666:1663:283;;1328:43:8;1666:1663:283;9033:40:8;8942:68;1666:1663:283;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1666:1663:283;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1666:1663:283;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;1666:1663:283;;;;;;:::i;:::-;27705:19:280;;;1666:1663:283;3046:41;;:::i;:::-;1170:6:243;;:::i;1666:1663:283:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;3046:41;;:::i;:::-;1666:1663;;;;5455:21:280;;;5451:67;;1666:1663:283;;;-1:-1:-1;1666:1663:283;5555:12:280;1666:1663:283;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;-1:-1:-1;1666:1663:283;;5597:10:280;;5593:366;;1666:1663:283;;;5973:42:280;1666:1663:283;;;;;;;;;5973:42:280;;1666:1663:283;;;;;;;5593:366:280;1666:1663:283;;;5720:32:280;;;;;5716:108;;5842:19;;;1666:1663:283;;5973:42:280;5842:19;1666:1663:283;;;-1:-1:-1;1666:1663:283;5555:12:280;1666:1663:283;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;5593:366:280;;;;5716:108;1666:1663:283;;5761:63:280;;;1666:1663:283;;;;;5761:63:280;;1666:1663:283;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;1666:1663:283;5485:33:280;;1666:1663:283;5485:33:280;1666:1663:283;;;;;5485:33:280;1666:1663:283;;;;;;;;;;;;1284:37:248;;:::i;:::-;1666:1663:283;;;;;;;;;;;;;;;;;;;3732:15:277;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;;941:19:75;1666:1663:283;;;;;;;;;;;;;;;9818:5:280;1666:1663:283;;:::i;:::-;;;:::i;:::-;;3046:41;;;:::i;:::-;1666:1663;;;;;;;;;;;9707:14:280;9703:85;;1666:1663:283;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;1666:1663:283;;;;;;;;;;;;26654:8:280;1666:1663:283;;;;;;;;;;;;;;;;;;826:5:242;1666:1663:283;;:::i;:::-;;;;;3046:41;;:::i;:::-;826:5:242;;:::i;1666:1663:283:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1666:1663:283;1793:19:59;1666:1663:283;635:65:55;:::i;1666:1663:283:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1666:1663:283;1146:19:75;1666:1663:283;1146:53:75;;;1142:96;;1666:1663:283;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1666:1663:283;1215:12:75;:::o;1666:1663:283:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;;1666:1663:283;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1666:1663:283;500:10:59;;;1666:1663:283;500:10:59;1666:1663:283;500:10:59;;1666:1663:283;1359:340:59;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1666:1663:283:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1666:1663:283;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;1666:1663:283;;4533:21:280;;;4529:67;;1666:1663:283;4657:31:280;4606:19;:12;1666:1663:283;4606:19:280;1666:1663:283;;;-1:-1:-1;1666:1663:283;4606:12:280;1666:1663:283;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;1666:1663:283;4563:33:280;;4552:1;4563:33;1666:1663:283;4563:33:280;1666:1663:283;;4552:1:280;4563:33;4317:545:279;1666:1663:283;;;:::i;:::-;;;;;;4669:54:279;1666:1663:283;;;4520:321:279;;1666:1663:283;4552:95:279;1666:1663:283;;;;;;4745:14:279;1666:1663:283;;;;4412:53:279;1666:1663:283;;;;4818:4:279;1666:1663:283;;;;;4520:321:279;;;;;;:::i;:::-;1666:1663:283;4493:362:279;;4317:545;:::o;1666:1663:283:-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;13849:1950:280:-;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;1666:1663:283;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;1666:1663:283;14325:13:280;;;;;;:::i;:::-;1666:1663:283;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;1666:1663:283;14472:10:280;14468:656;;14293:3;1666:1663:283;;;15143:25:280;1666:1663:283;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;1666:1663:283;;14270:9:280;;15183:500;1666:1663:283;;;15437:21:280;;;;;15433:85;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;1666:1663:283;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;1666:1663:283;;;;14602:27:280;;;;14598:74;;1666:1663:283;;;;;14746:10:280;;;;;14784:14;;1666:1663:283;;14784:14:280;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;1666:1663:283;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;1666:1663:283;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;1666:1663:283;14381:32:280;;14132:1;14381:32;1666:1663:283;14381:32:280;1666:1663:283;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;10853:1796::-;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;1666:1663:283;;;12409:21:280;;;;;12405:85;;12508:16;;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;-1:-1:-1;1666:1663:283;;;;;12171:472:280;;;;;;;12405:85;1666:1663:283;12439:51:280;;11116:1;12439:51;1666:1663:283;12439:51:280;1666:1663:283;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;1666:1663:283;11309:13:280;;;;;;:::i;:::-;1666:1663:283;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;1666:1663:283;11455:10:280;11451:656;;11277:3;1666:1663:283;;;;;;;;;12125:25:280;1666:1663:283;;;;12125:25:280;;1666:1663:283;11254:9:280;;11451:656;1666:1663:283;;;;11585:27:280;;;;11581:74;;1666:1663:283;;;;11729:10:280;;;;;11767:14;;1666:1663:283;11767:14:280;;1666:1663:283;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;1666:1663:283;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;1666:1663:283;;;;;;11116:1:280;11873:46;11336:61;1666:1663:283;11365:32:280;;11116:1;11365:32;1666:1663:283;11365:32:280;1666:1663:283;;11116:1:280;11365:32;11102:24;11119:7;;;;;;:::o;1666:1663:283:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;1666:1663:283;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;1666:1663:283;;;;;;21949:19:280;;;;;21945:76;;1666:1663:283;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;1666:1663:283;;;;-1:-1:-1;21977:44:280;21174:3;1666:1663:283;21206:13:280;;;;:::i;:::-;1666:1663:283;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;1666:1663:283;21344:10:280;21340:372;;21174:3;1666:1663:283;-1:-1:-1;21730:31:280;1666:1663:283;;;;;;;;;21730:31:280;1666:1663:283;21151:9:280;;21340:372;1666:1663:283;;;;;;21474:27:280;;;;21470:70;;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;1666:1663:283;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;21233:53;21262:24;-1:-1:-1;21262:24:280;;-1:-1:-1;21262:24:280;6693:851;;;;1666:1663:283;;;6808:21:280;;;6804:67;;6908:12;;:19;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;-1:-1:-1;1666:1663:283;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;1666:1663:283;;;;;;7495:42:280;1666:1663:283;;;;;;;7495:42:280;;6693:851::o;6947:534::-;1666:1663:283;;;7238:32:280;;;;;7234:112;;7364:19;;;1666:1663:283;7495:42:280;7364:19;1666:1663:283;7364:19:280;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;-1:-1:-1;1666:1663:283;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;6947:534:280;;;7234:112;1666:1663:283;;7279:67:280;;;1666:1663:283;;;;7279:67:280;;;1666:1663:283;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;1666:1663:283;6838:33:280;;6827:1;6838:33;1666:1663:283;6838:33:280;1666:1663:283;;6827:1:280;6838:33;8105:628;;;1666:1663:283;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;1666:1663:283;;;8701:25:280;1666:1663:283;;;;;;;8701:25:280;;8105:628::o;8273:413::-;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;;;8437:21:280;;;;;8433:80;;1666:1663:283;;;;;;;;8701:25:280;1666:1663:283;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;;-1:-1:-1;1666:1663:283;;;-1:-1:-1;1666:1663:283;;;;-1:-1:-1;1666:1663:283;;;;;;;8531:131:280;;;;8433:80;8467:46;;1666:1663:283;8467:46:280;;8219:1;8467:46;1666:1663:283;8467:46:280;1666:1663:283;;;;;;8219:1:280;8467:46;8201:61;1666:1663:283;8230:32:280;;8219:1;8230:32;1666:1663:283;8230:32:280;1666:1663:283;;8219:1:280;8230:32;1666:1663:283;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1666:1663:283;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1666:1663:283;1029:19:76;1666:1663:283;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1666:1663:283;;;;;;1676:74:76;;;;1666:1663:283;1676:74:76;;;;;;1666:1663:283;1327:10:76;1666:1663:283;;;;1744:4:76;1666:1663:283;;;;1676:74:76;;;;;;;1666:1663:283;1676:74:76;;;1630:120;;;;;1676:74;;;;1666:1663:283;1676:74:76;1666:1663:283;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;1666:1663:283;;28229:252:280;;;;1666:1663:283;28229:252:280;1666:1663:283;;;;;28357:61:280;;;;;1666:1663:283;28357:61:280;;1666:1663:283;28357:61:280;;;1666:1663:283;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;1666:1663:283;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;1666:1663:283;;-1:-1:-1;28445:29:280;28357:61;1666:1663:283;28357:61:280;;1666:1663:283;28357:61:280;;;;;;1666:1663:283;28357:61:280;;;:::i;:::-;;;1666:1663:283;;;;;;;;;;;;;28357:61:280;1666:1663:283;28357:61:280;;1666:1663:283;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"2775400","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","allowance(address,address)":"3035","approve(address,uint256)":"infinite","balanceOf(address)":"2641","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","decimals()":"2385","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","increaseAllowance(address,uint256)":"infinite","init(string,string,uint8,address[],uint256[])":"infinite","isTrustedForwarder(address)":"infinite","name()":"infinite","nonces(address)":"2685","owner()":"2627","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","increaseAllowance(address,uint256)":"39509351","init(string,string,uint8,address[],uint256[])":"8a6d57b6","isTrustedForwarder(address)":"572b6c05","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address[]\",\"name\":\"holders\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"allocations\",\"type\":\"uint256[]\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, fixed supply preset contract (proxied version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol\":\"ERC20FixedSupplyProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/proxied/ERC20FixedSupplyProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../../base/ERC20Base.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../../base/ERC20DetailedBase.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../../base/ERC20MetadataBase.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../../base/ERC20PermitBase.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../../base/ERC20SafeTransfersBase.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../../base/ERC20BatchTransfersBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, fixed supply preset contract (proxied version).\\ncontract ERC20FixedSupplyProxied is\\n    ERC20Base,\\n    ERC20DetailedBase,\\n    ERC20MetadataBase,\\n    ERC20PermitBase,\\n    ERC20SafeTransfersBase,\\n    ERC20BatchTransfersBase,\\n    InterfaceDetection,\\n    TokenRecoveryBase,\\n    ContractOwnershipBase,\\n    ForwarderRegistryContext\\n{\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        uint8 tokenDecimals,\\n        address[] calldata holders,\\n        uint256[] calldata allocations\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC20Storage.init();\\n        ERC20Storage.initERC20BatchTransfers();\\n        ERC20Storage.initERC20SafeTransfers();\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n        ERC20MetadataStorage.init();\\n        ERC20PermitStorage.init();\\n        ERC20Storage.layout().batchMint(holders, allocations);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x4d43b879fec24c9f3d60ad50ec6b9a5c5cbf9d8c22e1c56cc2c3aaac47877268\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol":{"ERC20MintBurnProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"ERC20AllowanceOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20ApprovalToAddressZero","type":"error"},{"inputs":[],"name":"ERC20BatchMintValuesOverflow","type":"error"},{"inputs":[],"name":"ERC20BatchTransferValuesOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC20MintToAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC20PermitExpired","type":"error"},{"inputs":[],"name":"ERC20PermitFromAddressZero","type":"error"},{"inputs":[],"name":"ERC20PermitInvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"ERC20SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TotalSupplyOverflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC20TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","increment":"The allowance increase.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20ApprovalToAddressZero(address)":[{"params":{"owner":"The owner of the tokens."}}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"params":{"allowance":"The current allowance.","decrement":"The allowance decrease.","owner":"The owner of the tokens.","spender":"The spender of the tokens."}}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"params":{"balance":"The current balance.","owner":"The owner of the tokens.","value":"The amount of tokens being transferred."}}],"ERC20PermitExpired(uint256)":[{"params":{"deadline":"The permit deadline."}}],"ERC20SafeTransferRejected(address)":[{"params":{"recipient":"The recipient contract."}}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"params":{"supply":"The current supply.","value":"The amount of tokens being minted."}}],"ERC20TransferToAddressZero(address)":[{"params":{"owner":"The account from which the tokens are transferred."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"owner":"The account granting an allowance to `spender`.","spender":"The account being granted an allowance from `owner`.","value":"The allowance amount being granted."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The account where the transferred tokens are withdrawn from.","to":"The account where the transferred tokens are deposited to.","value":"The amount of tokens being transferred."}}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.","returns":{"_0":"The EIP-712 encoded hash struct of the domain-specific information for permits."}},"allowance(address,address)":{"params":{"owner":"The account that has granted an allowance to `spender`.","spender":"The account that was granted an allowance by `owner`."},"returns":{"value":"The amount which `spender` is allowed to spend on behalf of `owner`."}},"approve(address,uint256)":{"details":"Reverts if `spender` is the zero address.Emits an {Approval} event.","params":{"spender":"The account being granted the allowance by the message caller.","value":"The allowance amount to grant."},"returns":{"result":"Whether the operation succeeded."}},"balanceOf(address)":{"params":{"owner":"The account whose balance will be returned."},"returns":{"balance":"The account balance."}},"batchBurnFrom(address[],uint256[])":{"details":"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).","params":{"owners":"The list of accounts to burn the tokens from.","values":"The list of amounts of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"batchMint(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"The list of accounts to mint the tokens to.","values":"The list of amounts of tokens to mint to each of `recipients`."}},"batchTransfer(address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.","params":{"recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"batchTransferFrom(address,address[],uint256[])":{"details":"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to be transferred.","recipients":"The list of accounts to transfer the tokens to.","values":"The list of amounts of tokens to transfer to each of `recipients`."},"returns":{"_0":"Whether the operation succeeded."}},"burn(uint256)":{"details":"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.","params":{"value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"burnFrom(address,uint256)":{"details":"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account to burn the tokens from.","value":"The amount of tokens to burn."},"returns":{"_0":"Whether the operation succeeded."}},"decimals()":{"details":"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.","returns":{"_0":"The number of decimals used to display the balances."}},"decreaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being decreased.","value":"The allowance amount decrease."},"returns":{"result":"Whether the operation succeeded."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"increaseAllowance(address,uint256)":{"details":"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.","params":{"spender":"The account whose allowance is being increased.","value":"The allowance amount increase."},"returns":{"result":"Whether the operation succeeded."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"The account to mint the tokens to.","value":"The amount of tokens to mint."}},"name()":{"returns":{"_0":"The name of the token."}},"nonces(address)":{"params":{"owner":"The account to check the nonce of."},"returns":{"_0":"The current permit nonce of `owner`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.","params":{"deadline":"The deadline from which the permit signature is no longer valid.","owner":"The token owner granting the allowance to `spender`.","r":"Permit signature r parameter.","s":"Permit signature s parameter.","spender":"The token spender being granted the allowance by `owner`.","v":"Permit signature v parameter","value":"The allowance amount to grant."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeTransfer(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).","params":{"data":"Optional additional data with no specified format, to be passed to the receiver contract.","from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"_0":"Whether the operation succeeded."}},"setTokenURI(string)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"uri":"The token URI."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"tokenURI()":{"returns":{"_0":"The token metadata URI."}},"totalSupply()":{"returns":{"supply":"The total token supply."}},"transfer(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.","params":{"to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferFrom(address,address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).","params":{"from":"The account which owns the tokens to transfer.","to":"The account to transfer the tokens to.","value":"The amount of tokens to transfer."},"returns":{"result":"Whether the operation succeeded."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f6142c138819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b03811681036074576080526040516142319081610090823960805181818161291d01528181612e080152613f7d0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612b6757806306fdde0314612b0c578063095ea7b314612a9f57806318160ddd14612a445780631b9a752914612a0057806323b872dd146129415780632b4c9f16146128d25780632f2ff15d14612746578063313ce567146126e85780633644e515146126a757806339509351146124775780633c130d901461241c57806340c10f191461225957806342966c68146121f55780634885b25414612147578063572b6c05146120fc5780636857310714611fe157806370a0823114611f5c57806373c8a95814611dd957806379cc679014611d245780637ecebe0014611c9f57806388d695b214611c5b5780638bb9c5bf14611aec5780638da5cb5b14611a7b57806391d14854146119e357806395d89b4114611970578063a457c2d714611903578063a9059cbb14611896578063b88d4fde14611786578063c3666c3614611549578063d505accf146112d6578063d53913931461127d578063d547741f146110f4578063dd62ed3e14611045578063e0df5b6f14610e29578063eb79554914610d64578063f2fde38b14610c70578063f57b0182146103865763f7ba94bd146101c957600080fd5b3461032a576101d736612cc4565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613f66565b9254169116908103610359575081810361032f5760005b81811061023857005b61024381838761310d565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d82858761310d565b35908147106102f857600080809381935af13d156102f0573d9061029082613edd565b9161029e6040519384612e50565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a576103d5903690600401612dc3565b60243567ffffffffffffffff811161032a576103f5903690600401612dc3565b6000939193506044359160ff831680930361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc610433613f66565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610be9575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610c1b575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980548216831790557f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580548216831790557f20c07ed1000000000000000000000000000000000000000000000000000000006000527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb48054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491957f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015610be9575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff8211610aba5781906106c28454612f33565b601f8111610b96575b50600090601f8311600114610af457600092610ae9575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610aba5761074d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612f33565b601f8111610a36575b506000601f821160011461093a578192939460009261092f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590508480610770565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b878110610a1e5750836001959697106109e6575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556107c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806109b9565b909260206001819286860135815501940191016109a5565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610ab0575b601f0160051c01905b818110610aa45750610756565b60008155600101610a97565b9091508190610a8e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806106e2565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110610b7e5750908460019594939210610b46575b505050811b019055610714565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080610b39565b91936020600181928787013581550195019201610b23565b909150836000526020600020601f840160051c81019160208510610bdf575b90601f859493920160051c01905b818110610bd057506106cb565b60008155849350600101610bc3565b9091508190610bb5565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a385806104a0565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610ca7612c4d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610cd1613f66565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff1691828203610d1557005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610d9b612c4d565b60243560443567ffffffffffffffff811161032a57610dbe903690600401612dc3565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610df78383610df0613f66565b8097613d88565b813b610e09575b602060405160018152f35b610e1f94610e18913691613f17565b928061407a565b8080808080610dfe565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a57610e78903690600401612dc3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610eb7613f66565b925416911690810361035957507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff8111610aba57610eff8254612f33565b601f8111610ffd575b506000601f8211600114610f6257819293600092610f57575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610f21565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b868110610fe55750836001959610610fad575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610fa3565b90926020600181928686013581550194019101610f90565b826000526020600020601f830160051c8101916020841061103b575b601f0160051c01905b81811061102f5750610f08565b60008155600101611022565b9091508190611019565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761107c612c4d565b73ffffffffffffffffffffffffffffffffffffffff611099612c70565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561112e612c70565b611136613f66565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166111e857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761130d612c4d565b611315612c70565b6044359060643560843560ff811680910361032a5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d831561151f578142116114f1576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526113f760e082612e50565b5190206114026132b7565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611447606282612e50565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156114e55773ffffffffffffffffffffffffffffffffffffffff60005116036114bb576114b9927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee613048565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5761155736612d34565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061159c613f66565b9254169116908103610359575080821480159061177c575b61032f5760005b8281106115c457005b73ffffffffffffffffffffffffffffffffffffffff6115ec6115e783858a61310d565b61314c565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156114e55760009161174e575b5015611721575073ffffffffffffffffffffffffffffffffffffffff61167b6115e783858a61310d565b169061168b6115e782868961310d565b9161169782878b61310d565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156114e557600192611710575b50016115bb565b600061171b91612e50565b88611709565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61176f915060203d8111611775575b6117678183612e50565b810190613f4e565b89611651565b503d61175d565b50828214156115b4565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576117bd612c4d565b6117c5612c70565b60443560643567ffffffffffffffff811161032a576117e8903690600401612dc3565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9361185484848461181b613f66565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff83160361188557613d88565b823b61186557602060405160018152f35b61187a95611874913691613f17565b9361407a565b808080808080610dfe565b611891848b8484613baa565b613d88565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe6118d0612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6118fd613f66565b90613d88565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe61193d612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61196a613f66565b90613baa565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612f86565b604051918291602083526020830190612bee565b0390f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611a1a612c70565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611b47613f66565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611c135760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101611278565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a57610dfe611c6c36612cc4565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611c99613f66565b90613951565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611cd6612c4d565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe611d5e612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d8b613f66565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611dc7575b5050613420565b611dd2918484613baa565b8483611dc0565b3461032a57611de736612d34565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611e2a613f66565b92541691169081036103595750808314801590611f52575b61032f5760005b838110611e5257005b611e5d81838861310d565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a5760006020918a82611e9e87611e976115e7828f8f9061310d565b938b61310d565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611ef9606482612e50565b51925af1156114e5576000513d611f495750803b155b611f1c5750600101611e49565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611f0f565b5085831415611e42565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611f93612c4d565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461032a57611fef36612cc4565b9290916120247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261201e613f66565b9061335e565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061204f81612e91565b9261205d6040519485612e50565b818452602084019160051b81019036821161032a57915b8183106120cf5750505061208784612e91565b926120956040519485612e50565b848452602084019460051b81019036821161032a57945b8186106120bf5750506114b99350613801565b85358152602095860195016120ac565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a57815260209283019201612074565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061213d612138612c4d565b612df1565b6040519015158152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761217e612c4d565b60243567ffffffffffffffff811161032a5761219e903690600401612c93565b916044359267ffffffffffffffff841161032a576121c3610dfe943690600401612c93565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121ef613f66565b90613541565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe6004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612253613f66565b90613420565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612290612c4d565b6024356122bf7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261201e613f66565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92169182156123f25781612334575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf05482810190808211156123c057507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612304565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612f86565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576124ae612c4d565b6024356124b9613f66565b9073ffffffffffffffffffffffffffffffffffffffff83169283156126635773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002084600052602052604060002054918061257e575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561260857505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061252f565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206126e06132b7565b604051908152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435612780612c70565b612788613f66565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561283b57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101611278565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe61297b612c4d565b612983612c70565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916129ad613f66565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036129ee575b5050613d88565b6129f9918484613baa565b85846129e7565b3461032a57610dfe612a1136612cc4565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612a3e613f66565b9061316d565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe612ad9612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612b06613f66565b90613048565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612f86565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a5761213d6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d612ea9565b919082519283825260005b848110612c385750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612bf9565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a5781612d0d91600401612c93565b929092916024359067ffffffffffffffff821161032a57612d3091600401612c93565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a5781612d7d91600401612c93565b9290929160243567ffffffffffffffff811161032a5781612da091600401612c93565b929092916044359067ffffffffffffffff821161032a57612d3091600401612c93565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612e495773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610aba57604052565b67ffffffffffffffff8111610aba5760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e49577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612f2c5760005260205260ff6040600020541690565b5050600190565b90600182811c92168015612f7c575b6020831014612f4d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612f42565b9060405191826000825492612f9a84612f33565b80845293600181169081156130085750600114612fc1575b50612fbf92500383612e50565b565b90506000929192526020600020906000915b818310612fec575050906020612fbf9282010138612fb2565b6020919350806001915483858901015201910190918492612fd3565b60209350612fbf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612fb2565b929173ffffffffffffffffffffffffffffffffffffffff169283156130c95773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b919081101561311d5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b93929480860361032f5785156132af5760009560005b8181106131a45750505050505081613199575050565b600201908154039055565b6131b26115e782848861310d565b6131bd82858961310d565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff8116850361329d575b509050613235575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a301613183565b98604060008381528a60205220548a810390808210156132675750600083815260208b905260409020558901986131fe565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6132a7928c613baa565b3881876131f6565b505050505050565b6132e07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612f86565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261335860c082612e50565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156133b85750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8261346e575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156134f5575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613426565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361032f5780156137e45773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106135dd575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036135cb575b50505050565b6135d493613baa565b388080806135c5565b73ffffffffffffffffffffffffffffffffffffffff6136006115e783858b61310d565b1680156137a05761361282858761310d565b35806136dc575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806136d2575b613676575b50600101613583565b8a8703908782101561369c57600090815260208d9052604090209086019055600161366d565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415613668565b9a8b810190811115613776579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146137285750906040602093926000908482528552208181540190555b909150613619565b90508882989211613740575090866020920196613720565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b805182101561311d5760209160051b010190565b90918251908051820361032f5781156135c55760009360005b83811061387557505050508161382e575050565b600201805491808301928084111561384557505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff61389482846137ed565b511680156123f2576138a682856137ed565b51806138e4575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161381a565b969190878301928311156139275773ffffffffffffffffffffffffffffffffffffffff8116600090815260208890526040902080548901905591969091906138ad565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361032f5784156132af5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110613a4357505050505080151580613a39575b6139b2575b5050505050565b80850394808610156139ef57505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806139ab565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156139a6565b73ffffffffffffffffffffffffffffffffffffffff613a666115e783858961310d565b168015613b6657613a7882858761310d565b3580613acc575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301613991565b9687810190811115613776579673ffffffffffffffffffffffffffffffffffffffff8916828114613b1957509060019291604060008381528c602052208181540190555b90919250613a7f565b8c829c9211613b305750908a60019392019a613b10565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613d44576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613d3b575b613c77575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015613ce05750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613c2f565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613c2a565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315613e995782613df2575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156134f557508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603613e72575b5050925050613dad565b83831660005281855260406000205586600052835260406000208581540190553880613e68565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff8111610aba57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613f2382613edd565b91613f316040519384612e50565b82948184528183011161032a578281602093846000960137010152565b9081602091031261032a5751801515810361032a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561406b573233148015614070575b61406b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613ff1575b50613fee57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156114e55760009161404c575b5038613fe4565b614065915060203d602011611775576117678183612e50565b38614045565b503390565b5060183610613fad565b6140e973ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612bee565b03816000865af19081156114e557600091614179575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361414c5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116141f3575b8161419260209383612e50565b810103126141ef5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036141ec57507fffffffff000000000000000000000000000000000000000000000000000000006140ff565b80fd5b5080fd5b3d915061418556fea2646970667358221220eabadbf30c69722191daa63950a85e5afde95961d2811b65f29642accd0c910464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x42C1 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4231 SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x291D ADD MSTORE DUP2 DUP2 PUSH2 0x2E08 ADD MSTORE PUSH2 0x3F7D ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2B67 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2B0C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2A9F JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2A44 JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2A00 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2941 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x28D2 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2746 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x26E8 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x26A7 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x2477 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x241C JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2259 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x21F5 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x2147 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x20FC JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1FE1 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1F5C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1DD9 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1D24 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1C9F JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1C5B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1AEC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A7B JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x19E3 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1970 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x1903 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1896 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1786 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x1549 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x12D6 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x127D JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x10F4 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1045 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0xE29 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0xD64 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xC70 JUMPI DUP1 PUSH4 0xF57B0182 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x3EDD JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E50 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3D5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH1 0x0 SWAP4 SWAP2 SWAP4 POP PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x433 PUSH2 0x3F66 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0xBE9 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0xC1B JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0xBE9 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xABA JUMPI DUP2 SWAP1 PUSH2 0x6C2 DUP5 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xB96 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0xAF4 JUMPI PUSH1 0x0 SWAP3 PUSH2 0xAE9 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH2 0x74D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xA36 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x93A JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x92F JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x770 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0xA1E JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x9E6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x7C2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x9B9 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x9A5 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0xAB0 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xAA4 JUMPI POP PUSH2 0x756 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xA97 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xA8E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x6E2 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB7E JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0xB46 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x714 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0xB39 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0xB23 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0xBDF JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xBD0 JUMPI POP PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0xBC3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xBB5 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP6 DUP1 PUSH2 0x4A0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xCA7 PUSH2 0x2C4D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xCD1 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0xD15 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xD9B PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xDBE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xDF7 DUP4 DUP4 PUSH2 0xDF0 PUSH2 0x3F66 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3D88 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE09 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xE1F SWAP5 PUSH2 0xE18 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3F17 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x407A JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xDFE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xE78 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEB7 PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH2 0xEFF DUP3 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xFFD JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0xF62 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0xF57 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0xF21 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0xFE5 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0xFAD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0xFA3 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0xF90 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x103B JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x102F JUMPI POP PUSH2 0xF08 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1022 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1019 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x107C PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1099 PUSH2 0x2C70 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x112E PUSH2 0x2C70 JUMP JUMPDEST PUSH2 0x1136 PUSH2 0x3F66 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x11E8 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x130D PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x1315 PUSH2 0x2C70 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x151F JUMPI DUP2 TIMESTAMP GT PUSH2 0x14F1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x13F7 PUSH1 0xE0 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x1402 PUSH2 0x32B7 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1447 PUSH1 0x62 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x14E5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x14BB JUMPI PUSH2 0x14B9 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x3048 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1557 CALLDATASIZE PUSH2 0x2D34 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x159C PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x177C JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x15C4 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EC PUSH2 0x15E7 DUP4 DUP6 DUP11 PUSH2 0x310D JUMP JUMPDEST PUSH2 0x314C JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x174E JUMPI JUMPDEST POP ISZERO PUSH2 0x1721 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x167B PUSH2 0x15E7 DUP4 DUP6 DUP11 PUSH2 0x310D JUMP JUMPDEST AND SWAP1 PUSH2 0x168B PUSH2 0x15E7 DUP3 DUP7 DUP10 PUSH2 0x310D JUMP JUMPDEST SWAP2 PUSH2 0x1697 DUP3 DUP8 DUP12 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1710 JUMPI JUMPDEST POP ADD PUSH2 0x15BB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171B SWAP2 PUSH2 0x2E50 JUMP JUMPDEST DUP9 PUSH2 0x1709 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x176F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1775 JUMPI JUMPDEST PUSH2 0x1767 DUP2 DUP4 PUSH2 0x2E50 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3F4E JUMP JUMPDEST DUP10 PUSH2 0x1651 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x175D JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x15B4 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x17BD PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x17C5 PUSH2 0x2C70 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x17E8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x1854 DUP5 DUP5 DUP5 PUSH2 0x181B PUSH2 0x3F66 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x1885 JUMPI PUSH2 0x3D88 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1865 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x187A SWAP6 PUSH2 0x1874 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3F17 JUMP JUMPDEST SWAP4 PUSH2 0x407A JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xDFE JUMP JUMPDEST PUSH2 0x1891 DUP5 DUP12 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST PUSH2 0x3D88 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x18D0 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x18FD PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3D88 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x193D PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x196A PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3BAA JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2F86 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2BEE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1A1A PUSH2 0x2C70 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1B47 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C13 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1278 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x1C6C CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1C99 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3951 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1CD6 PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x1D5E PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D8B PUSH2 0x3F66 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1DC7 JUMPI JUMPDEST POP POP PUSH2 0x3420 JUMP JUMPDEST PUSH2 0x1DD2 SWAP2 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1DC0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1DE7 CALLDATASIZE PUSH2 0x2D34 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E2A PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1F52 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1E52 JUMPI STOP JUMPDEST PUSH2 0x1E5D DUP2 DUP4 DUP9 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1E9E DUP8 PUSH2 0x1E97 PUSH2 0x15E7 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x310D JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1EF9 PUSH1 0x64 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1F49 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1F1C JUMPI POP PUSH1 0x1 ADD PUSH2 0x1E49 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1F0F JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1E42 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1F93 PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1FEF CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x2024 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x201E PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x335E JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x204F DUP2 PUSH2 0x2E91 JUMP JUMPDEST SWAP3 PUSH2 0x205D PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E50 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x20CF JUMPI POP POP POP PUSH2 0x2087 DUP5 PUSH2 0x2E91 JUMP JUMPDEST SWAP3 PUSH2 0x2095 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E50 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x20BF JUMPI POP POP PUSH2 0x14B9 SWAP4 POP PUSH2 0x3801 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x20AC JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x2074 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x213D PUSH2 0x2138 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x2DF1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x217E PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x219E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x32A JUMPI PUSH2 0x21C3 PUSH2 0xDFE SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21EF PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3541 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2253 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3420 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2290 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x22BF PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x201E PUSH2 0x3F66 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x23F2 JUMPI DUP2 PUSH2 0x2334 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x23C0 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2304 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2F86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x24AE PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x24B9 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x2663 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x257E JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2608 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x252F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x26E0 PUSH2 0x32B7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2780 PUSH2 0x2C70 JUMP JUMPDEST PUSH2 0x2788 PUSH2 0x3F66 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x283B JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1278 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x297B PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x2983 PUSH2 0x2C70 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x29AD PUSH2 0x3F66 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x29EE JUMPI JUMPDEST POP POP PUSH2 0x3D88 JUMP JUMPDEST PUSH2 0x29F9 SWAP2 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST DUP6 DUP5 PUSH2 0x29E7 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x2A11 CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2A3E PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x316D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x2AD9 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B06 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3048 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2F86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x213D PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x2EA9 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2C38 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BF9 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2D0D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2D30 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2D7D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2DA0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2D30 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2E49 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xABA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E49 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2F2C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x2F7C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2F4D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2F42 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x2F9A DUP5 PUSH2 0x2F33 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3008 JUMPI POP PUSH1 0x1 EQ PUSH2 0x2FC1 JUMPI JUMPDEST POP PUSH2 0x2FBF SWAP3 POP SUB DUP4 PUSH2 0x2E50 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2FEC JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2FBF SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2FB2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2FD3 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2FBF SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2FB2 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x30C9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x311D JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x32F JUMPI DUP6 ISZERO PUSH2 0x32AF JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x31A4 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3199 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x31B2 PUSH2 0x15E7 DUP3 DUP5 DUP9 PUSH2 0x310D JUMP JUMPDEST PUSH2 0x31BD DUP3 DUP6 DUP10 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x329D JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x3235 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3183 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3267 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x31FE JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x32A7 SWAP3 DUP13 PUSH2 0x3BAA JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x31F6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x32E0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2F86 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x3358 PUSH1 0xC0 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x33B8 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x346E JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x34F5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x3426 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x32F JUMPI DUP1 ISZERO PUSH2 0x37E4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x35DD JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x35CB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x35D4 SWAP4 PUSH2 0x3BAA JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x35C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3600 PUSH2 0x15E7 DUP4 DUP6 DUP12 PUSH2 0x310D JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x37A0 JUMPI PUSH2 0x3612 DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x36DC JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x36D2 JUMPI JUMPDEST PUSH2 0x3676 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3583 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x369C JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x366D JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x3668 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3776 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x3728 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x3619 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x3740 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x3720 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x311D JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x32F JUMPI DUP2 ISZERO PUSH2 0x35C5 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3875 JUMPI POP POP POP POP DUP2 PUSH2 0x382E JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x3845 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3894 DUP3 DUP5 PUSH2 0x37ED JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x23F2 JUMPI PUSH2 0x38A6 DUP3 DUP6 PUSH2 0x37ED JUMP JUMPDEST MLOAD DUP1 PUSH2 0x38E4 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x381A JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x3927 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x38AD JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x32F JUMPI DUP5 ISZERO PUSH2 0x32AF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3A43 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3A39 JUMPI JUMPDEST PUSH2 0x39B2 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x39EF JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x39AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x39A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3A66 PUSH2 0x15E7 DUP4 DUP6 DUP10 PUSH2 0x310D JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3B66 JUMPI PUSH2 0x3A78 DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3ACC JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x3991 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3776 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3B19 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x3A7F JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x3B30 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x3B10 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3D44 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3D3B JUMPI JUMPDEST PUSH2 0x3C77 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3CE0 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3C2F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3C2A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3E99 JUMPI DUP3 PUSH2 0x3DF2 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x34F5 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x3E72 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3DAD JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3E68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3F23 DUP3 PUSH2 0x3EDD JUMP JUMPDEST SWAP2 PUSH2 0x3F31 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E50 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x406B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4070 JUMPI JUMPDEST PUSH2 0x406B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3FF1 JUMPI JUMPDEST POP PUSH2 0x3FEE JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x404C JUMPI JUMPDEST POP CODESIZE PUSH2 0x3FE4 JUMP JUMPDEST PUSH2 0x4065 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1775 JUMPI PUSH2 0x1767 DUP2 DUP4 PUSH2 0x2E50 JUMP JUMPDEST CODESIZE PUSH2 0x4045 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3FAD JUMP JUMPDEST PUSH2 0x40E9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2BEE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4179 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x414C JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x41F3 JUMPI JUMPDEST DUP2 PUSH2 0x4192 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2E50 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x41EF JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x41EC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x40FF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4185 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEA 0xBA 0xDB RETURN 0xC PUSH10 0x722191DAA63950A85E5A REVERT 0xE9 MSIZE PUSH2 0xD281 SHL PUSH6 0xF29642ACCD0C SWAP2 DIV PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1898:1596:284:-:0;;;;;;;;;;;;;-1:-1:-1;;1898:1596:284;;;;-1:-1:-1;;;;;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1898:1596:284;;;;;;745:39:76;;1898:1596:284;;;;;;;;745:39:76;1898:1596:284;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":11341,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_address_dyn_calldata":{"entryPoint":11411,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11572,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11460,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_available_length_bytes":{"entryPoint":16151,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":16206,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11715,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":11376,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_address_uint256_uint256":{"entryPoint":null,"id":null,"parameterSlots":5,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":11246,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_address_dyn":{"entryPoint":11921,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":16093,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_address_dyn_calldata":{"entryPoint":12557,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":12166,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":12083,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":11856,"id":null,"parameterSlots":2,"returnSlots":0},"fun_DOMAIN_SEPARATOR":{"entryPoint":12983,"id":28599,"parameterSlots":0,"returnSlots":1},"fun_approve":{"entryPoint":12360,"id":28880,"parameterSlots":4,"returnSlots":0},"fun_batchBurnFrom":{"entryPoint":12653,"id":30044,"parameterSlots":6,"returnSlots":0},"fun_batchMint":{"entryPoint":14337,"id":29811,"parameterSlots":3,"returnSlots":0},"fun_batchTransfer":{"entryPoint":14673,"id":29334,"parameterSlots":6,"returnSlots":0},"fun_batchTransferFrom":{"entryPoint":13633,"id":29523,"parameterSlots":7,"returnSlots":0},"fun_burn":{"entryPoint":13344,"id":29875,"parameterSlots":3,"returnSlots":0},"fun_callOnERC20Received":{"entryPoint":16506,"id":30138,"parameterSlots":5,"returnSlots":0},"fun_decreaseAllowance":{"entryPoint":15274,"id":29042,"parameterSlots":4,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":13150,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_isTrustedForwarder":{"entryPoint":11761,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_msgSender":{"entryPoint":16230,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_supportsInterface":{"entryPoint":11945,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transfer":{"entryPoint":15752,"id":29123,"parameterSlots":4,"returnSlots":0},"memory_array_index_access_address_dyn":{"entryPoint":14317,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":12620,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10525},{"length":32,"start":11784},{"length":32,"start":16253}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612b6757806306fdde0314612b0c578063095ea7b314612a9f57806318160ddd14612a445780631b9a752914612a0057806323b872dd146129415780632b4c9f16146128d25780632f2ff15d14612746578063313ce567146126e85780633644e515146126a757806339509351146124775780633c130d901461241c57806340c10f191461225957806342966c68146121f55780634885b25414612147578063572b6c05146120fc5780636857310714611fe157806370a0823114611f5c57806373c8a95814611dd957806379cc679014611d245780637ecebe0014611c9f57806388d695b214611c5b5780638bb9c5bf14611aec5780638da5cb5b14611a7b57806391d14854146119e357806395d89b4114611970578063a457c2d714611903578063a9059cbb14611896578063b88d4fde14611786578063c3666c3614611549578063d505accf146112d6578063d53913931461127d578063d547741f146110f4578063dd62ed3e14611045578063e0df5b6f14610e29578063eb79554914610d64578063f2fde38b14610c70578063f57b0182146103865763f7ba94bd146101c957600080fd5b3461032a576101d736612cc4565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613f66565b9254169116908103610359575081810361032f5760005b81811061023857005b61024381838761310d565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d82858761310d565b35908147106102f857600080809381935af13d156102f0573d9061029082613edd565b9161029e6040519384612e50565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a576103d5903690600401612dc3565b60243567ffffffffffffffff811161032a576103f5903690600401612dc3565b6000939193506044359160ff831680930361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc610433613f66565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015610be9575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081610c1b575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f9aed5868410a44d2b2b5afc971a20f888382428fa3391cbfac5b1840d2aa352f80548216831790557fc6b5f03b0da98290ffa91f37e0f0b8e2702961697d46a1f6b2d24c3136073a6680548216831790557f27d9344430097694b44c54daae5d82db951e70f450202e98a31fb7e512b2167480548216831790557f56711464edcafe4e82a7e7542dffa87959622899ee5b1c678e1763c8a0b334a980548216831790557f9a550f00726f29dff2bade56048512cf1b1705f05a832e2f404d59756e57d41580548216831790557f20c07ed1000000000000000000000000000000000000000000000000000000006000527f0fe906604d4cc705ea1b9f113133426bf04f7f63322b0f5653f6f8d581e44fb48054909116821790557fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745491957f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a819390929091811015610be9575060017fd217496980d1cb14720b20a80af36676bbece8e5feeb5d8970a9681a2c76bb745567ffffffffffffffff8211610aba5781906106c28454612f33565b601f8111610b96575b50600090601f8311600114610af457600092610ae9575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610aba5761074d7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8254612f33565b601f8111610a36575b506000601f821160011461093a578192939460009261092f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416177f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a83557fa219a0250000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f3c130d900000000000000000000000000000000000000000000000000000000060005280602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790557f9d8ff7da00000000000000000000000000000000000000000000000000000000600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b013590508480610770565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef91805b878110610a1e5750836001959697106109e6575b505050811b017f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82556107c2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806109b9565b909260206001819286860135815501940191016109a5565b7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a826000527f38f29baf5b4f1132a8b8d899467148f866f7b7a6d08f3c484abb8c5467292cef601f830160051c81019160208410610ab0575b601f0160051c01905b818110610aa45750610756565b60008155600101610a97565b9091508190610a8e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905087806106e2565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110610b7e5750908460019594939210610b46575b505050811b019055610714565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080610b39565b91936020600181928787013581550195019201610b23565b909150836000526020600020601f840160051c81019160208510610bdf575b90601f859493920160051c01905b818110610bd057506106cb565b60008155849350600101610bc3565b9091508190610bb5565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a385806104a0565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610ca7612c4d565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610cd1613f66565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff1691828203610d1557005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610d9b612c4d565b60243560443567ffffffffffffffff811161032a57610dbe903690600401612dc3565b9190927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92610df78383610df0613f66565b8097613d88565b813b610e09575b602060405160018152f35b610e1f94610e18913691613f17565b928061407a565b8080808080610dfe565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043567ffffffffffffffff811161032a57610e78903690600401612dc3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610eb7613f66565b925416911690810361035957507ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea9067ffffffffffffffff8111610aba57610eff8254612f33565b601f8111610ffd575b506000601f8211600114610f6257819293600092610f57575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610f21565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216938382526020822091805b868110610fe55750836001959610610fad575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610fa3565b90926020600181928686013581550194019101610f90565b826000526020600020601f830160051c8101916020841061103b575b601f0160051c01905b81811061102f5750610f08565b60008155600101611022565b9091508190611019565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761107c612c4d565b73ffffffffffffffffffffffffffffffffffffffff611099612c70565b91166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef60205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043561112e612c70565b611136613f66565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166111e857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761130d612c4d565b611315612c70565b6044359060643560843560ff811680910361032a5773ffffffffffffffffffffffffffffffffffffffff8516917f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d831561151f578142116114f1576020926000926080928685528552604084209081549160018301905560405190868201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9845288604084015273ffffffffffffffffffffffffffffffffffffffff8a1660608401528a8684015260a083015260c082015260c081526113f760e082612e50565b5190206114026132b7565b9060405190868201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611447606282612e50565b519020906040519182528482015260a435604082015260c435606082015282805260015afa156114e55773ffffffffffffffffffffffffffffffffffffffff60005116036114bb576114b9927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee613048565b005b7f822a64c80000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b507fea2b6f580000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fa97469760000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5761155736612d34565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061159c613f66565b9254169116908103610359575080821480159061177c575b61032f5760005b8281106115c457005b73ffffffffffffffffffffffffffffffffffffffff6115ec6115e783858a61310d565b61314c565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa9081156114e55760009161174e575b5015611721575073ffffffffffffffffffffffffffffffffffffffff61167b6115e783858a61310d565b169061168b6115e782868961310d565b9161169782878b61310d565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af19182156114e557600192611710575b50016115bb565b600061171b91612e50565b88611709565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61176f915060203d8111611775575b6117678183612e50565b810190613f4e565b89611651565b503d61175d565b50828214156115b4565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576117bd612c4d565b6117c5612c70565b60443560643567ffffffffffffffff811161032a576117e8903690600401612dc3565b9290937f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9361185484848461181b613f66565b9873ffffffffffffffffffffffffffffffffffffffff8a1673ffffffffffffffffffffffffffffffffffffffff83160361188557613d88565b823b61186557602060405160018152f35b61187a95611874913691613f17565b9361407a565b808080808080610dfe565b611891848b8484613baa565b613d88565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe6118d0612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6118fd613f66565b90613d88565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe61193d612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee61196a613f66565b90613baa565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a82612f86565b604051918291602083526020830190612bee565b0390f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611a1a612c70565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611b47613f66565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611c135760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101611278565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a57610dfe611c6c36612cc4565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611c99613f66565b90613951565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611cd6612c4d565b73ffffffffffffffffffffffffffffffffffffffff7f93fe0ff7226b064a4a8f0b09910762afb4bc2441835792c021ffd78cd513011d91166000526020526020604060002054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe611d5e612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee611d8b613f66565b8373ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff851603611dc7575b5050613420565b611dd2918484613baa565b8483611dc0565b3461032a57611de736612d34565b949293917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611e2a613f66565b92541691169081036103595750808314801590611f52575b61032f5760005b838110611e5257005b611e5d81838861310d565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a5760006020918a82611e9e87611e976115e7828f8f9061310d565b938b61310d565b356040519073ffffffffffffffffffffffffffffffffffffffff878301947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024830152604482015260448152611ef9606482612e50565b51925af1156114e5576000513d611f495750803b155b611f1c5750600101611e49565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611f0f565b5085831415611e42565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611f93612c4d565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee91166000526020526020604060002054604051908152f35b3461032a57611fef36612cc4565b9290916120247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261201e613f66565b9061335e565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee9061204f81612e91565b9261205d6040519485612e50565b818452602084019160051b81019036821161032a57915b8183106120cf5750505061208784612e91565b926120956040519485612e50565b848452602084019460051b81019036821161032a57945b8186106120bf5750506114b99350613801565b85358152602095860195016120ac565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a57815260209283019201612074565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061213d612138612c4d565b612df1565b6040519015158152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761217e612c4d565b60243567ffffffffffffffff811161032a5761219e903690600401612c93565b916044359267ffffffffffffffff841161032a576121c3610dfe943690600401612c93565b9390927f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee6121ef613f66565b90613541565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe6004357f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612253613f66565b90613420565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612290612c4d565b6024356122bf7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261201e613f66565b73ffffffffffffffffffffffffffffffffffffffff7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee92169182156123f25781612334575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600092604051908152a3005b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf05482810190808211156123c057507f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf0556000838152602091909152604090208054820190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612304565b83907f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f92fd9c8f0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7ff41bf6a5db26bffdfab174dcf66b31fbba8fdb7e3db040721ce1e62d61839cea612f86565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576124ae612c4d565b6024356124b9613f66565b9073ffffffffffffffffffffffffffffffffffffffff83169283156126635773ffffffffffffffffffffffffffffffffffffffff83166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef602052604060002084600052602052604060002054918061257e575b84837f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602073ffffffffffffffffffffffffffffffffffffffff886040519485521692a3602060405160018152f35b808301928084111561260857505050602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928185166000527f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbef8352604060002086600052835280604060002055925061252f565b6040517f93bc2ff100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015293909316602484015260448301526064820152608490fd5b73ffffffffffffffffffffffffffffffffffffffff837ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206126e06132b7565b604051908152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060ff7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a835416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435612780612c70565b612788613f66565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561283b57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101611278565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe61297b612c4d565b612983612c70565b7f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee916129ad613f66565b92604435938473ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8516036129ee575b5050613d88565b6129f9918484613baa565b85846129e7565b3461032a57610dfe612a1136612cc4565b929091907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612a3e613f66565b9061316d565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760207f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbf054604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610dfe612ad9612c4d565b602435907f1da92899d3da68bf9787824388a37ea2bfa79780bcef91b9716c390eec8ecbee612b06613f66565b90613048565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119df6119cb7f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612f86565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a5761213d6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d612ea9565b919082519283825260005b848110612c385750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612bf9565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a5781612d0d91600401612c93565b929092916024359067ffffffffffffffff821161032a57612d3091600401612c93565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a5781612d7d91600401612c93565b9290929160243567ffffffffffffffff811161032a5781612da091600401612c93565b929092916044359067ffffffffffffffff821161032a57612d3091600401612c93565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612e495773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610aba57604052565b67ffffffffffffffff8111610aba5760051b60200190565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e49577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612f2c5760005260205260ff6040600020541690565b5050600190565b90600182811c92168015612f7c575b6020831014612f4d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612f42565b9060405191826000825492612f9a84612f33565b80845293600181169081156130085750600114612fc1575b50612fbf92500383612e50565b565b90506000929192526020600020906000915b818310612fec575050906020612fbf9282010138612fb2565b6020919350806001915483858901015201910190918492612fd3565b60209350612fbf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612fb2565b929173ffffffffffffffffffffffffffffffffffffffff169283156130c95773ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259260016020938383166000520183526040600020866000528352846040600020556040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff827ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b919081101561311d5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b93929480860361032f5785156132af5760009560005b8181106131a45750505050505081613199575050565b600201908154039055565b6131b26115e782848861310d565b6131bd82858961310d565b3573ffffffffffffffffffffffffffffffffffffffff821691818773ffffffffffffffffffffffffffffffffffffffff8116850361329d575b509050613235575b600192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020600093604051908152a301613183565b98604060008381528a60205220548a810390808210156132675750600083815260208b905260409020558901986131fe565b8b90847fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b6132a7928c613baa565b3881876131f6565b505050505050565b6132e07f335df4119bbb04f056b33eba33b826d3529129e458faf6daa9924b5a8f3b6a81612f86565b6020815191012060405160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261335860c082612e50565b51902090565b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156133b85750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b8261346e575b50907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff6000946040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156134f5575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208390526040902055600201805483900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef613426565b849073ffffffffffffffffffffffffffffffffffffffff857fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b9594909392919285810361032f5780156137e45773ffffffffffffffffffffffffffffffffffffffff8416600052866020526040600020549160009660009260005b8181106135dd575050505050505073ffffffffffffffffffffffffffffffffffffffff821673ffffffffffffffffffffffffffffffffffffffff8216036135cb575b50505050565b6135d493613baa565b388080806135c5565b73ffffffffffffffffffffffffffffffffffffffff6136006115e783858b61310d565b1680156137a05761361282858761310d565b35806136dc575b906020917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73ffffffffffffffffffffffffffffffffffffffff8c16938492604051908152a38a1515806136d2575b613676575b50600101613583565b8a8703908782101561369c57600090815260208d9052604090209086019055600161366d565b878c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50858b1415613668565b9a8b810190811115613776579a8c73ffffffffffffffffffffffffffffffffffffffff8b168381146137285750906040602093926000908482528552208181540190555b909150613619565b90508882989211613740575090866020920196613720565b8888917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7fdedd83410000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff897f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50505050505050565b805182101561311d5760209160051b010190565b90918251908051820361032f5781156135c55760009360005b83811061387557505050508161382e575050565b600201805491808301928084111561384557505055565b7f0366a5f60000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b73ffffffffffffffffffffffffffffffffffffffff61389482846137ed565b511680156123f2576138a682856137ed565b51806138e4575b9060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602060019594604051908152a30161381a565b969190878301928311156139275773ffffffffffffffffffffffffffffffffffffffff8116600090815260208890526040902080548901905591969091906138ad565b7f5542ae7c0000000000000000000000000000000000000000000000000000000060005260046000fd5b929394909181850361032f5784156132af5773ffffffffffffffffffffffffffffffffffffffff8316600052836020526040600020549560009260009660005b818110613a4357505050505080151580613a39575b6139b2575b5050505050565b80850394808610156139ef57505073ffffffffffffffffffffffffffffffffffffffff1660005260205260406000209101905538808080806139ab565b73ffffffffffffffffffffffffffffffffffffffff837fe450d38c000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50838114156139a6565b73ffffffffffffffffffffffffffffffffffffffff613a666115e783858961310d565b168015613b6657613a7882858761310d565b3580613acc575b90600192916040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602073ffffffffffffffffffffffffffffffffffffffff8c1692a301613991565b9687810190811115613776579673ffffffffffffffffffffffffffffffffffffffff8916828114613b1957509060019291604060008381528c602052208181540190555b90919250613a7f565b8c829c9211613b305750908a60019392019a613b10565b8c8c917fe450d38c0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b73ffffffffffffffffffffffffffffffffffffffff887f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b92909173ffffffffffffffffffffffffffffffffffffffff8116938415613d44576001019073ffffffffffffffffffffffffffffffffffffffff841660005281602052604060002085600052602052604060002054927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141580613d3b575b613c77575b50505090602073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925926040519485521692a3565b8084039380851015613ce05750505073ffffffffffffffffffffffffffffffffffffffff7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592602092828616600052835260406000208660005283528060406000205592613c2f565b6040517f137ad6ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015293909316602484015260448301526064820152608490fd5b50801515613c2a565b73ffffffffffffffffffffffffffffffffffffffff847ff7e1ac0f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b929173ffffffffffffffffffffffffffffffffffffffff16928315613e995782613df2575b50602073ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926040519485521692a3565b73ffffffffffffffffffffffffffffffffffffffff82166000528060205260406000205483810390808210156134f557508260209273ffffffffffffffffffffffffffffffffffffffff9287847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef971603613e72575b5050925050613dad565b83831660005281855260406000205586600052835260406000208581540190553880613e68565b73ffffffffffffffffffffffffffffffffffffffff827f754f425b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff8111610aba57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613f2382613edd565b91613f316040519384612e50565b82948184528183011161032a578281602093846000960137010152565b9081602091031261032a5751801515810361032a5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561406b573233148015614070575b61406b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613ff1575b50613fee57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156114e55760009161404c575b5038613fe4565b614065915060203d602011611775576117678183612e50565b38614045565b503390565b5060183610613fad565b6140e973ffffffffffffffffffffffffffffffffffffffff9294958360209516968460405197889687967f4fc358590000000000000000000000000000000000000000000000000000000088521660048701521660248501526044840152608060648401526084830190612bee565b03816000865af19081156114e557600091614179575b507fffffffff000000000000000000000000000000000000000000000000000000007f4fc358590000000000000000000000000000000000000000000000000000000091160361414c5750565b7f6d4497360000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6020813d6020116141f3575b8161419260209383612e50565b810103126141ef5751907fffffffff00000000000000000000000000000000000000000000000000000000821682036141ec57507fffffffff000000000000000000000000000000000000000000000000000000006140ff565b80fd5b5080fd5b3d915061418556fea2646970667358221220eabadbf30c69722191daa63950a85e5afde95961d2811b65f29642accd0c910464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2B67 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2B0C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2A9F JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2A44 JUMPI DUP1 PUSH4 0x1B9A7529 EQ PUSH2 0x2A00 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2941 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x28D2 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2746 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x26E8 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x26A7 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x2477 JUMPI DUP1 PUSH4 0x3C130D90 EQ PUSH2 0x241C JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2259 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x21F5 JUMPI DUP1 PUSH4 0x4885B254 EQ PUSH2 0x2147 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x20FC JUMPI DUP1 PUSH4 0x68573107 EQ PUSH2 0x1FE1 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1F5C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1DD9 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1D24 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x1C9F JUMPI DUP1 PUSH4 0x88D695B2 EQ PUSH2 0x1C5B JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1AEC JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1A7B JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x19E3 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1970 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x1903 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x1896 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1786 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0x1549 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x12D6 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0x127D JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x10F4 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1045 JUMPI DUP1 PUSH4 0xE0DF5B6F EQ PUSH2 0xE29 JUMPI DUP1 PUSH4 0xEB795549 EQ PUSH2 0xD64 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xC70 JUMPI DUP1 PUSH4 0xF57B0182 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x3EDD JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E50 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3D5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3F5 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH1 0x0 SWAP4 SWAP2 SWAP4 POP PUSH1 0x44 CALLDATALOAD SWAP2 PUSH1 0xFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x433 PUSH2 0x3F66 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0xBE9 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0xC1B JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x9AED5868410A44D2B2B5AFC971A20F888382428FA3391CBFAC5B1840D2AA352F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0xC6B5F03B0DA98290FFA91F37E0F0B8E2702961697D46A1F6B2D24C3136073A66 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x27D9344430097694B44C54DAAE5D82DB951E70F450202E98A31FB7E512B21674 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x56711464EDCAFE4E82A7E7542DFFA87959622899EE5B1C678E1763C8A0B334A9 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x9A550F00726F29DFF2BADE56048512CF1B1705F05A832E2F404D59756E57D415 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x20C07ED100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xFE906604D4CC705EA1B9F113133426BF04F7F63322B0F5653F6F8D581E44FB4 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SLOAD SWAP2 SWAP6 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP2 LT ISZERO PUSH2 0xBE9 JUMPI POP PUSH1 0x1 PUSH32 0xD217496980D1CB14720B20A80AF36676BBECE8E5FEEB5D8970A9681A2C76BB74 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xABA JUMPI DUP2 SWAP1 PUSH2 0x6C2 DUP5 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xB96 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0xAF4 JUMPI PUSH1 0x0 SWAP3 PUSH2 0xAE9 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH2 0x74D PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xA36 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x93A JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x92F JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND OR PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SSTORE PUSH32 0xA219A02500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x3C130D9000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x9D8FF7DA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x770 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0xA1E JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x9E6 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 SSTORE PUSH2 0x7C2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x9B9 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x9A5 JUMP JUMPDEST PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH1 0x0 MSTORE PUSH32 0x38F29BAF5B4F1132A8B8D899467148F866F7B7A6D08F3C484ABB8C5467292CEF PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0xAB0 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xAA4 JUMPI POP PUSH2 0x756 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xA97 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xA8E JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x6E2 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0xB7E JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0xB46 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x714 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0xB39 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0xB23 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0xBDF JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0xBD0 JUMPI POP PUSH2 0x6CB JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0xBC3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0xBB5 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP6 DUP1 PUSH2 0x4A0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xCA7 PUSH2 0x2C4D JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0xCD1 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0xD15 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xD9B PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xDBE SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST SWAP2 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 PUSH2 0xDF7 DUP4 DUP4 PUSH2 0xDF0 PUSH2 0x3F66 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0x3D88 JUMP JUMPDEST DUP2 EXTCODESIZE PUSH2 0xE09 JUMPI JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0xE1F SWAP5 PUSH2 0xE18 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3F17 JUMP JUMPDEST SWAP3 DUP1 PUSH2 0x407A JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xDFE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0xE78 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEB7 PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH2 0xEFF DUP3 SLOAD PUSH2 0x2F33 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0xFFD JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0xF62 JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0xF57 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP4 DUP1 PUSH2 0xF21 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0xFE5 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0xFAD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE STOP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP4 DUP1 DUP1 PUSH2 0xFA3 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0xF90 JUMP JUMPDEST DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x103B JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x102F JUMPI POP PUSH2 0xF08 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1022 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x1019 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x107C PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1099 PUSH2 0x2C70 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x112E PUSH2 0x2C70 JUMP JUMPDEST PUSH2 0x1136 PUSH2 0x3F66 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x11E8 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0xE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x130D PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x1315 PUSH2 0x2C70 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH1 0x64 CALLDATALOAD PUSH1 0x84 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D DUP4 ISZERO PUSH2 0x151F JUMPI DUP2 TIMESTAMP GT PUSH2 0x14F1 JUMPI PUSH1 0x20 SWAP3 PUSH1 0x0 SWAP3 PUSH1 0x80 SWAP3 DUP7 DUP6 MSTORE DUP6 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 PUSH1 0x1 DUP4 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 DUP5 MSTORE DUP9 PUSH1 0x40 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH1 0x60 DUP5 ADD MSTORE DUP11 DUP7 DUP5 ADD MSTORE PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 MSTORE PUSH2 0x13F7 PUSH1 0xE0 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 PUSH2 0x1402 PUSH2 0x32B7 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP7 DUP3 ADD SWAP3 PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x22 DUP4 ADD MSTORE PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x42 DUP2 MSTORE PUSH2 0x1447 PUSH1 0x62 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE DUP5 DUP3 ADD MSTORE PUSH1 0xA4 CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xC4 CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE DUP3 DUP1 MSTORE PUSH1 0x1 GAS STATICCALL ISZERO PUSH2 0x14E5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 MLOAD AND SUB PUSH2 0x14BB JUMPI PUSH2 0x14B9 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x3048 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x822A64C800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP PUSH32 0xEA2B6F5800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xA974697600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1557 CALLDATASIZE PUSH2 0x2D34 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x159C PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x177C JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x15C4 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EC PUSH2 0x15E7 DUP4 DUP6 DUP11 PUSH2 0x310D JUMP JUMPDEST PUSH2 0x314C JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x174E JUMPI JUMPDEST POP ISZERO PUSH2 0x1721 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x167B PUSH2 0x15E7 DUP4 DUP6 DUP11 PUSH2 0x310D JUMP JUMPDEST AND SWAP1 PUSH2 0x168B PUSH2 0x15E7 DUP3 DUP7 DUP10 PUSH2 0x310D JUMP JUMPDEST SWAP2 PUSH2 0x1697 DUP3 DUP8 DUP12 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1710 JUMPI JUMPDEST POP ADD PUSH2 0x15BB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171B SWAP2 PUSH2 0x2E50 JUMP JUMPDEST DUP9 PUSH2 0x1709 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x176F SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1775 JUMPI JUMPDEST PUSH2 0x1767 DUP2 DUP4 PUSH2 0x2E50 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3F4E JUMP JUMPDEST DUP10 PUSH2 0x1651 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x175D JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0x15B4 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x17BD PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x17C5 PUSH2 0x2C70 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x17E8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2DC3 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP4 PUSH2 0x1854 DUP5 DUP5 DUP5 PUSH2 0x181B PUSH2 0x3F66 JUMP JUMPDEST SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SUB PUSH2 0x1885 JUMPI PUSH2 0x3D88 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1865 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST PUSH2 0x187A SWAP6 PUSH2 0x1874 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3F17 JUMP JUMPDEST SWAP4 PUSH2 0x407A JUMP JUMPDEST DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0xDFE JUMP JUMPDEST PUSH2 0x1891 DUP5 DUP12 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST PUSH2 0x3D88 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x18D0 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x18FD PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3D88 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x193D PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x196A PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3BAA JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A82 PUSH2 0x2F86 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2BEE JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1A1A PUSH2 0x2C70 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1B47 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1C13 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1278 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x1C6C CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1C99 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3951 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1CD6 PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x93FE0FF7226B064A4A8F0B09910762AFB4BC2441835792C021FFD78CD513011D SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x1D5E PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x1D8B PUSH2 0x3F66 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x1DC7 JUMPI JUMPDEST POP POP PUSH2 0x3420 JUMP JUMPDEST PUSH2 0x1DD2 SWAP2 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST DUP5 DUP4 PUSH2 0x1DC0 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1DE7 CALLDATASIZE PUSH2 0x2D34 JUMP JUMPDEST SWAP5 SWAP3 SWAP4 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1E2A PUSH2 0x3F66 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP4 EQ DUP1 ISZERO SWAP1 PUSH2 0x1F52 JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1E52 JUMPI STOP JUMPDEST PUSH2 0x1E5D DUP2 DUP4 DUP9 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 DUP11 DUP3 PUSH2 0x1E9E DUP8 PUSH2 0x1E97 PUSH2 0x15E7 DUP3 DUP16 DUP16 SWAP1 PUSH2 0x310D JUMP JUMPDEST SWAP4 DUP12 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH1 0x40 MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP4 ADD SWAP5 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x44 DUP2 MSTORE PUSH2 0x1EF9 PUSH1 0x64 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1F49 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1F1C JUMPI POP PUSH1 0x1 ADD PUSH2 0x1E49 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1F0F JUMP JUMPDEST POP DUP6 DUP4 EQ ISZERO PUSH2 0x1E42 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1F93 PUSH2 0x2C4D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1FEF CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 PUSH2 0x2024 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x201E PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x335E JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP1 PUSH2 0x204F DUP2 PUSH2 0x2E91 JUMP JUMPDEST SWAP3 PUSH2 0x205D PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E50 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x20CF JUMPI POP POP POP PUSH2 0x2087 DUP5 PUSH2 0x2E91 JUMP JUMPDEST SWAP3 PUSH2 0x2095 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2E50 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP5 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP5 JUMPDEST DUP2 DUP7 LT PUSH2 0x20BF JUMPI POP POP PUSH2 0x14B9 SWAP4 POP PUSH2 0x3801 JUMP JUMPDEST DUP6 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 ADD PUSH2 0x20AC JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x2074 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x213D PUSH2 0x2138 PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x2DF1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x217E PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x219E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP2 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x32A JUMPI PUSH2 0x21C3 PUSH2 0xDFE SWAP5 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP4 SWAP1 SWAP3 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x21EF PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3541 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH1 0x4 CALLDATALOAD PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2253 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3420 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2290 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x22BF PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x201E PUSH2 0x3F66 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP3 AND SWAP2 DUP3 ISZERO PUSH2 0x23F2 JUMPI DUP2 PUSH2 0x2334 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD DUP3 DUP2 ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x23C0 JUMPI POP PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x2304 JUMP JUMPDEST DUP4 SWAP1 PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x92FD9C8F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0xF41BF6A5DB26BFFDFAB174DCF66B31FBBA8FDB7E3DB040721CE1E62D61839CEA PUSH2 0x2F86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x24AE PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH2 0x24B9 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP3 DUP4 ISZERO PUSH2 0x2663 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 DUP1 PUSH2 0x257E JUMPI JUMPDEST DUP5 DUP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE RETURN JUMPDEST DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x2608 JUMPI POP POP POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 DUP6 AND PUSH1 0x0 MSTORE PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEF DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 POP PUSH2 0x252F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x93BC2FF100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x26E0 PUSH2 0x32B7 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0xFF PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A83 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2780 PUSH2 0x2C70 JUMP JUMPDEST PUSH2 0x2788 PUSH2 0x3F66 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x283B JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0x1278 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x297B PUSH2 0x2C4D JUMP JUMPDEST PUSH2 0x2983 PUSH2 0x2C70 JUMP JUMPDEST PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE SWAP2 PUSH2 0x29AD PUSH2 0x3F66 JUMP JUMPDEST SWAP3 PUSH1 0x44 CALLDATALOAD SWAP4 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SUB PUSH2 0x29EE JUMPI JUMPDEST POP POP PUSH2 0x3D88 JUMP JUMPDEST PUSH2 0x29F9 SWAP2 DUP5 DUP5 PUSH2 0x3BAA JUMP JUMPDEST DUP6 DUP5 PUSH2 0x29E7 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x2A11 CALLDATASIZE PUSH2 0x2CC4 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2A3E PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x316D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBF0 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDFE PUSH2 0x2AD9 PUSH2 0x2C4D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0x1DA92899D3DA68BF9787824388A37EA2BFA79780BCEF91B9716C390EEC8ECBEE PUSH2 0x2B06 PUSH2 0x3F66 JUMP JUMPDEST SWAP1 PUSH2 0x3048 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19DF PUSH2 0x19CB PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2F86 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x213D PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x2EA9 JUMP JUMPDEST SWAP2 SWAP1 DUP3 MLOAD SWAP3 DUP4 DUP3 MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2C38 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x20 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x2BF9 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2D0D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2D30 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2D7D SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x2DA0 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2D30 SWAP2 PUSH1 0x4 ADD PUSH2 0x2C93 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2E49 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xABA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E49 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2F2C JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x2F7C JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x2F4D JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x2F42 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x2F9A DUP5 PUSH2 0x2F33 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3008 JUMPI POP PUSH1 0x1 EQ PUSH2 0x2FC1 JUMPI JUMPDEST POP PUSH2 0x2FBF SWAP3 POP SUB DUP4 PUSH2 0x2E50 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x2FEC JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x2FBF SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x2FB2 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x2FD3 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x2FBF SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x2FB2 JUMP JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x30C9 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x1 PUSH1 0x20 SWAP4 DUP4 DUP4 AND PUSH1 0x0 MSTORE ADD DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP5 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x311D JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP5 DUP1 DUP7 SUB PUSH2 0x32F JUMPI DUP6 ISZERO PUSH2 0x32AF JUMPI PUSH1 0x0 SWAP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x31A4 JUMPI POP POP POP POP POP POP DUP2 PUSH2 0x3199 JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x31B2 PUSH2 0x15E7 DUP3 DUP5 DUP9 PUSH2 0x310D JUMP JUMPDEST PUSH2 0x31BD DUP3 DUP6 DUP10 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP2 DUP2 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP6 SUB PUSH2 0x329D JUMPI JUMPDEST POP SWAP1 POP PUSH2 0x3235 JUMPI JUMPDEST PUSH1 0x1 SWAP3 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x0 SWAP4 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x3183 JUMP JUMPDEST SWAP9 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 SLOAD DUP11 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x3267 JUMPI POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP12 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE DUP10 ADD SWAP9 PUSH2 0x31FE JUMP JUMPDEST DUP12 SWAP1 DUP5 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x32A7 SWAP3 DUP13 PUSH2 0x3BAA JUMP JUMPDEST CODESIZE DUP2 DUP8 PUSH2 0x31F6 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x32E0 PUSH32 0x335DF4119BBB04F056B33EBA33B826D3529129E458FAF6DAA9924B5A8F3B6A81 PUSH2 0x2F86 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD SWAP2 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F DUP4 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0xC89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6 PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 MSTORE PUSH2 0x3358 PUSH1 0xC0 DUP3 PUSH2 0x2E50 JUMP JUMPDEST MLOAD SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x33B8 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x346E JUMPI JUMPDEST POP SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP5 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x34F5 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 ADD DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH2 0x3426 JUMP JUMPDEST DUP5 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST SWAP6 SWAP5 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 DUP6 DUP2 SUB PUSH2 0x32F JUMPI DUP1 ISZERO PUSH2 0x37E4 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP2 PUSH1 0x0 SWAP7 PUSH1 0x0 SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x35DD JUMPI POP POP POP POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x35CB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x35D4 SWAP4 PUSH2 0x3BAA JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x35C5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3600 PUSH2 0x15E7 DUP4 DUP6 DUP12 PUSH2 0x310D JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x37A0 JUMPI PUSH2 0x3612 DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x36DC JUMPI JUMPDEST SWAP1 PUSH1 0x20 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 DUP5 SWAP3 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 DUP11 ISZERO ISZERO DUP1 PUSH2 0x36D2 JUMPI JUMPDEST PUSH2 0x3676 JUMPI JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x3583 JUMP JUMPDEST DUP11 DUP8 SUB SWAP1 DUP8 DUP3 LT ISZERO PUSH2 0x369C JUMPI PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP14 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP7 ADD SWAP1 SSTORE PUSH1 0x1 PUSH2 0x366D JUMP JUMPDEST DUP8 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP6 DUP12 EQ ISZERO PUSH2 0x3668 JUMP JUMPDEST SWAP11 DUP12 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3776 JUMPI SWAP11 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND DUP4 DUP2 EQ PUSH2 0x3728 JUMPI POP SWAP1 PUSH1 0x40 PUSH1 0x20 SWAP4 SWAP3 PUSH1 0x0 SWAP1 DUP5 DUP3 MSTORE DUP6 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 POP PUSH2 0x3619 JUMP JUMPDEST SWAP1 POP DUP9 DUP3 SWAP9 SWAP3 GT PUSH2 0x3740 JUMPI POP SWAP1 DUP7 PUSH1 0x20 SWAP3 ADD SWAP7 PUSH2 0x3720 JUMP JUMPDEST DUP9 DUP9 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0xDEDD834100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x311D JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP1 SWAP2 DUP3 MLOAD SWAP1 DUP1 MLOAD DUP3 SUB PUSH2 0x32F JUMPI DUP2 ISZERO PUSH2 0x35C5 JUMPI PUSH1 0x0 SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3875 JUMPI POP POP POP POP DUP2 PUSH2 0x382E JUMPI POP POP JUMP JUMPDEST PUSH1 0x2 ADD DUP1 SLOAD SWAP2 DUP1 DUP4 ADD SWAP3 DUP1 DUP5 GT ISZERO PUSH2 0x3845 JUMPI POP POP SSTORE JUMP JUMPDEST PUSH32 0x366A5F600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3894 DUP3 DUP5 PUSH2 0x37ED JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x23F2 JUMPI PUSH2 0x38A6 DUP3 DUP6 PUSH2 0x37ED JUMP JUMPDEST MLOAD DUP1 PUSH2 0x38E4 JUMPI JUMPDEST SWAP1 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH1 0x1 SWAP6 SWAP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 ADD PUSH2 0x381A JUMP JUMPDEST SWAP7 SWAP2 SWAP1 DUP8 DUP4 ADD SWAP3 DUP4 GT ISZERO PUSH2 0x3927 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP10 ADD SWAP1 SSTORE SWAP2 SWAP7 SWAP1 SWAP2 SWAP1 PUSH2 0x38AD JUMP JUMPDEST PUSH32 0x5542AE7C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP4 SWAP5 SWAP1 SWAP2 DUP2 DUP6 SUB PUSH2 0x32F JUMPI DUP5 ISZERO PUSH2 0x32AF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP6 PUSH1 0x0 SWAP3 PUSH1 0x0 SWAP7 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x3A43 JUMPI POP POP POP POP POP DUP1 ISZERO ISZERO DUP1 PUSH2 0x3A39 JUMPI JUMPDEST PUSH2 0x39B2 JUMPI JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 DUP6 SUB SWAP5 DUP1 DUP7 LT ISZERO PUSH2 0x39EF JUMPI POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 ADD SWAP1 SSTORE CODESIZE DUP1 DUP1 DUP1 DUP1 PUSH2 0x39AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 DUP2 EQ ISZERO PUSH2 0x39A6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x3A66 PUSH2 0x15E7 DUP4 DUP6 DUP10 PUSH2 0x310D JUMP JUMPDEST AND DUP1 ISZERO PUSH2 0x3B66 JUMPI PUSH2 0x3A78 DUP3 DUP6 DUP8 PUSH2 0x310D JUMP JUMPDEST CALLDATALOAD DUP1 PUSH2 0x3ACC JUMPI JUMPDEST SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP3 LOG3 ADD PUSH2 0x3991 JUMP JUMPDEST SWAP7 DUP8 DUP2 ADD SWAP1 DUP2 GT ISZERO PUSH2 0x3776 JUMPI SWAP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP3 DUP2 EQ PUSH2 0x3B19 JUMPI POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH1 0x40 PUSH1 0x0 DUP4 DUP2 MSTORE DUP13 PUSH1 0x20 MSTORE KECCAK256 DUP2 DUP2 SLOAD ADD SWAP1 SSTORE JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH2 0x3A7F JUMP JUMPDEST DUP13 DUP3 SWAP13 SWAP3 GT PUSH2 0x3B30 JUMPI POP SWAP1 DUP11 PUSH1 0x1 SWAP4 SWAP3 ADD SWAP11 PUSH2 0x3B10 JUMP JUMPDEST DUP13 DUP13 SWAP2 PUSH32 0xE450D38C00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP1 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3D44 JUMPI PUSH1 0x1 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 EQ ISZERO DUP1 PUSH2 0x3D3B JUMPI JUMPDEST PUSH2 0x3C77 JUMPI JUMPDEST POP POP POP SWAP1 PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST DUP1 DUP5 SUB SWAP4 DUP1 DUP6 LT ISZERO PUSH2 0x3CE0 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 PUSH1 0x20 SWAP3 DUP3 DUP7 AND PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE SWAP3 PUSH2 0x3C2F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x137AD6AB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP4 SWAP1 SWAP4 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 SWAP1 REVERT JUMPDEST POP DUP1 ISZERO ISZERO PUSH2 0x3C2A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xF7E1AC0F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x3E99 JUMPI DUP3 PUSH2 0x3DF2 JUMPI JUMPDEST POP PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 PUSH1 0x40 MLOAD SWAP5 DUP6 MSTORE AND SWAP3 LOG3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP4 DUP2 SUB SWAP1 DUP1 DUP3 LT ISZERO PUSH2 0x34F5 JUMPI POP DUP3 PUSH1 0x20 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP8 DUP5 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP8 AND SUB PUSH2 0x3E72 JUMPI JUMPDEST POP POP SWAP3 POP POP PUSH2 0x3DAD JUMP JUMPDEST DUP4 DUP4 AND PUSH1 0x0 MSTORE DUP2 DUP6 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP7 PUSH1 0x0 MSTORE DUP4 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x3E68 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH32 0x754F425B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xABA JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3F23 DUP3 PUSH2 0x3EDD JUMP JUMPDEST SWAP2 PUSH2 0x3F31 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2E50 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x406B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4070 JUMPI JUMPDEST PUSH2 0x406B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3FF1 JUMPI JUMPDEST POP PUSH2 0x3FEE JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x404C JUMPI JUMPDEST POP CODESIZE PUSH2 0x3FE4 JUMP JUMPDEST PUSH2 0x4065 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1775 JUMPI PUSH2 0x1767 DUP2 DUP4 PUSH2 0x2E50 JUMP JUMPDEST CODESIZE PUSH2 0x4045 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3FAD JUMP JUMPDEST PUSH2 0x40E9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP5 SWAP6 DUP4 PUSH1 0x20 SWAP6 AND SWAP7 DUP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 SWAP7 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 DUP9 MSTORE AND PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2BEE JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4179 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x4FC3585900000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x414C JUMPI POP JUMP JUMPDEST PUSH32 0x6D44973600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x41F3 JUMPI JUMPDEST DUP2 PUSH2 0x4192 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2E50 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x41EF JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x41EC JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x40FF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4185 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEA 0xBA 0xDB RETURN 0xC PUSH10 0x722191DAA63950A85E5A REVERT 0xE9 MSIZE PUSH2 0xD281 SHL PUSH6 0xF29642ACCD0C SWAP2 DIV PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1898:1596:284:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1898:1596:284;;3211:41;;;:::i;:::-;1898:1596;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1898:1596:284;1845:10:192;;;;;;1898:1596:284;1857:3:192;1876:11;;;;;:::i;:::-;1898:1596:284;;;;;;;;;:10:192;;;;;:::i;:::-;:1596:284;1375:21:9;;;:30;1371:125;;1898:1596:284;1548:33:9;;;;;;;1898:1596:284;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1898:1596:284;;1834:9:192;;1591:58:9;1898:1596:284;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1898:1596:284;5957:19:9;1898:1596:284;;5957:19:9;1898:1596:284;;;;;1371:125:9;1455:21;;1428:57;1898:1596:284;1428:57:9;1898:1596:284;;;;;;1428:57:9;1898:1596:284;;;;1756:63:192;1793:26;1898:1596:284;1793:26:192;1898:1596:284;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1898:1596:284;;-1:-1:-1;4538:25:42;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3211:41;;:::i;:::-;1898:1596;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1898:1596:284;;;;;;1645:152:42;;1898:1596:284;-1:-1:-1;;1898:1596:284;;500:10:59;;;;1898:1596:284;;1124:1:42;1898:1596:284;;;;;;;;;500:10:59;1898:1596:284;;;;;;;;500:10:59;1898:1596:284;;;;;;;;500:10:59;1898:1596:284;;;;;;;;500:10:59;1898:1596:284;;;;;;;;500:10:59;1898:1596:284;;;;;;;;3920:32:280;-1:-1:-1;500:10:59;;1898:1596:284;;;;;;;;;;;;;;;;;;;900:21:181;;;896:88;;1898:1596:284;1124:1:42;1898:1596:284;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;;;;;;;;;;2461:13:277;1898:1596:284;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;2461:13:277;1898:1596:284;;;2498:15:277;791:79;1898:1596:284;;2498:15:277;791:79;2596:32;1898:1596:284;500:10:59;;1898:1596:284;500:10:59;1898:1596:284;;500:10:59;1124:1:42;1898:1596:284;;;;;;;768:32:278;1898:1596:284;500:10:59;;1898:1596:284;500:10:59;1898:1596:284;;500:10:59;1124:1:42;1898:1596:284;;;;;;;1298:30:279;1898:1596:284;500:10:59;1898:1596:284;500:10:59;1898:1596:284;;500:10:59;1124:1:42;1898:1596:284;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;2461:13:277;1898:1596:284;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;;;;;;2461:13:277;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;;;;;;;;;2461:13:277;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1124:1:42;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1124:1:42;1898:1596:284;;;;;;-1:-1:-1;1898:1596:284;;;;896:88:181;930:54;1898:1596:284;930:54:181;1898:1596:284;;1124:1:42;1898:1596:284;;;;930:54:181;1645:152:42;1898:1596:284;;;;;;;;;1740:46:42;;;;1645:152;;;;1898:1596:284;;;;;;;;;;;;;:::i;:::-;;3211:41;;;:::i;:::-;1898:1596;;;;;;;;3205:23:42;;;3201:60;;1898:1596:284;;;3275:25:42;;;;3271:146;;1898:1596:284;3271:146:42;1898:1596:284;;;;;;;;3361:45:42;1898:1596:284;3361:45:42;;1898:1596:284;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1898:1596:284;3211:41;17093:5:280;3211:41:284;;;;:::i;:::-;17093:5:280;;;:::i;:::-;376:58:354;;17109:96:280;;1898:1596:284;;;;;;;;17109:96:280;17145:49;1898:1596:284;;;;;;:::i;:::-;17145:49:280;;;:::i;:::-;17109:96;;;;;;;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3211:41;;;:::i;:::-;1898:1596;;;;;4503:26:42;;;4499:64;;1283:19:278;1898:1596:284;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;27705:19:280;1898:1596:284;-1:-1:-1;1898:1596:284;27576:12:280;1898:1596:284;;;;-1:-1:-1;1898:1596:284;27576:28:280;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3211:41;;:::i;:::-;5148:19:42;1898:1596:284;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1898:1596:284;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;500:10:59;1898:1596:284;1880:140:41;;1898:1596:284;1880:140:41;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1898:1596:284;;;;1973:36:41;;;;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2404:19:279;;2400:60;;2474:15;;:26;2470:67;;1898:1596:284;2653:23:279;1898:1596:284;2653:23:279;1898:1596:284;2653:23:279;1898:1596:284;;;;;;;;;;;;;;;;;;;2602:87:279;;;;1898:1596:284;1021:95:279;1898:1596:284;;1021:95:279;1898:1596:284;1021:95:279;;1898:1596:284;;;;;1021:95:279;;1898:1596:284;1021:95:279;;;;1898:1596:284;;1021:95:279;;1898:1596:284;;1021:95:279;;1898:1596:284;;2602:87:279;;;1898:1596:284;2602:87:279;;:::i;:::-;1898:1596:284;2592:98:279;;2758:18;;:::i;:::-;1898:1596:284;;;2729:60:279;;;;1021:95;;;;;;;1898:1596:284;1021:95:279;;;1898:1596:284;1021:95:279;2729:60;;;;;;:::i;:::-;1898:1596:284;2719:71:279;;1898:1596:284;;;;;;1021:95:279;;;1898:1596:284;;;;1021:95:279;;1898:1596:284;;;;1021:95:279;;1898:1596:284;2821:24:279;;;1898:1596:284;2821:24:279;;;;;1898:1596:284;;2821:24:279;1898:1596:284;2863:15:279;2859:57;;2982:5;27705:19:280;1898:1596:284;2982:5:279;:::i;:::-;1898:1596:284;2859:57:279;2887:29;1898:1596:284;2887:29:279;1898:1596:284;;2887:29:279;2821:24;1898:1596:284;;;;;;;;;2470:67:279;2509:28;;1898:1596:284;2509:28:279;1898:1596:284;;;;2509:28:279;2400:60;2432:28;1898:1596:284;2432:28:279;1898:1596:284;;2432:28:279;1898:1596:284;;;;;;;:::i;:::-;5148:19:42;;;;;;1898:1596:284;;;3211:41;;:::i;:::-;1898:1596;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1898:1596:284;3852:94:192;;1898:1596:284;3972:10:192;;;;;;1898:1596:284;3984:3:192;1898:1596:284;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1898:1596:284;;;;4058:76:192;;4108:25;1898:1596:284;4058:76:192;;1898:1596:284;4058:76:192;;;;;;;;;;;;1898:1596:284;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1898:1596:284;4239:12:192;;;;;;:::i;:::-;1898:1596:284;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1898:1596:284;4239:70:192;;;;;;;1898:1596:284;;;;;;;4239:70:192;;;;;1898:1596:284;4239:70:192;;4277:4;1898:1596:284;4239:70:192;;1898:1596:284;;4058:76:192;1898:1596:284;;;;;;;4239:70:192;;;;;;;1898:1596:284;4239:70:192;;;3984:3;;1898:1596:284;3961:9:192;;4239:70;1898:1596:284;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1898:1596:284;4161:50:192;1898:1596:284;;4058:76:192;1898:1596:284;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1898:1596:284;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;27705:19:280;;;1898:1596:284;3211:41;9818:5:280;3211:41:284;;;;;:::i;:::-;1898:1596;;;;;;;9707:14:280;9703:85;;9818:5;:::i;:::-;376:58:354;;18723:98:280;;1898:1596:284;;;;;;;18723:98:280;18759:51;1898:1596:284;;;;;;:::i;:::-;18759:51:280;;:::i;:::-;18723:98;;;;;;;;9703:85;9771:5;;;;;;:::i;:::-;9818;:::i;1898:1596:284:-;;;;;;;;;;;1036:5:242;1898:1596:284;;:::i;:::-;;;;;3211:41;;:::i;:::-;1036:5:242;;:::i;1898:1596:284:-;;;;;;;;;;;1788:15:242;1898:1596:284;;:::i;:::-;;;;;3211:41;;:::i;:::-;1788:15:242;;:::i;1898:1596:284:-;;;;;;;;;;;;;3091:13:277;1898:1596:284;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;;-1:-1:-1;1898:1596:284;500:10:59;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3211:41;;:::i;:::-;1898:1596;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;500:10:59;1898:1596:284;3741:25:41;3737:66;;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1898:1596:284;;;;2455:33:41;1898:1596:284;3737:66:41;1898:1596:284;3775:28:41;;;1898:1596:284;3775:28:41;1898:1596:284;;;;;;;3775:28:41;1898:1596:284;;;;875:6:243;1898:1596:284;;;:::i;:::-;27705:19:280;;;;1898:1596:284;3211:41;;:::i;:::-;875:6:243;;:::i;1898:1596:284:-;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;;24144:5:280;1898:1596:284;;:::i;:::-;;;27705:19:280;1898:1596:284;3211:41;;:::i;:::-;1898:1596;;;;;;;24041:14:280;24037:85;;1898:1596:284;24144:5:280;;;:::i;24037:85::-;24105:5;;;;;:::i;:::-;24037:85;;;;1898:1596:284;;;;;;;:::i;:::-;5148:19:42;;;;1898:1596:284;;3211:41;;;:::i;:::-;1898:1596;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1898:1596:284;2776:90:192;;1898:1596:284;2892:10:192;;;;;;1898:1596:284;2904:3:192;2923:9;;;;;:::i;:::-;1898:1596:284;;;;;;;;;;;1328:43:8;2946:11:192;;;2959:10;2946:11;;;;;;;;:::i;:::-;2959:10;;;:::i;:::-;1898:1596:284;;;1328:43:8;1898:1596:284;1328:43:8;;;;1898:1596:284;1328:43:8;;1898:1596:284;1328:43:8;;;1898:1596:284;1328:43:8;1898:1596:284;;;1328:43:8;;;;;;;:::i;:::-;8507:421;;;;;;;1898:1596:284;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1898:1596:284;;2881:9:192;;8938:146:8;9033:40;1898:1596:284;9033:40:8;1898:1596:284;;1328:43:8;1898:1596:284;9033:40:8;8942:68;1898:1596:284;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1898:1596:284;;;;;;;;;;;;;:::i;:::-;;;27007:17:280;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1488:12:247;1898:1596:284;3211:41;;:::i;:::-;1488:12:247;;:::i;:::-;1898:1596:284;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1511:51:247;;;;;;:::i;1898:1596:284:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;1170:6:243;1898:1596:284;;;;;;:::i;:::-;27705:19:280;;;1898:1596:284;3211:41;;:::i;:::-;1170:6:243;;:::i;1898:1596:284:-;;;;;;;;;;;765:5:244;1898:1596:284;;;3211:41;;:::i;:::-;765:5:244;;:::i;1898:1596:284:-;;;;;;;;;;;;;:::i;:::-;;;1129:12:247;1898:1596:284;3211:41;;:::i;1129:12:247:-;1898:1596:284;;;;19546:16:280;;;19542:53;;19609:10;19605:370;;1898:1596:284;;19989:31:280;1898:1596:284;;;;;;;;19989:31:280;1898:1596:284;19605:370:280;19652:8;1898:1596:284;;;;19758:19:280;;;;;19754:71;;-1:-1:-1;19652:8:280;1898:1596:284;;;;;;;;;;;;;;;;;;;19989:31:280;19605:370;;19754:71;19786:39;;;1898:1596:284;19786:39:280;1898:1596:284;;;;;;19786:39:280;19542:53;19571:24;1898:1596:284;19571:24:280;1898:1596:284;;19571:24:280;1898:1596:284;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;3211:41;;:::i;:::-;1898:1596;;;;5455:21:280;;;5451:67;;1898:1596:284;;;-1:-1:-1;1898:1596:284;5555:12:280;1898:1596:284;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;5597:10:280;;5593:366;;1898:1596:284;;;5973:42:280;1898:1596:284;;;;;;;;;5973:42:280;;1898:1596:284;;;;;;;5593:366:280;1898:1596:284;;;5720:32:280;;;;;5716:108;;5842:19;;;1898:1596:284;;5973:42:280;5842:19;1898:1596:284;;;-1:-1:-1;1898:1596:284;5555:12:280;1898:1596:284;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;5593:366:280;;;;5716:108;1898:1596:284;;5761:63:280;;;1898:1596:284;;;;;5761:63:280;;1898:1596:284;;;;;;;;;;;;;;;;;;;5761:63:280;5451:67;1898:1596:284;5485:33:280;;1898:1596:284;5485:33:280;1898:1596:284;;;;;5485:33:280;1898:1596:284;;;;;;;;;;;;1284:37:248;;:::i;:::-;1898:1596:284;;;;;;;;;;;;;;;;;;;3732:15:277;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3211:41;;:::i;:::-;5148:19:42;1898:1596:284;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1898:1596:284;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;500:10:59;1898:1596:284;1254:25:41;1250:140;;1898:1596:284;1250:140:41;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1898:1596:284;;;;1343:36:41;1898:1596:284;;;;;;;;;;;;;;;;941:19:75;1898:1596:284;;;;;;;;;;;;;;;9818:5:280;1898:1596:284;;:::i;:::-;;;:::i;:::-;;3211:41;;;:::i;:::-;1898:1596;;;;;;;;;;;9707:14:280;9703:85;;1898:1596:284;9818:5:280;;;:::i;9703:85::-;9771:5;;;;;:::i;:::-;9703:85;;;;1898:1596:284;;;;1232:6:244;1898:1596:284;;;:::i;:::-;27705:19:280;;;;1898:1596:284;3211:41;;:::i;:::-;1232:6:244;;:::i;1898:1596:284:-;;;;;;;;;;;;26654:8:280;1898:1596:284;;;;;;;;;;;;;;;;;;826:5:242;1898:1596:284;;:::i;:::-;;;;;3211:41;;:::i;:::-;826:5:242;;:::i;1898:1596:284:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1898:1596:284;1793:19:59;1898:1596:284;635:65:55;:::i;1898:1596:284:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1002:301:75:-;1898:1596:284;1146:19:75;1898:1596:284;1146:53:75;;;1142:96;;1898:1596:284;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1898:1596:284;1215:12:75;:::o;1898:1596:284:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1359:340:59:-;;1898:1596:284;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1898:1596:284;500:10:59;;;1898:1596:284;500:10:59;1898:1596:284;500:10:59;;1898:1596:284;1359:340:59;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;1898:1596:284:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:267:280;;;1898:1596:284;;4533:21:280;;;4529:67;;1898:1596:284;4657:31:280;4606:19;:12;1898:1596:284;4606:19:280;1898:1596:284;;;-1:-1:-1;1898:1596:284;4606:12:280;1898:1596:284;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;;;;4657:31:280;;4428:267::o;4529:67::-;1898:1596:284;4563:33:280;;4552:1;4563:33;1898:1596:284;4563:33:280;1898:1596:284;;4552:1:280;4563:33;1898:1596:284;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;25152:1242:280:-;;;;25326:23;;;25322:62;;25399:11;;25395:24;;25409:1;25462:9;25409:1;25473:10;;;;;;26221:15;;;;;;;26217:171;;25152:1242;;:::o;26217:171::-;26280:8;;1898:1596:284;;;;;;25152:1242:280:o;25485:3::-;25519:9;;;;;;:::i;:::-;25558;;;;;:::i;:::-;1898:1596:284;;;;;;;;;;25586:14:280;;25582:93;;25485:3;25693:10;;;25689:455;;25485:3;1898:1596:284;;;26163:33:280;1898:1596:284;25409:1:280;1898:1596:284;;;;;;26163:33:280;1898:1596:284;25462:9:280;;25689:455;25741:16;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;;;;;;;25869:21:280;;;;;25865:80;;-1:-1:-1;25409:1:280;1898:1596:284;;;;;;;;;;;;;;25689:455:280;;25865:80;25899:46;;;;25409:1;25899:46;;1898:1596:284;;;;;;25409:1:280;25899:46;25582:93;25654:5;;;;:::i;:::-;25582:93;;;;;25395:24;25412:7;;;;;;:::o;4317:545:279:-;1898:1596:284;;;:::i;:::-;;;;;;4669:54:279;1898:1596:284;;;4520:321:279;;1898:1596:284;4552:95:279;1898:1596:284;;;;;;4745:14:279;1898:1596:284;;;;4412:53:279;1898:1596:284;;;;4818:4:279;1898:1596:284;;;;;4520:321:279;;;;;;:::i;:::-;1898:1596:284;4493:362:279;;4317:545;:::o;3640:170:41:-;1898:1596:284;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;500:10:59;1898:1596:284;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1898:1596:284;3775:28:41;;-1:-1:-1;3775:28:41;1898:1596:284;3775:28:41;1898:1596:284;;;;;-1:-1:-1;3775:28:41;22659:524:280;22743:10;22739:389;;22659:524;1898:1596:284;;23143:33:280;1898:1596:284;;22752:1:280;1898:1596:284;;;;;;;23143:33:280;;22659:524::o;22739:389::-;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;22903:21:280;;;;;22899:80;;-1:-1:-1;1898:1596:284;;;22752:1:280;1898:1596:284;;;;;;;;;;;23044:8:280;;1898:1596:284;;;;;;;23143:33:280;22739:389;;22899:80;22933:46;;1898:1596:284;22933:46:280;;22752:1;22933:46;1898:1596:284;22933:46:280;1898:1596:284;;;;;;22752:1:280;22933:46;13849:1950;;;;;;;;14049:23;;;14045:62;;14122:11;;14118:24;;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;14197:18:280;14132:1;14225:30;14132:1;14270:9;14132:1;14281:10;;;;;;1898:1596:284;;;;;;;;;;;;;15707:14:280;15703:90;;14265:1428;13849:1950;;;;:::o;15703:90::-;15771:10;;;:::i;:::-;15703:90;;;;;;14293:3;1898:1596:284;14325:13:280;;;;;;:::i;:::-;1898:1596:284;14356:16:280;;14352:61;;14444:9;;;;;:::i;:::-;1898:1596:284;14472:10:280;14468:656;;14293:3;1898:1596:284;;;15143:25:280;1898:1596:284;;;;;;;;;;;15143:25:280;15187:15;;;:55;;;14293:3;15183:500;;14293:3;;1898:1596:284;;14270:9:280;;15183:500;1898:1596:284;;;15437:21:280;;;;;15433:85;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;15183:500:280;;15433:85;15467:51;;;;14132:1;15467:51;;1898:1596:284;;;;;;14132:1:280;15467:51;15187:55;15206:36;;;;;15187:55;;14468:656;1898:1596:284;;;;14602:27:280;;;;14598:74;;1898:1596:284;;;;;14746:10:280;;;;;14784:14;;1898:1596:284;;14784:14:280;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;14742:350:280;14468:656;;;;;14742:350;14866:15;;;;;;;14862:74;;1898:1596:284;;;;;;14742:350:280;;;14862:74;14890:46;;;;14132:1;14890:46;;1898:1596:284;;;;;;14132:1:280;14890:46;14598:74;14638:34;14132:1;14638:34;;14132:1;14638:34;14352:61;1898:1596:284;14381:32:280;;14132:1;14381:32;1898:1596:284;14381:32:280;1898:1596:284;;14132:1:280;14381:32;14118:24;14135:7;;;;;;;:::o;1898:1596:284:-;;;;;;;;;;;;;;;:::o;20857:1233:280:-;;;1898:1596:284;;;;;21015:23:280;;21011:62;;21088:11;;21084:24;;-1:-1:-1;21151:9:280;-1:-1:-1;21162:10:280;;;;;;21786:15;;;;;21782:302;;20857:1233;;:::o;21782:302::-;21862:8;;1898:1596:284;;;;;;21949:19:280;;;;;21945:76;;1898:1596:284;;;20857:1233:280:o;21945:76::-;21977:44;-1:-1:-1;21977:44:280;;1898:1596:284;;;;-1:-1:-1;21977:44:280;21174:3;1898:1596:284;21206:13:280;;;;:::i;:::-;1898:1596:284;;21237:16:280;;21233:53;;21317:9;;;;:::i;:::-;1898:1596:284;21344:10:280;21340:372;;21174:3;1898:1596:284;-1:-1:-1;21730:31:280;1898:1596:284;;;;;;;;;21730:31:280;1898:1596:284;21151:9:280;;21340:372;1898:1596:284;;;;;;21474:27:280;;;;21470:70;;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;;;;21562:26:280;;21340:372;;1898:1596:284;21340:372:280;;21470:70;21510:30;-1:-1:-1;21510:30:280;;-1:-1:-1;21510:30:280;10853:1796;;;;;;11033:23;;;11029:62;;11106:11;;11102:24;;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;11181:18:280;11116:1;11209:30;11116:1;11254:9;11116:1;11265:10;;;;;;12175:15;;;;;;;;:55;;;11249:912;12171:472;;11249:912;10853:1796;;;;;:::o;12171:472::-;1898:1596:284;;;12409:21:280;;;;;12405:85;;12508:16;;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;;;;12171:472:280;;;;;;;12405:85;1898:1596:284;12439:51:280;;11116:1;12439:51;1898:1596:284;12439:51:280;1898:1596:284;;;;;;11116:1:280;12439:51;12175:55;12194:36;;;;;12175:55;;11277:3;1898:1596:284;11309:13:280;;;;;;:::i;:::-;1898:1596:284;11340:16:280;;11336:61;;11428:9;;;;;:::i;:::-;1898:1596:284;11455:10:280;11451:656;;11277:3;1898:1596:284;;;;;;;;;12125:25:280;1898:1596:284;;;;12125:25:280;;1898:1596:284;11254:9:280;;11451:656;1898:1596:284;;;;11585:27:280;;;;11581:74;;1898:1596:284;;;;11729:10:280;;;;;11767:14;;1898:1596:284;11767:14:280;;1898:1596:284;-1:-1:-1;1898:1596:284;;;;;;;;;;;;;11725:350:280;11451:656;;;;;;11725:350;11849:15;;;;;11845:74;;1898:1596:284;;;;;;;11725:350:280;;;11845:74;11873:46;;;;11116:1;11873:46;;1898:1596:284;;;;;;11116:1:280;11873:46;11336:61;1898:1596:284;11365:32:280;;11116:1;11365:32;1898:1596:284;11365:32:280;1898:1596:284;;11116:1:280;11365:32;6693:851;;;;1898:1596:284;;;6808:21:280;;;6804:67;;6908:12;;:19;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;6951:37:280;6971:17;6951:37;;;:51;;;6693:851;6947:534;;6693:851;1898:1596:284;;;;;;7495:42:280;1898:1596:284;;;;;;;7495:42:280;;6693:851::o;6947:534::-;1898:1596:284;;;7238:32:280;;;;;7234:112;;7364:19;;;1898:1596:284;7495:42:280;7364:19;1898:1596:284;7364:19:280;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;6947:534:280;;;7234:112;1898:1596:284;;7279:67:280;;;1898:1596:284;;;;7279:67:280;;;1898:1596:284;;;;;;;;;;;;;;;;;;;5761:63:280;6951:51;6992:10;;;;6951:51;;6804:67;1898:1596:284;6838:33:280;;6827:1;6838:33;1898:1596:284;6838:33:280;1898:1596:284;;6827:1:280;6838:33;8105:628;;;1898:1596:284;;8205:16:280;;;8201:61;;8277:10;8273:413;;8105:628;1898:1596:284;;;8701:25:280;1898:1596:284;;;;;;;8701:25:280;;8105:628::o;8273:413::-;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;;;8437:21:280;;;;;8433:80;;1898:1596:284;;;;;;;;8701:25:280;1898:1596:284;;8535:10:280;8531:131;;8273:413;;;;;;;;8531:131;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;;-1:-1:-1;1898:1596:284;;;-1:-1:-1;1898:1596:284;;;;-1:-1:-1;1898:1596:284;;;;;;;8531:131:280;;;;8201:61;1898:1596:284;8230:32:280;;8219:1;8230:32;1898:1596:284;8230:32:280;1898:1596:284;;8219:1:280;8230:32;1898:1596:284;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1898:1596:284;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1898:1596:284;1029:19:76;1898:1596:284;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1898:1596:284;;;;;;1676:74:76;;;;1898:1596:284;1676:74:76;;;;;;1898:1596:284;1327:10:76;1898:1596:284;;;;1744:4:76;1898:1596:284;;;;1676:74:76;;;;;;;1898:1596:284;1676:74:76;;;1630:120;;;;;1676:74;;;;1898:1596:284;1676:74:76;1898:1596:284;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;28229:252:280;1898:1596:284;;28229:252:280;;;;1898:1596:284;28229:252:280;1898:1596:284;;;;;28357:61:280;;;;;1898:1596:284;28357:61:280;;1898:1596:284;28357:61:280;;;1898:1596:284;;;;;;;;;;;;;;;;;;;;:::i;:::-;28357:61:280;;-1:-1:-1;28357:61:280;;;;;;;;-1:-1:-1;28357:61:280;;;28229:252;1898:1596:284;;;;;28357:79:280;28353:121;;28229:252;:::o;28353:121::-;28445:29;-1:-1:-1;28445:29:280;28357:61;1898:1596:284;;-1:-1:-1;28445:29:280;28357:61;1898:1596:284;28357:61:280;;1898:1596:284;28357:61:280;;;;;;1898:1596:284;28357:61:280;;;:::i;:::-;;;1898:1596:284;;;;;;;;;;;;;28357:61:280;1898:1596:284;28357:61:280;;1898:1596:284;;;;;;;28357:61:280;;;-1:-1:-1;28357:61:280;"},"gasEstimates":{"creation":{"codeDepositCost":"3389000","executionCost":"infinite","totalCost":"infinite"},"external":{"DOMAIN_SEPARATOR()":"infinite","MINTER_ROLE()":"826","allowance(address,address)":"3233","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address[],uint256[])":"infinite","batchMint(address[],uint256[])":"infinite","batchTransfer(address[],uint256[])":"infinite","batchTransferFrom(address,address[],uint256[])":"infinite","burn(uint256)":"infinite","burnFrom(address,uint256)":"infinite","decimals()":"2429","decreaseAllowance(address,uint256)":"infinite","forwarderRegistry()":"infinite","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2983","increaseAllowance(address,uint256)":"infinite","init(string,string,uint8)":"infinite","isTrustedForwarder(address)":"infinite","mint(address,uint256)":"infinite","name()":"infinite","nonces(address)":"2817","owner()":"2759","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"infinite","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","safeTransfer(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setTokenURI(string)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI()":"infinite","totalSupply()":"2313","transfer(address,uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","MINTER_ROLE()":"d5391393","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address[],uint256[])":"1b9a7529","batchMint(address[],uint256[])":"68573107","batchTransfer(address[],uint256[])":"88d695b2","batchTransferFrom(address,address[],uint256[])":"4885b254","burn(uint256)":"42966c68","burnFrom(address,uint256)":"79cc6790","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","forwarderRegistry()":"2b4c9f16","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","increaseAllowance(address,uint256)":"39509351","init(string,string,uint8)":"f57b0182","isTrustedForwarder(address)":"572b6c05","mint(address,uint256)":"40c10f19","name()":"06fdde03","nonces(address)":"7ecebe00","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeTransfer(address,uint256,bytes)":"eb795549","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setTokenURI(string)":"e0df5b6f","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI()":"3c130d90","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"ERC20AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20ApprovalToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchMintValuesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20BatchTransferValuesOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC20PermitExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitFromAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC20PermitInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ERC20SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ERC20TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"increment\":\"The allowance increase.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20ApprovalToAddressZero(address)\":[{\"params\":{\"owner\":\"The owner of the tokens.\"}}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"params\":{\"allowance\":\"The current allowance.\",\"decrement\":\"The allowance decrease.\",\"owner\":\"The owner of the tokens.\",\"spender\":\"The spender of the tokens.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance.\",\"owner\":\"The owner of the tokens.\",\"value\":\"The amount of tokens being transferred.\"}}],\"ERC20PermitExpired(uint256)\":[{\"params\":{\"deadline\":\"The permit deadline.\"}}],\"ERC20SafeTransferRejected(address)\":[{\"params\":{\"recipient\":\"The recipient contract.\"}}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"params\":{\"supply\":\"The current supply.\",\"value\":\"The amount of tokens being minted.\"}}],\"ERC20TransferToAddressZero(address)\":[{\"params\":{\"owner\":\"The account from which the tokens are transferred.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"The account granting an allowance to `spender`.\",\"spender\":\"The account being granted an allowance from `owner`.\",\"value\":\"The allowance amount being granted.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The account where the transferred tokens are withdrawn from.\",\"to\":\"The account where the transferred tokens are deposited to.\",\"value\":\"The amount of tokens being transferred.\"}}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:  keccak256(      abi.encode(          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),          keccak256(bytes(name)),          keccak256(bytes(version)),          chainId,          address(this)))  where   - `name` (string) is the ERC-20 token name.   - `version` (string) refers to the ERC-20 token contract version.   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.   - `verifyingContract` (address) is the ERC-20 token contract address.\",\"returns\":{\"_0\":\"The EIP-712 encoded hash struct of the domain-specific information for permits.\"}},\"allowance(address,address)\":{\"params\":{\"owner\":\"The account that has granted an allowance to `spender`.\",\"spender\":\"The account that was granted an allowance by `owner`.\"},\"returns\":{\"value\":\"The amount which `spender` is allowed to spend on behalf of `owner`.\"}},\"approve(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Emits an {Approval} event.\",\"params\":{\"spender\":\"The account being granted the allowance by the message caller.\",\"value\":\"The allowance amount to grant.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"balanceOf(address)\":{\"params\":{\"owner\":\"The account whose balance will be returned.\"},\"returns\":{\"balance\":\"The account balance.\"}},\"batchBurnFrom(address[],uint256[])\":{\"details\":\"Reverts if `owners` and `values` have different lengths.Reverts if an `owner` does not have at least the corresponding `value` of balance.Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\",\"params\":{\"owners\":\"The list of accounts to burn the tokens from.\",\"values\":\"The list of amounts of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchMint(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"The list of accounts to mint the tokens to.\",\"values\":\"The list of amounts of tokens to mint to each of `recipients`.\"}},\"batchTransfer(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if the sender does not have at least `sum(values)` of balance.Emits an {IERC20-Transfer} event for each transfer.\",\"params\":{\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"batchTransferFrom(address,address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `values` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if `from` does not have at least `sum(values)` of balance.Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.Emits an {IERC20-Transfer} event for each transfer.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to be transferred.\",\"recipients\":\"The list of accounts to transfer the tokens to.\",\"values\":\"The list of amounts of tokens to transfer to each of `recipients`.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burn(uint256)\":{\"details\":\"Reverts if the sender does not have at least `value` of balance.Emits an {IERC20-Transfer} event with `to` set to the zero address.\",\"params\":{\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits an {IERC20-Transfer} event with `to` set to the zero address.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account to burn the tokens from.\",\"value\":\"The amount of tokens to burn.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"decimals()\":{\"details\":\"Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\",\"returns\":{\"_0\":\"The number of decimals used to display the balances.\"}},\"decreaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender` does not have at least `value` of allowance by the sender.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being decreased.\",\"value\":\"The allowance amount decrease.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Reverts if `spender` is the zero address.Reverts if `spender`'s allowance by the sender overflows.Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\",\"params\":{\"spender\":\"The account whose allowance is being increased.\",\"value\":\"The allowance amount increase.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"The account to mint the tokens to.\",\"value\":\"The amount of tokens to mint.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"nonces(address)\":{\"params\":{\"owner\":\"The account to check the nonce of.\"},\"returns\":{\"_0\":\"The current permit nonce of `owner`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Reverts if `owner` is the zero address.Reverts if the current blocktime is greather than `deadline`.Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.Emits an {IERC20-Approval} event.\",\"params\":{\"deadline\":\"The deadline from which the permit signature is no longer valid.\",\"owner\":\"The token owner granting the allowance to `spender`.\",\"r\":\"Permit signature r parameter.\",\"s\":\"Permit signature s parameter.\",\"spender\":\"The token spender being granted the allowance by `owner`.\",\"v\":\"Permit signature v parameter\",\"value\":\"The allowance amount to grant.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeTransfer(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.Emits an {IERC20-Transfer} event.Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"data\":\"Optional additional data with no specified format, to be passed to the receiver contract.\",\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"_0\":\"Whether the operation succeeded.\"}},\"setTokenURI(string)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"uri\":\"The token URI.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"tokenURI()\":{\"returns\":{\"_0\":\"The token metadata URI.\"}},\"totalSupply()\":{\"returns\":{\"supply\":\"The total token supply.\"}},\"transfer(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if the sender does not have at least `value` of balance.Emits a {Transfer} event.\",\"params\":{\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `from` does not have at least `value` of balance.Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.Emits a {Transfer} event.Optionally emits an {Approval} event if the sender is not `from` (non-standard).\",\"params\":{\"from\":\"The account which owns the tokens to transfer.\",\"to\":\"The account to transfer the tokens to.\",\"value\":\"The amount of tokens to transfer.\"},\"returns\":{\"result\":\"Whether the operation succeeded.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC20AllowanceOverflow(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance increase creates an overflow.\"}],\"ERC20ApprovalToAddressZero(address)\":[{\"notice\":\"Thrown when setting an allowance to the the zero address.\"}],\"ERC20BatchMintValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch mint operation.\"}],\"ERC20BatchTransferValuesOverflow()\":[{\"notice\":\"Thrown when the `values` array sum overflows on a batch transfer operation.\"}],\"ERC20InsufficientAllowance(address,address,uint256,uint256)\":[{\"notice\":\"Thrown when the allowance decreases below the current alowance set.\"}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"notice\":\"Thrown when transferring an amount of tokens greater than the current balance.\"}],\"ERC20MintToAddressZero()\":[{\"notice\":\"Thrown when the minting tokens to the zero address.\"}],\"ERC20PermitExpired(uint256)\":[{\"notice\":\"Thrown when the permit is expired.\"}],\"ERC20PermitFromAddressZero()\":[{\"notice\":\"Thrown when the permit is from the zero address.\"}],\"ERC20PermitInvalidSignature()\":[{\"notice\":\"Thrown when the permit signature cannot be verified.\"}],\"ERC20SafeTransferRejected(address)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC20TotalSupplyOverflow(uint256,uint256)\":[{\"notice\":\"Thrown when the minting tokens overflows the supply.\"}],\"ERC20TransferToAddressZero(address)\":[{\"notice\":\"Thrown when transferring tokens to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when an approval is set.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when tokens are transferred, including zero value transfers.\"}},\"kind\":\"user\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"notice\":\"Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\"},\"allowance(address,address)\":{\"notice\":\"Gets the amount that an account is allowed to spend on behalf of another.\"},\"approve(address,uint256)\":{\"notice\":\"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\"},\"balanceOf(address)\":{\"notice\":\"Gets an account balance.\"},\"batchBurnFrom(address[],uint256[])\":{\"notice\":\"Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\"},\"batchMint(address[],uint256[])\":{\"notice\":\"Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\"},\"batchTransfer(address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from the sender.\"},\"batchTransferFrom(address,address[],uint256[])\":{\"notice\":\"Transfers multiple amounts of tokens to multiple recipients from a specified address.\"},\"burn(uint256)\":{\"notice\":\"Burns an amount of tokens from the sender, decreasing the total supply.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns an amount of tokens from a specified address, decreasing the total supply.\"},\"decimals()\":{\"notice\":\"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"mint(address,uint256)\":{\"notice\":\"Mints an amount of tokens to a recipient, increasing the total supply.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"nonces(address)\":{\"notice\":\"Gets the current permit nonce of an account.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeTransfer(address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\"},\"setTokenURI(string)\":{\"notice\":\"Sets the token URI.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI()\":{\"notice\":\"Gets the token metadata URI.\"},\"totalSupply()\":{\"notice\":\"Gets the total token supply.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from the sender.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers an amount of tokens to a recipient from a specified address.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol\":\"ERC20MintBurnProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC20Base is IERC20, IERC20Allowance, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20\\n    function approve(address spender, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().approve(_msgSender(), spender, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transfer(address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transfer(_msgSender(), to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function transferFrom(address from, address to, uint256 value) external virtual returns (bool result) {\\n        ERC20Storage.layout().transferFrom(_msgSender(), from, to, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().increaseAllowance(_msgSender(), spender, addedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Allowance\\n    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool result) {\\n        ERC20Storage.layout().decreaseAllowance(_msgSender(), spender, subtractedValue);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function totalSupply() external view virtual returns (uint256 supply) {\\n        return ERC20Storage.layout().totalSupply();\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC20Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC20\\n    function allowance(address owner, address spender) public view virtual returns (uint256 value) {\\n        return ERC20Storage.layout().allowance(owner, spender);\\n    }\\n}\\n\",\"keccak256\":\"0xff3965c4bffa9846ffbb5100614a9c643dcc9ac903b8796e42a1c6627a783841\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BatchTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Batch Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BatchTransfersBase is IERC20BatchTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransfer(_msgSender(), recipients, values);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20BatchTransfers\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchTransferFrom(_msgSender(), from, recipients, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x5caffd28e5aec5abd2f774925521b3280dcae534e586aaf4ac6eb6479d79bb30\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20BurnableBase is IERC20Burnable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burn(uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burn(_msgSender(), value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function burnFrom(address from, uint256 value) external virtual returns (bool) {\\n        ERC20Storage.layout().burnFrom(_msgSender(), from, value);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20Burnable\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external virtual returns (bool) {\\n        ERC20Storage.layout().batchBurnFrom(_msgSender(), owners, values);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x17d155e68ddfc2455c7601ec22d97677c42612275107cc0689aca710a0995218\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20DetailedBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../libraries/ERC20DetailedStorage.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Detailed (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20DetailedBase is IERC20Detailed {\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    /// @inheritdoc IERC20Detailed\\n    function name() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().name();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function symbol() external view virtual returns (string memory) {\\n        return ERC20DetailedStorage.layout().symbol();\\n    }\\n\\n    /// @inheritdoc IERC20Detailed\\n    function decimals() external view virtual returns (uint8) {\\n        return ERC20DetailedStorage.layout().decimals();\\n    }\\n}\\n\",\"keccak256\":\"0xc20a0ec83b17bd6290bd01bc47402ace2043551eae536d3d10b8f8e900022b47\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../libraries/ERC20MetadataStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC20MetadataBase is IERC20Metadata, Context {\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Sets the token URI.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param uri The token URI.\\n    function setTokenURI(string calldata uri) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC20MetadataStorage.layout().setTokenURI(uri);\\n    }\\n\\n    /// @inheritdoc IERC20Metadata\\n    function tokenURI() external view virtual returns (string memory) {\\n        return ERC20MetadataStorage.layout().tokenURI();\\n    }\\n}\\n\",\"keccak256\":\"0x325ac5aed091ecc888d903a8ea22654ef5ae155932893e34710aa5c1a471960c\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC20MintableBase is IERC20Mintable, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 value) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().mint(to, value);\\n    }\\n\\n    /// @inheritdoc IERC20Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC20Storage.layout().batchMint(recipients, values);\\n    }\\n}\\n\",\"keccak256\":\"0x645503d2aea28c094b02aebd16b71b218918ed02b8780364554bdb5da549bf38\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20PermitBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../libraries/ERC20PermitStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Permit (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\n/// @dev Note: This contract requires ERC20Detailed.\\nabstract contract ERC20PermitBase is IERC20Permit, Context {\\n    using ERC20PermitStorage for ERC20PermitStorage.Layout;\\n\\n    /// @inheritdoc IERC20Permit\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {\\n        ERC20PermitStorage.layout().permit(owner, spender, value, deadline, v, r, s);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    function nonces(address owner) external view virtual returns (uint256) {\\n        return ERC20PermitStorage.layout().nonces(owner);\\n    }\\n\\n    /// @inheritdoc IERC20Permit\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n        return ERC20PermitStorage.DOMAIN_SEPARATOR();\\n    }\\n}\\n\",\"keccak256\":\"0xcb6f038849099a295d39333629b55f0821a641814f2e2d6eaeeb9eb4b98fb0e4\",\"license\":\"MIT\"},\"contracts/token/ERC20/base/ERC20SafeTransfersBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {ERC20Storage} from \\\"./../libraries/ERC20Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, optional extension: Safe Transfers (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC20 (Fungible Token Standard).\\nabstract contract ERC20SafeTransfersBase is IERC20SafeTransfers, Context {\\n    using ERC20Storage for ERC20Storage.Layout;\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransfer(_msgSender(), to, value, data);\\n        return true;\\n    }\\n\\n    /// @inheritdoc IERC20SafeTransfers\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external virtual returns (bool) {\\n        ERC20Storage.layout().safeTransferFrom(_msgSender(), from, to, value, data);\\n        return true;\\n    }\\n}\\n\",\"keccak256\":\"0x8fdef2b01358babb39500619b7ac1a5d0982b12f765177e2cfce10c0f922bcfb\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20AllowanceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the allowance increase creates an overflow.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param increment The allowance increase.\\nerror ERC20AllowanceOverflow(address owner, address spender, uint256 allowance, uint256 increment);\\n\",\"keccak256\":\"0xb1a9fcf61844e5d1b903d9bcc3e2f5b0fbb496d3ad2d148e3d091c6e39e4f8ba\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20BatchTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch transfer operation.\\nerror ERC20BatchTransferValuesOverflow();\\n\",\"keccak256\":\"0x43d6eb71931815b6a9747571b5cf5d67f225c191dbfa43aec59b0c011cbf57bc\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting an allowance to the the zero address.\\n/// @param owner The owner of the tokens.\\nerror ERC20ApprovalToAddressZero(address owner);\\n\\n/// @notice Thrown when the allowance decreases below the current alowance set.\\n/// @param owner The owner of the tokens.\\n/// @param spender The spender of the tokens.\\n/// @param allowance The current allowance.\\n/// @param decrement The allowance decrease.\\nerror ERC20InsufficientAllowance(address owner, address spender, uint256 allowance, uint256 decrement);\\n\\n/// @notice Thrown when transferring tokens to the zero address.\\n/// @param owner The account from which the tokens are transferred.\\nerror ERC20TransferToAddressZero(address owner);\\n\\n/// @notice Thrown when transferring an amount of tokens greater than the current balance.\\n/// @param owner The owner of the tokens.\\n/// @param balance The current balance.\\n/// @param value The amount of tokens being transferred.\\nerror ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);\\n\",\"keccak256\":\"0x999c9373a5e77afb2ef5f6b14091c0553d471615b3df6715c2d18649523a8e1f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the minting tokens to the zero address.\\nerror ERC20MintToAddressZero();\\n\\n/// @notice Thrown when the `values` array sum overflows on a batch mint operation.\\nerror ERC20BatchMintValuesOverflow();\\n\\n/// @notice Thrown when the minting tokens overflows the supply.\\n/// @param supply The current supply.\\n/// @param value The amount of tokens being minted.\\nerror ERC20TotalSupplyOverflow(uint256 supply, uint256 value);\\n\",\"keccak256\":\"0xe974e949678af1b3c5e1069cf13c188a6f91da6f186b0dc68d9f509b74dcc12f\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20PermitErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the permit is from the zero address.\\nerror ERC20PermitFromAddressZero();\\n\\n/// @notice Thrown when the permit is expired.\\n/// @param deadline The permit deadline.\\nerror ERC20PermitExpired(uint256 deadline);\\n\\n/// @notice Thrown when the permit signature cannot be verified.\\nerror ERC20PermitInvalidSignature();\\n\",\"keccak256\":\"0x88a4c6fcae77a51aebc4c5467e90ac6b74d81a1cb98a78a29d6b8e9199149302\",\"license\":\"MIT\"},\"contracts/token/ERC20/errors/ERC20SafeTransfersErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\nerror ERC20SafeTransferRejected(address recipient);\\n\",\"keccak256\":\"0x3697a5b5dde4f0b9f33276ad2d2ca32eb90a6f2e7e0a87ad901409b16b64bc33\",\"license\":\"MIT\"},\"contracts/token/ERC20/events/ERC20Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when tokens are transferred, including zero value transfers.\\n/// @param from The account where the transferred tokens are withdrawn from.\\n/// @param to The account where the transferred tokens are deposited to.\\n/// @param value The amount of tokens being transferred.\\nevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n/// @notice Emitted when an approval is set.\\n/// @param owner The account granting an allowance to `spender`.\\n/// @param spender The account being granted an allowance from `owner`.\\n/// @param value The allowance amount being granted.\\nevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\",\"keccak256\":\"0x2587f2dfe366416e8c12eb708f6179ab9bdb3474143aea6a179c6d78fe55733a\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: The ERC-165 identifier for this interface is 0x36372b07.\\ninterface IERC20 {\\n    /// @notice Sets the allowance to an account from the sender.\\n    /// @notice Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and\\n    ///  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce\\n    ///  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param spender The account being granted the allowance by the message caller.\\n    /// @param value The allowance amount to grant.\\n    /// @return result Whether the operation succeeded.\\n    function approve(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from the sender.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transfer(address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @return result Whether the operation succeeded.\\n    function transferFrom(address from, address to, uint256 value) external returns (bool result);\\n\\n    /// @notice Gets the total token supply.\\n    /// @return supply The total token supply.\\n    function totalSupply() external view returns (uint256 supply);\\n\\n    /// @notice Gets an account balance.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(address owner, address spender) external view returns (uint256 value);\\n}\\n\",\"keccak256\":\"0x9f854da07eee467cd5a7c0de93e930045dbbf21af42e6578a326e42fa2327653\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Allowance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Allowance.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d075186.\\ninterface IERC20Allowance {\\n    /// @notice Increases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender`'s allowance by the sender overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    /// @return result Whether the operation succeeded.\\n    function increaseAllowance(address spender, uint256 value) external returns (bool result);\\n\\n    /// @notice Decreases the allowance granted to an account by the sender.\\n    /// @notice This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems.\\n    /// @dev Reverts if `spender` is the zero address.\\n    /// @dev Reverts if `spender` does not have at least `value` of allowance by the sender.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by the sender.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    /// @return result Whether the operation succeeded.\\n    function decreaseAllowance(address spender, uint256 value) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x6a485ae380afce91a2d886dd514189a2d6703482ad0985c2792d083f42606bcd\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20BatchTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Batch Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xc05327e6.\\ninterface IERC20BatchTransfers {\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from the sender.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `sum(values)` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n\\n    /// @notice Transfers multiple amounts of tokens to multiple recipients from a specified address.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to be transferred.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    /// @return result Whether the operation succeeded.\\n    function batchTransferFrom(address from, address[] calldata recipients, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xb22eb2eceec220154b3aedbf2c92c3701f3c6e11dc019d7b7ecb1d8842e5d5f5\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3b5a0bf8.\\ninterface IERC20Burnable {\\n    /// @notice Burns an amount of tokens from the sender, decreasing the total supply.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burn(uint256 value) external returns (bool result);\\n\\n    /// @notice Burns an amount of tokens from a specified address, decreasing the total supply.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits an {IERC20-Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function burnFrom(address from, uint256 value) external returns (bool result);\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Reverts if `owners` and `values` have different lengths.\\n    /// @dev Reverts if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts if the sender is not an `owner` and does not have at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if the sender is not this `owner` (non-standard).\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    /// @return result Whether the operation succeeded.\\n    function batchBurnFrom(address[] calldata owners, uint256[] calldata values) external returns (bool result);\\n}\\n\",\"keccak256\":\"0xd518d34a24408178b0dad8e1964e8430b5a150b7cdf9837c8e788517202495b4\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Detailed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Detailed.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0xa219a025.\\ninterface IERC20Detailed {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals() external view returns (uint8 nbDecimals);\\n}\\n\",\"keccak256\":\"0xc0cc7e65f53db10bf3ed8b4fc19679d59d9edcf3cce102339c839ac2d8c2953d\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC1046 optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-1046\\n/// @dev Note: the ERC-165 identifier for this interface is 0x3c130d90.\\ninterface IERC20Metadata {\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI() external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xccacd6a5d3e43fb1b391aa5eb77fffcd4fbfc6c4498314f04058be84de9c1b34\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x28963e1e.\\ninterface IERC20Mintable {\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(address to, uint256 value) external;\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Reverts if `recipients` and `values` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if the total supply overflows.\\n    /// @dev Emits an {IERC20-Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(address[] calldata recipients, uint256[] calldata values) external;\\n}\\n\",\"keccak256\":\"0xed87a78d0a46f0fc45430a7d713053ee304e825311d941ab41a9a61877ce5ba9\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, ERC2612 optional extension: permit \\u2013 712-signed approvals\\n/// @notice Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2612\\n/// @dev Note: the ERC-165 identifier for this interface is 0x9d8ff7da.\\ninterface IERC20Permit {\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @notice Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @dev Reverts if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(address owner) external view returns (uint256 nonce);\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator);\\n}\\n\",\"keccak256\":\"0xd76819b4f86d014343db01bb8f9c060f68c915d21f96548f119f47b2bb406070\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC20 contracts with the Safe Transfers extension.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x4fc35859.\\ninterface IERC20Receiver {\\n    /// @notice Handles the receipt of ERC20 tokens.\\n    /// @dev Note: this function is called by an {ERC20SafeTransfer} contract after a safe transfer.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous tokens owner.\\n    /// @param value The amount of tokens transferred.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC20Received(address,address,uint256,bytes)\\\"))` (`0x4fc35859`) to accept, any other value to refuse.\\n    function onERC20Received(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0xd535b2326ce794174489f10fbd8f525979f3791a765de91b470b1357820c39be\",\"license\":\"MIT\"},\"contracts/token/ERC20/interfaces/IERC20SafeTransfers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC20 Token Standard, optional extension: Safe Transfers.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-20\\n/// @dev Note: the ERC-165 identifier for this interface is 0x53f41a97.\\ninterface IERC20SafeTransfers {\\n    /// @notice Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if the sender does not have at least `value` of balance.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransfer(address to, uint256 value, bytes calldata data) external returns (bool result);\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` does not have at least `value` of balance.\\n    /// @dev Reverts if the sender is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` fails, reverts or is rejected.\\n    /// @dev Emits an {IERC20-Transfer} event.\\n    /// @dev Optionally emits an {IERC20-Approval} event if the sender is not `from` (non-standard).\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    /// @return result Whether the operation succeeded.\\n    function safeTransferFrom(address from, address to, uint256 value, bytes calldata data) external returns (bool result);\\n}\\n\",\"keccak256\":\"0x1e557023612db2cab65e6e36cd9fba5dd19b887494576b7be6df18a138d8ff36\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20DetailedStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Detailed} from \\\"./../interfaces/IERC20Detailed.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20DetailedStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        uint8 tokenDecimals;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Detailed.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with the token details (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function constructorInit(Layout storage s, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with the token details (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Detailed.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenDecimals The token decimals.\\n    function proxyInit(Layout storage s, string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenDecimals = tokenDecimals;\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Detailed).interfaceId, true);\\n    }\\n\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the number of decimals used to display the balances.\\n    /// @notice For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    /// @notice Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\\n    /// @dev Note: This information is only used for display purposes: it does  not impact the arithmetic of the contract.\\n    /// @return nbDecimals The number of decimals used to display the balances.\\n    function decimals(Layout storage s) internal view returns (uint8 nbDecimals) {\\n        return s.tokenDecimals;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcedcd28ac8b25b802945e3bae694424b76b796477df7f96a150054d6a484d94f\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20MetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20Metadata} from \\\"./../interfaces/IERC20Metadata.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20MetadataStorage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n    using ERC20MetadataStorage for ERC20MetadataStorage.Layout;\\n\\n    struct Layout {\\n        string uri;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Metadata.storage\\\")) - 1);\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Metadata.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the token URI.\\n    /// @param uri The token URI.\\n    function setTokenURI(Layout storage s, string calldata uri) internal {\\n        s.uri = uri;\\n    }\\n\\n    /// @notice Gets the token metadata URI.\\n    /// @return uri The token metadata URI.\\n    function tokenURI(Layout storage s) internal view returns (string memory uri) {\\n        return s.uri;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe584ff07b088e944936c5c8c9216e2e7d1036882acabd723767173cd147b9471\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20PermitStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC20PermitFromAddressZero, ERC20PermitExpired, ERC20PermitInvalidSignature} from \\\"./../errors/ERC20PermitErrors.sol\\\";\\nimport {IERC20Permit} from \\\"./../interfaces/IERC20Permit.sol\\\";\\nimport {ERC20Storage} from \\\"./ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./ERC20DetailedStorage.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20PermitStorage {\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) accountNonces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20Permit.storage\\\")) - 1);\\n\\n    // 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9\\n    bytes32 internal constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Permit.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Permit).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account from another account using a signed permit.\\n    /// @dev Reverts with {ERC20PermitFromZeroAddress} if `owner` is the zero address.\\n    /// @dev Reverts with {ERC20PermitExpired} if the current blocktime is greather than `deadline`.\\n    /// @dev Reverts with {ERC20PermitInvalidSignature} if `r`, `s`, and `v` do not represent a valid `secp256k1` signature from `owner`.\\n    /// @dev Emits an {IERC20-Approval} event.\\n    /// @param owner The token owner granting the allowance to `spender`.\\n    /// @param spender The token spender being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    /// @param deadline The deadline from which the permit signature is no longer valid.\\n    /// @param v Permit signature v parameter\\n    /// @param r Permit signature r parameter.\\n    /// @param s Permit signature s parameter.\\n    function permit(Layout storage st, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal {\\n        if (owner == address(0)) revert ERC20PermitFromAddressZero();\\n        if (block.timestamp > deadline) revert ERC20PermitExpired(deadline);\\n        unchecked {\\n            bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, st.accountNonces[owner]++, deadline));\\n            bytes32 hash = keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", DOMAIN_SEPARATOR(), hashStruct));\\n            address signer = ecrecover(hash, v, r, s);\\n            if (signer != owner) revert ERC20PermitInvalidSignature();\\n        }\\n        ERC20Storage.layout().approve(owner, spender, value);\\n    }\\n\\n    /// @notice Gets the current permit nonce of an account.\\n    /// @param owner The account to check the nonce of.\\n    /// @return nonce The current permit nonce of `owner`.\\n    function nonces(Layout storage s, address owner) internal view returns (uint256 nonce) {\\n        return s.accountNonces[owner];\\n    }\\n\\n    /// @notice Returns the EIP-712 encoded hash struct of the domain-specific information for permits.\\n    /// @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:\\n    ///  keccak256(\\n    ///      abi.encode(\\n    ///          keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n    ///          keccak256(bytes(name)),\\n    ///          keccak256(bytes(version)),\\n    ///          chainId,\\n    ///          address(this)))\\n    ///\\n    ///  where\\n    ///   - `name` (string) is the ERC-20 token name.\\n    ///   - `version` (string) refers to the ERC-20 token contract version.\\n    ///   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.\\n    ///   - `verifyingContract` (address) is the ERC-20 token contract address.\\n    ///\\n    /// @return domainSeparator The EIP-712 encoded hash struct of the domain-specific information for permits.\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() internal view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return\\n            keccak256(\\n                abi.encode(\\n                    keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                    keccak256(bytes(ERC20DetailedStorage.layout().name())),\\n                    keccak256(\\\"1\\\"),\\n                    chainId,\\n                    address(this)\\n                )\\n            );\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9e49be472ddac0287516228aed3dc3c7c272d78832b9c294cf39aa73ae68dfe5\",\"license\":\"MIT\"},\"contracts/token/ERC20/libraries/ERC20Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC20ApprovalToAddressZero,\\n    ERC20InsufficientAllowance,\\n    ERC20TransferToAddressZero,\\n    ERC20InsufficientBalance\\n} from \\\"./../errors/ERC20Errors.sol\\\";\\nimport {ERC20AllowanceOverflow} from \\\"./../errors/ERC20AllowanceErrors.sol\\\";\\nimport {ERC20BatchTransferValuesOverflow} from \\\"./../errors/ERC20BatchTransfersErrors.sol\\\";\\nimport {ERC20SafeTransferRejected} from \\\"./../errors/ERC20SafeTransfersErrors.sol\\\";\\nimport {ERC20MintToAddressZero, ERC20BatchMintValuesOverflow, ERC20TotalSupplyOverflow} from \\\"./../errors/ERC20MintableErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval} from \\\"./../events/ERC20Events.sol\\\";\\nimport {IERC20} from \\\"./../interfaces/IERC20.sol\\\";\\nimport {IERC20Allowance} from \\\"./../interfaces/IERC20Allowance.sol\\\";\\nimport {IERC20BatchTransfers} from \\\"./../interfaces/IERC20BatchTransfers.sol\\\";\\nimport {IERC20SafeTransfers} from \\\"./../interfaces/IERC20SafeTransfers.sol\\\";\\nimport {IERC20Mintable} from \\\"./../interfaces/IERC20Mintable.sol\\\";\\nimport {IERC20Burnable} from \\\"./../interfaces/IERC20Burnable.sol\\\";\\nimport {IERC20Receiver} from \\\"./../interfaces/IERC20Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC20Storage {\\n    using Address for address;\\n    using ERC20Storage for ERC20Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(address => uint256) balances;\\n        mapping(address => mapping(address => uint256)) allowances;\\n        uint256 supply;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.token.ERC20.ERC20.phase\\\")) - 1);\\n\\n    bytes4 internal constant ERC20_RECEIVED = IERC20Receiver.onERC20Received.selector;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function init() internal {\\n        InterfaceDetectionStorage.Layout storage erc165Layout = InterfaceDetectionStorage.layout();\\n        erc165Layout.setSupportedInterface(type(IERC20).interfaceId, true);\\n        erc165Layout.setSupportedInterface(type(IERC20Allowance).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20, ERC20Allowance.\\n    function initWithAllocations(address[] memory initialHolders, uint256[] memory initialAllocations) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        init();\\n        layout().batchMint(initialHolders, initialAllocations);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20BatchTransfers.\\n    function initERC20BatchTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20BatchTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20SafeTransfers.\\n    function initERC20SafeTransfers() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20SafeTransfers).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Mintable.\\n    function initERC20Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC20Burnable.\\n    function initERC20Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC20Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the allowance to an account by an owner.\\n    /// @dev Note: This function implements {ERC20-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Emits an {Approval} event.\\n    /// @param owner The account to set the allowance from.\\n    /// @param spender The account being granted the allowance by `owner`.\\n    /// @param value The allowance amount to grant.\\n    function approve(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        s.allowances[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /// @notice Increases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-increaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20AllowanceOverflow} if `spender`'s allowance by `owner` overflows.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account increasing the allowance.\\n    /// @param spender The account whose allowance is being increased.\\n    /// @param value The allowance amount increase.\\n    function increaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n        if (value != 0) {\\n            unchecked {\\n                uint256 newAllowance = currentAllowance + value;\\n                if (newAllowance <= currentAllowance) revert ERC20AllowanceOverflow(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Decreases the allowance granted to an account by an owner.\\n    /// @dev Note: This function implements {ERC20Allowance-decreaseAllowance(address,uint256)}.\\n    /// @dev Reverts with {ERC20ApprovalToAddressZero} if `spender` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `spender` does not have at least `value` of allowance by `owner`.\\n    /// @dev Emits an {IERC20-Approval} event with an updated allowance for `spender` by `owner`.\\n    /// @param owner The account decreasing the allowance.\\n    /// @param spender The account whose allowance is being decreased.\\n    /// @param value The allowance amount decrease.\\n    function decreaseAllowance(Layout storage s, address owner, address spender, uint256 value) internal {\\n        if (spender == address(0)) revert ERC20ApprovalToAddressZero(owner);\\n        uint256 currentAllowance = s.allowances[owner][spender];\\n\\n        if (currentAllowance != type(uint256).max && value != 0) {\\n            unchecked {\\n                // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)\\n                uint256 newAllowance = currentAllowance - value;\\n                if (newAllowance >= currentAllowance) revert ERC20InsufficientAllowance(owner, spender, currentAllowance, value);\\n                s.allowances[owner][spender] = newAllowance;\\n                currentAllowance = newAllowance;\\n            }\\n        }\\n        emit Approval(owner, spender, currentAllowance);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient.\\n    /// @dev Note: This function implements {ERC20-transfer(address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transfer(Layout storage s, address from, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                if (from != to) {\\n                    s.balances[from] = newBalance;\\n                    s.balances[to] += value;\\n                }\\n            }\\n        }\\n\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC20-transferFrom(address,address,uint256)}.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from`.\\n    /// @param sender The message sender.\\n    /// @param from The account which owns the tokens to transfer.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.transfer(from, to, value);\\n    }\\n\\n    //================================================= Batch Transfers ==================================================//\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransfer(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransfer(Layout storage s, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n            emit Transfer(from, to, value);\\n        }\\n\\n        if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n            unchecked {\\n                uint256 newBalance = balance - totalValue;\\n                // balance must be sufficient, including self-transfers\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n            }\\n        }\\n    }\\n\\n    /// @notice Transfers multiple amounts of tokens from an account to multiple recipients by a sender.\\n    /// @dev Note: This function implements {ERC20BatchTransfers-batchTransferFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchTransferValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `sum(values)` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `sum(values)` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event for each transfer.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param recipients The list of accounts to transfer the tokens to.\\n    /// @param values The list of amounts of tokens to transfer to each of `recipients`.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address[] calldata recipients, uint256[] calldata values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 balance = s.balances[from];\\n\\n        uint256 totalValue;\\n        uint256 selfTransferTotalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20TransferToAddressZero(from);\\n\\n            uint256 value = values[i];\\n\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchTransferValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    if (from != to) {\\n                        s.balances[to] += value;\\n                    } else {\\n                        if (value > balance) revert ERC20InsufficientBalance(from, balance, value);\\n                        selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true\\n                    }\\n                }\\n            }\\n\\n            emit Transfer(from, to, value);\\n\\n            if (totalValue != 0 && totalValue != selfTransferTotalValue) {\\n                unchecked {\\n                    uint256 newBalance = balance - totalValue;\\n                    // balance must be sufficient, including self-transfers\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, totalValue);\\n                    s.balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance\\n                }\\n            }\\n        }\\n\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, totalValue);\\n        }\\n    }\\n\\n    //================================================= Safe Transfers ==================================================//\\n\\n    /// @notice Transfers an amount of tokens from an account to a recipient. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransfer(address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransfer(Layout storage s, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transfer(from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(from, from, to, value, data);\\n        }\\n    }\\n\\n    /// @notice Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it.\\n    /// @dev Note: This function implements {ERC20SafeTransfers-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC20TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if `to` is a contract and the call to `onERC20Received` fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account transferring the tokens.\\n    /// @param to The account to transfer the tokens to.\\n    /// @param value The amount of tokens to transfer.\\n    /// @param data Optional additional data with no specified format, to be passed to the receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 value, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, value);\\n        if (to.hasBytecode()) {\\n            _callOnERC20Received(sender, from, to, value, data);\\n        }\\n    }\\n\\n    //================================================= Minting ==================================================//\\n\\n    /// @notice Mints an amount of tokens to a recipient, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-mint(address,uint256)}.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event with `from` set to the zero address.\\n    /// @param to The account to mint the tokens to.\\n    /// @param value The amount of tokens to mint.\\n    function mint(Layout storage s, address to, uint256 value) internal {\\n        if (to == address(0)) revert ERC20MintToAddressZero();\\n        if (value != 0) {\\n            uint256 supply = s.supply;\\n            unchecked {\\n                uint256 newSupply = supply + value;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, value);\\n                s.supply = newSupply;\\n                s.balances[to] += value; // balance cannot overflow if supply does not\\n            }\\n        }\\n        emit Transfer(address(0), to, value);\\n    }\\n\\n    /// @notice Mints multiple amounts of tokens to multiple recipients, increasing the total supply.\\n    /// @dev Note: This function implements {ERC20Mintable-batchMint(address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC20BatchMintValuesOverflow} if the total sum of `values` overflows.\\n    /// @dev Reverts with {ERC20TotalSupplyOverflow} if the total supply overflows.\\n    /// @dev Emits a {Transfer} event for each transfer with `from` set to the zero address.\\n    /// @param recipients The list of accounts to mint the tokens to.\\n    /// @param values The list of amounts of tokens to mint to each of `recipients`.\\n    function batchMint(Layout storage s, address[] memory recipients, uint256[] memory values) internal {\\n        uint256 length = recipients.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC20MintToAddressZero();\\n\\n            uint256 value = values[i];\\n            if (value != 0) {\\n                unchecked {\\n                    uint256 newTotalValue = totalValue + value;\\n                    if (newTotalValue <= totalValue) revert ERC20BatchMintValuesOverflow();\\n                    totalValue = newTotalValue;\\n                    s.balances[to] += value; // balance cannot overflow if supply does not\\n                }\\n            }\\n            emit Transfer(address(0), to, value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                uint256 supply = s.supply;\\n                uint256 newSupply = supply + totalValue;\\n                if (newSupply <= supply) revert ERC20TotalSupplyOverflow(supply, totalValue);\\n                s.supply = newSupply;\\n            }\\n        }\\n    }\\n\\n    //================================================= Burning ==================================================//\\n\\n    /// @notice Burns an amount of tokens from an account, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burn(uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param from The account burning the tokens.\\n    /// @param value The amount of tokens to burn.\\n    function burn(Layout storage s, address from, uint256 value) internal {\\n        if (value != 0) {\\n            uint256 balance = s.balances[from];\\n            unchecked {\\n                uint256 newBalance = balance - value;\\n                if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                s.balances[from] = newBalance;\\n                s.supply -= value; // will not underflow if balance does not\\n            }\\n        }\\n\\n        emit Transfer(from, address(0), value);\\n    }\\n\\n    /// @notice Burns an amount of tokens from an account by a sender, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if `from` does not have at least `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not `from` and does not have at least `value` of allowance by `from`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event if `sender` is not `from` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param from The account to burn the tokens from.\\n    /// @param value The amount of tokens to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 value) internal {\\n        if (from != sender) {\\n            s.decreaseAllowance(from, sender, value);\\n        }\\n        s.burn(from, value);\\n    }\\n\\n    /// @notice Burns multiple amounts of tokens from multiple owners, decreasing the total supply.\\n    /// @dev Note: This function implements {ERC20Burnable-batchBurnFrom(address,address[],uint256[])}.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `owners` and `values` have different lengths.\\n    /// @dev Reverts with {ERC20InsufficientBalance} if an `owner` does not have at least the corresponding `value` of balance.\\n    /// @dev Reverts with {ERC20InsufficientAllowance} if `sender` is not an `owner` and does not have\\n    ///  at least the corresponding `value` of allowance by this `owner`.\\n    /// @dev Emits a {Transfer} event for each transfer with `to` set to the zero address.\\n    /// @dev Optionally emits an {Approval} event for each transfer if `sender` is not this `owner` (non-standard).\\n    /// @param sender The message sender.\\n    /// @param owners The list of accounts to burn the tokens from.\\n    /// @param values The list of amounts of tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address[] calldata owners, uint256[] calldata values) internal {\\n        uint256 length = owners.length;\\n        if (length != values.length) revert InconsistentArrayLengths();\\n\\n        if (length == 0) return;\\n\\n        uint256 totalValue;\\n        for (uint256 i; i < length; ++i) {\\n            address from = owners[i];\\n            uint256 value = values[i];\\n\\n            if (from != sender) {\\n                s.decreaseAllowance(from, sender, value);\\n            }\\n\\n            if (value != 0) {\\n                uint256 balance = s.balances[from];\\n                unchecked {\\n                    uint256 newBalance = balance - value;\\n                    if (newBalance >= balance) revert ERC20InsufficientBalance(from, balance, value);\\n                    s.balances[from] = newBalance;\\n                    totalValue += value; // totalValue cannot overflow if the individual balances do not underflow\\n                }\\n            }\\n\\n            emit Transfer(from, address(0), value);\\n        }\\n\\n        if (totalValue != 0) {\\n            unchecked {\\n                s.supply -= totalValue; // _totalSupply cannot underfow as balances do not underflow\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the total token supply.\\n    /// @dev Note: This function implements {ERC20-totalSupply()}.\\n    /// @return supply The total token supply.\\n    function totalSupply(Layout storage s) internal view returns (uint256 supply) {\\n        return s.supply;\\n    }\\n\\n    /// @notice Gets an account balance.\\n    /// @dev Note: This function implements {ERC20-balanceOf(address)}.\\n    /// @param owner The account whose balance will be returned.\\n    /// @return balance The account balance.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the amount that an account is allowed to spend on behalf of another.\\n    /// @dev Note: This function implements {ERC20-allowance(address,address)}.\\n    /// @param owner The account that has granted an allowance to `spender`.\\n    /// @param spender The account that was granted an allowance by `owner`.\\n    /// @return value The amount which `spender` is allowed to spend on behalf of `owner`.\\n    function allowance(Layout storage s, address owner, address spender) internal view returns (uint256 value) {\\n        return s.allowances[owner][spender];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC20Receiver-onERC20Received} on a target contract.\\n    /// @dev Reverts with {ERC20SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param value The value transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC20Received(address sender, address from, address to, uint256 value, bytes memory data) private {\\n        if (IERC20Receiver(to).onERC20Received(sender, from, value, data) != ERC20_RECEIVED) revert ERC20SafeTransferRejected(to);\\n    }\\n}\\n\",\"keccak256\":\"0x2ade25d048c5deb2ca7676f3226020ff919ee6d04e51be16d190863b101e94be\",\"license\":\"MIT\"},\"contracts/token/ERC20/preset/proxied/ERC20MintBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC20Storage} from \\\"./../../../../token/ERC20/libraries/ERC20Storage.sol\\\";\\nimport {ERC20DetailedStorage} from \\\"./../../../../token/ERC20/libraries/ERC20DetailedStorage.sol\\\";\\nimport {ERC20MetadataStorage} from \\\"./../../../../token/ERC20/libraries/ERC20MetadataStorage.sol\\\";\\nimport {ERC20PermitStorage} from \\\"./../../../../token/ERC20/libraries/ERC20PermitStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC20Base} from \\\"./../../base/ERC20Base.sol\\\";\\nimport {ERC20DetailedBase} from \\\"./../../base/ERC20DetailedBase.sol\\\";\\nimport {ERC20MetadataBase} from \\\"./../../base/ERC20MetadataBase.sol\\\";\\nimport {ERC20PermitBase} from \\\"./../../base/ERC20PermitBase.sol\\\";\\nimport {ERC20SafeTransfersBase} from \\\"./../../base/ERC20SafeTransfersBase.sol\\\";\\nimport {ERC20BatchTransfersBase} from \\\"./../../base/ERC20BatchTransfersBase.sol\\\";\\nimport {ERC20MintableBase} from \\\"./../../base/ERC20MintableBase.sol\\\";\\nimport {ERC20BurnableBase} from \\\"./../../base/ERC20BurnableBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\n/// @title ERC20 Fungible Token Standard, mintable and burnable preset contract (proxied version).\\ncontract ERC20MintBurnProxied is\\n    ERC20Base,\\n    ERC20DetailedBase,\\n    ERC20PermitBase,\\n    ERC20MetadataBase,\\n    ERC20SafeTransfersBase,\\n    ERC20BatchTransfersBase,\\n    ERC20MintableBase,\\n    ERC20BurnableBase,\\n    AccessControlBase,\\n    InterfaceDetection,\\n    TokenRecoveryBase,\\n    ContractOwnershipBase,\\n    ForwarderRegistryContext\\n{\\n    using ERC20DetailedStorage for ERC20DetailedStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(string calldata tokenName, string calldata tokenSymbol, uint8 tokenDecimals) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC20Storage.init();\\n        ERC20Storage.initERC20BatchTransfers();\\n        ERC20Storage.initERC20SafeTransfers();\\n        ERC20Storage.initERC20Mintable();\\n        ERC20Storage.initERC20Burnable();\\n        ERC20DetailedStorage.layout().proxyInit(tokenName, tokenSymbol, tokenDecimals);\\n        ERC20MetadataStorage.init();\\n        ERC20PermitStorage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6f2df00b1506c3e14920cd785b68d45233c7b4c0366f9fa37de01fe441cda809\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC20AllowanceOverflow(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance increase creates an overflow."}],"ERC20ApprovalToAddressZero(address)":[{"notice":"Thrown when setting an allowance to the the zero address."}],"ERC20BatchMintValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch mint operation."}],"ERC20BatchTransferValuesOverflow()":[{"notice":"Thrown when the `values` array sum overflows on a batch transfer operation."}],"ERC20InsufficientAllowance(address,address,uint256,uint256)":[{"notice":"Thrown when the allowance decreases below the current alowance set."}],"ERC20InsufficientBalance(address,uint256,uint256)":[{"notice":"Thrown when transferring an amount of tokens greater than the current balance."}],"ERC20MintToAddressZero()":[{"notice":"Thrown when the minting tokens to the zero address."}],"ERC20PermitExpired(uint256)":[{"notice":"Thrown when the permit is expired."}],"ERC20PermitFromAddressZero()":[{"notice":"Thrown when the permit is from the zero address."}],"ERC20PermitInvalidSignature()":[{"notice":"Thrown when the permit signature cannot be verified."}],"ERC20SafeTransferRejected(address)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC20TotalSupplyOverflow(uint256,uint256)":[{"notice":"Thrown when the minting tokens overflows the supply."}],"ERC20TransferToAddressZero(address)":[{"notice":"Thrown when transferring tokens to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when an approval is set."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when tokens are transferred, including zero value transfers."}},"kind":"user","methods":{"DOMAIN_SEPARATOR()":{"notice":"Returns the EIP-712 encoded hash struct of the domain-specific information for permits."},"allowance(address,address)":{"notice":"Gets the amount that an account is allowed to spend on behalf of another."},"approve(address,uint256)":{"notice":"Sets the allowance to an account from the sender.Warning: Beware that changing an allowance with this method brings the risk that someone may use both the old and  the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce  the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729"},"balanceOf(address)":{"notice":"Gets an account balance."},"batchBurnFrom(address[],uint256[])":{"notice":"Burns multiple amounts of tokens from multiple owners, decreasing the total supply."},"batchMint(address[],uint256[])":{"notice":"Mints multiple amounts of tokens to multiple recipients, increasing the total supply."},"batchTransfer(address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from the sender."},"batchTransferFrom(address,address[],uint256[])":{"notice":"Transfers multiple amounts of tokens to multiple recipients from a specified address."},"burn(uint256)":{"notice":"Burns an amount of tokens from the sender, decreasing the total supply."},"burnFrom(address,uint256)":{"notice":"Burns an amount of tokens from a specified address, decreasing the total supply."},"decimals()":{"notice":"Gets the number of decimals used to display the balances.For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance granted to an account by the sender.This is an alternative to {approve} that can be used as a mitigation for transaction ordering problems."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"mint(address,uint256)":{"notice":"Mints an amount of tokens to a recipient, increasing the total supply."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"nonces(address)":{"notice":"Gets the current permit nonce of an account."},"owner()":{"notice":"Gets the address of the contract owner."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"notice":"Sets the allowance to an account from another account using a signed permit.Warning: The standard ERC20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114"},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeTransfer(address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from the sender. If the recipient is a contract, calls `onERC20Received` on it."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Transfers an amount of tokens to a recipient from a specified address. If the recipient is a contract, calls `onERC20Received` on it."},"setTokenURI(string)":{"notice":"Sets the token URI."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI()":{"notice":"Gets the token metadata URI."},"totalSupply()":{"notice":"Gets the total token supply."},"transfer(address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from the sender."},"transferFrom(address,address,uint256)":{"notice":"Transfers an amount of tokens to a recipient from a specified address."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/ERC721/ERC721.sol":{"ERC721":{"abi":[{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721.sol\":\"ERC721\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721Base} from \\\"./base/ERC721Base.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721 is ERC721Base, InterfaceDetection {\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    constructor() {\\n        ERC721Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0xc88d760bfb00ca968cfceeadc7f930787bec3e49d70ece9bae580dbce43e02bd\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC721."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/ERC721BatchTransfer.sol":{"ERC721BatchTransfer":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}}},"title":"ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721BatchTransfer.sol\":\"ERC721BatchTransfer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferBase} from \\\"./base/ERC721BatchTransferBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: BatchTransfer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransfer is ERC721BatchTransferBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xa8e3132369f1822355d3cac6ec41cc67cf04fa3587e9915cc1d79b45954abcd5\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"constructor":{"notice":"Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer"}},"version":1}}},"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol":{"ERC721BatchTransferWithOperatorFilterer":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}}},"title":"ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":\"ERC721BatchTransferWithOperatorFilterer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"constructor":{"notice":"Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer"}},"version":1}}},"contracts/token/ERC721/ERC721Burnable.sol":{"ERC721Burnable":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[])":"f2472965","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"constructor\":{\"notice\":\"Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721Burnable.sol\":\"ERC721Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./base/ERC721BurnableBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Burnable is ERC721BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\\n    constructor() {\\n        ERC721Storage.initERC721Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xb63465341692ba51eeae4dd59c0c43809f4262b0dee67343981aaffbd49c0908\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"constructor":{"notice":"Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable"}},"version":1}}},"contracts/token/ERC721/ERC721Deliverable.sol":{"ERC721Deliverable":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721Deliverable.sol\":\"ERC721Deliverable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./base/ERC721DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x0465e23e92e293553137225252d7c5b80b6fc7ae406b15559830b5b7164025f9\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"notice":"ERC721Deliverable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/ERC721DeliverableOnce.sol":{"ERC721DeliverableOnce":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721DeliverableOnce.sol\":\"ERC721DeliverableOnce\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721DeliverableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./base/ERC721DeliverableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721DeliverableOnce is ERC721DeliverableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x3c07d84a3a3605882b84afd3bdf130a9c3992ba00e42403981b8813d3d4587b6\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"notice":"ERC721Deliverable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/ERC721Metadata.sol":{"ERC721Metadata":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}]},"kind":"dev","methods":{"constructor":{"params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"metadataResolver()":"a0c76f62","name()":"06fdde03","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721Metadata.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721Metadata.sol\":\"ERC721Metadata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC721Metadata."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC721/ERC721Mintable.sol":{"ERC721Mintable":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","mint(address,uint256)":"40c10f19","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeMint(address,uint256,bytes)":"8832e6e3","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721Mintable.sol\":\"ERC721Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"notice":"ERC721Mintable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/ERC721MintableOnce.sol":{"ERC721MintableOnce":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"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":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","mint(address,uint256)":"40c10f19","owner()":"8da5cb5b","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","safeMint(address,uint256,bytes)":"8832e6e3","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"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\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721MintableOnce.sol\":\"ERC721MintableOnce\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721MintableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./base/ERC721MintableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721MintableOnce is ERC721MintableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x62f7a355cfbf9bfb04f2932abcd474379b37af62f0f9fd5a09e63393e70dddd3\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"owner()":{"notice":"Gets the address of the contract owner."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"notice":"ERC721Mintable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/ERC721Receiver.sol":{"ERC721Receiver":{"abi":[{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"magicValue","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":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","kind":"dev","methods":{"onERC721Received(address,address,uint256,bytes)":{"details":"Note: This function is called by an ERC721 contract after a safe transfer.Note: The ERC721 contract address is always the message sender.","params":{"data":"Optional additional data with no specified format.","from":"The previous token owner.","operator":"The initiator of the safe transfer.","tokenId":"The token identifier."},"returns":{"magicValue":"`bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` (`0x150b7a02`) to accept, any other value to refuse."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}}},"title":"ERC721 Non-Fungible Token Standard, Receiver (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02","supportsInterface(bytes4)":"01ffc9a7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"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\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Note: This function is called by an ERC721 contract after a safe transfer.Note: The ERC721 contract address is always the message sender.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous token owner.\",\"operator\":\"The initiator of the safe transfer.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"magicValue\":\"`bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, Receiver (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Receiver.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of an ERC721 token.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721Receiver.sol\":\"ERC721Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Receiver} from \\\"./interfaces/IERC721Receiver.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, Receiver (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Receiver is IERC721Receiver, InterfaceDetection {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Receiver.\\n    constructor() {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Receiver).interfaceId, true);\\n    }\\n}\\n\",\"keccak256\":\"0x63a2d3363c5e74e4dbc670fcf947ffdfbe12c6059a9300432a3c46e0eb9c1235\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}]},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Receiver."},"onERC721Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of an ERC721 token."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."}},"version":1}}},"contracts/token/ERC721/ERC721WithOperatorFilterer.sol":{"ERC721WithOperatorFilterer":{"abi":[{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"constructor":{"params":{"operatorFilterRegistry":"The operator filter registry address. When set to the zero address, checks will be bypassed."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","supportsInterface(bytes4)":"01ffc9a7","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"constructor\":{\"params\":{\"operatorFilterRegistry\":\"The operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"constructor\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.Sets the address that the contract will make OperatorFilter checks against.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":\"ERC721WithOperatorFilterer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"constructor":{"notice":"Marks the following ERC165 interfaces as supported: ERC721.Sets the address that the contract will make OperatorFilter checks against."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/ERC721/base/ERC721Base.sol":{"ERC721Base":{"abi":[{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721Base.sol\":\"ERC721Base\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/base/ERC721BatchTransferBase.sol":{"ERC721BatchTransferBase":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":\"ERC721BatchTransferBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."}},"version":1}}},"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol":{"ERC721BatchTransferWithOperatorFiltererBase":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":\"ERC721BatchTransferWithOperatorFiltererBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."}},"version":1}}},"contracts/token/ERC721/base/ERC721BurnableBase.sol":{"ERC721BurnableBase":{"abi":[{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[])":"f2472965","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":\"ERC721BurnableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"burnFrom(address,uint256)":{"notice":"Burns a token."}},"version":1}}},"contracts/token/ERC721/base/ERC721DeliverableBase.sol":{"ERC721DeliverableBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":\"ERC721DeliverableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."}},"notice":"ERC721Deliverable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol":{"ERC721DeliverableOnceBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":\"ERC721DeliverableOnceBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."}},"notice":"ERC721Deliverable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/base/ERC721MetadataBase.sol":{"ERC721MetadataBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).","errors":{"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}]},"kind":"dev","methods":{"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"metadataResolver()":"a0c76f62","name()":"06fdde03","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).\",\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":\"ERC721MetadataBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}]},"kind":"user","methods":{"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC721/base/ERC721MintableBase.sol":{"ERC721MintableBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721MintableBase.sol\":\"ERC721MintableBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."}},"notice":"ERC721Mintable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/base/ERC721MintableOnceBase.sol":{"ERC721MintableOnceBase":{"abi":[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC721 (Non-Fungible Token Standard).Note: This contract requires AccessControl.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":\"ERC721MintableOnceBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"notice":"ERC721Mintable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol":{"ERC721WithOperatorFiltererBase":{"abi":[{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).Note: This contract requires OperatorFilterer.","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).Note: This contract requires OperatorFilterer.\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":\"ERC721WithOperatorFiltererBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol":{"ERC721BatchTransferFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BatchTransferStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"initERC721BatchTransferStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6107bb38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161073990816100828239608051816105760152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063684a78aa146104255763f3993d111461003257600080fd5b346104205760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104205760043573ffffffffffffffffffffffffffffffffffffffff8116908181036104205760243573ffffffffffffffffffffffffffffffffffffffff8116808203610420576044359367ffffffffffffffff8511610420573660238601121561042057846004013567ffffffffffffffff8111610420573660248260051b88010111610420576100ed61055f565b83156103f65773ffffffffffffffffffffffffffffffffffffffff16908183149586156103b1575b9495159460005b828110156102f657600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102ca57880361029a578793929189918b6101e7575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a40161011c565b90929394507401000000000000000000000000000000000000000091501615801561024f575b61021c5790878793923861018c565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541686141561020d565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103a8575b61030857005b61035461039f9273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b50821515610302565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610115565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346104205760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104205761045c61055f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610532577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106f45732331480156106f9575b6106f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105ea575b506105e757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106e857600091610645575b50386105dd565b60203d6020116106e1575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106b4576020918391604052810103126106b057519081151582036106ad57503861063e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610650565b6040513d6000823e3d90fd5b503390565b50601836106105a656fea26469706673582212204215cb1863753bf71338db0abff939c6bd56cd5a3d66a4496731e7124f55e4b964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x7BB CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x739 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x576 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x684A78AA EQ PUSH2 0x425 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x420 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x420 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x420 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x420 JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x420 JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x420 JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x420 JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x420 JUMPI PUSH2 0xED PUSH2 0x55F JUMP JUMPDEST DUP4 ISZERO PUSH2 0x3F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3B1 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2CA JUMPI DUP9 SUB PUSH2 0x29A JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1E7 JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x11C JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x24F JUMPI JUMPDEST PUSH2 0x21C JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x18C JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x20D JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3A8 JUMPI JUMPDEST PUSH2 0x308 JUMPI STOP JUMPDEST PUSH2 0x354 PUSH2 0x39F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x302 JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x115 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x420 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x420 JUMPI PUSH2 0x45C PUSH2 0x55F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x532 JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6F4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6F9 JUMPI JUMPDEST PUSH2 0x6F4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5EA JUMPI JUMPDEST POP PUSH2 0x5E7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x645 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5DD JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E1 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6B4 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6B0 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6AD JUMPI POP CODESIZE PUSH2 0x63E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x650 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5A6 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TIMESTAMP ISZERO 0xCB XOR PUSH4 0x753BF713 CODESIZE 0xDB EXP 0xBF EXTDELEGATECALL CODECOPY 0xC6 0xBD JUMP 0xCD GAS RETURNDATASIZE PUSH7 0xA4496731E7124F SSTORE RETF 0xB9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"855:1075:310:-:0;;;;;;;;;;;;;-1:-1:-1;;855:1075:310;;;;-1:-1:-1;;;;;855:1075:310;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;855:1075:310;;;;;;745:39:76;;855:1075:310;;;;;;;;745:39:76;855:1075:310;;;;;;;-1:-1:-1;855:1075:310;;;;;;-1:-1:-1;855:1075:310;;;;;-1:-1:-1;855:1075:310"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":1375,"id":13231,"parameterSlots":0,"returnSlots":1},"mapping_index_access_mapping_address_uint256_of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1398}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063684a78aa146104255763f3993d111461003257600080fd5b346104205760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104205760043573ffffffffffffffffffffffffffffffffffffffff8116908181036104205760243573ffffffffffffffffffffffffffffffffffffffff8116808203610420576044359367ffffffffffffffff8511610420573660238601121561042057846004013567ffffffffffffffff8111610420573660248260051b88010111610420576100ed61055f565b83156103f65773ffffffffffffffffffffffffffffffffffffffff16908183149586156103b1575b9495159460005b828110156102f657600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102ca57880361029a578793929189918b6101e7575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a40161011c565b90929394507401000000000000000000000000000000000000000091501615801561024f575b61021c5790878793923861018c565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541686141561020d565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103a8575b61030857005b61035461039f9273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b50821515610302565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff6040600020541695610115565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346104205760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104205761045c61055f565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610532577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106f45732331480156106f9575b6106f4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105ea575b506105e757503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106e857600091610645575b50386105dd565b60203d6020116106e1575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176106b4576020918391604052810103126106b057519081151582036106ad57503861063e565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610650565b6040513d6000823e3d90fd5b503390565b50601836106105a656fea26469706673582212204215cb1863753bf71338db0abff939c6bd56cd5a3d66a4496731e7124f55e4b964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x684A78AA EQ PUSH2 0x425 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x420 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x420 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x420 JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x420 JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x420 JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x420 JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x420 JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x420 JUMPI PUSH2 0xED PUSH2 0x55F JUMP JUMPDEST DUP4 ISZERO PUSH2 0x3F6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3B1 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2CA JUMPI DUP9 SUB PUSH2 0x29A JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1E7 JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x11C JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x24F JUMPI JUMPDEST PUSH2 0x21C JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x18C JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x20D JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3A8 JUMPI JUMPDEST PUSH2 0x308 JUMPI STOP JUMPDEST PUSH2 0x354 PUSH2 0x39F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x302 JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x115 JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x420 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x420 JUMPI PUSH2 0x45C PUSH2 0x55F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x532 JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6F4 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6F9 JUMPI JUMPDEST PUSH2 0x6F4 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5EA JUMPI JUMPDEST POP PUSH2 0x5E7 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6E8 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x645 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5DD JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6E1 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6B4 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x6B0 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6AD JUMPI POP CODESIZE PUSH2 0x63E JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x650 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x5A6 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TIMESTAMP ISZERO 0xCB XOR PUSH4 0x753BF713 CODESIZE 0xDB EXP 0xBF EXTDELEGATECALL CODECOPY 0xC6 0xBD JUMP 0xCD GAS RETURNDATASIZE PUSH7 0xA4496731E7124F SSTORE RETF 0xB9 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"855:1075:310:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1647:41;;:::i;:::-;12413:16:327;;12409:58;;855:1075:310;;30414:16:327;;;;30413:49;;;;;855:1075:310;12583:9:327;;12884:11;;855:1075:310;12606:3:327;12594:10;;;;;;855:1075:310;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;855:1075:310;;13125:27:327;855:1075:310;;1931:1:327;855:1075:310;;;;;;;;;;13125:27:327;;855:1075:310;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;855:1075:310;12987:51:327;;;;;;855:1075:310;;;;;;12987:51:327;12919:59;855:1075:310;;;;12958:11:327;855:1075:310;;;;;;;;12948:30:327;;;12919:59;;12793:73;12832:34;855:1075:310;12832:34:327;;;;;855:1075:310;;;;12832:34:327;12715:64;855:1075:310;12748:31:327;;;;;855:1075:310;;12748:31:327;12594:10;;;;;13177;;:25;;;12578:585;13173:304;;855:1075:310;13173:304:327;13323:16;13428:14;13323:16;855:1075:310;;;;13323:10:327;855:1075:310;;;;;;;13323:16:327;855:1075:310;;;;;;;;;;13323:10:327;855:1075:310;;;;;;;13428:14:327;855:1075:310;;;;;;;;13177:25:327;13191:11;;;;13177:25;;30413:49;30435:18;;855:1075:310;;;30435:11:327;855:1075:310;;;;;;;;;;;;;;;;30413:49:327;;;12409:58;12438:29;855:1075:310;12438:29:327;855:1075:310;;12438:29:327;855:1075:310;;;;;;;;;;;;;;;1647:41;;:::i;:::-;855:1075;;;;;;;3174:18:180;;;3170:53;;2904:38:327;855:1075:310;500:10:59;855:1075:310;500:10:59;;;;;;;636:1:180;500:10:59;;;855:1075:310;3170:53:180;3201:22;855:1075:310;3201:22:180;855:1075:310;;;;3201:22:180;907:917:76;855:1075:310;1029:19:76;855:1075:310;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;855:1075:310;;;;;;1676:74:76;;;;855:1075:310;1676:74:76;;;;;;855:1075:310;1327:10:76;855:1075:310;;;;1744:4:76;855:1075:310;;;;1676:74:76;;;;;;;855:1075:310;1676:74:76;;;1630:120;;;;;1676:74;855:1075:310;1676:74:76;855:1075:310;1676:74:76;;;;855:1075:310;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;855:1075:310;;;;;;;;;;;;;1676:74:76;;;;855:1075:310;;;;;;;;;;;;;;1676:74:76;855:1075:310;;1676:74:76;;;;;;855:1075:310;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"369800","executionCost":"infinite","totalCost":"infinite"},"external":{"batchTransferFrom(address,address,uint256[])":"infinite","initERC721BatchTransferStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11","initERC721BatchTransferStorage()":"684a78aa"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BatchTransferStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"initERC721BatchTransferStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"initERC721BatchTransferStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol\":\"ERC721BatchTransferFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchTransferFrom(_msgSender(), from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd9b8fa26489565711341f7904a190334fe0ec3b7e751767bcf0cac03fe73879b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BatchTransferFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BatchTransferBase} from \\\"./../base/ERC721BatchTransferBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: BatchTransfer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC721BatchTransferFacet is ERC721BatchTransferBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BatchTransferStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x1ea2b147abc7ae1238867ad176a10a289c884079ca33ed732c8637f416d7d492\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"initERC721BatchTransferStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer."}},"version":1}}},"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol":{"ERC721BatchTransferWithOperatorFiltererFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BatchTransferStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"initERC721BatchTransferStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6108d238819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610850908161008282396080518161071d0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063684a78aa146105445763f3993d111461003257600080fd5b3461053f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261053f5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361053f5760243573ffffffffffffffffffffffffffffffffffffffff811680820361053f576044359367ffffffffffffffff851161053f573660238601121561053f57846004013567ffffffffffffffff811161053f573660248260051b8801011161053f5773ffffffffffffffffffffffffffffffffffffffff610102610706565b1690828203610428575b83156103fe578183149586156103b9575b9495159460005b828110156102fe57600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102d25788036102a2578793929189918b6101ef575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a401610124565b909293945074010000000000000000000000000000000000000000915016158015610257575b61022457908787939238610194565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610215565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103b0575b61031057005b61035c6103a79273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b5082151561030a565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff604060002054169561011d565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30541680151580610535575b610474575b5061010c565b6020604491604051928380927fc61711340000000000000000000000000000000000000000000000000000000082523060048301528760248301525afa908115610529576000916104fa575b50156104cc573861046e565b507fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61051c915060203d602011610522575b610514818361067e565b8101906106ee565b386104c0565b503d61050a565b6040513d6000823e3d90fd5b50803b1515610469565b600080fd5b3461053f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261053f5761057b610706565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610651577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106bf57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261053f5751801515810361053f5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561080b573233148015610810575b61080b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610791575b5061078e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610529576000916107ec575b5038610784565b610805915060203d60201161052257610514818361067e565b386107e5565b503390565b506018361061074d56fea2646970667358221220ff4476977c08dd742ee3c8236efc072606f180c80bc07084095dc1d8d463627264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x8D2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x850 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x71D ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x684A78AA EQ PUSH2 0x544 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x53F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x53F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x53F JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x53F JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x53F JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x53F JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x53F JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x53F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x102 PUSH2 0x706 JUMP JUMPDEST AND SWAP1 DUP3 DUP3 SUB PUSH2 0x428 JUMPI JUMPDEST DUP4 ISZERO PUSH2 0x3FE JUMPI DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3B9 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2D2 JUMPI DUP9 SUB PUSH2 0x2A2 JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1EF JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x124 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x257 JUMPI JUMPDEST PUSH2 0x224 JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x194 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x215 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3B0 JUMPI JUMPDEST PUSH2 0x310 JUMPI STOP JUMPDEST PUSH2 0x35C PUSH2 0x3A7 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x30A JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x11D JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND DUP1 ISZERO ISZERO DUP1 PUSH2 0x535 JUMPI JUMPDEST PUSH2 0x474 JUMPI JUMPDEST POP PUSH2 0x10C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x44 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE DUP8 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4FA JUMPI JUMPDEST POP ISZERO PUSH2 0x4CC JUMPI CODESIZE PUSH2 0x46E JUMP JUMPDEST POP PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x51C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x522 JUMPI JUMPDEST PUSH2 0x514 DUP2 DUP4 PUSH2 0x67E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6EE JUMP JUMPDEST CODESIZE PUSH2 0x4C0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x50A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x469 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x53F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x53F JUMPI PUSH2 0x57B PUSH2 0x706 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x651 JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6BF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x53F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x53F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x80B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x810 JUMPI JUMPDEST PUSH2 0x80B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x791 JUMPI JUMPDEST POP PUSH2 0x78E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7EC JUMPI JUMPDEST POP CODESIZE PUSH2 0x784 JUMP JUMPDEST PUSH2 0x805 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x522 JUMPI PUSH2 0x514 DUP2 DUP4 PUSH2 0x67E JUMP JUMPDEST CODESIZE PUSH2 0x7E5 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x74D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT PREVRANDAO PUSH23 0x977C08DD742EE3C8236EFC072606F180C80BC07084095D 0xC1 0xD8 0xD4 PUSH4 0x62726473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"944:1115:311:-:0;;;;;;;;;;;;;-1:-1:-1;;944:1115:311;;;;-1:-1:-1;;;;;944:1115:311;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;944:1115:311;;;;;;745:39:76;;944:1115:311;;;;;;;;745:39:76;944:1115:311;;;;;;;-1:-1:-1;944:1115:311;;;;;;-1:-1:-1;944:1115:311;;;;;-1:-1:-1;944:1115:311"},"deployedBytecode":{"functionDebugData":{"abi_decode_bool_fromMemory":{"entryPoint":1774,"id":null,"parameterSlots":2,"returnSlots":1},"finalize_allocation":{"entryPoint":1662,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":1798,"id":13231,"parameterSlots":0,"returnSlots":1},"mapping_index_access_mapping_address_uint256_of_address":{"entryPoint":null,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1821}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063684a78aa146105445763f3993d111461003257600080fd5b3461053f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261053f5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361053f5760243573ffffffffffffffffffffffffffffffffffffffff811680820361053f576044359367ffffffffffffffff851161053f573660238601121561053f57846004013567ffffffffffffffff811161053f573660248260051b8801011161053f5773ffffffffffffffffffffffffffffffffffffffff610102610706565b1690828203610428575b83156103fe578183149586156103b9575b9495159460005b828110156102fe57600060248260051b8b010135908181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102d25788036102a2578793929189918b6101ef575b50937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584600197527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205283604082205580a401610124565b909293945074010000000000000000000000000000000000000000915016158015610257575b61022457908787939238610194565b60649187877fa4a3018b000000000000000000000000000000000000000000000000000000008452600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff604082205416861415610215565b50604491877f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b508685851415806103b0575b61031057005b61035c6103a79273ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b83815403905573ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604060002090565b80549091019055005b5082151561030a565b9550826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205260406000208260005260205260ff604060002054169561011d565b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30541680151580610535575b610474575b5061010c565b6020604491604051928380927fc61711340000000000000000000000000000000000000000000000000000000082523060048301528760248301525afa908115610529576000916104fa575b50156104cc573861046e565b507fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61051c915060203d602011610522575b610514818361067e565b8101906106ee565b386104c0565b503d61050a565b6040513d6000823e3d90fd5b50803b1515610469565b600080fd5b3461053f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261053f5761057b610706565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610651577ff3993d11000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106bf57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261053f5751801515810361053f5790565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561080b573233148015610810575b61080b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610791575b5061078e57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610529576000916107ec575b5038610784565b610805915060203d60201161052257610514818361067e565b386107e5565b503390565b506018361061074d56fea2646970667358221220ff4476977c08dd742ee3c8236efc072606f180c80bc07084095dc1d8d463627264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x684A78AA EQ PUSH2 0x544 JUMPI PUSH4 0xF3993D11 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x53F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x53F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x53F JUMPI PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP3 SUB PUSH2 0x53F JUMPI PUSH1 0x44 CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x53F JUMPI CALLDATASIZE PUSH1 0x23 DUP7 ADD SLT ISZERO PUSH2 0x53F JUMPI DUP5 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x53F JUMPI CALLDATASIZE PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP9 ADD ADD GT PUSH2 0x53F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x102 PUSH2 0x706 JUMP JUMPDEST AND SWAP1 DUP3 DUP3 SUB PUSH2 0x428 JUMPI JUMPDEST DUP4 ISZERO PUSH2 0x3FE JUMPI DUP2 DUP4 EQ SWAP6 DUP7 ISZERO PUSH2 0x3B9 JUMPI JUMPDEST SWAP5 SWAP6 ISZERO SWAP5 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP12 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2D2 JUMPI DUP9 SUB PUSH2 0x2A2 JUMPI DUP8 SWAP4 SWAP3 SWAP2 DUP10 SWAP2 DUP12 PUSH2 0x1EF JUMPI JUMPDEST POP SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 DUP5 PUSH1 0x1 SWAP8 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP4 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP1 LOG4 ADD PUSH2 0x124 JUMP JUMPDEST SWAP1 SWAP3 SWAP4 SWAP5 POP PUSH21 0x10000000000000000000000000000000000000000 SWAP2 POP AND ISZERO DUP1 ISZERO PUSH2 0x257 JUMPI JUMPDEST PUSH2 0x224 JUMPI SWAP1 DUP8 DUP8 SWAP4 SWAP3 CODESIZE PUSH2 0x194 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP8 DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND DUP7 EQ ISZERO PUSH2 0x215 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP8 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST POP DUP7 DUP6 DUP6 EQ ISZERO DUP1 PUSH2 0x3B0 JUMPI JUMPDEST PUSH2 0x310 JUMPI STOP JUMPDEST PUSH2 0x35C PUSH2 0x3A7 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP4 DUP2 SLOAD SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x30A JUMP JUMPDEST SWAP6 POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP6 PUSH2 0x11D JUMP JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND DUP1 ISZERO ISZERO DUP1 PUSH2 0x535 JUMPI JUMPDEST PUSH2 0x474 JUMPI JUMPDEST POP PUSH2 0x10C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x44 SWAP2 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP3 MSTORE ADDRESS PUSH1 0x4 DUP4 ADD MSTORE DUP8 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4FA JUMPI JUMPDEST POP ISZERO PUSH2 0x4CC JUMPI CODESIZE PUSH2 0x46E JUMP JUMPDEST POP PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x51C SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x522 JUMPI JUMPDEST PUSH2 0x514 DUP2 DUP4 PUSH2 0x67E JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x6EE JUMP JUMPDEST CODESIZE PUSH2 0x4C0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x50A JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x469 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x53F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x53F JUMPI PUSH2 0x57B PUSH2 0x706 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x651 JUMPI PUSH32 0xF3993D1100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6BF JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x53F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x53F JUMPI SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x80B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x810 JUMPI JUMPDEST PUSH2 0x80B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x791 JUMPI JUMPDEST POP PUSH2 0x78E JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7EC JUMPI JUMPDEST POP CODESIZE PUSH2 0x784 JUMP JUMPDEST PUSH2 0x805 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x522 JUMPI PUSH2 0x514 DUP2 DUP4 PUSH2 0x67E JUMP JUMPDEST CODESIZE PUSH2 0x7E5 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x74D JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SELFDESTRUCT PREVRANDAO PUSH23 0x977C08DD742EE3C8236EFC072606F180C80BC07084095D 0xC1 0xD8 0xD4 PUSH4 0x62726473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"944:1115:311:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1776:41;;:::i;:::-;944:1115;2616:14:352;;;;2612:76;;944:1115:311;12413:16:327;;12409:58;;30414:16;;;30413:49;;;;;944:1115:311;12583:9:327;;12884:11;;944:1115:311;12606:3:327;12594:10;;;;;;944:1115:311;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;;;;;;;12606:3;944:1115:311;;13125:27:327;944:1115:311;;747:1:352;944:1115:311;;;;;;;;;;13125:27:327;;944:1115:311;12583:9:327;;12880:173;30979:33;;;;;2220:8;30979:33;;;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;;;;;;12915:123;944:1115:311;12987:51:327;;;;;;944:1115:311;;;;;;12987:51:327;12919:59;944:1115:311;;;;12958:11:327;944:1115:311;;;;;;;;12948:30:327;;;12919:59;;12793:73;12832:34;944:1115:311;12832:34:327;;;;;944:1115:311;;;;12832:34:327;12715:64;944:1115:311;12748:31:327;;;;;944:1115:311;;12748:31:327;12594:10;;;;;13177;;:25;;;12578:585;13173:304;;944:1115:311;13173:304:327;13323:16;13428:14;13323:16;944:1115:311;;;;13323:10:327;944:1115:311;;;;;;;13323:16:327;944:1115:311;;;;;;;;;;13323:10:327;944:1115:311;;;;;;;13428:14:327;944:1115:311;;;;;;;;13177:25:327;13191:11;;;;13177:25;;30413:49;30435:18;;944:1115:311;;;30435:11:327;944:1115:311;;;;;;;;;;;;;;;;30413:49:327;;;12409:58;12438:29;944:1115:311;12438:29:327;944:1115:311;;12438:29:327;2612:76:352;944:1115:311;;;;3524:31:352;;;:68;;;2612:76;3520:224;;2612:76;;;;3520:224;944:1115:311;;;;;3613:51:352;;;;944:1115:311;3613:51:352;;3648:4;944:1115:311;3613:51:352;;944:1115:311;;;;;;3613:51:352;;;;;;;944:1115:311;3613:51:352;;;3520:224;3612:52;;3608:126;;3520:224;;;3608:126;3691:28;;944:1115:311;3691:28:352;944:1115:311;;;;3691:28:352;3613:51;;;;944:1115:311;3613:51:352;944:1115:311;3613:51:352;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;944:1115:311;;;;;;;;;3524:68:352;3559:29;;;:33;;3524:68;;944:1115:311;;;;;;;;;;;;;;;1776:41;;:::i;:::-;944:1115;;;;;;;3174:18:180;;;3170:53;;2904:38:327;944:1115:311;500:10:59;944:1115:311;500:10:59;;;;;;;636:1:180;500:10:59;;;944:1115:311;3170:53:180;3201:22;944:1115:311;3201:22:180;944:1115:311;;;;3201:22:180;944:1115:311;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;944:1115:311;;;;;-1:-1:-1;944:1115:311;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;944:1115:311;1029:19:76;944:1115:311;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;944:1115:311;;;;;;1676:74:76;;;;944:1115:311;1676:74:76;;;;;;944:1115:311;1327:10:76;944:1115:311;;;;1744:4:76;944:1115:311;;;;1676:74:76;;;;;;;944:1115:311;1676:74:76;;;1630:120;;;;;1676:74;;;;944:1115:311;1676:74:76;944:1115:311;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"425600","executionCost":"infinite","totalCost":"infinite"},"external":{"batchTransferFrom(address,address,uint256[])":"infinite","initERC721BatchTransferStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11","initERC721BatchTransferStorage()":"684a78aa"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BatchTransferStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"initERC721BatchTransferStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"initERC721BatchTransferStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol\":\"ERC721BatchTransferWithOperatorFiltererFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BatchTransferWithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet}  and {OperatorFiltererFacet}.\\ncontract ERC721BatchTransferWithOperatorFiltererFacet is ERC721BatchTransferWithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BatchTransferStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x470a1f8b65f7f5b382fed75ead4e47e682d5b17df25590fc026282bbeccddee8\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"initERC721BatchTransferStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer."}},"version":1}}},"contracts/token/ERC721/facets/ERC721BurnableFacet.sol":{"ERC721BurnableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721BurnableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"initERC721BurnableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6109fc38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161097a90816100828239608051816107370152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806379cc67901461045f578063de815811146103255763f24729651461003d57600080fd5b346103205760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610320576100746106fd565b60243567ffffffffffffffff811161032057366023820112156103205780600401359167ffffffffffffffff8311610320573660248460051b840101116103205782907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926100e1610720565b936100ed8584836108c4565b159273ffffffffffffffffffffffffffffffffffffffff169060005b858110156102e057600060248260051b860101359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102b457860361028457876101b1575b509081816001949352846020527fdead0000000000000000000000000000000000000000000000000000000000006040822055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610109565b7401000000000000000000000000000000000000000016158015610223575b6101da5789610153565b6064918573ffffffffffffffffffffffffffffffffffffffff8b7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8a1614156101d0565b50604491857f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b8583816102e957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b600080fd5b346103205760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103205761035c610720565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610432577f8b8b4ef5000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103205760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610320576104966106fd565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06104c3610720565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156106cf5773ffffffffffffffffffffffffffffffffffffffff811680950361069d578261051891856108c4565b156105c6575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b740100000000000000000000000000000000000000001615801561063a575b6105ef578061051e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156105e5565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032057565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108b55732331480156108ba575b6108b5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156107ab575b506107a857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108a957600091610806575b503861079e565b60203d6020116108a2575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761087557602091839160405281010312610871575190811515820361086e5750386107ff565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610811565b6040513d6000823e3d90fd5b503390565b5060183610610767565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156108ef575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806108e956fea2646970667358221220f529daad34a2390b518e706a80c705d0e69f6ab97f3af49b81047db6e30e636b64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x9FC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x97A SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x737 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x45F JUMPI DUP1 PUSH4 0xDE815811 EQ PUSH2 0x325 JUMPI PUSH4 0xF2472965 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x74 PUSH2 0x6FD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x320 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x320 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x320 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP5 ADD ADD GT PUSH2 0x320 JUMPI DUP3 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0xE1 PUSH2 0x720 JUMP JUMPDEST SWAP4 PUSH2 0xED DUP6 DUP5 DUP4 PUSH2 0x8C4 JUMP JUMPDEST ISZERO SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x2E0 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP7 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2B4 JUMPI DUP7 SUB PUSH2 0x284 JUMPI DUP8 PUSH2 0x1B1 JUMPI JUMPDEST POP SWAP1 DUP2 DUP2 PUSH1 0x1 SWAP5 SWAP4 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP6 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x109 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x223 JUMPI JUMPDEST PUSH2 0x1DA JUMPI DUP10 PUSH2 0x153 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND EQ ISZERO PUSH2 0x1D0 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP6 DUP4 DUP2 PUSH2 0x2E9 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x35C PUSH2 0x720 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x432 JUMPI PUSH32 0x8B8B4EF500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x496 PUSH2 0x6FD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4C3 PUSH2 0x720 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6CF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x69D JUMPI DUP3 PUSH2 0x518 SWAP2 DUP6 PUSH2 0x8C4 JUMP JUMPDEST ISZERO PUSH2 0x5C6 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x63A JUMPI JUMPDEST PUSH2 0x5EF JUMPI DUP1 PUSH2 0x51E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x5E5 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x320 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8B5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8BA JUMPI JUMPDEST PUSH2 0x8B5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7AB JUMPI JUMPDEST POP PUSH2 0x7A8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x806 JUMPI JUMPDEST POP CODESIZE PUSH2 0x79E JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8A2 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x875 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x871 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x86E JUMPI POP CODESIZE PUSH2 0x7FF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x811 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x767 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x8EF JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x8E9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0x29 0xDA 0xAD CALLVALUE LOG2 CODECOPY SIGNEXTEND MLOAD DUP15 PUSH17 0x6A80C705D0E69F6AB97F3AF49B81047DB6 CALLF 0xE63 PUSH12 0x64736F6C634300081E003300 ","sourceMap":"839:1050:312:-:0;;;;;;;;;;;;;-1:-1:-1;;839:1050:312;;;;-1:-1:-1;;;;;839:1050:312;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;839:1050:312;;;;;;745:39:76;;839:1050:312;;;;;;;;745:39:76;839:1050:312;;;;;;;-1:-1:-1;839:1050:312;;;;;;-1:-1:-1;839:1050:312;;;;;-1:-1:-1;839:1050:312"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1789,"id":null,"parameterSlots":0,"returnSlots":1},"fun_isOperatable":{"entryPoint":2244,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":1824,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1847}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806379cc67901461045f578063de815811146103255763f24729651461003d57600080fd5b346103205760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610320576100746106fd565b60243567ffffffffffffffff811161032057366023820112156103205780600401359167ffffffffffffffff8311610320573660248460051b840101116103205782907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926100e1610720565b936100ed8584836108c4565b159273ffffffffffffffffffffffffffffffffffffffff169060005b858110156102e057600060248260051b860101359081815283602052604081205473ffffffffffffffffffffffffffffffffffffffff811680156102b457860361028457876101b1575b509081816001949352846020527fdead0000000000000000000000000000000000000000000000000000000000006040822055857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610109565b7401000000000000000000000000000000000000000016158015610223575b6101da5789610153565b6064918573ffffffffffffffffffffffffffffffffffffffff8b7fa4a3018b00000000000000000000000000000000000000000000000000000000855216600452602452604452fd5b508181527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff60408220541673ffffffffffffffffffffffffffffffffffffffff8a1614156101d0565b50604491857f14dbb536000000000000000000000000000000000000000000000000000000008352600452602452fd5b602483857fdd560475000000000000000000000000000000000000000000000000000000008252600452fd5b8583816102e957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b600080fd5b346103205760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103205761035c610720565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610432577f8b8b4ef5000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103205760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610320576104966106fd565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06104c3610720565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156106cf5773ffffffffffffffffffffffffffffffffffffffff811680950361069d578261051891856108c4565b156105c6575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b740100000000000000000000000000000000000000001615801561063a575b6105ef578061051e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156105e5565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032057565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156108b55732331480156108ba575b6108b5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156107ab575b506107a857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108a957600091610806575b503861079e565b60203d6020116108a2575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761087557602091839160405281010312610871575190811515820361086e5750386107ff565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d610811565b6040513d6000823e3d90fd5b503390565b5060183610610767565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156108ef575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806108e956fea2646970667358221220f529daad34a2390b518e706a80c705d0e69f6ab97f3af49b81047db6e30e636b64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x45F JUMPI DUP1 PUSH4 0xDE815811 EQ PUSH2 0x325 JUMPI PUSH4 0xF2472965 EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x74 PUSH2 0x6FD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x320 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x320 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x320 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP5 ADD ADD GT PUSH2 0x320 JUMPI DUP3 SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0xE1 PUSH2 0x720 JUMP JUMPDEST SWAP4 PUSH2 0xED DUP6 DUP5 DUP4 PUSH2 0x8C4 JUMP JUMPDEST ISZERO SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x2E0 JUMPI PUSH1 0x0 PUSH1 0x24 DUP3 PUSH1 0x5 SHL DUP7 ADD ADD CALLDATALOAD SWAP1 DUP2 DUP2 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x2B4 JUMPI DUP7 SUB PUSH2 0x284 JUMPI DUP8 PUSH2 0x1B1 JUMPI JUMPDEST POP SWAP1 DUP2 DUP2 PUSH1 0x1 SWAP5 SWAP4 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 KECCAK256 SSTORE DUP6 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x109 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x223 JUMPI JUMPDEST PUSH2 0x1DA JUMPI DUP10 PUSH2 0x153 JUMP JUMPDEST PUSH1 0x64 SWAP2 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE REVERT JUMPDEST POP DUP2 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND EQ ISZERO PUSH2 0x1D0 JUMP JUMPDEST POP PUSH1 0x44 SWAP2 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP4 DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST DUP6 DUP4 DUP2 PUSH2 0x2E9 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x35C PUSH2 0x720 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x432 JUMPI PUSH32 0x8B8B4EF500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x320 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x320 JUMPI PUSH2 0x496 PUSH2 0x6FD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x4C3 PUSH2 0x720 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6CF JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x69D JUMPI DUP3 PUSH2 0x518 SWAP2 DUP6 PUSH2 0x8C4 JUMP JUMPDEST ISZERO PUSH2 0x5C6 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x63A JUMPI JUMPDEST PUSH2 0x5EF JUMPI DUP1 PUSH2 0x51E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x5E5 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x320 JUMPI JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x8B5 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x8BA JUMPI JUMPDEST PUSH2 0x8B5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x7AB JUMPI JUMPDEST POP PUSH2 0x7A8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x806 JUMPI JUMPDEST POP CODESIZE PUSH2 0x79E JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x8A2 JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x875 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x871 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x86E JUMPI POP CODESIZE PUSH2 0x7FF JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x811 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x767 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x8EF JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x8E9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CREATE2 0x29 0xDA 0xAD CALLVALUE LOG2 CODECOPY SIGNEXTEND MLOAD DUP15 PUSH17 0x6A80C705D0E69F6AB97F3AF49B81047DB6 CALLF 0xE63 PUSH12 0x64736F6C634300081E003300 ","sourceMap":"839:1050:312:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29158:19:327;;839:1050:312;1606:41;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25879:11;;839:1050:312;;;;25601:3:327;25589:10;;;;;;839:1050:312;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;839:1050:312;;;;;;;;;;;2414:66:327;839:1050:312;;;2414:66:327;26123:35;;;;;839:1050:312;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;839:1050:312;25982:51:327;;839:1050:312;25982:51:327;;;;839:1050:312;;;;;;;25982:51:327;25914:59;839:1050:312;;;;25953:11:327;839:1050:312;;;;;;;;;;;25943:30:327;;25914:59;;25788:73;25827:34;839:1050:312;25827:34:327;;;;;839:1050:312;;;;25827:34:327;25710:64;839:1050:312;25743:31:327;;;;;839:1050:312;;25743:31:327;25589:10;;;26183:11;26179:110;;839:1050:312;26179:110:327;-1:-1:-1;2414:66:327;26238:10;2414:66;;;-1:-1:-1;2414:66:327;839:1050:312;;;;2414:66:327;;839:1050:312;;;;;;;;;;;;;;;;;;1606:41;;:::i;:::-;839:1050;;;;;;;3174:18:180;;;3170:53;;3898:33:327;839:1050:312;500:10:59;839:1050:312;500:10:59;;;;;;;636:1:180;500:10:59;;;839:1050:312;3170:53:180;3201:22;839:1050:312;3201:22:180;839:1050:312;;;;3201:22:180;839:1050:312;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;839:1050:312;1606:41;;:::i;:::-;839:1050;;;;;;;;;;;;;30700:19:327;;;24121:64;;839:1050:312;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;839:1050:312;;;;;;;;;;2414:66:327;839:1050:312;;;2414:66:327;;;;24633:10;2414:66;;;;;;839:1050:312;;2414:66:327;;;24674:35;;;;839:1050:312;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;839:1050:312;24402:51:327;;;839:1050:312;24402:51:327;839:1050:312;;;;;;;;;24402:51:327;24334:59;839:1050:312;;;;24373:11:327;839:1050:312;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;839:1050:312;24234:34:327;839:1050:312;;;;;;24234:34:327;24121:64;24154:31;;839:1050:312;24154:31:327;839:1050:312;;;;24154:31:327;839:1050:312;;;;;;;;;;;:::o;907:917:76:-;839:1050:312;1029:19:76;839:1050:312;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;839:1050:312;;;;;;1676:74:76;;;;839:1050:312;1676:74:76;;;;;;839:1050:312;1327:10:76;839:1050:312;;;;1744:4:76;839:1050:312;;;;1676:74:76;;;;;;;839:1050:312;1676:74:76;;;1630:120;;;;;1676:74;839:1050:312;1676:74:76;839:1050:312;1676:74:76;;;;839:1050:312;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;839:1050:312;;;;;;;;;;;;;1676:74:76;;;;839:1050:312;;;;;;;;;;;;;;1676:74:76;839:1050:312;;1676:74:76;;;;;;839:1050:312;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;839:1050:312;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;839:1050:312;;-1:-1:-1;2414:66:327;30435:11;2414:66;;839:1050:312;2414:66:327;-1:-1:-1;2414:66:327;30435:27;839:1050:312;-1:-1:-1;2414:66:327;;;839:1050:312;2414:66:327;-1:-1:-1;2414:66:327;839:1050:312;;30413:49:327;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"485200","executionCost":"infinite","totalCost":"infinite"},"external":{"batchBurnFrom(address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","initERC721BurnableStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"batchBurnFrom(address,uint256[])":"f2472965","burnFrom(address,uint256)":"79cc6790","initERC721BurnableStorage()":"de815811"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721BurnableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"initERC721BurnableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"initERC721BurnableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Burnable.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721BurnableFacet.sol\":\"ERC721BurnableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721BurnableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../base/ERC721BurnableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC721BurnableFacet is ERC721BurnableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721BurnableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Burnable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x627bb13c828abe9cf131b8be40e8a212769938de5e2b1e74a588ba383ce86bb7\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"initERC721BurnableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Burnable."}},"version":1}}},"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol":{"ERC721DeliverableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721DeliverableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721DeliverableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6107d238819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161075090816100828239608051816105ee0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80639da5e832146101715763a330f88d1461003257600080fd5b3461016c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c576100696105d7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361013f577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461016c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5760043567ffffffffffffffff811161016c576101c09036906004016104db565b9060243567ffffffffffffffff811161016c576101e19036906004016104db565b926101ea6105d7565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff161561048a57506102408161057c565b9261024e604051948561050c565b818452602084019160051b81019036821161016c57915b81831061045d575050506102788361057c565b92610286604051948561050c565b808452602084019060051b82019136831161016c57905b82821061044d57505050805190825182036104235760005b8281106102be57005b73ffffffffffffffffffffffffffffffffffffffff6102dd8284610594565b51166102e98286610594565b519080156103f957816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff604060002054166103cb579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102b5565b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b813581526020918201910161029d565b823573ffffffffffffffffffffffffffffffffffffffff8116810361016c57815260209283019201610265565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b9181601f8401121561016c5782359167ffffffffffffffff831161016c576020808501948460051b01011161016c57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761054d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161054d5760051b60200190565b80518210156105a85760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561070b573233148015610710575b61070b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610662575b5061065f57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ff576000916106bd575b5038610655565b6020813d6020116106f7575b816106d66020938361050c565b810103126106f357519081151582036106f05750386106b6565b80fd5b5080fd5b3d91506106c9565b6040513d6000823e3d90fd5b503390565b506018361061061e56fea264697066735822122008e4003f7ad7989d07c908ace7aa24855d02d617d01206bfb5cc78b6a306a24464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x7D2 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x750 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x5EE ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x171 JUMPI PUSH4 0xA330F88D EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH2 0x69 PUSH2 0x5D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x13F JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x4DB JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1E1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x4DB JUMP JUMPDEST SWAP3 PUSH2 0x1EA PUSH2 0x5D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x48A JUMPI POP PUSH2 0x240 DUP2 PUSH2 0x57C JUMP JUMPDEST SWAP3 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x50C JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x16C JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x45D JUMPI POP POP POP PUSH2 0x278 DUP4 PUSH2 0x57C JUMP JUMPDEST SWAP3 PUSH2 0x286 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x50C JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x16C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x44D JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x423 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2BE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DD DUP3 DUP5 PUSH2 0x594 JUMP JUMPDEST MLOAD AND PUSH2 0x2E9 DUP3 DUP7 PUSH2 0x594 JUMP JUMPDEST MLOAD SWAP1 DUP1 ISZERO PUSH2 0x3F9 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3CB JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2B5 JUMP JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29D JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x16C JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x265 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x16C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x16C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x16C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x54D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x54D JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5A8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x70B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x710 JUMPI JUMPDEST PUSH2 0x70B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x662 JUMPI JUMPDEST POP PUSH2 0x65F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6BD JUMPI JUMPDEST POP CODESIZE PUSH2 0x655 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F7 JUMPI JUMPDEST DUP2 PUSH2 0x6D6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x50C JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x6F3 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6F0 JUMPI POP CODESIZE PUSH2 0x6B6 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x6C9 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x61E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD RETF STOP EXTCODEHASH PUSH27 0xD7989D07C908ACE7AA24855D02D617D01206BFB5CC78B6A306A244 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"955:1065:313:-:0;;;;;;;;;;;;;-1:-1:-1;;955:1065:313;;;;-1:-1:-1;;;;;955:1065:313;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;955:1065:313;;;;;;745:39:76;;955:1065:313;;;;;;;;745:39:76;955:1065:313;;;;;;;-1:-1:-1;955:1065:313;;;;;;-1:-1:-1;955:1065:313;;;;;-1:-1:-1;955:1065:313"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1243,"id":null,"parameterSlots":2,"returnSlots":2},"array_allocation_size_array_address_dyn":{"entryPoint":1404,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1292,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":1495,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1428,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1518}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80639da5e832146101715763a330f88d1461003257600080fd5b3461016c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c576100696105d7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361013f577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461016c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5760043567ffffffffffffffff811161016c576101c09036906004016104db565b9060243567ffffffffffffffff811161016c576101e19036906004016104db565b926101ea6105d7565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff161561048a57506102408161057c565b9261024e604051948561050c565b818452602084019160051b81019036821161016c57915b81831061045d575050506102788361057c565b92610286604051948561050c565b808452602084019060051b82019136831161016c57905b82821061044d57505050805190825182036104235760005b8281106102be57005b73ffffffffffffffffffffffffffffffffffffffff6102dd8284610594565b51166102e98286610594565b519080156103f957816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff604060002054166103cb579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102b5565b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b813581526020918201910161029d565b823573ffffffffffffffffffffffffffffffffffffffff8116810361016c57815260209283019201610265565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b9181601f8401121561016c5782359167ffffffffffffffff831161016c576020808501948460051b01011161016c57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761054d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161054d5760051b60200190565b80518210156105a85760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561070b573233148015610710575b61070b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610662575b5061065f57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106ff576000916106bd575b5038610655565b6020813d6020116106f7575b816106d66020938361050c565b810103126106f357519081151582036106f05750386106b6565b80fd5b5080fd5b3d91506106c9565b6040513d6000823e3d90fd5b503390565b506018361061061e56fea264697066735822122008e4003f7ad7989d07c908ace7aa24855d02d617d01206bfb5cc78b6a306a24464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x171 JUMPI PUSH4 0xA330F88D EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH2 0x69 PUSH2 0x5D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x13F JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x4DB JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1E1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x4DB JUMP JUMPDEST SWAP3 PUSH2 0x1EA PUSH2 0x5D7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x48A JUMPI POP PUSH2 0x240 DUP2 PUSH2 0x57C JUMP JUMPDEST SWAP3 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x50C JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x16C JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x45D JUMPI POP POP POP PUSH2 0x278 DUP4 PUSH2 0x57C JUMP JUMPDEST SWAP3 PUSH2 0x286 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x50C JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x16C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x44D JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x423 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2BE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DD DUP3 DUP5 PUSH2 0x594 JUMP JUMPDEST MLOAD AND PUSH2 0x2E9 DUP3 DUP7 PUSH2 0x594 JUMP JUMPDEST MLOAD SWAP1 DUP1 ISZERO PUSH2 0x3F9 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3CB JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2B5 JUMP JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29D JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x16C JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x265 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x16C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x16C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x16C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x54D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x54D JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5A8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x70B JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x710 JUMPI JUMPDEST PUSH2 0x70B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x662 JUMPI JUMPDEST POP PUSH2 0x65F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6FF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6BD JUMPI JUMPDEST POP CODESIZE PUSH2 0x655 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6F7 JUMPI JUMPDEST DUP2 PUSH2 0x6D6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x50C JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x6F3 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x6F0 JUMPI POP CODESIZE PUSH2 0x6B6 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x6C9 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x61E JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADDMOD RETF STOP EXTCODEHASH PUSH27 0xD7989D07C908ACE7AA24855D02D617D01206BFB5CC78B6A306A244 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"955:1065:313:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1737:41;;:::i;:::-;1062:8:300;955:1065:313;;;1062:8:300;;;3174:18:180;;;3170:53;;3650:36:327;955:1065:313;500:10:59;955:1065:313;500:10:59;;;;;;;636:1:180;500:10:59;;;955:1065:313;3170:53:180;3201:22;955:1065:313;3201:22:180;955:1065:313;;;;3201:22:180;955:1065:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1737:41;;;:::i;:::-;1062:8:300;;955:1065:313;;;;;;;;;;;;;3741:25:41;3737:66;;1062:8:300;;;;:::i;:::-;955:1065:313;1062:8:300;955:1065:313;;1062:8:300;;;:::i;:::-;;;;955:1065:313;1062:8:300;;;;;;;955:1065:313;;1062:8:300;;;;;;;;;;;;;;;;;:::i;:::-;955:1065:313;1062:8:300;955:1065:313;;1062:8:300;;;:::i;:::-;;;;955:1065:313;1062:8:300;;;;;;;955:1065:313;;1062:8:300;;;;;;;;;;;955:1065:313;;;;;;;;17796:25:327;;17792:64;;955:1065:313;17882:10:327;;;;;;955:1065:313;17894:3:327;1062:8:300;17920:13:327;;;;:::i;:::-;955:1065:313;1062:8:300;17935:11:327;;;;:::i;:::-;955:1065:313;14119:16:327;;;14115:54;;955:1065:313;;;;;;1062:8:300;955:1065:313;;;;1062:8:300;14179:72:327;;955:1065:313;762:1:41;955:1065:313;;;;;;;;;;;;;;;;;;14415:10:327;955:1065:313;;;;;;;;;;14455:33:327;;;;955:1065:313;17871:9:327;;14179:72;14223:28;;955:1065:313;14223:28:327;955:1065:313;;;;14223:28:327;14115:54;14144:25;955:1065:313;14144:25:327;955:1065:313;;14144:25:327;17792:64;17830:26;955:1065:313;17830:26:327;955:1065:313;;17830:26:327;1062:8:300;;;;;955:1065:313;1062:8:300;;;;;;;;;;;;;;;;;;;955:1065:313;1062:8:300;;;;;;;3737:66:41;3775:28;955:1065:313;3775:28:41;955:1065:313;;;;;;;3775:28:41;955:1065:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1062:8:300:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1062:8:300;;;;;-1:-1:-1;1062:8:300;;;;;;;;;;;;:::o;955:1065:313:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;1062:8:300;1029:19:76;1062:8:300;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;955:1065:313;;;;;;1676:74:76;;;;955:1065:313;1676:74:76;;;;;;955:1065:313;1327:10:76;955:1065:313;;;;1744:4:76;955:1065:313;;;;1676:74:76;;;;;;;955:1065:313;1676:74:76;;;1630:120;;;;;1676:74;955:1065:313;1676:74:76;;955:1065:313;1676:74:76;;;;;;955:1065:313;1676:74:76;;;:::i;:::-;;;955:1065:313;;;;;;;;;;;;;1676:74:76;;;;955:1065:313;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;955:1065:313;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"374400","executionCost":"infinite","totalCost":"infinite"},"external":{"deliver(address[],uint256[])":"infinite","initERC721DeliverableStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832","initERC721DeliverableStorage()":"a330f88d"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721DeliverableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721DeliverableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"initERC721DeliverableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol\":\"ERC721DeliverableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721DeliverableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../base/ERC721DeliverableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721DeliverableFacet is ERC721DeliverableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721DeliverableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x0ec6d420f08299aa871c44b05c864c6f0db80c80e7204a463547b83d13e02d04\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"initERC721DeliverableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."}},"notice":"ERC721Deliverable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol":{"ERC721DeliverableOnceFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721DeliverableOnceStorage","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721DeliverableOnceStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61082738819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b03811681036066576080526040516107a590816100828239608051816106430152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80639da5e832146101715763c0b884681461003257600080fd5b3461016c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5761006961062c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361013f577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461016c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5760043567ffffffffffffffff811161016c576101c0903690600401610530565b9060243567ffffffffffffffff811161016c576101e1903690600401610530565b926101ea61062c565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff16156104df5750610240816105d1565b9261024e6040519485610561565b818452602084019160051b81019036821161016c57915b8183106104b257505050610278836105d1565b926102866040519485610561565b808452602084019060051b82019136831161016c57905b8282106104a257505050805190825182036104785760005b8281106102be57005b73ffffffffffffffffffffffffffffffffffffffff6102dd82846105e9565b5116801561044e576102ef82866105e9565b5190816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610420577fdead000000000000000000000000000000000000000000000000000000000000146103f2579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102b5565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b813581526020918201910161029d565b823573ffffffffffffffffffffffffffffffffffffffff8116810361016c57815260209283019201610265565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b9181601f8401121561016c5782359167ffffffffffffffff831161016c576020808501948460051b01011161016c57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105a257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105a25760051b60200190565b80518210156105fd5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610760573233148015610765575b610760577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106b7575b506106b457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561075457600091610712575b50386106aa565b6020813d60201161074c575b8161072b60209383610561565b81010312610748575190811515820361074557503861070b565b80fd5b5080fd5b3d915061071e565b6040513d6000823e3d90fd5b503390565b506018361061067356fea2646970667358221220c739130b30178f1392f9334c13ec5e15f6d9396e9065eff49a639fc79dc3e36564736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x827 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x7A5 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x643 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x171 JUMPI PUSH4 0xC0B88468 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH2 0x69 PUSH2 0x62C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x13F JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x530 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1E1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x530 JUMP JUMPDEST SWAP3 PUSH2 0x1EA PUSH2 0x62C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x4DF JUMPI POP PUSH2 0x240 DUP2 PUSH2 0x5D1 JUMP JUMPDEST SWAP3 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x561 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x16C JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4B2 JUMPI POP POP POP PUSH2 0x278 DUP4 PUSH2 0x5D1 JUMP JUMPDEST SWAP3 PUSH2 0x286 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x561 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x16C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x4A2 JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x478 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2BE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DD DUP3 DUP5 PUSH2 0x5E9 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x44E JUMPI PUSH2 0x2EF DUP3 DUP7 PUSH2 0x5E9 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x420 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3F2 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2B5 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29D JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x16C JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x265 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x16C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x16C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x16C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5A2 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5A2 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5FD JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x760 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x765 JUMPI JUMPDEST PUSH2 0x760 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6B7 JUMPI JUMPDEST POP PUSH2 0x6B4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x712 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x74C JUMPI JUMPDEST DUP2 PUSH2 0x72B PUSH1 0x20 SWAP4 DUP4 PUSH2 0x561 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x748 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x745 JUMPI POP CODESIZE PUSH2 0x70B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x71E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x673 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 CODECOPY SGT SIGNEXTEND ADDRESS OR DUP16 SGT SWAP3 EXTDELEGATECALL CALLER 0x4C SGT EOFCREATE 0x5E ISZERO 0xF6 0xD9 CODECOPY PUSH15 0x9065EFF49A639FC79DC3E36564736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"966:1077:314:-:0;;;;;;;;;;;;;-1:-1:-1;;966:1077:314;;;;-1:-1:-1;;;;;966:1077:314;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;966:1077:314;;;;;;745:39:76;;966:1077:314;;;;;;;;745:39:76;966:1077:314;;;;;;;-1:-1:-1;966:1077:314;;;;;;-1:-1:-1;966:1077:314;;;;;-1:-1:-1;966:1077:314"},"deployedBytecode":{"functionDebugData":{"abi_decode_array_address_dyn_calldata":{"entryPoint":1328,"id":null,"parameterSlots":2,"returnSlots":2},"array_allocation_size_array_address_dyn":{"entryPoint":1489,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1377,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":1580,"id":13231,"parameterSlots":0,"returnSlots":1},"memory_array_index_access_address_dyn":{"entryPoint":1513,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1603}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80639da5e832146101715763c0b884681461003257600080fd5b3461016c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5761006961062c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361013f577f9da5e832000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b3461016c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016c5760043567ffffffffffffffff811161016c576101c0903690600401610530565b9060243567ffffffffffffffff811161016c576101e1903690600401610530565b926101ea61062c565b73ffffffffffffffffffffffffffffffffffffffff1660008181527fa566cc5e84127e60ff6e43ef5ab714cef165d6a542e1561d831da0485141a0c2602052604090205460ff16156104df5750610240816105d1565b9261024e6040519485610561565b818452602084019160051b81019036821161016c57915b8183106104b257505050610278836105d1565b926102866040519485610561565b808452602084019060051b82019136831161016c57905b8282106104a257505050805190825182036104785760005b8281106102be57005b73ffffffffffffffffffffffffffffffffffffffff6102dd82846105e9565b5116801561044e576102ef82866105e9565b5190816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610420577fdead000000000000000000000000000000000000000000000000000000000000146103f2579060019291816000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205280604060002055604060008281527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016102b5565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b813581526020918201910161029d565b823573ffffffffffffffffffffffffffffffffffffffff8116810361016c57815260209283019201610265565b7f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e746572000000000000000000000000000000000000000000000000000060045260245260446000fd5b9181601f8401121561016c5782359167ffffffffffffffff831161016c576020808501948460051b01011161016c57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105a257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105a25760051b60200190565b80518210156105fd5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610760573233148015610765575b610760577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156106b7575b506106b457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa90811561075457600091610712575b50386106aa565b6020813d60201161074c575b8161072b60209383610561565b81010312610748575190811515820361074557503861070b565b80fd5b5080fd5b3d915061071e565b6040513d6000823e3d90fd5b503390565b506018361061067356fea2646970667358221220c739130b30178f1392f9334c13ec5e15f6d9396e9065eff49a639fc79dc3e36564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x171 JUMPI PUSH4 0xC0B88468 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH2 0x69 PUSH2 0x62C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x13F JUMPI PUSH32 0x9DA5E83200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x16C JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x16C JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1C0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x530 JUMP JUMPDEST SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16C JUMPI PUSH2 0x1E1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x530 JUMP JUMPDEST SWAP3 PUSH2 0x1EA PUSH2 0x62C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH32 0xA566CC5E84127E60FF6E43EF5AB714CEF165D6A542E1561D831DA0485141A0C2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x4DF JUMPI POP PUSH2 0x240 DUP2 PUSH2 0x5D1 JUMP JUMPDEST SWAP3 PUSH2 0x24E PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x561 JUMP JUMPDEST DUP2 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x16C JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4B2 JUMPI POP POP POP PUSH2 0x278 DUP4 PUSH2 0x5D1 JUMP JUMPDEST SWAP3 PUSH2 0x286 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x561 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP1 PUSH1 0x5 SHL DUP3 ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x16C JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x4A2 JUMPI POP POP POP DUP1 MLOAD SWAP1 DUP3 MLOAD DUP3 SUB PUSH2 0x478 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2BE JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2DD DUP3 DUP5 PUSH2 0x5E9 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x44E JUMPI PUSH2 0x2EF DUP3 DUP7 PUSH2 0x5E9 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x420 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3F2 JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2B5 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29D JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x16C JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x265 JUMP JUMPDEST PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x16C JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x16C JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x16C JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5A2 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5A2 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x5FD JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x760 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x765 JUMPI JUMPDEST PUSH2 0x760 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x6B7 JUMPI JUMPDEST POP PUSH2 0x6B4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x712 JUMPI JUMPDEST POP CODESIZE PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x74C JUMPI JUMPDEST DUP2 PUSH2 0x72B PUSH1 0x20 SWAP4 DUP4 PUSH2 0x561 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x748 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x745 JUMPI POP CODESIZE PUSH2 0x70B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x71E JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x673 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 CODECOPY SGT SIGNEXTEND ADDRESS OR DUP16 SGT SWAP3 EXTDELEGATECALL CALLER 0x4C SGT EOFCREATE 0x5E ISZERO 0xF6 0xD9 CODECOPY PUSH15 0x9065EFF49A639FC79DC3E36564736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"966:1077:314:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1760:41;;:::i;:::-;1072:8:301;966:1077:314;;;1072:8:301;;;3174:18:180;;;3170:53;;3650:36:327;966:1077:314;500:10:59;966:1077:314;500:10:59;;;;;;;636:1:180;500:10:59;;;966:1077:314;3170:53:180;3201:22;966:1077:314;3201:22:180;966:1077:314;;;;3201:22:180;966:1077:314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1760:41;;;:::i;:::-;1072:8:301;;966:1077:314;;;;;;;;;;;;;3741:25:41;3737:66;;1072:8:301;;;;:::i;:::-;966:1077:314;1072:8:301;966:1077:314;;1072:8:301;;;:::i;:::-;;;;966:1077:314;1072:8:301;;;;;;;966:1077:314;;1072:8:301;;;;;;;;;;;;;;;;;:::i;:::-;966:1077:314;1072:8:301;966:1077:314;;1072:8:301;;;:::i;:::-;;;;966:1077:314;1072:8:301;;;;;;;966:1077:314;;1072:8:301;;;;;;;;;;;966:1077:314;;;;;;;;22754:25:327;;22750:64;;966:1077:314;22840:10:327;;;;;;966:1077:314;22852:3:327;1072:8:301;22884:13:327;;;;:::i;:::-;966:1077:314;1072:8:301;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;966:1077:314;;;;;;;;;;;;1072:8:301;;;23070:60:327;;2414:66;30830:32;23144:59;;966:1077:314;762:1:41;966:1077:314;;;;;;;;;;;;;;;;;;23302:10:327;966:1077:314;;;;;;;;;;23350:33:327;;;;966:1077:314;22829:9:327;;23144:59;23178:25;;966:1077:314;23178:25:327;966:1077:314;;;;23178:25:327;23070:60;23102:28;;966:1077:314;23102:28:327;966:1077:314;;;;23102:28:327;22911:54;22940:25;966:1077:314;22940:25:327;966:1077:314;;22940:25:327;22750:64;22788:26;966:1077:314;22788:26:327;966:1077:314;;22788:26:327;1072:8:301;;;;;966:1077:314;1072:8:301;;;;;;;;;;;;;;;;;;;966:1077:314;1072:8:301;;;;;;;3737:66:41;3775:28;966:1077:314;3775:28:41;966:1077:314;;;;;;;3775:28:41;966:1077:314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1072:8:301:-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1072:8:301;;;;;-1:-1:-1;1072:8:301;;;;;;;;;;;;:::o;966:1077:314:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;1072:8:301;1029:19:76;1072:8:301;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;966:1077:314;;;;;;1676:74:76;;;;966:1077:314;1676:74:76;;;;;;966:1077:314;1327:10:76;966:1077:314;;;;1744:4:76;966:1077:314;;;;1676:74:76;;;;;;;966:1077:314;1676:74:76;;;1630:120;;;;;1676:74;966:1077:314;1676:74:76;;966:1077:314;1676:74:76;;;;;;966:1077:314;1676:74:76;;;:::i;:::-;;;966:1077:314;;;;;;;;;;;;;1676:74:76;;;;966:1077:314;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;966:1077:314;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"391400","executionCost":"infinite","totalCost":"infinite"},"external":{"deliver(address[],uint256[])":"infinite","initERC721DeliverableOnceStorage()":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832","initERC721DeliverableOnceStorage()":"c0b88468"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721DeliverableOnceStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721DeliverableOnceStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"initERC721DeliverableOnceStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\"}},\"notice\":\"ERC721Deliverable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol\":\"ERC721DeliverableOnceFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721DeliverableOnceFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./../base/ERC721DeliverableOnceBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (facet version).\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721DeliverableOnceFacet is ERC721DeliverableOnceBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721DeliverableOnceStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xa56b72ed289ddb4f9904da4a9629f12aa07a427ced22a3487b501019b7cfaa63\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"initERC721DeliverableOnceStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Deliverable."}},"notice":"ERC721Deliverable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/facets/ERC721Facet.sol":{"ERC721Facet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC721Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"initERC721Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61121f38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161119d9081610082823960805181610de90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063081812fc1461093c578063095ea7b3146106e457806323b872dd146106a357806342842e0e1461063a5780636352211e1461058557806370a08231146104bb578063a22cb46514610390578063b1c7ee0214610256578063b88d4fde146101435763e985e9c51461008a57600080fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576100c16109b7565b73ffffffffffffffffffffffffffffffffffffffff6100de6109da565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b3461013e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761017a6109b7565b6101826109da565b6044356064359167ffffffffffffffff831161013e573660238401121561013e5782600401359367ffffffffffffffff851161013e57366024868601011161013e577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06101fa8484846101f3610dd2565b8095610b13565b823b61020257005b6000602061025497806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601996102436040519b8c610d62565b828b5201838a013787010152610f95565b005b3461013e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761028d610dd2565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610363577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576103c76109b7565b6024359081151580920361013e5773ffffffffffffffffffffffffffffffffffffffff806103f3610dd2565b1691169181831461048d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576104f26109b7565b73ffffffffffffffffffffffffffffffffffffffff81161561055b5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561060c57602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e57610648366109fd565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161067f828286610678610dd2565b8097610b13565b803b61068757005b610254936040519361069a602086610d62565b60008552610f95565b3461013e576102546106b4366109fd565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06106de610dd2565b90610b13565b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761071b6109b7565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090610749610dd2565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561090e5773ffffffffffffffffffffffffffffffffffffffff16938385146108e05761079f818585610f15565b156108945750836108035774010000000000000000000000000000000000000000166107ef575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836107c6565b90740100000000000000000000000000000000000000008217809203610880575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556107c8565b846000526020526040600020558380610824565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5760206109996004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610a6f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261013e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060243573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610ae557740100000000000000000000000000000000000000001615610ade576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610d3857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610d0a5773ffffffffffffffffffffffffffffffffffffffff8116809503610cd85782610b879185610f15565b15610c1d575b5050836000528060205282604060002055828203610bce575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610ba6565b7401000000000000000000000000000000000000000016158015610c92575b610c465780610b8d565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610c3c565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610da357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610f06573233148015610f0b575b610f06577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e5d575b50610e5a57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610efa57600091610eb8575b5038610e50565b6020813d602011610ef2575b81610ed160209383610d62565b81010312610eee5751908115158203610eeb575038610eb1565b80fd5b5080fd5b3d9150610ec4565b6040513d6000823e3d90fd5b503390565b5060183610610e19565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610f40575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610f3a565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061114f57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610efa576000916110d4575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110a4575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611147575b816110ed60209383610d62565b81010312610eee5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eeb57507fffffffff00000000000000000000000000000000000000000000000000000000611056565b3d91506110e0565b602082820181015160a487840101528593500161100156fea2646970667358221220ef89b7767e8654fbda818928071c8f4e88ba3a7ef6c58baf9614faeff94cb83264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x121F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x119D SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xDE9 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0x93C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x6E4 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x6A3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x4BB JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x143 JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0xC1 PUSH2 0x9B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDE PUSH2 0x9DA JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x17A PUSH2 0x9B7 JUMP JUMPDEST PUSH2 0x182 PUSH2 0x9DA JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x13E JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x13E JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1FA DUP5 DUP5 DUP5 PUSH2 0x1F3 PUSH2 0xDD2 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0xB13 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x202 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x254 SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x243 PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xD62 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0xF95 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x28D PUSH2 0xDD2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x363 JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x3C7 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x13E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3F3 PUSH2 0xDD2 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x48D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x4F2 PUSH2 0x9B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x55B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x60C JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x648 CALLDATASIZE PUSH2 0x9FD JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x67F DUP3 DUP3 DUP7 PUSH2 0x678 PUSH2 0xDD2 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xB13 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x687 JUMPI STOP JUMPDEST PUSH2 0x254 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x69A PUSH1 0x20 DUP7 PUSH2 0xD62 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0xF95 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x254 PUSH2 0x6B4 CALLDATASIZE PUSH2 0x9FD JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x6DE PUSH2 0xDD2 JUMP JUMPDEST SWAP1 PUSH2 0xB13 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x71B PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x749 PUSH2 0xDD2 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x90E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x8E0 JUMPI PUSH2 0x79F DUP2 DUP6 DUP6 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x894 JUMPI POP DUP4 PUSH2 0x803 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x7EF JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x7C6 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x880 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x7C8 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x824 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x20 PUSH2 0x999 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xA6F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xAE5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xADE JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xD38 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xD0A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xCD8 JUMPI DUP3 PUSH2 0xB87 SWAP2 DUP6 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0xC1D JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xBCE JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xBA6 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xC92 JUMPI JUMPDEST PUSH2 0xC46 JUMPI DUP1 PUSH2 0xB8D JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xC3C JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xDA3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xF06 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xF0B JUMPI JUMPDEST PUSH2 0xF06 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE5D JUMPI JUMPDEST POP PUSH2 0xE5A JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEFA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEB8 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEF2 JUMPI JUMPDEST DUP2 PUSH2 0xED1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xD62 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEEE JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xEEB JUMPI POP CODESIZE PUSH2 0xEB1 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xEC4 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xE19 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xF40 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xF3A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x114F JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEFA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10D4 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10A4 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1147 JUMPI JUMPDEST DUP2 PUSH2 0x10ED PUSH1 0x20 SWAP4 DUP4 PUSH2 0xD62 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEEE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEEB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1056 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10E0 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1001 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEF DUP10 0xB7 PUSH23 0x7E8654FBDA818928071C8F4E88BA3A7EF6C58BAF9614FA 0xEF EXTDELEGATECALL 0x4C 0xB8 ORIGIN PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"794:1002:315:-:0;;;;;;;;;;;;;-1:-1:-1;;794:1002:315;;;;-1:-1:-1;;;;;794:1002:315;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;794:1002:315;;;;;;745:39:76;;794:1002:315;;;;;;;;745:39:76;794:1002:315;;;;;;;-1:-1:-1;794:1002:315;;;;;;-1:-1:-1;794:1002:315;;;;;-1:-1:-1;794:1002:315"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2487,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":2557,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_t_address":{"entryPoint":2522,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":3426,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":3989,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_getApproved":{"entryPoint":2671,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":3861,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":3538,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferFrom":{"entryPoint":2835,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":3561}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063081812fc1461093c578063095ea7b3146106e457806323b872dd146106a357806342842e0e1461063a5780636352211e1461058557806370a08231146104bb578063a22cb46514610390578063b1c7ee0214610256578063b88d4fde146101435763e985e9c51461008a57600080fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576100c16109b7565b73ffffffffffffffffffffffffffffffffffffffff6100de6109da565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b3461013e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761017a6109b7565b6101826109da565b6044356064359167ffffffffffffffff831161013e573660238401121561013e5782600401359367ffffffffffffffff851161013e57366024868601011161013e577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06101fa8484846101f3610dd2565b8095610b13565b823b61020257005b6000602061025497806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601996102436040519b8c610d62565b828b5201838a013787010152610f95565b005b3461013e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761028d610dd2565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610363577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576103c76109b7565b6024359081151580920361013e5773ffffffffffffffffffffffffffffffffffffffff806103f3610dd2565b1691169181831461048d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576104f26109b7565b73ffffffffffffffffffffffffffffffffffffffff81161561055b5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416801561060c57602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e57610648366109fd565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161067f828286610678610dd2565b8097610b13565b803b61068757005b610254936040519361069a602086610d62565b60008552610f95565b3461013e576102546106b4366109fd565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06106de610dd2565b90610b13565b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761071b6109b7565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c090610749610dd2565b91836000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811692831561090e5773ffffffffffffffffffffffffffffffffffffffff16938385146108e05761079f818585610f15565b156108945750836108035774010000000000000000000000000000000000000000166107ef575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836107c6565b90740100000000000000000000000000000000000000008217809203610880575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556107c8565b846000526020526040600020558380610824565b8373ffffffffffffffffffffffffffffffffffffffff87927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b837fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5760206109996004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610a6f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261013e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060243573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610ae557740100000000000000000000000000000000000000001615610ade576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610d3857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610d0a5773ffffffffffffffffffffffffffffffffffffffff8116809503610cd85782610b879185610f15565b15610c1d575b5050836000528060205282604060002055828203610bce575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610ba6565b7401000000000000000000000000000000000000000016158015610c92575b610c465780610b8d565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610c3c565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610da357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610f06573233148015610f0b575b610f06577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610e5d575b50610e5a57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610efa57600091610eb8575b5038610e50565b6020813d602011610ef2575b81610ed160209383610d62565b81010312610eee5751908115158203610eeb575038610eb1565b80fd5b5080fd5b3d9150610ec4565b6040513d6000823e3d90fd5b503390565b5060183610610e19565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315610f40575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080610f3a565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b83811061114f57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af1908115610efa576000916110d4575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036110a4575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611147575b816110ed60209383610d62565b81010312610eee5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610eeb57507fffffffff00000000000000000000000000000000000000000000000000000000611056565b3d91506110e0565b602082820181015160a487840101528593500161100156fea2646970667358221220ef89b7767e8654fbda818928071c8f4e88ba3a7ef6c58baf9614faeff94cb83264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0x93C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x6E4 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x6A3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x4BB JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x390 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x143 JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0xC1 PUSH2 0x9B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDE PUSH2 0x9DA JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x17A PUSH2 0x9B7 JUMP JUMPDEST PUSH2 0x182 PUSH2 0x9DA JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x13E JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x13E JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1FA DUP5 DUP5 DUP5 PUSH2 0x1F3 PUSH2 0xDD2 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0xB13 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x202 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x254 SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x243 PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xD62 JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0xF95 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x28D PUSH2 0xDD2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x363 JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x3C7 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO DUP1 SWAP3 SUB PUSH2 0x13E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x3F3 PUSH2 0xDD2 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x48D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x4F2 PUSH2 0x9B7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x55B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x60C JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x648 CALLDATASIZE PUSH2 0x9FD JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x67F DUP3 DUP3 DUP7 PUSH2 0x678 PUSH2 0xDD2 JUMP JUMPDEST DUP1 SWAP8 PUSH2 0xB13 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x687 JUMPI STOP JUMPDEST PUSH2 0x254 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x69A PUSH1 0x20 DUP7 PUSH2 0xD62 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0xF95 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x254 PUSH2 0x6B4 CALLDATASIZE PUSH2 0x9FD JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x6DE PUSH2 0xDD2 JUMP JUMPDEST SWAP1 PUSH2 0xB13 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x71B PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP1 PUSH2 0x749 PUSH2 0xDD2 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP3 DUP4 ISZERO PUSH2 0x90E JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 DUP4 DUP6 EQ PUSH2 0x8E0 JUMPI PUSH2 0x79F DUP2 DUP6 DUP6 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x894 JUMPI POP DUP4 PUSH2 0x803 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x7EF JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x7C6 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x880 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x7C8 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x824 JUMP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x20 PUSH2 0x999 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xA6F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xAE5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xADE JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xD38 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xD0A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xCD8 JUMPI DUP3 PUSH2 0xB87 SWAP2 DUP6 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0xC1D JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xBCE JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xBA6 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xC92 JUMPI JUMPDEST PUSH2 0xC46 JUMPI DUP1 PUSH2 0xB8D JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xC3C JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xDA3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xF06 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xF0B JUMPI JUMPDEST PUSH2 0xF06 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xE5D JUMPI JUMPDEST POP PUSH2 0xE5A JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEFA JUMPI PUSH1 0x0 SWAP2 PUSH2 0xEB8 JUMPI JUMPDEST POP CODESIZE PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEF2 JUMPI JUMPDEST DUP2 PUSH2 0xED1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xD62 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEEE JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xEEB JUMPI POP CODESIZE PUSH2 0xEB1 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xEC4 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xE19 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0xF40 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0xF3A JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x114F JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEFA JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10D4 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x10A4 JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1147 JUMPI JUMPDEST DUP2 PUSH2 0x10ED PUSH1 0x20 SWAP4 DUP4 PUSH2 0xD62 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xEEE JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEEB JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1056 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x10E0 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1001 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEF DUP10 0xB7 PUSH23 0x7E8654FBDA818928071C8F4E88BA3A7EF6C58BAF9614FA 0xEF EXTDELEGATECALL 0x4C 0xB8 ORIGIN PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"794:1002:315:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;794:1002:315;-1:-1:-1;794:1002:315;28718:11:327;794:1002:315;;;;-1:-1:-1;794:1002:315;28718:28:327;794:1002:315;-1:-1:-1;794:1002:315;;;;;;-1:-1:-1;794:1002:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11217:7:327;1513:41:315;;;;;:::i;:::-;11217:7:327;;;:::i;:::-;376:58:354;;11235:101:327;;794:1002:315;11235:101:327;794:1002:315;;11271:54:327;794:1002:315;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11271:54:327;:::i;:::-;794:1002:315;;;;;;;;;;;;1513:41;;:::i;:::-;794:1002;;;;;;;3174:18:180;;;3170:53;;2657:25:327;794:1002:315;500:10:59;794:1002:315;500:10:59;;;794:1002:315;;;;636:1:180;794:1002:315;;;;3170:53:180;3201:22;794:1002:315;3201:22:180;794:1002:315;;;;3201:22:180;794:1002:315;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1513:41;;;:::i;:::-;794:1002;;;6339:18:327;;;;6335:63;;794:1002:315;6463:42:327;6408:19;794:1002:315;-1:-1:-1;794:1002:315;6408:11:327;794:1002:315;;;-1:-1:-1;794:1002:315;;-1:-1:-1;794:1002:315;;;;-1:-1:-1;794:1002:315;;;;;;;;;;;;;;;;6463:42:327;794:1002:315;6335:63:327;6366:32;;794:1002:315;6366:32:327;794:1002:315;;;;6366:32:327;794:1002:315;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;794:1002:315;;-1:-1:-1;794:1002:315;26801:10:327;794:1002:315;;;;-1:-1:-1;794:1002:315;;;;;;;;26724:60:327;26756:28;794:1002:315;26756:28:327;794:1002:315;;26756:28:327;794:1002:315;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;794:1002:315;;;;;;;;27291:64:327;27324:31;;794:1002:315;27324:31:327;794:1002:315;;;;27324:31:327;794:1002:315;;;;;;;:::i;:::-;;1513:41;9668:7:327;1513:41:315;;;;;:::i;:::-;9668:7:327;;;:::i;:::-;376:58:354;;9686:99:327;;794:1002:315;9686:99:327;9722:52;794:1002:315;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;794:1002:315:-;;;;1128:7:296;794:1002:315;;;:::i;:::-;29158:19:327;794:1002:315;1513:41;;:::i;:::-;1128:7:296;;:::i;794:1002:315:-;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;794:1002:315;1513:41;;;:::i;:::-;794:1002;;;;;;;;;;;;;;30700:19:327;;;4802:64;;794:1002:315;;4931:18:327;;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;794:1002:315;5670:35:327;;794:1002:315;5157:173:327;794:1002:315;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;794:1002:315;;;;;5620:11:327;794:1002:315;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;794:1002:315;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;794:1002:315;5052:59:327;;;794:1002:315;5052:59:327;794:1002:315;;;;;;;;;5052:59:327;4927:63;4958:32;;794:1002:315;4958:32:327;794:1002:315;;;;4958:32:327;4802:64;4835:31;;794:1002:315;4835:31:327;794:1002:315;;;;4835:31:327;794:1002:315;;;;;;;;;;;;2087:43:296;794:1002:315;;;2087:43:296;:::i;:::-;794:1002:315;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27798:360:327:-;794:1002:315;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;794:1002:315;;;28073:11:327;794:1002:315;;;;;;;;28066:27:327;:::o;28022:130::-;28124:17;;794:1002:315;28124:17:327;:::o;27948:64::-;27981:31;;794:1002:315;27981:31:327;;794:1002:315;;;27981:31:327;7385:956;;;794:1002:315;;7507:16:327;;;7503:58;;794:1002:315;7521:1:327;794:1002:315;;;;;7521:1:327;794:1002:315;;;;;30700:19:327;;;7615:64;;794:1002:315;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;794:1002:315;;;7521:1:327;794:1002:315;;;;;;7521:1:327;794:1002:315;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;794:1002:315;-1:-1:-1;794:1002:315;;;;;-1:-1:-1;794:1002:315;;;;;2220:8:327;;794:1002:315;-1:-1:-1;794:1002:315;;;;-1:-1:-1;794:1002:315;8155:10:327;794:1002:315;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;794:1002:315;7896:51:327;;;7521:1;7896:51;794:1002:315;7896:51:327;794:1002:315;;;;;;7521:1:327;7896:51;7828:59;794:1002:315;;7521:1:327;794:1002:315;7867:11:327;;;794:1002:315;;;;7521:1:327;794:1002:315;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;794:1002:315;;;;7521:1:327;7728:34;7615:64;7648:31;;7521:1;7648:31;;794:1002:315;;7521:1:327;7648:31;7503:58;7532:29;7521:1;7532:29;;7521:1;7532:29;794:1002:315;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;794:1002:315;;;;;-1:-1:-1;794:1002:315;907:917:76;794:1002:315;1029:19:76;794:1002:315;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;794:1002:315;;;;;;1676:74:76;;;;794:1002:315;1676:74:76;;;;;;794:1002:315;1327:10:76;794:1002:315;;;;1744:4:76;794:1002:315;;;;1676:74:76;;;;;;;794:1002:315;1676:74:76;;;1630:120;;;;;1676:74;794:1002:315;1676:74:76;;794:1002:315;1676:74:76;;;;;;794:1002:315;1676:74:76;;;:::i;:::-;;;794:1002:315;;;;;;;;;;;;;1676:74:76;;;;794:1002:315;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;794:1002:315;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;794:1002:315;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;794:1002:315;;-1:-1:-1;794:1002:315;30435:11:327;794:1002:315;;;;-1:-1:-1;794:1002:315;30435:27:327;794:1002:315;-1:-1:-1;794:1002:315;;;;;-1:-1:-1;794:1002:315;;;30413:49:327;;;;;29701:270;;794:1002:315;29701:270:327;;;;;;794:1002:315;;;;;29832:65:327;794:1002:315;29832:65:327;;794:1002:315;29832:65:327;;;794:1002:315;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;794:1002:315;;;;;;;;;;;;;-1:-1:-1;794:1002:315;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;794:1002:315;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29828:136::-;29925:39;-1:-1:-1;29925:39:327;29832:65;794:1002:315;;;;-1:-1:-1;29925:39:327;29832:65;794:1002:315;29832:65:327;;794:1002:315;29832:65:327;;;;;;794:1002:315;29832:65:327;;;:::i;:::-;;;794:1002:315;;;;;;;;;;;;;29832:65:327;794:1002:315;29832:65:327;;;;;-1:-1:-1;29832:65:327;;794:1002:315;;;;;;;;;;;;;;;;-1:-1:-1;794:1002:315;;"},"gasEstimates":{"creation":{"codeDepositCost":"901800","executionCost":"infinite","totalCost":"infinite"},"external":{"approve(address,uint256)":"infinite","balanceOf(address)":"2509","getApproved(uint256)":"4574","initERC721Storage()":"infinite","isApprovedForAll(address,address)":"2714","ownerOf(uint256)":"2432","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","transferFrom(address,address,uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","initERC721Storage()":"b1c7ee02","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"initERC721Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"initERC721Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721Facet.sol\":\"ERC721Facet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ERC721Base is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    function approve(address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().transferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        ERC721Storage.layout().safeTransferFrom(_msgSender(), from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0xa11d88401b90c8a0ac2cc82fa975bfe34e358258efe3f068bcc8e44beb407467\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721Base} from \\\"./../base/ERC721Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, and {InterfaceDetectionFacet}.\\ncontract ERC721Facet is ERC721Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xc0a23ae73e0959fab307e0f323a45a835c55b9a4cddf156ab5857d43d069afc6\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"initERC721Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC721."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/facets/ERC721MetadataFacet.sol":{"ERC721MetadataFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"}],"name":"initERC721MetadataStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.","errors":{"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initERC721MetadataStorage(string,string,address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"metadataResolver":"The address of the metadata resolver contract.","name":"The name of the token.","symbol":"The symbol of the token."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610df838819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610d769081610082823960805181610b0e0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146109c057806395d89b4114610959578063a0c76f62146108e8578063c87b56dd146106bc5763fa6d22ca1461005357600080fd5b346106b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b75760043567ffffffffffffffff81116106b7576100a2903690600401610a88565b60243567ffffffffffffffff81116106b7576100c2903690600401610a88565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036106b7576100ee610af7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361068a57507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58546001811015610658575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116105295781906101be8454610c2b565b601f8111610605575b50600090601f831160011461056357600092610558575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610529576102497f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610c2b565b601f81116104a5575b506000601f82116001146103aa5781929360009261039f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f5b5e139f000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050388061026b565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b86811061048d5750836001959610610455575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556102bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610428565b90926020600181928686013581550194019101610415565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061051f575b601f0160051c01905b8181106105135750610252565b60008155600101610506565b90915081906104fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101de565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105ed57509084600195949392106105b5575b505050811b019055610210565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806105a8565b91936020600181928787013581550195019201610592565b909150836000526020600020601f840160051c8101916020851061064e575b90601f859493920160051c01905b81811061063f57506101c7565b60008155849350600101610632565b9091508190610624565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b757600435806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff60406000205416156108bb57600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416916044604051809481937ff724dad700000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9081156108af576000916107cc575b604051806107c88482610a3e565b0390f35b3d8083833e6107db8183610ab6565b8101906020818303126108a75780519067ffffffffffffffff82116108ab570181601f820112156108a75780519267ffffffffffffffff841161087a576040519261084e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610ab6565b8484526020858401011161087757506107c8926108719160208085019101610a1b565b906107ba565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b757602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b7576107c86109b47f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610c7e565b60405191829182610a3e565b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b7576107c86109b47f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610c7e565b60005b838110610a2e5750506000910152565b8181015183820152602001610a1e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610a818151809281602088015260208888019101610a1b565b0116010190565b9181601f840112156106b75782359167ffffffffffffffff83116106b757602083818601950101116106b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761052957604052565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c1c573233148015610c21575b610c1c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610b82575b50610b7f57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108af57600091610bdd575b5038610b75565b6020813d602011610c14575b81610bf660209383610ab6565b81010312610c105751908115158203610877575038610bd6565b5080fd5b3d9150610be9565b503390565b5060183610610b3e565b90600182811c92168015610c74575b6020831014610c4557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610c3a565b9060405191826000825492610c9284610c2b565b8084529360018116908115610d005750600114610cb9575b50610cb792500383610ab6565b565b90506000929192526020600020906000915b818310610ce4575050906020610cb79282010138610caa565b6020919350806001915483858901015201910190918492610ccb565b60209350610cb79592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610caa56fea2646970667358221220d8c18d0f8d4bff28bf3a379da0afd0fac0295afce1972d719fd6cea9326e7ff464736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xDF8 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xD76 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xB0E ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x9C0 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x959 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x8E8 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x6BC JUMPI PUSH4 0xFA6D22CA EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6B7 JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6B7 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xA88 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6B7 JUMPI PUSH2 0xEE PUSH2 0xAF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x68A JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x658 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x529 JUMPI DUP2 SWAP1 PUSH2 0x1BE DUP5 SLOAD PUSH2 0xC2B JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x605 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x563 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x558 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x529 JUMPI PUSH2 0x249 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xC2B JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x4A5 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3AA JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x39F JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0x5B5E139F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x26B JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x48D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x455 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2BD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x428 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x415 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x51F JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x513 JUMPI POP PUSH2 0x252 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x506 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4FD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1DE JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5ED JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5B5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x210 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x5A8 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x592 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x64E JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x63F JUMPI POP PUSH2 0x1C7 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x632 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8BB JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7CC JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x7C8 DUP5 DUP3 PUSH2 0xA3E JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x7DB DUP2 DUP4 PUSH2 0xAB6 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x8A7 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8AB JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x8A7 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x87A JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0x84E PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xAB6 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x877 JUMPI POP PUSH2 0x7C8 SWAP3 PUSH2 0x871 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xA1B JUMP JUMPDEST SWAP1 PUSH2 0x7BA JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH2 0x7C8 PUSH2 0x9B4 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xC7E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA3E JUMP JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH2 0x7C8 PUSH2 0x9B4 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xC7E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xA2E JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA1E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xA81 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xA1B JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6B7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6B7 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6B7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x529 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC1C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC21 JUMPI JUMPDEST PUSH2 0xC1C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB82 JUMPI JUMPDEST POP PUSH2 0xB7F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBDD JUMPI JUMPDEST POP CODESIZE PUSH2 0xB75 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC14 JUMPI JUMPDEST DUP2 PUSH2 0xBF6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xAB6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC10 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x877 JUMPI POP CODESIZE PUSH2 0xBD6 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xBE9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB3E JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xC74 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xC45 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xC3A JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xC92 DUP5 PUSH2 0xC2B JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xD00 JUMPI POP PUSH1 0x1 EQ PUSH2 0xCB9 JUMPI JUMPDEST POP PUSH2 0xCB7 SWAP3 POP SUB DUP4 PUSH2 0xAB6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xCE4 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xCB7 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xCAA JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xCCB JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xCB7 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xCAA JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD8 0xC1 DUP14 0xF DUP14 0x4B SELFDESTRUCT 0x28 0xBF GASPRICE CALLDATACOPY SWAP14 LOG0 0xAF 0xD0 STATICCALL 0xC0 0x29 GAS 0xFC RJUMPI 0x972D PUSH18 0x9FD6CEA9326E7FF464736F6C634300081E00 CALLER ","sourceMap":"1051:1232:316:-:0;;;;;;;;;;;;;-1:-1:-1;;1051:1232:316;;;;-1:-1:-1;;;;;1051:1232:316;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1051:1232:316;;;;;;745:39:76;;1051:1232:316;;;;;;;;745:39:76;1051:1232:316;;;;;;;-1:-1:-1;1051:1232:316;;;;;;-1:-1:-1;1051:1232:316;;;;;-1:-1:-1;1051:1232:316"},"deployedBytecode":{"functionDebugData":{"abi_decode_string_calldata":{"entryPoint":2696,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":2622,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":3198,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":2587,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":3115,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2742,"id":null,"parameterSlots":2,"returnSlots":0},"fun_msgSender":{"entryPoint":2807,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2830}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806306fdde03146109c057806395d89b4114610959578063a0c76f62146108e8578063c87b56dd146106bc5763fa6d22ca1461005357600080fd5b346106b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b75760043567ffffffffffffffff81116106b7576100a2903690600401610a88565b60243567ffffffffffffffff81116106b7576100c2903690600401610a88565b90926044359273ffffffffffffffffffffffffffffffffffffffff84168094036106b7576100ee610af7565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361068a57507f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4917f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58546001811015610658575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116105295781906101be8454610c2b565b601f8111610605575b50600090601f831160011461056357600092610558575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111610529576102497f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554610c2b565b601f81116104a5575b506000601f82116001146103aa5781929360009261039f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b7fffffffffffffffffffffffff00000000000000000000000000000000000000007f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6557f5b5e139f000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b01359050388061026b565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b86811061048d5750836001959610610455575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556102bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080610428565b90926020600181928686013581550194019101610415565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c8101916020841061051f575b601f0160051c01905b8181106105135750610252565b60008155600101610506565b90915081906104fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b0135905038806101de565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b8181106105ed57509084600195949392106105b5575b505050811b019055610210565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806105a8565b91936020600181928787013581550195019201610592565b909150836000526020600020601f840160051c8101916020851061064e575b90601f859493920160051c01905b81811061063f57506101c7565b60008155849350600101610632565b9091508190610624565b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600080fd5b346106b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b757600435806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060205273ffffffffffffffffffffffffffffffffffffffff60406000205416156108bb57600073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416916044604051809481937ff724dad700000000000000000000000000000000000000000000000000000000835230600484015260248301525afa9081156108af576000916107cc575b604051806107c88482610a3e565b0390f35b3d8083833e6107db8183610ab6565b8101906020818303126108a75780519067ffffffffffffffff82116108ab570181601f820112156108a75780519267ffffffffffffffff841161087a576040519261084e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610ab6565b8484526020858401011161087757506107c8926108719160208085019101610a1b565b906107ba565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b757602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b7576107c86109b47f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5610c7e565b60405191829182610a3e565b346106b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b7576107c86109b47f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4610c7e565b60005b838110610a2e5750506000910152565b8181015183820152602001610a1e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409360208452610a818151809281602088015260208888019101610a1b565b0116010190565b9181601f840112156106b75782359167ffffffffffffffff83116106b757602083818601950101116106b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761052957604052565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610c1c573233148015610c21575b610c1c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610b82575b50610b7f57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156108af57600091610bdd575b5038610b75565b6020813d602011610c14575b81610bf660209383610ab6565b81010312610c105751908115158203610877575038610bd6565b5080fd5b3d9150610be9565b503390565b5060183610610b3e565b90600182811c92168015610c74575b6020831014610c4557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610c3a565b9060405191826000825492610c9284610c2b565b8084529360018116908115610d005750600114610cb9575b50610cb792500383610ab6565b565b90506000929192526020600020906000915b818310610ce4575050906020610cb79282010138610caa565b6020919350806001915483858901015201910190918492610ccb565b60209350610cb79592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138610caa56fea2646970667358221220d8c18d0f8d4bff28bf3a379da0afd0fac0295afce1972d719fd6cea9326e7ff464736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x9C0 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x959 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x8E8 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x6BC JUMPI PUSH4 0xFA6D22CA EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6B7 JUMPI PUSH2 0xA2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6B7 JUMPI PUSH2 0xC2 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xA88 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x44 CALLDATALOAD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND DUP1 SWAP5 SUB PUSH2 0x6B7 JUMPI PUSH2 0xEE PUSH2 0xAF7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x68A JUMPI POP PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP2 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x658 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x529 JUMPI DUP2 SWAP1 PUSH2 0x1BE DUP5 SLOAD PUSH2 0xC2B JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x605 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x563 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x558 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x529 JUMPI PUSH2 0x249 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0xC2B JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x4A5 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3AA JUMPI DUP2 SWAP3 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x39F JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SSTORE PUSH32 0x5B5E139F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x26B JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP4 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP7 DUP2 LT PUSH2 0x48D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 LT PUSH2 0x455 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2BD JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x428 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x415 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x51F JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x513 JUMPI POP PUSH2 0x252 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x506 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x4FD JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1DE JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x5ED JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x5B5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x210 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x5A8 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x592 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x64E JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x63F JUMPI POP PUSH2 0x1C7 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x632 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x624 JUMP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8BB JUMPI PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0x7CC JUMPI JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x7C8 DUP5 DUP3 PUSH2 0xA3E JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0x7DB DUP2 DUP4 PUSH2 0xAB6 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0x8A7 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x8AB JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x8A7 JUMPI DUP1 MLOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x87A JUMPI PUSH1 0x40 MLOAD SWAP3 PUSH2 0x84E PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0xAB6 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0x877 JUMPI POP PUSH2 0x7C8 SWAP3 PUSH2 0x871 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0xA1B JUMP JUMPDEST SWAP1 PUSH2 0x7BA JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP1 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x24 SWAP3 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH2 0x7C8 PUSH2 0x9B4 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0xC7E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA3E JUMP JUMPDEST CALLVALUE PUSH2 0x6B7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x6B7 JUMPI PUSH2 0x7C8 PUSH2 0x9B4 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0xC7E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xA2E JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA1E JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0xA81 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0xA1B JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x6B7 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x6B7 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x6B7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x529 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xC1C JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xC21 JUMPI JUMPDEST PUSH2 0xC1C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xB82 JUMPI JUMPDEST POP PUSH2 0xB7F JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBDD JUMPI JUMPDEST POP CODESIZE PUSH2 0xB75 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC14 JUMPI JUMPDEST DUP2 PUSH2 0xBF6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xAB6 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC10 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x877 JUMPI POP CODESIZE PUSH2 0xBD6 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xBE9 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xB3E JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0xC74 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0xC45 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0xC3A JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0xC92 DUP5 PUSH2 0xC2B JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xD00 JUMPI POP PUSH1 0x1 EQ PUSH2 0xCB9 JUMPI JUMPDEST POP PUSH2 0xCB7 SWAP3 POP SUB DUP4 PUSH2 0xAB6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0xCE4 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0xCB7 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0xCAA JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0xCCB JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0xCB7 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0xCAA JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD8 0xC1 DUP14 0xF DUP14 0x4B SELFDESTRUCT 0x28 0xBF GASPRICE CALLDATACOPY SWAP14 LOG0 0xAF 0xD0 STATICCALL 0xC0 0x29 GAS 0xFC RJUMPI 0x972D PUSH18 0x9FD6CEA9326E7FF464736F6C634300081E00 CALLER ","sourceMap":"1051:1232:316:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2136:12;;:::i;:::-;1051:1232;;;;;;;3174:18:180;;;3170:53;;3529:19:341;1051:1232:316;;;;636:1:180;900:21:181;;;896:88;;1051:1232:316;636:1:180;1051:1232:316;;;583:77:341;;;;;;;;;;:::i;:::-;;;;;;1051:1232:316;583:77:341;1051:1232:316;583:77:341;;;;;;;;1051:1232:316;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;1051:1232:316;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;1051:1232:316;583:77:341;;;;;;;;;;1051:1232:316;583:77:341;;;;;;;;636:1:180;583:77:341;;;;;;;;2159:13;583:77;;;2196:23;583:77;;;2196:23;583:77;3154:33:327;1051:1232:316;500:10:59;1051:1232:316;;500:10:59;1051:1232:316;;500:10:59;636:1:180;500:10:59;;;;;;;1051:1232:316;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;1051:1232:316;636:1:180;583:77:341;;;;;;;;;;;;;;;;2159:13;1051:1232:316;583:77:341;;;;;;;;;;1051:1232:316;583:77:341;;;;;;;;;;;;;;;;;;;;;1051:1232:316;583:77:341;;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;1051:1232:316;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;1051:1232:316;583:77:341;;;;;;;;;;;;;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1051:1232:316;636:1:180;583:77:341;;;;;;;;;;;;;;;;;;;;1051:1232:316;583:77:341;1051:1232:316;;583:77:341;;;;;;;;;1051:1232:316;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;1051:1232:316;583:77:341;;;;-1:-1:-1;636:1:180;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;896:88:181;930:54;1051:1232:316;930:54:181;1051:1232:316;;636:1:180;1051:1232:316;;;;930:54:181;3170:53:180;3201:22;1051:1232:316;3201:22:180;1051:1232:316;;;;3201:22:180;1051:1232:316;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;27291:64;;1051:1232:316;;3364:23:341;1051:1232:316;;;3364:64:341;1051:1232:316;;3364:64:341;;;;1051:1232:316;3364:64:341;;1603:4:302;1051:1232:316;3364:64:341;;1051:1232:316;;;;;3364:64:341;;;;;;;1051:1232:316;3364:64:341;;;1051:1232:316;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;1051:1232:316;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1051:1232:316;;;;;;;;;;;;;;;;;;;;;3364:64:341;1051:1232:316;;;;;;;;;27291:64:327;27324:31;1051:1232:316;27324:31:327;1051:1232:316;;;;27324:31:327;1051:1232:316;;;;;;;;;;;;;2991:23:341;1051:1232:316;;;;;;;;;;;;;;;;;;;;;2688:13:341;1051:1232:316;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1051:1232:316;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;907:917:76:-;1051:1232:316;1029:19:76;1051:1232:316;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1051:1232:316;;;;;;1676:74:76;;;;1051:1232:316;1676:74:76;;;;;;1051:1232:316;1327:10:76;1051:1232:316;;;;1744:4:76;1051:1232:316;;;;1676:74:76;;;;;;;1051:1232:316;1676:74:76;;;1630:120;;;;;1676:74;1051:1232:316;1676:74:76;;1051:1232:316;1676:74:76;;;;;;1051:1232:316;1676:74:76;;;:::i;:::-;;;1051:1232:316;;;;;;;;;;;;;1676:74:76;;;;1051:1232:316;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;583:77:341;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;1051:1232:316;;;;;;-1:-1:-1;1051:1232:316;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;1051:1232:316;-1:-1:-1;583:77:341;1051:1232:316;-1:-1:-1;1051:1232:316;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"689200","executionCost":"infinite","totalCost":"infinite"},"external":{"initERC721MetadataStorage(string,string,address)":"infinite","metadataResolver()":"2297","name()":"infinite","symbol()":"infinite","tokenURI(uint256)":"infinite"}},"methodIdentifiers":{"initERC721MetadataStorage(string,string,address)":"fa6d22ca","metadataResolver()":"a0c76f62","name()":"06fdde03","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"}],\"name\":\"initERC721MetadataStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\",\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initERC721MetadataStorage(string,string,address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"metadataResolver\":\"The address of the metadata resolver contract.\",\"name\":\"The name of the token.\",\"symbol\":\"The symbol of the token.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC721MetadataStorage(string,string,address)\":{\"notice\":\"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC721Metadata.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"}},\"notice\":\"This contracts uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721MetadataFacet.sol\":\"ERC721MetadataFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MetadataFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../base/ERC721MetadataBase.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (facet version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {InterfaceDetectionFacet}.\\ncontract ERC721MetadataFacet is ERC721MetadataBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Initializes the storage with the contract metadata.\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    function initERC721MetadataStorage(string calldata name, string calldata symbol, ITokenMetadataResolver metadataResolver) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        TokenMetadataStorage.layout().proxyInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xa1cac1f8c68601805481e2706ce8c235f0d8bb104ab3c597e3a06c7d3683fd83\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC721MetadataStorage(string,string,address)":{"notice":"Initializes the storage with the contract metadata.Sets the proxy initialization phase to `1`.Marks the following ERC165 interfaces as supported: ERC721Metadata."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."}},"notice":"This contracts uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/ERC721/facets/ERC721MintableFacet.sol":{"ERC721MintableFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721MintableStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.","errors":{"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721MintableStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610c2f38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610bad9081610082823960805181610a4b0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806340c10f19146107615780634684d7e91461050b5780638832e6e3146101eb578063a920466f146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576100e8610a34565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101be577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ac5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576102226107f3565b60443560243567ffffffffffffffff82116100ac57366023830112156100ac5781600401359167ffffffffffffffff83116100ac5736602484830101116100ac576024936102987fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b90610886565b61031783827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102c6610a34565b9560208960009a8b93836040519e8f92610307837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610816565b848452019101378b010152610948565b803b610321578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b8381106104f357505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104e8578391610469575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361043b5780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d6020116104e0575b8161048460209383610816565b810103126104dc57517fffffffff00000000000000000000000000000000000000000000000000000000811681036104dc577fffffffff000000000000000000000000000000000000000000000000000000006103eb565b8280fd5b3d9150610477565b6040513d85823e3d90fd5b602082820181015160a4878401015285935001610399565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576105426107f3565b6024359067ffffffffffffffff82116100ac57366023830112156100ac5781600401359167ffffffffffffffff83116100ac578260051b916024838301013681116100ac576105b37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926000956105e86020604051970187610816565b8552602401602085015b8282106107515750505073ffffffffffffffffffffffffffffffffffffffff1690811561072957825192845b84811061065b5750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156106fc5760208160051b830101518087528360205273ffffffffffffffffffffffffffffffffffffffff6040882054166106d157908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161061e565b7f753eceac000000000000000000000000000000000000000000000000000000008752600452602486fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105f2565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576107f161079b6107f3565b6107c77fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610948565b005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761085757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156108e05750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610a0a57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166109dc57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b68573233148015610b6d575b610b68577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610abf575b50610abc57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610b5c57600091610b1a575b5038610ab2565b6020813d602011610b54575b81610b3360209383610816565b81010312610b505751908115158203610b4d575038610b13565b80fd5b5080fd5b3d9150610b26565b6040513d6000823e3d90fd5b503390565b5060183610610a7b56fea2646970667358221220d533da60b6052e067cf96a078a7f27d8b913acc4f1a79eee5a5761a9d01c89e264736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xC2F CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xBAD SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xA4B ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x761 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x50B JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xA920466F EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0xE8 PUSH2 0xA34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1BE JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x222 PUSH2 0x7F3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xAC JUMPI PUSH1 0x24 SWAP4 PUSH2 0x298 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST SWAP1 PUSH2 0x886 JUMP JUMPDEST PUSH2 0x317 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2C6 PUSH2 0xA34 JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x307 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x816 JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0x948 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x321 JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x4F3 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x4E8 JUMPI DUP4 SWAP2 PUSH2 0x469 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x43B JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E0 JUMPI JUMPDEST DUP2 PUSH2 0x484 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x816 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x4DC JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x4DC JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3EB JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x399 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x542 PUSH2 0x7F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x5B3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x5E8 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x816 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x751 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x729 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x65B JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6FC JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP9 KECCAK256 SLOAD AND PUSH2 0x6D1 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x61E JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x5F2 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x7F1 PUSH2 0x79B PUSH2 0x7F3 JUMP JUMPDEST PUSH2 0x7C7 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x948 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x857 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8E0 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xA0A JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9DC JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB68 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB6D JUMPI JUMPDEST PUSH2 0xB68 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xABF JUMPI JUMPDEST POP PUSH2 0xABC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB1A JUMPI JUMPDEST POP CODESIZE PUSH2 0xAB2 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB54 JUMPI JUMPDEST DUP2 PUSH2 0xB33 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x816 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xB50 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xB4D JUMPI POP CODESIZE PUSH2 0xB13 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB26 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA7B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 CALLER 0xDA PUSH1 0xB6 SDIV 0x2E MOD PUSH29 0xF96A078A7F27D8B913ACC4F1A79EEE5A5761A9D01C89E264736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"943:1050:317:-:0;;;;;;;;;;;;;-1:-1:-1;;943:1050:317;;;;-1:-1:-1;;;;;943:1050:317;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;943:1050:317;;;;;;745:39:76;;943:1050:317;;;;;;;;745:39:76;943:1050:317;;;;;;;-1:-1:-1;943:1050:317;;;;;;-1:-1:-1;943:1050:317;;;;;-1:-1:-1;943:1050:317"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2035,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":2070,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2182,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mint":{"entryPoint":2376,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":2612,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2635}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806340c10f19146107615780634684d7e91461050b5780638832e6e3146101eb578063a920466f146100b15763d53913931461005357600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100ac5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576100e8610a34565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101be577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ac5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576102226107f3565b60443560243567ffffffffffffffff82116100ac57366023830112156100ac5781600401359167ffffffffffffffff83116100ac5736602484830101116100ac576024936102987fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b90610886565b61031783827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06102c6610a34565b9560208960009a8b93836040519e8f92610307837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8801160185610816565b848452019101378b010152610948565b803b610321578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b8381106104f357505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104e8578391610469575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361043b5780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d6020116104e0575b8161048460209383610816565b810103126104dc57517fffffffff00000000000000000000000000000000000000000000000000000000811681036104dc577fffffffff000000000000000000000000000000000000000000000000000000006103eb565b8280fd5b3d9150610477565b6040513d85823e3d90fd5b602082820181015160a4878401015285935001610399565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576105426107f3565b6024359067ffffffffffffffff82116100ac57366023830112156100ac5781600401359167ffffffffffffffff83116100ac578260051b916024838301013681116100ac576105b37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926000956105e86020604051970187610816565b8552602401602085015b8282106107515750505073ffffffffffffffffffffffffffffffffffffffff1690811561072957825192845b84811061065b5750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156106fc5760208160051b830101518087528360205273ffffffffffffffffffffffffffffffffffffffff6040882054166106d157908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161061e565b7f753eceac000000000000000000000000000000000000000000000000000000008752600452602486fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b81358152602091820191016105f2565b346100ac5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ac576107f161079b6107f3565b6107c77fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22610292610a34565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610948565b005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100ac57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761085757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156108e05750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610a0a57826000528060205273ffffffffffffffffffffffffffffffffffffffff604060002054166109dc57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610b68573233148015610b6d575b610b68577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610abf575b50610abc57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610b5c57600091610b1a575b5038610ab2565b6020813d602011610b54575b81610b3360209383610816565b81010312610b505751908115158203610b4d575038610b13565b80fd5b5080fd5b3d9150610b26565b6040513d6000823e3d90fd5b503390565b5060183610610a7b56fea2646970667358221220d533da60b6052e067cf96a078a7f27d8b913acc4f1a79eee5a5761a9d01c89e264736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x761 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x50B JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xA920466F EQ PUSH2 0xB1 JUMPI PUSH4 0xD5391393 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0xE8 PUSH2 0xA34 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1BE JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x222 PUSH2 0x7F3 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xAC JUMPI PUSH1 0x24 SWAP4 PUSH2 0x298 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST SWAP1 PUSH2 0x886 JUMP JUMPDEST PUSH2 0x317 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2C6 PUSH2 0xA34 JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x307 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x816 JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0x948 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x321 JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x4F3 JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x4E8 JUMPI DUP4 SWAP2 PUSH2 0x469 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x43B JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4E0 JUMPI JUMPDEST DUP2 PUSH2 0x484 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x816 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x4DC JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x4DC JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3EB JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x399 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x542 PUSH2 0x7F3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xAC JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xAC JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xAC JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xAC JUMPI PUSH2 0x5B3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x5E8 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x816 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x751 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x729 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x65B JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x6FC JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP9 KECCAK256 SLOAD AND PUSH2 0x6D1 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x61E JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x5F2 JUMP JUMPDEST CALLVALUE PUSH2 0xAC JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAC JUMPI PUSH2 0x7F1 PUSH2 0x79B PUSH2 0x7F3 JUMP JUMPDEST PUSH2 0x7C7 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x292 PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x948 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xAC JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x857 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x8E0 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xA0A JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9DC JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xB68 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xB6D JUMPI JUMPDEST PUSH2 0xB68 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xABF JUMPI JUMPDEST POP PUSH2 0xABC JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xB5C JUMPI PUSH1 0x0 SWAP2 PUSH2 0xB1A JUMPI JUMPDEST POP CODESIZE PUSH2 0xAB2 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xB54 JUMPI JUMPDEST DUP2 PUSH2 0xB33 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x816 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xB50 JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xB4D JUMPI POP CODESIZE PUSH2 0xB13 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xB26 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xA7B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 CALLER 0xDA PUSH1 0xB6 SDIV 0x2E MOD PUSH29 0xF96A078A7F27D8B913ACC4F1A79EEE5A5761A9D01C89E264736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"943:1050:317:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1710:41;;:::i;:::-;943:1050;;;;;;;3174:18:180;;;3170:53;;3399:33:327;943:1050:317;500:10:59;943:1050:317;500:10:59;;;;;;;636:1:180;500:10:59;;;943:1050:317;3170:53:180;3201:22;943:1050:317;3201:22:180;943:1050:317;;;;3201:22:180;943:1050:317;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;1586:12:303;943:1050:317;1710:41;;:::i;:::-;1586:12:303;;:::i;:::-;15560:7:327;1863:70;;943:1050:317;1710:41;;:::i;:::-;943:1050;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;15560:7:327;:::i;:::-;376:58:354;;15578:107:327;;943:1050:317;;;15578:107:327;943:1050:317;;;;;;29832:65:327;943:1050:317;29832:65:327;;943:1050:317;;29832:65:327;;943:1050:317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;;;;;;;;;;;;;;943:1050:317;;;;;;29832:84:327;29828:136;;15578:107;;943:1050:317;;;29828:136:327;943:1050:317;29925:39:327;;;;943:1050:317;;;;29925:39:327;29832:65;;;943:1050:317;29832:65:327;;943:1050:317;29832:65:327;;;;;;943:1050:317;29832:65:327;;;:::i;:::-;;;943:1050:317;;;;;;;;;;;;;29832:65:327;;943:1050:317;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;943:1050:317;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;943:1050:317;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1956:12:303;943:1050:317;1710:41;;:::i;1956:12:303:-;943:1050:317;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16404:16:327;;;16400:54;;943:1050:317;;16512:9:327;;16523:10;;;;;;16821:14;;;943:1050:317;;16821:10:327;943:1050:317;;;;;;;;;;;;;16535:3:327;943:1050:317;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:72:327;;943:1050:317;;;;;;;;;;;;;;16743:33:327;;;;;;943:1050:317;16512:9:327;;16597:72;16641:28;;;943:1050:317;;;16641:28:327;;943:1050:317;;;;;;;;;;16400:54:327;943:1050:317;16429:25:327;;;;;943:1050:317;;;;;;;;;;;;;;;;;;;;;;;;1287:7:303;943:1050:317;;:::i;:::-;1232:12:303;943:1050:317;1710:41;;:::i;1232:12:303:-;943:1050:317;;;;1287:7:303;:::i;:::-;943:1050:317;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;943:1050:317;;;;;-1:-1:-1;943:1050:317;3640:170:41;943:1050:317;-1:-1:-1;943:1050:317;;;;-1:-1:-1;943:1050:317;;;;-1:-1:-1;943:1050:317;;;;;-1:-1:-1;943:1050:317;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;943:1050:317;3775:28:41;;-1:-1:-1;3775:28:41;943:1050:317;3775:28:41;943:1050:317;;;;;-1:-1:-1;3775:28:41;14035:460:327;;943:1050:317;;14119:16:327;;;14115:54;;943:1050:317;14133:1:327;943:1050:317;;;;;;14133:1:327;943:1050:317;;;14179:72:327;;14415:10;943:1050:317;;14133:1:327;943:1050:317;;;;;;14133:1:327;943:1050:317;;;-1:-1:-1;943:1050:317;14415:10:327;943:1050:317;;;-1:-1:-1;943:1050:317;14415:10:327;943:1050:317;;;;;14133:1:327;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;943:1050:317;;14133:1:327;14223:28;14115:54;14144:25;14133:1;14144:25;;14133:1;14144:25;907:917:76;943:1050:317;1029:19:76;943:1050:317;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;943:1050:317;;;;;;1676:74:76;;;;943:1050:317;1676:74:76;;;;;;943:1050:317;1327:10:76;943:1050:317;;;;1744:4:76;943:1050:317;;;;1676:74:76;;;;;;;943:1050:317;1676:74:76;;;1630:120;;;;;1676:74;943:1050:317;1676:74:76;;943:1050:317;1676:74:76;;;;;;943:1050:317;1676:74:76;;;:::i;:::-;;;943:1050:317;;;;;;;;;;;;;1676:74:76;;;;943:1050:317;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;943:1050:317;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"597800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"229","batchMint(address,uint256[])":"infinite","initERC721MintableStorage()":"infinite","mint(address,uint256)":"infinite","safeMint(address,uint256,bytes)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","initERC721MintableStorage()":"a920466f","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721MintableStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\",\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721MintableStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"initERC721MintableStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens can be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721MintableFacet.sol\":\"ERC721MintableFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MintableFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../base/ERC721MintableBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721MintableFacet is ERC721MintableBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721MintableStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xfe5c03dc84d91811a6909605925981ede34297df757b8589fd5cf940f0356dcd\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"initERC721MintableStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."}},"notice":"ERC721Mintable implementation where burnt tokens can be minted again.","version":1}}},"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol":{"ERC721MintableOnceFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initERC721MintableOnceStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.","errors":{"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}]},"events":{"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"initERC721MintableOnceStorage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f610d6d38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b0381168103606657608052604051610ceb9081610082823960805181610b890152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806340c10f191461084a5780634684d7e9146105a157806383b0b740146104675780638832e6e314610147578063c77c6955146100bc5763d53913931461005e57600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b346100b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761017e6108dc565b60443560243567ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b75736602484830101116100b7576024936101f47fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b9061096f565b61027383827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610222610b72565b9560208960009a8b93836040519e8f92610263837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f88011601856108ff565b848452019101378b010152610a31565b803b61027d578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b83811061044f57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104445783916103c5575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036103975780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d60201161043c575b816103e0602093836108ff565b8101031261043857517fffffffff0000000000000000000000000000000000000000000000000000000081168103610438577fffffffff00000000000000000000000000000000000000000000000000000000610347565b8280fd5b3d91506103d3565b6040513d85823e3d90fd5b602082820181015160a48784010152859350016102f5565b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761049e610b72565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610574577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576105d86108dc565b6024359067ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b7578260051b916024838301013681116100b7576106497fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09260009561067e60206040519701876108ff565b8552602401602085015b82821061083a5750505073ffffffffffffffffffffffffffffffffffffffff1690811561081257825192845b8481106106f15750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107e55760208160051b8301015180875283602052604087205473ffffffffffffffffffffffffffffffffffffffff81166107b9577fdead0000000000000000000000000000000000000000000000000000000000001461078e57908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016106b4565b7f31e8d3d5000000000000000000000000000000000000000000000000000000008752600452602486fd5b602488837f753eceac000000000000000000000000000000000000000000000000000000008252600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610688565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576108da6108846108dc565b6108b07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610a31565b005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156109c95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610b4857826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610b1a577fdead00000000000000000000000000000000000000000000000000000000000014610aec57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ca6573233148015610cab575b610ca6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610bfd575b50610bfa57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c9a57600091610c58575b5038610bf0565b6020813d602011610c92575b81610c71602093836108ff565b81010312610c8e5751908115158203610c8b575038610c51565b80fd5b5080fd5b3d9150610c64565b6040513d6000823e3d90fd5b503390565b5060183610610bb956fea26469706673582212201c2b044cf35b7e95a8fbc4c4acf62ed7f108e8a49c7a5481b3c23efc768d7c5964736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0xD6D CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0xCEB SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0xB89 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x84A JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x5A1 JUMPI DUP1 PUSH4 0x83B0B740 EQ PUSH2 0x467 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xBC JUMPI PUSH4 0xD5391393 EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x17E PUSH2 0x8DC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xB7 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x1F4 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST SWAP1 PUSH2 0x96F JUMP JUMPDEST PUSH2 0x273 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x222 PUSH2 0xB72 JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x263 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x8FF JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0xA31 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x27D JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x44F JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x444 JUMPI DUP4 SWAP2 PUSH2 0x3C5 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x397 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43C JUMPI JUMPDEST DUP2 PUSH2 0x3E0 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8FF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x438 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x438 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x347 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3D3 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2F5 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x49E PUSH2 0xB72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x574 JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x5D8 PUSH2 0x8DC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xB7 JUMPI PUSH2 0x649 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x67E PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x8FF JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x83A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x812 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x6F1 JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7E5 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x7B9 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x78E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x6B4 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP9 DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x688 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x8DA PUSH2 0x884 PUSH2 0x8DC JUMP JUMPDEST PUSH2 0x8B0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xA31 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xB7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x940 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x9C9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xB48 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xB1A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0xAEC JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCA6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCAB JUMPI JUMPDEST PUSH2 0xCA6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBFD JUMPI JUMPDEST POP PUSH2 0xBFA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC9A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC58 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBF0 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC92 JUMPI JUMPDEST DUP2 PUSH2 0xC71 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8FF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC8E JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xC8B JUMPI POP CODESIZE PUSH2 0xC51 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC64 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBB9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR 0x2B DIV 0x4C RETURN JUMPDEST PUSH31 0x95A8FBC4C4ACF62ED7F108E8A49C7A5481B3C23EFC768D7C5964736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"954:1062:318:-:0;;;;;;;;;;;;;-1:-1:-1;;954:1062:318;;;;-1:-1:-1;;;;;954:1062:318;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;954:1062:318;;;;;;745:39:76;;954:1062:318;;;;;;;;745:39:76;954:1062:318;;;;;;;-1:-1:-1;954:1062:318;;;;;;-1:-1:-1;954:1062:318;;;;;-1:-1:-1;954:1062:318"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2268,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":2303,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":2415,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_mintOnce":{"entryPoint":2609,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":2930,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":2953}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806340c10f191461084a5780634684d7e9146105a157806383b0b740146104675780638832e6e314610147578063c77c6955146100bc5763d53913931461005e57600080fd5b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b600080fd5b346100b75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b346100b75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761017e6108dc565b60443560243567ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b75736602484830101116100b7576024936101f47fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b9061096f565b61027383827fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610222610b72565b9560208960009a8b93836040519e8f92610263837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f88011601856108ff565b848452019101378b010152610a31565b803b61027d578380f35b73ffffffffffffffffffffffffffffffffffffffff169373ffffffffffffffffffffffffffffffffffffffff604051927f150b7a020000000000000000000000000000000000000000000000000000000084521660048301528360248301528260448301526080606483015281815191826084830152855b83811061044f57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f858985602098860101520116810103018186885af19081156104445783916103c5575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036103975780808380f35b6044927fc215a7a1000000000000000000000000000000000000000000000000000000008352600452602452fd5b90506020813d60201161043c575b816103e0602093836108ff565b8101031261043857517fffffffff0000000000000000000000000000000000000000000000000000000081168103610438577fffffffff00000000000000000000000000000000000000000000000000000000610347565b8280fd5b3d91506103d3565b6040513d85823e3d90fd5b602082820181015160a48784010152859350016102f5565b346100b75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b75761049e610b72565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610354169116908103610574577f8e773e13000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576105d86108dc565b6024359067ffffffffffffffff82116100b757366023830112156100b75781600401359167ffffffffffffffff83116100b7578260051b916024838301013681116100b7576106497fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09260009561067e60206040519701876108ff565b8552602401602085015b82821061083a5750505073ffffffffffffffffffffffffffffffffffffffff1690811561081257825192845b8481106106f15750505082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040822090815401905580f35b81518110156107e55760208160051b8301015180875283602052604087205473ffffffffffffffffffffffffffffffffffffffff81166107b9577fdead0000000000000000000000000000000000000000000000000000000000001461078e57908160019288528460205285604089205585887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016106b4565b7f31e8d3d5000000000000000000000000000000000000000000000000000000008752600452602486fd5b602488837f753eceac000000000000000000000000000000000000000000000000000000008252600452fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6004847f7851b9cd000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610688565b346100b75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100b7576108da6108846108dc565b6108b07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b226101ee610b72565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610a31565b005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100b757565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156109c95750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115610b4857826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116610b1a577fdead00000000000000000000000000000000000000000000000000000000000014610aec57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015610ca6573233148015610cab575b610ca6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115610bfd575b50610bfa57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c9a57600091610c58575b5038610bf0565b6020813d602011610c92575b81610c71602093836108ff565b81010312610c8e5751908115158203610c8b575038610c51565b80fd5b5080fd5b3d9150610c64565b6040513d6000823e3d90fd5b503390565b5060183610610bb956fea26469706673582212201c2b044cf35b7e95a8fbc4c4acf62ed7f108e8a49c7a5481b3c23efc768d7c5964736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x84A JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x5A1 JUMPI DUP1 PUSH4 0x83B0B740 EQ PUSH2 0x467 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xBC JUMPI PUSH4 0xD5391393 EQ PUSH2 0x5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x17E PUSH2 0x8DC JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP4 ADD ADD GT PUSH2 0xB7 JUMPI PUSH1 0x24 SWAP4 PUSH2 0x1F4 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST SWAP1 PUSH2 0x96F JUMP JUMPDEST PUSH2 0x273 DUP4 DUP3 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x222 PUSH2 0xB72 JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP10 PUSH1 0x0 SWAP11 DUP12 SWAP4 DUP4 PUSH1 0x40 MLOAD SWAP15 DUP16 SWAP3 PUSH2 0x263 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP9 ADD AND ADD DUP6 PUSH2 0x8FF JUMP JUMPDEST DUP5 DUP5 MSTORE ADD SWAP2 ADD CALLDATACOPY DUP12 ADD ADD MSTORE PUSH2 0xA31 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x27D JUMPI DUP4 DUP1 RETURN JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP5 MSTORE AND PUSH1 0x4 DUP4 ADD MSTORE DUP4 PUSH1 0x24 DUP4 ADD MSTORE DUP3 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE DUP6 JUMPDEST DUP4 DUP2 LT PUSH2 0x44F JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 DUP10 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 DUP7 DUP9 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x444 JUMPI DUP4 SWAP2 PUSH2 0x3C5 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x397 JUMPI DUP1 DUP1 DUP4 DUP1 RETURN JUMPDEST PUSH1 0x44 SWAP3 PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE REVERT JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x43C JUMPI JUMPDEST DUP2 PUSH2 0x3E0 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8FF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x438 JUMPI MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x438 JUMPI PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x347 JUMP JUMPDEST DUP3 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3D3 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP6 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x2F5 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x49E PUSH2 0xB72 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x574 JUMPI PUSH32 0x8E773E1300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x5D8 PUSH2 0x8DC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xB7 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xB7 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xB7 JUMPI DUP3 PUSH1 0x5 SHL SWAP2 PUSH1 0x24 DUP4 DUP4 ADD ADD CALLDATASIZE DUP2 GT PUSH2 0xB7 JUMPI PUSH2 0x649 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH1 0x0 SWAP6 PUSH2 0x67E PUSH1 0x20 PUSH1 0x40 MLOAD SWAP8 ADD DUP8 PUSH2 0x8FF JUMP JUMPDEST DUP6 MSTORE PUSH1 0x24 ADD PUSH1 0x20 DUP6 ADD JUMPDEST DUP3 DUP3 LT PUSH2 0x83A JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x812 JUMPI DUP3 MLOAD SWAP3 DUP5 JUMPDEST DUP5 DUP2 LT PUSH2 0x6F1 JUMPI POP POP POP DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7E5 JUMPI PUSH1 0x20 DUP2 PUSH1 0x5 SHL DUP4 ADD ADD MLOAD DUP1 DUP8 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP8 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x7B9 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x78E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 DUP9 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 DUP10 KECCAK256 SSTORE DUP6 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x6B4 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 DUP8 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 DUP7 REVERT JUMPDEST PUSH1 0x24 DUP9 DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x24 DUP7 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST PUSH1 0x4 DUP5 PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x688 JUMP JUMPDEST CALLVALUE PUSH2 0xB7 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xB7 JUMPI PUSH2 0x8DA PUSH2 0x884 PUSH2 0x8DC JUMP JUMPDEST PUSH2 0x8B0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1EE PUSH2 0xB72 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xA31 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xB7 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x940 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x9C9 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0xB48 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0xB1A JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0xAEC JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0xCA6 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0xCAB JUMPI JUMPDEST PUSH2 0xCA6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0xBFD JUMPI JUMPDEST POP PUSH2 0xBFA JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC9A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC58 JUMPI JUMPDEST POP CODESIZE PUSH2 0xBF0 JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC92 JUMPI JUMPDEST DUP2 PUSH2 0xC71 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x8FF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC8E JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xC8B JUMPI POP CODESIZE PUSH2 0xC51 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC64 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0xBB9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHR 0x2B DIV 0x4C RETURN JUMPDEST PUSH31 0x95A8FBC4C4ACF62ED7F108E8A49C7A5481B3C23EFC768D7C5964736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"954:1062:318:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;954:1062:318;;;;30830:32:327;954:1062:318;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4464:19:41;1766:12:304;954:1062:318;1733:41;;:::i;:::-;1766:12:304;;:::i;:::-;20205:7:327;1863:70;;954:1062:318;1733:41;;:::i;:::-;954:1062;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;20205:7:327;:::i;:::-;376:58:354;;20223:107:327;;954:1062:318;;;20223:107:327;954:1062:318;;;;;;29832:65:327;954:1062:318;29832:65:327;;954:1062:318;;29832:65:327;;954:1062:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29832:65:327;;;;;;;;;;;;;;;;954:1062:318;;;;;;29832:84:327;29828:136;;20223:107;;954:1062:318;;;29828:136:327;954:1062:318;29925:39:327;;;;954:1062:318;;;;29925:39:327;29832:65;;;954:1062:318;29832:65:327;;954:1062:318;29832:65:327;;;;;;954:1062:318;29832:65:327;;;:::i;:::-;;;954:1062:318;;;;;;;;;;;;;29832:65:327;;954:1062:318;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;954:1062:318;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;954:1062:318;;;;;;;;;;;;;;1733:41;;:::i;:::-;954:1062;;;;;;;3174:18:180;;;3170:53;;3399:33:327;954:1062:318;500:10:59;954:1062:318;500:10:59;;;;;;;636:1:180;500:10:59;;;954:1062:318;3170:53:180;3201:22;954:1062:318;3201:22:180;954:1062:318;;;;3201:22:180;954:1062:318;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2233:12:304;954:1062:318;1733:41;;:::i;2233:12:304:-;954:1062:318;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21151:16:327;;;21147:54;;954:1062:318;;21259:9:327;;21270:10;;;;;;21677:14;;;954:1062:318;;21677:10:327;954:1062:318;;;;;;;;;;;;;21282:3:327;954:1062:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;954:1062:318;;;;;;;;;;;;;;21599:33:327;;;;;;954:1062:318;21259:9:327;;21465:59;21499:25;;;954:1062:318;;;21499:25:327;;21391:60;954:1062:318;21423:28:327;;;;;954:1062:318;;21423:28:327;954:1062:318;;;;;;;;;;21147:54:327;954:1062:318;21176:25:327;;;;;954:1062:318;;;;;;;;;;;;;;;;;;;;;;;;1382:7:304;954:1062:318;;:::i;:::-;1323:12:304;954:1062:318;1733:41;;:::i;1323:12:304:-;954:1062:318;;;;1382:7:304;:::i;:::-;954:1062:318;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;954:1062:318;;;;;-1:-1:-1;954:1062:318;3640:170:41;954:1062:318;-1:-1:-1;954:1062:318;;;;-1:-1:-1;954:1062:318;;;;-1:-1:-1;954:1062:318;;;;;-1:-1:-1;954:1062:318;;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;954:1062:318;3775:28:41;;-1:-1:-1;3775:28:41;954:1062:318;3775:28:41;954:1062:318;;;;;-1:-1:-1;3775:28:41;18606:565:327;;954:1062:318;;18694:16:327;;;18690:54;;954:1062:318;18708:1:327;954:1062:318;;;;;18708:1:327;954:1062:318;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;954:1062:318;;18708:1:327;954:1062:318;;;;;;18708:1:327;954:1062:318;;;-1:-1:-1;954:1062:318;19091:10:327;954:1062:318;;;-1:-1:-1;954:1062:318;19091:10:327;954:1062:318;;;;;18708:1:327;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;954:1062:318;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;954:1062:318;;18708:1:327;18830:28;18690:54;18719:25;18708:1;18719:25;;18708:1;18719:25;907:917:76;954:1062:318;1029:19:76;954:1062:318;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;954:1062:318;;;;;;1676:74:76;;;;954:1062:318;1676:74:76;;;;;;954:1062:318;1327:10:76;954:1062:318;;;;1744:4:76;954:1062:318;;;;1676:74:76;;;;;;;954:1062:318;1676:74:76;;;1630:120;;;;;1676:74;954:1062:318;1676:74:76;;954:1062:318;1676:74:76;;;;;;954:1062:318;1676:74:76;;;:::i;:::-;;;954:1062:318;;;;;;;;;;;;;1676:74:76;;;;954:1062:318;;;;;;;1676:74:76;;;-1:-1:-1;1676:74:76;;;954:1062:318;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"661400","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"251","batchMint(address,uint256[])":"infinite","initERC721MintableOnceStorage()":"infinite","mint(address,uint256)":"infinite","safeMint(address,uint256,bytes)":"infinite","wasBurnt(uint256)":"2407"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchMint(address,uint256[])":"4684d7e9","initERC721MintableOnceStorage()":"83b0b740","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721MintableOnceStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\",\"errors\":{\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}]},\"events\":{\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"initERC721MintableOnceStorage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}]},\"events\":{\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"initERC721MintableOnceStorage()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC721Mintable.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"notice\":\"ERC721Mintable implementation where burnt tokens cannot be minted again.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol\":\"ERC721MintableOnceFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721MintableOnceFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./../base/ERC721MintableOnceBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (facet version).\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {AccessControlFacet}.\\ncontract ERC721MintableOnceFacet is ERC721MintableOnceBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721MintableOnceStorage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.initERC721Mintable();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0xd009a15db2b6e3e9b7054cdb8f59ef17f937ace1b921d1e94a1dc29d5adc2bbe\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}]},"events":{"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"initERC721MintableOnceStorage()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC721Mintable."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"notice":"ERC721Mintable implementation where burnt tokens cannot be minted again.","version":1}}},"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol":{"ERC721WithOperatorFiltererFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC721Storage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.","errors":{"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"initERC721Storage()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61148e38819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161140c90816100828239608051816110800152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063081812fc14610ae2578063095ea7b31461084e57806323b872dd146107a657806342842e0e146106d65780636352211e1461062157806370a0823114610557578063a22cb465146103f7578063b1c7ee02146102bd578063b88d4fde146101435763e985e9c51461008a57600080fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576100c1610b5d565b73ffffffffffffffffffffffffffffffffffffffff6100de610b80565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b3461013e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761017a610b5d565b610182610b80565b6044356064359167ffffffffffffffff831161013e573660238401121561013e5782600401359367ffffffffffffffff851161013e57366024868601011161013e576101cc611069565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036102ad575b5050610251848484847fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b823b61025957005b600060206102ab97806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116019961029a6040519b8c610eda565b828b5201838a0137870101526111fd565b005b6102b691610f62565b8681610222565b3461013e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576102f4611069565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103ca577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761042e610b5d565b602435908115159182810361013e57610528575b73ffffffffffffffffffffffffffffffffffffffff80610460611069565b169116918183146104fa5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610552817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610f62565b610442565b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761058e610b5d565b73ffffffffffffffffffffffffffffffffffffffff8116156105f75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156106a857602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e576106e436610ba3565b6106ec611069565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610796575b5050610772828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b803b61077a57005b6102ab936040519361078d602086610eda565b600085526111fd565b61079f91610f62565b8483610743565b3461013e576102ab6107b736610ba3565b916107c0611069565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361083e575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b61084791610f62565b8581610816565b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e57610885610b5d565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115610ab2575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06108d5611069565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415610a8457848614610a565761091581868661117d565b15610a0a575015610979577401000000000000000000000000000000000000000016610965575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b83600052602052806040600020558361093c565b907401000000000000000000000000000000000000000082178092036109f6575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561093e565b84600052602052604060002055838061099a565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610adc907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610f62565b836108ab565b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576020610b3f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610c15565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261013e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060243573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610c8b57740100000000000000000000000000000000000000001615610c84576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610eb057846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610a845773ffffffffffffffffffffffffffffffffffffffff8116809503610e7e5782610d2d918561117d565b15610dc3575b5050836000528060205282604060002055828203610d74575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610d4c565b7401000000000000000000000000000000000000000016158015610e38575b610dec5780610d33565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610de2565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610f1b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261013e5751801515810361013e5790565b5473ffffffffffffffffffffffffffffffffffffffff16908115158061105f575b610f8b575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561105357600091611024575b5015610ff75750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611046915060203d60201161104c575b61103e8183610eda565b810190610f4a565b38610fee565b503d611034565b6040513d6000823e3d90fd5b50813b1515610f83565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561116e573233148015611173575b61116e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156110f4575b506110f157503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156110535760009161114f575b50386110e7565b611168915060203d60201161104c5761103e8183610eda565b38611148565b503390565b50601836106110b0565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156111a8575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806111a2565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b8381106113be57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af19081156110535760009161133c575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361130c575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116113b6575b8161135560209383610eda565b810103126113b25751907fffffffff00000000000000000000000000000000000000000000000000000000821682036113af57507fffffffff000000000000000000000000000000000000000000000000000000006112be565b80fd5b5080fd5b3d9150611348565b602082820181015160a487840101528593500161126956fea2646970667358221220219296f5991043cc90a3dd4ff27b6248b74809533ff4f0e624761a35b4eb458664736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x148E CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x140C SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x1080 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0xAE2 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x84E JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x7A6 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x6D6 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x621 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x557 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x3F7 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x143 JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0xC1 PUSH2 0xB5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDE PUSH2 0xB80 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x17A PUSH2 0xB5D JUMP JUMPDEST PUSH2 0x182 PUSH2 0xB80 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x13E JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x13E JUMPI PUSH2 0x1CC PUSH2 0x1069 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2AD JUMPI JUMPDEST POP POP PUSH2 0x251 DUP5 DUP5 DUP5 DUP5 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x259 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x2AB SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x29A PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xEDA JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x11FD JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2B6 SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP7 DUP2 PUSH2 0x222 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x2F4 PUSH2 0x1069 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3CA JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x42E PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x13E JUMPI PUSH2 0x528 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x460 PUSH2 0x1069 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x4FA JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x552 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xF62 JUMP JUMPDEST PUSH2 0x442 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x58E PUSH2 0xB5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x5F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x6A8 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x6E4 CALLDATASIZE PUSH2 0xBA3 JUMP JUMPDEST PUSH2 0x6EC PUSH2 0x1069 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x796 JUMPI JUMPDEST POP POP PUSH2 0x772 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x77A JUMPI STOP JUMPDEST PUSH2 0x2AB SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x78D PUSH1 0x20 DUP7 PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x11FD JUMP JUMPDEST PUSH2 0x79F SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x743 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x2AB PUSH2 0x7B7 CALLDATASIZE PUSH2 0xBA3 JUMP JUMPDEST SWAP2 PUSH2 0x7C0 PUSH2 0x1069 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x83E JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x847 SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x816 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x885 PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0xAB2 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x8D5 PUSH2 0x1069 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xA84 JUMPI DUP5 DUP7 EQ PUSH2 0xA56 JUMPI PUSH2 0x915 DUP2 DUP7 DUP7 PUSH2 0x117D JUMP JUMPDEST ISZERO PUSH2 0xA0A JUMPI POP ISZERO PUSH2 0x979 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x965 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x93C JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x9F6 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x93E JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x99A JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xADC SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xF62 JUMP JUMPDEST DUP4 PUSH2 0x8AB JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x20 PUSH2 0xB3F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC8B JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xC84 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xEB0 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xA84 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xE7E JUMPI DUP3 PUSH2 0xD2D SWAP2 DUP6 PUSH2 0x117D JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xD74 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xD4C JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xE38 JUMPI JUMPDEST PUSH2 0xDEC JUMPI DUP1 PUSH2 0xD33 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xDE2 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xF1B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x13E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x13E JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x105F JUMPI JUMPDEST PUSH2 0xF8B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1024 JUMPI JUMPDEST POP ISZERO PUSH2 0xFF7 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1046 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104C JUMPI JUMPDEST PUSH2 0x103E DUP2 DUP4 PUSH2 0xEDA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xF4A JUMP JUMPDEST CODESIZE PUSH2 0xFEE JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1034 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0xF83 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x116E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1173 JUMPI JUMPDEST PUSH2 0x116E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10F4 JUMPI JUMPDEST POP PUSH2 0x10F1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x114F JUMPI JUMPDEST POP CODESIZE PUSH2 0x10E7 JUMP JUMPDEST PUSH2 0x1168 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104C JUMPI PUSH2 0x103E DUP2 DUP4 PUSH2 0xEDA JUMP JUMPDEST CODESIZE PUSH2 0x1148 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x11A8 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x11A2 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x13BE JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x133C JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x130C JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x13B6 JUMPI JUMPDEST DUP2 PUSH2 0x1355 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xEDA JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x13B2 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x13AF JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x12BE JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1348 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1269 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x21 SWAP3 SWAP7 CREATE2 SWAP10 LT NUMBER 0xCC SWAP1 LOG3 0xDD 0x4F CALLCODE PUSH28 0x6248B74809533FF4F0E624761A35B4EB458664736F6C634300081E00 CALLER ","sourceMap":"881:1042:319:-:0;;;;;;;;;;;;;-1:-1:-1;;881:1042:319;;;;-1:-1:-1;;;;;881:1042:319;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;881:1042:319;;;;;;745:39:76;;881:1042:319;;;;;;;;745:39:76;881:1042:319;;;;;;;-1:-1:-1;881:1042:319;;;;;;-1:-1:-1;881:1042:319;;;;;-1:-1:-1;881:1042:319"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2909,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":2979,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_bool_fromMemory":{"entryPoint":3914,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_t_address":{"entryPoint":2944,"id":null,"parameterSlots":0,"returnSlots":1},"finalize_allocation":{"entryPoint":3802,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":4605,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":3938,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":3093,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":4477,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_msgSender":{"entryPoint":4201,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_transferFrom":{"entryPoint":3257,"id":33689,"parameterSlots":5,"returnSlots":0}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":4224}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063081812fc14610ae2578063095ea7b31461084e57806323b872dd146107a657806342842e0e146106d65780636352211e1461062157806370a0823114610557578063a22cb465146103f7578063b1c7ee02146102bd578063b88d4fde146101435763e985e9c51461008a57600080fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576100c1610b5d565b73ffffffffffffffffffffffffffffffffffffffff6100de610b80565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b600080fd5b3461013e5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761017a610b5d565b610182610b80565b6044356064359167ffffffffffffffff831161013e573660238401121561013e5782600401359367ffffffffffffffff851161013e57366024868601011161013e576101cc611069565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036102ad575b5050610251848484847fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b823b61025957005b600060206102ab97806024837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116019961029a6040519b8c610eda565b828b5201838a0137870101526111fd565b005b6102b691610f62565b8681610222565b3461013e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576102f4611069565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036103ca577f80ac58cd000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761042e610b5d565b602435908115159182810361013e57610528575b73ffffffffffffffffffffffffffffffffffffffff80610460611069565b169116918183146104fa5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610552817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610f62565b610442565b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e5761058e610b5d565b73ffffffffffffffffffffffffffffffffffffffff8116156105f75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c08160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541680156106a857602090604051908152f35b507fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461013e576106e436610ba3565b6106ec611069565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610796575b5050610772828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b803b61077a57005b6102ab936040519361078d602086610eda565b600085526111fd565b61079f91610f62565b8483610743565b3461013e576102ab6107b736610ba3565b916107c0611069565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361083e575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610cb9565b61084791610f62565b8581610816565b3461013e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e57610885610b5d565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115610ab2575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06108d5611069565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415610a8457848614610a565761091581868661117d565b15610a0a575015610979577401000000000000000000000000000000000000000016610965575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b83600052602052806040600020558361093c565b907401000000000000000000000000000000000000000082178092036109f6575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561093e565b84600052602052604060002055838061099a565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610adc907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30610f62565b836108ab565b3461013e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013e576020610b3f6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0610c15565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361013e57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261013e5760043573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060243573ffffffffffffffffffffffffffffffffffffffff8116810361013e579060443590565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610c8b57740100000000000000000000000000000000000000001615610c84576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b5050600090565b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b909273ffffffffffffffffffffffffffffffffffffffff16928315610eb057846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415610a845773ffffffffffffffffffffffffffffffffffffffff8116809503610e7e5782610d2d918561117d565b15610dc3575b5050836000528060205282604060002055828203610d74575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538610d4c565b7401000000000000000000000000000000000000000016158015610e38575b610dec5780610d33565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415610de2565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610f1b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9081602091031261013e5751801515810361013e5790565b5473ffffffffffffffffffffffffffffffffffffffff16908115158061105f575b610f8b575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa90811561105357600091611024575b5015610ff75750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611046915060203d60201161104c575b61103e8183610eda565b810190610f4a565b38610fee565b503d611034565b6040513d6000823e3d90fd5b50813b1515610f83565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561116e573233148015611173575b61116e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156110f4575b506110f157503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156110535760009161114f575b50386110e7565b611168915060203d60201161104c5761103e8183610eda565b38611148565b503390565b50601836106110b0565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156111a8575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806111a2565b9173ffffffffffffffffffffffffffffffffffffffff809195929495169381604051947f150b7a02000000000000000000000000000000000000000000000000000000008652166004850152166024830152836044830152608060648301528181519182608483015260005b8381106113be57505060a4817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8560008560209886010152011681010301816000865af19081156110535760009161133c575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091160361130c575050565b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d6020116113b6575b8161135560209383610eda565b810103126113b25751907fffffffff00000000000000000000000000000000000000000000000000000000821682036113af57507fffffffff000000000000000000000000000000000000000000000000000000006112be565b80fd5b5080fd5b3d9150611348565b602082820181015160a487840101528593500161126956fea2646970667358221220219296f5991043cc90a3dd4ff27b6248b74809533ff4f0e624761a35b4eb458664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81812FC EQ PUSH2 0xAE2 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x84E JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x7A6 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x6D6 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x621 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x557 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x3F7 JUMPI DUP1 PUSH4 0xB1C7EE02 EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x143 JUMPI PUSH4 0xE985E9C5 EQ PUSH2 0x8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0xC1 PUSH2 0xB5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDE PUSH2 0xB80 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x17A PUSH2 0xB5D JUMP JUMPDEST PUSH2 0x182 PUSH2 0xB80 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x23 DUP5 ADD SLT ISZERO PUSH2 0x13E JUMPI DUP3 PUSH1 0x4 ADD CALLDATALOAD SWAP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP6 GT PUSH2 0x13E JUMPI CALLDATASIZE PUSH1 0x24 DUP7 DUP7 ADD ADD GT PUSH2 0x13E JUMPI PUSH2 0x1CC PUSH2 0x1069 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2AD JUMPI JUMPDEST POP POP PUSH2 0x251 DUP5 DUP5 DUP5 DUP5 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x259 JUMPI STOP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH2 0x2AB SWAP8 DUP1 PUSH1 0x24 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD SWAP10 PUSH2 0x29A PUSH1 0x40 MLOAD SWAP12 DUP13 PUSH2 0xEDA JUMP JUMPDEST DUP3 DUP12 MSTORE ADD DUP4 DUP11 ADD CALLDATACOPY DUP8 ADD ADD MSTORE PUSH2 0x11FD JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2B6 SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP7 DUP2 PUSH2 0x222 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x2F4 PUSH2 0x1069 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x3CA JUMPI PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x42E PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x13E JUMPI PUSH2 0x528 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x460 PUSH2 0x1069 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x4FA JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x552 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xF62 JUMP JUMPDEST PUSH2 0x442 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x58E PUSH2 0xB5D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x5F7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP1 ISZERO PUSH2 0x6A8 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST POP PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x6E4 CALLDATASIZE PUSH2 0xBA3 JUMP JUMPDEST PUSH2 0x6EC PUSH2 0x1069 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x796 JUMPI JUMPDEST POP POP PUSH2 0x772 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x77A JUMPI STOP JUMPDEST PUSH2 0x2AB SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x78D PUSH1 0x20 DUP7 PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x11FD JUMP JUMPDEST PUSH2 0x79F SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x743 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH2 0x2AB PUSH2 0x7B7 CALLDATASIZE PUSH2 0xBA3 JUMP JUMPDEST SWAP2 PUSH2 0x7C0 PUSH2 0x1069 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x83E JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xCB9 JUMP JUMPDEST PUSH2 0x847 SWAP2 PUSH2 0xF62 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x816 JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH2 0x885 PUSH2 0xB5D JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0xAB2 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x8D5 PUSH2 0x1069 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0xA84 JUMPI DUP5 DUP7 EQ PUSH2 0xA56 JUMPI PUSH2 0x915 DUP2 DUP7 DUP7 PUSH2 0x117D JUMP JUMPDEST ISZERO PUSH2 0xA0A JUMPI POP ISZERO PUSH2 0x979 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x965 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x93C JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x9F6 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x93E JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x99A JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xADC SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0xF62 JUMP JUMPDEST DUP4 PUSH2 0x8AB JUMP JUMPDEST CALLVALUE PUSH2 0x13E JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x13E JUMPI PUSH1 0x20 PUSH2 0xB3F PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0xC15 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x13E JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x13E JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x13E JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC8B JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0xC84 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0xEB0 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0xA84 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0xE7E JUMPI DUP3 PUSH2 0xD2D SWAP2 DUP6 PUSH2 0x117D JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0xD74 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0xD4C JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0xE38 JUMPI JUMPDEST PUSH2 0xDEC JUMPI DUP1 PUSH2 0xD33 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0xDE2 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xF1B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x13E JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x13E JUMPI SWAP1 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x105F JUMPI JUMPDEST PUSH2 0xF8B JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1024 JUMPI JUMPDEST POP ISZERO PUSH2 0xFF7 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1046 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104C JUMPI JUMPDEST PUSH2 0x103E DUP2 DUP4 PUSH2 0xEDA JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xF4A JUMP JUMPDEST CODESIZE PUSH2 0xFEE JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1034 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0xF83 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x116E JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x1173 JUMPI JUMPDEST PUSH2 0x116E JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x10F4 JUMPI JUMPDEST POP PUSH2 0x10F1 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x114F JUMPI JUMPDEST POP CODESIZE PUSH2 0x10E7 JUMP JUMPDEST PUSH2 0x1168 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x104C JUMPI PUSH2 0x103E DUP2 DUP4 PUSH2 0xEDA JUMP JUMPDEST CODESIZE PUSH2 0x1148 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x10B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x11A8 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x11A2 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP2 SWAP6 SWAP3 SWAP5 SWAP6 AND SWAP4 DUP2 PUSH1 0x40 MLOAD SWAP5 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP7 MSTORE AND PUSH1 0x4 DUP6 ADD MSTORE AND PUSH1 0x24 DUP4 ADD MSTORE DUP4 PUSH1 0x44 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP4 ADD MSTORE DUP2 DUP2 MLOAD SWAP2 DUP3 PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x13BE JUMPI POP POP PUSH1 0xA4 DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 PUSH1 0x20 SWAP9 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0x1053 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x133C JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x130C JUMPI POP POP JUMP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x13B6 JUMPI JUMPDEST DUP2 PUSH2 0x1355 PUSH1 0x20 SWAP4 DUP4 PUSH2 0xEDA JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x13B2 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0x13AF JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x12BE JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1348 JUMP JUMPDEST PUSH1 0x20 DUP3 DUP3 ADD DUP2 ADD MLOAD PUSH1 0xA4 DUP8 DUP5 ADD ADD MSTORE DUP6 SWAP4 POP ADD PUSH2 0x1269 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x21 SWAP3 SWAP7 CREATE2 SWAP10 LT NUMBER 0xCC SWAP1 LOG3 0xDD 0x4F CALLCODE PUSH28 0x6248B74809533FF4F0E624761A35B4EB458664736F6C634300081E00 CALLER ","sourceMap":"881:1042:319:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;881:1042:319;-1:-1:-1;881:1042:319;28718:11:327;881:1042:319;;;;-1:-1:-1;881:1042:319;28718:28:327;881:1042:319;-1:-1:-1;881:1042:319;;;;;;-1:-1:-1;881:1042:319;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1640:41;;:::i;:::-;881:1042;;;;;;;;2616:14:352;2612:76;;881:1042:319;29158:19:327;;11217:7;1863:70;;;;881:1042:319;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;881:1042:319;11235:101:327;881:1042:319;;11271:54:327;881:1042:319;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11271:54:327;:::i;:::-;881:1042:319;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;881:1042:319;;;;;;;;;;;1640:41;;:::i;:::-;881:1042;;;;;;;3174:18:180;;;3170:53;;2657:25:327;881:1042:319;500:10:59;881:1042:319;500:10:59;;;881:1042:319;;;;636:1:180;881:1042:319;;;;3170:53:180;3201:22;881:1042:319;3201:22:180;881:1042:319;;;;3201:22:180;881:1042:319;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;881:1042:319;;1640:41;;;:::i;:::-;881:1042;;;6339:18:327;;;;6335:63;;881:1042:319;6463:42:327;6408:19;881:1042:319;-1:-1:-1;881:1042:319;6408:11:327;881:1042:319;;;-1:-1:-1;881:1042:319;;-1:-1:-1;881:1042:319;;;;-1:-1:-1;881:1042:319;;;;;;;;;;;;;;;;6463:42:327;881:1042:319;6335:63:327;6366:32;;881:1042:319;6366:32:327;881:1042:319;;;;6366:32:327;1500:115:305;2931:8:352;668:81;881:1042:319;2931:8:352;:::i;:::-;1500:115:305;;881:1042:319;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;881:1042:319;;-1:-1:-1;881:1042:319;26801:10:327;881:1042:319;;;;-1:-1:-1;881:1042:319;;;;;;;;26724:60:327;26756:28;881:1042:319;26756:28:327;881:1042:319;;26756:28:327;881:1042:319;;;;;;;;;;;;;;;;;;;;;;;;;30700:19:327;;27291:64;;881:1042:319;;;;;;;;27291:64:327;27324:31;;881:1042:319;27324:31:327;881:1042:319;;;;27324:31:327;881:1042:319;;;;;;;:::i;:::-;1640:41;;:::i;:::-;3179:19:352;881:1042:319;;;;;;;;2616:14:352;2612:76;;881:1042:319;29158:19:327;;9668:7;1863:70;;;;881:1042:319;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;881:1042:319;9686:99:327;9722:52;881:1042:319;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;881:1042:319;;;;2134:7:305;881:1042:319;;;:::i;:::-;1640:41;;;:::i;:::-;881:1042;;;;;;;;2616:14:352;2612:76;;881:1042:319;29158:19:327;;881:1042:319;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;881:1042:319;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;881:1042:319;29158:19:327;881:1042:319;1640:41;;:::i;:::-;881:1042;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;881:1042:319;5670:35:327;;881:1042:319;5157:173:327;881:1042:319;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;881:1042:319;;;;;5620:11:327;881:1042:319;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;881:1042:319;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;881:1042:319;5052:59:327;;;881:1042:319;5052:59:327;881:1042:319;;;;;;;;;5052:59:327;4927:63;4958:32;;881:1042:319;4958:32:327;881:1042:319;;;;4958:32:327;4802:64;4835:31;;881:1042:319;4835:31:327;881:1042:319;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;881:1042:319;2931:8:352;:::i;:::-;1064:117:305;;;881:1042:319;;;;;;;;;;;;3579:43:305;881:1042:319;;;3579:43:305;:::i;:::-;881:1042:319;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27798:360:327:-;881:1042:319;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;881:1042:319;;;28073:11:327;881:1042:319;;;;;;;;28066:27:327;:::o;28022:130::-;28124:17;;881:1042:319;28124:17:327;:::o;27948:64::-;27981:31;;881:1042:319;27981:31:327;;881:1042:319;;;27981:31:327;7385:956;;;881:1042:319;;7507:16:327;;;7503:58;;881:1042:319;7521:1:327;881:1042:319;;;;;7521:1:327;881:1042:319;;;;;30700:19:327;;;7615:64;;881:1042:319;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;881:1042:319;;;7521:1:327;881:1042:319;;;;;;7521:1:327;881:1042:319;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;881:1042:319;-1:-1:-1;881:1042:319;;;;;-1:-1:-1;881:1042:319;;;;;2220:8:327;;881:1042:319;-1:-1:-1;881:1042:319;;;;-1:-1:-1;881:1042:319;8155:10:327;881:1042:319;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;881:1042:319;7896:51:327;;;7521:1;7896:51;881:1042:319;7896:51:327;881:1042:319;;;;;;7521:1:327;7896:51;7828:59;881:1042:319;;7521:1:327;881:1042:319;7867:11:327;;;881:1042:319;;;;7521:1:327;881:1042:319;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;881:1042:319;;;;7521:1:327;7728:34;7503:58;7532:29;7521:1;7532:29;;7521:1;7532:29;881:1042:319;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;881:1042:319;;;;;-1:-1:-1;881:1042:319;;;;;;;;;;;;;;;;;;;:::o;3271:479:352:-;881:1042:319;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;881:1042:319;;;3613:51:352;881:1042:319;;3613:51:352;;;;881:1042:319;3613:51:352;;3648:4;3613:51;;;881:1042:319;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;881:1042:319;;-1:-1:-1;3691:28:352;3613:51;;;;881:1042:319;3613:51:352;881:1042:319;3613:51:352;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;881:1042:319;;;-1:-1:-1;881:1042:319;;;;;3524:68:352;3559:29;;;:33;;3524:68;;907:917:76;881:1042:319;1029:19:76;881:1042:319;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;881:1042:319;;;;;;1676:74:76;;;;881:1042:319;1676:74:76;;;;;;881:1042:319;1327:10:76;881:1042:319;;;;1744:4:76;881:1042:319;;;;1676:74:76;;;;;;;881:1042:319;1676:74:76;;;1630:120;;;;;1676:74;;;;881:1042:319;1676:74:76;881:1042:319;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;881:1042:319;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;881:1042:319;;-1:-1:-1;881:1042:319;30435:11:327;881:1042:319;;;;-1:-1:-1;881:1042:319;30435:27:327;881:1042:319;-1:-1:-1;881:1042:319;;;;;-1:-1:-1;881:1042:319;;;30413:49:327;;;;;29701:270;;881:1042:319;29701:270:327;;;;;;881:1042:319;;;;;29832:65:327;881:1042:319;29832:65:327;;881:1042:319;29832:65:327;;;881:1042:319;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:1042:319;;;;;;;;;;;;;-1:-1:-1;881:1042:319;;;;;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;881:1042:319;;;;;;29832:84:327;29828:136;;29701:270;;:::o;29828:136::-;29925:39;-1:-1:-1;29925:39:327;29832:65;881:1042:319;;;;-1:-1:-1;29925:39:327;29832:65;881:1042:319;29832:65:327;;881:1042:319;29832:65:327;;;;;;881:1042:319;29832:65:327;;;:::i;:::-;;;881:1042:319;;;;;;;;;;;;;29832:65:327;881:1042:319;29832:65:327;;881:1042:319;;;;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;881:1042:319;;;;;;;;;;;;;;;;-1:-1:-1;881:1042:319;;"},"gasEstimates":{"creation":{"codeDepositCost":"1026400","executionCost":"infinite","totalCost":"infinite"},"external":{"approve(address,uint256)":"infinite","balanceOf(address)":"2509","getApproved(uint256)":"4574","initERC721Storage()":"infinite","isApprovedForAll(address,address)":"2714","ownerOf(uint256)":"2432","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","transferFrom(address,address,uint256)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","initERC721Storage()":"b1c7ee02","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC721Storage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\",\"errors\":{\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"initERC721Storage()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"initERC721Storage()\":{\"notice\":\"Marks the following ERC165 interfaces as supported: ERC721.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol\":\"ERC721WithOperatorFiltererFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/facets/ERC721WithOperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {OperatorFiltererFacet}.\\ncontract ERC721WithOperatorFiltererFacet is ERC721WithOperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC721Storage() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC721Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x86f87a4b990a900cf6c88e4474c5bcacf8afdfc26ae07b5203f32c483f270b8f\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"initERC721Storage()":{"notice":"Marks the following ERC165 interfaces as supported: ERC721."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721.sol":{"IERC721":{"abi":[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721This interface only contains the standard functions. See IERC721Events for the events.Note: The ERC-165 identifier for this interface is 0x80ac58cd.","kind":"dev","methods":{"approve(address,uint256)":{"details":"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"safeTransferFrom(address,address,uint256)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"transferFrom(address,address,uint256)":{"details":"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}}},"title":"ERC721 Non-Fungible Token Standard, basic interface (functions).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","getApproved(uint256)":"081812fc","isApprovedForAll(address,address)":"e985e9c5","ownerOf(uint256)":"6352211e","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","transferFrom(address,address,uint256)":"23b872dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721This interface only contains the standard functions. See IERC721Events for the events.Note: The ERC-165 identifier for this interface is 0x80ac58cd.\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Note: There can only be one approved address per token at a given time.Note: A token approval gets reset when this token is transferred, including a self-transfer.Reverts if `tokenId` does not exist.Reverts if `to` is the token owner.Reverts if the sender is not the token owner and has not been approved by the token owner.Emits an {Approval} event.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits a {Transfer} event.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts if the sender is the same as `operator`.Emits an {ApprovalForAll} event.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.Resets the token approval for `tokenId`.Reverts if `to` is the zero address.Reverts if `from` is not the owner of `tokenId`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits a {Transfer} event.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, basic interface (functions).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721.sol\":\"IERC721\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol":{"IERC721BatchTransfer":{"abi":[{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0xf3993d11.","kind":"dev","methods":{"batchTransferFrom(address,address,uint256[])":{"details":"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchTransferFrom(address,address,uint256[])":"f3993d11"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0xf3993d11.\",\"kind\":\"dev\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Resets the token approval for each of `tokenIds`.Reverts if `to` is the zero address.Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event for each of `tokenIds`.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":\"IERC721BatchTransfer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721Burnable.sol":{"IERC721Burnable":{"abi":[{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.","kind":"dev","methods":{"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Burnable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchBurnFrom(address,uint256[])":"f2472965","burnFrom(address,uint256)":"79cc6790"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\",\"kind\":\"dev\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Burnable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":\"IERC721Burnable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"burnFrom(address,uint256)":{"notice":"Burns a token."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721Deliverable.sol":{"IERC721Deliverable":{"abi":[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x9da5e832.","kind":"dev","methods":{"deliver(address[],uint256[])":{"details":"Reverts if `recipients` and `tokenIds` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if one of `tokenIds` already exists.Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Deliverable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"deliver(address[],uint256[])":"9da5e832"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x9da5e832.\",\"kind\":\"dev\",\"methods\":{\"deliver(address[],uint256[])\":{\"details\":\"Reverts if `recipients` and `tokenIds` have different lengths.Reverts if one of `recipients` is the zero address.Reverts if one of `tokenIds` already exists.Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":\"IERC721Deliverable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721Metadata.sol":{"IERC721Metadata":{"abi":[{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x5b5e139f.","kind":"dev","methods":{"name()":{"returns":{"tokenName":"The name of the token."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Metadata.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"name()":"06fdde03","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x5b5e139f.\",\"kind\":\"dev\",\"methods\":{\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Metadata.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":\"IERC721Metadata\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721Mintable.sol":{"IERC721Mintable":{"abi":[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x8e773e13.","kind":"dev","methods":{"batchMint(address,uint256[])":{"details":"Reverts if `to` is the zero address.Reverts if one of `tokenIds` already exists.Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"mint(address,uint256)":{"details":"Reverts if `to` is the zero address.Reverts if `tokenId` already exists.Emits an {IERC721-Transfer} event from the zero address.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeMint(address,uint256,bytes)":{"details":"Reverts if `to` is the zero address.Reverts if `tokenId` already exists.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits an {IERC721-Transfer} event from the zero address.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}}},"title":"ERC721 Non-Fungible Token Standard, optional extension: Mintable.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"batchMint(address,uint256[])":"4684d7e9","mint(address,uint256)":"40c10f19","safeMint(address,uint256,bytes)":"8832e6e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x8e773e13.\",\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[])\":{\"details\":\"Reverts if `to` is the zero address.Reverts if one of `tokenIds` already exists.Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `tokenId` already exists.Emits an {IERC721-Transfer} event from the zero address.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts if `to` is the zero address.Reverts if `tokenId` already exists.Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.Emits an {IERC721-Transfer} event from the zero address.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, optional extension: Mintable.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":\"IERC721Mintable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."}},"version":1}}},"contracts/token/ERC721/interfaces/IERC721Receiver.sol":{"IERC721Receiver":{"abi":[{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"magicValue","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x150b7a02.","kind":"dev","methods":{"onERC721Received(address,address,uint256,bytes)":{"details":"Note: This function is called by an ERC721 contract after a safe transfer.Note: The ERC721 contract address is always the message sender.","params":{"data":"Optional additional data with no specified format.","from":"The previous token owner.","operator":"The initiator of the safe transfer.","tokenId":"The token identifier."},"returns":{"magicValue":"`bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))` (`0x150b7a02`) to accept, any other value to refuse."}}},"title":"ERC721 Non-Fungible Token Standard, Tokens Receiver.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"onERC721Received(address,address,uint256,bytes)":"150b7a02"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721Note: The ERC-165 identifier for this interface is 0x150b7a02.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Note: This function is called by an ERC721 contract after a safe transfer.Note: The ERC721 contract address is always the message sender.\",\"params\":{\"data\":\"Optional additional data with no specified format.\",\"from\":\"The previous token owner.\",\"operator\":\"The initiator of the safe transfer.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"magicValue\":\"`bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\"}}},\"title\":\"ERC721 Non-Fungible Token Standard, Tokens Receiver.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Handles the receipt of an ERC721 token.\"}},\"notice\":\"Interface for supporting safe transfers from ERC721 contracts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":\"IERC721Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"onERC721Received(address,address,uint256,bytes)":{"notice":"Handles the receipt of an ERC721 token."}},"notice":"Interface for supporting safe transfers from ERC721 contracts.","version":1}}},"contracts/token/ERC721/libraries/ERC721Storage.sol":{"ERC721Storage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212205284478b56d8fe78f89148ed0eacb8996a8077ab1c02751426680e3e2cd2d22464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE DUP5 SELFBALANCE DUP12 JUMP 0xD8 INVALID PUSH25 0xF89148ED0EACB8996A8077AB1C02751426680E3E2CD2D22464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1403:29623:327:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212205284478b56d8fe78f89148ed0eacb8996a8077ab1c02751426680e3e2cd2d22464736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE DUP5 SELFBALANCE DUP12 JUMP 0xD8 INVALID PUSH25 0xF89148ED0EACB8996A8077AB1C02751426680E3E2CD2D22464 PUSH20 0x6F6C634300081E00330000000000000000000000 ","sourceMap":"1403:29623:327:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_callOnERC721Received(address,address,address,uint256,bytes memory)":"infinite","_isOperatable(struct ERC721Storage.Layout storage pointer,address,address)":"infinite","_tokenExists(uint256)":"infinite","_tokenHasApproval(uint256)":"infinite","_tokenOwner(uint256)":"infinite","_tokenWasBurnt(uint256)":"infinite","approve(struct ERC721Storage.Layout storage pointer,address,address,uint256)":"infinite","balanceOf(struct ERC721Storage.Layout storage pointer,address)":"infinite","batchBurnFrom(struct ERC721Storage.Layout storage pointer,address,address,uint256[] calldata)":"infinite","batchMint(struct ERC721Storage.Layout storage pointer,address,uint256[] memory)":"infinite","batchMintOnce(struct ERC721Storage.Layout storage pointer,address,uint256[] memory)":"infinite","batchTransferFrom(struct ERC721Storage.Layout storage pointer,address,address,address,uint256[] calldata)":"infinite","burnFrom(struct ERC721Storage.Layout storage pointer,address,address,uint256)":"infinite","deliver(struct ERC721Storage.Layout storage pointer,address[] memory,uint256[] memory)":"infinite","deliverOnce(struct ERC721Storage.Layout storage pointer,address[] memory,uint256[] memory)":"infinite","getApproved(struct ERC721Storage.Layout storage pointer,uint256)":"infinite","init()":"infinite","initERC721BatchTransfer()":"infinite","initERC721Burnable()":"infinite","initERC721Deliverable()":"infinite","initERC721Metadata()":"infinite","initERC721Mintable()":"infinite","isApprovedForAll(struct ERC721Storage.Layout storage pointer,address,address)":"infinite","layout()":"infinite","mint(struct ERC721Storage.Layout storage pointer,address,uint256)":"infinite","mintOnce(struct ERC721Storage.Layout storage pointer,address,uint256)":"infinite","ownerOf(struct ERC721Storage.Layout storage pointer,uint256)":"infinite","safeMint(struct ERC721Storage.Layout storage pointer,address,address,uint256,bytes memory)":"infinite","safeMintOnce(struct ERC721Storage.Layout storage pointer,address,address,uint256,bytes memory)":"infinite","safeTransferFrom(struct ERC721Storage.Layout storage pointer,address,address,address,uint256)":"infinite","safeTransferFrom(struct ERC721Storage.Layout storage pointer,address,address,address,uint256,bytes calldata)":"infinite","setApprovalForAll(struct ERC721Storage.Layout storage pointer,address,address,bool)":"infinite","transferFrom(struct ERC721Storage.Layout storage pointer,address,address,address,uint256)":"infinite","wasBurnt(struct ERC721Storage.Layout storage pointer,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/libraries/ERC721Storage.sol\":\"ERC721Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/ERC721/preset/ERC721Full.sol":{"ERC721Full":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1582,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1545,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a06040523461060457613f488038038061001981610609565b928339810160a0828203126106045781516001600160401b038111610604578161004491840161062e565b602083015190916001600160401b0382116106045761006491840161062e565b60408301519092906001600160a01b038116908190036106045760608201516001600160a01b03811692908390036106045760800151926001600160a01b038416840361060457336105a5575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b03821161047b57600080516020613f088339815191525490600182811c9216801561059b575b602083101461045b5781601f84931161051e575b50602090601f831160011461049c57600092610491575b50508160011b916000199060031b1c191617600080516020613f08833981519152555b83516001600160401b03811161047b57600080516020613f2883398151915254600181811c91168015610471575b602082101461045b57601f81116103e9575b50602094601f82116001146103685794819293949560009261035d575b50508160011b916000199060031b1c191617600080516020613f28833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b8452828420805482168317905563152a902d60e11b8452928290208054909316179091556080919091525161386e908161069a823960805181818161230f01528181612ce6015261356a0152f35b015190503880610274565b601f19821695600080516020613f28833981519152600052806000209160005b8881106103d1575083600195969798106103b8575b505050811b01600080516020613f2883398151915255610297565b015160001960f88460031b161c1916905538808061039d565b91926020600181928685015181550194019201610388565b600080516020613f288339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610451575b601f0160051c01905b8181106104455750610257565b60008155600101610438565b909150819061042f565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b600080516020613f0883398151915260009081528281209350601f198516905b81811061050657509084600195949392106104ed575b505050811b01600080516020613f0883398151915255610217565b015160001960f88460031b161c191690553880806104d2565b929360206001819287860151815501950193016104bc565b600080516020613f088339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c81019160208510610591575b90601f859493920160051c01905b81811061058257506101dd565b60008155849350600101610575565b9091508190610567565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761047b57604052565b81601f82011215610604578051906001600160401b03821161047b5761065d601f8301601f1916602001610609565b92828452602083830101116106045760005b82811061068457505060206000918301015290565b8060208092840101518282870101520161066f56fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461291957806306fdde03146128be578063081812fc14612861578063095ea7b3146125cd578063114ba8ee146124ce57806323b872dd146124265780632a55205a146123335780632b4c9f16146122c45780632f2ff15d1461213857806340c10f19146120a857806342842e0e14611fd85780634684d7e914611df8578063572b6c0514611dad57806361ba27da14611c915780636352211e14611c1657806370a0823114611b4c57806373c8a9581461199c5780638832e6e31461174e5780638bb9c5bf146115df5780638da5cb5b1461156e5780638dc251e31461144157806391d14854146113a957806395d89b411461133a5780639da5e83214611210578063a0c76f621461119f578063a22cb4651461103f578063b0ccc31e14610fce578063b88d4fde14610eac578063c3666c3614610c6f578063c87b56dd14610abc578063d539139314610a63578063d547741f146108da578063e1a8bf2c1461089e578063e985e9c5146107ea578063f2fde38b146106f6578063f3993d11146103705763f7ba94bd146101b357600080fd5b34610314576101c136612b8f565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610202613553565b925416911690810361034357508181036103195760005b81811061022257005b61022d818387613318565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031457610257828587613318565b35908147106102e257600080809381935af13d156102da573d9061027a82612d2e565b916102886040519384612bfb565b82523d6000602084013e5b156102a15750600101610219565b8051156102b057602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610293565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103145760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576103a76129e5565b6103af612a08565b9060443567ffffffffffffffff8111610314576103d0903690600401612a9d565b926103d9613553565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106e6575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106bc5761047e8382849694613667565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b8781106105015787878781811415806104f8575b6104b657005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104b0565b61050c818986613318565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff8116801561068e57880361065c5784610585575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a40161049c565b74010000000000000000000000000000000000000000161580156105f9575b6105ae5789610544565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105a4565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106ef91613468565b8582610430565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145761072d6129e5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610757613553565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610343575073ffffffffffffffffffffffffffffffffffffffff169182820361079b57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576108216129e5565b73ffffffffffffffffffffffffffffffffffffffff61083e612a08565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020604051620186a08152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457600435610914612a08565b61091c613553565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034357507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109ce57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bae6000600435610b1d817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06132bd565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6357600091610bdb575b60405160208082528190610bd7908201856129a2565b0390f35b3d8083833e610bea8183612bfb565b810190602081830312610c5b5780519067ffffffffffffffff8211610c5f570181601f82011215610c5b57805192610c2184612d2e565b92610c2f6040519485612bfb565b84845260208584010111610c585750610bd792610c52916020808501910161297f565b90610bc1565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031457610c7d36612ace565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc2613553565b92541691169081036103435750808214801590610ea2575b6103195760005b828110610cea57005b73ffffffffffffffffffffffffffffffffffffffff610d12610d0d83858a613318565b613328565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6357600091610e74575b5015610e47575073ffffffffffffffffffffffffffffffffffffffff610da1610d0d83858a613318565b1690610db1610d0d828689613318565b91610dbd82878b613318565b3592813b1561031457606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6357600192610e36575b5001610ce1565b6000610e4191612bfb565b88610e2f565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e95915060203d8111610e9b575b610e8d8183612bfb565b810190613349565b89610d77565b503d610e83565b5082821415610cda565b346103145760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610ee36129e5565b610eeb612a08565b60443560643567ffffffffffffffff811161031457610f0e903690600401612b61565b929093610f19613553565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fbe575b5050610f9f848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b823b610fa757005b610fbc95610fb6913691612d68565b936136e7565b005b610fc791613468565b8685610f70565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576110766129e5565b602435908115159182810361031457611170575b73ffffffffffffffffffffffffffffffffffffffff806110a8613553565b169116918183146111425760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61119a817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613468565b61108a565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103145761121e36612b8f565b6112507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b906130f6565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261127b81612c6b565b946112896040519687612bfb565b818652602086019160051b81019036821161031457915b81831061130d57505050906112b6913691612c83565b91805191835183036103195760005b8381106112ce57005b8061130773ffffffffffffffffffffffffffffffffffffffff6112f36001948761327a565b51166112ff838961327a565b5190856131b8565b016112c5565b823573ffffffffffffffffffffffffffffffffffffffff81168103610314578152602092830192016112a0565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bd76113957f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613361565b6040519182916020835260208301906129a2565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576113e0612a08565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576114786129e5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114b7613553565b925416911690810361034357507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156115445773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561163a613553565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117065760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a5e565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103145760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576117856129e5565b6024359060443567ffffffffffffffff8111610314576117a9903690600401612b61565b916117d67fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b61181684826118107fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611808613553565b973691612d68565b946131b8565b803b61181e57005b73ffffffffffffffffffffffffffffffffffffffff80602092169361188b60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906129a2565b03816000865af1908115610c635760009161191d575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118ed57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611994575b8161193660209383612bfb565b810103126119905751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c5857507fffffffff000000000000000000000000000000000000000000000000000000006118a1565b5080fd5b3d9150611929565b34610314576119aa36612ace565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119ed613553565b92541691169081036103435750808414801590611b42575b6103195760005b848110611a1557005b611a20818388613318565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610314576000602091611a53610d0d868b8e613318565b82611abd611ae9611a65898d8d613318565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612bfb565b51925af115610c63576000513d611b395750803b155b611b0c5750600101611a0c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611aff565b5082841415611a05565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457611b836129e5565b73ffffffffffffffffffffffffffffffffffffffff811615611bec5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611c736004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06132bd565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d02613553565b925416911690810361034357507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8057815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611dee611de96129e5565b612ccf565b6040519015158152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457611e2f6129e5565b60243567ffffffffffffffff81116103145773ffffffffffffffffffffffffffffffffffffffff611e67611ebe923690600401612a9d565b9290611e957fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691612c83565b9216908115611fae5782519260005b848110611f0e575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f18818361327a565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8157908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ecd565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031457611fe636612a2b565b611fee613553565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612098575b5050612074828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b803b61207c57005b610fbc936040519361208f602086612bfb565b600085526136e7565b6120a191613468565b8483612045565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610fbc6120e26129e5565b61210e7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06131b8565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457600435612172612a08565b61217a613553565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034357507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561222d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a5e565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c908015801561241e575b156123e8575050610bd760005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610bd791620186a082101561240b5761240590620186a0926130b4565b046123b8565b620186a061241992046130b4565b6123b8565b5081156123ab565b3461031457610fbc61243736612a2b565b91612440613553565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036124be575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b6124c791613468565b8581612496565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145760043573ffffffffffffffffffffffffffffffffffffffff81168103610314577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061255c613553565b9254169116908103610343575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576126046129e5565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612831575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612654613553565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612803578486146127d557612694818686613667565b156127895750156126f85774010000000000000000000000000000000000000000166126e4575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836126bb565b90740100000000000000000000000000000000000000008217809203612775575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556126bd565b846000526020526040600020558380612719565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61285b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613468565b8361262a565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611c736004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612e4e565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bd76113957f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613361565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031457611dee602091612d9f565b60005b8381106129925750506000910152565b8181015183820152602001612982565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936129de8151809281875287808801910161297f565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031457565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031457565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103145760043573ffffffffffffffffffffffffffffffffffffffff81168103610314579060243573ffffffffffffffffffffffffffffffffffffffff81168103610314579060443590565b9181601f840112156103145782359167ffffffffffffffff8311610314576020808501948460051b01011161031457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103145760043567ffffffffffffffff81116103145781612b1791600401612a9d565b9290929160243567ffffffffffffffff81116103145781612b3a91600401612a9d565b929092916044359067ffffffffffffffff821161031457612b5d91600401612a9d565b9091565b9181601f840112156103145782359167ffffffffffffffff8311610314576020838186019501011161031457565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103145760043567ffffffffffffffff81116103145781612bd891600401612a9d565b929092916024359067ffffffffffffffff821161031457612b5d91600401612a9d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612c3c5760051b60200190565b929190612c8f81612c6b565b93612c9d6040519586612bfb565b602085838152019160051b810192831161031457905b828210612cbf57505050565b8135815260209182019101612cb3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d275773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612c3c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612d7482612d2e565b91612d826040519384612bfb565b829481845281830111610314578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e48577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612e42576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561068e57740100000000000000000000000000000000000000001615612d27576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106bc57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156128035773ffffffffffffffffffffffffffffffffffffffff81168095036130825782612f319185613667565b15612fc7575b5050836000528060205282604060002055828203612f78575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538612f50565b740100000000000000000000000000000000000000001615801561303c575b612ff05780612f37565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415612fe6565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156130c757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156131505750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fae57826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661324c57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561328e5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156132eb575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561328e5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103145790565b90816020910312610314575180151581036103145790565b906040519160008154918260011c9260018116801561345e575b602085108114613431578487528693929181156133f157506001146133aa575b506133a892500383612bfb565b565b90506000929192526020600020906000915b8183106133d55750509060206133a8928201013861339b565b60209193508060019154838589010152019101909184926133bc565b602093506133a89592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861339b565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f169361337b565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613549575b613491575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c635760009161352a575b50156134fd5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613543915060203d602011610e9b57610e8d8183612bfb565b386134f4565b50813b1515613489565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561365857323314801561365d575b613658577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156135de575b506135db57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c6357600091613639575b50386135d1565b613652915060203d602011610e9b57610e8d8183612bfb565b38613632565b503390565b506018361061359a565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613692575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061368c565b73ffffffffffffffffffffffffffffffffffffffff90613759826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906129a2565b03816000865af1908115610c63576000916137bd575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118ed575050565b6020813d602011613830575b816137d660209383612bfb565b810103126119905751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c5857507fffffffff0000000000000000000000000000000000000000000000000000000061376f565b3d91506137c956fea26469706673582212202f6f589b371e79312f588e4b1d310ce131f284754573908a730934082e6f4d0664736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x604 JUMPI PUSH2 0x3F48 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x609 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x604 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x604 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x62E JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x604 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x62E JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x604 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x604 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x604 JUMPI CALLER PUSH2 0x5A5 JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F08 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x59B JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x45B JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x51E JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x49C JUMPI PUSH1 0x0 SWAP3 PUSH2 0x491 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F08 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F28 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x471 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x45B JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3E9 JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x368 JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x35D JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F28 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x386E SWAP1 DUP2 PUSH2 0x69A DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x230F ADD MSTORE DUP2 DUP2 PUSH2 0x2CE6 ADD MSTORE PUSH2 0x356A ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F28 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3D1 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3B8 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F28 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x39D JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x388 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F28 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x451 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x445 JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x438 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x42F JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F08 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x506 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x4ED JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F08 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4D2 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4BC JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F08 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x591 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x582 JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x575 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x567 JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x47B JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x604 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x47B JUMPI PUSH2 0x65D PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x609 JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x604 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x684 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x66F JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2919 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x28BE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2861 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x25CD JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x24CE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2426 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2333 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22C4 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2138 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20A8 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FD8 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1DF8 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DAD JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C91 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C16 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B4C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x199C JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x174E JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15DF JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x156E JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1441 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13A9 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x133A JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1210 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x119F JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x103F JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFCE JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEAC JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC6F JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xABC JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA63 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8DA JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x89E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7EA JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x6F6 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x370 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x1C1 CALLDATASIZE PUSH2 0x2B8F JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x202 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP2 DUP2 SUB PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x222 JUMPI STOP JUMPDEST PUSH2 0x22D DUP2 DUP4 DUP8 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x314 JUMPI PUSH2 0x257 DUP3 DUP6 DUP8 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E2 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2DA JUMPI RETURNDATASIZE SWAP1 PUSH2 0x27A DUP3 PUSH2 0x2D2E JUMP JUMPDEST SWAP2 PUSH2 0x288 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BFB JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A1 JUMPI POP PUSH1 0x1 ADD PUSH2 0x219 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x293 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x3A7 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x3AF PUSH2 0x2A08 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0x3D0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 PUSH2 0x3D9 PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6E6 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6BC JUMPI PUSH2 0x47E DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3667 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x501 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x4F8 JUMPI JUMPDEST PUSH2 0x4B6 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4B0 JUMP JUMPDEST PUSH2 0x50C DUP2 DUP10 DUP7 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x68E JUMPI DUP9 SUB PUSH2 0x65C JUMPI DUP5 PUSH2 0x585 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x49C JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x5F9 JUMPI JUMPDEST PUSH2 0x5AE JUMPI DUP10 PUSH2 0x544 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5A4 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6EF SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x430 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x72D PUSH2 0x29E5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x757 PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x79B JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x821 PUSH2 0x29E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x83E PUSH2 0x2A08 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x914 PUSH2 0x2A08 JUMP JUMPDEST PUSH2 0x91C PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9CE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBAE PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB1D DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x32BD JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBDB JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBD7 SWAP1 DUP3 ADD DUP6 PUSH2 0x29A2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBEA DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC5B JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC5F JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC5B JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC21 DUP5 PUSH2 0x2D2E JUMP JUMPDEST SWAP3 PUSH2 0xC2F PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2BFB JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC58 JUMPI POP PUSH2 0xBD7 SWAP3 PUSH2 0xC52 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x297F JUMP JUMPDEST SWAP1 PUSH2 0xBC1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0xC7D CALLDATASIZE PUSH2 0x2ACE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC2 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA2 JUMPI JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEA JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD12 PUSH2 0xD0D DUP4 DUP6 DUP11 PUSH2 0x3318 JUMP JUMPDEST PUSH2 0x3328 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE74 JUMPI JUMPDEST POP ISZERO PUSH2 0xE47 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA1 PUSH2 0xD0D DUP4 DUP6 DUP11 PUSH2 0x3318 JUMP JUMPDEST AND SWAP1 PUSH2 0xDB1 PUSH2 0xD0D DUP3 DUP7 DUP10 PUSH2 0x3318 JUMP JUMPDEST SWAP2 PUSH2 0xDBD DUP3 DUP8 DUP12 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x314 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE36 JUMPI JUMPDEST POP ADD PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE41 SWAP2 PUSH2 0x2BFB JUMP JUMPDEST DUP9 PUSH2 0xE2F JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE95 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3349 JUMP JUMPDEST DUP10 PUSH2 0xD77 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE83 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDA JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xEE3 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0xEEB PUSH2 0x2A08 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0xF0E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B61 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF19 PUSH2 0x3553 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFBE JUMPI JUMPDEST POP POP PUSH2 0xF9F DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFA7 JUMPI STOP JUMPDEST PUSH2 0xFBC SWAP6 PUSH2 0xFB6 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2D68 JUMP JUMPDEST SWAP4 PUSH2 0x36E7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC7 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF70 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1076 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x314 JUMPI PUSH2 0x1170 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10A8 PUSH2 0x3553 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1142 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x119A DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x108A JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x121E CALLDATASIZE PUSH2 0x2B8F JUMP JUMPDEST PUSH2 0x1250 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH2 0x30F6 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x127B DUP2 PUSH2 0x2C6B JUMP JUMPDEST SWAP5 PUSH2 0x1289 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2BFB JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x314 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x130D JUMPI POP POP POP SWAP1 PUSH2 0x12B6 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2C83 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12CE JUMPI STOP JUMPDEST DUP1 PUSH2 0x1307 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12F3 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x327A JUMP JUMPDEST MLOAD AND PUSH2 0x12FF DUP4 DUP10 PUSH2 0x327A JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x31B8 JUMP JUMPDEST ADD PUSH2 0x12C5 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12A0 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBD7 PUSH2 0x1395 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3361 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x13E0 PUSH2 0x2A08 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1478 PUSH2 0x29E5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14B7 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1544 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x163A PUSH2 0x3553 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1706 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA5E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1785 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0x17A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B61 JUMP JUMPDEST SWAP2 PUSH2 0x17D6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH2 0x1816 DUP5 DUP3 PUSH2 0x1810 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1808 PUSH2 0x3553 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2D68 JUMP JUMPDEST SWAP5 PUSH2 0x31B8 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x181E JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x188B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x191D JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18ED JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1994 JUMPI JUMPDEST DUP2 PUSH2 0x1936 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1990 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18A1 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1929 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x19AA CALLDATASIZE PUSH2 0x2ACE JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19ED PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B42 JUMPI JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A15 JUMPI STOP JUMPDEST PUSH2 0x1A20 DUP2 DUP4 DUP9 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x314 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A53 PUSH2 0xD0D DUP7 DUP12 DUP15 PUSH2 0x3318 JUMP JUMPDEST DUP3 PUSH2 0x1ABD PUSH2 0x1AE9 PUSH2 0x1A65 DUP10 DUP14 DUP14 PUSH2 0x3318 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2BFB JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B39 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B0C JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A0C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1AFF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A05 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1B83 PUSH2 0x29E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BEC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1C73 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x32BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D02 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D80 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1DEE PUSH2 0x1DE9 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x2CCF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1E2F PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E67 PUSH2 0x1EBE SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1E95 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2C83 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FAE JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F0E JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F18 DUP2 DUP4 PUSH2 0x327A JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F81 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ECD JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x1FE6 CALLDATASIZE PUSH2 0x2A2B JUMP JUMPDEST PUSH2 0x1FEE PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2098 JUMPI JUMPDEST POP POP PUSH2 0x2074 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x207C JUMPI STOP JUMPDEST PUSH2 0xFBC SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x208F PUSH1 0x20 DUP7 PUSH2 0x2BFB JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x36E7 JUMP JUMPDEST PUSH2 0x20A1 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2045 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xFBC PUSH2 0x20E2 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x210E PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x31B8 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2172 PUSH2 0x2A08 JUMP JUMPDEST PUSH2 0x217A PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x222D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA5E JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x241E JUMPI JUMPDEST ISZERO PUSH2 0x23E8 JUMPI POP POP PUSH2 0xBD7 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBD7 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x240B JUMPI PUSH2 0x2405 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x30B4 JUMP JUMPDEST DIV PUSH2 0x23B8 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2419 SWAP3 DIV PUSH2 0x30B4 JUMP JUMPDEST PUSH2 0x23B8 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23AB JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0xFBC PUSH2 0x2437 CALLDATASIZE PUSH2 0x2A2B JUMP JUMPDEST SWAP2 PUSH2 0x2440 PUSH2 0x3553 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x24BE JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST PUSH2 0x24C7 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2496 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x255C PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x2604 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2831 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2654 PUSH2 0x3553 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2803 JUMPI DUP5 DUP7 EQ PUSH2 0x27D5 JUMPI PUSH2 0x2694 DUP2 DUP7 DUP7 PUSH2 0x3667 JUMP JUMPDEST ISZERO PUSH2 0x2789 JUMPI POP ISZERO PUSH2 0x26F8 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x26E4 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x26BB JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2775 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x26BD JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2719 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x285B SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3468 JUMP JUMPDEST DUP4 PUSH2 0x262A JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1C73 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2E4E JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBD7 PUSH2 0x1395 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3361 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI PUSH2 0x1DEE PUSH1 0x20 SWAP2 PUSH2 0x2D9F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2992 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2982 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x29DE DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x297F JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x314 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x314 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2B17 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2B3A SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x314 JUMPI PUSH2 0x2B5D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x314 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x314 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2BD8 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x314 JUMPI PUSH2 0x2B5D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C3C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C3C JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2C8F DUP2 PUSH2 0x2C6B JUMP JUMPDEST SWAP4 PUSH2 0x2C9D PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2BFB JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x314 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2CBF JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2CB3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D27 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C3C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2D74 DUP3 PUSH2 0x2D2E JUMP JUMPDEST SWAP2 PUSH2 0x2D82 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BFB JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x314 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E48 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E42 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x68E JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x2D27 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6BC JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2803 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3082 JUMPI DUP3 PUSH2 0x2F31 SWAP2 DUP6 PUSH2 0x3667 JUMP JUMPDEST ISZERO PUSH2 0x2FC7 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x2F78 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x2F50 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x303C JUMPI JUMPDEST PUSH2 0x2FF0 JUMPI DUP1 PUSH2 0x2F37 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x2FE6 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x30C7 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3150 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FAE JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x324C JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x328E JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x32EB JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x328E JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x314 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x314 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x345E JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3431 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x33F1 JUMPI POP PUSH1 0x1 EQ PUSH2 0x33AA JUMPI JUMPDEST POP PUSH2 0x33A8 SWAP3 POP SUB DUP4 PUSH2 0x2BFB JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x33D5 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x33A8 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x339B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x33BC JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x33A8 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x339B JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x337B JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3549 JUMPI JUMPDEST PUSH2 0x3491 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x352A JUMPI JUMPDEST POP ISZERO PUSH2 0x34FD JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3543 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9B JUMPI PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST CODESIZE PUSH2 0x34F4 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3489 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3658 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x365D JUMPI JUMPDEST PUSH2 0x3658 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35DE JUMPI JUMPDEST POP PUSH2 0x35DB JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3639 JUMPI JUMPDEST POP CODESIZE PUSH2 0x35D1 JUMP JUMPDEST PUSH2 0x3652 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9B JUMPI PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST CODESIZE PUSH2 0x3632 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x359A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3692 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x368C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3759 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x37BD JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18ED JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3830 JUMPI JUMPDEST DUP2 PUSH2 0x37D6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1990 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x376F JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x37C9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F PUSH16 0x589B371E79312F588E4B1D310CE131F2 DUP5 PUSH22 0x4573908A730934082E6F4D0664736F6C634300081E00 CALLER PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 ","sourceMap":"1152:1136:328:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;1637:10;1645:152:42;;-1:-1:-1;1152:1136:328;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;1152:1136:328;;;-1:-1:-1;;;;;;1152:1136:328;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;1152:1136:328;;;-1:-1:-1;;;;;1152:1136:328;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;;990:1:42;1152:1136:328;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;;;;-1:-1:-1;;;;;1152:1136:328;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;990:1:42;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;;1289:23:341;1152:1136:328;;-1:-1:-1;;;;;;1152:1136:328;;;;;;;-1:-1:-1;;;;500:10:59;;;1152:1136:328;500:10:59;;;;1152:1136:328;500:10:59;;;;;-1:-1:-1;;500:10:59;;;1152:1136:328;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;1152:1136:328;745:39:76;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1152:1136:328;;-1:-1:-1;1152:1136:328;;-1:-1:-1;1152:1136:328;;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;990:1:42;1152:1136:328;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;;;;;;;;;;;;1152:1136:328;;;;;;;-1:-1:-1;;;1152:1136:328;;;;;;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1152:1136:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1152:1136:328;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;-1:-1:-1;990:1:42;1152:1136:328;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;1645:152:42;1152:1136:328;;;-1:-1:-1;;;;;;1152:1136:328;1637:10;1152:1136;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1152:1136:328;-1:-1:-1;1152:1136:328;;;;;;;;;-1:-1:-1;;1152:1136:328;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1152:1136:328;;;;;;;;-1:-1:-1;;1152:1136:328;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":10760,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":10795,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":10958,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":11151,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":10909,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":11395,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":11624,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":13129,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":11105,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":10725,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":10658,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":11371,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":11566,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":13080,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":12468,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":13153,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":10623,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":11259,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":14055,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":13416,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":12534,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":11854,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":13927,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":11471,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":12728,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":13651,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":12989,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":11679,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":11965,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":12922,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":13096,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8975},{"length":32,"start":11494},{"length":32,"start":13674}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461291957806306fdde03146128be578063081812fc14612861578063095ea7b3146125cd578063114ba8ee146124ce57806323b872dd146124265780632a55205a146123335780632b4c9f16146122c45780632f2ff15d1461213857806340c10f19146120a857806342842e0e14611fd85780634684d7e914611df8578063572b6c0514611dad57806361ba27da14611c915780636352211e14611c1657806370a0823114611b4c57806373c8a9581461199c5780638832e6e31461174e5780638bb9c5bf146115df5780638da5cb5b1461156e5780638dc251e31461144157806391d14854146113a957806395d89b411461133a5780639da5e83214611210578063a0c76f621461119f578063a22cb4651461103f578063b0ccc31e14610fce578063b88d4fde14610eac578063c3666c3614610c6f578063c87b56dd14610abc578063d539139314610a63578063d547741f146108da578063e1a8bf2c1461089e578063e985e9c5146107ea578063f2fde38b146106f6578063f3993d11146103705763f7ba94bd146101b357600080fd5b34610314576101c136612b8f565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610202613553565b925416911690810361034357508181036103195760005b81811061022257005b61022d818387613318565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031457610257828587613318565b35908147106102e257600080809381935af13d156102da573d9061027a82612d2e565b916102886040519384612bfb565b82523d6000602084013e5b156102a15750600101610219565b8051156102b057602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b606090610293565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103145760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576103a76129e5565b6103af612a08565b9060443567ffffffffffffffff8111610314576103d0903690600401612a9d565b926103d9613553565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106e6575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106bc5761047e8382849694613667565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b8781106105015787878781811415806104f8575b6104b657005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104b0565b61050c818986613318565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff8116801561068e57880361065c5784610585575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a40161049c565b74010000000000000000000000000000000000000000161580156105f9575b6105ae5789610544565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105a4565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106ef91613468565b8582610430565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145761072d6129e5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610757613553565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610343575073ffffffffffffffffffffffffffffffffffffffff169182820361079b57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576108216129e5565b73ffffffffffffffffffffffffffffffffffffffff61083e612a08565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020604051620186a08152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457600435610914612a08565b61091c613553565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034357507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109ce57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bae6000600435610b1d817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06132bd565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6357600091610bdb575b60405160208082528190610bd7908201856129a2565b0390f35b3d8083833e610bea8183612bfb565b810190602081830312610c5b5780519067ffffffffffffffff8211610c5f570181601f82011215610c5b57805192610c2184612d2e565b92610c2f6040519485612bfb565b84845260208584010111610c585750610bd792610c52916020808501910161297f565b90610bc1565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031457610c7d36612ace565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610cc2613553565b92541691169081036103435750808214801590610ea2575b6103195760005b828110610cea57005b73ffffffffffffffffffffffffffffffffffffffff610d12610d0d83858a613318565b613328565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6357600091610e74575b5015610e47575073ffffffffffffffffffffffffffffffffffffffff610da1610d0d83858a613318565b1690610db1610d0d828689613318565b91610dbd82878b613318565b3592813b1561031457606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6357600192610e36575b5001610ce1565b6000610e4191612bfb565b88610e2f565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610e95915060203d8111610e9b575b610e8d8183612bfb565b810190613349565b89610d77565b503d610e83565b5082821415610cda565b346103145760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610ee36129e5565b610eeb612a08565b60443560643567ffffffffffffffff811161031457610f0e903690600401612b61565b929093610f19613553565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fbe575b5050610f9f848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b823b610fa757005b610fbc95610fb6913691612d68565b936136e7565b005b610fc791613468565b8685610f70565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576110766129e5565b602435908115159182810361031457611170575b73ffffffffffffffffffffffffffffffffffffffff806110a8613553565b169116918183146111425760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61119a817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613468565b61108a565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103145761121e36612b8f565b6112507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b906130f6565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09261127b81612c6b565b946112896040519687612bfb565b818652602086019160051b81019036821161031457915b81831061130d57505050906112b6913691612c83565b91805191835183036103195760005b8381106112ce57005b8061130773ffffffffffffffffffffffffffffffffffffffff6112f36001948761327a565b51166112ff838961327a565b5190856131b8565b016112c5565b823573ffffffffffffffffffffffffffffffffffffffff81168103610314578152602092830192016112a0565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bd76113957f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613361565b6040519182916020835260208301906129a2565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576113e0612a08565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576114786129e5565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114b7613553565b925416911690810361034357507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156115445773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043561163a613553565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117065760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a5e565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103145760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576117856129e5565b6024359060443567ffffffffffffffff8111610314576117a9903690600401612b61565b916117d67fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b61181684826118107fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611808613553565b973691612d68565b946131b8565b803b61181e57005b73ffffffffffffffffffffffffffffffffffffffff80602092169361188b60405194859384937f150b7a02000000000000000000000000000000000000000000000000000000008552166004840152600060248401528760448401526080606484015260848301906129a2565b03816000865af1908115610c635760009161191d575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118ed57005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611994575b8161193660209383612bfb565b810103126119905751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c5857507fffffffff000000000000000000000000000000000000000000000000000000006118a1565b5080fd5b3d9150611929565b34610314576119aa36612ace565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119ed613553565b92541691169081036103435750808414801590611b42575b6103195760005b848110611a1557005b611a20818388613318565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610314576000602091611a53610d0d868b8e613318565b82611abd611ae9611a65898d8d613318565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612bfb565b51925af115610c63576000513d611b395750803b155b611b0c5750600101611a0c565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611aff565b5082841415611a05565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457611b836129e5565b73ffffffffffffffffffffffffffffffffffffffff811615611bec5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611c736004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06132bd565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d02613553565b925416911690810361034357507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8057815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611dee611de96129e5565b612ccf565b6040519015158152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457611e2f6129e5565b60243567ffffffffffffffff81116103145773ffffffffffffffffffffffffffffffffffffffff611e67611ebe923690600401612a9d565b9290611e957fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691612c83565b9216908115611fae5782519260005b848110611f0e575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f18818361327a565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8157908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ecd565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031457611fe636612a2b565b611fee613553565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612098575b5050612074828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b803b61207c57005b610fbc936040519361208f602086612bfb565b600085526136e7565b6120a191613468565b8483612045565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610fbc6120e26129e5565b61210e7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261124a613553565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06131b8565b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457600435612172612a08565b61217a613553565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034357507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561222d57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a5e565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c908015801561241e575b156123e8575050610bd760005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610bd791620186a082101561240b5761240590620186a0926130b4565b046123b8565b620186a061241992046130b4565b6123b8565b5081156123ab565b3461031457610fbc61243736612a2b565b91612440613553565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036124be575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ebd565b6124c791613468565b8581612496565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103145760043573ffffffffffffffffffffffffffffffffffffffff81168103610314577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061255c613553565b9254169116908103610343575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103145760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576126046129e5565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612831575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612654613553565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612803578486146127d557612694818686613667565b156127895750156126f85774010000000000000000000000000000000000000000166126e4575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b8360005260205280604060002055836126bb565b90740100000000000000000000000000000000000000008217809203612775575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556126bd565b846000526020526040600020558380612719565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61285b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613468565b8361262a565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576020611c736004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612e4e565b346103145760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031457610bd76113957f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613361565b346103145760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610314576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031457611dee602091612d9f565b60005b8381106129925750506000910152565b8181015183820152602001612982565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936129de8151809281875287808801910161297f565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031457565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031457565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103145760043573ffffffffffffffffffffffffffffffffffffffff81168103610314579060243573ffffffffffffffffffffffffffffffffffffffff81168103610314579060443590565b9181601f840112156103145782359167ffffffffffffffff8311610314576020808501948460051b01011161031457565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103145760043567ffffffffffffffff81116103145781612b1791600401612a9d565b9290929160243567ffffffffffffffff81116103145781612b3a91600401612a9d565b929092916044359067ffffffffffffffff821161031457612b5d91600401612a9d565b9091565b9181601f840112156103145782359167ffffffffffffffff8311610314576020838186019501011161031457565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103145760043567ffffffffffffffff81116103145781612bd891600401612a9d565b929092916024359067ffffffffffffffff821161031457612b5d91600401612a9d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612c3c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff8111612c3c5760051b60200190565b929190612c8f81612c6b565b93612c9d6040519586612bfb565b602085838152019160051b810192831161031457905b828210612cbf57505050565b8135815260209182019101612cb3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115612d275773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612c3c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612d7482612d2e565b91612d826040519384612bfb565b829481845281830111610314578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114612e48577f01ffc9a7000000000000000000000000000000000000000000000000000000008114612e42576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81161561068e57740100000000000000000000000000000000000000001615612d27576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106bc57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156128035773ffffffffffffffffffffffffffffffffffffffff81168095036130825782612f319185613667565b15612fc7575b5050836000528060205282604060002055828203612f78575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538612f50565b740100000000000000000000000000000000000000001615801561303c575b612ff05780612f37565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415612fe6565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156130c757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156131505750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fae57826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661324c57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561328e5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156132eb575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561328e5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103145790565b90816020910312610314575180151581036103145790565b906040519160008154918260011c9260018116801561345e575b602085108114613431578487528693929181156133f157506001146133aa575b506133a892500383612bfb565b565b90506000929192526020600020906000915b8183106133d55750509060206133a8928201013861339b565b60209193508060019154838589010152019101909184926133bc565b602093506133a89592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861339b565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f169361337b565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613549575b613491575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c635760009161352a575b50156134fd5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613543915060203d602011610e9b57610e8d8183612bfb565b386134f4565b50813b1515613489565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561365857323314801561365d575b613658577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156135de575b506135db57503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c6357600091613639575b50386135d1565b613652915060203d602011610e9b57610e8d8183612bfb565b38613632565b503390565b506018361061359a565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613692575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061368c565b73ffffffffffffffffffffffffffffffffffffffff90613759826020949597969716958360405196879586957f150b7a020000000000000000000000000000000000000000000000000000000087521660048601521660248401528760448401526080606484015260848301906129a2565b03816000865af1908115610c63576000916137bd575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118ed575050565b6020813d602011613830575b816137d660209383612bfb565b810103126119905751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c5857507fffffffff0000000000000000000000000000000000000000000000000000000061376f565b3d91506137c956fea26469706673582212202f6f589b371e79312f588e4b1d310ce131f284754573908a730934082e6f4d0664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2919 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x28BE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2861 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x25CD JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x24CE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2426 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x2333 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22C4 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2138 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20A8 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FD8 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1DF8 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DAD JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C91 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C16 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B4C JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x199C JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x174E JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15DF JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x156E JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1441 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13A9 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x133A JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1210 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x119F JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x103F JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFCE JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEAC JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC6F JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xABC JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA63 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8DA JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x89E JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7EA JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x6F6 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x370 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x1C1 CALLDATASIZE PUSH2 0x2B8F JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x202 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP2 DUP2 SUB PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x222 JUMPI STOP JUMPDEST PUSH2 0x22D DUP2 DUP4 DUP8 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x314 JUMPI PUSH2 0x257 DUP3 DUP6 DUP8 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2E2 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2DA JUMPI RETURNDATASIZE SWAP1 PUSH2 0x27A DUP3 PUSH2 0x2D2E JUMP JUMPDEST SWAP2 PUSH2 0x288 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BFB JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2A1 JUMPI POP PUSH1 0x1 ADD PUSH2 0x219 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x293 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x3A7 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x3AF PUSH2 0x2A08 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0x3D0 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 PUSH2 0x3D9 PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6E6 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6BC JUMPI PUSH2 0x47E DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3667 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x501 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x4F8 JUMPI JUMPDEST PUSH2 0x4B6 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4B0 JUMP JUMPDEST PUSH2 0x50C DUP2 DUP10 DUP7 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x68E JUMPI DUP9 SUB PUSH2 0x65C JUMPI DUP5 PUSH2 0x585 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x49C JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x5F9 JUMPI JUMPDEST PUSH2 0x5AE JUMPI DUP10 PUSH2 0x544 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5A4 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6EF SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x430 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x72D PUSH2 0x29E5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x757 PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x79B JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x821 PUSH2 0x29E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x83E PUSH2 0x2A08 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x914 PUSH2 0x2A08 JUMP JUMPDEST PUSH2 0x91C PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9CE JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBAE PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB1D DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x32BD JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBDB JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBD7 SWAP1 DUP3 ADD DUP6 PUSH2 0x29A2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBEA DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC5B JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC5F JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC5B JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC21 DUP5 PUSH2 0x2D2E JUMP JUMPDEST SWAP3 PUSH2 0xC2F PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x2BFB JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC58 JUMPI POP PUSH2 0xBD7 SWAP3 PUSH2 0xC52 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x297F JUMP JUMPDEST SWAP1 PUSH2 0xBC1 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0xC7D CALLDATASIZE PUSH2 0x2ACE JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCC2 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEA2 JUMPI JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCEA JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD12 PUSH2 0xD0D DUP4 DUP6 DUP11 PUSH2 0x3318 JUMP JUMPDEST PUSH2 0x3328 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE74 JUMPI JUMPDEST POP ISZERO PUSH2 0xE47 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDA1 PUSH2 0xD0D DUP4 DUP6 DUP11 PUSH2 0x3318 JUMP JUMPDEST AND SWAP1 PUSH2 0xDB1 PUSH2 0xD0D DUP3 DUP7 DUP10 PUSH2 0x3318 JUMP JUMPDEST SWAP2 PUSH2 0xDBD DUP3 DUP8 DUP12 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x314 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE36 JUMPI JUMPDEST POP ADD PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE41 SWAP2 PUSH2 0x2BFB JUMP JUMPDEST DUP9 PUSH2 0xE2F JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE95 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xE9B JUMPI JUMPDEST PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3349 JUMP JUMPDEST DUP10 PUSH2 0xD77 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE83 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCDA JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xEE3 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0xEEB PUSH2 0x2A08 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0xF0E SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B61 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF19 PUSH2 0x3553 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFBE JUMPI JUMPDEST POP POP PUSH2 0xF9F DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFA7 JUMPI STOP JUMPDEST PUSH2 0xFBC SWAP6 PUSH2 0xFB6 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2D68 JUMP JUMPDEST SWAP4 PUSH2 0x36E7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC7 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF70 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1076 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x314 JUMPI PUSH2 0x1170 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10A8 PUSH2 0x3553 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1142 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x119A DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x108A JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x121E CALLDATASIZE PUSH2 0x2B8F JUMP JUMPDEST PUSH2 0x1250 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST SWAP1 PUSH2 0x30F6 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x127B DUP2 PUSH2 0x2C6B JUMP JUMPDEST SWAP5 PUSH2 0x1289 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x2BFB JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x314 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x130D JUMPI POP POP POP SWAP1 PUSH2 0x12B6 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x2C83 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12CE JUMPI STOP JUMPDEST DUP1 PUSH2 0x1307 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12F3 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x327A JUMP JUMPDEST MLOAD AND PUSH2 0x12FF DUP4 DUP10 PUSH2 0x327A JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x31B8 JUMP JUMPDEST ADD PUSH2 0x12C5 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12A0 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBD7 PUSH2 0x1395 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3361 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x13E0 PUSH2 0x2A08 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1478 PUSH2 0x29E5 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14B7 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1544 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x163A PUSH2 0x3553 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1706 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA5E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1785 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH2 0x17A9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2B61 JUMP JUMPDEST SWAP2 PUSH2 0x17D6 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH2 0x1816 DUP5 DUP3 PUSH2 0x1810 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1808 PUSH2 0x3553 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x2D68 JUMP JUMPDEST SWAP5 PUSH2 0x31B8 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x181E JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x188B PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x191D JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18ED JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1994 JUMPI JUMPDEST DUP2 PUSH2 0x1936 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1990 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18A1 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1929 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x19AA CALLDATASIZE PUSH2 0x2ACE JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19ED PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B42 JUMPI JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A15 JUMPI STOP JUMPDEST PUSH2 0x1A20 DUP2 DUP4 DUP9 PUSH2 0x3318 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x314 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A53 PUSH2 0xD0D DUP7 DUP12 DUP15 PUSH2 0x3318 JUMP JUMPDEST DUP3 PUSH2 0x1ABD PUSH2 0x1AE9 PUSH2 0x1A65 DUP10 DUP14 DUP14 PUSH2 0x3318 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x2BFB JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B39 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B0C JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A0C JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1AFF JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A05 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1B83 PUSH2 0x29E5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BEC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1C73 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x32BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D02 PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D80 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1DEE PUSH2 0x1DE9 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x2CCF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x1E2F PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E67 PUSH2 0x1EBE SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1E95 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x2C83 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FAE JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F0E JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F18 DUP2 DUP4 PUSH2 0x327A JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F81 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ECD JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0x1FE6 CALLDATASIZE PUSH2 0x2A2B JUMP JUMPDEST PUSH2 0x1FEE PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2098 JUMPI JUMPDEST POP POP PUSH2 0x2074 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x207C JUMPI STOP JUMPDEST PUSH2 0xFBC SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x208F PUSH1 0x20 DUP7 PUSH2 0x2BFB JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x36E7 JUMP JUMPDEST PUSH2 0x20A1 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2045 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xFBC PUSH2 0x20E2 PUSH2 0x29E5 JUMP JUMPDEST PUSH2 0x210E PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x124A PUSH2 0x3553 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x31B8 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2172 PUSH2 0x2A08 JUMP JUMPDEST PUSH2 0x217A PUSH2 0x3553 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x222D JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA5E JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x241E JUMPI JUMPDEST ISZERO PUSH2 0x23E8 JUMPI POP POP PUSH2 0xBD7 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBD7 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x240B JUMPI PUSH2 0x2405 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x30B4 JUMP JUMPDEST DIV PUSH2 0x23B8 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2419 SWAP3 DIV PUSH2 0x30B4 JUMP JUMPDEST PUSH2 0x23B8 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23AB JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH2 0xFBC PUSH2 0x2437 CALLDATASIZE PUSH2 0x2A2B JUMP JUMPDEST SWAP2 PUSH2 0x2440 PUSH2 0x3553 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x24BE JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2EBD JUMP JUMPDEST PUSH2 0x24C7 SWAP2 PUSH2 0x3468 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2496 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x255C PUSH2 0x3553 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x343 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0x2604 PUSH2 0x29E5 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2831 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2654 PUSH2 0x3553 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2803 JUMPI DUP5 DUP7 EQ PUSH2 0x27D5 JUMPI PUSH2 0x2694 DUP2 DUP7 DUP7 PUSH2 0x3667 JUMP JUMPDEST ISZERO PUSH2 0x2789 JUMPI POP ISZERO PUSH2 0x26F8 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x26E4 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x26BB JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2775 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x26BD JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2719 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x285B SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3468 JUMP JUMPDEST DUP4 PUSH2 0x262A JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x20 PUSH2 0x1C73 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2E4E JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH2 0xBD7 PUSH2 0x1395 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3361 JUMP JUMPDEST CALLVALUE PUSH2 0x314 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI PUSH2 0x1DEE PUSH1 0x20 SWAP2 PUSH2 0x2D9F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2992 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2982 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x29DE DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x297F JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x314 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x314 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2B17 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2B3A SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x314 JUMPI PUSH2 0x2B5D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x314 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x314 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x314 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x314 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x314 JUMPI DUP2 PUSH2 0x2BD8 SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x314 JUMPI PUSH2 0x2B5D SWAP2 PUSH1 0x4 ADD PUSH2 0x2A9D JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2C3C JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C3C JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x2C8F DUP2 PUSH2 0x2C6B JUMP JUMPDEST SWAP4 PUSH2 0x2C9D PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x2BFB JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x314 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x2CBF JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2CB3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x2D27 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2C3C JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x2D74 DUP3 PUSH2 0x2D2E JUMP JUMPDEST SWAP2 PUSH2 0x2D82 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x2BFB JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x314 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E48 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x2E42 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x68E JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x2D27 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6BC JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2803 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3082 JUMPI DUP3 PUSH2 0x2F31 SWAP2 DUP6 PUSH2 0x3667 JUMP JUMPDEST ISZERO PUSH2 0x2FC7 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x2F78 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x2F50 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x303C JUMPI JUMPDEST PUSH2 0x2FF0 JUMPI DUP1 PUSH2 0x2F37 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x2FE6 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x30C7 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3150 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FAE JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x324C JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x328E JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x32EB JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x328E JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x314 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x314 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x314 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x345E JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3431 JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x33F1 JUMPI POP PUSH1 0x1 EQ PUSH2 0x33AA JUMPI JUMPDEST POP PUSH2 0x33A8 SWAP3 POP SUB DUP4 PUSH2 0x2BFB JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x33D5 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x33A8 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x339B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x33BC JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x33A8 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x339B JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x337B JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3549 JUMPI JUMPDEST PUSH2 0x3491 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x352A JUMPI JUMPDEST POP ISZERO PUSH2 0x34FD JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3543 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9B JUMPI PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST CODESIZE PUSH2 0x34F4 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3489 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3658 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x365D JUMPI JUMPDEST PUSH2 0x3658 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x35DE JUMPI JUMPDEST POP PUSH2 0x35DB JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3639 JUMPI JUMPDEST POP CODESIZE PUSH2 0x35D1 JUMP JUMPDEST PUSH2 0x3652 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xE9B JUMPI PUSH2 0xE8D DUP2 DUP4 PUSH2 0x2BFB JUMP JUMPDEST CODESIZE PUSH2 0x3632 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x359A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3692 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x368C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3759 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x29A2 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC63 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x37BD JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18ED JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3830 JUMPI JUMPDEST DUP2 PUSH2 0x37D6 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x2BFB JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1990 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC58 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x376F JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x37C9 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F PUSH16 0x589B371E79312F588E4B1D310CE131F2 DUP5 PUSH22 0x4573908A730934082E6F4D0664736F6C634300081E00 CALLER ","sourceMap":"1152:1136:328:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1152:1136:328;;2005:41;;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1152:1136:328;1845:10:192;;;;;;1152:1136:328;1857:3:192;1876:11;;;;;:::i;:::-;1152:1136:328;;;;;;;;;1898:10:192;;;;;:::i;:::-;1152:1136:328;1375:21:9;;;:30;1371:125;;1152:1136:328;1548:33:9;;;;;;;1152:1136:328;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1152:1136:328;;1834:9:192;;1591:58:9;1152:1136:328;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1152:1136:328;5957:19:9;1152:1136:328;;5957:19:9;1152:1136:328;;;;;1371:125:9;1455:21;;1428:57;1152:1136:328;1428:57:9;1152:1136:328;;;;;;1428:57:9;1152:1136:328;;;;1756:63:192;1793:26;1152:1136:328;1793:26:192;1152:1136:328;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1152:1136:328;;-1:-1:-1;4538:25:42;1152:1136:328;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2005:41;;;:::i;:::-;3179:19:352;1152:1136:328;;;;;;;;2616:14:352;2612:76;;1152:1136:328;29158:19:327;;1152:1136:328;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;1152:1136:328;;12884:11:327;;1152:1136:328;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;1152:1136:328;13173:304:327;-1:-1:-1;1152:1136:328;;;13323:10:327;1152:1136:328;;;;;;;;;;;2220:8:327;;1152:1136:328;;;;;;;;;2220:8:327;;1152:1136:328;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;1152:1136:328;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;1152:1136:328;;;;;;;;;;;;;;2220:8:327;13125:27;;;1152:1136:328;13125:27:327;;1152:1136:328;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;1152:1136:328;12987:51:327;;1152:1136:328;12987:51:327;1152:1136:328;;;;;;;;;12987:51:327;12919:59;1152:1136:328;;;;12958:11:327;1152:1136:328;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;1152:1136:328;12832:34:327;1152:1136:328;;;;;;12832:34:327;12715:64;12748:31;;1152:1136:328;12748:31:327;1152:1136:328;;;;12748:31:327;12409:58;12438:29;1152:1136:328;12438:29:327;1152:1136:328;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1152:1136:328;;;;;;;;;;;;;:::i;:::-;;2005:41;;;:::i;:::-;1152:1136;;;;;;;;3205:23:42;;;3201:60;;1152:1136:328;;;3275:25:42;;;;3271:146;;1152:1136:328;3271:146:42;2220:8:327;;;;;;;;3361:45:42;1152:1136:328;3361:45:42;;1152:1136:328;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;1152:1136:328;-1:-1:-1;1152:1136:328;28718:11:327;1152:1136:328;;;;-1:-1:-1;1152:1136:328;28718:28:327;1152:1136:328;-1:-1:-1;1152:1136:328;;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;713:6:351;1152:1136:328;;;;;;;;;;;;;;;;;;:::i;:::-;2005:41;;:::i;:::-;5148:19:42;1152:1136:328;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1152:1136:328;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;1880:140:41;;1152:1136:328;1880:140:41;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1152:1136:328;;;;1973:36:41;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;1152:1136:328;;;1453:39:302;1863:70:327;1152:1136:328;1453:39:302;:::i;:::-;;1152:1136:328;3364:23:341;1152:1136:328;;;;3364:64:341;;;;;1152:1136:328;3364:64:341;;1603:4:302;1152:1136:328;3364:64:341;;1152:1136:328;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;1152:1136:328;3364:64:341;;;1152:1136:328;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1152:1136:328;;;;;;;;;;;3364:64:341;1152:1136:328;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1152:1136:328;;;2005:41;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1152:1136:328;3852:94:192;;1152:1136:328;3972:10:192;;;;;;1152:1136:328;3984:3:192;1152:1136:328;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1152:1136:328;;;;4058:76:192;;4108:25;1152:1136:328;4058:76:192;;1152:1136:328;4058:76:192;;;;;;;;;;;;1152:1136:328;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1152:1136:328;4239:12:192;;;;;;:::i;:::-;1152:1136:328;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1152:1136:328;4239:70:192;;;;;;;1152:1136:328;;;;;;;4239:70:192;;;;;1152:1136:328;4239:70:192;;4277:4;1152:1136:328;4239:70:192;;1152:1136:328;;4058:76:192;1152:1136:328;;;;;;;4239:70:192;;;;;;;1152:1136:328;4239:70:192;;;3984:3;;1152:1136:328;3961:9:192;;4239:70;1152:1136:328;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1152:1136:328;4161:50:192;1152:1136:328;;4058:76:192;1152:1136:328;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1152:1136:328;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2005:41;;;;;:::i;:::-;3179:19:352;1152:1136:328;;;;;;;;2616:14:352;2612:76;;1152:1136:328;29158:19:327;;11217:7;1863:70;;;;1152:1136:328;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;1152:1136:328;11235:101:327;11271:54;1152:1136:328;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;1152:1136:328;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;1152:1136:328;;2005:41;;;:::i;:::-;1152:1136;;;6339:18:327;;;;6335:63;;1152:1136:328;6463:42:327;6408:19;1152:1136:328;-1:-1:-1;1152:1136:328;6408:11:327;1152:1136:328;;;-1:-1:-1;1152:1136:328;;-1:-1:-1;1152:1136:328;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;;;;;6463:42:327;1152:1136:328;6335:63:327;6366:32;;1152:1136:328;6366:32:327;1152:1136:328;;;;6366:32:327;1500:115:305;2931:8:352;668:81;1152:1136:328;2931:8:352;:::i;:::-;1500:115:305;;1152:1136:328;;;;;;;;;;;;;2991:23:341;1152:1136:328;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;1152:1136:328;2005:41;;:::i;:::-;1368:12:300;;:::i;:::-;1152:1136:328;1062:8:300;;;;:::i;:::-;1152:1136:328;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;1152:1136:328;;1062:8:300;;;;;;;;;;;1152:1136:328;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;1152:1136:328;17882:10:327;;;;;;1152:1136:328;17894:3:327;17920:13;17935:11;1152:1136:328;17920:13:327;1152:1136:328;17920:13:327;;;:::i;:::-;1152:1136:328;;17935:11:327;;;;:::i;:::-;1152:1136:328;17935:11:327;;;:::i;:::-;1152:1136:328;17871:9:327;;1062:8:300;1152:1136:328;;;;;;;;;1062:8:300;;;;;;;;;;1152:1136:328;;;;;;;;;;;;;2688:13:341;1152:1136:328;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1152:1136:328;-1:-1:-1;1152:1136:328;;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2005:41;;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;2976:19:351;1152:1136:328;;;;;1732:22:351;1728:93;;1152:1136:328;;2220:8:327;;;;;;;1152:1136:328;;;1728:93:351;1777:33;1152:1136:328;1777:33:351;1152:1136:328;;1777:33:351;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2005:41;;:::i;:::-;1152:1136;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;3741:25:41;3737:66;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1152:1136:328;;;;2455:33:41;1152:1136:328;3737:66:41;1152:1136:328;3775:28:41;;;1152:1136:328;3775:28:41;1152:1136:328;;;;;;;3775:28:41;1152:1136:328;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;1152:1136:328;2005:41;;:::i;1586:12:303:-;15560:7:327;1863:70;;1152:1136:328;;2005:41;;;:::i;:::-;1152:1136;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;1152:1136:328;15578:107:327;1152:1136:328;;;;;;;;;29832:65:327;;;;;1152:1136:328;29832:65:327;;1152:1136:328;;29832:65:327;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;1152:1136:328;29832:65:327;;;;;;;;1152:1136:328;29832:65:327;;;15578:107;1152:1136:328;;;;;29832:84:327;29828:136;;1152:1136:328;29828:136:327;29925:39;1152:1136:328;29925:39:327;1152:1136:328;;;;;;29925:39:327;29832:65;1152:1136:328;29832:65:327;;1152:1136:328;29832:65:327;;;;;;1152:1136:328;29832:65:327;;;:::i;:::-;;;1152:1136:328;;;;;;;;;;;;;29832:65:327;1152:1136:328;29832:65:327;;1152:1136:328;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;1152:1136:328;;;;;;;:::i;:::-;5148:19:42;;;;1152:1136:328;;;2005:41;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1152:1136:328;2776:90:192;;1152:1136:328;2892:10:192;;;;;;1152:1136:328;2904:3:192;2923:9;;;;;:::i;:::-;1152:1136:328;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1152:1136:328;;;1328:43:8;;;;;;1152:1136:328;;;;1328:43:8;;;1152:1136:328;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1152:1136:328;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1152:1136:328;;2881:9:192;;8938:146:8;9033:40;1152:1136:328;9033:40:8;1152:1136:328;;1328:43:8;1152:1136:328;9033:40:8;8942:68;1152:1136:328;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1152:1136:328;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;1152:1136:328;;-1:-1:-1;1152:1136:328;26801:10:327;1152:1136:328;;;;-1:-1:-1;1152:1136:328;;;;;;;;26724:60:327;26756:28;1152:1136:328;26756:28:327;1152:1136:328;;26756:28:327;1152:1136:328;;;;;;;;;;;;3395:39:305;1152:1136:328;;;3395:39:305;:::i;:::-;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;2005:41;;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;2976:19:351;1152:1136:328;1281:36:351;713:6;1281:36;;1277:119;;1152:1136:328;;;;;;;;;;;;;;;1277:119:351;1340:45;1152:1136:328;1340:45:351;1152:1136:328;;;;1340:45:351;1152:1136:328;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1956:12:303;1152:1136:328;2005:41;;:::i;1956:12:303:-;1152:1136:328;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;1152:1136:328;;16512:9:327;1152:1136:328;16523:10:327;;;;;;16821:14;;;-1:-1:-1;1152:1136:328;16821:10:327;1152:1136:328;;;-1:-1:-1;1152:1136:328;;;;;2220:8:327;;1152:1136:328;;;16535:3:327;16572:11;;;;:::i;:::-;1152:1136:328;;;;;;;;;;;;;16597:72:327;;1152:1136:328;;;;;;;;;;;;;2220:8:327;16743:33;1152:1136:328;16743:33:327;;;;1152:1136:328;16512:9:327;;16597:72;16641:28;1152:1136:328;16641:28:327;1152:1136:328;;;;16641:28:327;16400:54;16429:25;1152:1136:328;16429:25:327;1152:1136:328;;16429:25:327;1152:1136:328;;;;;;;:::i;:::-;2005:41;;:::i;:::-;3179:19:352;1152:1136:328;;;;;;;;2616:14:352;2612:76;;1152:1136:328;29158:19:327;;9668:7;1863:70;;;;1152:1136:328;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;1152:1136:328;9686:99:327;9722:52;1152:1136:328;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1152:1136:328;;;;;;;;;;;1287:7:303;1152:1136:328;;:::i;:::-;1232:12:303;1152:1136:328;2005:41;;:::i;1232:12:303:-;1152:1136:328;;;;1287:7:303;:::i;1152:1136:328:-;;;;;;;;;;;;;;;:::i;:::-;2005:41;;:::i;:::-;5148:19:42;1152:1136:328;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1152:1136:328;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;1254:25:41;1250:140;;1152:1136:328;1250:140:41;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1152:1136:328;;;;1343:36:41;1152:1136:328;;;;;;;;;;;;;;;;941:19:75;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1152:1136:328;2499:377:351;;;2559:17;;1152:1136:328;;2499:377:351;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1152:1136:328;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1152:1136:328;2499:377:351;;2607:259;713:6;2794:57;1152:1136:328;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1152:1136:328;;;;2134:7:305;1152:1136:328;;;:::i;:::-;2005:41;;;:::i;:::-;1152:1136;;;;;;;;2616:14:352;2612:76;;1152:1136:328;29158:19:327;;1152:1136:328;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;2005:41;;;:::i;:::-;1152:1136;;;;;4503:26:42;;;4499:64;;3179:19:352;1152:1136:328;;;;2220:8:327;;;;;;;1152:1136:328;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;1152:1136:328;29158:19:327;1152:1136:328;2005:41;;:::i;:::-;1152:1136;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;1152:1136:328;5670:35:327;;1152:1136:328;5157:173:327;1152:1136:328;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;1152:1136:328;;;;;5620:11:327;1152:1136:328;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;1152:1136:328;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;1152:1136:328;5052:59:327;;;1152:1136:328;5052:59:327;1152:1136:328;;;;;;;;;5052:59:327;4927:63;4958:32;;1152:1136:328;4958:32:327;1152:1136:328;;;;4958:32:327;4802:64;4835:31;;1152:1136:328;4835:31:327;1152:1136:328;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;1152:1136:328;2931:8:352;:::i;:::-;1064:117:305;;;1152:1136:328;;;;;;;;;;;;3579:43:305;1152:1136:328;;;3579:43:305;:::i;1152:1136:328:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1152:1136:328;635:65:55;;:::i;1152:1136:328:-;;;;;;;;-1:-1:-1;;1152:1136:328;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;1152:1136:328;1146:19:75;1152:1136:328;1146:53:75;;;1142:96;;1152:1136:328;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1152:1136:328;1215:12:75;:::o;1152:1136:328:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1152:1136:328;;;;;;:::o;1359:340:59:-;1152:1136:328;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1152:1136:328;500:10:59;1152:1136:328;500:10:59;;;;1152:1136:328;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1152:1136:328;1528:12:59;:::o;27798:360:327:-;1152:1136:328;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;1152:1136:328;;;28073:11:327;1152:1136:328;;;;;;;;28066:27:327;:::o;7385:956::-;;;1152:1136:328;;7507:16:327;;;7503:58;;1152:1136:328;7521:1:327;1152:1136:328;;;;;7521:1:327;1152:1136:328;;;;;30700:19:327;;;7615:64;;1152:1136:328;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;1152:1136:328;;;7521:1:327;1152:1136:328;;;;;;7521:1:327;1152:1136:328;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;1152:1136:328;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;;;2220:8:327;;1152:1136:328;-1:-1:-1;1152:1136:328;;;;-1:-1:-1;1152:1136:328;8155:10:327;1152:1136:328;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;1152:1136:328;7896:51:327;;;7521:1;7896:51;1152:1136:328;7896:51:327;1152:1136:328;;;;;;7521:1:327;7896:51;7828:59;1152:1136:328;;7521:1:327;1152:1136:328;7867:11:327;;;1152:1136:328;;;;7521:1:327;1152:1136:328;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;1152:1136:328;;;;7521:1:327;7728:34;1152:1136:328;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;1152:1136:328;-1:-1:-1;1152:1136:328;;;;-1:-1:-1;1152:1136:328;;;;-1:-1:-1;1152:1136:328;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1152:1136:328;3775:28:41;;-1:-1:-1;3775:28:41;1152:1136:328;3775:28:41;1152:1136:328;;;;;-1:-1:-1;3775:28:41;14035:460:327;;1152:1136:328;;14119:16:327;;;14115:54;;1152:1136:328;14133:1:327;1152:1136:328;;;;;;14133:1:327;1152:1136:328;;;14179:72:327;;14415:10;1152:1136:328;;14133:1:327;1152:1136:328;;;;;;14133:1:327;1152:1136:328;2220:8:327;1152:1136:328;-1:-1:-1;1152:1136:328;14415:10:327;1152:1136:328;;;-1:-1:-1;1152:1136:328;14415:10:327;1152:1136:328;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;1152:1136:328;;14133:1:327;14223:28;1152:1136:328;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;1152:1136:328;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;1152:1136:328;;-1:-1:-1;27324:31:327;1152:1136:328;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1152:1136:328;;;;;-1:-1:-1;1152:1136:328;;-1:-1:-1;1152:1136:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;1152:1136:328;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1152:1136:328;;;3613:51:352;1152:1136:328;;3613:51:352;;;;1152:1136:328;3613:51:352;;3648:4;3613:51;;;1152:1136:328;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1152:1136:328;;-1:-1:-1;3691:28:352;3613:51;;;;1152:1136:328;3613:51:352;1152:1136:328;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;1152:1136:328;1029:19:76;1152:1136:328;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1152:1136:328;;;;;;1676:74:76;;;;1152:1136:328;1676:74:76;;;;;;1152:1136:328;1327:10:76;1152:1136:328;;;;1744:4:76;1152:1136:328;;;;1676:74:76;;;;;;;1152:1136:328;1676:74:76;;;1630:120;;;;;1676:74;;;;1152:1136:328;1676:74:76;1152:1136:328;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;1152:1136:328;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;1152:1136:328;;-1:-1:-1;1152:1136:328;30435:11:327;1152:1136:328;;;;-1:-1:-1;1152:1136:328;30435:27:327;1152:1136:328;-1:-1:-1;1152:1136:328;;;500:10:59;1152:1136:328;-1:-1:-1;1152:1136:328;500:10:59;;30413:49:327;;;;;29701:270;1152:1136:328;29701:270:327;1152:1136:328;29701:270:327;1152:1136:328;29701:270:327;;;;;1152:1136:328;;;;;29832:65:327;;;;;1152:1136:328;29832:65:327;;1152:1136:328;29832:65:327;;;1152:1136:328;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;1152:1136:328;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;1152:1136:328;29832:65:327;;1152:1136:328;29832:65:327;;;;;;1152:1136:328;29832:65:327;;;:::i;:::-;;;1152:1136:328;;;;;;;;;;;;;29832:65:327;1152:1136:328;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"2889200","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"804","ROYALTY_FEE_DENOMINATOR()":"848","approve(address,uint256)":"infinite","balanceOf(address)":"2729","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2917","isApprovedForAll(address,address)":"3245","isTrustedForwarder(address)":"infinite","metadataResolver()":"2781","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2825","owner()":"2671","ownerOf(uint256)":"2687","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/ERC721Full.sol\":\"ERC721Full\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./base/ERC721DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x0465e23e92e293553137225252d7c5b80b6fc7ae406b15559830b5b7164025f9\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721Full.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721Mintable} from \\\"./../ERC721Mintable.sol\\\";\\nimport {ERC721Deliverable} from \\\"./../ERC721Deliverable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721Full is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721Mintable,\\n    ERC721Deliverable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x90426d7d59d6ed41b9fef38bd49f317fd960dd68faa7708b24a272d5168706cc\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/ERC721/preset/ERC721FullBurn.sol":{"ERC721FullBurn":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1603,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1566,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a0604052346106195761445a803803806100198161061e565b928339810160a0828203126106195781516001600160401b0381116106195781610044918401610643565b602083015190916001600160401b03821161061957610064918401610643565b60408301519092906001600160a01b038116908190036106195760608201516001600160a01b03811692908390036106195760800151926001600160a01b038416840361061957336105ba575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b0382116104905760008051602061441a8339815191525490600182811c921680156105b0575b60208310146104705781601f849311610533575b50602090601f83116001146104b1576000926104a6575b50508160011b916000199060031b1c19161760008051602061441a833981519152555b83516001600160401b0381116104905760008051602061443a83398151915254600181811c91168015610486575b602082101461047057601f81116103fe575b50602094601f821160011461037d57948192939495600092610372575b50508160011b916000199060031b1c19161760008051602061443a833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b84528284208054821683179055638b8b4ef560e01b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613d6b90816106af82396080518181816127a1015281816131e30152613a670152f35b015190503880610274565b601f1982169560008051602061443a833981519152600052806000209160005b8881106103e6575083600195969798106103cd575b505050811b0160008051602061443a83398151915255610297565b015160001960f88460031b161c191690553880806103b2565b9192602060018192868501518155019401920161039d565b60008051602061443a8339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610466575b601f0160051c01905b81811061045a5750610257565b6000815560010161044d565b9091508190610444565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b60008051602061441a83398151915260009081528281209350601f198516905b81811061051b5750908460019594939210610502575b505050811b0160008051602061441a83398151915255610217565b015160001960f88460031b161c191690553880806104e7565b929360206001819287860151815501950193016104d1565b60008051602061441a8339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c810191602085106105a6575b90601f859493920160051c01905b81811061059757506101dd565b6000815584935060010161058a565b909150819061057c565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761049057604052565b81601f82011215610619578051906001600160401b03821161049057610672601f8301601f191660200161061e565b92828452602083830101116106195760005b82811061069957505060206000918301015290565b8060208092840101518282870101520161068456fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612dab57806306fdde0314612d50578063081812fc14612cf3578063095ea7b314612a5f578063114ba8ee1461296057806323b872dd146128b85780632a55205a146127c55780632b4c9f16146127565780632f2ff15d146125ca57806340c10f191461253a57806342842e0e1461246a5780634684d7e9146122d1578063572b6c051461228657806361ba27da1461216a5780636352211e146120ef57806370a082311461202557806373c8a95814611e7557806379cc679014611bd75780638832e6e3146119895780638bb9c5bf1461181a5780638da5cb5b146117a95780638dc251e31461167c57806391d14854146115e457806395d89b41146115755780639da5e8321461144b578063a0c76f62146113da578063a22cb4651461127a578063b0ccc31e14611209578063b88d4fde146110e7578063c3666c3614610eaa578063c87b56dd14610cf7578063d539139314610c9e578063d547741f14610b15578063e1a8bf2c14610ad9578063e985e9c514610a25578063f247296514610800578063f2fde38b1461070c578063f3993d11146103865763f7ba94bd146101c957600080fd5b3461032a576101d73661308c565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613a50565b9254169116908103610359575081810361032f5760005b81811061023857005b610243818387613815565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d828587613815565b35908147106102f857600080809381935af13d156102f0573d906102908261322b565b9161029e60405193846130f8565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd612e77565b6103c5612e9a565b9060443567ffffffffffffffff811161032a576103e6903690600401612f2f565b926103ef613a50565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106fc575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106d2576104948382849694613b64565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061051757878787818114158061050e575b6104cc57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104c6565b610522818986613815565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578461059b575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104b2565b740100000000000000000000000000000000000000001615801561060f575b6105c4578961055a565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105ba565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61070591613965565b8582610446565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610743612e77565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061076d613a50565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff16918282036107b157005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5761080e36612f60565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610839613a50565b92610845848483613b64565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108aa5786868161087357005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108b5818886613815565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578661094e575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610863565b74010000000000000000000000000000000000000000161580156109c2575b61097757886108ed565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8416141561096d565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610a5c612e77565b73ffffffffffffffffffffffffffffffffffffffff610a79612e9a565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020604051620186a08152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435610b4f612e9a565b610b57613a50565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c0957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610de96000600435610d58817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06137ba565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610e9e57600091610e16575b60405160208082528190610e1290820185612e34565b0390f35b3d8083833e610e2581836130f8565b810190602081830312610e965780519067ffffffffffffffff8211610e9a570181601f82011215610e9657805192610e5c8461322b565b92610e6a60405194856130f8565b84845260208584010111610e935750610e1292610e8d9160208085019101612e11565b90610dfc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461032a57610eb836612fcf565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610efd613a50565b925416911690810361035957508082148015906110dd575b61032f5760005b828110610f2557005b73ffffffffffffffffffffffffffffffffffffffff610f4d610f4883858a613815565b613825565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610e9e576000916110af575b5015611082575073ffffffffffffffffffffffffffffffffffffffff610fdc610f4883858a613815565b1690610fec610f48828689613815565b91610ff882878b613815565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610e9e57600192611071575b5001610f1c565b600061107c916130f8565b8861106a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110d0915060203d81116110d6575b6110c881836130f8565b810190613846565b89610fb2565b503d6110be565b5082821415610f15565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761111e612e77565b611126612e9a565b60443560643567ffffffffffffffff811161032a5761114990369060040161305e565b929093611154613a50565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036111f9575b50506111da848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b823b6111e257005b6111f7956111f1913691613265565b93613be4565b005b61120291613965565b86856111ab565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576112b1612e77565b602435908115159182810361032a576113ab575b73ffffffffffffffffffffffffffffffffffffffff806112e3613a50565b1691169181831461137d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113d5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613965565b6112c5565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461032a576114593661308c565b61148b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b906135f3565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114b681613168565b946114c460405196876130f8565b818652602086019160051b81019036821161032a57915b81831061154857505050906114f1913691613180565b918051918351830361032f5760005b83811061150957005b8061154273ffffffffffffffffffffffffffffffffffffffff61152e60019487613777565b511661153a8389613777565b5190856136b5565b01611500565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016114db565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610e126115d07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a561385e565b604051918291602083526020830190612e34565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761161b612e9a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576116b3612e77565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116f2613a50565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561177f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611875613a50565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156119415760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c99565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119c0612e77565b6024359060443567ffffffffffffffff811161032a576119e490369060040161305e565b91611a117fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b611a518482611a4b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a43613a50565b973691613265565b946136b5565b803b611a5957005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ac660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612e34565b03816000865af1908115610e9e57600091611b58575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b2857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bcf575b81611b71602093836130f8565b81010312611bcb5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9357507fffffffff00000000000000000000000000000000000000000000000000000000611adc565b5080fd5b3d9150611b64565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611c0e612e77565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c3b613a50565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e475773ffffffffffffffffffffffffffffffffffffffff8116809503611e155782611c909185613b64565b15611d3e575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611db2575b611d675780611c96565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d5d565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a57611e8336612fcf565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ec6613a50565b9254169116908103610359575080841480159061201b575b61032f5760005b848110611eee57005b611ef9818388613815565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a576000602091611f2c610f48868b8e613815565b82611f96611fc2611f3e898d8d613815565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826130f8565b51925af115610e9e576000513d6120125750803b155b611fe55750600101611ee5565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fd8565b5082841415611ede565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761205c612e77565b73ffffffffffffffffffffffffffffffffffffffff8116156120c55773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061214c6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06137ba565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121db613a50565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161225957815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206122c76122c2612e77565b6131cc565b6040519015158152f35b3461032a5761235073ffffffffffffffffffffffffffffffffffffffff6122f736612f60565b929193906123277fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613180565b92169081156124405782519260005b8481106123a0575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123aa8183613777565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241357908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161235f565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5761247836612ebd565b612480613a50565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361252a575b5050612506828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b803b61250e57005b6111f793604051936125216020866130f8565b60008552613be4565b61253391613965565b84836124d7565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576111f7612574612e77565b6125a07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136b5565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435612604612e9a565b61260c613a50565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156126bf57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c99565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156128b0575b1561287a575050610e1260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1291620186a082101561289d5761289790620186a0926135b1565b0461284a565b620186a06128ab92046135b1565b61284a565b50811561283d565b3461032a576111f76128c936612ebd565b916128d2613a50565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612950575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b61295991613965565b8581612928565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806129ee613a50565b9254169116908103610359575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612a96612e77565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612cc3575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ae6613a50565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612c9557848614612c6757612b26818686613b64565b15612c1b575015612b8a577401000000000000000000000000000000000000000016612b76575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612b4d565b90740100000000000000000000000000000000000000008217809203612c07575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612b4f565b846000526020526040600020558380612bab565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612ced907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613965565b83612abc565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061214c6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610e126115d07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a461385e565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a576122c760209161329c565b60005b838110612e245750506000910152565b8181015183820152602001612e14565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612e7081518092818752878088019101612e11565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060243573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060443590565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a57916024359067ffffffffffffffff821161032a57612fcb91600401612f2f565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161301891600401612f2f565b9290929160243567ffffffffffffffff811161032a578161303b91600401612f2f565b929092916044359067ffffffffffffffff821161032a57612fcb91600401612f2f565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816130d591600401612f2f565b929092916024359067ffffffffffffffff821161032a57612fcb91600401612f2f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761313957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116131395760051b60200190565b92919061318c81613168565b9361319a60405195866130f8565b602085838152019160051b810192831161032a57905b8282106131bc57505050565b81358152602091820191016131b0565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132245773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161313957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926132718261322b565b9161327f60405193846130f8565b82948184528183011161032a578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613345577f01ffc9a700000000000000000000000000000000000000000000000000000000811461333f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106a457740100000000000000000000000000000000000000001615613224576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106d257846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612c955773ffffffffffffffffffffffffffffffffffffffff811680950361357f578261342e9185613b64565b156134c4575b5050836000528060205282604060002055828203613475575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8154019055826000526020526040600020600181540190553861344d565b7401000000000000000000000000000000000000000016158015613539575b6134ed5780613434565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156134e3565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156135c457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561364d5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244057826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661374957600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561378b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156137e8575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561378b5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b9081602091031261032a5751801515810361032a5790565b906040519160008154918260011c9260018116801561395b575b60208510811461392e578487528693929181156138ee57506001146138a7575b506138a5925003836130f8565b565b90506000929192526020600020906000915b8183106138d25750509060206138a59282010138613898565b60209193508060019154838589010152019101909184926138b9565b602093506138a59592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613898565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613878565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613a46575b61398e575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610e9e57600091613a27575b50156139fa5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613a40915060203d6020116110d6576110c881836130f8565b386139f1565b50813b1515613986565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613b55573233148015613b5a575b613b55577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613adb575b50613ad857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610e9e57600091613b36575b5038613ace565b613b4f915060203d6020116110d6576110c881836130f8565b38613b2f565b503390565b5060183610613a97565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613b8f575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613b89565b73ffffffffffffffffffffffffffffffffffffffff90613c56826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612e34565b03816000865af1908115610e9e57600091613cba575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b28575050565b6020813d602011613d2d575b81613cd3602093836130f8565b81010312611bcb5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9357507fffffffff00000000000000000000000000000000000000000000000000000000613c6c565b3d9150613cc656fea26469706673582212205cfff9ced06c1ce897aefcf3c71c5f1a96e4be17b88fb198b9294090c90e04b764736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x619 JUMPI PUSH2 0x445A DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x61E JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x619 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x619 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x643 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x619 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x643 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x619 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x619 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x619 JUMPI CALLER PUSH2 0x5BA JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x441A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5B0 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x470 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x533 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4B1 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4A6 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x441A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x443A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x486 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x470 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3FE JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x37D JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x372 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x443A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x8B8B4EF5 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3D6B SWAP1 DUP2 PUSH2 0x6AF DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x27A1 ADD MSTORE DUP2 DUP2 PUSH2 0x31E3 ADD MSTORE PUSH2 0x3A67 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x443A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3E6 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3CD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x443A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3B2 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x39D JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x443A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x466 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x45A JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x441A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x51B JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x502 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x441A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4E7 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4D1 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x441A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5A6 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x597 JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x58A JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x57C JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x490 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x619 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x490 JUMPI PUSH2 0x672 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x61E JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x619 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x699 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x684 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2DAB JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2D50 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2CF3 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2A5F JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2960 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x28B8 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x27C5 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2756 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x25CA JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x253A JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x246A JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22D1 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2286 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x216A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20EF JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2025 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E75 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BD7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1989 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x181A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17A9 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x167C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15E4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1575 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x144B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13DA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x127A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1209 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEAA JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xCF7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC9E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB15 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAD9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA25 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x308C JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x322B JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x30F8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x3C5 PUSH2 0x2E9A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3E6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 PUSH2 0x3EF PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6FC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6D2 JUMPI PUSH2 0x494 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3B64 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x517 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x50E JUMPI JUMPDEST PUSH2 0x4CC JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4C6 JUMP JUMPDEST PUSH2 0x522 DUP2 DUP10 DUP7 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP5 PUSH2 0x59B JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4B2 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI JUMPDEST PUSH2 0x5C4 JUMPI DUP10 PUSH2 0x55A JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5BA JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x705 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x446 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x743 PUSH2 0x2E77 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x76D PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7B1 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x80E CALLDATASIZE PUSH2 0x2F60 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x839 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 PUSH2 0x845 DUP5 DUP5 DUP4 PUSH2 0x3B64 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8AA JUMPI DUP7 DUP7 DUP2 PUSH2 0x873 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8B5 DUP2 DUP9 DUP7 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP7 PUSH2 0x94E JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x863 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9C2 JUMPI JUMPDEST PUSH2 0x977 JUMPI DUP9 PUSH2 0x8ED JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xA5C PUSH2 0x2E77 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA79 PUSH2 0x2E9A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB4F PUSH2 0x2E9A JUMP JUMPDEST PUSH2 0xB57 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC09 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDE9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD58 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x37BA JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE16 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE12 SWAP1 DUP3 ADD DUP6 PUSH2 0x2E34 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE25 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xE96 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE9A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xE96 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE5C DUP5 PUSH2 0x322B JUMP JUMPDEST SWAP3 PUSH2 0xE6A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x30F8 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE93 JUMPI POP PUSH2 0xE12 SWAP3 PUSH2 0xE8D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2E11 JUMP JUMPDEST SWAP1 PUSH2 0xDFC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xEB8 CALLDATASIZE PUSH2 0x2FCF JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEFD PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10DD JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF25 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF4D PUSH2 0xF48 DUP4 DUP6 DUP11 PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x3825 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10AF JUMPI JUMPDEST POP ISZERO PUSH2 0x1082 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFDC PUSH2 0xF48 DUP4 DUP6 DUP11 PUSH2 0x3815 JUMP JUMPDEST AND SWAP1 PUSH2 0xFEC PUSH2 0xF48 DUP3 DUP7 DUP10 PUSH2 0x3815 JUMP JUMPDEST SWAP2 PUSH2 0xFF8 DUP3 DUP8 DUP12 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1071 JUMPI JUMPDEST POP ADD PUSH2 0xF1C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x107C SWAP2 PUSH2 0x30F8 JUMP JUMPDEST DUP9 PUSH2 0x106A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10D0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10D6 JUMPI JUMPDEST PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3846 JUMP JUMPDEST DUP10 PUSH2 0xFB2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10BE JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF15 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x111E PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x1126 PUSH2 0x2E9A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x1149 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x305E JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x1154 PUSH2 0x3A50 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x11F9 JUMPI JUMPDEST POP POP PUSH2 0x11DA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11E2 JUMPI STOP JUMPDEST PUSH2 0x11F7 SWAP6 PUSH2 0x11F1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3265 JUMP JUMPDEST SWAP4 PUSH2 0x3BE4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1202 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11AB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x12B1 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x13AB JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12E3 PUSH2 0x3A50 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x137D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13D5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3965 JUMP JUMPDEST PUSH2 0x12C5 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1459 CALLDATASIZE PUSH2 0x308C JUMP JUMPDEST PUSH2 0x148B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH2 0x35F3 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14B6 DUP2 PUSH2 0x3168 JUMP JUMPDEST SWAP5 PUSH2 0x14C4 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x30F8 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1548 JUMPI POP POP POP SWAP1 PUSH2 0x14F1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3180 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1509 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1542 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x152E PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3777 JUMP JUMPDEST MLOAD AND PUSH2 0x153A DUP4 DUP10 PUSH2 0x3777 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x36B5 JUMP JUMPDEST ADD PUSH2 0x1500 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14DB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xE12 PUSH2 0x15D0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x385E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x161B PUSH2 0x2E9A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x16B3 PUSH2 0x2E77 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16F2 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x177F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1875 PUSH2 0x3A50 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1941 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC99 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19C0 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x19E4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x305E JUMP JUMPDEST SWAP2 PUSH2 0x1A11 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH2 0x1A51 DUP5 DUP3 PUSH2 0x1A4B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A43 PUSH2 0x3A50 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3265 JUMP JUMPDEST SWAP5 PUSH2 0x36B5 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A59 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AC6 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B58 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B28 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BCF JUMPI JUMPDEST DUP2 PUSH2 0x1B71 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BCB JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE93 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1ADC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B64 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1C0E PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C3B PUSH2 0x3A50 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E47 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E15 JUMPI DUP3 PUSH2 0x1C90 SWAP2 DUP6 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x1D3E JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DB2 JUMPI JUMPDEST PUSH2 0x1D67 JUMPI DUP1 PUSH2 0x1C96 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D5D JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1E83 CALLDATASIZE PUSH2 0x2FCF JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EC6 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x201B JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EEE JUMPI STOP JUMPDEST PUSH2 0x1EF9 DUP2 DUP4 DUP9 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F2C PUSH2 0xF48 DUP7 DUP12 DUP15 PUSH2 0x3815 JUMP JUMPDEST DUP3 PUSH2 0x1F96 PUSH2 0x1FC2 PUSH2 0x1F3E DUP10 DUP14 DUP14 PUSH2 0x3815 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x30F8 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2012 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FE5 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EE5 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FD8 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EDE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x205C PUSH2 0x2E77 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20C5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x214C PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x37BA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21DB PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2259 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x22C7 PUSH2 0x22C2 PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x31CC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x2350 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22F7 CALLDATASIZE PUSH2 0x2F60 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2327 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3180 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x2440 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23A0 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23AA DUP2 DUP4 PUSH2 0x3777 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2413 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x235F JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x2478 CALLDATASIZE PUSH2 0x2EBD JUMP JUMPDEST PUSH2 0x2480 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x252A JUMPI JUMPDEST POP POP PUSH2 0x2506 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x250E JUMPI STOP JUMPDEST PUSH2 0x11F7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2521 PUSH1 0x20 DUP7 PUSH2 0x30F8 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3BE4 JUMP JUMPDEST PUSH2 0x2533 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24D7 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x11F7 PUSH2 0x2574 PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x25A0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x36B5 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2604 PUSH2 0x2E9A JUMP JUMPDEST PUSH2 0x260C PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x26BF JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC99 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x28B0 JUMPI JUMPDEST ISZERO PUSH2 0x287A JUMPI POP POP PUSH2 0xE12 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE12 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x289D JUMPI PUSH2 0x2897 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x35B1 JUMP JUMPDEST DIV PUSH2 0x284A JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x28AB SWAP3 DIV PUSH2 0x35B1 JUMP JUMPDEST PUSH2 0x284A JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x283D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x11F7 PUSH2 0x28C9 CALLDATASIZE PUSH2 0x2EBD JUMP JUMPDEST SWAP2 PUSH2 0x28D2 PUSH2 0x3A50 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2950 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST PUSH2 0x2959 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2928 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x29EE PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2A96 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2CC3 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2AE6 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2C95 JUMPI DUP5 DUP7 EQ PUSH2 0x2C67 JUMPI PUSH2 0x2B26 DUP2 DUP7 DUP7 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x2C1B JUMPI POP ISZERO PUSH2 0x2B8A JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2B76 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2B4D JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2C07 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2B4F JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2BAB JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2CED SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3965 JUMP JUMPDEST DUP4 PUSH2 0x2ABC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x214C PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xE12 PUSH2 0x15D0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x385E JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x22C7 PUSH1 0x20 SWAP2 PUSH2 0x329C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2E24 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2E14 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2E70 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2E11 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x3018 SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x303B SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x30D5 SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3139 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3139 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x318C DUP2 PUSH2 0x3168 JUMP JUMPDEST SWAP4 PUSH2 0x319A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x30F8 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x32A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x31BC JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3224 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3139 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3271 DUP3 PUSH2 0x322B JUMP JUMPDEST SWAP2 PUSH2 0x327F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x30F8 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3345 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x333F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6A4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3224 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6D2 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2C95 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x357F JUMPI DUP3 PUSH2 0x342E SWAP2 DUP6 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x34C4 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3475 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x344D JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3539 JUMPI JUMPDEST PUSH2 0x34ED JUMPI DUP1 PUSH2 0x3434 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x34E3 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x35C4 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x364D JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x2440 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3749 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x378B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x37E8 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x378B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x395B JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x392E JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x38EE JUMPI POP PUSH1 0x1 EQ PUSH2 0x38A7 JUMPI JUMPDEST POP PUSH2 0x38A5 SWAP3 POP SUB DUP4 PUSH2 0x30F8 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x38D2 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x38A5 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3898 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x38B9 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x38A5 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3898 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3878 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3A46 JUMPI JUMPDEST PUSH2 0x398E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3A27 JUMPI JUMPDEST POP ISZERO PUSH2 0x39FA JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3A40 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10D6 JUMPI PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST CODESIZE PUSH2 0x39F1 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3B55 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3B5A JUMPI JUMPDEST PUSH2 0x3B55 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3ADB JUMPI JUMPDEST POP PUSH2 0x3AD8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3B36 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3ACE JUMP JUMPDEST PUSH2 0x3B4F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10D6 JUMPI PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST CODESIZE PUSH2 0x3B2F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A97 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3B8F JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3B89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3C56 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3CBA JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B28 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3D2D JUMPI JUMPDEST DUP2 PUSH2 0x3CD3 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BCB JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE93 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3C6C JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3CC6 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TLOAD SELFDESTRUCT EXTDELEGATECALL 0xCE 0xD0 PUSH13 0x1CE897AEFCF3C71C5F1A96E4BE OR 0xB8 DUP16 0xB1 SWAP9 0xB9 0x29 BLOCKHASH SWAP1 0xC9 0xE DIV 0xB7 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH31 0xA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 ","sourceMap":"1208:1160:329:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;1717:10;1645:152:42;;-1:-1:-1;1208:1160:329;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;1208:1160:329;;;-1:-1:-1;;;;;;1208:1160:329;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;1208:1160:329;;;-1:-1:-1;;;;;1208:1160:329;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;;990:1:42;1208:1160:329;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;;;;-1:-1:-1;;;;;1208:1160:329;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;990:1:42;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;;1289:23:341;1208:1160:329;;-1:-1:-1;;;;;;1208:1160:329;;;;;;;-1:-1:-1;;;;500:10:59;;;1208:1160:329;500:10:59;;;;1208:1160:329;500:10:59;;;;;-1:-1:-1;;500:10:59;;;1208:1160:329;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;1208:1160:329;745:39:76;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1208:1160:329;;-1:-1:-1;1208:1160:329;;-1:-1:-1;1208:1160:329;;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;990:1:42;1208:1160:329;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;;;;;;;;;;;;1208:1160:329;;;;;;;-1:-1:-1;;;1208:1160:329;;;;;;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1208:1160:329;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1208:1160:329;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;-1:-1:-1;990:1:42;1208:1160:329;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;1645:152:42;1208:1160:329;;;-1:-1:-1;;;;;;1208:1160:329;1717:10;1208:1160;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1208:1160:329;-1:-1:-1;1208:1160:329;;;;;;;;;-1:-1:-1;;1208:1160:329;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1208:1160:329;;;;;;;;-1:-1:-1;;1208:1160:329;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":11895,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":11965,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":12128,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12239,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12428,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12079,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":12672,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":12901,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":14406,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":12382,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":11930,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":11828,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":12648,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":12843,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":14357,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":13745,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":14430,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":11793,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":12536,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":15332,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":14693,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":13811,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":13131,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":15204,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":12748,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":14005,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":14928,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":14266,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":12956,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":13242,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14199,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":14373,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10145},{"length":32,"start":12771},{"length":32,"start":14951}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612dab57806306fdde0314612d50578063081812fc14612cf3578063095ea7b314612a5f578063114ba8ee1461296057806323b872dd146128b85780632a55205a146127c55780632b4c9f16146127565780632f2ff15d146125ca57806340c10f191461253a57806342842e0e1461246a5780634684d7e9146122d1578063572b6c051461228657806361ba27da1461216a5780636352211e146120ef57806370a082311461202557806373c8a95814611e7557806379cc679014611bd75780638832e6e3146119895780638bb9c5bf1461181a5780638da5cb5b146117a95780638dc251e31461167c57806391d14854146115e457806395d89b41146115755780639da5e8321461144b578063a0c76f62146113da578063a22cb4651461127a578063b0ccc31e14611209578063b88d4fde146110e7578063c3666c3614610eaa578063c87b56dd14610cf7578063d539139314610c9e578063d547741f14610b15578063e1a8bf2c14610ad9578063e985e9c514610a25578063f247296514610800578063f2fde38b1461070c578063f3993d11146103865763f7ba94bd146101c957600080fd5b3461032a576101d73661308c565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610218613a50565b9254169116908103610359575081810361032f5760005b81811061023857005b610243818387613815565b3573ffffffffffffffffffffffffffffffffffffffff811680910361032a5761026d828587613815565b35908147106102f857600080809381935af13d156102f0573d906102908261322b565b9161029e60405193846130f8565b82523d6000602084013e5b156102b7575060010161022f565b8051156102c657602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102a9565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576103bd612e77565b6103c5612e9a565b9060443567ffffffffffffffff811161032a576103e6903690600401612f2f565b926103ef613a50565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106fc575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106d2576104948382849694613b64565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061051757878787818114158061050e575b6104cc57005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104c6565b610522818986613815565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578461059b575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104b2565b740100000000000000000000000000000000000000001615801561060f575b6105c4578961055a565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105ba565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61070591613965565b8582610446565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610743612e77565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061076d613a50565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610359575073ffffffffffffffffffffffffffffffffffffffff16918282036107b157005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461032a5761080e36612f60565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610839613a50565b92610845848483613b64565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108aa5786868161087357005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108b5818886613815565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106a4578803610672578661094e575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610863565b74010000000000000000000000000000000000000000161580156109c2575b61097757886108ed565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff8416141561096d565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610a5c612e77565b73ffffffffffffffffffffffffffffffffffffffff610a79612e9a565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576020604051620186a08152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435610b4f612e9a565b610b57613a50565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c0957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610de96000600435610d58817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06137ba565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610e9e57600091610e16575b60405160208082528190610e1290820185612e34565b0390f35b3d8083833e610e2581836130f8565b810190602081830312610e965780519067ffffffffffffffff8211610e9a570181601f82011215610e9657805192610e5c8461322b565b92610e6a60405194856130f8565b84845260208584010111610e935750610e1292610e8d9160208085019101612e11565b90610dfc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461032a57610eb836612fcf565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610efd613a50565b925416911690810361035957508082148015906110dd575b61032f5760005b828110610f2557005b73ffffffffffffffffffffffffffffffffffffffff610f4d610f4883858a613815565b613825565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610e9e576000916110af575b5015611082575073ffffffffffffffffffffffffffffffffffffffff610fdc610f4883858a613815565b1690610fec610f48828689613815565b91610ff882878b613815565b3592813b1561032a57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610e9e57600192611071575b5001610f1c565b600061107c916130f8565b8861106a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110d0915060203d81116110d6575b6110c881836130f8565b810190613846565b89610fb2565b503d6110be565b5082821415610f15565b3461032a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761111e612e77565b611126612e9a565b60443560643567ffffffffffffffff811161032a5761114990369060040161305e565b929093611154613a50565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036111f9575b50506111da848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b823b6111e257005b6111f7956111f1913691613265565b93613be4565b005b61120291613965565b86856111ab565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576112b1612e77565b602435908115159182810361032a576113ab575b73ffffffffffffffffffffffffffffffffffffffff806112e3613a50565b1691169181831461137d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113d5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613965565b6112c5565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461032a576114593661308c565b61148b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b906135f3565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114b681613168565b946114c460405196876130f8565b818652602086019160051b81019036821161032a57915b81831061154857505050906114f1913691613180565b918051918351830361032f5760005b83811061150957005b8061154273ffffffffffffffffffffffffffffffffffffffff61152e60019487613777565b511661153a8389613777565b5190856136b5565b01611500565b823573ffffffffffffffffffffffffffffffffffffffff8116810361032a578152602092830192016114db565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610e126115d07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a561385e565b604051918291602083526020830190612e34565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761161b612e9a565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576116b3612e77565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116f2613a50565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561177f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611875613a50565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156119415760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610c99565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461032a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576119c0612e77565b6024359060443567ffffffffffffffff811161032a576119e490369060040161305e565b91611a117fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b611a518482611a4b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a43613a50565b973691613265565b946136b5565b803b611a5957005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ac660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190612e34565b03816000865af1908115610e9e57600091611b58575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b2857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bcf575b81611b71602093836130f8565b81010312611bcb5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9357507fffffffff00000000000000000000000000000000000000000000000000000000611adc565b5080fd5b3d9150611b64565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57611c0e612e77565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c3b613a50565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e475773ffffffffffffffffffffffffffffffffffffffff8116809503611e155782611c909185613b64565b15611d3e575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611db2575b611d675780611c96565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d5d565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a57611e8336612fcf565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ec6613a50565b9254169116908103610359575080841480159061201b575b61032f5760005b848110611eee57005b611ef9818388613815565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361032a576000602091611f2c610f48868b8e613815565b82611f96611fc2611f3e898d8d613815565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826130f8565b51925af115610e9e576000513d6120125750803b155b611fe55750600101611ee5565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fd8565b5082841415611ede565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5761205c612e77565b73ffffffffffffffffffffffffffffffffffffffff8116156120c55773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061214c6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06137ba565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121db613a50565b925416911690810361035957507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161225957815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760206122c76122c2612e77565b6131cc565b6040519015158152f35b3461032a5761235073ffffffffffffffffffffffffffffffffffffffff6122f736612f60565b929193906123277fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613180565b92169081156124405782519260005b8481106123a0575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123aa8183613777565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241357908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161235f565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461032a5761247836612ebd565b612480613a50565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361252a575b5050612506828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b803b61250e57005b6111f793604051936125216020866130f8565b60008552613be4565b61253391613965565b84836124d7565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576111f7612574612e77565b6125a07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611485613a50565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136b5565b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57600435612604612e9a565b61260c613a50565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361035957507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156126bf57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610c99565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156128b0575b1561287a575050610e1260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1291620186a082101561289d5761289790620186a0926135b1565b0461284a565b620186a06128ab92046135b1565b61284a565b50811561283d565b3461032a576111f76128c936612ebd565b916128d2613a50565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612950575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133ba565b61295991613965565b8581612928565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806129ee613a50565b9254169116908103610359575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461032a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57612a96612e77565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612cc3575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612ae6613a50565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612c9557848614612c6757612b26818686613b64565b15612c1b575015612b8a577401000000000000000000000000000000000000000016612b76575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612b4d565b90740100000000000000000000000000000000000000008217809203612c07575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612b4f565b846000526020526040600020558380612bab565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612ced907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613965565b83612abc565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57602061214c6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061334b565b3461032a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a57610e126115d07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a461385e565b3461032a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261032a576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361032a576122c760209161329c565b60005b838110612e245750506000910152565b8181015183820152602001612e14565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612e7081518092818752878088019101612e11565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361032a57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060243573ffffffffffffffffffffffffffffffffffffffff8116810361032a579060443590565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020808501948460051b01011161032a57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261032a5760043573ffffffffffffffffffffffffffffffffffffffff8116810361032a57916024359067ffffffffffffffff821161032a57612fcb91600401612f2f565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a578161301891600401612f2f565b9290929160243567ffffffffffffffff811161032a578161303b91600401612f2f565b929092916044359067ffffffffffffffff821161032a57612fcb91600401612f2f565b9181601f8401121561032a5782359167ffffffffffffffff831161032a576020838186019501011161032a57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261032a5760043567ffffffffffffffff811161032a57816130d591600401612f2f565b929092916024359067ffffffffffffffff821161032a57612fcb91600401612f2f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761313957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116131395760051b60200190565b92919061318c81613168565b9361319a60405195866130f8565b602085838152019160051b810192831161032a57905b8282106131bc57505050565b81358152602091820191016131b0565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156132245773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161313957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926132718261322b565b9161327f60405193846130f8565b82948184528183011161032a578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613345577f01ffc9a700000000000000000000000000000000000000000000000000000000811461333f576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106a457740100000000000000000000000000000000000000001615613224576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106d257846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612c955773ffffffffffffffffffffffffffffffffffffffff811680950361357f578261342e9185613b64565b156134c4575b5050836000528060205282604060002055828203613475575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8154019055826000526020526040600020600181540190553861344d565b7401000000000000000000000000000000000000000016158015613539575b6134ed5780613434565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156134e3565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156135c457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561364d5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244057826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661374957600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b805182101561378b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156137e8575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b919081101561378b5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361032a5790565b9081602091031261032a5751801515810361032a5790565b906040519160008154918260011c9260018116801561395b575b60208510811461392e578487528693929181156138ee57506001146138a7575b506138a5925003836130f8565b565b90506000929192526020600020906000915b8183106138d25750509060206138a59282010138613898565b60209193508060019154838589010152019101909184926138b9565b602093506138a59592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613898565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613878565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613a46575b61398e575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610e9e57600091613a27575b50156139fa5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613a40915060203d6020116110d6576110c881836130f8565b386139f1565b50813b1515613986565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613b55573233148015613b5a575b613b55577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613adb575b50613ad857503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610e9e57600091613b36575b5038613ace565b613b4f915060203d6020116110d6576110c881836130f8565b38613b2f565b503390565b5060183610613a97565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613b8f575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613b89565b73ffffffffffffffffffffffffffffffffffffffff90613c56826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190612e34565b03816000865af1908115610e9e57600091613cba575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b28575050565b6020813d602011613d2d575b81613cd3602093836130f8565b81010312611bcb5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9357507fffffffff00000000000000000000000000000000000000000000000000000000613c6c565b3d9150613cc656fea26469706673582212205cfff9ced06c1ce897aefcf3c71c5f1a96e4be17b88fb198b9294090c90e04b764736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2DAB JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2D50 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2CF3 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2A5F JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2960 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x28B8 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x27C5 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2756 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x25CA JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x253A JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x246A JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22D1 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2286 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x216A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20EF JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2025 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E75 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BD7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1989 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x181A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17A9 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x167C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15E4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1575 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x144B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13DA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x127A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1209 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10E7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEAA JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xCF7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xC9E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB15 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAD9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA25 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x386 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1D7 CALLDATASIZE PUSH2 0x308C JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x218 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP2 DUP2 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x238 JUMPI STOP JUMPDEST PUSH2 0x243 DUP2 DUP4 DUP8 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x32A JUMPI PUSH2 0x26D DUP3 DUP6 DUP8 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2F8 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2F0 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x290 DUP3 PUSH2 0x322B JUMP JUMPDEST SWAP2 PUSH2 0x29E PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x30F8 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2B7 JUMPI POP PUSH1 0x1 ADD PUSH2 0x22F JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2A9 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x3BD PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x3C5 PUSH2 0x2E9A JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x3E6 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 PUSH2 0x3EF PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6FC JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6D2 JUMPI PUSH2 0x494 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3B64 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x517 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x50E JUMPI JUMPDEST PUSH2 0x4CC JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4C6 JUMP JUMPDEST PUSH2 0x522 DUP2 DUP10 DUP7 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP5 PUSH2 0x59B JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4B2 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI JUMPDEST PUSH2 0x5C4 JUMPI DUP10 PUSH2 0x55A JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5BA JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x705 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x446 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x743 PUSH2 0x2E77 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x76D PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7B1 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x80E CALLDATASIZE PUSH2 0x2F60 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x839 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 PUSH2 0x845 DUP5 DUP5 DUP4 PUSH2 0x3B64 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8AA JUMPI DUP7 DUP7 DUP2 PUSH2 0x873 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8B5 DUP2 DUP9 DUP7 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6A4 JUMPI DUP9 SUB PUSH2 0x672 JUMPI DUP7 PUSH2 0x94E JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x863 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9C2 JUMPI JUMPDEST PUSH2 0x977 JUMPI DUP9 PUSH2 0x8ED JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x96D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xA5C PUSH2 0x2E77 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA79 PUSH2 0x2E9A JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB4F PUSH2 0x2E9A JUMP JUMPDEST PUSH2 0xB57 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC09 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xDE9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD58 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x37BA JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE16 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE12 SWAP1 DUP3 ADD DUP6 PUSH2 0x2E34 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE25 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xE96 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xE9A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xE96 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE5C DUP5 PUSH2 0x322B JUMP JUMPDEST SWAP3 PUSH2 0xE6A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x30F8 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE93 JUMPI POP PUSH2 0xE12 SWAP3 PUSH2 0xE8D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x2E11 JUMP JUMPDEST SWAP1 PUSH2 0xDFC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0xEB8 CALLDATASIZE PUSH2 0x2FCF JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xEFD PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10DD JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF25 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF4D PUSH2 0xF48 DUP4 DUP6 DUP11 PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x3825 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10AF JUMPI JUMPDEST POP ISZERO PUSH2 0x1082 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFDC PUSH2 0xF48 DUP4 DUP6 DUP11 PUSH2 0x3815 JUMP JUMPDEST AND SWAP1 PUSH2 0xFEC PUSH2 0xF48 DUP3 DUP7 DUP10 PUSH2 0x3815 JUMP JUMPDEST SWAP2 PUSH2 0xFF8 DUP3 DUP8 DUP12 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x32A JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1071 JUMPI JUMPDEST POP ADD PUSH2 0xF1C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x107C SWAP2 PUSH2 0x30F8 JUMP JUMPDEST DUP9 PUSH2 0x106A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10D0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10D6 JUMPI JUMPDEST PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3846 JUMP JUMPDEST DUP10 PUSH2 0xFB2 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10BE JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF15 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x111E PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x1126 PUSH2 0x2E9A JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x1149 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x305E JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x1154 PUSH2 0x3A50 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x11F9 JUMPI JUMPDEST POP POP PUSH2 0x11DA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11E2 JUMPI STOP JUMPDEST PUSH2 0x11F7 SWAP6 PUSH2 0x11F1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3265 JUMP JUMPDEST SWAP4 PUSH2 0x3BE4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1202 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11AB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x12B1 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x13AB JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12E3 PUSH2 0x3A50 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x137D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13D5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3965 JUMP JUMPDEST PUSH2 0x12C5 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1459 CALLDATASIZE PUSH2 0x308C JUMP JUMPDEST PUSH2 0x148B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST SWAP1 PUSH2 0x35F3 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14B6 DUP2 PUSH2 0x3168 JUMP JUMPDEST SWAP5 PUSH2 0x14C4 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x30F8 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x32A JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1548 JUMPI POP POP POP SWAP1 PUSH2 0x14F1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3180 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1509 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1542 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x152E PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3777 JUMP JUMPDEST MLOAD AND PUSH2 0x153A DUP4 DUP10 PUSH2 0x3777 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x36B5 JUMP JUMPDEST ADD PUSH2 0x1500 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14DB JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xE12 PUSH2 0x15D0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x385E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x161B PUSH2 0x2E9A JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x16B3 PUSH2 0x2E77 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16F2 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x177F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1875 PUSH2 0x3A50 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1941 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC99 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x19C0 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI PUSH2 0x19E4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x305E JUMP JUMPDEST SWAP2 PUSH2 0x1A11 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH2 0x1A51 DUP5 DUP3 PUSH2 0x1A4B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A43 PUSH2 0x3A50 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3265 JUMP JUMPDEST SWAP5 PUSH2 0x36B5 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A59 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AC6 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B58 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B28 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BCF JUMPI JUMPDEST DUP2 PUSH2 0x1B71 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BCB JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE93 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1ADC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B64 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x1C0E PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C3B PUSH2 0x3A50 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E47 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E15 JUMPI DUP3 PUSH2 0x1C90 SWAP2 DUP6 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x1D3E JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DB2 JUMPI JUMPDEST PUSH2 0x1D67 JUMPI DUP1 PUSH2 0x1C96 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D5D JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x1E83 CALLDATASIZE PUSH2 0x2FCF JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1EC6 PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x201B JUMPI JUMPDEST PUSH2 0x32F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EEE JUMPI STOP JUMPDEST PUSH2 0x1EF9 DUP2 DUP4 DUP9 PUSH2 0x3815 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x32A JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F2C PUSH2 0xF48 DUP7 DUP12 DUP15 PUSH2 0x3815 JUMP JUMPDEST DUP3 PUSH2 0x1F96 PUSH2 0x1FC2 PUSH2 0x1F3E DUP10 DUP14 DUP14 PUSH2 0x3815 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x30F8 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x2012 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FE5 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EE5 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FD8 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EDE JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x205C PUSH2 0x2E77 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20C5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x214C PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x37BA JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21DB PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2259 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x22C7 PUSH2 0x22C2 PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x31CC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x2350 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x22F7 CALLDATASIZE PUSH2 0x2F60 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2327 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3180 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x2440 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23A0 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23AA DUP2 DUP4 PUSH2 0x3777 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x2413 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x235F JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x2478 CALLDATASIZE PUSH2 0x2EBD JUMP JUMPDEST PUSH2 0x2480 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x252A JUMPI JUMPDEST POP POP PUSH2 0x2506 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x250E JUMPI STOP JUMPDEST PUSH2 0x11F7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2521 PUSH1 0x20 DUP7 PUSH2 0x30F8 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3BE4 JUMP JUMPDEST PUSH2 0x2533 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24D7 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x11F7 PUSH2 0x2574 PUSH2 0x2E77 JUMP JUMPDEST PUSH2 0x25A0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1485 PUSH2 0x3A50 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x36B5 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2604 PUSH2 0x2E9A JUMP JUMPDEST PUSH2 0x260C PUSH2 0x3A50 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x26BF JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xC99 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x28B0 JUMPI JUMPDEST ISZERO PUSH2 0x287A JUMPI POP POP PUSH2 0xE12 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE12 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x289D JUMPI PUSH2 0x2897 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x35B1 JUMP JUMPDEST DIV PUSH2 0x284A JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x28AB SWAP3 DIV PUSH2 0x35B1 JUMP JUMPDEST PUSH2 0x284A JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x283D JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH2 0x11F7 PUSH2 0x28C9 CALLDATASIZE PUSH2 0x2EBD JUMP JUMPDEST SWAP2 PUSH2 0x28D2 PUSH2 0x3A50 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2950 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BA JUMP JUMPDEST PUSH2 0x2959 SWAP2 PUSH2 0x3965 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2928 JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x29EE PUSH2 0x3A50 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x359 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0x2A96 PUSH2 0x2E77 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2CC3 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2AE6 PUSH2 0x3A50 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2C95 JUMPI DUP5 DUP7 EQ PUSH2 0x2C67 JUMPI PUSH2 0x2B26 DUP2 DUP7 DUP7 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x2C1B JUMPI POP ISZERO PUSH2 0x2B8A JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2B76 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2B4D JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2C07 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2B4F JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2BAB JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2CED SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3965 JUMP JUMPDEST DUP4 PUSH2 0x2ABC JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x20 PUSH2 0x214C PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x334B JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH2 0xE12 PUSH2 0x15D0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x385E JUMP JUMPDEST CALLVALUE PUSH2 0x32A JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI PUSH2 0x22C7 PUSH1 0x20 SWAP2 PUSH2 0x329C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x2E24 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2E14 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x2E70 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x2E11 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x3018 SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x303B SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x32A JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x32A JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x32A JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x32A JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x32A JUMPI DUP2 PUSH2 0x30D5 SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x32A JUMPI PUSH2 0x2FCB SWAP2 PUSH1 0x4 ADD PUSH2 0x2F2F JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3139 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3139 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x318C DUP2 PUSH2 0x3168 JUMP JUMPDEST SWAP4 PUSH2 0x319A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x30F8 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x32A JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x31BC JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3224 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3139 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3271 DUP3 PUSH2 0x322B JUMP JUMPDEST SWAP2 PUSH2 0x327F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x30F8 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x32A JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3345 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x333F JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6A4 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3224 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6D2 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2C95 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x357F JUMPI DUP3 PUSH2 0x342E SWAP2 DUP6 PUSH2 0x3B64 JUMP JUMPDEST ISZERO PUSH2 0x34C4 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3475 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x344D JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3539 JUMPI JUMPDEST PUSH2 0x34ED JUMPI DUP1 PUSH2 0x3434 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x34E3 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x35C4 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x364D JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x2440 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3749 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x378B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x37E8 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x378B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x32A JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x32A JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x395B JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x392E JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x38EE JUMPI POP PUSH1 0x1 EQ PUSH2 0x38A7 JUMPI JUMPDEST POP PUSH2 0x38A5 SWAP3 POP SUB DUP4 PUSH2 0x30F8 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x38D2 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x38A5 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3898 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x38B9 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x38A5 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3898 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3878 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3A46 JUMPI JUMPDEST PUSH2 0x398E JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3A27 JUMPI JUMPDEST POP ISZERO PUSH2 0x39FA JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3A40 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10D6 JUMPI PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST CODESIZE PUSH2 0x39F1 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3B55 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3B5A JUMPI JUMPDEST PUSH2 0x3B55 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3ADB JUMPI JUMPDEST POP PUSH2 0x3AD8 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3B36 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3ACE JUMP JUMPDEST PUSH2 0x3B4F SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10D6 JUMPI PUSH2 0x10C8 DUP2 DUP4 PUSH2 0x30F8 JUMP JUMPDEST CODESIZE PUSH2 0x3B2F JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A97 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3B8F JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3B89 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3C56 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x2E34 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xE9E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3CBA JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B28 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3D2D JUMPI JUMPDEST DUP2 PUSH2 0x3CD3 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x30F8 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BCB JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE93 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3C6C JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3CC6 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TLOAD SELFDESTRUCT EXTDELEGATECALL 0xCE 0xD0 PUSH13 0x1CE897AEFCF3C71C5F1A96E4BE OR 0xB8 DUP16 0xB1 SWAP9 0xB9 0x29 BLOCKHASH SWAP1 0xC9 0xE DIV 0xB7 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"1208:1160:329:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1208:1160:329;;2085:41;;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1208:1160:329;1845:10:192;;;;;;1208:1160:329;1857:3:192;1876:11;;;;;:::i;:::-;1208:1160:329;;;;;;;;;1898:10:192;;;;;:::i;:::-;1208:1160:329;1375:21:9;;;:30;1371:125;;1208:1160:329;1548:33:9;;;;;;;1208:1160:329;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1208:1160:329;;1834:9:192;;1591:58:9;1208:1160:329;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1208:1160:329;5957:19:9;1208:1160:329;;5957:19:9;1208:1160:329;;;;;1371:125:9;1455:21;;1428:57;1208:1160:329;1428:57:9;1208:1160:329;;;;;;1428:57:9;1208:1160:329;;;;1756:63:192;1793:26;1208:1160:329;1793:26:192;1208:1160:329;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1208:1160:329;;-1:-1:-1;4538:25:42;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2085:41;;;:::i;:::-;3179:19:352;1208:1160:329;;;;;;;;2616:14:352;2612:76;;1208:1160:329;29158:19:327;;1208:1160:329;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;1208:1160:329;;12884:11:327;;1208:1160:329;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;1208:1160:329;13173:304:327;-1:-1:-1;1208:1160:329;;;13323:10:327;1208:1160:329;;;;;;;;;;;2220:8:327;;1208:1160:329;;;;;;;;;2220:8:327;;1208:1160:329;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;1208:1160:329;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;1208:1160:329;;;;;;;;;;;;;;2220:8:327;13125:27;;;1208:1160:329;13125:27:327;;1208:1160:329;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;1208:1160:329;12987:51:327;;1208:1160:329;12987:51:327;1208:1160:329;;;;;;;;;12987:51:327;12919:59;1208:1160:329;;;;12958:11:327;1208:1160:329;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;1208:1160:329;12832:34:327;1208:1160:329;;;;;;12832:34:327;12715:64;12748:31;;1208:1160:329;12748:31:327;1208:1160:329;;;;12748:31:327;12409:58;12438:29;1208:1160:329;12438:29:327;1208:1160:329;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;2085:41;;;:::i;:::-;1208:1160;;;;;;;;3205:23:42;;;3201:60;;1208:1160:329;;;3275:25:42;;;;3271:146;;1208:1160:329;3271:146:42;2220:8:327;;;;;;;;3361:45:42;1208:1160:329;3361:45:42;;1208:1160:329;;;;;;;;:::i;:::-;29158:19:327;1208:1160:329;2085:41;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;1208:1160:329;;25879:11:327;;1208:1160:329;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;1208:1160:329;26179:110:327;-1:-1:-1;1208:1160:329;26238:10:327;1208:1160:329;;;-1:-1:-1;1208:1160:329;;;;;2220:8:327;;1208:1160:329;;;25601:3:327;25638:11;;;;;:::i;:::-;1208:1160:329;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;1208:1160:329;;;;;;;;;;2414:66:327;1208:1160:329;;;2220:8:327;1208:1160:329;26123:35:327;;;;;1208:1160:329;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;1208:1160:329;25982:51:327;;1208:1160:329;25982:51:327;1208:1160:329;;;;;;;;;25982:51:327;25914:59;1208:1160:329;;;;25953:11:327;1208:1160:329;;;;;;;;;;;25943:30:327;;25914:59;;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;1208:1160:329;-1:-1:-1;1208:1160:329;28718:11:327;1208:1160:329;;;;-1:-1:-1;1208:1160:329;28718:28:327;1208:1160:329;-1:-1:-1;1208:1160:329;;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;713:6:351;1208:1160:329;;;;;;;;;;;;;;;;;;:::i;:::-;2085:41;;:::i;:::-;5148:19:42;1208:1160:329;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1208:1160:329;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;1880:140:41;;1208:1160:329;1880:140:41;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1208:1160:329;;;;1973:36:41;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;1208:1160:329;;;1453:39:302;1863:70:327;1208:1160:329;1453:39:302;:::i;:::-;;1208:1160:329;3364:23:341;1208:1160:329;;;;3364:64:341;;;;;1208:1160:329;3364:64:341;;1603:4:302;1208:1160:329;3364:64:341;;1208:1160:329;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;1208:1160:329;3364:64:341;;;1208:1160:329;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1208:1160:329;;;;;;;;;;;3364:64:341;1208:1160:329;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1208:1160:329;;;2085:41;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1208:1160:329;3852:94:192;;1208:1160:329;3972:10:192;;;;;;1208:1160:329;3984:3:192;1208:1160:329;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1208:1160:329;;;;4058:76:192;;4108:25;1208:1160:329;4058:76:192;;1208:1160:329;4058:76:192;;;;;;;;;;;;1208:1160:329;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1208:1160:329;4239:12:192;;;;;;:::i;:::-;1208:1160:329;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1208:1160:329;4239:70:192;;;;;;;1208:1160:329;;;;;;;4239:70:192;;;;;1208:1160:329;4239:70:192;;4277:4;1208:1160:329;4239:70:192;;1208:1160:329;;4058:76:192;1208:1160:329;;;;;;;4239:70:192;;;;;;;1208:1160:329;4239:70:192;;;3984:3;;1208:1160:329;3961:9:192;;4239:70;1208:1160:329;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1208:1160:329;4161:50:192;1208:1160:329;;4058:76:192;1208:1160:329;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2085:41;;;;;:::i;:::-;3179:19:352;1208:1160:329;;;;;;;;2616:14:352;2612:76;;1208:1160:329;29158:19:327;;11217:7;1863:70;;;;1208:1160:329;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;1208:1160:329;11235:101:327;11271:54;1208:1160:329;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;1208:1160:329;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;1208:1160:329;;2085:41;;;:::i;:::-;1208:1160;;;6339:18:327;;;;6335:63;;1208:1160:329;6463:42:327;6408:19;1208:1160:329;-1:-1:-1;1208:1160:329;6408:11:327;1208:1160:329;;;-1:-1:-1;1208:1160:329;;-1:-1:-1;1208:1160:329;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;;;;;6463:42:327;1208:1160:329;6335:63:327;6366:32;;1208:1160:329;6366:32:327;1208:1160:329;;;;6366:32:327;1500:115:305;2931:8:352;668:81;1208:1160:329;2931:8:352;:::i;:::-;1500:115:305;;1208:1160:329;;;;;;;;;;;;;2991:23:341;1208:1160:329;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;1208:1160:329;2085:41;;:::i;:::-;1368:12:300;;:::i;:::-;1208:1160:329;1062:8:300;;;;:::i;:::-;1208:1160:329;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;1208:1160:329;;1062:8:300;;;;;;;;;;;1208:1160:329;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;1208:1160:329;17882:10:327;;;;;;1208:1160:329;17894:3:327;17920:13;17935:11;1208:1160:329;17920:13:327;1208:1160:329;17920:13:327;;;:::i;:::-;1208:1160:329;;17935:11:327;;;;:::i;:::-;1208:1160:329;17935:11:327;;;:::i;:::-;1208:1160:329;17871:9:327;;1062:8:300;1208:1160:329;;;;;;;;;1062:8:300;;;;;;;;;;1208:1160:329;;;;;;;;;;;;;2688:13:341;1208:1160:329;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1208:1160:329;-1:-1:-1;1208:1160:329;;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2085:41;;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;2976:19:351;1208:1160:329;;;;;1732:22:351;1728:93;;1208:1160:329;;2220:8:327;;;;;;;1208:1160:329;;;1728:93:351;1777:33;1208:1160:329;1777:33:351;1208:1160:329;;1777:33:351;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2085:41;;:::i;:::-;1208:1160;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;3741:25:41;3737:66;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1208:1160:329;;;;2455:33:41;1208:1160:329;3737:66:41;1208:1160:329;3775:28:41;;;1208:1160:329;3775:28:41;1208:1160:329;;;;;;;3775:28:41;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;1208:1160:329;2085:41;;:::i;1586:12:303:-;15560:7:327;1863:70;;1208:1160:329;;2085:41;;;:::i;:::-;1208:1160;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;1208:1160:329;15578:107:327;1208:1160:329;;;;;;;;;29832:65:327;;;;;1208:1160:329;29832:65:327;;1208:1160:329;;29832:65:327;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;1208:1160:329;29832:65:327;;;;;;;;1208:1160:329;29832:65:327;;;15578:107;1208:1160:329;;;;;29832:84:327;29828:136;;1208:1160:329;29828:136:327;29925:39;1208:1160:329;29925:39:327;1208:1160:329;;;;;;29925:39:327;29832:65;1208:1160:329;29832:65:327;;1208:1160:329;29832:65:327;;;;;;1208:1160:329;29832:65:327;;;:::i;:::-;;;1208:1160:329;;;;;;;;;;;;;29832:65:327;1208:1160:329;29832:65:327;;1208:1160:329;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;1208:1160:329;2085:41;;:::i;:::-;1208:1160;;;;;;;;;;;;;30700:19:327;;;24121:64;;1208:1160:329;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;1208:1160:329;;;;;;;;;;2414:66:327;1208:1160:329;;;2220:8:327;1208:1160:329;;;24633:10:327;1208:1160:329;;;;;;;;;2220:8:327;;24674:35;;;;1208:1160:329;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;1208:1160:329;24402:51:327;;;1208:1160:329;24402:51:327;1208:1160:329;;;;;;;;;24402:51:327;24334:59;1208:1160:329;;;;24373:11:327;1208:1160:329;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;1208:1160:329;24234:34:327;1208:1160:329;;;;;;24234:34:327;24121:64;24154:31;;1208:1160:329;24154:31:327;1208:1160:329;;;;24154:31:327;1208:1160:329;;;;;;;:::i;:::-;5148:19:42;;;;1208:1160:329;;;2085:41;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1208:1160:329;2776:90:192;;1208:1160:329;2892:10:192;;;;;;1208:1160:329;2904:3:192;2923:9;;;;;:::i;:::-;1208:1160:329;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1208:1160:329;;;1328:43:8;;;;;;1208:1160:329;;;;1328:43:8;;;1208:1160:329;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1208:1160:329;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1208:1160:329;;2881:9:192;;8938:146:8;9033:40;1208:1160:329;9033:40:8;1208:1160:329;;1328:43:8;1208:1160:329;9033:40:8;8942:68;1208:1160:329;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1208:1160:329;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;1208:1160:329;;-1:-1:-1;1208:1160:329;26801:10:327;1208:1160:329;;;;-1:-1:-1;1208:1160:329;;;;;;;;26724:60:327;26756:28;1208:1160:329;26756:28:327;1208:1160:329;;26756:28:327;1208:1160:329;;;;;;;;;;;;3395:39:305;1208:1160:329;;;3395:39:305;:::i;:::-;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;2085:41;;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;2976:19:351;1208:1160:329;1281:36:351;713:6;1281:36;;1277:119;;1208:1160:329;;;;;;;;;;;;;;;1277:119:351;1340:45;1208:1160:329;1340:45:351;1208:1160:329;;;;1340:45:351;1208:1160:329;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;1956:12:303;1208:1160:329;2085:41;;:::i;1956:12:303:-;1208:1160:329;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;1208:1160:329;;16512:9:327;1208:1160:329;16523:10:327;;;;;;16821:14;;;-1:-1:-1;1208:1160:329;16821:10:327;1208:1160:329;;;-1:-1:-1;1208:1160:329;;;;;2220:8:327;;1208:1160:329;;;16535:3:327;16572:11;;;;:::i;:::-;1208:1160:329;;;;;;;;;;;;;16597:72:327;;1208:1160:329;;;;;;;;;;;;;2220:8:327;16743:33;1208:1160:329;16743:33:327;;;;1208:1160:329;16512:9:327;;16597:72;16641:28;1208:1160:329;16641:28:327;1208:1160:329;;;;16641:28:327;16400:54;16429:25;1208:1160:329;16429:25:327;1208:1160:329;;16429:25:327;1208:1160:329;;;;;;;:::i;:::-;2085:41;;:::i;:::-;3179:19:352;1208:1160:329;;;;;;;;2616:14:352;2612:76;;1208:1160:329;29158:19:327;;9668:7;1863:70;;;;1208:1160:329;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;1208:1160:329;9686:99:327;9722:52;1208:1160:329;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1208:1160:329;;;;;;;;;;;1287:7:303;1208:1160:329;;:::i;:::-;1232:12:303;1208:1160:329;2085:41;;:::i;1232:12:303:-;1208:1160:329;;;;1287:7:303;:::i;1208:1160:329:-;;;;;;;;;;;;;;;:::i;:::-;2085:41;;:::i;:::-;5148:19:42;1208:1160:329;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1208:1160:329;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;1254:25:41;1250:140;;1208:1160:329;1250:140:41;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1208:1160:329;;;;1343:36:41;1208:1160:329;;;;;;;;;;;;;;;;941:19:75;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1208:1160:329;2499:377:351;;;2559:17;;1208:1160:329;;2499:377:351;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1208:1160:329;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1208:1160:329;2499:377:351;;2607:259;713:6;2794:57;1208:1160:329;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1208:1160:329;;;;2134:7:305;1208:1160:329;;;:::i;:::-;2085:41;;;:::i;:::-;1208:1160;;;;;;;;2616:14:352;2612:76;;1208:1160:329;29158:19:327;;1208:1160:329;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;2085:41;;;:::i;:::-;1208:1160;;;;;4503:26:42;;;4499:64;;3179:19:352;1208:1160:329;;;;2220:8:327;;;;;;;1208:1160:329;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;1208:1160:329;29158:19:327;1208:1160:329;2085:41;;:::i;:::-;1208:1160;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;1208:1160:329;5670:35:327;;1208:1160:329;5157:173:327;1208:1160:329;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;1208:1160:329;;;;;5620:11:327;1208:1160:329;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;1208:1160:329;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;1208:1160:329;5052:59:327;;;1208:1160:329;5052:59:327;1208:1160:329;;;;;;;;;5052:59:327;4927:63;4958:32;;1208:1160:329;4958:32:327;1208:1160:329;;;;4958:32:327;4802:64;4835:31;;1208:1160:329;4835:31:327;1208:1160:329;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;1208:1160:329;2931:8:352;:::i;:::-;1064:117:305;;;1208:1160:329;;;;;;;;;;;;3579:43:305;1208:1160:329;;;3579:43:305;:::i;1208:1160:329:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1208:1160:329;635:65:55;;:::i;1208:1160:329:-;;;;;;;;-1:-1:-1;;1208:1160:329;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;1208:1160:329;1146:19:75;1208:1160:329;1146:53:75;;;1142:96;;1208:1160:329;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1208:1160:329;1215:12:75;:::o;1208:1160:329:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1208:1160:329;;;;;;:::o;1359:340:59:-;1208:1160:329;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1208:1160:329;500:10:59;1208:1160:329;500:10:59;;;;1208:1160:329;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1208:1160:329;1528:12:59;:::o;27798:360:327:-;1208:1160:329;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;1208:1160:329;;;28073:11:327;1208:1160:329;;;;;;;;28066:27:327;:::o;7385:956::-;;;1208:1160:329;;7507:16:327;;;7503:58;;1208:1160:329;7521:1:327;1208:1160:329;;;;;7521:1:327;1208:1160:329;;;;;30700:19:327;;;7615:64;;1208:1160:329;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;1208:1160:329;;;7521:1:327;1208:1160:329;;;;;;7521:1:327;1208:1160:329;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;1208:1160:329;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;;;2220:8:327;;1208:1160:329;-1:-1:-1;1208:1160:329;;;;-1:-1:-1;1208:1160:329;8155:10:327;1208:1160:329;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;1208:1160:329;7896:51:327;;;7521:1;7896:51;1208:1160:329;7896:51:327;1208:1160:329;;;;;;7521:1:327;7896:51;7828:59;1208:1160:329;;7521:1:327;1208:1160:329;7867:11:327;;;1208:1160:329;;;;7521:1:327;1208:1160:329;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;1208:1160:329;;;;7521:1:327;7728:34;1208:1160:329;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;1208:1160:329;-1:-1:-1;1208:1160:329;;;;-1:-1:-1;1208:1160:329;;;;-1:-1:-1;1208:1160:329;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1208:1160:329;3775:28:41;;-1:-1:-1;3775:28:41;1208:1160:329;3775:28:41;1208:1160:329;;;;;-1:-1:-1;3775:28:41;14035:460:327;;1208:1160:329;;14119:16:327;;;14115:54;;1208:1160:329;14133:1:327;1208:1160:329;;;;;;14133:1:327;1208:1160:329;;;14179:72:327;;14415:10;1208:1160:329;;14133:1:327;1208:1160:329;;;;;;14133:1:327;1208:1160:329;2220:8:327;1208:1160:329;-1:-1:-1;1208:1160:329;14415:10:327;1208:1160:329;;;-1:-1:-1;1208:1160:329;14415:10:327;1208:1160:329;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;1208:1160:329;;14133:1:327;14223:28;1208:1160:329;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;1208:1160:329;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;1208:1160:329;;-1:-1:-1;27324:31:327;1208:1160:329;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1208:1160:329;;;;;-1:-1:-1;1208:1160:329;;-1:-1:-1;1208:1160:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;1208:1160:329;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1208:1160:329;;;3613:51:352;1208:1160:329;;3613:51:352;;;;1208:1160:329;3613:51:352;;3648:4;3613:51;;;1208:1160:329;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1208:1160:329;;-1:-1:-1;3691:28:352;3613:51;;;;1208:1160:329;3613:51:352;1208:1160:329;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;1208:1160:329;1029:19:76;1208:1160:329;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1208:1160:329;;;;;;1676:74:76;;;;1208:1160:329;1676:74:76;;;;;;1208:1160:329;1327:10:76;1208:1160:329;;;;1744:4:76;1208:1160:329;;;;1676:74:76;;;;;;;1208:1160:329;1676:74:76;;;1630:120;;;;;1676:74;;;;1208:1160:329;1676:74:76;1208:1160:329;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;1208:1160:329;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;1208:1160:329;;-1:-1:-1;1208:1160:329;30435:11:327;1208:1160:329;;;;-1:-1:-1;1208:1160:329;30435:27:327;1208:1160:329;-1:-1:-1;1208:1160:329;;;500:10:59;1208:1160:329;-1:-1:-1;1208:1160:329;500:10:59;;30413:49:327;;;;;29701:270;1208:1160:329;29701:270:327;1208:1160:329;29701:270:327;1208:1160:329;29701:270:327;;;;;1208:1160:329;;;;;29832:65:327;;;;;1208:1160:329;29832:65:327;;1208:1160:329;29832:65:327;;;1208:1160:329;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;1208:1160:329;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;1208:1160:329;29832:65:327;;1208:1160:329;29832:65:327;;;;;;1208:1160:329;29832:65:327;;;:::i;:::-;;;1208:1160:329;;;;;;;;;;;;;29832:65:327;1208:1160:329;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3144600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"826","ROYALTY_FEE_DENOMINATOR()":"870","approve(address,uint256)":"infinite","balanceOf(address)":"2729","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","isApprovedForAll(address,address)":"3267","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2693","ownerOf(uint256)":"2687","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/ERC721FullBurn.sol\":\"ERC721FullBurn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./base/ERC721BurnableBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Burnable is ERC721BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\\n    constructor() {\\n        ERC721Storage.initERC721Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xb63465341692ba51eeae4dd59c0c43809f4262b0dee67343981aaffbd49c0908\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./base/ERC721DeliverableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Deliverable is ERC721DeliverableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x0465e23e92e293553137225252d7c5b80b6fc7ae406b15559830b5b7164025f9\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableBase} from \\\"./base/ERC721MintableBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Mintable is ERC721MintableBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x7a77be686d1c5b113a5e2249a5f4164e8641098a50c9bc10eb717539841f9cb6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721FullBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721Mintable} from \\\"./../ERC721Mintable.sol\\\";\\nimport {ERC721Deliverable} from \\\"./../ERC721Deliverable.sol\\\";\\nimport {ERC721Burnable} from \\\"./../ERC721Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullBurn is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721Mintable,\\n    ERC721Deliverable,\\n    ERC721Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x15163c8bfd56bada82e04418d4f95579b9a708b8631154f59e02a66e6bbe32df\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol":{"ERC721FullMintOnceBurn":{"abi":[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","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":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_string_fromMemory":{"entryPoint":1603,"id":null,"parameterSlots":2,"returnSlots":1},"allocate_memory":{"entryPoint":1566,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60a060405234610619576146c7803803806100198161061e565b928339810160a0828203126106195781516001600160401b0381116106195781610044918401610643565b602083015190916001600160401b03821161061957610064918401610643565b60408301519092906001600160a01b038116908190036106195760608201516001600160a01b03811692908390036106195760800151926001600160a01b038416840361061957336105ba575b7fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60208190527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460ff1990811660019081179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080546001600160a01b03191690961790955563f3993d1160e01b6000527f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f8054909516179093558051906001600160401b038211610490576000805160206146878339815191525490600182811c921680156105b0575b60208310146104705781601f849311610533575b50602090601f83116001146104b1576000926104a6575b50508160011b916000199060031b1c191617600080516020614687833981519152555b83516001600160401b038111610490576000805160206146a783398151915254600181811c91168015610486575b602082101461047057601f81116103fe575b50602094601f821160011461037d57948192939495600092610372575b50508160011b916000199060031b1c1916176000805160206146a7833981519152555b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a680546001600160a01b031916919091179055635b5e139f60e01b60009081526020919091526040808220805460ff199081166001908117909255638e773e1360e01b84528284208054821683179055634ed2f41960e11b84528284208054821683179055638b8b4ef560e01b8452828420805482168317905563152a902d60e11b84529282902080549093161790915560809190915251613fd890816106af82396080518181816129b9015281816133fb0152613cd40152f35b015190503880610274565b601f198216956000805160206146a7833981519152600052806000209160005b8881106103e6575083600195969798106103cd575b505050811b016000805160206146a783398151915255610297565b015160001960f88460031b161c191690553880806103b2565b9192602060018192868501518155019401920161039d565b6000805160206146a78339815191526000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410610466575b601f0160051c01905b81811061045a5750610257565b6000815560010161044d565b9091508190610444565b634e487b7160e01b600052602260045260246000fd5b90607f1690610245565b634e487b7160e01b600052604160045260246000fd5b0151905038806101f4565b60008051602061468783398151915260009081528281209350601f198516905b81811061051b5750908460019594939210610502575b505050811b0160008051602061468783398151915255610217565b015160001960f88460031b161c191690553880806104e7565b929360206001819287860151815501950193016104d1565b6000805160206146878339815191526000529091507f565de0cfbb8a3f70c938db1afc5562690ff7c55773c7234a649300f58e3b30bc601f840160051c810191602085106105a6575b90601f859493920160051c01905b81811061059757506101dd565b6000815584935060010161058a565b909150819061057c565b91607f16916101c9565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc80546001600160a01b0319163390811790915560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36100b1565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761049057604052565b81601f82011215610619578051906001600160401b03821161049057610672601f8301601f191660200161061e565b92828452602083830101116106195760005b82811061069957505060206000918301015290565b8060208092840101518282870101520161068456fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612fc357806306fdde0314612f68578063081812fc14612f0b578063095ea7b314612c77578063114ba8ee14612b7857806323b872dd14612ad05780632a55205a146129dd5780632b4c9f161461296e5780632f2ff15d146127e257806340c10f191461275257806342842e0e146126825780634684d7e9146124be578063572b6c051461247357806361ba27da146123575780636352211e146122dc57806370a082311461221257806373c8a9581461206257806379cc679014611dc45780638832e6e314611b765780638bb9c5bf14611a075780638da5cb5b146119965780638dc251e31461186957806391d14854146117d157806395d89b41146117625780639da5e832146114e1578063a0c76f6214611470578063a22cb46514611310578063b0ccc31e1461129f578063b88d4fde1461117d578063c3666c3614610f40578063c77c695514610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e2366132a4565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613cbd565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e818387613a82565b3573ffffffffffffffffffffffffffffffffffffffff811680910361033557610278828587613a82565b359081471061030357600080809381935af13d156102fb573d9061029b82613443565b916102a96040519384613310565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c861308f565b6103d06130b2565b9060443567ffffffffffffffff8111610335576103f1903690600401613147565b926103fa613cbd565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694613dd1565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d818986613a82565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071091613bd2565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e61308f565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778613cbd565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936613178565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844613cbd565b92610850848483613dd1565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c0818886613a82565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a6761308f565b73ffffffffffffffffffffffffffffffffffffffff610a846130b2565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a6130b2565b610b62613cbd565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a27565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d9082018561304c565b0390f35b3d8083833e610e308183613310565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e6784613443565b92610e756040519485613310565b84845260208584010111610e9e5750610e1d92610e989160208085019101613029565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461033557610f4e366131e7565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f93613cbd565b92541691169081036103645750808214801590611173575b61033a5760005b828110610fbb57005b73ffffffffffffffffffffffffffffffffffffffff610fe3610fde83858a613a82565b613a92565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea957600091611145575b5015611118575073ffffffffffffffffffffffffffffffffffffffff611072610fde83858a613a82565b1690611082610fde828689613a82565b9161108e82878b613a82565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea957600192611107575b5001610fb2565b600061111291613310565b88611100565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611166915060203d811161116c575b61115e8183613310565b810190613ab3565b89611048565b503d611154565b5082821415610fab565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576111b461308f565b6111bc6130b2565b60443560643567ffffffffffffffff8111610335576111df903690600401613276565b9290936111ea613cbd565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361128f575b5050611270848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b823b61127857005b61128d9561128791369161347d565b93613e51565b005b61129891613bd2565b8685611241565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761134761308f565b602435908115159182810361033557611441575b73ffffffffffffffffffffffffffffffffffffffff80611379613cbd565b169116918183146114135760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61146b817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613bd2565b61135b565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610335576114ef366132a4565b9192916115247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b9061380b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361154f81613380565b9361155d6040519586613310565b818552602085019160051b81019036821161033557915b818310611735575050509061158a913691613398565b918151928051840361033a577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115c557005b73ffffffffffffffffffffffffffffffffffffffff6115e482846139e4565b5116801561170b576115f682856139e4565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116dd577fdead000000000000000000000000000000000000000000000000000000000000146116af5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115bc565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff8116810361033557815260209283019201611574565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6117bd7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613acb565b60405191829160208352602083019061304c565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576118086130b2565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576118a061308f565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118df613cbd565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561196c5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a62613cbd565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b2e5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611bad61308f565b6024359060443567ffffffffffffffff811161033557611bd1903690600401613276565b91611bfe7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b611c3e8482611c387fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c30613cbd565b97369161347d565b946138cd565b803b611c4657005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cb360405194859384937f150b7a020000000000000000000000000000000000000000000000000000000085521660048401526000602484015287604484015260806064840152608483019061304c565b03816000865af1908115610ea957600091611d45575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d1557005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dbc575b81611d5e60209383613310565b81010312611db85751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611cc9565b5080fd5b3d9150611d51565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611dfb61308f565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e28613cbd565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156120345773ffffffffffffffffffffffffffffffffffffffff81168095036120025782611e7d9185613dd1565b15611f2b575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611f9f575b611f545780611e83565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f4a565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557612070366131e7565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120b3613cbd565b92541691169081036103645750808414801590612208575b61033a5760005b8481106120db57005b6120e6818388613a82565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091612119610fde868b8e613a82565b826121836121af61212b898d8d613a82565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613310565b51925af115610ea9576000513d6121ff5750803b155b6121d257506001016120d2565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121c5565b50828414156120cb565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761224961308f565b73ffffffffffffffffffffffffffffffffffffffff8116156122b25773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206123396004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a27565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123c8613cbd565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161244657815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206124b46124af61308f565b6133e4565b6040519015158152f35b346103355761253d73ffffffffffffffffffffffffffffffffffffffff6124e436613178565b929193906125147fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613398565b921690811561170b5782519260005b84811061258d575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b61259781836139e4565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff8116612654577fdead0000000000000000000000000000000000000000000000000000000000001461262757908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161254c565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557612690366130d5565b612698613cbd565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612742575b505061271e828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b803b61272657005b61128d9360405193612739602086613310565b60008552613e51565b61274b91613bd2565b84836126ef565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761128d61278c61308f565b6127b87fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06138cd565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561281c6130b2565b612824613cbd565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128d757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612ac8575b15612a92575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a0821015612ab557612aaf90620186a0926137c9565b04612a62565b620186a0612ac392046137c9565b612a62565b508115612a55565b346103355761128d612ae1366130d5565b91612aea613cbd565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612b68575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b612b7191613bd2565b8581612b40565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c06613cbd565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612cae61308f565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612edb575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612cfe613cbd565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612ead57848614612e7f57612d3e818686613dd1565b15612e33575015612da2577401000000000000000000000000000000000000000016612d8e575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612d65565b90740100000000000000000000000000000000000000008217809203612e1f575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612d67565b846000526020526040600020558380612dc3565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612f05907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613bd2565b83612cd4565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206123396004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613563565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6117bd7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613acb565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576124b46020916134b4565b60005b83811061303c5750506000910152565b818101518382015260200161302c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361308881518092818752878088019101613029565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff8211610335576131e391600401613147565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161323091600401613147565b9290929160243567ffffffffffffffff8111610335578161325391600401613147565b929092916044359067ffffffffffffffff8211610335576131e391600401613147565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816132ed91600401613147565b929092916024359067ffffffffffffffff8211610335576131e391600401613147565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761335157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116133515760051b60200190565b9291906133a481613380565b936133b26040519586613310565b602085838152019160051b810192831161033557905b8282106133d457505050565b81358152602091820191016133c8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561343c5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161335157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261348982613443565b916134976040519384613310565b829481845281830111610335578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461355d577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613557576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af5774010000000000000000000000000000000000000000161561343c576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612ead5773ffffffffffffffffffffffffffffffffffffffff811680950361379757826136469185613dd1565b156136dc575b505083600052806020528260406000205582820361368d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613665565b7401000000000000000000000000000000000000000016158015613751575b613705578061364c565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156136fb565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156137dc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156138655750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561170b57826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81166139b6577fdead0000000000000000000000000000000000000000000000000000000000001461398857600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156139f85760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613a55575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156139f85760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519160008154918260011c92600181168015613bc8575b602085108114613b9b57848752869392918115613b5b5750600114613b14575b50613b1292500383613310565b565b90506000929192526020600020906000915b818310613b3f575050906020613b129282010138613b05565b6020919350806001915483858901015201910190918492613b26565b60209350613b129592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613b05565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613ae5565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613cb3575b613bfb575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea957600091613c94575b5015613c675750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613cad915060203d60201161116c5761115e8183613310565b38613c5e565b50813b1515613bf3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613dc2573233148015613dc7575b613dc2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613d48575b50613d4557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ea957600091613da3575b5038613d3b565b613dbc915060203d60201161116c5761115e8183613310565b38613d9c565b503390565b5060183610613d04565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613dfc575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613df6565b73ffffffffffffffffffffffffffffffffffffffff90613ec3826020949597969716958360405196879586957f150b7a0200000000000000000000000000000000000000000000000000000000875216600486015216602484015287604484015260806064840152608483019061304c565b03816000865af1908115610ea957600091613f27575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d15575050565b6020813d602011613f9a575b81613f4060209383613310565b81010312611db85751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000613ed9565b3d9150613f3356fea26469706673582212208a20801aa0a8c4986a85e73391d67c1fd41e351bc81d756a2501777823803c9b64736f6c634300081e00337ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a47ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5","opcodes":"PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x619 JUMPI PUSH2 0x46C7 DUP1 CODESIZE SUB DUP1 PUSH2 0x19 DUP2 PUSH2 0x61E JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD PUSH1 0xA0 DUP3 DUP3 SUB SLT PUSH2 0x619 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x619 JUMPI DUP2 PUSH2 0x44 SWAP2 DUP5 ADD PUSH2 0x643 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x619 JUMPI PUSH2 0x64 SWAP2 DUP5 ADD PUSH2 0x643 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP1 SWAP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP1 DUP2 SWAP1 SUB PUSH2 0x619 JUMPI PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND SWAP3 SWAP1 DUP4 SWAP1 SUB PUSH2 0x619 JUMPI PUSH1 0x80 ADD MLOAD SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP5 SUB PUSH2 0x619 JUMPI CALLER PUSH2 0x5BA JUMPI JUMPDEST PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP7 OR SWAP1 SWAP6 SSTORE PUSH4 0xF3993D11 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD SWAP1 SWAP6 AND OR SWAP1 SWAP4 SSTORE DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4687 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x5B0 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x470 JUMPI DUP2 PUSH1 0x1F DUP5 SWAP4 GT PUSH2 0x533 JUMPI JUMPDEST POP PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x4B1 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x4A6 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4687 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x46A7 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SLOAD PUSH1 0x1 DUP2 DUP2 SHR SWAP2 AND DUP1 ISZERO PUSH2 0x486 JUMPI JUMPDEST PUSH1 0x20 DUP3 LT EQ PUSH2 0x470 JUMPI PUSH1 0x1F DUP2 GT PUSH2 0x3FE JUMPI JUMPDEST POP PUSH1 0x20 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x37D JUMPI SWAP5 DUP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x0 SWAP3 PUSH2 0x372 JUMPI JUMPDEST POP POP DUP2 PUSH1 0x1 SHL SWAP2 PUSH1 0x0 NOT SWAP1 PUSH1 0x3 SHL SHR NOT AND OR PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x46A7 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP3 SSTORE PUSH4 0x8E773E13 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x4ED2F419 PUSH1 0xE1 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x8B8B4EF5 PUSH1 0xE0 SHL DUP5 MSTORE DUP3 DUP5 KECCAK256 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH4 0x152A902D PUSH1 0xE1 SHL DUP5 MSTORE SWAP3 DUP3 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x80 SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH2 0x3FD8 SWAP1 DUP2 PUSH2 0x6AF DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x29B9 ADD MSTORE DUP2 DUP2 PUSH2 0x33FB ADD MSTORE PUSH2 0x3CD4 ADD MSTORE RETURN JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x274 JUMP JUMPDEST PUSH1 0x1F NOT DUP3 AND SWAP6 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x46A7 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE DUP1 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x0 JUMPDEST DUP9 DUP2 LT PUSH2 0x3E6 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 SWAP9 LT PUSH2 0x3CD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x46A7 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x297 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x3B2 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP6 ADD MLOAD DUP2 SSTORE ADD SWAP5 ADD SWAP3 ADD PUSH2 0x39D JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x46A7 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x466 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x45A JUMPI POP PUSH2 0x257 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x7F AND SWAP1 PUSH2 0x245 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD MLOAD SWAP1 POP CODESIZE DUP1 PUSH2 0x1F4 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4687 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP4 POP PUSH1 0x1F NOT DUP6 AND SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x51B JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x502 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4687 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SSTORE PUSH2 0x217 JUMP JUMPDEST ADD MLOAD PUSH1 0x0 NOT PUSH1 0xF8 DUP5 PUSH1 0x3 SHL AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x4E7 JUMP JUMPDEST SWAP3 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP7 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP4 ADD PUSH2 0x4D1 JUMP JUMPDEST PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4687 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x0 MSTORE SWAP1 SWAP2 POP PUSH32 0x565DE0CFBB8A3F70C938DB1AFC5562690FF7C55773C7234A649300F58E3B30BC PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x5A6 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x597 JUMPI POP PUSH2 0x1DD JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x58A JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x57C JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1C9 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 PUSH2 0xB1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP2 SWAP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP4 DUP3 LT OR PUSH2 0x490 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0x619 JUMPI DUP1 MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT PUSH2 0x490 JUMPI PUSH2 0x672 PUSH1 0x1F DUP4 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x61E JUMP JUMPDEST SWAP3 DUP3 DUP5 MSTORE PUSH1 0x20 DUP4 DUP4 ADD ADD GT PUSH2 0x619 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x699 JUMPI POP POP PUSH1 0x20 PUSH1 0x0 SWAP2 DUP4 ADD ADD MSTORE SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD DUP3 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x684 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2FC3 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2F68 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2F0B JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2C77 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2B78 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2AD0 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29DD JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x296E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27E2 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2752 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2682 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24BE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2473 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2357 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2212 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x2062 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DC4 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B76 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A07 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1996 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1869 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17D1 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1762 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14E1 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1470 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1310 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x129F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x117D JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF40 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x32A4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3443 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3310 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x308F JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x30B2 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3DD1 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x308F JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x3178 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x3DD1 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x308F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x30B2 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A27 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x304C JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x3443 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3310 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3029 JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xF4E CALLDATASIZE PUSH2 0x31E7 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF93 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1173 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFBB JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE3 PUSH2 0xFDE DUP4 DUP6 DUP11 PUSH2 0x3A82 JUMP JUMPDEST PUSH2 0x3A92 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1145 JUMPI JUMPDEST POP ISZERO PUSH2 0x1118 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1072 PUSH2 0xFDE DUP4 DUP6 DUP11 PUSH2 0x3A82 JUMP JUMPDEST AND SWAP1 PUSH2 0x1082 PUSH2 0xFDE DUP3 DUP7 DUP10 PUSH2 0x3A82 JUMP JUMPDEST SWAP2 PUSH2 0x108E DUP3 DUP8 DUP12 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1107 JUMPI JUMPDEST POP ADD PUSH2 0xFB2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1112 SWAP2 PUSH2 0x3310 JUMP JUMPDEST DUP9 PUSH2 0x1100 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1166 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x116C JUMPI JUMPDEST PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AB3 JUMP JUMPDEST DUP10 PUSH2 0x1048 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1154 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFAB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x11B4 PUSH2 0x308F JUMP JUMPDEST PUSH2 0x11BC PUSH2 0x30B2 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x11DF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3276 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11EA PUSH2 0x3CBD JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x128F JUMPI JUMPDEST POP POP PUSH2 0x1270 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1278 JUMPI STOP JUMPDEST PUSH2 0x128D SWAP6 PUSH2 0x1287 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x347D JUMP JUMPDEST SWAP4 PUSH2 0x3E51 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1298 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x1241 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1347 PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x1441 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1379 PUSH2 0x3CBD JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1413 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x146B DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3BD2 JUMP JUMPDEST PUSH2 0x135B JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x14EF CALLDATASIZE PUSH2 0x32A4 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x1524 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH2 0x380B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x154F DUP2 PUSH2 0x3380 JUMP JUMPDEST SWAP4 PUSH2 0x155D PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3310 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1735 JUMPI POP POP POP SWAP1 PUSH2 0x158A SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3398 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x33A JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15C5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15E4 DUP3 DUP5 PUSH2 0x39E4 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x170B JUMPI PUSH2 0x15F6 DUP3 DUP6 PUSH2 0x39E4 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16DD JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16AF JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15BC JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1574 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x17BD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3ACB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1808 PUSH2 0x30B2 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x18A0 PUSH2 0x308F JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18DF PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x196C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A62 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B2E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1BAD PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1BD1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3276 JUMP JUMPDEST SWAP2 PUSH2 0x1BFE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH2 0x1C3E DUP5 DUP3 PUSH2 0x1C38 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C30 PUSH2 0x3CBD JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x347D JUMP JUMPDEST SWAP5 PUSH2 0x38CD JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C46 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CB3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D45 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D15 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DBC JUMPI JUMPDEST DUP2 PUSH2 0x1D5E PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DB8 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CC9 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D51 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1DFB PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E28 PUSH2 0x3CBD JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2034 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x2002 JUMPI DUP3 PUSH2 0x1E7D SWAP2 DUP6 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x1F2B JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1F9F JUMPI JUMPDEST PUSH2 0x1F54 JUMPI DUP1 PUSH2 0x1E83 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F4A JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2070 CALLDATASIZE PUSH2 0x31E7 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20B3 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2208 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20DB JUMPI STOP JUMPDEST PUSH2 0x20E6 DUP2 DUP4 DUP9 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2119 PUSH2 0xFDE DUP7 DUP12 DUP15 PUSH2 0x3A82 JUMP JUMPDEST DUP3 PUSH2 0x2183 PUSH2 0x21AF PUSH2 0x212B DUP10 DUP14 DUP14 PUSH2 0x3A82 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3310 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x21FF JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21D2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D2 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21C5 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20CB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2249 PUSH2 0x308F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22B2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2339 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A27 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23C8 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2446 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x24B4 PUSH2 0x24AF PUSH2 0x308F JUMP JUMPDEST PUSH2 0x33E4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x253D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24E4 CALLDATASIZE PUSH2 0x3178 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2514 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3398 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x170B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x258D JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x2597 DUP2 DUP4 PUSH2 0x39E4 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x2654 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2627 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x254C JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2690 CALLDATASIZE PUSH2 0x30D5 JUMP JUMPDEST PUSH2 0x2698 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2742 JUMPI JUMPDEST POP POP PUSH2 0x271E DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2726 JUMPI STOP JUMPDEST PUSH2 0x128D SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2739 PUSH1 0x20 DUP7 PUSH2 0x3310 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x274B SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26EF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x128D PUSH2 0x278C PUSH2 0x308F JUMP JUMPDEST PUSH2 0x27B8 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x38CD JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x281C PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0x2824 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28D7 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2AC8 JUMPI JUMPDEST ISZERO PUSH2 0x2A92 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2AB5 JUMPI PUSH2 0x2AAF SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x37C9 JUMP JUMPDEST DIV PUSH2 0x2A62 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2AC3 SWAP3 DIV PUSH2 0x37C9 JUMP JUMPDEST PUSH2 0x2A62 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2A55 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x128D PUSH2 0x2AE1 CALLDATASIZE PUSH2 0x30D5 JUMP JUMPDEST SWAP2 PUSH2 0x2AEA PUSH2 0x3CBD JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B68 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST PUSH2 0x2B71 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2B40 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C06 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2CAE PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2EDB JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2CFE PUSH2 0x3CBD JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2EAD JUMPI DUP5 DUP7 EQ PUSH2 0x2E7F JUMPI PUSH2 0x2D3E DUP2 DUP7 DUP7 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x2E33 JUMPI POP ISZERO PUSH2 0x2DA2 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2D8E JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2D65 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2E1F JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2D67 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2DC3 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2F05 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3BD2 JUMP JUMPDEST DUP4 PUSH2 0x2CD4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2339 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3563 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x17BD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3ACB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x24B4 PUSH1 0x20 SWAP2 PUSH2 0x34B4 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x303C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x302C JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3088 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3029 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3230 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3253 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x32ED SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3351 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3351 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x33A4 DUP2 PUSH2 0x3380 JUMP JUMPDEST SWAP4 PUSH2 0x33B2 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3310 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x33D4 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x33C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x343C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3351 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3489 DUP3 PUSH2 0x3443 JUMP JUMPDEST SWAP2 PUSH2 0x3497 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3310 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x355D JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3557 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x343C JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2EAD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3797 JUMPI DUP3 PUSH2 0x3646 SWAP2 DUP6 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x36DC JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x368D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3665 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3751 JUMPI JUMPDEST PUSH2 0x3705 JUMPI DUP1 PUSH2 0x364C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x36FB JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x37DC JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3865 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x170B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x39B6 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3988 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x39F8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3A55 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x39F8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3BC8 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3B9B JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3B5B JUMPI POP PUSH1 0x1 EQ PUSH2 0x3B14 JUMPI JUMPDEST POP PUSH2 0x3B12 SWAP3 POP SUB DUP4 PUSH2 0x3310 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3B3F JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3B12 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3B05 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3B26 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3B12 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3B05 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3AE5 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3CB3 JUMPI JUMPDEST PUSH2 0x3BFB JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3C94 JUMPI JUMPDEST POP ISZERO PUSH2 0x3C67 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3CAD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x116C JUMPI PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST CODESIZE PUSH2 0x3C5E JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3BF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3DC2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3DC7 JUMPI JUMPDEST PUSH2 0x3DC2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3D48 JUMPI JUMPDEST POP PUSH2 0x3D45 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3DA3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3D3B JUMP JUMPDEST PUSH2 0x3DBC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x116C JUMPI PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST CODESIZE PUSH2 0x3D9C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3DFC JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3DF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3EC3 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F27 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D15 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3F9A JUMPI JUMPDEST DUP2 PUSH2 0x3F40 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DB8 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3ED9 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3F33 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 KECCAK256 DUP1 BYTE LOG0 0xA8 0xC4 SWAP9 PUSH11 0x85E73391D67C1FD41E351B 0xC8 SAR PUSH22 0x6A2501777823803C9B64736F6C634300081E00337EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A47EA6 DUP16 0xD2 0xDC CALL 0xC0 JUMP 0xB9 0x4D 0xB6 LOG0 0xA5 CALLDATACOPY 0xAA DUP1 0xD2 PUSH16 0xA9AB1EACD85DA1BA0B61B7E7A8A50000 ","sourceMap":"1224:1176:330:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;1749:10;1645:152:42;;-1:-1:-1;1224:1176:330;;500:10:59;;;;;;-1:-1:-1;;500:10:59;;;990:1:42;500:10:59;;;;;;;;;;;;;;;1224:1176:330;;;-1:-1:-1;;;;;;1224:1176:330;;;;;;;-1:-1:-1;;;;500:10:59;;;;;;;;;;;1224:1176:330;;;-1:-1:-1;;;;;1224:1176:330;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;;990:1:42;1224:1176:330;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;;;;-1:-1:-1;;;;;1224:1176:330;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;990:1:42;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;;1289:23:341;1224:1176:330;;-1:-1:-1;;;;;;1224:1176:330;;;;;;;-1:-1:-1;;;;500:10:59;;;1224:1176:330;500:10:59;;;;1224:1176:330;500:10:59;;;;;-1:-1:-1;;500:10:59;;;1224:1176:330;500:10:59;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;-1:-1:-1;;;500:10:59;;;;;;;;;;;;;;;1224:1176:330;745:39:76;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1224:1176:330;;-1:-1:-1;1224:1176:330;;-1:-1:-1;1224:1176:330;;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;990:1:42;1224:1176:330;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;;;;;;;;;;;;1224:1176:330;;;;;;;-1:-1:-1;;;1224:1176:330;;;;;;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;990:1:42;1224:1176:330;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;1224:1176:330;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;-1:-1:-1;990:1:42;1224:1176:330;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;1645:152:42;1224:1176:330;;;-1:-1:-1;;;;;;1224:1176:330;1749:10;1224:1176;;;;;;-1:-1:-1;1740:46:42;-1:-1:-1;;1740:46:42;1645:152;;1224:1176:330;-1:-1:-1;1224:1176:330;;;;;;;;;-1:-1:-1;;1224:1176:330;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1224:1176:330;;;;;;;;-1:-1:-1;;1224:1176:330;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":12431,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":12501,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":12664,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12775,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":12964,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":12615,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13208,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13437,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15027,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_bytes_calldata":{"entryPoint":12918,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12466,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":12364,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13184,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13379,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":14978,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14281,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":15051,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":12329,"id":null,"parameterSlots":3,"returnSlots":0},"finalize_allocation":{"entryPoint":13072,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":15953,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":15314,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14347,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":13667,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":15825,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13284,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintOnce":{"entryPoint":14541,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":15549,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":14887,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":13492,"id":11667,"parameterSlots":1,"returnSlots":1},"fun_transferFrom":{"entryPoint":13778,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":14820,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":14994,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10681},{"length":32,"start":13307},{"length":32,"start":15572}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714612fc357806306fdde0314612f68578063081812fc14612f0b578063095ea7b314612c77578063114ba8ee14612b7857806323b872dd14612ad05780632a55205a146129dd5780632b4c9f161461296e5780632f2ff15d146127e257806340c10f191461275257806342842e0e146126825780634684d7e9146124be578063572b6c051461247357806361ba27da146123575780636352211e146122dc57806370a082311461221257806373c8a9581461206257806379cc679014611dc45780638832e6e314611b765780638bb9c5bf14611a075780638da5cb5b146119965780638dc251e31461186957806391d14854146117d157806395d89b41146117625780639da5e832146114e1578063a0c76f6214611470578063a22cb46514611310578063b0ccc31e1461129f578063b88d4fde1461117d578063c3666c3614610f40578063c77c695514610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e2366132a4565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223613cbd565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e818387613a82565b3573ffffffffffffffffffffffffffffffffffffffff811680910361033557610278828587613a82565b359081471061030357600080809381935af13d156102fb573d9061029b82613443565b916102a96040519384613310565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c861308f565b6103d06130b2565b9060443567ffffffffffffffff8111610335576103f1903690600401613147565b926103fa613cbd565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694613dd1565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d818986613a82565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071091613bd2565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e61308f565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778613cbd565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936613178565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844613cbd565b92610850848483613dd1565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c0818886613a82565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a6761308f565b73ffffffffffffffffffffffffffffffffffffffff610a846130b2565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a6130b2565b610b62613cbd565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a27565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d9082018561304c565b0390f35b3d8083833e610e308183613310565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e6784613443565b92610e756040519485613310565b84845260208584010111610e9e5750610e1d92610e989160208085019101613029565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461033557610f4e366131e7565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f93613cbd565b92541691169081036103645750808214801590611173575b61033a5760005b828110610fbb57005b73ffffffffffffffffffffffffffffffffffffffff610fe3610fde83858a613a82565b613a92565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea957600091611145575b5015611118575073ffffffffffffffffffffffffffffffffffffffff611072610fde83858a613a82565b1690611082610fde828689613a82565b9161108e82878b613a82565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea957600192611107575b5001610fb2565b600061111291613310565b88611100565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611166915060203d811161116c575b61115e8183613310565b810190613ab3565b89611048565b503d611154565b5082821415610fab565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576111b461308f565b6111bc6130b2565b60443560643567ffffffffffffffff8111610335576111df903690600401613276565b9290936111ea613cbd565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361128f575b5050611270848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b823b61127857005b61128d9561128791369161347d565b93613e51565b005b61129891613bd2565b8685611241565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761134761308f565b602435908115159182810361033557611441575b73ffffffffffffffffffffffffffffffffffffffff80611379613cbd565b169116918183146114135760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61146b817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613bd2565b61135b565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610335576114ef366132a4565b9192916115247fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b9061380b565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361154f81613380565b9361155d6040519586613310565b818552602085019160051b81019036821161033557915b818310611735575050509061158a913691613398565b918151928051840361033a577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115c557005b73ffffffffffffffffffffffffffffffffffffffff6115e482846139e4565b5116801561170b576115f682856139e4565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116dd577fdead000000000000000000000000000000000000000000000000000000000000146116af5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115bc565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff8116810361033557815260209283019201611574565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6117bd7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613acb565b60405191829160208352602083019061304c565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576118086130b2565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576118a061308f565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118df613cbd565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561196c5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a62613cbd565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b2e5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611bad61308f565b6024359060443567ffffffffffffffff811161033557611bd1903690600401613276565b91611bfe7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b611c3e8482611c387fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c30613cbd565b97369161347d565b946138cd565b803b611c4657005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cb360405194859384937f150b7a020000000000000000000000000000000000000000000000000000000085521660048401526000602484015287604484015260806064840152608483019061304c565b03816000865af1908115610ea957600091611d45575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d1557005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dbc575b81611d5e60209383613310565b81010312611db85751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611cc9565b5080fd5b3d9150611d51565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611dfb61308f565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e28613cbd565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156120345773ffffffffffffffffffffffffffffffffffffffff81168095036120025782611e7d9185613dd1565b15611f2b575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611f9f575b611f545780611e83565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f4a565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557612070366131e7565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120b3613cbd565b92541691169081036103645750808414801590612208575b61033a5760005b8481106120db57005b6120e6818388613a82565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091612119610fde868b8e613a82565b826121836121af61212b898d8d613a82565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613310565b51925af115610ea9576000513d6121ff5750803b155b6121d257506001016120d2565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121c5565b50828414156120cb565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761224961308f565b73ffffffffffffffffffffffffffffffffffffffff8116156122b25773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206123396004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a27565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123c8613cbd565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161244657815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206124b46124af61308f565b6133e4565b6040519015158152f35b346103355761253d73ffffffffffffffffffffffffffffffffffffffff6124e436613178565b929193906125147fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613398565b921690811561170b5782519260005b84811061258d575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b61259781836139e4565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff8116612654577fdead0000000000000000000000000000000000000000000000000000000000001461262757908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161254c565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557612690366130d5565b612698613cbd565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612742575b505061271e828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b803b61272657005b61128d9360405193612739602086613310565b60008552613e51565b61274b91613bd2565b84836126ef565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761128d61278c61308f565b6127b87fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261151e613cbd565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06138cd565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561281c6130b2565b612824613cbd565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128d757005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612ac8575b15612a92575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a0821015612ab557612aaf90620186a0926137c9565b04612a62565b620186a0612ac392046137c9565b612a62565b508115612a55565b346103355761128d612ae1366130d5565b91612aea613cbd565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612b68575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d2565b612b7191613bd2565b8581612b40565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612c06613cbd565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557612cae61308f565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115612edb575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612cfe613cbd565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff8216938415612ead57848614612e7f57612d3e818686613dd1565b15612e33575015612da2577401000000000000000000000000000000000000000016612d8e575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612d65565b90740100000000000000000000000000000000000000008217809203612e1f575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612d67565b846000526020526040600020558380612dc3565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612f05907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613bd2565b83612cd4565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206123396004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613563565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6117bd7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613acb565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576124b46020916134b4565b60005b83811061303c5750506000910152565b818101518382015260200161302c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361308881518092818752878088019101613029565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff8211610335576131e391600401613147565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161323091600401613147565b9290929160243567ffffffffffffffff8111610335578161325391600401613147565b929092916044359067ffffffffffffffff8211610335576131e391600401613147565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816132ed91600401613147565b929092916024359067ffffffffffffffff8211610335576131e391600401613147565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761335157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116133515760051b60200190565b9291906133a481613380565b936133b26040519586613310565b602085838152019160051b810192831161033557905b8282106133d457505050565b81358152602091820191016133c8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690811561343c5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff811161335157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261348982613443565b916134976040519384613310565b829481845281830111610335578281602093846000960137010152565b7fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff00000000000000000000000000000000000000000000000000000000811461355d577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613557576000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d60205260ff6040600020541690565b50600190565b50600090565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af5774010000000000000000000000000000000000000000161561343c576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415612ead5773ffffffffffffffffffffffffffffffffffffffff811680950361379757826136469185613dd1565b156136dc575b505083600052806020528260406000205582820361368d575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613665565b7401000000000000000000000000000000000000000016158015613751575b613705578061364c565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156136fb565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156137dc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff60406000205416156138655750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561170b57826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81166139b6577fdead0000000000000000000000000000000000000000000000000000000000001461398857600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156139f85760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613a55575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156139f85760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519160008154918260011c92600181168015613bc8575b602085108114613b9b57848752869392918115613b5b5750600114613b14575b50613b1292500383613310565b565b90506000929192526020600020906000915b818310613b3f575050906020613b129282010138613b05565b6020919350806001915483858901015201910190918492613b26565b60209350613b129592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613b05565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b93607f1693613ae5565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613cb3575b613bfb575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea957600091613c94575b5015613c675750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613cad915060203d60201161116c5761115e8183613310565b38613c5e565b50813b1515613bf3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613dc2573233148015613dc7575b613dc2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613d48575b50613d4557503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ea957600091613da3575b5038613d3b565b613dbc915060203d60201161116c5761115e8183613310565b38613d9c565b503390565b5060183610613d04565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613dfc575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613df6565b73ffffffffffffffffffffffffffffffffffffffff90613ec3826020949597969716958360405196879586957f150b7a0200000000000000000000000000000000000000000000000000000000875216600486015216602484015287604484015260806064840152608483019061304c565b03816000865af1908115610ea957600091613f27575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d15575050565b6020813d602011613f9a575b81613f4060209383613310565b81010312611db85751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000613ed9565b3d9150613f3356fea26469706673582212208a20801aa0a8c4986a85e73391d67c1fd41e351bc81d756a2501777823803c9b64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2FC3 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2F68 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x2F0B JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2C77 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2B78 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2AD0 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29DD JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x296E JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27E2 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2752 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2682 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24BE JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2473 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2357 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2212 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x2062 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DC4 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B76 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A07 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1996 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1869 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17D1 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1762 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14E1 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x1470 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1310 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x129F JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x117D JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF40 JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x32A4 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3443 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3310 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x308F JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x30B2 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3DD1 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x308F JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x3178 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x3DD1 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x308F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x30B2 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A27 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x304C JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x3443 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3310 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3029 JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xF4E CALLDATASIZE PUSH2 0x31E7 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF93 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x1173 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFBB JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE3 PUSH2 0xFDE DUP4 DUP6 DUP11 PUSH2 0x3A82 JUMP JUMPDEST PUSH2 0x3A92 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1145 JUMPI JUMPDEST POP ISZERO PUSH2 0x1118 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1072 PUSH2 0xFDE DUP4 DUP6 DUP11 PUSH2 0x3A82 JUMP JUMPDEST AND SWAP1 PUSH2 0x1082 PUSH2 0xFDE DUP3 DUP7 DUP10 PUSH2 0x3A82 JUMP JUMPDEST SWAP2 PUSH2 0x108E DUP3 DUP8 DUP12 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1107 JUMPI JUMPDEST POP ADD PUSH2 0xFB2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1112 SWAP2 PUSH2 0x3310 JUMP JUMPDEST DUP9 PUSH2 0x1100 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1166 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x116C JUMPI JUMPDEST PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3AB3 JUMP JUMPDEST DUP10 PUSH2 0x1048 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1154 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFAB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x11B4 PUSH2 0x308F JUMP JUMPDEST PUSH2 0x11BC PUSH2 0x30B2 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x11DF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3276 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11EA PUSH2 0x3CBD JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x128F JUMPI JUMPDEST POP POP PUSH2 0x1270 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1278 JUMPI STOP JUMPDEST PUSH2 0x128D SWAP6 PUSH2 0x1287 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x347D JUMP JUMPDEST SWAP4 PUSH2 0x3E51 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1298 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x1241 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1347 PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x1441 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1379 PUSH2 0x3CBD JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1413 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x146B DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3BD2 JUMP JUMPDEST PUSH2 0x135B JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x14EF CALLDATASIZE PUSH2 0x32A4 JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x1524 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 PUSH2 0x380B JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x154F DUP2 PUSH2 0x3380 JUMP JUMPDEST SWAP4 PUSH2 0x155D PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3310 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1735 JUMPI POP POP POP SWAP1 PUSH2 0x158A SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3398 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x33A JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15C5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15E4 DUP3 DUP5 PUSH2 0x39E4 JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x170B JUMPI PUSH2 0x15F6 DUP3 DUP6 PUSH2 0x39E4 JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16DD JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16AF JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15BC JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x1574 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x17BD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3ACB JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1808 PUSH2 0x30B2 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x18A0 PUSH2 0x308F JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18DF PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x196C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A62 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B2E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1BAD PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1BD1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3276 JUMP JUMPDEST SWAP2 PUSH2 0x1BFE PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH2 0x1C3E DUP5 DUP3 PUSH2 0x1C38 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C30 PUSH2 0x3CBD JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x347D JUMP JUMPDEST SWAP5 PUSH2 0x38CD JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C46 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CB3 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D45 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D15 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DBC JUMPI JUMPDEST DUP2 PUSH2 0x1D5E PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DB8 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CC9 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D51 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1DFB PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E28 PUSH2 0x3CBD JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2034 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x2002 JUMPI DUP3 PUSH2 0x1E7D SWAP2 DUP6 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x1F2B JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1F9F JUMPI JUMPDEST PUSH2 0x1F54 JUMPI DUP1 PUSH2 0x1E83 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F4A JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2070 CALLDATASIZE PUSH2 0x31E7 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20B3 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2208 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20DB JUMPI STOP JUMPDEST PUSH2 0x20E6 DUP2 DUP4 DUP9 PUSH2 0x3A82 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2119 PUSH2 0xFDE DUP7 DUP12 DUP15 PUSH2 0x3A82 JUMP JUMPDEST DUP3 PUSH2 0x2183 PUSH2 0x21AF PUSH2 0x212B DUP10 DUP14 DUP14 PUSH2 0x3A82 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3310 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x21FF JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21D2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x20D2 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21C5 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20CB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2249 PUSH2 0x308F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22B2 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2339 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A27 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23C8 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2446 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x24B4 PUSH2 0x24AF PUSH2 0x308F JUMP JUMPDEST PUSH2 0x33E4 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x253D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24E4 CALLDATASIZE PUSH2 0x3178 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2514 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3398 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x170B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x258D JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x2597 DUP2 DUP4 PUSH2 0x39E4 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x2654 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2627 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x254C JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2690 CALLDATASIZE PUSH2 0x30D5 JUMP JUMPDEST PUSH2 0x2698 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2742 JUMPI JUMPDEST POP POP PUSH2 0x271E DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2726 JUMPI STOP JUMPDEST PUSH2 0x128D SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2739 PUSH1 0x20 DUP7 PUSH2 0x3310 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x274B SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26EF JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x128D PUSH2 0x278C PUSH2 0x308F JUMP JUMPDEST PUSH2 0x27B8 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x151E PUSH2 0x3CBD JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x38CD JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x281C PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0x2824 PUSH2 0x3CBD JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28D7 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2AC8 JUMPI JUMPDEST ISZERO PUSH2 0x2A92 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2AB5 JUMPI PUSH2 0x2AAF SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x37C9 JUMP JUMPDEST DIV PUSH2 0x2A62 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2AC3 SWAP3 DIV PUSH2 0x37C9 JUMP JUMPDEST PUSH2 0x2A62 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2A55 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x128D PUSH2 0x2AE1 CALLDATASIZE PUSH2 0x30D5 JUMP JUMPDEST SWAP2 PUSH2 0x2AEA PUSH2 0x3CBD JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B68 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D2 JUMP JUMPDEST PUSH2 0x2B71 SWAP2 PUSH2 0x3BD2 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2B40 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2C06 PUSH2 0x3CBD JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2CAE PUSH2 0x308F JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2EDB JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2CFE PUSH2 0x3CBD JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x2EAD JUMPI DUP5 DUP7 EQ PUSH2 0x2E7F JUMPI PUSH2 0x2D3E DUP2 DUP7 DUP7 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x2E33 JUMPI POP ISZERO PUSH2 0x2DA2 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2D8E JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2D65 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x2E1F JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2D67 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2DC3 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2F05 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3BD2 JUMP JUMPDEST DUP4 PUSH2 0x2CD4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2339 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3563 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x17BD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3ACB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x24B4 PUSH1 0x20 SWAP2 PUSH2 0x34B4 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x303C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x302C JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3088 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3029 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3230 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3253 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x32ED SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x31E3 SWAP2 PUSH1 0x4 ADD PUSH2 0x3147 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x3351 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3351 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x33A4 DUP2 PUSH2 0x3380 JUMP JUMPDEST SWAP4 PUSH2 0x33B2 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3310 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x33D4 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x33C8 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x343C JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3351 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3489 DUP3 PUSH2 0x3443 JUMP JUMPDEST SWAP2 PUSH2 0x3497 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3310 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x355D JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3557 JUMPI PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x343C JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x2EAD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3797 JUMPI DUP3 PUSH2 0x3646 SWAP2 DUP6 PUSH2 0x3DD1 JUMP JUMPDEST ISZERO PUSH2 0x36DC JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x368D JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3665 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3751 JUMPI JUMPDEST PUSH2 0x3705 JUMPI DUP1 PUSH2 0x364C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x36FB JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x37DC JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3865 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x170B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x39B6 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x3988 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x39F8 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3A55 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x39F8 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 DUP2 SLOAD SWAP2 DUP3 PUSH1 0x1 SHR SWAP3 PUSH1 0x1 DUP2 AND DUP1 ISZERO PUSH2 0x3BC8 JUMPI JUMPDEST PUSH1 0x20 DUP6 LT DUP2 EQ PUSH2 0x3B9B JUMPI DUP5 DUP8 MSTORE DUP7 SWAP4 SWAP3 SWAP2 DUP2 ISZERO PUSH2 0x3B5B JUMPI POP PUSH1 0x1 EQ PUSH2 0x3B14 JUMPI JUMPDEST POP PUSH2 0x3B12 SWAP3 POP SUB DUP4 PUSH2 0x3310 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3B3F JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3B12 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3B05 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3B26 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3B12 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3B05 JUMP JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE REVERT JUMPDEST SWAP4 PUSH1 0x7F AND SWAP4 PUSH2 0x3AE5 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3CB3 JUMPI JUMPDEST PUSH2 0x3BFB JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3C94 JUMPI JUMPDEST POP ISZERO PUSH2 0x3C67 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3CAD SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x116C JUMPI PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST CODESIZE PUSH2 0x3C5E JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3BF3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3DC2 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3DC7 JUMPI JUMPDEST PUSH2 0x3DC2 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3D48 JUMPI JUMPDEST POP PUSH2 0x3D45 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3DA3 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3D3B JUMP JUMPDEST PUSH2 0x3DBC SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x116C JUMPI PUSH2 0x115E DUP2 DUP4 PUSH2 0x3310 JUMP JUMPDEST CODESIZE PUSH2 0x3D9C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3DFC JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3DF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3EC3 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x304C JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3F27 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D15 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x3F9A JUMPI JUMPDEST DUP2 PUSH2 0x3F40 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3310 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DB8 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3ED9 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x3F33 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 KECCAK256 DUP1 BYTE LOG0 0xA8 0xC4 SWAP9 PUSH11 0x85E73391D67C1FD41E351B 0xC8 SAR PUSH22 0x6A2501777823803C9B64736F6C634300081E00330000 ","sourceMap":"1224:1176:330:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1224:1176:330;;2117:41;;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1224:1176:330;1845:10:192;;;;;;1224:1176:330;1857:3:192;1876:11;;;;;:::i;:::-;1224:1176:330;;;;;;;;;1898:10:192;;;;;:::i;:::-;1224:1176:330;1375:21:9;;;:30;1371:125;;1224:1176:330;1548:33:9;;;;;;;1224:1176:330;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1224:1176:330;;1834:9:192;;1591:58:9;1224:1176:330;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1224:1176:330;5957:19:9;1224:1176:330;;5957:19:9;1224:1176:330;;;;;1371:125:9;1455:21;;1428:57;1224:1176:330;1428:57:9;1224:1176:330;;;;;;1428:57:9;1224:1176:330;;;;1756:63:192;1793:26;1224:1176:330;1793:26:192;1224:1176:330;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1224:1176:330;;-1:-1:-1;4538:25:42;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2117:41;;;:::i;:::-;3179:19:352;1224:1176:330;;;;;;;;2616:14:352;2612:76;;1224:1176:330;29158:19:327;;1224:1176:330;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;1224:1176:330;;12884:11:327;;1224:1176:330;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;1224:1176:330;13173:304:327;-1:-1:-1;1224:1176:330;;;13323:10:327;1224:1176:330;;;;;;;;;;;2220:8:327;;1224:1176:330;;;;;;;;;2220:8:327;;1224:1176:330;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;1224:1176:330;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;1224:1176:330;;;;;;;;;;;;;;2220:8:327;13125:27;;;1224:1176:330;13125:27:327;;1224:1176:330;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;1224:1176:330;12987:51:327;;1224:1176:330;12987:51:327;1224:1176:330;;;;;;;;;12987:51:327;12919:59;1224:1176:330;;;;12958:11:327;1224:1176:330;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;1224:1176:330;12832:34:327;1224:1176:330;;;;;;12832:34:327;12715:64;12748:31;;1224:1176:330;12748:31:327;1224:1176:330;;;;12748:31:327;12409:58;12438:29;1224:1176:330;12438:29:327;1224:1176:330;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;2117:41;;;:::i;:::-;1224:1176;;;;;;;;3205:23:42;;;3201:60;;1224:1176:330;;;3275:25:42;;;;3271:146;;1224:1176:330;3271:146:42;2220:8:327;;;;;;;;3361:45:42;1224:1176:330;3361:45:42;;1224:1176:330;;;;;;;;:::i;:::-;29158:19:327;1224:1176:330;2117:41;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;1224:1176:330;;25879:11:327;;1224:1176:330;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;1224:1176:330;26179:110:327;-1:-1:-1;1224:1176:330;26238:10:327;1224:1176:330;;;-1:-1:-1;1224:1176:330;;;;;2220:8:327;;1224:1176:330;;;25601:3:327;25638:11;;;;;:::i;:::-;1224:1176:330;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;1224:1176:330;;;;;;;;;;2414:66:327;1224:1176:330;;;2220:8:327;1224:1176:330;26123:35:327;;;;;1224:1176:330;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;1224:1176:330;25982:51:327;;1224:1176:330;25982:51:327;1224:1176:330;;;;;;;;;25982:51:327;25914:59;1224:1176:330;;;;25953:11:327;1224:1176:330;;;;;;;;;;;25943:30:327;;25914:59;;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;1224:1176:330;-1:-1:-1;1224:1176:330;28718:11:327;1224:1176:330;;;;-1:-1:-1;1224:1176:330;28718:28:327;1224:1176:330;-1:-1:-1;1224:1176:330;;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;713:6:351;1224:1176:330;;;;;;;;;;;;;;;;;;:::i;:::-;2117:41;;:::i;:::-;5148:19:42;1224:1176:330;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1224:1176:330;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;1880:140:41;;1224:1176:330;1880:140:41;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1224:1176:330;;;;1973:36:41;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;1224:1176:330;;;1453:39:302;1863:70:327;1224:1176:330;1453:39:302;:::i;:::-;;1224:1176:330;3364:23:341;1224:1176:330;;;;3364:64:341;;;;;1224:1176:330;3364:64:341;;1603:4:302;1224:1176:330;3364:64:341;;1224:1176:330;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;1224:1176:330;3364:64:341;;;1224:1176:330;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1224:1176:330;;;;;;;;;;;3364:64:341;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;1224:1176:330;;;;30830:32:327;1224:1176:330;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1224:1176:330;;;2117:41;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1224:1176:330;3852:94:192;;1224:1176:330;3972:10:192;;;;;;1224:1176:330;3984:3:192;1224:1176:330;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1224:1176:330;;;;4058:76:192;;4108:25;1224:1176:330;4058:76:192;;1224:1176:330;4058:76:192;;;;;;;;;;;;1224:1176:330;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1224:1176:330;4239:12:192;;;;;;:::i;:::-;1224:1176:330;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1224:1176:330;4239:70:192;;;;;;;1224:1176:330;;;;;;;4239:70:192;;;;;1224:1176:330;4239:70:192;;4277:4;1224:1176:330;4239:70:192;;1224:1176:330;;4058:76:192;1224:1176:330;;;;;;;4239:70:192;;;;;;;1224:1176:330;4239:70:192;;;3984:3;;1224:1176:330;3961:9:192;;4239:70;1224:1176:330;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1224:1176:330;4161:50:192;1224:1176:330;;4058:76:192;1224:1176:330;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2117:41;;;;;:::i;:::-;3179:19:352;1224:1176:330;;;;;;;;2616:14:352;2612:76;;1224:1176:330;29158:19:327;;11217:7;1863:70;;;;1224:1176:330;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;1224:1176:330;11235:101:327;11271:54;1224:1176:330;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;1224:1176:330;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;1224:1176:330;;2117:41;;;:::i;:::-;1224:1176;;;6339:18:327;;;;6335:63;;1224:1176:330;6463:42:327;6408:19;1224:1176:330;-1:-1:-1;1224:1176:330;6408:11:327;1224:1176:330;;;-1:-1:-1;1224:1176:330;;-1:-1:-1;1224:1176:330;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;;;;6463:42:327;1224:1176:330;6335:63:327;6366:32;;1224:1176:330;6366:32:327;1224:1176:330;;;;6366:32:327;1500:115:305;2931:8:352;668:81;1224:1176:330;2931:8:352;:::i;:::-;1500:115:305;;1224:1176:330;;;;;;;;;;;;;2991:23:341;1224:1176:330;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1471:12:301;1224:1176:330;2117:41;;:::i;:::-;1471:12:301;;:::i;:::-;1224:1176:330;1072:8:301;;;;:::i;:::-;1224:1176:330;;;;;;;:::i;:::-;1072:8:301;;;;;;;;;;;1224:1176:330;;1072:8:301;;;;;;;;;;;1224:1176:330;;;;;;;;;:::i;:::-;;;;;;;22754:25:327;;22750:64;;23302:10;;22829:9;1224:1176:330;22840:10:327;;;;;;1224:1176:330;22852:3:327;1224:1176:330;22884:13:327;;;;:::i;:::-;1224:1176:330;;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;1224:1176:330;;;;;;1072:8:301;1224:1176:330;;;;;;;;23070:60:327;;2414:66;30830:32;23144:59;;1224:1176:330;;;;;;;;1072:8:301;1224:1176:330;;;;;2220:8:327;1224:1176:330;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;2220:8:327;;1224:1176:330;23350:33:327;;;;1224:1176:330;22829:9:327;;23144:59;23178:25;;1224:1176:330;23178:25:327;1224:1176:330;;;;23178:25:327;23070:60;23102:28;;1224:1176:330;23102:28:327;1224:1176:330;;;;23102:28:327;22911:54;22940:25;1224:1176:330;22940:25:327;1224:1176:330;;22940:25:327;1072:8:301;1224:1176:330;;;;;;;;;1072:8:301;;;;;;;;;;1224:1176:330;;;;;;;;;;;;;2688:13:341;1224:1176:330;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1224:1176:330;-1:-1:-1;1224:1176:330;;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2117:41;;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;2976:19:351;1224:1176:330;;;;;1732:22:351;1728:93;;1224:1176:330;;2220:8:327;;;;;;;1224:1176:330;;;1728:93:351;1777:33;1224:1176:330;1777:33:351;1224:1176:330;;1777:33:351;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2117:41;;:::i;:::-;1224:1176;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;3741:25:41;3737:66;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1224:1176:330;;;;2455:33:41;1224:1176:330;3737:66:41;1224:1176:330;3775:28:41;;;1224:1176:330;3775:28:41;1224:1176:330;;;;;;;3775:28:41;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1766:12:304;1224:1176:330;2117:41;;:::i;1766:12:304:-;20205:7:327;1863:70;;1224:1176:330;;2117:41;;;:::i;:::-;1224:1176;;;;:::i;:::-;20205:7:327;;:::i;:::-;376:58:354;;20223:107:327;;1224:1176:330;20223:107:327;1224:1176:330;;;;;;;;;29832:65:327;;;;;1224:1176:330;29832:65:327;;1224:1176:330;;29832:65:327;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;1224:1176:330;29832:65:327;;;;;;;;1224:1176:330;29832:65:327;;;20223:107;1224:1176:330;;;;;29832:84:327;29828:136;;1224:1176:330;29828:136:327;29925:39;1224:1176:330;29925:39:327;1224:1176:330;;;;;;29925:39:327;29832:65;1224:1176:330;29832:65:327;;1224:1176:330;29832:65:327;;;;;;1224:1176:330;29832:65:327;;;:::i;:::-;;;1224:1176:330;;;;;;;;;;;;;29832:65:327;1224:1176:330;29832:65:327;;1224:1176:330;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;1224:1176:330;2117:41;;:::i;:::-;1224:1176;;;;;;;;;;;;;30700:19:327;;;24121:64;;1224:1176:330;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;1224:1176:330;;;;;;;;;;2414:66:327;1224:1176:330;;;2220:8:327;1224:1176:330;;;24633:10:327;1224:1176:330;;;;;;;;;2220:8:327;;24674:35;;;;1224:1176:330;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;1224:1176:330;24402:51:327;;;1224:1176:330;24402:51:327;1224:1176:330;;;;;;;;;24402:51:327;24334:59;1224:1176:330;;;;24373:11:327;1224:1176:330;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;1224:1176:330;24234:34:327;1224:1176:330;;;;;;24234:34:327;24121:64;24154:31;;1224:1176:330;24154:31:327;1224:1176:330;;;;24154:31:327;1224:1176:330;;;;;;;:::i;:::-;5148:19:42;;;;1224:1176:330;;;2117:41;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1224:1176:330;2776:90:192;;1224:1176:330;2892:10:192;;;;;;1224:1176:330;2904:3:192;2923:9;;;;;:::i;:::-;1224:1176:330;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1224:1176:330;;;1328:43:8;;;;;;1224:1176:330;;;;1328:43:8;;;1224:1176:330;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1224:1176:330;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1224:1176:330;;2881:9:192;;8938:146:8;9033:40;1224:1176:330;9033:40:8;1224:1176:330;;1328:43:8;1224:1176:330;9033:40:8;8942:68;1224:1176:330;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1224:1176:330;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;1224:1176:330;;-1:-1:-1;1224:1176:330;26801:10:327;1224:1176:330;;;;-1:-1:-1;1224:1176:330;;;;;;;;26724:60:327;26756:28;1224:1176:330;26756:28:327;1224:1176:330;;26756:28:327;1224:1176:330;;;;;;;;;;;;3395:39:305;1224:1176:330;;;3395:39:305;:::i;:::-;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;2117:41;;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;2976:19:351;1224:1176:330;1281:36:351;713:6;1281:36;;1277:119;;1224:1176:330;;;;;;;;;;;;;;;1277:119:351;1340:45;1224:1176:330;1340:45:351;1224:1176:330;;;;1340:45:351;1224:1176:330;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;2233:12:304;1224:1176:330;2117:41;;:::i;2233:12:304:-;1224:1176:330;;;;;:::i;:::-;;;21151:16:327;;;21147:54;;1224:1176:330;;21259:9:327;1224:1176:330;21270:10:327;;;;;;21677:14;;;-1:-1:-1;1224:1176:330;21677:10:327;1224:1176:330;;;-1:-1:-1;1224:1176:330;;;;;2220:8:327;;1224:1176:330;;;21282:3:327;21319:11;;;;:::i;:::-;1224:1176:330;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;1224:1176:330;;;;;;;;;;;;;2220:8:327;21599:33;1224:1176:330;21599:33:327;;;;1224:1176:330;21259:9:327;;21465:59;21499:25;1224:1176:330;21499:25:327;1224:1176:330;;;;21499:25:327;21391:60;21423:28;;1224:1176:330;21423:28:327;1224:1176:330;;;;21423:28:327;1224:1176:330;;;;;;;:::i;:::-;2117:41;;:::i;:::-;3179:19:352;1224:1176:330;;;;;;;;2616:14:352;2612:76;;1224:1176:330;29158:19:327;;9668:7;1863:70;;;;1224:1176:330;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;1224:1176:330;9686:99:327;9722:52;1224:1176:330;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1224:1176:330;;;;;;;;;;;1382:7:304;1224:1176:330;;:::i;:::-;1323:12:304;1224:1176:330;2117:41;;:::i;1323:12:304:-;1224:1176:330;;;;1382:7:304;:::i;1224:1176:330:-;;;;;;;;;;;;;;;:::i;:::-;2117:41;;:::i;:::-;5148:19:42;1224:1176:330;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1224:1176:330;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;1254:25:41;1250:140;;1224:1176:330;1250:140:41;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1224:1176:330;;;;1343:36:41;1224:1176:330;;;;;;;;;;;;;;;;941:19:75;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1224:1176:330;2499:377:351;;;2559:17;;1224:1176:330;;2499:377:351;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1224:1176:330;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1224:1176:330;2499:377:351;;2607:259;713:6;2794:57;1224:1176:330;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1224:1176:330;;;;2134:7:305;1224:1176:330;;;:::i;:::-;2117:41;;;:::i;:::-;1224:1176;;;;;;;;2616:14:352;2612:76;;1224:1176:330;29158:19:327;;1224:1176:330;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;2117:41;;;:::i;:::-;1224:1176;;;;;4503:26:42;;;4499:64;;3179:19:352;1224:1176:330;;;;2220:8:327;;;;;;;1224:1176:330;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;1224:1176:330;29158:19:327;1224:1176:330;2117:41;;:::i;:::-;1224:1176;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;1224:1176:330;5670:35:327;;1224:1176:330;5157:173:327;1224:1176:330;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;1224:1176:330;;;;;5620:11:327;1224:1176:330;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;1224:1176:330;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;1224:1176:330;5052:59:327;;;1224:1176:330;5052:59:327;1224:1176:330;;;;;;;;;5052:59:327;4927:63;4958:32;;1224:1176:330;4958:32:327;1224:1176:330;;;;4958:32:327;4802:64;4835:31;;1224:1176:330;4835:31:327;1224:1176:330;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;1224:1176:330;2931:8:352;:::i;:::-;1064:117:305;;;1224:1176:330;;;;;;;;;;;;3579:43:305;1224:1176:330;;;3579:43:305;:::i;1224:1176:330:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1224:1176:330;635:65:55;;:::i;1224:1176:330:-;;;;;;;;-1:-1:-1;;1224:1176:330;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;1224:1176:330;1146:19:75;1224:1176:330;1146:53:75;;;1142:96;;1224:1176:330;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1224:1176:330;1215:12:75;:::o;1224:1176:330:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1224:1176:330;;;;;;:::o;1359:340:59:-;1224:1176:330;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1224:1176:330;500:10:59;1224:1176:330;500:10:59;;;;1224:1176:330;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;1627:4;1620:11;:::o;1473:78::-;1528:12;1224:1176:330;1528:12:59;:::o;27798:360:327:-;1224:1176:330;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;1224:1176:330;;;28073:11:327;1224:1176:330;;;;;;;;28066:27:327;:::o;7385:956::-;;;1224:1176:330;;7507:16:327;;;7503:58;;1224:1176:330;7521:1:327;1224:1176:330;;;;;7521:1:327;1224:1176:330;;;;;30700:19:327;;;7615:64;;1224:1176:330;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;1224:1176:330;;;7521:1:327;1224:1176:330;;;;;;7521:1:327;1224:1176:330;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;1224:1176:330;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;;;2220:8:327;;1224:1176:330;-1:-1:-1;1224:1176:330;;;;-1:-1:-1;1224:1176:330;8155:10:327;1224:1176:330;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;1224:1176:330;7896:51:327;;;7521:1;7896:51;1224:1176:330;7896:51:327;1224:1176:330;;;;;;7521:1:327;7896:51;7828:59;1224:1176:330;;7521:1:327;1224:1176:330;7867:11:327;;;1224:1176:330;;;;7521:1:327;1224:1176:330;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;1224:1176:330;;;;7521:1:327;7728:34;1224:1176:330;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;1224:1176:330;-1:-1:-1;1224:1176:330;;;;-1:-1:-1;1224:1176:330;;;;-1:-1:-1;1224:1176:330;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1224:1176:330;3775:28:41;;-1:-1:-1;3775:28:41;1224:1176:330;3775:28:41;1224:1176:330;;;;;-1:-1:-1;3775:28:41;18606:565:327;;1224:1176:330;;18694:16:327;;;18690:54;;1224:1176:330;18708:1:327;1224:1176:330;;;;;18708:1:327;1224:1176:330;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;1224:1176:330;;18708:1:327;1224:1176:330;;;;;;18708:1:327;1224:1176:330;2220:8:327;1224:1176:330;-1:-1:-1;1224:1176:330;19091:10:327;1224:1176:330;;;-1:-1:-1;1224:1176:330;19091:10:327;1224:1176:330;;;2220:8:327;;18708:1;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;1224:1176:330;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;1224:1176:330;;18708:1:327;18830:28;1224:1176:330;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;1224:1176:330;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;1224:1176:330;;-1:-1:-1;27324:31:327;1224:1176:330;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;1224:1176:330;;;;;-1:-1:-1;1224:1176:330;;-1:-1:-1;1224:1176:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;1224:1176:330;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1224:1176:330;;;3613:51:352;1224:1176:330;;3613:51:352;;;;1224:1176:330;3613:51:352;;3648:4;3613:51;;;1224:1176:330;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1224:1176:330;;-1:-1:-1;3691:28:352;3613:51;;;;1224:1176:330;3613:51:352;1224:1176:330;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;1224:1176:330;1029:19:76;1224:1176:330;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1224:1176:330;;;;;;1676:74:76;;;;1224:1176:330;1676:74:76;;;;;;1224:1176:330;1327:10:76;1224:1176:330;;;;1744:4:76;1224:1176:330;;;;1676:74:76;;;;;;;1224:1176:330;1676:74:76;;;1630:120;;;;;1676:74;;;;1224:1176:330;1676:74:76;1224:1176:330;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;1224:1176:330;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;1224:1176:330;;-1:-1:-1;1224:1176:330;30435:11:327;1224:1176:330;;;;-1:-1:-1;1224:1176:330;30435:27:327;1224:1176:330;-1:-1:-1;1224:1176:330;;;500:10:59;1224:1176:330;-1:-1:-1;1224:1176:330;500:10:59;;30413:49:327;;;;;29701:270;1224:1176:330;29701:270:327;1224:1176:330;29701:270:327;1224:1176:330;29701:270:327;;;;;1224:1176:330;;;;;29832:65:327;;;;;1224:1176:330;29832:65:327;;1224:1176:330;29832:65:327;;;1224:1176:330;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;1224:1176:330;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;1224:1176:330;29832:65:327;;1224:1176:330;29832:65:327;;;;;;1224:1176:330;29832:65:327;;;:::i;:::-;;;1224:1176:330;;;;;;;;;;;;;29832:65:327;1224:1176:330;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3268800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"848","ROYALTY_FEE_DENOMINATOR()":"892","approve(address,uint256)":"infinite","balanceOf(address)":"2729","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","isApprovedForAll(address,address)":"3289","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2693","ownerOf(uint256)":"2687","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2672","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2433","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","wasBurnt(uint256)":"2979"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"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\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol\":\"ERC721FullMintOnceBurn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {AccessControlBase} from \\\"./base/AccessControlBase.sol\\\";\\nimport {ContractOwnership} from \\\"./ContractOwnership.sol\\\";\\n\\n/// @title Access control via roles management (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract AccessControl is AccessControlBase, ContractOwnership {}\\n\",\"keccak256\":\"0x877a8504a4a5bb83396746379d23af231da127fdcf9af6031cebcff2e6e305cf\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/TokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {TokenRecoveryBase} from \\\"./base/TokenRecoveryBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../access/ContractOwnership.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract TokenRecovery is TokenRecoveryBase, ContractOwnership {}\\n\",\"keccak256\":\"0x869d75a200651848fee243bab365fa6569476ca221f172d55abfb164e8725a34\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721BatchTransferWithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard: optional extension: Batch Transfer with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721BatchTransferWithOperatorFilterer is ERC721BatchTransferWithOperatorFiltererBase {\\n    /// @notice Marks the following ERC165 interfaces(s) as supported: ERC721BatchTransfer\\n    constructor() {\\n        ERC721Storage.initERC721BatchTransfer();\\n    }\\n}\\n\",\"keccak256\":\"0xc86dc3f51f4435732d1bd122178b9685de89a7ef0802c27fdd477be70a209a89\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./base/ERC721BurnableBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Burnable is ERC721BurnableBase {\\n    /// @notice Marks the fllowing ERC165 interface(s) as supported: ERC721Burnable\\n    constructor() {\\n        ERC721Storage.initERC721Burnable();\\n    }\\n}\\n\",\"keccak256\":\"0xb63465341692ba51eeae4dd59c0c43809f4262b0dee67343981aaffbd49c0908\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721DeliverableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./base/ERC721DeliverableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (immutable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721DeliverableOnce is ERC721DeliverableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    constructor() {\\n        ERC721Storage.initERC721Deliverable();\\n    }\\n}\\n\",\"keccak256\":\"0x3c07d84a3a3605882b84afd3bdf130a9c3992ba00e42403981b8813d3d4587b6\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./base/ERC721MetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (immutable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721Metadata is ERC721MetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721Metadata.\\n    /// @param name The name of the token.\\n    /// @param symbol The symbol of the token.\\n    /// @param metadataResolver The address of the metadata resolver contract.\\n    constructor(string memory name, string memory symbol, ITokenMetadataResolver metadataResolver) {\\n        TokenMetadataStorage.layout().constructorInit(name, symbol, metadataResolver);\\n        ERC721Storage.initERC721Metadata();\\n    }\\n}\\n\",\"keccak256\":\"0xebe9dfdf0576810454b6d9b1ad361bec36d1361bc775a7c1325e7a7fe06df32a\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721MintableOnce.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./base/ERC721MintableOnceBase.sol\\\";\\nimport {AccessControl} from \\\"./../../access/AccessControl.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (immutable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721MintableOnce is ERC721MintableOnceBase, AccessControl {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    constructor() {\\n        ERC721Storage.initERC721Mintable();\\n    }\\n}\\n\",\"keccak256\":\"0x62f7a355cfbf9bfb04f2932abcd474379b37af62f0f9fd5a09e63393e70dddd3\",\"license\":\"MIT\"},\"contracts/token/ERC721/ERC721WithOperatorFilterer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC721WithOperatorFilterer is ERC721WithOperatorFiltererBase, OperatorFiltererBase, ContractOwnership {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @notice Marks the following ERC165 interfaces as supported: ERC721.\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    constructor(IOperatorFilterRegistry operatorFilterRegistry) {\\n        ERC721Storage.init();\\n        OperatorFiltererStorage.layout().constructorInit(operatorFilterRegistry);\\n    }\\n}\\n\",\"keccak256\":\"0xee702247d73bbc973cba8692f12ceeaf93331a30f4f1d33f9055b3b963dffbd1\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/ERC721FullMintOnceBurn.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721WithOperatorFilterer} from \\\"./../ERC721WithOperatorFilterer.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFilterer} from \\\"./../ERC721BatchTransferWithOperatorFilterer.sol\\\";\\nimport {ERC721Metadata} from \\\"./../ERC721Metadata.sol\\\";\\nimport {ERC721MintableOnce} from \\\"./../ERC721MintableOnce.sol\\\";\\nimport {ERC721DeliverableOnce} from \\\"./../ERC721DeliverableOnce.sol\\\";\\nimport {ERC721Burnable} from \\\"./../ERC721Burnable.sol\\\";\\nimport {ERC2981} from \\\"./../../royalty/ERC2981.sol\\\";\\nimport {ContractOwnership} from \\\"./../../../access/ContractOwnership.sol\\\";\\nimport {TokenRecovery} from \\\"./../../../security/TokenRecovery.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullMintOnceBurn is\\n    ERC721WithOperatorFilterer,\\n    ERC721BatchTransferWithOperatorFilterer,\\n    ERC721Metadata,\\n    ERC721MintableOnce,\\n    ERC721DeliverableOnce,\\n    ERC721Burnable,\\n    ERC2981,\\n    TokenRecovery,\\n    ForwarderRegistryContext\\n{\\n    constructor(\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry,\\n        IForwarderRegistry forwarderRegistry\\n    )\\n        ContractOwnership(msg.sender)\\n        ERC721Metadata(tokenName, tokenSymbol, metadataResolver)\\n        ERC721WithOperatorFilterer(filterRegistry)\\n        ForwarderRegistryContext(forwarderRegistry)\\n    {}\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x5dd7179ea00c9f4fe4780dba08d3c1c3babc0fda0909eaa85e6eceedf7a857d1\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"version":1}}},"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol":{"ERC721FullBurnProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f6146ac38819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b038116810360745760805260405161461c908161009082396080518181816127ac01528181613aab01526143180152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461368157806306fdde0314613626578063081812fc146135c9578063095ea7b3146133355780630e07f85414612a52578063114ba8ee1461296b57806323b872dd146128c35780632a55205a146127d05780632b4c9f16146127615780632f2ff15d146125d557806340c10f191461254557806342842e0e146124755780634684d7e9146122dc578063572b6c051461229157806361ba27da146121755780636352211e146120fa57806370a082311461203057806373c8a95814611e8057806379cc679014611be25780638832e6e3146119945780638bb9c5bf146118255780638da5cb5b146117b45780638dc251e31461168757806391d14854146115ef57806395d89b41146115805780639da5e83214611456578063a0c76f62146113e5578063a22cb46514611285578063b0ccc31e14611214578063b88d4fde146110f2578063c3666c3614610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e236613983565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223614301565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e81838761410b565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103355761027882858761410b565b359081471061030357600080809381935af13d156102fb573d9061029b82613af3565b916102a960405193846139ef565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c861376e565b6103d0613791565b9060443567ffffffffffffffff8111610335576103f1903690600401613854565b926103fa614301565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694614415565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d81898661410b565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071091614216565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e61376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778614301565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936613885565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844614301565b92610850848483614415565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c081888661410b565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a6761376e565b73ffffffffffffffffffffffffffffffffffffffff610a84613791565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a613791565b610b62614301565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06140b0565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d9082018561372b565b0390f35b3d8083833e610e3081836139ef565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e6784613af3565b92610e7560405194856139ef565b84845260208584010111610e9e5750610e1d92610e989160208085019101613708565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461033557610ec3366138f4565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f08614301565b925416911690810361036457508082148015906110e8575b61033a5760005b828110610f3057005b73ffffffffffffffffffffffffffffffffffffffff610f58610f5383858a61410b565b61411b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea9576000916110ba575b501561108d575073ffffffffffffffffffffffffffffffffffffffff610fe7610f5383858a61410b565b1690610ff7610f5382868961410b565b9161100382878b61410b565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea95760019261107c575b5001610f27565b6000611087916139ef565b88611075565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110db915060203d81116110e1575b6110d381836139ef565b81019061413c565b89610fbd565b503d6110c9565b5082821415610f20565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761112961376e565b611131613791565b60443560643567ffffffffffffffff8111610335576111549036906004016137b4565b92909361115f614301565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603611204575b50506111e5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b823b6111ed57005b611202956111fc913691613b2d565b93614495565b005b61120d91614216565b86856111b6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576112bc61376e565b6024359081151591828103610335576113b6575b73ffffffffffffffffffffffffffffffffffffffff806112ee614301565b169116918183146113885760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113e0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614216565b6112d0565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103355761146436613983565b6114967fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b90613ee9565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114c181613a30565b946114cf60405196876139ef565b818652602086019160051b81019036821161033557915b81831061155357505050906114fc913691613a48565b918051918351830361033a5760005b83811061151457005b8061154d73ffffffffffffffffffffffffffffffffffffffff6115396001948761406d565b5116611545838961406d565b519085613fab565b0161150b565b823573ffffffffffffffffffffffffffffffffffffffff81168103610335578152602092830192016114e6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5614154565b60405191829160208352602083019061372b565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611626613791565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576116be61376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116fd614301565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561178a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611880614301565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561194c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119cb61376e565b6024359060443567ffffffffffffffff8111610335576119ef9036906004016137b4565b91611a1c7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b611a5c8482611a567fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a4e614301565b973691613b2d565b94613fab565b803b611a6457005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ad160405194859384937f150b7a020000000000000000000000000000000000000000000000000000000085521660048401526000602484015287604484015260806064840152608483019061372b565b03816000865af1908115610ea957600091611b63575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bda575b81611b7c602093836139ef565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611ae7565b5080fd5b3d9150611b6f565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611c1961376e565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c46614301565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e525773ffffffffffffffffffffffffffffffffffffffff8116809503611e205782611c9b9185614415565b15611d49575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dbd575b611d725780611ca1565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d68565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557611e8e366138f4565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ed1614301565b92541691169081036103645750808414801590612026575b61033a5760005b848110611ef957005b611f0481838861410b565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091611f37610f53868b8e61410b565b82611fa1611fcd611f49898d8d61410b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826139ef565b51925af115610ea9576000513d61201d5750803b155b611ff05750600101611ef0565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fe3565b5082841415611ee9565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761206761376e565b73ffffffffffffffffffffffffffffffffffffffff8116156120d05773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06140b0565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121e6614301565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206122d26122cd61376e565b613a94565b6040519015158152f35b346103355761235b73ffffffffffffffffffffffffffffffffffffffff61230236613885565b929193906123327fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613a48565b921690811561244b5782519260005b8481106123ab575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123b5818361406d565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241e57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161236a565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461033557612483366137e2565b61248b614301565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612535575b5050612511828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b803b61251957005b611202936040519361252c6020866139ef565b60008552614495565b61253e91614216565b84836124e2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761120261257f61376e565b6125ab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613fab565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561260f613791565b612617614301565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156126ca57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156128bb575b15612885575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a08210156128a8576128a290620186a092613ea7565b04612855565b620186a06128b69204613ea7565b612855565b508115612848565b34610335576112026128d4366137e2565b916128dd614301565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361295b575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b61296491614216565b8581612933565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576129a261376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806129e1614301565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff811161033557612aa19036906004016137b4565b60243567ffffffffffffffff811161033557612ac19036906004016137b4565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610335576064359373ffffffffffffffffffffffffffffffffffffffff85168503610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612b2f614301565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612ff4575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816132e0575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612ff4575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116131b1578190612de08454613c5d565b601f811161328d575b50600090601f83116001146131eb576000926131e0575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff81116131b157612e6b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613c5d565b601f811161312d575b506000601f82116001146130315781929394600092613026575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612ff4575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612e8e565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106131155750836001959697106130dd575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612ee0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806130b0565b9092602060018192868601358155019401910161309c565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c810191602084106131a7575b601f0160051c01905b81811061319b5750612e74565b6000815560010161318e565b9091508190613185565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612e00565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110613275575090846001959493921061323d575b505050811b019055612e32565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613230565b9193602060018192878701358155019501920161321a565b909150836000526020600020601f840160051c810191602085106132d6575b90601f859493920160051c01905b8181106132c75750612de9565b600081558493506001016132ba565b90915081906132ac565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612b9c565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761336c61376e565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115613599575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133bc614301565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff821693841561356b5784861461353d576133fc818686614415565b156134f157501561346057740100000000000000000000000000000000000000001661344c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583613423565b907401000000000000000000000000000000000000000082178092036134dd575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055613425565b846000526020526040600020558380613481565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135c3907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614216565b83613392565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613bee565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4614154565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576122d26020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613b64565b60005b83811061371b5750506000910152565b818101518382015260200161370b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361376781518092818752878088019101613708565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff8211610335576138f091600401613854565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161393d91600401613854565b9290929160243567ffffffffffffffff8111610335578161396091600401613854565b929092916044359067ffffffffffffffff8211610335576138f091600401613854565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816139cc91600401613854565b929092916024359067ffffffffffffffff8211610335576138f091600401613854565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176131b157604052565b67ffffffffffffffff81116131b15760051b60200190565b929190613a5481613a30565b93613a6260405195866139ef565b602085838152019160051b810192831161033557905b828210613a8457505050565b8135815260209182019101613a78565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613aec5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116131b157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613b3982613af3565b91613b4760405193846139ef565b829481845281830111610335578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613aec577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613be75760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af57740100000000000000000000000000000000000000001615613aec576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613ca6575b6020831014613c7757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613c6c565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561356b5773ffffffffffffffffffffffffffffffffffffffff8116809503613e755782613d249185614415565b15613dba575b5050836000528060205282604060002055828203613d6b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613d43565b7401000000000000000000000000000000000000000016158015613e2f575b613de35780613d2a565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613dd9565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613eba57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613f435750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244b57826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661403f57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156140815760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156140de575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156140815760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519182600082549261416884613c5d565b80845293600181169081156141d6575060011461418f575b5061418d925003836139ef565b565b90506000929192526020600020906000915b8183106141ba57505090602061418d9282010138614180565b60209193508060019154838589010152019101909184926141a1565b6020935061418d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138614180565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806142f7575b61423f575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea9576000916142d8575b50156142ab5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6142f1915060203d6020116110e1576110d381836139ef565b386142a2565b50813b1515614237565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561440657323314801561440b575b614406577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561438c575b5061438957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ea9576000916143e7575b503861437f565b614400915060203d6020116110e1576110d381836139ef565b386143e0565b503390565b5060183610614348565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614440575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061443a565b73ffffffffffffffffffffffffffffffffffffffff90614507826020949597969716958360405196879586957f150b7a0200000000000000000000000000000000000000000000000000000000875216600486015216602484015287604484015260806064840152608483019061372b565b03816000865af1908115610ea95760009161456b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b33575050565b6020813d6020116145de575b81614584602093836139ef565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff0000000000000000000000000000000000000000000000000000000061451d565b3d915061457756fea2646970667358221220f7c4e8ce333c86cf42b0a886b7470883a5d68bce73c22a66f26b2fed1106793c64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x46AC CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x461C SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x27AC ADD MSTORE DUP2 DUP2 PUSH2 0x3AAB ADD MSTORE PUSH2 0x4318 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3681 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3626 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x35C9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x3335 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2A52 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x296B JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x28C3 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x27D0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2761 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x25D5 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2545 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2475 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2291 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2175 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20FA JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2030 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E80 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BE2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1994 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1825 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17B4 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1687 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15EF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1580 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1456 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13E5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1285 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1214 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x3983 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3AF3 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x39EF JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x376E JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x3791 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4415 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x3885 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x4301 JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x4415 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x376E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x3791 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x3791 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x40B0 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x372B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x3AF3 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x39EF JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3708 JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xEC3 CALLDATASIZE PUSH2 0x38F4 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF08 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10E8 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF30 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF58 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x410B JUMP JUMPDEST PUSH2 0x411B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10BA JUMPI JUMPDEST POP ISZERO PUSH2 0x108D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE7 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x410B JUMP JUMPDEST AND SWAP1 PUSH2 0xFF7 PUSH2 0xF53 DUP3 DUP7 DUP10 PUSH2 0x410B JUMP JUMPDEST SWAP2 PUSH2 0x1003 DUP3 DUP8 DUP12 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x107C JUMPI JUMPDEST POP ADD PUSH2 0xF27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1087 SWAP2 PUSH2 0x39EF JUMP JUMPDEST DUP9 PUSH2 0x1075 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10E1 JUMPI JUMPDEST PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x413C JUMP JUMPDEST DUP10 PUSH2 0xFBD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C9 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF20 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1129 PUSH2 0x376E JUMP JUMPDEST PUSH2 0x1131 PUSH2 0x3791 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1154 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x115F PUSH2 0x4301 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1204 JUMPI JUMPDEST POP POP PUSH2 0x11E5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11ED JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP6 PUSH2 0x11FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3B2D JUMP JUMPDEST SWAP4 PUSH2 0x4495 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x120D SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x12BC PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x13B6 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12EE PUSH2 0x4301 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1388 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13E0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4216 JUMP JUMPDEST PUSH2 0x12D0 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1464 CALLDATASIZE PUSH2 0x3983 JUMP JUMPDEST PUSH2 0x1496 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH2 0x3EE9 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14C1 DUP2 PUSH2 0x3A30 JUMP JUMPDEST SWAP5 PUSH2 0x14CF PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x39EF JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1553 JUMPI POP POP POP SWAP1 PUSH2 0x14FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3A48 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1514 JUMPI STOP JUMPDEST DUP1 PUSH2 0x154D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1539 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x406D JUMP JUMPDEST MLOAD AND PUSH2 0x1545 DUP4 DUP10 PUSH2 0x406D JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3FAB JUMP JUMPDEST ADD PUSH2 0x150B JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14E6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x4154 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1626 PUSH2 0x3791 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x16BE PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16FD PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x178A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1880 PUSH2 0x4301 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19CB PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x19EF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST SWAP2 PUSH2 0x1A1C PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH2 0x1A5C DUP5 DUP3 PUSH2 0x1A56 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A4E PUSH2 0x4301 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3B2D JUMP JUMPDEST SWAP5 PUSH2 0x3FAB JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A64 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AD1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B63 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BDA JUMPI JUMPDEST DUP2 PUSH2 0x1B7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AE7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B6F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1C19 PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C46 PUSH2 0x4301 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E52 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E20 JUMPI DUP3 PUSH2 0x1C9B SWAP2 DUP6 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x1D49 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DBD JUMPI JUMPDEST PUSH2 0x1D72 JUMPI DUP1 PUSH2 0x1CA1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D68 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E8E CALLDATASIZE PUSH2 0x38F4 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1ED1 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2026 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EF9 JUMPI STOP JUMPDEST PUSH2 0x1F04 DUP2 DUP4 DUP9 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F37 PUSH2 0xF53 DUP7 DUP12 DUP15 PUSH2 0x410B JUMP JUMPDEST DUP3 PUSH2 0x1FA1 PUSH2 0x1FCD PUSH2 0x1F49 DUP10 DUP14 DUP14 PUSH2 0x410B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x39EF JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x201D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FF0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FE3 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2067 PUSH2 0x376E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20D0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x40B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21E6 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2264 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x22D2 PUSH2 0x22CD PUSH2 0x376E JUMP JUMPDEST PUSH2 0x3A94 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x235B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2302 CALLDATASIZE PUSH2 0x3885 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2332 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3A48 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23AB JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23B5 DUP2 DUP4 PUSH2 0x406D JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x241E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x236A JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2483 CALLDATASIZE PUSH2 0x37E2 JUMP JUMPDEST PUSH2 0x248B PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2535 JUMPI JUMPDEST POP POP PUSH2 0x2511 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2519 JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x252C PUSH1 0x20 DUP7 PUSH2 0x39EF JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4495 JUMP JUMPDEST PUSH2 0x253E SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24E2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x257F PUSH2 0x376E JUMP JUMPDEST PUSH2 0x25AB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3FAB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x260F PUSH2 0x3791 JUMP JUMPDEST PUSH2 0x2617 PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x26CA JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x28BB JUMPI JUMPDEST ISZERO PUSH2 0x2885 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x28A8 JUMPI PUSH2 0x28A2 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3EA7 JUMP JUMPDEST DIV PUSH2 0x2855 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x28B6 SWAP3 DIV PUSH2 0x3EA7 JUMP JUMPDEST PUSH2 0x2855 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2848 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x28D4 CALLDATASIZE PUSH2 0x37E2 JUMP JUMPDEST SWAP2 PUSH2 0x28DD PUSH2 0x4301 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x295B JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST PUSH2 0x2964 SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2933 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x29A2 PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x29E1 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x2AA1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x2AC1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x335 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2B2F PUSH2 0x4301 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x32E0 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31B1 JUMPI DUP2 SWAP1 PUSH2 0x2DE0 DUP5 SLOAD PUSH2 0x3C5D JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x328D JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x31EB JUMPI PUSH1 0x0 SWAP3 PUSH2 0x31E0 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH2 0x2E6B PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3C5D JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x312D JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3031 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x3026 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2E8E JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x3115 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x30DD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2EE0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x30B0 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x309C JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x31A7 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x319B JUMPI POP PUSH2 0x2E74 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x318E JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3185 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2E00 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x3275 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x323D JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2E32 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3230 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x321A JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x32D6 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x32C7 JUMPI POP PUSH2 0x2DE9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x32BA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x32AC JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2B9C JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x336C PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x3599 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BC PUSH2 0x4301 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x356B JUMPI DUP5 DUP7 EQ PUSH2 0x353D JUMPI PUSH2 0x33FC DUP2 DUP7 DUP7 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x34F1 JUMPI POP ISZERO PUSH2 0x3460 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x344C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x3423 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x34DD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x3425 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3481 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35C3 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4216 JUMP JUMPDEST DUP4 PUSH2 0x3392 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3BEE JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x4154 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x22D2 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3B64 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x371B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x370B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3767 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3708 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x393D SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3960 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x39CC SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x31B1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3A54 DUP2 PUSH2 0x3A30 JUMP JUMPDEST SWAP4 PUSH2 0x3A62 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x39EF JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3A84 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A78 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3AEC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3B39 DUP3 PUSH2 0x3AF3 JUMP JUMPDEST SWAP2 PUSH2 0x3B47 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x39EF JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3AEC JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3BE7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3AEC JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3CA6 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3C77 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3C6C JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x356B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3E75 JUMPI DUP3 PUSH2 0x3D24 SWAP2 DUP6 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x3DBA JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3D6B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3D43 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3E2F JUMPI JUMPDEST PUSH2 0x3DE3 JUMPI DUP1 PUSH2 0x3D2A JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3DD9 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3EBA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3F43 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x403F JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x4081 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x40DE JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4081 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x4168 DUP5 PUSH2 0x3C5D JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x41D6 JUMPI POP PUSH1 0x1 EQ PUSH2 0x418F JUMPI JUMPDEST POP PUSH2 0x418D SWAP3 POP SUB DUP4 PUSH2 0x39EF JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x41BA JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x418D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x4180 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x41A1 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x418D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x4180 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x42F7 JUMPI JUMPDEST PUSH2 0x423F JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x42D8 JUMPI JUMPDEST POP ISZERO PUSH2 0x42AB JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x42F1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST CODESIZE PUSH2 0x42A2 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4237 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4406 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x440B JUMPI JUMPDEST PUSH2 0x4406 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x438C JUMPI JUMPDEST POP PUSH2 0x4389 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x43E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x437F JUMP JUMPDEST PUSH2 0x4400 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST CODESIZE PUSH2 0x43E0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4348 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4440 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x443A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4507 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x456B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x45DE JUMPI JUMPDEST DUP2 PUSH2 0x4584 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x451D JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4577 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 0xC4 0xE8 0xCE CALLER EXTCODECOPY DUP7 0xCF TIMESTAMP 0xB0 0xA8 DUP7 0xB7 SELFBALANCE ADDMOD DUP4 0xA5 0xD6 DUP12 0xCE PUSH20 0xC22A66F26B2FED1106793C64736F6C634300081E STOP CALLER ","sourceMap":"2064:1887:331:-:0;;;;;;;;;;;;;-1:-1:-1;;2064:1887:331;;;;-1:-1:-1;;;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2064:1887:331;;;;;;745:39:76;;2064:1887:331;;;;;;;;745:39:76;2064:1887:331;;;;;;;;;;;;;;;;;-1:-1:-1;2064:1887:331;;;;;;-1:-1:-1;2064:1887:331;;;;;-1:-1:-1;2064:1887:331"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":14225,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":14306,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":14469,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":14580,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":14723,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":14420,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":14920,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":15149,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":16700,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":14260,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":14190,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":14123,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":14896,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":15091,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":16651,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":16039,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":16724,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":14088,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":15453,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":14831,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":17557,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":16918,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":16105,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":15342,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":17429,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":14996,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":16299,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":17153,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":16560,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":15204,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":15536,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":16493,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":16667,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10156},{"length":32,"start":15019},{"length":32,"start":17176}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461368157806306fdde0314613626578063081812fc146135c9578063095ea7b3146133355780630e07f85414612a52578063114ba8ee1461296b57806323b872dd146128c35780632a55205a146127d05780632b4c9f16146127615780632f2ff15d146125d557806340c10f191461254557806342842e0e146124755780634684d7e9146122dc578063572b6c051461229157806361ba27da146121755780636352211e146120fa57806370a082311461203057806373c8a95814611e8057806379cc679014611be25780638832e6e3146119945780638bb9c5bf146118255780638da5cb5b146117b45780638dc251e31461168757806391d14854146115ef57806395d89b41146115805780639da5e83214611456578063a0c76f62146113e5578063a22cb46514611285578063b0ccc31e14611214578063b88d4fde146110f2578063c3666c3614610eb5578063c87b56dd14610d02578063d539139314610ca9578063d547741f14610b20578063e1a8bf2c14610ae4578063e985e9c514610a30578063f24729651461080b578063f2fde38b14610717578063f3993d11146103915763f7ba94bd146101d457600080fd5b34610335576101e236613983565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610223614301565b9254169116908103610364575081810361033a5760005b81811061024357005b61024e81838761410b565b3573ffffffffffffffffffffffffffffffffffffffff81168091036103355761027882858761410b565b359081471061030357600080809381935af13d156102fb573d9061029b82613af3565b916102a960405193846139ef565b82523d6000602084013e5b156102c2575060010161023a565b8051156102d157602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102b4565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576103c861376e565b6103d0613791565b9060443567ffffffffffffffff8111610335576103f1903690600401613854565b926103fa614301565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610707575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106dd5761049f8382849694614415565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b878110610522578787878181141580610519575b6104d757005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104d1565b61052d81898661410b565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d57846105a6575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104bd565b740100000000000000000000000000000000000000001615801561061a575b6105cf5789610565565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105c5565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071091614216565b8582610451565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761074e61376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610778614301565b9073ffffffffffffffffffffffffffffffffffffffff808454169216828103610364575073ffffffffffffffffffffffffffffffffffffffff16918282036107bc57005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103355761081936613885565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091610844614301565b92610850848483614415565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108b55786868161087e57005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108c081888661410b565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106af57880361067d5786610959575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a40161086e565b74010000000000000000000000000000000000000000161580156109cd575b61098257886108f8565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610978565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610a6761376e565b73ffffffffffffffffffffffffffffffffffffffff610a84613791565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576020604051620186a08152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557600435610b5a613791565b610b62614301565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1457005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610df46000600435610d63817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06140b0565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610ea957600091610e21575b60405160208082528190610e1d9082018561372b565b0390f35b3d8083833e610e3081836139ef565b810190602081830312610ea15780519067ffffffffffffffff8211610ea5570181601f82011215610ea157805192610e6784613af3565b92610e7560405194856139ef565b84845260208584010111610e9e5750610e1d92610e989160208085019101613708565b90610e07565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461033557610ec3366138f4565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f08614301565b925416911690810361036457508082148015906110e8575b61033a5760005b828110610f3057005b73ffffffffffffffffffffffffffffffffffffffff610f58610f5383858a61410b565b61411b565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610ea9576000916110ba575b501561108d575073ffffffffffffffffffffffffffffffffffffffff610fe7610f5383858a61410b565b1690610ff7610f5382868961410b565b9161100382878b61410b565b3592813b1561033557606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610ea95760019261107c575b5001610f27565b6000611087916139ef565b88611075565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6110db915060203d81116110e1575b6110d381836139ef565b81019061413c565b89610fbd565b503d6110c9565b5082821415610f20565b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761112961376e565b611131613791565b60443560643567ffffffffffffffff8111610335576111549036906004016137b4565b92909361115f614301565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603611204575b50506111e5848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b823b6111ed57005b611202956111fc913691613b2d565b93614495565b005b61120d91614216565b86856111b6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576112bc61376e565b6024359081151591828103610335576113b6575b73ffffffffffffffffffffffffffffffffffffffff806112ee614301565b169116918183146113885760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6113e0817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614216565b6112d0565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b346103355761146436613983565b6114967fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b90613ee9565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926114c181613a30565b946114cf60405196876139ef565b818652602086019160051b81019036821161033557915b81831061155357505050906114fc913691613a48565b918051918351830361033a5760005b83811061151457005b8061154d73ffffffffffffffffffffffffffffffffffffffff6115396001948761406d565b5116611545838961406d565b519085613fab565b0161150b565b823573ffffffffffffffffffffffffffffffffffffffff81168103610335578152602092830192016114e6565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5614154565b60405191829160208352602083019061372b565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611626613791565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576116be61376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806116fd614301565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561178a5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611880614301565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff604060002054161561194c5760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610ca4565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103355760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576119cb61376e565b6024359060443567ffffffffffffffff8111610335576119ef9036906004016137b4565b91611a1c7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b611a5c8482611a567fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611a4e614301565b973691613b2d565b94613fab565b803b611a6457005b73ffffffffffffffffffffffffffffffffffffffff806020921693611ad160405194859384937f150b7a020000000000000000000000000000000000000000000000000000000085521660048401526000602484015287604484015260806064840152608483019061372b565b03816000865af1908115610ea957600091611b63575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b3357005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611bda575b81611b7c602093836139ef565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff00000000000000000000000000000000000000000000000000000000611ae7565b5080fd5b3d9150611b6f565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557611c1961376e565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611c46614301565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff8116938415611e525773ffffffffffffffffffffffffffffffffffffffff8116809503611e205782611c9b9185614415565b15611d49575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611dbd575b611d725780611ca1565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611d68565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461033557611e8e366138f4565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611ed1614301565b92541691169081036103645750808414801590612026575b61033a5760005b848110611ef957005b611f0481838861410b565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610335576000602091611f37610f53868b8e61410b565b82611fa1611fcd611f49898d8d61410b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826139ef565b51925af115610ea9576000513d61201d5750803b155b611ff05750600101611ef0565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611fe3565b5082841415611ee9565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761206761376e565b73ffffffffffffffffffffffffffffffffffffffff8116156120d05773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06140b0565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806121e6614301565b925416911690810361036457507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161226457815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206122d26122cd61376e565b613a94565b6040519015158152f35b346103355761235b73ffffffffffffffffffffffffffffffffffffffff61230236613885565b929193906123327fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613a48565b921690811561244b5782519260005b8481106123ab575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6123b5818361406d565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff6040600020541661241e57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a40161236a565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461033557612483366137e2565b61248b614301565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603612535575b5050612511828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b803b61251957005b611202936040519361252c6020866139ef565b60008552614495565b61253e91614216565b84836124e2565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761120261257f61376e565b6125ab7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611490614301565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613fab565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043561260f613791565b612617614301565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036457507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156126ca57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610ca4565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c90801580156128bb575b15612885575050610e1d60005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e1d91620186a08210156128a8576128a290620186a092613ea7565b04612855565b620186a06128b69204613ea7565b612855565b508115612848565b34610335576112026128d4366137e2565b916128dd614301565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361295b575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613cb0565b61296491614216565b8581612933565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576129a261376e565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806129e1614301565b9254169116908103610364575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103355760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760043567ffffffffffffffff811161033557612aa19036906004016137b4565b60243567ffffffffffffffff811161033557612ac19036906004016137b4565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610335576064359373ffffffffffffffffffffffffffffffffffffffff85168503610335577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612b2f614301565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612ff4575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816132e0575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612ff4575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116131b1578190612de08454613c5d565b601f811161328d575b50600090601f83116001146131eb576000926131e0575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff81116131b157612e6b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613c5d565b601f811161312d575b506000601f82116001146130315781929394600092613026575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612ff4575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b013590508480612e8e565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b8781106131155750836001959697106130dd575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612ee0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806130b0565b9092602060018192868601358155019401910161309c565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c810191602084106131a7575b601f0160051c01905b81811061319b5750612e74565b6000815560010161318e565b9091508190613185565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612e00565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110613275575090846001959493921061323d575b505050811b019055612e32565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613230565b9193602060018192878701358155019501920161321a565b909150836000526020600020601f840160051c810191602085106132d6575b90601f859493920160051c01905b8181106132c75750612de9565b600081558493506001016132ba565b90915081906132ac565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612b9c565b346103355760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355761336c61376e565b6024359073ffffffffffffffffffffffffffffffffffffffff8116908115908115613599575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06133bc614301565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff821693841561356b5784861461353d576133fc818686614415565b156134f157501561346057740100000000000000000000000000000000000000001661344c575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583613423565b907401000000000000000000000000000000000000000082178092036134dd575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055613425565b846000526020526040600020558380613481565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6135c3907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614216565b83613392565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103355760206121576004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613bee565b346103355760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033557610e1d6115db7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4614154565b346103355760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610335576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610335576122d26020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613b64565b60005b83811061371b5750506000910152565b818101518382015260200161370b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361376781518092818752878088019101613708565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361033557565b9181601f840112156103355782359167ffffffffffffffff8311610335576020838186019501011161033557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103355760043573ffffffffffffffffffffffffffffffffffffffff81168103610335579060243573ffffffffffffffffffffffffffffffffffffffff81168103610335579060443590565b9181601f840112156103355782359167ffffffffffffffff8311610335576020808501948460051b01011161033557565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103355760043573ffffffffffffffffffffffffffffffffffffffff8116810361033557916024359067ffffffffffffffff8211610335576138f091600401613854565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff8111610335578161393d91600401613854565b9290929160243567ffffffffffffffff8111610335578161396091600401613854565b929092916044359067ffffffffffffffff8211610335576138f091600401613854565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103355760043567ffffffffffffffff811161033557816139cc91600401613854565b929092916024359067ffffffffffffffff8211610335576138f091600401613854565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176131b157604052565b67ffffffffffffffff81116131b15760051b60200190565b929190613a5481613a30565b93613a6260405195866139ef565b602085838152019160051b810192831161033557905b828210613a8457505050565b8135815260209182019101613a78565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613aec5773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116131b157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613b3982613af3565b91613b4760405193846139ef565b829481845281830111610335578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613aec577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613be75760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106af57740100000000000000000000000000000000000000001615613aec576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613ca6575b6020831014613c7757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613c6c565b909273ffffffffffffffffffffffffffffffffffffffff169283156106dd57846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561356b5773ffffffffffffffffffffffffffffffffffffffff8116809503613e755782613d249185614415565b15613dba575b5050836000528060205282604060002055828203613d6b575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613d43565b7401000000000000000000000000000000000000000016158015613e2f575b613de35780613d2a565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613dd9565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b81810292918115918404141715613eba57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613f435750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561244b57826000528060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661403f57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156140815760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156140de575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156140815760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103355790565b90816020910312610335575180151581036103355790565b906040519182600082549261416884613c5d565b80845293600181169081156141d6575060011461418f575b5061418d925003836139ef565b565b90506000929192526020600020906000915b8183106141ba57505090602061418d9282010138614180565b60209193508060019154838589010152019101909184926141a1565b6020935061418d9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138614180565b5473ffffffffffffffffffffffffffffffffffffffff1690811515806142f7575b61423f575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610ea9576000916142d8575b50156142ab5750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6142f1915060203d6020116110e1576110d381836139ef565b386142a2565b50813b1515614237565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801561440657323314801561440b575b614406577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c9080331490811561438c575b5061438957503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610ea9576000916143e7575b503861437f565b614400915060203d6020116110e1576110d381836139ef565b386143e0565b503390565b5060183610614348565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315614440575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff6040600020541638808061443a565b73ffffffffffffffffffffffffffffffffffffffff90614507826020949597969716958360405196879586957f150b7a0200000000000000000000000000000000000000000000000000000000875216600486015216602484015287604484015260806064840152608483019061372b565b03816000865af1908115610ea95760009161456b575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611b33575050565b6020813d6020116145de575b81614584602093836139ef565b81010312611bd65751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610e9e57507fffffffff0000000000000000000000000000000000000000000000000000000061451d565b3d915061457756fea2646970667358221220f7c4e8ce333c86cf42b0a886b7470883a5d68bce73c22a66f26b2fed1106793c64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3681 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x3626 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x35C9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x3335 JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2A52 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x296B JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x28C3 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x27D0 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2761 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x25D5 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2545 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2475 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x22DC JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x2291 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2175 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x20FA JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2030 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x1E80 JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1BE2 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1994 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1825 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x17B4 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1687 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x15EF JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1580 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x1456 JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x13E5 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1285 JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x1214 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x10F2 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xEB5 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD02 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCA9 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB20 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAE4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA30 JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x80B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x717 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x391 JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E2 CALLDATASIZE PUSH2 0x3983 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x223 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP2 DUP2 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x243 JUMPI STOP JUMPDEST PUSH2 0x24E DUP2 DUP4 DUP8 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x335 JUMPI PUSH2 0x278 DUP3 DUP6 DUP8 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2FB JUMPI RETURNDATASIZE SWAP1 PUSH2 0x29B DUP3 PUSH2 0x3AF3 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x39EF JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2C2 JUMPI POP PUSH1 0x1 ADD PUSH2 0x23A JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2B4 JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x3C8 PUSH2 0x376E JUMP JUMPDEST PUSH2 0x3D0 PUSH2 0x3791 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x3F1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 PUSH2 0x3FA PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x707 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6DD JUMPI PUSH2 0x49F DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4415 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x522 JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x519 JUMPI JUMPDEST PUSH2 0x4D7 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4D1 JUMP JUMPDEST PUSH2 0x52D DUP2 DUP10 DUP7 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP5 PUSH2 0x5A6 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4BD JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x61A JUMPI JUMPDEST PUSH2 0x5CF JUMPI DUP10 PUSH2 0x565 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5C5 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x710 SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x451 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x74E PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x778 PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7BC JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x819 CALLDATASIZE PUSH2 0x3885 JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x844 PUSH2 0x4301 JUMP JUMPDEST SWAP3 PUSH2 0x850 DUP5 DUP5 DUP4 PUSH2 0x4415 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8B5 JUMPI DUP7 DUP7 DUP2 PUSH2 0x87E JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8C0 DUP2 DUP9 DUP7 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6AF JUMPI DUP9 SUB PUSH2 0x67D JUMPI DUP7 PUSH2 0x959 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x86E JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9CD JUMPI JUMPDEST PUSH2 0x982 JUMPI DUP9 PUSH2 0x8F8 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x978 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xA67 PUSH2 0x376E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA84 PUSH2 0x3791 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB5A PUSH2 0x3791 JUMP JUMPDEST PUSH2 0xB62 PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC14 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xDF4 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD63 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x40B0 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE21 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE1D SWAP1 DUP3 ADD DUP6 PUSH2 0x372B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE30 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEA5 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEA1 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE67 DUP5 PUSH2 0x3AF3 JUMP JUMPDEST SWAP3 PUSH2 0xE75 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x39EF JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xE9E JUMPI POP PUSH2 0xE1D SWAP3 PUSH2 0xE98 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3708 JUMP JUMPDEST SWAP1 PUSH2 0xE07 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0xEC3 CALLDATASIZE PUSH2 0x38F4 JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF08 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x10E8 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xF30 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF58 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x410B JUMP JUMPDEST PUSH2 0x411B JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x10BA JUMPI JUMPDEST POP ISZERO PUSH2 0x108D JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFE7 PUSH2 0xF53 DUP4 DUP6 DUP11 PUSH2 0x410B JUMP JUMPDEST AND SWAP1 PUSH2 0xFF7 PUSH2 0xF53 DUP3 DUP7 DUP10 PUSH2 0x410B JUMP JUMPDEST SWAP2 PUSH2 0x1003 DUP3 DUP8 DUP12 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x335 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x107C JUMPI JUMPDEST POP ADD PUSH2 0xF27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1087 SWAP2 PUSH2 0x39EF JUMP JUMPDEST DUP9 PUSH2 0x1075 JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x10DB SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x10E1 JUMPI JUMPDEST PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x413C JUMP JUMPDEST DUP10 PUSH2 0xFBD JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x10C9 JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xF20 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1129 PUSH2 0x376E JUMP JUMPDEST PUSH2 0x1131 PUSH2 0x3791 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x1154 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x115F PUSH2 0x4301 JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x1204 JUMPI JUMPDEST POP POP PUSH2 0x11E5 DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x11ED JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP6 PUSH2 0x11FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3B2D JUMP JUMPDEST SWAP4 PUSH2 0x4495 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x120D SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x11B6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x12BC PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x13B6 JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x12EE PUSH2 0x4301 JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x1388 JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x13E0 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4216 JUMP JUMPDEST PUSH2 0x12D0 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1464 CALLDATASIZE PUSH2 0x3983 JUMP JUMPDEST PUSH2 0x1496 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST SWAP1 PUSH2 0x3EE9 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x14C1 DUP2 PUSH2 0x3A30 JUMP JUMPDEST SWAP5 PUSH2 0x14CF PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x39EF JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x335 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1553 JUMPI POP POP POP SWAP1 PUSH2 0x14FC SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3A48 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x1514 JUMPI STOP JUMPDEST DUP1 PUSH2 0x154D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1539 PUSH1 0x1 SWAP5 DUP8 PUSH2 0x406D JUMP JUMPDEST MLOAD AND PUSH2 0x1545 DUP4 DUP10 PUSH2 0x406D JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3FAB JUMP JUMPDEST ADD PUSH2 0x150B JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x14E6 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x4154 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1626 PUSH2 0x3791 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x16BE PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x16FD PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x178A JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1880 PUSH2 0x4301 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x194C JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x19CB PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x19EF SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST SWAP2 PUSH2 0x1A1C PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH2 0x1A5C DUP5 DUP3 PUSH2 0x1A56 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1A4E PUSH2 0x4301 JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3B2D JUMP JUMPDEST SWAP5 PUSH2 0x3FAB JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1A64 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1AD1 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1B63 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1BDA JUMPI JUMPDEST DUP2 PUSH2 0x1B7C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1AE7 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1B6F JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1C19 PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1C46 PUSH2 0x4301 JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x1E52 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x1E20 JUMPI DUP3 PUSH2 0x1C9B SWAP2 DUP6 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x1D49 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1DBD JUMPI JUMPDEST PUSH2 0x1D72 JUMPI DUP1 PUSH2 0x1CA1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1D68 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1E8E CALLDATASIZE PUSH2 0x38F4 JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1ED1 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2026 JUMPI JUMPDEST PUSH2 0x33A JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1EF9 JUMPI STOP JUMPDEST PUSH2 0x1F04 DUP2 DUP4 DUP9 PUSH2 0x410B JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x335 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1F37 PUSH2 0xF53 DUP7 DUP12 DUP15 PUSH2 0x410B JUMP JUMPDEST DUP3 PUSH2 0x1FA1 PUSH2 0x1FCD PUSH2 0x1F49 DUP10 DUP14 DUP14 PUSH2 0x410B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x39EF JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x201D JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1FF0 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1FE3 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x2067 PUSH2 0x376E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x20D0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x40B0 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x21E6 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2264 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x22D2 PUSH2 0x22CD PUSH2 0x376E JUMP JUMPDEST PUSH2 0x3A94 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x235B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x2302 CALLDATASIZE PUSH2 0x3885 JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x2332 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3A48 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x23AB JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x23B5 DUP2 DUP4 PUSH2 0x406D JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x241E JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x236A JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x2483 CALLDATASIZE PUSH2 0x37E2 JUMP JUMPDEST PUSH2 0x248B PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2535 JUMPI JUMPDEST POP POP PUSH2 0x2511 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2519 JUMPI STOP JUMPDEST PUSH2 0x1202 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x252C PUSH1 0x20 DUP7 PUSH2 0x39EF JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4495 JUMP JUMPDEST PUSH2 0x253E SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x24E2 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x257F PUSH2 0x376E JUMP JUMPDEST PUSH2 0x25AB PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1490 PUSH2 0x4301 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3FAB JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x260F PUSH2 0x3791 JUMP JUMPDEST PUSH2 0x2617 PUSH2 0x4301 JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x26CA JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCA4 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x28BB JUMPI JUMPDEST ISZERO PUSH2 0x2885 JUMPI POP POP PUSH2 0xE1D PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE1D SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x28A8 JUMPI PUSH2 0x28A2 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3EA7 JUMP JUMPDEST DIV PUSH2 0x2855 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x28B6 SWAP3 DIV PUSH2 0x3EA7 JUMP JUMPDEST PUSH2 0x2855 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2848 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH2 0x1202 PUSH2 0x28D4 CALLDATASIZE PUSH2 0x37E2 JUMP JUMPDEST SWAP2 PUSH2 0x28DD PUSH2 0x4301 JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x295B JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3CB0 JUMP JUMPDEST PUSH2 0x2964 SWAP2 PUSH2 0x4216 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2933 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x29A2 PUSH2 0x376E JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x29E1 PUSH2 0x4301 JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x364 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x2AA1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI PUSH2 0x2AC1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x37B4 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x335 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x335 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2B2F PUSH2 0x4301 JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x32E0 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31B1 JUMPI DUP2 SWAP1 PUSH2 0x2DE0 DUP5 SLOAD PUSH2 0x3C5D JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x328D JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x31EB JUMPI PUSH1 0x0 SWAP3 PUSH2 0x31E0 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH2 0x2E6B PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3C5D JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x312D JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3031 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x3026 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2FF4 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x2E8E JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x3115 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x30DD JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2EE0 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x30B0 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x309C JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x31A7 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x319B JUMPI POP PUSH2 0x2E74 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x318E JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x3185 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2E00 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x3275 JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x323D JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2E32 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3230 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x321A JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x32D6 JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x32C7 JUMPI POP PUSH2 0x2DE9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x32BA JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x32AC JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2B9C JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0x336C PUSH2 0x376E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x3599 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x33BC PUSH2 0x4301 JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x356B JUMPI DUP5 DUP7 EQ PUSH2 0x353D JUMPI PUSH2 0x33FC DUP2 DUP7 DUP7 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x34F1 JUMPI POP ISZERO PUSH2 0x3460 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x344C JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x3423 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x34DD JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x3425 JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3481 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x35C3 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4216 JUMP JUMPDEST DUP4 PUSH2 0x3392 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x20 PUSH2 0x2157 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3BEE JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH2 0xE1D PUSH2 0x15DB PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x4154 JUMP JUMPDEST CALLVALUE PUSH2 0x335 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI PUSH2 0x22D2 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3B64 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x371B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x370B JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x3767 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3708 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x335 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x335 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x335 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x393D SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x3960 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x335 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x335 JUMPI DUP2 PUSH2 0x39CC SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x335 JUMPI PUSH2 0x38F0 SWAP2 PUSH1 0x4 ADD PUSH2 0x3854 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x31B1 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3A54 DUP2 PUSH2 0x3A30 JUMP JUMPDEST SWAP4 PUSH2 0x3A62 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x39EF JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x335 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3A84 JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A78 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3AEC JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31B1 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3B39 DUP3 PUSH2 0x3AF3 JUMP JUMPDEST SWAP2 PUSH2 0x3B47 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x39EF JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x335 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3AEC JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3BE7 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6AF JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3AEC JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3CA6 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3C77 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3C6C JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6DD JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x356B JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x3E75 JUMPI DUP3 PUSH2 0x3D24 SWAP2 DUP6 PUSH2 0x4415 JUMP JUMPDEST ISZERO PUSH2 0x3DBA JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3D6B JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3D43 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3E2F JUMPI JUMPDEST PUSH2 0x3DE3 JUMPI DUP1 PUSH2 0x3D2A JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3DD9 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3EBA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3F43 JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x244B JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x403F JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x4081 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x40DE JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x4081 JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x335 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x335 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x4168 DUP5 PUSH2 0x3C5D JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x41D6 JUMPI POP PUSH1 0x1 EQ PUSH2 0x418F JUMPI JUMPDEST POP PUSH2 0x418D SWAP3 POP SUB DUP4 PUSH2 0x39EF JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x41BA JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x418D SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x4180 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x41A1 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x418D SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x4180 JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x42F7 JUMPI JUMPDEST PUSH2 0x423F JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x42D8 JUMPI JUMPDEST POP ISZERO PUSH2 0x42AB JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x42F1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST CODESIZE PUSH2 0x42A2 JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x4237 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4406 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x440B JUMPI JUMPDEST PUSH2 0x4406 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x438C JUMPI JUMPDEST POP PUSH2 0x4389 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x43E7 JUMPI JUMPDEST POP CODESIZE PUSH2 0x437F JUMP JUMPDEST PUSH2 0x4400 SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x10E1 JUMPI PUSH2 0x10D3 DUP2 DUP4 PUSH2 0x39EF JUMP JUMPDEST CODESIZE PUSH2 0x43E0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x4348 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x4440 JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x443A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4507 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x372B JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEA9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x456B JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1B33 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x45DE JUMPI JUMPDEST DUP2 PUSH2 0x4584 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x39EF JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1BD6 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xE9E JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x451D JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4577 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 0xC4 0xE8 0xCE CALLER EXTCODECOPY DUP7 0xCF TIMESTAMP 0xB0 0xA8 DUP7 0xB7 SELFBALANCE ADDMOD DUP4 0xA5 0xD6 DUP12 0xCE PUSH20 0xC22A66F26B2FED1106793C64736F6C634300081E STOP CALLER ","sourceMap":"2064:1887:331:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;2064:1887:331;;3668:41;;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;2064:1887:331;1845:10:192;;;;;;2064:1887:331;1857:3:192;1876:11;;;;;:::i;:::-;2064:1887:331;;;;;;;;;1898:10:192;;;;;:::i;:::-;2064:1887:331;1375:21:9;;;:30;1371:125;;2064:1887:331;1548:33:9;;;;;;;2064:1887:331;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;2064:1887:331;;1834:9:192;;1591:58:9;2064:1887:331;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;2064:1887:331;5957:19:9;2064:1887:331;;5957:19:9;2064:1887:331;;;;;1371:125:9;1455:21;;1428:57;2064:1887:331;1428:57:9;2064:1887:331;;;;;;1428:57:9;2064:1887:331;;;;1756:63:192;1793:26;2064:1887:331;1793:26:192;2064:1887:331;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;2064:1887:331;;-1:-1:-1;4538:25:42;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3668:41;;;:::i;:::-;3179:19:352;2064:1887:331;;;;;;;;2616:14:352;2612:76;;2064:1887:331;29158:19:327;;2064:1887:331;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;2064:1887:331;;12884:11:327;;2064:1887:331;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;2064:1887:331;13173:304:327;-1:-1:-1;2064:1887:331;;;13323:10:327;2064:1887:331;;;;;;;;;;;2220:8:327;;2064:1887:331;;;;;;;;;2220:8:327;;2064:1887:331;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;2064:1887:331;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;2064:1887:331;;;;;;;;;;;;;;2220:8:327;13125:27;;;2064:1887:331;13125:27:327;;2064:1887:331;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;2064:1887:331;12987:51:327;;2064:1887:331;12987:51:327;2064:1887:331;;;;;;;;;12987:51:327;12919:59;2064:1887:331;;;;12958:11:327;2064:1887:331;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;2064:1887:331;12832:34:327;2064:1887:331;;;;;;12832:34:327;12715:64;12748:31;;2064:1887:331;12748:31:327;2064:1887:331;;;;12748:31:327;12409:58;12438:29;2064:1887:331;12438:29:327;2064:1887:331;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;3668:41;;;:::i;:::-;2064:1887;;;;;;;;3205:23:42;;;3201:60;;2064:1887:331;;;3275:25:42;;;;3271:146;;2064:1887:331;3271:146:42;2220:8:327;;;;;;;;3361:45:42;2064:1887:331;3361:45:42;;2064:1887:331;;;;;;;;:::i;:::-;29158:19:327;2064:1887:331;3668:41;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;2064:1887:331;;25879:11:327;;2064:1887:331;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;2064:1887:331;26179:110:327;-1:-1:-1;2064:1887:331;26238:10:327;2064:1887:331;;;-1:-1:-1;2064:1887:331;;;;;2220:8:327;;2064:1887:331;;;25601:3:327;25638:11;;;;;:::i;:::-;2064:1887:331;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;2064:1887:331;;;;;;;;;;2414:66:327;2064:1887:331;;;2220:8:327;2064:1887:331;26123:35:327;;;;;2064:1887:331;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;2064:1887:331;25982:51:327;;2064:1887:331;25982:51:327;2064:1887:331;;;;;;;;;25982:51:327;25914:59;2064:1887:331;;;;25953:11:327;2064:1887:331;;;;;;;;;;;25943:30:327;;25914:59;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;2064:1887:331;-1:-1:-1;2064:1887:331;28718:11:327;2064:1887:331;;;;-1:-1:-1;2064:1887:331;28718:28:327;2064:1887:331;-1:-1:-1;2064:1887:331;;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;713:6:351;2064:1887:331;;;;;;;;;;;;;;;;;;:::i;:::-;3668:41;;:::i;:::-;5148:19:42;2064:1887:331;;;;;;;4503:26:42;;;4499:64;;4464:19:41;2064:1887:331;;;;;;;;;;;;;-1:-1:-1;2064:1887:331;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;1880:140:41;;2064:1887:331;1880:140:41;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;2064:1887:331;;;;1973:36:41;;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;2064:1887:331;;;1453:39:302;1863:70:327;2064:1887:331;1453:39:302;:::i;:::-;;2064:1887:331;3364:23:341;2064:1887:331;;;;3364:64:341;;;;;2064:1887:331;3364:64:341;;1603:4:302;2064:1887:331;3364:64:341;;2064:1887:331;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;2064:1887:331;3364:64:341;;;2064:1887:331;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;2064:1887:331;;;;;;;;;;;3364:64:341;2064:1887:331;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;2064:1887:331;;;3668:41;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;2064:1887:331;3852:94:192;;2064:1887:331;3972:10:192;;;;;;2064:1887:331;3984:3:192;2064:1887:331;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;2064:1887:331;;;;4058:76:192;;4108:25;2064:1887:331;4058:76:192;;2064:1887:331;4058:76:192;;;;;;;;;;;;2064:1887:331;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;2064:1887:331;4239:12:192;;;;;;:::i;:::-;2064:1887:331;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;2064:1887:331;4239:70:192;;;;;;;2064:1887:331;;;;;;;4239:70:192;;;;;2064:1887:331;4239:70:192;;4277:4;2064:1887:331;4239:70:192;;2064:1887:331;;4058:76:192;2064:1887:331;;;;;;;4239:70:192;;;;;;;2064:1887:331;4239:70:192;;;3984:3;;2064:1887:331;3961:9:192;;4239:70;2064:1887:331;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;2064:1887:331;4161:50:192;2064:1887:331;;4058:76:192;2064:1887:331;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3668:41;;;;;:::i;:::-;3179:19:352;2064:1887:331;;;;;;;;2616:14:352;2612:76;;2064:1887:331;29158:19:327;;11217:7;1863:70;;;;2064:1887:331;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;2064:1887:331;11235:101:327;11271:54;2064:1887:331;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;2064:1887:331;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;2064:1887:331;;3668:41;;;:::i;:::-;2064:1887;;;6339:18:327;;;;6335:63;;2064:1887:331;6463:42:327;6408:19;2064:1887:331;-1:-1:-1;2064:1887:331;6408:11:327;2064:1887:331;;;-1:-1:-1;2064:1887:331;;-1:-1:-1;2064:1887:331;;;;-1:-1:-1;2064:1887:331;;;;;;;;;;;;;;;;6463:42:327;2064:1887:331;6335:63:327;6366:32;;2064:1887:331;6366:32:327;2064:1887:331;;;;6366:32:327;1500:115:305;2931:8:352;668:81;2064:1887:331;2931:8:352;:::i;:::-;1500:115:305;;2064:1887:331;;;;;;;;;;;;;2991:23:341;2064:1887:331;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;2064:1887:331;3668:41;;:::i;:::-;1368:12:300;;:::i;:::-;2064:1887:331;1062:8:300;;;;:::i;:::-;2064:1887:331;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;2064:1887:331;;1062:8:300;;;;;;;;;;;2064:1887:331;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;2064:1887:331;17882:10:327;;;;;;2064:1887:331;17894:3:327;17920:13;17935:11;2064:1887:331;17920:13:327;2064:1887:331;17920:13:327;;;:::i;:::-;2064:1887:331;;17935:11:327;;;;:::i;:::-;2064:1887:331;17935:11:327;;;:::i;:::-;2064:1887:331;17871:9:327;;1062:8:300;2064:1887:331;;;;;;;;;1062:8:300;;;;;;;;;;2064:1887:331;;;;;;;;;;;;;2688:13:341;2064:1887:331;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;2064:1887:331;-1:-1:-1;2064:1887:331;;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3668:41;;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;2976:19:351;2064:1887:331;;;;;1732:22:351;1728:93;;2064:1887:331;;2220:8:327;;;;;;;2064:1887:331;;;1728:93:351;1777:33;2064:1887:331;1777:33:351;2064:1887:331;;1777:33:351;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3668:41;;:::i;:::-;2064:1887;;;;;;;;;;;;;-1:-1:-1;2064:1887:331;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;3741:25:41;3737:66;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;2064:1887:331;;;;2455:33:41;2064:1887:331;3737:66:41;2064:1887:331;3775:28:41;;;2064:1887:331;3775:28:41;2064:1887:331;;;;;;;3775:28:41;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;2064:1887:331;3668:41;;:::i;1586:12:303:-;15560:7:327;1863:70;;2064:1887:331;;3668:41;;;:::i;:::-;2064:1887;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;2064:1887:331;15578:107:327;2064:1887:331;;;;;;;;;29832:65:327;;;;;2064:1887:331;29832:65:327;;2064:1887:331;;29832:65:327;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;2064:1887:331;29832:65:327;;;;;;;;2064:1887:331;29832:65:327;;;15578:107;2064:1887:331;;;;;29832:84:327;29828:136;;2064:1887:331;29828:136:327;29925:39;2064:1887:331;29925:39:327;2064:1887:331;;;;;;29925:39:327;29832:65;2064:1887:331;29832:65:327;;2064:1887:331;29832:65:327;;;;;;2064:1887:331;29832:65:327;;;:::i;:::-;;;2064:1887:331;;;;;;;;;;;;;29832:65:327;2064:1887:331;29832:65:327;;2064:1887:331;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;2064:1887:331;3668:41;;:::i;:::-;2064:1887;;;;;;;;;;;;;30700:19:327;;;24121:64;;2064:1887:331;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;2064:1887:331;;;;;;;;;;2414:66:327;2064:1887:331;;;2220:8:327;2064:1887:331;;;24633:10:327;2064:1887:331;;;;;;;;;2220:8:327;;24674:35;;;;2064:1887:331;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;2064:1887:331;24402:51:327;;;2064:1887:331;24402:51:327;2064:1887:331;;;;;;;;;24402:51:327;24334:59;2064:1887:331;;;;24373:11:327;2064:1887:331;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;2064:1887:331;24234:34:327;2064:1887:331;;;;;;24234:34:327;24121:64;24154:31;;2064:1887:331;24154:31:327;2064:1887:331;;;;24154:31:327;2064:1887:331;;;;;;;:::i;:::-;5148:19:42;;;;2064:1887:331;;;3668:41;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;2064:1887:331;2776:90:192;;2064:1887:331;2892:10:192;;;;;;2064:1887:331;2904:3:192;2923:9;;;;;:::i;:::-;2064:1887:331;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;2064:1887:331;;;1328:43:8;;;;;;2064:1887:331;;;;1328:43:8;;;2064:1887:331;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;2064:1887:331;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;2064:1887:331;;2881:9:192;;8938:146:8;9033:40;2064:1887:331;9033:40:8;2064:1887:331;;1328:43:8;2064:1887:331;9033:40:8;8942:68;2064:1887:331;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;2064:1887:331;;-1:-1:-1;2064:1887:331;26801:10:327;2064:1887:331;;;;-1:-1:-1;2064:1887:331;;;;;;;;26724:60:327;26756:28;2064:1887:331;26756:28:327;2064:1887:331;;26756:28:327;2064:1887:331;;;;;;;;;;;;3395:39:305;2064:1887:331;;;3395:39:305;:::i;:::-;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;3668:41;;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;2976:19:351;2064:1887:331;1281:36:351;713:6;1281:36;;1277:119;;2064:1887:331;;;;;;;;;;;;;;;1277:119:351;1340:45;2064:1887:331;1340:45:351;2064:1887:331;;;;1340:45:351;2064:1887:331;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;1956:12:303;2064:1887:331;3668:41;;:::i;1956:12:303:-;2064:1887:331;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;2064:1887:331;;16512:9:327;2064:1887:331;16523:10:327;;;;;;16821:14;;;-1:-1:-1;2064:1887:331;16821:10:327;2064:1887:331;;;-1:-1:-1;2064:1887:331;;;;;2220:8:327;;2064:1887:331;;;16535:3:327;16572:11;;;;:::i;:::-;2064:1887:331;;;;;;;;;;;;;16597:72:327;;2064:1887:331;;;;;;;;;;;;;2220:8:327;16743:33;2064:1887:331;16743:33:327;;;;2064:1887:331;16512:9:327;;16597:72;16641:28;2064:1887:331;16641:28:327;2064:1887:331;;;;16641:28:327;16400:54;16429:25;2064:1887:331;16429:25:327;2064:1887:331;;16429:25:327;2064:1887:331;;;;;;;:::i;:::-;3668:41;;:::i;:::-;3179:19:352;2064:1887:331;;;;;;;;2616:14:352;2612:76;;2064:1887:331;29158:19:327;;9668:7;1863:70;;;;2064:1887:331;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;2064:1887:331;9686:99:327;9722:52;2064:1887:331;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;2064:1887:331;;;;;;;;;;;1287:7:303;2064:1887:331;;:::i;:::-;1232:12:303;2064:1887:331;3668:41;;:::i;1232:12:303:-;2064:1887:331;;;;1287:7:303;:::i;2064:1887:331:-;;;;;;;;;;;;;;;:::i;:::-;3668:41;;:::i;:::-;5148:19:42;2064:1887:331;;;;;;;4503:26:42;;;4499:64;;4464:19:41;2064:1887:331;;;;;;;;;;;;;-1:-1:-1;2064:1887:331;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;1254:25:41;1250:140;;2064:1887:331;1250:140:41;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;2064:1887:331;;;;1343:36:41;2064:1887:331;;;;;;;;;;;;;;;;941:19:75;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;2064:1887:331;2499:377:351;;;2559:17;;2064:1887:331;;2499:377:351;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;2064:1887:331;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;2064:1887:331;2499:377:351;;2607:259;713:6;2794:57;2064:1887:331;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;2064:1887:331;;;;2134:7:305;2064:1887:331;;;:::i;:::-;3668:41;;;:::i;:::-;2064:1887;;;;;;;;2616:14:352;2612:76;;2064:1887:331;29158:19:327;;2064:1887:331;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;3668:41;;;:::i;:::-;2064:1887;;;;;4503:26:42;;;4499:64;;3179:19:352;2064:1887:331;;;;2220:8:327;;;;;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3668:41;;:::i;:::-;2064:1887;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;2064:1887:331;2220:8:327;2064:1887:331;;;;1645:152:42;;2064:1887:331;-1:-1:-1;;2064:1887:331;;500:10:59;;2064:1887:331;;1124:1:42;2064:1887:331;;;;;;;;;500:10:59;2064:1887:331;;;;;;;;500:10:59;2064:1887:331;;;;;;;;500:10:59;2064:1887:331;;;;;;;;500:10:59;2064:1887:331;;;;;;;;500:10:59;2064:1887:331;;;;;;;;500:10:59;2064:1887:331;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;2064:1887:331;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;2064:1887:331;2220:8:327;2064:1887:331;583:77:341;;;;;;;;;;:::i;:::-;;;;;;2064:1887:331;583:77:341;2064:1887:331;583:77:341;;;;;;;;2064:1887:331;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;2064:1887:331;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;2064:1887:331;583:77:341;;;;;;;;;;;2064:1887:331;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;2064:1887:331;2196:23:341;2064:1887:331;;2220:8:327;;;;;;;2064:1887:331;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;2064:1887:331;2220:8:327;1124:1:42;2064:1887:331;2220:8:327;2064:1887:331;2220:8:327;;;;;;;2064:1887:331;;;896:88:181;930:54;2064:1887:331;930:54:181;2064:1887:331;;1124:1:42;2064:1887:331;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;2064:1887:331;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;2064:1887:331;583:77:341;;;;;;;;;;2064:1887:331;583:77:341;;;;;;;;;;;;;;;;;;;;;2064:1887:331;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;2064:1887:331;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;2064:1887:331;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:1887:331;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;2064:1887:331;583:77:341;2064:1887:331;;583:77:341;;;;;;;;;2064:1887:331;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;2064:1887:331;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;2064:1887:331;1740:46:42;;;;1645:152;;;;2064:1887:331;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;2064:1887:331;29158:19:327;2064:1887:331;3668:41;;:::i;:::-;2064:1887;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;2064:1887:331;5670:35:327;;2064:1887:331;5157:173:327;2064:1887:331;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;2064:1887:331;;;;;5620:11:327;2064:1887:331;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;2064:1887:331;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;2064:1887:331;5052:59:327;;;2064:1887:331;5052:59:327;2064:1887:331;;;;;;;;;5052:59:327;4927:63;4958:32;;2064:1887:331;4958:32:327;2064:1887:331;;;;4958:32:327;4802:64;4835:31;;2064:1887:331;4835:31:327;2064:1887:331;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;2064:1887:331;2931:8:352;:::i;:::-;1064:117:305;;;2064:1887:331;;;;;;;;;;;;3579:43:305;2064:1887:331;;;3579:43:305;:::i;2064:1887:331:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;2064:1887:331;1793:19:59;2064:1887:331;635:65:55;:::i;2064:1887:331:-;;;;;;;;-1:-1:-1;;2064:1887:331;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;2064:1887:331;1146:19:75;2064:1887:331;1146:53:75;;;1142:96;;2064:1887:331;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;2064:1887:331;1215:12:75;:::o;2064:1887:331:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;2064:1887:331;;;;;;:::o;1359:340:59:-;;2064:1887:331;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;2064:1887:331;500:10:59;;;;;2064:1887:331;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;2064:1887:331;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;2064:1887:331;;;28073:11:327;2064:1887:331;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;2064:1887:331;;7507:16:327;;;7503:58;;2064:1887:331;7521:1:327;2064:1887:331;;;;;7521:1:327;2064:1887:331;;;;;30700:19:327;;;7615:64;;2064:1887:331;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;2064:1887:331;;;7521:1:327;2064:1887:331;;;;;;7521:1:327;2064:1887:331;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;2064:1887:331;-1:-1:-1;2064:1887:331;;;;;-1:-1:-1;2064:1887:331;;;;;2220:8:327;;2064:1887:331;-1:-1:-1;2064:1887:331;;;;-1:-1:-1;2064:1887:331;8155:10:327;2064:1887:331;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;2064:1887:331;7896:51:327;;;7521:1;7896:51;2064:1887:331;7896:51:327;2064:1887:331;;;;;;7521:1:327;7896:51;7828:59;2064:1887:331;;7521:1:327;2064:1887:331;7867:11:327;;;2064:1887:331;;;;7521:1:327;2064:1887:331;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;2064:1887:331;;;;7521:1:327;7728:34;2064:1887:331;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;2064:1887:331;-1:-1:-1;2064:1887:331;;;;-1:-1:-1;2064:1887:331;;;;-1:-1:-1;2064:1887:331;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;2064:1887:331;3775:28:41;;-1:-1:-1;3775:28:41;2064:1887:331;3775:28:41;2064:1887:331;;;;;-1:-1:-1;3775:28:41;14035:460:327;;2064:1887:331;;14119:16:327;;;14115:54;;2064:1887:331;14133:1:327;2064:1887:331;;;;;;14133:1:327;2064:1887:331;;;14179:72:327;;14415:10;2064:1887:331;;14133:1:327;2064:1887:331;;;;;;14133:1:327;2064:1887:331;2220:8:327;2064:1887:331;-1:-1:-1;2064:1887:331;14415:10:327;2064:1887:331;;;-1:-1:-1;2064:1887:331;14415:10:327;2064:1887:331;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;2064:1887:331;;14133:1:327;14223:28;2064:1887:331;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;2064:1887:331;-1:-1:-1;2064:1887:331;;;;;-1:-1:-1;2064:1887:331;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;2064:1887:331;;-1:-1:-1;27324:31:327;2064:1887:331;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;2064:1887:331;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;2064:1887:331;-1:-1:-1;583:77:341;2064:1887:331;-1:-1:-1;2064:1887:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;2064:1887:331;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;2064:1887:331;;;3613:51:352;2064:1887:331;;3613:51:352;;;;2064:1887:331;3613:51:352;;3648:4;3613:51;;;2064:1887:331;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;2064:1887:331;;-1:-1:-1;3691:28:352;3613:51;;;;2064:1887:331;3613:51:352;2064:1887:331;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;2064:1887:331;1029:19:76;2064:1887:331;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;2064:1887:331;;;;;;1676:74:76;;;;2064:1887:331;1676:74:76;;;;;;2064:1887:331;1327:10:76;2064:1887:331;;;;1744:4:76;2064:1887:331;;;;1676:74:76;;;;;;;2064:1887:331;1676:74:76;;;1630:120;;;;;1676:74;;;;2064:1887:331;1676:74:76;2064:1887:331;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;2064:1887:331;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;2064:1887:331;;-1:-1:-1;2064:1887:331;30435:11:327;2064:1887:331;;;;-1:-1:-1;2064:1887:331;30435:27:327;2064:1887:331;-1:-1:-1;2064:1887:331;;;500:10:59;2064:1887:331;-1:-1:-1;2064:1887:331;500:10:59;;30413:49:327;;;;;29701:270;2064:1887:331;29701:270:327;2064:1887:331;29701:270:327;2064:1887:331;29701:270:327;;;;;2064:1887:331;;;;;29832:65:327;;;;;2064:1887:331;29832:65:327;;2064:1887:331;29832:65:327;;;2064:1887:331;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;2064:1887:331;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;2064:1887:331;29832:65:327;;2064:1887:331;29832:65:327;;;;;;2064:1887:331;29832:65:327;;;:::i;:::-;;;2064:1887:331;;;;;;;;;;;;;29832:65:327;2064:1887:331;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3589600","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"848","ROYALTY_FEE_DENOMINATOR()":"892","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3289","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2715","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol\":\"ERC721FullBurnProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../../base/ERC721MintableBase.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../../base/ERC721DeliverableBase.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../../base/ERC721BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullBurnProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableBase,\\n    ERC721DeliverableBase,\\n    ERC721BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC721Storage.initERC721Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x8783de6ebd00ad7e9a3d6bf78b1d88891eed5260e812d800dad8cd8eefeea1ed\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol":{"ERC721FullMintOnceBurnProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721BurntToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"wasBurnt","outputs":[{"internalType":"bool","name":"tokenWasBurnt","type":"bool"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721BurntToken(uint256)":[{"params":{"tokenId":"The identifier of the token that has been burnt before."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchBurnFrom(address,uint256[])":{"details":"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.","params":{"from":"The current tokens owner.","tokenIds":"The identifiers of the tokens to burn."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"burnFrom(address,uint256)":{"details":"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.","params":{"from":"The current token owner.","tokenId":"The identifier of the token to burn."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}},"wasBurnt(uint256)":{"params":{"tokenId":"The token identifier."},"returns":{"tokenWasBurnt":"Whether the token was burnt."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f61491938819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b0381168103607457608052604051614889908161009082396080518181816129c401528181613cc301526145850152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461389957806306fdde031461383e578063081812fc146137e1578063095ea7b31461354d5780630e07f85414612c6a578063114ba8ee14612b8357806323b872dd14612adb5780632a55205a146129e85780632b4c9f16146129795780632f2ff15d146127ed57806340c10f191461275d57806342842e0e1461268d5780634684d7e9146124c9578063572b6c051461247e57806361ba27da146123625780636352211e146122e757806370a082311461221d57806373c8a9581461206d57806379cc679014611dcf5780638832e6e314611b815780638bb9c5bf14611a125780638da5cb5b146119a15780638dc251e31461187457806391d14854146117dc57806395d89b411461176d5780639da5e832146114ec578063a0c76f621461147b578063a22cb4651461131b578063b0ccc31e146112aa578063b88d4fde14611188578063c3666c3614610f4b578063c77c695514610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613b9b565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e61456e565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387614378565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587614378565b359081471061030e57600080809381935af13d15610306573d906102a682613d0b565b916102b46040519384613c07565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d3613986565b6103db6139a9565b9060443567ffffffffffffffff8111610340576103fc903690600401613a6c565b9261040561456e565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa8382849694614682565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986614378565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b91614483565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610759613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078361456e565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613a9d565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f61456e565b9261085b848483614682565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886614378565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a72613986565b73ffffffffffffffffffffffffffffffffffffffff610a8f6139a9565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b656139a9565b610b6d61456e565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061431d565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e2890820185613943565b0390f35b3d8083833e610e3b8183613c07565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e7284613d0b565b92610e806040519485613c07565b84845260208584010111610ea95750610e2892610ea39160208085019101613920565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034057610f5936613b0c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f9e61456e565b925416911690810361036f575080821480159061117e575b6103455760005b828110610fc657005b73ffffffffffffffffffffffffffffffffffffffff610fee610fe983858a614378565b614388565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb457600091611150575b5015611123575073ffffffffffffffffffffffffffffffffffffffff61107d610fe983858a614378565b169061108d610fe9828689614378565b9161109982878b614378565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611112575b5001610fbd565b600061111d91613c07565b8861110b565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611171915060203d8111611177575b6111698183613c07565b8101906143a9565b89611053565b503d61115f565b5082821415610fb6565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111bf613986565b6111c76139a9565b60443560643567ffffffffffffffff8111610340576111ea9036906004016139cc565b9290936111f561456e565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361129a575b505061127b848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b823b61128357005b61129895611292913691613d45565b93614702565b005b6112a391614483565b868561124c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611352613986565b60243590811515918281036103405761144c575b73ffffffffffffffffffffffffffffffffffffffff8061138461456e565b1691169181831461141e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611476817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614483565b611366565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610340576114fa36613b9b565b91929161152f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b90614101565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361155a81613c48565b936115686040519586613c07565b818552602085019160051b81019036821161034057915b8183106117405750505090611595913691613c60565b9181519280518403610345577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115d057005b73ffffffffffffffffffffffffffffffffffffffff6115ef82846142da565b511680156117165761160182856142da565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116e8577fdead000000000000000000000000000000000000000000000000000000000000146116ba5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115c7565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff811681036103405781526020928301920161157f565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56143c1565b604051918291602083526020830190613943565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118136139a9565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118ab613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118ea61456e565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119775773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a6d61456e565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b395760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611bb8613986565b6024359060443567ffffffffffffffff811161034057611bdc9036906004016139cc565b91611c097fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b611c498482611c437fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c3b61456e565b973691613d45565b946141c3565b803b611c5157005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cbe60405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190613943565b03816000865af1908115610eb457600091611d50575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2057005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dc7575b81611d6960209383613c07565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611cd4565b5080fd5b3d9150611d5c565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611e06613986565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e3361456e565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561203f5773ffffffffffffffffffffffffffffffffffffffff811680950361200d5782611e889185614682565b15611f36575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611faa575b611f5f5780611e8e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f55565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761207b36613b0c565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120be61456e565b925416911690810361036f5750808414801590612213575b6103455760005b8481106120e657005b6120f1818388614378565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091612124610fe9868b8e614378565b8261218e6121ba612136898d8d614378565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613c07565b51925af115610eb4576000513d61220a5750803b155b6121dd57506001016120dd565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121d0565b50828414156120d6565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612254613986565b73ffffffffffffffffffffffffffffffffffffffff8116156122bd5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061431d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123d361456e565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206124bf6124ba613986565b613cac565b6040519015158152f35b346103405761254873ffffffffffffffffffffffffffffffffffffffff6124ef36613a9d565b9291939061251f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613c60565b92169081156117165782519260005b848110612598575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125a281836142da565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661265f577fdead0000000000000000000000000000000000000000000000000000000000001461263257908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612557565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761269b366139fa565b6126a361456e565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361274d575b5050612729828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b803b61273157005b6112989360405193612744602086613c07565b60008552614702565b61275691614483565b84836126fa565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611298612797613986565b6127c37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06141c3565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004356128276139a9565b61282f61456e565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128e257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612ad3575b15612a9d575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a0821015612ac057612aba90620186a0926140bf565b04612a6d565b620186a0612ace92046140bf565b612a6d565b508115612a60565b3461034057611298612aec366139fa565b91612af561456e565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612b73575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b612b7c91614483565b8581612b4b565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612bba613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612bf961456e565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043567ffffffffffffffff811161034057612cb99036906004016139cc565b60243567ffffffffffffffff811161034057612cd99036906004016139cc565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610340576064359373ffffffffffffffffffffffffffffffffffffffff85168503610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612d4761456e565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561320c575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816134f8575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4939181101561320c575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116133c9578190612ff88454613e75565b601f81116134a5575b50600090601f8311600114613403576000926133f8575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff81116133c9576130837f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613e75565b601f8111613345575b506000601f8211600114613249578192939460009261323e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d54600181101561320c575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806130a6565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b87811061332d5750836001959697106132f5575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556130f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806132c8565b909260206001819286860135815501940191016132b4565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c810191602084106133bf575b601f0160051c01905b8181106133b3575061308c565b600081556001016133a6565b909150819061339d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780613018565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061348d5750908460019594939210613455575b505050811b01905561304a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613448565b91936020600181928787013581550195019201613432565b909150836000526020600020601f840160051c810191602085106134ee575b90601f859493920160051c01905b8181106134df5750613001565b600081558493506001016134d2565b90915081906134c4565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612db4565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057613584613986565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156137b1575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d461456e565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156137835784861461375557613614818686614682565b15613709575015613678577401000000000000000000000000000000000000000016613664575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b83600052602052806040600020558361363b565b907401000000000000000000000000000000000000000082178092036136f5575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561363d565b846000526020526040600020558380613699565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6137db907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614483565b836135aa565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613e06565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46143c1565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576124bf6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613d7c565b60005b8381106139335750506000910152565b8181015183820152602001613923565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361397f81518092818752878088019101613920565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff821161034057613b0891600401613a6c565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613b5591600401613a6c565b9290929160243567ffffffffffffffff81116103405781613b7891600401613a6c565b929092916044359067ffffffffffffffff821161034057613b0891600401613a6c565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613be491600401613a6c565b929092916024359067ffffffffffffffff821161034057613b0891600401613a6c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176133c957604052565b67ffffffffffffffff81116133c95760051b60200190565b929190613c6c81613c48565b93613c7a6040519586613c07565b602085838152019160051b810192831161034057905b828210613c9c57505050565b8135815260209182019101613c90565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613d045773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116133c957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613d5182613d0b565b91613d5f6040519384613c07565b829481845281830111610340578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613d04577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613dff5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba57740100000000000000000000000000000000000000001615613d04576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613ebe575b6020831014613e8f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613e84565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156137835773ffffffffffffffffffffffffffffffffffffffff811680950361408d5782613f3c9185614682565b15613fd2575b5050836000528060205282604060002055828203613f83575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613f5b565b7401000000000000000000000000000000000000000016158015614047575b613ffb5780613f42565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613ff1565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156140d257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561415b5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561171657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81166142ac577fdead0000000000000000000000000000000000000000000000000000000000001461427e57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156142ee5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541690811561434b575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156142ee5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b90604051918260008254926143d584613e75565b808452936001811690811561444357506001146143fc575b506143fa92500383613c07565b565b90506000929192526020600020906000915b8183106144275750509060206143fa92820101386143ed565b602091935080600191548385890101520191019091849261440e565b602093506143fa9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386143ed565b5473ffffffffffffffffffffffffffffffffffffffff169081151580614564575b6144ac575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091614545575b50156145185750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61455e915060203d602011611177576111698183613c07565b3861450f565b50813b15156144a4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614673573233148015614678575b614673577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156145f9575b506145f657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610eb457600091614654575b50386145ec565b61466d915060203d602011611177576111698183613c07565b3861464d565b503390565b50601836106145b5565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156146ad575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806146a7565b73ffffffffffffffffffffffffffffffffffffffff90614774826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190613943565b03816000865af1908115610eb4576000916147d8575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d20575050565b6020813d60201161484b575b816147f160209383613c07565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff0000000000000000000000000000000000000000000000000000000061478a565b3d91506147e456fea26469706673582212200b5f7534c65bcff6f458591b83ed9aa107bc969bc643e1b7c43969962370597a64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x4919 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x4889 SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x29C4 ADD MSTORE DUP2 DUP2 PUSH2 0x3CC3 ADD MSTORE PUSH2 0x4585 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3899 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x383E JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x37E1 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x354D JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2C6A JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2B83 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2ADB JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29E8 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2979 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27ED JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x275D JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x268D JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24C9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x247E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2362 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x221D JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x206D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DCF JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B81 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A12 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19A1 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1874 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17DC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x176D JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14EC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x147B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x131B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12AA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1188 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF4B JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3B9B JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x3D0B JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C07 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x39A9 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4682 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3A9D JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x456E JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x4682 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x39A9 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x39A9 JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x431D JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x3943 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x3D0B JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3C07 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3920 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xF59 CALLDATASIZE PUSH2 0x3B0C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF9E PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x117E JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFC6 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFEE PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x4378 JUMP JUMPDEST PUSH2 0x4388 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1150 JUMPI JUMPDEST POP ISZERO PUSH2 0x1123 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x107D PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x4378 JUMP JUMPDEST AND SWAP1 PUSH2 0x108D PUSH2 0xFE9 DUP3 DUP7 DUP10 PUSH2 0x4378 JUMP JUMPDEST SWAP2 PUSH2 0x1099 DUP3 DUP8 DUP12 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1112 JUMPI JUMPDEST POP ADD PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111D SWAP2 PUSH2 0x3C07 JUMP JUMPDEST DUP9 PUSH2 0x110B JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1171 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1177 JUMPI JUMPDEST PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x43A9 JUMP JUMPDEST DUP10 PUSH2 0x1053 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x115F JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFB6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x11BF PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x11C7 PUSH2 0x39A9 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x11EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11F5 PUSH2 0x456E JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x129A JUMPI JUMPDEST POP POP PUSH2 0x127B DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1283 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP6 PUSH2 0x1292 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3D45 JUMP JUMPDEST SWAP4 PUSH2 0x4702 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12A3 SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x124C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1352 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x144C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1384 PUSH2 0x456E JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x141E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1476 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4483 JUMP JUMPDEST PUSH2 0x1366 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x14FA CALLDATASIZE PUSH2 0x3B9B JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x152F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH2 0x4101 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x155A DUP2 PUSH2 0x3C48 JUMP JUMPDEST SWAP4 PUSH2 0x1568 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C07 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1740 JUMPI POP POP POP SWAP1 PUSH2 0x1595 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3C60 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x345 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15D0 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EF DUP3 DUP5 PUSH2 0x42DA JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1716 JUMPI PUSH2 0x1601 DUP3 DUP6 PUSH2 0x42DA JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16E8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16BA JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15C7 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x157F JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x43C1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1813 PUSH2 0x39A9 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x18AB PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18EA PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1977 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A6D PUSH2 0x456E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B39 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1BB8 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x1BDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST SWAP2 PUSH2 0x1C09 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH2 0x1C49 DUP5 DUP3 PUSH2 0x1C43 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C3B PUSH2 0x456E JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3D45 JUMP JUMPDEST SWAP5 PUSH2 0x41C3 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C51 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CBE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D50 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DC7 JUMPI JUMPDEST DUP2 PUSH2 0x1D69 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CD4 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D5C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1E06 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E33 PUSH2 0x456E JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x203F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x200D JUMPI DUP3 PUSH2 0x1E88 SWAP2 DUP6 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x1F36 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FAA JUMPI JUMPDEST PUSH2 0x1F5F JUMPI DUP1 PUSH2 0x1E8E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F55 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x207B CALLDATASIZE PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20BE PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2213 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20E6 JUMPI STOP JUMPDEST PUSH2 0x20F1 DUP2 DUP4 DUP9 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2124 PUSH2 0xFE9 DUP7 DUP12 DUP15 PUSH2 0x4378 JUMP JUMPDEST DUP3 PUSH2 0x218E PUSH2 0x21BA PUSH2 0x2136 DUP10 DUP14 DUP14 PUSH2 0x4378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3C07 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x220A JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21DD JUMPI POP PUSH1 0x1 ADD PUSH2 0x20DD JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21D0 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2254 PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x431D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23D3 PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2451 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x24BF PUSH2 0x24BA PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x3CAC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2548 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24EF CALLDATASIZE PUSH2 0x3A9D JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x251F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3C60 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2598 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25A2 DUP2 DUP4 PUSH2 0x42DA JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x265F JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2632 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2557 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x269B CALLDATASIZE PUSH2 0x39FA JUMP JUMPDEST PUSH2 0x26A3 PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x274D JUMPI JUMPDEST POP POP PUSH2 0x2729 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2731 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2744 PUSH1 0x20 DUP7 PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4702 JUMP JUMPDEST PUSH2 0x2756 SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26FA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2797 PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x27C3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x41C3 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2827 PUSH2 0x39A9 JUMP JUMPDEST PUSH2 0x282F PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28E2 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2AD3 JUMPI JUMPDEST ISZERO PUSH2 0x2A9D JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2AC0 JUMPI PUSH2 0x2ABA SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x40BF JUMP JUMPDEST DIV PUSH2 0x2A6D JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2ACE SWAP3 DIV PUSH2 0x40BF JUMP JUMPDEST PUSH2 0x2A6D JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2A60 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2AEC CALLDATASIZE PUSH2 0x39FA JUMP JUMPDEST SWAP2 PUSH2 0x2AF5 PUSH2 0x456E JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B73 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST PUSH2 0x2B7C SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2B4B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2BBA PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2BF9 PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2CB9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2CD9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x340 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2D47 PUSH2 0x456E JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x34F8 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x33C9 JUMPI DUP2 SWAP1 PUSH2 0x2FF8 DUP5 SLOAD PUSH2 0x3E75 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x34A5 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3403 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x33F8 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH2 0x3083 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3E75 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3345 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3249 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x323E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x30A6 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x332D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x32F5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x30F8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x32C8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x32B4 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x33BF JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x33B3 JUMPI POP PUSH2 0x308C JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x33A6 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x339D JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x3018 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x348D JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x3455 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x304A JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3448 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x3432 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x34EE JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x34DF JUMPI POP PUSH2 0x3001 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x34D2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x34C4 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2DB4 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3584 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x37B1 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D4 PUSH2 0x456E JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3783 JUMPI DUP5 DUP7 EQ PUSH2 0x3755 JUMPI PUSH2 0x3614 DUP2 DUP7 DUP7 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x3709 JUMPI POP ISZERO PUSH2 0x3678 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x3664 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x363B JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x36F5 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x363D JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3699 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x37DB SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4483 JUMP JUMPDEST DUP4 PUSH2 0x35AA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3E06 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x43C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x24BF PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3D7C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3933 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3923 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x397F DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3920 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3B55 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3B78 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3BE4 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x33C9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3C6C DUP2 PUSH2 0x3C48 JUMP JUMPDEST SWAP4 PUSH2 0x3C7A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3C9C JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C90 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3D04 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3D51 DUP3 PUSH2 0x3D0B JUMP JUMPDEST SWAP2 PUSH2 0x3D5F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C07 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3D04 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3DFF JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3D04 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3EBE JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3E8F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3E84 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3783 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x408D JUMPI DUP3 PUSH2 0x3F3C SWAP2 DUP6 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x3FD2 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3F83 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3F5B JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x4047 JUMPI JUMPDEST PUSH2 0x3FFB JUMPI DUP1 PUSH2 0x3F42 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3FF1 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x40D2 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x415B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x42AC JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x427E JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x42EE JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x434B JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x42EE JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x43D5 DUP5 PUSH2 0x3E75 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x4443 JUMPI POP PUSH1 0x1 EQ PUSH2 0x43FC JUMPI JUMPDEST POP PUSH2 0x43FA SWAP3 POP SUB DUP4 PUSH2 0x3C07 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4427 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x43FA SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x43ED JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x440E JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x43FA SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x43ED JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4564 JUMPI JUMPDEST PUSH2 0x44AC JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4545 JUMPI JUMPDEST POP ISZERO PUSH2 0x4518 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x455E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST CODESIZE PUSH2 0x450F JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x44A4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4673 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4678 JUMPI JUMPDEST PUSH2 0x4673 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x45F9 JUMPI JUMPDEST POP PUSH2 0x45F6 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4654 JUMPI JUMPDEST POP CODESIZE PUSH2 0x45EC JUMP JUMPDEST PUSH2 0x466D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST CODESIZE PUSH2 0x464D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x45B5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x46AD JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x46A7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4774 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x47D8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x484B JUMPI JUMPDEST DUP2 PUSH2 0x47F1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x478A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x47E4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND PUSH0 PUSH22 0x34C65BCFF6F458591B83ED9AA107BC969BC643E1B7C4 CODECOPY PUSH10 0x962370597A64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"2080:1903:332:-:0;;;;;;;;;;;;;-1:-1:-1;;2080:1903:332;;;;-1:-1:-1;;;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2080:1903:332;;;;;;745:39:76;;2080:1903:332;;;;;;;;745:39:76;2080:1903:332;;;;;;;;;;;;;;;;;-1:-1:-1;2080:1903:332;;;;;;-1:-1:-1;2080:1903:332;;;;;-1:-1:-1;2080:1903:332"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":14726,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":14842,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_addresst_array_uint256_dyn_calldata":{"entryPoint":15005,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":15116,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":15259,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":14956,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":15456,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":15685,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":17321,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":14796,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":14761,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":14659,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":15432,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":15627,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":17272,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":16575,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":17345,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":14624,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":15989,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":15367,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":18178,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":17539,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":16641,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":15878,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":18050,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":15532,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mintOnce":{"entryPoint":16835,"id":34233,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":17774,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":17181,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":15740,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":16072,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":17114,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":17288,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":10692},{"length":32,"start":15555},{"length":32,"start":17797}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461389957806306fdde031461383e578063081812fc146137e1578063095ea7b31461354d5780630e07f85414612c6a578063114ba8ee14612b8357806323b872dd14612adb5780632a55205a146129e85780632b4c9f16146129795780632f2ff15d146127ed57806340c10f191461275d57806342842e0e1461268d5780634684d7e9146124c9578063572b6c051461247e57806361ba27da146123625780636352211e146122e757806370a082311461221d57806373c8a9581461206d57806379cc679014611dcf5780638832e6e314611b815780638bb9c5bf14611a125780638da5cb5b146119a15780638dc251e31461187457806391d14854146117dc57806395d89b411461176d5780639da5e832146114ec578063a0c76f621461147b578063a22cb4651461131b578063b0ccc31e146112aa578063b88d4fde14611188578063c3666c3614610f4b578063c77c695514610ec0578063c87b56dd14610d0d578063d539139314610cb4578063d547741f14610b2b578063e1a8bf2c14610aef578063e985e9c514610a3b578063f247296514610816578063f2fde38b14610722578063f3993d111461039c5763f7ba94bd146101df57600080fd5b34610340576101ed36613b9b565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061022e61456e565b925416911690810361036f57508181036103455760005b81811061024e57005b610259818387614378565b3573ffffffffffffffffffffffffffffffffffffffff811680910361034057610283828587614378565b359081471061030e57600080809381935af13d15610306573d906102a682613d0b565b916102b46040519384613c07565b82523d6000602084013e5b156102cd5750600101610245565b8051156102dc57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b6060906102bf565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576103d3613986565b6103db6139a9565b9060443567ffffffffffffffff8111610340576103fc903690600401613a6c565b9261040561456e565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff821603610712575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106e8576104aa8382849694614682565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061052d578787878181141580610524575b6104e257005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104dc565b610538818986614378565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba57880361068857846105b1575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104c8565b7401000000000000000000000000000000000000000016158015610625575b6105da5789610570565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105d0565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b61071b91614483565b858261045c565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610759613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc9061078361456e565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361036f575073ffffffffffffffffffffffffffffffffffffffff16918282036107c757005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b346103405761082436613a9d565b917fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09161084f61456e565b9261085b848483614682565b9373ffffffffffffffffffffffffffffffffffffffff600095159416945b8681106108c05786868161088957005b6000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154039055600080f35b6108cb818886614378565b35806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106ba5788036106885786610964575b509081600192600052846020527fdead0000000000000000000000000000000000000000000000000000000000006040600020556000887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a401610879565b74010000000000000000000000000000000000000000161580156109d8575b61098d5788610903565b8673ffffffffffffffffffffffffffffffffffffffff847fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff84161415610983565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610a72613986565b73ffffffffffffffffffffffffffffffffffffffff610a8f6139a9565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576020604051620186a08152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057600435610b656139a9565b610b6d61456e565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416610c1f57005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610dff6000600435610d6e817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061431d565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610eb457600091610e2c575b60405160208082528190610e2890820185613943565b0390f35b3d8083833e610e3b8183613c07565b810190602081830312610eac5780519067ffffffffffffffff8211610eb0570181601f82011215610eac57805192610e7284613d0b565b92610e806040519485613c07565b84845260208584010111610ea95750610e2892610ea39160208085019101613920565b90610e12565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c060043560005260205260207fdead00000000000000000000000000000000000000000000000000000000000060406000205414604051908152f35b3461034057610f5936613b0c565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610f9e61456e565b925416911690810361036f575080821480159061117e575b6103455760005b828110610fc657005b73ffffffffffffffffffffffffffffffffffffffff610fee610fe983858a614378565b614388565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610eb457600091611150575b5015611123575073ffffffffffffffffffffffffffffffffffffffff61107d610fe983858a614378565b169061108d610fe9828689614378565b9161109982878b614378565b3592813b1561034057606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610eb457600192611112575b5001610fbd565b600061111d91613c07565b8861110b565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611171915060203d8111611177575b6111698183613c07565b8101906143a9565b89611053565b503d61115f565b5082821415610fb6565b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576111bf613986565b6111c76139a9565b60443560643567ffffffffffffffff8111610340576111ea9036906004016139cc565b9290936111f561456e565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff82160361129a575b505061127b848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b823b61128357005b61129895611292913691613d45565b93614702565b005b6112a391614483565b868561124c565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611352613986565b60243590811515918281036103405761144c575b73ffffffffffffffffffffffffffffffffffffffff8061138461456e565b1691169181831461141e5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b611476817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614483565b611366565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b34610340576114fa36613b9b565b91929161152f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b90614101565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c09361155a81613c48565b936115686040519586613c07565b818552602085019160051b81019036821161034057915b8183106117405750505090611595913691613c60565b9181519280518403610345577fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1939260005b8481106115d057005b73ffffffffffffffffffffffffffffffffffffffff6115ef82846142da565b511680156117165761160182856142da565b5190816000528560205260406000205473ffffffffffffffffffffffffffffffffffffffff81166116e8577fdead000000000000000000000000000000000000000000000000000000000000146116ba5790600192918160005286602052806040600020556040600073ffffffffffffffffffffffffffffffffffffffff831681528a6020522084815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4016115c7565b507f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b823573ffffffffffffffffffffffffffffffffffffffff811681036103405781526020928301920161157f565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56143c1565b604051918291602083526020830190613943565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118136139a9565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576118ab613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806118ea61456e565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff8116156119775773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611a6d61456e565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff6040600020541615611b395760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610caf565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b346103405760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611bb8613986565b6024359060443567ffffffffffffffff811161034057611bdc9036906004016139cc565b91611c097fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b611c498482611c437fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611c3b61456e565b973691613d45565b946141c3565b803b611c5157005b73ffffffffffffffffffffffffffffffffffffffff806020921693611cbe60405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190613943565b03816000865af1908115610eb457600091611d50575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d2057005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611dc7575b81611d6960209383613c07565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff00000000000000000000000000000000000000000000000000000000611cd4565b5080fd5b3d9150611d5c565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611e06613986565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0611e3361456e565b836000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff811693841561203f5773ffffffffffffffffffffffffffffffffffffffff811680950361200d5782611e889185614682565b15611f36575b84600085858383526020527fdead00000000000000000000000000000000000000000000000000000000000060408320558082527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c1602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b7401000000000000000000000000000000000000000016158015611faa575b611f5f5780611e8e565b73ffffffffffffffffffffffffffffffffffffffff91507fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415611f55565b85857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b857fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761207b36613b0c565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806120be61456e565b925416911690810361036f5750808414801590612213575b6103455760005b8481106120e657005b6120f1818388614378565b3573ffffffffffffffffffffffffffffffffffffffff811690818103610340576000602091612124610fe9868b8e614378565b8261218e6121ba612136898d8d614378565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282613c07565b51925af115610eb4576000513d61220a5750803b155b6121dd57506001016120dd565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600114156121d0565b50828414156120d6565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612254613986565b73ffffffffffffffffffffffffffffffffffffffff8116156122bd5773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061431d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806123d361456e565b925416911690810361036f57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161245157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206124bf6124ba613986565b613cac565b6040519015158152f35b346103405761254873ffffffffffffffffffffffffffffffffffffffff6124ef36613a9d565b9291939061251f7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613c60565b92169081156117165782519260005b848110612598575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b6125a281836142da565b51806000528360205260406000205473ffffffffffffffffffffffffffffffffffffffff811661265f577fdead0000000000000000000000000000000000000000000000000000000000001461263257908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401612557565b7f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b507f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103405761269b366139fa565b6126a361456e565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff82160361274d575b5050612729828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b803b61273157005b6112989360405193612744602086613c07565b60008552614702565b61275691614483565b84836126fa565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057611298612797613986565b6127c37fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2261152961456e565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06141c3565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004356128276139a9565b61282f61456e565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361036f57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff60406000205416156128e257005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610caf565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612ad3575b15612a9d575050610e2860005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610e2891620186a0821015612ac057612aba90620186a0926140bf565b04612a6d565b620186a0612ace92046140bf565b612a6d565b508115612a60565b3461034057611298612aec366139fa565b91612af561456e565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603612b73575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613ec8565b612b7c91614483565b8581612b4b565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057612bba613986565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80612bf961456e565b925416911690810361036f575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346103405760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760043567ffffffffffffffff811161034057612cb99036906004016139cc565b60243567ffffffffffffffff811161034057612cd99036906004016139cc565b6044939193359173ffffffffffffffffffffffffffffffffffffffff83168303610340576064359373ffffffffffffffffffffffffffffffffffffffff85168503610340577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc612d4761456e565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb8354600181101561320c575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff1690816134f8575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f3f01c033909a538299eeb8bb8b7a2d8e5ca8f4a58a90fe96d157768ed92ef21780548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4939181101561320c575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff82116133c9578190612ff88454613e75565b601f81116134a5575b50600090601f8311600114613403576000926133f8575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff81116133c9576130837f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613e75565b601f8111613345575b506000601f8211600114613249578192939460009261323e575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d54600181101561320c575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806130a6565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b87811061332d5750836001959697106132f5575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5556130f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806132c8565b909260206001819286860135815501940191016132b4565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c810191602084106133bf575b601f0160051c01905b8181106133b3575061308c565b600081556001016133a6565b909150819061339d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780613018565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b81811061348d5750908460019594939210613455575b505050811b01905561304a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080613448565b91936020600181928787013581550195019201613432565b909150836000526020600020601f840160051c810191602085106134ee575b90601f859493920160051c01905b8181106134df5750613001565b600081558493506001016134d2565b90915081906134c4565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a38680612db4565b346103405760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057613584613986565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156137b1575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06135d461456e565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156137835784861461375557613614818686614682565b15613709575015613678577401000000000000000000000000000000000000000016613664575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b83600052602052806040600020558361363b565b907401000000000000000000000000000000000000000082178092036136f5575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561363d565b846000526020526040600020558380613699565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6137db907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30614483565b836135aa565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103405760206123446004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613e06565b346103405760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261034057610e286117c87f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a46143c1565b346103405760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610340576004357fffffffff0000000000000000000000000000000000000000000000000000000081168103610340576124bf6020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d613d7c565b60005b8381106139335750506000910152565b8181015183820152602001613923565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361397f81518092818752878088019101613920565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361034057565b9181601f840112156103405782359167ffffffffffffffff8311610340576020838186019501011161034057565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126103405760043573ffffffffffffffffffffffffffffffffffffffff81168103610340579060243573ffffffffffffffffffffffffffffffffffffffff81168103610340579060443590565b9181601f840112156103405782359167ffffffffffffffff8311610340576020808501948460051b01011161034057565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103405760043573ffffffffffffffffffffffffffffffffffffffff8116810361034057916024359067ffffffffffffffff821161034057613b0891600401613a6c565b9091565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613b5591600401613a6c565b9290929160243567ffffffffffffffff81116103405781613b7891600401613a6c565b929092916044359067ffffffffffffffff821161034057613b0891600401613a6c565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103405760043567ffffffffffffffff81116103405781613be491600401613a6c565b929092916024359067ffffffffffffffff821161034057613b0891600401613a6c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176133c957604052565b67ffffffffffffffff81116133c95760051b60200190565b929190613c6c81613c48565b93613c7a6040519586613c07565b602085838152019160051b810192831161034057905b828210613c9c57505050565b8135815260209182019101613c90565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908115613d045773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff81116133c957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613d5182613d0b565b91613d5f6040519384613c07565b829481845281830111610340578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff000000000000000000000000000000000000000000000000000000008114613d04577f01ffc9a7000000000000000000000000000000000000000000000000000000008114613dff5760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff8116156106ba57740100000000000000000000000000000000000000001615613d04576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613ebe575b6020831014613e8f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613e84565b909273ffffffffffffffffffffffffffffffffffffffff169283156106e857846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156137835773ffffffffffffffffffffffffffffffffffffffff811680950361408d5782613f3c9185614682565b15613fd2575b5050836000528060205282604060002055828203613f83575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81540190558260005260205260406000206001815401905538613f5b565b7401000000000000000000000000000000000000000016158015614047575b613ffb5780613f42565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff82161415613ff1565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b818102929181159184041417156140d257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff604060002054161561415b5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff1690811561171657826000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff81166142ac577fdead0000000000000000000000000000000000000000000000000000000000001461427e57600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f31e8d3d50000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b80518210156142ee5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff6040600020541690811561434b575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b91908110156142ee5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff811681036103405790565b90816020910312610340575180151581036103405790565b90604051918260008254926143d584613e75565b808452936001811690811561444357506001146143fc575b506143fa92500383613c07565b565b90506000929192526020600020906000915b8183106144275750509060206143fa92820101386143ed565b602091935080600191548385890101520191019091849261440e565b602093506143fa9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386143ed565b5473ffffffffffffffffffffffffffffffffffffffff169081151580614564575b6144ac575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610eb457600091614545575b50156145185750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61455e915060203d602011611177576111698183613c07565b3861450f565b50813b15156144a4565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015614673573233148015614678575b614673577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156145f9575b506145f657503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610eb457600091614654575b50386145ec565b61466d915060203d602011611177576111698183613c07565b3861464d565b503390565b50601836106145b5565b73ffffffffffffffffffffffffffffffffffffffff80831690841614929183156146ad575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff604060002054163880806146a7565b73ffffffffffffffffffffffffffffffffffffffff90614774826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190613943565b03816000865af1908115610eb4576000916147d8575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a0200000000000000000000000000000000000000000000000000000000911603611d20575050565b6020813d60201161484b575b816147f160209383613c07565b81010312611dc35751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610ea957507fffffffff0000000000000000000000000000000000000000000000000000000061478a565b3d91506147e456fea26469706673582212200b5f7534c65bcff6f458591b83ed9aa107bc969bc643e1b7c43969962370597a64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3899 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x383E JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x37E1 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x354D JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x2C6A JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x2B83 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2ADB JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29E8 JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x2979 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x27ED JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x275D JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x268D JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x24C9 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x247E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x2362 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x22E7 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x221D JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x206D JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x1DCF JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1B81 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x1A12 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x19A1 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1874 JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x17DC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x176D JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x14EC JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x147B JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x131B JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0x12AA JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x1188 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xF4B JUMPI DUP1 PUSH4 0xC77C6955 EQ PUSH2 0xEC0 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xD0D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xCB4 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0xB2B JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0xAEF JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0xA3B JUMPI DUP1 PUSH4 0xF2472965 EQ PUSH2 0x816 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x39C JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1ED CALLDATASIZE PUSH2 0x3B9B JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x22E PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP2 DUP2 SUB PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x24E JUMPI STOP JUMPDEST PUSH2 0x259 DUP2 DUP4 DUP8 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x340 JUMPI PUSH2 0x283 DUP3 DUP6 DUP8 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x306 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x2A6 DUP3 PUSH2 0x3D0B JUMP JUMPDEST SWAP2 PUSH2 0x2B4 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C07 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2CD JUMPI POP PUSH1 0x1 ADD PUSH2 0x245 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2DC JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x2BF JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3D3 PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x3DB PUSH2 0x39A9 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x3FC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 PUSH2 0x405 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x712 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6E8 JUMPI PUSH2 0x4AA DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x4682 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x52D JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x524 JUMPI JUMPDEST PUSH2 0x4E2 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4DC JUMP JUMPDEST PUSH2 0x538 DUP2 DUP10 DUP7 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP5 PUSH2 0x5B1 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4C8 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x625 JUMPI JUMPDEST PUSH2 0x5DA JUMPI DUP10 PUSH2 0x570 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5D0 JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x71B SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x45C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x759 PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x783 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7C7 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x824 CALLDATASIZE PUSH2 0x3A9D JUMP JUMPDEST SWAP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 PUSH2 0x84F PUSH2 0x456E JUMP JUMPDEST SWAP3 PUSH2 0x85B DUP5 DUP5 DUP4 PUSH2 0x4682 JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP5 AND SWAP5 JUMPDEST DUP7 DUP2 LT PUSH2 0x8C0 JUMPI DUP7 DUP7 DUP2 PUSH2 0x889 JUMPI STOP JUMPDEST PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SUB SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x8CB DUP2 DUP9 DUP7 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x6BA JUMPI DUP9 SUB PUSH2 0x688 JUMPI DUP7 PUSH2 0x964 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x0 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 ADD PUSH2 0x879 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x9D8 JUMPI JUMPDEST PUSH2 0x98D JUMPI DUP9 PUSH2 0x903 JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND EQ ISZERO PUSH2 0x983 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xA72 PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA8F PUSH2 0x39A9 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0xB65 PUSH2 0x39A9 JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0xC1F JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xDFF PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xD6E DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x431D JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE2C JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xE28 SWAP1 DUP3 ADD DUP6 PUSH2 0x3943 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xE3B DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xEB0 JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xEAC JUMPI DUP1 MLOAD SWAP3 PUSH2 0xE72 DUP5 PUSH2 0x3D0B JUMP JUMPDEST SWAP3 PUSH2 0xE80 PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x3C07 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xEA9 JUMPI POP PUSH2 0xE28 SWAP3 PUSH2 0xEA3 SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x3920 JUMP JUMPDEST SWAP1 PUSH2 0xE12 JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD EQ PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0xF59 CALLDATASIZE PUSH2 0x3B0C JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xF9E PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0x117E JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xFC6 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xFEE PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x4378 JUMP JUMPDEST PUSH2 0x4388 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1150 JUMPI JUMPDEST POP ISZERO PUSH2 0x1123 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x107D PUSH2 0xFE9 DUP4 DUP6 DUP11 PUSH2 0x4378 JUMP JUMPDEST AND SWAP1 PUSH2 0x108D PUSH2 0xFE9 DUP3 DUP7 DUP10 PUSH2 0x4378 JUMP JUMPDEST SWAP2 PUSH2 0x1099 DUP3 DUP8 DUP12 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x340 JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x1 SWAP3 PUSH2 0x1112 JUMPI JUMPDEST POP ADD PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111D SWAP2 PUSH2 0x3C07 JUMP JUMPDEST DUP9 PUSH2 0x110B JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1171 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1177 JUMPI JUMPDEST PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x43A9 JUMP JUMPDEST DUP10 PUSH2 0x1053 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x115F JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xFB6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x11BF PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x11C7 PUSH2 0x39A9 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x11EA SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0x11F5 PUSH2 0x456E JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x129A JUMPI JUMPDEST POP POP PUSH2 0x127B DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0x1283 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP6 PUSH2 0x1292 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3D45 JUMP JUMPDEST SWAP4 PUSH2 0x4702 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x12A3 SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP7 DUP6 PUSH2 0x124C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1352 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x144C JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1384 PUSH2 0x456E JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x141E JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1476 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4483 JUMP JUMPDEST PUSH2 0x1366 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x14FA CALLDATASIZE PUSH2 0x3B9B JUMP JUMPDEST SWAP2 SWAP3 SWAP2 PUSH2 0x152F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST SWAP1 PUSH2 0x4101 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 PUSH2 0x155A DUP2 PUSH2 0x3C48 JUMP JUMPDEST SWAP4 PUSH2 0x1568 PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C07 JUMP JUMPDEST DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x340 JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1740 JUMPI POP POP POP SWAP1 PUSH2 0x1595 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3C60 JUMP JUMPDEST SWAP2 DUP2 MLOAD SWAP3 DUP1 MLOAD DUP5 SUB PUSH2 0x345 JUMPI PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 SWAP4 SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x15D0 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x15EF DUP3 DUP5 PUSH2 0x42DA JUMP JUMPDEST MLOAD AND DUP1 ISZERO PUSH2 0x1716 JUMPI PUSH2 0x1601 DUP3 DUP6 PUSH2 0x42DA JUMP JUMPDEST MLOAD SWAP1 DUP2 PUSH1 0x0 MSTORE DUP6 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x16E8 JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x16BA JUMPI SWAP1 PUSH1 0x1 SWAP3 SWAP2 DUP2 PUSH1 0x0 MSTORE DUP7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP2 MSTORE DUP11 PUSH1 0x20 MSTORE KECCAK256 DUP5 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x15C7 JUMP JUMPDEST POP PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x157F JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x43C1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1813 PUSH2 0x39A9 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x18AB PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x18EA PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1977 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A6D PUSH2 0x456E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B39 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1BB8 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x1BDC SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST SWAP2 PUSH2 0x1C09 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH2 0x1C49 DUP5 DUP3 PUSH2 0x1C43 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1C3B PUSH2 0x456E JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3D45 JUMP JUMPDEST SWAP5 PUSH2 0x41C3 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1C51 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1CBE PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1D50 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1DC7 JUMPI JUMPDEST DUP2 PUSH2 0x1D69 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x1CD4 JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1D5C JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1E06 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x1E33 PUSH2 0x456E JUMP JUMPDEST DUP4 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x203F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x200D JUMPI DUP3 PUSH2 0x1E88 SWAP2 DUP6 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x1F36 JUMPI JUMPDEST DUP5 PUSH1 0x0 DUP6 DUP6 DUP4 DUP4 MSTORE PUSH1 0x20 MSTORE PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP4 KECCAK256 SSTORE DUP1 DUP3 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP3 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP3 DUP1 LOG4 STOP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x1FAA JUMPI JUMPDEST PUSH2 0x1F5F JUMPI DUP1 PUSH2 0x1E8E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 POP PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x1F55 JUMP JUMPDEST DUP6 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP6 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x207B CALLDATASIZE PUSH2 0x3B0C JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20BE PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x2213 JUMPI JUMPDEST PUSH2 0x345 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x20E6 JUMPI STOP JUMPDEST PUSH2 0x20F1 DUP2 DUP4 DUP9 PUSH2 0x4378 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x340 JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x2124 PUSH2 0xFE9 DUP7 DUP12 DUP15 PUSH2 0x4378 JUMP JUMPDEST DUP3 PUSH2 0x218E PUSH2 0x21BA PUSH2 0x2136 DUP10 DUP14 DUP14 PUSH2 0x4378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x3C07 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x220A JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x21DD JUMPI POP PUSH1 0x1 ADD PUSH2 0x20DD JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x21D0 JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x20D6 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2254 PUSH2 0x3986 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x22BD JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x431D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x23D3 PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x2451 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x24BF PUSH2 0x24BA PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x3CAC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x2548 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x24EF CALLDATASIZE PUSH2 0x3A9D JUMP JUMPDEST SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x251F PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3C60 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x2598 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x25A2 DUP2 DUP4 PUSH2 0x42DA JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x265F JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x2632 JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x2557 JUMP JUMPDEST PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x269B CALLDATASIZE PUSH2 0x39FA JUMP JUMPDEST PUSH2 0x26A3 PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x274D JUMPI JUMPDEST POP POP PUSH2 0x2729 DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2731 JUMPI STOP JUMPDEST PUSH2 0x1298 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x2744 PUSH1 0x20 DUP7 PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x4702 JUMP JUMPDEST PUSH2 0x2756 SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x26FA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2797 PUSH2 0x3986 JUMP JUMPDEST PUSH2 0x27C3 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1529 PUSH2 0x456E JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x41C3 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x2827 PUSH2 0x39A9 JUMP JUMPDEST PUSH2 0x282F PUSH2 0x456E JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x28E2 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xCAF JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2AD3 JUMPI JUMPDEST ISZERO PUSH2 0x2A9D JUMPI POP POP PUSH2 0xE28 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xE28 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2AC0 JUMPI PUSH2 0x2ABA SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x40BF JUMP JUMPDEST DIV PUSH2 0x2A6D JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2ACE SWAP3 DIV PUSH2 0x40BF JUMP JUMPDEST PUSH2 0x2A6D JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x2A60 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH2 0x1298 PUSH2 0x2AEC CALLDATASIZE PUSH2 0x39FA JUMP JUMPDEST SWAP2 PUSH2 0x2AF5 PUSH2 0x456E JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x2B73 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3EC8 JUMP JUMPDEST PUSH2 0x2B7C SWAP2 PUSH2 0x4483 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x2B4B JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x2BBA PUSH2 0x3986 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x2BF9 PUSH2 0x456E JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x36F JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2CB9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI PUSH2 0x2CD9 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x39CC JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x340 JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x340 JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x2D47 PUSH2 0x456E JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x34F8 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x3F01C033909A538299EEB8BB8B7A2D8E5CA8F4A58A90FE96D157768ED92EF217 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x33C9 JUMPI DUP2 SWAP1 PUSH2 0x2FF8 DUP5 SLOAD PUSH2 0x3E75 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x34A5 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x3403 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x33F8 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH2 0x3083 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3E75 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x3345 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x3249 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x323E JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x320C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x30A6 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x332D JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x32F5 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x30F8 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x32C8 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x32B4 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x33BF JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x33B3 JUMPI POP PUSH2 0x308C JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x33A6 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x339D JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x3018 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x348D JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x3455 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x304A JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x3448 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x3432 JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x34EE JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x34DF JUMPI POP PUSH2 0x3001 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x34D2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x34C4 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x2DB4 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0x3584 PUSH2 0x3986 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x37B1 JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x35D4 PUSH2 0x456E JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x3783 JUMPI DUP5 DUP7 EQ PUSH2 0x3755 JUMPI PUSH2 0x3614 DUP2 DUP7 DUP7 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x3709 JUMPI POP ISZERO PUSH2 0x3678 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x3664 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x363B JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x36F5 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x363D JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x3699 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x37DB SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x4483 JUMP JUMPDEST DUP4 PUSH2 0x35AA JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x20 PUSH2 0x2344 PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3E06 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH2 0xE28 PUSH2 0x17C8 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x43C1 JUMP JUMPDEST CALLVALUE PUSH2 0x340 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI PUSH2 0x24BF PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x3D7C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3933 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3923 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x397F DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x3920 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x340 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x340 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x340 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP4 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3B55 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3B78 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x340 JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x340 JUMPI DUP2 PUSH2 0x3BE4 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x340 JUMPI PUSH2 0x3B08 SWAP2 PUSH1 0x4 ADD PUSH2 0x3A6C JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x33C9 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x3C6C DUP2 PUSH2 0x3C48 JUMP JUMPDEST SWAP4 PUSH2 0x3C7A PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x3C07 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x340 JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x3C9C JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C90 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x3D04 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x33C9 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3D51 DUP3 PUSH2 0x3D0B JUMP JUMPDEST SWAP2 PUSH2 0x3D5F PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x3C07 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x340 JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3D04 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x3DFF JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x6BA JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x3D04 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3EBE JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3E8F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3E84 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6E8 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x3783 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x408D JUMPI DUP3 PUSH2 0x3F3C SWAP2 DUP6 PUSH2 0x4682 JUMP JUMPDEST ISZERO PUSH2 0x3FD2 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3F83 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x3F5B JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x4047 JUMPI JUMPDEST PUSH2 0x3FFB JUMPI DUP1 PUSH2 0x3F42 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x3FF1 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x40D2 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x415B JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1716 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x42AC JUMPI PUSH32 0xDEAD000000000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x427E JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x31E8D3D500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x42EE JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x434B JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x42EE JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x340 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x340 JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x43D5 DUP5 PUSH2 0x3E75 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x4443 JUMPI POP PUSH1 0x1 EQ PUSH2 0x43FC JUMPI JUMPDEST POP PUSH2 0x43FA SWAP3 POP SUB DUP4 PUSH2 0x3C07 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x4427 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x43FA SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x43ED JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x440E JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x43FA SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x43ED JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x4564 JUMPI JUMPDEST PUSH2 0x44AC JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4545 JUMPI JUMPDEST POP ISZERO PUSH2 0x4518 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x455E SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST CODESIZE PUSH2 0x450F JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x44A4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4673 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4678 JUMPI JUMPDEST PUSH2 0x4673 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x45F9 JUMPI JUMPDEST POP PUSH2 0x45F6 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4654 JUMPI JUMPDEST POP CODESIZE PUSH2 0x45EC JUMP JUMPDEST PUSH2 0x466D SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1177 JUMPI PUSH2 0x1169 DUP2 DUP4 PUSH2 0x3C07 JUMP JUMPDEST CODESIZE PUSH2 0x464D JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x45B5 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x46AD JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x46A7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4774 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3943 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xEB4 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x47D8 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x1D20 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x484B JUMPI JUMPDEST DUP2 PUSH2 0x47F1 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x3C07 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x1DC3 JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xEA9 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x478A JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x47E4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND PUSH0 PUSH22 0x34C65BCFF6F458591B83ED9AA107BC969BC643E1B7C4 CODECOPY PUSH10 0x962370597A64736F6C63 NUMBER STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"2080:1903:332:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;2080:1903:332;;3700:41;;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;2080:1903:332;1845:10:192;;;;;;2080:1903:332;1857:3:192;1876:11;;;;;:::i;:::-;2080:1903:332;;;;;;;;;1898:10:192;;;;;:::i;:::-;2080:1903:332;1375:21:9;;;:30;1371:125;;2080:1903:332;1548:33:9;;;;;;;2080:1903:332;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;2080:1903:332;;1834:9:192;;1591:58:9;2080:1903:332;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;2080:1903:332;5957:19:9;2080:1903:332;;5957:19:9;2080:1903:332;;;;;1371:125:9;1455:21;;1428:57;2080:1903:332;1428:57:9;2080:1903:332;;;;;;1428:57:9;2080:1903:332;;;;1756:63:192;1793:26;2080:1903:332;1793:26:192;2080:1903:332;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;2080:1903:332;;-1:-1:-1;4538:25:42;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3700:41;;;:::i;:::-;3179:19:352;2080:1903:332;;;;;;;;2616:14:352;2612:76;;2080:1903:332;29158:19:327;;2080:1903:332;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;2080:1903:332;;12884:11:327;;2080:1903:332;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;2080:1903:332;13173:304:327;-1:-1:-1;2080:1903:332;;;13323:10:327;2080:1903:332;;;;;;;;;;;2220:8:327;;2080:1903:332;;;;;;;;;2220:8:327;;2080:1903:332;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;2080:1903:332;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;2080:1903:332;;;;;;;;;;;;;;2220:8:327;13125:27;;;2080:1903:332;13125:27:327;;2080:1903:332;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;2080:1903:332;12987:51:327;;2080:1903:332;12987:51:327;2080:1903:332;;;;;;;;;12987:51:327;12919:59;2080:1903:332;;;;12958:11:327;2080:1903:332;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;2080:1903:332;12832:34:327;2080:1903:332;;;;;;12832:34:327;12715:64;12748:31;;2080:1903:332;12748:31:327;2080:1903:332;;;;12748:31:327;12409:58;12438:29;2080:1903:332;12438:29:327;2080:1903:332;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;3700:41;;;:::i;:::-;2080:1903;;;;;;;;3205:23:42;;;3201:60;;2080:1903:332;;;3275:25:42;;;;3271:146;;2080:1903:332;3271:146:42;2220:8:327;;;;;;;;3361:45:42;2080:1903:332;3361:45:42;;2080:1903:332;;;;;;;;:::i;:::-;29158:19:327;2080:1903:332;3700:41;;;:::i;:::-;25490:30:327;;;;;;:::i;:::-;25578:9;2080:1903:332;;25879:11:327;;2080:1903:332;;25573:596:327;25589:10;;;;;;26183:11;;;26179:110;;2080:1903:332;26179:110:327;-1:-1:-1;2080:1903:332;26238:10:327;2080:1903:332;;;-1:-1:-1;2080:1903:332;;;;;2220:8:327;;2080:1903:332;;;25601:3:327;25638:11;;;;;:::i;:::-;2080:1903:332;;;;;;;;;;;;;;30700:19:327;;25710:64;;25792:26;;25788:73;;25875:173;;;25601:3;2080:1903:332;;;;;;;;;;2414:66:327;2080:1903:332;;;2220:8:327;2080:1903:332;26123:35:327;;;;;2080:1903:332;25578:9:327;;25875:173;2220:8;30979:33;:38;;;25914:59;;25875:173;25910:123;;25875:173;;;25910:123;25982:51;2080:1903:332;25982:51:327;;2080:1903:332;25982:51:327;2080:1903:332;;;;;;;;;25982:51:327;25914:59;2080:1903:332;;;;25953:11:327;2080:1903:332;;;;;;;;;;;25943:30:327;;25914:59;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;2080:1903:332;-1:-1:-1;2080:1903:332;28718:11:327;2080:1903:332;;;;-1:-1:-1;2080:1903:332;28718:28:327;2080:1903:332;-1:-1:-1;2080:1903:332;;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;713:6:351;2080:1903:332;;;;;;;;;;;;;;;;;;:::i;:::-;3700:41;;:::i;:::-;5148:19:42;2080:1903:332;;;;;;;4503:26:42;;;4499:64;;4464:19:41;2080:1903:332;;;;;;;;;;;;;-1:-1:-1;2080:1903:332;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;1880:140:41;;2080:1903:332;1880:140:41;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;2080:1903:332;;;;1973:36:41;;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;2080:1903:332;;;1453:39:302;1863:70:327;2080:1903:332;1453:39:302;:::i;:::-;;2080:1903:332;3364:23:341;2080:1903:332;;;;3364:64:341;;;;;2080:1903:332;3364:64:341;;1603:4:302;2080:1903:332;3364:64:341;;2080:1903:332;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;2080:1903:332;3364:64:341;;;2080:1903:332;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;2080:1903:332;;;;;;;;;;;3364:64:341;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:66:327;2080:1903:332;;;;30830:32:327;2080:1903:332;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;2080:1903:332;;;3700:41;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;2080:1903:332;3852:94:192;;2080:1903:332;3972:10:192;;;;;;2080:1903:332;3984:3:192;2080:1903:332;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;2080:1903:332;;;;4058:76:192;;4108:25;2080:1903:332;4058:76:192;;2080:1903:332;4058:76:192;;;;;;;;;;;;2080:1903:332;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;2080:1903:332;4239:12:192;;;;;;:::i;:::-;2080:1903:332;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;2080:1903:332;4239:70:192;;;;;;;2080:1903:332;;;;;;;4239:70:192;;;;;2080:1903:332;4239:70:192;;4277:4;2080:1903:332;4239:70:192;;2080:1903:332;;4058:76:192;2080:1903:332;;;;;;;4239:70:192;;;;;;;2080:1903:332;4239:70:192;;;3984:3;;2080:1903:332;3961:9:192;;4239:70;2080:1903:332;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;2080:1903:332;4161:50:192;2080:1903:332;;4058:76:192;2080:1903:332;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3700:41;;;;;:::i;:::-;3179:19:352;2080:1903:332;;;;;;;;2616:14:352;2612:76;;2080:1903:332;29158:19:327;;11217:7;1863:70;;;;2080:1903:332;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;2080:1903:332;11235:101:327;11271:54;2080:1903:332;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;2080:1903:332;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;2080:1903:332;;3700:41;;;:::i;:::-;2080:1903;;;6339:18:327;;;;6335:63;;2080:1903:332;6463:42:327;6408:19;2080:1903:332;-1:-1:-1;2080:1903:332;6408:11:327;2080:1903:332;;;-1:-1:-1;2080:1903:332;;-1:-1:-1;2080:1903:332;;;;-1:-1:-1;2080:1903:332;;;;;;;;;;;;;;;;6463:42:327;2080:1903:332;6335:63:327;6366:32;;2080:1903:332;6366:32:327;2080:1903:332;;;;6366:32:327;1500:115:305;2931:8:352;668:81;2080:1903:332;2931:8:352;:::i;:::-;1500:115:305;;2080:1903:332;;;;;;;;;;;;;2991:23:341;2080:1903:332;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;1471:12:301;2080:1903:332;3700:41;;:::i;:::-;1471:12:301;;:::i;:::-;2080:1903:332;1072:8:301;;;;:::i;:::-;2080:1903:332;;;;;;;:::i;:::-;1072:8:301;;;;;;;;;;;2080:1903:332;;1072:8:301;;;;;;;;;;;2080:1903:332;;;;;;;;;:::i;:::-;;;;;;;22754:25:327;;22750:64;;23302:10;;22829:9;2080:1903:332;22840:10:327;;;;;;2080:1903:332;22852:3:327;2080:1903:332;22884:13:327;;;;:::i;:::-;2080:1903:332;;22915:16:327;;22911:54;;22998:11;;;;:::i;:::-;2080:1903:332;;;;;;1072:8:301;2080:1903:332;;;;;;;;23070:60:327;;2414:66;30830:32;23144:59;;2080:1903:332;;;;;;;;1072:8:301;2080:1903:332;;;;;2220:8:327;2080:1903:332;-1:-1:-1;2080:1903:332;;;;;;;;;;;;;2220:8:327;;2080:1903:332;23350:33:327;;;;2080:1903:332;22829:9:327;;23144:59;23178:25;;2080:1903:332;23178:25:327;2080:1903:332;;;;23178:25:327;23070:60;23102:28;;2080:1903:332;23102:28:327;2080:1903:332;;;;23102:28:327;22911:54;22940:25;2080:1903:332;22940:25:327;2080:1903:332;;22940:25:327;1072:8:301;2080:1903:332;;;;;;;;;1072:8:301;;;;;;;;;;2080:1903:332;;;;;;;;;;;;;2688:13:341;2080:1903:332;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;2080:1903:332;-1:-1:-1;2080:1903:332;;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3700:41;;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;2976:19:351;2080:1903:332;;;;;1732:22:351;1728:93;;2080:1903:332;;2220:8:327;;;;;;;2080:1903:332;;;1728:93:351;1777:33;2080:1903:332;1777:33:351;2080:1903:332;;1777:33:351;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3700:41;;:::i;:::-;2080:1903;;;;;;;;;;;;;-1:-1:-1;2080:1903:332;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;3741:25:41;3737:66;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;2080:1903:332;;;;2455:33:41;2080:1903:332;3737:66:41;2080:1903:332;3775:28:41;;;2080:1903:332;3775:28:41;2080:1903:332;;;;;;;3775:28:41;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1766:12:304;2080:1903:332;3700:41;;:::i;1766:12:304:-;20205:7:327;1863:70;;2080:1903:332;;3700:41;;;:::i;:::-;2080:1903;;;;:::i;:::-;20205:7:327;;:::i;:::-;376:58:354;;20223:107:327;;2080:1903:332;20223:107:327;2080:1903:332;;;;;;;;;29832:65:327;;;;;2080:1903:332;29832:65:327;;2080:1903:332;;29832:65:327;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;2080:1903:332;29832:65:327;;;;;;;;2080:1903:332;29832:65:327;;;20223:107;2080:1903:332;;;;;29832:84:327;29828:136;;2080:1903:332;29828:136:327;29925:39;2080:1903:332;29925:39:327;2080:1903:332;;;;;;29925:39:327;29832:65;2080:1903:332;29832:65:327;;2080:1903:332;29832:65:327;;;;;;2080:1903:332;29832:65:327;;;:::i;:::-;;;2080:1903:332;;;;;;;;;;;;;29832:65:327;2080:1903:332;29832:65:327;;2080:1903:332;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;29158:19:327;2080:1903:332;3700:41;;:::i;:::-;2080:1903;;;;;;;;;;;;;30700:19:327;;;24121:64;;2080:1903:332;;;24199:26:327;;;24195:73;;24284:30;;;;;:::i;:::-;24283:31;24279:185;;2080:1903:332;;;;;;;;;;2414:66:327;2080:1903:332;;;2220:8:327;2080:1903:332;;;24633:10:327;2080:1903:332;;;;;;;;;2220:8:327;;24674:35;;;;2080:1903:332;24279:185:327;2220:8;30979:33;:38;;;24334:59;;24279:185;24330:123;;24279:185;;;24330:123;2080:1903:332;24402:51:327;;;2080:1903:332;24402:51:327;2080:1903:332;;;;;;;;;24402:51:327;24334:59;2080:1903:332;;;;24373:11:327;2080:1903:332;;;;;;;;;;;24363:30:327;;24334:59;;24195:73;24234:34;;;2080:1903:332;24234:34:327;2080:1903:332;;;;;;24234:34:327;24121:64;24154:31;;2080:1903:332;24154:31:327;2080:1903:332;;;;24154:31:327;2080:1903:332;;;;;;;:::i;:::-;5148:19:42;;;;2080:1903:332;;;3700:41;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;2080:1903:332;2776:90:192;;2080:1903:332;2892:10:192;;;;;;2080:1903:332;2904:3:192;2923:9;;;;;:::i;:::-;2080:1903:332;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;2080:1903:332;;;1328:43:8;;;;;;2080:1903:332;;;;1328:43:8;;;2080:1903:332;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;2080:1903:332;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;2080:1903:332;;2881:9:192;;8938:146:8;9033:40;2080:1903:332;9033:40:8;2080:1903:332;;1328:43:8;2080:1903:332;9033:40:8;8942:68;2080:1903:332;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;2080:1903:332;;-1:-1:-1;2080:1903:332;26801:10:327;2080:1903:332;;;;-1:-1:-1;2080:1903:332;;;;;;;;26724:60:327;26756:28;2080:1903:332;26756:28:327;2080:1903:332;;26756:28:327;2080:1903:332;;;;;;;;;;;;3395:39:305;2080:1903:332;;;3395:39:305;:::i;:::-;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;3700:41;;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;2976:19:351;2080:1903:332;1281:36:351;713:6;1281:36;;1277:119;;2080:1903:332;;;;;;;;;;;;;;;1277:119:351;1340:45;2080:1903:332;1340:45:351;2080:1903:332;;;;1340:45:351;2080:1903:332;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;;;2233:12:304;2080:1903:332;3700:41;;:::i;2233:12:304:-;2080:1903:332;;;;;:::i;:::-;;;21151:16:327;;;21147:54;;2080:1903:332;;21259:9:327;2080:1903:332;21270:10:327;;;;;;21677:14;;;-1:-1:-1;2080:1903:332;21677:10:327;2080:1903:332;;;-1:-1:-1;2080:1903:332;;;;;2220:8:327;;2080:1903:332;;;21282:3:327;21319:11;;;;:::i;:::-;2080:1903:332;;;;;;;;;;;;;;21391:60:327;;2414:66;30830:32;21465:59;;2080:1903:332;;;;;;;;;;;;;2220:8:327;21599:33;2080:1903:332;21599:33:327;;;;2080:1903:332;21259:9:327;;21465:59;21499:25;2080:1903:332;21499:25:327;2080:1903:332;;;;21499:25:327;21391:60;21423:28;;2080:1903:332;21423:28:327;2080:1903:332;;;;21423:28:327;2080:1903:332;;;;;;;:::i;:::-;3700:41;;:::i;:::-;3179:19:352;2080:1903:332;;;;;;;;2616:14:352;2612:76;;2080:1903:332;29158:19:327;;9668:7;1863:70;;;;2080:1903:332;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;2080:1903:332;9686:99:327;9722:52;2080:1903:332;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;2080:1903:332;;;;;;;;;;;1382:7:304;2080:1903:332;;:::i;:::-;1323:12:304;2080:1903:332;3700:41;;:::i;1323:12:304:-;2080:1903:332;;;;1382:7:304;:::i;2080:1903:332:-;;;;;;;;;;;;;;;:::i;:::-;3700:41;;:::i;:::-;5148:19:42;2080:1903:332;;;;;;;4503:26:42;;;4499:64;;4464:19:41;2080:1903:332;;;;;;;;;;;;;-1:-1:-1;2080:1903:332;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;1254:25:41;1250:140;;2080:1903:332;1250:140:41;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;2080:1903:332;;;;1343:36:41;2080:1903:332;;;;;;;;;;;;;;;;941:19:75;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;2080:1903:332;2499:377:351;;;2559:17;;2080:1903:332;;2499:377:351;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;2080:1903:332;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;2080:1903:332;2499:377:351;;2607:259;713:6;2794:57;2080:1903:332;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;2080:1903:332;;;;2134:7:305;2080:1903:332;;;:::i;:::-;3700:41;;;:::i;:::-;2080:1903;;;;;;;;2616:14:352;2612:76;;2080:1903:332;29158:19:327;;2080:1903:332;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;3700:41;;;:::i;:::-;2080:1903;;;;;4503:26:42;;;4499:64;;3179:19:352;2080:1903:332;;;;2220:8:327;;;;;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3700:41;;:::i;:::-;2080:1903;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;2080:1903:332;2220:8:327;2080:1903:332;;;;1645:152:42;;2080:1903:332;-1:-1:-1;;2080:1903:332;;500:10:59;;2080:1903:332;;1124:1:42;2080:1903:332;;;;;;;;;500:10:59;2080:1903:332;;;;;;;;500:10:59;2080:1903:332;;;;;;;;500:10:59;2080:1903:332;;;;;;;;500:10:59;2080:1903:332;;;;;;;;500:10:59;2080:1903:332;;;;;;;;500:10:59;2080:1903:332;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;2080:1903:332;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;2080:1903:332;2220:8:327;2080:1903:332;583:77:341;;;;;;;;;;:::i;:::-;;;;;;2080:1903:332;583:77:341;2080:1903:332;583:77:341;;;;;;;;2080:1903:332;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;2080:1903:332;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;2080:1903:332;583:77:341;;;;;;;;;;;2080:1903:332;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;2080:1903:332;2196:23:341;2080:1903:332;;2220:8:327;;;;;;;2080:1903:332;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;2080:1903:332;2220:8:327;1124:1:42;2080:1903:332;2220:8:327;2080:1903:332;2220:8:327;;;;;;;2080:1903:332;;;896:88:181;930:54;2080:1903:332;930:54:181;2080:1903:332;;1124:1:42;2080:1903:332;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;2080:1903:332;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;2080:1903:332;583:77:341;;;;;;;;;;2080:1903:332;583:77:341;;;;;;;;;;;;;;;;;;;;;2080:1903:332;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;2080:1903:332;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;2080:1903:332;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2080:1903:332;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;2080:1903:332;583:77:341;2080:1903:332;;583:77:341;;;;;;;;;2080:1903:332;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;2080:1903:332;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;2080:1903:332;1740:46:42;;;;1645:152;;;;2080:1903:332;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;2080:1903:332;29158:19:327;2080:1903:332;3700:41;;:::i;:::-;2080:1903;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;2080:1903:332;5670:35:327;;2080:1903:332;5157:173:327;2080:1903:332;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;2080:1903:332;;;;;5620:11:327;2080:1903:332;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;2080:1903:332;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;2080:1903:332;5052:59:327;;;2080:1903:332;5052:59:327;2080:1903:332;;;;;;;;;5052:59:327;4927:63;4958:32;;2080:1903:332;4958:32:327;2080:1903:332;;;;4958:32:327;4802:64;4835:31;;2080:1903:332;4835:31:327;2080:1903:332;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;2080:1903:332;2931:8:352;:::i;:::-;1064:117:305;;;2080:1903:332;;;;;;;;;;;;3579:43:305;2080:1903:332;;;3579:43:305;:::i;2080:1903:332:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;2080:1903:332;1793:19:59;2080:1903:332;635:65:55;:::i;2080:1903:332:-;;;;;;;;-1:-1:-1;;2080:1903:332;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;2080:1903:332;1146:19:75;2080:1903:332;1146:53:75;;;1142:96;;2080:1903:332;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;2080:1903:332;1215:12:75;:::o;2080:1903:332:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;2080:1903:332;;;;;;:::o;1359:340:59:-;;2080:1903:332;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;2080:1903:332;500:10:59;;;;;2080:1903:332;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;2080:1903:332;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;2080:1903:332;;;28073:11:327;2080:1903:332;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;2080:1903:332;;7507:16:327;;;7503:58;;2080:1903:332;7521:1:327;2080:1903:332;;;;;7521:1:327;2080:1903:332;;;;;30700:19:327;;;7615:64;;2080:1903:332;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;2080:1903:332;;;7521:1:327;2080:1903:332;;;;;;7521:1:327;2080:1903:332;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;2080:1903:332;-1:-1:-1;2080:1903:332;;;;;-1:-1:-1;2080:1903:332;;;;;2220:8:327;;2080:1903:332;-1:-1:-1;2080:1903:332;;;;-1:-1:-1;2080:1903:332;8155:10:327;2080:1903:332;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;2080:1903:332;7896:51:327;;;7521:1;7896:51;2080:1903:332;7896:51:327;2080:1903:332;;;;;;7521:1:327;7896:51;7828:59;2080:1903:332;;7521:1:327;2080:1903:332;7867:11:327;;;2080:1903:332;;;;7521:1:327;2080:1903:332;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;2080:1903:332;;;;7521:1:327;7728:34;2080:1903:332;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;2080:1903:332;-1:-1:-1;2080:1903:332;;;;-1:-1:-1;2080:1903:332;;;;-1:-1:-1;2080:1903:332;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;2080:1903:332;3775:28:41;;-1:-1:-1;3775:28:41;2080:1903:332;3775:28:41;2080:1903:332;;;;;-1:-1:-1;3775:28:41;18606:565:327;;2080:1903:332;;18694:16:327;;;18690:54;;2080:1903:332;18708:1:327;2080:1903:332;;;;;18708:1:327;2080:1903:332;;;;;18798:60:327;;2414:66;30830:32;18868:59;;19091:10;2080:1903:332;;18708:1:327;2080:1903:332;;;;;;18708:1:327;2080:1903:332;2220:8:327;2080:1903:332;-1:-1:-1;2080:1903:332;19091:10:327;2080:1903:332;;;-1:-1:-1;2080:1903:332;19091:10:327;2080:1903:332;;;2220:8:327;;18708:1;19131:33;;;;18606:565::o;18868:59::-;18902:25;;18708:1;18902:25;;2080:1903:332;;18708:1:327;18902:25;18798:60;18830:28;;18708:1;18830:28;;2080:1903:332;;18708:1:327;18830:28;2080:1903:332;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;2080:1903:332;-1:-1:-1;2080:1903:332;;;;;-1:-1:-1;2080:1903:332;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;2080:1903:332;;-1:-1:-1;27324:31:327;2080:1903:332;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;2080:1903:332;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;2080:1903:332;-1:-1:-1;583:77:341;2080:1903:332;-1:-1:-1;2080:1903:332;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;2080:1903:332;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;2080:1903:332;;;3613:51:352;2080:1903:332;;3613:51:352;;;;2080:1903:332;3613:51:352;;3648:4;3613:51;;;2080:1903:332;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;2080:1903:332;;-1:-1:-1;3691:28:352;3613:51;;;;2080:1903:332;3613:51:352;2080:1903:332;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;2080:1903:332;1029:19:76;2080:1903:332;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;2080:1903:332;;;;;;1676:74:76;;;;2080:1903:332;1676:74:76;;;;;;2080:1903:332;1327:10:76;2080:1903:332;;;;1744:4:76;2080:1903:332;;;;1676:74:76;;;;;;;2080:1903:332;1676:74:76;;;1630:120;;;;;1676:74;;;;2080:1903:332;1676:74:76;2080:1903:332;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;2080:1903:332;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;2080:1903:332;;-1:-1:-1;2080:1903:332;30435:11:327;2080:1903:332;;;;-1:-1:-1;2080:1903:332;30435:27:327;2080:1903:332;-1:-1:-1;2080:1903:332;;;500:10:59;2080:1903:332;-1:-1:-1;2080:1903:332;500:10:59;;30413:49:327;;;;;29701:270;2080:1903:332;29701:270:327;2080:1903:332;29701:270:327;2080:1903:332;29701:270:327;;;;;2080:1903:332;;;;;29832:65:327;;;;;2080:1903:332;29832:65:327;;2080:1903:332;29832:65:327;;;2080:1903:332;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;2080:1903:332;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;2080:1903:332;29832:65:327;;2080:1903:332;29832:65:327;;;;;;2080:1903:332;29832:65:327;;;:::i;:::-;;;2080:1903:332;;;;;;;;;;;;;29832:65:327;2080:1903:332;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3713800","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"870","ROYALTY_FEE_DENOMINATOR()":"914","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchBurnFrom(address,uint256[])":"infinite","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","burnFrom(address,uint256)":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2961","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3311","isTrustedForwarder(address)":"infinite","metadataResolver()":"2825","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2869","owner()":"2715","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite","wasBurnt(uint256)":"3001"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchBurnFrom(address,uint256[])":"f2472965","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","burnFrom(address,uint256)":"79cc6790","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee","wasBurnt(uint256)":"c77c6955"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721BurntToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"wasBurnt\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"tokenWasBurnt\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721BurntToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that has been burnt before.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchBurnFrom(address,uint256[])\":{\"details\":\"Reverts if one of `tokenIds` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\",\"params\":{\"from\":\"The current tokens owner.\",\"tokenIds\":\"The identifiers of the tokens to burn.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"burnFrom(address,uint256)\":{\"details\":\"Reverts if `tokenId` is not owned by `from`.Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.Emits an {IERC721-Transfer} event with `to` set to the zero address.\",\"params\":{\"from\":\"The current token owner.\",\"tokenId\":\"The identifier of the token to burn.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"wasBurnt(uint256)\":{\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenWasBurnt\":\"Whether the token was burnt.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721BurntToken(uint256)\":[{\"notice\":\"Thrown when minting a token which has been burnt before (MintableOnce implementation).\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchBurnFrom(address,uint256[])\":{\"notice\":\"Burns a batch of tokens.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burns a token.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"},\"wasBurnt(uint256)\":{\"notice\":\"Gets whether a token was burnt.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol\":\"ERC721FullMintOnceBurnProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BurnableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BurnableBase is IERC721Burnable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n\\n    /// @inheritdoc IERC721Burnable\\n    function burnFrom(address from, uint256 tokenId) external virtual {\\n        ERC721Storage.layout().burnFrom(_msgSender(), from, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Burnable\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external virtual {\\n        ERC721Storage.layout().batchBurnFrom(_msgSender(), from, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd732d9c35834e72fde5afbe5da2ac3b4d84cfbc53701006528d8371a32183719\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version)\\n/// @notice ERC721Deliverable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableOnceBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableOnceBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliverOnce(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xcb45fa2eecbb4c7d71ecde708544e3d5a830fd8426ef9dc3d143f82518dc9cfd\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableOnceBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version)\\n/// @notice ERC721Mintable implementation where burnt tokens cannot be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableOnceBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mintOnce(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMintOnce(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMintOnce(to, tokenIds);\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(uint256 tokenId) external view virtual returns (bool tokenWasBurnt) {\\n        return ERC721Storage.layout().wasBurnt(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xc96d2daad83a751121cdabf98f64f6e5bd0ff027a820bff6552d4d9c6b642689\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullMintOnceBurnProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableOnceBase} from \\\"./../../base/ERC721MintableOnceBase.sol\\\";\\nimport {ERC721DeliverableOnceBase} from \\\"./../../base/ERC721DeliverableOnceBase.sol\\\";\\nimport {ERC721BurnableBase} from \\\"./../../base/ERC721BurnableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullMintOnceBurnProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableOnceBase,\\n    ERC721DeliverableOnceBase,\\n    ERC721BurnableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC721Storage.initERC721Burnable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x9b0d0339dbda93abadf89ab0264faf3638763e3e9b0d714a89b00250a4059d92\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721BurntToken(uint256)":[{"notice":"Thrown when minting a token which has been burnt before (MintableOnce implementation)."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchBurnFrom(address,uint256[])":{"notice":"Burns a batch of tokens."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"burnFrom(address,uint256)":{"notice":"Burns a token."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."},"wasBurnt(uint256)":{"notice":"Gets whether a token was burnt."}},"version":1}}},"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol":{"ERC721FullProxied":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ERC721BalanceOfAddressZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721ExistingToken","type":"error"},{"inputs":[],"name":"ERC721MintToAddressZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForApproval","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonApprovedForTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonExistingToken","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonOwnedToken","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721SafeTransferRejected","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApproval","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"ERC721SelfApprovalForAll","type":"error"},{"inputs":[],"name":"ERC721TransferToAddressZero","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"IncorrectTokenContractType","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forwarderRegistry","outputs":[{"internalType":"contract IForwarderRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"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":"hasRole_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"contract ITokenMetadataResolver","name":"metadataResolver","type":"address"},{"internalType":"contract IOperatorFilterRegistry","name":"filterRegistry","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"approvedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"contract IERC721[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"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":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"ERC721ExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that already exists."}}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"params":{"sender":"The message sender.","tokenId":"The identifier of the token."}}],"ERC721NonExistingToken(uint256)":[{"params":{"tokenId":"The identifier of the token that was checked."}}],"ERC721NonOwnedToken(address,uint256)":[{"params":{"account":"The account that was expected to own the token.","tokenId":"The identifier of the token."}}],"ERC721SafeTransferRejected(address,uint256)":[{"params":{"recipient":"The recipient contract.","tokenId":"The identifier of the token."}}],"ERC721SelfApproval(address)":[{"params":{"account":"The account trying to approve itself."}}],"ERC721SelfApprovalForAll(address)":[{"params":{"account":"The account trying to approveForAll itself."}}],"FailedCall()":[{"details":"A call to an address target failed. The target may have reverted."}],"IncorrectTokenContractType(address)":[{"params":{"tokenContract":"The token contract being recovered."}}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"InsufficientBalance(uint256,uint256)":[{"details":"The ETH balance of the account is not enough to perform the operation."}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotRoleHolder(bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role the caller is missing."}}],"OperatorNotAllowed(address)":[{"params":{"operator":"The address that is not authorized."}}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Approval(address,address,uint256)":{"params":{"approved":"The approved address.","owner":"The token owner.","tokenId":"The approved token identifier."}},"ApprovalForAll(address,address,bool)":{"params":{"approved":"True when then approval is set, false when it is unset.","operator":"The approved address.","owner":"The tokens owner."}},"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}},"RoleGranted(bytes32,address,address)":{"params":{"account":"The account that has been granted the role.","operator":"The account that granted the role.","role":"The role that has been granted."}},"RoleRevoked(bytes32,address,address)":{"params":{"account":"The account that has been revoked the role.","operator":"The account that revoked the role.","role":"The role that has been revoked."}},"Transfer(address,address,uint256)":{"params":{"from":"The previous token owner.","to":"The new token owner.","tokenId":"The transferred token identifier."}}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.","params":{"to":"The address to approve, or the zero address to remove any existing approval.","tokenId":"The token identifier to give approval for."}},"balanceOf(address)":{"details":"Reverts if `owner` is the zero address.","params":{"owner":"The address to query the balance of."},"returns":{"balance":"The amount owned by the owner."}},"batchMint(address,uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new tokens owner.","tokenIds":"Identifiers of the tokens to mint."}},"batchTransferFrom(address,address,uint256[])":{"details":"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"Current tokens owner.","to":"Address of the new token owner.","tokenIds":"Identifiers of the tokens to transfer."}},"deliver(address[],uint256[])":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"recipients":"Addresses of the new tokens owners.","tokenIds":"Identifiers of the tokens to mint."}},"getApproved(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the approval of."},"returns":{"approved":"The approved address for the token identifier, or the zero address if no approval is set."}},"grantRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.","params":{"account":"The account to grant the role to.","role":"The role to grant."}},"hasRole(bytes32,address)":{"params":{"account":"The account.","role":"The role."},"returns":{"hasRole_":"Whether `account` has `role`."}},"isApprovedForAll(address,address)":{"params":{"operator":"The address which receives the approval for all tokens.","owner":"The address which gives the approval for all tokens."},"returns":{"approvedForAll":"Whether the operator is approved for all tokens by the owner."}},"isTrustedForwarder(address)":{"params":{"forwarder":"The forwarder to check."},"returns":{"_0":"True if `forwarder` is trusted, false if not."}},"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"mint(address,uint256)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"name()":{"returns":{"tokenName":"The name of the token."}},"owner()":{"returns":{"_0":"The address of the contract owner."}},"ownerOf(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier to query the owner of."},"returns":{"tokenOwner":"The owner of the token identifier."}},"recoverERC20s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer.","tokens":"the list of ERC20 token addresses."}},"recoverERC721s(address[],address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","contracts":"the list of ERC721 contract addresses.","tokenIds":"the list of token ids to transfer."}},"recoverETH(address[],uint256[])":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.","params":{"accounts":"the list of accounts to transfer the tokens to.","amounts":"the list of token amounts to transfer."}},"renounceRole(bytes32)":{"details":"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.","params":{"role":"The role to renounce."}},"revokeRole(bytes32,address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.","params":{"account":"The account to revoke the role from.","role":"The role to revoke."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"safeMint(address,uint256,bytes)":{"details":"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.","params":{"data":"Optional data to pass along to the receiver call.","to":"Address of the new token owner.","tokenId":"Identifier of the token to mint."}},"safeTransferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"safeTransferFrom(address,address,uint256,bytes)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"data":"Optional data to send along to a receiver contract.","from":"The current token owner.","to":"The recipient of the token transfer.","tokenId":"The identifier of the token to transfer."}},"setApprovalForAll(address,bool)":{"details":"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.","params":{"approved":"True to set an approval for all tokens, false to unset it.","operator":"The address to approve for all tokens."}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"symbol()":{"returns":{"tokenSymbol":"The symbol of the token."}},"tokenURI(uint256)":{"details":"Reverts if `tokenId` does not exist.","params":{"tokenId":"The token identifier."},"returns":{"uri":"The metadata URI for the token identifier."}},"transferFrom(address,address,uint256)":{"details":"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.","params":{"from":"The current token owner.","to":"The recipient of the token transfer. Self-transfers are possible.","tokenId":"The identifier of the token to transfer."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034607457601f61418638819003918201601f19168301916001600160401b03831184841017607957808492602094604052833981010312607457516001600160a01b03811681036074576080526040516140f69081610090823960805181818161231a015281816135850152613df20152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146131c657806306fdde031461316b578063081812fc1461310e578063095ea7b314612e7a5780630e07f854146125c0578063114ba8ee146124d957806323b872dd146124315780632a55205a1461233e5780632b4c9f16146122cf5780632f2ff15d1461214357806340c10f19146120b357806342842e0e14611fe35780634684d7e914611e03578063572b6c0514611db857806361ba27da14611c9c5780636352211e14611c2157806370a0823114611b5757806373c8a958146119a75780638832e6e3146117595780638bb9c5bf146115ea5780638da5cb5b146115795780638dc251e31461144c57806391d14854146113b457806395d89b41146113455780639da5e8321461121b578063a0c76f62146111aa578063a22cb4651461104a578063b0ccc31e14610fd9578063b88d4fde14610eb7578063c3666c3614610c7a578063c87b56dd14610ac7578063d539139314610a6e578063d547741f146108e5578063e1a8bf2c146108a9578063e985e9c5146107f5578063f2fde38b14610701578063f3993d111461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc3661345d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d613ddb565b925416911690810361034e57508181036103245760005b81811061022d57005b610238818387613be5565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f57610262828587613be5565b35908147106102ed57600080809381935af13d156102e5573d90610285826135cd565b9161029360405193846134c9565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b26132b3565b6103ba6132d6565b9060443567ffffffffffffffff811161031f576103db903690600401613399565b926103e4613ddb565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106f1575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106c7576104898382849694613eef565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061050c578787878181141580610503575b6104c157005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104bb565b610517818986613be5565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106995788036106675784610590575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104a7565b7401000000000000000000000000000000000000000016158015610604575b6105b9578961054f565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105af565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106fa91613cf0565b858261043b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576107386132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610762613ddb565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034e575073ffffffffffffffffffffffffffffffffffffffff16918282036107a657005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761082c6132b3565b73ffffffffffffffffffffffffffffffffffffffff6108496132d6565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020604051620186a08152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561091f6132d6565b610927613ddb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109d957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610bb96000600435610b28817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b8a565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6e57600091610be6575b60405160208082528190610be290820185613270565b0390f35b3d8083833e610bf581836134c9565b810190602081830312610c665780519067ffffffffffffffff8211610c6a570181601f82011215610c6657805192610c2c846135cd565b92610c3a60405194856134c9565b84845260208584010111610c635750610be292610c5d916020808501910161324d565b90610bcc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031f57610c88366133ca565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ccd613ddb565b925416911690810361034e5750808214801590610ead575b6103245760005b828110610cf557005b73ffffffffffffffffffffffffffffffffffffffff610d1d610d1883858a613be5565b613bf5565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6e57600091610e7f575b5015610e52575073ffffffffffffffffffffffffffffffffffffffff610dac610d1883858a613be5565b1690610dbc610d18828689613be5565b91610dc882878b613be5565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6e57600192610e41575b5001610cec565b6000610e4c916134c9565b88610e3a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea0915060203d8111610ea6575b610e9881836134c9565b810190613c16565b89610d82565b503d610e8e565b5082821415610ce5565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610eee6132b3565b610ef66132d6565b60443560643567ffffffffffffffff811161031f57610f199036906004016132f9565b929093610f24613ddb565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fc9575b5050610faa848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b823b610fb257005b610fc795610fc1913691613607565b93613f6f565b005b610fd291613cf0565b8685610f7b565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576110816132b3565b602435908115159182810361031f5761117b575b73ffffffffffffffffffffffffffffffffffffffff806110b3613ddb565b1691169181831461114d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111a5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cf0565b611095565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031f576112293661345d565b61125b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b906139c3565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926112868161350a565b9461129460405196876134c9565b818652602086019160051b81019036821161031f57915b81831061131857505050906112c1913691613522565b91805191835183036103245760005b8381106112d957005b8061131273ffffffffffffffffffffffffffffffffffffffff6112fe60019487613b47565b511661130a8389613b47565b519085613a85565b016112d0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016112ab565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613c2e565b604051918291602083526020830190613270565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576113eb6132d6565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576114836132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114c2613ddb565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561154f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611645613ddb565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a69565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576117906132b3565b6024359060443567ffffffffffffffff811161031f576117b49036906004016132f9565b916117e17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b611821848261181b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611813613ddb565b973691613607565b94613a85565b803b61182957005b73ffffffffffffffffffffffffffffffffffffffff80602092169361189660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190613270565b03816000865af1908115610c6e57600091611928575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161199f575b81611941602093836134c9565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff000000000000000000000000000000000000000000000000000000006118ac565b5080fd5b3d9150611934565b3461031f576119b5366133ca565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119f8613ddb565b925416911690810361034e5750808414801590611b4d575b6103245760005b848110611a2057005b611a2b818388613be5565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f576000602091611a5e610d18868b8e613be5565b82611ac8611af4611a70898d8d613be5565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826134c9565b51925af115610c6e576000513d611b445750803b155b611b175750600101611a17565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b0a565b5082841415611a10565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611b8e6132b3565b73ffffffffffffffffffffffffffffffffffffffff811615611bf75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b8a565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d0d613ddb565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8b57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611df9611df46132b3565b61356e565b6040519015158152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611e3a6132b3565b60243567ffffffffffffffff811161031f5773ffffffffffffffffffffffffffffffffffffffff611e72611ec9923690600401613399565b9290611ea07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613522565b9216908115611fb95782519260005b848110611f19575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f238183613b47565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8c57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ed8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57611ff136613327565b611ff9613ddb565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120a3575b505061207f828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b803b61208757005b610fc7936040519361209a6020866134c9565b60008552613f6f565b6120ac91613cf0565b8483612050565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610fc76120ed6132b3565b6121197fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a85565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561217d6132d6565b612185613ddb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561223857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a69565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612429575b156123f3575050610be260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610be291620186a08210156124165761241090620186a092613981565b046123c3565b620186a06124249204613981565b6123c3565b5081156123b6565b3461031f57610fc761244236613327565b9161244b613ddb565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036124c9575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b6124d291613cf0565b85816124a1565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576125106132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061254f613ddb565b925416911690810361034e575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043567ffffffffffffffff811161031f5761260f9036906004016132f9565b60243567ffffffffffffffff811161031f5761262f9036906004016132f9565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361031f576064359373ffffffffffffffffffffffffffffffffffffffff8516850361031f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61269d613ddb565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612b39575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612e25575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612b39575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612cf65781906129258454613737565b601f8111612dd2575b50600090601f8311600114612d3057600092612d25575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612cf6576129b07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613737565b601f8111612c72575b506000601f8211600114612b765781929394600092612b6b575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612b39575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806129d3565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612c5a575083600195969710612c22575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612a25565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612bf5565b90926020600181928686013581550194019101612be1565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612cec575b601f0160051c01905b818110612ce057506129b9565b60008155600101612cd3565b9091508190612cca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612945565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612dba5750908460019594939210612d82575b505050811b019055612977565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612d75565b91936020600181928787013581550195019201612d5f565b909150836000526020600020601f840160051c81019160208510612e1b575b90601f859493920160051c01905b818110612e0c575061292e565b60008155849350600101612dff565b9091508190612df1565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3868061270a565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57612eb16132b3565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156130de575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f01613ddb565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156130b05784861461308257612f41818686613eef565b15613036575015612fa5577401000000000000000000000000000000000000000016612f91575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612f68565b90740100000000000000000000000000000000000000008217809203613022575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612f6a565b846000526020526040600020558380612fc6565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613108907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cf0565b83612ed7565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136c8565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613c2e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f57611df96020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d61363e565b60005b8381106132605750506000910152565b8181015183820152602001613250565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936132ac8151809281875287808801910161324d565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060243573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060443590565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f578161341391600401613399565b9290929160243567ffffffffffffffff811161031f578161343691600401613399565b929092916044359067ffffffffffffffff821161031f5761345991600401613399565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f57816134a691600401613399565b929092916024359067ffffffffffffffff821161031f5761345991600401613399565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cf657604052565b67ffffffffffffffff8111612cf65760051b60200190565b92919061352e8161350a565b9361353c60405195866134c9565b602085838152019160051b810192831161031f57905b82821061355e57505050565b8135815260209182019101613552565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135c65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612cf657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613613826135cd565b9161362160405193846134c9565b82948184528183011161031f578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135c6577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136c15760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610699577401000000000000000000000000000000000000000016156135c6576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613780575b602083101461375157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613746565b909273ffffffffffffffffffffffffffffffffffffffff169283156106c757846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156130b05773ffffffffffffffffffffffffffffffffffffffff811680950361394f57826137fe9185613eef565b15613894575b5050836000528060205282604060002055828203613845575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8154019055826000526020526040600020600181540190553861381d565b7401000000000000000000000000000000000000000016158015613909575b6138bd5780613804565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156138b3565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561399457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613a1d5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fb957826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416613b1957600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613b5b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613bb8575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613b5b5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9081602091031261031f5751801515810361031f5790565b9060405191826000825492613c4284613737565b8084529360018116908115613cb05750600114613c69575b50613c67925003836134c9565b565b90506000929192526020600020906000915b818310613c94575050906020613c679282010138613c5a565b6020919350806001915483858901015201910190918492613c7b565b60209350613c679592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613c5a565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613dd1575b613d19575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c6e57600091613db2575b5015613d855750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613dcb915060203d602011610ea657610e9881836134c9565b38613d7c565b50813b1515613d11565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613ee0573233148015613ee5575b613ee0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e66575b50613e6357503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c6e57600091613ec1575b5038613e59565b613eda915060203d602011610ea657610e9881836134c9565b38613eba565b503390565b5060183610613e22565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613f1a575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613f14565b73ffffffffffffffffffffffffffffffffffffffff90613fe1826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190613270565b03816000865af1908115610c6e57600091614045575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f8575050565b6020813d6020116140b8575b8161405e602093836134c9565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff00000000000000000000000000000000000000000000000000000000613ff7565b3d915061405156fea264697066735822122071ea666057fad52b1f26df82973ca62357ecfce31989b5fd01323f60b2ea751564736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x74 JUMPI PUSH1 0x1F PUSH2 0x4186 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x79 JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x74 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x74 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x40F6 SWAP1 DUP2 PUSH2 0x90 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x231A ADD MSTORE DUP2 DUP2 PUSH2 0x3585 ADD MSTORE PUSH2 0x3DF2 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x31C6 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x316B JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x310E JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2E7A JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x25C0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x24D9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2431 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x233E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22CF JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2143 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20B3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FE3 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E03 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DB8 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C21 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B57 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1759 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15EA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1579 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x144C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13B4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1345 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x121B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11AA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x104A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFD9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEB7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAC7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA6E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8A9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x345D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x35CD JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x34C9 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x32D6 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x3DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 PUSH2 0x3E4 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6F1 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6C7 JUMPI PUSH2 0x489 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3EEF JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x50C JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x503 JUMPI JUMPDEST PUSH2 0x4C1 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4BB JUMP JUMPDEST PUSH2 0x517 DUP2 DUP10 DUP7 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x699 JUMPI DUP9 SUB PUSH2 0x667 JUMPI DUP5 PUSH2 0x590 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4A7 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x604 JUMPI JUMPDEST PUSH2 0x5B9 JUMPI DUP10 PUSH2 0x54F JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5AF JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6FA SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x43B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x738 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x762 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7A6 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x82C PUSH2 0x32B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x849 PUSH2 0x32D6 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x91F PUSH2 0x32D6 JUMP JUMPDEST PUSH2 0x927 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9D9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBB9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB28 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B8A JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE6 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBE2 SWAP1 DUP3 ADD DUP6 PUSH2 0x3270 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBF5 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC2C DUP5 PUSH2 0x35CD JUMP JUMPDEST SWAP3 PUSH2 0xC3A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x34C9 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC63 JUMPI POP PUSH2 0xBE2 SWAP3 PUSH2 0xC5D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x324D JUMP JUMPDEST SWAP1 PUSH2 0xBCC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC88 CALLDATASIZE PUSH2 0x33CA JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCCD PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEAD JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD1D PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x3BE5 JUMP JUMPDEST PUSH2 0x3BF5 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7F JUMPI JUMPDEST POP ISZERO PUSH2 0xE52 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDAC PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x3BE5 JUMP JUMPDEST AND SWAP1 PUSH2 0xDBC PUSH2 0xD18 DUP3 DUP7 DUP10 PUSH2 0x3BE5 JUMP JUMPDEST SWAP2 PUSH2 0xDC8 DUP3 DUP8 DUP12 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE41 JUMPI JUMPDEST POP ADD PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE4C SWAP2 PUSH2 0x34C9 JUMP JUMPDEST DUP9 PUSH2 0xE3A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3C16 JUMP JUMPDEST DUP10 PUSH2 0xD82 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE8E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEEE PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0xEF6 PUSH2 0x32D6 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF24 PUSH2 0x3DDB JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFC9 JUMPI JUMPDEST POP POP PUSH2 0xFAA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFB2 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP6 PUSH2 0xFC1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3607 JUMP JUMPDEST SWAP4 PUSH2 0x3F6F JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD2 SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF7B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1081 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x117B JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10B3 PUSH2 0x3DDB JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x114D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11A5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CF0 JUMP JUMPDEST PUSH2 0x1095 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1229 CALLDATASIZE PUSH2 0x345D JUMP JUMPDEST PUSH2 0x125B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH2 0x39C3 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1286 DUP2 PUSH2 0x350A JUMP JUMPDEST SWAP5 PUSH2 0x1294 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x34C9 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1318 JUMPI POP POP POP SWAP1 PUSH2 0x12C1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3522 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12D9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1312 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12FE PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3B47 JUMP JUMPDEST MLOAD AND PUSH2 0x130A DUP4 DUP10 PUSH2 0x3B47 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3A85 JUMP JUMPDEST ADD PUSH2 0x12D0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12AB JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3C2E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x13EB PUSH2 0x32D6 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1483 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14C2 PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x154F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1645 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1711 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1790 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x17B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST SWAP2 PUSH2 0x17E1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH2 0x1821 DUP5 DUP3 PUSH2 0x181B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1813 PUSH2 0x3DDB JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3607 JUMP JUMPDEST SWAP5 PUSH2 0x3A85 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1829 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1896 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1928 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x199F JUMPI JUMPDEST DUP2 PUSH2 0x1941 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18AC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1934 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x19B5 CALLDATASIZE PUSH2 0x33CA JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F8 PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B4D JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A20 JUMPI STOP JUMPDEST PUSH2 0x1A2B DUP2 DUP4 DUP9 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A5E PUSH2 0xD18 DUP7 DUP12 DUP15 PUSH2 0x3BE5 JUMP JUMPDEST DUP3 PUSH2 0x1AC8 PUSH2 0x1AF4 PUSH2 0x1A70 DUP10 DUP14 DUP14 PUSH2 0x3BE5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x34C9 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B44 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B17 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A17 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B0A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A10 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1B8E PUSH2 0x32B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B8A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D0D PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D8B JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1DF9 PUSH2 0x1DF4 PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x356E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1E3A PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E72 PUSH2 0x1EC9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EA0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3522 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F19 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F23 DUP2 DUP4 PUSH2 0x3B47 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F8C JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ED8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1FF1 CALLDATASIZE PUSH2 0x3327 JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20A3 JUMPI JUMPDEST POP POP PUSH2 0x207F DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2087 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x209A PUSH1 0x20 DUP7 PUSH2 0x34C9 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3F6F JUMP JUMPDEST PUSH2 0x20AC SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2050 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x20ED PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x2119 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A85 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x217D PUSH2 0x32D6 JUMP JUMPDEST PUSH2 0x2185 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2238 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2429 JUMPI JUMPDEST ISZERO PUSH2 0x23F3 JUMPI POP POP PUSH2 0xBE2 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBE2 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2416 JUMPI PUSH2 0x2410 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3981 JUMP JUMPDEST DIV PUSH2 0x23C3 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2424 SWAP3 DIV PUSH2 0x3981 JUMP JUMPDEST PUSH2 0x23C3 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23B6 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x2442 CALLDATASIZE PUSH2 0x3327 JUMP JUMPDEST SWAP2 PUSH2 0x244B PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x24C9 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST PUSH2 0x24D2 SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x24A1 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2510 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x254F PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x260F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x262F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x31F JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x31F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x269D PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2E25 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2CF6 JUMPI DUP2 SWAP1 PUSH2 0x2925 DUP5 SLOAD PUSH2 0x3737 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2DD2 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2D30 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2D25 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH2 0x29B0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3737 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2C72 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2B76 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2B6B JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x29D3 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2C5A JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2C22 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2A25 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2BF5 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2BE1 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2CEC JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CE0 JUMPI POP PUSH2 0x29B9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2CD3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2CCA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2945 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DBA JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2D82 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2977 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2D75 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2D5F JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2E1B JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E0C JUMPI POP PUSH2 0x292E JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2DFF JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2DF1 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x270A JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2EB1 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x30DE JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F01 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x30B0 JUMPI DUP5 DUP7 EQ PUSH2 0x3082 JUMPI PUSH2 0x2F41 DUP2 DUP7 DUP7 PUSH2 0x3EEF JUMP JUMPDEST ISZERO PUSH2 0x3036 JUMPI POP ISZERO PUSH2 0x2FA5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2F91 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x3022 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2F6A JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2FC6 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3108 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CF0 JUMP JUMPDEST DUP4 PUSH2 0x2ED7 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x36C8 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3C2E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1DF9 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x363E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3260 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3250 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x32AC DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x324D JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x3413 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x3436 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x3459 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x34A6 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x3459 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CF6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x352E DUP2 PUSH2 0x350A JUMP JUMPDEST SWAP4 PUSH2 0x353C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x34C9 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31F JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x355E JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3552 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x35C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3613 DUP3 PUSH2 0x35CD JUMP JUMPDEST SWAP2 PUSH2 0x3621 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x34C9 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35C6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x36C1 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x699 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x35C6 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3780 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3751 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3746 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6C7 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x30B0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x394F JUMPI DUP3 PUSH2 0x37FE SWAP2 DUP6 PUSH2 0x3EEF JUMP JUMPDEST ISZERO PUSH2 0x3894 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3845 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x381D JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3909 JUMPI JUMPDEST PUSH2 0x38BD JUMPI DUP1 PUSH2 0x3804 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x38B3 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3994 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3A1D JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3B19 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3B5B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3BB8 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3B5B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3C42 DUP5 PUSH2 0x3737 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3CB0 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3C69 JUMPI JUMPDEST POP PUSH2 0x3C67 SWAP3 POP SUB DUP4 PUSH2 0x34C9 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3C94 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3C67 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3C5A JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3C67 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3C5A JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3DD1 JUMPI JUMPDEST PUSH2 0x3D19 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3DB2 JUMPI JUMPDEST POP ISZERO PUSH2 0x3D85 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3DCB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST CODESIZE PUSH2 0x3D7C JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D11 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3EE0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3EE5 JUMPI JUMPDEST PUSH2 0x3EE0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E66 JUMPI JUMPDEST POP PUSH2 0x3E63 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3EC1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E59 JUMP JUMPDEST PUSH2 0x3EDA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST CODESIZE PUSH2 0x3EBA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3E22 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3F1A JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3F14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3FE1 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4045 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x40B8 JUMPI JUMPDEST DUP2 PUSH2 0x405E PUSH1 0x20 SWAP4 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3FF7 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4051 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEA666057FAD52B1F26DF82973CA62357ECFC CALLF 0x1989 0xB5 REVERT ADD ORIGIN EXTCODEHASH PUSH1 0xB2 0xEA PUSH22 0x1564736F6C634300081E003300000000000000000000 ","sourceMap":"1992:1815:333:-:0;;;;;;;;;;;;;-1:-1:-1;;1992:1815:333;;;;-1:-1:-1;;;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1992:1815:333;;;;;;745:39:76;;1992:1815:333;;;;;;;;745:39:76;1992:1815:333;;;;;;;;;;;;;;;;;-1:-1:-1;1992:1815:333;;;;;;-1:-1:-1;1992:1815:333;;;;;-1:-1:-1;1992:1815:333"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":13014,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_addresst_addresst_uint256":{"entryPoint":13095,"id":null,"parameterSlots":1,"returnSlots":3},"abi_decode_array_address_dyn_calldatat_array_contract_IERC20_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13258,"id":null,"parameterSlots":1,"returnSlots":6},"abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata":{"entryPoint":13405,"id":null,"parameterSlots":1,"returnSlots":4},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":13209,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_available_length_array_uint256_dyn":{"entryPoint":13602,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_available_length_bytes":{"entryPoint":13831,"id":null,"parameterSlots":3,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":15382,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":13049,"id":null,"parameterSlots":2,"returnSlots":2},"abi_decode_t_address":{"entryPoint":12979,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_address_uint256":{"entryPoint":null,"id":null,"parameterSlots":3,"returnSlots":1},"abi_encode_bytes32_address_address":{"entryPoint":null,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_string":{"entryPoint":12912,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_array_uint256_dyn":{"entryPoint":13578,"id":null,"parameterSlots":1,"returnSlots":1},"array_allocation_size_bytes":{"entryPoint":13773,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_contract_IERC20_dyn_calldata":{"entryPoint":15333,"id":null,"parameterSlots":3,"returnSlots":1},"checked_mul_uint256":{"entryPoint":14721,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":15406,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":12877,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":14135,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":13513,"id":null,"parameterSlots":2,"returnSlots":0},"fun_callOnERC721Received":{"entryPoint":16239,"id":34888,"parameterSlots":5,"returnSlots":0},"fun_checkFilterOperator":{"entryPoint":15600,"id":37869,"parameterSlots":2,"returnSlots":0},"fun_enforceHasRole":{"entryPoint":14787,"id":8814,"parameterSlots":2,"returnSlots":0},"fun_getApproved":{"entryPoint":14024,"id":34804,"parameterSlots":2,"returnSlots":1},"fun_isOperatable":{"entryPoint":16111,"id":34914,"parameterSlots":3,"returnSlots":1},"fun_isTrustedForwarder":{"entryPoint":13678,"id":13141,"parameterSlots":1,"returnSlots":1},"fun_mint":{"entryPoint":14981,"id":33982,"parameterSlots":3,"returnSlots":0},"fun_msgSender":{"entryPoint":15835,"id":13231,"parameterSlots":0,"returnSlots":1},"fun_ownerOf":{"entryPoint":15242,"id":34760,"parameterSlots":2,"returnSlots":1},"fun_supportsInterface":{"entryPoint":13886,"id":11667,"parameterSlots":2,"returnSlots":1},"fun_transferFrom":{"entryPoint":14218,"id":33689,"parameterSlots":5,"returnSlots":0},"memory_array_index_access_uint256_dyn":{"entryPoint":15175,"id":null,"parameterSlots":2,"returnSlots":1},"read_from_calldatat_address":{"entryPoint":15349,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":8986},{"length":32,"start":13701},{"length":32,"start":15858}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146131c657806306fdde031461316b578063081812fc1461310e578063095ea7b314612e7a5780630e07f854146125c0578063114ba8ee146124d957806323b872dd146124315780632a55205a1461233e5780632b4c9f16146122cf5780632f2ff15d1461214357806340c10f19146120b357806342842e0e14611fe35780634684d7e914611e03578063572b6c0514611db857806361ba27da14611c9c5780636352211e14611c2157806370a0823114611b5757806373c8a958146119a75780638832e6e3146117595780638bb9c5bf146115ea5780638da5cb5b146115795780638dc251e31461144c57806391d14854146113b457806395d89b41146113455780639da5e8321461121b578063a0c76f62146111aa578063a22cb4651461104a578063b0ccc31e14610fd9578063b88d4fde14610eb7578063c3666c3614610c7a578063c87b56dd14610ac7578063d539139314610a6e578063d547741f146108e5578063e1a8bf2c146108a9578063e985e9c5146107f5578063f2fde38b14610701578063f3993d111461037b5763f7ba94bd146101be57600080fd5b3461031f576101cc3661345d565b90917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061020d613ddb565b925416911690810361034e57508181036103245760005b81811061022d57005b610238818387613be5565b3573ffffffffffffffffffffffffffffffffffffffff811680910361031f57610262828587613be5565b35908147106102ed57600080809381935af13d156102e5573d90610285826135cd565b9161029360405193846134c9565b82523d6000602084013e5b156102ac5750600101610224565b8051156102bb57602081519101fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b60609061029e565b50477fcf4791810000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600080fd5b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576103b26132b3565b6103ba6132d6565b9060443567ffffffffffffffff811161031f576103db903690600401613399565b926103e4613ddb565b907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308273ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036106f1575b505073ffffffffffffffffffffffffffffffffffffffff7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c091169384156106c7576104898382849694613eef565b9373ffffffffffffffffffffffffffffffffffffffff600095159216945b87811061050c578787878181141580610503575b6104c157005b60009081527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040808220805485900390559181522080549091019055005b508215156104bb565b610517818986613be5565b35806000528260205260406000205473ffffffffffffffffffffffffffffffffffffffff811680156106995788036106675784610590575b509081600192600052836020528860406000205588887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4016104a7565b7401000000000000000000000000000000000000000016158015610604575b6105b9578961054f565b8673ffffffffffffffffffffffffffffffffffffffff877fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50806000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c260205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff871614156105af565b50867f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b827fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f86c870670000000000000000000000000000000000000000000000000000000060005260046000fd5b6106fa91613cf0565b858261043b565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576107386132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc90610762613ddb565b9073ffffffffffffffffffffffffffffffffffffffff80845416921682810361034e575073ffffffffffffffffffffffffffffffffffffffff16918282036107a657005b827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5761082c6132b3565b73ffffffffffffffffffffffffffffffffffffffff6108496132d6565b91166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c360205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020604051620186a08152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561091f6132d6565b610927613ddb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054166109d957005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905580519384529183015291909216908201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080606081015b0390a1005b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610bb96000600435610b28817fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b8a565b5073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a6541660405180809581947ff724dad700000000000000000000000000000000000000000000000000000000835230600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b03915afa908115610c6e57600091610be6575b60405160208082528190610be290820185613270565b0390f35b3d8083833e610bf581836134c9565b810190602081830312610c665780519067ffffffffffffffff8211610c6a570181601f82011215610c6657805192610c2c846135cd565b92610c3a60405194856134c9565b84845260208584010111610c635750610be292610c5d916020808501910161324d565b90610bcc565b80fd5b8280fd5b8380fd5b6040513d6000823e3d90fd5b3461031f57610c88366133ca565b9094929390917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80610ccd613ddb565b925416911690810361034e5750808214801590610ead575b6103245760005b828110610cf557005b73ffffffffffffffffffffffffffffffffffffffff610d1d610d1883858a613be5565b613bf5565b166040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f80ac58cd000000000000000000000000000000000000000000000000000000006004820152602081602481855afa908115610c6e57600091610e7f575b5015610e52575073ffffffffffffffffffffffffffffffffffffffff610dac610d1883858a613be5565b1690610dbc610d18828689613be5565b91610dc882878b613be5565b3592813b1561031f57606473ffffffffffffffffffffffffffffffffffffffff916000809460405197889586947f42842e0e00000000000000000000000000000000000000000000000000000000865230600487015216602485015260448401525af1918215610c6e57600192610e41575b5001610cec565b6000610e4c916134c9565b88610e3a565b7f986b9f1f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b610ea0915060203d8111610ea6575b610e9881836134c9565b810190613c16565b89610d82565b503d610e8e565b5082821415610ce5565b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610eee6132b3565b610ef66132d6565b60443560643567ffffffffffffffff811161031f57610f199036906004016132f9565b929093610f24613ddb565b937f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308573ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff821603610fc9575b5050610faa848484887fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b823b610fb257005b610fc795610fc1913691613607565b93613f6f565b005b610fd291613cf0565b8685610f7b565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576110816132b3565b602435908115159182810361031f5761117b575b73ffffffffffffffffffffffffffffffffffffffff806110b3613ddb565b1691169181831461114d5760207f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191836000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c38252604060002085600052825260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a3005b507fe4215c6a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6111a5817f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cf0565b611095565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a65416604051908152f35b3461031f576112293661345d565b61125b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b906139c3565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0926112868161350a565b9461129460405196876134c9565b818652602086019160051b81019036821161031f57915b81831061131857505050906112c1913691613522565b91805191835183036103245760005b8381106112d957005b8061131273ffffffffffffffffffffffffffffffffffffffff6112fe60019487613b47565b511661130a8389613b47565b519085613a85565b016112d0565b823573ffffffffffffffffffffffffffffffffffffffff8116810361031f578152602092830192016112ab565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5613c2e565b604051918291602083526020830190613270565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576113eb6132d6565b7fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b2260043560005260205273ffffffffffffffffffffffffffffffffffffffff60406000209116600052602052602060ff604060002054166040519015158152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576114836132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806114c2613ddb565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579073ffffffffffffffffffffffffffffffffffffffff81161561154f5773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602073ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416604051908152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f577fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22600435611645613ddb565b908060005282602052604060002073ffffffffffffffffffffffffffffffffffffffff831660005260205260ff60406000205416156117115760008181526020938452604080822073ffffffffffffffffffffffffffffffffffffffff949094168083529385529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051918252928101829052918201527ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b908060608101610a69565b73ffffffffffffffffffffffffffffffffffffffff92507f7aa72882000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b3461031f5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576117906132b3565b6024359060443567ffffffffffffffff811161031f576117b49036906004016132f9565b916117e17fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b611821848261181b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c095611813613ddb565b973691613607565b94613a85565b803b61182957005b73ffffffffffffffffffffffffffffffffffffffff80602092169361189660405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000855216600484015260006024840152876044840152608060648401526084830190613270565b03816000865af1908115610c6e57600091611928575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f857005b7fc215a7a10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d60201161199f575b81611941602093836134c9565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff000000000000000000000000000000000000000000000000000000006118ac565b5080fd5b3d9150611934565b3461031f576119b5366133ca565b929392917fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff806119f8613ddb565b925416911690810361034e5750808414801590611b4d575b6103245760005b848110611a2057005b611a2b818388613be5565b3573ffffffffffffffffffffffffffffffffffffffff81169081810361031f576000602091611a5e610d18868b8e613be5565b82611ac8611af4611a70898d8d613be5565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000089820190815273ffffffffffffffffffffffffffffffffffffffff9096166024820152903560448201529182906064820190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826134c9565b51925af115610c6e576000513d611b445750803b155b611b175750600101611a17565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60011415611b0a565b5082841415611a10565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611b8e6132b3565b73ffffffffffffffffffffffffffffffffffffffff811615611bf75773ffffffffffffffffffffffffffffffffffffffff166000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526020604060002054604051908152f35b7faefbce4e0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613b8a565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff80611d0d613ddb565b925416911690810361034e57507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a08111611d8b57815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611df9611df46132b3565b61356e565b6040519015158152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57611e3a6132b3565b60243567ffffffffffffffff811161031f5773ffffffffffffffffffffffffffffffffffffffff611e72611ec9923690600401613399565b9290611ea07fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b7fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0933691613522565b9216908115611fb95782519260005b848110611f19575050506000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c16020526040600020908154019055600080f35b611f238183613b47565b51806000528360205273ffffffffffffffffffffffffffffffffffffffff60406000205416611f8c57908160019260005284602052856040600020558560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a401611ed8565b7f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f7851b9cd0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461031f57611ff136613327565b611ff9613ddb565b917f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308373ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036120a3575b505061207f828286867fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b803b61208757005b610fc7936040519361209a6020866134c9565b60008552613f6f565b6120ac91613cf0565b8483612050565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610fc76120ed6132b3565b6121197fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b22611255613ddb565b602435907fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0613a85565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043561217d6132d6565b612185613ddb565b9173ffffffffffffffffffffffffffffffffffffffff7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc541673ffffffffffffffffffffffffffffffffffffffff841690810361034e57507fc8827d3282af6f37b64c3e9e6f3ac9df286ab0bb0fccd6f8661bf19adb368b228160005280602052604060002073ffffffffffffffffffffffffffffffffffffffff841660005260205260ff604060002054161561223857005b60008281526020918252604080822073ffffffffffffffffffffffffffffffffffffffff9586168084529084529181902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580519384529183015291909216908201527f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d908060608101610a69565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5773ffffffffffffffffffffffffffffffffffffffff6024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c9080158015612429575b156123f3575050610be260005b60405193849316836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b610be291620186a08210156124165761241090620186a092613981565b046123c3565b620186a06124249204613981565b6123c3565b5081156123b6565b3461031f57610fc761244236613327565b9161244b613ddb565b7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd308173ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8216036124c9575b50507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c061378a565b6124d291613cf0565b85816124a1565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576125106132b3565b7fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061254f613ddb565b925416911690810361034e575073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b3461031f5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f5760043567ffffffffffffffff811161031f5761260f9036906004016132f9565b60243567ffffffffffffffff811161031f5761262f9036906004016132f9565b6044939193359173ffffffffffffffffffffffffffffffffffffffff8316830361031f576064359373ffffffffffffffffffffffffffffffffffffffff8516850361031f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc61269d613ddb565b7f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb83546001811015612b39575060017f5b388d90dc1312ba799f321972f13311234fa1163bcabec7cf66101c4876eb835573ffffffffffffffffffffffffffffffffffffffff169081612e25575b50507fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527fa53d5a615b1d5279f1a6647c5c0f31bf064b1e70af135676a4a96aeaeb691a2f805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092557f8ed2355fc3f859d445b81332ba1875c675be71b9fe1bab0a25be6436696b0ec780548216831790557f98ea984a1dd4b0fbb2764a2a70a93d7e6137ea3c70db196cc96460f50c0d1a1f80548216831790557f70a1033a668c0b93d699f00f1cf02b517801b7285ead3ea5fa8d9b43f89ed57180548216831790557f4f521d2bc326c534847f496e961505200b8e61c57a75e48fd6b97dc560e2c5a480548216831790557f0845b122e17f0ee9a0d1d2feeec009013976e8c85c80079e88858099492b187280548216831790557f2a55205a000000000000000000000000000000000000000000000000000000006000527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e5208054909116821790557f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf58547f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a49391811015612b39575060017f92f72593ca50a0096f68ee94e7000db40ed086164b695855e2250750b8bfaf585567ffffffffffffffff8211612cf65781906129258454613737565b601f8111612dd2575b50600090601f8311600114612d3057600092612d25575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b67ffffffffffffffff8111612cf6576129b07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a554613737565b601f8111612c72575b506000601f8211600114612b765781929394600092612b6b575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916177f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a5555b73ffffffffffffffffffffffffffffffffffffffff7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a691167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d546001811015612b39575073ffffffffffffffffffffffffffffffffffffffff9060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d55167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b0135905084806129d3565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a581527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216947fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a191805b878110612c5a575083600195969710612c22575b505050811b017f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a555612a25565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055848080612bf5565b90926020600181928686013581550194019101612be1565b7f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a56000527fc39bad3db5d56dccf839bc8a79759b3192b97757d993f7663c9998f4fbefc8a1601f830160051c81019160208410612cec575b601f0160051c01905b818110612ce057506129b9565b60008155600101612cd3565b9091508190612cca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b013590508780612945565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016918481526020812092815b818110612dba5750908460019594939210612d82575b505050811b019055612977565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055878080612d75565b91936020600181928787013581550195019201612d5f565b909150836000526020600020601f840160051c81019160208510612e1b575b90601f859493920160051c01905b818110612e0c575061292e565b60008155849350600101612dff565b9091508190612df1565b817fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3868061270a565b3461031f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57612eb16132b3565b6024359073ffffffffffffffffffffffffffffffffffffffff81169081159081156130de575b507fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c0612f01613ddb565b9184600052816020526040600020549073ffffffffffffffffffffffffffffffffffffffff82169384156130b05784861461308257612f41818686613eef565b15613036575015612fa5577401000000000000000000000000000000000000000016612f91575b505b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b836000526020528060406000205583612f68565b90740100000000000000000000000000000000000000008217809203613022575b5050826000527fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c26020526040600020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612f6a565b846000526020526040600020558380612fc6565b8473ffffffffffffffffffffffffffffffffffffffff88927fc7563a18000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b847fb7fdc0100000000000000000000000000000000000000000000000000000000060005260045260246000fd5b867fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613108907f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30613cf0565b83612ed7565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576020611c7e6004357fddf3ee18ae6d688373c219468f8be446e7ae82215f4779d821c7ea5e8c13c0c06136c8565b3461031f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f57610be26113a07f7ea68fd2dcf1c056b94db6a0a537aa80d26fa9ab1eacd85da1ba0b61b7e7a8a4613c2e565b3461031f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261031f576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361031f57611df96020917fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d61363e565b60005b8381106132605750506000910152565b8181015183820152602001613250565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936132ac8151809281875287808801910161324d565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361031f57565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020838186019501011161031f57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261031f5760043573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060243573ffffffffffffffffffffffffffffffffffffffff8116810361031f579060443590565b9181601f8401121561031f5782359167ffffffffffffffff831161031f576020808501948460051b01011161031f57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f578161341391600401613399565b9290929160243567ffffffffffffffff811161031f578161343691600401613399565b929092916044359067ffffffffffffffff821161031f5761345991600401613399565b9091565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261031f5760043567ffffffffffffffff811161031f57816134a691600401613399565b929092916024359067ffffffffffffffff821161031f5761345991600401613399565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612cf657604052565b67ffffffffffffffff8111612cf65760051b60200190565b92919061352e8161350a565b9361353c60405195866134c9565b602085838152019160051b810192831161031f57905b82821061355e57505050565b8135815260209182019101613552565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169081156135c65773ffffffffffffffffffffffffffffffffffffffff161490565b5050600090565b67ffffffffffffffff8111612cf657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192613613826135cd565b9161362160405193846134c9565b82948184528183011161031f578281602093846000960137010152565b907fffffffff00000000000000000000000000000000000000000000000000000000167fffffffff0000000000000000000000000000000000000000000000000000000081146135c6577f01ffc9a70000000000000000000000000000000000000000000000000000000081146136c15760005260205260ff6040600020541690565b5050600190565b816000528060205260406000205473ffffffffffffffffffffffffffffffffffffffff811615610699577401000000000000000000000000000000000000000016156135c6576002916000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020541690565b90600182811c92168015613780575b602083101461375157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613746565b909273ffffffffffffffffffffffffffffffffffffffff169283156106c757846000528160205260406000205473ffffffffffffffffffffffffffffffffffffffff81169384156130b05773ffffffffffffffffffffffffffffffffffffffff811680950361394f57826137fe9185613eef565b15613894575b5050836000528060205282604060002055828203613845575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4565b600101816000528060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8154019055826000526020526040600020600181540190553861381d565b7401000000000000000000000000000000000000000016158015613909575b6138bd5780613804565b8273ffffffffffffffffffffffffffffffffffffffff86927fa4a3018b000000000000000000000000000000000000000000000000000000006000521660045260245260445260646000fd5b50846000526002820160205273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff821614156138b3565b86857f14dbb5360000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8181029291811591840414171561399457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f6d696e7465720000000000000000000000000000000000000000000000000000600052602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205260ff6040600020541615613a1d5750565b73ffffffffffffffffffffffffffffffffffffffff907f7aa72882000000000000000000000000000000000000000000000000000000006000527f6d696e74657200000000000000000000000000000000000000000000000000006004521660245260446000fd5b9073ffffffffffffffffffffffffffffffffffffffff16908115611fb957826000528060205273ffffffffffffffffffffffffffffffffffffffff60406000205416613b1957600190836000528060205282604060002055826000520160205260406000206001815401905560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4565b827f753eceac0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8051821015613b5b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8160005260205273ffffffffffffffffffffffffffffffffffffffff60406000205416908115613bb8575090565b7fdd5604750000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190811015613b5b5760051b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361031f5790565b9081602091031261031f5751801515810361031f5790565b9060405191826000825492613c4284613737565b8084529360018116908115613cb05750600114613c69575b50613c67925003836134c9565b565b90506000929192526020600020906000915b818310613c94575050906020613c679282010138613c5a565b6020919350806001915483858901015201910190918492613c7b565b60209350613c679592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613c5a565b5473ffffffffffffffffffffffffffffffffffffffff169081151580613dd1575b613d19575050565b602073ffffffffffffffffffffffffffffffffffffffff916044604051809481937fc617113400000000000000000000000000000000000000000000000000000000835230600484015216958660248301525afa908115610c6e57600091613db2575b5015613d855750565b7fede71dcc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b613dcb915060203d602011610ea657610e9881836134c9565b38613d7c565b50813b1515613d11565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015613ee0573233148015613ee5575b613ee0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90803314908115613e66575b50613e6357503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa908115610c6e57600091613ec1575b5038613e59565b613eda915060203d602011610ea657610e9881836134c9565b38613eba565b503390565b5060183610613e22565b73ffffffffffffffffffffffffffffffffffffffff8083169084161492918315613f1a575b50505090565b600392935073ffffffffffffffffffffffffffffffffffffffff166000520160205273ffffffffffffffffffffffffffffffffffffffff6040600020911660005260205260ff60406000205416388080613f14565b73ffffffffffffffffffffffffffffffffffffffff90613fe1826020949597969716958360405196879586957f150b7a02000000000000000000000000000000000000000000000000000000008752166004860152166024840152876044840152608060648401526084830190613270565b03816000865af1908115610c6e57600091614045575b507fffffffff000000000000000000000000000000000000000000000000000000007f150b7a02000000000000000000000000000000000000000000000000000000009116036118f8575050565b6020813d6020116140b8575b8161405e602093836134c9565b8101031261199b5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610c6357507fffffffff00000000000000000000000000000000000000000000000000000000613ff7565b3d915061405156fea264697066735822122071ea666057fad52b1f26df82973ca62357ecfce31989b5fd01323f60b2ea751564736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x31C6 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x316B JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x310E JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2E7A JUMPI DUP1 PUSH4 0xE07F854 EQ PUSH2 0x25C0 JUMPI DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x24D9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2431 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x233E JUMPI DUP1 PUSH4 0x2B4C9F16 EQ PUSH2 0x22CF JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x2143 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x20B3 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1FE3 JUMPI DUP1 PUSH4 0x4684D7E9 EQ PUSH2 0x1E03 JUMPI DUP1 PUSH4 0x572B6C05 EQ PUSH2 0x1DB8 JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x1C9C JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x1C21 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1B57 JUMPI DUP1 PUSH4 0x73C8A958 EQ PUSH2 0x19A7 JUMPI DUP1 PUSH4 0x8832E6E3 EQ PUSH2 0x1759 JUMPI DUP1 PUSH4 0x8BB9C5BF EQ PUSH2 0x15EA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1579 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x144C JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x13B4 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x1345 JUMPI DUP1 PUSH4 0x9DA5E832 EQ PUSH2 0x121B JUMPI DUP1 PUSH4 0xA0C76F62 EQ PUSH2 0x11AA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x104A JUMPI DUP1 PUSH4 0xB0CCC31E EQ PUSH2 0xFD9 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0xEB7 JUMPI DUP1 PUSH4 0xC3666C36 EQ PUSH2 0xC7A JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0xAC7 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xA6E JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xE1A8BF2C EQ PUSH2 0x8A9 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x7F5 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xF3993D11 EQ PUSH2 0x37B JUMPI PUSH4 0xF7BA94BD EQ PUSH2 0x1BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1CC CALLDATASIZE PUSH2 0x345D JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x20D PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP2 DUP2 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x22D JUMPI STOP JUMPDEST PUSH2 0x238 DUP2 DUP4 DUP8 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x31F JUMPI PUSH2 0x262 DUP3 DUP6 DUP8 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD SWAP1 DUP2 SELFBALANCE LT PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 DUP1 SWAP4 DUP2 SWAP4 GAS CALL RETURNDATASIZE ISZERO PUSH2 0x2E5 JUMPI RETURNDATASIZE SWAP1 PUSH2 0x285 DUP3 PUSH2 0x35CD JUMP JUMPDEST SWAP2 PUSH2 0x293 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x34C9 JUMP JUMPDEST DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 ADD PUSH2 0x224 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x2BB JUMPI PUSH1 0x20 DUP2 MLOAD SWAP2 ADD REVERT JUMPDEST PUSH32 0xD6BDA27500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x60 SWAP1 PUSH2 0x29E JUMP JUMPDEST POP SELFBALANCE PUSH32 0xCF47918100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x3B2 PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x32D6 JUMP JUMPDEST SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x3DB SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 PUSH2 0x3E4 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x6F1 JUMPI JUMPDEST POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP2 AND SWAP4 DUP5 ISZERO PUSH2 0x6C7 JUMPI PUSH2 0x489 DUP4 DUP3 DUP5 SWAP7 SWAP5 PUSH2 0x3EEF JUMP JUMPDEST SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x0 SWAP6 ISZERO SWAP3 AND SWAP5 JUMPDEST DUP8 DUP2 LT PUSH2 0x50C JUMPI DUP8 DUP8 DUP8 DUP2 DUP2 EQ ISZERO DUP1 PUSH2 0x503 JUMPI JUMPDEST PUSH2 0x4C1 JUMPI STOP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP2 MSTORE KECCAK256 DUP1 SLOAD SWAP1 SWAP2 ADD SWAP1 SSTORE STOP JUMPDEST POP DUP3 ISZERO ISZERO PUSH2 0x4BB JUMP JUMPDEST PUSH2 0x517 DUP2 DUP10 DUP7 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 ISZERO PUSH2 0x699 JUMPI DUP9 SUB PUSH2 0x667 JUMPI DUP5 PUSH2 0x590 JUMPI JUMPDEST POP SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE DUP9 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP9 DUP9 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 ADD PUSH2 0x4A7 JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x604 JUMPI JUMPDEST PUSH2 0x5B9 JUMPI DUP10 PUSH2 0x54F JUMP JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP1 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND EQ ISZERO PUSH2 0x5AF JUMP JUMPDEST POP DUP7 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x86C8706700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x6FA SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP6 DUP3 PUSH2 0x43B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x738 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SWAP1 PUSH2 0x762 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 SLOAD AND SWAP3 AND DUP3 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 DUP3 DUP3 SUB PUSH2 0x7A6 JUMPI STOP JUMPDEST DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x0 DUP1 LOG3 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x82C PUSH2 0x32B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x849 PUSH2 0x32D6 JUMP JUMPDEST SWAP2 AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x91F PUSH2 0x32D6 JUMP JUMPDEST PUSH2 0x927 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x9D9 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD JUMPDEST SUB SWAP1 LOG1 STOP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBB9 PUSH1 0x0 PUSH1 0x4 CALLDATALOAD PUSH2 0xB28 DUP2 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B8A JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD DUP1 DUP1 SWAP6 DUP2 SWAP5 PUSH32 0xF724DAD700000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xBE6 JUMPI JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 PUSH2 0xBE2 SWAP1 DUP3 ADD DUP6 PUSH2 0x3270 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST RETURNDATASIZE DUP1 DUP4 DUP4 RETURNDATACOPY PUSH2 0xBF5 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 DUP4 SUB SLT PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xC6A JUMPI ADD DUP2 PUSH1 0x1F DUP3 ADD SLT ISZERO PUSH2 0xC66 JUMPI DUP1 MLOAD SWAP3 PUSH2 0xC2C DUP5 PUSH2 0x35CD JUMP JUMPDEST SWAP3 PUSH2 0xC3A PUSH1 0x40 MLOAD SWAP5 DUP6 PUSH2 0x34C9 JUMP JUMPDEST DUP5 DUP5 MSTORE PUSH1 0x20 DUP6 DUP5 ADD ADD GT PUSH2 0xC63 JUMPI POP PUSH2 0xBE2 SWAP3 PUSH2 0xC5D SWAP2 PUSH1 0x20 DUP1 DUP6 ADD SWAP2 ADD PUSH2 0x324D JUMP JUMPDEST SWAP1 PUSH2 0xBCC JUMP JUMPDEST DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xC88 CALLDATASIZE PUSH2 0x33CA JUMP JUMPDEST SWAP1 SWAP5 SWAP3 SWAP4 SWAP1 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0xCCD PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP3 EQ DUP1 ISZERO SWAP1 PUSH2 0xEAD JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0xCF5 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xD1D PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x3BE5 JUMP JUMPDEST PUSH2 0x3BF5 JUMP JUMPDEST AND PUSH1 0x40 MLOAD PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0x80AC58CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x24 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0xE7F JUMPI JUMPDEST POP ISZERO PUSH2 0xE52 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xDAC PUSH2 0xD18 DUP4 DUP6 DUP11 PUSH2 0x3BE5 JUMP JUMPDEST AND SWAP1 PUSH2 0xDBC PUSH2 0xD18 DUP3 DUP7 DUP10 PUSH2 0x3BE5 JUMP JUMPDEST SWAP2 PUSH2 0xDC8 DUP3 DUP8 DUP12 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0x31F JUMPI PUSH1 0x64 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x0 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 PUSH32 0x42842E0E00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE ADDRESS PUSH1 0x4 DUP8 ADD MSTORE AND PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x44 DUP5 ADD MSTORE GAS CALL SWAP2 DUP3 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x1 SWAP3 PUSH2 0xE41 JUMPI JUMPDEST POP ADD PUSH2 0xCEC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE4C SWAP2 PUSH2 0x34C9 JUMP JUMPDEST DUP9 PUSH2 0xE3A JUMP JUMPDEST PUSH32 0x986B9F1F00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xEA0 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEA6 JUMPI JUMPDEST PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3C16 JUMP JUMPDEST DUP10 PUSH2 0xD82 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE8E JUMP JUMPDEST POP DUP3 DUP3 EQ ISZERO PUSH2 0xCE5 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xEEE PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0xEF6 PUSH2 0x32D6 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD PUSH1 0x64 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0xF19 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH2 0xF24 PUSH2 0x3DDB JUMP JUMPDEST SWAP4 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0xFC9 JUMPI JUMPDEST POP POP PUSH2 0xFAA DUP5 DUP5 DUP5 DUP9 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST DUP3 EXTCODESIZE PUSH2 0xFB2 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP6 PUSH2 0xFC1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3607 JUMP JUMPDEST SWAP4 PUSH2 0x3F6F JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFD2 SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP7 DUP6 PUSH2 0xF7B JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1081 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 DUP2 ISZERO ISZERO SWAP2 DUP3 DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x117B JUMPI JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x10B3 PUSH2 0x3DDB JUMP JUMPDEST AND SWAP2 AND SWAP2 DUP2 DUP4 EQ PUSH2 0x114D JUMPI PUSH1 0x20 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP2 DUP4 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C3 DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP6 PUSH1 0x0 MSTORE DUP3 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP2 SLOAD AND PUSH1 0xFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE LOG3 STOP JUMPDEST POP PUSH32 0xE4215C6A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x11A5 DUP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CF0 JUMP JUMPDEST PUSH2 0x1095 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1229 CALLDATASIZE PUSH2 0x345D JUMP JUMPDEST PUSH2 0x125B PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 PUSH2 0x39C3 JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP3 PUSH2 0x1286 DUP2 PUSH2 0x350A JUMP JUMPDEST SWAP5 PUSH2 0x1294 PUSH1 0x40 MLOAD SWAP7 DUP8 PUSH2 0x34C9 JUMP JUMPDEST DUP2 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP1 CALLDATASIZE DUP3 GT PUSH2 0x31F JUMPI SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x1318 JUMPI POP POP POP SWAP1 PUSH2 0x12C1 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3522 JUMP JUMPDEST SWAP2 DUP1 MLOAD SWAP2 DUP4 MLOAD DUP4 SUB PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12D9 JUMPI STOP JUMPDEST DUP1 PUSH2 0x1312 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x12FE PUSH1 0x1 SWAP5 DUP8 PUSH2 0x3B47 JUMP JUMPDEST MLOAD AND PUSH2 0x130A DUP4 DUP10 PUSH2 0x3B47 JUMP JUMPDEST MLOAD SWAP1 DUP6 PUSH2 0x3A85 JUMP JUMPDEST ADD PUSH2 0x12D0 JUMP JUMPDEST DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 ADD PUSH2 0x12AB JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH2 0x3C2E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x13EB PUSH2 0x32D6 JUMP JUMPDEST PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1483 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x14C2 PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x154F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH1 0x4 CALLDATALOAD PUSH2 0x1645 PUSH2 0x3DDB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x0 MSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x1711 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP1 DUP4 MSTORE SWAP4 DUP6 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE DUP1 MLOAD SWAP2 DUP3 MSTORE SWAP3 DUP2 ADD DUP3 SWAP1 MSTORE SWAP2 DUP3 ADD MSTORE PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 POP PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1790 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x17B4 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST SWAP2 PUSH2 0x17E1 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH2 0x1821 DUP5 DUP3 PUSH2 0x181B PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP6 PUSH2 0x1813 PUSH2 0x3DDB JUMP JUMPDEST SWAP8 CALLDATASIZE SWAP2 PUSH2 0x3607 JUMP JUMPDEST SWAP5 PUSH2 0x3A85 JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x1829 JUMPI STOP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH1 0x20 SWAP3 AND SWAP4 PUSH2 0x1896 PUSH1 0x40 MLOAD SWAP5 DUP6 SWAP4 DUP5 SWAP4 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x0 PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x1928 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI STOP JUMPDEST PUSH32 0xC215A7A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x199F JUMPI JUMPDEST DUP2 PUSH2 0x1941 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x18AC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x1934 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x19B5 CALLDATASIZE PUSH2 0x33CA JUMP JUMPDEST SWAP3 SWAP4 SWAP3 SWAP2 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x19F8 PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP DUP1 DUP5 EQ DUP1 ISZERO SWAP1 PUSH2 0x1B4D JUMPI JUMPDEST PUSH2 0x324 JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1A20 JUMPI STOP JUMPDEST PUSH2 0x1A2B DUP2 DUP4 DUP9 PUSH2 0x3BE5 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 DUP2 SUB PUSH2 0x31F JUMPI PUSH1 0x0 PUSH1 0x20 SWAP2 PUSH2 0x1A5E PUSH2 0xD18 DUP7 DUP12 DUP15 PUSH2 0x3BE5 JUMP JUMPDEST DUP3 PUSH2 0x1AC8 PUSH2 0x1AF4 PUSH2 0x1A70 DUP10 DUP14 DUP14 PUSH2 0x3BE5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP10 DUP3 ADD SWAP1 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP7 AND PUSH1 0x24 DUP3 ADD MSTORE SWAP1 CALLDATALOAD PUSH1 0x44 DUP3 ADD MSTORE SWAP2 DUP3 SWAP1 PUSH1 0x64 DUP3 ADD SWAP1 JUMP JUMPDEST SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x34C9 JUMP JUMPDEST MLOAD SWAP3 GAS CALL ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 MLOAD RETURNDATASIZE PUSH2 0x1B44 JUMPI POP DUP1 EXTCODESIZE ISZERO JUMPDEST PUSH2 0x1B17 JUMPI POP PUSH1 0x1 ADD PUSH2 0x1A17 JUMP JUMPDEST PUSH32 0x5274AFE700000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 EQ ISZERO PUSH2 0x1B0A JUMP JUMPDEST POP DUP3 DUP5 EQ ISZERO PUSH2 0x1A10 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1B8E PUSH2 0x32B3 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1BF7 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH32 0xAEFBCE4E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3B8A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP2 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x1D0D PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x1D8B JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1DF9 PUSH2 0x1DF4 PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x356E JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x1E3A PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1E72 PUSH2 0x1EC9 SWAP3 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x1EA0 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 SWAP4 CALLDATASIZE SWAP2 PUSH2 0x3522 JUMP JUMPDEST SWAP3 AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 MLOAD SWAP3 PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x1F19 JUMPI POP POP POP PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH2 0x1F23 DUP2 DUP4 PUSH2 0x3B47 JUMP JUMPDEST MLOAD DUP1 PUSH1 0x0 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x1F8C JUMPI SWAP1 DUP2 PUSH1 0x1 SWAP3 PUSH1 0x0 MSTORE DUP5 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP6 PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 ADD PUSH2 0x1ED8 JUMP JUMPDEST PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x7851B9CD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0x1FF1 CALLDATASIZE PUSH2 0x3327 JUMP JUMPDEST PUSH2 0x1FF9 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x20A3 JUMPI JUMPDEST POP POP PUSH2 0x207F DUP3 DUP3 DUP7 DUP7 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST DUP1 EXTCODESIZE PUSH2 0x2087 JUMPI STOP JUMPDEST PUSH2 0xFC7 SWAP4 PUSH1 0x40 MLOAD SWAP4 PUSH2 0x209A PUSH1 0x20 DUP7 PUSH2 0x34C9 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH2 0x3F6F JUMP JUMPDEST PUSH2 0x20AC SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP5 DUP4 PUSH2 0x2050 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x20ED PUSH2 0x32B3 JUMP JUMPDEST PUSH2 0x2119 PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 PUSH2 0x1255 PUSH2 0x3DDB JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x3A85 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH2 0x217D PUSH2 0x32D6 JUMP JUMPDEST PUSH2 0x2185 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH32 0xC8827D3282AF6F37B64C3E9E6F3AC9DF286AB0BB0FCCD6F8661BF19ADB368B22 DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x2238 JUMPI STOP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND DUP1 DUP5 MSTORE SWAP1 DUP5 MSTORE SWAP2 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 MLOAD SWAP4 DUP5 MSTORE SWAP2 DUP4 ADD MSTORE SWAP2 SWAP1 SWAP3 AND SWAP1 DUP3 ADD MSTORE PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP1 DUP1 PUSH1 0x60 DUP2 ADD PUSH2 0xA69 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR SWAP1 DUP1 ISZERO DUP1 ISZERO PUSH2 0x2429 JUMPI JUMPDEST ISZERO PUSH2 0x23F3 JUMPI POP POP PUSH2 0xBE2 PUSH1 0x0 JUMPDEST PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 AND DUP4 PUSH1 0x20 SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD SWAP6 AND DUP2 MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBE2 SWAP2 PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x2416 JUMPI PUSH2 0x2410 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x3981 JUMP JUMPDEST DIV PUSH2 0x23C3 JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x2424 SWAP3 DIV PUSH2 0x3981 JUMP JUMPDEST PUSH2 0x23C3 JUMP JUMPDEST POP DUP2 ISZERO PUSH2 0x23B6 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH2 0xFC7 PUSH2 0x2442 CALLDATASIZE PUSH2 0x3327 JUMP JUMPDEST SWAP2 PUSH2 0x244B PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SUB PUSH2 0x24C9 JUMPI JUMPDEST POP POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x378A JUMP JUMPDEST PUSH2 0x24D2 SWAP2 PUSH2 0x3CF0 JUMP JUMPDEST DUP6 DUP2 PUSH2 0x24A1 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2510 PUSH2 0x32B3 JUMP JUMPDEST PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x254F PUSH2 0x3DDB JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x34E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x260F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI PUSH2 0x262F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x32F9 JUMP JUMPDEST PUSH1 0x44 SWAP4 SWAP2 SWAP4 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND DUP4 SUB PUSH2 0x31F JUMPI PUSH1 0x64 CALLDATALOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0x31F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH2 0x269D PUSH2 0x3DDB JUMP JUMPDEST PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH1 0x1 PUSH32 0x5B388D90DC1312BA799F321972F13311234FA1163BCABEC7CF66101C4876EB83 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH2 0x2E25 JUMPI JUMPDEST POP POP PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0xA53D5A615B1D5279F1A6647C5C0F31BF064B1E70AF135676A4A96AEAEB691A2F DUP1 SLOAD PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH32 0x8ED2355FC3F859D445B81332BA1875C675BE71B9FE1BAB0A25BE6436696B0EC7 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x98EA984A1DD4B0FBB2764A2A70A93D7E6137EA3C70DB196CC96460F50C0D1A1F DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x70A1033A668C0B93D699F00F1CF02B517801B7285EAD3EA5FA8D9B43F89ED571 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x4F521D2BC326C534847F496E961505200B8E61C57A75E48FD6B97DC560E2C5A4 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x845B122E17F0EE9A0D1D2FEEEC009013976E8C85C80079E88858099492B1872 DUP1 SLOAD DUP3 AND DUP4 OR SWAP1 SSTORE PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD SWAP1 SWAP2 AND DUP3 OR SWAP1 SSTORE PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SLOAD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 SWAP4 SWAP2 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH1 0x1 PUSH32 0x92F72593CA50A0096F68EE94E7000DB40ED086164B695855E2250750B8BFAF58 SSTORE PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2CF6 JUMPI DUP2 SWAP1 PUSH2 0x2925 DUP5 SLOAD PUSH2 0x3737 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2DD2 JUMPI JUMPDEST POP PUSH1 0x0 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2D30 JUMPI PUSH1 0x0 SWAP3 PUSH2 0x2D25 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH2 0x29B0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SLOAD PUSH2 0x3737 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x2C72 JUMPI JUMPDEST POP PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x2B76 JUMPI DUP2 SWAP3 SWAP4 SWAP5 PUSH1 0x0 SWAP3 PUSH2 0x2B6B JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A6 SWAP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x2B39 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 DUP1 RETURN JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP5 DUP1 PUSH2 0x29D3 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 SWAP2 DUP1 JUMPDEST DUP8 DUP2 LT PUSH2 0x2C5A JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x2C22 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 SSTORE PUSH2 0x2A25 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x2BF5 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP7 DUP7 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x2BE1 JUMP JUMPDEST PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A5 PUSH1 0x0 MSTORE PUSH32 0xC39BAD3DB5D56DCCF839BC8A79759B3192B97757D993F7663C9998F4FBEFC8A1 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x2CEC JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2CE0 JUMPI POP PUSH2 0x29B9 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2CD3 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2CCA JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADD CALLDATALOAD SWAP1 POP DUP8 DUP1 PUSH2 0x2945 JUMP JUMPDEST SWAP1 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP3 DUP2 JUMPDEST DUP2 DUP2 LT PUSH2 0x2DBA JUMPI POP SWAP1 DUP5 PUSH1 0x1 SWAP6 SWAP5 SWAP4 SWAP3 LT PUSH2 0x2D82 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2977 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP6 PUSH1 0x3 SHL AND SHR NOT SWAP2 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 DUP1 PUSH2 0x2D75 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2D5F JUMP JUMPDEST SWAP1 SWAP2 POP DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x2E1B JUMPI JUMPDEST SWAP1 PUSH1 0x1F DUP6 SWAP5 SWAP4 SWAP3 ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x2E0C JUMPI POP PUSH2 0x292E JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE DUP5 SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2DFF JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2DF1 JUMP JUMPDEST DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x0 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 DUP2 DUP1 LOG3 DUP7 DUP1 PUSH2 0x270A JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0x2EB1 PUSH2 0x32B3 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 DUP2 ISZERO SWAP1 DUP2 ISZERO PUSH2 0x30DE JUMPI JUMPDEST POP PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x2F01 PUSH2 0x3DDB JUMP JUMPDEST SWAP2 DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP4 DUP5 ISZERO PUSH2 0x30B0 JUMPI DUP5 DUP7 EQ PUSH2 0x3082 JUMPI PUSH2 0x2F41 DUP2 DUP7 DUP7 PUSH2 0x3EEF JUMP JUMPDEST ISZERO PUSH2 0x3036 JUMPI POP ISZERO PUSH2 0x2FA5 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND PUSH2 0x2F91 JUMPI JUMPDEST POP JUMPDEST PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x0 DUP1 LOG4 STOP JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 PUSH21 0x10000000000000000000000000000000000000000 DUP3 OR DUP1 SWAP3 SUB PUSH2 0x3022 JUMPI JUMPDEST POP POP DUP3 PUSH1 0x0 MSTORE PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH2 0x2F6A JUMP JUMPDEST DUP5 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP4 DUP1 PUSH2 0x2FC6 JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 SWAP3 PUSH32 0xC7563A1800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH32 0xB7FDC01000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP7 PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3108 SWAP1 PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 PUSH2 0x3CF0 JUMP JUMPDEST DUP4 PUSH2 0x2ED7 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x20 PUSH2 0x1C7E PUSH1 0x4 CALLDATALOAD PUSH32 0xDDF3EE18AE6D688373C219468F8BE446E7AE82215F4779D821C7EA5E8C13C0C0 PUSH2 0x36C8 JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH2 0xBE2 PUSH2 0x13A0 PUSH32 0x7EA68FD2DCF1C056B94DB6A0A537AA80D26FA9AB1EACD85DA1BA0B61B7E7A8A4 PUSH2 0x3C2E JUMP JUMPDEST CALLVALUE PUSH2 0x31F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI PUSH2 0x1DF9 PUSH1 0x20 SWAP2 PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH2 0x363E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x3260 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3250 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x32AC DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x324D JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x31F JUMPI JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x60 SWAP2 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x24 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 PUSH1 0x44 CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x31F JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x31F JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x31F JUMPI JUMP JUMPDEST PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x3413 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x3436 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x3459 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x31F JUMPI PUSH1 0x4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x31F JUMPI DUP2 PUSH2 0x34A6 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP3 SWAP1 SWAP3 SWAP2 PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x31F JUMPI PUSH2 0x3459 SWAP2 PUSH1 0x4 ADD PUSH2 0x3399 JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x2CF6 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x352E DUP2 PUSH2 0x350A JUMP JUMPDEST SWAP4 PUSH2 0x353C PUSH1 0x40 MLOAD SWAP6 DUP7 PUSH2 0x34C9 JUMP JUMPDEST PUSH1 0x20 DUP6 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x5 SHL DUP2 ADD SWAP3 DUP4 GT PUSH2 0x31F JUMPI SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x355E JUMPI POP POP POP JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3552 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 DUP2 ISZERO PUSH2 0x35C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2CF6 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP3 PUSH2 0x3613 DUP3 PUSH2 0x35CD JUMP JUMPDEST SWAP2 PUSH2 0x3621 PUSH1 0x40 MLOAD SWAP4 DUP5 PUSH2 0x34C9 JUMP JUMPDEST DUP3 SWAP5 DUP2 DUP5 MSTORE DUP2 DUP4 ADD GT PUSH2 0x31F JUMPI DUP3 DUP2 PUSH1 0x20 SWAP4 DUP5 PUSH1 0x0 SWAP7 ADD CALLDATACOPY ADD ADD MSTORE JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x35C6 JUMPI PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 DUP2 EQ PUSH2 0x36C1 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST POP POP PUSH1 0x1 SWAP1 JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x699 JUMPI PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO PUSH2 0x35C6 JUMPI PUSH1 0x2 SWAP2 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x3780 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x3751 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x3746 JUMP JUMPDEST SWAP1 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 DUP4 ISZERO PUSH2 0x6C7 JUMPI DUP5 PUSH1 0x0 MSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP4 DUP5 ISZERO PUSH2 0x30B0 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP6 SUB PUSH2 0x394F JUMPI DUP3 PUSH2 0x37FE SWAP2 DUP6 PUSH2 0x3EEF JUMP JUMPDEST ISZERO PUSH2 0x3894 JUMPI JUMPDEST POP POP DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 DUP3 SUB PUSH2 0x3845 JUMPI JUMPDEST POP PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x0 DUP1 LOG4 JUMP JUMPDEST PUSH1 0x1 ADD DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 SLOAD ADD SWAP1 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE CODESIZE PUSH2 0x381D JUMP JUMPDEST PUSH21 0x10000000000000000000000000000000000000000 AND ISZERO DUP1 ISZERO PUSH2 0x3909 JUMPI JUMPDEST PUSH2 0x38BD JUMPI DUP1 PUSH2 0x3804 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 SWAP3 PUSH32 0xA4A3018B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x0 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ ISZERO PUSH2 0x38B3 JUMP JUMPDEST DUP7 DUP6 PUSH32 0x14DBB53600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x3994 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND ISZERO PUSH2 0x3A1D JUMPI POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x7AA7288200000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 MSTORE AND PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO PUSH2 0x1FB9 JUMPI DUP3 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH2 0x3B19 JUMPI PUSH1 0x1 SWAP1 DUP4 PUSH1 0x0 MSTORE DUP1 PUSH1 0x20 MSTORE DUP3 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x1 DUP2 SLOAD ADD SWAP1 SSTORE PUSH1 0x0 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP2 DUP1 LOG4 JUMP JUMPDEST DUP3 PUSH32 0x753ECEAC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x3B5B JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x3BB8 JUMPI POP SWAP1 JUMP JUMPDEST PUSH32 0xDD56047500000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3B5B JUMPI PUSH1 0x5 SHL ADD SWAP1 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x31F JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x31F JUMPI SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x3C42 DUP5 PUSH2 0x3737 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x3CB0 JUMPI POP PUSH1 0x1 EQ PUSH2 0x3C69 JUMPI JUMPDEST POP PUSH2 0x3C67 SWAP3 POP SUB DUP4 PUSH2 0x34C9 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x3C94 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x3C67 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x3C5A JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x3C67 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x3C5A JUMP JUMPDEST SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 ISZERO ISZERO DUP1 PUSH2 0x3DD1 JUMPI JUMPDEST PUSH2 0x3D19 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 PUSH1 0x44 PUSH1 0x40 MLOAD DUP1 SWAP5 DUP2 SWAP4 PUSH32 0xC617113400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE ADDRESS PUSH1 0x4 DUP5 ADD MSTORE AND SWAP6 DUP7 PUSH1 0x24 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3DB2 JUMPI JUMPDEST POP ISZERO PUSH2 0x3D85 JUMPI POP JUMP JUMPDEST PUSH32 0xEDE71DCC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x3DCB SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST CODESIZE PUSH2 0x3D7C JUMP JUMPDEST POP DUP2 EXTCODESIZE ISZERO ISZERO PUSH2 0x3D11 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x3EE0 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x3EE5 JUMPI JUMPDEST PUSH2 0x3EE0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E66 JUMPI JUMPDEST POP PUSH2 0x3E63 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3EC1 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3E59 JUMP JUMPDEST PUSH2 0x3EDA SWAP2 POP PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xEA6 JUMPI PUSH2 0xE98 DUP2 DUP4 PUSH2 0x34C9 JUMP JUMPDEST CODESIZE PUSH2 0x3EBA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3E22 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP1 DUP5 AND EQ SWAP3 SWAP2 DUP4 ISZERO PUSH2 0x3F1A JUMPI JUMPDEST POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SWAP3 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 MSTORE ADD PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND CODESIZE DUP1 DUP1 PUSH2 0x3F14 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x3FE1 DUP3 PUSH1 0x20 SWAP5 SWAP6 SWAP8 SWAP7 SWAP8 AND SWAP6 DUP4 PUSH1 0x40 MLOAD SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 DUP8 MSTORE AND PUSH1 0x4 DUP7 ADD MSTORE AND PUSH1 0x24 DUP5 ADD MSTORE DUP8 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x80 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD SWAP1 PUSH2 0x3270 JUMP JUMPDEST SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xC6E JUMPI PUSH1 0x0 SWAP2 PUSH2 0x4045 JUMPI JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH32 0x150B7A0200000000000000000000000000000000000000000000000000000000 SWAP2 AND SUB PUSH2 0x18F8 JUMPI POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x40B8 JUMPI JUMPDEST DUP2 PUSH2 0x405E PUSH1 0x20 SWAP4 DUP4 PUSH2 0x34C9 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x199B JUMPI MLOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND DUP3 SUB PUSH2 0xC63 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH2 0x3FF7 JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x4051 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEA666057FAD52B1F26DF82973CA62357ECFC CALLF 0x1989 0xB5 REVERT ADD ORIGIN EXTCODEHASH PUSH1 0xB2 0xEA PUSH22 0x1564736F6C634300081E003300000000000000000000 ","sourceMap":"1992:1815:333:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;1992:1815:333;;3524:41;;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;1760:24:192;;;;1756:63;;1992:1815:333;1845:10:192;;;;;;1992:1815:333;1857:3:192;1876:11;;;;;:::i;:::-;1992:1815:333;;;;;;;;;1898:10:192;;;;;:::i;:::-;1992:1815:333;1375:21:9;;;:30;1371:125;;1992:1815:333;1548:33:9;;;;;;;1992:1815:333;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1595:8:9;1591:58;;1857:3:192;1992:1815:333;;1834:9:192;;1591:58:9;1992:1815:333;;5690:21:9;:17;;5815:105;;;;;;5686:301;5957:19;1992:1815:333;5957:19:9;1992:1815:333;;5957:19:9;1992:1815:333;;;;;1371:125:9;1455:21;;1428:57;1992:1815:333;1428:57:9;1992:1815:333;;;;;;1428:57:9;1992:1815:333;;;;1756:63:192;1793:26;1992:1815:333;1793:26:192;1992:1815:333;;1793:26:192;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;1992:1815:333;;-1:-1:-1;4538:25:42;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3524:41;;;:::i;:::-;3179:19:352;1992:1815:333;;;;;;;;2616:14:352;2612:76;;1992:1815:333;29158:19:327;;1992:1815:333;;;;12413:16:327;;;12409:58;;12495:30;;;;;;;:::i;:::-;12583:9;1992:1815:333;;12884:11:327;;1992:1815:333;;12578:585:327;12594:10;;;;;;13177;;;;;;;:25;;;12578:585;13173:304;;1992:1815:333;13173:304:327;-1:-1:-1;1992:1815:333;;;13323:10:327;1992:1815:333;;;;;;;;;;;2220:8:327;;1992:1815:333;;;;;;;;;2220:8:327;;1992:1815:333;13177:25:327;13191:11;;;;13177:25;;12606:3;12643:11;;;;;:::i;:::-;1992:1815:333;;;;;;;;;;;;;;30700:19:327;;12715:64;;12797:26;;12793:73;;12880:173;;;12606:3;1992:1815:333;;;;;;;;;;;;;;2220:8:327;13125:27;;;1992:1815:333;13125:27:327;;1992:1815:333;12583:9:327;;12880:173;2220:8;30979:33;:38;;;12919:59;;12880:173;12915:123;;12880:173;;;12915:123;12987:51;1992:1815:333;12987:51:327;;1992:1815:333;12987:51:327;1992:1815:333;;;;;;;;;12987:51:327;12919:59;1992:1815:333;;;;12958:11:327;1992:1815:333;;;;;;;;;;;12948:30:327;;12919:59;;12793:73;12832:34;;;1992:1815:333;12832:34:327;1992:1815:333;;;;;;12832:34:327;12715:64;12748:31;;1992:1815:333;12748:31:327;1992:1815:333;;;;12748:31:327;12409:58;12438:29;1992:1815:333;12438:29:327;1992:1815:333;;12438:29:327;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;3524:41;;;:::i;:::-;1992:1815;;;;;;;;3205:23:42;;;3201:60;;1992:1815:333;;;3275:25:42;;;;3271:146;;1992:1815:333;3271:146:42;2220:8:327;;;;;;;;3361:45:42;1992:1815:333;3361:45:42;;1992:1815:333;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;29158:19:327;1992:1815:333;-1:-1:-1;1992:1815:333;28718:11:327;1992:1815:333;;;;-1:-1:-1;1992:1815:333;28718:28:327;1992:1815:333;-1:-1:-1;1992:1815:333;;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;713:6:351;1992:1815:333;;;;;;;;;;;;;;;;;;:::i;:::-;3524:41;;:::i;:::-;5148:19:42;1992:1815:333;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1992:1815:333;;;;;;;;;;;;;-1:-1:-1;1992:1815:333;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;1880:140:41;;1992:1815:333;1880:140:41;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1973:36:41;;1992:1815:333;;;;1973:36:41;;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:64:341;1992:1815:333;;;1453:39:302;1863:70:327;1992:1815:333;1453:39:302;:::i;:::-;;1992:1815:333;3364:23:341;1992:1815:333;;;;3364:64:341;;;;;1992:1815:333;3364:64:341;;1603:4:302;1992:1815:333;3364:64:341;;1992:1815:333;;;;;;;;;;;;;;;;;3364:64:341;;;;;;;;;;1992:1815:333;3364:64:341;;;1992:1815:333;;;;;;;;;;;;;;;:::i;:::-;;;;3364:64:341;;;;;;;;;;:::i;:::-;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3364:64:341;;;1992:1815:333;;;;;;;;;;;3364:64:341;1992:1815:333;;;;;;;;;;;;;;;;:::i;:::-;5148:19:42;;;;;;1992:1815:333;;;3524:41;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;3856:26:192;;;;;;:55;;;1992:1815:333;3852:94:192;;1992:1815:333;3972:10:192;;;;;;1992:1815:333;3984:3:192;1992:1815:333;4027:12:192;;;;;;:::i;:::-;;:::i;:::-;1992:1815:333;;;;4058:76:192;;4108:25;1992:1815:333;4058:76:192;;1992:1815:333;4058:76:192;;;;;;;;;;;;1992:1815:333;4058:76:192;;;3984:3;4057:77;;4053:173;;4239:12;1992:1815:333;4239:12:192;;;;;;:::i;:::-;1992:1815:333;4284:11:192;;;;;;;:::i;:::-;4297;;;;;;:::i;:::-;1992:1815:333;4239:70:192;;;;;;;1992:1815:333;;;;;;;4239:70:192;;;;;1992:1815:333;4239:70:192;;4277:4;1992:1815:333;4239:70:192;;1992:1815:333;;4058:76:192;1992:1815:333;;;;;;;4239:70:192;;;;;;;1992:1815:333;4239:70:192;;;3984:3;;1992:1815:333;3961:9:192;;4239:70;1992:1815:333;4239:70:192;;;:::i;:::-;;;;4053:173;4161:50;1992:1815:333;4161:50:192;1992:1815:333;;4058:76:192;1992:1815:333;4161:50:192;4058:76;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;3856:55;3886:25;;;;;3856:55;;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;3524:41;;;;;:::i;:::-;3179:19:352;1992:1815:333;;;;;;;;2616:14:352;2612:76;;1992:1815:333;29158:19:327;;11217:7;1863:70;;;;1992:1815:333;11217:7:327;:::i;:::-;376:58:354;;11235:101:327;;1992:1815:333;11235:101:327;11271:54;1992:1815:333;;;;;;:::i;:::-;11271:54:327;;:::i;:::-;1992:1815:333;2612:76:352;2670:6;;;:::i;:::-;2612:76;;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1500:115:305;;1992:1815:333;;3524:41;;;:::i;:::-;1992:1815;;;6339:18:327;;;;6335:63;;1992:1815:333;6463:42:327;6408:19;1992:1815:333;-1:-1:-1;1992:1815:333;6408:11:327;1992:1815:333;;;-1:-1:-1;1992:1815:333;;-1:-1:-1;1992:1815:333;;;;-1:-1:-1;1992:1815:333;;;;;;;;;;;;;;;;6463:42:327;1992:1815:333;6335:63:327;6366:32;;1992:1815:333;6366:32:327;1992:1815:333;;;;6366:32:327;1500:115:305;2931:8:352;668:81;1992:1815:333;2931:8:352;:::i;:::-;1500:115:305;;1992:1815:333;;;;;;;;;;;;;2991:23:341;1992:1815:333;;;;;;;;;;;;;;;:::i;:::-;1368:12:300;1992:1815:333;3524:41;;:::i;:::-;1368:12:300;;:::i;:::-;1992:1815:333;1062:8:300;;;;:::i;:::-;1992:1815:333;;;;;;;:::i;:::-;1062:8:300;;;;;;;;;;;1992:1815:333;;1062:8:300;;;;;;;;;;;1992:1815:333;;;;;;;;;:::i;:::-;;;;;;;17796:25:327;;17792:64;;1992:1815:333;17882:10:327;;;;;;1992:1815:333;17894:3:327;17920:13;17935:11;1992:1815:333;17920:13:327;1992:1815:333;17920:13:327;;;:::i;:::-;1992:1815:333;;17935:11:327;;;;:::i;:::-;1992:1815:333;17935:11:327;;;:::i;:::-;1992:1815:333;17871:9:327;;1062:8:300;1992:1815:333;;;;;;;;;1062:8:300;;;;;;;;;;1992:1815:333;;;;;;;;;;;;;2688:13:341;1992:1815:333;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;2800:22:41;1992:1815:333;-1:-1:-1;1992:1815:333;;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3524:41;;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;2976:19:351;1992:1815:333;;;;;1732:22:351;1728:93;;1992:1815:333;;2220:8:327;;;;;;;1992:1815:333;;;1728:93:351;1777:33;1992:1815:333;1777:33:351;1992:1815:333;;1777:33:351;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3524:41;;:::i;:::-;1992:1815;;;;;;;;;;;;;-1:-1:-1;1992:1815:333;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;3741:25:41;3737:66;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:33:41;;1992:1815:333;;;;2455:33:41;1992:1815:333;3737:66:41;1992:1815:333;3775:28:41;;;1992:1815:333;3775:28:41;1992:1815:333;;;;;;;3775:28:41;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;1586:12:303;1992:1815:333;3524:41;;:::i;1586:12:303:-;15560:7:327;1863:70;;1992:1815:333;;3524:41;;;:::i;:::-;1992:1815;;;;:::i;:::-;15560:7:327;;:::i;:::-;376:58:354;;15578:107:327;;1992:1815:333;15578:107:327;1992:1815:333;;;;;;;;;29832:65:327;;;;;1992:1815:333;29832:65:327;;1992:1815:333;;29832:65:327;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;1992:1815:333;29832:65:327;;;;;;;;1992:1815:333;29832:65:327;;;15578:107;1992:1815:333;;;;;29832:84:327;29828:136;;1992:1815:333;29828:136:327;29925:39;1992:1815:333;29925:39:327;1992:1815:333;;;;;;29925:39:327;29832:65;1992:1815:333;29832:65:327;;1992:1815:333;29832:65:327;;;;;;1992:1815:333;29832:65:327;;;:::i;:::-;;;1992:1815:333;;;;;;;;;;;;;29832:65:327;1992:1815:333;29832:65:327;;1992:1815:333;;;;29832:65:327;;;-1:-1:-1;29832:65:327;;1992:1815:333;;;;;;;:::i;:::-;5148:19:42;;;;1992:1815:333;;;3524:41;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;2780:23:192;;;;;;:51;;;1992:1815:333;2776:90:192;;1992:1815:333;2892:10:192;;;;;;1992:1815:333;2904:3:192;2923:9;;;;;:::i;:::-;1992:1815:333;;;;;;;;;;;1328:43:8;2946:11:192;;;;;;;:::i;:::-;2959:10;1328:43:8;;2959:10:192;;;;;:::i;:::-;1992:1815:333;;;1328:43:8;;;;;;1992:1815:333;;;;1328:43:8;;;1992:1815:333;;;;;;;;;;;;;;;1328:43:8;;;;;;;;;:::i;:::-;8507:421;;;;;;;1992:1815:333;8507:421:8;;8942:15;;8960:26;;;:31;8942:68;8938:146;;2904:3:192;1992:1815:333;;2881:9:192;;8938:146:8;9033:40;1992:1815:333;9033:40:8;1992:1815:333;;1328:43:8;1992:1815:333;9033:40:8;8942:68;1992:1815:333;8994:16:8;;8942:68;;2780:51:192;2807:24;;;;;2780:51;;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;;26728:19:327;26724:60;;1992:1815:333;;-1:-1:-1;1992:1815:333;26801:10:327;1992:1815:333;;;;-1:-1:-1;1992:1815:333;;;;;;;;26724:60:327;26756:28;1992:1815:333;26756:28:327;1992:1815:333;;26756:28:327;1992:1815:333;;;;;;;;;;;;3395:39:305;1992:1815:333;;;3395:39:305;:::i;:::-;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;3524:41;;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;2976:19:351;1992:1815:333;1281:36:351;713:6;1281:36;;1277:119;;1992:1815:333;;;;;;;;;;;;;;;1277:119:351;1340:45;1992:1815:333;1340:45:351;1992:1815:333;;;;1340:45:351;1992:1815:333;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;4464:19:41;;1956:12:303;1992:1815:333;3524:41;;:::i;1956:12:303:-;1992:1815:333;;;;;:::i;:::-;;;16404:16:327;;;16400:54;;1992:1815:333;;16512:9:327;1992:1815:333;16523:10:327;;;;;;16821:14;;;-1:-1:-1;1992:1815:333;16821:10:327;1992:1815:333;;;-1:-1:-1;1992:1815:333;;;;;2220:8:327;;1992:1815:333;;;16535:3:327;16572:11;;;;:::i;:::-;1992:1815:333;;;;;;;;;;;;;16597:72:327;;1992:1815:333;;;;;;;;;;;;;2220:8:327;16743:33;1992:1815:333;16743:33:327;;;;1992:1815:333;16512:9:327;;16597:72;16641:28;1992:1815:333;16641:28:327;1992:1815:333;;;;16641:28:327;16400:54;16429:25;1992:1815:333;16429:25:327;1992:1815:333;;16429:25:327;1992:1815:333;;;;;;;:::i;:::-;3524:41;;:::i;:::-;3179:19:352;1992:1815:333;;;;;;;;2616:14:352;2612:76;;1992:1815:333;29158:19:327;;9668:7;1863:70;;;;1992:1815:333;9668:7:327;:::i;:::-;376:58:354;;9686:99:327;;1992:1815:333;9686:99:327;9722:52;1992:1815:333;;;;;;;;:::i;:::-;;;;9722:52:327;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1992:1815:333;;;;;;;;;;;1287:7:303;1992:1815:333;;:::i;:::-;1232:12:303;1992:1815:333;3524:41;;:::i;1232:12:303:-;1992:1815:333;;;;1287:7:303;:::i;1992:1815:333:-;;;;;;;;;;;;;;;:::i;:::-;3524:41;;:::i;:::-;5148:19:42;1992:1815:333;;;;;;;4503:26:42;;;4499:64;;4464:19:41;1992:1815:333;;;;;;;;;;;;;-1:-1:-1;1992:1815:333;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;1254:25:41;1250:140;;1992:1815:333;1250:140:41;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:36:41;;1992:1815:333;;;;1343:36:41;1992:1815:333;;;;;;;;;;;;;;;;941:19:75;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;2503:14:351;;;:40;;;;1992:1815:333;2499:377:351;;;2559:17;;1992:1815:333;;2499:377:351;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;2499:377:351;1992:1815:333;;713:6:351;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;1992:1815:333;2499:377:351;;2607:259;713:6;2794:57;1992:1815:333;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;1992:1815:333;;;;2134:7:305;1992:1815:333;;;:::i;:::-;3524:41;;;:::i;:::-;1992:1815;;;;;;;;2616:14:352;2612:76;;1992:1815:333;29158:19:327;;1992:1815:333;2134:7:305;:::i;2612:76:352:-;2670:6;;;:::i;:::-;2612:76;;;;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;3524:41;;;:::i;:::-;1992:1815;;;;;4503:26:42;;;4499:64;;3179:19:352;1992:1815:333;;;;2220:8:327;;;;;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3524:41;;:::i;:::-;1992:1815;;1124:1:42;900:21:181;;;896:88;;-1:-1:-1;1124:1:42;1992:1815:333;2220:8:327;1992:1815:333;;;;1645:152:42;;1992:1815:333;-1:-1:-1;;1992:1815:333;;500:10:59;;1992:1815:333;;1124:1:42;1992:1815:333;;;;;;;;;500:10:59;1992:1815:333;;;;;;;;500:10:59;1992:1815:333;;;;;;;;500:10:59;1992:1815:333;;;;;;;;500:10:59;1992:1815:333;;;;;;;;500:10:59;1992:1815:333;;;;;;;;897:26:351;-1:-1:-1;500:10:59;;1992:1815:333;;;;;;;;;;;;;;900:21:181;;;896:88;;2220:8:327;1124:1:42;1992:1815:333;2220:8:327;1992:1815:333;583:77:341;;;;;;;;;;:::i;:::-;;;;;;1992:1815:333;583:77:341;1992:1815:333;583:77:341;;;;;;;;1992:1815:333;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;1992:1815:333;583:77:341;;;;;2159:13;583:77;;:::i;:::-;;;;;;;;1992:1815:333;583:77:341;;;;;;;;;;;1992:1815:333;583:77:341;;;;;;;;1124:1:42;583:77:341;;;;;;;;2159:13;583:77;;1992:1815:333;2196:23:341;1992:1815:333;;2220:8:327;;;;;;;1992:1815:333;;;;1124:1:42;900:21:181;;;896:88;;2220:8:327;1992:1815:333;2220:8:327;1124:1:42;1992:1815:333;2220:8:327;1992:1815:333;2220:8:327;;;;;;;1992:1815:333;;;896:88:181;930:54;1992:1815:333;930:54:181;1992:1815:333;;1124:1:42;1992:1815:333;;;;930:54:181;583:77:341;;;;-1:-1:-1;583:77:341;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;2159:13;583:77;;;;;;;;;;;;;;;;;;;;;;;;;;1992:1815:333;1124:1:42;583:77:341;;;;;;;;;;;;;;;;2159:13;1992:1815:333;583:77:341;;;;;;;;;;1992:1815:333;583:77:341;;;;;;;;;;;;;;;;;;;;;1992:1815:333;583:77:341;;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;;1992:1815:333;;;;;;;;;583:77:341;;;;-1:-1:-1;583:77:341;;;;;;;;;;;;;1992:1815:333;583:77:341;;;;;;;;;;;;;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1992:1815:333;1124:1:42;583:77:341;;;;;;;;;;;;;;;;;;;;1992:1815:333;583:77:341;1992:1815:333;;583:77:341;;;;;;;;;1992:1815:333;583:77:341;;;;;;;;;;;;;;;;;;;;;;;;;;1992:1815:333;583:77:341;;;;-1:-1:-1;1124:1:42;583:77:341;;;;;;-1:-1:-1;583:77:341;;;;1645:152:42;2220:8:327;;;;;;;;1992:1815:333;1740:46:42;;;;1645:152;;;;1992:1815:333;;;;;;;;;;;;;:::i;:::-;;;;;;;1068:16:305;;;;;;1064:117;;1992:1815:333;29158:19:327;1992:1815:333;3524:41;;:::i;:::-;1992:1815;;;;;;;;;;;;;;;30700:19:327;;;4802:64;;4931:18;;;4927:63;;5005:38;;;;;:::i;:::-;5004:39;5000:111;;-1:-1:-1;5125:16:327;;;2220:8;30979:33;5157:173;;5121:535;;;5670:35;1992:1815:333;5670:35:327;;1992:1815:333;5157:173:327;1992:1815:333;;;;;;;;;2220:8:327;5157:173;;;5121:535;5391:33;2220:8;5391:33;;5442:29;;;5438:169;;5121:535;1992:1815:333;;;;;5620:11:327;1992:1815:333;;;;;2220:8:327;;;;;;;;5121:535;;5438:169;1992:1815:333;;;;;;;;2220:8:327;5438:169;;;;5000:111;5052:59;1992:1815:333;5052:59:327;;;1992:1815:333;5052:59:327;1992:1815:333;;;;;;;;;5052:59:327;4927:63;4958:32;;1992:1815:333;4958:32:327;1992:1815:333;;;;4958:32:327;4802:64;4835:31;;1992:1815:333;4835:31:327;1992:1815:333;;;;4835:31:327;1064:117:305;2931:8:352;3179:19;1992:1815:333;2931:8:352;:::i;:::-;1064:117:305;;;1992:1815:333;;;;;;;;;;;;3579:43:305;1992:1815:333;;;3579:43:305;:::i;1992:1815:333:-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;635:65:55;1992:1815:333;1793:19:59;1992:1815:333;635:65:55;:::i;1992:1815:333:-;;;;;;;;-1:-1:-1;;1992:1815:333;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;1002:301:75;1992:1815:333;1146:19:75;1992:1815:333;1146:53:75;;;1142:96;;1992:1815:333;;1255:41:75;1002:301;:::o;1142:96::-;1215:12;;1992:1815:333;1215:12:75;:::o;1992:1815:333:-;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1992:1815:333;;;;;;:::o;1359:340:59:-;;1992:1815:333;;;1477:35:59;;1473:78;;1579:25;1564:40;;1560:82;;1992:1815:333;500:10:59;;;;;1992:1815:333;500:10:59;;;1359:340;:::o;1560:82::-;1620:11;;1627:4;1620:11;:::o;27798:360:327:-;1992:1815:333;;;;;;;;;;;;;30700:19:327;27948:64;;2220:8;30979:33;:38;2220:8;;28073:11;1992:1815:333;;;28073:11:327;1992:1815:333;;;;;;;;28066:27:327;:::o;583:77:341:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;7385:956:327;;;1992:1815:333;;7507:16:327;;;7503:58;;1992:1815:333;7521:1:327;1992:1815:333;;;;;7521:1:327;1992:1815:333;;;;;30700:19:327;;;7615:64;;1992:1815:333;;;7693:26:327;;;7689:73;;7778:30;;;;;:::i;:::-;7777:31;7773:185;;7385:956;1992:1815:333;;;7521:1:327;1992:1815:333;;;;;;7521:1:327;1992:1815:333;2220:8:327;8022:10;;;8018:274;;7385:956;8307:27;;7521:1;8307:27;;7385:956::o;8018:274::-;8155:10;;1992:1815:333;-1:-1:-1;1992:1815:333;;;;;-1:-1:-1;1992:1815:333;;;;;2220:8:327;;1992:1815:333;-1:-1:-1;1992:1815:333;;;;-1:-1:-1;1992:1815:333;8155:10:327;1992:1815:333;;;2220:8:327;;8018:274;;;7773:185;2220:8;30979:33;:38;;;7828:59;;7773:185;7824:123;;7773:185;;;7824:123;7896:51;1992:1815:333;7896:51:327;;;7521:1;7896:51;1992:1815:333;7896:51:327;1992:1815:333;;;;;;7521:1:327;7896:51;7828:59;1992:1815:333;;7521:1:327;1992:1815:333;7867:11:327;;;1992:1815:333;;;;7521:1:327;1992:1815:333;;;;;;7857:30:327;;7828:59;;7689:73;7728:34;;;7521:1;7728:34;;1992:1815:333;;;;7521:1:327;7728:34;1992:1815:333;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3640:170:41;1992:1815:333;-1:-1:-1;1992:1815:333;;;;-1:-1:-1;1992:1815:333;;;;-1:-1:-1;1992:1815:333;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;3741:25:41;3737:66;;3640:170;:::o;3737:66::-;1992:1815:333;3775:28:41;;-1:-1:-1;3775:28:41;1992:1815:333;3775:28:41;1992:1815:333;;;;;-1:-1:-1;3775:28:41;14035:460:327;;1992:1815:333;;14119:16:327;;;14115:54;;1992:1815:333;14133:1:327;1992:1815:333;;;;;;14133:1:327;1992:1815:333;;;14179:72:327;;14415:10;1992:1815:333;;14133:1:327;1992:1815:333;;;;;;14133:1:327;1992:1815:333;2220:8:327;1992:1815:333;-1:-1:-1;1992:1815:333;14415:10:327;1992:1815:333;;;-1:-1:-1;1992:1815:333;14415:10:327;1992:1815:333;;;2220:8:327;;14133:1;14455:33;;;;14035:460::o;14179:72::-;14223:28;;14133:1;14223:28;;1992:1815:333;;14133:1:327;14223:28;1992:1815:333;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;27143:254:327;1992:1815:333;-1:-1:-1;1992:1815:333;;;;;-1:-1:-1;1992:1815:333;;;30700:19:327;;;27291:64;;27365:25;27143:254;:::o;27291:64::-;27324:31;-1:-1:-1;27324:31:327;;1992:1815:333;;-1:-1:-1;27324:31:327;1992:1815:333;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;1992:1815:333;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;583:77:341;;-1:-1:-1;583:77:341;;;;1992:1815:333;-1:-1:-1;583:77:341;1992:1815:333;-1:-1:-1;1992:1815:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3271:479:352;1992:1815:333;;;;3524:31:352;;;;:68;;3271:479;3520:224;;3271:479;;:::o;3520:224::-;1992:1815:333;;;3613:51:352;1992:1815:333;;3613:51:352;;;;1992:1815:333;3613:51:352;;3648:4;3613:51;;;1992:1815:333;;;;;;;;3613:51:352;;;;;;;-1:-1:-1;3613:51:352;;;3520:224;3612:52;;3608:126;;3271:479;:::o;3608:126::-;3691:28;-1:-1:-1;3691:28:352;3613:51;1992:1815:333;;-1:-1:-1;3691:28:352;3613:51;;;;1992:1815:333;3613:51:352;1992:1815:333;3613:51:352;;;;;;;:::i;:::-;;;;3524:68;3559:29;;;:33;;3524:68;;907:917:76;1992:1815:333;1029:19:76;1992:1815:333;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;1992:1815:333;;;;;;1676:74:76;;;;1992:1815:333;1676:74:76;;;;;;1992:1815:333;1327:10:76;1992:1815:333;;;;1744:4:76;1992:1815:333;;;;1676:74:76;;;;;;;1992:1815:333;1676:74:76;;;1630:120;;;;;1676:74;;;;1992:1815:333;1676:74:76;1992:1815:333;1676:74:76;;;;;;;:::i;:::-;;;;1323:95;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;;30284:185:327;1992:1815:333;;;;;;;30414:16:327;;30284:185;30413:49;;;;30284:185;30406:56;;;30284:185;:::o;30413:49::-;30435:11;:18;;;1992:1815:333;;-1:-1:-1;1992:1815:333;30435:11:327;1992:1815:333;;;;-1:-1:-1;1992:1815:333;30435:27:327;1992:1815:333;-1:-1:-1;1992:1815:333;;;500:10:59;1992:1815:333;-1:-1:-1;1992:1815:333;500:10:59;;30413:49:327;;;;;29701:270;1992:1815:333;29701:270:327;1992:1815:333;29701:270:327;1992:1815:333;29701:270:327;;;;;1992:1815:333;;;;;29832:65:327;;;;;1992:1815:333;29832:65:327;;1992:1815:333;29832:65:327;;;1992:1815:333;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29832:65:327;;-1:-1:-1;29832:65:327;;;;;;;;-1:-1:-1;29832:65:327;;;29701:270;1992:1815:333;;;;;29832:84:327;29828:136;;29701:270;;:::o;29832:65::-;1992:1815:333;29832:65:327;;1992:1815:333;29832:65:327;;;;;;1992:1815:333;29832:65:327;;;:::i;:::-;;;1992:1815:333;;;;;;;;;;;;;29832:65:327;1992:1815:333;29832:65:327;;;;;-1:-1:-1;29832:65:327;"},"gasEstimates":{"creation":{"codeDepositCost":"3326000","executionCost":"infinite","totalCost":"infinite"},"external":{"MINTER_ROLE()":"826","ROYALTY_FEE_DENOMINATOR()":"870","approve(address,uint256)":"infinite","balanceOf(address)":"2751","batchMint(address,uint256[])":"infinite","batchTransferFrom(address,address,uint256[])":"infinite","deliver(address[],uint256[])":"infinite","forwarderRegistry()":"infinite","getApproved(uint256)":"4618","grantRole(bytes32,address)":"infinite","hasRole(bytes32,address)":"2939","init(string,string,address,address)":"infinite","isApprovedForAll(address,address)":"3267","isTrustedForwarder(address)":"infinite","metadataResolver()":"2803","mint(address,uint256)":"infinite","name()":"infinite","operatorFilterRegistry()":"2847","owner()":"2693","ownerOf(uint256)":"2709","recoverERC20s(address[],address[],uint256[])":"infinite","recoverERC721s(address[],address[],uint256[])":"infinite","recoverETH(address[],uint256[])":"infinite","renounceRole(bytes32)":"infinite","revokeRole(bytes32,address)":"infinite","royaltyInfo(uint256,uint256)":"2694","safeMint(address,uint256,bytes)":"infinite","safeTransferFrom(address,address,uint256)":"infinite","safeTransferFrom(address,address,uint256,bytes)":"infinite","setApprovalForAll(address,bool)":"infinite","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite","supportsInterface(bytes4)":"2436","symbol()":"infinite","tokenURI(uint256)":"infinite","transferFrom(address,address,uint256)":"infinite","transferOwnership(address)":"infinite","updateOperatorFilterRegistry(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","batchMint(address,uint256[])":"4684d7e9","batchTransferFrom(address,address,uint256[])":"f3993d11","deliver(address[],uint256[])":"9da5e832","forwarderRegistry()":"2b4c9f16","getApproved(uint256)":"081812fc","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","init(string,string,address,address)":"0e07f854","isApprovedForAll(address,address)":"e985e9c5","isTrustedForwarder(address)":"572b6c05","metadataResolver()":"a0c76f62","mint(address,uint256)":"40c10f19","name()":"06fdde03","operatorFilterRegistry()":"b0ccc31e","owner()":"8da5cb5b","ownerOf(uint256)":"6352211e","recoverERC20s(address[],address[],uint256[])":"73c8a958","recoverERC721s(address[],address[],uint256[])":"c3666c36","recoverETH(address[],uint256[])":"f7ba94bd","renounceRole(bytes32)":"8bb9c5bf","revokeRole(bytes32,address)":"d547741f","royaltyInfo(uint256,uint256)":"2a55205a","safeMint(address,uint256,bytes)":"8832e6e3","safeTransferFrom(address,address,uint256)":"42842e0e","safeTransferFrom(address,address,uint256,bytes)":"b88d4fde","setApprovalForAll(address,bool)":"a22cb465","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","symbol()":"95d89b41","tokenURI(uint256)":"c87b56dd","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721BalanceOfAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721ExistingToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721MintToAddressZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonApprovedForTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonExistingToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonOwnedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721SafeTransferRejected\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ERC721SelfApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721TransferToAddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"IncorrectTokenContractType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"OperatorNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"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\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"batchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"deliver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forwarderRegistry\",\"outputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"}],\"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\":\"hasRole_\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"metadataResolver\",\"type\":\"address\"},{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"filterRegistry\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"approvedForAll\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC20s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC721[]\",\"name\":\"contracts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"recoverERC721s\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"recoverETH\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"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\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"ERC721ExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that already exists.\"}}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"params\":{\"sender\":\"The message sender.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721NonExistingToken(uint256)\":[{\"params\":{\"tokenId\":\"The identifier of the token that was checked.\"}}],\"ERC721NonOwnedToken(address,uint256)\":[{\"params\":{\"account\":\"The account that was expected to own the token.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"params\":{\"recipient\":\"The recipient contract.\",\"tokenId\":\"The identifier of the token.\"}}],\"ERC721SelfApproval(address)\":[{\"params\":{\"account\":\"The account trying to approve itself.\"}}],\"ERC721SelfApprovalForAll(address)\":[{\"params\":{\"account\":\"The account trying to approveForAll itself.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"IncorrectTokenContractType(address)\":[{\"params\":{\"tokenContract\":\"The token contract being recovered.\"}}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotRoleHolder(bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role the caller is missing.\"}}],\"OperatorNotAllowed(address)\":[{\"params\":{\"operator\":\"The address that is not authorized.\"}}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"approved\":\"The approved address.\",\"owner\":\"The token owner.\",\"tokenId\":\"The approved token identifier.\"}},\"ApprovalForAll(address,address,bool)\":{\"params\":{\"approved\":\"True when then approval is set, false when it is unset.\",\"operator\":\"The approved address.\",\"owner\":\"The tokens owner.\"}},\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}},\"RoleGranted(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been granted the role.\",\"operator\":\"The account that granted the role.\",\"role\":\"The role that has been granted.\"}},\"RoleRevoked(bytes32,address,address)\":{\"params\":{\"account\":\"The account that has been revoked the role.\",\"operator\":\"The account that revoked the role.\",\"role\":\"The role that has been revoked.\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"The previous token owner.\",\"to\":\"The new token owner.\",\"tokenId\":\"The transferred token identifier.\"}}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\",\"params\":{\"to\":\"The address to approve, or the zero address to remove any existing approval.\",\"tokenId\":\"The token identifier to give approval for.\"}},\"balanceOf(address)\":{\"details\":\"Reverts if `owner` is the zero address.\",\"params\":{\"owner\":\"The address to query the balance of.\"},\"returns\":{\"balance\":\"The amount owned by the owner.\"}},\"batchMint(address,uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new tokens owner.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"batchTransferFrom(address,address,uint256[])\":{\"details\":\"Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"Current tokens owner.\",\"to\":\"Address of the new token owner.\",\"tokenIds\":\"Identifiers of the tokens to transfer.\"}},\"deliver(address[],uint256[])\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"recipients\":\"Addresses of the new tokens owners.\",\"tokenIds\":\"Identifiers of the tokens to mint.\"}},\"getApproved(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the approval of.\"},\"returns\":{\"approved\":\"The approved address for the token identifier, or the zero address if no approval is set.\"}},\"grantRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleGranted} event if the account did not previously have the role.\",\"params\":{\"account\":\"The account to grant the role to.\",\"role\":\"The role to grant.\"}},\"hasRole(bytes32,address)\":{\"params\":{\"account\":\"The account.\",\"role\":\"The role.\"},\"returns\":{\"hasRole_\":\"Whether `account` has `role`.\"}},\"isApprovedForAll(address,address)\":{\"params\":{\"operator\":\"The address which receives the approval for all tokens.\",\"owner\":\"The address which gives the approval for all tokens.\"},\"returns\":{\"approvedForAll\":\"Whether the operator is approved for all tokens by the owner.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The forwarder to check.\"},\"returns\":{\"_0\":\"True if `forwarder` is trusted, false if not.\"}},\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"mint(address,uint256)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The name of the token.\"}},\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"ownerOf(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier to query the owner of.\"},\"returns\":{\"tokenOwner\":\"The owner of the token identifier.\"}},\"recoverERC20s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.Reverts if one of the ERC20 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\",\"tokens\":\"the list of ERC20 token addresses.\"}},\"recoverERC721s(address[],address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.Reverts if one of the ERC721 transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"contracts\":\"the list of ERC721 contract addresses.\",\"tokenIds\":\"the list of token ids to transfer.\"}},\"recoverETH(address[],uint256[])\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.Reverts if one of the ETH transfers fails for any reason.\",\"params\":{\"accounts\":\"the list of accounts to transfer the tokens to.\",\"amounts\":\"the list of token amounts to transfer.\"}},\"renounceRole(bytes32)\":{\"details\":\"Reverts if `sender` does not have `role`.Emits a {RoleRevoked} event.\",\"params\":{\"role\":\"The role to renounce.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Emits a {RoleRevoked} event if the account previously had the role.\",\"params\":{\"account\":\"The account to revoke the role from.\",\"role\":\"The role to revoke.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"safeMint(address,uint256,bytes)\":{\"details\":\"Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\",\"params\":{\"data\":\"Optional data to pass along to the receiver call.\",\"to\":\"Address of the new token owner.\",\"tokenId\":\"Identifier of the token to mint.\"}},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"data\":\"Optional data to send along to a receiver contract.\",\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\",\"params\":{\"approved\":\"True to set an approval for all tokens, false to unset it.\",\"operator\":\"The address to approve for all tokens.\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The symbol of the token.\"}},\"tokenURI(uint256)\":{\"details\":\"Reverts if `tokenId` does not exist.\",\"params\":{\"tokenId\":\"The token identifier.\"},\"returns\":{\"uri\":\"The metadata URI for the token identifier.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\",\"params\":{\"from\":\"The current token owner.\",\"to\":\"The recipient of the token transfer. Self-transfers are possible.\",\"tokenId\":\"The identifier of the token to transfer.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"ERC721BalanceOfAddressZero()\":[{\"notice\":\"Thrown when querying the balance of the zero address.\"}],\"ERC721ExistingToken(uint256)\":[{\"notice\":\"Thrown when minting a token that already exists.\"}],\"ERC721MintToAddressZero()\":[{\"notice\":\"Thrown when minting a token to the zero address.\"}],\"ERC721NonApprovedForApproval(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\"}],\"ERC721NonApprovedForTransfer(address,address,uint256)\":[{\"notice\":\"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\"}],\"ERC721NonExistingToken(uint256)\":[{\"notice\":\"Thrown when a token does not exist but is required to.\"}],\"ERC721NonOwnedToken(address,uint256)\":[{\"notice\":\"Thrown when a token is not owned by the expected account.\"}],\"ERC721SafeTransferRejected(address,uint256)\":[{\"notice\":\"Thrown when a safe transfer is rejected by the recipient contract.\"}],\"ERC721SelfApproval(address)\":[{\"notice\":\"Thrown when trying to approve oneself.\"}],\"ERC721SelfApprovalForAll(address)\":[{\"notice\":\"Thrown when trying to approveForAll oneself.\"}],\"ERC721TransferToAddressZero()\":[{\"notice\":\"Thrown when transferring a token to the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"IncorrectTokenContractType(address)\":[{\"notice\":\"Thrown when trying to recover a token of the wrong contract type.\"}],\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotRoleHolder(bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role.\"}],\"OperatorNotAllowed(address)\":[{\"notice\":\"Thrown when transferring to or giving approval to a non-authorized operator.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Emitted when a single token approval is set.\"},\"ApprovalForAll(address,address,bool)\":{\"notice\":\"Emitted when an approval for all tokens is set or unset.\"},\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"},\"RoleGranted(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is granted to `account`.\"},\"RoleRevoked(bytes32,address,address)\":{\"notice\":\"Emitted when `role` is revoked from `account`.\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Emitted when a token is transferred.\"}},\"kind\":\"user\",\"methods\":{\"approve(address,uint256)\":{\"notice\":\"Sets or unsets an approval to transfer a single token on behalf of its owner.\"},\"balanceOf(address)\":{\"notice\":\"Gets the balance of an address.\"},\"batchMint(address,uint256[])\":{\"notice\":\"Unsafely mints a batch of tokens.\"},\"batchTransferFrom(address,address,uint256[])\":{\"notice\":\"Unsafely transfers a batch of tokens to a recipient.\"},\"deliver(address[],uint256[])\":{\"notice\":\"Unsafely mints tokens to multiple recipients.\"},\"getApproved(uint256)\":{\"notice\":\"Gets the approved address for a token.\"},\"grantRole(bytes32,address)\":{\"notice\":\"Grants a role to an account.\"},\"hasRole(bytes32,address)\":{\"notice\":\"Retrieves whether an account has a role.\"},\"isApprovedForAll(address,address)\":{\"notice\":\"Gets whether an operator is approved for all tokens by an owner.\"},\"isTrustedForwarder(address)\":{\"notice\":\"Checks whether a forwarder is trusted.\"},\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"mint(address,uint256)\":{\"notice\":\"Unsafely mints a token.\"},\"name()\":{\"notice\":\"Gets the name of the token. E.g. \\\"My Token\\\".\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"ownerOf(uint256)\":{\"notice\":\"Gets the owner of a token.\"},\"recoverERC20s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverERC721s(address[],address[],uint256[])\":{\"notice\":\"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\"},\"recoverETH(address[],uint256[])\":{\"notice\":\"Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\"},\"renounceRole(bytes32)\":{\"notice\":\"Renounces a role by the sender.\"},\"revokeRole(bytes32,address)\":{\"notice\":\"Revokes a role from an account.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"safeMint(address,uint256,bytes)\":{\"notice\":\"Safely mints a token.\"},\"safeTransferFrom(address,address,uint256)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"notice\":\"Safely transfers the ownership of a token to a recipient.\"},\"setApprovalForAll(address,bool)\":{\"notice\":\"Sets or unsets an approval to transfer all tokens on behalf of their owner.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"symbol()\":{\"notice\":\"Gets the symbol of the token. E.g. \\\"TOK\\\".\"},\"tokenURI(uint256)\":{\"notice\":\"Gets the metadata URI for a token identifier.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Unsafely transfers the ownership of a token to a recipient.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol\":\"ERC721FullProxied\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC1363.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\\n\\npragma solidity >=0.6.2;\\n\\nimport {IERC20} from \\\"./IERC20.sol\\\";\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @title IERC1363\\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\\n *\\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\\n */\\ninterface IERC1363 is IERC20, IERC165 {\\n    /*\\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\\n     * 0xb0202a11 ===\\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\\n     */\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\\n     * @param from The address which you want to send tokens from.\\n     * @param to The address which you want to transfer to.\\n     * @param value The amount of tokens to be transferred.\\n     * @param data Additional data with no specified format, sent in call to `to`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\\n     * @param spender The address which will spend the funds.\\n     * @param value The amount of tokens to be spent.\\n     * @param data Additional data with no specified format, sent in call to `spender`.\\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\\n     */\\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\\n}\\n\",\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\nimport {IERC20} from \\\"../token/ERC20/IERC20.sol\\\";\\n\",\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\nimport {IERC1363} from \\\"../../../interfaces/IERC1363.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    /**\\n     * @dev An operation with an ERC-20 token failed.\\n     */\\n    error SafeERC20FailedOperation(address token);\\n\\n    /**\\n     * @dev Indicates a failed `decreaseAllowance` request.\\n     */\\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\\n    }\\n\\n    /**\\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\\n     */\\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        forceApprove(token, spender, oldAllowance + value);\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\\n     * value, non-reverting calls are assumed to be successful.\\n     *\\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \\\"client\\\"\\n     * smart contract uses ERC-7674 to set temporary allowances, then the \\\"client\\\" smart contract should avoid using\\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\\n        unchecked {\\n            uint256 currentAllowance = token.allowance(address(this), spender);\\n            if (currentAllowance < requestedDecrease) {\\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\\n            }\\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     *\\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\\n     * only sets the \\\"standard\\\" allowance. Any temporary allowance will remain active, in addition to the value being\\n     * set here.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            safeTransfer(token, to, value);\\n        } else if (!token.transferAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function transferFromAndCallRelaxed(\\n        IERC1363 token,\\n        address from,\\n        address to,\\n        uint256 value,\\n        bytes memory data\\n    ) internal {\\n        if (to.code.length == 0) {\\n            safeTransferFrom(token, from, to, value);\\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\\n     * targeting contracts.\\n     *\\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\\n     * once without retrying, and relies on the returned value to be true.\\n     *\\n     * Reverts if the returned value is other than `true`.\\n     */\\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\\n        if (to.code.length == 0) {\\n            forceApprove(token, to, value);\\n        } else if (!token.approveAndCall(to, value, data)) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            // bubble errors\\n            if iszero(success) {\\n                let ptr := mload(0x40)\\n                returndatacopy(ptr, 0, returndatasize())\\n                revert(ptr, returndatasize())\\n            }\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n\\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\\n            revert SafeERC20FailedOperation(address(token));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        bool success;\\n        uint256 returnSize;\\n        uint256 returnValue;\\n        assembly (\\\"memory-safe\\\") {\\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\\n            returnSize := returndatasize()\\n            returnValue := mload(0)\\n        }\\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\\n    }\\n}\\n\",\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Errors} from \\\"./Errors.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev There's no code at `target` (it is not a contract).\\n     */\\n    error AddressEmptyCode(address target);\\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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        if (address(this).balance < amount) {\\n            revert Errors.InsufficientBalance(address(this).balance, amount);\\n        }\\n\\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\\\"\\\");\\n        if (!success) {\\n            _revert(returndata);\\n        }\\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 or custom error, it is bubbled\\n     * up by this function (like regular Solidity function calls). However, if\\n     * the call reverted with no returned reason, this function reverts with a\\n     * {Errors.FailedCall} error.\\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    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0);\\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    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        if (address(this).balance < value) {\\n            revert Errors.InsufficientBalance(address(this).balance, value);\\n        }\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\\n     * of an unsuccessful call.\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata\\n    ) internal view returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            // only check if target is a contract if the call was successful and the return data is empty\\n            // otherwise we already know that it was a contract\\n            if (returndata.length == 0 && target.code.length == 0) {\\n                revert AddressEmptyCode(target);\\n            }\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n     * revert reason or with a default {Errors.FailedCall} error.\\n     */\\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n        if (!success) {\\n            _revert(returndata);\\n        } else {\\n            return returndata;\\n        }\\n    }\\n\\n    /**\\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\\n     */\\n    function _revert(bytes memory returndata) 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            assembly (\\\"memory-safe\\\") {\\n                revert(add(returndata, 0x20), mload(returndata))\\n            }\\n        } else {\\n            revert Errors.FailedCall();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of common custom errors used in multiple contracts\\n *\\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\\n * It is recommended to avoid relying on the error API for critical functionality.\\n *\\n * _Available since v5.1._\\n */\\nlibrary Errors {\\n    /**\\n     * @dev The ETH balance of the account is not enough to perform the operation.\\n     */\\n    error InsufficientBalance(uint256 balance, uint256 needed);\\n\\n    /**\\n     * @dev A call to an address target failed. The target may have reverted.\\n     */\\n    error FailedCall();\\n\\n    /**\\n     * @dev The deployment failed.\\n     */\\n    error FailedDeployment();\\n\\n    /**\\n     * @dev A necessary precompile is missing.\\n     */\\n    error MissingPrecompile(address);\\n}\\n\",\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity >=0.4.16;\\n\\n/**\\n * @dev Interface of the ERC-165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\\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[ERC 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\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\"},\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/base/AccessControlBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IAccessControl} from \\\"./../../access/interfaces/IAccessControl.sol\\\";\\nimport {AccessControlStorage} from \\\"./../libraries/AccessControlStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Access control via roles management (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract AccessControlBase is IAccessControl, Context {\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    function grantRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().grantRole(role, account, operator);\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    function revokeRole(bytes32 role, address account) external virtual {\\n        address operator = _msgSender();\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(operator);\\n        AccessControlStorage.layout().revokeRole(role, account, operator);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function renounceRole(bytes32 role) external virtual {\\n        AccessControlStorage.layout().renounceRole(_msgSender(), role);\\n    }\\n\\n    /// @inheritdoc IAccessControl\\n    function hasRole(bytes32 role, address account) external view virtual returns (bool hasRole_) {\\n        return AccessControlStorage.layout().hasRole(role, account);\\n    }\\n}\\n\",\"keccak256\":\"0x7720bb6d72187dd9c255c7897bbaeee40173fa82f8ee362d7e1d313194c9a8bd\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/ForwarderRegistryContext.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./interfaces/IForwarderRegistry.sol\\\";\\nimport {IERC2771} from \\\"./interfaces/IERC2771.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContext is ForwarderRegistryContextBase, IERC2771 {\\n    /// @param forwarderRegistry_ The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry_) ForwarderRegistryContextBase(forwarderRegistry_) {}\\n\\n    function forwarderRegistry() external view returns (IForwarderRegistry) {\\n        return _FORWARDER_REGISTRY;\\n    }\\n\\n    /// @inheritdoc IERC2771\\n    function isTrustedForwarder(address forwarder) external view virtual returns (bool) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return false;\\n        }\\n\\n        return forwarder == address(_FORWARDER_REGISTRY);\\n    }\\n}\\n\",\"keccak256\":\"0x1fee46003f598a3e07c5b2a57edfba5c23dfca876c2782d6aa8aa3727a20e1f2\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IERC2771.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Secure Protocol for Native Meta Transactions.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\ninterface IERC2771 {\\n    /// @notice Checks whether a forwarder is trusted.\\n    /// @param forwarder The forwarder to check.\\n    /// @return isTrusted True if `forwarder` is trusted, false if not.\\n    function isTrustedForwarder(address forwarder) external view returns (bool isTrusted);\\n}\\n\",\"keccak256\":\"0x566a4fcbbaf1b9f08653e15e315af74b2377df712379a1984d9db53f719b0049\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/security/base/TokenRecoveryBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {ITokenRecovery} from \\\"./../interfaces/ITokenRecovery.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {TokenRecoveryLibrary} from \\\"./../libraries/TokenRecoveryLibrary.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Recovery mechanism for ETH/ERC20/ERC721 tokens accidentally sent to this contract (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract TokenRecoveryBase is ITokenRecovery, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverETH(accounts, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC20s(accounts, tokens, amounts);\\n    }\\n\\n    /// @inheritdoc ITokenRecovery\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) public virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        TokenRecoveryLibrary.recoverERC721s(accounts, contracts, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0xd81c9445b586d0965b5b458621579e21eff3d2958e344f3fbe9af5d0dd372352\",\"license\":\"MIT\"},\"contracts/security/interfaces/ITokenRecovery.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\n\\n/// @title Uniquely identified seals management.\\ninterface ITokenRecovery {\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) external;\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x72e810d4766ecdde13d93a5f6feb83d38656c632ad9310cc1972e806a7673b7a\",\"license\":\"MIT\"},\"contracts/security/libraries/TokenRecoveryLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {IERC20} from \\\"@openzeppelin/contracts/interfaces/IERC20.sol\\\";\\nimport {IERC721} from \\\"./../../token/ERC721/interfaces/IERC721.sol\\\";\\nimport {IERC165} from \\\"./../../introspection/interfaces/IERC165.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary TokenRecoveryLibrary {\\n    using SafeERC20 for IERC20;\\n    using Address for address payable;\\n\\n    /// @notice Thrown when trying to recover a token of the wrong contract type.\\n    /// @param tokenContract The token contract being recovered.\\n    error IncorrectTokenContractType(address tokenContract);\\n\\n    /// @notice Extract ETH tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Note: While contracts can generally prevent accidental ETH transfer by implementating a reverting\\n    ///  `receive()` function, this can still be bypassed in a `selfdestruct(address)` scenario.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ETH tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} `accounts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ETH transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverETH(address payable[] calldata accounts, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            accounts[i].sendValue(amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens\\n    ///  so that the extraction is limited to only amounts sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `tokens` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC20 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param tokens the list of ERC20 token addresses.\\n    /// @param amounts the list of token amounts to transfer.\\n    function recoverERC20s(address[] calldata accounts, IERC20[] calldata tokens, uint256[] calldata amounts) internal {\\n        uint256 length = accounts.length;\\n        if (length != tokens.length || length != amounts.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            tokens[i].safeTransfer(accounts[i], amounts[i]);\\n        }\\n    }\\n\\n    /// @notice Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.\\n    /// @dev Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens\\n    ///  so that the extraction is limited to only tokens sent accidentally.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `accounts`, `contracts` and `amounts` do not have the same length.\\n    /// @dev Reverts if one of the ERC721 transfers fails for any reason.\\n    /// @param accounts the list of accounts to transfer the tokens to.\\n    /// @param contracts the list of ERC721 contract addresses.\\n    /// @param tokenIds the list of token ids to transfer.\\n    function recoverERC721s(address[] calldata accounts, IERC721[] calldata contracts, uint256[] calldata tokenIds) internal {\\n        uint256 length = accounts.length;\\n        if (length != contracts.length || length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            IERC721 tokenContract = contracts[i];\\n            if (!IERC165(address(tokenContract)).supportsInterface(type(IERC721).interfaceId)) {\\n                revert IncorrectTokenContractType(address(tokenContract));\\n            }\\n            contracts[i].safeTransferFrom(address(this), accounts[i], tokenIds[i]);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x171feb402a24d54af4ab4cb801344ff3de98e0dcdd121cd8a8fa993c66290308\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721BatchTransferWithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721BatchTransferWithOperatorFiltererBase is IERC721BatchTransfer, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721BatchTransfer\\n    /// @dev Reverts with OperatorNotAllowed if the sender is not `from` and is not allowed by the operator registry.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().batchTransferFrom(sender, from, to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9662b3904e4cfe573f109fbd3e33017b0713a95df320757b089d18a2025214ea\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721DeliverableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable (proxiable version).\\n/// @notice ERC721Deliverable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721DeliverableBase is IERC721Deliverable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    // prevent variable name clash with public ERC721MintableBase.MINTER_ROLE\\n    bytes32 private constant _MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Deliverable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(_MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().deliver(recipients, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x6f0dbfef952c903310c9b4636526323ac449a36989da9a1cf9f7ccd529206e8b\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {TokenMetadataBase} from \\\"./../../metadata/base/TokenMetadataBase.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata (proxiable version).\\n/// @notice This contracts uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\nabstract contract ERC721MetadataBase is TokenMetadataBase, IERC721Metadata {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @inheritdoc IERC721Metadata\\n    function name() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenName) {\\n        return TokenMetadataBase.name();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function symbol() public view virtual override(IERC721Metadata, TokenMetadataBase) returns (string memory tokenSymbol) {\\n        return TokenMetadataBase.symbol();\\n    }\\n\\n    /// @inheritdoc IERC721Metadata\\n    function tokenURI(uint256 tokenId) external view virtual returns (string memory uri) {\\n        ERC721Storage.layout().ownerOf(tokenId); // reverts if the token does not exist\\n        return TokenMetadataStorage.layout().tokenMetadataURI(address(this), tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xdd3c8a10d6c478e8f13f9822a06bdab496c6b4b88f5a8e03c4de9d79e9ead3c0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721MintableBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../../access/libraries/AccessControlStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable (proxiable version).\\n/// @notice ERC721Mintable implementation where burnt tokens can be minted again.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC721 (Non-Fungible Token Standard).\\n/// @dev Note: This contract requires AccessControl.\\nabstract contract ERC721MintableBase is IERC721Mintable, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function mint(address to, uint256 tokenId) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().mint(to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().safeMint(_msgSender(), to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721Mintable\\n    /// @dev Reverts with {NotRoleHolder} if the sender does not have the 'minter' role.\\n    function batchMint(address to, uint256[] calldata tokenIds) external virtual {\\n        AccessControlStorage.layout().enforceHasRole(MINTER_ROLE, _msgSender());\\n        ERC721Storage.layout().batchMint(to, tokenIds);\\n    }\\n}\\n\",\"keccak256\":\"0x9867059a441833fcad9f72c55f4456bfbcd3f8e2068baf9a1c9b5d71d32f39f0\",\"license\":\"MIT\"},\"contracts/token/ERC721/base/ERC721WithOperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {ERC721Storage} from \\\"./../libraries/ERC721Storage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC721 Non-Fungible Token Standard with Operator Filterer (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires OperatorFilterer.\\nabstract contract ERC721WithOperatorFiltererBase is IERC721, Context {\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `to` is not the zero address and is not allowed by the operator registry.\\n    function approve(address to, uint256 tokenId) external virtual {\\n        if (to != address(0)) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(to);\\n        }\\n        ERC721Storage.layout().approve(_msgSender(), to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if `approved` is true and `operator` is not allowed by the operator registry.\\n    function setApprovalForAll(address operator, bool approved) external virtual {\\n        if (approved) {\\n            OperatorFiltererStorage.layout().requireAllowedOperatorForApproval(operator);\\n        }\\n        ERC721Storage.layout().setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function transferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().transferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    /// @dev Reverts with {OperatorNotAllowed} if the sender is not `from` and is not allowed by the operator registry.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external virtual {\\n        address sender = _msgSender();\\n        OperatorFiltererStorage.layout().requireAllowedOperatorForTransfer(sender, from);\\n        ERC721Storage.layout().safeTransferFrom(sender, from, to, tokenId, data);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function balanceOf(address owner) external view virtual returns (uint256 balance) {\\n        return ERC721Storage.layout().balanceOf(owner);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function ownerOf(uint256 tokenId) external view virtual returns (address tokenOwner) {\\n        return ERC721Storage.layout().ownerOf(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function getApproved(uint256 tokenId) external view virtual returns (address approved) {\\n        return ERC721Storage.layout().getApproved(tokenId);\\n    }\\n\\n    /// @inheritdoc IERC721\\n    function isApprovedForAll(address owner, address operator) external view virtual returns (bool approvedForAll) {\\n        return ERC721Storage.layout().isApprovedForAll(owner, operator);\\n    }\\n}\\n\",\"keccak256\":\"0x2b848dd52dbe5ef4cb25f29d3a12963388f90c1c0e6fade51c71f6f3c27c2614\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to approve oneself.\\n/// @param account The account trying to approve itself.\\nerror ERC721SelfApproval(address account);\\n\\n/// @notice Thrown when trying to approveForAll oneself.\\n/// @param account The account trying to approveForAll itself.\\nerror ERC721SelfApprovalForAll(address account);\\n\\n/// @notice Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForApproval(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when transferring a token to the zero address.\\nerror ERC721TransferToAddressZero();\\n\\n/// @notice Thrown when a token does not exist but is required to.\\n/// @param tokenId The identifier of the token that was checked.\\nerror ERC721NonExistingToken(uint256 tokenId);\\n\\n/// @notice Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner.\\n/// @param sender The message sender.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonApprovedForTransfer(address sender, address owner, uint256 tokenId);\\n\\n/// @notice Thrown when a token is not owned by the expected account.\\n/// @param account The account that was expected to own the token.\\n/// @param tokenId The identifier of the token.\\nerror ERC721NonOwnedToken(address account, uint256 tokenId);\\n\\n/// @notice Thrown when a safe transfer is rejected by the recipient contract.\\n/// @param recipient The recipient contract.\\n/// @param tokenId The identifier of the token.\\nerror ERC721SafeTransferRejected(address recipient, uint256 tokenId);\\n\\n/// @notice Thrown when querying the balance of the zero address.\\nerror ERC721BalanceOfAddressZero();\\n\",\"keccak256\":\"0xbc45e7ec53de7e1db33606ffdfbfbdc17ea98a36721ef36f5c046d8886be8d40\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token to the zero address.\\nerror ERC721MintToAddressZero();\\n\\n/// @notice Thrown when minting a token that already exists.\\n/// @param tokenId The identifier of the token that already exists.\\nerror ERC721ExistingToken(uint256 tokenId);\\n\",\"keccak256\":\"0xcba392b0706f461f4d20eec73cfb34300c08aaf5984c5191aabbbaddecb12eb9\",\"license\":\"MIT\"},\"contracts/token/ERC721/errors/ERC721MintableOnceErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when minting a token which has been burnt before (MintableOnce implementation).\\n/// @param tokenId The identifier of the token that has been burnt before.\\nerror ERC721BurntToken(uint256 tokenId);\\n\",\"keccak256\":\"0x3df8002c9b7766f12eb56a5ee6ca73dcf8308430e0c68dd8a78a0efcef6a7c1a\",\"license\":\"MIT\"},\"contracts/token/ERC721/events/ERC721Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when a token is transferred.\\n/// @param from The previous token owner.\\n/// @param to The new token owner.\\n/// @param tokenId The transferred token identifier.\\nevent Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n/// @notice Emitted when a single token approval is set.\\n/// @param owner The token owner.\\n/// @param approved The approved address.\\n/// @param tokenId The approved token identifier.\\nevent Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n/// @notice Emitted when an approval for all tokens is set or unset.\\n/// @param owner The tokens owner.\\n/// @param operator The approved address.\\n/// @param approved True when then approval is set, false when it is unset.\\nevent ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\",\"keccak256\":\"0xd7b95f979559cc9a82d6190981a01217598db124446d570d07b0293bd59bdca2\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, basic interface (functions).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev This interface only contains the standard functions. See IERC721Events for the events.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x80ac58cd.\\ninterface IERC721 {\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: There can only be one approved address per token at a given time.\\n    /// @dev Note: A token approval gets reset when this token is transferred, including a self-transfer.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @dev Reverts if `to` is the token owner.\\n    /// @dev Reverts if the sender is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Reverts if the sender is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient.\\n    /// @dev Note: Usage of this method is discouraged, use `safeTransferFrom` whenever possible.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer. Self-transfers are possible.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Reverts if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token identifier.\\n    function ownerOf(uint256 tokenId) external view returns (address tokenOwner);\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(uint256 tokenId) external view returns (address approved);\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(address owner, address operator) external view returns (bool approvedForAll);\\n}\\n\",\"keccak256\":\"0x7537314e71cb25cefd72f0d29439a85bedc4dd934af5697d833e128ae6a4c083\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721BatchTransfer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Batch Transfer.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0xf3993d11.\\ninterface IERC721BatchTransfer {\\n    /// @notice Unsafely transfers a batch of tokens to a recipient.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(address from, address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xea6cbf6aee13a010b783a56f506e502d30d35c91cd27bc07af07b59771811a53\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Burnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Burnable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8b8b4ef5.\\ninterface IERC721Burnable {\\n    /// @notice Burns a token.\\n    /// @dev Reverts if `tokenId` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(address from, uint256 tokenId) external;\\n\\n    /// @notice Burns a batch of tokens.\\n    /// @dev Reverts if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits an {IERC721-Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(address from, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x0a195a7dbfbfb2f114b30fd87780bdb1f89caa63bf0b130fbe4032a33293b351\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Deliverable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Deliverable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x9da5e832.\\ninterface IERC721Deliverable {\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Reverts if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts if one of `recipients` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(address[] calldata recipients, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0xd319978c792b4d993f6219548a629aeedd5effcf3c6581692140f06b1ce1e61e\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Metadata.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x5b5e139f.\\ninterface IERC721Metadata {\\n    /// @notice Gets the name of the token. E.g. \\\"My Token\\\".\\n    /// @return tokenName The name of the token.\\n    function name() external view returns (string memory tokenName);\\n\\n    /// @notice Gets the symbol of the token. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The symbol of the token.\\n    function symbol() external view returns (string memory tokenSymbol);\\n\\n    /// @notice Gets the metadata URI for a token identifier.\\n    /// @dev Reverts if `tokenId` does not exist.\\n    /// @param tokenId The token identifier.\\n    /// @return uri The metadata URI for the token identifier.\\n    function tokenURI(uint256 tokenId) external view returns (string memory uri);\\n}\\n\",\"keccak256\":\"0xd8c22753309f4e922245182d2551f889e04b2d3f7c54c0cdbd78549d5840f8c5\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Mintable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, optional extension: Mintable.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x8e773e13.\\ninterface IERC721Mintable {\\n    /// @notice Unsafely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(address to, uint256 tokenId) external;\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if `tokenId` already exists.\\n    /// @dev Reverts if `to` is a contract and the call to {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(address to, uint256 tokenId, bytes calldata data) external;\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Reverts if `to` is the zero address.\\n    /// @dev Reverts if one of `tokenIds` already exists.\\n    /// @dev Emits an {IERC721-Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(address to, uint256[] calldata tokenIds) external;\\n}\\n\",\"keccak256\":\"0x76525b029354a75d9c452aafff1701427a9c6dc1dc9bbfdbda6600388a04c4a3\",\"license\":\"MIT\"},\"contracts/token/ERC721/interfaces/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC721 Non-Fungible Token Standard, Tokens Receiver.\\n/// @notice Interface for supporting safe transfers from ERC721 contracts.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-721\\n/// @dev Note: The ERC-165 identifier for this interface is 0x150b7a02.\\ninterface IERC721Receiver {\\n    /// @notice Handles the receipt of an ERC721 token.\\n    /// @dev Note: This function is called by an ERC721 contract after a safe transfer.\\n    /// @dev Note: The ERC721 contract address is always the message sender.\\n    /// @param operator The initiator of the safe transfer.\\n    /// @param from The previous token owner.\\n    /// @param tokenId The token identifier.\\n    /// @param data Optional additional data with no specified format.\\n    /// @return magicValue `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))` (`0x150b7a02`) to accept, any other value to refuse.\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4 magicValue);\\n}\\n\",\"keccak256\":\"0x8ab8d5f5b7423ac55f4b48bb9c4bd8c5f1b7ad60d6330850c712156bd7c7a128\",\"license\":\"MIT\"},\"contracts/token/ERC721/libraries/ERC721Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n// solhint-disable-next-line max-line-length\\nimport {\\n    ERC721SelfApproval,\\n    ERC721SelfApprovalForAll,\\n    ERC721NonApprovedForApproval,\\n    ERC721TransferToAddressZero,\\n    ERC721NonExistingToken,\\n    ERC721NonApprovedForTransfer,\\n    ERC721NonOwnedToken,\\n    ERC721SafeTransferRejected,\\n    ERC721BalanceOfAddressZero\\n} from \\\"./../errors/ERC721Errors.sol\\\";\\nimport {ERC721MintToAddressZero, ERC721ExistingToken} from \\\"./../errors/ERC721MintableErrors.sol\\\";\\nimport {ERC721BurntToken} from \\\"./../errors/ERC721MintableOnceErrors.sol\\\";\\nimport {InconsistentArrayLengths} from \\\"./../../../CommonErrors.sol\\\";\\nimport {Transfer, Approval, ApprovalForAll} from \\\"./../events/ERC721Events.sol\\\";\\nimport {IERC721} from \\\"./../interfaces/IERC721.sol\\\";\\nimport {IERC721BatchTransfer} from \\\"./../interfaces/IERC721BatchTransfer.sol\\\";\\nimport {IERC721Metadata} from \\\"./../interfaces/IERC721Metadata.sol\\\";\\nimport {IERC721Mintable} from \\\"./../interfaces/IERC721Mintable.sol\\\";\\nimport {IERC721Deliverable} from \\\"./../interfaces/IERC721Deliverable.sol\\\";\\nimport {IERC721Burnable} from \\\"./../interfaces/IERC721Burnable.sol\\\";\\nimport {IERC721Receiver} from \\\"./../interfaces/IERC721Receiver.sol\\\";\\nimport {Address} from \\\"./../../../utils/libraries/Address.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC721Storage {\\n    using Address for address;\\n    using ERC721Storage for ERC721Storage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        mapping(uint256 => uint256) owners;\\n        mapping(address => uint256) balances;\\n        mapping(uint256 => address) approvals;\\n        mapping(address => mapping(address => bool)) operators;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.ERC721.ERC721.storage\\\")) - 1);\\n\\n    bytes4 internal constant ERC721_RECEIVED = IERC721Receiver.onERC721Received.selector;\\n\\n    // Single token approval flag\\n    // This bit is set in the owner's value to indicate that there is an approval set for this token\\n    uint256 internal constant TOKEN_APPROVAL_OWNER_FLAG = 1 << 160;\\n\\n    // Burnt token magic value\\n    // This magic number is used as the owner's value to indicate that the token has been burnt\\n    uint256 internal constant BURNT_TOKEN_OWNER_VALUE = 0xdead000000000000000000000000000000000000000000000000000000000000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721BatchTransfer.\\n    function initERC721BatchTransfer() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721BatchTransfer).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Metadata.\\n    function initERC721Metadata() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Metadata).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Mintable.\\n    function initERC721Mintable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Mintable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Deliverable.\\n    function initERC721Deliverable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Deliverable).interfaceId, true);\\n    }\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC721Burnable.\\n    function initERC721Burnable() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC721Burnable).interfaceId, true);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer a single token on behalf of its owner.\\n    /// @dev Note: This function implements {ERC721-approve(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721SelfApproval} if `to` is the token owner.\\n    /// @dev Reverts with {ERC721NonApprovedForApproval} if `sender` is not the token owner and has not been approved by the token owner.\\n    /// @dev Emits an {Approval} event.\\n    /// @param sender The message sender.\\n    /// @param to The address to approve, or the zero address to remove any existing approval.\\n    /// @param tokenId The token identifier to give approval for.\\n    function approve(Layout storage s, address sender, address to, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        address ownerAddress = _tokenOwner(owner);\\n        if (to == ownerAddress) revert ERC721SelfApproval(ownerAddress);\\n        if (!_isOperatable(s, ownerAddress, sender)) revert ERC721NonApprovedForApproval(sender, ownerAddress, tokenId);\\n        if (to == address(0)) {\\n            if (_tokenHasApproval(owner)) {\\n                // remove the approval bit if it is present\\n                s.owners[tokenId] = uint256(uint160(ownerAddress));\\n            }\\n        } else {\\n            uint256 ownerWithApprovalBit = owner | TOKEN_APPROVAL_OWNER_FLAG;\\n            if (owner != ownerWithApprovalBit) {\\n                // add the approval bit if it is not present\\n                s.owners[tokenId] = ownerWithApprovalBit;\\n            }\\n            s.approvals[tokenId] = to;\\n        }\\n        emit Approval(ownerAddress, to, tokenId);\\n    }\\n\\n    /// @notice Sets or unsets an approval to transfer all tokens on behalf of their owner.\\n    /// @dev Note: This function implements {ERC721-setApprovalForAll(address,bool)}.\\n    /// @dev Reverts with {ERC721SelfApprovalForAll} if `sender` is the same as `operator`.\\n    /// @dev Emits an {ApprovalForAll} event.\\n    /// @param sender The message sender.\\n    /// @param operator The address to approve for all tokens.\\n    /// @param approved True to set an approval for all tokens, false to unset it.\\n    function setApprovalForAll(Layout storage s, address sender, address operator, bool approved) internal {\\n        if (operator == sender) revert ERC721SelfApprovalForAll(sender);\\n        s.operators[sender][operator] = approved;\\n        emit ApprovalForAll(sender, operator, approved);\\n    }\\n\\n    /// @notice Unsafely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-transferFrom(address,address,uint256)}.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function transferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n        if (from != to) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                --s.balances[from];\\n                //  cannot overflow as supply cannot overflow\\n                ++s.balances[to];\\n            }\\n        }\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, \\\"\\\");\\n        }\\n    }\\n\\n    /// @notice Safely transfers the ownership of a token to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721-safeTransferFrom(address,address,uint256,bytes)}.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Resets the token approval for `tokenId`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `from` is not the owner of `tokenId`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param to The recipient of the token transfer.\\n    /// @param tokenId The identifier of the token to transfer.\\n    /// @param data Optional data to send along to a receiver contract.\\n    function safeTransferFrom(Layout storage s, address sender, address from, address to, uint256 tokenId, bytes calldata data) internal {\\n        s.transferFrom(sender, from, to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, from, to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely transfers a batch of tokens to a recipient by a sender.\\n    /// @dev Note: This function implements {ERC721BatchTransfer-batchTransferFrom(address,address,uint256[])}.\\n    /// @dev Resets the token approval for each of `tokenIds`.\\n    /// @dev Reverts with {ERC721TransferToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721NonExistingToken} if one of `tokenIds` does not exist.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if the sender is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from Current tokens owner.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenIds Identifiers of the tokens to transfer.\\n    function batchTransferFrom(Layout storage s, address sender, address from, address to, uint256[] calldata tokenIds) internal {\\n        if (to == address(0)) revert ERC721TransferToAddressZero();\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(from, to, tokenId);\\n        }\\n\\n        if (from != to && length != 0) {\\n            unchecked {\\n                // cannot underflow as balance is verified through ownership\\n                s.balances[from] -= length;\\n                // cannot overflow as supply cannot overflow\\n                s.balances[to] += length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mint(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n        if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Warning: Since a `to` contract can run arbitrary code, developers should be aware of potential re-entrancy attacks.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMint(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mint(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMint(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            if (_tokenExists(s.owners[tokenId])) revert ERC721ExistingToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliver(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            s.mint(recipients[i], tokenIds[i]);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-mint(address,uint256)}.\\n    /// @dev Note: Either `mint` or `mintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    function mintOnce(Layout storage s, address to, uint256 tokenId) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 owner = s.owners[tokenId];\\n        if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n        if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n        s.owners[tokenId] = uint256(uint160(to));\\n\\n        unchecked {\\n            // cannot overflow due to the cost of minting individual tokens\\n            ++s.balances[to];\\n        }\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /// @notice Safely mints a token once.\\n    /// @dev Note: This function implements {ERC721Mintable-safeMint(address,uint256,bytes)}.\\n    /// @dev Note: Either `safeMint` or `safeMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if `tokenId` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if `tokenId` has been previously burnt.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if `to` is a contract and the call to\\n    ///  {IERC721Receiver-onERC721Received} fails, reverts or is rejected.\\n    /// @dev Emits a {Transfer} event from the zero address.\\n    /// @param to Address of the new token owner.\\n    /// @param tokenId Identifier of the token to mint.\\n    /// @param data Optional data to pass along to the receiver call.\\n    function safeMintOnce(Layout storage s, address sender, address to, uint256 tokenId, bytes memory data) internal {\\n        s.mintOnce(to, tokenId);\\n        if (to.hasBytecode()) {\\n            _callOnERC721Received(sender, address(0), to, tokenId, data);\\n        }\\n    }\\n\\n    /// @notice Unsafely mints a batch of tokens once.\\n    /// @dev Note: This function implements {ERC721Mintable-batchMint(address,uint256[])}.\\n    /// @dev Note: Either `batchMint` or `batchMintOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if `to` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `tokenIds`.\\n    /// @param to Address of the new tokens owner.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function batchMintOnce(Layout storage s, address to, uint256[] memory tokenIds) internal {\\n        if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n\\n        unchecked {\\n            s.balances[to] += length;\\n        }\\n    }\\n\\n    /// @notice Unsafely mints tokens to multiple recipients once.\\n    /// @dev Note: This function implements {ERC721Deliverable-deliver(address[],uint256[])}.\\n    /// @dev Note: Either `deliver` or `deliverOnce` should be used in a given contract, but not both.\\n    /// @dev Reverts with {InconsistentArrayLengths} if `recipients` and `tokenIds` have different lengths.\\n    /// @dev Reverts with {ERC721MintToAddressZero} if one of `recipients` is the zero address.\\n    /// @dev Reverts with {ERC721ExistingToken} if one of `tokenIds` already exists.\\n    /// @dev Reverts with {ERC721BurntToken} if one of `tokenIds` has been previously burnt.\\n    /// @dev Emits a {Transfer} event from the zero address for each of `recipients` and `tokenIds`.\\n    /// @param recipients Addresses of the new tokens owners.\\n    /// @param tokenIds Identifiers of the tokens to mint.\\n    function deliverOnce(Layout storage s, address[] memory recipients, uint256[] memory tokenIds) internal {\\n        uint256 length = recipients.length;\\n        if (length != tokenIds.length) revert InconsistentArrayLengths();\\n        for (uint256 i; i < length; ++i) {\\n            address to = recipients[i];\\n            if (to == address(0)) revert ERC721MintToAddressZero();\\n\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (_tokenExists(owner)) revert ERC721ExistingToken(tokenId);\\n            if (_tokenWasBurnt(owner)) revert ERC721BurntToken(tokenId);\\n\\n            s.owners[tokenId] = uint256(uint160(to));\\n            unchecked {\\n                ++s.balances[to];\\n            }\\n\\n            emit Transfer(address(0), to, tokenId);\\n        }\\n    }\\n\\n    /// @notice Burns a token by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-burnFrom(address,uint256)}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if `tokenId` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for `tokenId`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address.\\n    /// @param sender The message sender.\\n    /// @param from The current token owner.\\n    /// @param tokenId The identifier of the token to burn.\\n    function burnFrom(Layout storage s, address sender, address from, uint256 tokenId) internal {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n\\n        if (!_isOperatable(s, from, sender)) {\\n            if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n        }\\n\\n        s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n\\n        unchecked {\\n            // cannot underflow as balance is verified through TOKEN ownership\\n            --s.balances[from];\\n        }\\n        emit Transfer(from, address(0), tokenId);\\n    }\\n\\n    /// @notice Burns a batch of tokens by a sender.\\n    /// @dev Note: This function implements {ERC721Burnable-batchBurnFrom(address,uint256[])}.\\n    /// @dev Reverts with {ERC721NonOwnedToken} if one of `tokenIds` is not owned by `from`.\\n    /// @dev Reverts with {ERC721NonApprovedForTransfer} if `sender` is not `from` and has not been approved by `from` for each of `tokenIds`.\\n    /// @dev Emits a {Transfer} event with `to` set to the zero address for each of `tokenIds`.\\n    /// @param sender The message sender.\\n    /// @param from The current tokens owner.\\n    /// @param tokenIds The identifiers of the tokens to burn.\\n    function batchBurnFrom(Layout storage s, address sender, address from, uint256[] calldata tokenIds) internal {\\n        bool operatable = _isOperatable(s, from, sender);\\n\\n        uint256 length = tokenIds.length;\\n        for (uint256 i; i < length; ++i) {\\n            uint256 tokenId = tokenIds[i];\\n            uint256 owner = s.owners[tokenId];\\n            if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n            if (_tokenOwner(owner) != from) revert ERC721NonOwnedToken(from, tokenId);\\n            if (!operatable) {\\n                if (!_tokenHasApproval(owner) || sender != s.approvals[tokenId]) revert ERC721NonApprovedForTransfer(sender, from, tokenId);\\n            }\\n            s.owners[tokenId] = BURNT_TOKEN_OWNER_VALUE;\\n            emit Transfer(from, address(0), tokenId);\\n        }\\n\\n        if (length != 0) {\\n            unchecked {\\n                s.balances[from] -= length;\\n            }\\n        }\\n    }\\n\\n    /// @notice Gets the balance of an address.\\n    /// @dev Note: This function implements {ERC721-balanceOf(address)}.\\n    /// @dev Reverts with {ERC721BalanceOfAddressZero} if `owner` is the zero address.\\n    /// @param owner The address to query the balance of.\\n    /// @return balance The amount owned by the owner.\\n    function balanceOf(Layout storage s, address owner) internal view returns (uint256 balance) {\\n        if (owner == address(0)) revert ERC721BalanceOfAddressZero();\\n        return s.balances[owner];\\n    }\\n\\n    /// @notice Gets the owner of a token.\\n    /// @dev Note: This function implements {ERC721-ownerOf(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the owner of.\\n    /// @return tokenOwner The owner of the token.\\n    function ownerOf(Layout storage s, uint256 tokenId) internal view returns (address tokenOwner) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        return _tokenOwner(owner);\\n    }\\n\\n    /// @notice Gets the approved address for a token.\\n    /// @dev Note: This function implements {ERC721-getApproved(uint256)}.\\n    /// @dev Reverts with {ERC721NonExistingToken} if `tokenId` does not exist.\\n    /// @param tokenId The token identifier to query the approval of.\\n    /// @return approved The approved address for the token identifier, or the zero address if no approval is set.\\n    function getApproved(Layout storage s, uint256 tokenId) internal view returns (address approved) {\\n        uint256 owner = s.owners[tokenId];\\n        if (!_tokenExists(owner)) revert ERC721NonExistingToken(tokenId);\\n        if (_tokenHasApproval(owner)) {\\n            return s.approvals[tokenId];\\n        } else {\\n            return address(0);\\n        }\\n    }\\n\\n    /// @notice Gets whether an operator is approved for all tokens by an owner.\\n    /// @dev Note: This function implements {ERC721-isApprovedForAll(address,address)}.\\n    /// @param owner The address which gives the approval for all tokens.\\n    /// @param operator The address which receives the approval for all tokens.\\n    /// @return approvedForAll Whether the operator is approved for all tokens by the owner.\\n    function isApprovedForAll(Layout storage s, address owner, address operator) internal view returns (bool approvedForAll) {\\n        return s.operators[owner][operator];\\n    }\\n\\n    /// @notice Gets whether a token was burnt.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenWasBurnt Whether the token was burnt.\\n    function wasBurnt(Layout storage s, uint256 tokenId) internal view returns (bool tokenWasBurnt) {\\n        return _tokenWasBurnt(s.owners[tokenId]);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    /// @notice Calls {IERC721Receiver-onERC721Received} on a target contract.\\n    /// @dev Reverts with {ERC721SafeTransferRejected} if the call to the target fails, reverts or is rejected.\\n    /// @param sender The message sender.\\n    /// @param from Previous token owner.\\n    /// @param to New token owner.\\n    /// @param tokenId Identifier of the token transferred.\\n    /// @param data Optional data to send along with the receiver contract call.\\n    function _callOnERC721Received(address sender, address from, address to, uint256 tokenId, bytes memory data) private {\\n        if (IERC721Receiver(to).onERC721Received(sender, from, tokenId, data) != ERC721_RECEIVED) revert ERC721SafeTransferRejected(to, tokenId);\\n    }\\n\\n    /// @notice Returns whether an account is authorised to make a transfer on behalf of an owner.\\n    /// @param owner The token owner.\\n    /// @param account The account to check the operatability of.\\n    /// @return operatable True if `account` is `owner` or is an operator for `owner`, false otherwise.\\n    function _isOperatable(Layout storage s, address owner, address account) private view returns (bool operatable) {\\n        return (owner == account) || s.operators[owner][account];\\n    }\\n\\n    function _tokenOwner(uint256 owner) private pure returns (address tokenOwner) {\\n        return address(uint160(owner));\\n    }\\n\\n    function _tokenExists(uint256 owner) private pure returns (bool tokenExists) {\\n        return uint160(owner) != 0;\\n    }\\n\\n    function _tokenWasBurnt(uint256 owner) private pure returns (bool tokenWasBurnt) {\\n        return owner == BURNT_TOKEN_OWNER_VALUE;\\n    }\\n\\n    function _tokenHasApproval(uint256 owner) private pure returns (bool tokenHasApproval) {\\n        return owner & TOKEN_APPROVAL_OWNER_FLAG != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x654b9f8b387a06fb52de64b26964ef901900678552fdd6fb695e027dcd3ebb73\",\"license\":\"MIT\"},\"contracts/token/ERC721/preset/proxied/ERC721FullProxied.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./../../../metadata/interfaces/ITokenMetadataResolver.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../../../royalty/interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ERC721Storage} from \\\"./../../libraries/ERC721Storage.sol\\\";\\nimport {ERC2981Storage} from \\\"./../../../royalty/libraries/ERC2981Storage.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../../../metadata/libraries/TokenMetadataStorage.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../../../royalty/libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {ERC721WithOperatorFiltererBase} from \\\"./../../base/ERC721WithOperatorFiltererBase.sol\\\";\\nimport {ERC721BatchTransferWithOperatorFiltererBase} from \\\"./../../base/ERC721BatchTransferWithOperatorFiltererBase.sol\\\";\\nimport {ERC721MetadataBase} from \\\"./../../base/ERC721MetadataBase.sol\\\";\\nimport {ERC721MintableBase} from \\\"./../../base/ERC721MintableBase.sol\\\";\\nimport {ERC721DeliverableBase} from \\\"./../../base/ERC721DeliverableBase.sol\\\";\\nimport {ERC2981Base} from \\\"./../../../royalty/base/ERC2981Base.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../../../royalty/base/OperatorFiltererBase.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./../../../../access/base/ContractOwnershipBase.sol\\\";\\nimport {AccessControlBase} from \\\"./../../../../access/base/AccessControlBase.sol\\\";\\nimport {TokenRecoveryBase} from \\\"./../../../../security/base/TokenRecoveryBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../../../../introspection/InterfaceDetection.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\nimport {ForwarderRegistryContext} from \\\"./../../../../metatx/ForwarderRegistryContext.sol\\\";\\n\\ncontract ERC721FullProxied is\\n    ERC721WithOperatorFiltererBase,\\n    ERC721BatchTransferWithOperatorFiltererBase,\\n    ERC721MetadataBase,\\n    ERC721MintableBase,\\n    ERC721DeliverableBase,\\n    ERC2981Base,\\n    OperatorFiltererBase,\\n    ContractOwnershipBase,\\n    AccessControlBase,\\n    TokenRecoveryBase,\\n    InterfaceDetection,\\n    ForwarderRegistryContext\\n{\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContext(forwarderRegistry) {}\\n\\n    function init(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver metadataResolver,\\n        IOperatorFilterRegistry filterRegistry\\n    ) external {\\n        ContractOwnershipStorage.layout().proxyInit(_msgSender());\\n        ERC721Storage.init();\\n        ERC721Storage.initERC721BatchTransfer();\\n        ERC721Storage.initERC721Metadata();\\n        ERC721Storage.initERC721Mintable();\\n        ERC721Storage.initERC721Deliverable();\\n        ERC2981Storage.init();\\n        TokenMetadataStorage.layout().proxyInit(tokenName, tokenSymbol, metadataResolver);\\n        OperatorFiltererStorage.layout().proxyInit(filterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x92e23b5fdbbd1b3b1afe5209d83e10e30eea76133ba0c6cc5ee98b03b174a793\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"ERC721BalanceOfAddressZero()":[{"notice":"Thrown when querying the balance of the zero address."}],"ERC721ExistingToken(uint256)":[{"notice":"Thrown when minting a token that already exists."}],"ERC721MintToAddressZero()":[{"notice":"Thrown when minting a token to the zero address."}],"ERC721NonApprovedForApproval(address,address,uint256)":[{"notice":"Thrown when a sender tries to set a token approval but is neither the owner nor approvedForAll by the owner."}],"ERC721NonApprovedForTransfer(address,address,uint256)":[{"notice":"Thrown when a sender tries to transfer a token but is neither the owner nor approved by the owner."}],"ERC721NonExistingToken(uint256)":[{"notice":"Thrown when a token does not exist but is required to."}],"ERC721NonOwnedToken(address,uint256)":[{"notice":"Thrown when a token is not owned by the expected account."}],"ERC721SafeTransferRejected(address,uint256)":[{"notice":"Thrown when a safe transfer is rejected by the recipient contract."}],"ERC721SelfApproval(address)":[{"notice":"Thrown when trying to approve oneself."}],"ERC721SelfApprovalForAll(address)":[{"notice":"Thrown when trying to approveForAll oneself."}],"ERC721TransferToAddressZero()":[{"notice":"Thrown when transferring a token to the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"IncorrectTokenContractType(address)":[{"notice":"Thrown when trying to recover a token of the wrong contract type."}],"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotRoleHolder(bytes32,address)":[{"notice":"Thrown when an account does not have the required role."}],"OperatorNotAllowed(address)":[{"notice":"Thrown when transferring to or giving approval to a non-authorized operator."}]},"events":{"Approval(address,address,uint256)":{"notice":"Emitted when a single token approval is set."},"ApprovalForAll(address,address,bool)":{"notice":"Emitted when an approval for all tokens is set or unset."},"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."},"RoleGranted(bytes32,address,address)":{"notice":"Emitted when `role` is granted to `account`."},"RoleRevoked(bytes32,address,address)":{"notice":"Emitted when `role` is revoked from `account`."},"Transfer(address,address,uint256)":{"notice":"Emitted when a token is transferred."}},"kind":"user","methods":{"approve(address,uint256)":{"notice":"Sets or unsets an approval to transfer a single token on behalf of its owner."},"balanceOf(address)":{"notice":"Gets the balance of an address."},"batchMint(address,uint256[])":{"notice":"Unsafely mints a batch of tokens."},"batchTransferFrom(address,address,uint256[])":{"notice":"Unsafely transfers a batch of tokens to a recipient."},"deliver(address[],uint256[])":{"notice":"Unsafely mints tokens to multiple recipients."},"getApproved(uint256)":{"notice":"Gets the approved address for a token."},"grantRole(bytes32,address)":{"notice":"Grants a role to an account."},"hasRole(bytes32,address)":{"notice":"Retrieves whether an account has a role."},"isApprovedForAll(address,address)":{"notice":"Gets whether an operator is approved for all tokens by an owner."},"isTrustedForwarder(address)":{"notice":"Checks whether a forwarder is trusted."},"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"mint(address,uint256)":{"notice":"Unsafely mints a token."},"name()":{"notice":"Gets the name of the token. E.g. \"My Token\"."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"owner()":{"notice":"Gets the address of the contract owner."},"ownerOf(uint256)":{"notice":"Gets the owner of a token."},"recoverERC20s(address[],address[],uint256[])":{"notice":"Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts."},"recoverERC721s(address[],address[],uint256[])":{"notice":"Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts."},"recoverETH(address[],uint256[])":{"notice":"Extract ETH tokens which were accidentally sent to the contract to a list of accounts."},"renounceRole(bytes32)":{"notice":"Renounces a role by the sender."},"revokeRole(bytes32,address)":{"notice":"Revokes a role from an account."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"safeMint(address,uint256,bytes)":{"notice":"Safely mints a token."},"safeTransferFrom(address,address,uint256)":{"notice":"Safely transfers the ownership of a token to a recipient."},"safeTransferFrom(address,address,uint256,bytes)":{"notice":"Safely transfers the ownership of a token to a recipient."},"setApprovalForAll(address,bool)":{"notice":"Sets or unsets an approval to transfer all tokens on behalf of their owner."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"symbol()":{"notice":"Gets the symbol of the token. E.g. \"TOK\"."},"tokenURI(uint256)":{"notice":"Gets the metadata URI for a token identifier."},"transferFrom(address,address,uint256)":{"notice":"Unsafely transfers the ownership of a token to a recipient."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/metadata/TokenMetadataResolverPerToken.sol":{"TokenMetadataResolverPerToken":{"abi":[{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadataURI","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"NotTargetContractRoleHolder(address,bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"kind":"dev","methods":{"batchSetTokenURI(address,uint256[],string[])":{"details":"Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.","params":{"tokenContract":"The token contract on which to set the token URI.","tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"setTokenURI(address,uint256,string)":{"details":"Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.","params":{"tokenContract":"The token contract on which to set the token URI.","tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"tokenMetadataURI(address,uint256)":{"params":{"tokenContract":"The token contract for which to retrieve the token URI.","tokenId":"The token identifier."},"returns":{"tokenURI":"The token metadata URI."}}},"title":"TokenMetadataResolverPerToken.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610a2f908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063361953a3146100535780634e5786bf1461041f578063626dc9a814610134578063d5391393146100db5763f724dad71461005357600080fd5b346100d65760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65773ffffffffffffffffffffffffffffffffffffffff61009f610629565b16600052600060205260406000206024356000526020526100d26100c6604060002061070f565b604051918291826107d1565b0390f35b600080fd5b346100d65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346100d65760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65761016b610629565b60243567ffffffffffffffff81116100d65761018b903690600401610839565b909160443567ffffffffffffffff81116100d6576101ad903690600401610839565b9290918382036103f5576101c4939193338261086a565b60009173ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603019216925b858110156103f357818110156103c4578060051b9081860135848112156100d6578601803567ffffffffffffffff81116100d65780360360208301136100d65786600052600060205260406000206000948b01358552602052604084209161026d835461064c565b601f811161037f575b5084601f83116001146102d3576001959091836102c5575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82861b9260031b1c19161790555b01610205565b602092500101358b8061028e565b919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061036557509160019695949291838895931061032a575b505050811b0190556102bf565b01602001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690558b808061031d565b919360206001819282888801013581550195019201610303565b83865260208620601f840160051c810191602085106103ba575b601f0160051c01905b8181106103af5750610276565b8681556001016103a2565b9091508190610399565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100d65760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d657610456610629565b6044359067ffffffffffffffff82116100d657366023830112156100d65781600401359067ffffffffffffffff82116100d65736602483850101116100d65773ffffffffffffffffffffffffffffffffffffffff906104b5338261086a565b166000526000602052604060002060243560005260205260406000206000916104de825461064c565b601f81116105e4575b5082601f821160011461054157839482939492610533575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b6024925001013584806104ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b8781106105c957508360019596971061058e575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c19169055848080610583565b9092602060018192602487870101358155019401910161056f565b82845260208420601f830160051c8101916020841061061f575b601f0160051c01905b81811061061457506104e7565b848155600101610607565b90915081906105fe565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100d657565b90600182811c92168015610695575b602083101461066657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161065b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90604051918260008254926107238461064c565b8084529360018116908115610791575060011461074a575b506107489250038361069f565b565b90506000929192526020600020906000915b818310610775575050906020610748928201013861073b565b602091935080600191548385890101520191019091849261075c565b602093506107489592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861073b565b9190916020815282519283602083015260005b8481106108235750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016107e4565b9181601f840112156100d65782359167ffffffffffffffff83116100d6576020808501948460051b0101116100d657565b803b156109b55773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff604051927f91d148540000000000000000000000000000000000000000000000000000000084527f6d696e746572000000000000000000000000000000000000000000000000000060048501521691826024820152602081604481855afa9081156109a957600091610967575b5015610913575050565b7f7a436c16000000000000000000000000000000000000000000000000000000006000526004527f6d696e746572000000000000000000000000000000000000000000000000000060245260445260646000fd5b6020813d6020116109a1575b816109806020938361069f565b8101031261099d575190811515820361099a575038610909565b80fd5b5080fd5b3d9150610973565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea26469706673582212201b8585c529f05a762113973b7c8f81b45f3579c3da4d0eec92b3f9988965708664736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0xA2F SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x361953A3 EQ PUSH2 0x53 JUMPI DUP1 PUSH4 0x4E5786BF EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x626DC9A8 EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xDB JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F PUSH2 0x629 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x24 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH2 0xD2 PUSH2 0xC6 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x70F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x7D1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH2 0x16B PUSH2 0x629 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI PUSH2 0x18B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x839 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI PUSH2 0x1AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x839 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP4 DUP3 SUB PUSH2 0x3F5 JUMPI PUSH2 0x1C4 SWAP4 SWAP2 SWAP4 CALLER DUP3 PUSH2 0x86A JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP6 CALLDATASIZE SUB ADD SWAP3 AND SWAP3 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x3F3 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x3C4 JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP7 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xD6 JUMPI DUP7 ADD DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP4 ADD SGT PUSH2 0xD6 JUMPI DUP7 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP5 DUP12 ADD CALLDATALOAD DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP2 PUSH2 0x26D DUP4 SLOAD PUSH2 0x64C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x37F JUMPI JUMPDEST POP DUP5 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2D3 JUMPI PUSH1 0x1 SWAP6 SWAP1 SWAP2 DUP4 PUSH2 0x2C5 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP7 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST ADD PUSH2 0x205 JUMP JUMPDEST PUSH1 0x20 SWAP3 POP ADD ADD CALLDATALOAD DUP12 DUP1 PUSH2 0x28E JUMP JUMPDEST SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP6 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 SWAP4 JUMPDEST DUP2 DUP2 LT PUSH2 0x365 JUMPI POP SWAP2 PUSH1 0x1 SWAP7 SWAP6 SWAP5 SWAP3 SWAP2 DUP4 DUP9 SWAP6 SWAP4 LT PUSH2 0x32A JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2BF JUMP JUMPDEST ADD PUSH1 0x20 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x31D JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP3 DUP9 DUP9 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x303 JUMP JUMPDEST DUP4 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3BA JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3AF JUMPI POP PUSH2 0x276 JUMP JUMPDEST DUP7 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3A2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x399 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH2 0x456 PUSH2 0x629 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xD6 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xD6 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xD6 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0xD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4B5 CALLER DUP3 PUSH2 0x86A JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x24 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 PUSH2 0x4DE DUP3 SLOAD PUSH2 0x64C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5E4 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x541 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x533 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD DUP5 DUP1 PUSH2 0x4FF JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x5C9 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x58E JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x583 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x56F JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x61F JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x614 JUMPI POP PUSH2 0x4E7 JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x607 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x5FE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xD6 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x695 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x666 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x65B JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E0 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x723 DUP5 PUSH2 0x64C JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x791 JUMPI POP PUSH1 0x1 EQ PUSH2 0x74A JUMPI JUMPDEST POP PUSH2 0x748 SWAP3 POP SUB DUP4 PUSH2 0x69F JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x775 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x748 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x73B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x75C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x748 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x73B JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x823 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x7E4 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xD6 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD6 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xD6 JUMPI JUMP JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x9B5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP6 ADD MSTORE AND SWAP2 DUP3 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x967 JUMPI JUMPDEST POP ISZERO PUSH2 0x913 JUMPI POP POP JUMP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x9A1 JUMPI JUMPDEST DUP2 PUSH2 0x980 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x69F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x99D JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x99A JUMPI POP CODESIZE PUSH2 0x909 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x973 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL DUP6 DUP6 0xC5 0x29 CREATE GAS PUSH23 0x2113973B7C8F81B45F3579C3DA4D0EEC92B3F998896570 DUP7 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"528:2198:334:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":1577,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":2105,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":2001,"id":null,"parameterSlots":2,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":1807,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":1612,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":1695,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasTargetContractRole":{"entryPoint":2154,"id":8838,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063361953a3146100535780634e5786bf1461041f578063626dc9a814610134578063d5391393146100db5763f724dad71461005357600080fd5b346100d65760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65773ffffffffffffffffffffffffffffffffffffffff61009f610629565b16600052600060205260406000206024356000526020526100d26100c6604060002061070f565b604051918291826107d1565b0390f35b600080fd5b346100d65760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b346100d65760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d65761016b610629565b60243567ffffffffffffffff81116100d65761018b903690600401610839565b909160443567ffffffffffffffff81116100d6576101ad903690600401610839565b9290918382036103f5576101c4939193338261086a565b60009173ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603019216925b858110156103f357818110156103c4578060051b9081860135848112156100d6578601803567ffffffffffffffff81116100d65780360360208301136100d65786600052600060205260406000206000948b01358552602052604084209161026d835461064c565b601f811161037f575b5084601f83116001146102d3576001959091836102c5575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82861b9260031b1c19161790555b01610205565b602092500101358b8061028e565b919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061036557509160019695949291838895931061032a575b505050811b0190556102bf565b01602001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c191690558b808061031d565b919360206001819282888801013581550195019201610303565b83865260208620601f840160051c810191602085106103ba575b601f0160051c01905b8181106103af5750610276565b8681556001016103a2565b9091508190610399565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b005b7f658253360000000000000000000000000000000000000000000000000000000060005260046000fd5b346100d65760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d657610456610629565b6044359067ffffffffffffffff82116100d657366023830112156100d65781600401359067ffffffffffffffff82116100d65736602483850101116100d65773ffffffffffffffffffffffffffffffffffffffff906104b5338261086a565b166000526000602052604060002060243560005260205260406000206000916104de825461064c565b601f81116105e4575b5082601f821160011461054157839482939492610533575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617905580f35b6024925001013584806104ff565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216948385526020852091855b8781106105c957508360019596971061058e575b505050811b01905580f35b01602401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c19169055848080610583565b9092602060018192602487870101358155019401910161056f565b82845260208420601f830160051c8101916020841061061f575b601f0160051c01905b81811061061457506104e7565b848155600101610607565b90915081906105fe565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100d657565b90600182811c92168015610695575b602083101461066657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161065b565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90604051918260008254926107238461064c565b8084529360018116908115610791575060011461074a575b506107489250038361069f565b565b90506000929192526020600020906000915b818310610775575050906020610748928201013861073b565b602091935080600191548385890101520191019091849261075c565b602093506107489592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861073b565b9190916020815282519283602083015260005b8481106108235750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016107e4565b9181601f840112156100d65782359167ffffffffffffffff83116100d6576020808501948460051b0101116100d657565b803b156109b55773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff604051927f91d148540000000000000000000000000000000000000000000000000000000084527f6d696e746572000000000000000000000000000000000000000000000000000060048501521691826024820152602081604481855afa9081156109a957600091610967575b5015610913575050565b7f7a436c16000000000000000000000000000000000000000000000000000000006000526004527f6d696e746572000000000000000000000000000000000000000000000000000060245260445260646000fd5b6020813d6020116109a1575b816109806020938361069f565b8101031261099d575190811515820361099a575038610909565b80fd5b5080fd5b3d9150610973565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea26469706673582212201b8585c529f05a762113973b7c8f81b45f3579c3da4d0eec92b3f9988965708664736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x361953A3 EQ PUSH2 0x53 JUMPI DUP1 PUSH4 0x4E5786BF EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x626DC9A8 EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xDB JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x9F PUSH2 0x629 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x24 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH2 0xD2 PUSH2 0xC6 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x70F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x7D1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH2 0x16B PUSH2 0x629 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI PUSH2 0x18B SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x839 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI PUSH2 0x1AD SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x839 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 DUP4 DUP3 SUB PUSH2 0x3F5 JUMPI PUSH2 0x1C4 SWAP4 SWAP2 SWAP4 CALLER DUP3 PUSH2 0x86A JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP6 CALLDATASIZE SUB ADD SWAP3 AND SWAP3 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x3F3 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x3C4 JUMPI DUP1 PUSH1 0x5 SHL SWAP1 DUP2 DUP7 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0xD6 JUMPI DUP7 ADD DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD6 JUMPI DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP4 ADD SGT PUSH2 0xD6 JUMPI DUP7 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP5 DUP12 ADD CALLDATALOAD DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP2 PUSH2 0x26D DUP4 SLOAD PUSH2 0x64C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x37F JUMPI JUMPDEST POP DUP5 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2D3 JUMPI PUSH1 0x1 SWAP6 SWAP1 SWAP2 DUP4 PUSH2 0x2C5 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP7 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST ADD PUSH2 0x205 JUMP JUMPDEST PUSH1 0x20 SWAP3 POP ADD ADD CALLDATALOAD DUP12 DUP1 PUSH2 0x28E JUMP JUMPDEST SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP6 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 SWAP4 JUMPDEST DUP2 DUP2 LT PUSH2 0x365 JUMPI POP SWAP2 PUSH1 0x1 SWAP7 SWAP6 SWAP5 SWAP3 SWAP2 DUP4 DUP9 SWAP6 SWAP4 LT PUSH2 0x32A JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2BF JUMP JUMPDEST ADD PUSH1 0x20 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE DUP12 DUP1 DUP1 PUSH2 0x31D JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP3 DUP9 DUP9 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x303 JUMP JUMPDEST DUP4 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3BA JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3AF JUMPI POP PUSH2 0x276 JUMP JUMPDEST DUP7 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3A2 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x399 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST STOP JUMPDEST PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xD6 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD6 JUMPI PUSH2 0x456 PUSH2 0x629 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xD6 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0xD6 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0xD6 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0xD6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x4B5 CALLER DUP3 PUSH2 0x86A JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x24 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 PUSH2 0x4DE DUP3 SLOAD PUSH2 0x64C JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x5E4 JUMPI JUMPDEST POP DUP3 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x541 JUMPI DUP4 SWAP5 DUP3 SWAP4 SWAP5 SWAP3 PUSH2 0x533 JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 PUSH1 0x1 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP3 POP ADD ADD CALLDATALOAD DUP5 DUP1 PUSH2 0x4FF JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 AND SWAP5 DUP4 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 SWAP2 DUP6 JUMPDEST DUP8 DUP2 LT PUSH2 0x5C9 JUMPI POP DUP4 PUSH1 0x1 SWAP6 SWAP7 SWAP8 LT PUSH2 0x58E JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE DUP1 RETURN JUMPDEST ADD PUSH1 0x24 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE DUP5 DUP1 DUP1 PUSH2 0x583 JUMP JUMPDEST SWAP1 SWAP3 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP8 DUP8 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP5 ADD SWAP2 ADD PUSH2 0x56F JUMP JUMPDEST DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x61F JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x614 JUMPI POP PUSH2 0x4E7 JUMP JUMPDEST DUP5 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x607 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x5FE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0xD6 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x695 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x666 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x65B JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x6E0 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x723 DUP5 PUSH2 0x64C JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x791 JUMPI POP PUSH1 0x1 EQ PUSH2 0x74A JUMPI JUMPDEST POP PUSH2 0x748 SWAP3 POP SUB DUP4 PUSH2 0x69F JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x775 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x748 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x73B JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x75C JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x748 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x73B JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0x823 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0x7E4 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0xD6 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD6 JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0xD6 JUMPI JUMP JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x9B5 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP6 ADD MSTORE AND SWAP2 DUP3 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x967 JUMPI JUMPDEST POP ISZERO PUSH2 0x913 JUMPI POP POP JUMP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x9A1 JUMPI JUMPDEST DUP2 PUSH2 0x980 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x69F JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x99D JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x99A JUMPI POP CODESIZE PUSH2 0x909 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x973 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL DUP6 DUP6 0xC5 0x29 CREATE GAS PUSH23 0x2113973B7C8F81B45F3579C3DA4D0EEC92B3F998896570 DUP7 PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"528:2198:334:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;2002:26;;;;;;1998:90;;2153:10;;;;;;;:::i;:::-;528:2198;;;;;;;;;;2175:112;2203:3;2191:10;;;;;;528:2198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2203:3;528:2198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2180:9;;528:2198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;528:2198:334;;;;;;;;;;;;;;2191:10;528:2198;1998:90;2051:26;528:2198;2051:26;528:2198;;2051:26;528:2198;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:10;;;;;:::i;:::-;528:2198;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;528:2198:334;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;528:2198:334;;;;;-1:-1:-1;528:2198:334;;;;;;;-1:-1:-1;528:2198:334;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;528:2198:334;;;;;-1:-1:-1;528:2198:334;;-1:-1:-1;528:2198:334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4122:248:41:-;376:58:354;;450:9;3284:78:41;;528:2198:334;;;;;3379:53:41;528:2198:334;3379:53:41;;528:2198:334;3379:53:41;;;528:2198:334;;;;;;;;;3379:53:41;;;;;;;;;;;-1:-1:-1;3379:53:41;;;4122:248;4243:53;;4239:124;;4122:248;;:::o;4239:124::-;4305:58;-1:-1:-1;4305:58:41;3379:53;528:2198:334;;;;3379:53:41;528:2198:334;;-1:-1:-1;4305:58:41;3379:53;528:2198:334;3379:53:41;;528:2198:334;3379:53:41;;;;;;528:2198:334;3379:53:41;;;:::i;:::-;;;528:2198:334;;;;;;;;;;;;;3379:53:41;;;;528:2198:334;;;;;;;3379:53:41;;;-1:-1:-1;3379:53:41;;;528:2198:334;;;-1:-1:-1;528:2198:334;;;;;3284:78:41;528:2198:334;3326:36:41;;-1:-1:-1;3326:36:41;528:2198:334;3326:36:41;528:2198:334;;-1:-1:-1;3326:36:41"},"gasEstimates":{"creation":{"codeDepositCost":"521400","executionCost":"563","totalCost":"521963"},"external":{"MINTER_ROLE()":"210","batchSetTokenURI(address,uint256[],string[])":"infinite","metadataURI(address,uint256)":"infinite","setTokenURI(address,uint256,string)":"infinite","tokenMetadataURI(address,uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchSetTokenURI(address,uint256[],string[])":"626dc9a8","metadataURI(address,uint256)":"361953a3","setTokenURI(address,uint256,string)":"4e5786bf","tokenMetadataURI(address,uint256)":"f724dad7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"metadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(address,uint256[],string[])\":{\"details\":\"Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\",\"params\":{\"tokenContract\":\"The token contract on which to set the token URI.\",\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"setTokenURI(address,uint256,string)\":{\"details\":\"Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\",\"params\":{\"tokenContract\":\"The token contract on which to set the token URI.\",\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"tokenMetadataURI(address,uint256)\":{\"params\":{\"tokenContract\":\"The token contract for which to retrieve the token URI.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenURI\":\"The token metadata URI.\"}}},\"title\":\"TokenMetadataResolverPerToken.\",\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role on a target contract.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(address,uint256[],string[])\":{\"notice\":\"Sets the metadata URIs for a batch of tokens on a contract.\"},\"setTokenURI(address,uint256,string)\":{\"notice\":\"Sets the metadata URI for a token on a contract.\"},\"tokenMetadataURI(address,uint256)\":{\"notice\":\"Gets the token metadata URI for a token.\"}},\"notice\":\"Token Metadata Resolver which stores the metadata URI for each token.Only minters of the target token contract can set the token metadata URI for this target contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/TokenMetadataResolverPerToken.sol\":\"TokenMetadataResolverPerToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/token/metadata/TokenMetadataResolverPerToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./interfaces/ITokenMetadataResolver.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\n\\n/// @title TokenMetadataResolverPerToken.\\n/// @notice Token Metadata Resolver which stores the metadata URI for each token.\\n/// @notice Only minters of the target token contract can set the token metadata URI for this target contract.\\ncontract TokenMetadataResolverPerToken is ITokenMetadataResolver {\\n    using AccessControlStorage for address;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    mapping(address => mapping(uint256 => string)) public metadataURI;\\n\\n    /// @notice Sets the metadata URI for a token on a contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\\n    /// @param tokenContract The token contract on which to set the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(address tokenContract, uint256 tokenId, string calldata tokenURI) public virtual {\\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\\n        metadataURI[tokenContract][tokenId] = tokenURI;\\n    }\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens on a contract.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\\n    /// @param tokenContract The token contract on which to set the token URI.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(address tokenContract, uint256[] calldata tokenIds, string[] calldata tokenURIs) public virtual {\\n        uint256 length = tokenIds.length;\\n        if (length != tokenURIs.length) {\\n            revert InconsistentArrayLengths();\\n        }\\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\\n\\n        for (uint256 i; i < length; ++i) {\\n            metadataURI[tokenContract][tokenIds[i]] = tokenURIs[i];\\n        }\\n    }\\n\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view virtual override returns (string memory tokenURI) {\\n        return metadataURI[tokenContract][tokenId];\\n    }\\n}\\n\",\"keccak256\":\"0x2d2d60287028fdfd1dfc9ca2dc88194c25bad6a8cec0a4918db40e70af80f55b\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":35918,"contract":"contracts/token/metadata/TokenMetadataResolverPerToken.sol:TokenMetadataResolverPerToken","label":"metadataURI","offset":0,"slot":"0","type":"t_mapping(t_address,t_mapping(t_uint256,t_string_storage))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_uint256,t_string_storage))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint256 => string))","numberOfBytes":"32","value":"t_mapping(t_uint256,t_string_storage)"},"t_mapping(t_uint256,t_string_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => string)","numberOfBytes":"32","value":"t_string_storage"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"notice":"Thrown when an account does not have the required role on a target contract."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"kind":"user","methods":{"batchSetTokenURI(address,uint256[],string[])":{"notice":"Sets the metadata URIs for a batch of tokens on a contract."},"setTokenURI(address,uint256,string)":{"notice":"Sets the metadata URI for a token on a contract."},"tokenMetadataURI(address,uint256)":{"notice":"Gets the token metadata URI for a token."}},"notice":"Token Metadata Resolver which stores the metadata URI for each token.Only minters of the target token contract can set the token metadata URI for this target contract.","version":1}}},"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol":{"TokenMetadataResolverPerTokenERC1155":{"abi":[{"inputs":[],"name":"InconsistentArrayLengths","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractRoleHolder","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenURIs","type":"string[]"}],"name":"batchSetTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadataURI","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"NotTargetContractRoleHolder(address,bytes32,address)":[{"params":{"account":"The account that was checked.","role":"The role that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"kind":"dev","methods":{"batchSetTokenURI(address,uint256[],string[])":{"details":"The token contract emits a {URI} event for each token.","params":{"tokenContract":"The token contract on which to set the token URI.","tokenIds":"The token identifiers.","tokenURIs":"The token metadata URIs."}},"setTokenURI(address,uint256,string)":{"details":"The token contract emits a {URI} event.","params":{"tokenContract":"The token contract on which to set the token URI.","tokenId":"The token identifier.","tokenURI":"The token metadata URI."}},"tokenMetadataURI(address,uint256)":{"params":{"tokenContract":"The token contract for which to retrieve the token URI.","tokenId":"The token identifier."},"returns":{"tokenURI":"The token metadata URI."}}},"title":"TokenMetadataResolverPerTokenERC1155.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610cef908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c8063361953a3146108565780634e5786bf146105c7578063626dc9a81461012d578063d5391393146100d45763f724dad71461005457600080fd5b346100d15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576100c160406100cd9273ffffffffffffffffffffffffffffffffffffffff6100a96108a8565b16815280602052818120602435825260205220610993565b60405191829182610a55565b0390f35b80fd5b50346100d157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b50346100d15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576101656108a8565b60243567ffffffffffffffff81116105c357610185903690600401610abd565b60449291923567ffffffffffffffff81116105bf576101a8903690600401610abd565b939092848303610597576101bf9492943382610b2d565b859273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603019216935b868110156103f057818110156103c3578060051b80870135848112156103bf5787019081359067ffffffffffffffff82116103bb5781360360208401136103bb57878b528a60205260408b20908701358b5260205260408a209161026383546108d0565b601f8111610376575b508a90601f83116001146102cd576001949392918c91836102bf575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82861b9260031b1c19161790555b016101ff565b602092500101353880610288565b838c5260208c20917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168d5b81811061035c575091600196959492918388959310610321575b505050811b0190556102b9565b01602001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c19169055388080610314565b9193602060018192828888010135815501950192016102fa565b838c5260208c20601f840160051c810191602085106103b1575b601f0160051c01905b8181106103a6575061026c565b8c8155600101610399565b9091508190610390565b8a80fd5b8980fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b50909295949391863b1561059357604051947f6706467b000000000000000000000000000000000000000000000000000000008652604060048701528060448701527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161058f5760059493941b8091606487013784019080606483017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606488860301016024880152526084820191602060648360051b8301010194809488925b8484106104f2575088808981818e8183818f03925af180156104e7576104d65750f35b816104e091610923565b6100d15780f35b6040513d84823e3d90fd5b909192939495967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c838303010187528735838112156103bb57840160208135910167ffffffffffffffff821161058b57813603811361058b5761057c6001936020938493610aee565b990197019594019291906104b3565b8b80fd5b8680fd5b8580fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b8280fd5b50346100d15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576105ff6108a8565b604435919060243567ffffffffffffffff84116105c357366023850112156105c35783600401359167ffffffffffffffff83116107595736602484870101116107595773ffffffffffffffffffffffffffffffffffffffff906106623382610b2d565b16938484528360205260408420828552602052604084209461068486546108d0565b601f8111610811575b508495601f851160011461076b578486978796979161075d575b508660011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8860031b1c19161790555b803b156107595761072d94848094604051978895869485937f162094c40000000000000000000000000000000000000000000000000000000085526004850152604060248501526024604485019201610aee565b03925af1801561074c5761073e5780f35b61074791610923565b388180f35b50604051903d90823e3d90fd5b8380fd5b6024915084010135386106a7565b808652602086207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861697875b8981106107f65750868899989798106107bb575b5050600186811b0190556106d9565b60247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88a60031b161c19918601013516905538806107ac565b90916020600181926024868a01013581550193019101610798565b86865260208620601f860160051c8101916020871061084c575b601f0160051c01905b818110610841575061068d565b868155600101610834565b909150819061082b565b50346100d15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576100c160406100cd9273ffffffffffffffffffffffffffffffffffffffff6100a95b6004359073ffffffffffffffffffffffffffffffffffffffff821682036108cb57565b600080fd5b90600182811c92168015610919575b60208310146108ea57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108df565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90604051918260008254926109a7846108d0565b8084529360018116908115610a1557506001146109ce575b506109cc92500383610923565b565b90506000929192526020600020906000915b8183106109f95750509060206109cc92820101386109bf565b60209193508060019154838589010152019101909184926109e0565b602093506109cc9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386109bf565b9190916020815282519283602083015260005b848110610aa75750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610a68565b9181601f840112156108cb5782359167ffffffffffffffff83116108cb576020808501948460051b0101116108cb57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b803b15610c755773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff604051927f91d148540000000000000000000000000000000000000000000000000000000084527f6d696e746572000000000000000000000000000000000000000000000000000060048501521691826024820152602081604481855afa908115610c6957600091610c2a575b5015610bd6575050565b7f7a436c16000000000000000000000000000000000000000000000000000000006000526004527f6d696e746572000000000000000000000000000000000000000000000000000060245260445260646000fd5b6020813d602011610c61575b81610c4360209383610923565b81010312610c5d57519081151582036100d1575038610bcc565b5080fd5b3d9150610c36565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220b0c369cabd63e57ea6023acdc135e21135c1d8c7d95fbd325be00f31c7d2e80064736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0xCEF SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x361953A3 EQ PUSH2 0x856 JUMPI DUP1 PUSH4 0x4E5786BF EQ PUSH2 0x5C7 JUMPI DUP1 PUSH4 0x626DC9A8 EQ PUSH2 0x12D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xD4 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0xC1 PUSH1 0x40 PUSH2 0xCD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9 PUSH2 0x8A8 JUMP JUMPDEST AND DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE DUP2 DUP2 KECCAK256 PUSH1 0x24 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 PUSH2 0x993 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA55 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0x165 PUSH2 0x8A8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5C3 JUMPI PUSH2 0x185 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xABD JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5BF JUMPI PUSH2 0x1A8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xABD JUMP JUMPDEST SWAP4 SWAP1 SWAP3 DUP5 DUP4 SUB PUSH2 0x597 JUMPI PUSH2 0x1BF SWAP5 SWAP3 SWAP5 CALLER DUP3 PUSH2 0xB2D JUMP JUMPDEST DUP6 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP7 CALLDATASIZE SUB ADD SWAP3 AND SWAP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3F0 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x5 SHL DUP1 DUP8 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0x3BF JUMPI DUP8 ADD SWAP1 DUP2 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3BB JUMPI DUP2 CALLDATASIZE SUB PUSH1 0x20 DUP5 ADD SGT PUSH2 0x3BB JUMPI DUP8 DUP12 MSTORE DUP11 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SWAP1 DUP8 ADD CALLDATALOAD DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SWAP2 PUSH2 0x263 DUP4 SLOAD PUSH2 0x8D0 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x376 JUMPI JUMPDEST POP DUP11 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2CD JUMPI PUSH1 0x1 SWAP5 SWAP4 SWAP3 SWAP2 DUP13 SWAP2 DUP4 PUSH2 0x2BF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP7 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST ADD PUSH2 0x1FF JUMP JUMPDEST PUSH1 0x20 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x288 JUMP JUMPDEST DUP4 DUP13 MSTORE PUSH1 0x20 DUP13 KECCAK256 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP14 JUMPDEST DUP2 DUP2 LT PUSH2 0x35C JUMPI POP SWAP2 PUSH1 0x1 SWAP7 SWAP6 SWAP5 SWAP3 SWAP2 DUP4 DUP9 SWAP6 SWAP4 LT PUSH2 0x321 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2B9 JUMP JUMPDEST ADD PUSH1 0x20 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x314 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP3 DUP9 DUP9 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2FA JUMP JUMPDEST DUP4 DUP13 MSTORE PUSH1 0x20 DUP13 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3B1 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3A6 JUMPI POP PUSH2 0x26C JUMP JUMPDEST DUP13 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x399 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x390 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST DUP10 DUP1 REVERT JUMPDEST PUSH1 0x24 DUP9 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST POP SWAP1 SWAP3 SWAP6 SWAP5 SWAP4 SWAP2 DUP7 EXTCODESIZE ISZERO PUSH2 0x593 JUMPI PUSH1 0x40 MLOAD SWAP5 PUSH32 0x6706467B00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x40 PUSH1 0x4 DUP8 ADD MSTORE DUP1 PUSH1 0x44 DUP8 ADD MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x58F JUMPI PUSH1 0x5 SWAP5 SWAP4 SWAP5 SHL DUP1 SWAP2 PUSH1 0x64 DUP8 ADD CALLDATACOPY DUP5 ADD SWAP1 DUP1 PUSH1 0x64 DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x64 DUP9 DUP7 SUB ADD ADD PUSH1 0x24 DUP9 ADD MSTORE MSTORE PUSH1 0x84 DUP3 ADD SWAP2 PUSH1 0x20 PUSH1 0x64 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD ADD SWAP5 DUP1 SWAP5 DUP9 SWAP3 JUMPDEST DUP5 DUP5 LT PUSH2 0x4F2 JUMPI POP DUP9 DUP1 DUP10 DUP2 DUP2 DUP15 DUP2 DUP4 DUP2 DUP16 SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH2 0x4D6 JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x4E0 SWAP2 PUSH2 0x923 JUMP JUMPDEST PUSH2 0xD1 JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C DUP4 DUP4 SUB ADD ADD DUP8 MSTORE DUP8 CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x3BB JUMPI DUP5 ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x58B JUMPI DUP2 CALLDATASIZE SUB DUP2 SGT PUSH2 0x58B JUMPI PUSH2 0x57C PUSH1 0x1 SWAP4 PUSH1 0x20 SWAP4 DUP5 SWAP4 PUSH2 0xAEE JUMP JUMPDEST SWAP10 ADD SWAP8 ADD SWAP6 SWAP5 ADD SWAP3 SWAP2 SWAP1 PUSH2 0x4B3 JUMP JUMPDEST DUP12 DUP1 REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0x5FF PUSH2 0x8A8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x5C3 JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0x5C3 JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x759 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP8 ADD ADD GT PUSH2 0x759 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x662 CALLER DUP3 PUSH2 0xB2D JUMP JUMPDEST AND SWAP4 DUP5 DUP5 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 DUP3 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP5 PUSH2 0x684 DUP7 SLOAD PUSH2 0x8D0 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x811 JUMPI JUMPDEST POP DUP5 SWAP6 PUSH1 0x1F DUP6 GT PUSH1 0x1 EQ PUSH2 0x76B JUMPI DUP5 DUP7 SWAP8 DUP8 SWAP7 SWAP8 SWAP2 PUSH2 0x75D JUMPI JUMPDEST POP DUP7 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x759 JUMPI PUSH2 0x72D SWAP5 DUP5 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH32 0x162094C400000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x24 PUSH1 0x44 DUP6 ADD SWAP3 ADD PUSH2 0xAEE JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x74C JUMPI PUSH2 0x73E JUMPI DUP1 RETURN JUMPDEST PUSH2 0x747 SWAP2 PUSH2 0x923 JUMP JUMPDEST CODESIZE DUP2 DUP1 RETURN JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x24 SWAP2 POP DUP5 ADD ADD CALLDATALOAD CODESIZE PUSH2 0x6A7 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 AND SWAP8 DUP8 JUMPDEST DUP10 DUP2 LT PUSH2 0x7F6 JUMPI POP DUP7 DUP9 SWAP10 SWAP9 SWAP8 SWAP9 LT PUSH2 0x7BB JUMPI JUMPDEST POP POP PUSH1 0x1 DUP7 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x6D9 JUMP JUMPDEST PUSH1 0x24 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP11 PUSH1 0x3 SHL AND SHR NOT SWAP2 DUP7 ADD ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x7AC JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP7 DUP11 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP4 ADD SWAP2 ADD PUSH2 0x798 JUMP JUMPDEST DUP7 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH1 0x1F DUP7 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP8 LT PUSH2 0x84C JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x841 JUMPI POP PUSH2 0x68D JUMP JUMPDEST DUP7 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x834 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x82B JUMP JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0xC1 PUSH1 0x40 PUSH2 0xCD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9 JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x8CB JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x919 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x8EA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x964 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x9A7 DUP5 PUSH2 0x8D0 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xA15 JUMPI POP PUSH1 0x1 EQ PUSH2 0x9CE JUMPI JUMPDEST POP PUSH2 0x9CC SWAP3 POP SUB DUP4 PUSH2 0x923 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x9F9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x9CC SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x9BF JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x9E0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x9CC SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x9BF JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xAA7 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xA68 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x8CB JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x8CB JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x8CB JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0xC75 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP6 ADD MSTORE AND SWAP2 DUP3 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC69 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC2A JUMPI JUMPDEST POP ISZERO PUSH2 0xBD6 JUMPI POP POP JUMP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC61 JUMPI JUMPDEST DUP2 PUSH2 0xC43 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x923 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC5D JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xD1 JUMPI POP CODESIZE PUSH2 0xBCC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC36 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xC3 PUSH10 0xCABD63E57EA6023ACDC1 CALLDATALOAD 0xE2 GT CALLDATALOAD 0xC1 0xD8 0xC7 0xD9 PUSH0 0xBD ORIGIN JUMPDEST RJUMP 0xF31 0xC7 0xD2 0xE8 STOP PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"606:846:335:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2216,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_array_uint256_dyn_calldata":{"entryPoint":2749,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":2645,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":2798,"id":null,"parameterSlots":3,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":2451,"id":null,"parameterSlots":1,"returnSlots":1},"extract_byte_array_length":{"entryPoint":2256,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2339,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceHasTargetContractRole":{"entryPoint":2861,"id":8838,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b6000803560e01c8063361953a3146108565780634e5786bf146105c7578063626dc9a81461012d578063d5391393146100d45763f724dad71461005457600080fd5b346100d15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576100c160406100cd9273ffffffffffffffffffffffffffffffffffffffff6100a96108a8565b16815280602052818120602435825260205220610993565b60405191829182610a55565b0390f35b80fd5b50346100d157807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d15760206040517f6d696e74657200000000000000000000000000000000000000000000000000008152f35b50346100d15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576101656108a8565b60243567ffffffffffffffff81116105c357610185903690600401610abd565b60449291923567ffffffffffffffff81116105bf576101a8903690600401610abd565b939092848303610597576101bf9492943382610b2d565b859273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603019216935b868110156103f057818110156103c3578060051b80870135848112156103bf5787019081359067ffffffffffffffff82116103bb5781360360208401136103bb57878b528a60205260408b20908701358b5260205260408a209161026383546108d0565b601f8111610376575b508a90601f83116001146102cd576001949392918c91836102bf575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82861b9260031b1c19161790555b016101ff565b602092500101353880610288565b838c5260208c20917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084168d5b81811061035c575091600196959492918388959310610321575b505050811b0190556102b9565b01602001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600384901b60f8161c19169055388080610314565b9193602060018192828888010135815501950192016102fa565b838c5260208c20601f840160051c810191602085106103b1575b601f0160051c01905b8181106103a6575061026c565b8c8155600101610399565b9091508190610390565b8a80fd5b8980fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b50909295949391863b1561059357604051947f6706467b000000000000000000000000000000000000000000000000000000008652604060048701528060448701527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811161058f5760059493941b8091606487013784019080606483017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606488860301016024880152526084820191602060648360051b8301010194809488925b8484106104f2575088808981818e8183818f03925af180156104e7576104d65750f35b816104e091610923565b6100d15780f35b6040513d84823e3d90fd5b909192939495967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c838303010187528735838112156103bb57840160208135910167ffffffffffffffff821161058b57813603811361058b5761057c6001936020938493610aee565b990197019594019291906104b3565b8b80fd5b8680fd5b8580fd5b6004867f65825336000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b8280fd5b50346100d15760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576105ff6108a8565b604435919060243567ffffffffffffffff84116105c357366023850112156105c35783600401359167ffffffffffffffff83116107595736602484870101116107595773ffffffffffffffffffffffffffffffffffffffff906106623382610b2d565b16938484528360205260408420828552602052604084209461068486546108d0565b601f8111610811575b508495601f851160011461076b578486978796979161075d575b508660011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8860031b1c19161790555b803b156107595761072d94848094604051978895869485937f162094c40000000000000000000000000000000000000000000000000000000085526004850152604060248501526024604485019201610aee565b03925af1801561074c5761073e5780f35b61074791610923565b388180f35b50604051903d90823e3d90fd5b8380fd5b6024915084010135386106a7565b808652602086207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861697875b8981106107f65750868899989798106107bb575b5050600186811b0190556106d9565b60247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88a60031b161c19918601013516905538806107ac565b90916020600181926024868a01013581550193019101610798565b86865260208620601f860160051c8101916020871061084c575b601f0160051c01905b818110610841575061068d565b868155600101610834565b909150819061082b565b50346100d15760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d1576100c160406100cd9273ffffffffffffffffffffffffffffffffffffffff6100a95b6004359073ffffffffffffffffffffffffffffffffffffffff821682036108cb57565b600080fd5b90600182811c92168015610919575b60208310146108ea57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108df565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90604051918260008254926109a7846108d0565b8084529360018116908115610a1557506001146109ce575b506109cc92500383610923565b565b90506000929192526020600020906000915b8183106109f95750509060206109cc92820101386109bf565b60209193508060019154838589010152019101909184926109e0565b602093506109cc9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386109bf565b9190916020815282519283602083015260005b848110610aa75750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610a68565b9181601f840112156108cb5782359167ffffffffffffffff83116108cb576020808501948460051b0101116108cb57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b803b15610c755773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff604051927f91d148540000000000000000000000000000000000000000000000000000000084527f6d696e746572000000000000000000000000000000000000000000000000000060048501521691826024820152602081604481855afa908115610c6957600091610c2a575b5015610bd6575050565b7f7a436c16000000000000000000000000000000000000000000000000000000006000526004527f6d696e746572000000000000000000000000000000000000000000000000000060245260445260646000fd5b6020813d602011610c61575b81610c4360209383610923565b81010312610c5d57519081151582036100d1575038610bcc565b5080fd5b3d9150610c36565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fdfea2646970667358221220b0c369cabd63e57ea6023acdc135e21135c1d8c7d95fbd325be00f31c7d2e80064736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x361953A3 EQ PUSH2 0x856 JUMPI DUP1 PUSH4 0x4E5786BF EQ PUSH2 0x5C7 JUMPI DUP1 PUSH4 0x626DC9A8 EQ PUSH2 0x12D JUMPI DUP1 PUSH4 0xD5391393 EQ PUSH2 0xD4 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0xC1 PUSH1 0x40 PUSH2 0xCD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9 PUSH2 0x8A8 JUMP JUMPDEST AND DUP2 MSTORE DUP1 PUSH1 0x20 MSTORE DUP2 DUP2 KECCAK256 PUSH1 0x24 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 MSTORE KECCAK256 PUSH2 0x993 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA55 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI DUP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 DUP2 MSTORE RETURN JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0x165 PUSH2 0x8A8 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5C3 JUMPI PUSH2 0x185 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xABD JUMP JUMPDEST PUSH1 0x44 SWAP3 SWAP2 SWAP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5BF JUMPI PUSH2 0x1A8 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0xABD JUMP JUMPDEST SWAP4 SWAP1 SWAP3 DUP5 DUP4 SUB PUSH2 0x597 JUMPI PUSH2 0x1BF SWAP5 SWAP3 SWAP5 CALLER DUP3 PUSH2 0xB2D JUMP JUMPDEST DUP6 SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP7 CALLDATASIZE SUB ADD SWAP3 AND SWAP4 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x3F0 JUMPI DUP2 DUP2 LT ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x5 SHL DUP1 DUP8 ADD CALLDATALOAD DUP5 DUP2 SLT ISZERO PUSH2 0x3BF JUMPI DUP8 ADD SWAP1 DUP2 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3BB JUMPI DUP2 CALLDATASIZE SUB PUSH1 0x20 DUP5 ADD SGT PUSH2 0x3BB JUMPI DUP8 DUP12 MSTORE DUP11 PUSH1 0x20 MSTORE PUSH1 0x40 DUP12 KECCAK256 SWAP1 DUP8 ADD CALLDATALOAD DUP12 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP11 KECCAK256 SWAP2 PUSH2 0x263 DUP4 SLOAD PUSH2 0x8D0 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x376 JUMPI JUMPDEST POP DUP11 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x2CD JUMPI PUSH1 0x1 SWAP5 SWAP4 SWAP3 SWAP2 DUP13 SWAP2 DUP4 PUSH2 0x2BF JUMPI JUMPDEST POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP7 SHL SWAP3 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST ADD PUSH2 0x1FF JUMP JUMPDEST PUSH1 0x20 SWAP3 POP ADD ADD CALLDATALOAD CODESIZE DUP1 PUSH2 0x288 JUMP JUMPDEST DUP4 DUP13 MSTORE PUSH1 0x20 DUP13 KECCAK256 SWAP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP14 JUMPDEST DUP2 DUP2 LT PUSH2 0x35C JUMPI POP SWAP2 PUSH1 0x1 SWAP7 SWAP6 SWAP5 SWAP3 SWAP2 DUP4 DUP9 SWAP6 SWAP4 LT PUSH2 0x321 JUMPI JUMPDEST POP POP POP DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x2B9 JUMP JUMPDEST ADD PUSH1 0x20 ADD CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x3 DUP5 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x314 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP3 DUP9 DUP9 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x2FA JUMP JUMPDEST DUP4 DUP13 MSTORE PUSH1 0x20 DUP13 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x3B1 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x3A6 JUMPI POP PUSH2 0x26C JUMP JUMPDEST DUP13 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x399 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x390 JUMP JUMPDEST DUP11 DUP1 REVERT JUMPDEST DUP10 DUP1 REVERT JUMPDEST PUSH1 0x24 DUP9 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE REVERT JUMPDEST POP SWAP1 SWAP3 SWAP6 SWAP5 SWAP4 SWAP2 DUP7 EXTCODESIZE ISZERO PUSH2 0x593 JUMPI PUSH1 0x40 MLOAD SWAP5 PUSH32 0x6706467B00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE PUSH1 0x40 PUSH1 0x4 DUP8 ADD MSTORE DUP1 PUSH1 0x44 DUP8 ADD MSTORE PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x58F JUMPI PUSH1 0x5 SWAP5 SWAP4 SWAP5 SHL DUP1 SWAP2 PUSH1 0x64 DUP8 ADD CALLDATACOPY DUP5 ADD SWAP1 DUP1 PUSH1 0x64 DUP4 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC PUSH1 0x64 DUP9 DUP7 SUB ADD ADD PUSH1 0x24 DUP9 ADD MSTORE MSTORE PUSH1 0x84 DUP3 ADD SWAP2 PUSH1 0x20 PUSH1 0x64 DUP4 PUSH1 0x5 SHL DUP4 ADD ADD ADD SWAP5 DUP1 SWAP5 DUP9 SWAP3 JUMPDEST DUP5 DUP5 LT PUSH2 0x4F2 JUMPI POP DUP9 DUP1 DUP10 DUP2 DUP2 DUP15 DUP2 DUP4 DUP2 DUP16 SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x4E7 JUMPI PUSH2 0x4D6 JUMPI POP RETURN JUMPDEST DUP2 PUSH2 0x4E0 SWAP2 PUSH2 0x923 JUMP JUMPDEST PUSH2 0xD1 JUMPI DUP1 RETURN JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE DUP5 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C DUP4 DUP4 SUB ADD ADD DUP8 MSTORE DUP8 CALLDATALOAD DUP4 DUP2 SLT ISZERO PUSH2 0x3BB JUMPI DUP5 ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x58B JUMPI DUP2 CALLDATASIZE SUB DUP2 SGT PUSH2 0x58B JUMPI PUSH2 0x57C PUSH1 0x1 SWAP4 PUSH1 0x20 SWAP4 DUP5 SWAP4 PUSH2 0xAEE JUMP JUMPDEST SWAP10 ADD SWAP8 ADD SWAP6 SWAP5 ADD SWAP3 SWAP2 SWAP1 PUSH2 0x4B3 JUMP JUMPDEST DUP12 DUP1 REVERT JUMPDEST DUP7 DUP1 REVERT JUMPDEST DUP6 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH32 0x6582533600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE REVERT JUMPDEST DUP5 DUP1 REVERT JUMPDEST DUP3 DUP1 REVERT JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0x5FF PUSH2 0x8A8 JUMP JUMPDEST PUSH1 0x44 CALLDATALOAD SWAP2 SWAP1 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x5C3 JUMPI CALLDATASIZE PUSH1 0x23 DUP6 ADD SLT ISZERO PUSH2 0x5C3 JUMPI DUP4 PUSH1 0x4 ADD CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x759 JUMPI CALLDATASIZE PUSH1 0x24 DUP5 DUP8 ADD ADD GT PUSH2 0x759 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x662 CALLER DUP3 PUSH2 0xB2D JUMP JUMPDEST AND SWAP4 DUP5 DUP5 MSTORE DUP4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 DUP3 DUP6 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 DUP5 KECCAK256 SWAP5 PUSH2 0x684 DUP7 SLOAD PUSH2 0x8D0 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x811 JUMPI JUMPDEST POP DUP5 SWAP6 PUSH1 0x1F DUP6 GT PUSH1 0x1 EQ PUSH2 0x76B JUMPI DUP5 DUP7 SWAP8 DUP8 SWAP7 SWAP8 SWAP2 PUSH2 0x75D JUMPI JUMPDEST POP DUP7 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0x759 JUMPI PUSH2 0x72D SWAP5 DUP5 DUP1 SWAP5 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH32 0x162094C400000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x40 PUSH1 0x24 DUP6 ADD MSTORE PUSH1 0x24 PUSH1 0x44 DUP6 ADD SWAP3 ADD PUSH2 0xAEE JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x74C JUMPI PUSH2 0x73E JUMPI DUP1 RETURN JUMPDEST PUSH2 0x747 SWAP2 PUSH2 0x923 JUMP JUMPDEST CODESIZE DUP2 DUP1 RETURN JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 RETURNDATASIZE SWAP1 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP4 DUP1 REVERT JUMPDEST PUSH1 0x24 SWAP2 POP DUP5 ADD ADD CALLDATALOAD CODESIZE PUSH2 0x6A7 JUMP JUMPDEST DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 AND SWAP8 DUP8 JUMPDEST DUP10 DUP2 LT PUSH2 0x7F6 JUMPI POP DUP7 DUP9 SWAP10 SWAP9 SWAP8 SWAP9 LT PUSH2 0x7BB JUMPI JUMPDEST POP POP PUSH1 0x1 DUP7 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x6D9 JUMP JUMPDEST PUSH1 0x24 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP11 PUSH1 0x3 SHL AND SHR NOT SWAP2 DUP7 ADD ADD CALLDATALOAD AND SWAP1 SSTORE CODESIZE DUP1 PUSH2 0x7AC JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 PUSH1 0x24 DUP7 DUP11 ADD ADD CALLDATALOAD DUP2 SSTORE ADD SWAP4 ADD SWAP2 ADD PUSH2 0x798 JUMP JUMPDEST DUP7 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 PUSH1 0x1F DUP7 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP8 LT PUSH2 0x84C JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x841 JUMPI POP PUSH2 0x68D JUMP JUMPDEST DUP7 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x834 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x82B JUMP JUMPDEST POP CALLVALUE PUSH2 0xD1 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xD1 JUMPI PUSH2 0xC1 PUSH1 0x40 PUSH2 0xCD SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xA9 JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x8CB JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x919 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x8EA JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8DF JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x964 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x9A7 DUP5 PUSH2 0x8D0 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0xA15 JUMPI POP PUSH1 0x1 EQ PUSH2 0x9CE JUMPI JUMPDEST POP PUSH2 0x9CC SWAP3 POP SUB DUP4 PUSH2 0x923 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x9F9 JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x9CC SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x9BF JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x9E0 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x9CC SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x9BF JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x20 DUP2 MSTORE DUP3 MLOAD SWAP3 DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x0 JUMPDEST DUP5 DUP2 LT PUSH2 0xAA7 JUMPI POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 PUSH1 0x0 PUSH1 0x40 DUP1 SWAP7 SWAP8 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE ADD PUSH2 0xA68 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x8CB JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x8CB JUMPI PUSH1 0x20 DUP1 DUP6 ADD SWAP5 DUP5 PUSH1 0x5 SHL ADD ADD GT PUSH2 0x8CB JUMPI JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 EXTCODESIZE ISZERO PUSH2 0xC75 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 MLOAD SWAP3 PUSH32 0x91D1485400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x4 DUP6 ADD MSTORE AND SWAP2 DUP3 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP2 DUP6 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xC69 JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC2A JUMPI JUMPDEST POP ISZERO PUSH2 0xBD6 JUMPI POP POP JUMP JUMPDEST PUSH32 0x7A436C1600000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH32 0x6D696E7465720000000000000000000000000000000000000000000000000000 PUSH1 0x24 MSTORE PUSH1 0x44 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xC61 JUMPI JUMPDEST DUP2 PUSH2 0xC43 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x923 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xC5D JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0xD1 JUMPI POP CODESIZE PUSH2 0xBCC JUMP JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xC36 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xC3 PUSH10 0xCABD63E57EA6023ACDC1 CALLDATALOAD 0xE2 GT CALLDATALOAD 0xC1 0xD8 0xC7 0xD9 PUSH0 0xBD ORIGIN JUMPDEST RJUMP 0xF31 0xC7 0xD2 0xE8 STOP PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"606:846:335:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;2002:26:334;;;;;;1998:90;;2153:10;;;;;;;:::i;:::-;2180:9;606:846:335;;;;;;;;;2175:112:334;2203:3;2191:10;;;;;;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2203:3:334;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2180:9:334;;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;606:846:335;;;;;;;;;;;;;;;;;;;;;;2191:10:334;;;;;;;;1368:75:335;;;;;606:846;;1368:75;606:846;1368:75;;606:846;;1368:75;;606:846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1368:75;;;;;;;;;;;;;;;;;;;;;606:846;;1368:75;;;;;:::i;:::-;606:846;;1368:75;606:846;1368:75;606:846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1368:75;606:846;;;1998:90:334;606:846:335;2051:26:334;;;;;606:846:335;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:10:334;;;;;:::i;:::-;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;968:68;;;;;606:846;;;;;;;968:68;;;;;;;606:846;968:68;;606:846;968:68;;606:846;;;;;;;;;;;;;:::i;:::-;968:68;;;;;;;;;;606:846;;968:68;;;;:::i;:::-;;;606:846;;968:68;606:846;;;;;;;;;;;968:68;606:846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;606:846:335;;;;;-1:-1:-1;606:846:335;;;;;;;-1:-1:-1;606:846:335;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;606:846:335;;;;;-1:-1:-1;606:846:335;;-1:-1:-1;606:846:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;606:846:335;;;;;;;;;;;:::o;4122:248:41:-;376:58:354;;450:9;3284:78:41;;606:846:335;;;;;3379:53:41;606:846:335;3379:53:41;;606:846:335;3379:53:41;;;606:846:335;;;;;;;;;3379:53:41;;;;;;;;;;;-1:-1:-1;3379:53:41;;;4122:248;4243:53;;4239:124;;4122:248;;:::o;4239:124::-;4305:58;-1:-1:-1;4305:58:41;3379:53;606:846:335;;;;3379:53:41;606:846:335;;-1:-1:-1;4305:58:41;3379:53;606:846:335;3379:53:41;;606:846:335;3379:53:41;;;;;;606:846:335;3379:53:41;;;:::i;:::-;;;606:846:335;;;;;;;;;;;;;3379:53:41;;;;606:846:335;;;;3379:53:41;;;-1:-1:-1;3379:53:41;;;606:846:335;;;-1:-1:-1;606:846:335;;;;;3284:78:41;606:846:335;3326:36:41;;-1:-1:-1;3326:36:41;606:846:335;3326:36:41;606:846:335;;-1:-1:-1;3326:36:41"},"gasEstimates":{"creation":{"codeDepositCost":"662200","executionCost":"703","totalCost":"662903"},"external":{"MINTER_ROLE()":"215","batchSetTokenURI(address,uint256[],string[])":"infinite","metadataURI(address,uint256)":"infinite","setTokenURI(address,uint256,string)":"infinite","tokenMetadataURI(address,uint256)":"infinite"}},"methodIdentifiers":{"MINTER_ROLE()":"d5391393","batchSetTokenURI(address,uint256[],string[])":"626dc9a8","metadataURI(address,uint256)":"361953a3","setTokenURI(address,uint256,string)":"4e5786bf","tokenMetadataURI(address,uint256)":"f724dad7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InconsistentArrayLengths\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractRoleHolder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"tokenURIs\",\"type\":\"string[]\"}],\"name\":\"batchSetTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"metadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"setTokenURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"role\":\"The role that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"kind\":\"dev\",\"methods\":{\"batchSetTokenURI(address,uint256[],string[])\":{\"details\":\"The token contract emits a {URI} event for each token.\",\"params\":{\"tokenContract\":\"The token contract on which to set the token URI.\",\"tokenIds\":\"The token identifiers.\",\"tokenURIs\":\"The token metadata URIs.\"}},\"setTokenURI(address,uint256,string)\":{\"details\":\"The token contract emits a {URI} event.\",\"params\":{\"tokenContract\":\"The token contract on which to set the token URI.\",\"tokenId\":\"The token identifier.\",\"tokenURI\":\"The token metadata URI.\"}},\"tokenMetadataURI(address,uint256)\":{\"params\":{\"tokenContract\":\"The token contract for which to retrieve the token URI.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenURI\":\"The token metadata URI.\"}}},\"title\":\"TokenMetadataResolverPerTokenERC1155.\",\"version\":1},\"userdoc\":{\"errors\":{\"InconsistentArrayLengths()\":[{\"notice\":\"Thrown when the multiple related arrays have different lengths.\"}],\"NotTargetContractRoleHolder(address,bytes32,address)\":[{\"notice\":\"Thrown when an account does not have the required role on a target contract.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"kind\":\"user\",\"methods\":{\"batchSetTokenURI(address,uint256[],string[])\":{\"notice\":\"Sets the metadata URIs for a batch of tokens on a contract.\"},\"setTokenURI(address,uint256,string)\":{\"notice\":\"Sets the metadata URI for a token on a contract.\"},\"tokenMetadataURI(address,uint256)\":{\"notice\":\"Gets the token metadata URI for a token.\"}},\"notice\":\"Token Metadata Resolver which stores the metadata URI for each token, for ERC1155 token contracts.When a metadata URI is set, the target ERC1155 contract will be asked to emit a URI event.Only minters of the target token contract can set the token metadata URI for this target contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol\":\"TokenMetadataResolverPerTokenERC1155\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CommonErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when trying to transfer tokens without calldata to the contract.\\nerror EtherReceptionDisabled();\\n\\n/// @notice Thrown when the multiple related arrays have different lengths.\\nerror InconsistentArrayLengths();\\n\\n/// @notice Thrown when an ETH transfer has failed.\\nerror TransferFailed();\\n\",\"keccak256\":\"0x708531f7bd17bf34340e1aea40049f967ce60e6219d89517504dafecd63cf76f\",\"license\":\"MIT\"},\"contracts/access/errors/AccessControlErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account does not have the required role.\\n/// @param role The role the caller is missing.\\n/// @param account The account that was checked.\\nerror NotRoleHolder(bytes32 role, address account);\\n\\n/// @notice Thrown when an account does not have the required role on a target contract.\\n/// @param targetContract The contract that was checked.\\n/// @param role The role that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractRoleHolder(address targetContract, bytes32 role, address account);\\n\",\"keccak256\":\"0x99710b1d35d320974964c8526350d8a0cbed32abe3e856d66ab64161e8f03d67\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/events/AccessControlEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when `role` is granted to `account`.\\n/// @param role The role that has been granted.\\n/// @param account The account that has been granted the role.\\n/// @param operator The account that granted the role.\\nevent RoleGranted(bytes32 role, address account, address operator);\\n\\n/// @notice Emitted when `role` is revoked from `account`.\\n/// @param role The role that has been revoked.\\n/// @param account The account that has been revoked the role.\\n/// @param operator The account that revoked the role.\\nevent RoleRevoked(bytes32 role, address account, address operator);\\n\",\"keccak256\":\"0x1b7bd39ada490e449872b73314bef876ef73a38870babbc94e70dea1cc52f909\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Access control via roles management (functions)\\ninterface IAccessControl {\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param role The role to renounce.\\n    function renounceRole(bytes32 role) external;\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(bytes32 role, address account) external view returns (bool hasRole_);\\n}\\n\",\"keccak256\":\"0xbcf4b0c89c361db61a0b86a4e86113d96d32a2eb7205f52f493808f363ed5f42\",\"license\":\"MIT\"},\"contracts/access/libraries/AccessControlStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotRoleHolder, NotTargetContractRoleHolder} from \\\"./../errors/AccessControlErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {RoleGranted, RoleRevoked} from \\\"./../events/AccessControlEvents.sol\\\";\\nimport {IAccessControl} from \\\"./../interfaces/IAccessControl.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\n\\nlibrary AccessControlStorage {\\n    using Address for address;\\n    using AccessControlStorage for AccessControlStorage.Layout;\\n\\n    struct Layout {\\n        mapping(bytes32 => mapping(address => bool)) roles;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.AccessControl.storage\\\")) - 1);\\n\\n    /// @notice Grants a role to an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleGranted} event if the account did not previously have the role.\\n    /// @param role The role to grant.\\n    /// @param account The account to grant the role to.\\n    /// @param operator The account requesting the role change.\\n    function grantRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (!s.hasRole(role, account)) {\\n            s.roles[role][account] = true;\\n            emit RoleGranted(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Revokes a role from an account.\\n    /// @dev Note: Call to this function should be properly access controlled.\\n    /// @dev Emits a {RoleRevoked} event if the account previously had the role.\\n    /// @param role The role to revoke.\\n    /// @param account The account to revoke the role from.\\n    /// @param operator The account requesting the role change.\\n    function revokeRole(Layout storage s, bytes32 role, address account, address operator) internal {\\n        if (s.hasRole(role, account)) {\\n            s.roles[role][account] = false;\\n            emit RoleRevoked(role, account, operator);\\n        }\\n    }\\n\\n    /// @notice Renounces a role by the sender.\\n    /// @dev Reverts with {NotRoleHolder} if `sender` does not have `role`.\\n    /// @dev Emits a {RoleRevoked} event.\\n    /// @param sender The message sender.\\n    /// @param role The role to renounce.\\n    function renounceRole(Layout storage s, address sender, bytes32 role) internal {\\n        s.enforceHasRole(role, sender);\\n        s.roles[role][sender] = false;\\n        emit RoleRevoked(role, sender, sender);\\n    }\\n\\n    /// @notice Retrieves whether an account has a role.\\n    /// @param role The role.\\n    /// @param account The account.\\n    /// @return hasRole_ Whether `account` has `role`.\\n    function hasRole(Layout storage s, bytes32 role, address account) internal view returns (bool hasRole_) {\\n        return s.roles[role][account];\\n    }\\n\\n    /// @notice Checks whether an account has a role in a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    /// @return hasTargetContractRole_ Whether `account` has `role` in `targetContract`.\\n    function hasTargetContractRole(address targetContract, bytes32 role, address account) internal view returns (bool hasTargetContractRole_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IAccessControl(targetContract).hasRole(role, account);\\n    }\\n\\n    /// @notice Ensures that an account has a role.\\n    /// @dev Reverts with {NotRoleHolder} if `account` does not have `role`.\\n    /// @param role The role.\\n    /// @param account The account.\\n    function enforceHasRole(Layout storage s, bytes32 role, address account) internal view {\\n        if (!s.hasRole(role, account)) revert NotRoleHolder(role, account);\\n    }\\n\\n    /// @notice Enforces that an account has a role in a target contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the account does not have the role.\\n    /// @param targetContract The contract to check.\\n    /// @param role The role to check.\\n    /// @param account The account to check.\\n    function enforceHasTargetContractRole(address targetContract, bytes32 role, address account) internal view {\\n        if (!hasTargetContractRole(targetContract, role, account)) revert NotTargetContractRoleHolder(targetContract, role, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x00ca808154fc0af032e8f5d45291207eb5c9f69e7cb631ef4c99317a0b2e20b3\",\"license\":\"MIT\"},\"contracts/token/ERC1155/interfaces/IERC1155MetadataSetter.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IERC1155MetadataSetter {\\n    /// @notice Sets the metadata URI for a token.\\n    /// @dev Emits a {URI} event.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(uint256 tokenId, string calldata tokenURI) external;\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Emits a {URI} event for each token.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(uint256[] calldata tokenIds, string[] calldata tokenURIs) external;\\n}\\n\",\"keccak256\":\"0x33c0921c26caff2bd9bd048cc91de8614e30f33b004b011724699af8bd635ef7\",\"license\":\"MIT\"},\"contracts/token/metadata/TokenMetadataResolverPerToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {InconsistentArrayLengths} from \\\"./../../CommonErrors.sol\\\";\\nimport {ITokenMetadataResolver} from \\\"./interfaces/ITokenMetadataResolver.sol\\\";\\nimport {AccessControlStorage} from \\\"./../../access/libraries/AccessControlStorage.sol\\\";\\n\\n/// @title TokenMetadataResolverPerToken.\\n/// @notice Token Metadata Resolver which stores the metadata URI for each token.\\n/// @notice Only minters of the target token contract can set the token metadata URI for this target contract.\\ncontract TokenMetadataResolverPerToken is ITokenMetadataResolver {\\n    using AccessControlStorage for address;\\n\\n    bytes32 public constant MINTER_ROLE = \\\"minter\\\";\\n\\n    mapping(address => mapping(uint256 => string)) public metadataURI;\\n\\n    /// @notice Sets the metadata URI for a token on a contract.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\\n    /// @param tokenContract The token contract on which to set the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @param tokenURI The token metadata URI.\\n    function setTokenURI(address tokenContract, uint256 tokenId, string calldata tokenURI) public virtual {\\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\\n        metadataURI[tokenContract][tokenId] = tokenURI;\\n    }\\n\\n    /// @notice Sets the metadata URIs for a batch of tokens on a contract.\\n    /// @dev Reverts with {InconsistentArrayLengths} if the arrays are of inconsistent lengths.\\n    /// @dev Reverts with {NotTargetContractRoleHolder} if the sender is not a 'minter' of the token contract.\\n    /// @param tokenContract The token contract on which to set the token URI.\\n    /// @param tokenIds The token identifiers.\\n    /// @param tokenURIs The token metadata URIs.\\n    function batchSetTokenURI(address tokenContract, uint256[] calldata tokenIds, string[] calldata tokenURIs) public virtual {\\n        uint256 length = tokenIds.length;\\n        if (length != tokenURIs.length) {\\n            revert InconsistentArrayLengths();\\n        }\\n        tokenContract.enforceHasTargetContractRole(MINTER_ROLE, msg.sender);\\n\\n        for (uint256 i; i < length; ++i) {\\n            metadataURI[tokenContract][tokenIds[i]] = tokenURIs[i];\\n        }\\n    }\\n\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view virtual override returns (string memory tokenURI) {\\n        return metadataURI[tokenContract][tokenId];\\n    }\\n}\\n\",\"keccak256\":\"0x2d2d60287028fdfd1dfc9ca2dc88194c25bad6a8cec0a4918db40e70af80f55b\",\"license\":\"MIT\"},\"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IERC1155MetadataSetter} from \\\"./../ERC1155/interfaces/IERC1155MetadataSetter.sol\\\";\\nimport {TokenMetadataResolverPerToken} from \\\"./TokenMetadataResolverPerToken.sol\\\";\\n\\n/// @title TokenMetadataResolverPerTokenERC1155.\\n/// @notice Token Metadata Resolver which stores the metadata URI for each token, for ERC1155 token contracts.\\n/// @notice When a metadata URI is set, the target ERC1155 contract will be asked to emit a URI event.\\n/// @notice Only minters of the target token contract can set the token metadata URI for this target contract.\\ncontract TokenMetadataResolverPerTokenERC1155 is TokenMetadataResolverPerToken {\\n    /// @inheritdoc TokenMetadataResolverPerToken\\n    /// @dev The token contract emits a {URI} event.\\n    function setTokenURI(address tokenContract, uint256 tokenId, string calldata tokenURI) public override {\\n        super.setTokenURI(tokenContract, tokenId, tokenURI);\\n        IERC1155MetadataSetter(tokenContract).setTokenURI(tokenId, tokenURI);\\n    }\\n\\n    /// @inheritdoc TokenMetadataResolverPerToken\\n    /// @dev The token contract emits a {URI} event for each token.\\n    function batchSetTokenURI(address tokenContract, uint256[] calldata tokenIds, string[] calldata tokenURIs) public override {\\n        super.batchSetTokenURI(tokenContract, tokenIds, tokenURIs);\\n        IERC1155MetadataSetter(tokenContract).batchSetTokenURI(tokenIds, tokenURIs);\\n    }\\n}\\n\",\"keccak256\":\"0x6eedd3849b64cf1cf97d555eac4558146ee25777b3b0333070fa0c7c7e4f78b1\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":35918,"contract":"contracts/token/metadata/TokenMetadataResolverPerTokenERC1155.sol:TokenMetadataResolverPerTokenERC1155","label":"metadataURI","offset":0,"slot":"0","type":"t_mapping(t_address,t_mapping(t_uint256,t_string_storage))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_uint256,t_string_storage))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(uint256 => string))","numberOfBytes":"32","value":"t_mapping(t_uint256,t_string_storage)"},"t_mapping(t_uint256,t_string_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => string)","numberOfBytes":"32","value":"t_string_storage"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"InconsistentArrayLengths()":[{"notice":"Thrown when the multiple related arrays have different lengths."}],"NotTargetContractRoleHolder(address,bytes32,address)":[{"notice":"Thrown when an account does not have the required role on a target contract."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"kind":"user","methods":{"batchSetTokenURI(address,uint256[],string[])":{"notice":"Sets the metadata URIs for a batch of tokens on a contract."},"setTokenURI(address,uint256,string)":{"notice":"Sets the metadata URI for a token on a contract."},"tokenMetadataURI(address,uint256)":{"notice":"Gets the token metadata URI for a token."}},"notice":"Token Metadata Resolver which stores the metadata URI for each token, for ERC1155 token contracts.When a metadata URI is set, the target ERC1155 contract will be asked to emit a URI event.Only minters of the target token contract can set the token metadata URI for this target contract.","version":1}}},"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol":{"TokenMetadataResolverRandomizedReveal":{"abi":[{"inputs":[{"internalType":"address","name":"linkToken","type":"address"},{"internalType":"address","name":"vrfWrapper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"EmptyPostRevealBaseMetadataURI","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"EmptyPreRevealTokenMetadataURI","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"RevealAlreadyRequested","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"TokenDataNotSet","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"TokensAlreadyRevealed","type":"error"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"UnknownRequestId","type":"error"},{"inputs":[{"internalType":"address","name":"wrongAddress","type":"address"}],"name":"WrongLINKTokenAddress","type":"error"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"ZeroTokenSupply","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"RevealRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"string","name":"preRevealTokenMetadataURI","type":"string"},{"indexed":false,"internalType":"string","name":"postRevealBaseMetadataURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenSupply","type":"uint256"}],"name":"TokenDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"metadataOffset","type":"uint256"}],"name":"TokensRevealed","type":"event"},{"inputs":[],"name":"CHAINLINK_LINK_TOKEN","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINLINK_VRF_WRAPPER","outputs":[{"internalType":"contract VRFV2WrapperInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"metadataOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"postRevealBaseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preRevealTokenMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256[]","name":"_randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestIdToTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"}],"name":"requestReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"revealStatus","outputs":[{"internalType":"enum TokenMetadataResolverRandomizedReveal.RevealStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"string","name":"preRevealTokenURI","type":"string"},{"internalType":"string","name":"postRevealBaseURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadataURI","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"EmptyPostRevealBaseMetadataURI(address)":[{"params":{"tokenContract":"The token contract which data is being set."}}],"EmptyPreRevealTokenMetadataURI(address)":[{"params":{"tokenContract":"The token contract which data is being set."}}],"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"RevealAlreadyRequested(address)":[{"params":{"tokenContract":"The token contract which is already requested to reveal."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}],"TokenDataNotSet(address)":[{"params":{"tokenContract":"The token contract on which is being requested to reveal."}}],"TokensAlreadyRevealed(address)":[{"params":{"tokenContract":"The token contract which is already revealed."}}],"UnknownRequestId(uint256)":[{"params":{"requestId":"The request ID."}}],"ZeroTokenSupply(address)":[{"params":{"tokenContract":"The token contract which data is being set."}}]},"events":{"RevealRequested(address,uint256)":{"params":{"requestId":"The ChainLink VRF request ID.","tokenContract":"The token contract on which the tokens are requested to reveal."}},"TokenDataSet(address,string,string,uint256)":{"params":{"postRevealBaseMetadataURI":"The post-reveal base metadata URI.","preRevealTokenMetadataURI":"The pre-reveal token metadata URI.","tokenContract":"The token contract on which the base metadata URI was set.","tokenSupply":"The token supply."}},"TokensRevealed(address,uint256,uint256)":{"params":{"metadataOffset":"The random metadata offset.","requestId":"The ChainLink VRF request ID.","tokenContract":"The token contract on which the tokens are revealed."}}},"kind":"dev","methods":{"requestReveal(address,uint32,uint16)":{"details":"Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Reverts with {TokenDataNotSet} if the token data has not been set yet.Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.Emits a {RevealRequested} event.Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from the sender to this contract.Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from this contract to the VRF Wrapper.","params":{"callbackGasLimit":"The gas limit to set for the VRF V2 wrapper callback.","requestConfirmations":"The number of confirmations to wait before fulfilling the request.","tokenContract":"The token contract for which to reveal the tokens."}},"setTokenData(address,string,string,uint256)":{"details":"Reverts with {EmptyPreRevealTokenMetadataURI} if the pre-reveal token metadata URI is empty.Reverts with {EmptyPostRevealBaseMetadataURIs} if the post-reveal base metadata URI is empty.Reverts with {ZeroTokenSupply} if the token supply is 0.Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Reverts with {RevealAlreadyRequested} if reveal has already been requested.Emits a {TokenDataSet} event.","params":{"postRevealBaseURI":"The post-reveal base metadata URI.","preRevealTokenURI":"The pre-reveal token metadata URI.","supply":"The token supply.","tokenContract":"The token contract on which to set the base metadata URI."}},"tokenMetadataURI(address,uint256)":{"params":{"tokenContract":"The token contract for which to retrieve the token URI.","tokenId":"The token identifier."},"returns":{"tokenURI":"The token metadata URI."}}},"title":"TokenMetadataResolverRandomizedReveal.","version":1},"evm":{"bytecode":{"functionDebugData":{"abi_decode_address_fromMemory":{"entryPoint":181,"id":null,"parameterSlots":1,"returnSlots":1}},"generatedSources":[],"linkReferences":{},"object":"60c03461009a57601f6119f638819003918201601f19168301916001600160401b0383118484101761009f57808492604094855283398101031261009a57610052602061004b836100b5565b92016100b5565b6001600160a01b039182166080521660a05260405161192c90816100ca82396080518181816101500152610ac6015260a05181818161022401528181610a480152610e850152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361009a5756fe608080604052600436101561001357600080fd5b60003560e01c9081625e24de146110c5575080631fe543e314610dd157806328e82e431461098157806349855083146109105780634bf810d8146108ab5780636844d6fa146108465780636b0fce13146107e15780637c9bc10514610248578063981e4cc2146101d9578063e643792e14610174578063ee206f9d146101055763f724dad7146100a257600080fd5b346101005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576100fc6100e86100df611162565b602435906113be565b6040519182916020835260208301906112bd565b0390f35b600080fd5b346101005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff6101c0611162565b1660005260026020526020604060002054604051908152f35b346101005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101005760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005761027f611162565b60243567ffffffffffffffff81116101005761029f903690600401611300565b909160443567ffffffffffffffff8111610100576102c1903690600401611300565b919060643591841561079d5783156107595782156107155773ffffffffffffffffffffffffffffffffffffffff906102f9338261175a565b169283600052600360205260ff6040600020541660038110156106e6576106b857836000526000602052604060002067ffffffffffffffff8611610597576103418154611185565b601f8111610670575b50856000601f82116001146105d1576000916105c6575b508660011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8860031b1c19161790555b83600052600160205260406000209567ffffffffffffffff8211610597576103bb8754611185565b601f811161054f575b50600096601f83116001146104875782916104639161047195947f1e2c5cd029119717a495b3bafc43690a7584a3f26d1253838c2aacfdebae1f439a60009161047c575b508460011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8660031b1c19161790555b866000526002602052856040600020556040519788978852608060208901526080880191611346565b918583036040870152611346565b9060608301520390a1005b90508501358b610408565b808852602088207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416895b8181106105375750918493917f1e2c5cd029119717a495b3bafc43690a7584a3f26d1253838c2aacfdebae1f439a610471979661046395106104ff575b5050600184811b01905561043a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88760031b161c19908701351690558a806104f0565b868b0135835560209a8b019a600190930192016104b3565b876000526020600020601f840160051c8101916020851061058d575b601f0160051c01905b81811061058157506103c4565b60008155600101610574565b909150819061056b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b905087013588610361565b828152602081209188907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016825b8b8282106106565750501061061e575b5050600186811b019055610393565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88960031b161c1990890135169055878061060f565b84013585556001909401936020938401938b9350016105ff565b816000526020600020601f880160051c810191602089106106ae575b601f0160051c01905b8181106106a2575061034a565b60008155600101610695565b909150819061068c565b837f66daadea0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f0f633658000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907fea1c6ea0000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f9e9de65d000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff61082d611162565b1660005260016020526100fc6100e860406000206111d8565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff610892611162565b1660005260006020526100fc6100e860406000206111d8565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff6108f7611162565b1660005260046020526020604060002054604051908152f35b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff61095c611162565b16600052600360205260ff6040600020541660405160038210156106e6576020918152f35b346101005760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576109b8611162565b60243563ffffffff8116809103610100576044359161ffff83168093036101005773ffffffffffffffffffffffffffffffffffffffff906109f9338261175a565b169182600052600260205260406000205415610da35782600052600360205260ff6040600020541660038110156106e657600214610d755773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690604051927f4306d354000000000000000000000000000000000000000000000000000000008452806004850152602084602481865afa938415610cef57600094610d41575b5073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604051947f23b872dd0000000000000000000000000000000000000000000000000000000086523360048701523060248701528060448701526020866064816000865af1938415610cef57610bab96602095610d26575b50604051938585015260408401526001606084015260608352610b61608084611121565b60006040518097819582947f4000aea000000000000000000000000000000000000000000000000000000000845289600485015260248401526060604484015260648301906112bd565b03925af1908115610cef57600492602092610cfb575b50604051928380927ffc2a88c30000000000000000000000000000000000000000000000000000000082525afa908115610cef57600091610c9a575b7f40cafdc32fe56fc488360b1b38d2c0ae3ac896e631536bb4bae762e342f0e7046040848480600052600560205282600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558160005260036020528260002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905582519182526020820152a1005b906020823d602011610ce7575b81610cb460209383611121565b81010312610ce45750517f40cafdc32fe56fc488360b1b38d2c0ae3ac896e631536bb4bae762e342f0e704610bfd565b80fd5b3d9150610ca7565b6040513d6000823e3d90fd5b610d1a90833d8511610d1f575b610d128183611121565b81019061132e565b610bc1565b503d610d08565b610d3c90863d8811610d1f57610d128183611121565b610b3d565b90936020823d602011610d6d575b81610d5c60209383611121565b81010312610ce45750519285610aae565b3d9150610d4f565b827fd2a6a91e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f7f78e4030000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005760043560243567ffffffffffffffff8111610100573660238201121561010057806004013567ffffffffffffffff8111610597578060051b9160405191610e4a6020850184611121565b825260208201602481948301019136831161010057602401905b8282106110b55750505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036110575782600052600560205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156110295783600052600560205260406000207fffffffffffffffffffffffff0000000000000000000000000000000000000000815416905581600052600360205260ff6040600020541660038110156106e657600214610ffb575115610fcc577f4188cd09fa8447854490f2c7c4b3e63e3e8e55beb167c0bc1fd93e3fc30f49f892610f716060935183600052600260205260406000205490611385565b9082600052600460205281604060002055826000526003602052604060002060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905560405192835260208301526040820152a1005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b507fd2a6a91e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f597349fa0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6f6e6c792056524620563220777261707065722063616e2066756c66696c6c006044820152fd5b8135815260209182019101610e64565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576020906004356000526005825273ffffffffffffffffffffffffffffffffffffffff604060002054168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059757604052565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010057565b90600182811c921680156111ce575b602083101461119f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611194565b90604051918260008254926111ec84611185565b808452936001811690811561125a5750600114611213575b5061121192500383611121565b565b90506000929192526020600020906000915b81831061123e5750509060206112119282010138611204565b6020919350806001915483858901015201910190918492611225565b602093506112119592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611204565b60005b8381106112ad5750506000910152565b818101518382015260200161129d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936112f98151809281875287808801910161129a565b0116010190565b9181601f840112156101005782359167ffffffffffffffff8311610100576020838186019501011161010057565b90816020910312610100575180151581036101005790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b811561138f570690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff169081600052600360205260ff6040600020541660038110156106e657600203611744578160005260046020526040600020548101809111611715576114289082600052600260205260406000205490611385565b90600052600160205260406000209080816000927a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110156116ea575b50806d04ee2d6d415b85acef8100000000600a9210156116cf575b662386f26fc100008110156116bb575b6305f5e1008110156116aa575b61271081101561169b575b606481101561168d575b1015611683575b6001820190600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60216115006114ea866118bc565b956114f86040519788611121565b8087526118bc565b957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020870197013688378501015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a8353048015611589577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a919261152f565b50506040519283916000918054906115a082611185565b916001811690811561163f57506001146115f9575b50506115c96115f69483925193849161129a565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611121565b90565b6000908152602081209593505b81811061162357506115f6945060206115c99185010192946115b5565b8554602082890181019190915260019096019587955001611606565b6115f6979550602092506115c99391507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016828701528015150285010192946115b5565b90600101906114b4565b6064600291049301926114ad565b612710600491049301926114a3565b6305f5e10060089104930192611498565b662386f26fc100006010910493019261148b565b6d04ee2d6d415b85acef81000000006020910493019261147b565b604093507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000090049050600a611460565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060005260006020526115f660406000206111d8565b919091803b156118785773ffffffffffffffffffffffffffffffffffffffff16604051927f8da5cb5b000000000000000000000000000000000000000000000000000000008452602084600481855afa938415610cef57600094611811575b509273ffffffffffffffffffffffffffffffffffffffff8093941692839116036117e1575050565b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611870575b8161182a60209383611121565b8101031261186c57519373ffffffffffffffffffffffffffffffffffffffff85168503610ce4575073ffffffffffffffffffffffffffffffffffffffff6117b9565b8480fd5b3d915061181d565b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161059757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea26469706673582212203454a6906cb2eeb5296fb3233acb03b3a84c7ed2f7682966999087b3252dc05364736f6c634300081e0033","opcodes":"PUSH1 0xC0 CALLVALUE PUSH2 0x9A JUMPI PUSH1 0x1F PUSH2 0x19F6 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH2 0x9F JUMPI DUP1 DUP5 SWAP3 PUSH1 0x40 SWAP5 DUP6 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH2 0x9A JUMPI PUSH2 0x52 PUSH1 0x20 PUSH2 0x4B DUP4 PUSH2 0xB5 JUMP JUMPDEST SWAP3 ADD PUSH2 0xB5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x80 MSTORE AND PUSH1 0xA0 MSTORE PUSH1 0x40 MLOAD PUSH2 0x192C SWAP1 DUP2 PUSH2 0xCA DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x150 ADD MSTORE PUSH2 0xAC6 ADD MSTORE PUSH1 0xA0 MLOAD DUP2 DUP2 DUP2 PUSH2 0x224 ADD MSTORE DUP2 DUP2 PUSH2 0xA48 ADD MSTORE PUSH2 0xE85 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST MLOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND DUP3 SUB PUSH2 0x9A JUMPI JUMP INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH3 0x5E24DE EQ PUSH2 0x10C5 JUMPI POP DUP1 PUSH4 0x1FE543E3 EQ PUSH2 0xDD1 JUMPI DUP1 PUSH4 0x28E82E43 EQ PUSH2 0x981 JUMPI DUP1 PUSH4 0x49855083 EQ PUSH2 0x910 JUMPI DUP1 PUSH4 0x4BF810D8 EQ PUSH2 0x8AB JUMPI DUP1 PUSH4 0x6844D6FA EQ PUSH2 0x846 JUMPI DUP1 PUSH4 0x6B0FCE13 EQ PUSH2 0x7E1 JUMPI DUP1 PUSH4 0x7C9BC105 EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x981E4CC2 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0xE643792E EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0xEE206F9D EQ PUSH2 0x105 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0xA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0xFC PUSH2 0xE8 PUSH2 0xDF PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH2 0x13BE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x12BD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1C0 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0x27F PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI PUSH2 0x29F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1300 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI PUSH2 0x2C1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1300 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x64 CALLDATALOAD SWAP2 DUP5 ISZERO PUSH2 0x79D JUMPI DUP4 ISZERO PUSH2 0x759 JUMPI DUP3 ISZERO PUSH2 0x715 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x2F9 CALLER DUP3 PUSH2 0x175A JUMP JUMPDEST AND SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH2 0x6B8 JUMPI DUP4 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0x597 JUMPI PUSH2 0x341 DUP2 SLOAD PUSH2 0x1185 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x670 JUMPI JUMPDEST POP DUP6 PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5C6 JUMPI JUMPDEST POP DUP7 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x597 JUMPI PUSH2 0x3BB DUP8 SLOAD PUSH2 0x1185 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x54F JUMPI JUMPDEST POP PUSH1 0x0 SWAP7 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x487 JUMPI DUP3 SWAP2 PUSH2 0x463 SWAP2 PUSH2 0x471 SWAP6 SWAP5 PUSH32 0x1E2C5CD029119717A495B3BAFC43690A7584A3F26D1253838C2AACFDEBAE1F43 SWAP11 PUSH1 0x0 SWAP2 PUSH2 0x47C JUMPI JUMPDEST POP DUP5 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 DUP9 MSTORE PUSH1 0x80 PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x80 DUP9 ADD SWAP2 PUSH2 0x1346 JUMP JUMPDEST SWAP2 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x1346 JUMP JUMPDEST SWAP1 PUSH1 0x60 DUP4 ADD MSTORE SUB SWAP1 LOG1 STOP JUMPDEST SWAP1 POP DUP6 ADD CALLDATALOAD DUP12 PUSH2 0x408 JUMP JUMPDEST DUP1 DUP9 MSTORE PUSH1 0x20 DUP9 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP10 JUMPDEST DUP2 DUP2 LT PUSH2 0x537 JUMPI POP SWAP2 DUP5 SWAP4 SWAP2 PUSH32 0x1E2C5CD029119717A495B3BAFC43690A7584A3F26D1253838C2AACFDEBAE1F43 SWAP11 PUSH2 0x471 SWAP8 SWAP7 PUSH2 0x463 SWAP6 LT PUSH2 0x4FF JUMPI JUMPDEST POP POP PUSH1 0x1 DUP5 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x43A JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP8 PUSH1 0x3 SHL AND SHR NOT SWAP1 DUP8 ADD CALLDATALOAD AND SWAP1 SSTORE DUP11 DUP1 PUSH2 0x4F0 JUMP JUMPDEST DUP7 DUP12 ADD CALLDATALOAD DUP4 SSTORE PUSH1 0x20 SWAP11 DUP12 ADD SWAP11 PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 ADD PUSH2 0x4B3 JUMP JUMPDEST DUP8 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x58D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x581 JUMPI POP PUSH2 0x3C4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x574 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x56B JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP DUP8 ADD CALLDATALOAD DUP9 PUSH2 0x361 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP2 DUP9 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 JUMPDEST DUP12 DUP3 DUP3 LT PUSH2 0x656 JUMPI POP POP LT PUSH2 0x61E JUMPI JUMPDEST POP POP PUSH1 0x1 DUP7 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x393 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP10 PUSH1 0x3 SHL AND SHR NOT SWAP1 DUP10 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 PUSH2 0x60F JUMP JUMPDEST DUP5 ADD CALLDATALOAD DUP6 SSTORE PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 DUP12 SWAP4 POP ADD PUSH2 0x5FF JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP9 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP10 LT PUSH2 0x6AE JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6A2 JUMPI POP PUSH2 0x34A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x695 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x68C JUMP JUMPDEST DUP4 PUSH32 0x66DAADEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF63365800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xEA1C6EA000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9E9DE65D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x82D PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH2 0xFC PUSH2 0xE8 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x892 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH2 0xFC PUSH2 0xE8 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x8F7 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x95C PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x20 SWAP2 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0x9B8 PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x100 JUMPI PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0xFFFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x9F9 CALLER DUP3 PUSH2 0x175A JUMP JUMPDEST AND SWAP2 DUP3 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD ISZERO PUSH2 0xDA3 JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 EQ PUSH2 0xD75 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH1 0x40 MLOAD SWAP3 PUSH32 0x4306D35400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP1 PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x20 DUP5 PUSH1 0x24 DUP2 DUP7 GAS STATICCALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP5 PUSH2 0xD41 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND PUSH1 0x40 MLOAD SWAP5 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE CALLER PUSH1 0x4 DUP8 ADD MSTORE ADDRESS PUSH1 0x24 DUP8 ADD MSTORE DUP1 PUSH1 0x44 DUP8 ADD MSTORE PUSH1 0x20 DUP7 PUSH1 0x64 DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH2 0xBAB SWAP7 PUSH1 0x20 SWAP6 PUSH2 0xD26 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP4 DUP6 DUP6 ADD MSTORE PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x1 PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x60 DUP4 MSTORE PUSH2 0xB61 PUSH1 0x80 DUP5 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x4000AEA000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP10 PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x64 DUP4 ADD SWAP1 PUSH2 0x12BD JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x4 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0xCFB JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xFC2A88C300000000000000000000000000000000000000000000000000000000 DUP3 MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC9A JUMPI JUMPDEST PUSH32 0x40CAFDC32FE56FC488360B1B38D2C0AE3AC896E631536BB4BAE762E342F0E704 PUSH1 0x40 DUP5 DUP5 DUP1 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST SWAP1 PUSH1 0x20 DUP3 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE7 JUMPI JUMPDEST DUP2 PUSH2 0xCB4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCE4 JUMPI POP MLOAD PUSH32 0x40CAFDC32FE56FC488360B1B38D2C0AE3AC896E631536BB4BAE762E342F0E704 PUSH2 0xBFD JUMP JUMPDEST DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xCA7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xD1A SWAP1 DUP4 RETURNDATASIZE DUP6 GT PUSH2 0xD1F JUMPI JUMPDEST PUSH2 0xD12 DUP2 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x132E JUMP JUMPDEST PUSH2 0xBC1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD08 JUMP JUMPDEST PUSH2 0xD3C SWAP1 DUP7 RETURNDATASIZE DUP9 GT PUSH2 0xD1F JUMPI PUSH2 0xD12 DUP2 DUP4 PUSH2 0x1121 JUMP JUMPDEST PUSH2 0xB3D JUMP JUMPDEST SWAP1 SWAP4 PUSH1 0x20 DUP3 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD6D JUMPI JUMPDEST DUP2 PUSH2 0xD5C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCE4 JUMPI POP MLOAD SWAP3 DUP6 PUSH2 0xAAE JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xD4F JUMP JUMPDEST DUP3 PUSH32 0xD2A6A91E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x7F78E40300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x100 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x597 JUMPI DUP1 PUSH1 0x5 SHL SWAP2 PUSH1 0x40 MLOAD SWAP2 PUSH2 0xE4A PUSH1 0x20 DUP6 ADD DUP5 PUSH2 0x1121 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x24 DUP2 SWAP5 DUP4 ADD ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x100 JUMPI PUSH1 0x24 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x10B5 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x1057 JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x1029 JUMPI DUP4 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 EQ PUSH2 0xFFB JUMPI MLOAD ISZERO PUSH2 0xFCC JUMPI PUSH32 0x4188CD09FA8447854490F2C7C4B3E63E3E8E55BEB167C0BC1FD93E3FC30F49F8 SWAP3 PUSH2 0xF71 PUSH1 0x60 SWAP4 MLOAD DUP4 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1385 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE DUP2 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xD2A6A91E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x597349FA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C792056524620563220777261707065722063616E2066756C66696C6C00 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE64 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x5 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP2 MSTORE RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x597 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x100 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x11CE JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x119F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1194 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x11EC DUP5 PUSH2 0x1185 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x125A JUMPI POP PUSH1 0x1 EQ PUSH2 0x1213 JUMPI JUMPDEST POP PUSH2 0x1211 SWAP3 POP SUB DUP4 PUSH2 0x1121 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x123E JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1211 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1204 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1225 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1211 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1204 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12AD JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x129D JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x12F9 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x129A JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x100 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x100 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x100 JUMPI JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x100 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x100 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x138F JUMPI MOD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 SUB PUSH2 0x1744 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 ADD DUP1 SWAP2 GT PUSH2 0x1715 JUMPI PUSH2 0x1428 SWAP1 DUP3 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1385 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP1 DUP2 PUSH1 0x0 SWAP3 PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 DUP2 LT ISZERO PUSH2 0x16EA JUMPI JUMPDEST POP DUP1 PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0xA SWAP3 LT ISZERO PUSH2 0x16CF JUMPI JUMPDEST PUSH7 0x2386F26FC10000 DUP2 LT ISZERO PUSH2 0x16BB JUMPI JUMPDEST PUSH4 0x5F5E100 DUP2 LT ISZERO PUSH2 0x16AA JUMPI JUMPDEST PUSH2 0x2710 DUP2 LT ISZERO PUSH2 0x169B JUMPI JUMPDEST PUSH1 0x64 DUP2 LT ISZERO PUSH2 0x168D JUMPI JUMPDEST LT ISZERO PUSH2 0x1683 JUMPI JUMPDEST PUSH1 0x1 DUP3 ADD SWAP1 PUSH1 0xA PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x21 PUSH2 0x1500 PUSH2 0x14EA DUP7 PUSH2 0x18BC JUMP JUMPDEST SWAP6 PUSH2 0x14F8 PUSH1 0x40 MLOAD SWAP8 DUP9 PUSH2 0x1121 JUMP JUMPDEST DUP1 DUP8 MSTORE PUSH2 0x18BC JUMP JUMPDEST SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x20 DUP8 ADD SWAP8 ADD CALLDATASIZE DUP9 CALLDATACOPY DUP6 ADD ADD JUMPDEST ADD SWAP2 PUSH32 0x3031323334353637383961626364656600000000000000000000000000000000 DUP3 DUP3 MOD BYTE DUP4 MSTORE8 DIV DUP1 ISZERO PUSH2 0x1589 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SWAP2 SWAP3 PUSH2 0x152F JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x0 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x15A0 DUP3 PUSH2 0x1185 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x163F JUMPI POP PUSH1 0x1 EQ PUSH2 0x15F9 JUMPI JUMPDEST POP POP PUSH2 0x15C9 PUSH2 0x15F6 SWAP5 DUP4 SWAP3 MLOAD SWAP4 DUP5 SWAP2 PUSH2 0x129A JUMP JUMPDEST ADD SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x1121 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP6 SWAP4 POP JUMPDEST DUP2 DUP2 LT PUSH2 0x1623 JUMPI POP PUSH2 0x15F6 SWAP5 POP PUSH1 0x20 PUSH2 0x15C9 SWAP2 DUP6 ADD ADD SWAP3 SWAP5 PUSH2 0x15B5 JUMP JUMPDEST DUP6 SLOAD PUSH1 0x20 DUP3 DUP10 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 SWAP1 SWAP7 ADD SWAP6 DUP8 SWAP6 POP ADD PUSH2 0x1606 JUMP JUMPDEST PUSH2 0x15F6 SWAP8 SWAP6 POP PUSH1 0x20 SWAP3 POP PUSH2 0x15C9 SWAP4 SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP3 DUP8 ADD MSTORE DUP1 ISZERO ISZERO MUL DUP6 ADD ADD SWAP3 SWAP5 PUSH2 0x15B5 JUMP JUMPDEST SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x14B4 JUMP JUMPDEST PUSH1 0x64 PUSH1 0x2 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x14AD JUMP JUMPDEST PUSH2 0x2710 PUSH1 0x4 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x14A3 JUMP JUMPDEST PUSH4 0x5F5E100 PUSH1 0x8 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x1498 JUMP JUMPDEST PUSH7 0x2386F26FC10000 PUSH1 0x10 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x148B JUMP JUMPDEST PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0x20 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x147B JUMP JUMPDEST PUSH1 0x40 SWAP4 POP PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0xA PUSH2 0x1460 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH2 0x15F6 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x1878 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD SWAP3 PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x20 DUP5 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP5 PUSH2 0x1811 JUMPI JUMPDEST POP SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP4 SWAP5 AND SWAP3 DUP4 SWAP2 AND SUB PUSH2 0x17E1 JUMPI POP POP JUMP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1870 JUMPI JUMPDEST DUP2 PUSH2 0x182A PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x186C JUMPI MLOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0xCE4 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x17B9 JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x181D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x597 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLVALUE SLOAD 0xA6 SWAP1 PUSH13 0xB2EEB5296FB3233ACB03B3A84C PUSH31 0xD2F7682966999087B3252DC05364736F6C634300081E003300000000000000 ","sourceMap":"998:10200:336:-:0;;;;;;;;;;;;;-1:-1:-1;;998:10200:336;;;;-1:-1:-1;;;;;998:10200:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;;;998:10200:336;;;2066:32:2;;998:10200:336;;2104:53:2;998:10200:336;;;;;;;;2066:32:2;998:10200:336;;;;;;;;;;2104:53:2;998:10200:336;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;;;-1:-1:-1;998:10200:336;;;;;-1:-1:-1;998:10200:336;;;;-1:-1:-1;;;;;998:10200:336;;;;;;:::o"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":4450,"id":null,"parameterSlots":0,"returnSlots":1},"abi_decode_bool_fromMemory":{"entryPoint":4910,"id":null,"parameterSlots":2,"returnSlots":1},"abi_decode_string_calldata":{"entryPoint":4864,"id":null,"parameterSlots":2,"returnSlots":2},"abi_encode_string":{"entryPoint":4797,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_string_calldata":{"entryPoint":4934,"id":null,"parameterSlots":3,"returnSlots":1},"array_allocation_size_string":{"entryPoint":6332,"id":null,"parameterSlots":1,"returnSlots":1},"copy_array_from_storage_to_memory_string":{"entryPoint":4568,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":4762,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":4485,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":4385,"id":null,"parameterSlots":2,"returnSlots":0},"fun_enforceIsTargetContractOwner":{"entryPoint":5978,"id":9096,"parameterSlots":2,"returnSlots":0},"fun_tokenMetadataURI":{"entryPoint":5054,"id":36459,"parameterSlots":2,"returnSlots":1},"mod_uint256":{"entryPoint":4997,"id":null,"parameterSlots":2,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"162":[{"length":32,"start":336},{"length":32,"start":2758}],"165":[{"length":32,"start":548},{"length":32,"start":2632},{"length":32,"start":3717}]},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b60003560e01c9081625e24de146110c5575080631fe543e314610dd157806328e82e431461098157806349855083146109105780634bf810d8146108ab5780636844d6fa146108465780636b0fce13146107e15780637c9bc10514610248578063981e4cc2146101d9578063e643792e14610174578063ee206f9d146101055763f724dad7146100a257600080fd5b346101005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576100fc6100e86100df611162565b602435906113be565b6040519182916020835260208301906112bd565b0390f35b600080fd5b346101005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff6101c0611162565b1660005260026020526020604060002054604051908152f35b346101005760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101005760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005761027f611162565b60243567ffffffffffffffff81116101005761029f903690600401611300565b909160443567ffffffffffffffff8111610100576102c1903690600401611300565b919060643591841561079d5783156107595782156107155773ffffffffffffffffffffffffffffffffffffffff906102f9338261175a565b169283600052600360205260ff6040600020541660038110156106e6576106b857836000526000602052604060002067ffffffffffffffff8611610597576103418154611185565b601f8111610670575b50856000601f82116001146105d1576000916105c6575b508660011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8860031b1c19161790555b83600052600160205260406000209567ffffffffffffffff8211610597576103bb8754611185565b601f811161054f575b50600096601f83116001146104875782916104639161047195947f1e2c5cd029119717a495b3bafc43690a7584a3f26d1253838c2aacfdebae1f439a60009161047c575b508460011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8660031b1c19161790555b866000526002602052856040600020556040519788978852608060208901526080880191611346565b918583036040870152611346565b9060608301520390a1005b90508501358b610408565b808852602088207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416895b8181106105375750918493917f1e2c5cd029119717a495b3bafc43690a7584a3f26d1253838c2aacfdebae1f439a610471979661046395106104ff575b5050600184811b01905561043a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88760031b161c19908701351690558a806104f0565b868b0135835560209a8b019a600190930192016104b3565b876000526020600020601f840160051c8101916020851061058d575b601f0160051c01905b81811061058157506103c4565b60008155600101610574565b909150819061056b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b905087013588610361565b828152602081209188907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016825b8b8282106106565750501061061e575b5050600186811b019055610393565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88960031b161c1990890135169055878061060f565b84013585556001909401936020938401938b9350016105ff565b816000526020600020601f880160051c810191602089106106ae575b601f0160051c01905b8181106106a2575061034a565b60008155600101610695565b909150819061068c565b837f66daadea0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f0f633658000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907fea1c6ea0000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff907f9e9de65d000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff61082d611162565b1660005260016020526100fc6100e860406000206111d8565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff610892611162565b1660005260006020526100fc6100e860406000206111d8565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff6108f7611162565b1660005260046020526020604060002054604051908152f35b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005773ffffffffffffffffffffffffffffffffffffffff61095c611162565b16600052600360205260ff6040600020541660405160038210156106e6576020918152f35b346101005760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576109b8611162565b60243563ffffffff8116809103610100576044359161ffff83168093036101005773ffffffffffffffffffffffffffffffffffffffff906109f9338261175a565b169182600052600260205260406000205415610da35782600052600360205260ff6040600020541660038110156106e657600214610d755773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690604051927f4306d354000000000000000000000000000000000000000000000000000000008452806004850152602084602481865afa938415610cef57600094610d41575b5073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604051947f23b872dd0000000000000000000000000000000000000000000000000000000086523360048701523060248701528060448701526020866064816000865af1938415610cef57610bab96602095610d26575b50604051938585015260408401526001606084015260608352610b61608084611121565b60006040518097819582947f4000aea000000000000000000000000000000000000000000000000000000000845289600485015260248401526060604484015260648301906112bd565b03925af1908115610cef57600492602092610cfb575b50604051928380927ffc2a88c30000000000000000000000000000000000000000000000000000000082525afa908115610cef57600091610c9a575b7f40cafdc32fe56fc488360b1b38d2c0ae3ac896e631536bb4bae762e342f0e7046040848480600052600560205282600020827fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790558160005260036020528260002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905582519182526020820152a1005b906020823d602011610ce7575b81610cb460209383611121565b81010312610ce45750517f40cafdc32fe56fc488360b1b38d2c0ae3ac896e631536bb4bae762e342f0e704610bfd565b80fd5b3d9150610ca7565b6040513d6000823e3d90fd5b610d1a90833d8511610d1f575b610d128183611121565b81019061132e565b610bc1565b503d610d08565b610d3c90863d8811610d1f57610d128183611121565b610b3d565b90936020823d602011610d6d575b81610d5c60209383611121565b81010312610ce45750519285610aae565b3d9150610d4f565b827fd2a6a91e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b827f7f78e4030000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346101005760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101005760043560243567ffffffffffffffff8111610100573660238201121561010057806004013567ffffffffffffffff8111610597578060051b9160405191610e4a6020850184611121565b825260208201602481948301019136831161010057602401905b8282106110b55750505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036110575782600052600560205273ffffffffffffffffffffffffffffffffffffffff604060002054169081156110295783600052600560205260406000207fffffffffffffffffffffffff0000000000000000000000000000000000000000815416905581600052600360205260ff6040600020541660038110156106e657600214610ffb575115610fcc577f4188cd09fa8447854490f2c7c4b3e63e3e8e55beb167c0bc1fd93e3fc30f49f892610f716060935183600052600260205260406000205490611385565b9082600052600460205281604060002055826000526003602052604060002060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905560405192835260208301526040820152a1005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b507fd2a6a91e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b837f597349fa0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6f6e6c792056524620563220777261707065722063616e2066756c66696c6c006044820152fd5b8135815260209182019101610e64565b346101005760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100576020906004356000526005825273ffffffffffffffffffffffffffffffffffffffff604060002054168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059757604052565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361010057565b90600182811c921680156111ce575b602083101461119f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611194565b90604051918260008254926111ec84611185565b808452936001811690811561125a5750600114611213575b5061121192500383611121565b565b90506000929192526020600020906000915b81831061123e5750509060206112119282010138611204565b6020919350806001915483858901015201910190918492611225565b602093506112119592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611204565b60005b8381106112ad5750506000910152565b818101518382015260200161129d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936112f98151809281875287808801910161129a565b0116010190565b9181601f840112156101005782359167ffffffffffffffff8311610100576020838186019501011161010057565b90816020910312610100575180151581036101005790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b811561138f570690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff169081600052600360205260ff6040600020541660038110156106e657600203611744578160005260046020526040600020548101809111611715576114289082600052600260205260406000205490611385565b90600052600160205260406000209080816000927a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110156116ea575b50806d04ee2d6d415b85acef8100000000600a9210156116cf575b662386f26fc100008110156116bb575b6305f5e1008110156116aa575b61271081101561169b575b606481101561168d575b1015611683575b6001820190600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60216115006114ea866118bc565b956114f86040519788611121565b8087526118bc565b957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020870197013688378501015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a8353048015611589577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a919261152f565b50506040519283916000918054906115a082611185565b916001811690811561163f57506001146115f9575b50506115c96115f69483925193849161129a565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611121565b90565b6000908152602081209593505b81811061162357506115f6945060206115c99185010192946115b5565b8554602082890181019190915260019096019587955001611606565b6115f6979550602092506115c99391507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016828701528015150285010192946115b5565b90600101906114b4565b6064600291049301926114ad565b612710600491049301926114a3565b6305f5e10060089104930192611498565b662386f26fc100006010910493019261148b565b6d04ee2d6d415b85acef81000000006020910493019261147b565b604093507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000090049050600a611460565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060005260006020526115f660406000206111d8565b919091803b156118785773ffffffffffffffffffffffffffffffffffffffff16604051927f8da5cb5b000000000000000000000000000000000000000000000000000000008452602084600481855afa938415610cef57600094611811575b509273ffffffffffffffffffffffffffffffffffffffff8093941692839116036117e1575050565b7f29b9b08b0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b6020813d602011611870575b8161182a60209383611121565b8101031261186c57519373ffffffffffffffffffffffffffffffffffffffff85168503610ce4575073ffffffffffffffffffffffffffffffffffffffff6117b9565b8480fd5b3d915061181d565b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b67ffffffffffffffff811161059757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea26469706673582212203454a6906cb2eeb5296fb3233acb03b3a84c7ed2f7682966999087b3252dc05364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH3 0x5E24DE EQ PUSH2 0x10C5 JUMPI POP DUP1 PUSH4 0x1FE543E3 EQ PUSH2 0xDD1 JUMPI DUP1 PUSH4 0x28E82E43 EQ PUSH2 0x981 JUMPI DUP1 PUSH4 0x49855083 EQ PUSH2 0x910 JUMPI DUP1 PUSH4 0x4BF810D8 EQ PUSH2 0x8AB JUMPI DUP1 PUSH4 0x6844D6FA EQ PUSH2 0x846 JUMPI DUP1 PUSH4 0x6B0FCE13 EQ PUSH2 0x7E1 JUMPI DUP1 PUSH4 0x7C9BC105 EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x981E4CC2 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0xE643792E EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0xEE206F9D EQ PUSH2 0x105 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0xA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0xFC PUSH2 0xE8 PUSH2 0xDF PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH2 0x13BE JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x12BD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1C0 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0x27F PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI PUSH2 0x29F SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1300 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x44 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI PUSH2 0x2C1 SWAP1 CALLDATASIZE SWAP1 PUSH1 0x4 ADD PUSH2 0x1300 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x64 CALLDATALOAD SWAP2 DUP5 ISZERO PUSH2 0x79D JUMPI DUP4 ISZERO PUSH2 0x759 JUMPI DUP3 ISZERO PUSH2 0x715 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x2F9 CALLER DUP3 PUSH2 0x175A JUMP JUMPDEST AND SWAP3 DUP4 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH2 0x6B8 JUMPI DUP4 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH8 0xFFFFFFFFFFFFFFFF DUP7 GT PUSH2 0x597 JUMPI PUSH2 0x341 DUP2 SLOAD PUSH2 0x1185 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x670 JUMPI JUMPDEST POP DUP6 PUSH1 0x0 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x5D1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x5C6 JUMPI JUMPDEST POP DUP7 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP4 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x597 JUMPI PUSH2 0x3BB DUP8 SLOAD PUSH2 0x1185 JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x54F JUMPI JUMPDEST POP PUSH1 0x0 SWAP7 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x487 JUMPI DUP3 SWAP2 PUSH2 0x463 SWAP2 PUSH2 0x471 SWAP6 SWAP5 PUSH32 0x1E2C5CD029119717A495B3BAFC43690A7584A3F26D1253838C2AACFDEBAE1F43 SWAP11 PUSH1 0x0 SWAP2 PUSH2 0x47C JUMPI JUMPDEST POP DUP5 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE DUP6 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP8 DUP9 MSTORE PUSH1 0x80 PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x80 DUP9 ADD SWAP2 PUSH2 0x1346 JUMP JUMPDEST SWAP2 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x1346 JUMP JUMPDEST SWAP1 PUSH1 0x60 DUP4 ADD MSTORE SUB SWAP1 LOG1 STOP JUMPDEST SWAP1 POP DUP6 ADD CALLDATALOAD DUP12 PUSH2 0x408 JUMP JUMPDEST DUP1 DUP9 MSTORE PUSH1 0x20 DUP9 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 AND DUP10 JUMPDEST DUP2 DUP2 LT PUSH2 0x537 JUMPI POP SWAP2 DUP5 SWAP4 SWAP2 PUSH32 0x1E2C5CD029119717A495B3BAFC43690A7584A3F26D1253838C2AACFDEBAE1F43 SWAP11 PUSH2 0x471 SWAP8 SWAP7 PUSH2 0x463 SWAP6 LT PUSH2 0x4FF JUMPI JUMPDEST POP POP PUSH1 0x1 DUP5 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x43A JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP8 PUSH1 0x3 SHL AND SHR NOT SWAP1 DUP8 ADD CALLDATALOAD AND SWAP1 SSTORE DUP11 DUP1 PUSH2 0x4F0 JUMP JUMPDEST DUP7 DUP12 ADD CALLDATALOAD DUP4 SSTORE PUSH1 0x20 SWAP11 DUP12 ADD SWAP11 PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 ADD PUSH2 0x4B3 JUMP JUMPDEST DUP8 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP6 LT PUSH2 0x58D JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x581 JUMPI POP PUSH2 0x3C4 JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x574 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x56B JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 POP DUP8 ADD CALLDATALOAD DUP9 PUSH2 0x361 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP2 DUP9 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 JUMPDEST DUP12 DUP3 DUP3 LT PUSH2 0x656 JUMPI POP POP LT PUSH2 0x61E JUMPI JUMPDEST POP POP PUSH1 0x1 DUP7 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x393 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP10 PUSH1 0x3 SHL AND SHR NOT SWAP1 DUP10 ADD CALLDATALOAD AND SWAP1 SSTORE DUP8 DUP1 PUSH2 0x60F JUMP JUMPDEST DUP5 ADD CALLDATALOAD DUP6 SSTORE PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 DUP12 SWAP4 POP ADD PUSH2 0x5FF JUMP JUMPDEST DUP2 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP9 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP10 LT PUSH2 0x6AE JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x6A2 JUMPI POP PUSH2 0x34A JUMP JUMPDEST PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x695 JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x68C JUMP JUMPDEST DUP4 PUSH32 0x66DAADEA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xF63365800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0xEA1C6EA000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x9E9DE65D00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x82D PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH2 0xFC PUSH2 0xE8 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x892 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH2 0xFC PUSH2 0xE8 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x8F7 PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x95C PUSH2 0x1162 JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x40 MLOAD PUSH1 0x3 DUP3 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x20 SWAP2 DUP2 MSTORE RETURN JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x60 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH2 0x9B8 PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x100 JUMPI PUSH1 0x44 CALLDATALOAD SWAP2 PUSH2 0xFFFF DUP4 AND DUP1 SWAP4 SUB PUSH2 0x100 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH2 0x9F9 CALLER DUP3 PUSH2 0x175A JUMP JUMPDEST AND SWAP2 DUP3 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD ISZERO PUSH2 0xDA3 JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 EQ PUSH2 0xD75 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH1 0x40 MLOAD SWAP3 PUSH32 0x4306D35400000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP1 PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x20 DUP5 PUSH1 0x24 DUP2 DUP7 GAS STATICCALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP5 PUSH2 0xD41 JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND PUSH1 0x40 MLOAD SWAP5 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP7 MSTORE CALLER PUSH1 0x4 DUP8 ADD MSTORE ADDRESS PUSH1 0x24 DUP8 ADD MSTORE DUP1 PUSH1 0x44 DUP8 ADD MSTORE PUSH1 0x20 DUP7 PUSH1 0x64 DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH2 0xBAB SWAP7 PUSH1 0x20 SWAP6 PUSH2 0xD26 JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP4 DUP6 DUP6 ADD MSTORE PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x1 PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x60 DUP4 MSTORE PUSH2 0xB61 PUSH1 0x80 DUP5 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 SWAP8 DUP2 SWAP6 DUP3 SWAP5 PUSH32 0x4000AEA000000000000000000000000000000000000000000000000000000000 DUP5 MSTORE DUP10 PUSH1 0x4 DUP6 ADD MSTORE PUSH1 0x24 DUP5 ADD MSTORE PUSH1 0x60 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x64 DUP4 ADD SWAP1 PUSH2 0x12BD JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP1 DUP2 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x4 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0xCFB JUMPI JUMPDEST POP PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0xFC2A88C300000000000000000000000000000000000000000000000000000000 DUP3 MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP2 PUSH2 0xC9A JUMPI JUMPDEST PUSH32 0x40CAFDC32FE56FC488360B1B38D2C0AE3AC896E631536BB4BAE762E342F0E704 PUSH1 0x40 DUP5 DUP5 DUP1 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 KECCAK256 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP3 SLOAD AND OR SWAP1 SSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE DUP3 PUSH1 0x0 KECCAK256 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE DUP3 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE LOG1 STOP JUMPDEST SWAP1 PUSH1 0x20 DUP3 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xCE7 JUMPI JUMPDEST DUP2 PUSH2 0xCB4 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCE4 JUMPI POP MLOAD PUSH32 0x40CAFDC32FE56FC488360B1B38D2C0AE3AC896E631536BB4BAE762E342F0E704 PUSH2 0xBFD JUMP JUMPDEST DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xCA7 JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xD1A SWAP1 DUP4 RETURNDATASIZE DUP6 GT PUSH2 0xD1F JUMPI JUMPDEST PUSH2 0xD12 DUP2 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x132E JUMP JUMPDEST PUSH2 0xBC1 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xD08 JUMP JUMPDEST PUSH2 0xD3C SWAP1 DUP7 RETURNDATASIZE DUP9 GT PUSH2 0xD1F JUMPI PUSH2 0xD12 DUP2 DUP4 PUSH2 0x1121 JUMP JUMPDEST PUSH2 0xB3D JUMP JUMPDEST SWAP1 SWAP4 PUSH1 0x20 DUP3 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0xD6D JUMPI JUMPDEST DUP2 PUSH2 0xD5C PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0xCE4 JUMPI POP MLOAD SWAP3 DUP6 PUSH2 0xAAE JUMP JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0xD4F JUMP JUMPDEST DUP3 PUSH32 0xD2A6A91E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH32 0x7F78E40300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x100 JUMPI CALLDATASIZE PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x100 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x597 JUMPI DUP1 PUSH1 0x5 SHL SWAP2 PUSH1 0x40 MLOAD SWAP2 PUSH2 0xE4A PUSH1 0x20 DUP6 ADD DUP5 PUSH2 0x1121 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP3 ADD PUSH1 0x24 DUP2 SWAP5 DUP4 ADD ADD SWAP2 CALLDATASIZE DUP4 GT PUSH2 0x100 JUMPI PUSH1 0x24 ADD SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x10B5 JUMPI POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND CALLER SUB PUSH2 0x1057 JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND SWAP1 DUP2 ISZERO PUSH2 0x1029 JUMPI DUP4 PUSH1 0x0 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 SLOAD AND SWAP1 SSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 EQ PUSH2 0xFFB JUMPI MLOAD ISZERO PUSH2 0xFCC JUMPI PUSH32 0x4188CD09FA8447854490F2C7C4B3E63E3E8E55BEB167C0BC1FD93E3FC30F49F8 SWAP3 PUSH2 0xF71 PUSH1 0x60 SWAP4 MLOAD DUP4 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1385 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE DUP2 PUSH1 0x40 PUSH1 0x0 KECCAK256 SSTORE DUP3 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 SLOAD AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE LOG1 STOP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xD2A6A91E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP4 PUSH32 0x597349FA00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x64 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6F6E6C792056524620563220777261707065722063616E2066756C66696C6C00 PUSH1 0x44 DUP3 ADD MSTORE REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE64 JUMP JUMPDEST CALLVALUE PUSH2 0x100 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x100 JUMPI PUSH1 0x20 SWAP1 PUSH1 0x4 CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x5 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND DUP2 MSTORE RETURN JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x597 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x100 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x11CE JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x119F JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x1194 JUMP JUMPDEST SWAP1 PUSH1 0x40 MLOAD SWAP2 DUP3 PUSH1 0x0 DUP3 SLOAD SWAP3 PUSH2 0x11EC DUP5 PUSH2 0x1185 JUMP JUMPDEST DUP1 DUP5 MSTORE SWAP4 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x125A JUMPI POP PUSH1 0x1 EQ PUSH2 0x1213 JUMPI JUMPDEST POP PUSH2 0x1211 SWAP3 POP SUB DUP4 PUSH2 0x1121 JUMP JUMPDEST JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SWAP3 SWAP2 SWAP3 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x0 SWAP2 JUMPDEST DUP2 DUP4 LT PUSH2 0x123E JUMPI POP POP SWAP1 PUSH1 0x20 PUSH2 0x1211 SWAP3 DUP3 ADD ADD CODESIZE PUSH2 0x1204 JUMP JUMPDEST PUSH1 0x20 SWAP2 SWAP4 POP DUP1 PUSH1 0x1 SWAP2 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP2 DUP5 SWAP3 PUSH2 0x1225 JUMP JUMPDEST PUSH1 0x20 SWAP4 POP PUSH2 0x1211 SWAP6 SWAP3 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP2 POP AND DUP3 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x5 SHL DUP3 ADD ADD CODESIZE PUSH2 0x1204 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x12AD JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x129D JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x20 SWAP4 PUSH2 0x12F9 DUP2 MLOAD DUP1 SWAP3 DUP2 DUP8 MSTORE DUP8 DUP1 DUP9 ADD SWAP2 ADD PUSH2 0x129A JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH1 0x1F DUP5 ADD SLT ISZERO PUSH2 0x100 JUMPI DUP3 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x100 JUMPI PUSH1 0x20 DUP4 DUP2 DUP7 ADD SWAP6 ADD ADD GT PUSH2 0x100 JUMPI JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x20 SWAP2 SUB SLT PUSH2 0x100 JUMPI MLOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x100 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP3 PUSH1 0x20 SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP4 DUP2 DUP7 MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP2 ISZERO PUSH2 0x138F JUMPI MOD SWAP1 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH1 0x0 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0xFF PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD AND PUSH1 0x3 DUP2 LT ISZERO PUSH2 0x6E6 JUMPI PUSH1 0x2 SUB PUSH2 0x1744 JUMPI DUP2 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 ADD DUP1 SWAP2 GT PUSH2 0x1715 JUMPI PUSH2 0x1428 SWAP1 DUP3 PUSH1 0x0 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 PUSH2 0x1385 JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP1 DUP2 PUSH1 0x0 SWAP3 PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 DUP2 LT ISZERO PUSH2 0x16EA JUMPI JUMPDEST POP DUP1 PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0xA SWAP3 LT ISZERO PUSH2 0x16CF JUMPI JUMPDEST PUSH7 0x2386F26FC10000 DUP2 LT ISZERO PUSH2 0x16BB JUMPI JUMPDEST PUSH4 0x5F5E100 DUP2 LT ISZERO PUSH2 0x16AA JUMPI JUMPDEST PUSH2 0x2710 DUP2 LT ISZERO PUSH2 0x169B JUMPI JUMPDEST PUSH1 0x64 DUP2 LT ISZERO PUSH2 0x168D JUMPI JUMPDEST LT ISZERO PUSH2 0x1683 JUMPI JUMPDEST PUSH1 0x1 DUP3 ADD SWAP1 PUSH1 0xA PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x21 PUSH2 0x1500 PUSH2 0x14EA DUP7 PUSH2 0x18BC JUMP JUMPDEST SWAP6 PUSH2 0x14F8 PUSH1 0x40 MLOAD SWAP8 DUP9 PUSH2 0x1121 JUMP JUMPDEST DUP1 DUP8 MSTORE PUSH2 0x18BC JUMP JUMPDEST SWAP6 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x20 DUP8 ADD SWAP8 ADD CALLDATASIZE DUP9 CALLDATACOPY DUP6 ADD ADD JUMPDEST ADD SWAP2 PUSH32 0x3031323334353637383961626364656600000000000000000000000000000000 DUP3 DUP3 MOD BYTE DUP4 MSTORE8 DIV DUP1 ISZERO PUSH2 0x1589 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SWAP2 SWAP3 PUSH2 0x152F JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x0 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x15A0 DUP3 PUSH2 0x1185 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x163F JUMPI POP PUSH1 0x1 EQ PUSH2 0x15F9 JUMPI JUMPDEST POP POP PUSH2 0x15C9 PUSH2 0x15F6 SWAP5 DUP4 SWAP3 MLOAD SWAP4 DUP5 SWAP2 PUSH2 0x129A JUMP JUMPDEST ADD SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x1121 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP6 SWAP4 POP JUMPDEST DUP2 DUP2 LT PUSH2 0x1623 JUMPI POP PUSH2 0x15F6 SWAP5 POP PUSH1 0x20 PUSH2 0x15C9 SWAP2 DUP6 ADD ADD SWAP3 SWAP5 PUSH2 0x15B5 JUMP JUMPDEST DUP6 SLOAD PUSH1 0x20 DUP3 DUP10 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 SWAP1 SWAP7 ADD SWAP6 DUP8 SWAP6 POP ADD PUSH2 0x1606 JUMP JUMPDEST PUSH2 0x15F6 SWAP8 SWAP6 POP PUSH1 0x20 SWAP3 POP PUSH2 0x15C9 SWAP4 SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP3 DUP8 ADD MSTORE DUP1 ISZERO ISZERO MUL DUP6 ADD ADD SWAP3 SWAP5 PUSH2 0x15B5 JUMP JUMPDEST SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x14B4 JUMP JUMPDEST PUSH1 0x64 PUSH1 0x2 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x14AD JUMP JUMPDEST PUSH2 0x2710 PUSH1 0x4 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x14A3 JUMP JUMPDEST PUSH4 0x5F5E100 PUSH1 0x8 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x1498 JUMP JUMPDEST PUSH7 0x2386F26FC10000 PUSH1 0x10 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x148B JUMP JUMPDEST PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0x20 SWAP2 DIV SWAP4 ADD SWAP3 PUSH2 0x147B JUMP JUMPDEST PUSH1 0x40 SWAP4 POP PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0xA PUSH2 0x1460 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH2 0x15F6 PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH2 0x11D8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 DUP1 EXTCODESIZE ISZERO PUSH2 0x1878 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD SWAP3 PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP5 MSTORE PUSH1 0x20 DUP5 PUSH1 0x4 DUP2 DUP6 GAS STATICCALL SWAP4 DUP5 ISZERO PUSH2 0xCEF JUMPI PUSH1 0x0 SWAP5 PUSH2 0x1811 JUMPI JUMPDEST POP SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 SWAP4 SWAP5 AND SWAP3 DUP4 SWAP2 AND SUB PUSH2 0x17E1 JUMPI POP POP JUMP JUMPDEST PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x1870 JUMPI JUMPDEST DUP2 PUSH2 0x182A PUSH1 0x20 SWAP4 DUP4 PUSH2 0x1121 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x186C JUMPI MLOAD SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP6 SUB PUSH2 0xCE4 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x17B9 JUMP JUMPDEST DUP5 DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x181D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x597 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLVALUE SLOAD 0xA6 SWAP1 PUSH13 0xB2EEB5296FB3233ACB03B3A84C PUSH31 0xD2F7682966999087B3252DC05364736F6C634300081E003300000000000000 ","sourceMap":"998:10200:336:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11009:4;998:10200;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1517:46;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;11175:14;998:10200;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;5837:36;;;5833:94;;5941:36;;5937:94;;6045:11;;6041:54;;998:10200;6148:10;;;;;:::i;:::-;998:10200;;;;;6173:12;998:10200;;;;;;;;6173:12;998:10200;;;;;6169:106;;998:10200;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6173:12;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;6475:73;998:10200;;;;;;;;;;;;;6173:12;998:10200;;;;;;;;;;;6425:11;998:10200;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;6475:73;;;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6475:73;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;6173:12;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6173:12;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;6169:106;6238:37;;998:10200;6238:37;998:10200;;;;6238:37;998:10200;;;;;;;;;;6041:54;998:10200;6065:30;;998:10200;6065:30;998:10200;;;;;6065:30;5937:94;998:10200;5986:45;;998:10200;5986:45;998:10200;;;;;5986:45;5833:94;998:10200;5882:45;;998:10200;5882:45;998:10200;;;;;5882:45;998:10200;;;;;;;;;;;;;;:::i;:::-;;;;1402:59;998:10200;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1602:52;998:10200;;;;;;;;;;1602:52;998:10200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8453:10;;;;;:::i;:::-;998:10200;;;;;8478:11;998:10200;;;;;;8478:31;8474:74;;998:10200;;;8562:12;998:10200;;;;;;;;8562:12;998:10200;;;;;8478:11;8562:52;8558:101;;998:10200;8692:14;998:10200;;;;8692:54;998:10200;8692:54;;;998:10200;8692:54;;998:10200;;8692:54;998:10200;8692:54;;;;;;;;;998:10200;8692:54;;;998:10200;8756:4;998:10200;8756:4;998:10200;;;8756:58;998:10200;8756:58;;8453:10;998:10200;8756:58;;998:10200;8794:4;998:10200;;;;;;;;;;8756:58;;;998:10200;8756:58;;;;;;;;998:10200;8756:58;998:10200;8756:58;;;998:10200;;;;8884:53;;;;998:10200;;;;;;;;;;;8884:53;;;;;;:::i;:::-;998:10200;;;8824:114;;;;;;998:10200;8824:114;;;998:10200;8824:114;;998:10200;;;;;;;;;;8756:58;998:10200;;;;:::i;:::-;8824:114;;;;;;;;;998:10200;8824:114;998:10200;8824:114;;;998:10200;;;;8968:30;;;;998:10200;8968:30;;;;;;;;;998:10200;8968:30;;;998:10200;9136:41;998:10200;;;;;;9008:24;998:10200;;;;;;;;;;;;;;;;8562:12;998:10200;;;;;;;;;;;;;;;;;;;;;;9136:41;998:10200;8968:30;;998:10200;8968:30;;998:10200;8968:30;;;;;;998:10200;8968:30;;;:::i;:::-;;;998:10200;;;;-1:-1:-1;998:10200:336;9136:41;8968:30;;998:10200;;;8968:30;;;-1:-1:-1;8968:30:336;;;998:10200;;;;;;;;;8824:114;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;8756:58;;;;;;;;;;;;;:::i;:::-;;;8692:54;;;998:10200;8692:54;;998:10200;8692:54;;;;;;998:10200;8692:54;;;:::i;:::-;;;998:10200;;;;;;8692:54;;;;;;;-1:-1:-1;8692:54:336;;8558:101;8623:36;;998:10200;8623:36;998:10200;;;;8623:36;8474:74;8518:30;;998:10200;8518:30;998:10200;;;;8518:30;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3905:14:2;;;998:10200:336;3905:14:2;998:10200:336;3883:10:2;:37;998:10200:336;;;;;;;;;;;;;;10383:27;;;10379:67;;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10543:21;10512:52;10508:101;;998:10200;;;;10803:48;998:10200;10636:43;998:10200;;;;;;10543:21;998:10200;;;;;;10636:43;;:::i;:::-;998:10200;;;;;;;;;;;;;;;;;;;;;10543:21;998:10200;;;;;;;;;;;;;;;;;;;;10803:48;998:10200;;;;;;;;;;;10508:101;10573:36;;998:10200;10573:36;998:10200;;;;10573:36;10379:67;10419:27;;998:10200;10419:27;998:10200;;;;10419:27;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1785:59;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;998:10200:336;;;;;-1:-1:-1;998:10200:336;;-1:-1:-1;998:10200:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;998:10200:336;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;9233:491;998:10200;;;;-1:-1:-1;998:10200:336;9360:12;998:10200;;;;-1:-1:-1;998:10200:336;;;9360:12;998:10200;;;;;9391:21;9360:52;9391:21;;998:10200;-1:-1:-1;998:10200:336;9460:14;998:10200;;;-1:-1:-1;998:10200:336;;;;;;;;;9449:70;998:10200;;-1:-1:-1;998:10200:336;9391:21;998:10200;;;-1:-1:-1;998:10200:336;;9449:70;;:::i;:::-;998:10200;-1:-1:-1;998:10200:336;;;;;-1:-1:-1;998:10200:336;9606:21;;1430:17:15;-1:-1:-1;29282:17:20;29291:8;29282:17;;;29278:103;;9356:362:336;29398:17:20;;29407:8;29978:7;29398:17;;;29394:103;;9356:362:336;29523:8:20;29514:17;;;29510:103;;9356:362:336;29639:7:20;29630:16;;;29626:100;;9356:362:336;29752:7:20;29743:16;;;29739:100;;9356:362:336;29865:7:20;29856:16;;;29852:100;;9356:362:336;29969:16:20;;29965:66;;9356:362:336;998:10200;;;;29978:7:20;998:10200:336;1545:94:15;998:10200:336;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;1545:94:15;;;1652:247;998:10200:336;1706:111:15;;;;;;;;998:10200:336;1867:10:15;;1863:21;;998:10200:336;29978:7:20;1652:247:15;;;;1863:21;1879:5;;998:10200:336;;;;;-1:-1:-1;998:10200:336;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9547:81;998:10200;;;;;;;;:::i;:::-;;9547:81;998:10200;9547:81;;;;;;:::i;:::-;9533:96;:::o;998:10200::-;-1:-1:-1;998:10200:336;;;;;;;;-1:-1:-1;998:10200:336;;;;;;;9547:81;998:10200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;998:10200:336;;;;9547:81;998:10200;;;;;;;;;;;;9547:81;;;998:10200;;;;;;;;;;;;29965:66:20;998:10200:336;;;29965:66:20;;;29852:100;29865:7;9391:21:336;998:10200;;;;29852:100:20;;;29739;29752:7;9460:14:336;998:10200;;;;29739:100:20;;;29626;29639:7;29710:1;998:10200:336;;;;29626:100:20;;;29510:103;29523:8;29596:2;998:10200:336;;;;29510:103:20;;;29394;29407:8;998:10200:336;;;;;29394:103:20;;;29278;998:10200:336;;-1:-1:-1;29291:8:20;998:10200:336;;;-1:-1:-1;29978:7:20;29278:103;;998:10200:336;;-1:-1:-1;998:10200:336;;9460:14;998:10200;;-1:-1:-1;998:10200:336;9356:362;998:10200;-1:-1:-1;998:10200:336;-1:-1:-1;998:10200:336;;;;-1:-1:-1;998:10200:336;;:::i;4837:217:42:-;;;;376:58:354;;450:9;4074:78:42;;998:10200:336;;;;4169:31:42;998:10200:336;4169:31:42;;;;;;;;;;;;;;-1:-1:-1;4169:31:42;;;4837:217;998:10200:336;;;;;;;;;;;4169:42:42;4940:107;;4837:217;;:::o;4940:107::-;5000:47;-1:-1:-1;5000:47:42;4169:31;998:10200:336;;;;-1:-1:-1;5000:47:42;4169:31;;;;;;;;;;;;;;;:::i;:::-;;;998:10200:336;;;;;;;;;;;;;4169:31:42;998:10200:336;4169:31:42;;998:10200:336;;;;4169:31:42;;;-1:-1:-1;4169:31:42;;4074:78;998:10200:336;4116:36:42;;-1:-1:-1;4116:36:42;998:10200:336;4116:36:42;998:10200:336;;-1:-1:-1;4116:36:42;998:10200:336;;;;;;;;;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"1288800","executionCost":"infinite","totalCost":"infinite"},"external":{"CHAINLINK_LINK_TOKEN()":"infinite","CHAINLINK_VRF_WRAPPER()":"infinite","metadataOffset(address)":"2470","postRevealBaseMetadataURI(address)":"infinite","preRevealTokenMetadataURI(address)":"infinite","rawFulfillRandomWords(uint256,uint256[])":"infinite","requestIdToTokenContract(uint256)":"2319","requestReveal(address,uint32,uint16)":"infinite","revealStatus(address)":"2486","setTokenData(address,string,string,uint256)":"infinite","tokenMetadataURI(address,uint256)":"infinite","tokenSupply(address)":"2580"},"internal":{"fulfillRandomWords(uint256,uint256[] memory)":"infinite"}},"methodIdentifiers":{"CHAINLINK_LINK_TOKEN()":"ee206f9d","CHAINLINK_VRF_WRAPPER()":"981e4cc2","metadataOffset(address)":"4bf810d8","postRevealBaseMetadataURI(address)":"6b0fce13","preRevealTokenMetadataURI(address)":"6844d6fa","rawFulfillRandomWords(uint256,uint256[])":"1fe543e3","requestIdToTokenContract(uint256)":"005e24de","requestReveal(address,uint32,uint16)":"28e82e43","revealStatus(address)":"49855083","setTokenData(address,string,string,uint256)":"7c9bc105","tokenMetadataURI(address,uint256)":"f724dad7","tokenSupply(address)":"e643792e"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vrfWrapper\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"EmptyPostRevealBaseMetadataURI\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"EmptyPreRevealTokenMetadataURI\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"RevealAlreadyRequested\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"TokenDataNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"TokensAlreadyRevealed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"UnknownRequestId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrongAddress\",\"type\":\"address\"}],\"name\":\"WrongLINKTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"}],\"name\":\"ZeroTokenSupply\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"RevealRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"preRevealTokenMetadataURI\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"postRevealBaseMetadataURI\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenSupply\",\"type\":\"uint256\"}],\"name\":\"TokenDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"metadataOffset\",\"type\":\"uint256\"}],\"name\":\"TokensRevealed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CHAINLINK_LINK_TOKEN\",\"outputs\":[{\"internalType\":\"contract LinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CHAINLINK_VRF_WRAPPER\",\"outputs\":[{\"internalType\":\"contract VRFV2WrapperInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"metadataOffset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"postRevealBaseMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"preRevealTokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_requestId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"_randomWords\",\"type\":\"uint256[]\"}],\"name\":\"rawFulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"requestIdToTokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"}],\"name\":\"requestReveal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"revealStatus\",\"outputs\":[{\"internalType\":\"enum TokenMetadataResolverRandomizedReveal.RevealStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"preRevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"postRevealBaseURI\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"}],\"name\":\"setTokenData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"EmptyPostRevealBaseMetadataURI(address)\":[{\"params\":{\"tokenContract\":\"The token contract which data is being set.\"}}],\"EmptyPreRevealTokenMetadataURI(address)\":[{\"params\":{\"tokenContract\":\"The token contract which data is being set.\"}}],\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"RevealAlreadyRequested(address)\":[{\"params\":{\"tokenContract\":\"The token contract which is already requested to reveal.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}],\"TokenDataNotSet(address)\":[{\"params\":{\"tokenContract\":\"The token contract on which is being requested to reveal.\"}}],\"TokensAlreadyRevealed(address)\":[{\"params\":{\"tokenContract\":\"The token contract which is already revealed.\"}}],\"UnknownRequestId(uint256)\":[{\"params\":{\"requestId\":\"The request ID.\"}}],\"ZeroTokenSupply(address)\":[{\"params\":{\"tokenContract\":\"The token contract which data is being set.\"}}]},\"events\":{\"RevealRequested(address,uint256)\":{\"params\":{\"requestId\":\"The ChainLink VRF request ID.\",\"tokenContract\":\"The token contract on which the tokens are requested to reveal.\"}},\"TokenDataSet(address,string,string,uint256)\":{\"params\":{\"postRevealBaseMetadataURI\":\"The post-reveal base metadata URI.\",\"preRevealTokenMetadataURI\":\"The pre-reveal token metadata URI.\",\"tokenContract\":\"The token contract on which the base metadata URI was set.\",\"tokenSupply\":\"The token supply.\"}},\"TokensRevealed(address,uint256,uint256)\":{\"params\":{\"metadataOffset\":\"The random metadata offset.\",\"requestId\":\"The ChainLink VRF request ID.\",\"tokenContract\":\"The token contract on which the tokens are revealed.\"}}},\"kind\":\"dev\",\"methods\":{\"requestReveal(address,uint32,uint16)\":{\"details\":\"Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Reverts with {TokenDataNotSet} if the token data has not been set yet.Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.Emits a {RevealRequested} event.Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from the sender to this contract.Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from this contract to the VRF Wrapper.\",\"params\":{\"callbackGasLimit\":\"The gas limit to set for the VRF V2 wrapper callback.\",\"requestConfirmations\":\"The number of confirmations to wait before fulfilling the request.\",\"tokenContract\":\"The token contract for which to reveal the tokens.\"}},\"setTokenData(address,string,string,uint256)\":{\"details\":\"Reverts with {EmptyPreRevealTokenMetadataURI} if the pre-reveal token metadata URI is empty.Reverts with {EmptyPostRevealBaseMetadataURIs} if the post-reveal base metadata URI is empty.Reverts with {ZeroTokenSupply} if the token supply is 0.Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Reverts with {RevealAlreadyRequested} if reveal has already been requested.Emits a {TokenDataSet} event.\",\"params\":{\"postRevealBaseURI\":\"The post-reveal base metadata URI.\",\"preRevealTokenURI\":\"The pre-reveal token metadata URI.\",\"supply\":\"The token supply.\",\"tokenContract\":\"The token contract on which to set the base metadata URI.\"}},\"tokenMetadataURI(address,uint256)\":{\"params\":{\"tokenContract\":\"The token contract for which to retrieve the token URI.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenURI\":\"The token metadata URI.\"}}},\"title\":\"TokenMetadataResolverRandomizedReveal.\",\"version\":1},\"userdoc\":{\"errors\":{\"EmptyPostRevealBaseMetadataURI(address)\":[{\"notice\":\"Thrown when trying to set an empty post-reveal base metadata URI.\"}],\"EmptyPreRevealTokenMetadataURI(address)\":[{\"notice\":\"Thrown when trying to set an empty pre-reveal token metadata URI.\"}],\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"RevealAlreadyRequested(address)\":[{\"notice\":\"Thrown when trying to set the metadata for a token which has already been requested to reveal.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}],\"TokenDataNotSet(address)\":[{\"notice\":\"Thrown when requesting to reveal tokens but the token data is not set.\"}],\"TokensAlreadyRevealed(address)\":[{\"notice\":\"Emitted when trying to reveal a token which is already revealed.\"}],\"UnknownRequestId(uint256)\":[{\"notice\":\"Thrown when trying to fulfill a randomness request with a wrong request ID (ie. not associated to a token contract).\"}],\"WrongLINKTokenAddress(address)\":[{\"notice\":\"Thrown when trying to call the `onTokenTransfer` function but the sender is not the LINK token contract.\"}],\"ZeroTokenSupply(address)\":[{\"notice\":\"Thrown when setting token data with a zero token supply.\"}]},\"events\":{\"RevealRequested(address,uint256)\":{\"notice\":\"Emitted when a request to reveal tokens is made.\"},\"TokenDataSet(address,string,string,uint256)\":{\"notice\":\"Emitted when the token data is set.\"},\"TokensRevealed(address,uint256,uint256)\":{\"notice\":\"Emitted when the tokens are revealed.\"}},\"kind\":\"user\",\"methods\":{\"requestReveal(address,uint32,uint16)\":{\"notice\":\"Requests to switch the base metadata URI to the post-reveal URI while applying a fixed random offset to the metadata token id.The random offset is requested via Chainlink VRF direct funding method:- payment of LINK token  will be made, and pre-approval of LINK to this contract is required(the amount to be approved cannot reliably be known in advance, but can be estimated with `VRF_V2_WRAPPER.estimateRequestPrice`),- the randomness request will be fulfilled later by a call to the `rawFulfillRandomWords` callback.This function can be called multiple times as long as the tokens have not been effectively revealed yet, so that any failure toexecute the fulfill callback (such as because of insufficient gas) does not prevent from retrying.\"},\"setTokenData(address,string,string,uint256)\":{\"notice\":\"Sets the metadata URIs and the token supply for a token contract.\"},\"tokenMetadataURI(address,uint256)\":{\"notice\":\"Gets the token metadata URI for a token.\"}},\"notice\":\"Token Metadata Resolver with a reveal mechanism.Before reveal, all the tokens have the same metadata URI. After reveal tokens have individual metadata URIs based on a random offset.This resolver is designed to work with incremental token IDs NFTs starting at 0 and a fixed token supply.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol\":\"TokenMetadataResolverRandomizedReveal\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface LinkTokenInterface {\\n  function allowance(address owner, address spender) external view returns (uint256 remaining);\\n\\n  function approve(address spender, uint256 value) external returns (bool success);\\n\\n  function balanceOf(\\n    address owner\\n  ) external view returns (uint256 balance);\\n\\n  function decimals() external view returns (uint8 decimalPlaces);\\n\\n  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\\n\\n  function increaseApproval(address spender, uint256 subtractedValue) external;\\n\\n  function name() external view returns (string memory tokenName);\\n\\n  function symbol() external view returns (string memory tokenSymbol);\\n\\n  function totalSupply() external view returns (uint256 totalTokensIssued);\\n\\n  function transfer(address to, uint256 value) external returns (bool success);\\n\\n  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\\n\\n  function transferFrom(address from, address to, uint256 value) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xcee9303d524c29fefc346775ec0be31d134a5f14c990fe04961a9f516eb23ad5\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {LinkTokenInterface} from \\\"../shared/interfaces/LinkTokenInterface.sol\\\";\\nimport {VRFV2WrapperInterface} from \\\"./interfaces/VRFV2WrapperInterface.sol\\\";\\n\\n/**\\n *\\n * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper\\n * ********************************************************************************\\n * @dev PURPOSE\\n *\\n * @dev Create VRF V2 requests without the need for subscription management. Rather than creating\\n * @dev and funding a VRF V2 subscription, a user can use this wrapper to create one off requests,\\n * @dev paying up front rather than at fulfillment.\\n *\\n * @dev Since the price is determined using the gas price of the request transaction rather than\\n * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas\\n * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.\\n * *****************************************************************************\\n * @dev USAGE\\n *\\n * @dev Calling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be funded\\n * @dev with enough LINK to make the request, otherwise requests will revert. To request randomness,\\n * @dev call the 'requestRandomness' function with the desired VRF parameters. This function handles\\n * @dev paying for the request based on the current pricing.\\n *\\n * @dev Consumers must implement the fullfillRandomWords function, which will be called during\\n * @dev fulfillment with the randomness result.\\n */\\nabstract contract VRFV2WrapperConsumerBase {\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  LinkTokenInterface internal immutable LINK;\\n  // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i\\n  VRFV2WrapperInterface internal immutable VRF_V2_WRAPPER;\\n\\n  /**\\n   * @param _link is the address of LinkToken\\n   * @param _vrfV2Wrapper is the address of the VRFV2Wrapper contract\\n   */\\n  constructor(address _link, address _vrfV2Wrapper) {\\n    LINK = LinkTokenInterface(_link);\\n    VRF_V2_WRAPPER = VRFV2WrapperInterface(_vrfV2Wrapper);\\n  }\\n\\n  /**\\n   * @dev Requests randomness from the VRF V2 wrapper.\\n   *\\n   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's\\n   *        fulfillRandomWords function.\\n   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the\\n   *        request. A higher number of confirmations increases security by reducing the likelihood\\n   *        that a chain re-org changes a published randomness outcome.\\n   * @param _numWords is the number of random words to request.\\n   *\\n   * @return requestId is the VRF V2 request ID of the newly created randomness request.\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function requestRandomness(\\n    uint32 _callbackGasLimit,\\n    uint16 _requestConfirmations,\\n    uint32 _numWords\\n  ) internal returns (uint256 requestId) {\\n    LINK.transferAndCall(\\n      address(VRF_V2_WRAPPER),\\n      VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit),\\n      abi.encode(_callbackGasLimit, _requestConfirmations, _numWords)\\n    );\\n    return VRF_V2_WRAPPER.lastRequestId();\\n  }\\n\\n  /**\\n   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must\\n   * @notice implement it.\\n   *\\n   * @param _requestId is the VRF V2 request ID.\\n   * @param _randomWords is the randomness result.\\n   */\\n  // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore\\n  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;\\n\\n  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {\\n    // solhint-disable-next-line gas-custom-errors\\n    require(msg.sender == address(VRF_V2_WRAPPER), \\\"only VRF V2 wrapper can fulfill\\\");\\n    fulfillRandomWords(_requestId, _randomWords);\\n  }\\n}\\n\",\"keccak256\":\"0x05d5043384cff455fbc91265acfb11a9b6c64c27ab9648944bce1df25a98d10c\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// solhint-disable-next-line interface-starts-with-i\\ninterface VRFV2WrapperInterface {\\n  /**\\n   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only\\n   * be relied option within the same transaction that the request was made.\\n   */\\n  function lastRequestId() external view returns (uint256);\\n\\n  /**\\n   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current\\n   * @notice block.\\n   *\\n   * @dev This function relies on the transaction gas price which is not automatically set during\\n   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   */\\n  function calculateRequestPrice(\\n    uint32 _callbackGasLimit\\n  ) external view returns (uint256);\\n\\n  /**\\n   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.\\n   *\\n   * @dev This is a convenience function that can be called in simulation to better understand\\n   * @dev pricing.\\n   *\\n   * @param _callbackGasLimit is the gas limit used to estimate the price.\\n   * @param _requestGasPriceWei is the gas price in wei used for the estimation.\\n   */\\n  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x64e35b94edb2bf70b2fd64d5c571394b44e3c66f707ece3555fe81e847f2517a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SafeCast} from \\\"./math/SafeCast.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    using SafeCast for *;\\n\\n    bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n    uint8 private constant ADDRESS_LENGTH = 20;\\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\\n        (1 << 0x08) | // backspace\\n            (1 << 0x09) | // tab\\n            (1 << 0x0a) | // newline\\n            (1 << 0x0c) | // form feed\\n            (1 << 0x0d) | // carriage return\\n            (1 << 0x22) | // double quote\\n            (1 << 0x5c); // backslash\\n\\n    /**\\n     * @dev The `value` string doesn't fit in the specified `length`.\\n     */\\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n    /**\\n     * @dev The string being parsed contains characters that are not in scope of the given base.\\n     */\\n    error StringsInvalidChar();\\n\\n    /**\\n     * @dev The string being parsed is not a properly formatted address.\\n     */\\n    error StringsInvalidAddressFormat();\\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            assembly (\\\"memory-safe\\\") {\\n                ptr := add(add(buffer, 0x20), length)\\n            }\\n            while (true) {\\n                ptr--;\\n                assembly (\\\"memory-safe\\\") {\\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\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 toStringSigned(int256 value) internal pure returns (string memory) {\\n        return string.concat(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        uint256 localValue = value;\\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] = HEX_DIGITS[localValue & 0xf];\\n            localValue >>= 4;\\n        }\\n        if (localValue != 0) {\\n            revert StringsInsufficientHexLength(value, length);\\n        }\\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\\n     * 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 Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\\n     * representation, according to EIP-55.\\n     */\\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(toHexString(addr));\\n\\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\\n        uint256 hashValue;\\n        assembly (\\\"memory-safe\\\") {\\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\\n        }\\n\\n        for (uint256 i = 41; i > 1; --i) {\\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\\n                // case shift by xoring with 0x20\\n                buffer[i] ^= 0x20;\\n            }\\n            hashValue >>= 4;\\n        }\\n        return string(buffer);\\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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input) internal pure returns (uint256) {\\n        return parseUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 9) return (false, 0);\\n            result *= 10;\\n            result += chr;\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `int256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input) internal pure returns (int256) {\\n        return parseInt(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\\n        (bool success, int256 value) = tryParseInt(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\\n     * the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\\n\\n    /**\\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character or if the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, int256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseIntUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseIntUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, int256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // Check presence of a negative sign.\\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        bool positiveSign = sign == bytes1(\\\"+\\\");\\n        bool negativeSign = sign == bytes1(\\\"-\\\");\\n        uint256 offset = (positiveSign || negativeSign).toUint();\\n\\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\\n\\n        if (absSuccess && absValue < ABS_MIN_INT256) {\\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\\n            return (true, type(int256).min);\\n        } else return (false, 0);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input) internal pure returns (uint256) {\\n        return parseHexUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\\n     * invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseHexUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // skip 0x prefix if present\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 offset = hasPrefix.toUint() * 2;\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin + offset; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 15) return (false, 0);\\n            result *= 16;\\n            unchecked {\\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\\n                result += chr;\\n            }\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as an `address`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input) internal pure returns (address) {\\n        return parseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\\n        (bool success, address value) = tryParseAddress(input, begin, end);\\n        if (!success) revert StringsInvalidAddressFormat();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\\n     * formatted address. See {parseAddress-string} requirements.\\n     */\\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\\n        return tryParseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\\n     */\\n    function tryParseAddress(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, address value) {\\n        if (end > bytes(input).length || begin > end) return (false, address(0));\\n\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\\n\\n        // check that input is the correct length\\n        if (end - begin == expectedLength) {\\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\\n            return (s, address(uint160(v)));\\n        } else {\\n            return (false, address(0));\\n        }\\n    }\\n\\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\\n        uint8 value = uint8(chr);\\n\\n        // Try to parse `chr`:\\n        // - Case 1: [0-9]\\n        // - Case 2: [a-f]\\n        // - Case 3: [A-F]\\n        // - otherwise not supported\\n        unchecked {\\n            if (value > 47 && value < 58) value -= 48;\\n            else if (value > 96 && value < 103) value -= 87;\\n            else if (value > 64 && value < 71) value -= 55;\\n            else return type(uint8).max;\\n        }\\n\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\\n     *\\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\\n     *\\n     * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\\n     * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\\n     * characters that are not in this range, but other tooling may provide different results.\\n     */\\n    function escapeJSON(string memory input) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(input);\\n        bytes memory output = new bytes(2 * buffer.length); // worst case scenario\\n        uint256 outputLength = 0;\\n\\n        for (uint256 i; i < buffer.length; ++i) {\\n            bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\\n            if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\\n                output[outputLength++] = \\\"\\\\\\\\\\\";\\n                if (char == 0x08) output[outputLength++] = \\\"b\\\";\\n                else if (char == 0x09) output[outputLength++] = \\\"t\\\";\\n                else if (char == 0x0a) output[outputLength++] = \\\"n\\\";\\n                else if (char == 0x0c) output[outputLength++] = \\\"f\\\";\\n                else if (char == 0x0d) output[outputLength++] = \\\"r\\\";\\n                else if (char == 0x5c) output[outputLength++] = \\\"\\\\\\\\\\\";\\n                else if (char == 0x22) {\\n                    // solhint-disable-next-line quotes\\n                    output[outputLength++] = '\\\"';\\n                }\\n            } else {\\n                output[outputLength++] = char;\\n            }\\n        }\\n        // write the actual length and deallocate unused memory\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(output, outputLength)\\n            mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\\n        }\\n\\n        return string(output);\\n    }\\n\\n    /**\\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\\n     *\\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\\n     * assembly block as such would prevent some optimizations.\\n     */\\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\\n        assembly (\\\"memory-safe\\\") {\\n            value := mload(add(add(buffer, 0x20), offset))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two signed numbers.\\n     */\\n    function max(int256 a, int256 b) internal pure returns (int256) {\\n        return ternary(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 ternary(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            // Formula from the \\\"Bit Twiddling Hacks\\\" by Sean Eron Anderson.\\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\\n            // taking advantage of the most significant (or \\\"sign\\\" bit) in two's complement representation.\\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\\n            int256 mask = n >> 255;\\n\\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\\n            return uint256((n + mask) ^ mask);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./interfaces/ITokenMetadataResolver.sol\\\";\\nimport {LinkTokenInterface} from \\\"@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol\\\";\\nimport {VRFV2WrapperInterface} from \\\"@chainlink/contracts/src/v0.8/vrf/interfaces/VRFV2WrapperInterface.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Strings} from \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\nimport {VRFV2WrapperConsumerBase} from \\\"@chainlink/contracts/src/v0.8/vrf/VRFV2WrapperConsumerBase.sol\\\";\\n\\n/// @title TokenMetadataResolverRandomizedReveal.\\n/// @notice Token Metadata Resolver with a reveal mechanism.\\n/// @notice Before reveal, all the tokens have the same metadata URI. After reveal tokens have individual metadata URIs based on a random offset.\\n/// @notice This resolver is designed to work with incremental token IDs NFTs starting at 0 and a fixed token supply.\\ncontract TokenMetadataResolverRandomizedReveal is ITokenMetadataResolver, VRFV2WrapperConsumerBase {\\n    using ContractOwnershipStorage for address;\\n    using Strings for uint256;\\n\\n    enum RevealStatus {\\n        NotRequested, // 0\\n        Requested, // 1\\n        Revealed // 2\\n    }\\n\\n    mapping(address => string) public preRevealTokenMetadataURI; // tokenContract => pre-reveal token metadata URI\\n    mapping(address => string) public postRevealBaseMetadataURI; // tokenContract => post-reveal base metadata URI\\n    mapping(address => uint256) public tokenSupply; // tokenContract => token supply\\n    mapping(address => RevealStatus) public revealStatus; // tokenContract => reveal status\\n    mapping(address => uint256) public metadataOffset; // tokenContract => metadata offset\\n    mapping(uint256 => address) public requestIdToTokenContract; // requestId => tokenContract\\n\\n    /// @notice Emitted when the token data is set.\\n    /// @param tokenContract The token contract on which the base metadata URI was set.\\n    /// @param preRevealTokenMetadataURI The pre-reveal token metadata URI.\\n    /// @param postRevealBaseMetadataURI The post-reveal base metadata URI.\\n    /// @param tokenSupply The token supply.\\n    event TokenDataSet(address tokenContract, string preRevealTokenMetadataURI, string postRevealBaseMetadataURI, uint256 tokenSupply);\\n\\n    /// @notice Emitted when a request to reveal tokens is made.\\n    /// @param tokenContract The token contract on which the tokens are requested to reveal.\\n    /// @param requestId The ChainLink VRF request ID.\\n    event RevealRequested(address tokenContract, uint256 requestId);\\n\\n    /// @notice Emitted when the tokens are revealed.\\n    /// @param tokenContract The token contract on which the tokens are revealed.\\n    /// @param requestId The ChainLink VRF request ID.\\n    /// @param metadataOffset The random metadata offset.\\n    event TokensRevealed(address tokenContract, uint256 requestId, uint256 metadataOffset);\\n\\n    /// @notice Thrown when trying to set an empty pre-reveal token metadata URI.\\n    /// @param tokenContract The token contract which data is being set.\\n    error EmptyPreRevealTokenMetadataURI(address tokenContract);\\n\\n    /// @notice Thrown when trying to set an empty post-reveal base metadata URI.\\n    /// @param tokenContract The token contract which data is being set.\\n    error EmptyPostRevealBaseMetadataURI(address tokenContract);\\n\\n    /// @notice Thrown when setting token data with a zero token supply.\\n    /// @param tokenContract The token contract which data is being set.\\n    error ZeroTokenSupply(address tokenContract);\\n\\n    /// @notice Thrown when requesting to reveal tokens but the token data is not set.\\n    /// @param tokenContract The token contract on which is being requested to reveal.\\n    error TokenDataNotSet(address tokenContract);\\n\\n    /// @notice Thrown when trying to set the metadata for a token which has already been requested to reveal.\\n    /// @param tokenContract The token contract which is already requested to reveal.\\n    error RevealAlreadyRequested(address tokenContract);\\n\\n    /// @notice Emitted when trying to reveal a token which is already revealed.\\n    /// @param tokenContract The token contract which is already revealed.\\n    error TokensAlreadyRevealed(address tokenContract);\\n\\n    /// @notice Thrown when trying to call the `onTokenTransfer` function but the sender is not the LINK token contract.\\n    error WrongLINKTokenAddress(address wrongAddress);\\n\\n    /// @notice Thrown when trying to fulfill a randomness request with a wrong request ID (ie. not associated to a token contract).\\n    /// @param requestId The request ID.\\n    error UnknownRequestId(uint256 requestId);\\n\\n    constructor(address linkToken, address vrfWrapper) VRFV2WrapperConsumerBase(linkToken, vrfWrapper) {}\\n\\n    /// @notice Sets the metadata URIs and the token supply for a token contract.\\n    /// @dev Reverts with {EmptyPreRevealTokenMetadataURI} if the pre-reveal token metadata URI is empty.\\n    /// @dev Reverts with {EmptyPostRevealBaseMetadataURIs} if the post-reveal base metadata URI is empty.\\n    /// @dev Reverts with {ZeroTokenSupply} if the token supply is 0.\\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\\n    /// @dev Reverts with {RevealAlreadyRequested} if reveal has already been requested.\\n    /// @dev Emits a {TokenDataSet} event.\\n    /// @param tokenContract The token contract on which to set the base metadata URI.\\n    /// @param preRevealTokenURI The pre-reveal token metadata URI.\\n    /// @param postRevealBaseURI The post-reveal base metadata URI.\\n    /// @param supply The token supply.\\n    function setTokenData(address tokenContract, string calldata preRevealTokenURI, string calldata postRevealBaseURI, uint256 supply) external {\\n        if (bytes(preRevealTokenURI).length == 0) revert EmptyPreRevealTokenMetadataURI(tokenContract);\\n        if (bytes(postRevealBaseURI).length == 0) revert EmptyPostRevealBaseMetadataURI(tokenContract);\\n        if (supply == 0) revert ZeroTokenSupply(tokenContract);\\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\\n        if (revealStatus[tokenContract] != RevealStatus.NotRequested) revert RevealAlreadyRequested(tokenContract);\\n        preRevealTokenMetadataURI[tokenContract] = preRevealTokenURI;\\n        postRevealBaseMetadataURI[tokenContract] = postRevealBaseURI;\\n        tokenSupply[tokenContract] = supply;\\n        emit TokenDataSet(tokenContract, preRevealTokenURI, postRevealBaseURI, supply);\\n    }\\n\\n    /// @notice Requests to switch the base metadata URI to the post-reveal URI while applying a fixed random offset to the metadata token id.\\n    /// @notice The random offset is requested via Chainlink VRF direct funding method:\\n    /// @notice  - payment of LINK token  will be made, and pre-approval of LINK to this contract is required\\n    /// @notice    (the amount to be approved cannot reliably be known in advance, but can be estimated with `VRF_V2_WRAPPER.estimateRequestPrice`),\\n    /// @notice  - the randomness request will be fulfilled later by a call to the `rawFulfillRandomWords` callback.\\n    /// @notice This function can be called multiple times as long as the tokens have not been effectively revealed yet, so that any failure to\\n    /// @notice  execute the fulfill callback (such as because of insufficient gas) does not prevent from retrying.\\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\\n    /// @dev Reverts with {TokenDataNotSet} if the token data has not been set yet.\\n    /// @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\\n    /// @dev Emits a {RevealRequested} event.\\n    /// @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from the sender to this contract.\\n    /// @dev Emits an ERC20 {Transfer} event for the VRF request price in LINK token transferred from this contract to the VRF Wrapper.\\n    /// @param tokenContract The token contract for which to reveal the tokens.\\n    /// @param callbackGasLimit The gas limit to set for the VRF V2 wrapper callback.\\n    /// @param requestConfirmations The number of confirmations to wait before fulfilling the request.\\n    function requestReveal(address tokenContract, uint32 callbackGasLimit, uint16 requestConfirmations) external {\\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\\n        if (tokenSupply[tokenContract] == 0) revert TokenDataNotSet(tokenContract);\\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) revert TokensAlreadyRevealed(tokenContract);\\n        uint256 requestPrice = VRF_V2_WRAPPER.calculateRequestPrice(callbackGasLimit);\\n        LINK.transferFrom(msg.sender, address(this), requestPrice);\\n        LINK.transferAndCall(address(VRF_V2_WRAPPER), requestPrice, abi.encode(callbackGasLimit, requestConfirmations, 1));\\n        uint256 requestId = VRF_V2_WRAPPER.lastRequestId();\\n        requestIdToTokenContract[requestId] = tokenContract;\\n        revealStatus[tokenContract] = RevealStatus.Requested;\\n        emit RevealRequested(tokenContract, requestId);\\n    }\\n\\n    /// @inheritdoc ITokenMetadataResolver\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI) {\\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) {\\n            uint256 metadataId = (tokenId + metadataOffset[tokenContract]) % tokenSupply[tokenContract];\\n            return string(abi.encodePacked(postRevealBaseMetadataURI[tokenContract], metadataId.toString()));\\n        } else {\\n            return preRevealTokenMetadataURI[tokenContract];\\n        }\\n    }\\n\\n    /// @notice Callback function called by the VRF V2 wrapper when the randomness is received. Applies the random offset.\\n    /// @dev Reverts with {UnknownRequestId} if the request ID is not associated to a token contract.\\n    /// @dev Reverts with {TokensAlreadyRevealed} if the tokens have already been revealed.\\n    /// @dev Emits a {TokensRevealed} event.\\n    /// @param requestId The ChainLink VRF request ID.\\n    /// @param randomWords The randomness result.\\n    function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual override {\\n        address tokenContract = requestIdToTokenContract[requestId];\\n        if (tokenContract == address(0)) revert UnknownRequestId(requestId);\\n        delete requestIdToTokenContract[requestId];\\n        if (revealStatus[tokenContract] == RevealStatus.Revealed) revert TokensAlreadyRevealed(tokenContract);\\n        uint256 offset = randomWords[0] % tokenSupply[tokenContract];\\n        metadataOffset[tokenContract] = offset;\\n        revealStatus[tokenContract] = RevealStatus.Revealed;\\n        emit TokensRevealed(tokenContract, requestId, offset);\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function CHAINLINK_LINK_TOKEN() external view returns (LinkTokenInterface) {\\n        return LINK;\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function CHAINLINK_VRF_WRAPPER() external view returns (VRFV2WrapperInterface) {\\n        return VRF_V2_WRAPPER;\\n    }\\n}\\n\",\"keccak256\":\"0x55466074a546f4db06647d44b5f07f60c42ef95771a377a87ee95318270ee768\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":36123,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"preRevealTokenMetadataURI","offset":0,"slot":"0","type":"t_mapping(t_address,t_string_storage)"},{"astId":36127,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"postRevealBaseMetadataURI","offset":0,"slot":"1","type":"t_mapping(t_address,t_string_storage)"},{"astId":36131,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"tokenSupply","offset":0,"slot":"2","type":"t_mapping(t_address,t_uint256)"},{"astId":36136,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"revealStatus","offset":0,"slot":"3","type":"t_mapping(t_address,t_enum(RevealStatus)36119)"},{"astId":36140,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"metadataOffset","offset":0,"slot":"4","type":"t_mapping(t_address,t_uint256)"},{"astId":36144,"contract":"contracts/token/metadata/TokenMetadataResolverRandomizedReveal.sol:TokenMetadataResolverRandomizedReveal","label":"requestIdToTokenContract","offset":0,"slot":"5","type":"t_mapping(t_uint256,t_address)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_enum(RevealStatus)36119":{"encoding":"inplace","label":"enum TokenMetadataResolverRandomizedReveal.RevealStatus","numberOfBytes":"1"},"t_mapping(t_address,t_enum(RevealStatus)36119)":{"encoding":"mapping","key":"t_address","label":"mapping(address => enum TokenMetadataResolverRandomizedReveal.RevealStatus)","numberOfBytes":"32","value":"t_enum(RevealStatus)36119"},"t_mapping(t_address,t_string_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => string)","numberOfBytes":"32","value":"t_string_storage"},"t_mapping(t_address,t_uint256)":{"encoding":"mapping","key":"t_address","label":"mapping(address => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_mapping(t_uint256,t_address)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => address)","numberOfBytes":"32","value":"t_address"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"errors":{"EmptyPostRevealBaseMetadataURI(address)":[{"notice":"Thrown when trying to set an empty post-reveal base metadata URI."}],"EmptyPreRevealTokenMetadataURI(address)":[{"notice":"Thrown when trying to set an empty pre-reveal token metadata URI."}],"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"RevealAlreadyRequested(address)":[{"notice":"Thrown when trying to set the metadata for a token which has already been requested to reveal."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}],"TokenDataNotSet(address)":[{"notice":"Thrown when requesting to reveal tokens but the token data is not set."}],"TokensAlreadyRevealed(address)":[{"notice":"Emitted when trying to reveal a token which is already revealed."}],"UnknownRequestId(uint256)":[{"notice":"Thrown when trying to fulfill a randomness request with a wrong request ID (ie. not associated to a token contract)."}],"WrongLINKTokenAddress(address)":[{"notice":"Thrown when trying to call the `onTokenTransfer` function but the sender is not the LINK token contract."}],"ZeroTokenSupply(address)":[{"notice":"Thrown when setting token data with a zero token supply."}]},"events":{"RevealRequested(address,uint256)":{"notice":"Emitted when a request to reveal tokens is made."},"TokenDataSet(address,string,string,uint256)":{"notice":"Emitted when the token data is set."},"TokensRevealed(address,uint256,uint256)":{"notice":"Emitted when the tokens are revealed."}},"kind":"user","methods":{"requestReveal(address,uint32,uint16)":{"notice":"Requests to switch the base metadata URI to the post-reveal URI while applying a fixed random offset to the metadata token id.The random offset is requested via Chainlink VRF direct funding method:- payment of LINK token  will be made, and pre-approval of LINK to this contract is required(the amount to be approved cannot reliably be known in advance, but can be estimated with `VRF_V2_WRAPPER.estimateRequestPrice`),- the randomness request will be fulfilled later by a call to the `rawFulfillRandomWords` callback.This function can be called multiple times as long as the tokens have not been effectively revealed yet, so that any failure toexecute the fulfill callback (such as because of insufficient gas) does not prevent from retrying."},"setTokenData(address,string,string,uint256)":{"notice":"Sets the metadata URIs and the token supply for a token contract."},"tokenMetadataURI(address,uint256)":{"notice":"Gets the token metadata URI for a token."}},"notice":"Token Metadata Resolver with a reveal mechanism.Before reveal, all the tokens have the same metadata URI. After reveal tokens have individual metadata URIs based on a random offset.This resolver is designed to work with incremental token IDs NFTs starting at 0 and a fixed token supply.","version":1}}},"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol":{"TokenMetadataResolverWithBaseURI":{"abi":[{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"NotTargetContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"}],"name":"TargetIsNotAContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadataURI","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"NotTargetContractOwner(address,address)":[{"params":{"account":"The account that was checked.","targetContract":"The contract that was checked."}}],"TargetIsNotAContract(address)":[{"params":{"targetContract":"The contract that was checked"}}]},"events":{"BaseMetadataURISet(address,string)":{"params":{"baseMetadataURI":"The base metadata URI.","tokenContract":"The token contract on which the base metadata URI was set."}}},"kind":"dev","methods":{"setBaseMetadataURI(address,string)":{"details":"Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Emits a {BaseMetadataURISet} event.","params":{"baseURI":"The base metadata URI.","tokenContract":"The token contract on which to set the base metadata URI."}},"tokenMetadataURI(address,uint256)":{"params":{"tokenContract":"The token contract for which to retrieve the token URI.","tokenId":"The token identifier."},"returns":{"tokenURI":"The token metadata URI as the concatenation of the base metadata URI and the token identifier."}}},"title":"TokenMetadataResolverWithBaseURI.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610a4f908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081633fb0a0db14610775575080636169966a146103865763f724dad71461004057600080fd5b346103815760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103815761007761088c565b73ffffffffffffffffffffffffffffffffffffffff6024359116600052600060205260406000208190826000937a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000811015610356575b50806d04ee2d6d415b85acef8100000000600a92101561033b575b662386f26fc10000811015610327575b6305f5e100811015610316575b612710811015610307575b60648110156102f9575b10156102ef575b6001830191600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6021610168610152876109df565b966101606040519889610902565b8088526109df565b967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020880198013689378601015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156101f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a9192610197565b505060405191600091805490610206826108af565b91600181169081156102ac5750600114610270575b61026c856102608187806102338c8a51938491610972565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610902565b60405191829182610995565b0390f35b9091925060005260206000206000905b828210610296575050820160200190838361021b565b6001816020925483858901015201910190610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808801919091528315159093028601909201935085915084905061021b565b916001019161011c565b606460029104940193610115565b6127106004910494019361010b565b6305f5e10060089104940193610100565b662386f26fc10000601091049401936100f3565b6d04ee2d6d415b85acef8100000000602091049401936100e3565b604094507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000090049050600a6100c8565b600080fd5b346103815760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610381576103bd61088c565b6024359067ffffffffffffffff821161038157366023830112156103815781600401359067ffffffffffffffff821161038157366024838501011161038157803b156107315773ffffffffffffffffffffffffffffffffffffffff16916040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481875afa908115610725576000916106cf575b5073ffffffffffffffffffffffffffffffffffffffff3391160361069d5782600052600060205260406000209260009261049285546108af565b601f8111610658575b508394601f821160011461056b57601f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0926060959488997f88abd97025db503bd9cbc01e09174912e82e0973d1b96c37a3d25d4f7e20f7a3999161055d575b508260011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8460031b1c19161790555b80602460405197889687526040602088015282604088015201868601378785828601015201168101030190a180f35b60249150880101358a6104fc565b808552602085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316865b81811061063d5750927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092601f927f88abd97025db503bd9cbc01e09174912e82e0973d1b96c37a3d25d4f7e20f7a39899836060989710610602575b5050600182811b01905561052e565b60247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19918a01013516905589806105f3565b86890160240135835560209889019860019093019201610597565b85855260208520601f830160051c81019160208410610693575b601f0160051c01905b818110610688575061049b565b85815560010161067b565b9091508190610672565b827f29b9b08b000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b6020813d60201161071d575b816106e860209383610902565b8101031261071957519073ffffffffffffffffffffffffffffffffffffffff82168203610716575084610458565b80fd5b5080fd5b3d91506106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346103815760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103815773ffffffffffffffffffffffffffffffffffffffff6107c161088c565b16600052600060205260406000206000908054906107de826108af565b80855291600181169081156108475750600114610806575b61026c8461026081860382610902565b600090815260208120939250905b80821061082d57509091508101602001610260826107f6565b919260018160209254838588010152019101909291610814565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b8501909201925061026091508390506107f6565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361038157565b90600182811c921680156108f8575b60208310146108c957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108be565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381106109855750506000910152565b8181015183820152602001610975565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604093602084526109d88151809281602088015260208888019101610972565b0116010190565b67ffffffffffffffff811161094357601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea26469706673582212202257ec53937c8616a4c92b3fb5933427a6fea2ee82f70ec59ebf68a3c74c522464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0xA4F SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x3FB0A0DB EQ PUSH2 0x775 JUMPI POP DUP1 PUSH4 0x6169966A EQ PUSH2 0x386 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH2 0x77 PUSH2 0x88C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 SWAP1 DUP3 PUSH1 0x0 SWAP4 PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 DUP2 LT ISZERO PUSH2 0x356 JUMPI JUMPDEST POP DUP1 PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0xA SWAP3 LT ISZERO PUSH2 0x33B JUMPI JUMPDEST PUSH7 0x2386F26FC10000 DUP2 LT ISZERO PUSH2 0x327 JUMPI JUMPDEST PUSH4 0x5F5E100 DUP2 LT ISZERO PUSH2 0x316 JUMPI JUMPDEST PUSH2 0x2710 DUP2 LT ISZERO PUSH2 0x307 JUMPI JUMPDEST PUSH1 0x64 DUP2 LT ISZERO PUSH2 0x2F9 JUMPI JUMPDEST LT ISZERO PUSH2 0x2EF JUMPI JUMPDEST PUSH1 0x1 DUP4 ADD SWAP2 PUSH1 0xA PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x21 PUSH2 0x168 PUSH2 0x152 DUP8 PUSH2 0x9DF JUMP JUMPDEST SWAP7 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP9 DUP10 PUSH2 0x902 JUMP JUMPDEST DUP1 DUP9 MSTORE PUSH2 0x9DF JUMP JUMPDEST SWAP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x20 DUP9 ADD SWAP9 ADD CALLDATASIZE DUP10 CALLDATACOPY DUP7 ADD ADD JUMPDEST ADD SWAP2 PUSH32 0x3031323334353637383961626364656600000000000000000000000000000000 DUP3 DUP3 MOD BYTE DUP4 MSTORE8 DIV DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SWAP2 SWAP3 PUSH2 0x197 JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x206 DUP3 PUSH2 0x8AF JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 EQ PUSH2 0x270 JUMPI JUMPDEST PUSH2 0x26C DUP6 PUSH2 0x260 DUP2 DUP8 DUP1 PUSH2 0x233 DUP13 DUP11 MLOAD SWAP4 DUP5 SWAP2 PUSH2 0x972 JUMP JUMPDEST ADD SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x902 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x995 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x296 JUMPI POP POP DUP3 ADD PUSH1 0x20 ADD SWAP1 DUP4 DUP4 PUSH2 0x21B JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x280 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x20 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 ISZERO ISZERO SWAP1 SWAP4 MUL DUP7 ADD SWAP1 SWAP3 ADD SWAP4 POP DUP6 SWAP2 POP DUP5 SWAP1 POP PUSH2 0x21B JUMP JUMPDEST SWAP2 PUSH1 0x1 ADD SWAP2 PUSH2 0x11C JUMP JUMPDEST PUSH1 0x64 PUSH1 0x2 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x115 JUMP JUMPDEST PUSH2 0x2710 PUSH1 0x4 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x10B JUMP JUMPDEST PUSH4 0x5F5E100 PUSH1 0x8 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x100 JUMP JUMPDEST PUSH7 0x2386F26FC10000 PUSH1 0x10 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0xF3 JUMP JUMPDEST PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0x20 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0xE3 JUMP JUMPDEST PUSH1 0x40 SWAP5 POP PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0xA PUSH2 0xC8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH2 0x3BD PUSH2 0x88C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x381 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x381 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x731 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP8 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6CF JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER SWAP2 AND SUB PUSH2 0x69D JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0x492 DUP6 SLOAD PUSH2 0x8AF JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x658 JUMPI JUMPDEST POP DUP4 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x56B JUMPI PUSH1 0x1F DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x60 SWAP6 SWAP5 DUP9 SWAP10 PUSH32 0x88ABD97025DB503BD9CBC01E09174912E82E0973D1B96C37A3D25D4F7E20F7A3 SWAP10 SWAP2 PUSH2 0x55D JUMPI JUMPDEST POP DUP3 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP1 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 MSTORE PUSH1 0x40 PUSH1 0x20 DUP9 ADD MSTORE DUP3 PUSH1 0x40 DUP9 ADD MSTORE ADD DUP7 DUP7 ADD CALLDATACOPY DUP8 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP2 POP DUP9 ADD ADD CALLDATALOAD DUP11 PUSH2 0x4FC JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 AND DUP7 JUMPDEST DUP2 DUP2 LT PUSH2 0x63D JUMPI POP SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x1F SWAP3 PUSH32 0x88ABD97025DB503BD9CBC01E09174912E82E0973D1B96C37A3D25D4F7E20F7A3 SWAP9 SWAP10 DUP4 PUSH1 0x60 SWAP9 SWAP8 LT PUSH2 0x602 JUMPI JUMPDEST POP POP PUSH1 0x1 DUP3 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x52E JUMP JUMPDEST PUSH1 0x24 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP7 PUSH1 0x3 SHL AND SHR NOT SWAP2 DUP11 ADD ADD CALLDATALOAD AND SWAP1 SSTORE DUP10 DUP1 PUSH2 0x5F3 JUMP JUMPDEST DUP7 DUP10 ADD PUSH1 0x24 ADD CALLDATALOAD DUP4 SSTORE PUSH1 0x20 SWAP9 DUP10 ADD SWAP9 PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 ADD PUSH2 0x597 JUMP JUMPDEST DUP6 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x693 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x688 JUMPI POP PUSH2 0x49B JUMP JUMPDEST DUP6 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x67B JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x672 JUMP JUMPDEST DUP3 PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE CALLER PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x71D JUMPI JUMPDEST DUP2 PUSH2 0x6E8 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x902 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x719 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x716 JUMPI POP DUP5 PUSH2 0x458 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7C1 PUSH2 0x88C JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 DUP1 SLOAD SWAP1 PUSH2 0x7DE DUP3 PUSH2 0x8AF JUMP JUMPDEST DUP1 DUP6 MSTORE SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x847 JUMPI POP PUSH1 0x1 EQ PUSH2 0x806 JUMPI JUMPDEST PUSH2 0x26C DUP5 PUSH2 0x260 DUP2 DUP7 SUB DUP3 PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP4 SWAP3 POP SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0x82D JUMPI POP SWAP1 SWAP2 POP DUP2 ADD PUSH1 0x20 ADD PUSH2 0x260 DUP3 PUSH2 0x7F6 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP3 SWAP2 PUSH2 0x814 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x20 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP6 ADD SWAP1 SWAP3 ADD SWAP3 POP PUSH2 0x260 SWAP2 POP DUP4 SWAP1 POP PUSH2 0x7F6 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x381 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x8F8 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x8C9 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8BE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x943 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x985 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x975 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0x9D8 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0x972 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x943 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 JUMPI EOFCREATE 0x53 SWAP4 PUSH29 0x8616A4C92B3FB5933427A6FEA2EE82F70EC59EBF68A3C74C522464736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"597:1682:337:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_address":{"entryPoint":2188,"id":null,"parameterSlots":0,"returnSlots":1},"abi_encode_string":{"entryPoint":2453,"id":null,"parameterSlots":2,"returnSlots":1},"array_allocation_size_string":{"entryPoint":2527,"id":null,"parameterSlots":1,"returnSlots":1},"copy_memory_to_memory_with_cleanup":{"entryPoint":2418,"id":null,"parameterSlots":3,"returnSlots":0},"extract_byte_array_length":{"entryPoint":2223,"id":null,"parameterSlots":1,"returnSlots":1},"finalize_allocation":{"entryPoint":2306,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"608080604052600436101561001357600080fd5b60003560e01c9081633fb0a0db14610775575080636169966a146103865763f724dad71461004057600080fd5b346103815760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103815761007761088c565b73ffffffffffffffffffffffffffffffffffffffff6024359116600052600060205260406000208190826000937a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000811015610356575b50806d04ee2d6d415b85acef8100000000600a92101561033b575b662386f26fc10000811015610327575b6305f5e100811015610316575b612710811015610307575b60648110156102f9575b10156102ef575b6001830191600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6021610168610152876109df565b966101606040519889610902565b8088526109df565b967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020880198013689378601015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156101f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a9192610197565b505060405191600091805490610206826108af565b91600181169081156102ac5750600114610270575b61026c856102608187806102338c8a51938491610972565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610902565b60405191829182610995565b0390f35b9091925060005260206000206000905b828210610296575050820160200190838361021b565b6001816020925483858901015201910190610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808801919091528315159093028601909201935085915084905061021b565b916001019161011c565b606460029104940193610115565b6127106004910494019361010b565b6305f5e10060089104940193610100565b662386f26fc10000601091049401936100f3565b6d04ee2d6d415b85acef8100000000602091049401936100e3565b604094507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000090049050600a6100c8565b600080fd5b346103815760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610381576103bd61088c565b6024359067ffffffffffffffff821161038157366023830112156103815781600401359067ffffffffffffffff821161038157366024838501011161038157803b156107315773ffffffffffffffffffffffffffffffffffffffff16916040517f8da5cb5b000000000000000000000000000000000000000000000000000000008152602081600481875afa908115610725576000916106cf575b5073ffffffffffffffffffffffffffffffffffffffff3391160361069d5782600052600060205260406000209260009261049285546108af565b601f8111610658575b508394601f821160011461056b57601f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0926060959488997f88abd97025db503bd9cbc01e09174912e82e0973d1b96c37a3d25d4f7e20f7a3999161055d575b508260011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8460031b1c19161790555b80602460405197889687526040602088015282604088015201868601378785828601015201168101030190a180f35b60249150880101358a6104fc565b808552602085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316865b81811061063d5750927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092601f927f88abd97025db503bd9cbc01e09174912e82e0973d1b96c37a3d25d4f7e20f7a39899836060989710610602575b5050600182811b01905561052e565b60247fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c19918a01013516905589806105f3565b86890160240135835560209889019860019093019201610597565b85855260208520601f830160051c81019160208410610693575b601f0160051c01905b818110610688575061049b565b85815560010161067b565b9091508190610672565b827f29b9b08b000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b6020813d60201161071d575b816106e860209383610902565b8101031261071957519073ffffffffffffffffffffffffffffffffffffffff82168203610716575084610458565b80fd5b5080fd5b3d91506106db565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff907f73a5b5e3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346103815760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103815773ffffffffffffffffffffffffffffffffffffffff6107c161088c565b16600052600060205260406000206000908054906107de826108af565b80855291600181169081156108475750600114610806575b61026c8461026081860382610902565b600090815260208120939250905b80821061082d57509091508101602001610260826107f6565b919260018160209254838588010152019101909291610814565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b8501909201925061026091508390506107f6565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361038157565b90600182811c921680156108f8575b60208310146108c957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916108be565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381106109855750506000910152565b8181015183820152602001610975565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604093602084526109d88151809281602088015260208888019101610972565b0116010190565b67ffffffffffffffff811161094357601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea26469706673582212202257ec53937c8616a4c92b3fb5933427a6fea2ee82f70ec59ebf68a3c74c522464736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 PUSH4 0x3FB0A0DB EQ PUSH2 0x775 JUMPI POP DUP1 PUSH4 0x6169966A EQ PUSH2 0x386 JUMPI PUSH4 0xF724DAD7 EQ PUSH2 0x40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH2 0x77 PUSH2 0x88C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD SWAP2 AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 SWAP1 DUP3 PUSH1 0x0 SWAP4 PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 DUP2 LT ISZERO PUSH2 0x356 JUMPI JUMPDEST POP DUP1 PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0xA SWAP3 LT ISZERO PUSH2 0x33B JUMPI JUMPDEST PUSH7 0x2386F26FC10000 DUP2 LT ISZERO PUSH2 0x327 JUMPI JUMPDEST PUSH4 0x5F5E100 DUP2 LT ISZERO PUSH2 0x316 JUMPI JUMPDEST PUSH2 0x2710 DUP2 LT ISZERO PUSH2 0x307 JUMPI JUMPDEST PUSH1 0x64 DUP2 LT ISZERO PUSH2 0x2F9 JUMPI JUMPDEST LT ISZERO PUSH2 0x2EF JUMPI JUMPDEST PUSH1 0x1 DUP4 ADD SWAP2 PUSH1 0xA PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x21 PUSH2 0x168 PUSH2 0x152 DUP8 PUSH2 0x9DF JUMP JUMPDEST SWAP7 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP9 DUP10 PUSH2 0x902 JUMP JUMPDEST DUP1 DUP9 MSTORE PUSH2 0x9DF JUMP JUMPDEST SWAP7 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x20 DUP9 ADD SWAP9 ADD CALLDATASIZE DUP10 CALLDATACOPY DUP7 ADD ADD JUMPDEST ADD SWAP2 PUSH32 0x3031323334353637383961626364656600000000000000000000000000000000 DUP3 DUP3 MOD BYTE DUP4 MSTORE8 DIV DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA SWAP2 SWAP3 PUSH2 0x197 JUMP JUMPDEST POP POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x0 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x206 DUP3 PUSH2 0x8AF JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x2AC JUMPI POP PUSH1 0x1 EQ PUSH2 0x270 JUMPI JUMPDEST PUSH2 0x26C DUP6 PUSH2 0x260 DUP2 DUP8 DUP1 PUSH2 0x233 DUP13 DUP11 MLOAD SWAP4 DUP5 SWAP2 PUSH2 0x972 JUMP JUMPDEST ADD SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD DUP4 MSTORE DUP3 PUSH2 0x902 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x995 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 SWAP2 SWAP3 POP PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x296 JUMPI POP POP DUP3 ADD PUSH1 0x20 ADD SWAP1 DUP4 DUP4 PUSH2 0x21B JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP4 DUP6 DUP10 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x280 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x20 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 ISZERO ISZERO SWAP1 SWAP4 MUL DUP7 ADD SWAP1 SWAP3 ADD SWAP4 POP DUP6 SWAP2 POP DUP5 SWAP1 POP PUSH2 0x21B JUMP JUMPDEST SWAP2 PUSH1 0x1 ADD SWAP2 PUSH2 0x11C JUMP JUMPDEST PUSH1 0x64 PUSH1 0x2 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x115 JUMP JUMPDEST PUSH2 0x2710 PUSH1 0x4 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x10B JUMP JUMPDEST PUSH4 0x5F5E100 PUSH1 0x8 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0x100 JUMP JUMPDEST PUSH7 0x2386F26FC10000 PUSH1 0x10 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0xF3 JUMP JUMPDEST PUSH14 0x4EE2D6D415B85ACEF8100000000 PUSH1 0x20 SWAP2 DIV SWAP5 ADD SWAP4 PUSH2 0xE3 JUMP JUMPDEST PUSH1 0x40 SWAP5 POP PUSH27 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 SWAP1 DIV SWAP1 POP PUSH1 0xA PUSH2 0xC8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH2 0x3BD PUSH2 0x88C JUMP JUMPDEST PUSH1 0x24 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381 JUMPI CALLDATASIZE PUSH1 0x23 DUP4 ADD SLT ISZERO PUSH2 0x381 JUMPI DUP2 PUSH1 0x4 ADD CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381 JUMPI CALLDATASIZE PUSH1 0x24 DUP4 DUP6 ADD ADD GT PUSH2 0x381 JUMPI DUP1 EXTCODESIZE ISZERO PUSH2 0x731 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x40 MLOAD PUSH32 0x8DA5CB5B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 DUP2 PUSH1 0x4 DUP2 DUP8 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x6CF JUMPI JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER SWAP2 AND SUB PUSH2 0x69D JUMPI DUP3 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0x492 DUP6 SLOAD PUSH2 0x8AF JUMP JUMPDEST PUSH1 0x1F DUP2 GT PUSH2 0x658 JUMPI JUMPDEST POP DUP4 SWAP5 PUSH1 0x1F DUP3 GT PUSH1 0x1 EQ PUSH2 0x56B JUMPI PUSH1 0x1F DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x60 SWAP6 SWAP5 DUP9 SWAP10 PUSH32 0x88ABD97025DB503BD9CBC01E09174912E82E0973D1B96C37A3D25D4F7E20F7A3 SWAP10 SWAP2 PUSH2 0x55D JUMPI JUMPDEST POP DUP3 PUSH1 0x1 SHL SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 PUSH1 0x3 SHL SHR NOT AND OR SWAP1 SSTORE JUMPDEST DUP1 PUSH1 0x24 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 DUP8 MSTORE PUSH1 0x40 PUSH1 0x20 DUP9 ADD MSTORE DUP3 PUSH1 0x40 DUP9 ADD MSTORE ADD DUP7 DUP7 ADD CALLDATACOPY DUP8 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND DUP2 ADD SUB ADD SWAP1 LOG1 DUP1 RETURN JUMPDEST PUSH1 0x24 SWAP2 POP DUP9 ADD ADD CALLDATALOAD DUP11 PUSH2 0x4FC JUMP JUMPDEST DUP1 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 AND DUP7 JUMPDEST DUP2 DUP2 LT PUSH2 0x63D JUMPI POP SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 PUSH1 0x1F SWAP3 PUSH32 0x88ABD97025DB503BD9CBC01E09174912E82E0973D1B96C37A3D25D4F7E20F7A3 SWAP9 SWAP10 DUP4 PUSH1 0x60 SWAP9 SWAP8 LT PUSH2 0x602 JUMPI JUMPDEST POP POP PUSH1 0x1 DUP3 DUP2 SHL ADD SWAP1 SSTORE PUSH2 0x52E JUMP JUMPDEST PUSH1 0x24 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xF8 DUP7 PUSH1 0x3 SHL AND SHR NOT SWAP2 DUP11 ADD ADD CALLDATALOAD AND SWAP1 SSTORE DUP10 DUP1 PUSH2 0x5F3 JUMP JUMPDEST DUP7 DUP10 ADD PUSH1 0x24 ADD CALLDATALOAD DUP4 SSTORE PUSH1 0x20 SWAP9 DUP10 ADD SWAP9 PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 ADD PUSH2 0x597 JUMP JUMPDEST DUP6 DUP6 MSTORE PUSH1 0x20 DUP6 KECCAK256 PUSH1 0x1F DUP4 ADD PUSH1 0x5 SHR DUP2 ADD SWAP2 PUSH1 0x20 DUP5 LT PUSH2 0x693 JUMPI JUMPDEST PUSH1 0x1F ADD PUSH1 0x5 SHR ADD SWAP1 JUMPDEST DUP2 DUP2 LT PUSH2 0x688 JUMPI POP PUSH2 0x49B JUMP JUMPDEST DUP6 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x67B JUMP JUMPDEST SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x672 JUMP JUMPDEST DUP3 PUSH32 0x29B9B08B00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE CALLER PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x20 DUP2 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x71D JUMPI JUMPDEST DUP2 PUSH2 0x6E8 PUSH1 0x20 SWAP4 DUP4 PUSH2 0x902 JUMP JUMPDEST DUP2 ADD SUB SLT PUSH2 0x719 JUMPI MLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x716 JUMPI POP DUP5 PUSH2 0x458 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST RETURNDATASIZE SWAP2 POP PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 PUSH32 0x73A5B5E300000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE AND PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x381 JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x381 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x7C1 PUSH2 0x88C JUMP JUMPDEST AND PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 DUP1 SLOAD SWAP1 PUSH2 0x7DE DUP3 PUSH2 0x8AF JUMP JUMPDEST DUP1 DUP6 MSTORE SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 ISZERO PUSH2 0x847 JUMPI POP PUSH1 0x1 EQ PUSH2 0x806 JUMPI JUMPDEST PUSH2 0x26C DUP5 PUSH2 0x260 DUP2 DUP7 SUB DUP3 PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 SWAP4 SWAP3 POP SWAP1 JUMPDEST DUP1 DUP3 LT PUSH2 0x82D JUMPI POP SWAP1 SWAP2 POP DUP2 ADD PUSH1 0x20 ADD PUSH2 0x260 DUP3 PUSH2 0x7F6 JUMP JUMPDEST SWAP2 SWAP3 PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP4 DUP6 DUP9 ADD ADD MSTORE ADD SWAP2 ADD SWAP1 SWAP3 SWAP2 PUSH2 0x814 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x20 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 ISZERO ISZERO PUSH1 0x5 SHL DUP6 ADD SWAP1 SWAP3 ADD SWAP3 POP PUSH2 0x260 SWAP2 POP DUP4 SWAP1 POP PUSH2 0x7F6 JUMP JUMPDEST PUSH1 0x4 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP3 SUB PUSH2 0x381 JUMPI JUMP JUMPDEST SWAP1 PUSH1 0x1 DUP3 DUP2 SHR SWAP3 AND DUP1 ISZERO PUSH2 0x8F8 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x8C9 JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x8BE JUMP JUMPDEST SWAP1 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP2 ADD AND DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x943 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x985 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x975 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 SWAP4 PUSH1 0x20 DUP5 MSTORE PUSH2 0x9D8 DUP2 MLOAD DUP1 SWAP3 DUP2 PUSH1 0x20 DUP9 ADD MSTORE PUSH1 0x20 DUP9 DUP9 ADD SWAP2 ADD PUSH2 0x972 JUMP JUMPDEST ADD AND ADD ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x943 JUMPI PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 JUMPI EOFCREATE 0x53 SWAP4 PUSH29 0x8616A4C92B3FB5933427A6FEA2EE82F70EC59EBF68A3C74C522464736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"597:1682:337:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2250:18;1430:17:15;;597:1682:337;29282:17:20;29291:8;29282:17;;;29278:103;;597:1682:337;29398:17:20;;29407:8;29978:7;29398:17;;;29394:103;;597:1682:337;29523:8:20;29514:17;;;29510:103;;597:1682:337;29639:7:20;29630:16;;;29626:100;;597:1682:337;29752:7:20;29743:16;;;29739:100;;597:1682:337;29865:7:20;29856:16;;;29852:100;;597:1682:337;29969:16:20;;29965:66;;597:1682:337;;;;;29978:7:20;597:1682:337;1545:94:15;597:1682:337;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;1545:94:15;;;1652:247;597:1682:337;1706:111:15;;;;;;;;597:1682:337;1867:10:15;;1863:21;;597:1682:337;29978:7:20;1652:247:15;;;;1863:21;1879:5;;597:1682:337;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2201:68;597:1682;;;;;;;;;;;:::i;:::-;;2201:68;597:1682;2201:68;;;;;;:::i;:::-;597:1682;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;597:1682:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2201:68;;;597:1682;;;;;;;;;;;;;;;;-1:-1:-1;597:1682:337;;-1:-1:-1;597:1682:337;;-1:-1:-1;597:1682:337;;29965:66:20;597:1682:337;;;29965:66:20;;;29852:100;29865:7;29936:1;597:1682:337;;;;29852:100:20;;;29739;29752:7;597:1682:337;;;;;29739:100:20;;;29626;29639:7;29710:1;597:1682:337;;;;29626:100:20;;;29510:103;29523:8;29596:2;597:1682:337;;;;29510:103:20;;;29394;29407:8;597:1682:337;;;;;29394:103:20;;;29278;597:1682:337;;-1:-1:-1;29291:8:20;597:1682:337;;;-1:-1:-1;29978:7:20;29278:103;;597:1682:337;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;376:58:354;;450:9;4074:78:42;;597:1682:337;;;;;;4169:31:42;;597:1682:337;4169:31:42;597:1682:337;4169:31:42;;;;;;;;;597:1682:337;4169:31:42;;;597:1682:337;1555:10;597:1682;1555:10;597:1682;;4169:42:42;4940:107;;597:1682:337;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;1631:42;597:1682;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1631:42;;;;597:1682;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1631:42;597:1682;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;597:1682:337;;;;4940:107:42;5000:47;;597:1682:337;5000:47:42;597:1682:337;;1555:10;597:1682;;;;5000:47:42;4169:31;597:1682:337;4169:31:42;;597:1682:337;4169:31:42;;;;;;597:1682:337;4169:31:42;;;:::i;:::-;;;597:1682:337;;;;;;;;;;;;;4169:31:42;;;;597:1682:337;;;;;;;4169:31:42;;;-1:-1:-1;4169:31:42;;;597:1682:337;;;;;;;;;4074:78:42;597:1682:337;4116:36:42;;597:1682:337;4116:36:42;597:1682:337;;;;;4116:36:42;597:1682:337;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;597:1682:337;;;;;;;-1:-1:-1;597:1682:337;;-1:-1:-1;597:1682:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;597:1682:337;;-1:-1:-1;597:1682:337;;-1:-1:-1;597:1682:337;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;597:1682:337;;;;;-1:-1:-1;597:1682:337;;;;;;;;;-1:-1:-1;;597:1682:337;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;:::o"},"gasEstimates":{"creation":{"codeDepositCost":"527800","executionCost":"569","totalCost":"528369"},"external":{"baseMetadataURI(address)":"infinite","setBaseMetadataURI(address,string)":"infinite","tokenMetadataURI(address,uint256)":"infinite"}},"methodIdentifiers":{"baseMetadataURI(address)":"3fb0a0db","setBaseMetadataURI(address,string)":"6169966a","tokenMetadataURI(address,uint256)":"f724dad7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotTargetContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"}],\"name\":\"TargetIsNotAContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"baseMetadataURI\",\"type\":\"string\"}],\"name\":\"BaseMetadataURISet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"baseMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"}],\"name\":\"setBaseMetadataURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"NotTargetContractOwner(address,address)\":[{\"params\":{\"account\":\"The account that was checked.\",\"targetContract\":\"The contract that was checked.\"}}],\"TargetIsNotAContract(address)\":[{\"params\":{\"targetContract\":\"The contract that was checked\"}}]},\"events\":{\"BaseMetadataURISet(address,string)\":{\"params\":{\"baseMetadataURI\":\"The base metadata URI.\",\"tokenContract\":\"The token contract on which the base metadata URI was set.\"}}},\"kind\":\"dev\",\"methods\":{\"setBaseMetadataURI(address,string)\":{\"details\":\"Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.Emits a {BaseMetadataURISet} event.\",\"params\":{\"baseURI\":\"The base metadata URI.\",\"tokenContract\":\"The token contract on which to set the base metadata URI.\"}},\"tokenMetadataURI(address,uint256)\":{\"params\":{\"tokenContract\":\"The token contract for which to retrieve the token URI.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenURI\":\"The token metadata URI as the concatenation of the base metadata URI and the token identifier.\"}}},\"title\":\"TokenMetadataResolverWithBaseURI.\",\"version\":1},\"userdoc\":{\"errors\":{\"NotTargetContractOwner(address,address)\":[{\"notice\":\"Thrown when an account is not the target contract owner but is required to.\"}],\"TargetIsNotAContract(address)\":[{\"notice\":\"Thrown when the target contract is actually not a contract.\"}]},\"events\":{\"BaseMetadataURISet(address,string)\":{\"notice\":\"Emitted when the base metadata URI is set.\"}},\"kind\":\"user\",\"methods\":{\"setBaseMetadataURI(address,string)\":{\"notice\":\"Sets the base metadata URI.\"},\"tokenMetadataURI(address,uint256)\":{\"notice\":\"Gets the token metadata URI for a token as the concatenation of the base metadata URI and the token identifier.\"}},\"notice\":\"Token Metadata Resolver which uses a base metadata URI concatenated with the token identifier to produce a token metadata URI.Only the owner of the target token contract can set the base metadata URI for this target contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol\":\"TokenMetadataResolverWithBaseURI\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Helper library for emitting standardized panic codes.\\n *\\n * ```solidity\\n * contract Example {\\n *      using Panic for uint256;\\n *\\n *      // Use any of the declared internal constants\\n *      function foo() { Panic.GENERIC.panic(); }\\n *\\n *      // Alternatively\\n *      function foo() { Panic.panic(Panic.GENERIC); }\\n * }\\n * ```\\n *\\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\\n *\\n * _Available since v5.1._\\n */\\n// slither-disable-next-line unused-state\\nlibrary Panic {\\n    /// @dev generic / unspecified error\\n    uint256 internal constant GENERIC = 0x00;\\n    /// @dev used by the assert() builtin\\n    uint256 internal constant ASSERT = 0x01;\\n    /// @dev arithmetic underflow or overflow\\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\\n    /// @dev division or modulo by zero\\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\\n    /// @dev enum conversion error\\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\\n    /// @dev invalid encoding in storage\\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\\n    /// @dev empty array pop\\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\\n    /// @dev array out of bounds access\\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\\n    /// @dev resource error (too large allocation or too large array)\\n    uint256 internal constant RESOURCE_ERROR = 0x41;\\n    /// @dev calling invalid internal function\\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\\n\\n    /// @dev Reverts with a panic code. Recommended to use with\\n    /// the internal constants with predefined codes.\\n    function panic(uint256 code) internal pure {\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(0x00, 0x4e487b71)\\n            mstore(0x20, code)\\n            revert(0x1c, 0x24)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SafeCast} from \\\"./math/SafeCast.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    using SafeCast for *;\\n\\n    bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n    uint8 private constant ADDRESS_LENGTH = 20;\\n    uint256 private constant SPECIAL_CHARS_LOOKUP =\\n        (1 << 0x08) | // backspace\\n            (1 << 0x09) | // tab\\n            (1 << 0x0a) | // newline\\n            (1 << 0x0c) | // form feed\\n            (1 << 0x0d) | // carriage return\\n            (1 << 0x22) | // double quote\\n            (1 << 0x5c); // backslash\\n\\n    /**\\n     * @dev The `value` string doesn't fit in the specified `length`.\\n     */\\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n    /**\\n     * @dev The string being parsed contains characters that are not in scope of the given base.\\n     */\\n    error StringsInvalidChar();\\n\\n    /**\\n     * @dev The string being parsed is not a properly formatted address.\\n     */\\n    error StringsInvalidAddressFormat();\\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            assembly (\\\"memory-safe\\\") {\\n                ptr := add(add(buffer, 0x20), length)\\n            }\\n            while (true) {\\n                ptr--;\\n                assembly (\\\"memory-safe\\\") {\\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\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 toStringSigned(int256 value) internal pure returns (string memory) {\\n        return string.concat(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        uint256 localValue = value;\\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] = HEX_DIGITS[localValue & 0xf];\\n            localValue >>= 4;\\n        }\\n        if (localValue != 0) {\\n            revert StringsInsufficientHexLength(value, length);\\n        }\\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\\n     * 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 Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\\n     * representation, according to EIP-55.\\n     */\\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(toHexString(addr));\\n\\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\\n        uint256 hashValue;\\n        assembly (\\\"memory-safe\\\") {\\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\\n        }\\n\\n        for (uint256 i = 41; i > 1; --i) {\\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\\n                // case shift by xoring with 0x20\\n                buffer[i] ^= 0x20;\\n            }\\n            hashValue >>= 4;\\n        }\\n        return string(buffer);\\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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input) internal pure returns (uint256) {\\n        return parseUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[0-9]*`\\n     * - The result must fit into an `uint256` type\\n     */\\n    function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 9) return (false, 0);\\n            result *= 10;\\n            result += chr;\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a decimal string and returns the value as a `int256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input) internal pure returns (int256) {\\n        return parseInt(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `[-+]?[0-9]*`\\n     * - The result must fit in an `int256` type.\\n     */\\n    function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\\n        (bool success, int256 value) = tryParseInt(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\\n     * the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\\n        return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    uint256 private constant ABS_MIN_INT256 = 2 ** 255;\\n\\n    /**\\n     * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\\n     * character or if the result does not fit in a `int256`.\\n     *\\n     * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\\n     */\\n    function tryParseInt(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, int256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseIntUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseIntUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, int256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // Check presence of a negative sign.\\n        bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        bool positiveSign = sign == bytes1(\\\"+\\\");\\n        bool negativeSign = sign == bytes1(\\\"-\\\");\\n        uint256 offset = (positiveSign || negativeSign).toUint();\\n\\n        (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\\n\\n        if (absSuccess && absValue < ABS_MIN_INT256) {\\n            return (true, negativeSign ? -int256(absValue) : int256(absValue));\\n        } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\\n            return (true, type(int256).min);\\n        } else return (false, 0);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as a `uint256`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input) internal pure returns (uint256) {\\n        return parseHexUint(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\\n     * - The result must fit in an `uint256` type.\\n     */\\n    function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\\n        (bool success, uint256 value) = tryParseHexUint(input, begin, end);\\n        if (!success) revert StringsInvalidChar();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\\n        return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\\n     * invalid character.\\n     *\\n     * NOTE: This function will revert if the result does not fit in a `uint256`.\\n     */\\n    function tryParseHexUint(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, uint256 value) {\\n        if (end > bytes(input).length || begin > end) return (false, 0);\\n        return _tryParseHexUintUncheckedBounds(input, begin, end);\\n    }\\n\\n    /**\\n     * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\\n     * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\\n     */\\n    function _tryParseHexUintUncheckedBounds(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) private pure returns (bool success, uint256 value) {\\n        bytes memory buffer = bytes(input);\\n\\n        // skip 0x prefix if present\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 offset = hasPrefix.toUint() * 2;\\n\\n        uint256 result = 0;\\n        for (uint256 i = begin + offset; i < end; ++i) {\\n            uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\\n            if (chr > 15) return (false, 0);\\n            result *= 16;\\n            unchecked {\\n                // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\\n                // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\\n                result += chr;\\n            }\\n        }\\n        return (true, result);\\n    }\\n\\n    /**\\n     * @dev Parse a hexadecimal string (with or without \\\"0x\\\" prefix), and returns the value as an `address`.\\n     *\\n     * Requirements:\\n     * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input) internal pure returns (address) {\\n        return parseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\\n     * `end` (excluded).\\n     *\\n     * Requirements:\\n     * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\\n     */\\n    function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\\n        (bool success, address value) = tryParseAddress(input, begin, end);\\n        if (!success) revert StringsInvalidAddressFormat();\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\\n     * formatted address. See {parseAddress-string} requirements.\\n     */\\n    function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\\n        return tryParseAddress(input, 0, bytes(input).length);\\n    }\\n\\n    /**\\n     * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\\n     * formatted address. See {parseAddress-string-uint256-uint256} requirements.\\n     */\\n    function tryParseAddress(\\n        string memory input,\\n        uint256 begin,\\n        uint256 end\\n    ) internal pure returns (bool success, address value) {\\n        if (end > bytes(input).length || begin > end) return (false, address(0));\\n\\n        bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\\\"0x\\\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\\n        uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\\n\\n        // check that input is the correct length\\n        if (end - begin == expectedLength) {\\n            // length guarantees that this does not overflow, and value is at most type(uint160).max\\n            (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\\n            return (s, address(uint160(v)));\\n        } else {\\n            return (false, address(0));\\n        }\\n    }\\n\\n    function _tryParseChr(bytes1 chr) private pure returns (uint8) {\\n        uint8 value = uint8(chr);\\n\\n        // Try to parse `chr`:\\n        // - Case 1: [0-9]\\n        // - Case 2: [a-f]\\n        // - Case 3: [A-F]\\n        // - otherwise not supported\\n        unchecked {\\n            if (value > 47 && value < 58) value -= 48;\\n            else if (value > 96 && value < 103) value -= 87;\\n            else if (value > 64 && value < 71) value -= 55;\\n            else return type(uint8).max;\\n        }\\n\\n        return value;\\n    }\\n\\n    /**\\n     * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\\n     *\\n     * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\\n     *\\n     * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\\n     * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\\n     * characters that are not in this range, but other tooling may provide different results.\\n     */\\n    function escapeJSON(string memory input) internal pure returns (string memory) {\\n        bytes memory buffer = bytes(input);\\n        bytes memory output = new bytes(2 * buffer.length); // worst case scenario\\n        uint256 outputLength = 0;\\n\\n        for (uint256 i; i < buffer.length; ++i) {\\n            bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\\n            if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\\n                output[outputLength++] = \\\"\\\\\\\\\\\";\\n                if (char == 0x08) output[outputLength++] = \\\"b\\\";\\n                else if (char == 0x09) output[outputLength++] = \\\"t\\\";\\n                else if (char == 0x0a) output[outputLength++] = \\\"n\\\";\\n                else if (char == 0x0c) output[outputLength++] = \\\"f\\\";\\n                else if (char == 0x0d) output[outputLength++] = \\\"r\\\";\\n                else if (char == 0x5c) output[outputLength++] = \\\"\\\\\\\\\\\";\\n                else if (char == 0x22) {\\n                    // solhint-disable-next-line quotes\\n                    output[outputLength++] = '\\\"';\\n                }\\n            } else {\\n                output[outputLength++] = char;\\n            }\\n        }\\n        // write the actual length and deallocate unused memory\\n        assembly (\\\"memory-safe\\\") {\\n            mstore(output, outputLength)\\n            mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\\n        }\\n\\n        return string(output);\\n    }\\n\\n    /**\\n     * @dev Reads a bytes32 from a bytes array without bounds checking.\\n     *\\n     * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\\n     * assembly block as such would prevent some optimizations.\\n     */\\n    function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\\n        // This is not memory safe in the general case, but all calls to this private function are within bounds.\\n        assembly (\\\"memory-safe\\\") {\\n            value := mload(add(add(buffer, 0x20), offset))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Panic} from \\\"../Panic.sol\\\";\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Floor, // Toward negative infinity\\n        Ceil, // Toward positive infinity\\n        Trunc, // Toward zero\\n        Expand // Away from zero\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit addition of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that sum = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        assembly (\\\"memory-safe\\\") {\\n            low := add(a, b)\\n            high := lt(low, a)\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the 512-bit multiplication of two uint256.\\n     *\\n     * The result is stored in two 256 variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n     */\\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2\\u00b2\\u2075\\u2076 and mod 2\\u00b2\\u2075\\u2076 - 1, then use\\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n        // variables such that product = high * 2\\u00b2\\u2075\\u2076 + low.\\n        assembly (\\\"memory-safe\\\") {\\n            let mm := mulmod(a, b, not(0))\\n            low := mul(a, b)\\n            high := sub(sub(mm, low), lt(mm, low))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a + b;\\n            success = c >= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a - b;\\n            success = c <= a;\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            uint256 c = a * b;\\n            assembly (\\\"memory-safe\\\") {\\n                // Only true when the multiplication doesn't overflow\\n                // (c / a == b) || (a == 0)\\n                success := or(eq(div(c, a), b), iszero(a))\\n            }\\n            // equivalent to: success ? c : 0\\n            result = c * SafeCast.toUint(success);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `DIV` opcode returns zero when the denominator is 0.\\n                result := div(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\\n        unchecked {\\n            success = b > 0;\\n            assembly (\\\"memory-safe\\\") {\\n                // The `MOD` opcode returns zero when the denominator is 0.\\n                result := mod(a, b)\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating addition, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryAdd(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\\n     */\\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (, uint256 result) = trySub(a, b);\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Unsigned saturating multiplication, bounds to `2\\u00b2\\u2075\\u2076 - 1` instead of overflowing.\\n     */\\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        (bool success, uint256 result) = tryMul(a, b);\\n        return ternary(success, result, type(uint256).max);\\n    }\\n\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\\n        }\\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 ternary(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 ternary(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 towards infinity instead\\n     * of rounding towards zero.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (b == 0) {\\n            // Guarantee the same behavior as in a regular Solidity division.\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n\\n        // The following calculation ensures accurate ceiling division without overflow.\\n        // Since a is non-zero, (a - 1) / b will not overflow.\\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\\n        // when a = type(uint256).max and b = 1.\\n        unchecked {\\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n     * denominator == 0.\\n     *\\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n     * Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (high == 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 low / denominator;\\n            }\\n\\n            // Make sure the result is less than 2\\u00b2\\u2075\\u2076. Also prevents denominator == 0.\\n            if (denominator <= high) {\\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\\n            }\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [high low].\\n            uint256 remainder;\\n            assembly (\\\"memory-safe\\\") {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                high := sub(high, gt(remainder, low))\\n                low := sub(low, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n            uint256 twos = denominator & (0 - denominator);\\n            assembly (\\\"memory-safe\\\") {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [high low] by twos.\\n                low := div(low, twos)\\n\\n                // Flip twos such that it is 2\\u00b2\\u2075\\u2076 / 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 high into low.\\n            low |= high * twos;\\n\\n            // Invert denominator mod 2\\u00b2\\u2075\\u2076. Now that denominator is an odd number, it has an inverse modulo 2\\u00b2\\u2075\\u2076 such\\n            // that denominator * inv \\u2261 1 mod 2\\u00b2\\u2075\\u2076. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv \\u2261 1 mod 2\\u2074.\\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\\n            // works in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u2076\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b3\\u00b2\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u2076\\u2074\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b9\\u00b2\\u2078\\n            inverse *= 2 - denominator * inverse; // inverse mod 2\\u00b2\\u2075\\u2076\\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\\u00b2\\u2075\\u2076. Since the preconditions guarantee that the outcome is\\n            // less than 2\\u00b2\\u2075\\u2076, this is the final result. We don't need to compute the high bits of the result and high\\n            // is no longer required.\\n            result = low * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @dev 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        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\\n        unchecked {\\n            (uint256 high, uint256 low) = mul512(x, y);\\n            if (high >= 1 << n) {\\n                Panic.panic(Panic.UNDER_OVERFLOW);\\n            }\\n            return (high << (256 - n)) | (low >> n);\\n        }\\n    }\\n\\n    /**\\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\\n     */\\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\\n    }\\n\\n    /**\\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\\n     *\\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\\n     *\\n     * If the input value is not inversible, 0 is returned.\\n     *\\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\\n     */\\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\\n        unchecked {\\n            if (n == 0) return 0;\\n\\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\\n            // ax + ny = 1\\n            // ax = 1 + (-y)n\\n            // ax \\u2261 1 (mod n) # x is the inverse of a modulo n\\n\\n            // If the remainder is 0 the gcd is n right away.\\n            uint256 remainder = a % n;\\n            uint256 gcd = n;\\n\\n            // Therefore the initial coefficients are:\\n            // ax + ny = gcd(a, n) = n\\n            // 0a + 1n = n\\n            int256 x = 0;\\n            int256 y = 1;\\n\\n            while (remainder != 0) {\\n                uint256 quotient = gcd / remainder;\\n\\n                (gcd, remainder) = (\\n                    // The old remainder is the next gcd to try.\\n                    remainder,\\n                    // Compute the next remainder.\\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\\n                    // where gcd is at most n (capped to type(uint256).max)\\n                    gcd - remainder * quotient\\n                );\\n\\n                (x, y) = (\\n                    // Increment the coefficient of a.\\n                    y,\\n                    // Decrement the coefficient of n.\\n                    // Can overflow, but the result is casted to uint256 so that the\\n                    // next value of y is \\\"wrapped around\\\" to a value between 0 and n - 1.\\n                    x - y * int256(quotient)\\n                );\\n            }\\n\\n            if (gcd != 1) return 0; // No inverse exists.\\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\\n     *\\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\\n     * prime, then `a**(p-1) \\u2261 1 mod p`. As a consequence, we have `a * a**(p-2) \\u2261 1 mod p`, which means that\\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\\n     *\\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\\n     */\\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\\n        unchecked {\\n            return Math.modExp(a, p - 2, p);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\\n     *\\n     * Requirements:\\n     * - modulus can't be zero\\n     * - underlying staticcall to precompile must succeed\\n     *\\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\\n     * interpreted as 0.\\n     */\\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\\n        (bool success, uint256 result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\\n     * to operate modulo 0 or if the underlying precompile reverted.\\n     *\\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\\n     * of a revert, but the result may be incorrectly interpreted as 0.\\n     */\\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\\n        if (m == 0) return (false, 0);\\n        assembly (\\\"memory-safe\\\") {\\n            let ptr := mload(0x40)\\n            // | Offset    | Content    | Content (Hex)                                                      |\\n            // |-----------|------------|--------------------------------------------------------------------|\\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\\n            mstore(ptr, 0x20)\\n            mstore(add(ptr, 0x20), 0x20)\\n            mstore(add(ptr, 0x40), 0x20)\\n            mstore(add(ptr, 0x60), b)\\n            mstore(add(ptr, 0x80), e)\\n            mstore(add(ptr, 0xa0), m)\\n\\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\\n            // so we can use the memory scratch space located at offset 0.\\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\\n            result := mload(0x00)\\n        }\\n    }\\n\\n    /**\\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\\n     */\\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\\n        (bool success, bytes memory result) = tryModExp(b, e, m);\\n        if (!success) {\\n            Panic.panic(Panic.DIVISION_BY_ZERO);\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\\n     */\\n    function tryModExp(\\n        bytes memory b,\\n        bytes memory e,\\n        bytes memory m\\n    ) internal view returns (bool success, bytes memory result) {\\n        if (_zeroBytes(m)) return (false, new bytes(0));\\n\\n        uint256 mLen = m.length;\\n\\n        // Encode call args in result and move the free memory pointer\\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\\n\\n        assembly (\\\"memory-safe\\\") {\\n            let dataPtr := add(result, 0x20)\\n            // Write result on top of args to avoid allocating extra memory.\\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\\n            // Overwrite the length.\\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\\n            mstore(result, mLen)\\n            // Set the memory pointer after the returned data.\\n            mstore(0x40, add(dataPtr, mLen))\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether the provided byte array is zero.\\n     */\\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\\n        for (uint256 i = 0; i < byteArray.length; ++i) {\\n            if (byteArray[i] != 0) {\\n                return false;\\n            }\\n        }\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n     * towards zero.\\n     *\\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\\n     * using integer operations.\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        unchecked {\\n            // Take care of easy edge cases when a == 0 or a == 1\\n            if (a <= 1) {\\n                return a;\\n            }\\n\\n            // In this function, we use Newton's method to get a root of `f(x) := x\\u00b2 - a`. It involves building a\\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\\n            // the current value as `\\u03b5_n = | x_n - sqrt(a) |`.\\n            //\\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\\n            // of the target. (i.e. `2**(e-1) \\u2264 sqrt(a) < 2**e`). We know that `e \\u2264 128` because `(2\\u00b9\\u00b2\\u2078)\\u00b2 = 2\\u00b2\\u2075\\u2076` is\\n            // bigger than any uint256.\\n            //\\n            // By noticing that\\n            // `2**(e-1) \\u2264 sqrt(a) < 2**e \\u2192 (2**(e-1))\\u00b2 \\u2264 a < (2**e)\\u00b2 \\u2192 2**(2*e-2) \\u2264 a < 2**(2*e)`\\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\\n            // to the msb function.\\n            uint256 aa = a;\\n            uint256 xn = 1;\\n\\n            if (aa >= (1 << 128)) {\\n                aa >>= 128;\\n                xn <<= 64;\\n            }\\n            if (aa >= (1 << 64)) {\\n                aa >>= 64;\\n                xn <<= 32;\\n            }\\n            if (aa >= (1 << 32)) {\\n                aa >>= 32;\\n                xn <<= 16;\\n            }\\n            if (aa >= (1 << 16)) {\\n                aa >>= 16;\\n                xn <<= 8;\\n            }\\n            if (aa >= (1 << 8)) {\\n                aa >>= 8;\\n                xn <<= 4;\\n            }\\n            if (aa >= (1 << 4)) {\\n                aa >>= 4;\\n                xn <<= 2;\\n            }\\n            if (aa >= (1 << 2)) {\\n                xn <<= 1;\\n            }\\n\\n            // We now have x_n such that `x_n = 2**(e-1) \\u2264 sqrt(a) < 2**e = 2 * x_n`. This implies \\u03b5_n \\u2264 2**(e-1).\\n            //\\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to \\u03b5_n \\u2264 2**(e-2).\\n            // This is going to be our x_0 (and \\u03b5_0)\\n            xn = (3 * xn) >> 1; // \\u03b5_0 := | x_0 - sqrt(a) | \\u2264 2**(e-2)\\n\\n            // From here, Newton's method give us:\\n            // x_{n+1} = (x_n + a / x_n) / 2\\n            //\\n            // One should note that:\\n            // x_{n+1}\\u00b2 - a = ((x_n + a / x_n) / 2)\\u00b2 - a\\n            //              = ((x_n\\u00b2 + a) / (2 * x_n))\\u00b2 - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2) - a\\n            //              = (x_n\\u2074 + 2 * a * x_n\\u00b2 + a\\u00b2 - 4 * a * x_n\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u2074 - 2 * a * x_n\\u00b2 + a\\u00b2) / (4 * x_n\\u00b2)\\n            //              = (x_n\\u00b2 - a)\\u00b2 / (2 * x_n)\\u00b2\\n            //              = ((x_n\\u00b2 - a) / (2 * x_n))\\u00b2\\n            //              \\u2265 0\\n            // Which proves that for all n \\u2265 1, sqrt(a) \\u2264 x_n\\n            //\\n            // This gives us the proof of quadratic convergence of the sequence:\\n            // \\u03b5_{n+1} = | x_{n+1} - sqrt(a) |\\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\\n            //         = | (x_n\\u00b2 + a - 2*x_n*sqrt(a)) / (2 * x_n) |\\n            //         = | (x_n - sqrt(a))\\u00b2 / (2 * x_n) |\\n            //         = | \\u03b5_n\\u00b2 / (2 * x_n) |\\n            //         = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //\\n            // For the first iteration, we have a special case where x_0 is known:\\n            // \\u03b5_1 = \\u03b5_0\\u00b2 / | (2 * x_0) |\\n            //     \\u2264 (2**(e-2))\\u00b2 / (2 * (2**(e-1) + 2**(e-2)))\\n            //     \\u2264 2**(2*e-4) / (3 * 2**(e-1))\\n            //     \\u2264 2**(e-3) / 3\\n            //     \\u2264 2**(e-3-log2(3))\\n            //     \\u2264 2**(e-4.5)\\n            //\\n            // For the following iterations, we use the fact that, 2**(e-1) \\u2264 sqrt(a) \\u2264 x_n:\\n            // \\u03b5_{n+1} = \\u03b5_n\\u00b2 / | (2 * x_n) |\\n            //         \\u2264 (2**(e-k))\\u00b2 / (2 * 2**(e-1))\\n            //         \\u2264 2**(2*e-2*k) / 2**e\\n            //         \\u2264 2**(e-2*k)\\n            xn = (xn + a / xn) >> 1; // \\u03b5_1 := | x_1 - sqrt(a) | \\u2264 2**(e-4.5)  -- special case, see above\\n            xn = (xn + a / xn) >> 1; // \\u03b5_2 := | x_2 - sqrt(a) | \\u2264 2**(e-9)    -- general case with k = 4.5\\n            xn = (xn + a / xn) >> 1; // \\u03b5_3 := | x_3 - sqrt(a) | \\u2264 2**(e-18)   -- general case with k = 9\\n            xn = (xn + a / xn) >> 1; // \\u03b5_4 := | x_4 - sqrt(a) | \\u2264 2**(e-36)   -- general case with k = 18\\n            xn = (xn + a / xn) >> 1; // \\u03b5_5 := | x_5 - sqrt(a) | \\u2264 2**(e-72)   -- general case with k = 36\\n            xn = (xn + a / xn) >> 1; // \\u03b5_6 := | x_6 - sqrt(a) | \\u2264 2**(e-144)  -- general case with k = 72\\n\\n            // Because e \\u2264 128 (as discussed during the first estimation phase), we know have reached a precision\\n            // \\u03b5_6 \\u2264 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\\n            // sqrt(a) or sqrt(a) + 1.\\n            return xn - SafeCast.toUint(xn > a / xn);\\n        }\\n    }\\n\\n    /**\\n     * @dev 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 + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // If upper 8 bits of 16-bit half set, add 8 to result\\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\\n        // If upper 4 bits of 8-bit half set, add 4 to result\\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\\n\\n        // Shifts value right by the current result and use it as an index into this lookup table:\\n        //\\n        // | x (4 bits) |  index  | table[index] = MSB position |\\n        // |------------|---------|-----------------------------|\\n        // |    0000    |    0    |        table[0] = 0         |\\n        // |    0001    |    1    |        table[1] = 0         |\\n        // |    0010    |    2    |        table[2] = 1         |\\n        // |    0011    |    3    |        table[3] = 1         |\\n        // |    0100    |    4    |        table[4] = 2         |\\n        // |    0101    |    5    |        table[5] = 2         |\\n        // |    0110    |    6    |        table[6] = 2         |\\n        // |    0111    |    7    |        table[7] = 2         |\\n        // |    1000    |    8    |        table[8] = 3         |\\n        // |    1001    |    9    |        table[9] = 3         |\\n        // |    1010    |   10    |        table[10] = 3        |\\n        // |    1011    |   11    |        table[11] = 3        |\\n        // |    1100    |   12    |        table[12] = 3        |\\n        // |    1101    |   13    |        table[13] = 3        |\\n        // |    1110    |   14    |        table[14] = 3        |\\n        // |    1111    |   15    |        table[15] = 3        |\\n        //\\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\\n        assembly (\\\"memory-safe\\\") {\\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\\n        }\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\\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 x) internal pure returns (uint256 r) {\\n        // If value has upper 128 bits set, log2 result is at least 128\\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\\n        // If upper 64 bits of 128-bit half set, add 64 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\\n        // If upper 32 bits of 64-bit half set, add 32 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\\n        // If upper 16 bits of 32-bit half set, add 16 to result\\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\\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 + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n     */\\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n        return uint8(rounding) % 2 == 1;\\n    }\\n}\\n\",\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeCast {\\n    /**\\n     * @dev Value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\\n\\n    /**\\n     * @dev An int value doesn't fit in an uint of `bits` size.\\n     */\\n    error SafeCastOverflowedIntToUint(int256 value);\\n\\n    /**\\n     * @dev Value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\\n\\n    /**\\n     * @dev An uint value doesn't fit in an int of `bits` size.\\n     */\\n    error SafeCastOverflowedUintToInt(uint256 value);\\n\\n    /**\\n     * @dev Returns the downcasted uint248 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint248).\\n     *\\n     * Counterpart to Solidity's `uint248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toUint248(uint256 value) internal pure returns (uint248) {\\n        if (value > type(uint248).max) {\\n            revert SafeCastOverflowedUintDowncast(248, value);\\n        }\\n        return uint248(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint240 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint240).\\n     *\\n     * Counterpart to Solidity's `uint240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toUint240(uint256 value) internal pure returns (uint240) {\\n        if (value > type(uint240).max) {\\n            revert SafeCastOverflowedUintDowncast(240, value);\\n        }\\n        return uint240(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint232 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint232).\\n     *\\n     * Counterpart to Solidity's `uint232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toUint232(uint256 value) internal pure returns (uint232) {\\n        if (value > type(uint232).max) {\\n            revert SafeCastOverflowedUintDowncast(232, value);\\n        }\\n        return uint232(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint224 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint224).\\n     *\\n     * Counterpart to Solidity's `uint224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toUint224(uint256 value) internal pure returns (uint224) {\\n        if (value > type(uint224).max) {\\n            revert SafeCastOverflowedUintDowncast(224, value);\\n        }\\n        return uint224(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint216 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint216).\\n     *\\n     * Counterpart to Solidity's `uint216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toUint216(uint256 value) internal pure returns (uint216) {\\n        if (value > type(uint216).max) {\\n            revert SafeCastOverflowedUintDowncast(216, value);\\n        }\\n        return uint216(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint208 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint208).\\n     *\\n     * Counterpart to Solidity's `uint208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toUint208(uint256 value) internal pure returns (uint208) {\\n        if (value > type(uint208).max) {\\n            revert SafeCastOverflowedUintDowncast(208, value);\\n        }\\n        return uint208(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint200 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint200).\\n     *\\n     * Counterpart to Solidity's `uint200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toUint200(uint256 value) internal pure returns (uint200) {\\n        if (value > type(uint200).max) {\\n            revert SafeCastOverflowedUintDowncast(200, value);\\n        }\\n        return uint200(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint192 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint192).\\n     *\\n     * Counterpart to Solidity's `uint192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toUint192(uint256 value) internal pure returns (uint192) {\\n        if (value > type(uint192).max) {\\n            revert SafeCastOverflowedUintDowncast(192, value);\\n        }\\n        return uint192(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint184 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint184).\\n     *\\n     * Counterpart to Solidity's `uint184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toUint184(uint256 value) internal pure returns (uint184) {\\n        if (value > type(uint184).max) {\\n            revert SafeCastOverflowedUintDowncast(184, value);\\n        }\\n        return uint184(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint176 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint176).\\n     *\\n     * Counterpart to Solidity's `uint176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toUint176(uint256 value) internal pure returns (uint176) {\\n        if (value > type(uint176).max) {\\n            revert SafeCastOverflowedUintDowncast(176, value);\\n        }\\n        return uint176(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint168 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint168).\\n     *\\n     * Counterpart to Solidity's `uint168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toUint168(uint256 value) internal pure returns (uint168) {\\n        if (value > type(uint168).max) {\\n            revert SafeCastOverflowedUintDowncast(168, value);\\n        }\\n        return uint168(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint160 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint160).\\n     *\\n     * Counterpart to Solidity's `uint160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toUint160(uint256 value) internal pure returns (uint160) {\\n        if (value > type(uint160).max) {\\n            revert SafeCastOverflowedUintDowncast(160, value);\\n        }\\n        return uint160(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint152 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint152).\\n     *\\n     * Counterpart to Solidity's `uint152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toUint152(uint256 value) internal pure returns (uint152) {\\n        if (value > type(uint152).max) {\\n            revert SafeCastOverflowedUintDowncast(152, value);\\n        }\\n        return uint152(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint144 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint144).\\n     *\\n     * Counterpart to Solidity's `uint144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toUint144(uint256 value) internal pure returns (uint144) {\\n        if (value > type(uint144).max) {\\n            revert SafeCastOverflowedUintDowncast(144, value);\\n        }\\n        return uint144(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint136 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint136).\\n     *\\n     * Counterpart to Solidity's `uint136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toUint136(uint256 value) internal pure returns (uint136) {\\n        if (value > type(uint136).max) {\\n            revert SafeCastOverflowedUintDowncast(136, value);\\n        }\\n        return uint136(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        if (value > type(uint128).max) {\\n            revert SafeCastOverflowedUintDowncast(128, value);\\n        }\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint120 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint120).\\n     *\\n     * Counterpart to Solidity's `uint120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toUint120(uint256 value) internal pure returns (uint120) {\\n        if (value > type(uint120).max) {\\n            revert SafeCastOverflowedUintDowncast(120, value);\\n        }\\n        return uint120(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint112 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint112).\\n     *\\n     * Counterpart to Solidity's `uint112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toUint112(uint256 value) internal pure returns (uint112) {\\n        if (value > type(uint112).max) {\\n            revert SafeCastOverflowedUintDowncast(112, value);\\n        }\\n        return uint112(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint104 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint104).\\n     *\\n     * Counterpart to Solidity's `uint104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toUint104(uint256 value) internal pure returns (uint104) {\\n        if (value > type(uint104).max) {\\n            revert SafeCastOverflowedUintDowncast(104, value);\\n        }\\n        return uint104(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint96 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint96).\\n     *\\n     * Counterpart to Solidity's `uint96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toUint96(uint256 value) internal pure returns (uint96) {\\n        if (value > type(uint96).max) {\\n            revert SafeCastOverflowedUintDowncast(96, value);\\n        }\\n        return uint96(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint88 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint88).\\n     *\\n     * Counterpart to Solidity's `uint88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toUint88(uint256 value) internal pure returns (uint88) {\\n        if (value > type(uint88).max) {\\n            revert SafeCastOverflowedUintDowncast(88, value);\\n        }\\n        return uint88(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint80 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint80).\\n     *\\n     * Counterpart to Solidity's `uint80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toUint80(uint256 value) internal pure returns (uint80) {\\n        if (value > type(uint80).max) {\\n            revert SafeCastOverflowedUintDowncast(80, value);\\n        }\\n        return uint80(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint72 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint72).\\n     *\\n     * Counterpart to Solidity's `uint72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toUint72(uint256 value) internal pure returns (uint72) {\\n        if (value > type(uint72).max) {\\n            revert SafeCastOverflowedUintDowncast(72, value);\\n        }\\n        return uint72(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        if (value > type(uint64).max) {\\n            revert SafeCastOverflowedUintDowncast(64, value);\\n        }\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint56 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint56).\\n     *\\n     * Counterpart to Solidity's `uint56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toUint56(uint256 value) internal pure returns (uint56) {\\n        if (value > type(uint56).max) {\\n            revert SafeCastOverflowedUintDowncast(56, value);\\n        }\\n        return uint56(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint48 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint48).\\n     *\\n     * Counterpart to Solidity's `uint48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toUint48(uint256 value) internal pure returns (uint48) {\\n        if (value > type(uint48).max) {\\n            revert SafeCastOverflowedUintDowncast(48, value);\\n        }\\n        return uint48(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint40 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint40).\\n     *\\n     * Counterpart to Solidity's `uint40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toUint40(uint256 value) internal pure returns (uint40) {\\n        if (value > type(uint40).max) {\\n            revert SafeCastOverflowedUintDowncast(40, value);\\n        }\\n        return uint40(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        if (value > type(uint32).max) {\\n            revert SafeCastOverflowedUintDowncast(32, value);\\n        }\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint24 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint24).\\n     *\\n     * Counterpart to Solidity's `uint24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toUint24(uint256 value) internal pure returns (uint24) {\\n        if (value > type(uint24).max) {\\n            revert SafeCastOverflowedUintDowncast(24, value);\\n        }\\n        return uint24(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        if (value > type(uint16).max) {\\n            revert SafeCastOverflowedUintDowncast(16, value);\\n        }\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        if (value > type(uint8).max) {\\n            revert SafeCastOverflowedUintDowncast(8, value);\\n        }\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        if (value < 0) {\\n            revert SafeCastOverflowedIntToUint(value);\\n        }\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int248 from int256, reverting on\\n     * overflow (when the input is less than smallest int248 or\\n     * greater than largest int248).\\n     *\\n     * Counterpart to Solidity's `int248` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 248 bits\\n     */\\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n        downcasted = int248(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(248, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int240 from int256, reverting on\\n     * overflow (when the input is less than smallest int240 or\\n     * greater than largest int240).\\n     *\\n     * Counterpart to Solidity's `int240` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 240 bits\\n     */\\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n        downcasted = int240(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(240, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int232 from int256, reverting on\\n     * overflow (when the input is less than smallest int232 or\\n     * greater than largest int232).\\n     *\\n     * Counterpart to Solidity's `int232` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 232 bits\\n     */\\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n        downcasted = int232(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(232, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int224 from int256, reverting on\\n     * overflow (when the input is less than smallest int224 or\\n     * greater than largest int224).\\n     *\\n     * Counterpart to Solidity's `int224` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 224 bits\\n     */\\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n        downcasted = int224(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(224, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int216 from int256, reverting on\\n     * overflow (when the input is less than smallest int216 or\\n     * greater than largest int216).\\n     *\\n     * Counterpart to Solidity's `int216` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 216 bits\\n     */\\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n        downcasted = int216(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(216, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int208 from int256, reverting on\\n     * overflow (when the input is less than smallest int208 or\\n     * greater than largest int208).\\n     *\\n     * Counterpart to Solidity's `int208` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 208 bits\\n     */\\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n        downcasted = int208(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(208, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int200 from int256, reverting on\\n     * overflow (when the input is less than smallest int200 or\\n     * greater than largest int200).\\n     *\\n     * Counterpart to Solidity's `int200` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 200 bits\\n     */\\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n        downcasted = int200(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(200, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int192 from int256, reverting on\\n     * overflow (when the input is less than smallest int192 or\\n     * greater than largest int192).\\n     *\\n     * Counterpart to Solidity's `int192` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 192 bits\\n     */\\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n        downcasted = int192(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(192, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int184 from int256, reverting on\\n     * overflow (when the input is less than smallest int184 or\\n     * greater than largest int184).\\n     *\\n     * Counterpart to Solidity's `int184` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 184 bits\\n     */\\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n        downcasted = int184(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(184, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int176 from int256, reverting on\\n     * overflow (when the input is less than smallest int176 or\\n     * greater than largest int176).\\n     *\\n     * Counterpart to Solidity's `int176` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 176 bits\\n     */\\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n        downcasted = int176(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(176, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int168 from int256, reverting on\\n     * overflow (when the input is less than smallest int168 or\\n     * greater than largest int168).\\n     *\\n     * Counterpart to Solidity's `int168` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 168 bits\\n     */\\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n        downcasted = int168(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(168, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int160 from int256, reverting on\\n     * overflow (when the input is less than smallest int160 or\\n     * greater than largest int160).\\n     *\\n     * Counterpart to Solidity's `int160` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 160 bits\\n     */\\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n        downcasted = int160(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(160, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int152 from int256, reverting on\\n     * overflow (when the input is less than smallest int152 or\\n     * greater than largest int152).\\n     *\\n     * Counterpart to Solidity's `int152` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 152 bits\\n     */\\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n        downcasted = int152(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(152, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int144 from int256, reverting on\\n     * overflow (when the input is less than smallest int144 or\\n     * greater than largest int144).\\n     *\\n     * Counterpart to Solidity's `int144` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 144 bits\\n     */\\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n        downcasted = int144(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(144, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int136 from int256, reverting on\\n     * overflow (when the input is less than smallest int136 or\\n     * greater than largest int136).\\n     *\\n     * Counterpart to Solidity's `int136` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 136 bits\\n     */\\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n        downcasted = int136(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(136, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n        downcasted = int128(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(128, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int120 from int256, reverting on\\n     * overflow (when the input is less than smallest int120 or\\n     * greater than largest int120).\\n     *\\n     * Counterpart to Solidity's `int120` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 120 bits\\n     */\\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n        downcasted = int120(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(120, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int112 from int256, reverting on\\n     * overflow (when the input is less than smallest int112 or\\n     * greater than largest int112).\\n     *\\n     * Counterpart to Solidity's `int112` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 112 bits\\n     */\\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n        downcasted = int112(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(112, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int104 from int256, reverting on\\n     * overflow (when the input is less than smallest int104 or\\n     * greater than largest int104).\\n     *\\n     * Counterpart to Solidity's `int104` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 104 bits\\n     */\\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n        downcasted = int104(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(104, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int96 from int256, reverting on\\n     * overflow (when the input is less than smallest int96 or\\n     * greater than largest int96).\\n     *\\n     * Counterpart to Solidity's `int96` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 96 bits\\n     */\\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n        downcasted = int96(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(96, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int88 from int256, reverting on\\n     * overflow (when the input is less than smallest int88 or\\n     * greater than largest int88).\\n     *\\n     * Counterpart to Solidity's `int88` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 88 bits\\n     */\\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n        downcasted = int88(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(88, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int80 from int256, reverting on\\n     * overflow (when the input is less than smallest int80 or\\n     * greater than largest int80).\\n     *\\n     * Counterpart to Solidity's `int80` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 80 bits\\n     */\\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n        downcasted = int80(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(80, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int72 from int256, reverting on\\n     * overflow (when the input is less than smallest int72 or\\n     * greater than largest int72).\\n     *\\n     * Counterpart to Solidity's `int72` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 72 bits\\n     */\\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n        downcasted = int72(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(72, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n        downcasted = int64(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(64, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int56 from int256, reverting on\\n     * overflow (when the input is less than smallest int56 or\\n     * greater than largest int56).\\n     *\\n     * Counterpart to Solidity's `int56` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 56 bits\\n     */\\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n        downcasted = int56(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(56, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int48 from int256, reverting on\\n     * overflow (when the input is less than smallest int48 or\\n     * greater than largest int48).\\n     *\\n     * Counterpart to Solidity's `int48` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 48 bits\\n     */\\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n        downcasted = int48(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(48, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int40 from int256, reverting on\\n     * overflow (when the input is less than smallest int40 or\\n     * greater than largest int40).\\n     *\\n     * Counterpart to Solidity's `int40` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 40 bits\\n     */\\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n        downcasted = int40(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(40, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n        downcasted = int32(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(32, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int24 from int256, reverting on\\n     * overflow (when the input is less than smallest int24 or\\n     * greater than largest int24).\\n     *\\n     * Counterpart to Solidity's `int24` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 24 bits\\n     */\\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n        downcasted = int24(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(24, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n        downcasted = int16(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(16, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits\\n     */\\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n        downcasted = int8(value);\\n        if (downcasted != value) {\\n            revert SafeCastOverflowedIntDowncast(8, value);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n        if (value > uint256(type(int256).max)) {\\n            revert SafeCastOverflowedUintToInt(value);\\n        }\\n        return int256(value);\\n    }\\n\\n    /**\\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\\n     */\\n    function toUint(bool b) internal pure returns (uint256 u) {\\n        assembly (\\\"memory-safe\\\") {\\n            u := iszero(iszero(b))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {SafeCast} from \\\"./SafeCast.sol\\\";\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n    /**\\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\\n     *\\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\\n     * one branch when needed, making this function more expensive.\\n     */\\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\\n        unchecked {\\n            // branchless ternary works because:\\n            // b ^ (a ^ b) == a\\n            // b ^ 0 == b\\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two signed numbers.\\n     */\\n    function max(int256 a, int256 b) internal pure returns (int256) {\\n        return ternary(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 ternary(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            // Formula from the \\\"Bit Twiddling Hacks\\\" by Sean Eron Anderson.\\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\\n            // taking advantage of the most significant (or \\\"sign\\\" bit) in two's complement representation.\\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\\n            int256 mask = n >> 255;\\n\\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\\n            return uint256((n + mask) ^ mask);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Strings} from \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\n\\n/// @title TokenMetadataResolverWithBaseURI.\\n/// @notice Token Metadata Resolver which uses a base metadata URI concatenated with the token identifier to produce a token metadata URI.\\n/// @notice Only the owner of the target token contract can set the base metadata URI for this target contract.\\ncontract TokenMetadataResolverWithBaseURI is ITokenMetadataResolver {\\n    using ContractOwnershipStorage for address;\\n    using Strings for uint256;\\n\\n    mapping(address => string) public baseMetadataURI;\\n\\n    /// @notice Emitted when the base metadata URI is set.\\n    /// @param tokenContract The token contract on which the base metadata URI was set.\\n    /// @param baseMetadataURI The base metadata URI.\\n    event BaseMetadataURISet(address tokenContract, string baseMetadataURI);\\n\\n    /// @notice Sets the base metadata URI.\\n    /// @dev Reverts with {NotTargetContractOwner} if the sender is not the owner of the token contract.\\n    /// @dev Emits a {BaseMetadataURISet} event.\\n    /// @param tokenContract The token contract on which to set the base metadata URI.\\n    /// @param baseURI The base metadata URI.\\n    function setBaseMetadataURI(address tokenContract, string calldata baseURI) external {\\n        tokenContract.enforceIsTargetContractOwner(msg.sender);\\n        baseMetadataURI[tokenContract] = baseURI;\\n        emit BaseMetadataURISet(tokenContract, baseURI);\\n    }\\n\\n    /// @notice Gets the token metadata URI for a token as the concatenation of the base metadata URI and the token identifier.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI as the concatenation of the base metadata URI and the token identifier.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI) {\\n        return string(abi.encodePacked(baseMetadataURI[tokenContract], tokenId.toString()));\\n    }\\n}\\n\",\"keccak256\":\"0x7f75f9bc803bb906de536d7a7b0af68bc942174147070c976df43d608f3888ab\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[{"astId":36572,"contract":"contracts/token/metadata/TokenMetadataResolverWithBaseURI.sol:TokenMetadataResolverWithBaseURI","label":"baseMetadataURI","offset":0,"slot":"0","type":"t_mapping(t_address,t_string_storage)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_mapping(t_address,t_string_storage)":{"encoding":"mapping","key":"t_address","label":"mapping(address => string)","numberOfBytes":"32","value":"t_string_storage"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"}}},"userdoc":{"errors":{"NotTargetContractOwner(address,address)":[{"notice":"Thrown when an account is not the target contract owner but is required to."}],"TargetIsNotAContract(address)":[{"notice":"Thrown when the target contract is actually not a contract."}]},"events":{"BaseMetadataURISet(address,string)":{"notice":"Emitted when the base metadata URI is set."}},"kind":"user","methods":{"setBaseMetadataURI(address,string)":{"notice":"Sets the base metadata URI."},"tokenMetadataURI(address,uint256)":{"notice":"Gets the token metadata URI for a token as the concatenation of the base metadata URI and the token identifier."}},"notice":"Token Metadata Resolver which uses a base metadata URI concatenated with the token identifier to produce a token metadata URI.Only the owner of the target token contract can set the base metadata URI for this target contract.","version":1}}},"contracts/token/metadata/base/TokenMetadataBase.sol":{"TokenMetadataBase":{"abi":[{"inputs":[],"name":"metadataResolver","outputs":[{"internalType":"contract ITokenMetadataResolver","name":"tokenMetadataResolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.","kind":"dev","methods":{"metadataResolver()":{"returns":{"tokenMetadataResolver":"The token metadata resolver address."}},"name()":{"returns":{"tokenName":"The token name."}},"symbol()":{"returns":{"tokenSymbol":"The token symbol."}}},"title":"TokenMetadataBase (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"metadataResolver()":"a0c76f62","name()":"06fdde03","symbol()":"95d89b41"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"metadataResolver\",\"outputs\":[{\"internalType\":\"contract ITokenMetadataResolver\",\"name\":\"tokenMetadataResolver\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.\",\"kind\":\"dev\",\"methods\":{\"metadataResolver()\":{\"returns\":{\"tokenMetadataResolver\":\"The token metadata resolver address.\"}},\"name()\":{\"returns\":{\"tokenName\":\"The token name.\"}},\"symbol()\":{\"returns\":{\"tokenSymbol\":\"The token symbol.\"}}},\"title\":\"TokenMetadataBase (proxiable version).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"metadataResolver()\":{\"notice\":\"Gets the token metadata resolver address.\"},\"name()\":{\"notice\":\"Gets the token name. E.g. \\\"My Token\\\".\"},\"symbol()\":{\"notice\":\"Gets the token symbol. E.g. \\\"TOK\\\".\"}},\"notice\":\"Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/base/TokenMetadataBase.sol\":\"TokenMetadataBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/metadata/base/TokenMetadataBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {TokenMetadataStorage} from \\\"./../libraries/TokenMetadataStorage.sol\\\";\\n\\n/// @title TokenMetadataBase (proxiable version).\\n/// @notice Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\nabstract contract TokenMetadataBase {\\n    using TokenMetadataStorage for TokenMetadataStorage.Layout;\\n\\n    /// @notice Gets the token name. E.g. \\\"My Token\\\".\\n    /// @return tokenName The token name.\\n    function name() public view virtual returns (string memory tokenName) {\\n        return TokenMetadataStorage.layout().name();\\n    }\\n\\n    /// @notice Gets the token symbol. E.g. \\\"TOK\\\".\\n    /// @return tokenSymbol The token symbol.\\n    function symbol() public view virtual returns (string memory tokenSymbol) {\\n        return TokenMetadataStorage.layout().symbol();\\n    }\\n\\n    /// @notice Gets the token metadata resolver address.\\n    /// @return tokenMetadataResolver The token metadata resolver address.\\n    function metadataResolver() external view virtual returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return TokenMetadataStorage.layout().metadataResolver();\\n    }\\n}\\n\",\"keccak256\":\"0xcf590af21c8488db6b25b84aabec35ad8a6edf90f2631d25b5327436a550c1ae\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"metadataResolver()":{"notice":"Gets the token metadata resolver address."},"name()":{"notice":"Gets the token name. E.g. \"My Token\"."},"symbol()":{"notice":"Gets the token symbol. E.g. \"TOK\"."}},"notice":"Provides metadata management for token contracts (ERC721/ERC1155) which uses an external resolver for managing individual tokens metadata.","version":1}}},"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol":{"ITokenMetadataResolver":{"abi":[{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadataURI","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"tokenMetadataURI(address,uint256)":{"params":{"tokenContract":"The token contract for which to retrieve the token URI.","tokenId":"The token identifier."},"returns":{"tokenURI":"The token metadata URI."}}},"title":"ITokenMetadataResolver","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"tokenMetadataURI(address,uint256)":"f724dad7"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenMetadataURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"tokenMetadataURI(address,uint256)\":{\"params\":{\"tokenContract\":\"The token contract for which to retrieve the token URI.\",\"tokenId\":\"The token identifier.\"},\"returns\":{\"tokenURI\":\"The token metadata URI.\"}}},\"title\":\"ITokenMetadataResolver\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"tokenMetadataURI(address,uint256)\":{\"notice\":\"Gets the token metadata URI for a token.\"}},\"notice\":\"Interface for Token Metadata Resolvers.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":\"ITokenMetadataResolver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"tokenMetadataURI(address,uint256)":{"notice":"Gets the token metadata URI for a token."}},"notice":"Interface for Token Metadata Resolvers.","version":1}}},"contracts/token/metadata/libraries/TokenMetadataStorage.sol":{"TokenMetadataStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212208fa7ec0cd8292eaece54ea11f57563c7eaee12437fff9d7befd0c5c463368b6a64736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 0xA7 EOFCREATE 0xC 0xD8 0x29 0x2E 0xAE 0xCE SLOAD 0xEA GT CREATE2 PUSH22 0x63C7EAEE12437FFF9D7BEFD0C5C463368B6A64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"230:3387:341:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212208fa7ec0cd8292eaece54ea11f57563c7eaee12437fff9d7befd0c5c463368b6a64736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 0xA7 EOFCREATE 0xC 0xD8 0x29 0x2E 0xAE 0xCE SLOAD 0xEA GT CREATE2 PUSH22 0x63C7EAEE12437FFF9D7BEFD0C5C463368B6A64736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"230:3387:341:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"constructorInit(struct TokenMetadataStorage.Layout storage pointer,string memory,string memory,contract ITokenMetadataResolver)":"infinite","layout()":"infinite","metadataResolver(struct TokenMetadataStorage.Layout storage pointer)":"infinite","name(struct TokenMetadataStorage.Layout storage pointer)":"infinite","proxyInit(struct TokenMetadataStorage.Layout storage pointer,string calldata,string calldata,contract ITokenMetadataResolver)":"infinite","symbol(struct TokenMetadataStorage.Layout storage pointer)":"infinite","tokenMetadataURI(struct TokenMetadataStorage.Layout storage pointer,address,uint256)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":\"TokenMetadataStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/metadata/interfaces/ITokenMetadataResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ITokenMetadataResolver\\n/// @notice Interface for Token Metadata Resolvers.\\ninterface ITokenMetadataResolver {\\n    /// @notice Gets the token metadata URI for a token.\\n    /// @param tokenContract The token contract for which to retrieve the token URI.\\n    /// @param tokenId The token identifier.\\n    /// @return tokenURI The token metadata URI.\\n    function tokenMetadataURI(address tokenContract, uint256 tokenId) external view returns (string memory tokenURI);\\n}\\n\",\"keccak256\":\"0x1ebd3af108150b762be9ff89452e3fff1d295ce20564879ef4b66af06a89316f\",\"license\":\"MIT\"},\"contracts/token/metadata/libraries/TokenMetadataStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ITokenMetadataResolver} from \\\"./../interfaces/ITokenMetadataResolver.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary TokenMetadataStorage {\\n    struct Layout {\\n        string tokenName;\\n        string tokenSymbol;\\n        ITokenMetadataResolver tokenMetadataResolver;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.metadata.TokenMetadata.phase\\\")) - 1);\\n\\n    /// @notice Initializes the metadata storage (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function constructorInit(\\n        Layout storage s,\\n        string memory tokenName,\\n        string memory tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Initializes the metadata storage (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param tokenName The token name.\\n    /// @param tokenSymbol The token symbol.\\n    /// @param tokenMetadataResolver The address of the metadata resolver contract.\\n    function proxyInit(\\n        Layout storage s,\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        ITokenMetadataResolver tokenMetadataResolver\\n    ) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.tokenName = tokenName;\\n        s.tokenSymbol = tokenSymbol;\\n        s.tokenMetadataResolver = tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the name of the token.\\n    /// @return tokenName The name of the token contract.\\n    function name(Layout storage s) internal view returns (string memory tokenName) {\\n        return s.tokenName;\\n    }\\n\\n    /// @notice Gets the symbol of the token.\\n    /// @return tokenSymbol The symbol of the token contract.\\n    function symbol(Layout storage s) internal view returns (string memory tokenSymbol) {\\n        return s.tokenSymbol;\\n    }\\n\\n    /// @notice Gets the address of the token metadata resolver.\\n    /// @return tokenMetadataResolver The address of the token metadata resolver.\\n    function metadataResolver(Layout storage s) internal view returns (ITokenMetadataResolver tokenMetadataResolver) {\\n        return s.tokenMetadataResolver;\\n    }\\n\\n    /// @notice Gets the token metadata URI retieved from the metadata resolver contract.\\n    /// @param tokenContract The address of the token contract.\\n    /// @param tokenId The ID of the token.\\n    function tokenMetadataURI(Layout storage s, address tokenContract, uint256 tokenId) internal view returns (string memory) {\\n        return s.tokenMetadataResolver.tokenMetadataURI(tokenContract, tokenId);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf679657f6e13fbdc24d294de402f30092db8842261dec752c4a0606d1a4fbb24\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/royalty/ERC2981.sol":{"ERC2981":{"abi":[{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"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":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in an immutable (non-proxied) implementation.","errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"events":{"OwnershipTransferred(address,address)":{"params":{"newOwner":"the new contract owner.","previousOwner":"the previous contract owner."}}},"kind":"dev","methods":{"owner()":{"returns":{"_0":"The address of the contract owner."}},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}},"supportsInterface(bytes4)":{"details":"Note: This function call must use less than 30 000 gas.","params":{"interfaceId":"the interface identifier to test."},"returns":{"_0":"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported."}},"transferOwnership(address)":{"details":"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.","params":{"newOwner":"The address of the new contract owner. Using the zero address means renouncing ownership."}}},"title":"ERC2981 NFT Royalty Standard (immutable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","owner()":"8da5cb5b","royaltyInfo(uint256,uint256)":"2a55205a","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3","supportsInterface(bytes4)":"01ffc9a7","transferOwnership(address)":"f2fde38b"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"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\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"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\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in an immutable (non-proxied) implementation.\",\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"params\":{\"newOwner\":\"the new contract owner.\",\"previousOwner\":\"the previous contract owner.\"}}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"returns\":{\"_0\":\"The address of the contract owner.\"}},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Note: This function call must use less than 30 000 gas.\",\"params\":{\"interfaceId\":\"the interface identifier to test.\"},\"returns\":{\"_0\":\"True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\"}},\"transferOwnership(address)\":{\"details\":\"Reverts if the sender is not the contract owner.Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\",\"params\":{\"newOwner\":\"The address of the new contract owner. Using the zero address means renouncing ownership.\"}}},\"title\":\"ERC2981 NFT Royalty Standard (immutable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"events\":{\"OwnershipTransferred(address,address)\":{\"notice\":\"Emitted when the contract ownership changes.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC2981.\"},\"owner()\":{\"notice\":\"Gets the address of the contract owner.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Returns whether this contract implements a given interface.\"},\"transferOwnership(address)\":{\"notice\":\"Sets the address of the new contract owner.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/ERC2981.sol\":\"ERC2981\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/ContractOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ContractOwnershipStorage} from \\\"./libraries/ContractOwnershipStorage.sol\\\";\\nimport {ContractOwnershipBase} from \\\"./base/ContractOwnershipBase.sol\\\";\\nimport {InterfaceDetection} from \\\"./../introspection/InterfaceDetection.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (immutable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ContractOwnership is ContractOwnershipBase, InterfaceDetection {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Initializes the storage with an initial contract owner.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner the initial contract owner.\\n    constructor(address initialOwner) {\\n        ContractOwnershipStorage.layout().constructorInit(initialOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x3c9232b40e169f5f14cb7e5115a202e2ee23aa2f0a6cff0aa3ec45f4989233d9\",\"license\":\"MIT\"},\"contracts/access/base/ContractOwnershipBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC173 Contract Ownership Standard (proxiable version).\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\nabstract contract ContractOwnershipBase is IERC173, Context {\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @inheritdoc IERC173\\n    function owner() public view virtual returns (address) {\\n        return ContractOwnershipStorage.layout().owner();\\n    }\\n\\n    /// @inheritdoc IERC173\\n    function transferOwnership(address newOwner) public virtual {\\n        ContractOwnershipStorage.layout().transferOwnership(_msgSender(), newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x13276cf5531c43422e812af292274ce2c129231bfb2a061bdc4ea7d84cfce1ea\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/InterfaceDetection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC165} from \\\"./interfaces/IERC165.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./libraries/InterfaceDetectionStorage.sol\\\";\\n\\n/// @title ERC165 Interface Detection Standard (immutable or proxiable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) or proxied implementation.\\nabstract contract InterfaceDetection is IERC165 {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    /// @inheritdoc IERC165\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool) {\\n        return InterfaceDetectionStorage.layout().supportsInterface(interfaceId);\\n    }\\n}\\n\",\"keccak256\":\"0xe354c1a6cda80cd07b511f86a4c4fa1ba5171fb855ce640f5736eee508a45544\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981Storage} from \\\"./libraries/ERC2981Storage.sol\\\";\\nimport {ERC2981Base} from \\\"./base/ERC2981Base.sol\\\";\\nimport {ContractOwnership} from \\\"./../../access/ContractOwnership.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (immutable version).\\n/// @dev This contract is to be used via inheritance in an immutable (non-proxied) implementation.\\nabstract contract ERC2981 is ERC2981Base, ContractOwnership {\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    constructor() {\\n        ERC2981Storage.init();\\n    }\\n}\\n\",\"keccak256\":\"0x0b62d549373e92a25d47aa69cbf58bf08aa089fcb4b73cd5f42c3de5df391a89\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"events":{"OwnershipTransferred(address,address)":{"notice":"Emitted when the contract ownership changes."}},"kind":"user","methods":{"constructor":{"notice":"Marks the following ERC165 interface(s) as supported: ERC2981."},"owner()":{"notice":"Gets the address of the contract owner."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."},"supportsInterface(bytes4)":{"notice":"Returns whether this contract implements a given interface."},"transferOwnership(address)":{"notice":"Sets the address of the new contract owner."}},"version":1}}},"contracts/token/royalty/base/ERC2981Base.sol":{"ERC2981Base":{"abi":[{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}}},"title":"ERC2981 NFT Royalty Standard (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","royaltyInfo(uint256,uint256)":"2a55205a","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC165 (Interface Detection Standard).Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}}},\"title\":\"ERC2981 NFT Royalty Standard (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/base/ERC2981Base.sol\":\"ERC2981Base\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."}},"version":1}}},"contracts/token/royalty/base/OperatorFiltererBase.sol":{"OperatorFiltererBase":{"abi":[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).","errors":{"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"Operator Filterer for token contracts (proxiable version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"operatorFilterRegistry()":"b0ccc31e","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used via inheritance in a proxied implementation.Note: This contract requires ERC173 (Contract Ownership standard).\",\"errors\":{\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"Operator Filterer for token contracts (proxiable version).\",\"version\":1},\"userdoc\":{\"errors\":{\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/base/OperatorFiltererBase.sol\":\"OperatorFiltererBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}]},"kind":"user","methods":{"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/royalty/facets/ERC2981Facet.sol":{"ERC2981Facet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"ERC2981IncorrectRoyaltyPercentage","type":"error"},{"inputs":[],"name":"ERC2981IncorrectRoyaltyReceiver","type":"error"},{"inputs":[],"name":"IllegalInterfaceId","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[],"name":"ROYALTY_FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initERC2981","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"uint256","name":"percentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}.","errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"params":{"percentage":"The royalty percentage that was attempted to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initERC2981()":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin."},"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}},"setRoyaltyPercentage(uint256)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).","params":{"percentage":"The new percentage to set. For example 50000 sets 50% royalty."}},"setRoyaltyReceiver(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.","params":{"receiver":"The new receiver to set."}}},"title":"ERC2981 NFT Royalty Standard (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f61079638819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161071490816100828239608051816105510152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80632a55205a1461042e57806361ba27da146103125780638dc251e3146101ce578063d60da201146100945763e1a8bf2c1461005357600080fd5b3461008f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576020604051620186a08152f35b600080fd5b3461008f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576100cb61053a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101a1577f2a55205a000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e52080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361008f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061025d61053a565b92541691169081036102e557507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579080156102bb5781547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061038361053a565b92541691169081036102e557507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161040157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f5760406024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c811580156104f0575b156104be57505060005b73ffffffffffffffffffffffffffffffffffffffff8351921682526020820152f35b620186a08210156104dd576104d790620186a0926104f8565b0461049c565b620186a06104eb92046104f8565b61049c565b508015610492565b8181029291811591840414171561050b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106cf5732331480156106d4575b6106cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105c5575b506105c257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106c357600091610620575b50386105b8565b60203d6020116106bc575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761068f5760209183916040528101031261068b5751908115158203610688575038610619565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61062b565b6040513d6000823e3d90fd5b503390565b506018361061058156fea2646970667358221220f73e68b0677b0b0c979113ca7025dd1374c733bef7d0e815b58fc33afe1394cb64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x796 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x714 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x551 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2A55205A EQ PUSH2 0x42E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0xD60DA201 EQ PUSH2 0x94 JUMPI PUSH4 0xE1A8BF2C EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH2 0xCB PUSH2 0x53A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x8F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25D PUSH2 0x53A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E5 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 DUP1 ISZERO PUSH2 0x2BB JUMPI DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x383 PUSH2 0x53A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E5 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x401 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x40 PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR DUP2 ISZERO DUP1 ISZERO PUSH2 0x4F0 JUMPI JUMPDEST ISZERO PUSH2 0x4BE JUMPI POP POP PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 MLOAD SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE RETURN JUMPDEST PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x4DD JUMPI PUSH2 0x4D7 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x4F8 JUMP JUMPDEST DIV PUSH2 0x49C JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x4EB SWAP3 DIV PUSH2 0x4F8 JUMP JUMPDEST PUSH2 0x49C JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x492 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x50B JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6CF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6D4 JUMPI JUMPDEST PUSH2 0x6CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5C5 JUMPI JUMPDEST POP PUSH2 0x5C2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6C3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x620 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5B8 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6BC JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x68F JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x68B JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x688 JUMPI POP CODESIZE PUSH2 0x619 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x62B JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x581 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 RETURNDATACOPY PUSH9 0xB0677B0B0C979113CA PUSH17 0x25DD1374C733BEF7D0E815B58FC33AFE13 SWAP5 0xCB PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"817:1002:347:-:0;;;;;;;;;;;;;-1:-1:-1;;817:1002:347;;;;-1:-1:-1;;;;;817:1002:347;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;817:1002:347;;;;;;745:39:76;;817:1002:347;;;;;;;;745:39:76;817:1002:347;;;;;;;-1:-1:-1;817:1002:347;;;;;;-1:-1:-1;817:1002:347;;;;;-1:-1:-1;817:1002:347"},"deployedBytecode":{"functionDebugData":{"checked_mul_uint256":{"entryPoint":1272,"id":null,"parameterSlots":2,"returnSlots":1},"fun_msgSender":{"entryPoint":1338,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":1361}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c80632a55205a1461042e57806361ba27da146103125780638dc251e3146101ce578063d60da201146100945763e1a8bf2c1461005357600080fd5b3461008f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576020604051620186a08152f35b600080fd5b3461008f5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576100cb61053a565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103541691169081036101a1577f2a55205a000000000000000000000000000000000000000000000000000000006000527fca9d3e17f264b0f3984e2634e94adb37fa3e6a8103f06aeae6fa59e21c769f5d6020527f2d8b44ae6eaa7ac3b154622dbcfc94b3609ce793bb4cffd595b15ac18d28e52080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361008f577fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061025d61053a565b92541691169081036102e557507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b800078268579080156102bb5781547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7f16de0c800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f576004357fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc73ffffffffffffffffffffffffffffffffffffffff8061038361053a565b92541691169081036102e557507f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685790620186a0811161040157815473ffffffffffffffffffffffffffffffffffffffff1660a09190911b7fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fac0404080000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461008f5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008f5760406024357f2c0cf10337caabbd02dcf226f05f5fd19a0919a41a8df8958c39b8000782685754908160a01c811580156104f0575b156104be57505060005b73ffffffffffffffffffffffffffffffffffffffff8351921682526020820152f35b620186a08210156104dd576104d790620186a0926104f8565b0461049c565b620186a06104eb92046104f8565b61049c565b508015610492565b8181029291811591840414171561050b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156106cf5732331480156106d4575b6106cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156105c5575b506105c257503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156106c357600091610620575b50386105b8565b60203d6020116106bc575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff82111761068f5760209183916040528101031261068b5751908115158203610688575038610619565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61062b565b6040513d6000823e3d90fd5b503390565b506018361061058156fea2646970667358221220f73e68b0677b0b0c979113ca7025dd1374c733bef7d0e815b58fc33afe1394cb64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2A55205A EQ PUSH2 0x42E JUMPI DUP1 PUSH4 0x61BA27DA EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x8DC251E3 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0xD60DA201 EQ PUSH2 0x94 JUMPI PUSH4 0xE1A8BF2C EQ PUSH2 0x53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x20 PUSH1 0x40 MLOAD PUSH3 0x186A0 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH2 0xCB PUSH2 0x53A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x1A1 JUMPI PUSH32 0x2A55205A00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH32 0xCA9D3E17F264B0F3984E2634E94ADB37FA3E6A8103F06AEAE6FA59E21C769F5D PUSH1 0x20 MSTORE PUSH32 0x2D8B44AE6EAA7AC3B154622DBCFC94B3609CE793BB4CFFD595B15AC18D28E520 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0x8F JUMPI PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x25D PUSH2 0x53A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E5 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 DUP1 ISZERO PUSH2 0x2BB JUMPI DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x16DE0C8000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x4 CALLDATALOAD PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH2 0x383 PUSH2 0x53A JUMP JUMPDEST SWAP3 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x2E5 JUMPI POP PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SWAP1 PUSH3 0x186A0 DUP2 GT PUSH2 0x401 JUMPI DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 SWAP2 SWAP1 SWAP2 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xAC04040800000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0x8F JUMPI PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0x8F JUMPI PUSH1 0x40 PUSH1 0x24 CALLDATALOAD PUSH32 0x2C0CF10337CAABBD02DCF226F05F5FD19A0919A41A8DF8958C39B80007826857 SLOAD SWAP1 DUP2 PUSH1 0xA0 SHR DUP2 ISZERO DUP1 ISZERO PUSH2 0x4F0 JUMPI JUMPDEST ISZERO PUSH2 0x4BE JUMPI POP POP PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 MLOAD SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE RETURN JUMPDEST PUSH3 0x186A0 DUP3 LT ISZERO PUSH2 0x4DD JUMPI PUSH2 0x4D7 SWAP1 PUSH3 0x186A0 SWAP3 PUSH2 0x4F8 JUMP JUMPDEST DIV PUSH2 0x49C JUMP JUMPDEST PUSH3 0x186A0 PUSH2 0x4EB SWAP3 DIV PUSH2 0x4F8 JUMP JUMPDEST PUSH2 0x49C JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0x492 JUMP JUMPDEST DUP2 DUP2 MUL SWAP3 SWAP2 DUP2 ISZERO SWAP2 DUP5 DIV EQ OR ISZERO PUSH2 0x50B JUMPI JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x6CF JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x6D4 JUMPI JUMPDEST PUSH2 0x6CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x5C5 JUMPI JUMPDEST POP PUSH2 0x5C2 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x6C3 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x620 JUMPI JUMPDEST POP CODESIZE PUSH2 0x5B8 JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x6BC JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x68F JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x68B JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x688 JUMPI POP CODESIZE PUSH2 0x619 JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x62B JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x581 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF7 RETURNDATACOPY PUSH9 0xB0677B0B0C979113CA PUSH17 0x25DD1374C733BEF7D0E815B58FC33AFE13 SWAP5 0xCB PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"817:1002:347:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;713:6:351;817:1002:347;;;;;;;;;;;;;;;;;;1536:41;;:::i;:::-;817:1002;;;;;;;3174:18:180;;;3170:53;;897:26:351;817:1002:347;500:10:59;817:1002:347;500:10:59;;;;;;;636:1:180;500:10:59;;;817:1002:347;3170:53:180;3201:22;817:1002:347;3201:22:180;817:1002:347;;;;3201:22:180;817:1002:347;;;;;;;;;;;;;;;;;;;;;;;1536:41;;;:::i;:::-;817:1002;;;;;4503:26:42;;;4499:64;;2976:19:351;817:1002:347;1732:22:351;;;1728:93;;817:1002:347;;;;;;;;1728:93:351;1777:33;817:1002:347;1777:33:351;817:1002:347;;1777:33:351;4499:64:42;4538:25;-1:-1:-1;4538:25:42;;817:1002:347;;-1:-1:-1;4538:25:42;817:1002:347;;;;;;;;;;;;;;;1536:41;;;:::i;:::-;817:1002;;;;;4503:26:42;;;4499:64;;2976:19:351;817:1002:347;1281:36:351;713:6;1281:36;;1277:119;;817:1002:347;;;;;;;;;;;;;;;1277:119:351;1340:45;817:1002:347;1340:45:351;817:1002:347;;;;1340:45:351;817:1002:347;;;;;;;;;;;;;;;;;;;;2503:14:351;;:40;;;;817:1002:347;2499:377:351;;;2559:17;;817:1002:347;2499:377:351;817:1002:347;;;;;;;;;;;;2499:377:351;713:6;2611:35;;713:6;;;2683:29;;713:6;2683:29;;:::i;:::-;817:1002:347;2499:377:351;;2607:259;713:6;2794:57;817:1002:347;;2794:57:351;:::i;:::-;2499:377;;2503:40;2521:22;;;2503:40;;817:1002:347;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;907:917:76;817:1002:347;1029:19:76;817:1002:347;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;817:1002:347;;;;;;1676:74:76;;;;817:1002:347;1676:74:76;;;;;;817:1002:347;1327:10:76;817:1002:347;;;;1744:4:76;817:1002:347;;;;1676:74:76;;;;;;;817:1002:347;1676:74:76;;;1630:120;;;;;1676:74;817:1002:347;1676:74:76;817:1002:347;1676:74:76;;;;817:1002:347;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;817:1002:347;;;;;;;;;;;;;1676:74:76;;;;817:1002:347;;;;;;;;;;;;;;1676:74:76;817:1002:347;;1676:74:76;;;;;;817:1002:347;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"362400","executionCost":"infinite","totalCost":"infinite"},"external":{"ROYALTY_FEE_DENOMINATOR()":"229","initERC2981()":"infinite","royaltyInfo(uint256,uint256)":"2480","setRoyaltyPercentage(uint256)":"infinite","setRoyaltyReceiver(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"ROYALTY_FEE_DENOMINATOR()":"e1a8bf2c","initERC2981()":"d60da201","royaltyInfo(uint256,uint256)":"2a55205a","setRoyaltyPercentage(uint256)":"61ba27da","setRoyaltyReceiver(address)":"8dc251e3"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"ERC2981IncorrectRoyaltyPercentage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC2981IncorrectRoyaltyReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IllegalInterfaceId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ROYALTY_FEE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initERC2981\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"}],\"name\":\"setRoyaltyPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"setRoyaltyReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}.\",\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"params\":{\"percentage\":\"The royalty percentage that was attempted to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initERC2981()\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\"},\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}},\"setRoyaltyPercentage(uint256)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\",\"params\":{\"percentage\":\"The new percentage to set. For example 50000 sets 50% royalty.\"}},\"setRoyaltyReceiver(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\",\"params\":{\"receiver\":\"The new receiver to set.\"}}},\"title\":\"ERC2981 NFT Royalty Standard (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"ERC2981IncorrectRoyaltyPercentage(uint256)\":[{\"notice\":\"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\"}],\"ERC2981IncorrectRoyaltyReceiver()\":[{\"notice\":\"Thrown when setting a royalty receiver that is the zero address.\"}],\"IllegalInterfaceId()\":[{\"notice\":\"Thrown when setting the illegal interfaceId 0xffffffff.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initERC2981()\":{\"notice\":\"Marks the following ERC165 interface(s) as supported: ERC2981.\"},\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"},\"setRoyaltyPercentage(uint256)\":{\"notice\":\"Sets the royalty percentage.\"},\"setRoyaltyReceiver(address)\":{\"notice\":\"Sets the royalty receiver.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/facets/ERC2981Facet.sol\":\"ERC2981Facet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/ERC2981Base.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC165 (Interface Detection Standard).\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract ERC2981Base is Context, IERC2981 {\\n    using ERC2981Storage for ERC2981Storage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    uint256 public constant ROYALTY_FEE_DENOMINATOR = ERC2981Storage.ROYALTY_FEE_DENOMINATOR;\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(uint256 percentage) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyPercentage(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @dev Reverts with {IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(address receiver) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        ERC2981Storage.layout().setRoyaltyReceiver(receiver);\\n    }\\n\\n    /// @inheritdoc IERC2981\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual returns (address receiver, uint256 royaltyAmount) {\\n        return ERC2981Storage.layout().royaltyInfo(tokenId, salePrice);\\n    }\\n}\\n\",\"keccak256\":\"0xe0c77e0411dc2d8b2f0ba6a414691770eacdb242d5607fcc70f21f9fc1360179\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/facets/ERC2981Facet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2981Storage} from \\\"./../libraries/ERC2981Storage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {ERC2981Base} from \\\"./../base/ERC2981Base.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title ERC2981 NFT Royalty Standard (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet}, {InterfaceDetectionFacet} and {ContractOwnershipFacet}.\\ncontract ERC2981Facet is ERC2981Base, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    function initERC2981() external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        ERC2981Storage.init();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x3171eae90bc8b8fd1db5f82dc14d4e9bbe82b55ec2aff55c9f9f4f6e71b9a630\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"ERC2981IncorrectRoyaltyPercentage(uint256)":[{"notice":"Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR)."}],"ERC2981IncorrectRoyaltyReceiver()":[{"notice":"Thrown when setting a royalty receiver that is the zero address."}],"IllegalInterfaceId()":[{"notice":"Thrown when setting the illegal interfaceId 0xffffffff."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initERC2981()":{"notice":"Marks the following ERC165 interface(s) as supported: ERC2981."},"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."},"setRoyaltyPercentage(uint256)":{"notice":"Sets the royalty percentage."},"setRoyaltyReceiver(address)":{"notice":"Sets the royalty receiver."}},"version":1}}},"contracts/token/royalty/facets/OperatorFiltererFacet.sol":{"OperatorFiltererFacet":{"abi":[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentPhase","type":"uint256"},{"internalType":"uint256","name":"newPhase","type":"uint256"}],"name":"InitializationPhaseAlreadyReached","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NotProxyAdmin","type":"error"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"operatorFilterRegistry","type":"address"}],"name":"initOperatorFilterer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorFilterRegistry","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOperatorFilterRegistry","name":"registry","type":"address"}],"name":"updateOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.","errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"params":{"currentPhase":"The current phase.","newPhase":"The new phase trying to be set."}}],"NotContractOwner(address)":[{"params":{"account":"The account that was checked."}}],"NotProxyAdmin(address)":[{"params":{"account":"The account that was checked."}}]},"kind":"dev","methods":{"initOperatorFilterer(address)":{"details":"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.","params":{"operatorFilterRegistry":"The operator filter registry address. When set to the zero address, checks will be bypassed."}},"updateOperatorFilterRegistry(address)":{"details":"Reverts with {NotContractOwner} if the sender is not the contract owner.","params":{"registry":"The new operator filter registry address. When set to the zero address, checks will be bypassed."}}},"title":"Operator Filterer for token contracts (facet version).","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60a034606657601f6105b838819003918201601f19168301916001600160401b03831184841017606b57808492602094604052833981010312606657516001600160a01b038116810360665760805260405161053690816100828239608051816103730152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063114ba8ee1461024857806330fd6a75146100b35763b0ccc31e1461003d57600080fd5b346100ae5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b600080fd5b346100ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ae5761010b61035c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021b57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5460018110156101e9575060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5581547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ae576102a061035c565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361032f57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104f15732331480156104f6575b6104f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156103e7575b506103e457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156104e557600091610442575b50386103da565b60203d6020116104de575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176104b1576020918391604052810103126104ad57519081151582036104aa57503861043b565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61044d565b6040513d6000823e3d90fd5b503390565b50601836106103a356fea264697066735822122099bdd9c213ae1821913ed847091d6423cef6efba5b3b400ed134980985e5adaf64736f6c634300081e0033","opcodes":"PUSH1 0xA0 CALLVALUE PUSH1 0x66 JUMPI PUSH1 0x1F PUSH2 0x5B8 CODESIZE DUP2 SWAP1 SUB SWAP2 DUP3 ADD PUSH1 0x1F NOT AND DUP4 ADD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 GT DUP5 DUP5 LT OR PUSH1 0x6B JUMPI DUP1 DUP5 SWAP3 PUSH1 0x20 SWAP5 PUSH1 0x40 MSTORE DUP4 CODECOPY DUP2 ADD SUB SLT PUSH1 0x66 JUMPI MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 SUB PUSH1 0x66 JUMPI PUSH1 0x80 MSTORE PUSH1 0x40 MLOAD PUSH2 0x536 SWAP1 DUP2 PUSH2 0x82 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 PUSH2 0x373 ADD MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x30FD6A75 EQ PUSH2 0xB3 JUMPI PUSH4 0xB0CCC31E EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAE JUMPI PUSH2 0x10B PUSH2 0x35C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21B JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1E9 JUMPI POP PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAE JUMPI PUSH2 0x2A0 PUSH2 0x35C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32F JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4F1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4F6 JUMPI JUMPDEST PUSH2 0x4F1 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E7 JUMPI JUMPDEST POP PUSH2 0x3E4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x442 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DA JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4DE JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4B1 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x4AD JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x4AA JUMPI POP CODESIZE PUSH2 0x43B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x44D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP10 0xBD 0xD9 0xC2 SGT 0xAE XOR 0x21 SWAP2 RETURNDATACOPY 0xD8 SELFBALANCE MULMOD SAR PUSH5 0x23CEF6EFBA JUMPDEST EXTCODESIZE BLOCKHASH 0xE DATALOADN 0x3498 MULMOD DUP6 JUMPF 0xADAF PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"920:1454:348:-:0;;;;;;;;;;;;;-1:-1:-1;;920:1454:348;;;;-1:-1:-1;;;;;920:1454:348;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;920:1454:348;;;;;;745:39:76;;920:1454:348;;;;;;;;745:39:76;920:1454:348;;;;;;;-1:-1:-1;920:1454:348;;;;;;-1:-1:-1;920:1454:348;;;;;-1:-1:-1;920:1454:348"},"deployedBytecode":{"functionDebugData":{"fun_msgSender":{"entryPoint":860,"id":13231,"parameterSlots":0,"returnSlots":1}},"generatedSources":[],"immutableReferences":{"13152":[{"length":32,"start":883}]},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063114ba8ee1461024857806330fd6a75146100b35763b0ccc31e1461003d57600080fd5b346100ae5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae57602073ffffffffffffffffffffffffffffffffffffffff7f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd305416604051908152f35b600080fd5b346100ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ae5761010b61035c565b73ffffffffffffffffffffffffffffffffffffffff807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035416911690810361021b57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd30907f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5460018110156101e9575060017f2f02d396cb1be29636682c8684200b30a98554d3b74293aa4495cb5e1d252f6d5581547fffffffffffffffffffffffff000000000000000000000000000000000000000016179055005b7fbf0c18ec00000000000000000000000000000000000000000000000000000000600052600452600160245260446000fd5b7f673a31a10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346100ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100ae5760043573ffffffffffffffffffffffffffffffffffffffff81168091036100ae576102a061035c565b73ffffffffffffffffffffffffffffffffffffffff807fc9ed16f33ab3a66c84bfd83099ccb2a8845871e2e1c1928f63797152f0fd54cc5416911690810361032f57507f609b85bcafa81ecfaf3ff62cdde2c6c9082a68dbe4922f07399c706bdeb7cd3080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055005b7f2ef4875e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680156104f15732331480156104f6575b6104f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c908033149081156103e7575b506103e457503390565b90565b60649150602090604051928380927f019a20280000000000000000000000000000000000000000000000000000000082528660048301523360248301523060448301525afa9081156104e557600091610442575b50386103da565b60203d6020116104de575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116820182811067ffffffffffffffff8211176104b1576020918391604052810103126104ad57519081151582036104aa57503861043b565b80fd5b5080fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503d61044d565b6040513d6000823e3d90fd5b503390565b50601836106103a356fea264697066735822122099bdd9c213ae1821913ed847091d6423cef6efba5b3b400ed134980985e5adaf64736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x114BA8EE EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x30FD6A75 EQ PUSH2 0xB3 JUMPI PUSH4 0xB0CCC31E EQ PUSH2 0x3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x20 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SLOAD AND PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAE JUMPI PUSH2 0x10B PUSH2 0x35C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x21B JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 SWAP1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SLOAD PUSH1 0x1 DUP2 LT ISZERO PUSH2 0x1E9 JUMPI POP PUSH1 0x1 PUSH32 0x2F02D396CB1BE29636682C8684200B30A98554D3B74293AA4495CB5E1D252F6D SSTORE DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0xBF0C18EC00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x1 PUSH1 0x24 MSTORE PUSH1 0x44 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x673A31A100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST CALLVALUE PUSH2 0xAE JUMPI PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC CALLDATASIZE ADD SLT PUSH2 0xAE JUMPI PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP1 SWAP2 SUB PUSH2 0xAE JUMPI PUSH2 0x2A0 PUSH2 0x35C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 PUSH32 0xC9ED16F33AB3A66C84BFD83099CCB2A8845871E2E1C1928F63797152F0FD54CC SLOAD AND SWAP2 AND SWAP1 DUP2 SUB PUSH2 0x32F JUMPI POP PUSH32 0x609B85BCAFA81ECFAF3FF62CDDE2C6C9082A68DBE4922F07399C706BDEB7CD30 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP2 OR SWAP1 SSTORE STOP JUMPDEST PUSH32 0x2EF4875E00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND DUP1 ISZERO PUSH2 0x4F1 JUMPI ORIGIN CALLER EQ DUP1 ISZERO PUSH2 0x4F6 JUMPI JUMPDEST PUSH2 0x4F1 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC CALLDATASIZE ADD CALLDATALOAD PUSH1 0x60 SHR SWAP1 DUP1 CALLER EQ SWAP1 DUP2 ISZERO PUSH2 0x3E7 JUMPI JUMPDEST POP PUSH2 0x3E4 JUMPI POP CALLER SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x64 SWAP2 POP PUSH1 0x20 SWAP1 PUSH1 0x40 MLOAD SWAP3 DUP4 DUP1 SWAP3 PUSH32 0x19A202800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE DUP7 PUSH1 0x4 DUP4 ADD MSTORE CALLER PUSH1 0x24 DUP4 ADD MSTORE ADDRESS PUSH1 0x44 DUP4 ADD MSTORE GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x442 JUMPI JUMPDEST POP CODESIZE PUSH2 0x3DA JUMP JUMPDEST PUSH1 0x20 RETURNDATASIZE PUSH1 0x20 GT PUSH2 0x4DE JUMPI JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x4B1 JUMPI PUSH1 0x20 SWAP2 DUP4 SWAP2 PUSH1 0x40 MSTORE DUP2 ADD SUB SLT PUSH2 0x4AD JUMPI MLOAD SWAP1 DUP2 ISZERO ISZERO DUP3 SUB PUSH2 0x4AA JUMPI POP CODESIZE PUSH2 0x43B JUMP JUMPDEST DUP1 REVERT JUMPDEST POP DUP1 REVERT JUMPDEST PUSH1 0x24 DUP5 PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE REVERT JUMPDEST POP RETURNDATASIZE PUSH2 0x44D JUMP JUMPDEST PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST POP PUSH1 0x18 CALLDATASIZE LT PUSH2 0x3A3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP10 0xBD 0xD9 0xC2 SGT 0xAE XOR 0x21 SWAP2 RETURNDATACOPY 0xD8 SELFBALANCE MULMOD SAR PUSH5 0x23CEF6EFBA JUMPDEST EXTCODESIZE BLOCKHASH 0xE DATALOADN 0x3498 MULMOD DUP6 JUMPF 0xADAF PUSH5 0x736F6C6343 STOP ADDMOD 0x1E STOP CALLER ","sourceMap":"920:1454:348:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:41;;:::i;:::-;920:1454;;;;;;;3174:18:180;;;3170:53;;3179:19:352;920:1454:348;;;;636:1:180;900:21:181;;;896:88;;-1:-1:-1;636:1:180;920:1454:348;;;;;;;;;;896:88:181;930:54;920:1454:348;930:54:181;920:1454:348;;636:1:180;920:1454:348;;;;930:54:181;3170:53:180;3201:22;920:1454:348;3201:22:180;920:1454:348;;;;3201:22:180;920:1454:348;;;;;;;;;;;;;;;;;;;;;2091:41;;:::i;:::-;920:1454;;;;;;;4503:26:42;;;4499:64;;-1:-1:-1;920:1454:348;;;;;;;;;;;4499:64:42;4538:25;920:1454:348;4538:25:42;920:1454:348;;;;4538:25:42;907:917:76;920:1454:348;1029:19:76;920:1454:348;1029:53:76;;1025:101;;1341:9;1327:10;:23;:47;;;;907:917;1323:95;;408:89:80;;;;;;1327:10:76;;;1630:42;:120;;;;;907:917;1626:164;;;1327:10;;907:917;:::o;1626:164::-;1766:13;:::o;1630:120::-;1676:74;920:1454:348;;;;;;1676:74:76;;;;920:1454:348;1676:74:76;;;;;;920:1454:348;1327:10:76;920:1454:348;;;;1744:4:76;920:1454:348;;;;1676:74:76;;;;;;;920:1454:348;1676:74:76;;;1630:120;;;;;1676:74;920:1454:348;1676:74:76;920:1454:348;1676:74:76;;;;920:1454:348;;;;;;;;;;;;;;;;;;;;;;1676:74:76;;920:1454:348;;;;;;;;;;;;;1676:74:76;;;;920:1454:348;;;;;;;;;;;;;;1676:74:76;920:1454:348;;1676:74:76;;;;;;920:1454:348;;;;;;;;;1323:95:76;1327:10;;1390:17;:::o;1327:47::-;1354:8;1372:2;1354:8;:20;1327:47;"},"gasEstimates":{"creation":{"codeDepositCost":"266800","executionCost":"infinite","totalCost":"infinite"},"external":{"initOperatorFilterer(address)":"infinite","operatorFilterRegistry()":"2294","updateOperatorFilterRegistry(address)":"infinite"},"internal":{"_msgData()":"infinite","_msgSender()":"infinite"}},"methodIdentifiers":{"initOperatorFilterer(address)":"30fd6a75","operatorFilterRegistry()":"b0ccc31e","updateOperatorFilterRegistry(address)":"114ba8ee"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IForwarderRegistry\",\"name\":\"forwarderRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentPhase\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newPhase\",\"type\":\"uint256\"}],\"name\":\"InitializationPhaseAlreadyReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotContractOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NotProxyAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"operatorFilterRegistry\",\"type\":\"address\"}],\"name\":\"initOperatorFilterer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operatorFilterRegistry\",\"outputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOperatorFilterRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"updateOperatorFilterRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\",\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"params\":{\"currentPhase\":\"The current phase.\",\"newPhase\":\"The new phase trying to be set.\"}}],\"NotContractOwner(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}],\"NotProxyAdmin(address)\":[{\"params\":{\"account\":\"The account that was checked.\"}}]},\"kind\":\"dev\",\"methods\":{\"initOperatorFilterer(address)\":{\"details\":\"Reverts with {NotProxyAdmin} if the sender is not the proxy admin.Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\",\"params\":{\"operatorFilterRegistry\":\"The operator filter registry address. When set to the zero address, checks will be bypassed.\"}},\"updateOperatorFilterRegistry(address)\":{\"details\":\"Reverts with {NotContractOwner} if the sender is not the contract owner.\",\"params\":{\"registry\":\"The new operator filter registry address. When set to the zero address, checks will be bypassed.\"}}},\"title\":\"Operator Filterer for token contracts (facet version).\",\"version\":1},\"userdoc\":{\"errors\":{\"InitializationPhaseAlreadyReached(uint256,uint256)\":[{\"notice\":\"Emitted when trying to set a phase value that has already been reached.\"}],\"NotContractOwner(address)\":[{\"notice\":\"Thrown when an account is not the contract owner but is required to.\"}],\"NotProxyAdmin(address)\":[{\"notice\":\"Thrown when an account is not the proxy admin but is required to.\"}]},\"kind\":\"user\",\"methods\":{\"initOperatorFilterer(address)\":{\"notice\":\"Sets the address that the contract will make OperatorFilter checks against.\"},\"operatorFilterRegistry()\":{\"notice\":\"Gets the operator filter registry address.\"},\"updateOperatorFilterRegistry(address)\":{\"notice\":\"Updates the address that the contract will make OperatorFilter checks against.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/facets/OperatorFiltererFacet.sol\":\"OperatorFiltererFacet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\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    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/access/errors/Common.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the target contract is actually not a contract.\\n/// @param targetContract The contract that was checked\\nerror TargetIsNotAContract(address targetContract);\\n\",\"keccak256\":\"0x1070db041ed3ec61d3887eb990337d4c7a731af585e4d57a8b31181e8d6cce5d\",\"license\":\"MIT\"},\"contracts/access/errors/ContractOwnershipErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when an account is not the contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the pending contract owner but is required to.\\n/// @param account The account that was checked.\\nerror NotPendingContractOwner(address account);\\n\\n/// @notice Thrown when an account is not the target contract owner but is required to.\\n/// @param targetContract The contract that was checked.\\n/// @param account The account that was checked.\\nerror NotTargetContractOwner(address targetContract, address account);\\n\",\"keccak256\":\"0xf3b0c6fd92d546244e6251cf6dc243356d5ed68696fc0122d26122502473e7f5\",\"license\":\"MIT\"},\"contracts/access/events/ERC173Events.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the contract ownership changes.\\n/// @param previousOwner the previous contract owner.\\n/// @param newOwner the new contract owner.\\nevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n/// @notice Emitted when a new contract owner is pending.\\n/// @param pendingOwner the address of the new contract owner.\\nevent OwnershipTransferPending(address indexed pendingOwner);\\n\",\"keccak256\":\"0x57d32a7d785af2f221b35de86236fa186cb486de108ffe664fa2daa73781b849\",\"license\":\"MIT\"},\"contracts/access/interfaces/IERC173.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC-173 Contract Ownership Standard (functions)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-173\\n/// @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0\\ninterface IERC173 {\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts if the sender is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(address newOwner) external;\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner() external view returns (address contractOwner);\\n}\\n\",\"keccak256\":\"0xa8e697c3e7c617b38c4a41a911c3c239f9de1ef13e81bd30fb7b4f03aae14359\",\"license\":\"MIT\"},\"contracts/access/libraries/ContractOwnershipStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NotContractOwner, NotTargetContractOwner} from \\\"./../errors/ContractOwnershipErrors.sol\\\";\\nimport {TargetIsNotAContract} from \\\"./../errors/Common.sol\\\";\\nimport {OwnershipTransferred} from \\\"./../events/ERC173Events.sol\\\";\\nimport {IERC173} from \\\"./../interfaces/IERC173.sol\\\";\\nimport {Address} from \\\"./../../utils/libraries/Address.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../proxy/libraries/ProxyInitialization.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ContractOwnershipStorage {\\n    using Address for address;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address contractOwner;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.storage\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.access.ContractOwnership.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial contract owner (immutable version).\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function constructorInit(Layout storage s, address initialOwner) internal {\\n        if (initialOwner != address(0)) {\\n            s.contractOwner = initialOwner;\\n            emit OwnershipTransferred(address(0), initialOwner);\\n        }\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC173).interfaceId, true);\\n    }\\n\\n    /// @notice Initializes the storage with an initial contract owner (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC173.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Emits an {OwnershipTransferred} if `initialOwner` is not the zero address.\\n    /// @param initialOwner The initial contract owner.\\n    function proxyInit(Layout storage s, address initialOwner) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialOwner);\\n    }\\n\\n    /// @notice Sets the address of the new contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `sender` is not the contract owner.\\n    /// @dev Emits an {OwnershipTransferred} event if `newOwner` is different from the current contract owner.\\n    /// @param newOwner The address of the new contract owner. Using the zero address means renouncing ownership.\\n    function transferOwnership(Layout storage s, address sender, address newOwner) internal {\\n        address previousOwner = s.contractOwner;\\n        if (sender != previousOwner) revert NotContractOwner(sender);\\n        if (previousOwner != newOwner) {\\n            s.contractOwner = newOwner;\\n            emit OwnershipTransferred(previousOwner, newOwner);\\n        }\\n    }\\n\\n    /// @notice Gets the address of the contract owner.\\n    /// @return contractOwner The address of the contract owner.\\n    function owner(Layout storage s) internal view returns (address contractOwner) {\\n        return s.contractOwner;\\n    }\\n\\n    /// @notice Checks whether an account is the owner of a target contract.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    /// @return isTargetContractOwner_ Whether `account` is the owner of `targetContract`.\\n    function isTargetContractOwner(address targetContract, address account) internal view returns (bool isTargetContractOwner_) {\\n        if (!targetContract.hasBytecode()) revert TargetIsNotAContract(targetContract);\\n        return IERC173(targetContract).owner() == account;\\n    }\\n\\n    /// @notice Ensures that an account is the contract owner.\\n    /// @dev Reverts with {NotContractOwner} if `account` is not the contract owner.\\n    /// @param account The account.\\n    function enforceIsContractOwner(Layout storage s, address account) internal view {\\n        if (account != s.contractOwner) revert NotContractOwner(account);\\n    }\\n\\n    /// @notice Enforces that an account is the owner of a target contract.\\n    /// @dev Reverts with {NotTheTargetContractOwner} if the account is not the owner.\\n    /// @param targetContract The contract to check.\\n    /// @param account The account to check.\\n    function enforceIsTargetContractOwner(address targetContract, address account) internal view {\\n        if (!isTargetContractOwner(targetContract, account)) revert NotTargetContractOwner(targetContract, account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe780bc2dd166d9a677cc641f7a3b32ba36a26009a36e5cd31770521ca5d34925\",\"license\":\"MIT\"},\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/metatx/base/ForwarderRegistryContextBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../interfaces/IForwarderRegistry.sol\\\";\\nimport {ERC2771Calldata} from \\\"./../libraries/ERC2771Calldata.sol\\\";\\n\\n/// @title Meta-Transactions Forwarder Registry Context (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Derived from https://github.com/wighawag/universal-forwarder (MIT licence)\\nabstract contract ForwarderRegistryContextBase {\\n    IForwarderRegistry internal immutable _FORWARDER_REGISTRY;\\n\\n    /// @param forwarderRegistry The ForwarderRegistry contract address, or the zero address to disable meta-transactions.\\n    constructor(IForwarderRegistry forwarderRegistry) {\\n        _FORWARDER_REGISTRY = forwarderRegistry;\\n    }\\n\\n    /// @notice Returns the message sender depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgSender() internal view virtual returns (address) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.sender;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.sender;\\n        }\\n\\n        address sender = ERC2771Calldata.msgSender();\\n\\n        // Return the EIP-2771 calldata-appended sender address if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (msg.sender == address(_FORWARDER_REGISTRY) || _FORWARDER_REGISTRY.isApprovedForwarder(sender, msg.sender, address(this))) {\\n            return sender;\\n        }\\n\\n        return msg.sender;\\n    }\\n\\n    /// @notice Returns the message data depending on the ForwarderRegistry-based meta-transaction context.\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        // ERC2771 meta-transactions disabled\\n        if (_FORWARDER_REGISTRY == IForwarderRegistry(address(0))) {\\n            return msg.data;\\n        }\\n\\n        // Optimised path in case of an EOA-initiated direct tx to the contract or a call from a contract not complying with EIP-2771\\n        // solhint-disable-next-line avoid-tx-origin\\n        if (msg.sender == tx.origin || msg.data.length < 24) {\\n            return msg.data;\\n        }\\n\\n        // Return the EIP-2771 calldata (minus the appended sender) if the message was forwarded by the ForwarderRegistry or an approved forwarder\\n        if (\\n            msg.sender == address(_FORWARDER_REGISTRY) ||\\n            _FORWARDER_REGISTRY.isApprovedForwarder(ERC2771Calldata.msgSender(), msg.sender, address(this))\\n        ) {\\n            return ERC2771Calldata.msgData();\\n        }\\n\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xc896ee94ace291cd3af99773b7ff26987a6b7d0d3ee7bd3db90f5677ab47c019\",\"license\":\"MIT\"},\"contracts/metatx/interfaces/IForwarderRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title Meta-Transactions Forwarder Registry.\\ninterface IForwarderRegistry {\\n    /// @notice Checks whether an account is as an approved meta-transaction forwarder for a sender account to a target contract.\\n    /// @param sender The sender account.\\n    /// @param forwarder The forwarder account.\\n    /// @param target The target contract.\\n    /// @return isApproved True if `forwarder` is an approved meta-transaction forwarder for `sender` to `target`, false otherwise.\\n    function isApprovedForwarder(address sender, address forwarder, address target) external view returns (bool isApproved);\\n}\\n\",\"keccak256\":\"0xf72ee38b71b3a89dd9da501443115527b485c5393376b01e66ca51cfcd17e41b\",\"license\":\"MIT\"},\"contracts/metatx/libraries/ERC2771Calldata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @dev Derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT licence)\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2771\\nlibrary ERC2771Calldata {\\n    /// @notice Returns the sender address appended at the end of the calldata, as specified in EIP-2771.\\n    function msgSender() internal pure returns (address sender) {\\n        assembly {\\n            sender := shr(96, calldataload(sub(calldatasize(), 20)))\\n        }\\n    }\\n\\n    /// @notice Returns the calldata while omitting the appended sender address, as specified in EIP-2771.\\n    function msgData() internal pure returns (bytes calldata data) {\\n        unchecked {\\n            return msg.data[:msg.data.length - 20];\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c0862411a42569bf956c1a860f1b4f56692b707d676c51159fea0afa394d9\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyAdminErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when the initial admin is not set.\\nerror NoInitialProxyAdmin();\\n\\n/// @notice Thrown when an account is not the proxy admin but is required to.\\n/// @param account The account that was checked.\\nerror NotProxyAdmin(address account);\\n\",\"keccak256\":\"0xbccb7370626d641f4f86b012efaa1e534d58ba1b1b11a3be30eb911b020fd763\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/events/ProxyAdminEvents.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when the proxy admin changes.\\n/// @param previousAdmin the previous admin.\\n/// @param newAdmin the new admin.\\nevent AdminChanged(address previousAdmin, address newAdmin);\\n\",\"keccak256\":\"0x9eff25e5b53ea3ec488dbf6ab091dea7547647caabb23b5957701a85dbd23768\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyAdminStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {NoInitialProxyAdmin, NotProxyAdmin} from \\\"./../errors/ProxyAdminErrors.sol\\\";\\nimport {AdminChanged} from \\\"./../events/ProxyAdminEvents.sol\\\";\\nimport {ProxyInitialization} from \\\"./ProxyInitialization.sol\\\";\\n\\nlibrary ProxyAdminStorage {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n\\n    struct Layout {\\n        address admin;\\n    }\\n\\n    // bytes32 public constant PROXYADMIN_STORAGE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1);\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"eip1967.proxy.admin.phase\\\")) - 1);\\n\\n    /// @notice Initializes the storage with an initial admin (immutable version).\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function constructorInit(Layout storage s, address initialAdmin) internal {\\n        if (initialAdmin == address(0)) revert NoInitialProxyAdmin();\\n        s.admin = initialAdmin;\\n        emit AdminChanged(address(0), initialAdmin);\\n    }\\n\\n    /// @notice Initializes the storage with an initial admin (proxied version).\\n    /// @notice Sets the proxy initialization phase to `1`.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @dev Reverts {NoInitialProxyAdmin} if `initialAdmin` is the zero address.\\n    /// @dev Emits an {AdminChanged} event.\\n    /// @param initialAdmin The initial payout wallet.\\n    function proxyInit(Layout storage s, address initialAdmin) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(initialAdmin);\\n    }\\n\\n    /// @notice Sets a new proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `sender` is not the proxy admin.\\n    /// @dev Emits an {AdminChanged} event if `newAdmin` is different from the current proxy admin.\\n    /// @param newAdmin The new proxy admin.\\n    function changeProxyAdmin(Layout storage s, address sender, address newAdmin) internal {\\n        address previousAdmin = s.admin;\\n        if (sender != previousAdmin) revert NotProxyAdmin(sender);\\n        if (previousAdmin != newAdmin) {\\n            s.admin = newAdmin;\\n            emit AdminChanged(previousAdmin, newAdmin);\\n        }\\n    }\\n\\n    /// @notice Gets the proxy admin.\\n    /// @return admin The proxy admin\\n    function proxyAdmin(Layout storage s) internal view returns (address admin) {\\n        return s.admin;\\n    }\\n\\n    /// @notice Ensures that an account is the proxy admin.\\n    /// @dev Reverts with {NotProxyAdmin} if `account` is not the proxy admin.\\n    /// @param account The account.\\n    function enforceIsProxyAdmin(Layout storage s, address account) internal view {\\n        if (account != s.admin) revert NotProxyAdmin(account);\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa9f36047546dd1a571af9af5cd5cc45e1fa7e77f4361cef0424016cd99f2192b\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/base/OperatorFiltererBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ContractOwnershipStorage} from \\\"./../../../access/libraries/ContractOwnershipStorage.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (proxiable version).\\n/// @dev This contract is to be used via inheritance in a proxied implementation.\\n/// @dev Note: This contract requires ERC173 (Contract Ownership standard).\\nabstract contract OperatorFiltererBase is Context {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n    using ContractOwnershipStorage for ContractOwnershipStorage.Layout;\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotContractOwner} if the sender is not the contract owner.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(IOperatorFilterRegistry registry) external virtual {\\n        ContractOwnershipStorage.layout().enforceIsContractOwner(_msgSender());\\n        OperatorFiltererStorage.layout().updateOperatorFilterRegistry(registry);\\n    }\\n\\n    /// @notice Gets the operator filter registry address.\\n    function operatorFilterRegistry() external view virtual returns (IOperatorFilterRegistry) {\\n        return OperatorFiltererStorage.layout().operatorFilterRegistry();\\n    }\\n}\\n\",\"keccak256\":\"0x5b9d9dbcd7524e22c18e796e2e93a031465a2685dae625332e14b7941b7d3b06\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/facets/OperatorFiltererFacet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\nimport {IForwarderRegistry} from \\\"./../../../metatx/interfaces/IForwarderRegistry.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {OperatorFiltererStorage} from \\\"./../libraries/OperatorFiltererStorage.sol\\\";\\nimport {ProxyAdminStorage} from \\\"./../../../proxy/libraries/ProxyAdminStorage.sol\\\";\\nimport {OperatorFiltererBase} from \\\"./../base/OperatorFiltererBase.sol\\\";\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ForwarderRegistryContextBase} from \\\"./../../../metatx/base/ForwarderRegistryContextBase.sol\\\";\\n\\n/// @title Operator Filterer for token contracts (facet version).\\n/// @dev This contract is to be used as a diamond facet (see ERC2535 Diamond Standard https://eips.ethereum.org/EIPS/eip-2535).\\n/// @dev Note: This facet depends on {ProxyAdminFacet} and {ContractOwnershipFacet}.\\ncontract OperatorFiltererFacet is OperatorFiltererBase, ForwarderRegistryContextBase {\\n    using ProxyAdminStorage for ProxyAdminStorage.Layout;\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    constructor(IForwarderRegistry forwarderRegistry) ForwarderRegistryContextBase(forwarderRegistry) {}\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Reverts with {NotProxyAdmin} if the sender is not the proxy admin.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param operatorFilterRegistry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function initOperatorFilterer(IOperatorFilterRegistry operatorFilterRegistry) external {\\n        ProxyAdminStorage.layout().enforceIsProxyAdmin(_msgSender());\\n        OperatorFiltererStorage.layout().proxyInit(operatorFilterRegistry);\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgSender() internal view virtual override(Context, ForwarderRegistryContextBase) returns (address) {\\n        return ForwarderRegistryContextBase._msgSender();\\n    }\\n\\n    /// @inheritdoc ForwarderRegistryContextBase\\n    function _msgData() internal view virtual override(Context, ForwarderRegistryContextBase) returns (bytes calldata) {\\n        return ForwarderRegistryContextBase._msgData();\\n    }\\n}\\n\",\"keccak256\":\"0x6baa1d32a8970890aa323df3c3afdf10e0d1baafe4126b8716926587a8021e0d\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"},\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"InitializationPhaseAlreadyReached(uint256,uint256)":[{"notice":"Emitted when trying to set a phase value that has already been reached."}],"NotContractOwner(address)":[{"notice":"Thrown when an account is not the contract owner but is required to."}],"NotProxyAdmin(address)":[{"notice":"Thrown when an account is not the proxy admin but is required to."}]},"kind":"user","methods":{"initOperatorFilterer(address)":{"notice":"Sets the address that the contract will make OperatorFilter checks against."},"operatorFilterRegistry()":{"notice":"Gets the operator filter registry address."},"updateOperatorFilterRegistry(address)":{"notice":"Updates the address that the contract will make OperatorFilter checks against."}},"version":1}}},"contracts/token/royalty/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"}],"devdoc":{"details":"See https://eips.ethereum.org/EIPS/eip-2981Note: The ERC-165 identifier for this interface is 0x2a55205a.","kind":"dev","methods":{"royaltyInfo(uint256,uint256)":{"params":{"salePrice":"The sale price of the NFT asset specified by `tokenId`","tokenId":"The NFT asset queried for royalty information"},"returns":{"receiver":"Address of who should be sent the royalty payment","royaltyAmount":"The royalty payment amount for `salePrice`"}}},"title":"ERC2981 NFT Royalty Standard.","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"royaltyInfo(uint256,uint256)":"2a55205a"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"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\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-2981Note: The ERC-165 identifier for this interface is 0x2a55205a.\",\"kind\":\"dev\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"params\":{\"salePrice\":\"The sale price of the NFT asset specified by `tokenId`\",\"tokenId\":\"The NFT asset queried for royalty information\"},\"returns\":{\"receiver\":\"Address of who should be sent the royalty payment\",\"royaltyAmount\":\"The royalty payment amount for `salePrice`\"}}},\"title\":\"ERC2981 NFT Royalty Standard.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"notice\":\"Called with the sale price to determine how much royalty is owed and to whom.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/interfaces/IERC2981.sol\":\"IERC2981\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{"royaltyInfo(uint256,uint256)":{"notice":"Called with the sale price to determine how much royalty is owed and to whom."}},"version":1}}},"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol":{"IOperatorFilterRegistry":{"abi":[{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"codeHashOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToCopy","type":"address"}],"name":"copyEntriesOf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"filteredCodeHashAt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"filteredCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"filteredOperatorAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"filteredOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32","name":"codeHash","type":"bytes32"}],"name":"isCodeHashFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operatorWithCode","type":"address"}],"name":"isCodeHashOfFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperatorAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperatorFiltered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToCopy","type":"address"}],"name":"registerAndCopyEntries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"subscription","type":"address"}],"name":"registerAndSubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"registrantToSubscribe","type":"address"}],"name":"subscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subscriberAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"}],"name":"subscribers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"subscriptionOf","outputs":[{"internalType":"address","name":"registrant","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"unregister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bool","name":"copyExistingEntries","type":"bool"}],"name":"unsubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateCodeHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"bytes32[]","name":"codeHashes","type":"bytes32[]"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateCodeHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address[]","name":"operators","type":"address[]"},{"internalType":"bool","name":"filtered","type":"bool"}],"name":"updateOperators","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":""},"gasEstimates":null,"methodIdentifiers":{"codeHashOf(address)":"bbd652c7","copyEntriesOf(address,address)":"1e06b4b4","filteredCodeHashAt(address,uint256)":"a6529eb5","filteredCodeHashes(address)":"22fa2762","filteredOperatorAt(address,uint256)":"3f1cc5fa","filteredOperators(address)":"c4308805","isCodeHashFiltered(address,bytes32)":"6af0c315","isCodeHashOfFiltered(address,address)":"5eae3173","isOperatorAllowed(address,address)":"c6171134","isOperatorFiltered(address,address)":"e4aecb54","isRegistered(address)":"c3c5a547","register(address)":"4420e486","registerAndCopyEntries(address,address)":"a0af2903","registerAndSubscribe(address,address)":"7d3e3dbe","subscribe(address,address)":"b314d414","subscriberAt(address,uint256)":"55940e51","subscribers(address)":"5745ae28","subscriptionOf(address)":"3c5030bb","unregister(address)":"2ec2c246","unsubscribe(address,bool)":"34a0dc10","updateCodeHash(address,bytes32,bool)":"712fc00b","updateCodeHashes(address,bytes32[],bool)":"063298b6","updateOperator(address,address,bool)":"a2f367ab","updateOperators(address,address[],bool)":"a14584c1"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"codeHashOf\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToCopy\",\"type\":\"address\"}],\"name\":\"copyEntriesOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"filteredCodeHashAt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"filteredCodeHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"filteredOperatorAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"filteredOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"codeHash\",\"type\":\"bytes32\"}],\"name\":\"isCodeHashFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operatorWithCode\",\"type\":\"address\"}],\"name\":\"isCodeHashOfFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperatorAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperatorFiltered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToCopy\",\"type\":\"address\"}],\"name\":\"registerAndCopyEntries\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"subscription\",\"type\":\"address\"}],\"name\":\"registerAndSubscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"registrantToSubscribe\",\"type\":\"address\"}],\"name\":\"subscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"subscriberAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"name\":\"subscribers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"subscriptionOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"unregister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"copyExistingEntries\",\"type\":\"bool\"}],\"name\":\"unsubscribe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"codehash\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateCodeHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"codeHashes\",\"type\":\"bytes32[]\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateCodeHashes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"registrant\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"operators\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"filtered\",\"type\":\"bool\"}],\"name\":\"updateOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":\"IOperatorFilterRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/royalty/libraries/ERC2981Storage.sol":{"ERC2981Storage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea264697066735822122057980dbb52977cc18a0a60c2c1ccb2e6eaa55a4f97e5bb9bdef4156b413979a864736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI SWAP9 0xD 0xBB MSTORE SWAP8 PUSH29 0xC18A0A60C2C1CCB2E6EAA55A4F97E5BB9BDEF4156B413979A864736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"336:2728:351:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea264697066735822122057980dbb52977cc18a0a60c2c1ccb2e6eaa55a4f97e5bb9bdef4156b413979a864736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI SWAP9 0xD 0xBB MSTORE SWAP8 PUSH29 0xC18A0A60C2C1CCB2E6EAA55A4F97E5BB9BDEF4156B413979A864736F6C PUSH4 0x4300081E STOP CALLER ","sourceMap":"336:2728:351:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"init()":"infinite","layout()":"infinite","royaltyInfo(struct ERC2981Storage.Layout storage pointer,uint256,uint256)":"infinite","setRoyaltyPercentage(struct ERC2981Storage.Layout storage pointer,uint256)":"infinite","setRoyaltyReceiver(struct ERC2981Storage.Layout storage pointer,address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/libraries/ERC2981Storage.sol\":\"ERC2981Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/introspection/errors/InterfaceDetectionErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting the illegal interfaceId 0xffffffff.\\nerror IllegalInterfaceId();\\n\",\"keccak256\":\"0x9e7379cf94fb7567f0992b51f0622134da6512bb9ee91631c28c20bd83111ba1\",\"license\":\"MIT\"},\"contracts/introspection/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC165 Interface Detection Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-165.\\n/// @dev Note: The ERC-165 identifier for this interface is 0x01ffc9a7.\\ninterface IERC165 {\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId the interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool supported);\\n}\\n\",\"keccak256\":\"0x605930bfacdebf5cceae8ab9ff2a19fca89127e0b2724386ae09131d91114ab0\",\"license\":\"MIT\"},\"contracts/introspection/libraries/InterfaceDetectionStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {IllegalInterfaceId} from \\\"./../errors/InterfaceDetectionErrors.sol\\\";\\nimport {IERC165} from \\\"./../interfaces/IERC165.sol\\\";\\n\\nlibrary InterfaceDetectionStorage {\\n    struct Layout {\\n        mapping(bytes4 => bool) supportedInterfaces;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.core.introspection.InterfaceDetection.storage\\\")) - 1);\\n\\n    bytes4 internal constant ILLEGAL_INTERFACE_ID = 0xffffffff;\\n\\n    /// @notice Sets or unsets an ERC165 interface.\\n    /// @dev Revertswith {IllegalInterfaceId} if `interfaceId` is `0xffffffff`.\\n    /// @param interfaceId the interface identifier.\\n    /// @param supported True to set the interface, false to unset it.\\n    function setSupportedInterface(Layout storage s, bytes4 interfaceId, bool supported) internal {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) revert IllegalInterfaceId();\\n        s.supportedInterfaces[interfaceId] = supported;\\n    }\\n\\n    /// @notice Returns whether this contract implements a given interface.\\n    /// @dev Note: This function call must use less than 30 000 gas.\\n    /// @param interfaceId The interface identifier to test.\\n    /// @return supported True if the interface is supported, false if `interfaceId` is `0xffffffff` or if the interface is not supported.\\n    function supportsInterface(Layout storage s, bytes4 interfaceId) internal view returns (bool supported) {\\n        if (interfaceId == ILLEGAL_INTERFACE_ID) {\\n            return false;\\n        }\\n        if (interfaceId == type(IERC165).interfaceId) {\\n            return true;\\n        }\\n        return s.supportedInterfaces[interfaceId];\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe0edb89cdeb281041ad8f84e11574dcc7540356e5c4b79c2be5aa2cb478add1e\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/ERC2981Errors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when setting a royalty percentage that is above 100% (> FEE_DENOMINATOR).\\n/// @param percentage The royalty percentage that was attempted to be set.\\nerror ERC2981IncorrectRoyaltyPercentage(uint256 percentage);\\n\\n/// @notice Thrown when setting a royalty receiver that is the zero address.\\nerror ERC2981IncorrectRoyaltyReceiver();\\n\",\"keccak256\":\"0x21c8367f864ff2718ae59eb84c9351b491c5c9cd7069fcf93bd97541b407c38e\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @title ERC2981 NFT Royalty Standard.\\n/// @dev See https://eips.ethereum.org/EIPS/eip-2981\\n/// @dev Note: The ERC-165 identifier for this interface is 0x2a55205a.\\ninterface IERC2981 {\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    /// @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x80583a3de209a6940ab67bf0dc24287aecfb14e45f9743e594c195e0b85fa672\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/ERC2981Storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {ERC2981IncorrectRoyaltyReceiver, ERC2981IncorrectRoyaltyPercentage} from \\\"./../errors/ERC2981Errors.sol\\\";\\nimport {IERC2981} from \\\"./../interfaces/IERC2981.sol\\\";\\nimport {InterfaceDetectionStorage} from \\\"./../../../introspection/libraries/InterfaceDetectionStorage.sol\\\";\\n\\nlibrary ERC2981Storage {\\n    using InterfaceDetectionStorage for InterfaceDetectionStorage.Layout;\\n\\n    struct Layout {\\n        address royaltyReceiver;\\n        uint96 royaltyPercentage;\\n    }\\n\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.ERC2981.storage\\\")) - 1);\\n\\n    uint256 internal constant ROYALTY_FEE_DENOMINATOR = 100000;\\n\\n    /// @notice Marks the following ERC165 interface(s) as supported: ERC2981.\\n    function init() internal {\\n        InterfaceDetectionStorage.layout().setSupportedInterface(type(IERC2981).interfaceId, true);\\n    }\\n\\n    /// @notice Sets the royalty percentage.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyPercentage} if `percentage` is above 100% (> FEE_DENOMINATOR).\\n    /// @param percentage The new percentage to set. For example 50000 sets 50% royalty.\\n    function setRoyaltyPercentage(Layout storage s, uint256 percentage) internal {\\n        if (percentage > ROYALTY_FEE_DENOMINATOR) {\\n            revert ERC2981IncorrectRoyaltyPercentage(percentage);\\n        }\\n        s.royaltyPercentage = uint96(percentage);\\n    }\\n\\n    /// @notice Sets the royalty receiver.\\n    /// @dev Reverts with {ERC2981IncorrectRoyaltyReceiver} if `receiver` is the zero address.\\n    /// @param receiver The new receiver to set.\\n    function setRoyaltyReceiver(Layout storage s, address receiver) internal {\\n        if (receiver == address(0)) {\\n            revert ERC2981IncorrectRoyaltyReceiver();\\n        }\\n        s.royaltyReceiver = receiver;\\n    }\\n\\n    /// @notice Called with the sale price to determine how much royalty is owed and to whom.\\n    // / @param tokenId The NFT asset queried for royalty information\\n    /// @param salePrice The sale price of the NFT asset specified by `tokenId`\\n    /// @return receiver Address of who should be sent the royalty payment\\n    /// @return royaltyAmount The royalty payment amount for `salePrice`\\n    function royaltyInfo(Layout storage s, uint256, uint256 salePrice) internal view returns (address receiver, uint256 royaltyAmount) {\\n        receiver = s.royaltyReceiver;\\n        uint256 royaltyPercentage = s.royaltyPercentage;\\n        if (salePrice == 0 || royaltyPercentage == 0) {\\n            royaltyAmount = 0;\\n        } else {\\n            if (salePrice < ROYALTY_FEE_DENOMINATOR) {\\n                royaltyAmount = (salePrice * royaltyPercentage) / ROYALTY_FEE_DENOMINATOR;\\n            } else {\\n                royaltyAmount = (salePrice / ROYALTY_FEE_DENOMINATOR) * royaltyPercentage;\\n            }\\n        }\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5dc5bab72de2341707fad67fa581d26b74623b957b8ee2934a166fbd26cab934\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/token/royalty/libraries/OperatorFiltererStorage.sol":{"OperatorFiltererStorage":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212208d7fbfa52c71c95ffa7e0b9dd22a16aab8865da82b2efbdc671d68e2e63d452164736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 PUSH32 0xBFA52C71C95FFA7E0B9DD22A16AAB8865DA82B2EFBDC671D68E2E63D45216473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"307:3445:352:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212208d7fbfa52c71c95ffa7e0b9dd22a16aab8865da82b2efbdc671d68e2e63d452164736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 PUSH32 0xBFA52C71C95FFA7E0B9DD22A16AAB8865DA82B2EFBDC671D68E2E63D45216473 PUSH16 0x6C634300081E00330000000000000000 ","sourceMap":"307:3445:352:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"_checkFilterOperator(struct OperatorFiltererStorage.Layout storage pointer,address)":"infinite","constructorInit(struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)":"infinite","layout()":"infinite","operatorFilterRegistry(struct OperatorFiltererStorage.Layout storage pointer)":"infinite","proxyInit(struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)":"infinite","requireAllowedOperatorForApproval(struct OperatorFiltererStorage.Layout storage pointer,address)":"infinite","requireAllowedOperatorForTransfer(struct OperatorFiltererStorage.Layout storage pointer,address,address)":"infinite","updateOperatorFilterRegistry(struct OperatorFiltererStorage.Layout storage pointer,contract IOperatorFilterRegistry)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":\"OperatorFiltererStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\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 ERC-1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\\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(newImplementation.code.length > 0);\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * TIP: Consider using this library along with {SlotDerivation}.\\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 Int256Slot {\\n        int256 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        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\\n     */\\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\\n     */\\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\\n     */\\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n        assembly (\\\"memory-safe\\\") {\\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        assembly (\\\"memory-safe\\\") {\\n            r.slot := store.slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\"},\"contracts/proxy/errors/ProxyInitializationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Emitted when trying to set a phase value that has already been reached.\\n/// @param currentPhase The current phase.\\n/// @param newPhase The new phase trying to be set.\\nerror InitializationPhaseAlreadyReached(uint256 currentPhase, uint256 newPhase);\\n\",\"keccak256\":\"0x35ac8fc811f4e92a79364229c1bf13a2317e488c2e0c294c33e8a1290c6803d3\",\"license\":\"MIT\"},\"contracts/proxy/libraries/ProxyInitialization.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {InitializationPhaseAlreadyReached} from \\\"./../errors/ProxyInitializationErrors.sol\\\";\\nimport {StorageSlot} from \\\"@openzeppelin/contracts/utils/StorageSlot.sol\\\";\\n\\n/// @notice Multiple calls protection for storage-modifying proxy initialization functions.\\nlibrary ProxyInitialization {\\n    /// @notice Sets the initialization phase during a storage-modifying proxy initialization function.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if `phase` has been reached already.\\n    /// @param storageSlot the storage slot where `phase` is stored.\\n    /// @param phase the initialization phase.\\n    function setPhase(bytes32 storageSlot, uint256 phase) internal {\\n        StorageSlot.Uint256Slot storage currentVersion = StorageSlot.getUint256Slot(storageSlot);\\n        uint256 currentPhase = currentVersion.value;\\n        if (currentPhase >= phase) revert InitializationPhaseAlreadyReached(currentPhase, phase);\\n        currentVersion.value = phase;\\n    }\\n}\\n\",\"keccak256\":\"0xbde24518e19235ac571db356f2e4f305d6d0aefcd67b4d6ec41f055dbd268291\",\"license\":\"MIT\"},\"contracts/token/royalty/errors/OperatorFiltererErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\n/// @notice Thrown when transferring to or giving approval to a non-authorized operator.\\n/// @param operator The address that is not authorized.\\nerror OperatorNotAllowed(address operator);\\n\",\"keccak256\":\"0x540ece791b5ba1cf91fbfd5286e6b4bc0d1a3b9e9d90286cb59f2831094fcc44\",\"license\":\"MIT\"},\"contracts/token/royalty/interfaces/IOperatorFilterRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\ninterface IOperatorFilterRegistry {\\n    function isOperatorAllowed(address registrant, address operator) external view returns (bool);\\n\\n    function register(address registrant) external;\\n\\n    function registerAndSubscribe(address registrant, address subscription) external;\\n\\n    function registerAndCopyEntries(address registrant, address registrantToCopy) external;\\n\\n    function unregister(address addr) external;\\n\\n    function updateOperator(address registrant, address operator, bool filtered) external;\\n\\n    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;\\n\\n    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;\\n\\n    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;\\n\\n    function subscribe(address registrant, address registrantToSubscribe) external;\\n\\n    function unsubscribe(address registrant, bool copyExistingEntries) external;\\n\\n    function subscriptionOf(address addr) external returns (address registrant);\\n\\n    function subscribers(address registrant) external returns (address[] memory);\\n\\n    function subscriberAt(address registrant, uint256 index) external returns (address);\\n\\n    function copyEntriesOf(address registrant, address registrantToCopy) external;\\n\\n    function isOperatorFiltered(address registrant, address operator) external returns (bool);\\n\\n    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);\\n\\n    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);\\n\\n    function filteredOperators(address addr) external returns (address[] memory);\\n\\n    function filteredCodeHashes(address addr) external returns (bytes32[] memory);\\n\\n    function filteredOperatorAt(address registrant, uint256 index) external returns (address);\\n\\n    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);\\n\\n    function isRegistered(address addr) external returns (bool);\\n\\n    function codeHashOf(address addr) external returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf9fca54523ea49620c5991b14d179104fd5517f1f00ac0c168e6dc7b83209644\",\"license\":\"MIT\"},\"contracts/token/royalty/libraries/OperatorFiltererStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nimport {OperatorNotAllowed} from \\\"./../errors/OperatorFiltererErrors.sol\\\";\\nimport {IOperatorFilterRegistry} from \\\"./../interfaces/IOperatorFilterRegistry.sol\\\";\\nimport {ProxyInitialization} from \\\"./../../../proxy/libraries/ProxyInitialization.sol\\\";\\n\\nlibrary OperatorFiltererStorage {\\n    using OperatorFiltererStorage for OperatorFiltererStorage.Layout;\\n\\n    struct Layout {\\n        IOperatorFilterRegistry registry;\\n    }\\n\\n    bytes32 internal constant PROXY_INIT_PHASE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.phase\\\")) - 1);\\n    bytes32 internal constant LAYOUT_STORAGE_SLOT = bytes32(uint256(keccak256(\\\"animoca.token.royalty.OperatorFilterer.storage\\\")) - 1);\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the constructor of an immutable (non-proxied) contract.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function constructorInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @notice Sets the address that the contract will make OperatorFilter checks against.\\n    /// @dev Note: This function should be called ONLY in the init function of a proxied contract.\\n    /// @dev Reverts with {InitializationPhaseAlreadyReached} if the proxy initialization phase is set to `1` or above.\\n    /// @param registry The operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function proxyInit(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        ProxyInitialization.setPhase(PROXY_INIT_PHASE_SLOT, 1);\\n        s.constructorInit(registry);\\n    }\\n\\n    /// @notice Updates the address that the contract will make OperatorFilter checks against.\\n    /// @param registry The new operator filter registry address. When set to the zero address, checks will be bypassed.\\n    function updateOperatorFilterRegistry(Layout storage s, IOperatorFilterRegistry registry) internal {\\n        s.registry = registry;\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not `from` and is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForTransfer(Layout storage s, address sender, address from) internal view {\\n        // Allow spending tokens from addresses with balance\\n        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred from an EOA.\\n        if (sender != from) {\\n            _checkFilterOperator(s, sender);\\n        }\\n    }\\n\\n    /// @dev Reverts with {OperatorNotAllowed} if `sender` is not allowed by a valid operator registry.\\n    function requireAllowedOperatorForApproval(Layout storage s, address operator) internal view {\\n        _checkFilterOperator(s, operator);\\n    }\\n\\n    function operatorFilterRegistry(Layout storage s) internal view returns (IOperatorFilterRegistry) {\\n        return s.registry;\\n    }\\n\\n    function layout() internal pure returns (Layout storage s) {\\n        bytes32 position = LAYOUT_STORAGE_SLOT;\\n        assembly {\\n            s.slot := position\\n        }\\n    }\\n\\n    function _checkFilterOperator(Layout storage s, address operator) private view {\\n        IOperatorFilterRegistry registry = s.registry;\\n        // Check registry code length to facilitate testing in environments without a deployed registry.\\n        if (address(registry) != address(0) && address(registry).code.length > 0) {\\n            if (!registry.isOperatorAllowed(address(this), operator)) {\\n                revert OperatorNotAllowed(operator);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbaf35fa3512a30cc63d6c40cb92da4e6aba5860cc3c6fd50aa780a9c7e663867\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/utils/MultiStaticCall.sol":{"MultiStaticCall":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"StaticCallReverted","type":"error"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct MultiStaticCall.Call[]","name":"calls","type":"tuple[]"}],"name":"tryAggregate","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct MultiStaticCall.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"requireSuccess","type":"bool"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct MultiStaticCall.Call[]","name":"calls","type":"tuple[]"}],"name":"tryBlockAndAggregate","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"internalType":"struct MultiStaticCall.Result[]","name":"returnData","type":"tuple[]"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"Derived from https://github.com/makerdao/multicall (MIT licence)","errors":{"StaticCallReverted(address,bytes)":[{"params":{"data":"The encoded function call executed on `target`.","target":"The target contract address of the static call."}}]},"kind":"dev","methods":{"tryAggregate(bool,(address,bytes)[])":{"details":"Reverts if `requireSuccess` is true and one of the static calls fails.","params":{"calls":"The list of target contracts and encoded function calls for each static call.","requireSuccess":"Whether a failed static call should trigger a revert."},"returns":{"returnData":"The list of success flags and raw return data for each static call."}},"tryBlockAndAggregate(bool,(address,bytes)[])":{"details":"Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.Reverts if `requireSuccess` is true and one of the static calls fails.","params":{"calls":"The list of target contracts and encoded function calls for each static call.","requireSuccess":"Whether a failed static call should trigger a revert."},"returns":{"blockNumber":"The latest mined block number indicating at which point the return data is valid.","returnData":"The list of success flags and raw return data for each static call."}}},"title":"MultiStaticCall - Aggregate results from multiple static calls","version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601557610614908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063399542e9146100695763bce38bd71461003257600080fd5b346100645761006061004c61004636610097565b916104d8565b604051918291602083526020830190610115565b0390f35b600080fd5b346100645761006061007d61004636610097565b604051918291438352604060208401526040830190610115565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610064576004358015158103610064579160243567ffffffffffffffff811161006457826023820112156100645780600401359267ffffffffffffffff84116100645760248460051b83010111610064576024019190565b9080602083519283815201916020808260051b8401019401926000925b82841061014157505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183526020865180511515835201516040602083015280519081604084015260005b8281106101dc57505060206060837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85600085879860019a0101520116010197019301940192919390610132565b806020809284010151606082870101520161018c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761024157604052565b6101f2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761024157604052565b67ffffffffffffffff81116102415760051b60200190565b906102b46102af8361028a565b610246565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102e2829461028a565b019060005b8281106102f357505050565b6020906102fe610221565b60008152606083820152828285010152016102e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156103835760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610064570190565b610314565b3573ffffffffffffffffffffffffffffffffffffffff811681036100645790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610064570180359067ffffffffffffffff82116100645760200191813603831361006457565b908092918237016000815290565b3d1561045d573d9067ffffffffffffffff82116102415761045060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610246565b9182523d6000602084013e565b606090565b9183606094601f9273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095168652604060208701528160408701528686013760008582860101520116010190565b80518210156103835760209160051b010190565b9291906104e4826102a2565b9360005b8381106104f55750505050565b610508610503828686610343565b610388565b610520610516838787610343565b60208101906103a9565b600080604094939451806105358186896103fa565b0390855afa92610543610408565b9286806105d6575b61058a575050509060019291610569610562610221565b9215158352565b602082015261057882896104c4565b5261058381886104c4565b50016104e8565b83519392841561059c57505050602001fd5b6105d2906040519384937f1199c44200000000000000000000000000000000000000000000000000000000855260048501610462565b0390fd5b50841561054b56fea26469706673582212201b803e4227b69d5d8aa5d03d967a67fe37c2690c9b49ff124cd13be168e0ccd864736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x15 JUMPI PUSH2 0x614 SWAP1 DUP2 PUSH2 0x1B DUP3 CODECOPY RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x399542E9 EQ PUSH2 0x69 JUMPI PUSH4 0xBCE38BD7 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x64 JUMPI PUSH2 0x60 PUSH2 0x4C PUSH2 0x46 CALLDATASIZE PUSH2 0x97 JUMP JUMPDEST SWAP2 PUSH2 0x4D8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x115 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x64 JUMPI PUSH2 0x60 PUSH2 0x7D PUSH2 0x46 CALLDATASIZE PUSH2 0x97 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 NUMBER DUP4 MSTORE PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x115 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x64 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x64 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x64 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x64 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x64 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0x64 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP3 JUMPDEST DUP3 DUP5 LT PUSH2 0x141 JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE PUSH1 0x20 DUP7 MLOAD DUP1 MLOAD ISZERO ISZERO DUP4 MSTORE ADD MLOAD PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1DC JUMPI POP POP PUSH1 0x20 PUSH1 0x60 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 DUP8 SWAP9 PUSH1 0x1 SWAP11 ADD ADD MSTORE ADD AND ADD ADD SWAP8 ADD SWAP4 ADD SWAP5 ADD SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x132 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x18C JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x241 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x1F2 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP4 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x241 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x241 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B4 PUSH2 0x2AF DUP4 PUSH2 0x28A JUMP JUMPDEST PUSH2 0x246 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x2E2 DUP3 SWAP5 PUSH2 0x28A JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2F3 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x2FE PUSH2 0x221 JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x2E7 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x383 JUMPI PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x64 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x314 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x64 JUMPI SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x64 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x64 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x64 JUMPI JUMP JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x45D JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x241 JUMPI PUSH2 0x450 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND ADD PUSH2 0x246 JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x60 SWAP5 PUSH1 0x1F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP6 AND DUP7 MSTORE PUSH1 0x40 PUSH1 0x20 DUP8 ADD MSTORE DUP2 PUSH1 0x40 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x383 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x4E4 DUP3 PUSH2 0x2A2 JUMP JUMPDEST SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4F5 JUMPI POP POP POP POP JUMP JUMPDEST PUSH2 0x508 PUSH2 0x503 DUP3 DUP7 DUP7 PUSH2 0x343 JUMP JUMPDEST PUSH2 0x388 JUMP JUMPDEST PUSH2 0x520 PUSH2 0x516 DUP4 DUP8 DUP8 PUSH2 0x343 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3A9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD DUP1 PUSH2 0x535 DUP2 DUP7 DUP10 PUSH2 0x3FA JUMP JUMPDEST SUB SWAP1 DUP6 GAS STATICCALL SWAP3 PUSH2 0x543 PUSH2 0x408 JUMP JUMPDEST SWAP3 DUP7 DUP1 PUSH2 0x5D6 JUMPI JUMPDEST PUSH2 0x58A JUMPI POP POP POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH2 0x569 PUSH2 0x562 PUSH2 0x221 JUMP JUMPDEST SWAP3 ISZERO ISZERO DUP4 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x578 DUP3 DUP10 PUSH2 0x4C4 JUMP JUMPDEST MSTORE PUSH2 0x583 DUP2 DUP9 PUSH2 0x4C4 JUMP JUMPDEST POP ADD PUSH2 0x4E8 JUMP JUMPDEST DUP4 MLOAD SWAP4 SWAP3 DUP5 ISZERO PUSH2 0x59C JUMPI POP POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x5D2 SWAP1 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH32 0x1199C44200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x462 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST POP DUP5 ISZERO PUSH2 0x54B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL DUP1 RETURNDATACOPY TIMESTAMP 0x27 0xB6 SWAP14 TSTORE DUP11 0xA5 0xD0 RETURNDATASIZE SWAP7 PUSH27 0x67FE37C2690C9B49FF124CD13BE168E0CCD864736F6C634300081E STOP CALLER ","sourceMap":"205:2709:353:-:0;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{"abi_decode_boolt_array_struct_Call_calldata_dyn_calldata":{"entryPoint":151,"id":null,"parameterSlots":1,"returnSlots":3},"abi_encode_address_bytes_calldata":{"entryPoint":1122,"id":null,"parameterSlots":4,"returnSlots":1},"abi_encode_array_struct_Result_dyn":{"entryPoint":277,"id":null,"parameterSlots":2,"returnSlots":1},"abi_encode_bytes_calldata":{"entryPoint":1018,"id":null,"parameterSlots":3,"returnSlots":1},"access_calldata_tail_bytes_calldata":{"entryPoint":937,"id":null,"parameterSlots":2,"returnSlots":2},"allocate_and_zero_memory_array_array_struct_Result_dyn":{"entryPoint":674,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory":{"entryPoint":582,"id":null,"parameterSlots":1,"returnSlots":1},"allocate_memory_1350":{"entryPoint":545,"id":null,"parameterSlots":0,"returnSlots":1},"array_allocation_size_array_struct_Result_dyn":{"entryPoint":650,"id":null,"parameterSlots":1,"returnSlots":1},"calldata_array_index_access_struct_Call_calldata_dyn_calldata":{"entryPoint":835,"id":null,"parameterSlots":3,"returnSlots":1},"extract_returndata":{"entryPoint":1032,"id":null,"parameterSlots":0,"returnSlots":1},"fun_tryAggregate":{"entryPoint":1240,"id":37985,"parameterSlots":3,"returnSlots":1},"memory_array_index_access_struct_Result_dyn":{"entryPoint":1220,"id":null,"parameterSlots":2,"returnSlots":1},"panic_error_0x32":{"entryPoint":788,"id":null,"parameterSlots":0,"returnSlots":0},"panic_error_0x41":{"entryPoint":498,"id":null,"parameterSlots":0,"returnSlots":0},"read_from_calldatat_address":{"entryPoint":904,"id":null,"parameterSlots":1,"returnSlots":1},"write_to_memory_bool":{"entryPoint":null,"id":null,"parameterSlots":2,"returnSlots":0}},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600436101561001257600080fd5b60003560e01c8063399542e9146100695763bce38bd71461003257600080fd5b346100645761006061004c61004636610097565b916104d8565b604051918291602083526020830190610115565b0390f35b600080fd5b346100645761006061007d61004636610097565b604051918291438352604060208401526040830190610115565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610064576004358015158103610064579160243567ffffffffffffffff811161006457826023820112156100645780600401359267ffffffffffffffff84116100645760248460051b83010111610064576024019190565b9080602083519283815201916020808260051b8401019401926000925b82841061014157505050505090565b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183526020865180511515835201516040602083015280519081604084015260005b8281106101dc57505060206060837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85600085879860019a0101520116010197019301940192919390610132565b806020809284010151606082870101520161018c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761024157604052565b6101f2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761024157604052565b67ffffffffffffffff81116102415760051b60200190565b906102b46102af8361028a565b610246565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102e2829461028a565b019060005b8281106102f357505050565b6020906102fe610221565b60008152606083820152828285010152016102e7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156103835760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610064570190565b610314565b3573ffffffffffffffffffffffffffffffffffffffff811681036100645790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610064570180359067ffffffffffffffff82116100645760200191813603831361006457565b908092918237016000815290565b3d1561045d573d9067ffffffffffffffff82116102415761045060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610246565b9182523d6000602084013e565b606090565b9183606094601f9273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095168652604060208701528160408701528686013760008582860101520116010190565b80518210156103835760209160051b010190565b9291906104e4826102a2565b9360005b8381106104f55750505050565b610508610503828686610343565b610388565b610520610516838787610343565b60208101906103a9565b600080604094939451806105358186896103fa565b0390855afa92610543610408565b9286806105d6575b61058a575050509060019291610569610562610221565b9215158352565b602082015261057882896104c4565b5261058381886104c4565b50016104e8565b83519392841561059c57505050602001fd5b6105d2906040519384937f1199c44200000000000000000000000000000000000000000000000000000000855260048501610462565b0390fd5b50841561054b56fea26469706673582212201b803e4227b69d5d8aa5d03d967a67fe37c2690c9b49ff124cd13be168e0ccd864736f6c634300081e0033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x399542E9 EQ PUSH2 0x69 JUMPI PUSH4 0xBCE38BD7 EQ PUSH2 0x32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x64 JUMPI PUSH2 0x60 PUSH2 0x4C PUSH2 0x46 CALLDATASIZE PUSH2 0x97 JUMP JUMPDEST SWAP2 PUSH2 0x4D8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x115 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE PUSH2 0x64 JUMPI PUSH2 0x60 PUSH2 0x7D PUSH2 0x46 CALLDATASIZE PUSH2 0x97 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP2 DUP3 SWAP2 NUMBER DUP4 MSTORE PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x115 JUMP JUMPDEST PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC DUP3 ADD SLT PUSH2 0x64 JUMPI PUSH1 0x4 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 SUB PUSH2 0x64 JUMPI SWAP2 PUSH1 0x24 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x64 JUMPI DUP3 PUSH1 0x23 DUP3 ADD SLT ISZERO PUSH2 0x64 JUMPI DUP1 PUSH1 0x4 ADD CALLDATALOAD SWAP3 PUSH8 0xFFFFFFFFFFFFFFFF DUP5 GT PUSH2 0x64 JUMPI PUSH1 0x24 DUP5 PUSH1 0x5 SHL DUP4 ADD ADD GT PUSH2 0x64 JUMPI PUSH1 0x24 ADD SWAP2 SWAP1 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x20 DUP4 MLOAD SWAP3 DUP4 DUP2 MSTORE ADD SWAP2 PUSH1 0x20 DUP1 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD SWAP5 ADD SWAP3 PUSH1 0x0 SWAP3 JUMPDEST DUP3 DUP5 LT PUSH2 0x141 JUMPI POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP3 DUP3 SUB ADD DUP4 MSTORE PUSH1 0x20 DUP7 MLOAD DUP1 MLOAD ISZERO ISZERO DUP4 MSTORE ADD MLOAD PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE DUP1 MLOAD SWAP1 DUP2 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x1DC JUMPI POP POP PUSH1 0x20 PUSH1 0x60 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 PUSH1 0x0 DUP6 DUP8 SWAP9 PUSH1 0x1 SWAP11 ADD ADD MSTORE ADD AND ADD ADD SWAP8 ADD SWAP4 ADD SWAP5 ADD SWAP3 SWAP2 SWAP4 SWAP1 PUSH2 0x132 JUMP JUMPDEST DUP1 PUSH1 0x20 DUP1 SWAP3 DUP5 ADD ADD MLOAD PUSH1 0x60 DUP3 DUP8 ADD ADD MSTORE ADD PUSH2 0x18C JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD SWAP1 PUSH1 0x40 DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x241 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x1F2 JUMP JUMPDEST SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F PUSH1 0x40 MLOAD SWAP4 ADD AND DUP3 ADD DUP3 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x241 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x241 JUMPI PUSH1 0x5 SHL PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B4 PUSH2 0x2AF DUP4 PUSH2 0x28A JUMP JUMPDEST PUSH2 0x246 JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH2 0x2E2 DUP3 SWAP5 PUSH2 0x28A JUMP JUMPDEST ADD SWAP1 PUSH1 0x0 JUMPDEST DUP3 DUP2 LT PUSH2 0x2F3 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH2 0x2FE PUSH2 0x221 JUMP JUMPDEST PUSH1 0x0 DUP2 MSTORE PUSH1 0x60 DUP4 DUP3 ADD MSTORE DUP3 DUP3 DUP6 ADD ADD MSTORE ADD PUSH2 0x2E7 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x383 JUMPI PUSH1 0x5 SHL DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x64 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x314 JUMP JUMPDEST CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 SUB PUSH2 0x64 JUMPI SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP2 CALLDATASIZE SUB ADD DUP3 SLT ISZERO PUSH2 0x64 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x64 JUMPI PUSH1 0x20 ADD SWAP2 DUP2 CALLDATASIZE SUB DUP4 SGT PUSH2 0x64 JUMPI JUMP JUMPDEST SWAP1 DUP1 SWAP3 SWAP2 DUP3 CALLDATACOPY ADD PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x45D JUMPI RETURNDATASIZE SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x241 JUMPI PUSH2 0x450 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND ADD PUSH2 0x246 JUMP JUMPDEST SWAP2 DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP2 DUP4 PUSH1 0x60 SWAP5 PUSH1 0x1F SWAP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP6 AND DUP7 MSTORE PUSH1 0x40 PUSH1 0x20 DUP8 ADD MSTORE DUP2 PUSH1 0x40 DUP8 ADD MSTORE DUP7 DUP7 ADD CALLDATACOPY PUSH1 0x0 DUP6 DUP3 DUP7 ADD ADD MSTORE ADD AND ADD ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 LT ISZERO PUSH2 0x383 JUMPI PUSH1 0x20 SWAP2 PUSH1 0x5 SHL ADD ADD SWAP1 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 PUSH2 0x4E4 DUP3 PUSH2 0x2A2 JUMP JUMPDEST SWAP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x4F5 JUMPI POP POP POP POP JUMP JUMPDEST PUSH2 0x508 PUSH2 0x503 DUP3 DUP7 DUP7 PUSH2 0x343 JUMP JUMPDEST PUSH2 0x388 JUMP JUMPDEST PUSH2 0x520 PUSH2 0x516 DUP4 DUP8 DUP8 PUSH2 0x343 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x3A9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 SWAP5 SWAP4 SWAP5 MLOAD DUP1 PUSH2 0x535 DUP2 DUP7 DUP10 PUSH2 0x3FA JUMP JUMPDEST SUB SWAP1 DUP6 GAS STATICCALL SWAP3 PUSH2 0x543 PUSH2 0x408 JUMP JUMPDEST SWAP3 DUP7 DUP1 PUSH2 0x5D6 JUMPI JUMPDEST PUSH2 0x58A JUMPI POP POP POP SWAP1 PUSH1 0x1 SWAP3 SWAP2 PUSH2 0x569 PUSH2 0x562 PUSH2 0x221 JUMP JUMPDEST SWAP3 ISZERO ISZERO DUP4 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x578 DUP3 DUP10 PUSH2 0x4C4 JUMP JUMPDEST MSTORE PUSH2 0x583 DUP2 DUP9 PUSH2 0x4C4 JUMP JUMPDEST POP ADD PUSH2 0x4E8 JUMP JUMPDEST DUP4 MLOAD SWAP4 SWAP3 DUP5 ISZERO PUSH2 0x59C JUMPI POP POP POP PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x5D2 SWAP1 PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP4 PUSH32 0x1199C44200000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x462 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST POP DUP5 ISZERO PUSH2 0x54B JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL DUP1 RETURNDATACOPY TIMESTAMP 0x27 0xB6 SWAP14 TSTORE DUP11 0xA5 0xD0 RETURNDATASIZE SWAP7 PUSH27 0x67FE37C2690C9B49FF124CD13BE168E0CCD864736F6C634300081E STOP CALLER ","sourceMap":"205:2709:353:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2870:35;205:2709;;;:::i;2870:35::-;205:2709;;2835:12;;;;205:2709;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;205:2709:353;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;205:2709:353;;;;;;;;;;;;;;-1:-1:-1;205:2709:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;205:2709:353;;;;;;;;;:::o;:::-;;;;;:::i;:::-;-1:-1:-1;205:2709:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;205:2709:353;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1080:860::-;;;;1257:20;;;:::i;:::-;1292:9;-1:-1:-1;1303:10:353;;;;;;1080:860;;;;:::o;1315:3::-;1351:15;:8;;;;;:::i;:::-;:15;:::i;:::-;1402:17;:8;;;;;:::i;:::-;:17;;;;;:::i;:::-;-1:-1:-1;205:2709:353;;;;;;;;;;;;:::i;:::-;1468:23;;;;;;;;:::i;:::-;1510:26;;;;;1315:3;1506:367;;205:2709;;;;;;;1903:20;205:2709;;:::i;:::-;;;;;;;1903:20;1402:17;1903:20;;205:2709;1887:36;;;;:::i;:::-;;;;;;:::i;:::-;;205:2709;1292:9;;1506:367;205:2709;;;;1615:21;;;;1660:95;;;1402:17;1660:95;;1611:248;1808:32;205:2709;;;1808:32;;;;;;;;;;:::i;:::-;;;;1510:26;1528:8;;;1510:26;"},"gasEstimates":{"creation":{"codeDepositCost":"311200","executionCost":"356","totalCost":"311556"},"external":{"tryAggregate(bool,(address,bytes)[])":"infinite","tryBlockAndAggregate(bool,(address,bytes)[])":"infinite"}},"methodIdentifiers":{"tryAggregate(bool,(address,bytes)[])":"bce38bd7","tryBlockAndAggregate(bool,(address,bytes)[])":"399542e9"}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"StaticCallReverted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct MultiStaticCall.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Derived from https://github.com/makerdao/multicall (MIT licence)\",\"errors\":{\"StaticCallReverted(address,bytes)\":[{\"params\":{\"data\":\"The encoded function call executed on `target`.\",\"target\":\"The target contract address of the static call.\"}}]},\"kind\":\"dev\",\"methods\":{\"tryAggregate(bool,(address,bytes)[])\":{\"details\":\"Reverts if `requireSuccess` is true and one of the static calls fails.\",\"params\":{\"calls\":\"The list of target contracts and encoded function calls for each static call.\",\"requireSuccess\":\"Whether a failed static call should trigger a revert.\"},\"returns\":{\"returnData\":\"The list of success flags and raw return data for each static call.\"}},\"tryBlockAndAggregate(bool,(address,bytes)[])\":{\"details\":\"Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.Reverts if `requireSuccess` is true and one of the static calls fails.\",\"params\":{\"calls\":\"The list of target contracts and encoded function calls for each static call.\",\"requireSuccess\":\"Whether a failed static call should trigger a revert.\"},\"returns\":{\"blockNumber\":\"The latest mined block number indicating at which point the return data is valid.\",\"returnData\":\"The list of success flags and raw return data for each static call.\"}}},\"title\":\"MultiStaticCall - Aggregate results from multiple static calls\",\"version\":1},\"userdoc\":{\"errors\":{\"StaticCallReverted(address,bytes)\":[{\"notice\":\"Emitted when a static call reverts without return data.\"}]},\"kind\":\"user\",\"methods\":{\"tryAggregate(bool,(address,bytes)[])\":{\"notice\":\"Aggregates the results of multiple static calls.\"},\"tryBlockAndAggregate(bool,(address,bytes)[])\":{\"notice\":\"Aggregates the results of multiple static calls, together with the associated block number.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/MultiStaticCall.sol\":\"MultiStaticCall\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/utils/MultiStaticCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.30;\\n\\n/// @title MultiStaticCall - Aggregate results from multiple static calls\\n/// @dev Derived from https://github.com/makerdao/multicall (MIT licence)\\ncontract MultiStaticCall {\\n    struct Call {\\n        address target;\\n        bytes callData;\\n    }\\n\\n    struct Result {\\n        bool success;\\n        bytes returnData;\\n    }\\n\\n    /// @notice Emitted when a static call reverts without return data.\\n    /// @param target The target contract address of the static call.\\n    /// @param data The encoded function call executed on `target`.\\n    error StaticCallReverted(address target, bytes data);\\n\\n    /// @notice Aggregates the results of multiple static calls.\\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\\n    /// @param calls The list of target contracts and encoded function calls for each static call.\\n    /// @return returnData The list of success flags and raw return data for each static call.\\n    function tryAggregate(bool requireSuccess, Call[] calldata calls) public view returns (Result[] memory returnData) {\\n        uint256 length = calls.length;\\n        returnData = new Result[](length);\\n        for (uint256 i; i < length; ++i) {\\n            address target = calls[i].target;\\n            bytes calldata data = calls[i].callData;\\n            (bool success, bytes memory ret) = target.staticcall(data);\\n\\n            if (requireSuccess && !success) {\\n                uint256 returndataLength = ret.length;\\n                if (returndataLength != 0) {\\n                    assembly {\\n                        revert(add(32, ret), returndataLength)\\n                    }\\n                } else {\\n                    revert StaticCallReverted(target, data);\\n                }\\n            }\\n\\n            returnData[i] = Result(success, ret);\\n        }\\n    }\\n\\n    /// @notice Aggregates the results of multiple static calls, together with the associated block number.\\n    /// @dev Warning: Do not use this function as part of a transaction: `blockNumber` would not be meaningful due to transactions ordering.\\n    /// @dev Reverts if `requireSuccess` is true and one of the static calls fails.\\n    /// @param requireSuccess Whether a failed static call should trigger a revert.\\n    /// @param calls The list of target contracts and encoded function calls for each static call.\\n    /// @return blockNumber The latest mined block number indicating at which point the return data is valid.\\n    /// @return returnData The list of success flags and raw return data for each static call.\\n    function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public view returns (uint256 blockNumber, Result[] memory returnData) {\\n        blockNumber = block.number;\\n        returnData = tryAggregate(requireSuccess, calls);\\n    }\\n}\\n\",\"keccak256\":\"0x2d8d690c883427e3355a22ba13fc8fb245c00bc304ea0836bff45f40a4f2d302\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"errors":{"StaticCallReverted(address,bytes)":[{"notice":"Emitted when a static call reverts without return data."}]},"kind":"user","methods":{"tryAggregate(bool,(address,bytes)[])":{"notice":"Aggregates the results of multiple static calls."},"tryBlockAndAggregate(bool,(address,bytes)[])":{"notice":"Aggregates the results of multiple static calls, together with the associated block number."}},"version":1}}},"contracts/utils/libraries/Address.sol":{"Address":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220c4e46106117cc601480d72d76e0bb5cbb8fc3a63f09404fc27243318e10b22f364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 RETF PUSH2 0x611 PUSH29 0xC601480D72D76E0BB5CBB8FC3A63F09404FC27243318E10B22F364736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"58:410:354:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea2646970667358221220c4e46106117cc601480d72d76e0bb5cbb8fc3a63f09404fc27243318e10b22f364736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 RETF PUSH2 0x611 PUSH29 0xC601480D72D76E0BB5CBB8FC3A63F09404FC27243318E10B22F364736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"58:410:354:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"hasBytecode(address)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/libraries/Address.sol\":\"Address\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/utils/libraries/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Address {\\n    /// @notice Checks if the address is a deployed smart contract.\\n    /// @param addr The address to check.\\n    /// @return hasBytecode True if `addr` is a deployed smart contract, false otherwise.\\n    function hasBytecode(address addr) internal view returns (bool) {\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(addr)\\n        }\\n        return size != 0;\\n    }\\n}\\n\",\"keccak256\":\"0x53138794544fe8a068208bd9435b2ab035f32897420c01bcdbf289cb1020ba7c\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}},"contracts/utils/libraries/Bytes32.sol":{"Bytes32":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"functionDebugData":{},"generatedSources":[],"linkReferences":{},"object":"60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212208a4a9aeb837c7a1b71e88cdc780043e15e38f4de22c5dd1b72203bc40dbde33364736f6c634300081e0033","opcodes":"PUSH1 0x80 DUP1 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x17 JUMPI PUSH1 0x3A SWAP1 DUP2 PUSH1 0x1D DUP3 CODECOPY ADDRESS DUP2 POP POP RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 BLOBBASEFEE SWAP11 0xEB DUP4 PUSH29 0x7A1B71E88CDC780043E15E38F4DE22C5DD1B72203BC40DBDE33364736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"58:1538:355:-:0;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"functionDebugData":{},"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"600080fdfea26469706673582212208a4a9aeb837c7a1b71e88cdc780043e15e38f4de22c5dd1b72203bc40dbde33364736f6c634300081e0033","opcodes":"PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP11 BLOBBASEFEE SWAP11 0xEB DUP4 PUSH29 0x7A1B71E88CDC780043E15E38F4DE22C5DD1B72203BC40DBDE33364736F PUSH13 0x634300081E0033000000000000 ","sourceMap":"58:1538:355:-:0;;"},"gasEstimates":{"creation":{"codeDepositCost":"11600","executionCost":"infinite","totalCost":"infinite"},"internal":{"toASCIIString(bytes32)":"infinite","toBase32String(bytes32)":"infinite"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/libraries/Bytes32.sol\":\"Bytes32\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/utils/libraries/Bytes32.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.30;\\n\\nlibrary Bytes32 {\\n    /// @notice Converts bytes32 to base32 string.\\n    /// @param value value to convert.\\n    /// @return the converted base32 string.\\n    function toBase32String(bytes32 value) internal pure returns (string memory) {\\n        bytes32 base32Alphabet = 0x6162636465666768696A6B6C6D6E6F707172737475767778797A323334353637;\\n        uint256 i = uint256(value);\\n        uint256 k = 52;\\n        bytes memory bstr = new bytes(k);\\n        unchecked {\\n            bstr[--k] = base32Alphabet[uint8((i % 8) << 2)]; // uint8 s = uint8((256 - skip) % 5);  // (i % (2**s)) << (5-s)\\n            i /= 8;\\n            while (k > 0) {\\n                bstr[--k] = base32Alphabet[i % 32];\\n                i /= 32;\\n            }\\n        }\\n        return string(bstr);\\n    }\\n\\n    /// @notice Converts a bytes32 value to an ASCII string, trimming the tailing zeros.\\n    /// @param value value to convert.\\n    /// @return the converted ASCII string.\\n    function toASCIIString(bytes32 value) internal pure returns (string memory) {\\n        if (value == 0x00) return \\\"\\\";\\n        bytes memory bytesString = bytes(abi.encodePacked(value));\\n        uint256 pos = 31;\\n        while (true) {\\n            if (bytesString[pos] != 0) break;\\n            unchecked {\\n                --pos;\\n            }\\n        }\\n        unchecked {\\n            bytes memory asciiString = new bytes(pos + 1);\\n            for (uint256 i; i <= pos; ++i) {\\n                asciiString[i] = bytesString[i];\\n            }\\n            return string(asciiString);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x4ff493b034293873e78ddc83c34535bc9965305e976fa63ffea51b62049ec649\",\"license\":\"MIT\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}}}}}}